@@ -136,6 +136,11 @@ def to_radl(self, inf_info=None):
136
136
Tosca .logger .warn ("Unknown tyoe of token %s. Ignoring." % token_type )
137
137
radl .ansible_hosts = [ansible_host ]
138
138
elif root_type == "tosca.nodes.aisprint.FaaS.Function" :
139
+ min_instances , _ , default_instances , count , removal_list = self ._get_scalable_properties (node )
140
+ num_instances = self ._get_num_instances (count , default_instances , min_instances )
141
+ if num_instances not in [0 , 1 ]:
142
+ raise Exception ("Scalability values of %s only allows 0 or 1." % root_type )
143
+
139
144
oscar_host = self ._find_host_compute (node , self .tosca .nodetemplates ,
140
145
"tosca.nodes.SoftwareComponent" )
141
146
oscar_compute = self ._find_host_compute (node , self .tosca .nodetemplates )
@@ -150,13 +155,22 @@ def to_radl(self, inf_info=None):
150
155
service_password = self ._final_function_result (oscar_host .get_property_value ('password' ),
151
156
oscar_host )
152
157
153
- recipe = ' - tasks:\n '
154
- recipe += ' - include_tasks: utils/tasks/oscar_function.yml\n '
155
- recipe += ' vars:\n '
156
- recipe += ' oscar_endpoint: "%s"\n ' % service_endpoint
157
- recipe += ' oscar_username: "oscar"\n '
158
- recipe += ' oscar_password: "%s"\n ' % service_password
159
- recipe += " oscar_service_json: '%s'\n " % service_json
158
+ if num_instances <= 0 :
159
+ recipe = ' - tasks:\n '
160
+ recipe += ' - include_tasks: utils/tasks/del_oscar_function.yml\n '
161
+ recipe += ' vars:\n '
162
+ recipe += ' oscar_endpoint: "%s"\n ' % service_endpoint
163
+ recipe += ' oscar_username: "oscar"\n '
164
+ recipe += ' oscar_password: "%s"\n ' % service_password
165
+ recipe += " oscar_service_name: '%s'\n " % service_json ["name" ]
166
+ else :
167
+ recipe = ' - tasks:\n '
168
+ recipe += ' - include_tasks: utils/tasks/oscar_function.yml\n '
169
+ recipe += ' vars:\n '
170
+ recipe += ' oscar_endpoint: "%s"\n ' % service_endpoint
171
+ recipe += ' oscar_username: "oscar"\n '
172
+ recipe += ' oscar_password: "%s"\n ' % service_password
173
+ recipe += " oscar_service_json: '%s'\n " % json .dumps (service_json )
160
174
161
175
conf = configure ("oscar_%s" % node .name , recipe )
162
176
radl .configures .append (conf )
@@ -171,7 +185,19 @@ def to_radl(self, inf_info=None):
171
185
level = Tosca ._get_dependency_level (node )
172
186
cont_items .append (contextualize_item (node .name , conf .name , level ))
173
187
cloud_id = self ._get_placement_property (oscar_sys .name , "cloud_id" )
174
- dep = deploy (oscar_sys .name , 1 , cloud_id )
188
+
189
+ current_num_instances = self ._get_current_num_instances (oscar_sys .name , inf_info )
190
+ num_instances = num_instances - current_num_instances
191
+ Tosca .logger .debug ("User requested %d instances of type %s and there"
192
+ " are %s" % (num_instances , oscar_sys .name , current_num_instances ))
193
+
194
+ if num_instances < 0 :
195
+ vm_ids = self ._get_vm_ids_to_remove (removal_list , num_instances , inf_info , oscar_sys )
196
+ if vm_ids :
197
+ all_removal_list .extend (vm_ids )
198
+ Tosca .logger .debug ("List of FaaS to delete: %s" % vm_ids )
199
+
200
+ dep = deploy (oscar_sys .name , num_instances if num_instances > 0 else 0 , cloud_id )
175
201
radl .deploys .append (dep )
176
202
else :
177
203
if root_type == "tosca.nodes.Compute" :
@@ -184,33 +210,17 @@ def to_radl(self, inf_info=None):
184
210
# Add the deploy element for this system
185
211
min_instances , _ , default_instances , count , removal_list = self ._get_scalable_properties (
186
212
node )
187
- if count is not None :
188
- # we must check the correct number of instances to
189
- # deploy
190
- num_instances = count
191
- elif default_instances is not None :
192
- num_instances = default_instances
193
- elif min_instances is not None :
194
- num_instances = min_instances
195
- else :
196
- num_instances = 1
197
-
198
- current_num_instances = self ._get_num_instances (sys .name , inf_info )
213
+ num_instances = self ._get_num_instances (count , default_instances , min_instances )
214
+ current_num_instances = self ._get_current_num_instances (sys .name , inf_info )
199
215
num_instances = num_instances - current_num_instances
200
216
Tosca .logger .debug ("User requested %d instances of type %s and there"
201
217
" are %s" % (num_instances , sys .name , current_num_instances ))
202
218
203
219
if num_instances < 0 :
204
- if removal_list :
205
- # TODO: Think about to check the IDs of the VMs
206
- all_removal_list .extend ([int (vm_id ) for vm_id in removal_list [0 :- num_instances ]])
207
- # if no removal list is set, delete the oldest VMs of this type
208
- elif inf_info :
209
- vm_list = inf_info .get_vm_list_by_system_name ()
210
- if sys .name in vm_list :
211
- vms = sorted (vm_list [sys .name ], key = lambda vm : vm .creation_date )
212
- all_removal_list .extend ([vm .im_id for vm in vms [0 :- num_instances ]])
213
- Tosca .logger .debug ("List of VMs to delete: %s" % all_removal_list )
220
+ vm_ids = self ._get_vm_ids_to_remove (removal_list , num_instances , inf_info , sys )
221
+ if vm_ids :
222
+ all_removal_list .extend (vm_ids )
223
+ Tosca .logger .debug ("List of VMs to delete: %s" % vm_ids )
214
224
215
225
if num_instances > 0 :
216
226
cloud_id = self ._get_placement_property (sys .name , "cloud_id" )
@@ -246,6 +256,32 @@ def to_radl(self, inf_info=None):
246
256
247
257
return all_removal_list , self ._complete_radl_networks (radl )
248
258
259
+ @staticmethod
260
+ def _get_num_instances (count , default_instances , min_instances ):
261
+ # we must check the correct number of instances to deploy
262
+ if count is not None :
263
+ num_instances = count
264
+ elif default_instances is not None :
265
+ num_instances = default_instances
266
+ elif min_instances is not None :
267
+ num_instances = min_instances
268
+ else :
269
+ num_instances = 1
270
+ return num_instances
271
+
272
+ @staticmethod
273
+ def _get_vm_ids_to_remove (removal_list , num_instances , inf_info , sys ):
274
+ if removal_list :
275
+ # TODO: Think about to check the IDs of the VMs
276
+ return [int (vm_id ) for vm_id in removal_list [0 :- num_instances ]]
277
+ # if no removal list is set, delete the oldest VMs of this type
278
+ elif inf_info :
279
+ vm_list = inf_info .get_vm_list_by_system_name ()
280
+ if sys .name in vm_list :
281
+ vms = sorted (vm_list [sys .name ], key = lambda vm : vm .creation_date )
282
+ return [vm .im_id for vm in vms [0 :- num_instances ]]
283
+ return None
284
+
249
285
@staticmethod
250
286
def _check_private_networks (radl , inf_info ):
251
287
"""
@@ -336,7 +372,7 @@ def _order_deploys(radl):
336
372
radl .deploys = fe + wn + priv
337
373
338
374
@staticmethod
339
- def _get_num_instances (sys_name , inf_info ):
375
+ def _get_current_num_instances (sys_name , inf_info ):
340
376
"""
341
377
Get the current number of instances of system type name sys_name
342
378
"""
@@ -2003,4 +2039,4 @@ def _get_oscar_service_json(self, node):
2003
2039
# this should never happen
2004
2040
Tosca .logger .warn ("Property %s not expected. Ignoring." % prop .name )
2005
2041
2006
- return json . dumps ( res )
2042
+ return res
0 commit comments