Private XML-RPC ports ===================== Several internal services require access to Launchpad data, typically over XML-RPC. Because these services are internal and the data they expose is not needed by the outside world -- nor should it be -- Launchpad exposes an internal port for these private XML-RPC end points. These internal-only end points are not available on the public XML-RPC port. >>> public_root = 'http://test@canonical.com:test@xmlrpc.launchpad.dev/' >>> private_root = 'http://xmlrpc-private.launchpad.dev:8087/' For example, the team mailing list feature requires a connection between an internal Mailman server and Launchpad. This end point is not available on the external XML-RPC port. >>> import xmlrpclib >>> from lp.testing.xmlrpc import XMLRPCTestTransport >>> external_api = xmlrpclib.ServerProxy( ... public_root + 'mailinglists/', ... transport=XMLRPCTestTransport()) >>> external_api.getPendingActions() Traceback (most recent call last): ... ProtocolError: However, the end point is available on the internal port and does not require authentication. >>> internal_api = xmlrpclib.ServerProxy( ... private_root + 'mailinglists/', ... transport=XMLRPCTestTransport()) >>> internal_api.getPendingActions() {} The bugs API on the other hand is an external service so it is available on the external port. >>> external_api = xmlrpclib.ServerProxy( ... public_root + 'bugs/', ... transport=XMLRPCTestTransport()) >>> external_api.filebug(dict( ... product='firefox', summary='the summary', comment='the comment')) 'http://bugs.launchpad.dev/bugs/16' There is an interal bugs api, too, but that doesn't share the same methods as those exposed publicly. >>> internal_api = xmlrpclib.ServerProxy( ... private_root + 'bugs/', ... transport=XMLRPCTestTransport()) >>> internal_api.filebug(dict( ... product='firefox', summary='the summary', comment='the comment')) Traceback (most recent call last): ... ProtocolError: >>> from zope.component import getUtility >>> from lp.services.verification.interfaces.logintoken import ( ... ILoginTokenSet) >>> token_string = internal_api.newBugTrackerToken() >>> token = getUtility(ILoginTokenSet)[token_string] >>> token