def update_or_create_envs(self, team, service, envs): has_envs = env_var_repo.get_service_env(service.tenant_id, service.service_id) env_attr_names = {env.attr_name: env for env in has_envs} for env in envs: if env["name"] in list(env_attr_names.keys()): code, msg, env = self.update_env_by_env_id( team, service, str(env_attr_names[env["name"]].ID), env["note"], env["value"]) if code != 200: raise ServiceHandleException( status_code=code, msg="update or create envs error", msg_show=msg) else: code, msg, env = self.add_service_env_var( team, service, 0, env["note"], env["name"], env["value"], env["is_change"], env["scope"]) if code != 200: raise ServiceHandleException( status_code=code, msg="update or create envs error", msg_show=msg) total_envs = env_var_repo.get_service_env(service.tenant_id, service.service_id) dt = [] for env in total_envs: dt.append({ "note": env.name, "name": env.attr_name, "value": env.attr_value, "is_change": env.is_change, "scope": env.scope, }) return {"envs": dt}
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 __is_env_duplicate(self, tenant, service, dep_service): dep_ids = self.__get_dep_service_ids(tenant, service) attr_names = env_var_repo.get_service_env(tenant.tenant_id, dep_service.service_id).filter(scope="outer").values_list( "attr_name", flat=True) envs = env_var_repo.get_env_by_ids_and_attr_names(dep_service.tenant_id, dep_ids, attr_names).filter(scope="outer") if envs: return True return False
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 env_changes(self, envs): """ Environment variables are only allowed to increase, not allowed to update and delete. Compare existing environment variables and input environment variables to find out which ones need to be added. """ exist_envs = env_var_repo.get_service_env(self.service.tenant_id, self.service.service_id) exist_envs_dict = {env.attr_name: env for env in exist_envs} add_env = [env for env in envs if exist_envs_dict.get(env["attr_name"], None) is None] if not add_env: return None return {"add": add_env}
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_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 test_restore_env(): from console.services.app_actions.app_restore import AppRestore tn = Tenants() tn.tenant_id = "c1a29fe4d7b0413993dc859430cf743d" svc = TenantServiceInfo() svc.service_id = "36966cedcad44358a12f1707dece18da" backup_data = { "service_env_vars": [{ "name": "PHPIZE_DEPS", "tenant_id": "c1a29fe4d7b0413993dc859430cf743d", "attr_name": "PHPIZE_DEPS", "container_port": 0, "create_time": "2019-05-14 18:04:26", "attr_value": "autoconf", "is_change": True, "scope": "inner", "service_id": "36966cedcad44358a12f1707dece18da", "ID": 1080 }, { "name": "PHP_EXTRA_CONFIGURE_ARGS", "tenant_id": "c1a29fe4d7b0413993dc859430cf743d", "attr_name": "PHP_EXTRA_CONFIGURE_ARGS", "container_port": 0, "create_time": "2019-05-14 18:04:26", "attr_value": "--with-apxs2 --disable-cgi", "is_change": True, "scope": "inner", "service_id": "36966cedcad44358a12f1707dece18da", "ID": 1081 }] } service_env_vars = backup_data["service_env_vars"] raw_envs = [env["name"] for env in service_env_vars] app_restore = AppRestore(tn, svc) service_env_vars = service_env_vars app_restore.envs(service_env_vars) envs = env_var_repo.get_service_env(tn.tenant_id, svc.service_id) for env in envs: assert env.name in raw_envs
def get_changeable_env(self, service): if service: return env_var_repo.get_service_env( service.tenant_id, service.service_id).exclude(is_change=False)
def get_service_outer_env(self, service): if service: return env_var_repo.get_service_env( service.tenant_id, service.service_id).filter(scope__in=("outer", "both"))
def get_service_inner_env(self, service): if service: return env_var_repo.get_service_env( service.tenant_id, service.service_id).filter(scope="inner")
def get_self_define_env(self, service): if service: return env_var_repo.get_service_env(service.tenant_id, service.service_id).exclude( container_port=-1, scope="outer")
def get_env_var(self, service): if service: return env_var_repo.get_service_env(service.tenant_id, service.service_id)
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 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