self.ns_name,
delta.data['application'],
new_status,
+ new.workload_status_message,
*callback_args)
if old and not new:
self.ns_name,
delta.data['application'],
"removed",
+ "",
*callback_args)
except Exception as e:
self.log.debug("[1] notify_callback exception {}".format(e))
"""Close any open connections."""
yield self.logout()
- def notify_callback(self, model_name, application_name, status, callback=None, *callback_args):
+ def notify_callback(self, model_name, application_name, status, message, callback=None, *callback_args):
try:
if callback:
- callback(model_name, application_name, status, *callback_args)
+ callback(model_name, application_name, status, message, *callback_args)
except Exception as e:
self.log.error("[0] notify_callback exception {}".format(e))
raise e
########################################
app = await self.get_application(model, application_name)
if app:
- raise JujuApplicationExists("Can't deploy application \"{}\" to model \"{}\" because it already exists.".format(application_name, model))
+ raise JujuApplicationExists("Can't deploy application \"{}\" to model \"{}\" because it already exists.".format(application_name, model_name))
################################################################
# Register this application with the model-level event monitor #
else:
seq = primitive['seq']
+ params = {}
+ if 'parameter' in primitive:
+ params = primitive['parameter']
+
primitives[seq] = {
'name': primitive['name'],
'parameters': self._map_primitive_parameters(
- primitive['parameter'],
+ params,
{'<rw_mgmt_ip>': rw_mgmt_ip}
),
}
**primitives[primitive]['parameters'],
)
except N2VCPrimitiveExecutionFailed as e:
- self.debug.log(
+ self.log.debug(
"[N2VC] Exception executing primitive: {}".format(e)
)
raise
await model.disconnect()
except Exception as e:
self.log.debug("Caught exception while executing primitive: {}".format(e))
- raise e
+ raise N2VCPrimitiveExecutionFailed(e)
return uuid
async def RemoveCharms(self, model_name, application_name, callback=None, *callback_args):
if parameter['value'] == "<rw_mgmt_ip>":
params[param] = str(values[parameter['value']])
else:
- params[param] = str(parameter['value'])
+ """
+ The Juju API uses strictly typed data-types, so we must make
+ sure the parameters from the VNFD match the appropriate type.
+
+ The honus will still be on the operator, to make sure the
+ data-type in the VNFD matches the one in the charm. N2VC will
+ raise N2VCPrimitiveExecutionFailed when there is a mismatch.
+
+ There are three data types supported by the YANG model:
+ # - STRING
+ # - INTEGER
+ # - BOOLEAN
+
+ Each parameter will look like this:
+ {
+ 'seq': '3',
+ 'name': 'testint',
+ 'parameter': [
+ {
+ 'name': 'interval',
+ 'data-type': 'INTEGER',
+ 'value': 20
+ }
+ ]
+ }
+ """
+
+ if 'value' in parameter:
+ # String is the default format
+ val = str(parameter['value'])
+
+ # If the data-type is explicitly set, cast to that type.
+ if 'data-type' in parameter:
+ dt = parameter['data-type'].upper()
+ if dt == "INTEGER":
+ val = int(val)
+
+ elif dt == "BOOLEAN":
+ if val in ['true', 'false', '0', '1']:
+ val = True
+ else:
+ val = False
+
+ params[param] = val
return params
def _get_config_from_yang(self, config_primitive, values):