@@ -16,30 +16,42 @@ def __init__(self, name, orchestrator=None, host=None, endpoints=None,
1616 if not name :
1717 raise Exception ("Name not provided" )
1818 self .name = name
19+ self .context_type = None
1920 self .orchestrator = orchestrator
21+ self .endpoints = {}
22+ self .tls_cfg = {}
23+ self .meta_path = "IN MEMORY"
24+ self .tls_path = "IN MEMORY"
25+
2026 if not endpoints :
27+ # set default docker endpoint if no endpoint is set
2128 default_endpoint = "docker" if (
2229 not orchestrator or orchestrator == "swarm"
2330 ) else orchestrator
31+
2432 self .endpoints = {
2533 default_endpoint : {
2634 "Host" : get_context_host (host , tls ),
2735 "SkipTLSVerify" : not tls
2836 }
2937 }
30- else :
31- for k , v in endpoints .items ():
32- ekeys = v .keys ()
33- for param in ["Host" , "SkipTLSVerify" ]:
34- if param not in ekeys :
35- raise ContextException (
36- "Missing parameter {} from endpoint {}" .format (
37- param , k ))
38- self .endpoints = endpoints
38+ return
3939
40- self .tls_cfg = {}
41- self .meta_path = "IN MEMORY"
42- self .tls_path = "IN MEMORY"
40+ # check docker endpoints
41+ for k , v in endpoints .items ():
42+ if not isinstance (v , dict ):
43+ # unknown format
44+ raise ContextException ("""Unknown endpoint format for
45+ context {}: {}""" .format (name , v ))
46+
47+ self .endpoints [k ] = v
48+ if k != "docker" :
49+ continue
50+
51+ self .endpoints [k ]["Host" ] = v .get ("Host" , get_context_host (
52+ host , tls ))
53+ self .endpoints [k ]["SkipTLSVerify" ] = bool (v .get (
54+ "SkipTLSVerify" , not tls ))
4355
4456 def set_endpoint (
4557 self , name = "docker" , host = None , tls_cfg = None ,
@@ -59,36 +71,44 @@ def inspect(self):
5971
6072 @classmethod
6173 def load_context (cls , name ):
62- name , orchestrator , endpoints = Context ._load_meta (name )
63- if name :
64- instance = cls (name , orchestrator , endpoints = endpoints )
74+ meta = Context ._load_meta (name )
75+ if meta :
76+ instance = cls (
77+ meta ["Name" ],
78+ orchestrator = meta ["Metadata" ].get ("StackOrchestrator" , None ),
79+ endpoints = meta .get ("Endpoints" , None ))
80+ instance .context_type = meta ["Metadata" ].get ("Type" , None )
6581 instance ._load_certs ()
6682 instance .meta_path = get_meta_dir (name )
6783 return instance
6884 return None
6985
7086 @classmethod
7187 def _load_meta (cls , name ):
72- metadata = {}
7388 meta_file = get_meta_file (name )
74- if os .path .isfile (meta_file ):
89+ if not os .path .isfile (meta_file ):
90+ return None
91+
92+ metadata = {}
93+ try :
7594 with open (meta_file ) as f :
76- try :
77- with open (meta_file ) as f :
78- metadata = json .load (f )
79- for k , v in metadata ["Endpoints" ].items ():
80- metadata ["Endpoints" ][k ]["SkipTLSVerify" ] = bool (
81- v ["SkipTLSVerify" ])
82- except (IOError , KeyError , ValueError ) as e :
83- # unknown format
84- raise Exception ("""Detected corrupted meta file for
85- context {} : {}""" .format (name , e ))
86-
87- return (
88- metadata ["Name" ],
89- metadata ["Metadata" ].get ("StackOrchestrator" , None ),
90- metadata ["Endpoints" ])
91- return None , None , None
95+ metadata = json .load (f )
96+ except (IOError , KeyError , ValueError ) as e :
97+ # unknown format
98+ raise Exception ("""Detected corrupted meta file for
99+ context {} : {}""" .format (name , e ))
100+
101+ # for docker endpoints, set defaults for
102+ # Host and SkipTLSVerify fields
103+ for k , v in metadata ["Endpoints" ].items ():
104+ if k != "docker" :
105+ continue
106+ metadata ["Endpoints" ][k ]["Host" ] = v .get (
107+ "Host" , get_context_host (None , False ))
108+ metadata ["Endpoints" ][k ]["SkipTLSVerify" ] = bool (
109+ v .get ("SkipTLSVerify" , True ))
110+
111+ return metadata
92112
93113 def _load_certs (self ):
94114 certs = {}
@@ -157,15 +177,22 @@ def __call__(self):
157177 result .update (self .Storage )
158178 return result
159179
180+ def is_docker_host (self ):
181+ return self .context_type is None
182+
160183 @property
161184 def Name (self ):
162185 return self .name
163186
164187 @property
165188 def Host (self ):
166189 if not self .orchestrator or self .orchestrator == "swarm" :
167- return self .endpoints ["docker" ]["Host" ]
168- return self .endpoints [self .orchestrator ]["Host" ]
190+ endpoint = self .endpoints .get ("docker" , None )
191+ if endpoint :
192+ return endpoint .get ("Host" , None )
193+ return None
194+
195+ return self .endpoints [self .orchestrator ].get ("Host" , None )
169196
170197 @property
171198 def Orchestrator (self ):
0 commit comments