@@ -16,30 +16,42 @@ def __init__(self, name, orchestrator=None, host=None, endpoints=None,
16
16
if not name :
17
17
raise Exception ("Name not provided" )
18
18
self .name = name
19
+ self .context_type = None
19
20
self .orchestrator = orchestrator
21
+ self .endpoints = {}
22
+ self .tls_cfg = {}
23
+ self .meta_path = "IN MEMORY"
24
+ self .tls_path = "IN MEMORY"
25
+
20
26
if not endpoints :
27
+ # set default docker endpoint if no endpoint is set
21
28
default_endpoint = "docker" if (
22
29
not orchestrator or orchestrator == "swarm"
23
30
) else orchestrator
31
+
24
32
self .endpoints = {
25
33
default_endpoint : {
26
34
"Host" : get_context_host (host , tls ),
27
35
"SkipTLSVerify" : not tls
28
36
}
29
37
}
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
39
39
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 ))
43
55
44
56
def set_endpoint (
45
57
self , name = "docker" , host = None , tls_cfg = None ,
@@ -59,36 +71,44 @@ def inspect(self):
59
71
60
72
@classmethod
61
73
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 )
65
81
instance ._load_certs ()
66
82
instance .meta_path = get_meta_dir (name )
67
83
return instance
68
84
return None
69
85
70
86
@classmethod
71
87
def _load_meta (cls , name ):
72
- metadata = {}
73
88
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 :
75
94
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
92
112
93
113
def _load_certs (self ):
94
114
certs = {}
@@ -157,15 +177,22 @@ def __call__(self):
157
177
result .update (self .Storage )
158
178
return result
159
179
180
+ def is_docker_host (self ):
181
+ return self .context_type is None
182
+
160
183
@property
161
184
def Name (self ):
162
185
return self .name
163
186
164
187
@property
165
188
def Host (self ):
166
189
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 )
169
196
170
197
@property
171
198
def Orchestrator (self ):
0 commit comments