Merge pull request #10 from docker/namespace_support

TUT-1170 Namespace support
This commit is contained in:
Feng Honglin 2016-06-13 17:40:20 +02:00 committed by GitHub
commit 13a8becdf4
8 changed files with 55 additions and 8 deletions

View file

@ -29,6 +29,19 @@ The authentication can be configured in the following ways:
export DOCKERCLOUD_USER=username
export DOCKERCLOUD_APIKEY=apikey
## Namespace
To support teams and orgs, you can specify the namespace in the following ways:
* Set it in the Python code:
import dockercloud
dockercloud.namespace = "yourteam"
* Set it in the environment variable:
export DOCKERCLOUD_NAMESPACE=yourteam
## Errors
Errors in the HTTP API will be returned with status codes in the 4xx and 5xx ranges.

View file

@ -25,7 +25,7 @@ from dockercloud.api.utils import Utils
from dockercloud.api.events import Events
from dockercloud.api.nodeaz import AZ
__version__ = '1.0.5'
__version__ = '1.0.6'
dockercloud_auth = os.environ.get('DOCKERCLOUD_AUTH')
basic_auth = auth.load_from_file("~/.docker/config.json")
@ -38,6 +38,8 @@ if os.environ.get('DOCKERCLOUD_USER') and os.environ.get('DOCKERCLOUD_APIKEY'):
rest_host = os.environ.get("DOCKERCLOUD_REST_HOST") or 'https://cloud.docker.com/'
stream_host = os.environ.get("DOCKERCLOUD_STREAM_HOST") or 'wss://ws.cloud.docker.com/'
namespace = os.environ.get('DOCKERCLOUD_NAMESPACE')
user_agent = None
logging.basicConfig()

View file

@ -22,6 +22,7 @@ class BasicObject(object):
class Restful(BasicObject):
_detail_uri = None
namespaced = True
def __init__(self, **kwargs):
"""Simply reflect all the values in kwargs"""
@ -58,7 +59,11 @@ class Restful(BasicObject):
assert subsystem, "Subsystem not specified for %s" % self.__class__.__name__
for k, v in list(dict.items()):
setattr(self, k, v)
self._detail_uri = "/".join(["api", subsystem, self._api_version, endpoint.strip("/"), self.pk])
if self.namespaced and dockercloud.namespace:
self._detail_uri = "/".join(["api", subsystem, self._api_version, dockercloud.namespace,
endpoint.strip("/"), self.pk])
else:
self._detail_uri = "/".join(["api", subsystem, self._api_version, endpoint.strip("/"), self.pk])
self.__setchanges__([])
@property
@ -126,7 +131,10 @@ class Immutable(Restful):
subsystem = getattr(cls, 'subsystem', None)
assert endpoint, "Endpoint not specified for %s" % cls.__name__
assert subsystem, "Subsystem not specified for %s" % cls.__name__
detail_uri = "/".join(["api", subsystem, cls._api_version, endpoint.strip("/"), pk])
if cls.namespaced and dockercloud.namespace:
detail_uri = "/".join(["api", subsystem, cls._api_version, dockercloud.namespace, endpoint.strip("/"), pk])
else:
detail_uri = "/".join(["api", subsystem, cls._api_version, endpoint.strip("/"), pk])
json = send_request('GET', detail_uri)
if json:
instance = cls()
@ -141,7 +149,10 @@ class Immutable(Restful):
assert endpoint, "Endpoint not specified for %s" % cls.__name__
assert subsystem, "Subsystem not specified for %s" % cls.__name__
detail_uri = "/".join(["api", subsystem, cls._api_version, endpoint.strip("/")])
if cls.namespaced and dockercloud.namespace:
detail_uri = "/".join(["api", subsystem, cls._api_version, dockercloud.namespace, endpoint.strip("/")])
else:
detail_uri = "/".join(["api", subsystem, cls._api_version, endpoint.strip("/")])
objects = []
while True:
if limit and len(objects) >= limit:
@ -219,7 +230,10 @@ class Mutable(Immutable):
# Figure out whether we should do a create or update
if not self._detail_uri:
action = "POST"
path = "/".join(["api", subsystem, self._api_version, endpoint.lstrip("/")])
if cls.namespaced and dockercloud.namespace:
path = "/".join(["api", subsystem, self._api_version, dockercloud.namespace, endpoint.lstrip("/")])
else:
path = "/".join(["api", subsystem, self._api_version, endpoint.lstrip("/")])
else:
action = "PATCH"
path = self._detail_uri
@ -316,7 +330,12 @@ class StreamingLog(StreamingAPI):
endpoint = "%s/%s/logs/?follow=%s" % (resource, uuid, str(follow).lower())
if tail:
endpoint = "%s&tail=%d" % (endpoint, tail)
url = "/".join([dockercloud.stream_host.rstrip("/"), "api", subsystem, self._api_version, endpoint.lstrip("/")])
if dockercloud.namespace:
url = "/".join([dockercloud.stream_host.rstrip("/"), "api", subsystem, self._api_version,
dockercloud.namespace, endpoint.lstrip("/")])
else:
url = "/".join([dockercloud.stream_host.rstrip("/"), "api", subsystem, self._api_version,
endpoint.lstrip("/")])
super(self.__class__, self).__init__(url)
@staticmethod
@ -335,7 +354,11 @@ class StreamingLog(StreamingAPI):
class Exec(StreamingAPI):
def __init__(self, uuid, cmd='sh'):
endpoint = "container/%s/exec/?command=%s" % (uuid, urllib.quote_plus(cmd))
url = "/".join([dockercloud.stream_host.rstrip("/"), "api", "app", self._api_version, endpoint.lstrip("/")])
if dockercloud.namespace:
url = "/".join([dockercloud.stream_host.rstrip("/"), "api", "app", self._api_version,
dockercloud.namespace, endpoint.lstrip("/")])
else:
url = "/".join([dockercloud.stream_host.rstrip("/"), "api", "app", self._api_version, endpoint.lstrip("/")])
super(self.__class__, self).__init__(url)
@staticmethod

View file

@ -15,7 +15,12 @@ logger = logging.getLogger("python-dockercloud")
class Events(StreamingAPI):
def __init__(self):
endpoint = "events"
url = "/".join([dockercloud.stream_host.rstrip("/"), "api", "audit", self._api_version, endpoint.lstrip("/")])
if dockercloud.namespace:
url = "/".join([dockercloud.stream_host.rstrip("/"), "api", "audit", self._api_version,
dockercloud.namespace, endpoint.lstrip("/")])
else:
url = "/".join([dockercloud.stream_host.rstrip("/"), "api", "audit", self._api_version,
endpoint.lstrip("/")])
self.invaid_auth_headers = set()
self.auth_error = ""
super(self.__class__, self).__init__(url)

View file

@ -6,6 +6,7 @@ from .base import Immutable
class AZ(Immutable):
subsystem = "infra"
endpoint = "/az"
namespaced = False
@classmethod
def _pk_key(cls):

View file

@ -6,6 +6,7 @@ from .base import Immutable
class Provider(Immutable):
subsystem = "infra"
endpoint = "/provider"
namespaced = False
@classmethod
def _pk_key(cls):

View file

@ -6,6 +6,7 @@ from .base import Immutable
class Region(Immutable):
subsystem = "infra"
endpoint = "/region"
namespaced = False
@classmethod
def _pk_key(cls):

View file

@ -6,6 +6,7 @@ from .base import Immutable
class NodeType(Immutable):
subsystem = "infra"
endpoint = "/nodetype"
namespaced = False
@classmethod
def _pk_key(cls):