Ejemplo n.º 1
0
 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}
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
    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}
Ejemplo n.º 6
0
    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
Ejemplo n.º 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)
        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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
 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"))
Ejemplo n.º 11
0
 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")
Ejemplo n.º 12
0
 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")
Ejemplo n.º 13
0
 def get_env_var(self, service):
     if service:
         return env_var_repo.get_service_env(service.tenant_id,
                                             service.service_id)
Ejemplo n.º 14
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
Ejemplo n.º 15
0
    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