Beispiel #1
0
    def _create_app_specific_resources_pre_apply(self, app_op, app, hook_info):
        """Add application specific resources.

        :param app_op: AppOperator object
        :param app: AppOperator.Application object
        :param hook_info: LifecycleHookInfo object

        """
        lifecycle_utils.create_local_registry_secrets(app_op, app, hook_info)

        try:
            # Copy the latest configmap with the ceph monitor information
            # required by the application into the application namespace
            if app_op._kube.kube_get_config_map(
                    self.APP_OPENSTACK_RESOURCE_CONFIG_MAP,
                    common.HELM_NS_OPENSTACK):
                # Already have one. Delete it, in case it changed
                app_op._kube.kube_delete_config_map(
                    self.APP_OPENSTACK_RESOURCE_CONFIG_MAP,
                    common.HELM_NS_OPENSTACK)

            # Copy the latest config map
            app_op._kube.kube_copy_config_map(
                self.APP_OPENSTACK_RESOURCE_CONFIG_MAP,
                common.HELM_NS_RBD_PROVISIONER, common.HELM_NS_OPENSTACK)
        except Exception as e:
            LOG.error(e)
            raise
    def pre_apply(self, app_op, app, hook_info):
        """Pre Apply actions

        Creates the local registry secret and migrates helm user overrides
        from one chart name to another

        :param app_op: AppOperator object
        :param app: AppOperator.Application object
        :param hook_info: LifecycleHookInfo object
        """
        LOG.debug("Executing pre_apply for {} app".format(
            constants.HELM_APP_NGINX_IC))

        # As this overrides the functionality provided in the base class, make
        # sure we perform the operations defined there
        lifecycle_utils.create_local_registry_secrets(app_op, app, hook_info)

        dbapi_instance = dbapi.get_instance()

        # get most recently created inactive app
        inactive_db_apps = dbapi_instance.kube_app_get_inactive(
            app.name, limit=1, sort_key='created_at', sort_dir='desc')

        if not inactive_db_apps:
            # nothing to migrate from
            return

        from_db_app = inactive_db_apps[0]
        to_db_app = dbapi_instance.kube_app_get(app.name)

        old_chart_overrides = self._get_helm_user_overrides(
            dbapi_instance, from_db_app,
            app_constants.HELM_CHART_LEGACY_INGRESS_NGINX,
            app_constants.HELM_NS_NGINX_INGRESS_CONTROLLER)

        new_chart_overrides = self._get_helm_user_overrides(
            dbapi_instance, to_db_app, app_constants.HELM_CHART_INGRESS_NGINX,
            app_constants.HELM_NS_NGINX_INGRESS_CONTROLLER)

        if old_chart_overrides and not new_chart_overrides:
            # if there are user overrides on the old chart name and there are no user overrides
            # on the new chart name, migrate them from the old to the new name
            # we do not want to do the migration if there are overrides for the new name because
            # that means the user has already done it.
            LOG.info("Migrating user_overrides from {} to {}".format(
                app_constants.HELM_CHART_LEGACY_INGRESS_NGINX,
                app_constants.HELM_CHART_INGRESS_NGINX))

            self._update_helm_user_overrides(
                dbapi_instance,
                to_db_app,
                app_constants.HELM_CHART_INGRESS_NGINX,
                app_constants.HELM_NS_NGINX_INGRESS_CONTROLLER,
                old_chart_overrides,
            )
Beispiel #3
0
    def app_lifecycle_actions(self, context, conductor_obj, app_op, app,
                              hook_info):
        """ Perform lifecycle actions for an operation

        :param context: request context
        :param conductor_obj: conductor object
        :param app_op: AppOperator object
        :param app: AppOperator.Application object
        :param hook_info: LifecycleHookInfo object

        """

        # Semantic checks
        if hook_info.lifecycle_type == constants.APP_LIFECYCLE_TYPE_SEMANTIC_CHECK and \
                hook_info.mode == constants.APP_LIFECYCLE_MODE_AUTO and \
                hook_info.operation == constants.APP_APPLY_OP and \
                hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_PRE:
            raise exception.LifecycleSemanticCheckException(
                "Automatic apply is disabled for %s." % app.name)

        # TODO(dvoicule) remove once each app has its lifecycle operator and takes care of its rbd
        # this is here to keep the same functionality while decoupling
        # Rbd
        if hook_info.lifecycle_type == constants.APP_LIFECYCLE_TYPE_RBD:
            if hook_info.operation == constants.APP_APPLY_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_PRE:
                lifecycle_utils.create_rbd_provisioner_secrets(
                    app_op, app, hook_info)
            elif hook_info.operation == constants.APP_REMOVE_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_POST:
                lifecycle_utils.delete_rbd_provisioner_secrets(
                    app_op, app, hook_info)

        # TODO(dvoicule) remove once each app has its lifecycle operator and takes care of its resources
        # this is here to keep the same functionality while decoupling
        # Resources
        if hook_info.lifecycle_type == constants.APP_LIFECYCLE_TYPE_RESOURCE:
            if hook_info.operation == constants.APP_APPLY_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_PRE:
                lifecycle_utils.create_local_registry_secrets(
                    app_op, app, hook_info)
            elif hook_info.operation == constants.APP_REMOVE_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_POST:
                lifecycle_utils.delete_local_registry_secrets(
                    app_op, app, hook_info)
    def app_lifecycle_actions(self, context, conductor_obj, app_op, app,
                              hook_info):
        """ Perform lifecycle actions for an operation

        :param context: request context
        :param conductor_obj: conductor object
        :param app_op: AppOperator object
        :param app: AppOperator.Application object
        :param hook_info: LifecycleHookInfo object

        """
        # Operation
        if hook_info.lifecycle_type == constants.APP_LIFECYCLE_TYPE_OPERATION:
            if hook_info.operation == constants.APP_APPLY_OP:
                if hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_POST:
                    return self.post_apply(context, conductor_obj, hook_info)
            elif hook_info.operation == constants.APP_REMOVE_OP:
                if hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_POST:
                    return self.post_remove(context, conductor_obj, hook_info)

        # Rbd
        elif hook_info.lifecycle_type == constants.APP_LIFECYCLE_TYPE_RBD:
            if hook_info.operation == constants.APP_APPLY_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_PRE:
                return lifecycle_utils.create_rbd_provisioner_secrets(
                    app_op, app, hook_info)
            elif hook_info.operation == constants.APP_REMOVE_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_POST:
                return lifecycle_utils.delete_rbd_provisioner_secrets(
                    app_op, app, hook_info)

        # Resources
        elif hook_info.lifecycle_type == constants.APP_LIFECYCLE_TYPE_RESOURCE:
            if hook_info.operation == constants.APP_APPLY_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_PRE:
                return lifecycle_utils.create_local_registry_secrets(
                    app_op, app, hook_info)
            elif hook_info.operation == constants.APP_REMOVE_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_POST:
                return lifecycle_utils.delete_local_registry_secrets(
                    app_op, app, hook_info)

        # Use the default behaviour for other hooks
        super(SnmpAppLifecycleOperator,
              self).app_lifecycle_actions(context, conductor_obj, app_op, app,
                                          hook_info)
    def app_lifecycle_actions(self, context, conductor_obj, app_op, app, hook_info):
        """ Perform lifecycle actions for an operation

        :param context: request context
        :param conductor_obj: conductor object
        :param app_op: AppOperator object
        :param app: AppOperator.Application object
        :param hook_info: LifecycleHookInfo object

        """
        # Semantic checks
        if hook_info.lifecycle_type == constants.APP_LIFECYCLE_TYPE_SEMANTIC_CHECK:
            if hook_info.mode == constants.APP_LIFECYCLE_MODE_AUTO and \
                    hook_info.operation == constants.APP_APPLY_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_PRE:
                return self.pre_auto_apply_check(conductor_obj)

        # Rbd
        elif hook_info.lifecycle_type == constants.APP_LIFECYCLE_TYPE_RBD:
            if hook_info.operation == constants.APP_APPLY_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_PRE:
                return lifecycle_utils.create_rbd_provisioner_secrets(app_op, app, hook_info)
            elif hook_info.operation == constants.APP_REMOVE_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_POST:
                return lifecycle_utils.delete_rbd_provisioner_secrets(app_op, app, hook_info)

        # Resources
        elif hook_info.lifecycle_type == constants.APP_LIFECYCLE_TYPE_RESOURCE:
            if hook_info.operation == constants.APP_APPLY_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_PRE:
                return lifecycle_utils.create_local_registry_secrets(app_op, app, hook_info)
            elif hook_info.operation == constants.APP_REMOVE_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_POST:
                return lifecycle_utils.delete_local_registry_secrets(app_op, app, hook_info)

        # Armada apply retry
        elif hook_info.lifecycle_type == constants.APP_LIFECYCLE_TYPE_ARMADA_REQUEST:
            if hook_info.operation == constants.APP_APPLY_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_POST:
                return self.armada_apply_retry(app_op, app, hook_info)

        # Use the default behaviour for other hooks
        super(PlatformAppLifecycleOperator, self).app_lifecycle_actions(context, conductor_obj, app_op, app, hook_info)
Beispiel #6
0
    def app_lifecycle_actions(self, context, conductor_obj, app_op, app,
                              hook_info):
        """ Perform lifecycle actions for an operation

        :param context: request context
        :param conductor_obj: conductor object
        :param app_op: AppOperator object
        :param app: AppOperator.Application object
        :param hook_info: LifecycleHookInfo object

        """

        # Semantic checks
        if hook_info.lifecycle_type == constants.APP_LIFECYCLE_TYPE_SEMANTIC_CHECK:
            if hook_info.mode == constants.APP_LIFECYCLE_MODE_AUTO and \
                    hook_info.operation == constants.APP_APPLY_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_PRE:
                raise exception.LifecycleSemanticCheckException(
                    "Automatic apply is disabled for %s." % app.name)
            elif hook_info.mode == constants.APP_LIFECYCLE_MODE_AUTO and \
                    hook_info.operation == constants.APP_EVALUATE_REAPPLY_OP:
                # To reject the reapply evaluation an app can override this
                # hook and raise exception.LifecycleSemanticCheckException
                pass
            # Check if it is a delete operation
            elif hook_info.operation == constants.APP_DELETE_OP:
                try:
                    # Store the forbidden operations in a list
                    forbidden = conductor_obj.apps_metadata[
                        constants.APP_METADATA_APPS][app.name][
                            constants.APP_METADATA_BEHAVIOR][
                                constants.
                                APP_METADATA_FORBIDDEN_MANUAL_OPERATIONS]
                except KeyError:
                    pass
                else:
                    # Check if deletion is a forbidden operation
                    if constants.APP_DELETE_OP in forbidden:
                        raise exception.LifecycleSemanticCheckOpererationBlocked(
                            op=constants.APP_DELETE_OP.capitalize(),
                            app=app.name)

        # TODO(dvoicule) remove once each app has its lifecycle operator and takes care of its rbd
        # this is here to keep the same functionality while decoupling
        # Rbd
        elif hook_info.lifecycle_type == constants.APP_LIFECYCLE_TYPE_RBD:
            if hook_info.operation == constants.APP_APPLY_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_PRE:
                lifecycle_utils.create_rbd_provisioner_secrets(
                    app_op, app, hook_info)
            elif hook_info.operation == constants.APP_REMOVE_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_POST:
                lifecycle_utils.delete_rbd_provisioner_secrets(
                    app_op, app, hook_info)

        # TODO(dvoicule) remove once each app has its lifecycle operator and takes care of its resources
        # this is here to keep the same functionality while decoupling
        # Resources
        elif hook_info.lifecycle_type == constants.APP_LIFECYCLE_TYPE_RESOURCE:
            if hook_info.operation == constants.APP_APPLY_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_PRE:
                lifecycle_utils.create_local_registry_secrets(
                    app_op, app, hook_info)
            elif hook_info.operation == constants.APP_REMOVE_OP and \
                    hook_info.relative_timing == constants.APP_LIFECYCLE_TIMING_POST:
                lifecycle_utils.delete_local_registry_secrets(
                    app_op, app, hook_info)