- # register application with observer
- observer.register_application(application=application, db_dict=db_dict)
-
- self.log.debug('waiting for application deployed... {}'.format(application.entity_id))
- retries = await observer.wait_for_application(
- application_id=application.entity_id,
- progress_timeout=progress_timeout,
- total_timeout=total_timeout)
- self.log.debug('application deployed')
-
- else:
-
- # register application with observer
- observer.register_application(application=application, db_dict=db_dict)
-
- # application already exists, but not finalised
- self.log.debug('application already exists, waiting for deployed...')
- retries = await observer.wait_for_application(
- application_id=application.entity_id,
- progress_timeout=progress_timeout,
- total_timeout=total_timeout)
- self.log.debug('application deployed')
-
- return application, retries
-
- async def _juju_execute_action(
- self,
- model_name: str,
- application_name: str,
- action_name: str,
- db_dict: dict,
- progress_timeout: float = None,
- total_timeout: float = None,
- **kwargs
- ) -> Action:
-
- # get juju model and observer
- model = await self._juju_get_model(model_name=model_name)
- observer = self.juju_observers[model_name]
-
- application = await self._juju_get_application(model_name=model_name, application_name=application_name)
-
- unit = None
- for u in application.units:
- if await u.is_leader_from_status():
- unit = u
- if unit is not None:
- actions = await application.get_actions()
- if action_name in actions:
- self.log.debug('executing action "{}" using params: {}'.format(action_name, kwargs))
- action = await unit.run_action(action_name, **kwargs)
-
- # register action with observer
- observer.register_action(action=action, db_dict=db_dict)
-
- await observer.wait_for_action(
- action_id=action.entity_id,
- progress_timeout=progress_timeout,
- total_timeout=total_timeout)
- self.log.debug('action completed with status: {}'.format(action.status))
- output = await model.get_action_output(action_uuid=action.entity_id)
- status = await model.get_action_status(uuid_or_prefix=action.entity_id)
- if action.entity_id in status:
- status = status[action.entity_id]
- else:
- status = 'failed'
- return output, status
-
- raise N2VCExecutionException(
- message='Cannot execute action on charm',
- primitive_name=action_name
- )
-
- async def _juju_configure_application(
- self,
- model_name: str,
- application_name: str,
- config: dict,
- db_dict: dict,
- progress_timeout: float = None,
- total_timeout: float = None
- ):
-
- # get the application
- application = await self._juju_get_application(model_name=model_name, application_name=application_name)
-
- self.log.debug('configuring the application {} -> {}'.format(application_name, config))
- res = await application.set_config(config)
- self.log.debug('application {} configured. res={}'.format(application_name, res))
-
- # Verify the config is set
- new_conf = await application.get_config()
- for key in config:
- value = new_conf[key]['value']
- self.log.debug(' {} = {}'.format(key, value))
- if config[key] != value:
- raise N2VCException(
- message='key {} is not configured correctly {} != {}'.format(key, config[key], new_conf[key])
- )
-
- # check if 'verify-ssh-credentials' action exists
- # unit = application.units[0]
- actions = await application.get_actions()
- if 'verify-ssh-credentials' not in actions:
- msg = 'Action verify-ssh-credentials does not exist in application {}'.format(application_name)
- self.log.debug(msg=msg)
- return False
-
- # execute verify-credentials
- num_retries = 20
- retry_timeout = 15.0
- for i in range(num_retries):
- try:
- self.log.debug('Executing action verify-ssh-credentials...')
- output, ok = await self._juju_execute_action(
- model_name=model_name,
- application_name=application_name,
- action_name='verify-ssh-credentials',
- db_dict=db_dict,
- progress_timeout=progress_timeout,
- total_timeout=total_timeout