class VCAMonitor(ModelObserver):
"""Monitor state changes within the Juju Model."""
log = None
- ns_name = None
- applications = {}
def __init__(self, ns_name):
self.log = logging.getLogger(__name__)
self.ns_name = ns_name
+ self.applications = {}
def AddApplication(self, application_name, callback, *callback_args):
if application_name not in self.applications:
await self.disconnect_model(self.monitors[model_name])
- # Notify the callback that this charm has been removed.
self.notify_callback(
model_name,
application_name,
"removed",
+ "Removing charm {}".format(application_name),
callback,
*callback_args,
)
except JujuError as e:
if "already exists" not in e.message:
raise e
+
+ # Create an observer for this model
+ await self.create_model_monitor(ns_uuid)
+
return True
async def DestroyNetworkService(self, ns_uuid):
# Do not delete the default model. The default model was used by all
# Network Services, prior to the implementation of a model per NS.
- if ns_uuid.lower() is "default":
+ if ns_uuid.lower() == "default":
return False
if not self.authenticated:
try:
await self.controller.destroy_models(ns_uuid)
- except JujuError as e:
+ except JujuError:
raise NetworkServiceDoesNotExist(
"The Network Service '{}' does not exist".format(ns_uuid)
)
self.refcount['model'] += 1
# Create an observer for this model
+ await self.create_model_monitor(model_name)
+
+ return self.models[model_name]
+
+ async def create_model_monitor(self, model_name):
+ """Create a monitor for the model, if none exists."""
+ if not self.authenticated:
+ await self.login()
+
+ if model_name not in self.monitors:
self.monitors[model_name] = VCAMonitor(model_name)
self.models[model_name].add_observer(self.monitors[model_name])
- return self.models[model_name]
+ return True
async def login(self):
"""Login to the Juju controller."""