self.log.debug("Destroying model {}".format(model_name))
uuid = model.info.uuid
- # Destroy machines
- machines = await model.get_machines()
- for machine_id in machines:
- try:
- await self.destroy_machine(
- model, machine_id=machine_id, total_timeout=total_timeout,
- )
- except asyncio.CancelledError:
- raise
- except Exception:
- pass
-
# Disconnect model
await self.disconnect_model(model)
if model_name in self.models:
self.models.remove(model_name)
- await controller.destroy_model(uuid)
+ await controller.destroy_model(uuid, force=True, max_wait=0)
# Wait until model is destroyed
self.log.debug("Waiting for model {} to be destroyed...".format(model_name))
- last_exception = ""
if total_timeout is None:
total_timeout = 3600
end = time.time() + total_timeout
while time.time() < end:
- try:
- models = await controller.list_models()
- if model_name not in models:
- self.log.debug(
- "The model {} ({}) was destroyed".format(model_name, uuid)
- )
- return
- except asyncio.CancelledError:
- raise
- except Exception as e:
- last_exception = e
+ models = await controller.list_models()
+ if model_name not in models:
+ self.log.debug(
+ "The model {} ({}) was destroyed".format(model_name, uuid)
+ )
+ return
await asyncio.sleep(5)
raise Exception(
- "Timeout waiting for model {} to be destroyed {}".format(
- model_name, last_exception
- )
+ "Timeout waiting for model {} to be destroyed".format(model_name)
)
finally:
await self.disconnect_controller(controller)
else:
self.log.warning("Application not found: {}".format(application_name))
- async def destroy_machine(
- self, model: Model, machine_id: str, total_timeout: float = 3600
- ):
- """
- Destroy machine
-
- :param: model: Model object
- :param: machine_id: Machine id
- :param: total_timeout: Timeout in seconds
- """
- machines = await model.get_machines()
- if machine_id in machines:
- machine = machines[machine_id]
- await machine.destroy(force=True)
- # max timeout
- end = time.time() + total_timeout
-
- # 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()
- self.log.debug("Machine destroyed: {}".format(machine_id))
- else:
- self.log.debug("Machine not found: {}".format(machine_id))
+ # async def destroy_machine(
+ # self, model: Model, machine_id: str, total_timeout: float = 3600
+ # ):
+ # """
+ # Destroy machine
+
+ # :param: model: Model object
+ # :param: machine_id: Machine id
+ # :param: total_timeout: Timeout in seconds
+ # """
+ # machines = await model.get_machines()
+ # if machine_id in machines:
+ # machine = machines[machine_id]
+ # await machine.destroy(force=True)
+ # # max timeout
+ # end = time.time() + total_timeout
+
+ # # 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()
+ # self.log.debug("Machine destroyed: {}".format(machine_id))
+ # else:
+ # self.log.debug("Machine not found: {}".format(machine_id))
async def configure_application(
self, model_name: str, application_name: str, config: dict = None
# TODO destroy_model testcase
-@asynctest.mock.patch("juju.model.Model.get_machines")
-@asynctest.mock.patch("logging.Logger.debug")
-class DestroyMachineTest(LibjujuTestCase):
- def setUp(self):
- super(DestroyMachineTest, self).setUp()
-
- def test_success(
- self, mock_debug, mock_get_machines,
- ):
- mock_get_machines.side_effect = [
- {"machine": FakeMachine()},
- {"machine": FakeMachine()},
- {},
- ]
- self.loop.run_until_complete(
- self.libjuju.destroy_machine(juju.model.Model(), "machine", 2,)
- )
- calls = [
- asynctest.call("Waiting for machine machine is destroyed"),
- asynctest.call("Machine destroyed: machine"),
- ]
- mock_debug.assert_has_calls(calls)
-
- def test_no_machine(
- self, mock_debug, mock_get_machines,
- ):
- mock_get_machines.return_value = {}
- self.loop.run_until_complete(
- self.libjuju.destroy_machine(juju.model.Model(), "machine", 2,)
- )
- mock_debug.assert_called_with("Machine not found: machine")
+# @asynctest.mock.patch("juju.model.Model.get_machines")
+# @asynctest.mock.patch("logging.Logger.debug")
+# class DestroyMachineTest(LibjujuTestCase):
+# def setUp(self):
+# super(DestroyMachineTest, self).setUp()
+
+# def test_success_manual_machine(
+# self, mock_debug, mock_get_machines,
+# ):
+# mock_get_machines.side_effect = [
+# {"machine": FakeManualMachine()},
+# {"machine": FakeManualMachine()},
+# {},
+# ]
+# self.loop.run_until_complete(
+# self.libjuju.destroy_machine(juju.model.Model(), "machine", 2,)
+# )
+# calls = [
+# asynctest.call("Waiting for machine machine is destroyed"),
+# asynctest.call("Machine destroyed: machine"),
+# ]
+# mock_debug.assert_has_calls(calls)
+
+# def test_no_machine(
+# self, mock_debug, mock_get_machines,
+# ):
+# mock_get_machines.return_value = {}
+# self.loop.run_until_complete(
+# self.libjuju.destroy_machine(juju.model.Model(), "machine", 2)
+# )
+# mock_debug.assert_called_with("Machine not found: machine")
@asynctest.mock.patch("n2vc.libjuju.Libjuju.get_controller")