Example #1
0
    def create_services(self, region_name, tenant, user, service_alias, service_infos):
        # get temporary service
        temporary_service = service_repo.get_service_by_tenant_and_alias(tenant.tenant_id, service_alias)
        if not temporary_service:
            return 11005, "service not found", "组件不存在", -1

        group_id = service_group_relation_repo.get_group_id_by_service(temporary_service)

        # save services
        code, msg = self.save_multi_services(
            region_name=region_name,
            tenant=tenant,
            group_id=group_id,
            service=temporary_service,
            user=user,
            service_infos=service_infos)
        if code != 200:
            return code, msg, "创建多组件应用失败", -1

        code, msg = app_manage_service.delete(user, tenant, temporary_service, True)
        if code != 200:
            return code, "Service id: " + temporary_service.service_id + ";error \
                deleting temporary service", msg, -1

        return 200, "successfully create the multi-services", "成功创建多组件应用", group_id
Example #2
0
    def create_services(self, region_name, tenant, user, service_alias,
                        service_infos):
        # get temporary service
        temporary_service = service_repo.get_service_by_tenant_and_alias(
            tenant.tenant_id, service_alias)
        if not temporary_service:
            raise AbortRequest("service not found",
                               "组件不存在",
                               status_code=404,
                               error_code=11005)

        group_id = service_group_relation_repo.get_group_id_by_service(
            temporary_service)

        # save services
        service_ids = self.save_multi_services(region_name=region_name,
                                               tenant=tenant,
                                               group_id=group_id,
                                               service=temporary_service,
                                               user=user,
                                               service_infos=service_infos)

        code, msg = app_manage_service.delete(user, tenant, temporary_service,
                                              True)
        if code != 200:
            raise AbortRequest("Service id: " + temporary_service.service_id +
                               "; error deleting temporary service",
                               msg,
                               status_code=400,
                               error_code=code)

        return group_id, service_ids
Example #3
0
    def dep_services_changes(self, component, dep_uuids, component_names={}, level="svc"):
        """
        find out the dependencies that need to be created and
        the dependencies that need to be removed
        """
        dep_relations = dep_relation_repo.get_service_dependencies(self.service.tenant_id, self.service.service_id)
        service_ids = [item.dep_service_id for item in dep_relations]

        # get service_share_uuid by service_id
        service_share_uuids = service_source_repo.get_service_sources_by_service_ids(service_ids).values_list(
            "service_share_uuid", flat=True)

        group_id = service_group_relation_repo.get_group_id_by_service(self.service)
        # dep services from exist service
        new_dep_services = service_repo.list_by_svc_share_uuids(group_id, dep_uuids)
        if level == "app":
            exist_uuids = [svc["service_share_uuid"] for svc in new_dep_services]
            # dep services from apps
            # combine two types of dep_services
            for new_dep_service in self.new_dep_services_from_apps(component, dep_uuids, component_names):
                if new_dep_service["service_share_uuid"] not in exist_uuids:
                    new_dep_services.append(new_dep_service)

        # filter existing dep services
        def dep_service_existed(service):
            if service.get("service_id", None) is None:
                return service["service_share_uuid"] in service_share_uuids
            return service["service_id"] in service_ids

        add = [svc for svc in new_dep_services if not dep_service_existed(svc)]
        if not add:
            return None
        return {
            "add": add,
        }
Example #4
0
 def __get_current_app_and_version(self):
     """
     :return:
     app object
     app_version object
     """
     from console.services.market_app_service import market_app_service
     group_id = service_group_relation_repo.get_group_id_by_service(
         self.service)
     service_ids = group_service_relation_repo.get_services_by_group(
         group_id).values_list("service_id", flat=True)
     versions = service_source_repo.get_service_sources(
         self.tenant.tenant_id,
         service_ids).exclude(version=None).values_list("version",
                                                        flat=True)
     sorted_versions = sorted(
         versions,
         key=lambda x: map(lambda y: int(filter(str.isdigit, str(y))),
                           x.split(".")))
     current_version = sorted_versions[-1]
     if not self.install_from_cloud:
         app, app_version = rainbond_app_repo.get_rainbond_app_and_version(
             self.tenant.enterprise_id, self.service_source.group_key,
             current_version)
     else:
         app, app_version = market_app_service.get_app_from_cloud(
             self.tenant, self.service_source.group_key, current_version)
         self.market_id = app.market_id
     if app_version:
         self.template = json.loads(app_version.app_template)
         self.current_app = app
         self.current_version = app_version
Example #5
0
 def get_service_by_service_key(self, service, dep_service_key):
     """
     get service according to service_key that is sometimes called service_share_uuid.
     """
     group_id = service_group_relation_repo.get_group_id_by_service(service)
     dep_services = service_repo.list_by_svc_share_uuids(group_id, [dep_service_key])
     if not dep_services:
         logger.warning("service share uuid: {}; failed to get dep service: \
             service not found".format(dep_service_key))
         return None
     return dep_services[0]
Example #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
    def dep_services_changes(self, dep_uuids):
        """
        find out the dependencies that need to be created and
        the dependencies that need to be removed
        """
        dep_relations = dep_relation_repo.get_service_dependencies(self.service.tenant_id, self.service.service_id)
        service_ids = [item.dep_service_id for item in dep_relations]

        group_id = service_group_relation_repo.get_group_id_by_service(self.service)
        new_dep_services = service_repo.list_by_svc_share_uuids(group_id, dep_uuids)
        add = [svc for svc in new_dep_services if svc.service_id not in service_ids]
        if not add:
            return None
        return {
            "add": add,
        }
Example #8
0
    def __get_current_app_and_version(self):
        """
        :return:
        app object
        app_version object
        """
        group_id = service_group_relation_repo.get_group_id_by_service(self.service)
        service_ids = group_service_relation_repo.get_services_by_group(group_id).values_list("service_id", flat=True)
        service_sources = service_source_repo.get_service_sources(self.tenant.tenant_id, service_ids)
        versions = service_sources.exclude(version=None).values_list("version", flat=True)
        if versions:

            def foobar(y):
                try:
                    s = filter(str.isdigit, str(y))
                    return int(s)
                except ValueError:
                    # compatible with old version like 'RELEASE.2018-04-19T2'
                    return -1

            sorted_versions = sorted(versions, key=lambda x: map(foobar, x.split(".")))
            current_version = sorted_versions[-1]
            current_version_source = service_sources.filter(version=current_version).first()
        else:
            current_version = None
            current_version_source = None
        if not self.install_from_cloud:
            app, app_version = rainbond_app_repo.get_rainbond_app_and_version(self.tenant.enterprise_id,
                                                                              self.service_source.group_key, current_version)
        else:
            app, app_version = app_market_service.cloud_app_model_to_db_model(self.market, self.service_source.group_key,
                                                                              current_version)
        if app_version:
            self.template = json.loads(app_version.app_template)
            self.current_app = app
            self.current_version = app_version
            if current_version_source:
                self.service_source.create_time = current_version_source.create_time
Example #9
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