X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FN2VC.git;a=blobdiff_plain;f=n2vc%2Flibjuju.py;h=daedc3b2abab47fa7a0479f8fbec864883f4db0a;hp=0bd917d4aa90898f7fbe923770fee7da9be7a40a;hb=fedac578fd86ff66055750fecc18c388d9390ebc;hpb=677f444effd4d7020976deac4a4b769a814303af diff --git a/n2vc/libjuju.py b/n2vc/libjuju.py index 0bd917d..daedc3b 100644 --- a/n2vc/libjuju.py +++ b/n2vc/libjuju.py @@ -251,6 +251,7 @@ class Libjuju: progress_timeout: float = None, total_timeout: float = None, series: str = "xenial", + wait: bool = True, ) -> (Machine, bool): """ Create machine @@ -260,6 +261,8 @@ class Libjuju: :param: db_dict: Dictionary with data of the DB to write the updates :param: progress_timeout: Maximum time between two updates in the model :param: total_timeout: Timeout for the entity to be active + :param: series: Series of the machine (xenial, bionic, focal, ...) + :param: wait: Wait until machine is ready :return: (juju.machine.Machine, bool): Machine object and a boolean saying if the machine is new or it already existed @@ -311,14 +314,15 @@ class Libjuju: machine.entity_id, model_name ) ) - await JujuModelWatcher.wait_for( - model=model, - entity=machine, - progress_timeout=progress_timeout, - total_timeout=total_timeout, - db_dict=db_dict, - n2vc=self.n2vc, - ) + if wait: + await JujuModelWatcher.wait_for( + model=model, + entity=machine, + progress_timeout=progress_timeout, + total_timeout=total_timeout, + db_dict=db_dict, + n2vc=self.n2vc, + ) finally: await self.disconnect_model(model) await self.disconnect_controller(controller) @@ -453,6 +457,7 @@ class Libjuju: total_timeout: float = None, config: dict = None, series: str = None, + num_units: int = 1, ): """Deploy charm @@ -465,6 +470,7 @@ class Libjuju: :param: total_timeout: Timeout for the entity to be active :param: config: Config for the charm :param: series: Series of the charm + :param: num_units: Number of units :return: (juju.application.Application): Juju application """ @@ -508,6 +514,11 @@ class Libjuju: application_name, model_name ) ) + if num_units > 1: + for _ in range(num_units - 1): + m, _ = await self.create_machine(model_name, wait=False) + await application.add_unit(to=m.entity_id) + await JujuModelWatcher.wait_for( model=model, entity=application, @@ -712,9 +723,7 @@ class Libjuju: await self.disconnect_model(model) await self.disconnect_controller(controller) - async def destroy_model( - self, model_name: str, total_timeout: float, - ): + async def destroy_model(self, model_name: str, total_timeout: float): """ Destroy model @@ -728,19 +737,6 @@ class Libjuju: self.log.debug("Destroying model {}".format(model_name)) uuid = model.info.uuid - # Destroy applications - for application_name in model.applications: - try: - await self.destroy_application( - model, application_name=application_name, - ) - except Exception as e: - self.log.error( - "Error destroying application {} in model {}: {}".format( - application_name, model_name, e - ) - ) - # Destroy machines machines = await model.get_machines() for machine_id in machines: @@ -821,25 +817,19 @@ class Libjuju: machines = await model.get_machines() if machine_id in machines: machine = model.machines[machine_id] - # TODO: change this by machine.is_manual when this is upstreamed: - # https://github.com/juju/python-libjuju/pull/396 - if "instance-id" in machine.safe_data and machine.safe_data[ - "instance-id" - ].startswith("manual:"): - await machine.destroy(force=True) - - # max timeout - end = time.time() + total_timeout + await machine.destroy(force=True) + # max timeout + end = time.time() + total_timeout - # wait for machine removal + # wait for machine removal + machines = await model.get_machines() + while machine_id in machines and time.time() < end: + self.log.debug( + "Waiting for machine {} is destroyed".format(machine_id) + ) + await asyncio.sleep(0.5) machines = await model.get_machines() - while machine_id in machines and time.time() < end: - self.log.debug( - "Waiting for machine {} is destroyed".format(machine_id) - ) - await asyncio.sleep(0.5) - machines = await model.get_machines() - self.log.debug("Machine destroyed: {}".format(machine_id)) + self.log.debug("Machine destroyed: {}".format(machine_id)) else: self.log.debug("Machine not found: {}".format(machine_id)) @@ -935,3 +925,20 @@ class Libjuju: finally: await self.disconnect_controller(controller) await asyncio.sleep(interval) + + async def list_models(self, contains: str = None) -> [str]: + """List models with certain names + + :param: contains: String that is contained in model name + + :retur: [models] Returns list of model names + """ + + controller = await self.get_controller() + try: + models = await controller.list_models() + if contains: + models = [model for model in models if contains in model] + return models + finally: + await self.disconnect_controller(controller)