Ejemplo n.º 1
0
    def move_service_into_recycle_bin(self, service):
        """将服务移入回收站"""
        data = service.toJSON()
        data.pop("ID")
        trash_service = recycle_bin_repo.create_trash_service(**data)

        # 如果这个应用属于应用组, 则删除应用组最后一个应用后同时删除应用组
        if service.tenant_service_group_id > 0:
            count = service_repo.get_services_by_service_group_id(service.tenant_service_group_id).count()
            if count <= 1:
                tenant_service_group_repo.delete_tenant_service_group_by_pk(service.tenant_service_group_id)

        service.delete()
        return trash_service
Ejemplo n.º 2
0
    def again_delete_service(self, tenant, service, user=None):
        """二次删除应用"""

        try:
            region_api.delete_service(service.service_region,
                                      tenant.tenant_name,
                                      service.service_alias,
                                      tenant.enterprise_id)
        except region_api.CallApiError as e:
            if int(e.status) != 404:
                logger.exception(e)
                return 500, "删除应用失败 {0}".format(e.message)
        if service.create_status == "complete":
            data = service.toJSON()
            data.pop("ID")
            delete_service_repo.create_delete_service(**data)

        env_var_repo.delete_service_env(tenant.tenant_id, service.service_id)
        auth_repo.delete_service_auth(service.service_id)
        domain_repo.delete_service_domain(service.service_id)
        tcp_domain.delete_service_tcp_domain(service.service_id)
        dep_relation_repo.delete_service_relation(tenant.tenant_id,
                                                  service.service_id)
        mnt_repo.delete_mnt(service.service_id)
        port_repo.delete_service_port(tenant.tenant_id, service.service_id)
        volume_repo.delete_service_volumes(service.service_id)
        group_service_relation_repo.delete_relation_by_service_id(
            service.service_id)
        service_attach_repo.delete_service_attach(service.service_id)
        create_step_repo.delete_create_step(service.service_id)
        event_service.delete_service_events(service)
        probe_repo.delete_service_probe(service.service_id)
        service_payment_repo.delete_service_payment(service.service_id)
        service_source_repo.delete_service_source(tenant.tenant_id,
                                                  service.service_id)
        service_perm_repo.delete_service_perm(service.ID)
        compose_relation_repo.delete_relation_by_service_id(service.service_id)
        service_label_repo.delete_service_all_labels(service.service_id)
        # 删除应用和插件的关系
        share_repo.delete_tenant_service_plugin_relation(service.service_id)
        # 如果这个应用属于应用组, 则删除应用组最后一个应用后同时删除应用组
        if service.tenant_service_group_id > 0:
            count = service_repo.get_services_by_service_group_id(
                service.tenant_service_group_id).count()
            if count <= 1:
                tenant_service_group_repo.delete_tenant_service_group_by_pk(
                    service.tenant_service_group_id)
        self.__create_service_delete_event(tenant, service, user)
        service.delete()
        return 200, "success"
Ejemplo n.º 3
0
    def install_service_group(self, user, tenant_name, group_key,
                              group_version, region_name, template_version):
        tenant_service_group = None
        new_group = None
        try:
            logger.debug('prepared install [{}-{}] to [{}] on [{}]'.format(
                group_key, group_version, tenant_name, region_name))
            if tenant_name:
                tenant = self.get_tenant_by_name(tenant_name)
            else:
                tenant = self.get_default_tenant_by_user(user.user_id)

            if not tenant:
                logger.error('tenant does not existed!')
                return False, '租户不存在', None
            logger.debug('login_user_id: {}'.format(user.user_id))
            logger.debug('login_user: {}'.format(user.nick_name))
            logger.debug('tenant_name: {}'.format(tenant.tenant_name))

            # 查看安装的目标数据中心是否已初始化, 如果未初始化则先初始化
            if not tenant_svc.init_region_tenant(tenant, region_name):
                return False, '初始化数据中心失败: {}'.format(region_name), None
            app = market_sycn_service.download_app_service_group_from_market(
                user, tenant, group_key, group_version)
            new_group = self.__create_group(tenant.tenant_id, region_name,
                                            app.group_name)
            tenant_service_group, _ = market_app_service.install_service(
                tenant, region_name, user, new_group.ID, app, True)
            if tenant_service_group:
                tenant_service_group = self.get_group_services_by_pk(
                    tenant_service_group.pk)
            return True, "success", tenant_service_group
        except Exception as e:
            logger.exception(e)
            # 回滚数据
            if tenant_service_group:
                tenant_service_group_repo.delete_tenant_service_group_by_pk(
                    tenant_service_group.ID)
            if new_group:
                group_repo.delete_group_by_pk(new_group.ID)
            return False, str(e.message), None
Ejemplo n.º 4
0
    def truncate_service(self, tenant, service):
        """彻底删除应用"""
        if service.create_status == "complete":
            data = service.toJSON()
            delete_service_repo.create_delete_service(**data)

        try:
            region_api.delete_service(service.service_region,
                                      tenant.tenant_name,
                                      service.service_alias,
                                      tenant.enterprise_id)
        except region_api.CallApiError as e:
            if int(e.status) != 404:
                return 500, "删除应用失败 {0}".format(e.message)
        env_var_repo.delete_service_env(tenant.tenant_id, service.service_id)
        auth_repo.delete_service_auth(service.service_id)
        domain_repo.delete_service_domain(service.service_id)
        dep_relation_repo.delete_service_relation(tenant.tenant_id,
                                                  service.service_id)
        env_var_repo.delete_service_env(tenant.tenant_id, service.service_id)
        mnt_repo.delete_mnt(service.service_id)
        port_repo.delete_service_port(tenant.tenant_id, service.service_id)
        volume_repo.delete_service_volumes(service.service_id)
        group_service_relation_repo.delete_relation_by_service_id(
            service.service_id)
        service_attach_repo.delete_service_attach(service.service_id)
        create_step_repo.delete_create_step(service.service_id)
        event_service.delete_service_events(service)
        probe_repo.delete_service_probe(service.service_id)
        service_payment_repo.delete_service_payment(service.service_id)
        # 如果这个应用属于应用组, 则删除应用组最后一个应用后同时删除应用组
        if service.tenant_service_group_id > 0:
            count = service_repo.get_services_by_service_group_id(
                service.tenant_service_group_id).count()
            if count <= 1:
                tenant_service_group_repo.delete_tenant_service_group_by_pk(
                    service.tenant_service_group_id)

        service.delete()
        return 200, "success"
Ejemplo n.º 5
0
    def install_service(self, tenant, region, user, group_id, market_app):
        service_list = []
        service_key_dep_key_map = {}
        key_service_map = {}
        tenant_service_group = None
        service_probe_map = {}
        try:
            app_templates = json.loads(market_app.app_template)
            apps = app_templates["apps"]
            tenant_service_group = self.__create_tenant_service_group(
                region, tenant.tenant_id, group_id, market_app.group_key,
                market_app.version, market_app.group_name)
            for app in apps:
                ts = self.__init_market_app(tenant.tenant_id, region, user,
                                            app, tenant_service_group.ID)
                group_service.add_service_to_group(tenant, region, group_id,
                                                   ts.service_id)
                service_list.append(ts)

                # 先保存env,再保存端口,因为端口需要处理env
                code, msg = self.__save_env(
                    tenant, ts, app["service_env_map_list"],
                    app["service_connect_info_map_list"])
                if code != 200:
                    raise Exception(msg)
                code, msg = self.__save_port(tenant, ts, app["port_map_list"])
                if code != 200:
                    raise Exception(msg)
                code, msg = self.__save_volume(tenant, ts,
                                               app["service_volume_map_list"])
                if code != 200:
                    raise Exception(msg)

                # 保存应用探针信息
                probe_infos = app.get("probes", None)
                if probe_infos:
                    service_probe_map[ts.service_id] = probe_infos

                self.__save_extend_info(ts, app["extend_method_map"])

                dep_apps_key = app.get("dep_service_map_list", None)
                if dep_apps_key:
                    service_key_dep_key_map[ts.service_key] = dep_apps_key
                key_service_map[ts.service_key] = ts
            # 保存依赖关系
            self.__save_service_deps(tenant, service_key_dep_key_map,
                                     key_service_map)
            # 构建应用
            self.__build_services(tenant, user, service_list,
                                  service_probe_map)
        except Exception as e:
            logger.exception(e)
            if tenant_service_group:
                tenant_service_group_repo.delete_tenant_service_group_by_pk(
                    tenant_service_group.ID)
            for service in service_list:
                try:
                    app_manage_service.truncate_service(tenant, service)
                except Exception as le:
                    logger.exception(le)
            raise e
Ejemplo n.º 6
0
    def install_market_apps_directly(self, user, tenant, region_name,
                                     app_service_json_str, service_origin):
        app_templates = json.loads(app_service_json_str)
        apps = app_templates["apps"]

        service_list = []
        service_key_dep_key_map = {}
        key_service_map = {}
        tenant_service_group = None
        new_group = None
        try:
            # 生成分类
            group_name = self.__generator_group_name(
                app_templates["group_name"])
            new_group = group_repo.add_group(tenant.tenant_id, region_name,
                                             group_name)
            group_id = new_group.ID
            tenant_service_group = self.__generate_tenant_service_group(
                region_name, tenant.tenant_id, new_group.ID,
                app_templates["group_key"], app_templates["group_version"],
                app_templates["group_name"])
            for app in apps:
                ts = self.__init_market_app(tenant, region_name, user, app,
                                            tenant_service_group.ID,
                                            service_origin)
                group_service.add_service_to_group(tenant, region_name,
                                                   group_id, ts.service_id)

                # 先保存env,再保存端口,因为端口需要处理env
                code, msg = self.__save_env(
                    tenant, ts, app["service_env_map_list"],
                    app["service_connect_info_map_list"])
                if code != 200:
                    raise Exception(msg)
                code, msg = self.__save_port(tenant, ts, app["port_map_list"])
                if code != 200:
                    raise Exception(msg)
                code, msg = self.__save_volume(tenant, ts,
                                               app["service_volume_map_list"])
                if code != 200:
                    raise Exception(msg)

                # 保存应用探针信息
                probe_infos = app.get("probes", None)
                if probe_infos:
                    for prob_data in probe_infos:
                        code, msg, probe = probe_service.add_service_probe(
                            tenant, ts, prob_data)
                        if code != 200:
                            logger.exception(msg)

                self.__save_extend_info(ts, app["extend_method_map"])

                dep_apps_key = app.get("dep_service_map_list", None)
                if dep_apps_key:
                    service_key_dep_key_map[ts.service_key] = dep_apps_key
                key_service_map[ts.service_key] = ts
                service_list.append(ts)
            # 保存依赖关系,需要等应用都创建完成才能使用
            self.__save_service_deps(tenant, service_key_dep_key_map,
                                     key_service_map)
            # 数据中心创建应用
            for service in service_list:
                new_service = app_service.create_region_service(
                    tenant, service, user.nick_name)
                logger.debug("build service ===> {0}  success".format(
                    service.service_cname))
                # 为服务添加探针
                self.__create_service_probe(tenant, new_service)

                # 添加服务有无状态标签
                label_service.update_service_state_label(tenant, new_service)

            return True, "success", tenant_service_group, service_list
        except Exception as e:
            logger.exception(e)
            # 回滚数据
            if tenant_service_group:
                tenant_service_group_repo.delete_tenant_service_group_by_pk(
                    tenant_service_group.ID)
            if new_group:
                group_repo.delete_group_by_pk(new_group.ID)
            for service in service_list:
                try:
                    app_manage_service.truncate_service(tenant, service)
                except Exception as delete_error:
                    logger.exception(delete_error)
            return False, "create tenant_services from market directly failed !", None, service_list
Ejemplo n.º 7
0
    def install_service(self, tenant, region, user, group_id, market_app,
                        is_deploy):
        service_list = []
        service_key_dep_key_map = {}
        key_service_map = {}
        tenant_service_group = None
        service_probe_map = {}
        app_plugin_map = {}  # 新装服务对应的安装的插件映射
        old_new_id_map = {}  # 新旧服务映射关系
        try:
            app_templates = json.loads(market_app.app_template)
            apps = app_templates["apps"]
            tenant_service_group = self.__create_tenant_service_group(
                region, tenant.tenant_id, group_id, market_app.group_key,
                market_app.version, market_app.group_name)

            status, msg = self.__create_plugin_for_tenant(
                region, user, tenant, app_templates.get("plugins", []))
            if status != 200:
                raise Exception(msg)

            for app in apps:
                ts = self.__init_market_app(tenant, region, user, app,
                                            tenant_service_group.ID)
                group_service.add_service_to_group(tenant, region, group_id,
                                                   ts.service_id)
                service_list.append(ts)
                old_new_id_map[app["service_id"]] = ts

                # 先保存env,再保存端口,因为端口需要处理env
                code, msg = self.__save_env(
                    tenant, ts, app["service_env_map_list"],
                    app["service_connect_info_map_list"])
                if code != 200:
                    raise Exception(msg)
                code, msg = self.__save_port(tenant, ts, app["port_map_list"])
                if code != 200:
                    raise Exception(msg)
                code, msg = self.__save_volume(tenant, ts,
                                               app["service_volume_map_list"])
                if code != 200:
                    raise Exception(msg)

                # 保存应用探针信息
                probe_infos = app.get("probes", None)
                if probe_infos:
                    service_probe_map[ts.service_id] = probe_infos

                self.__save_extend_info(ts, app["extend_method_map"])
                if app.get("service_share_uuid", None):
                    dep_apps_key = app.get("dep_service_map_list", None)
                    if dep_apps_key:
                        service_key_dep_key_map[app.get(
                            "service_share_uuid")] = dep_apps_key
                    key_service_map[app.get("service_share_uuid")] = ts
                else:
                    dep_apps_key = app.get("dep_service_map_list", None)
                    if dep_apps_key:
                        service_key_dep_key_map[ts.service_key] = dep_apps_key
                    key_service_map[ts.service_key] = ts
                app_plugin_map[ts.service_id] = app.get(
                    "service_related_plugin_config")

            # 保存依赖关系
            self.__save_service_deps(tenant, service_key_dep_key_map,
                                     key_service_map)

            # 数据中心创建应用
            new_service_list = self.__create_region_services(
                tenant, user, service_list, service_probe_map)
            # 创建应用插件
            self.__create_service_plugins(region, tenant, service_list,
                                          app_plugin_map, old_new_id_map)
            if is_deploy:
                # 部署所有应用
                self.__deploy_services(tenant, user, new_service_list)
        except Exception as e:
            logger.exception(e)
            if tenant_service_group:
                tenant_service_group_repo.delete_tenant_service_group_by_pk(
                    tenant_service_group.ID)
            for service in service_list:
                try:
                    app_manage_service.truncate_service(tenant, service)
                except Exception as le:
                    logger.exception(le)
            raise e