From b521451dfde089dcce9ae160734d401a1030517f Mon Sep 17 00:00:00 2001 From: Adam Israel Date: Thu, 3 May 2018 10:00:04 -0400 Subject: [PATCH] Bug fixes + Metrics - Fix bugs with setting Day 2 config - Initial implementation of GetMetrics Signed-off-by: Adam Israel --- n2vc/vnf.py | 70 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/n2vc/vnf.py b/n2vc/vnf.py index a457cec..e0eec2e 100644 --- a/n2vc/vnf.py +++ b/n2vc/vnf.py @@ -36,6 +36,7 @@ class JujuCharmNotFound(Exception): class JujuApplicationExists(Exception): """The Application already exists.""" + class N2VCPrimitiveExecutionFailed(Exception): """Something failed while attempting to execute a primitive.""" @@ -46,6 +47,7 @@ logging.getLogger('juju.client.connection').setLevel(logging.WARN) logging.getLogger('juju.model').setLevel(logging.WARN) logging.getLogger('juju.machine').setLevel(logging.WARN) + class VCAMonitor(ModelObserver): """Monitor state changes within the Juju Model.""" log = None @@ -132,6 +134,7 @@ class VCAMonitor(ModelObserver): # Create unique models per network service # Document all public functions + class N2VC: # Juju API @@ -404,11 +407,14 @@ class N2VC: # FIXME: This is hard-coded until model-per-ns is added model_name = 'default' + model = await self.controller.get_model(model_name) + if primitive == 'config': # config is special, and expecting params to be a dictionary - await self.set_config(application_name, params['params']) + self.log.debug("Setting charm configuration for {}".format(application_name)) + self.log.debug(params['params']) + await self.set_config(model, application_name, params['params']) else: - model = await self.controller.get_model(model_name) app = await self.get_application(model, application_name) if app: # Run against the first (and probably only) unit in the app @@ -448,9 +454,19 @@ class N2VC: async def DestroyNetworkService(self, nsd): raise NotImplementedError() - async def GetMetrics(self, nsd, vnfd): - """Get the metrics collected by the VCA.""" - raise NotImplementedError() + async def GetMetrics(self, model_name, application_name): + """Get the metrics collected by the VCA. + + :param model_name The name of the model + :param application_name The name of the application + """ + metrics = {} + model = await self.get_model(model_name) + app = await self.get_application(model, application_name) + if app: + metrics = await app.get_metrics() + + return metrics # Non-public methods async def add_relation(self, a, b, via=None): @@ -471,12 +487,12 @@ class N2VC: finally: await m.disconnect() - async def apply_config(self, config, application): - """Apply a configuration to the application.""" - print("JujuApi: Applying configuration to {}.".format( - application - )) - return await self.set_config(application=application, config=config) + # async def apply_config(self, config, application): + # """Apply a configuration to the application.""" + # print("JujuApi: Applying configuration to {}.".format( + # application + # )) + # return await self.set_config(application=application, config=config) def _get_config_from_dict(self, config_primitive, values): """Transform the yang config primitive to dict. @@ -744,12 +760,12 @@ class N2VC: return result - async def set_config(self, application, config): + async def set_config(self, model_name, application, config): """Apply a configuration to the application.""" if not self.authenticated: await self.login() - app = await self.get_application(self.default_model, application) + app = await self.get_application(model_name, application) if app: self.log.debug("JujuApi: Setting config for Application {}".format( application, @@ -762,20 +778,20 @@ class N2VC: if config[key] != newconf[key]['value']: self.log.debug("JujuApi: Config not set! Key {} Value {} doesn't match {}".format(key, config[key], newconf[key])) - async def set_parameter(self, parameter, value, application=None): - """Set a config parameter for a service.""" - if not self.authenticated: - await self.login() - - self.log.debug("JujuApi: Setting {}={} for Application {}".format( - parameter, - value, - application, - )) - return await self.apply_config( - {parameter: value}, - application=application, - ) + # async def set_parameter(self, parameter, value, application=None): + # """Set a config parameter for a service.""" + # if not self.authenticated: + # await self.login() + # + # self.log.debug("JujuApi: Setting {}={} for Application {}".format( + # parameter, + # value, + # application, + # )) + # return await self.apply_config( + # {parameter: value}, + # application=application, + # ) async def wait_for_application(self, name, timeout=300): """Wait for an application to become active.""" -- 2.17.1