X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=n2vc%2Fk8s_juju_conn.py;h=eda2c937715b5a03ee105d48ea603f27c667f0ae;hb=950f8451deba524b3882b1c6cb09e48ab5e2fdbd;hp=e3f326730ef6b3a9d47f5b47e42afa939f8598ab;hpb=3c063d193a201b5e7653115671739f1e64677e9c;p=osm%2FN2VC.git diff --git a/n2vc/k8s_juju_conn.py b/n2vc/k8s_juju_conn.py index e3f3267..eda2c93 100644 --- a/n2vc/k8s_juju_conn.py +++ b/n2vc/k8s_juju_conn.py @@ -20,10 +20,11 @@ import yaml from juju.controller import Controller from juju.model import Model -from n2vc.exceptions import K8sException +from n2vc.exceptions import K8sException, JujuError from n2vc.k8s_conn import K8sConnector from n2vc.kubectl import Kubectl from .exceptions import MethodNotImplemented, N2VCNotFound +from n2vc.utils import obj_to_dict, obj_to_yaml # from juju.bundle import BundleHandler @@ -320,6 +321,11 @@ class K8sJujuConnector(K8sConnector): kdu_instance = db_dict["filter"]["_id"] self.log.debug("Checking for model named {}".format(kdu_instance)) + try: + if self.on_update_db: + await self.on_update_db(cluster_uuid, kdu_instance, filter=db_dict["filter"]) + except Exception as e: + self.log.debug("Error in updating vca status {}".format(str(e))) # Create the new model self.log.debug("Adding model: {}".format(kdu_instance)) @@ -398,7 +404,8 @@ class K8sJujuConnector(K8sConnector): await model.disconnect() await controller.disconnect() os.chdir(previous_workdir) - + if self.on_update_db: + await self.on_update_db(cluster_uuid, kdu_instance, filter=db_dict["filter"]) return kdu_instance raise Exception("Unable to install") @@ -604,8 +611,10 @@ class K8sJujuConnector(K8sConnector): if status != "completed": raise K8sException( - "status is not completed: {} output: {}".format(status, output) + "status: {}, output: {}".format(status, output) ) + if self.on_update_db: + await self.on_update_db(cluster_uuid, kdu_instance, filter=db_dict["filter"]) return output @@ -682,32 +691,190 @@ class K8sJujuConnector(K8sConnector): return readme - async def status_kdu(self, cluster_uuid: str, kdu_instance: str,) -> dict: + async def status_kdu( + self, + cluster_uuid: str, + kdu_instance: str, + complete_status: bool = False, + yaml_format: bool = False + ) -> dict: """Get the status of the KDU Get the current status of the KDU instance. :param cluster_uuid str: The UUID of the cluster :param kdu_instance str: The unique id of the KDU instance + :param complete_status: To get the complete_status of the KDU + :param yaml_format: To get the status in proper format for NSR record :return: Returns a dictionary containing namespace, state, resources, - and deployment_time. + and deployment_time and returns complete_status if complete_status is True """ status = {} controller = await self.get_controller(cluster_uuid) - model = await self.get_model(kdu_instance, controller=controller) + try: + model = await self.get_model(kdu_instance, controller=controller) + model_status = await model.get_status() + status = model_status.applications - model_status = await model.get_status() - status = model_status.applications + if not complete_status: + for name in model_status.applications: + application = model_status.applications[name] + status[name] = {"status": application["status"]["status"]} + else: + if yaml_format: + return obj_to_yaml(model_status) + else: + return obj_to_dict(model_status) + except Exception as e: + self.log.debug("Error in getting model_status for kdu_instance: {}. Error: {}" + .format(kdu_instance, str(e))) + finally: + if model: + await model.disconnect() + await controller.disconnect() + return status - for name in model_status.applications: - application = model_status.applications[name] - status[name] = {"status": application["status"]["status"]} + async def get_application_actions( + self, + application_name: str, + model_name: str, + cluster_uuid: str, + kdu_instance: str + ) -> dict: + """ + Get available actions for an application - await model.disconnect() - await controller.disconnect() + :param application_name str: Application name + :model_name str: Model name + :param cluster_uuid str: The UUID of the cluster + :param kdu_instance str: The unique id of the KDU instance - return status + :return: Returns a dictionary which has action list of the Application + """ + model = None + application_actions = {} + controller = await self.get_controller(cluster_uuid) + try: + model = await self.get_model(kdu_instance, controller=controller) + application = model.applications[application_name] + application_actions = await application.get_actions() + except Exception as e: + raise JujuError("Error in getting actions for application: {} in model: {}. Error: {}" + .format(application_name, model_name, str(e))) + finally: + if model: + await model.disconnect() + await controller.disconnect() + + return application_actions + + async def get_application_configs( + self, + application_name: str, + model_name: str, + cluster_uuid: str, + kdu_instance: str + ) -> dict: + """ + Get available configs for an application. + + :param application_name str: Application name + :model_name str: Model name + :param cluster_uuid str: The UUID of the cluster + :param kdu_instance str: The unique id of the KDU instance + + :return: Returns a dictionary which has config list of the Application + """ + model = None + application_configs = {} + controller = await self.get_controller(cluster_uuid) + try: + model = await self.get_model(kdu_instance, controller=controller) + application = model.applications[application_name] + application_configs = await application.get_config() + except Exception as e: + raise JujuError("Error in getting configs for application: {} in model: {}. Error: {}" + .format(application_name, model_name, str(e))) + finally: + if model: + await model.disconnect() + await controller.disconnect() + return application_configs + + async def get_executed_actions( + self, + model_name: str, + cluster_uuid: str, + kdu_instance: str + ) -> list: + """ + Get executed/history of actions for a model. + :model_name str: Model name + :param cluster_uuid str: The UUID of the cluster + :param kdu_instance str: The unique id of the KDU instance + + :return: List of executed actions for a model. + """ + model = None + executed_actions = [] + controller = await self.get_controller(cluster_uuid) + try: + model = await self.get_model(kdu_instance, controller=controller) + # Get all unique action names + actions = {} + for application in model.applications: + application_actions = await self.get_application_actions(application, model, + cluster_uuid, kdu_instance) + actions.update(application_actions) + # Get status of all actions + for application_action in actions: + application_action_status_list = \ + await model.get_action_status(name=application_action) + for action_id, action_status in application_action_status_list.items(): + executed_action = {"id": action_id, + "action": application_action, + "status": action_status} + # Get action output by id + action_status = await model.get_action_output(executed_action["id"]) + for k, v in action_status.items(): + executed_action[k] = v + executed_actions.append(executed_action) + except Exception as e: + raise JujuError("Error in getting executed actions for model: {}. Error: {}" + .format(model_name, str(e))) + finally: + if model: + await model.disconnect() + await controller.disconnect() + return executed_actions + + async def update_vca_status(self, vcastatus: dict, cluster_uuid: str, kdu_instance: str): + """ + Add all configs, actions, executed actions of all applications in a model to vcastatus dict + + :param vcastatus dict: dict containing vcastatus + :param cluster_uuid str: The UUID of the cluster + :param kdu_instance str: The unique id of the KDU instance + :return: None + """ + try: + for model_name in vcastatus: + # Adding executed actions + vcastatus[model_name]["executedActions"] = \ + await self.get_executed_actions(model_name, cluster_uuid, kdu_instance) + + for application in vcastatus[model_name]["applications"]: + # Adding application actions + vcastatus[model_name]["applications"][application]["actions"] = \ + await self.get_application_actions(application, model_name, + cluster_uuid, kdu_instance) + # Adding application configs + vcastatus[model_name]["applications"][application]["configs"] = \ + await self.get_application_configs(application, model_name, + cluster_uuid, kdu_instance) + except Exception as e: + self.log.debug("Error in updating vca status: {}".format(str(e))) async def get_services( self, cluster_uuid: str, kdu_instance: str, namespace: str