def add_service_dependency(self, tenant, service, dep_service_id, open_inner=None, container_port=None, user_name=''): dep_service_relation = dep_relation_repo.get_depency_by_serivce_id_and_dep_service_id( tenant.tenant_id, service.service_id, dep_service_id) if dep_service_relation: return 212, "当前组件已被关联", None dep_service = service_repo.get_service_by_tenant_and_id( tenant.tenant_id, dep_service_id) # 开启对内端口 if open_inner: self.__open_port(tenant, dep_service, container_port, user_name) else: # 校验要依赖的组件是否开启了对内端口 open_inner_services = port_repo.get_service_ports( tenant.tenant_id, dep_service.service_id).filter(is_inner_service=True) if not open_inner_services: service_ports = port_repo.get_service_ports( tenant.tenant_id, dep_service.service_id) port_list = [ service_port.container_port for service_port in service_ports ] return 201, "要关联的组件暂未开启对内端口,是否打开", port_list is_duplicate = self.__is_env_duplicate(tenant, service, dep_service) if is_duplicate: return 412, "要关联的组件的变量与已关联的组件变量重复,请修改后再试", None if service.create_status == "complete": task = dict() task["dep_service_id"] = dep_service_id task["tenant_id"] = tenant.tenant_id task["dep_service_type"] = dep_service.service_type task["enterprise_id"] = tenant.enterprise_id task["operator"] = user_name region_api.add_service_dependency(service.service_region, tenant.tenant_name, service.service_alias, task) tenant_service_relation = { "tenant_id": tenant.tenant_id, "service_id": service.service_id, "dep_service_id": dep_service_id, "dep_service_type": dep_service.service_type, "dep_order": 0, } dep_relation = dep_relation_repo.add_service_dependency( **tenant_service_relation) # component dependency change, will change export network governance plugin configuration if service.create_status == "complete": from console.services.plugin import app_plugin_service app_plugin_service.update_config_if_have_export_plugin( tenant, service) return 200, "success", dep_relation
def add_service_dependency(self, tenant, service, dep_service_id, open_inner=None, container_port=None): dep_service_relation = dep_relation_repo.get_depency_by_serivce_id_and_dep_service_id( tenant.tenant_id, service.service_id, dep_service_id) if dep_service_relation: return 212, u"当前应用已被关联", None dep_service = service_repo.get_service_by_tenant_and_id( tenant.tenant_id, dep_service_id) # 开启对内端口 if open_inner: tenant_service_port = port_service.get_service_port_by_port( dep_service, int(container_port)) code, msg, data = port_service.manage_port( tenant, dep_service, dep_service.service_region, int(tenant_service_port.container_port), "open_inner", tenant_service_port.protocol, tenant_service_port.port_alias) if code != 200: return 412, u"开启对内端口失败", None # 校验要依赖的服务是否开启了对内端口 open_inner_services = port_repo.get_service_ports( tenant.tenant_id, dep_service.service_id).filter(is_inner_service=True) if not open_inner_services: service_ports = port_repo.get_service_ports( tenant.tenant_id, dep_service.service_id) port_list = [ service_port.container_port for service_port in service_ports ] return 201, u"要关联的服务暂未开启对内端口,是否打开", port_list is_duplicate = self.__is_env_duplicate(tenant, service, dep_service) if is_duplicate: return 412, u"要关联的应用的变量与已关联的应用变量重复,请修改后再试", None if service.create_status == "complete": task = dict() task["dep_service_id"] = dep_service_id task["tenant_id"] = tenant.tenant_id task["dep_service_type"] = dep_service.service_type task["enterprise_id"] = tenant.enterprise_id region_api.add_service_dependency(service.service_region, tenant.tenant_name, service.service_alias, task) tenant_service_relation = { "tenant_id": tenant.tenant_id, "service_id": service.service_id, "dep_service_id": dep_service_id, "dep_service_type": dep_service.service_type, "dep_order": 0, } dep_relation = dep_relation_repo.add_service_dependency( **tenant_service_relation) return 200, u"success", dep_relation
def port_changes(self, new_ports): """port can only be created, cannot be updated and deleted""" old_ports = port_repo.get_service_ports(self.service.tenant_id, self.service.service_id) old_container_ports = {port.container_port: port for port in old_ports} create_ports = [ port for port in new_ports if port["container_port"] not in old_container_ports ] update_ports = [] for new_port in new_ports: if new_port["container_port"] not in old_container_ports: continue old_port = old_container_ports[new_port["container_port"]] if new_port["is_outer_service"] and not old_port.is_outer_service: update_ports.append(new_port) continue if new_port["is_inner_service"] and not old_port.is_inner_service: update_ports.append(new_port) continue if not create_ports and not update_ports: return None result = {} if create_ports: result["add"] = create_ports if update_ports: result["upd"] = update_ports logger.debug("ports: {}".format(json.dumps(result))) return result
def _create_components(self, app_id, upgrade_group_id): components = group_service.list_components_by_upgrade_group_id(app_id, upgrade_group_id) component_ids = [cpt.component_id for cpt in components] http_rules = self._list_http_rules(component_ids) tcp_rules = self._list_tcp_rules(component_ids) result = [] # TODO(huangrh): get the attributes at once, don't get it iteratively for cpt in components: component_source = service_source_repo.get_service_source(cpt.tenant_id, cpt.service_id) envs = env_var_repo.get_service_env(cpt.tenant_id, cpt.service_id) ports = port_repo.get_service_ports(cpt.tenant_id, cpt.service_id) volumes = volume_repo.get_service_volumes_with_config_file(cpt.service_id) config_files = volume_repo.get_service_config_files(cpt.service_id) probes = probe_repo.list_probes(cpt.service_id) monitors = service_monitor_repo.list_by_service_ids(cpt.tenant_id, [cpt.service_id]) graphs = component_graph_repo.list(cpt.service_id) component = Component( cpt, component_source, envs, ports, volumes, config_files, probes, None, monitors, graphs, [], http_rules=http_rules.get(cpt.component_id), tcp_rules=tcp_rules.get(cpt.component_id), support_labels=self.support_labels) result.append(component) return result
def get_access_info(self, tenant, service): access_type = "" data = {} service_ports = port_repo.get_service_ports(tenant.tenant_id, service.service_id) # ①是否有端口 if not service_ports: access_type = ServicePortConstants.NO_PORT return access_type, data # 对内和对外都没打开的端口 unopened_port = [] # http 对外打开的端口 http_outer_port = [] # http 对内打开的端口 http_inner_port = [] # stream 对外打开的端口 stream_outer_port = [] # stream 对内打开的端口 stream_inner_port = [] for port in service_ports: if port.protocol == ServicePortConstants.HTTP: if port.is_outer_service: http_outer_port.append(port) if port.is_inner_service: http_inner_port.append(port) else: if port.is_outer_service: stream_outer_port.append(port) if port.is_inner_service: stream_inner_port.append(port) if not port.is_outer_service and (not port.is_inner_service): unopened_port.append(port) access_type, data = self.__handle_port_info(tenant, service, unopened_port, http_outer_port, http_inner_port, stream_outer_port, stream_inner_port) return access_type, data
def create_third_party_service(self, tenant, service, user_name): data = self.__init_third_party_data(tenant, service, user_name) # 端口 ports = port_repo.get_service_ports(tenant.tenant_id, service.service_id) ports_info = ports.values( 'container_port', 'mapping_port', 'protocol', 'port_alias', 'is_inner_service', 'is_outer_service') for port_info in ports_info: port_info["is_inner_service"] = False port_info["is_outer_service"] = False if ports_info: data["ports_info"] = list(ports_info) # endpoints endpoints = service_endpoints_repo.get_service_endpoints_by_service_id(service.service_id) endpoints_dict = dict() if endpoints: if endpoints.endpoints_type != "api": endpoints_dict[endpoints.endpoints_type] = endpoints.endpoints_info data["endpoints"] = endpoints_dict data["kind"] = service.service_source # 数据中心创建 logger.debug('-----------data-----------_>{0}'.format(data)) region_api.create_service(service.service_region, tenant.tenant_name, data) # 将服务创建状态变更为创建完成 service.create_status = "complete" self.__handle_service_ports(tenant, service, ports) service.save() return service
def test_restore_ports(): from console.services.app_actions.app_restore import AppRestore tn = Tenants() tn.tenant_id = "c1a29fe4d7b0413993dc859430cf743d" svc = TenantServiceInfo() svc.service_id = "5a9209f3a3e94695b23fbd8b16a07d2b" backup_data = { "service_ports": [{ "lb_mapping_port": 0, "protocol": "http", "mapping_port": 80, "tenant_id": "c1a29fe4d7b0413993dc859430cf743d", "port_alias": "GR063B3980", "container_port": 80, "is_outer_service": False, "is_inner_service": False, "service_id": "5a9209f3a3e94695b23fbd8b16a07d2b", "ID": 513 }], } service_ports = backup_data["service_ports"] raw_ports = [port["port_alias"] for port in service_ports] app_restore = AppRestore(tn, svc) app_restore.ports(service_ports) ports = port_repo.get_service_ports(tn.tenant_id, svc.service_id) for port in ports: assert port.port_alias in raw_ports
def is_open_outer_steam_port(self, tenant_id, service_id, current_port): """判断是否有对外打开的非http协议端口""" ports = port_repo.get_service_ports(tenant_id, service_id).filter(is_outer_service=True).exclude( protocol="http").exclude(container_port=current_port) if ports: return True return False
def get_team_region_usable_tcp_ports(self, tenant, service): services = service_repo.get_service_by_region_and_tenant(service.service_region, tenant.tenant_id) current_service_tcp_ports = port_repo.get_service_ports( tenant.tenant_id, service.service_id).filter(is_outer_service=True).exclude(protocol__in=("http", "https")) lb_mapping_ports = [p.lb_mapping_port for p in current_service_tcp_ports] service_ids = [s.service_id for s in services] res = port_repo.get_tcp_outer_opend_ports(service_ids).exclude(lb_mapping_port__in=lb_mapping_ports) return res
def create_region_service(self, tenant, service, user_name, do_deploy=True, dep_sids=None): data = self.__init_create_data(tenant, service, user_name, do_deploy, dep_sids) service_dep_relations = dep_relation_repo.get_service_dependencies(tenant.tenant_id, service.service_id) # 依赖 depend_ids = [{ "dep_order": dep.dep_order, "dep_service_type": dep.dep_service_type, "depend_service_id": dep.dep_service_id, "service_id": dep.service_id, "tenant_id": dep.tenant_id } for dep in service_dep_relations] data["depend_ids"] = depend_ids # 端口 ports = port_repo.get_service_ports(tenant.tenant_id, service.service_id) ports_info = ports.values('container_port', 'mapping_port', 'protocol', 'port_alias', 'is_inner_service', 'is_outer_service') for port_info in ports_info: port_info["is_inner_service"] = False port_info["is_outer_service"] = False if ports_info: data["ports_info"] = list(ports_info) # 环境变量 envs_info = env_var_repo.get_service_env(tenant.tenant_id, service.service_id).values( 'container_port', 'name', 'attr_name', 'attr_value', 'is_change', 'scope') if envs_info: data["envs_info"] = list(envs_info) # 持久化目录 volume_info = volume_repo.get_service_volumes(service.service_id).values( 'ID', 'service_id', 'category', 'volume_name', 'volume_path', 'volume_type') if volume_info: logger.debug('--------volume_info----->{0}'.format(volume_info)) for volume in volume_info: volume_id = volume['ID'] config_file = volume_repo.get_service_config_file(volume_id) if config_file: volume.update({"file_content": config_file.file_content}) logger.debug('--------volume_info22222----->{0}'.format(volume_info)) data["volumes_info"] = list(volume_info) logger.debug(tenant.tenant_name + " start create_service:" + datetime.datetime.now().strftime('%Y%m%d%H%M%S')) # 挂载信息 mnt_info = mnt_repo.get_service_mnts(service.tenant_id, service.service_id) if mnt_info: data["dep_volumes_info"] = [{ "dep_service_id": mnt.dep_service_id, "volume_path": mnt.mnt_dir, "volume_name": mnt.mnt_name } for mnt in mnt_info] # 数据中心创建 region_api.create_service(service.service_region, tenant.tenant_name, data) # 将服务创建状态变更为创建完成 service.create_status = "complete" self.__handle_service_ports(tenant, service, ports) service.save() return service
def is_open_outer_steam_port(self, tenant_id, service_id, current_port): """判断是否有对外打开的非http协议端口""" ports = port_repo.get_service_ports( tenant_id, service_id).filter(is_outer_service=True).exclude( protocol="http").exclude(container_port=current_port) # 如果为公有云且已经开放端口 if ports and settings.MODULES.get('SSO_LOGIN'): return True return False
def port_changes(self, new_ports): """port can only be created, cannot be updated and deleted""" old_ports = port_repo.get_service_ports(self.service.tenant_id, self.service.service_id) old_container_ports = [port.container_port for port in old_ports] create_ports = [port for port in new_ports if port["container_port"] not in old_container_ports] if not create_ports: return None return { "add": create_ports }
def create_third_party_service(self, tenant, service, user_name): data = self.__init_third_party_data(tenant, service, user_name) # env var envs_info = env_var_repo.get_service_env(tenant.tenant_id, service.service_id).values( 'container_port', 'name', 'attr_name', 'attr_value', 'is_change', 'scope') if envs_info: data["envs_info"] = list(envs_info) # 端口 ports = port_repo.get_service_ports(tenant.tenant_id, service.service_id) ports_info = ports.values('container_port', 'mapping_port', 'protocol', 'port_alias', 'is_inner_service', 'is_outer_service', 'k8s_service_name') for port_info in ports_info: port_info["is_inner_service"] = False port_info["is_outer_service"] = False if ports_info: data["ports_info"] = list(ports_info) # endpoints endpoints = service_endpoints_repo.get_service_endpoints_by_service_id( service.service_id).first() if endpoints: if endpoints.endpoints_type == "static": eps = json.loads(endpoints.endpoints_info) validate_endpoints_info(eps) endpoints_dict = dict() endpoints_dict[endpoints.endpoints_type] = endpoints.endpoints_info data["endpoints"] = endpoints_dict data["kind"] = service.service_source # etcd keys data["etcd_key"] = service.check_uuid # 数据中心创建 logger.debug('-----------data-----------_>{0}'.format(data)) app_id = service_group_relation_repo.get_group_id_by_service(service) region_app_id = region_app_repo.get_region_app_id( service.service_region, app_id) data["app_id"] = region_app_id region_api.create_service(service.service_region, tenant.tenant_name, data) # 将组件创建状态变更为创建完成 service.create_status = "complete" self.__handle_service_ports(tenant, service, ports) service.save() return service
def get_undependencies(self, tenant, service): # 打开对内端口才能被依赖 services = service_repo.get_tenant_region_services(service.service_region, tenant.tenant_id).exclude(service_id=service.service_id) not_dependencies = [] dep_services = dep_relation_repo.get_service_dependencies(tenant.tenant_id, service.service_id) dep_service_ids = [dep.dep_service_id for dep in dep_services] for s in services: # 查找打开内部访问的组件 open_inner_services = port_repo.get_service_ports(tenant.tenant_id, s.service_id).filter(is_inner_service=True) if open_inner_services: if s.service_id not in dep_service_ids: not_dependencies.append(s) return not_dependencies
def create_third_party_service(self, tenant, service, user_name): data = self.__init_third_party_data(tenant, service, user_name) # 端口 ports = port_repo.get_service_ports(tenant.tenant_id, service.service_id) ports_info = ports.values('container_port', 'mapping_port', 'protocol', 'port_alias', 'is_inner_service', 'is_outer_service') for port_info in ports_info: port_info["is_inner_service"] = False port_info["is_outer_service"] = False if ports_info: data["ports_info"] = list(ports_info) # endpoints endpoints = service_endpoints_repo.get_service_endpoints_by_service_id( service.service_id) if endpoints.endpoints_type == "static": eps = json.loads(endpoints.endpoints_info) for address in eps: if "https://" in address: address = address.partition("https://")[2] if "http://" in address: address = address.partition("http://")[2] if ":" in address: address = address.rpartition(":")[0] errs = validate_endpoint_address(address) if errs: if len(eps) > 1: raise ErrDoNotSupportMultiDomain( "do not support multi domain address") endpoints_dict = dict() if endpoints: endpoints_dict[endpoints.endpoints_type] = endpoints.endpoints_info data["endpoints"] = endpoints_dict data["kind"] = service.service_source # 数据中心创建 logger.debug('-----------data-----------_>{0}'.format(data)) region_api.create_service(service.service_region, tenant.tenant_name, data) # 将组件创建状态变更为创建完成 service.create_status = "complete" self.__handle_service_ports(tenant, service, ports) service.save() return service
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 create_region_service(self, tenant, service, user_name, do_deploy=True, dep_sids=None): data = self.__init_create_data(tenant, service, user_name, do_deploy, dep_sids) service_dep_relations = dep_relation_repo.get_service_dependencies( tenant.tenant_id, service.service_id) # 依赖 depend_ids = [{ "dep_order": dep.dep_order, "dep_service_type": dep.dep_service_type, "depend_service_id": dep.dep_service_id, "service_id": dep.service_id, "tenant_id": dep.tenant_id } for dep in service_dep_relations] data["depend_ids"] = depend_ids # 端口 ports = port_repo.get_service_ports(tenant.tenant_id, service.service_id) ports_info = ports.values('container_port', 'mapping_port', 'protocol', 'port_alias', 'is_inner_service', 'is_outer_service', 'k8s_service_name') for port_info in ports_info: port_info["is_inner_service"] = False port_info["is_outer_service"] = False if ports_info: data["ports_info"] = list(ports_info) # 环境变量 envs_info = env_var_repo.get_service_env(tenant.tenant_id, service.service_id).values( 'container_port', 'name', 'attr_name', 'attr_value', 'is_change', 'scope') if envs_info: data["envs_info"] = list(envs_info) # 持久化目录 volume_info = volume_repo.get_service_volumes_with_config_file( service.service_id) if volume_info: volume_list = [] for volume in volume_info: volume_info = model_to_dict(volume) if volume.volume_type == "config-file": config_file = volume_repo.get_service_config_file( volume.ID) if config_file: volume_info.update( {"file_content": config_file.file_content}) volume_list.append(volume_info) data["volumes_info"] = volume_list logger.debug(tenant.tenant_name + " start create_service:" + datetime.datetime.now().strftime('%Y%m%d%H%M%S')) # 挂载信息 mnt_info = mnt_repo.get_service_mnts(service.tenant_id, service.service_id) if mnt_info: data["dep_volumes_info"] = [{ "dep_service_id": mnt.dep_service_id, "volume_path": mnt.mnt_dir, "volume_name": mnt.mnt_name } for mnt in mnt_info] # etcd keys data["etcd_key"] = service.check_uuid # runtime os name data["os_type"] = label_service.get_service_os_name(service) # 数据中心创建 app_id = service_group_relation_repo.get_group_id_by_service(service) region_app_id = region_app_repo.get_region_app_id( service.service_region, app_id) data["app_id"] = region_app_id region_api.create_service(service.service_region, tenant.tenant_name, data) # 将组件创建状态变更为创建完成 service.create_status = "complete" self.__handle_service_ports(tenant, service, ports) service.save() return service
def put(self, request, *args, **kwargs): """ 应用拓扑图打开(关闭)对外端口 :param request: :param args: :param kwargs: :return: """ try: open_outer = request.data.get("open_outer", False) close_outer = request.data.get("close_outer", False) container_port = request.data.get("container_port", None) # 开启对外端口 if open_outer: tenant_service_port = port_service.get_service_port_by_port( self.service, int(container_port)) code, msg, data = port_service.manage_port( self.tenant, self.service, self.response_region, int(container_port), "open_outer", tenant_service_port.protocol, tenant_service_port.port_alias) if code != 200: return Response(general_message(412, "open outer fail", u"打开对外端口失败"), status=412) return Response(general_message(200, "open outer success", u"开启成功"), status=200) # 关闭改服务所有对外端口 if close_outer: tenant_service_ports = port_service.get_service_ports( self.service) for tenant_service_port in tenant_service_ports: code, msg, data = port_service.manage_port( self.tenant, self.service, self.response_region, tenant_service_port.container_port, "close_outer", tenant_service_port.protocol, tenant_service_port.port_alias) if code != 200: return Response(general_message( 412, "open outer fail", u"关闭对外端口失败"), status=412) return Response(general_message(200, "close outer success", u"关闭对外端口成功"), status=200) # 校验要依赖的服务是否开启了对外端口 open_outer_services = port_repo.get_service_ports( self.tenant.tenant_id, self.service.service_id).filter(is_outer_service=True) if not open_outer_services: service_ports = port_repo.get_service_ports( self.tenant.tenant_id, self.service.service_id) port_list = [ service_port.container_port for service_port in service_ports ] return Response(general_message( 201, "the service does not open an external port", u"该服务未开启对外端口", list=port_list), status=201) else: return Response(general_message( 202, "the service has an external port open", u"该服务已开启对外端口"), status=200) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=result["code"])
def create_third_party_app(self, region, tenant, user, service_cname, endpoints, endpoints_type): service_cname = service_cname.rstrip().lstrip() is_pass, msg = self.check_service_cname(tenant, service_cname, region) if not is_pass: return 412, msg, None # 初始化 new_service = self.__init_third_party_app(region, endpoints) new_service.tenant_id = tenant.tenant_id new_service.service_cname = service_cname service_id = make_uuid(tenant.tenant_id) service_alias = "gr" + service_id[-6:] new_service.service_id = service_id new_service.service_alias = service_alias new_service.creater = user.pk new_service.server_type = '' new_service.protocol = 'tcp' new_service.save() if endpoints_type == "static": # 如果只有一个端口,就设定为默认端口,没有或有多个端口,不设置默认端口 if endpoints: port_list = [] for endpoint in endpoints: if ':' in endpoint: port_list.append(endpoint.split(':')[1]) port_re = list(set(port_list)) if len(port_re) == 1: port = int(port_re[0]) if port: port_alias = new_service.service_alias.upper().replace("-", "_") + str(port) service_port = {"tenant_id": tenant.tenant_id, "service_id": new_service.service_id, "container_port": port, "mapping_port": port, "protocol": 'tcp', "port_alias": port_alias, "is_inner_service": False, "is_outer_service": False} service_port = port_repo.add_service_port(**service_port) # 添加默认端口后需要默认设置健康检测 if service_port: tenant_service_ports = port_repo.get_service_ports(tenant.tenant_id, new_service.service_id) port_list = [] for tenant_service_port in tenant_service_ports: port_list.append(tenant_service_port.container_port) if len(port_list) <= 1: probe = probe_repo.get_probe(new_service.service_id) if not probe: params = { "http_header": "", "initial_delay_second": 2, "is_used": True, "mode": "ignore", "path": "", "period_second": 3, "port": int(service_port.container_port), "scheme": "tcp", "success_threshold": 1, "timeout_second": 20 } code, msg, probe = probe_service.add_service_probe(tenant, new_service, params) if code != 200: logger.debug('------111----->{0}'.format(msg)) # 保存endpoints数据 service_endpoints = {"tenant_id": tenant.tenant_id, "service_id": new_service.service_id, "service_cname": new_service.service_cname, "endpoints_info": json.dumps(endpoints), "endpoints_type": endpoints_type} logger.debug('------service_endpoints------------->{0}'.format(service_endpoints)) service_endpoints_repo.add_service_endpoints(service_endpoints) ts = TenantServiceInfo.objects.get(service_id=new_service.service_id, tenant_id=new_service.tenant_id) return 200, u"创建成功", ts
def put(self, request, *args, **kwargs): """ 组件拓扑图打开(关闭)对外端口 :param request: :param args: :param kwargs: :return: """ open_outer = request.data.get("open_outer", False) close_outer = request.data.get("close_outer", False) container_port = request.data.get("container_port", None) # 开启对外端口 if open_outer: tenant_service_port = port_service.get_service_port_by_port( self.service, int(container_port)) if self.service.service_source == "third_party": msg, msg_show, code = port_service.check_domain_thirdpart( self.tenant, self.service) if code != 200: logger.exception(msg, msg_show) return Response(general_message(code, msg, msg_show), status=code) code, msg, data = port_service.manage_port( self.tenant, self.service, self.response_region, int(container_port), "open_outer", tenant_service_port.protocol, tenant_service_port.port_alias) if code != 200: return Response(general_message(412, "open outer fail", "打开对外端口失败"), status=412) return Response(general_message(200, "open outer success", "开启成功"), status=200) # 关闭该组件所有对外端口 if close_outer: tenant_service_ports = port_service.get_service_ports(self.service) for tenant_service_port in tenant_service_ports: code, msg, data = port_service.manage_port( self.tenant, self.service, self.response_region, tenant_service_port.container_port, "close_outer", tenant_service_port.protocol, tenant_service_port.port_alias) if code != 200: return Response(general_message(412, "open outer fail", "关闭对外端口失败"), status=412) return Response(general_message(200, "close outer success", "关闭对外端口成功"), status=200) # 校验要依赖的组件是否开启了对外端口 open_outer_services = port_repo.get_service_ports( self.tenant.tenant_id, self.service.service_id).filter(is_outer_service=True) if not open_outer_services: if self.service.service_source == "third_party": msg, msg_show, code = port_service.check_domain_thirdpart( self.tenant, self.service) if code != 200: logger.exception(msg, msg_show) return Response(general_message(code, msg, msg_show), status=code) service_ports = port_repo.get_service_ports( self.tenant.tenant_id, self.service.service_id) port_list = [ service_port.container_port for service_port in service_ports ] if len(port_list) == 1: # 一个端口直接开启 tenant_service_port = port_service.get_service_port_by_port( self.service, int(port_list[0])) code, msg, data = port_service.manage_port( self.tenant, self.service, self.response_region, int(port_list[0]), "open_outer", tenant_service_port.protocol, tenant_service_port.port_alias) if code != 200: return Response(general_message(412, "open outer fail", "打开对外端口失败"), status=412) return Response(general_message(200, "open outer success", "开启成功"), status=200) else: # 多个端口需要用户选择后开启 return Response(general_message( 201, "the service does not open an external port", "该组件未开启对外端口", list=port_list), status=201) else: return Response(general_message( 202, "the service has an external port open", "该组件已开启对外端口"), status=200)
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 get_service_ports(self, service): if service: return port_repo.get_service_ports(service.tenant_id, service.service_id)
def get_service_plugin_config(self, tenant, service, plugin_id, build_version): config_groups = plugin_config_service.get_config_group( plugin_id, build_version) service_plugin_vars = service_plugin_config_repo.get_service_plugin_config_var( service.service_id, plugin_id, build_version) result_bean = dict() undefine_env = dict() upstream_env_list = [] downstream_env_list = [] for config_group in config_groups: items = plugin_config_service.get_config_items( plugin_id, build_version, config_group.service_meta_type) if config_group.service_meta_type == PluginMetaType.UNDEFINE: options = [] normal_envs = service_plugin_vars.filter( service_meta_type=PluginMetaType.UNDEFINE) undefine_options = None if normal_envs: normal_env = normal_envs[0] undefine_options = json.loads(normal_env.attrs) for item in items: item_option = { "attr_info": item.attr_info, "attr_name": item.attr_name, "attr_value": item.attr_default_value, "attr_alt_value": item.attr_alt_value, "attr_type": item.attr_type, "attr_default_value": item.attr_default_value, "is_change": item.is_change } if undefine_options: item_option["attr_value"] = undefine_options.get( item.attr_name, item.attr_default_value) options.append(item_option) undefine_env.update({ "service_id": service.service_id, "service_meta_type": config_group.service_meta_type, "injection": config_group.injection, "service_alias": service.service_alias, "config": copy.deepcopy(options), "config_group_name": config_group.config_name, }) if config_group.service_meta_type == PluginMetaType.UPSTREAM_PORT: ports = port_repo.get_service_ports(service.tenant_id, service.service_id) for port in ports: upstream_envs = service_plugin_vars.filter( service_meta_type=PluginMetaType.UPSTREAM_PORT, container_port=port.container_port) upstream_options = None if upstream_envs: upstream_env = upstream_envs[0] upstream_options = json.loads(upstream_env.attrs) options = [] for item in items: item_option = { "attr_info": item.attr_info, "attr_name": item.attr_name, "attr_value": item.attr_default_value, "attr_alt_value": item.attr_alt_value, "attr_type": item.attr_type, "attr_default_value": item.attr_default_value, "is_change": item.is_change } if upstream_options: item_option["attr_value"] = upstream_options.get( item.attr_name, item.attr_default_value) if item.protocol == "" or ( port.protocol in item.protocol.split(",")): options.append(item_option) upstream_env_list.append({ "config_group_name": config_group.config_name, "service_id": service.service_id, "service_meta_type": config_group.service_meta_type, "injection": config_group.injection, "service_alias": service.service_alias, "protocol": port.protocol, "port": port.container_port, "config": copy.deepcopy(options) }) if config_group.service_meta_type == PluginMetaType.DOWNSTREAM_PORT: dep_services = dependency_service.get_service_dependencies( tenant, service) for dep_service in dep_services: ports = port_repo.list_inner_ports(dep_service.tenant_id, dep_service.service_id) for port in ports: downstream_envs = service_plugin_vars.filter( service_meta_type=PluginMetaType.DOWNSTREAM_PORT, dest_service_id=dep_service.service_id, container_port=port.container_port) downstream_options = None if downstream_envs: downstream_env = downstream_envs[0] downstream_options = json.loads( downstream_env.attrs) options = [] for item in items: item_option = { "attr_info": item.attr_info, "attr_name": item.attr_name, "attr_value": item.attr_default_value, "attr_alt_value": item.attr_alt_value, "attr_type": item.attr_type, "attr_default_value": item.attr_default_value, "is_change": item.is_change } if downstream_options: item_option[ "attr_value"] = downstream_options.get( item.attr_name, item.attr_default_value) if item.protocol == "" or ( port.protocol in item.protocol.split(",")): options.append(item_option) downstream_env_list.append({ "config_group_name": config_group.config_name, "service_id": service.service_id, "service_meta_type": config_group.service_meta_type, "injection": config_group.injection, "service_alias": service.service_alias, "protocol": port.protocol, "port": port.container_port, "config": copy.deepcopy(options), "dest_service_id": dep_service.service_id, "dest_service_cname": dep_service.service_cname, "dest_service_alias": dep_service.service_alias }) result_bean["undefine_env"] = undefine_env result_bean["upstream_env"] = upstream_env_list result_bean["downstream_env"] = downstream_env_list return result_bean
def save_default_plugin_config(self, tenant, service, plugin_id, build_version): """console层保存默认的数据""" config_groups = plugin_config_service.get_config_group( plugin_id, build_version) service_plugin_var = [] for config_group in config_groups: items = plugin_config_service.get_config_items( plugin_id, build_version, config_group.service_meta_type) if config_group.service_meta_type == PluginMetaType.UNDEFINE: attrs_map = { item.attr_name: item.attr_default_value for item in items } service_plugin_var.append( ServicePluginConfigVar( service_id=service.service_id, plugin_id=plugin_id, build_version=build_version, service_meta_type=config_group.service_meta_type, injection=config_group.injection, dest_service_id="", dest_service_alias="", container_port=0, attrs=json.dumps(attrs_map), protocol="")) if config_group.service_meta_type == PluginMetaType.UPSTREAM_PORT: ports = port_repo.get_service_ports(service.tenant_id, service.service_id) if not self.__check_ports_for_config_items(ports, items): return 409, "插件支持的协议与组件端口协议不一致" for port in ports: attrs_map = dict() for item in items: if item.protocol == "" or ( port.protocol in item.protocol.split(",")): attrs_map[item.attr_name] = item.attr_default_value service_plugin_var.append( ServicePluginConfigVar( service_id=service.service_id, plugin_id=plugin_id, build_version=build_version, service_meta_type=config_group.service_meta_type, injection=config_group.injection, dest_service_id="", dest_service_alias="", container_port=port.container_port, attrs=json.dumps(attrs_map), protocol=port.protocol)) if config_group.service_meta_type == PluginMetaType.DOWNSTREAM_PORT: dep_services = dependency_service.get_service_dependencies( tenant, service) if not dep_services: return 409, "组件没有依赖其他组件,不能安装此插件" for dep_service in dep_services: ports = port_repo.get_service_ports( dep_service.tenant_id, dep_service.service_id) if not self.__check_ports_for_config_items(ports, items): return 409, "该组件依赖的组件的端口协议与插件支持的协议不一致" for port in ports: attrs_map = dict() for item in items: if item.protocol == "" or ( port.protocol in item.protocol.split(",")): attrs_map[ item.attr_name] = item.attr_default_value service_plugin_var.append( ServicePluginConfigVar( service_id=service.service_id, plugin_id=plugin_id, build_version=build_version, service_meta_type=config_group. service_meta_type, injection=config_group.injection, dest_service_id=dep_service.service_id, dest_service_alias=dep_service.service_alias, container_port=port.container_port, attrs=json.dumps(attrs_map), protocol=port.protocol)) # 保存数据 ServicePluginConfigVar.objects.bulk_create(service_plugin_var) return 200, "success"
def add_service_dependency(self, tenant, service, dep_service_id, open_inner=None, container_port=None): dep_service_relation = dep_relation_repo.get_depency_by_serivce_id_and_dep_service_id( tenant.tenant_id, service.service_id, dep_service_id) if dep_service_relation: return 212, u"当前组件已被关联", None dep_service = service_repo.get_service_by_tenant_and_id( tenant.tenant_id, dep_service_id) # 开启对内端口 if open_inner: openServicePorts = [] if container_port: tenant_service_port = port_service.get_service_port_by_port( dep_service, int(container_port)) openServicePorts.append(tenant_service_port) else: ports = port_service.get_service_ports(dep_service) if ports: openServicePorts.extend(ports) for tenant_service_port in openServicePorts: code, msg, data = port_service.manage_port( tenant, dep_service, dep_service.service_region, int(tenant_service_port.container_port), "open_inner", tenant_service_port.protocol, tenant_service_port.port_alias) if code != 200: logger.warning( "auto open depend service inner port faliure {}". format(msg)) else: logger.debug( "auto open depend service inner port success ") else: # 校验要依赖的组件是否开启了对内端口 open_inner_services = port_repo.get_service_ports( tenant.tenant_id, dep_service.service_id).filter(is_inner_service=True) if not open_inner_services: service_ports = port_repo.get_service_ports( tenant.tenant_id, dep_service.service_id) port_list = [ service_port.container_port for service_port in service_ports ] return 201, u"要关联的组件暂未开启对内端口,是否打开", port_list is_duplicate = self.__is_env_duplicate(tenant, service, dep_service) if is_duplicate: return 412, u"要关联的组件的变量与已关联的组件变量重复,请修改后再试", None if service.create_status == "complete": task = dict() task["dep_service_id"] = dep_service_id task["tenant_id"] = tenant.tenant_id task["dep_service_type"] = dep_service.service_type task["enterprise_id"] = tenant.enterprise_id region_api.add_service_dependency(service.service_region, tenant.tenant_name, service.service_alias, task) tenant_service_relation = { "tenant_id": tenant.tenant_id, "service_id": service.service_id, "dep_service_id": dep_service_id, "dep_service_type": dep_service.service_type, "dep_order": 0, } dep_relation = dep_relation_repo.add_service_dependency( **tenant_service_relation) return 200, u"success", dep_relation