def check_the_same_plugin(self, plugin_id, tenant_id, service_id): plugin_ids = [] categories = [] service_plugins = app_plugin_relation_repo.get_service_plugin_relation_by_service_id( service_id) if not service_plugins: """ component has not installed plugin""" return """ filter the same category plugin""" for i in service_plugins: plugin_ids.append(i.plugin_id) plugins = plugin_repo.get_plugin_by_plugin_ids(plugin_ids) for i in plugins: categories.append(i.category) # the trend to install plugin plugin_info = plugin_repo.get_plugin_by_plugin_id(tenant_id, plugin_id) category_info = plugin_info.category.split(":") if category_info[0] == "net-plugin": if plugin_info.category in categories: raise has_the_same_category_plugin if category_info[1] == "in-and-out" and ( "net-plugin:up" in categories or "net-plugin:down" in categories): raise has_the_same_category_plugin
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 check_the_same_plugin(self, plugin_id, tenant_id, service_id): print plugin_id, tenant_id, service_id plugin_list = [] categories = [] flag = False service_plugins = app_plugin_relation_repo.get_service_plugin_relation_by_service_id( service_id) plugin_info = plugin_repo.get_plugin_by_plugin_id(tenant_id, plugin_id) print service_plugins if len(service_plugins) != 0: for i in service_plugins: plugin_list.append(i.plugin_id) plugins = plugin_repo.get_plugin_by_plugin_ids(plugin_list) for i in plugins: categories.append(i.category) print plugin_info.category if plugin_info.category.split( ":")[0] == "net-plugin" and plugin_info.category in categories: flag = True if plugin_info.category == "net-plugin:in-and-out" and ( "net-plugin:up" in categories or "net-plugin:down" in categories): flag = True return flag
def get_service_abled_plugin(self, service): plugins = app_plugin_relation_repo.get_service_plugin_relation_by_service_id( service.service_id).filter(plugin_status=True) plugin_ids = [p.plugin_id for p in plugins] base_plugins = plugin_repo.get_plugin_by_plugin_ids(plugin_ids) return base_plugins
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
def __is_service_has_plugins(self, service): service_plugin_relations = app_plugin_relation_repo.get_service_plugin_relation_by_service_id( service.service_id) if service_plugin_relations: return True return False
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
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.list_by_component_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 # 部署组件 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["plugin_cpu"] = service_plugin.min_cpu data["plugin_memory"] = service_plugin.min_memory 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() return result