_, ns_id, _, _, _ = self._get_namespace_components(namespace=namespace)
model_name = '{}-k8s'.format(ns_id)
- cloud = cloud_name or self.k8s_cloud
- credential = credential_name or cloud_name if cloud_name else self.k8s_cloud
- await self.libjuju.add_model(
- model_name,
- cloud_name=cloud,
- credential_name=credential
- )
+ if not await self.libjuju.model_exists(model_name):
+ cloud = cloud_name or self.k8s_cloud
+ credential = credential_name or cloud_name if cloud_name else self.k8s_cloud
+ await self.libjuju.add_model(
+ model_name,
+ cloud_name=cloud,
+ credential_name=credential
+ )
application_name = self._get_application_name(namespace)
try:
self.log.info("Namespace {} deleted".format(namespace))
async def delete_execution_environment(
- self, ee_id: str, db_dict: dict = None, total_timeout: float = None
+ self, ee_id: str, db_dict: dict = None, total_timeout: float = None,
+ scaling_in: bool = False
):
self.log.info("Deleting execution environment ee_id={}".format(ee_id))
model_name, application_name, _machine_id = self._get_ee_id_components(
ee_id=ee_id
)
-
- # destroy the application
try:
- await self.libjuju.destroy_model(
- model_name=model_name, total_timeout=total_timeout
- )
+ if not scaling_in:
+ # destroy the model
+ # TODO: should this be removed?
+ await self.libjuju.destroy_model(
+ model_name=model_name, total_timeout=total_timeout
+ )
+ else:
+ # get juju model and observer
+ controller = await self.libjuju.get_controller()
+ model = await self.libjuju.get_model(controller, model_name)
+ # destroy the application
+ await self.libjuju.destroy_application(
+ model=model, application_name=application_name)
except Exception as e:
raise N2VCException(
message=(
mock_get_metrics.assert_called_once()
+@asynctest.mock.patch("n2vc.libjuju.Libjuju.model_exists")
@asynctest.mock.patch("osm_common.fslocal.FsLocal.file_exists")
@asynctest.mock.patch(
"osm_common.fslocal.FsLocal.path", new_callable=asynctest.PropertyMock, create=True
super(K8sProxyCharmsTest, self).setUp()
def test_success(
- self, mock_add_model, mock_deploy_charm, mock_path, mock_file_exists,
+ self, mock_add_model, mock_deploy_charm, mock_path, mock_file_exists, mock_model_exists
):
+ mock_model_exists.return_value = None
mock_file_exists.return_value = True
mock_path.return_value = "/path"
ee_id = self.loop.run_until_complete(
mock_deploy_charm,
mock_path,
mock_file_exists,
+ mock_model_exists,
):
mock_k8s_cloud.return_value = None
with self.assertRaises(JujuK8sProxycharmNotSupported):
self.assertIsNone(ee_id)
def test_no_artifact_path(
- self, mock_add_model, mock_deploy_charm, mock_path, mock_file_exists,
+ self, mock_add_model, mock_deploy_charm, mock_path, mock_file_exists, mock_model_exists,
):
with self.assertRaises(N2VCBadArgumentsException):
ee_id = self.loop.run_until_complete(
self.assertIsNone(ee_id)
def test_no_db(
- self, mock_add_model, mock_deploy_charm, mock_path, mock_file_exists,
+ self, mock_add_model, mock_deploy_charm, mock_path, mock_file_exists, mock_model_exists,
):
with self.assertRaises(N2VCBadArgumentsException):
ee_id = self.loop.run_until_complete(
self.assertIsNone(ee_id)
def test_file_not_exists(
- self, mock_add_model, mock_deploy_charm, mock_path, mock_file_exists,
+ self, mock_add_model, mock_deploy_charm, mock_path, mock_file_exists, mock_model_exists,
):
mock_file_exists.return_value = False
with self.assertRaises(N2VCBadArgumentsException):
self.assertIsNone(ee_id)
def test_exception(
- self, mock_add_model, mock_deploy_charm, mock_path, mock_file_exists,
+ self, mock_add_model, mock_deploy_charm, mock_path, mock_file_exists, mock_model_exists,
):
+ mock_model_exists.return_value = None
mock_file_exists.return_value = True
mock_path.return_value = "/path"
mock_deploy_charm.side_effect = Exception()