This commit is contained in:
Ivan Vazhenin
2024-04-25 20:32:28 +03:00
commit 7b8035ff33
101 changed files with 13658 additions and 0 deletions

View File

View File

@@ -0,0 +1,7 @@
import graphql
CLASSIFIER_VERSION = '8.23'
class Classifier:
def get_classifier(self):

View File

@@ -0,0 +1,71 @@
from datetime import datetime, timedelta
from enumerations import ReplicationPackageStatusEnum
from models import CorrectingReplicationOutPackage, ReplicantInfo
from typing import List
import xml.etree.ElementTree as ET
class CorrectingReplicationService:
EVENT_TYPE: str = 'correcting_replication'
object_list_size: int = 0
deleted_objects_count: int = 0
PACKAGE_TAG_NAME: str = 'package'
PACKAGE_ID_ATTRIBUTE_NAME: str = 'pkg_id'
SERVER_VERSION_ATTRIBUTE_NAME: str = 'server_version'
SERVER_ID_ATTRIBUTE_NAME: str = 'server_id'
OBJECTS_TAG_NAME: str = 'objects'
OBJECT_TAG_NAME: str = 'object'
OBJECT_ID_ATTRIBUTE_NAME: str = 'id'
IS_RSC_OBJECT: str = 'is_rsc'
OBJECT_SOURCE_ATTRIBUTE_NAME: str = 'source'
OBJECT_VERSION_ATTRIBUTE_NAME: str = 'version'
METADATA_VERSION_ATTRIBUTE_NAME: str = 'md_version'
ACTUAL_VERSION_DATE_ATTRIBUTE_NAME: str = 'version_date'
OBJECT_MISSING_ATTRIBUTE_NAME: str = 'missing'
CLASSIFIER_VERSION_ATTRIBUTE_NAME: str = 'metadata_clientVersion'
RESULT_TAG_NAME: str = 'result'
RESULT_MESSAGE_ATTRIBUTE_NAME: str = 'result_message'
VERSION_ID_ATTRIBUTE_NAME: str = 'version_id'
VERSION_SOURCE_ATTRIBUTE_NAME: str = 'version_source'
def start_correcting_replication(self, replicant_id: str, replication_period: int, replication_timeout: int,
manual_run: bool):
replicant = ReplicantInfo()
self.start_correcting_replication(replicant, replication_period, replication_timeout, manual_run)
def start_correcting_replication(self, except_replicant_id: List[str], replication_period: int,
replication_timeout: int, manual_run: bool):
pass
def start_correcting_replication(self, replicant: ReplicantInfo, replication_period: int, replication_timeout: int,
manual_run: bool):
pass
def create_replication_package(self, replicant: ReplicantInfo, replication_period: int, replication_timeout: int) -> CorrectingReplicationOutPackage:
pkg = CorrectingReplicationOutPackage()
pkg.filter_string = replicant.filter_string
pkg.replicant_id = replicant.replicant_id
pkg.server_address = replicant.server_address
pkg.replication_period = replication_period
pkg.replication_timeout = replication_timeout
pkg.status = ReplicationPackageStatusEnum.SENT_REQUEST_TO_CHILD
date = datetime.now()
pkg.replication_date = date
if replication_period:
delta = timedelta(days=-replication_period)
pkg.from_date = date + delta
if replication_timeout:
delta = timedelta(seconds=replication_timeout)
pkg.replication_timeout_date = date + delta
return pkg
def get_package_xml(self, pkg: CorrectingReplicationOutPackage, request_uuid: str) -> str:
request_xml: ET.Element = xml_service.get_common_request_xml(request_uuid)
element = ET.SubElement(request_xml, self.PACKAGE_TAG_NAME, {
self.PACKAGE_ID_ATTRIBUTE_NAME: pkg.package_id,
self.SERVER_VERSION_ATTRIBUTE_NAME: '1.0.0',
self.SERVER_ID_ATTRIBUTE_NAME: 'ipd-server',
self.CLASSIFIER_VERSION_ATTRIBUTE_NAME: classifier.,
})
xml_service.set_request_uuid(request_xml, request_uuid)
return ET.tostring(request_xml, encoding='unicode', xml_declaration=True)

View File

@@ -0,0 +1,10 @@
from enum import Enum
class ReplicationPackageStatusEnum(Enum):
CANCELLED = -4
TIMEDOUT = -3
ERROR = -2
SENT_REQUEST_TO_CHILD = 1
SENT_PACKAGE_TO_CHILD = 2
COMPLETED = 3

View File

@@ -0,0 +1,233 @@
from enum import Enum
class Messages(Enum):
REQUEST_EXECUTED_PARTITIALY = 1
REQUEST_FAILED = 2
OBJECT_FORBIDDEN = 3
INVALID_REQUEST_USER = 4
ACTION_FORBIDDEN = 5
OBJECTS_FORBIDDEN = 6
INVALID_REPLICATION_PARAMETERS = 7
OBJECT_LIST = 11
OBJECT_LIST_ITEM = 12
MISSING_TAG = 13
NO_OBJECTS_AVAILABLE = 14
OBJECT_BASE_CELL_NOT_FOUND = 15
WRONG_VERSION_INTERVAL = 16
REQUEST_PROCESS_STARTED = 17
REQUEST_PROCESS_FINISHED = 18
USER_IS_NOT_VALID = 19
RESPONSE_DELIVERY_ERROR = 20
RESPONSE_DELIVERY_SUCCESS = 21
RESPONSE_SEND = 22
RESPONSE_SEND_ERROR = 23
DUPLICATE_CHART_NAME = 24
EXTENDED_METADATA_FORBIDDEN = 25
MAX_RESULT_COUNT_EXCEEDED = 26
MAX_RESULT_SIZE_EXCEEDED = 27
CLIENT_DISCONNECTED = 28
NO_REQUEST_DATA_PROVIDED = 29
NO_USER_ID_PROVIDER = 30
INVALID_REQUEST_DATA = 31
UNKNOWN_FILTER_ATTRIBUTE_CODE = 32
UNKNOWN_FILTER_OPERATION = 33
ARCHIVE_ACCESS_FORBIDDEN = 34
BROKEN_S57_FILE = 35
UNKNOWN_OBJECT_ID = 36
NO_FILTER_IN_REPORT = 37
UPLOAD_OBJECT_LIST = 100
UPLOAD_OBJECT_LIST_ITEM = 101
UPLOAD_WRONG_STRUCTURE = 102
FOLDER_NOT_FOUND = 103
UPLOAD_WRONG_SUBVERSION = 104
UPLOAD_MISSING_CHARTS_FILE = 105
UPLOAD_NO_CHARTS_IN_FILE = 106
UPLOAD_WRONG_CHART_TYPE = 107
UPLOAD_OBJECT_EXISTS = 108
UPLOAD_BASE_CELL_NOT_FOUND = 109
UPLOAD_WRONG_VERSION_SEQUENCE = 110
WRONG_DELETE_VERSION_NUMBER = 111
CANT_CHANGE_STAMP = 112
OBJECT_ALREADY_UPDATED = 113
OBJECT_LOCKED = 114
UPLOAD_MAIN_FILE_NOT_FOUND = 115
UPLOAD_VERSION_NUMBER_NOT_THE_SAME = 116
FROM_ADDRESS = 117
TO_ADDRESS = 118
UPLOAD_OBJECT_EXISTS_BY_SIZE_AND_CHECKSUM = 119
CORRECTING_REPLICATION_TIMED_OUT = 120
CORRECTING_REPLICATION_AUTO_STARTED = 121
CORRECTING_REPLICATION_MANUAL_STARTED = 122
CORRECTING_REPLICATION_ALREADY_STARTED = 123
CORRECTING_REPLICATION_CANCELLED = 124
REPLICATION_SENT = 125
REPLICATION_RECEIVED = 126
WRONG_OBJECT_FILE_CHECKSUM = 127
WRONG_UPLOADING_FILE_CHECKSUM = 128
WRONG_UPLOADING_FILE_SIZE = 129
CORRECTING_REPLICATION_INFO = 130
CORRECTING_REPLICATION_CLASSIFIER = 131
CORRECTING_REPLICATION_LIST_OBJECT = 132
GET_CORRECTING_REPLICATION_PACKAGE = 133
CORRECTING_REPLICATION_SIZE_LIMIT = 134
PACKAGE_INFO = 135
CORRECTING_REPLICATION_SIZE_ARCHIVE = 136
SET_CORRECTING_REPLICATION_PACKAGE = 137
CHECK_DUPLICATE = 138
CHECK_TAG = 139
DELETED_DUPLICATE = 140
STREAMING_REPLICATION_STARTED = 141
ERROR_PACKAGE_NUM = 142
STREAMING_REPLICATION_FINISHED = 143
DELETE_VERSION_STARTED = 144
DELETE_VERSION_FINISHED = 145
UPLOAD_OBJECTS_EXISTS_DIFF_CHECKSUM = 146
UPLOAD_OBJECTS_WITH_LESS_VERSION = 147
CORRECTING_REPLICATION_OBJECT_COUNTS = 148
PACKAGE_INFO_FAILED_OBJECTS = 149
PACKAGE_INFO_INCOMING_OBJECTS = 150
OBJECT_INFO_DIDNT_ADD = 151
TAG_NOT_FOUND = 200
MISSING_ATTRIBUTE = 201
DUPLICATE_TAG_ID = 202
CANT_HIDE_TAG = 203
CANT_MOVE_TAG = 204
CANT_HIDE_REGION = 205
CANT_HIDE_REGIONS = 206
CANT_HIDE_CHILD_REGION = 207
CANT_HIDE_CHILD_REGIONS = 208
WRONG_MID = 300
MAUNFACTURER_KEY_NOT_FOUND = 301
OBJECT_NOT_FOUND = 302
OBJECT_REQUESTED_FROM_PARENT_SERVER = 303
OBJECT_HAS_NO_FILES = 304
WRONG_EXPIRATION_PERIOD = 400
OBJECT_LIST_HAS_DUBLICATES = 401
ACTIVE_SUBSCRIPTION_ALREADY_EXISTS = 402
ACTIVE_SUBSCRIPTION_NOT_EXISTS = 403
WRONG_TYPE_ALL_CHARTS = 500
NO_CLASSIFIER_FILE_ON_SERVER = 600
NO_CLASSIFIER_VERSION_ON_SERVER = 601
CLASSIFIERS_VERSIONS_DIFFER = 602
WRONG_OBJECT_PARAMETER_CODE = 603
ILLEGAL_PARAMETER_VALUE = 604
ILLEGAL_PARAMETER_TYPE = 605
ILLEGAL_PARAMETER_RANGE = 606
NOT_ALL_REQUIRED_TYPES = 607
ILLEGAL_ATTRIBUTE_VALUE = 608
NOT_ALLOWED_ITEM_FOR_TYPE = 609
NO_CHART_CLASS_WITH_CODE = 610
CHART_CLASS_CONTAINS_NONEXISTED_ELEMENT = 611
CLASS_GROUP_CONTAINS_NONEXISTED_CLASS = 612
SAME_CLASSIFIER_VERSION = 614
NO_CLASSIFIER_VERSION = 615
UNKNOWN_ATTR_VAL_DATA_TYPE = 616
NOT_ALL_USING_ITEMS_IN_CLASSIFIER = 617
NO_REQIRED_CLASS_CODE_IN_CLASSIFIER = 618
REQUIRED_ADDED_TO_CHART_CLASS = 619
SET_CLASSIFIER_STARTED_AUDIT = 620
DATA_VALIDATION_STARTED_AUDIT = 621
DATA_VALIDATION_FAILED_AUDIT = 622
DATA_VALIDATION_ENDED_AUDIT = 623
SAVING_CLASSIFIER_STARTED_AUDIT = 624
SAVING_CLASSIFIER_FINISHED_AUDIT = 625
SEND_SET_CLASSIFIER_REQUEST_AUDIT = 626
GET_SET_CLASSIFIER_REQUEST_AUDIT = 627
GET_GET_CLASSIFIER_REQUEST_AUDIT = 628
IKP_USER_DECISION_TYPE = 700
IKP_FILE_STRUCTURE_CHECKER_TYPE = 701
IKP_FILE_STRUCTURE_DB_LINKS_CHECKER_TYPE = 702
IKP_DB_LINKS_FILE_STRUCTURE_CHECKER_TYPE = 703
IKP_CHECK_SUM_CHECKER_TYPE = 704
IKP_BACKUP_TO_DB_TYPE = 705
IKP_RECOVER_FROM_DB_TYPE = 706
IKP_RECOVER_FROM_BACKUP_SERVER_TYPE = 707
IKP_RECOVER_FROM_CHILD_SERVER_TYPE = 708
IKP_DB_STRUCTURE_CHECKER_TYPE = 709
IKP_DB_STRUCTURE_MISSING_COLUMN = 710
IKP_DB_STRUCTURE_WRONG_COLUMN_TYPE = 711
IKP_DB_STRUCTURE_WRONT_MAX_LENGTH = 712
IKP_DB_STRUCTURE_MISSING_TABLE = 713
IKP_NOTHING_TO_RECOVER = 714
IKP_ERROR_NOT_FIXED = 715
IKP_FULL_BACKUP_TO_DB_TYPE = 716
EXPORT_TO_FOLDER_START = 717
EXPORT_TO_FOLDER_FINISHED = 718
EXPORT_TO_FOLDER_ERROR = 719
EXPORT_TO_FOLDER_DELETE_FILE = 720
IMPORT_FROM_FOLDER_START = 721
IMPORT_FROM_FOLDER_FINISHED = 722
IMPORT_FROM_FOLDER_ERROR = 723
IMPORT_FOLDER_NOT_FOUND = 724
FILE_NOT_FOUND = 725
IMPORT_FROM_FOLDER_MERGE_ERROR = 726
FILE_NOT_FOUND_COUNTER = 727
LAST_CORRECTION_DATE_NEWER_THAN_NEW_CORRECTION = 728
CREATION_DATE_MISSING = 729
IMPORT_FROM_FOLDER_DIDNT_START = 730
EXPORT_TO_FOLDER_DIDNT_START = 731
IKP_STEP_START = 800
IKP_STEP_SUCCESS = 801
IKP_STEP_ERROR = 802
IKP_NO_CHECK_ERROR_FOUND = 803
IKP_SEND_USER_DECISION = 804
IKP_GET_USER_DECISION = 805
IKP_FILE_STRUCTURE_ERROR = 806
IKP_FILE_STRUCTURE_DB_LINKS_ERROR = 807
IKP_CHECK_SUM_ERROR = 808
IKP_DB_LINKS_FILE_STRUCTURE_ERROR = 809
IKP_DB_STRUCTURE_TABLE_COLUMN_ERROR = 810
IKP_DB_STRUCTURE_TABLE_ERROR = 811
IKP_STEP_STOPPED = 812
IKP_WRONG_FILE_ERROR = 813
IKP_TASK_RUN_COLLISION = 814
IKP_FIX_SXF_METADATA_CHECKSUM_INFO = 815
IKP_FIX_SXF_METADATA_CHECKSUM_PASSPORT_ERROR = 816
IKP_FIX_SXF_METADATA_CHECKSUM_FILE_ERROR = 817
IKP_MD_RECOVERING_STARTED = 818
IKP_MD_RECOVERING_NO_VERSION = 819
IKP_MD_RECOVERING_CREATED = 820
IKP_MD_RECOVERING_UPDATED = 821
IKP_MD_RECOVERING_SUCCEED = 822
IKP_MD_RECOVERING_FAILED = 823
IKP_CHECK_AVAILABLE_DISK_SPACE_TYPE = 825
IKP_SCRIPT_RUN = 827
IKP_SCRIPT_END_WORK_SUCCEED = 828
IKP_SCRIPT_END_WORK_FAILED = 829
IKP_SCRIPT_ALREADY_STARTED = 831
IKP_MERGE_SAME_OBJECTS_INFO = 832
IKP_MERGE_SAME_OBJECTS_SUCCESSES = 833
IKP_MERGE_SAME_OBJECTS_WARNING = 834
IKP_MERGE_SAME_OBJECTS_ERROR = 835
IKP_MERGE_SAME_OBJECTS_MERGE_TYPE_VERSIONS = 836
IKP_MERGE_SAME_OBJECTS_MERGE_TYPE_DATES = 837
RSC_CLASSIFIER_UPLOAD_STARTED = 838
RSC_CLASSIFIER_UPLOAD_ERROR = 839
RSC_CLASSIFIER_UPLOAD_FINISHED = 843
IKP_CLEAR_OUT_FOLDER_INFO = 840
IKP_CLEAR_OUT_FOLDER_SUCCESS_DELETE = 841
IKP_CLEAR_OUT_FOLDER_ERROR_DELETE = 842
SET_CHART_METADATA = 844
ERROR_WHILE_COPING_FILE = 845
ERROR_ADD_OBJECT = 848
MISSING_REGIONS_CHARTS = 849
NO_MISSING_REGIONS = 850
IKP_CLEAR_DOWNLOAD_CATALOG_WARNING = 855
IKP_CLEAR_DOWNLOAD_CATALOG_ERROR = 856
IKP_CLEAR_DOWNLOAD_CATALOG_INFO = 857
REPLICATION_PACKAGE_NOT_FOUND = 858
REPLICATION_PACKAGE_WRONG_STATUS = 859
NOT_UNIQUE_METADATA = 860
IKP_SCALE_RECOVERING_STARTED = 861
IKP_SCALE_RECOVERING_FAILED = 862
IKP_SCALE_RECOVERING_FINISHED = 863
OBJECTS_REGIONS_CHECKING_STARTED = 865
OBJECTS_REGIONS_CHECKING_FINISHED = 866
OBJECTS_REGIONS_CHECKING_FAILED = 867
BLACK_HOLE_TRANSMITTER_IS_OFF = 868
LACK_VERSIONS_IN_TIME_PERIOD = 869
ERROR_STOPPING_IKP = 870
IKP_STOPPED = 871
REPLICATION_ERROR_TEST = 872
BLACK_HOLE_NOT_PRESENT = 873

View File

@@ -0,0 +1,23 @@
from datetime import datetime
class ReplicantInfo:
server_address: str
filter_string: str
replicant_id: str
replicant_user_id: str
replicate_classifiers: bool
class CorrectingReplicationOutPackage:
package_id: int
status: int
from_date: datetime
replication_date: datetime
replication_timeout_date: datetime
end_date: datetime
replicant_id: str
server_address: str
filter_string: str
replication_period: int
replication_timeout: int

View File

@@ -0,0 +1,4 @@
class RequestProcessor:
def __init__(self):
pass

View File

@@ -0,0 +1,109 @@
import xml.etree.ElementTree as ET
from xmlrpcserver.reqs.messages import Messages
class RequestXmlService:
REQUEST_NODE_NAME: str = 'request'
HEADER_NODE_NAME: str = 'header'
RESULT_NODE_NAME: str = 'result'
REQUEST_ID_ATTRIBUTE_NAME: str = 'parcel_id'
RESPONSE_ID_ATTRIBUTE_NAME: str = 'reply_parcel_id'
SOURCE_REQUEST_ID_ATTRIBUTE_NAME: str = 'source_parcel_id'
RESULT_CODE_ATTRIBUTE_NAME: str = 'result_code'
RESULT_MESSAGE_ATTRIBUTE_NAME: str = 'result_message'
HEADER_XPATH: str = HEADER_NODE_NAME
def get_request_uuid(self, document: ET.Element) -> str:
return self.get_header_attribute(document, self.REQUEST_ID_ATTRIBUTE_NAME)
def get_response_uuid(self, document: ET.Element) -> str:
return self.get_header_attribute(document, self.RESPONSE_ID_ATTRIBUTE_NAME)
def get_source_request_uuid(self, document: ET.Element) -> str:
return self.get_header_attribute(document, self.SOURCE_REQUEST_ID_ATTRIBUTE_NAME)
def get_header_node(self, document: ET.Element) -> ET.Element:
return document.find(self.HEADER_XPATH)
def get_header_attribute(self, document: ET.Element, attribute_name: str) -> str:
header = self.get_header_node(document)
if header is None:
raise Exception(Messages.MISSING_TAG.value)
result = header.get(attribute_name)
return result.strip() if result else ''
def get_request_document(self, request_uuid: str, response_uuid) -> ET.Element:
document = ET.Element(self.REQUEST_NODE_NAME)
header = ET.SubElement(document, self.HEADER_NODE_NAME)
header.set(self.REQUEST_ID_ATTRIBUTE_NAME, request_uuid.strip())
if response_uuid:
header.set(self.RESPONSE_ID_ATTRIBUTE_NAME, response_uuid.strip())
return document
def get_common_response_xml(self, request_uuid: str, response_uuid: str, result_code: int, result_message: str) -> ET.Element:
document = self.get_request_document(response_uuid, request_uuid)
result = ET.SubElement(document, self.RESULT_NODE_NAME)
result.set(self.RESULT_CODE_ATTRIBUTE_NAME, str(result_code))
result.set(self.RESULT_MESSAGE_ATTRIBUTE_NAME, result_message)
return document
def set_result(self, document: ET.Element, result_code: int, result_message: str):
result = document.find(self.RESULT_NODE_NAME)
if result is None:
result = ET.SubElement(document, self.RESULT_NODE_NAME)
result.set(self.RESULT_CODE_ATTRIBUTE_NAME, str(result_code))
result.set(self.RESULT_MESSAGE_ATTRIBUTE_NAME, result_message)
def set_request_uuid(self, document: ET.Element, request_uuid: str):
header = self.get_header_node(document)
header.set(self.REQUEST_ID_ATTRIBUTE_NAME, request_uuid.strip())
def set_source_request_uuid(self, document: ET.Element, source_request_uuid: str):
header = self.get_header_node(document)
header.set(self.SOURCE_REQUEST_ID_ATTRIBUTE_NAME, source_request_uuid.strip())
def get_common_request_xml(self, request_uuid: str) -> ET.Element:
return self.get_request_document(request_uuid, None)
def get_response_xml(self, document: ET.Element, request_uuid, response_uuid: str, result_code: int, result_message: str) -> ET.Element:
header = document.find(self.HEADER_NODE_NAME)
header.set(self.REQUEST_ID_ATTRIBUTE_NAME, response_uuid.strip())
header.set(self.RESPONSE_ID_ATTRIBUTE_NAME, request_uuid.strip() if request_uuid else None)
result = document.find(self.RESULT_NODE_NAME)
result.set(self.RESULT_CODE_ATTRIBUTE_NAME, str(result_code))
result.set(self.RESULT_MESSAGE_ATTRIBUTE_NAME, result_message)
def get_element(self, document: ET.Element, node: ET.Element, name: str) -> ET.Element:
for child in node:
if child.tag.casefold() == name.casefold():
return child
return ET.SubElement(document, name)
def validate_common_request_xml(self, xml: str):
if not xml:
raise Exception(Messages.NO_REQUEST_DATA_PROVIDED.name)
try:
document = ET.parse(xml)
except:
raise Exception(Messages.INVALID_REQUEST_DATA)
self.validate_common_request_xml(document)
def validate_common_request_xml(self, document):
if not document:
raise Exception(Messages.NO_REQUEST_DATA_PROVIDED.name)
if document.tag != self.REQUEST_NODE_NAME:
raise Exception(Messages.MISSING_TAG.name, self.REQUEST_NODE_NAME)
try:
request_uuid = self.get_header_attribute(document, self.REQUEST_ID_ATTRIBUTE_NAME)
except:
raise Exception(Messages.INVALID_REQUEST_DATA)
if not request_uuid:
raise Exception(Messages.MISSING_ATTRIBUTE, self.REQUEST_ID_ATTRIBUTE_NAME, self.HEADER_NODE_NAME)
def get_result_code(self, document: ET.Element):
result = self.get_element(document, document, self.RESULT_NODE_NAME)
if not result:
return None
return result.get(self.RESULT_CODE_ATTRIBUTE_NAME)