diff --git a/docker/context/api.py b/docker/context/api.py index fc7e8940..c45115bc 100644 --- a/docker/context/api.py +++ b/docker/context/api.py @@ -14,11 +14,11 @@ class ContextAPI(object): Contains methods for context management: create, list, remove, get, inspect. """ - DEFAULT_CONTEXT = Context("default") + DEFAULT_CONTEXT = Context("default", "swarm") @classmethod def create_context( - cls, name, orchestrator="swarm", host=None, tls_cfg=None, + cls, name, orchestrator=None, host=None, tls_cfg=None, default_namespace=None, skip_tls_verify=False): """Creates a new context. Returns: @@ -38,9 +38,7 @@ class ContextAPI(object): >>> print(ctx.Metadata) { "Name": "test", - "Metadata": { - "StackOrchestrator": "swarm" - }, + "Metadata": {}, "Endpoints": { "docker": { "Host": "unix:///var/run/docker.sock", @@ -57,7 +55,9 @@ class ContextAPI(object): ctx = Context.load_context(name) if ctx: raise errors.ContextAlreadyExists(name) - endpoint = "docker" if orchestrator == "swarm" else orchestrator + endpoint = "docker" + if orchestrator and orchestrator != "swarm": + endpoint = orchestrator ctx = Context(name, orchestrator) ctx.set_endpoint( endpoint, host, tls_cfg, @@ -79,9 +79,7 @@ class ContextAPI(object): >>> print(ctx.Metadata) { "Name": "test", - "Metadata": { - "StackOrchestrator": "swarm" - }, + "Metadata": {}, "Endpoints": { "docker": { "Host": "unix:///var/run/docker.sock", diff --git a/docker/context/context.py b/docker/context/context.py index fdc290a0..b2af20c6 100644 --- a/docker/context/context.py +++ b/docker/context/context.py @@ -11,7 +11,7 @@ from docker.context.config import get_context_host class Context: """A context.""" - def __init__(self, name, orchestrator="swarm", host=None, endpoints=None, + def __init__(self, name, orchestrator=None, host=None, endpoints=None, tls=False): if not name: raise Exception("Name not provided") @@ -19,7 +19,7 @@ class Context: self.orchestrator = orchestrator if not endpoints: default_endpoint = "docker" if ( - orchestrator == "swarm" + not orchestrator or orchestrator == "swarm" ) else orchestrator self.endpoints = { default_endpoint: { @@ -85,7 +85,8 @@ class Context: context {} : {}""".format(name, e)) return ( - metadata["Name"], metadata["Metadata"]["StackOrchestrator"], + metadata["Name"], + metadata["Metadata"].get("StackOrchestrator", None), metadata["Endpoints"]) return None, None, None @@ -162,7 +163,7 @@ class Context: @property def Host(self): - if self.orchestrator == "swarm": + if not self.orchestrator or self.orchestrator == "swarm": return self.endpoints["docker"]["Host"] return self.endpoints[self.orchestrator]["Host"] @@ -172,18 +173,19 @@ class Context: @property def Metadata(self): + meta = {} + if self.orchestrator: + meta = {"StackOrchestrator": self.orchestrator} return { "Name": self.name, - "Metadata": { - "StackOrchestrator": self.orchestrator - }, + "Metadata": meta, "Endpoints": self.endpoints } @property def TLSConfig(self): key = self.orchestrator - if key == "swarm": + if not key or key == "swarm": key = "docker" if key in self.tls_cfg.keys(): return self.tls_cfg[key] diff --git a/tests/integration/context_api_test.py b/tests/integration/context_api_test.py index 60235ee7..a2a12a5c 100644 --- a/tests/integration/context_api_test.py +++ b/tests/integration/context_api_test.py @@ -50,3 +50,10 @@ class ContextLifecycleTest(BaseAPIIntegrationTest): ContextAPI.remove_context("test") with pytest.raises(errors.ContextNotFound): ContextAPI.inspect_context("test") + + def test_load_context_without_orchestrator(self): + ContextAPI.create_context("test") + ctx = ContextAPI.get_context("test") + assert ctx + assert ctx.Name == "test" + assert ctx.Orchestrator is None