@@ -45,6 +45,79 @@ func (m maasPlugin) convertSpecToMaasParam(spec map[string]interface{}) url.Valu
45
45
return param
46
46
}
47
47
48
+ func (m maasPlugin ) addTagsToNode (systemID string , tags map [string ]string ) error {
49
+ tagListing := m .MaasObj .GetSubObject ("tags" )
50
+ for tag , value := range tags {
51
+ tagObj , err := tagListing .GetSubObject (tag ).Get ()
52
+ if err != nil {
53
+ _ , err = tagListing .CallPost ("new" , url.Values {"name" : {tag }, "comment" : {value }})
54
+ if err != nil {
55
+ return err
56
+ }
57
+ tagObj , err = tagListing .GetSubObject (tag ).Get ()
58
+ if err != nil {
59
+ return err
60
+ }
61
+ }
62
+ _ , err = tagObj .CallPost ("update_nodes" , url.Values {"add" : {systemID }})
63
+ if err != nil {
64
+ return err
65
+ }
66
+ }
67
+ return nil
68
+ }
69
+
70
+ func (m maasPlugin ) deleteTagsFromNode (systemID string , tags []maas.MAASObject ) error {
71
+ for _ , tag := range tags {
72
+ _ , err := tag .CallPost ("update_nodes" , url.Values {"remove" : {systemID }})
73
+ if err != nil {
74
+ return err
75
+ }
76
+ }
77
+ return nil
78
+
79
+ }
80
+
81
+ func (m maasPlugin ) getTagsFromNode (systemID string ) (map [string ]string , error ) {
82
+ ret := map [string ]string {}
83
+ nodeListing := m .MaasObj .GetSubObject ("nodes" )
84
+ listNodeObjects , err := nodeListing .CallGet ("list" , url.Values {})
85
+ if err != nil {
86
+ return nil , err
87
+ }
88
+ listNodes , err := listNodeObjects .GetArray ()
89
+ for _ , nodeObj := range listNodes {
90
+ node , err := nodeObj .GetMAASObject ()
91
+ if err != nil {
92
+ return nil , err
93
+ }
94
+ id , err := node .GetField ("system_id" )
95
+ if id == systemID {
96
+ tags , err := node .GetMap ()["tag_names" ].GetArray ()
97
+ if err != nil {
98
+ return nil , err
99
+ }
100
+ for _ , tagObj := range tags {
101
+ tag , err := tagObj .GetMAASObject ()
102
+ if err != nil {
103
+ return nil , err
104
+ }
105
+ tagname , err := tag .GetField ("name" )
106
+ if err != nil {
107
+ return nil , err
108
+ }
109
+ tagcomment , err := tag .GetField ("comment" )
110
+ if err != nil {
111
+ return nil , err
112
+ }
113
+ ret [tagname ] = tagcomment
114
+ }
115
+ return ret , nil
116
+ }
117
+ }
118
+ return ret , nil
119
+ }
120
+
48
121
func (m maasPlugin ) checkDuplicate (systemID string ) (bool , error ) {
49
122
files , err := ioutil .ReadDir (m .MaasfilesDir )
50
123
if err != nil {
@@ -72,9 +145,7 @@ func (m maasPlugin) checkDuplicate(systemID string) (bool, error) {
72
145
73
146
// Provision creates a new instance.
74
147
func (m maasPlugin ) Provision (spec instance.Spec ) (* instance.ID , error ) {
75
-
76
148
var properties map [string ]interface {}
77
-
78
149
if spec .Properties != nil {
79
150
if err := spec .Properties .Decode (& properties ); err != nil {
80
151
return nil , fmt .Errorf ("Invalid instance properties: %s" , err )
@@ -149,13 +220,10 @@ func (m maasPlugin) Provision(spec instance.Spec) (*instance.ID, error) {
149
220
if err := ioutil .WriteFile (path .Join (machineDir , "MachineID" ), []byte (systemID ), 0755 ); err != nil {
150
221
return nil , err
151
222
}
152
- tagData , err := types . AnyValue ( spec .Tags )
223
+ err = m . addTagsToNode ( systemID , spec .Tags )
153
224
if err != nil {
154
225
return nil , err
155
226
}
156
- if err := ioutil .WriteFile (path .Join (machineDir , "tags" ), tagData .Bytes (), 0666 ); err != nil {
157
- return nil , err
158
- }
159
227
if spec .LogicalID != nil {
160
228
if err := ioutil .WriteFile (path .Join (machineDir , "ip" ), []byte (* spec .LogicalID ), 0666 ); err != nil {
161
229
return nil , err
@@ -166,45 +234,36 @@ func (m maasPlugin) Provision(spec instance.Spec) (*instance.ID, error) {
166
234
167
235
// Label labels the instance
168
236
func (m maasPlugin ) Label (id instance.ID , labels map [string ]string ) error {
169
- files , err := ioutil .ReadDir (m .MaasfilesDir )
237
+ nodeListing := m .MaasObj .GetSubObject ("nodes" )
238
+ listNodeObjects , err := nodeListing .CallGet ("list" , url.Values {})
170
239
if err != nil {
171
240
return err
172
241
}
173
- for _ , file := range files {
174
- if ! file .IsDir () {
175
- continue
176
- }
177
- machineDir := path .Join (m .MaasfilesDir , file .Name ())
178
- systemID , err := ioutil .ReadFile (path .Join (machineDir , "MachineID" ))
242
+ listNodes , err := listNodeObjects .GetArray ()
243
+ for _ , nodeObj := range listNodes {
244
+ node , err := nodeObj .GetMAASObject ()
179
245
if err != nil {
180
246
return err
181
247
}
182
- if id == instance .ID (systemID ) {
183
-
184
- tagFile := path .Join (machineDir , "tags" )
185
- buff , err := ioutil .ReadFile (tagFile )
186
- if err != nil {
187
- return err
188
- }
189
-
190
- tags := map [string ]string {}
191
- err = types .AnyBytes (buff ).Decode (& tags )
248
+ systemID , err := node .GetField ("system_id" )
249
+ if string (id ) == systemID {
250
+ tagObjs , err := node .GetMap ()["tag_names" ].GetArray ()
192
251
if err != nil {
193
252
return err
194
253
}
195
-
196
- for k , v := range labels {
197
- tags [k ] = v
254
+ tags := make ([]maas.MAASObject , len (tagObjs ))
255
+ for i , tagObj := range tagObjs {
256
+ tag , err := tagObj .GetMAASObject ()
257
+ if err != nil {
258
+ return err
259
+ }
260
+ tags [i ] = tag
198
261
}
199
262
200
- encoded , err := types .AnyValue (tags )
201
- if err != nil {
202
- return err
203
- }
204
- return ioutil .WriteFile (tagFile , encoded .Bytes (), 0666 )
263
+ m .deleteTagsFromNode (systemID , tags )
205
264
}
206
265
}
207
- return nil
266
+ return m . addTagsToNode ( string ( id ), labels )
208
267
}
209
268
210
269
// Destroy terminates an existing instance.
@@ -218,8 +277,24 @@ func (m maasPlugin) Destroy(id instance.ID) error {
218
277
listNodes , err := listNodeObjects .GetArray ()
219
278
for _ , nodeObj := range listNodes {
220
279
node , err := nodeObj .GetMAASObject ()
280
+ if err != nil {
281
+ return err
282
+ }
221
283
systemID , err := node .GetField ("system_id" )
284
+ if err != nil {
285
+ return err
286
+ }
222
287
if systemID == string (id ) {
288
+ tagObjs , err := node .GetMap ()["tag_names" ].GetArray ()
289
+ tags := make ([]maas.MAASObject , len (tagObjs ))
290
+ for i , tagObj := range tagObjs {
291
+ tag , err := tagObj .GetMAASObject ()
292
+ if err != nil {
293
+ return err
294
+ }
295
+ tags [i ] = tag
296
+ }
297
+ m .deleteTagsFromNode (string (id ), tags )
223
298
if state , _ := node .GetField ("substatus_name" ); state == "Deploying" {
224
299
params := url.Values {}
225
300
if _ , err = node .CallPost ("abort_operation" , params ); err != nil {
@@ -258,48 +333,55 @@ func (m maasPlugin) Destroy(id instance.ID) error {
258
333
259
334
// DescribeInstances returns descriptions of all instances matching all of the provided tags.
260
335
func (m maasPlugin ) DescribeInstances (tags map [string ]string ) ([]instance.Description , error ) {
261
- files , err := ioutil .ReadDir (m .MaasfilesDir )
336
+ var ret []instance.Description
337
+ nodeListing := m .MaasObj .GetSubObject ("nodes" )
338
+ listNodeObjects , err := nodeListing .CallGet ("list" , url.Values {})
262
339
if err != nil {
263
340
return nil , err
264
341
}
265
- descriptions := []instance.Description {}
266
- for _ , file := range files {
267
- if ! file .IsDir () {
268
- continue
269
- }
270
- machineDir := path .Join (m .MaasfilesDir , file .Name ())
271
- tagData , err := ioutil .ReadFile (path .Join (machineDir , "tags" ))
342
+ listNodes , err := listNodeObjects .GetArray ()
343
+ for _ , nodeObj := range listNodes {
344
+ node , err := nodeObj .GetMAASObject ()
272
345
if err != nil {
273
- if os .IsNotExist (err ) {
274
- continue
275
- }
276
346
return nil , err
277
347
}
278
- machineTags := map [ string ] string {}
279
- if err := types . AnyBytes ( tagData ). Decode ( & machineTags ); err != nil {
348
+ nodeTags , err := node . GetMap ()[ "tag_names" ]. GetArray ()
349
+ if err != nil {
280
350
return nil , err
281
351
}
282
352
allMatched := true
353
+ machineTags := make (map [string ]string )
283
354
for k , v := range tags {
355
+ for _ , tagObj := range nodeTags {
356
+ tag , err := tagObj .GetMAASObject ()
357
+ if err != nil {
358
+ return nil , err
359
+ }
360
+ tagname , err := tag .GetField ("name" )
361
+ if err != nil {
362
+ return nil , err
363
+ }
364
+ tagcomment , err := tag .GetField ("comment" )
365
+ if err != nil {
366
+ return nil , err
367
+ }
368
+ machineTags [tagname ] = tagcomment
369
+ }
284
370
value , exists := machineTags [k ]
285
371
if ! exists || v != value {
286
372
allMatched = false
287
- break
288
373
}
289
374
}
290
375
if allMatched {
291
- systemID , err := ioutil .ReadFile (path .Join (machineDir , "MachineID" ))
292
- if err == nil {
293
- } else {
294
- if ! os .IsNotExist (err ) {
295
- return nil , err
296
- }
376
+ systemID , err := node .GetField ("system_id" )
377
+ if err != nil {
378
+ return nil , err
297
379
}
298
- descriptions = append (descriptions , instance.Description {
380
+ ret = append (ret , instance.Description {
299
381
ID : instance .ID (systemID ),
300
382
Tags : machineTags ,
301
383
})
302
384
}
303
385
}
304
- return descriptions , nil
386
+ return ret , nil
305
387
}
0 commit comments