Пример #1
0
    def get_detail_info(self, object_type, object_id):
        """
        獲取base_table中的資料細節
        Parameters
        ----------
        object_type: str
            product or project
        object_id: str
            project_id or product_id 共稱object_id

        Returns
        -------
        查詢結果: dict
        """
        ss_time = time.time()
        if object_type == Type.product.value:
            try:
                result = self.__product_base_dao.select_by_id(object_id)
            except:
                logger.error(traceback.format_exc())
                raise CommonRuntimeException("389900009")
        # if object_type == Type.project.value
        else:
            try:
                result = self.__project_base_dao.select_by_id(object_id)
            except:
                logger.error(traceback.format_exc())
                raise CommonRuntimeException("389900009")
        result = _change_to_frontend_style(object_type, result)
        cost_time = round(time.time() - ss_time, 2)
        return result, cost_time
Пример #2
0
    def activate(self, releaseVo):
        """
        修改release_table的running_status
        Parameters
        ----------
        releaseVo: object

        Returns
        -------
        str release_id
        """
        ss_time = time.time()

        # 檢查是否能關閉
        if releaseVo.running_status == 0:
            if self.__release_mapping_dao.check_parent_dependency(
                    releaseVo.release_id) is True:
                raise CommonRuntimeException("389900011")

        # 若running_status為1 則所有套件 服務都必須啟動
        if releaseVo.running_status == 1:
            release_status = self.__release_dao.get_release_status_by_id(
                releaseVo.release_id)
            if release_status != 1:
                raise CommonRuntimeException("389900016")

            # get dependency_id
            try:
                # 只建立出語法
                dep_ids_from_view = self.__search_view_dao.get_dependency_id(
                    releaseVo.release_id)
                list_of_dep_ids = list()
                # 連線到db並且拿出資料,並且判斷有無dependency
                if dep_ids_from_view.count() == 0:
                    pass
                else:
                    for data in dep_ids_from_view.dicts():
                        list_of_dep_ids.append(data["dependency_id"])
            except:
                raise CommonRuntimeException("389900009")

            # update dependency_id running_status to 1
            if len(list_of_dep_ids) > 0:
                self.__release_dao.update_by_parameters(
                    list_of_dep_ids,
                    running_status=releaseVo.running_status,
                    mdy_date=datetime.utcnow(),
                    mdy_user=releaseVo.user)

        # update release_id running_status
        release_id = self.__release_dao.update_by_parameters(
            str(releaseVo.release_id),
            running_status=releaseVo.running_status,
            mdy_date=datetime.utcnow(),
            mdy_user=releaseVo.user)

        if release_id is None:
            raise CommonRuntimeException("389900002")
        cost_time = round(time.time() - ss_time, 2)
        return release_id, cost_time
Пример #3
0
    def verify(self, releaseVo):
        """
        修改release_table的release_status
        Parameters
        ----------
        releaseVo :object of ReleaseVo

        Returns
        -------
        str
            verify 的 release_id
        """
        ss_time = time.time()

        result = self.__release_dao.update_by_parameters(
            release_id=releaseVo.release_id,
            release_status=releaseVo.release_status,
            mdy_user=releaseVo.user,
            mdy_date=datetime.utcnow())

        # 查無資料
        if result is None:
            raise CommonRuntimeException("389900002")

        cost_time = round(time.time() - ss_time, 2)
        return result, cost_time
Пример #4
0
    def check_exist(self,
                    object_type,
                    name=None,
                    service_port=None,
                    service_url=None):
        """
        確認db中該筆資料是否已經存在
        Parameters
        ----------
        object_type: str
            product_id, project_id
        name: str
            專案或產品名稱
        service_port: int
            服務之port號 若為product則無
        service_url: str
            服務所對應之url 若為product則無

        Returns
        -------
        boolean
        """
        try:
            if object_type == Type.product.value:
                name_exist = self.__product_base_dao.check_insert_validation(
                    name)
                return name_exist
            elif object_type == Type.project.value:
                data_exist = self.__project_base_dao.check_insert_validation(
                    name, service_url, service_port)
                return data_exist
        except:
            logger.error(traceback.format_exc())
            logger.error("Fail to check project/product name exist.")
            raise CommonRuntimeException("999999998")
Пример #5
0
    def modify_db_data(self, object_type, versionVo):
        """
        更改base_table的資料
        Parameters
        ----------
        object_type: str
            project or product
        versionVo: object
            驗證過的前端資料

        Returns
        -------
        object_id: str
        """
        ss_time = time.time()
        # for product
        if object_type == Type.product.value:
            result = self.__product_base_dao.update_to_product_table(
                versionVo.object_id,
                note=versionVo.note,
                jira_api=versionVo.jira_api_id)
        # for project
        else:
            if versionVo.service_port or versionVo.service_url:
                data_exist = self.__project_base_dao.check_exist(
                    versionVo.object_id,
                    service_port=versionVo.service_port,
                    service_url=versionVo.service_url)
                if data_exist is True:
                    logger.error(traceback.format_exc())
                    raise CommonRuntimeException("389900002")
            result = self.__project_base_dao.update_to_project_table(
                versionVo.object_id,
                service_port=versionVo.service_port,
                git_url=versionVo.git_url,
                service_url=versionVo.service_url,
                language_type=versionVo.language_type,
                project_type=versionVo.project_type,
                jira_api=versionVo.jira_api_id,
                active_status=versionVo.active_status,
                note=versionVo.note)

        cost_time = round(time.time() - ss_time, 2)
        return result, cost_time
Пример #6
0
    def modify_release(self, releaseVo):
        """
        更改 release info
        Parameters
        ----------
        releaseVo: object
            驗證過的前端資料

        Returns
        -------
        release_id: str
        """
        ss_time = time.time()

        # 更新 release note
        if releaseVo.release_note is not None:
            self.__release_dao.update_by_parameters(
                release_id=releaseVo.release_id,
                release_note=releaseVo.release_note)

        # 更新 dependency
        release_status, running_status, dependency_list = self.__release_dao.get_status_and_dependency_by_id(
            releaseVo.release_id)

        if (release_status != 0 or running_status != 0
            ) and dependency_list != releaseVo.dependency_id_list:
            raise CommonRuntimeException("389900013")
        # dependency 有做更動再寫入db
        if dependency_list != releaseVo.dependency_id_list:
            self.__release_mapping_dao.modify_dependency_by_release_id(
                release_id=releaseVo.release_id,
                dependency_id_list=releaseVo.dependency_id_list)
        result = releaseVo.release_id

        cost_time = round(time.time() - ss_time, 2)
        return result, cost_time
Пример #7
0
    def validate(self, api_type=None):
        if api_type == "release_insert":
            # check if data exists
            if self.user is None or self.object_id is None or self.version is None:
                raise CommonRuntimeException("999900001")

            assert isinstance(self.user, str), "999900001"
            assert isinstance(self.object_id, str), "999900001"
            assert isinstance(self.version, str), "999900001"
            assert isinstance(
                self.release_note,
                (str, type(None))), "999900001"  # check data is None or str
            assert isinstance(self.dependency_id_list,
                              (list, type(None))), "999900001"

        if api_type == "latest_info":
            if self.user is None or self.object_id is None:
                raise CommonRuntimeException("999900001")

            assert isinstance(self.user, str), "999900001"
            assert isinstance(self.object_id, str), "999900001"

        if api_type == "activate":
            if self.user is None or self.release_id is None or self.running_status is None:
                raise CommonRuntimeException("999900001")

            assert isinstance(self.user, str), "999900001"
            assert isinstance(self.release_id, str), "999900001"
            assert isinstance(self.running_status, int), "999900001"

        if api_type == "verify":
            if self.user is None or self.release_id is None or self.release_status is None:
                raise CommonRuntimeException("999900001")

            assert isinstance(self.user, str), "999900001"
            assert isinstance(self.release_id, str), "999900001"
            assert isinstance(self.release_status, int), "999900001"

        if api_type == "history_info":
            if self.user is None or self.object_id is None or self.get_running is None:
                raise CommonRuntimeException("999900001")

            assert isinstance(self.user, str), "999900001"
            assert isinstance(self.object_id, str), "999900001"
            assert isinstance(self.get_running, bool), "999900001"

        if api_type == "release_overview":
            if self.user is None:
                raise CommonRuntimeException("999900001")

            assert isinstance(self.user, str), "999900001"

        if api_type == "get_release_info":
            if self.user is None or self.release_id_list is None:
                raise CommonRuntimeException("999900001")

            assert isinstance(self.user, str), "999900001"
            assert isinstance(self.release_id_list, list), "999900001"

        if api_type == "modify_release_info":
            if self.user is None or self.release_id is None:
                raise CommonRuntimeException("999900001")

            assert isinstance(self.user, str), "999900001"
            assert isinstance(self.release_id, str), "999900001"
            assert isinstance(self.dependency_id_list, list), "999900001"
            assert isinstance(self.release_note,
                              (str, type(None))), "999900001"
Пример #8
0
    def get_specific_releases_info(self, releaseVo):
        """
        依據 release_id_list 拿出對應的 release 資料

        Returns
        -------
        result: list 查詢結果
        """
        ss_time = time.time()

        cursor = self.__release_dao.search_by_id_list(
            releaseVo.release_id_list)

        # 過濾要給前端的column並且轉換格式
        search_result = list(cursor)
        if not search_result:
            raise CommonRuntimeException("389900009")
        arranged_result = []
        check_duplicate = search_result[0]["release_id"]
        dict_data = defaultdict(list)
        for value in search_result:
            if value["release_id"] != check_duplicate:
                # 若無 dependency 依然回傳一個空 list
                if not "dependency" in dict_data:
                    dict_data["dependency"] = list()

                arranged_result.append(dict_data)
                dict_data = defaultdict(list)  # 清空
                check_duplicate = value["release_id"]
            else:
                if value["dependency_id"]:  # 避免在第一筆資料插入空的dependency
                    dict_data["dependency"].append({
                        "dependencyId":
                        value["dependency_id"],
                        "dependencyName":
                        value["dependency_name"],
                        "dependencyVersion":
                        value["dependency_version"]
                    })
            dict_data["crtDate"] = self.__datetime.utc_to_localize(
                value["crt_date"]).strftime("%Y/%m/%d %H:%M")
            dict_data["crtUser"] = value["crt_user"]
            dict_data["mdyUser"] = value["mdy_user"]
            dict_data["releaseId"] = value["release_id"]
            dict_data["releaseNote"] = value["release_note"]
            dict_data["releaseStatus"] = value["release_status"]
            dict_data["runningStatus"] = value["running_status"]
            dict_data["version"] = value["version"]
            dict_data["languageType"] = value["language_type"]

            if value["product_name"] is not None:
                dict_data["name"] = value["product_name"]
            else:
                dict_data["name"] = value["project_name"]
            if value["mdy_date"] is not None:
                dict_data["mdyDate"] = self.__datetime.utc_to_localize(
                    value["mdy_date"]).strftime("%Y/%m/%d %H:%M")
            else:
                dict_data["mdyDate"] = None

            if value["project_id"] is not None:
                dict_data["isProduct"] = False
            else:
                dict_data["isProduct"] = True

        # append 最後一筆 data
        if not "dependency" in dict_data:
            dict_data["dependency"] = list()
        arranged_result.append(dict_data)

        cost_time = round(time.time() - ss_time, 2)
        return arranged_result, cost_time
Пример #9
0
    def latest_release_info(self, object_type, releaseVo):
        """
        獲取從資料庫search_view得到的最新所有相關的套件或服務之名字及版本號
        Parameters
        ----------
        object_type: str
            project or product
        releaseVo: object
            驗證過的前端資料

        Returns
        -------
        list
            查詢結果
        """
        ss_time = time.time()

        # 從 search view 中拿取 release info
        if object_type == Type.project.value:
            result_of_search_view = self.__search_view_dao.get_release_info(
                object_type, project_id=releaseVo.object_id)
        else:
            result_of_search_view = self.__search_view_dao.get_release_info(
                object_type, product_id=releaseVo.object_id)
        # 取得最新版本的單筆資料(view)(release_version)
        try:
            latest_view_data = result_of_search_view.limit(1).get()
        except:
            cost_time = round(time.time() - ss_time, 2)
            return None, cost_time

        # 從 release table 中拿取 release info
        if object_type == Type.project.value:
            result_of_release_table = self.__release_dao.get_release_info(
                object_type, project_id=releaseVo.object_id)
        else:
            result_of_release_table = self.__release_dao.get_release_info(
                object_type, product_id=releaseVo.object_id)
        # 取得最新版本的單筆資料(table)
        try:
            latest_data_of_release_table = result_of_release_table.limit(
                1).get()
        except:
            raise CommonRuntimeException("389900009")

        # 檢查 dependency data 是否真的是上一個 release 的資料
        if latest_data_of_release_table.version != latest_view_data.release_table.release_version:
            cost_time = round(time.time() - ss_time, 2)
            return None, cost_time
        else:
            result = list()
            result_dict = dict()
            for db_data in result_of_search_view.dicts():
                # 如果crt_date相符(代表為the latest)
                if db_data[
                        "release_version"] == latest_data_of_release_table.version:
                    if db_data["product_name"] is not None:
                        result_dict["name"] = db_data["product_name"]
                    else:
                        result_dict["name"] = db_data["project_name"]
                    result_dict["version"] = db_data["dependency_version"]
                    result.append(result_dict)
                    result_dict = {}

            cost_time = round(time.time() - ss_time, 2)
            return result, cost_time
Пример #10
0
    def new_release_version(self, object_type, releaseVo):
        """
        新增release version to release table and release_mapping_table
        如果沒有dependency 則只會新增到release table
        Parameters
        ----------
        object_type: str
            product or project
        releaseVo: object
            前端獲得之資料
        Returns
        -------
        str
            new_release_id
        """
        ss_time = time.time()

        if object_type == Type.project.value:
            # check active status and version
            _is_active = False
            _version_duplicate = False
            cursor = self.__project_dao.get_active_and_version(
                releaseVo.object_id,
                active_status=1,
                version=releaseVo.version).dicts()
            for value in cursor:
                if value["active_status"] == 1:
                    _is_active = True
                if value["version"] == releaseVo.version:
                    _version_duplicate = True
            # 根據 boolean raise 不同的 error
            if _is_active is False and _version_duplicate is True:
                raise CommonRuntimeException("389900014")
            if _is_active is False:
                raise CommonRuntimeException("389900012")
            if _version_duplicate is True:
                raise CommonRuntimeException("389900015")

            new_release_id = self.__release_dao.insert_to_release_table(
                project_id=releaseVo.object_id,
                version=releaseVo.version,
                crt_user=releaseVo.user,
                release_note=releaseVo.release_note)
            self.__release_mapping_dao.insert_to_release_mapping_table(
                release_id=new_release_id,
                dependency_id_list=releaseVo.dependency_id_list)

        else:
            # check active status
            _is_active = self.__product_dao.check_exist(releaseVo.object_id,
                                                        active_status=1)
            if _is_active is True:
                new_release_id = self.__release_dao.insert_to_release_table(
                    product_id=releaseVo.object_id,
                    version=releaseVo.version,
                    crt_user=releaseVo.user,
                    release_note=releaseVo.release_note)
                self.__release_mapping_dao.insert_to_release_mapping_table(
                    release_id=new_release_id,
                    dependency_id_list=releaseVo.dependency_id_list)
            else:
                raise CommonRuntimeException("389900012")

        cost_time = round(time.time() - ss_time, 2)
        return new_release_id, cost_time
Пример #11
0
    def validate(self, objectType, api_type=None):
        """
        驗證前端資料
        Parameters
        ----------
        objectType: str
        """
        if api_type == "create":
            # 驗證必填欄位
            if self.user is None:
                raise CommonRuntimeException("999900001")
            if self.name is None:
                raise CommonRuntimeException("389900006")

            # 如果是project insert, 驗證其必填欄位
            if objectType == Type.project.value:
                if self.project_type is None:
                    raise CommonRuntimeException("389900008")
                if self.language_type is None:
                    raise CommonRuntimeException("389900007")

                # 另外確認chatbot的連續port號
                with open("port_block.yml", "r") as stream:
                    chatbot_port = yaml.safe_load(
                        stream)["port_block"]["range"]
                for port in chatbot_port:
                    if self.service_port:
                        if port["start"] <= self.service_port <= port["end"]:
                            raise CommonRuntimeException("389900010")

                assert isinstance(self.git_url, (str, type(None))), "999900001"
                assert isinstance(self.service_port,
                                  (int, type(None))), "999900001"
                assert isinstance(self.service_url,
                                  (str, type(None))), "999900001"
                assert isinstance(self.jira_api_id,
                                  (str, type(None))), "999900001"

            #for release table
            if self.version is None:
                raise CommonRuntimeException("999900001")

            # 驗證選 必填欄位之格式
            assert isinstance(self.user, str), "999900001"
            assert isinstance(self.name, str), "999900001"
            assert isinstance(self.version, str), "999900001"
            assert isinstance(self.note, (str, type(None))), "999900001"

        if api_type == "modify":
            if self.object_id is None:
                raise CommonRuntimeException("389900003")
            # 不得針對active_status做modify 只能用archive
            if self.active_status == "0":
                raise CommonRuntimeException("389900004")

            if objectType == Type.project.value:
                assert isinstance(self.service_port,
                                  (int, type(None))), "999900001"
                assert isinstance(self.service_url,
                                  (str, type(None))), "999900001"
            assert isinstance(self.git_url, (str, type(None))), "999900001"
            assert isinstance(self.project_type,
                              (str, type(None))), "999900001"
            assert isinstance(self.language_type,
                              (str, type(None))), "999900001"
            assert isinstance(self.note, (str, type(None))), "999900001"
            assert isinstance(self.jira_api_id, (str, type(None))), "999900001"

        if api_type == "search":
            assert isinstance(self.keyword, (str, type(None))), "999900001"
            assert isinstance(self.project_type,
                              (str, type(None))), "999900001"
            assert isinstance(self.language_type,
                              (str, type(None))), "999900001"
            assert isinstance(self.active_status,
                              (int, type(None))), "999900001"
            assert isinstance(self.name, (str, type(None))), "999900001"
Пример #12
0
    def insert_new(self, object_type, versionVo):
        """
        新增資料至DB的project_base_table or product_base_table 以及 release_table

        Parameters
        ----------
        object_type : str
            project / product
        versionVo : object
            包含所有 input 資訊

        Returns
        -------
        release_id : str
            ObjectId流水號
        """
        ss_time = time.time()

        # for product
        if object_type == Type.product.value:

            data_exist = self.check_exist(object_type, name=versionVo.name)
            # 若存在 則不可新增 直接error
            if data_exist is True:
                logger.error(traceback.format_exc())
                raise CommonRuntimeException("389900001")

            # insert to product_table
            product_id = self.__product_base_dao.insert_to_product_table(
                product_name=versionVo.name,
                note=versionVo.note,
                jira_api=versionVo.jira_api_id)
            # insert to release_table
            release_id = self.__release_dao.insert_to_release_table(
                product_id=product_id,
                version=versionVo.version,
                crt_user=versionVo.user)
            result = dict()
            result["productId"] = product_id
            result["releaseId"] = release_id

        # for project
        elif object_type == Type.project.value:
            data_exist = self.check_exist(object_type,
                                          name=versionVo.name,
                                          service_port=versionVo.service_port,
                                          service_url=versionVo.service_url)
            # 若存在 則不可新增 直接error
            if data_exist is True:
                logger.error(traceback.format_exc())
                raise CommonRuntimeException("389900001")

            # insert to project_table
            if versionVo.service_port == -1:
                versionVo.service_port = None
            if versionVo.service_url == "-":
                versionVo.service_url = None
            project_id = self.__project_base_dao.insert_to_project_table(
                project_name=versionVo.name,
                service_port=versionVo.service_port,
                git_url=versionVo.git_url,
                service_url=versionVo.service_url,
                language_type=versionVo.language_type,
                project_type=versionVo.project_type,
                jira_api=versionVo.jira_api_id,
                note=versionVo.note)

            # insert to release_table
            release_id = self.__release_dao.insert_to_release_table(
                project_id=project_id,
                version=versionVo.version,
                crt_user=versionVo.user)
            result = dict()
            result["projectId"] = project_id
            result["releaseId"] = release_id

        cost_time = round(time.time() - ss_time, 2)
        return result, cost_time