1633 lines
71 KiB
Diff
1633 lines
71 KiB
Diff
diff --git a/packageship/application/apps/package/function/build_depend.py b/packageship/application/apps/package/function/build_depend.py
|
|
index 92351e7..b68eb91 100644
|
|
--- a/packageship/application/apps/package/function/build_depend.py
|
|
+++ b/packageship/application/apps/package/function/build_depend.py
|
|
@@ -20,8 +20,10 @@ class BuildDepend():
|
|
result_dict:A dictionary to store the data that needs to be echoed
|
|
source_dict:A dictionary to store the searched source code package name
|
|
not_found_components: Contain the package not found components
|
|
+ __already_pk_val:List of pkgKey found
|
|
"""
|
|
|
|
+ # pylint: disable = R0902
|
|
def __init__(self, pkg_name_list, db_list, self_build=0, history_dict=None):
|
|
"""
|
|
init class
|
|
@@ -38,6 +40,8 @@ class BuildDepend():
|
|
self.history_dicts = history_dict if history_dict else {}
|
|
self.not_found_components = set()
|
|
|
|
+ self.__already_pk_val = []
|
|
+
|
|
def build_depend_main(self):
|
|
"""
|
|
Description: Entry function
|
|
@@ -67,7 +71,8 @@ class BuildDepend():
|
|
# Here, a place holder is needed to prevent unpacking errors during call
|
|
# 2, This function is an auxiliary function of other modules.
|
|
# The status code is not the final display status code
|
|
- return ResponseCode.SUCCESS, self.result_dict, self.source_dict, self.not_found_components
|
|
+ return (ResponseCode.SUCCESS, self.result_dict,
|
|
+ self.source_dict, self.not_found_components)
|
|
|
|
return ResponseCode.PARAM_ERROR, None, None, set()
|
|
|
|
@@ -80,7 +85,13 @@ class BuildDepend():
|
|
ResponseCode: response code
|
|
Raises:
|
|
"""
|
|
- res_status, build_list, not_fd_com_build = self.search_db.get_build_depend(pkg_list)
|
|
+ (res_status,
|
|
+ build_list,
|
|
+ not_fd_com_build,
|
|
+ pk_v
|
|
+ ) = self.search_db.get_build_depend(pkg_list, self.__already_pk_val)
|
|
+
|
|
+ self.__already_pk_val += pk_v
|
|
self.not_found_components.update(not_fd_com_build)
|
|
if not build_list:
|
|
return res_status if res_status == ResponseCode.DIS_CONNECTION_DB else \
|
|
@@ -91,7 +102,8 @@ class BuildDepend():
|
|
|
|
code, res_dict, not_fd_com_install = \
|
|
InstallDepend(self.db_list).query_install_depend(search_list,
|
|
- self.history_dicts)
|
|
+ self.history_dicts,
|
|
+ self.__already_pk_val)
|
|
self.not_found_components.update(not_fd_com_install)
|
|
if not res_dict:
|
|
return code
|
|
@@ -189,7 +201,13 @@ class BuildDepend():
|
|
return
|
|
|
|
next_src_set = set()
|
|
- _, bin_info_lis, not_fd_com = self.search_db.get_build_depend(pkg_name_li)
|
|
+ (_,
|
|
+ bin_info_lis,
|
|
+ not_fd_com,
|
|
+ pk_v
|
|
+ ) = self.search_db.get_build_depend(pkg_name_li,
|
|
+ self.__already_pk_val)
|
|
+ self.__already_pk_val += pk_v
|
|
self.not_found_components.update(not_fd_com)
|
|
if not bin_info_lis:
|
|
return
|
|
diff --git a/packageship/application/apps/package/function/install_depend.py b/packageship/application/apps/package/function/install_depend.py
|
|
index f3cf05e..c4afe2e 100644
|
|
--- a/packageship/application/apps/package/function/install_depend.py
|
|
+++ b/packageship/application/apps/package/function/install_depend.py
|
|
@@ -5,9 +5,8 @@ Description: Querying for install dependencies
|
|
class: InstallDepend, DictionaryOperations
|
|
"""
|
|
from packageship.libs.log import Log
|
|
-from .searchdb import SearchDB
|
|
-from .constants import ResponseCode
|
|
-from .constants import ListNode
|
|
+from packageship.application.apps.package.function.searchdb import SearchDB
|
|
+from packageship.application.apps.package.function.constants import ResponseCode, ListNode
|
|
|
|
LOGGER = Log(__name__)
|
|
|
|
@@ -21,9 +20,11 @@ class InstallDepend():
|
|
binary_dict: Contain all the binary packages info and operation
|
|
__search_db: A object of database which would be connected
|
|
not_found_components: Contain the package not found components
|
|
+ __already_pk_value: List of pkgKey found
|
|
changeLog:
|
|
"""
|
|
- #pylint: disable = too-few-public-methods
|
|
+
|
|
+ # pylint: disable = too-few-public-methods
|
|
def __init__(self, db_list):
|
|
"""
|
|
Initialization class
|
|
@@ -34,14 +35,16 @@ class InstallDepend():
|
|
self.db_list = db_list
|
|
self.__search_db = SearchDB(db_list)
|
|
self.not_found_components = set()
|
|
+ self.__already_pk_value = []
|
|
|
|
- def query_install_depend(self, binary_list, history_dicts=None):
|
|
+ def query_install_depend(self, binary_list, history_pk_val=None, history_dicts=None):
|
|
"""
|
|
Description: init result dict and determint the loop end point
|
|
Args:
|
|
binary_list: A list of binary rpm package name
|
|
history_dicts: record the searching install depend history,
|
|
defualt is None
|
|
+ history_pk_val:List of pkgKey found
|
|
Returns:
|
|
binary_dict.dictionary:
|
|
{binary_name: [
|
|
@@ -64,7 +67,8 @@ class InstallDepend():
|
|
if binary:
|
|
self.__search_list.append(binary)
|
|
else:
|
|
- LOGGER.logger.warning("There is a NONE in input value:" + str(binary_list))
|
|
+ LOGGER.logger.warning("There is a NONE in input value: %s", str(binary_list))
|
|
+ self.__already_pk_value += history_pk_val if history_pk_val else []
|
|
while self.__search_list:
|
|
self.__query_single_install_dep(history_dicts)
|
|
return ResponseCode.SUCCESS, self.binary_dict.dictionary, self.not_found_components
|
|
@@ -78,8 +82,14 @@ class InstallDepend():
|
|
response_code: response code
|
|
Raises:
|
|
"""
|
|
- result_list, not_found_components = map(set, self.__search_db.get_install_depend(self.__search_list))
|
|
+ result_list, not_found_components, pk_val = map(
|
|
+ set,
|
|
+ self.__search_db.get_install_depend(self.__search_list,
|
|
+ self.__already_pk_value)
|
|
+ )
|
|
+
|
|
self.not_found_components.update(not_found_components)
|
|
+ self.__already_pk_value += pk_val
|
|
for search in self.__search_list:
|
|
if search not in self.binary_dict.dictionary:
|
|
self.binary_dict.init_key(key=search, parent_node=[])
|
|
@@ -108,7 +118,7 @@ class InstallDepend():
|
|
version=history_dicts[result.depend_name][ListNode.VERSION],
|
|
dbname=None,
|
|
parent_node=[[result.search_name, 'install']]
|
|
- )
|
|
+ )
|
|
else:
|
|
self.binary_dict.init_key(key=result.depend_name,
|
|
parent_node=[[result.search_name, 'install']])
|
|
@@ -129,6 +139,7 @@ class DictionaryOperations():
|
|
"""
|
|
self.dictionary = dict()
|
|
|
|
+ # pylint: disable=R0913
|
|
def init_key(self, key, src=None, version=None, dbname=None, parent_node=None):
|
|
"""
|
|
Description: Creating dictionary
|
|
@@ -146,6 +157,7 @@ class DictionaryOperations():
|
|
else:
|
|
self.dictionary[key] = [src, version, dbname, parent_node]
|
|
|
|
+ # pylint: disable=R0913
|
|
def update_value(self, key, src=None, version=None, dbname=None, parent_node=None):
|
|
"""
|
|
Description: append dictionary
|
|
diff --git a/packageship/application/apps/package/function/searchdb.py b/packageship/application/apps/package/function/searchdb.py
|
|
index 400d422..1624e0d 100644
|
|
--- a/packageship/application/apps/package/function/searchdb.py
|
|
+++ b/packageship/application/apps/package/function/searchdb.py
|
|
@@ -4,7 +4,7 @@ Description: A set for all query databases function
|
|
class: SearchDB
|
|
functions: db_priority
|
|
"""
|
|
-from collections import namedtuple
|
|
+from collections import namedtuple, Counter
|
|
|
|
import yaml
|
|
from flask import current_app
|
|
@@ -15,10 +15,10 @@ from sqlalchemy import exists
|
|
|
|
from packageship.libs.dbutils import DBHelper
|
|
from packageship.libs.log import Log
|
|
-from packageship.application.models.package import BinPack,SrcPack
|
|
+from packageship.application.models.package import BinPack, SrcPack
|
|
from packageship.libs.exception import ContentNoneException, Error
|
|
from packageship.system_config import DATABASE_FILE_INFO
|
|
-from .constants import ResponseCode
|
|
+from packageship.application.apps.package.function.constants import ResponseCode
|
|
|
|
LOGGER = Log(__name__)
|
|
|
|
@@ -50,343 +50,231 @@ class SearchDB():
|
|
except DisconnectionError as connection_error:
|
|
current_app.logger.error(connection_error)
|
|
|
|
- def get_install_depend(self, binary_list):
|
|
+ # Related methods of install
|
|
+ # pylint: disable=R0914
|
|
+ def get_install_depend(self, binary_list, pk_value=None):
|
|
"""
|
|
Description: get a package install depend from database:
|
|
binary_name -> binary_id -> requires_set -> requires_id_set -> provides_set
|
|
-> install_depend_binary_id_key_list -> install_depend_binary_name_list
|
|
Args:
|
|
binary_list: a list of binary package name
|
|
+ pk_value:List of pkgKey found
|
|
Returns:
|
|
list:install depend list
|
|
- set:package not found components
|
|
+ set:package not found components,
|
|
+ pk_val:The pkgkey corresponding to the required components
|
|
Raises:
|
|
"""
|
|
+ pk_val = pk_value if pk_value else []
|
|
result_list = []
|
|
- get_list = []
|
|
provides_not_found = dict()
|
|
+
|
|
if not self.db_object_dict:
|
|
- LOGGER.logger.warning("Unable to connect to the database, \
|
|
- check the database configuration")
|
|
- return result_list
|
|
+ LOGGER.logger.warning("Unable to connect to the database,"
|
|
+ "check the database configuration")
|
|
+ return result_list, set(), pk_val
|
|
+
|
|
if None in binary_list:
|
|
binary_list.remove(None)
|
|
search_set = set(binary_list)
|
|
+
|
|
if not search_set:
|
|
- LOGGER.logger.warning(
|
|
- "The input is None, please check the input value.")
|
|
- return result_list
|
|
- return_tuple = namedtuple('return_tuple',
|
|
- 'depend_name depend_version depend_src_name \
|
|
- search_name search_src_name search_version')
|
|
+ LOGGER.logger.warning("The input is None, please check the input value.")
|
|
+ return result_list, set(), pk_val
|
|
+
|
|
+ return_tuple = namedtuple('return_tuple', [
|
|
+ 'depend_name',
|
|
+ 'depend_version',
|
|
+ 'depend_src_name',
|
|
+ 'search_name',
|
|
+ 'search_src_name',
|
|
+ 'search_version'
|
|
+ ])
|
|
+
|
|
for db_name, data_base in self.db_object_dict.items():
|
|
try:
|
|
- name_in = literal_column('name').in_(search_set)
|
|
- sql_com = text("""
|
|
- SELECT DISTINCT
|
|
- bin_pack.NAME AS depend_name,
|
|
- bin_pack.version AS depend_version,
|
|
- s2.name AS depend_src_name,
|
|
- bin_requires.NAME AS req_name,
|
|
- bin.NAME AS search_name,
|
|
- s1.name AS search_src_name,
|
|
- bin.version AS search_version
|
|
- FROM
|
|
- ( SELECT pkgKey, NAME, version, rpm_sourcerpm FROM bin_pack WHERE {} ) bin
|
|
- LEFT JOIN src_pack s1 ON bin.rpm_sourcerpm = s1.src_name
|
|
- LEFT JOIN bin_requires ON bin.pkgKey = bin_requires.pkgKey
|
|
- LEFT JOIN bin_provides ON bin_provides.name = bin_requires.name
|
|
- LEFT JOIN bin_pack ON bin_pack.pkgKey = bin_provides.pkgKey
|
|
- LEFT JOIN src_pack s2 ON bin_pack.rpm_sourcerpm = s2.src_name;
|
|
- """.format(name_in))
|
|
- install_set = data_base.session. \
|
|
- execute(sql_com, {'name_{}'.format(i): v
|
|
- for i, v in enumerate(search_set, 1)}).fetchall()
|
|
- if install_set:
|
|
- # find search_name in db_name
|
|
- # depend_name's db_name will be found in next loop
|
|
- for result in install_set:
|
|
- get_list.append(result.search_name)
|
|
- if not result.depend_name and result.req_name:
|
|
- if result.req_name in provides_not_found:
|
|
- provides_not_found[result.req_name].append(
|
|
- [result.search_name, result.search_src_name, result.search_version, db_name])
|
|
- else:
|
|
- provides_not_found[result.req_name] = [
|
|
- [result.search_name, result.search_src_name, result.search_version, db_name]]
|
|
- else:
|
|
- obj = return_tuple(
|
|
- result.depend_name,
|
|
- result.depend_src_name,
|
|
- result.depend_version,
|
|
- result.search_name,
|
|
- result.search_src_name,
|
|
- result.search_version,
|
|
- )
|
|
- result_list.append((obj, db_name))
|
|
- get_set = set(get_list)
|
|
- get_list.clear()
|
|
- search_set.symmetric_difference_update(get_set)
|
|
- if not search_set:
|
|
- install_result = self._get_install_pro_in_other_database(
|
|
- provides_not_found)
|
|
- result_list.extend(install_result)
|
|
- return result_list, set(provides_not_found.keys())
|
|
- else:
|
|
+ req_set = self._get_requires(search_set, data_base, _tp='install')
|
|
+
|
|
+ if not req_set:
|
|
continue
|
|
- except AttributeError as error_msg:
|
|
- LOGGER.logger.error(error_msg)
|
|
- except SQLAlchemyError as error_msg:
|
|
- LOGGER.logger.error(error_msg)
|
|
- install_result = self._get_install_pro_in_other_database(
|
|
- provides_not_found)
|
|
- result_list.extend(install_result)
|
|
- for binary_name in search_set:
|
|
- result_list.append((return_tuple(None, None, None,
|
|
- binary_name, None, None), 'NOT FOUND'))
|
|
- return result_list, set(provides_not_found.keys())
|
|
|
|
- def get_src_name(self, binary_name):
|
|
- """
|
|
- Description: get a package source name from database:
|
|
- bianry_name ->binary_source_name -> source_name
|
|
- Args:
|
|
- binary_name: search package's name, database preority list
|
|
- Returns:
|
|
- db_name: database name
|
|
- source_name: source name
|
|
- source_version: source version
|
|
- Raises:
|
|
- AttributeError: The object does not have this property
|
|
- SQLAlchemyError: sqlalchemy error
|
|
- """
|
|
- for db_name, data_base in self.db_object_dict.items():
|
|
- sql_str = """
|
|
- SELECT DISTINCT
|
|
- src_pack.name AS source_name,
|
|
- src_pack.version AS source_version
|
|
- FROM
|
|
- bin_pack,
|
|
- src_pack
|
|
- WHERE
|
|
- src_pack.src_name = bin_pack.rpm_sourcerpm
|
|
- AND bin_pack.name = :binary_name;
|
|
- """
|
|
- try:
|
|
- bin_obj = data_base.session.execute(text(sql_str), {"binary_name": binary_name}).fetchone()
|
|
- source_name = bin_obj.source_name
|
|
- source_version = bin_obj.source_version
|
|
- if source_name is not None:
|
|
- return ResponseCode.SUCCESS, db_name, \
|
|
- source_name, source_version
|
|
+ (depend_set,
|
|
+ req_pk_dict,
|
|
+ pk_v,
|
|
+ not_fd_com) = self._get_provides_req_info(req_set,
|
|
+ data_base,
|
|
+ pk_val)
|
|
+ pk_val += pk_v
|
|
+ res_list, get_list = self._comb_install_list(depend_set,
|
|
+ req_pk_dict,
|
|
+ not_fd_com,
|
|
+ return_tuple,
|
|
+ db_name,
|
|
+ provides_not_found,
|
|
+ req_set)
|
|
+
|
|
+ result_list += res_list
|
|
+
|
|
+ search_set.symmetric_difference_update(set(get_list))
|
|
+
|
|
+ if not search_set:
|
|
+ result_list.extend(
|
|
+ self._get_install_pro_in_other_database(provides_not_found,
|
|
+ db_name)
|
|
+ )
|
|
+ return result_list, set(provides_not_found.keys()), pk_val
|
|
+
|
|
except AttributeError as error_msg:
|
|
LOGGER.logger.error(error_msg)
|
|
except SQLAlchemyError as error_msg:
|
|
LOGGER.logger.error(error_msg)
|
|
- return ResponseCode.DIS_CONNECTION_DB, None, None, None
|
|
- return ResponseCode.PACK_NAME_NOT_FOUND, None, None, None
|
|
-
|
|
- def get_sub_pack(self, source_name_list):
|
|
+ if search_set:
|
|
+ result_list.extend(
|
|
+ self._get_install_pro_in_other_database(provides_not_found)
|
|
+ )
|
|
+
|
|
+ for binary_name in search_set:
|
|
+ result_list.append((return_tuple(None, None, None,
|
|
+ binary_name, None, None), 'NOT FOUND'))
|
|
+ return result_list, set(provides_not_found.keys()), pk_val
|
|
+
|
|
+ # pylint: disable=R0913
|
|
+ @staticmethod
|
|
+ def _comb_install_list(depend_set,
|
|
+ req_pk_dict,
|
|
+ not_fd_com,
|
|
+ return_tuple,
|
|
+ db_name,
|
|
+ provides_not_found,
|
|
+ req_set):
|
|
"""
|
|
- Description: get a subpack list based on source name list:
|
|
- source_name ->source_name_id -> binary_name
|
|
+ Description: Query the corresponding installation dependency list
|
|
+ through the components of the requirements
|
|
Args:
|
|
- source_name_list: search package's name, database preority list
|
|
+ depend_set: List binary package information corresponding to the components
|
|
+ req_pk_dict:Mapping of components and binary pkgKey
|
|
+ not_fd_com: List of pkgKey found,
|
|
+ return_tuple: Named tuple format for saving information
|
|
+ db_name:current database name
|
|
+ provides_not_found:Component mapping not found in the current database
|
|
+ req_set:Package information and corresponding component information
|
|
Returns:
|
|
- response code
|
|
- result_list: subpack tuple
|
|
+ ret_list:install depend list
|
|
+ get_list:Packages that have found results
|
|
Raises:
|
|
- AttributeError: The object does not have this property
|
|
- SQLAlchemyError: sqlalchemy error
|
|
"""
|
|
- if not self.db_object_dict:
|
|
- return ResponseCode.DIS_CONNECTION_DB, None
|
|
- search_set = set([
|
|
- source_name for source_name in source_name_list if source_name])
|
|
- result_list = []
|
|
get_list = []
|
|
- if not search_set:
|
|
- return ResponseCode.INPUT_NONE, None
|
|
- for db_name, data_base in self.db_object_dict.items():
|
|
- try:
|
|
- name_in = literal_column('name').in_(search_set)
|
|
- sql_com = text('''
|
|
- SELECT
|
|
- bin_pack.name AS subpack_name,
|
|
- bin_pack.version AS sub_pack_version,
|
|
- src.name AS search_name,
|
|
- src.version AS search_version
|
|
- FROM
|
|
- (SELECT name,version,src_name FROM src_pack WHERE {}) src
|
|
- LEFT JOIN bin_pack on src.src_name = bin_pack.rpm_sourcerpm'''.format(name_in))
|
|
- subpack_tuple = data_base.session. \
|
|
- execute(sql_com, {'name_{}'.format(i): v
|
|
- for i, v in enumerate(search_set, 1)}).fetchall()
|
|
- if subpack_tuple:
|
|
- for result in subpack_tuple:
|
|
- result_list.append((result, db_name))
|
|
- get_list.append(result.search_name)
|
|
- search_set.symmetric_difference_update(set(get_list))
|
|
- get_list.clear()
|
|
- if not search_set:
|
|
- return ResponseCode.SUCCESS, result_list
|
|
- else:
|
|
- continue
|
|
- except AttributeError as attr_error:
|
|
- current_app.logger.error(attr_error)
|
|
- except SQLAlchemyError as sql_error:
|
|
- current_app.logger.error(sql_error)
|
|
- return_tuple = namedtuple(
|
|
- 'return_tuple', 'subpack_name sub_pack_version search_version search_name')
|
|
- for search_name in search_set:
|
|
- result_list.append(
|
|
- (return_tuple(None, None, None, search_name), 'NOT_FOUND'))
|
|
- return ResponseCode.SUCCESS, result_list
|
|
+ ret_list = []
|
|
+ depend_info_tuple = namedtuple('depend_info', [
|
|
+ 'depend_name',
|
|
+ 'depend_version',
|
|
+ 'depend_src_name'
|
|
+ ])
|
|
+ depend_info_dict = {
|
|
+ info.pk: depend_info_tuple(info.depend_name,
|
|
+ info.depend_version,
|
|
+ info.depend_src_name)
|
|
+ for info in depend_set
|
|
+ }
|
|
+
|
|
+ for req_name, search_name, search_src_name, search_version in req_set:
|
|
+ get_list.append(search_name)
|
|
+
|
|
+ if not req_name:
|
|
+ obj = return_tuple(
|
|
+ None,
|
|
+ None,
|
|
+ None,
|
|
+ search_name,
|
|
+ search_src_name,
|
|
+ search_version,
|
|
+ )
|
|
+ ret_list.append((obj, db_name))
|
|
+
|
|
+ elif req_name in req_pk_dict:
|
|
+ depend_info_t = depend_info_dict.get(req_pk_dict[req_name])
|
|
+ obj = return_tuple(
|
|
+ depend_info_t.depend_name,
|
|
+ depend_info_t.depend_version,
|
|
+ depend_info_t.depend_src_name,
|
|
+ search_name,
|
|
+ search_src_name,
|
|
+ search_version,
|
|
+ )
|
|
+ ret_list.append((obj, db_name))
|
|
+
|
|
+ else:
|
|
+ if req_name in not_fd_com:
|
|
+ if req_name not in provides_not_found:
|
|
+ provides_not_found[req_name] = [[search_name, search_src_name,
|
|
+ search_version, db_name]]
|
|
+ else:
|
|
+ provides_not_found[req_name].append([search_name, search_src_name,
|
|
+ search_version, db_name])
|
|
+
|
|
+ return ret_list, get_list
|
|
|
|
- def _get_binary_in_other_database(self, not_found_binary):
|
|
+ def _get_install_pro_in_other_database(self, not_found_binary, _db_name=None):
|
|
"""
|
|
Description: Binary package name data not found in
|
|
the current database, go to other databases to try
|
|
Args:
|
|
not_found_binary: not_found_build These data cannot be found in the current database
|
|
- db_:current database name
|
|
+ _db_name:current database name
|
|
Returns:
|
|
- a list :[(search_name,source_name,bin_name,
|
|
- bin_version,db_name,search_version,req_name),
|
|
- (search_name,source_name,bin_name,
|
|
- bin_version,db_name,search_version,req_name),]
|
|
+ result_list :[return_tuple1,return_tuple2] package information
|
|
Raises:
|
|
- AttributeError: The object does not have this property
|
|
- SQLAlchemyError: sqlalchemy error
|
|
"""
|
|
if not not_found_binary:
|
|
return []
|
|
|
|
- return_tuple = namedtuple("return_tuple", [
|
|
- "search_name",
|
|
- "source_name",
|
|
- "bin_name",
|
|
- "version",
|
|
- "db_name",
|
|
- "search_version",
|
|
+ return_tuple = namedtuple('return_tuple', [
|
|
+ 'depend_name',
|
|
+ 'depend_version',
|
|
+ 'depend_src_name',
|
|
+ 'search_name',
|
|
+ 'search_src_name',
|
|
+ 'search_version'
|
|
])
|
|
- search_list = []
|
|
+
|
|
result_list = []
|
|
+ search_set = {k for k, _ in not_found_binary.items()}
|
|
+
|
|
for db_name, data_base in self.db_object_dict.items():
|
|
- for key, _ in not_found_binary.items():
|
|
- search_list.append(key)
|
|
+ if db_name == _db_name:
|
|
+ continue
|
|
|
|
- search_set = set(search_list)
|
|
- search_list.clear()
|
|
- try:
|
|
- sql_string = text("""
|
|
- SELECT DISTINCT
|
|
- s1.name AS source_name,
|
|
- t1.NAME AS bin_name,
|
|
- t1.version,
|
|
- t2.NAME AS req_name
|
|
- FROM
|
|
- src_pack s1,
|
|
- bin_pack t1,
|
|
- bin_provides t2
|
|
- WHERE
|
|
- t2.{}
|
|
- AND t1.pkgKey = t2.pkgKey
|
|
- AND t1.rpm_sourcerpm = s1.src_name;
|
|
- """.format(literal_column('name').in_(search_set)))
|
|
- bin_set = data_base.session. \
|
|
- execute(sql_string, {'name_{}'.format(i): v
|
|
- for i, v in enumerate(search_set, 1)}).fetchall()
|
|
- if bin_set:
|
|
- for result in bin_set:
|
|
- if result.req_name not in not_found_binary:
|
|
- LOGGER.logger.warning(
|
|
- result.req_name + " contains in two rpm packages!!!")
|
|
- else:
|
|
- for source_info in not_found_binary[result.req_name]:
|
|
- obj = return_tuple(
|
|
- source_info[0],
|
|
- result.source_name,
|
|
- result.bin_name,
|
|
- result.version,
|
|
- db_name,
|
|
- source_info[1]
|
|
- )
|
|
- result_list.append(obj)
|
|
- del not_found_binary[result.req_name]
|
|
- if not not_found_binary:
|
|
- return result_list
|
|
- except AttributeError as attr_err:
|
|
- current_app.logger.error(attr_err)
|
|
- except SQLAlchemyError as sql_err:
|
|
- current_app.logger.error(sql_err)
|
|
+ parm_tuple = namedtuple("in_tuple", 'req_name')
|
|
+ in_tuple_list = [parm_tuple(k) for k, _ in not_found_binary.items()]
|
|
+
|
|
+ depend_set, req_pk_dict, *_ = self._get_provides_req_info(
|
|
+ in_tuple_list,
|
|
+ data_base
|
|
+ )
|
|
+
|
|
+ depend_info_tuple = namedtuple('depend_info', [
|
|
+ 'depend_name',
|
|
+ 'depend_version',
|
|
+ 'depend_src_name'
|
|
+ ])
|
|
+ depend_info_dict = {
|
|
+ info.pk: depend_info_tuple(info.depend_name,
|
|
+ info.depend_version,
|
|
+ info.depend_src_name)
|
|
+ for info in depend_set
|
|
+ }
|
|
+ result_list += self._comb_install_info(search_set,
|
|
+ req_pk_dict,
|
|
+ depend_info_dict,
|
|
+ not_found_binary,
|
|
+ return_tuple,
|
|
+ db_name)
|
|
+ if not not_found_binary:
|
|
+ return result_list
|
|
|
|
if not_found_binary:
|
|
- for key, values in not_found_binary.items():
|
|
- for info in values:
|
|
- obj = return_tuple(
|
|
- info[0],
|
|
- None,
|
|
- None,
|
|
- None,
|
|
- 'NOT FOUND',
|
|
- info[2]
|
|
- )
|
|
- result_list.append(obj)
|
|
- return result_list
|
|
-
|
|
- def _get_install_pro_in_other_database(self, not_found_binary):
|
|
- if not not_found_binary:
|
|
- return []
|
|
- return_tuple = namedtuple('return_tuple',
|
|
- 'depend_name depend_version depend_src_name \
|
|
- search_name search_src_name search_version')
|
|
- search_list = []
|
|
- result_list = []
|
|
- for db_name, data_base in self.db_object_dict.items():
|
|
- for key, values in not_found_binary.items():
|
|
- search_list.append(key)
|
|
- search_set = set(search_list)
|
|
- search_list.clear()
|
|
- sql_string = text("""
|
|
- SELECT DISTINCT
|
|
- s1.name AS source_name,
|
|
- t1.NAME AS bin_name,
|
|
- t1.version,
|
|
- t2.NAME AS req_name
|
|
- FROM
|
|
- src_pack s1,
|
|
- bin_pack t1,
|
|
- bin_provides t2
|
|
- WHERE
|
|
- t2.{}
|
|
- AND t1.pkgKey = t2.pkgKey
|
|
- AND t1.rpm_sourcerpm = s1.src_name;
|
|
- """.format(literal_column('name').in_(search_set)))
|
|
- bin_set = data_base.session. \
|
|
- execute(sql_string, {'name_{}'.format(i): v
|
|
- for i, v in enumerate(search_set, 1)}).fetchall()
|
|
- if bin_set:
|
|
- for result in bin_set:
|
|
- if result.req_name not in not_found_binary:
|
|
- LOGGER.logger.warning(
|
|
- result.req_name + " contains in two rpm packages!!!")
|
|
- else:
|
|
- for binary_info in not_found_binary[result.req_name]:
|
|
- obj = return_tuple(
|
|
- result.bin_name,
|
|
- result.version,
|
|
- result.source_name,
|
|
- binary_info[0],
|
|
- binary_info[1],
|
|
- binary_info[2]
|
|
- )
|
|
- result_list.append((obj, binary_info[3]))
|
|
- del not_found_binary[result.req_name]
|
|
- if not not_found_binary:
|
|
- return result_list
|
|
- if not_found_binary:
|
|
- for key, values in not_found_binary.items():
|
|
+ for _, values in not_found_binary.items():
|
|
for info in values:
|
|
obj = return_tuple(
|
|
None,
|
|
@@ -399,11 +287,52 @@ class SearchDB():
|
|
result_list.append((obj, info[3]))
|
|
return result_list
|
|
|
|
- def get_build_depend(self, source_name_li):
|
|
+ @staticmethod
|
|
+ def _comb_install_info(search_set,
|
|
+ req_pk_dict,
|
|
+ depend_info_dict,
|
|
+ not_found_binary,
|
|
+ return_tuple,
|
|
+ db_name):
|
|
+ """
|
|
+ Description: Binary package name data not found in
|
|
+ the current database, go to other databases to try
|
|
+ Args:
|
|
+ search_set: The name of the component to be queried
|
|
+ req_pk_dict:Mapping of components and binary pkgKey
|
|
+ depend_info_dict:The mapping of binary pkgKey and binary information
|
|
+ not_found_binary:not_found_build These data cannot be found in the current database
|
|
+ return_tuple:Named tuple format for saving information
|
|
+ db_name:current database name
|
|
+ Returns:
|
|
+ ret_list :[return_tuple1,return_tuple2] package information
|
|
+ Raises:
|
|
+ """
|
|
+ ret_list = []
|
|
+ for req_name in search_set:
|
|
+ if req_name in req_pk_dict:
|
|
+ pk_ = req_pk_dict[req_name]
|
|
+ if pk_ in depend_info_dict:
|
|
+ for binary_info in not_found_binary[req_name]:
|
|
+ obj = return_tuple(
|
|
+ depend_info_dict[pk_].depend_name,
|
|
+ depend_info_dict[pk_].depend_version,
|
|
+ depend_info_dict[pk_].depend_src_name,
|
|
+ binary_info[0],
|
|
+ binary_info[1],
|
|
+ binary_info[2]
|
|
+ )
|
|
+ ret_list.append((obj, db_name))
|
|
+ del not_found_binary[req_name]
|
|
+ return ret_list
|
|
+
|
|
+ # Related methods of build
|
|
+ def get_build_depend(self, source_name_li, pk_value=None):
|
|
"""
|
|
Description: get a package build depend from database
|
|
Args:
|
|
source_name_li: search package's name list
|
|
+ pk_value:List of pkgKey found
|
|
Returns:
|
|
all source pkg build depend list
|
|
structure :[(search_name,source_name,bin_name,bin_version,db_name,search_version),
|
|
@@ -422,93 +351,428 @@ class SearchDB():
|
|
"db_name",
|
|
"search_version"
|
|
])
|
|
-
|
|
+ pk_val = pk_value if pk_value else []
|
|
s_name_set = set(source_name_li)
|
|
if not s_name_set:
|
|
- return ResponseCode.PARAM_ERROR, set()
|
|
+ return ResponseCode.PARAM_ERROR, list(), set(), pk_val
|
|
|
|
provides_not_found = dict()
|
|
build_list = []
|
|
|
|
for db_name, data_base in self.db_object_dict.items():
|
|
|
|
- build_set = []
|
|
try:
|
|
- temp_list = list(s_name_set)
|
|
- for input_name_li in [temp_list[i:i + 900] for i in range(0, len(temp_list), 900)]:
|
|
- sql_com = text("""
|
|
- SELECT DISTINCT
|
|
- src.NAME AS search_name,
|
|
- src.version AS search_version,
|
|
- s1.name AS source_name,
|
|
- bin_provides.pkgKey AS bin_id,
|
|
- src_requires.NAME AS req_name,
|
|
- bin_pack.version AS version,
|
|
- bin_pack.NAME AS bin_name
|
|
- FROM
|
|
- ( SELECT pkgKey, NAME, version FROM src_pack WHERE {}) src
|
|
- LEFT JOIN src_requires ON src.pkgKey = src_requires.pkgKey
|
|
- LEFT JOIN bin_provides ON bin_provides.NAME = src_requires.NAME
|
|
- LEFT JOIN bin_pack ON bin_pack.pkgKey = bin_provides.pkgKey
|
|
- LEFT JOIN src_pack s1 on bin_pack.rpm_sourcerpm=s1.src_name;
|
|
- """.format(literal_column("name").in_(input_name_li)))
|
|
- res = data_base.session.execute(
|
|
- sql_com,
|
|
- {'name_{}'.format(i): v
|
|
- for i, v in enumerate(input_name_li, 1)}
|
|
- ).fetchall()
|
|
-
|
|
- build_set.extend(res)
|
|
+ req_set = self._get_requires(s_name_set, data_base, _tp='build')
|
|
+
|
|
+ if not req_set:
|
|
+ continue
|
|
+
|
|
+ (depend_set,
|
|
+ req_pk_dict,
|
|
+ pk_v,
|
|
+ not_fd_req) = self._get_provides_req_info(req_set, data_base)
|
|
+
|
|
+ pk_val += pk_v
|
|
+ ret_list, get_list = self._comb_build_list(depend_set,
|
|
+ req_pk_dict,
|
|
+ not_fd_req,
|
|
+ return_tuple,
|
|
+ db_name,
|
|
+ provides_not_found,
|
|
+ req_set)
|
|
+ build_list += ret_list
|
|
+ s_name_set.symmetric_difference_update(set(get_list))
|
|
+ if not s_name_set:
|
|
+ build_list.extend(
|
|
+ self._get_binary_in_other_database(provides_not_found, _db_name=db_name)
|
|
+ )
|
|
+ return ResponseCode.SUCCESS, build_list, set(provides_not_found.keys()), pk_val
|
|
+
|
|
except AttributeError as attr_err:
|
|
current_app.logger.error(attr_err)
|
|
except SQLAlchemyError as sql_err:
|
|
current_app.logger.error(sql_err)
|
|
|
|
- if not build_set:
|
|
+ if s_name_set:
|
|
+ build_list.extend(
|
|
+ self._get_binary_in_other_database(provides_not_found)
|
|
+ )
|
|
+ for source in s_name_set:
|
|
+ LOGGER.logger.warning(
|
|
+ "CANNOT FOUND THE SOURCE %s in all database", source)
|
|
+
|
|
+ return ResponseCode.SUCCESS, build_list, set(provides_not_found.keys()), pk_val
|
|
+
|
|
+ @staticmethod
|
|
+ def _comb_build_list(depend_set,
|
|
+ req_pk_dict,
|
|
+ not_fd_com,
|
|
+ return_tuple,
|
|
+ db_name,
|
|
+ provides_not_found,
|
|
+ req_set):
|
|
+ """
|
|
+ Description: Query the corresponding build dependency list
|
|
+ through the components of the requirements
|
|
+ Args:
|
|
+ depend_set: List binary package information corresponding to the components
|
|
+ req_pk_dict:Mapping of components and binary pkgKey
|
|
+ not_fd_com: List of pkgKey found,
|
|
+ return_tuple: Named tuple format for saving information
|
|
+ db_name:current database name
|
|
+ provides_not_found:Component mapping not found in the current database
|
|
+ req_set:Package information and corresponding component information
|
|
+ Returns:
|
|
+ ret_list:install depend list
|
|
+ get_list:Packages that have found results
|
|
+ Raises:
|
|
+ """
|
|
+ get_list = []
|
|
+ ret_list = []
|
|
+ depend_info_tuple = namedtuple('depend_info', [
|
|
+ 'depend_name',
|
|
+ 'depend_version',
|
|
+ 'depend_src_name'
|
|
+ ])
|
|
+ depend_info_dict = {
|
|
+ info.pk: depend_info_tuple(info.depend_name,
|
|
+ info.depend_version,
|
|
+ info.depend_src_name)
|
|
+ for info in depend_set
|
|
+ }
|
|
+
|
|
+ for req_name, search_name, search_version in req_set:
|
|
+
|
|
+ get_list.append(search_name)
|
|
+
|
|
+ if not req_name:
|
|
+ obj = return_tuple(
|
|
+ search_name,
|
|
+ None,
|
|
+ None,
|
|
+ None,
|
|
+ db_name,
|
|
+ search_version,
|
|
+ )
|
|
+ ret_list.append(obj)
|
|
+
|
|
+ elif req_name in req_pk_dict:
|
|
+ depend_info_t = depend_info_dict.get(req_pk_dict[req_name])
|
|
+ obj = return_tuple(
|
|
+ search_name,
|
|
+ depend_info_t.depend_src_name,
|
|
+ depend_info_t.depend_name,
|
|
+ depend_info_t.depend_version,
|
|
+ db_name,
|
|
+ search_version
|
|
+ )
|
|
+ ret_list.append(obj)
|
|
+
|
|
+ else:
|
|
+ if req_name in not_fd_com:
|
|
+ if req_name not in provides_not_found:
|
|
+ provides_not_found[req_name] = [
|
|
+ [search_name,
|
|
+ search_version,
|
|
+ db_name]
|
|
+ ]
|
|
+ else:
|
|
+ provides_not_found[req_name].append([search_name,
|
|
+ search_version,
|
|
+ db_name])
|
|
+
|
|
+ return ret_list, get_list
|
|
+
|
|
+ def _get_binary_in_other_database(self, not_found_binary, _db_name=None):
|
|
+ """
|
|
+ Description: Binary package name data not found in
|
|
+ the current database, go to other databases to try
|
|
+ Args:
|
|
+ not_found_binary: not_found_build These data cannot be found in the current database
|
|
+ _db_name:current database name
|
|
+ Returns:
|
|
+ result_list :[return_tuple1,return_tuple2] package information
|
|
+ Raises:
|
|
+ AttributeError: The object does not have this property
|
|
+ SQLAlchemyError: sqlalchemy error
|
|
+ """
|
|
+ if not not_found_binary:
|
|
+ return []
|
|
+
|
|
+ return_tuple = namedtuple("return_tuple", [
|
|
+ "search_name",
|
|
+ "source_name",
|
|
+ "bin_name",
|
|
+ "version",
|
|
+ "db_name",
|
|
+ "search_version",
|
|
+ ])
|
|
+
|
|
+ result_list = []
|
|
+ search_set = {k for k, _ in not_found_binary.items()}
|
|
+
|
|
+ for db_name, data_base in self.db_object_dict.items():
|
|
+
|
|
+ if db_name == _db_name:
|
|
continue
|
|
|
|
- # When processing source package without compilation dependency
|
|
- get_list = []
|
|
- for result in build_set:
|
|
- get_list.append(result.search_name)
|
|
- if not result.bin_name and result.req_name:
|
|
- if result.req_name in provides_not_found:
|
|
- provides_not_found[result.req_name].append(
|
|
- [result.search_name, result.search_version, db_name]
|
|
- )
|
|
- else:
|
|
- provides_not_found[result.req_name] = [
|
|
- [result.search_name, result.search_version, db_name]
|
|
- ]
|
|
- else:
|
|
+ in_tuple = namedtuple("in_tuple", 'req_name')
|
|
+ in_tuple_list = [in_tuple(k) for k, _ in not_found_binary.items()]
|
|
+
|
|
+ depend_set, req_pk_dict, *_ = self._get_provides_req_info(
|
|
+ in_tuple_list,
|
|
+ data_base
|
|
+ )
|
|
+
|
|
+ depend_info_tuple = namedtuple('depend_info', [
|
|
+ 'depend_name',
|
|
+ 'depend_version',
|
|
+ 'depend_src_name'
|
|
+ ])
|
|
+ depend_info_dict = {
|
|
+ info.pk: depend_info_tuple(info.depend_name,
|
|
+ info.depend_version,
|
|
+ info.depend_src_name)
|
|
+ for info in depend_set
|
|
+ }
|
|
+
|
|
+ result_list += self._comb_build_info(search_set,
|
|
+ req_pk_dict,
|
|
+ depend_info_dict,
|
|
+ not_found_binary,
|
|
+ return_tuple,
|
|
+ db_name)
|
|
+ if not not_found_binary:
|
|
+ return result_list
|
|
+
|
|
+ if not_found_binary:
|
|
+ for _, values in not_found_binary.items():
|
|
+ for info in values:
|
|
obj = return_tuple(
|
|
- result.search_name,
|
|
- result.source_name,
|
|
- result.bin_name,
|
|
- result.version,
|
|
- db_name,
|
|
- result.search_version
|
|
+ info[0],
|
|
+ None,
|
|
+ None,
|
|
+ None,
|
|
+ 'NOT FOUND',
|
|
+ info[2]
|
|
)
|
|
- build_list.append(obj)
|
|
+ result_list.append(obj)
|
|
+ return result_list
|
|
|
|
- get_set = set(get_list)
|
|
- get_list.clear()
|
|
- s_name_set.symmetric_difference_update(get_set)
|
|
- if not s_name_set:
|
|
- build_result = self._get_binary_in_other_database(
|
|
- provides_not_found)
|
|
- build_list.extend(build_result)
|
|
- return ResponseCode.SUCCESS, build_list, set(provides_not_found.keys())
|
|
+ @staticmethod
|
|
+ def _comb_build_info(search_set,
|
|
+ req_pk_dict,
|
|
+ depend_info_dict,
|
|
+ not_found_binary,
|
|
+ return_tuple,
|
|
+ db_name):
|
|
+ """
|
|
+ Description: Binary package name data not found in
|
|
+ the current database, go to other databases to try
|
|
+ Args:
|
|
+ search_set: The name of the component to be queried
|
|
+ req_pk_dict:Mapping of components and binary pkgKey
|
|
+ depend_info_dict:The mapping of binary pkgKey and binary information
|
|
+ not_found_binary:not_found_build These data cannot be found in the current database
|
|
+ return_tuple:Named tuple format for saving information,
|
|
+ db_name:current data base name
|
|
+ Returns:
|
|
+ ret_list :[return_tuple1,return_tuple2] package information
|
|
+ Raises:
|
|
+ """
|
|
+ ret_list = []
|
|
+ for req_name in search_set:
|
|
+ if req_name in req_pk_dict:
|
|
+ pk_ = req_pk_dict[req_name]
|
|
+ if pk_ in depend_info_dict:
|
|
+ for binary_info in not_found_binary[req_name]:
|
|
+ obj = return_tuple(
|
|
+ binary_info[0],
|
|
+ depend_info_dict[pk_].depend_src_name,
|
|
+ depend_info_dict[pk_].depend_name,
|
|
+ depend_info_dict[pk_].depend_version,
|
|
+ db_name,
|
|
+ binary_info[1]
|
|
+ )
|
|
+ ret_list.append(obj)
|
|
+ del not_found_binary[req_name]
|
|
+ return ret_list
|
|
|
|
- if s_name_set:
|
|
- build_result = self._get_binary_in_other_database(
|
|
- provides_not_found)
|
|
- build_list.extend(build_result)
|
|
- for source in s_name_set:
|
|
- LOGGER.logger.warning(
|
|
- "CANNOT FOUND THE source " + source + " in all database")
|
|
- return ResponseCode.SUCCESS, build_list, set(provides_not_found.keys())
|
|
+ # Common methods for install and build
|
|
+ @staticmethod
|
|
+ def _get_requires(search_set, data_base, _tp=None):
|
|
+ """
|
|
+ Description: Query the dependent components of the current package
|
|
+ Args:
|
|
+ search_set: The package name to be queried
|
|
+ data_base:current database object
|
|
+ _tp:type options build or install
|
|
+ Returns:
|
|
+ req_set:List Package information and corresponding component information
|
|
+ Raises:
|
|
+ AttributeError: The object does not have this property
|
|
+ SQLAlchemyError: sqlalchemy error
|
|
+ """
|
|
+ if _tp == 'build':
|
|
+ sql_com = text("""
|
|
+ SELECT DISTINCT
|
|
+ src_requires.NAME AS req_name,
|
|
+ src.NAME AS search_name,
|
|
+ src.version AS search_version
|
|
+ FROM
|
|
+ ( SELECT pkgKey, NAME, version, src_name FROM src_pack WHERE {} ) src
|
|
+ LEFT JOIN src_requires ON src.pkgKey = src_requires.pkgKey;
|
|
+ """.format(literal_column('name').in_(search_set)))
|
|
+ elif _tp == 'install':
|
|
+ sql_com = text("""
|
|
+ SELECT DISTINCT
|
|
+ bin_requires.NAME AS req_name,
|
|
+ bin.NAME AS search_name,
|
|
+ s1.name as search_src_name,
|
|
+ bin.version AS search_version
|
|
+ FROM
|
|
+ ( SELECT pkgKey, NAME, version, rpm_sourcerpm FROM bin_pack WHERE {} ) bin
|
|
+ LEFT JOIN src_pack s1 ON bin.rpm_sourcerpm = s1.src_name
|
|
+ LEFT JOIN bin_requires ON bin.pkgKey = bin_requires.pkgKey;
|
|
+ """.format(literal_column('name').in_(search_set)))
|
|
+ else:
|
|
+ return []
|
|
|
|
+ req_set = []
|
|
+ try:
|
|
+ req_set = data_base.session. \
|
|
+ execute(sql_com, {'name_{}'.format(i): v
|
|
+ for i, v in enumerate(search_set, 1)}).fetchall()
|
|
+ except AttributeError as error_msg:
|
|
+ LOGGER.logger.error(error_msg)
|
|
+ except SQLAlchemyError as error_msg:
|
|
+ LOGGER.logger.error(error_msg)
|
|
+ return req_set
|
|
+
|
|
+ def _get_provides_req_info(self, req_info, data_base, pk_value=None):
|
|
+ """
|
|
+ Description: Get the name of the binary package
|
|
+ that provides the dependent component,
|
|
+ Filter redundant queries
|
|
+ when the same binary package is provided to multiple components
|
|
+ Args:
|
|
+ req_info: List of sqlalchemy objects with component names.
|
|
+ data_base: The database currently being queried
|
|
+ pk_value:Binary pkgKey that has been found
|
|
+ Returns:
|
|
+ depend_set: List of related dependent sqlalchemy objects
|
|
+ req_pk_dict: Mapping dictionary of component name and pkgKey
|
|
+ pk_val:update Binary pkgKey that has been found
|
|
+ not_fd_req: Components not found
|
|
+ Raises:
|
|
+ AttributeError: The object does not have this property
|
|
+ SQLAlchemyError: sqlalchemy error
|
|
+ """
|
|
+ pk_val = pk_value if pk_value else []
|
|
+ depend_set = []
|
|
+ req_pk_dict = {}
|
|
+ not_fd_req = set()
|
|
+ try:
|
|
+ req_names = {req_.req_name
|
|
+ for req_ in req_info
|
|
+ if req_.req_name is not None}
|
|
+ req_name_in = literal_column('name').in_(req_names)
|
|
+
|
|
+ sql_com_pro = text("""
|
|
+ SELECT DISTINCT
|
|
+ NAME as req_name,
|
|
+ pkgKey
|
|
+ FROM
|
|
+ ( SELECT name, pkgKey FROM bin_provides
|
|
+ UNION ALL
|
|
+ SELECT name, pkgKey FROM bin_files )
|
|
+ WHERE
|
|
+ {};
|
|
+ """.format(req_name_in))
|
|
+
|
|
+ pkg_key_set = data_base.session.execute(
|
|
+ sql_com_pro, {
|
|
+ 'name_{}'.format(i): v
|
|
+ for i, v in enumerate(req_names, 1)
|
|
+ }
|
|
+ ).fetchall()
|
|
+
|
|
+ req_pk_dict = dict()
|
|
+ pk_v = list()
|
|
+
|
|
+ for req_name, pk_ in pkg_key_set:
|
|
+ if not req_name:
|
|
+ continue
|
|
+ pk_v.append(pk_)
|
|
+ if req_name not in req_pk_dict:
|
|
+ req_pk_dict[req_name] = [pk_]
|
|
+ else:
|
|
+ req_pk_dict[req_name].append(pk_)
|
|
+
|
|
+ pk_val += pk_v
|
|
+
|
|
+ pk_count_dic = Counter(pk_val)
|
|
+
|
|
+ for key, values in req_pk_dict.items():
|
|
+ count_values = list(map(
|
|
+ lambda x: pk_count_dic[x] if x in pk_count_dic else 0, values
|
|
+ ))
|
|
+ max_index = count_values.index(max(count_values))
|
|
+ req_pk_dict[key] = values[max_index]
|
|
+
|
|
+ not_fd_req = req_names - set(req_pk_dict.keys())
|
|
+ depend_set = self._get_depend_info(req_pk_dict, data_base)
|
|
+
|
|
+ except SQLAlchemyError as sql_err:
|
|
+ LOGGER.logger.error(sql_err)
|
|
+ except AttributeError as error_msg:
|
|
+ LOGGER.logger.error(error_msg)
|
|
+
|
|
+ return depend_set, req_pk_dict, pk_val, not_fd_req
|
|
+
|
|
+ @staticmethod
|
|
+ def _get_depend_info(req_pk_dict, data_base):
|
|
+ """
|
|
+ Description: Obtain binary related information through binary pkgKey
|
|
+ Args:
|
|
+ req_pk_dict: Mapping dictionary of component name and pkgKey
|
|
+ data_base: The database currently being queried
|
|
+ Returns:
|
|
+ depend_set: List of related dependent sqlalchemy objects
|
|
+ Raises:
|
|
+ AttributeError: The object does not have this property
|
|
+ SQLAlchemyError: sqlalchemy error
|
|
+ """
|
|
+ depend_set = []
|
|
+ try:
|
|
+ bin_src_pkg_key = req_pk_dict.values()
|
|
+ pk_in = literal_column('pkgKey').in_(bin_src_pkg_key)
|
|
+ sql_bin_src = text("""
|
|
+ SELECT DISTINCT
|
|
+ bin.pkgKey as pk,
|
|
+ bin.name AS depend_name,
|
|
+ bin.version AS depend_version,
|
|
+ src_pack.name AS depend_src_name
|
|
+ FROM
|
|
+ ( SELECT name, pkgKey,version, rpm_sourcerpm FROM bin_pack WHERE {} ) bin
|
|
+ LEFT JOIN src_pack ON src_pack.src_name = bin.rpm_sourcerpm;
|
|
+ """.format(pk_in))
|
|
+
|
|
+ depend_set = data_base.session.execute(
|
|
+ sql_bin_src, {
|
|
+ 'pkgKey_{}'.format(i): v
|
|
+ for i, v in enumerate(bin_src_pkg_key, 1)
|
|
+ }
|
|
+ ).fetchall()
|
|
+
|
|
+ except SQLAlchemyError as sql_err:
|
|
+ LOGGER.logger.error(sql_err)
|
|
+ except AttributeError as error_msg:
|
|
+ LOGGER.logger.error(error_msg)
|
|
+
|
|
+ return depend_set
|
|
+
|
|
+ # Other methods
|
|
def binary_search_database_for_first_time(self, binary_name):
|
|
"""
|
|
Args:
|
|
@@ -553,6 +817,105 @@ class SearchDB():
|
|
|
|
return None, None
|
|
|
|
+ def get_src_name(self, binary_name):
|
|
+ """
|
|
+ Description: get a package source name from database:
|
|
+ bianry_name ->binary_source_name -> source_name
|
|
+ Args:
|
|
+ binary_name: search package's name, database preority list
|
|
+ Returns:
|
|
+ db_name: database name
|
|
+ source_name: source name
|
|
+ source_version: source version
|
|
+ Raises:
|
|
+ AttributeError: The object does not have this property
|
|
+ SQLAlchemyError: sqlalchemy error
|
|
+ """
|
|
+ for db_name, data_base in self.db_object_dict.items():
|
|
+ sql_str = """
|
|
+ SELECT DISTINCT
|
|
+ src_pack.name AS source_name,
|
|
+ src_pack.version AS source_version
|
|
+ FROM
|
|
+ bin_pack,
|
|
+ src_pack
|
|
+ WHERE
|
|
+ src_pack.src_name = bin_pack.rpm_sourcerpm
|
|
+ AND bin_pack.name = :binary_name;
|
|
+ """
|
|
+ try:
|
|
+ bin_obj = data_base.session.execute(text(sql_str),
|
|
+ {"binary_name": binary_name}
|
|
+ ).fetchone()
|
|
+ source_name = bin_obj.source_name
|
|
+ source_version = bin_obj.source_version
|
|
+ if source_name is not None:
|
|
+ return ResponseCode.SUCCESS, db_name, \
|
|
+ source_name, source_version
|
|
+ except AttributeError as error_msg:
|
|
+ LOGGER.logger.error(error_msg)
|
|
+ except SQLAlchemyError as error_msg:
|
|
+ LOGGER.logger.error(error_msg)
|
|
+ return ResponseCode.DIS_CONNECTION_DB, None, None, None
|
|
+ return ResponseCode.PACK_NAME_NOT_FOUND, None, None, None
|
|
+
|
|
+ def get_sub_pack(self, source_name_list):
|
|
+ """
|
|
+ Description: get a subpack list based on source name list:
|
|
+ source_name ->source_name_id -> binary_name
|
|
+ Args:
|
|
+ source_name_list: search package's name, database preority list
|
|
+ Returns:
|
|
+ response code
|
|
+ result_list: subpack tuple
|
|
+ Raises:
|
|
+ AttributeError: The object does not have this property
|
|
+ SQLAlchemyError: sqlalchemy error
|
|
+ """
|
|
+ if not self.db_object_dict:
|
|
+ return ResponseCode.DIS_CONNECTION_DB, None
|
|
+ search_set = {source_name for source_name in source_name_list if source_name}
|
|
+ result_list = []
|
|
+ get_list = []
|
|
+ if not search_set:
|
|
+ return ResponseCode.INPUT_NONE, None
|
|
+ for db_name, data_base in self.db_object_dict.items():
|
|
+ try:
|
|
+ name_in = literal_column('name').in_(search_set)
|
|
+ sql_com = text('''
|
|
+ SELECT
|
|
+ bin_pack.name AS subpack_name,
|
|
+ bin_pack.version AS sub_pack_version,
|
|
+ src.name AS search_name,
|
|
+ src.version AS search_version
|
|
+ FROM
|
|
+ (SELECT name,version,src_name FROM src_pack WHERE {}) src
|
|
+ LEFT JOIN bin_pack on src.src_name = bin_pack.rpm_sourcerpm
|
|
+ '''.format(name_in))
|
|
+ subpack_tuple = data_base.session. \
|
|
+ execute(sql_com, {'name_{}'.format(i): v
|
|
+ for i, v in enumerate(search_set, 1)}).fetchall()
|
|
+ if subpack_tuple:
|
|
+ for result in subpack_tuple:
|
|
+ result_list.append((result, db_name))
|
|
+ get_list.append(result.search_name)
|
|
+ search_set.symmetric_difference_update(set(get_list))
|
|
+ get_list.clear()
|
|
+ if not search_set:
|
|
+ return ResponseCode.SUCCESS, result_list
|
|
+ else:
|
|
+ continue
|
|
+ except AttributeError as attr_error:
|
|
+ current_app.logger.error(attr_error)
|
|
+ except SQLAlchemyError as sql_error:
|
|
+ current_app.logger.error(sql_error)
|
|
+ return_tuple = namedtuple(
|
|
+ 'return_tuple', 'subpack_name sub_pack_version search_version search_name')
|
|
+ for search_name in search_set:
|
|
+ result_list.append(
|
|
+ (return_tuple(None, None, None, search_name), 'NOT FOUND'))
|
|
+ return ResponseCode.SUCCESS, result_list
|
|
+
|
|
|
|
def db_priority():
|
|
"""
|
|
diff --git a/packageship/application/apps/package/function/self_depend.py b/packageship/application/apps/package/function/self_depend.py
|
|
index dd72bed..1ec4c28 100644
|
|
--- a/packageship/application/apps/package/function/self_depend.py
|
|
+++ b/packageship/application/apps/package/function/self_depend.py
|
|
@@ -8,11 +8,11 @@ class: SelfDepend, DictionaryOperations
|
|
|
|
import copy
|
|
from packageship.libs.log import Log
|
|
-from .searchdb import SearchDB
|
|
-from .constants import ResponseCode
|
|
-from .constants import ListNode
|
|
-from .install_depend import InstallDepend as install_depend
|
|
-from .build_depend import BuildDepend as build_depend
|
|
+from packageship.application.apps.package.function.searchdb import SearchDB
|
|
+from packageship.application.apps.package.function.constants import ResponseCode, ListNode
|
|
+from packageship.application.apps.package.function.install_depend import InstallDepend \
|
|
+ as install_depend
|
|
+from packageship.application.apps.package.function.build_depend import BuildDepend as build_depend
|
|
|
|
LOGGER = Log(__name__)
|
|
|
|
@@ -35,6 +35,8 @@ class SelfDepend():
|
|
search_db: A object of database which would be connected
|
|
not_found_components: Contain the package not found components
|
|
"""
|
|
+
|
|
+ # pylint: disable = R0902
|
|
def __init__(self, db_list):
|
|
"""
|
|
init class
|
|
@@ -72,7 +74,8 @@ class SelfDepend():
|
|
self.withsubpack = withsubpack
|
|
response_code = self.init_dict(packname, packtype)
|
|
if response_code != ResponseCode.SUCCESS:
|
|
- return response_code, self.binary_dict.dictionary, self.source_dicts.dictionary, self.not_found_components
|
|
+ return (response_code, self.binary_dict.dictionary,
|
|
+ self.source_dicts.dictionary, self.not_found_components)
|
|
|
|
for key, _ in self.binary_dict.dictionary.items():
|
|
self.search_install_list.append(key)
|
|
@@ -88,7 +91,8 @@ class SelfDepend():
|
|
self.with_subpack()
|
|
if self.search_build_list:
|
|
self.query_build(selfbuild)
|
|
- return response_code, self.binary_dict.dictionary, self.source_dicts.dictionary, self.not_found_components
|
|
+ return (response_code, self.binary_dict.dictionary,
|
|
+ self.source_dicts.dictionary, self.not_found_components)
|
|
|
|
def init_dict(self, packname, packtype):
|
|
"""
|
|
@@ -105,7 +109,7 @@ class SelfDepend():
|
|
if subpack_list:
|
|
for subpack_tuple, dbname in subpack_list:
|
|
self.source_dicts.append_src(packname, dbname, subpack_tuple.search_version)
|
|
- if dbname != 'NOT_FOUND':
|
|
+ if dbname != 'NOT FOUND':
|
|
self.binary_dict.append_bin(key=subpack_tuple.subpack_name,
|
|
src=packname,
|
|
version=subpack_tuple.search_version,
|
|
@@ -155,7 +159,8 @@ class SelfDepend():
|
|
db_, src_version_ = self.search_db.get_version_and_db(source_name)
|
|
self.source_dicts.append_src(key=source_name,
|
|
dbname=db_ if db_ else values[ListNode.DBNAME],
|
|
- version=src_version_ if src_version_ else values[ListNode.VERSION])
|
|
+ version=src_version_
|
|
+ if src_version_ else values[ListNode.VERSION])
|
|
self.search_build_list.append(source_name)
|
|
if self.withsubpack == 1:
|
|
self.search_subpack_list.append(source_name)
|
|
@@ -168,13 +173,14 @@ class SelfDepend():
|
|
Raises:
|
|
"""
|
|
if None in self.search_subpack_list:
|
|
- LOGGER.logger.warning("There is a NONE in input value:" + \
|
|
- str(self.search_subpack_list))
|
|
+ LOGGER.logger.warning("There is a NONE in input value: %s",
|
|
+ str(self.search_subpack_list))
|
|
self.search_subpack_list.remove(None)
|
|
_, result_list = self.search_db.get_sub_pack(self.search_subpack_list)
|
|
for subpack_tuple, dbname in result_list:
|
|
- if dbname != 'NOT_FOUND':
|
|
- if subpack_tuple.subpack_name and subpack_tuple.subpack_name not in self.binary_dict.dictionary:
|
|
+ if dbname != 'NOT FOUND':
|
|
+ if subpack_tuple.subpack_name and subpack_tuple.subpack_name \
|
|
+ not in self.binary_dict.dictionary:
|
|
self.binary_dict.append_bin(key=subpack_tuple.subpack_name,
|
|
src=subpack_tuple.search_name,
|
|
version=subpack_tuple.sub_pack_version,
|
|
@@ -214,7 +220,7 @@ class SelfDepend():
|
|
self.search_build_list.clear()
|
|
for key, values in self.result_tmp.items():
|
|
if not key:
|
|
- LOGGER.logger.warning("key is NONE for value = " + str(values))
|
|
+ LOGGER.logger.warning("key is NONE for value = %s", str(values))
|
|
continue
|
|
if key not in self.binary_dict.dictionary and values[0] != 'source':
|
|
self.binary_dict.dictionary[key] = copy.deepcopy(values)
|
|
@@ -225,11 +231,13 @@ class SelfDepend():
|
|
db_, src_version_ = self.search_db.get_version_and_db(source_name)
|
|
self.source_dicts.append_src(key=source_name,
|
|
dbname=db_ if db_ else values[ListNode.DBNAME],
|
|
- version=src_version_ if src_version_ else values[ListNode.VERSION])
|
|
+ version=src_version_
|
|
+ if src_version_ else values[ListNode.VERSION])
|
|
if self.withsubpack == 1:
|
|
self.search_subpack_list.append(source_name)
|
|
elif key in self.binary_dict.dictionary:
|
|
- self.binary_dict.update_value(key=key, parent_list=values[ListNode.PARENT_LIST])
|
|
+ self.binary_dict.update_value(key=key,
|
|
+ parent_list=values[ListNode.PARENT_LIST])
|
|
|
|
def query_selfbuild(self):
|
|
"""
|
|
@@ -246,7 +254,7 @@ class SelfDepend():
|
|
self.not_found_components.update(not_fd_com)
|
|
for key, values in self.result_tmp.items():
|
|
if not key:
|
|
- LOGGER.logger.warning("key is NONE for value = " + str(values))
|
|
+ LOGGER.logger.warning("key is NONE for value = %s", str(values))
|
|
continue
|
|
if key in self.binary_dict.dictionary:
|
|
self.binary_dict.update_value(key=key, parent_list=values[ListNode.PARENT_LIST])
|
|
@@ -255,11 +263,11 @@ class SelfDepend():
|
|
self.search_install_list.append(key)
|
|
for key, values in source_dicts_tmp.items():
|
|
if not key:
|
|
- LOGGER.logger.warning("key is NONE for value = " + str(values))
|
|
+ LOGGER.logger.warning("key is NONE for value = %s", str(values))
|
|
continue
|
|
if key not in self.source_dicts.dictionary:
|
|
self.source_dicts.dictionary[key] = copy.deepcopy(values)
|
|
- if self.with_subpack == 1:
|
|
+ if self.withsubpack == 1:
|
|
self.search_subpack_list.append(key)
|
|
self.search_build_list.clear()
|
|
|
|
@@ -289,6 +297,7 @@ class DictionaryOperations():
|
|
"""
|
|
self.dictionary[key] = [dbname, version]
|
|
|
|
+ # pylint: disable=R0913
|
|
def append_bin(self, key, src=None, version=None, dbname=None, parent_node=None):
|
|
"""
|
|
Description: Appending binary dictionary
|
|
diff --git a/packageship/pkgship b/packageship/pkgship
|
|
index e19ddc4..9210bd2 100644
|
|
--- a/packageship/pkgship
|
|
+++ b/packageship/pkgship
|
|
@@ -20,4 +20,4 @@ if __name__ == '__main__':
|
|
main()
|
|
except Exception as error:
|
|
print('Command execution error please try again ')
|
|
- print(e.message)
|
|
+ print(error.message)
|
|
diff --git a/packageship/pkgshipd b/packageship/pkgshipd
|
|
index fef39e3..2035b75 100755
|
|
--- a/packageship/pkgshipd
|
|
+++ b/packageship/pkgshipd
|
|
@@ -12,23 +12,35 @@ fi
|
|
|
|
user=$(id | awk '{print $2}' | cut -d = -f 2)
|
|
if [ "$user" == "0(root)" ]; then
|
|
- echo "[INFO] Current user is root"
|
|
+ echo "[INFO] Current user is root."
|
|
else
|
|
- echo "[ERROR] Current user is not root, the service don't support common user."
|
|
+ echo "[ERROR] Current user is not root."
|
|
exit 1
|
|
fi
|
|
|
|
function check_config_file(){
|
|
echo "[INFO] Check validation of config file."
|
|
check_null
|
|
-
|
|
+
|
|
echo "[INFO] Check validation of ip addresses."
|
|
write_port=$(get_config "$service" "write_port")
|
|
query_port=$(get_config "$service" "query_port")
|
|
write_ip_addr=$(get_config "$service" "write_ip_addr")
|
|
query_ip_addr=$(get_config "$service" "query_ip_addr")
|
|
- check_addr $write_ip_addr $write_port
|
|
- check_addr $query_ip_addr $query_port
|
|
+ if [[ -z $write_ip_addr ]]; then
|
|
+ echo "[ERROR] The value of below config names is None in: $SYS_PATH/package.ini, Please check these parameters: write_ip_addr"
|
|
+ exit 1
|
|
+ else
|
|
+ check_addr $write_ip_addr $write_port
|
|
+ fi
|
|
+
|
|
+ if [[ -z $query_ip_addr ]]; then
|
|
+ echo "[ERROR] The value of below config names is None in: $SYS_PATH/package.ini, Please check these parameters: query_ip_addr"
|
|
+ exit 1
|
|
+ else
|
|
+ check_addr $query_ip_addr $query_port
|
|
+ fi
|
|
+
|
|
echo "[INFO] IP addresses are all valid."
|
|
|
|
echo "[INFO] Check validation of numbers."
|
|
@@ -47,8 +59,8 @@ function check_config_file(){
|
|
echo "[INFO] Check validation of words."
|
|
log_level=$(get_config "$service" "log_level")
|
|
open=$(get_config "$service" "open")
|
|
- check_word $log_level "INFO|DEBUG|WARNING|ERROR|CRITICAL" "log_level"
|
|
- check_word $open "True|False" "open"
|
|
+ check_word "log_level" "INFO|DEBUG|WARNING|ERROR|CRITICAL" $log_level
|
|
+ check_word "open" "True|False" $open
|
|
echo "[INFO] All words are valid."
|
|
|
|
echo "[INFO] Config file checked valid."
|
|
@@ -67,7 +79,7 @@ function check_addr(){
|
|
echo "[ERROR] Invalid ip of $1"
|
|
exit 1
|
|
fi
|
|
- check_num $2 "port"
|
|
+ check_num ${2-"port"} "port"
|
|
if [[ $2 -gt 65534 || $2 -lt 1025 ]]; then
|
|
echo "[ERROR] Invalid port of $2"
|
|
exit 1
|
|
@@ -100,16 +112,21 @@ function check_num(){
|
|
}
|
|
|
|
function check_word(){
|
|
- result=`echo $1 | grep -wE "$2"`
|
|
+ if [ -z $3 ]; then
|
|
+ echo "[ERROR] The value of below config names is None in: $SYS_PATH/package.ini, Please check these parameters: $1"
|
|
+ exit 1
|
|
+ fi
|
|
+
|
|
+ result=`echo $3 | grep -wE "$2"`
|
|
if [ $? -ne 0 ]; then
|
|
- echo "[ERROR] $3 should be $2."
|
|
+ echo "[ERROR] $1 should be $2."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
|
|
function get_config(){
|
|
- cat $SYS_PATH/package.ini | grep -E ^$2 | sed s/[[:space:]]//g | awk 'BEGIN{FS="="}{print $2}'
|
|
+ cat $SYS_PATH/package.ini | grep -E ^$2 | sed 's/[[:space:]]//g' | awk 'BEGIN{FS="="}{print $2}'
|
|
}
|
|
|
|
function create_config_file(){
|
|
@@ -120,12 +137,12 @@ function create_config_file(){
|
|
harakiri=$(get_config "$service" "harakiri")
|
|
uwsgi_file_path=$(find /usr/lib/ -name "packageship" | head -n 1)
|
|
echo "[INFO] run packageship under path: $uwsgi_file_path"
|
|
- if [ $service = "manage" -o $service = "all" ];then
|
|
+ if [ $service = "manage" -o $service = "all" ]; then
|
|
write_port=$(get_config "$service" "write_port")
|
|
write_ip_addr=$(get_config "$service" "write_ip_addr")
|
|
if [[ -z "$daemonize" ]] || [[ -z "$buffer_size" ]] || [[ -z "$write_ip_addr" ]] || [[ -z "$http_timeout" ]] || [[ -z "$harakiri" ]] || [[ -z "$write_port" ]];
|
|
then
|
|
- echo "[ERROR] CAN NOT find all config name in: $SYS_PATH/package.ini, Please check the file"
|
|
+ echo "[ERROR] CAN NOT find all config name in: $SYS_PATH/package.ini, Please check the file"
|
|
echo "[ERROR] The following config name is needed: daemonize, buffer-size, write_port, write_ip_addr, harakiri and http-timeout"
|
|
exit 1
|
|
fi
|