Exemplo n.º 1
0
    def post(self, request, *args, **kwargs):
        """
        添加服务探针
        ---
        serializer: ProbeSerilizer
        """
        try:
            data = request.data

            serializer = ProbeSerilizer(data=data)
            if not serializer.is_valid():
                result = general_message(400, "{0}".format(serializer.errors),
                                         "参数异常")
                return Response(result, status=result["code"])
            params = dict(serializer.data)
            code, msg, probe = probe_service.add_service_probe(
                self.tenant, self.service, params)
            if code != 200:
                return Response(general_message(code, "add probe error", msg))
            result = general_message(200,
                                     u"success",
                                     "添加成功",
                                     bean=probe.to_dict())
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
        return Response(result, status=result["code"])
Exemplo n.º 2
0
 def add_service_default_porbe(self, tenant, service):
     ports = port_service.get_service_ports(service)
     port_length = len(ports)
     if port_length >= 1:
         container_port = ports[0].container_port
         for p in ports:
             if p.is_outer_service:
                 container_port = p.container_port
         data = {
             "service_id": service.service_id,
             "scheme": "tcp",
             "path": "",
             "port": container_port,
             "cmd": "",
             "http_header": "",
             "initial_delay_second": 2,
             "period_second": 3,
             "timeout_second": 30,
             "failure_threshold": 3,
             "success_threshold": 1,
             "is_used": True,
             "probe_id": make_uuid(),
             "mode": "readiness"
         }
         return probe_service.add_service_probe(tenant, service, data)
     return 200, "success", None
Exemplo n.º 3
0
    def __create_region_services(self, tenant, user, service_list,
                                 service_probe_map):
        service_prob_id_map = {}
        new_service_list = []
        try:
            for service in service_list:
                # 数据中心创建应用
                new_service = app_service.create_region_service(
                    tenant, service, user.nick_name)
                # 为服务添加探针
                probe_data = service_probe_map.get(service.service_id)
                probe_ids = []
                if probe_data:
                    for data in probe_data:
                        code, msg, probe = probe_service.add_service_probe(
                            tenant, service, data)
                        if code == 200:
                            probe_ids.append(probe.probe_id)
                else:
                    code, msg, probe = app_service.add_service_default_porbe(
                        tenant, service)
                    if probe:
                        probe_ids.append(probe.probe_id)
                if probe_ids:
                    service_prob_id_map[service.service_id] = probe_ids

                # 添加服务有无状态标签
                label_service.update_service_state_label(tenant, new_service)
                new_service_list.append(new_service)
            return new_service_list
        except Exception as e:
            logger.exception("local market install app error {0}".format(e))
            if service_list:
                for service in service_list:
                    if service_prob_id_map:
                        probe_ids = service_prob_id_map.get(service.service_id)
                        if probe_ids:
                            for probe_id in probe_ids:
                                try:
                                    probe_service.delete_service_probe(
                                        tenant, service, probe_id)
                                except Exception as le:
                                    logger.exception(
                                        "local market install app delete service probe {0}"
                                        .format(le))
            raise e
Exemplo n.º 4
0
    def __build_services(self, tenant, user, service_list, service_probe_map):
        service_prob_map = {}
        try:
            for service in service_list:
                # 数据中心创建应用
                new_service = app_service.create_region_service(
                    tenant, service, user.nick_name)
                # 为服务添加探针
                probe_data = service_probe_map.get(service.service_id)
                probe_ids = []
                if probe_data:
                    for data in probe_data:
                        code, msg, probe = probe_service.add_service_probe(
                            tenant, service, data)
                        if code == 200:
                            probe_ids.append(probe.probe_id)
                if probe_ids:
                    service_probe_map[service.service_id] = probe_ids

                # 添加服务有无状态标签
                label_service.update_service_state_label(tenant, new_service)
                # 部署应用
                app_manage_service.deploy(tenant, new_service, user)
        except Exception as e:
            logger.exception(e)
            if service_list:
                for service in service_list:
                    if service_prob_map:
                        probe_ids = service_prob_map.get(service.service_id)
                        if probe_ids:
                            for probe_id in probe_ids:
                                try:
                                    probe_service.delete_service_probe(
                                        tenant, service, probe_id)
                                except Exception as le:
                                    logger.exception(le)
            raise e
Exemplo n.º 5
0
    def install_market_apps_directly(self, user, tenant, region_name,
                                     app_service_json_str, service_origin):
        app_templates = json.loads(app_service_json_str)
        apps = app_templates["apps"]

        service_list = []
        service_key_dep_key_map = {}
        key_service_map = {}
        tenant_service_group = None
        new_group = None
        try:
            # 生成分类
            group_name = self.__generator_group_name(
                app_templates["group_name"])
            new_group = group_repo.add_group(tenant.tenant_id, region_name,
                                             group_name)
            group_id = new_group.ID
            tenant_service_group = self.__generate_tenant_service_group(
                region_name, tenant.tenant_id, new_group.ID,
                app_templates["group_key"], app_templates["group_version"],
                app_templates["group_name"])
            for app in apps:
                ts = self.__init_market_app(tenant, region_name, user, app,
                                            tenant_service_group.ID,
                                            service_origin)
                group_service.add_service_to_group(tenant, region_name,
                                                   group_id, ts.service_id)

                # 先保存env,再保存端口,因为端口需要处理env
                code, msg = self.__save_env(
                    tenant, ts, app["service_env_map_list"],
                    app["service_connect_info_map_list"])
                if code != 200:
                    raise Exception(msg)
                code, msg = self.__save_port(tenant, ts, app["port_map_list"])
                if code != 200:
                    raise Exception(msg)
                code, msg = self.__save_volume(tenant, ts,
                                               app["service_volume_map_list"])
                if code != 200:
                    raise Exception(msg)

                # 保存应用探针信息
                probe_infos = app.get("probes", None)
                if probe_infos:
                    for prob_data in probe_infos:
                        code, msg, probe = probe_service.add_service_probe(
                            tenant, ts, prob_data)
                        if code != 200:
                            logger.exception(msg)

                self.__save_extend_info(ts, app["extend_method_map"])

                dep_apps_key = app.get("dep_service_map_list", None)
                if dep_apps_key:
                    service_key_dep_key_map[ts.service_key] = dep_apps_key
                key_service_map[ts.service_key] = ts
                service_list.append(ts)
            # 保存依赖关系,需要等应用都创建完成才能使用
            self.__save_service_deps(tenant, service_key_dep_key_map,
                                     key_service_map)
            # 数据中心创建应用
            for service in service_list:
                new_service = app_service.create_region_service(
                    tenant, service, user.nick_name)
                logger.debug("build service ===> {0}  success".format(
                    service.service_cname))
                # 为服务添加探针
                self.__create_service_probe(tenant, new_service)

                # 添加服务有无状态标签
                label_service.update_service_state_label(tenant, new_service)

            return True, "success", tenant_service_group, service_list
        except Exception as e:
            logger.exception(e)
            # 回滚数据
            if tenant_service_group:
                tenant_service_group_repo.delete_tenant_service_group_by_pk(
                    tenant_service_group.ID)
            if new_group:
                group_repo.delete_group_by_pk(new_group.ID)
            for service in service_list:
                try:
                    app_manage_service.truncate_service(tenant, service)
                except Exception as delete_error:
                    logger.exception(delete_error)
            return False, "create tenant_services from market directly failed !", None, service_list