예제 #1
0
 def update_service_probea(self, tenant, service, data, user_name=''):
     code, msg = self.__check_probe_data(data)
     if code != 200:
         raise ServiceHandleException(status_code=code, msg_show=msg, msg="error")
     probes = probe_repo.get_service_probe(service.service_id)
     if not probes:
         if service.service_source == "third_party":
             code, msg, new_probe = self.add_service_probe(tenant, service, data)
             return new_probe
         raise ServiceHandleException(status_code=404, msg="no found", msg_show="组件未设置探针,无法进行修改操作")
     probe = probes[0]
     # delete more probe without first, one service will have one probe
     if len(probes) > 1:
         for index in range(len(probes)):
             if index > 0:
                 self.delete_service_probe(tenant, service, probes[index].probe_id)
     if not probe:
         raise ServiceHandleException(status_code=404, msg="no found", msg_show="组件未设置探针,无法进行修改操作")
     is_used = data.get("is_used", None)
     if is_used is None:
         is_used = probe.is_used
     else:
         is_used = 1 if is_used else 0
     prob_data = {
         "service_id": service.service_id,
         "scheme": data.get("scheme", probe.scheme),
         "path": data.get("path", probe.path),
         "port": data.get("port", probe.port),
         "cmd": data.get("cmd", probe.cmd),
         "http_header": data.get("http_header", probe.http_header),
         "initial_delay_second": data.get("initial_delay_second", probe.initial_delay_second),
         "period_second": data.get("period_second", probe.period_second),
         "timeout_second": data.get("timeout_second", probe.timeout_second),
         "failure_threshold": data.get("failure_threshold", probe.failure_threshold),
         "success_threshold": data.get("success_threshold", probe.success_threshold),
         "is_used": is_used,
         "probe_id": probe.probe_id,
         "mode": data["mode"]
     }
     console_probe = copy.deepcopy(prob_data)
     prob_data["enterprise_id"] = tenant.enterprise_id
     prob_data["operator"] = user_name
     if service.create_status == "complete":
         try:
             res, body = region_api.update_service_probec(service.service_region, tenant.tenant_name, service.service_alias,
                                                          prob_data)
             logger.debug("update probe action status {0}".format(res.status))
         except region_api.CallApiError as e:
             logger.debug(e)
             if e.message.get("httpcode") == 404:
                 probe.delete()
     console_probe.pop("probe_id")
     console_probe.pop("service_id")
     probe_repo.update_service_probeb(service_id=service.service_id, probe_id=probe.probe_id, **console_probe)
     new_probe = probe_repo.get_probe_by_probe_id(service.service_id, probe.probe_id)
     return new_probe
예제 #2
0
 def disable_service_when_delete_port(self, tenant, service,
                                      container_port):
     """删除端口时禁用相关服务"""
     # 禁用健康检测
     from console.services.app_config import probe_service
     probe = probe_repo.get_service_probe(service.service_id).first()
     if probe and container_port == probe.port:
         probe.is_used = False
         probe_service.update_service_probea(tenant=tenant,
                                             service=service,
                                             data=probe.to_dict())
예제 #3
0
 def disable_service_when_delete_port(self, tenant, service, container_port):
     """删除端口时禁用相关服务"""
     # 禁用健康检测
     from console.services.app_config import probe_service
     probe = probe_repo.get_service_probe(service.service_id).filter(is_used=True).first()
     if probe and container_port == probe.port:
         probe.is_used = False
         try:
             probe_service.update_service_probea(tenant=tenant, service=service, data=probe.to_dict())
         except RegionApiBaseHttpClient.CallApiError as e:
             logger.exception(e)
             if e.status != 404:
                 raise AbortRequest(msg=e.message, status_code=e.status)
예제 #4
0
 def update_service_probea(self, tenant, service, data):
     code, msg = self.__check_probe_data(data)
     if code != 200:
         return code, msg, None
     probes = probe_repo.get_service_probe(service.service_id)
     if not probes:
         return 404, u"应用未设置探针,无法进行修改操作", None
     probe = probes[0]
     # delete more probe without first, one service will have one probe
     if len(probes) > 1:
         for index in range(len(probes)):
             if index > 0:
                 self.delete_service_probe(tenant, service, probes[index].probe_id)
     if not probe:
         return 404, u"应用未设置探针,无法进行修改操作", None
     is_used = data.get("is_used", None)
     if is_used is None:
         is_used = probe.is_used
     else:
         is_used = 1 if is_used else 0
     prob_data = {
         "service_id": service.service_id,
         "scheme": data.get("scheme", probe.scheme),
         "path": data.get("path", probe.path),
         "port": data.get("port", probe.port),
         "cmd": data.get("cmd", probe.cmd),
         "http_header": data.get("http_header", probe.http_header),
         "initial_delay_second": data.get("initial_delay_second", probe.initial_delay_second),
         "period_second": data.get("period_second", probe.period_second),
         "timeout_second": data.get("timeout_second", probe.timeout_second),
         "failure_threshold": data.get("failure_threshold", probe.failure_threshold),
         "success_threshold": data.get("success_threshold", probe.success_threshold),
         "is_used": is_used,
         "probe_id": probe.probe_id,
         "mode": data["mode"]
     }
     console_probe = copy.deepcopy(prob_data)
     prob_data["enterprise_id"] = tenant.enterprise_id
     if service.create_status == "complete":
         res, body = region_api.update_service_probec(service.service_region, tenant.tenant_name, service.service_alias,
                                                      prob_data)
         logger.debug("update probe action status {0}".format(res.status))
     console_probe.pop("probe_id")
     console_probe.pop("service_id")
     probe_repo.update_service_probeb(service_id=service.service_id, probe_id=probe.probe_id, **console_probe)
     new_probe = probe_repo.get_probe_by_probe_id(service.service_id, probe.probe_id)
     return 200, "success", new_probe
예제 #5
0
    def get_service_details(self, tenant, service):
        service_base = service.to_dict()
        service_labels = service_label_repo.get_service_labels(service.service_id)
        service_domains = domain_repo.get_service_domains(service.service_id)
        service_tcpdomains = tcp_domain.get_service_tcpdomains(service.service_id)
        service_events = event_repo.get_specified_num_events(tenant.tenant_id, service.service_id)
        service_perms = service_perm_repo.get_service_perms_by_service_pk(service.ID)
        service_probes = probe_repo.get_service_probe(service.service_id)
        service_source = service_source_repo.get_service_source(tenant.tenant_id, service.service_id)
        service_auths = auth_repo.get_service_auth(service.service_id)
        service_env_vars = env_var_repo.get_service_env(tenant.tenant_id, service.service_id)
        service_compile_env = compile_env_repo.get_service_compile_env(service.service_id)
        service_extend_method = extend_repo.get_extend_method_by_service(service)
        image_service_relation = image_service_relation_repo.get_image_service_relation(tenant.tenant_id,
                                                                                        service.service_id)
        service_mnts = mnt_repo.get_service_mnts(tenant.tenant_id, service.service_id)
        service_plugin_relation = app_plugin_relation_repo.get_service_plugin_relation_by_service_id(service.service_id)
        service_plugin_config = service_plugin_config_repo.get_service_plugin_all_config(service.service_id)
        service_relation = dep_relation_repo.get_service_dependencies(tenant.tenant_id, service.service_id)
        service_volumes = volume_repo.get_service_volumes(service.service_id)
        service_config_file = volume_repo.get_service_config_files(service.service_id)
        service_ports = port_repo.get_service_ports(tenant.tenant_id, service.service_id)

        app_info = {
            "service_base": service_base,
            "service_labels": [label.to_dict() for label in service_labels],
            "service_domains": [domain.to_dict() for domain in service_domains],
            "service_tcpdomains": [tcpdomain.to_dict() for tcpdomain in service_tcpdomains],
            "service_events": [event.to_dict() for event in service_events],
            "service_perms": [perm.to_dict() for perm in service_perms],
            "service_probes": [probe.to_dict() for probe in service_probes],
            "service_source": service_source.to_dict() if service_source else None,
            "service_auths": [auth.to_dict() for auth in service_auths],
            "service_env_vars": [env_var.to_dict() for env_var in service_env_vars],
            "service_compile_env": service_compile_env.to_dict() if service_compile_env else None,
            "service_extend_method": service_extend_method.to_dict() if service_extend_method else None,
            "image_service_relation": image_service_relation.to_dict() if image_service_relation else None,
            "service_mnts": [mnt.to_dict() for mnt in service_mnts],
            "service_plugin_relation": [plugin_relation.to_dict() for plugin_relation in service_plugin_relation],
            "service_plugin_config": [config.to_dict() for config in service_plugin_config],
            "service_relation": [relation.to_dict() for relation in service_relation],
            "service_volumes": [volume.to_dict() for volume in service_volumes],
            "service_config_file": [config_file.to_dict() for config_file in service_config_file],
            "service_ports": [port.to_dict() for port in service_ports]
        }
        return app_info
    def save_data(
        self,
        migrate_tenant,
        migrate_region,
        user,
        changed_service_map,
        metadata,
        group_id,
        same_team,
        same_region,
        sync_flag=False,
    ):
        from console.services.groupcopy_service import groupapp_copy_service
        group = group_repo.get_group_by_id(group_id)
        apps = metadata["apps"]

        old_new_service_id_map = dict()
        service_relations_list = []
        service_mnt_list = []
        # restore component
        for app in apps:
            service_base_info = app["service_base"]
            new_service_id = changed_service_map[
                service_base_info["service_id"]]["ServiceID"]
            new_service_alias = changed_service_map[
                service_base_info["service_id"]]["ServiceAlias"]
            ts = self.__init_app(app["service_base"], new_service_id,
                                 new_service_alias, user, migrate_region,
                                 migrate_tenant)
            old_new_service_id_map[app["service_base"]
                                   ["service_id"]] = ts.service_id
            group_service.add_service_to_group(migrate_tenant, migrate_region,
                                               group.ID, ts.service_id)
            self.__save_port(migrate_region, migrate_tenant, ts,
                             app["service_ports"], group.governance_mode,
                             app["service_env_vars"], sync_flag)
            self.__save_env(migrate_tenant, ts, app["service_env_vars"])
            self.__save_volume(
                migrate_tenant, ts, app["service_volumes"],
                app["service_config_file"]
                if 'service_config_file' in app else None)
            self.__save_compile_env(ts, app["service_compile_env"])
            self.__save_service_label(migrate_tenant, ts, migrate_region,
                                      app["service_labels"])
            if sync_flag:
                self.__save_service_probes(ts, app["service_probes"])
            self.__save_service_source(migrate_tenant, ts,
                                       app["service_source"])
            self.__save_service_auth(ts, app["service_auths"])
            self.__save_third_party_service_endpoints(
                ts, app.get("third_party_service_endpoints", []))
            self.__save_service_monitors(migrate_tenant, ts,
                                         app.get("service_monitors"))
            self.__save_component_graphs(ts, app.get("component_graphs"))

            if ts.service_source == "third_party":
                app_service.create_third_party_service(migrate_tenant, ts,
                                                       user.nick_name)
                probes = probe_repo.get_service_probe(ts.service_id)
                # 为组件添加默认探针
                if not probes:
                    if groupapp_copy_service.is_need_to_add_default_probe(ts):
                        code, msg, probe = app_service.add_service_default_porbe(
                            migrate_tenant, ts)
                        logger.debug(
                            "add default probe; code: {}; msg: {}".format(
                                code, msg))
                else:
                    for probe in probes:
                        prob_data = {
                            "service_id": ts.service_id,
                            "scheme": probe.scheme,
                            "path": probe.path,
                            "port": probe.port,
                            "cmd": probe.cmd,
                            "http_header": probe.http_header,
                            "initial_delay_second": probe.initial_delay_second,
                            "period_second": probe.period_second,
                            "timeout_second": probe.timeout_second,
                            "failure_threshold": probe.failure_threshold,
                            "success_threshold": probe.success_threshold,
                            "is_used": (1 if probe.is_used else 0),
                            "probe_id": probe.probe_id,
                            "mode": probe.mode,
                        }
                        try:
                            res, body = region_api.add_service_probe(
                                ts.service_region, migrate_tenant.tenant_name,
                                ts.service_alias, prob_data)
                            if res.get("status") != 200:
                                logger.debug(body)
                                probe.delete()
                        except Exception as e:
                            logger.debug("error", e)
                            probe.delete()
            service_relations = app["service_relation"]
            service_mnts = app["service_mnts"]

            if service_relations:
                service_relations_list[0:0] = list(service_relations)
            if service_mnts:
                service_mnt_list[0:0] = list(service_mnts)
            # 更新状态
            ts.create_status = "complete"
            ts.save()

        # restore plugin info
        self.__save_plugins(migrate_region, migrate_tenant,
                            metadata["plugin_info"]["plugins"])
        self.__save_plugin_config_items(
            metadata["plugin_info"]["plugin_config_items"])
        self.__save_plugin_config_groups(
            metadata["plugin_info"]["plugin_config_groups"])
        versions = self.__save_plugin_build_versions(
            migrate_tenant, metadata["plugin_info"]["plugin_build_versions"])
        for app in apps:
            new_service_id = old_new_service_id_map[app["service_base"]
                                                    ["service_id"]]
            # plugin
            if app.get("service_plugin_relation", None):
                self.__save_plugin_relations(new_service_id,
                                             app["service_plugin_relation"],
                                             versions)
            if app.get("service_plugin_config", None):
                self.__save_service_plugin_config(new_service_id,
                                                  app["service_plugin_config"])
        self.__save_service_relations(migrate_tenant, service_relations_list,
                                      old_new_service_id_map, same_team,
                                      same_region)
        self.__save_service_mnt_relation(migrate_tenant, service_mnt_list,
                                         old_new_service_id_map, same_team,
                                         same_region)
        # restore application config group
        self.__save_app_config_groups(metadata.get("app_config_group_info"),
                                      migrate_tenant, migrate_region, group_id,
                                      changed_service_map)
예제 #7
0
    def get_service_details(self, tenant, service):
        service_base = service.to_dict()
        service_labels = service_label_repo.get_service_labels(
            service.service_id)
        service_domains = domain_repo.get_service_domains(service.service_id)
        http_rule_configs = configuration_repo.list_by_rule_ids(
            [sd.http_rule_id for sd in service_domains])
        service_tcpdomains = tcp_domain.get_service_tcpdomains(
            service.service_id)
        service_probes = probe_repo.get_service_probe(service.service_id)
        service_source = service_source_repo.get_service_source(
            tenant.tenant_id, service.service_id)
        service_auths = auth_repo.get_service_auth(service.service_id)
        service_env_vars = env_var_repo.get_service_env(
            tenant.tenant_id, service.service_id)
        service_compile_env = compile_env_repo.get_service_compile_env(
            service.service_id)
        service_extend_method = extend_repo.get_extend_method_by_service(
            service)
        service_mnts = mnt_repo.get_service_mnts(tenant.tenant_id,
                                                 service.service_id)
        service_volumes = volume_repo.get_service_volumes_with_config_file(
            service.service_id)
        service_config_file = volume_repo.get_service_config_files(
            service.service_id)
        service_ports = port_repo.get_service_ports(tenant.tenant_id,
                                                    service.service_id)
        service_relation = dep_relation_repo.get_service_dependencies(
            tenant.tenant_id, service.service_id)
        service_monitors = service_monitor_repo.get_component_service_monitors(
            tenant.tenant_id, service.service_id)
        component_graphs = component_graph_repo.list(service.service_id)
        # plugin
        service_plugin_relation = app_plugin_relation_repo.get_service_plugin_relation_by_service_id(
            service.service_id)
        service_plugin_config = service_plugin_config_repo.get_service_plugin_all_config(
            service.service_id)
        # third_party_service
        third_party_service_endpoints = service_endpoints_repo.get_service_endpoints_by_service_id(
            service.service_id)
        if service.service_source == "third_party":
            if not third_party_service_endpoints:
                raise ServiceHandleException(
                    msg="third party service endpoints can't be null",
                    msg_show="第三方组件实例不可为空")
        app_info = {
            "component_id":
            service.component_id,
            "service_base":
            service_base,
            "service_labels": [label.to_dict() for label in service_labels],
            "service_domains":
            [domain.to_dict() for domain in service_domains],
            "http_rule_configs":
            [config.to_dict() for config in http_rule_configs],
            "service_tcpdomains":
            [tcpdomain.to_dict() for tcpdomain in service_tcpdomains],
            "service_probes": [probe.to_dict() for probe in service_probes],
            "service_source":
            service_source.to_dict() if service_source else None,
            "service_auths": [auth.to_dict() for auth in service_auths],
            "service_env_vars":
            [env_var.to_dict() for env_var in service_env_vars],
            "service_compile_env":
            service_compile_env.to_dict() if service_compile_env else None,
            "service_extend_method":
            service_extend_method.to_dict() if service_extend_method else None,
            "service_mnts": [mnt.to_dict() for mnt in service_mnts],
            "service_plugin_relation": [
                plugin_relation.to_dict()
                for plugin_relation in service_plugin_relation
            ],
            "service_plugin_config":
            [config.to_dict() for config in service_plugin_config],
            "service_relation":
            [relation.to_dict() for relation in service_relation],
            "service_volumes":
            [volume.to_dict() for volume in service_volumes],
            "service_config_file":
            [config_file.to_dict() for config_file in service_config_file],
            "service_ports": [port.to_dict() for port in service_ports],
            "third_party_service_endpoints":
            [endpoint.to_dict() for endpoint in third_party_service_endpoints],
            "service_monitors":
            [monitor.to_dict() for monitor in service_monitors],
            "component_graphs":
            [graph.to_dict() for graph in component_graphs]
        }
        plugin_ids = [pr.plugin_id for pr in service_plugin_relation]

        return app_info, plugin_ids
예제 #8
0
    def build_services(self, user, tenant, region_name, group_id,
                       change_services_map):
        group_services = base_service.get_group_services_list(
            tenant.tenant_id, region_name, group_id)
        change_service_ids = [
            change_service["ServiceID"]
            for change_service in list(change_services_map.values())
        ]
        if not group_services:
            return []
        service_ids = [
            group_service.get("service_id") for group_service in group_services
        ]
        services = service_repo.get_service_by_service_ids(
            service_ids=service_ids)
        result = []
        for service in services:
            if service.service_id in change_service_ids:
                if service.service_source == "third_party":
                    # 数据中心连接创建第三方组件
                    new_service = app_service.create_third_party_service(
                        tenant, service, user.nick_name)
                else:
                    # 数据中心创建组件
                    new_service = app_service.create_region_service(
                        tenant, service, user.nick_name)

                service = new_service
                # 为组件添加默认探针
                if self.is_need_to_add_default_probe(service):
                    code, msg, probe = app_service.add_service_default_porbe(
                        tenant, service)
                    logger.debug("add default probe; code: {}; msg: {}".format(
                        code, msg))
                else:
                    probes = probe_repo.get_service_probe(service.service_id)
                    if probes:
                        for probe in probes:
                            prob_data = {
                                "service_id": service.service_id,
                                "scheme": probe.scheme,
                                "path": probe.path,
                                "port": probe.port,
                                "cmd": probe.cmd,
                                "http_header": probe.http_header,
                                "initial_delay_second":
                                probe.initial_delay_second,
                                "period_second": probe.period_second,
                                "timeout_second": probe.timeout_second,
                                "failure_threshold": probe.failure_threshold,
                                "success_threshold": probe.success_threshold,
                                "is_used": (1 if probe.is_used else 0),
                                "probe_id": probe.probe_id,
                                "mode": probe.mode,
                            }
                            try:
                                res, body = region_api.add_service_probe(
                                    service.service_region, tenant.tenant_name,
                                    service.service_alias, prob_data)
                                if res.get("status") != 200:
                                    logger.debug(body)
                                    probe.delete()
                            except Exception as e:
                                logger.debug("error", e)
                                probe.delete()
                # 添加组件有无状态标签
                label_service.update_service_state_label(tenant, service)
                # 部署组件
                app_manage_service.deploy(tenant,
                                          service,
                                          user,
                                          group_version=None)

                # 添加组件部署关系
                deploy_repo.create_deploy_relation_by_service_id(
                    service_id=service.service_id)
                result.append(service)
                # 为组件创建插件
                build_error_plugin_ids = []
                service_plugins = app_plugin_relation_repo.get_service_plugin_relation_by_service_id(
                    service.service_id)
                for service_plugin in service_plugins:
                    plugin = plugin_repo.get_by_plugin_id(
                        tenant.tenant_id, service_plugin.plugin_id)
                    plugin_version = plugin_repo.get_plugin_buildversion(
                        service_plugin.plugin_id, service_plugin.build_version)
                    # 在数据中心创建插件
                    try:
                        event_id = make_uuid()
                        plugin_version.event_id = event_id
                        image_tag = (plugin_version.image_tag
                                     if plugin_version.image_tag else "latest")
                        plugin_service.create_region_plugin(
                            region_name, tenant, plugin, image_tag=image_tag)
                        ret = plugin_service.build_plugin(
                            region_name, plugin, plugin_version, user, tenant,
                            event_id)
                        plugin_version.build_status = ret.get('bean').get(
                            'status')
                        plugin_version.save()
                    except Exception as e:
                        logger.debug(e)
                    # 为组件开通插件
                    try:
                        region_config = app_plugin_service.get_region_config_from_db(
                            service, service_plugin.plugin_id,
                            service_plugin.build_version)
                        data = dict()
                        data["plugin_id"] = service_plugin.plugin_id
                        data["switch"] = True
                        data["version_id"] = service_plugin.build_version
                        data.update(region_config)
                        region_api.install_service_plugin(
                            region_name, tenant.tenant_name,
                            service.service_alias, data)
                    except region_api.CallApiError as e:
                        logger.debug(e)
                        build_error_plugin_ids.append(service_plugin.plugin_id)
                if build_error_plugin_ids:
                    app_plugin_relation_repo.get_service_plugin_relation_by_service_id(
                        service.service_id).filter(
                            plugin_id__in=build_error_plugin_ids).delete()
                # create service_monitor in region
                service_monitors = service_monitor_repo.get_component_service_monitors(
                    tenant.tenant_id, service.service_id)
                for monitor in service_monitors:
                    req = {
                        "name": monitor.name,
                        "path": monitor.path,
                        "port": monitor.port,
                        "service_show_name": monitor.service_show_name,
                        "interval": monitor.interval
                    }
                    try:
                        region_api.create_service_monitor(
                            tenant.enterprise_id, service.service_region,
                            tenant.tenant_name, service.service_alias, req)
                    except region_api.CallApiError as e:
                        ServiceMonitor.objects.filter(
                            tenant_id=tenant.tenant_id,
                            service_id=service.service_id,
                            name=monitor.name).delete()
                        logger.debug(e)
        return result