Browse Source

remove redundant code in lineagemgr

tags/v1.1.0
luopengting 5 years ago
parent
commit
f67e68897a
8 changed files with 156 additions and 263 deletions
  1. +1
    -28
      mindinsight/lineagemgr/common/utils.py
  2. +2
    -26
      mindinsight/lineagemgr/common/validator/model_parameter.py
  3. +0
    -194
      mindinsight/lineagemgr/common/validator/validate.py
  4. +1
    -0
      mindinsight/lineagemgr/summary/_summary_adapter.py
  5. +1
    -0
      tests/st/func/lineagemgr/collection/model/__init__.py
  6. +3
    -7
      tests/st/func/lineagemgr/collection/model/test_model_lineage.py
  7. +3
    -8
      tests/utils/lineage_writer/model_lineage.py
  8. +145
    -0
      tests/utils/lineage_writer/utils.py

+ 1
- 28
mindinsight/lineagemgr/common/utils.py View File

@@ -13,15 +13,13 @@
# limitations under the License. # limitations under the License.
# ============================================================================ # ============================================================================
"""Lineage utils.""" """Lineage utils."""
import os
import re import re


from mindinsight.datavisual.data_transform.summary_watcher import SummaryWatcher from mindinsight.datavisual.data_transform.summary_watcher import SummaryWatcher
from mindinsight.lineagemgr.common.exceptions.exceptions import LineageParamTypeError
from mindinsight.lineagemgr.common.log import logger as log




def enum_to_list(enum): def enum_to_list(enum):
"""Enum to list."""
return [enum_ele.value for enum_ele in enum] return [enum_ele.value for enum_ele in enum]




@@ -29,28 +27,3 @@ def get_timestamp(filename):
"""Get timestamp from filename.""" """Get timestamp from filename."""
timestamp = int(re.search(SummaryWatcher().SUMMARY_FILENAME_REGEX, filename)[1]) timestamp = int(re.search(SummaryWatcher().SUMMARY_FILENAME_REGEX, filename)[1])
return timestamp return timestamp


def make_directory(path):
"""Make directory."""
if path is None or not isinstance(path, str) or not path.strip():
log.error("Invalid input path: %r.", path)
raise LineageParamTypeError("Invalid path type")

# convert relative path to abs path
path = os.path.realpath(path)
log.debug("The abs path is %r", path)

# check path exist and its write permissions]
if os.path.exists(path):
real_path = path
else:
# All exceptions need to be caught because create directory maybe have some limit(permissions)
log.debug("The directory(%s) doesn't exist, will create it", path)
try:
os.makedirs(path, exist_ok=True)
real_path = path
except PermissionError as err:
log.error("No write permission on the directory(%r), error = %r", path, err)
raise LineageParamTypeError("No write permission on the directory.")
return real_path

+ 2
- 26
mindinsight/lineagemgr/common/validator/model_parameter.py View File

@@ -15,37 +15,13 @@
"""Define schema of model lineage input parameters.""" """Define schema of model lineage input parameters."""
from marshmallow import Schema, fields, ValidationError, pre_load, validates from marshmallow import Schema, fields, ValidationError, pre_load, validates


from mindinsight.lineagemgr.common.exceptions.error_code import LineageErrorMsg, \
LineageErrors
from mindinsight.lineagemgr.common.exceptions.exceptions import \
LineageParamTypeError, LineageParamValueError
from mindinsight.lineagemgr.common.log import logger
from mindinsight.lineagemgr.common.exceptions.error_code import LineageErrorMsg, LineageErrors
from mindinsight.lineagemgr.common.exceptions.exceptions import LineageParamTypeError, LineageParamValueError
from mindinsight.lineagemgr.common.utils import enum_to_list from mindinsight.lineagemgr.common.utils import enum_to_list
from mindinsight.lineagemgr.querier.querier import LineageType from mindinsight.lineagemgr.querier.querier import LineageType
from mindinsight.lineagemgr.querier.query_model import FIELD_MAPPING from mindinsight.lineagemgr.querier.query_model import FIELD_MAPPING
from mindinsight.utils.exceptions import MindInsightException from mindinsight.utils.exceptions import MindInsightException


try:
from mindspore.dataset.engine import Dataset
except (ImportError, ModuleNotFoundError):
logger.error('MindSpore Not Found!')



class EvalParameter(Schema):
"""Define the parameter schema for Evaluation job."""
valid_dataset = fields.Function(allow_none=True)
metrics = fields.Dict(allow_none=True)

@pre_load
def check_valid_dataset(self, data, **kwargs):
valid_dataset = data.get("valid_dataset")
if valid_dataset and not isinstance(valid_dataset, Dataset):
raise ValidationError({'valid_dataset': [
"Parameter valid_dataset must be an instance of "
"mindspore.dataengine.datasets.Dataset"]})
return data



class SearchModelConditionParameter(Schema): class SearchModelConditionParameter(Schema):
"""Define the search model condition parameter schema.""" """Define the search model condition parameter schema."""


+ 0
- 194
mindinsight/lineagemgr/common/validator/validate.py View File

@@ -13,34 +13,12 @@
# limitations under the License. # limitations under the License.
# ============================================================================ # ============================================================================
"""Validate the parameters.""" """Validate the parameters."""
import re
from marshmallow import ValidationError

from mindinsight.lineagemgr.common.exceptions.error_code import LineageErrors, LineageErrorMsg from mindinsight.lineagemgr.common.exceptions.error_code import LineageErrors, LineageErrorMsg
from mindinsight.lineagemgr.common.exceptions.exceptions import LineageParamTypeError, LineageParamValueError from mindinsight.lineagemgr.common.exceptions.exceptions import LineageParamTypeError, LineageParamValueError
from mindinsight.lineagemgr.common.log import logger as log from mindinsight.lineagemgr.common.log import logger as log
from mindinsight.lineagemgr.common.validator.validate_path import safe_normalize_path
from mindinsight.lineagemgr.querier.query_model import FIELD_MAPPING from mindinsight.lineagemgr.querier.query_model import FIELD_MAPPING
from mindinsight.utils.exceptions import MindInsightException, ParamValueError from mindinsight.utils.exceptions import MindInsightException, ParamValueError



# Named string regular expression
_name_re = r"^\w+[0-9a-zA-Z\_\.]*$"

TRAIN_RUN_CONTEXT_ERROR_MAPPING = {
'optimizer': LineageErrors.PARAM_OPTIMIZER_ERROR,
'loss_fn': LineageErrors.PARAM_LOSS_FN_ERROR,
'net_outputs': LineageErrors.PARAM_NET_OUTPUTS_ERROR,
'train_network': LineageErrors.PARAM_TRAIN_NETWORK_ERROR,
'train_dataset': LineageErrors.PARAM_DATASET_ERROR,
'epoch_num': LineageErrors.PARAM_EPOCH_NUM_ERROR,
'batch_num': LineageErrors.PARAM_BATCH_NUM_ERROR,
'parallel_mode': LineageErrors.PARAM_TRAIN_PARALLEL_ERROR,
'device_number': LineageErrors.PARAM_DEVICE_NUMBER_ERROR,
'list_callback': LineageErrors.PARAM_CALLBACK_LIST_ERROR,
'train_dataset_size': LineageErrors.PARAM_DATASET_SIZE_ERROR,
}

SEARCH_MODEL_ERROR_MAPPING = { SEARCH_MODEL_ERROR_MAPPING = {
'summary_dir': LineageErrors.LINEAGE_PARAM_SUMMARY_DIR_ERROR, 'summary_dir': LineageErrors.LINEAGE_PARAM_SUMMARY_DIR_ERROR,
'loss_function': LineageErrors.LINEAGE_PARAM_LOSS_FUNCTION_ERROR, 'loss_function': LineageErrors.LINEAGE_PARAM_LOSS_FUNCTION_ERROR,
@@ -64,19 +42,6 @@ SEARCH_MODEL_ERROR_MAPPING = {
'lineage_type': LineageErrors.LINEAGE_PARAM_LINEAGE_TYPE_ERROR 'lineage_type': LineageErrors.LINEAGE_PARAM_LINEAGE_TYPE_ERROR
} }



TRAIN_RUN_CONTEXT_ERROR_MSG_MAPPING = {
'optimizer': LineageErrorMsg.PARAM_OPTIMIZER_ERROR.value,
'loss_fn': LineageErrorMsg.PARAM_LOSS_FN_ERROR.value,
'net_outputs': LineageErrorMsg.PARAM_NET_OUTPUTS_ERROR.value,
'train_network': LineageErrorMsg.PARAM_TRAIN_NETWORK_ERROR.value,
'epoch_num': LineageErrorMsg.PARAM_EPOCH_NUM_ERROR.value,
'batch_num': LineageErrorMsg.PARAM_BATCH_NUM_ERROR.value,
'parallel_mode': LineageErrorMsg.PARAM_TRAIN_PARALLEL_ERROR.value,
'device_number': LineageErrorMsg.PARAM_DEVICE_NUMBER_ERROR.value,
'list_callback': LineageErrorMsg.PARAM_CALLBACK_LIST_ERROR.value
}

SEARCH_MODEL_ERROR_MSG_MAPPING = { SEARCH_MODEL_ERROR_MSG_MAPPING = {
'summary_dir': LineageErrorMsg.LINEAGE_PARAM_SUMMARY_DIR_ERROR.value, 'summary_dir': LineageErrorMsg.LINEAGE_PARAM_SUMMARY_DIR_ERROR.value,
'loss_function': LineageErrorMsg.LINEAGE_LOSS_FUNCTION_ERROR.value, 'loss_function': LineageErrorMsg.LINEAGE_LOSS_FUNCTION_ERROR.value,
@@ -101,84 +66,6 @@ SEARCH_MODEL_ERROR_MSG_MAPPING = {
} }




EVAL_RUN_CONTEXT_ERROR_MAPPING = {
'valid_dataset': LineageErrors.PARAM_DATASET_ERROR,
'metrics': LineageErrors.PARAM_EVAL_METRICS_ERROR
}

EVAL_RUN_CONTEXT_ERROR_MSG_MAPPING = {
'metrics': LineageErrorMsg.PARAM_EVAL_METRICS_ERROR.value,
}


def validate_int_params(int_param, param_name):
"""
Verify the parameter which type is integer valid or not.

Args:
int_param (int): parameter that is integer,
including epoch, dataset_batch_size, step_num
param_name (str): the name of parameter,
including epoch, dataset_batch_size, step_num

Raises:
MindInsightException: If the parameters are invalid.
"""
if not isinstance(int_param, int) or int_param <= 0 or int_param > pow(2, 63) - 1:
if param_name == 'step_num':
log.error('Invalid step_num. The step number should be a positive integer.')
raise MindInsightException(error=LineageErrors.PARAM_STEP_NUM_ERROR,
message=LineageErrorMsg.PARAM_STEP_NUM_ERROR.value)

if param_name == 'dataset_batch_size':
log.error('Invalid dataset_batch_size. '
'The batch size should be a positive integer.')
raise MindInsightException(error=LineageErrors.PARAM_BATCH_SIZE_ERROR,
message=LineageErrorMsg.PARAM_BATCH_SIZE_ERROR.value)


def validate_file_path(file_path, allow_empty=False):
"""
Verify that the file_path is valid.

Args:
file_path (str): Input file path.
allow_empty (bool): Whether file_path can be empty.

Raises:
MindInsightException: If the parameters are invalid.
"""
try:
if allow_empty and not file_path:
return file_path
return safe_normalize_path(file_path, raise_key='dataset_path', safe_prefixes=None)
except ValidationError as error:
log.error(str(error))
raise MindInsightException(error=LineageErrors.PARAM_FILE_PATH_ERROR,
message=str(error))


def validate_eval_run_context(schema, data):
"""
Validate mindspore evaluation job run_context data according to schema.

Args:
schema (Schema): data schema.
data (dict): data to check schema.

Raises:
MindInsightException: If the parameters are invalid.
"""
errors = schema().validate(data)
for error_key, error_msg in errors.items():
if error_key in EVAL_RUN_CONTEXT_ERROR_MAPPING.keys():
error_code = EVAL_RUN_CONTEXT_ERROR_MAPPING.get(error_key)
if EVAL_RUN_CONTEXT_ERROR_MSG_MAPPING.get(error_key):
error_msg = EVAL_RUN_CONTEXT_ERROR_MSG_MAPPING.get(error_key)
log.error(error_msg)
raise MindInsightException(error=error_code, message=error_msg)


def validate_search_model_condition(schema, data): def validate_search_model_condition(schema, data):
""" """
Validate search model condition. Validate search model condition.
@@ -203,25 +90,6 @@ def validate_search_model_condition(schema, data):
raise MindInsightException(error=error_code, message=error_msg) raise MindInsightException(error=error_code, message=error_msg)




def validate_raise_exception(raise_exception):
"""
Validate raise_exception.

Args:
raise_exception (bool): decide raise exception or not,
if True, raise exception; else, catch exception and continue.

Raises:
MindInsightException: If the parameters are invalid.
"""
if not isinstance(raise_exception, bool):
log.error("Invalid raise_exception. It should be True or False.")
raise MindInsightException(
error=LineageErrors.PARAM_RAISE_EXCEPTION_ERROR,
message=LineageErrorMsg.PARAM_RAISE_EXCEPTION_ERROR.value
)


def validate_condition(search_condition): def validate_condition(search_condition):
""" """
Verify the param in search_condition is valid or not. Verify the param in search_condition is valid or not.
@@ -276,44 +144,6 @@ def validate_condition(search_condition):
raise LineageParamValueError(err_msg) raise LineageParamValueError(err_msg)




def validate_user_defined_info(user_defined_info):
"""
Validate user defined info, delete the item if its key is in lineage.

Args:
user_defined_info (dict): The user defined info.

Raises:
LineageParamTypeError: If the type of parameters is invalid.
LineageParamValueError: If user defined keys have been defined in lineage.

"""
if not isinstance(user_defined_info, dict):
log.error("Invalid user defined info. It should be a dict.")
raise LineageParamTypeError("Invalid user defined info. It should be dict.")
for key, value in user_defined_info.items():
if not isinstance(key, str):
error_msg = "Dict key type {} is not supported in user defined info." \
"Only str is permitted now.".format(type(key))
log.error(error_msg)
raise LineageParamTypeError(error_msg)
if not isinstance(value, (int, str, float)):
error_msg = "Dict value type {} is not supported in user defined info." \
"Only str, int and float are permitted now.".format(type(value))
log.error(error_msg)
raise LineageParamTypeError(error_msg)

field_map = set(FIELD_MAPPING.keys())
user_defined_keys = set(user_defined_info.keys())
insertion = list(field_map & user_defined_keys)

if insertion:
for key in insertion:
user_defined_info.pop(key)
raise LineageParamValueError("There are some keys have defined in lineage. "
"Duplicated key(s): %s. " % insertion)


def validate_train_id(relative_path): def validate_train_id(relative_path):
""" """
Check if train_id is valid. Check if train_id is valid.
@@ -385,27 +215,3 @@ def validate_added_info(added_info: dict):
raise LineageParamValueError("'remark' must be str.") raise LineageParamValueError("'remark' must be str.")
# length of remark should be in [0, 128]. # length of remark should be in [0, 128].
validate_range("length of remark", len(value), min_value=0, max_value=128) validate_range("length of remark", len(value), min_value=0, max_value=128)


def validate_str_by_regular(target, reg=None, flag=re.ASCII):
"""
Validate string by given regular.

Args:
target: target string.
reg: pattern.
flag: pattern mode.

Raises:
LineageParamValueError, if string not match given pattern.

Returns:
bool, if target matches pattern, return True.

"""
if reg is None:
reg = _name_re
if re.match(reg, target, flag) is None:
raise LineageParamValueError("'{}' is illegal, it should be match "
"regular'{}' by flags'{}'".format(target, reg, flag))
return True

+ 1
- 0
mindinsight/lineagemgr/summary/_summary_adapter.py View File

@@ -14,6 +14,7 @@
# ============================================================================ # ============================================================================
"""The converter between proto format event of lineage and dict.""" """The converter between proto format event of lineage and dict."""



def organize_graph(graph_message): def organize_graph(graph_message):
""" """
Convert a dataset graph to its dict format. Convert a dataset graph to its dict format.


+ 1
- 0
tests/st/func/lineagemgr/collection/model/__init__.py View File

@@ -12,3 +12,4 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# ============================================================================ # ============================================================================
"""Lineage collection."""

+ 3
- 7
tests/st/func/lineagemgr/collection/model/test_model_lineage.py View File

@@ -28,8 +28,6 @@ from unittest import TestCase, mock
import numpy as np import numpy as np
import pytest import pytest
from mindinsight.lineagemgr.model import filter_summary_lineage from mindinsight.lineagemgr.model import filter_summary_lineage
from mindinsight.lineagemgr.common.exceptions.error_code import LineageErrors
from mindinsight.utils.exceptions import MindInsightException


from mindspore.application.model_zoo.resnet import ResNet from mindspore.application.model_zoo.resnet import ResNet
from mindspore.common.tensor import Tensor from mindspore.common.tensor import Tensor
@@ -213,14 +211,12 @@ class TestModelLineage(TestCase):
@pytest.mark.platform_x86_ascend_training @pytest.mark.platform_x86_ascend_training
@pytest.mark.platform_x86_cpu @pytest.mark.platform_x86_cpu
@pytest.mark.env_single @pytest.mark.env_single
@mock.patch('tests.utils.lineage_writer.model_lineage.validate_eval_run_context')
@mock.patch.object(AnalyzeObject, 'get_file_size', return_value=64)
def test_raise_exception_record_trainlineage(self, *args):
@mock.patch.object(AnalyzeObject, 'get_file_size')
def test_raise_exception_record_trainlineage(self, mock_analyze):
"""Test exception when error happened after recording training infos.""" """Test exception when error happened after recording training infos."""
mock_analyze.return_value = 64
if os.path.exists(SUMMARY_DIR_3): if os.path.exists(SUMMARY_DIR_3):
shutil.rmtree(SUMMARY_DIR_3) shutil.rmtree(SUMMARY_DIR_3)
args[1].side_effect = MindInsightException(error=LineageErrors.PARAM_RUN_CONTEXT_ERROR,
message="RunContext error.")
train_callback = TrainLineage(SUMMARY_DIR_3, True) train_callback = TrainLineage(SUMMARY_DIR_3, True)
train_callback.begin(RunContext(self.run_context)) train_callback.begin(RunContext(self.run_context))
full_file_name = train_callback.lineage_summary.lineage_log_path full_file_name = train_callback.lineage_summary.lineage_log_path


+ 3
- 8
tests/utils/lineage_writer/model_lineage.py View File

@@ -19,17 +19,13 @@ import os
import numpy as np import numpy as np
from mindinsight.lineagemgr.common.exceptions.error_code import LineageErrorMsg, LineageErrors from mindinsight.lineagemgr.common.exceptions.error_code import LineageErrorMsg, LineageErrors
from mindinsight.lineagemgr.common.log import logger as log from mindinsight.lineagemgr.common.log import logger as log
from mindinsight.lineagemgr.common.utils import make_directory
from mindinsight.lineagemgr.common.validator.model_parameter import EvalParameter
from mindinsight.lineagemgr.common.validator.validate import (validate_eval_run_context, validate_file_path,
validate_int_params,
validate_raise_exception,
validate_user_defined_info)
from mindinsight.utils.exceptions import MindInsightException from mindinsight.utils.exceptions import MindInsightException


from ._summary_record import LineageSummary from ._summary_record import LineageSummary
from .base import Metadata from .base import Metadata
from .utils import try_except, LineageParamRunContextError, LineageGetModelFileError, LineageLogError
from .utils import try_except, LineageParamRunContextError, LineageGetModelFileError, LineageLogError, \
validate_int_params, validate_file_path, validate_raise_exception, \
validate_user_defined_info, make_directory


try: try:
from mindspore.common.tensor import Tensor from mindspore.common.tensor import Tensor
@@ -308,7 +304,6 @@ class EvalLineage(Callback):
raise LineageParamRunContextError(error_msg) raise LineageParamRunContextError(error_msg)


run_context_args = run_context.original_args() run_context_args = run_context.original_args()
validate_eval_run_context(EvalParameter, run_context_args)


valid_dataset = run_context_args.get('valid_dataset') valid_dataset = run_context_args.get('valid_dataset')




+ 145
- 0
tests/utils/lineage_writer/utils.py View File

@@ -13,9 +13,16 @@
# limitations under the License. # limitations under the License.
# ============================================================================ # ============================================================================
"""Lineage writer utils.""" """Lineage writer utils."""
import os
from functools import wraps from functools import wraps


from marshmallow import ValidationError

from mindinsight.lineagemgr.common.exceptions.error_code import LineageErrors, LineageErrorMsg from mindinsight.lineagemgr.common.exceptions.error_code import LineageErrors, LineageErrorMsg
from mindinsight.lineagemgr.common.exceptions.exceptions import LineageParamTypeError, LineageParamValueError
from mindinsight.lineagemgr.common.log import logger as log
from mindinsight.lineagemgr.common.validator.validate_path import safe_normalize_path
from mindinsight.lineagemgr.querier.query_model import FIELD_MAPPING
from mindinsight.utils.exceptions import MindInsightException from mindinsight.utils.exceptions import MindInsightException




@@ -81,3 +88,141 @@ def try_except(logger):


return wrapper return wrapper
return try_except_decorate return try_except_decorate


def validate_int_params(int_param, param_name):
"""
Verify the parameter which type is integer valid or not.

Args:
int_param (int): parameter that is integer,
including epoch, dataset_batch_size, step_num
param_name (str): the name of parameter,
including epoch, dataset_batch_size, step_num

Raises:
MindInsightException: If the parameters are invalid.
"""
if not isinstance(int_param, int) or int_param <= 0 or int_param > pow(2, 63) - 1:
if param_name == 'step_num':
log.error('Invalid step_num. The step number should be a positive integer.')
raise MindInsightException(error=LineageErrors.PARAM_STEP_NUM_ERROR,
message=LineageErrorMsg.PARAM_STEP_NUM_ERROR.value)

if param_name == 'dataset_batch_size':
log.error('Invalid dataset_batch_size. '
'The batch size should be a positive integer.')
raise MindInsightException(error=LineageErrors.PARAM_BATCH_SIZE_ERROR,
message=LineageErrorMsg.PARAM_BATCH_SIZE_ERROR.value)


def validate_file_path(file_path, allow_empty=False):
"""
Verify that the file_path is valid.

Args:
file_path (str): Input file path.
allow_empty (bool): Whether file_path can be empty.

Raises:
MindInsightException: If the parameters are invalid.
"""
try:
if allow_empty and not file_path:
return file_path
return safe_normalize_path(file_path, raise_key='dataset_path', safe_prefixes=None)
except ValidationError as error:
log.error(str(error))
raise MindInsightException(error=LineageErrors.PARAM_FILE_PATH_ERROR,
message=str(error))


EVAL_RUN_CONTEXT_ERROR_MSG_MAPPING = {
'metrics': LineageErrorMsg.PARAM_EVAL_METRICS_ERROR.value,
}
EVAL_RUN_CONTEXT_ERROR_MAPPING = {
'valid_dataset': LineageErrors.PARAM_DATASET_ERROR,
'metrics': LineageErrors.PARAM_EVAL_METRICS_ERROR
}


def validate_raise_exception(raise_exception):
"""
Validate raise_exception.

Args:
raise_exception (bool): decide raise exception or not,
if True, raise exception; else, catch exception and continue.

Raises:
MindInsightException: If the parameters are invalid.
"""
if not isinstance(raise_exception, bool):
log.error("Invalid raise_exception. It should be True or False.")
raise MindInsightException(
error=LineageErrors.PARAM_RAISE_EXCEPTION_ERROR,
message=LineageErrorMsg.PARAM_RAISE_EXCEPTION_ERROR.value
)


def validate_user_defined_info(user_defined_info):
"""
Validate user defined info, delete the item if its key is in lineage.

Args:
user_defined_info (dict): The user defined info.

Raises:
LineageParamTypeError: If the type of parameters is invalid.
LineageParamValueError: If user defined keys have been defined in lineage.

"""
if not isinstance(user_defined_info, dict):
log.error("Invalid user defined info. It should be a dict.")
raise LineageParamTypeError("Invalid user defined info. It should be dict.")
for key, value in user_defined_info.items():
if not isinstance(key, str):
error_msg = "Dict key type {} is not supported in user defined info." \
"Only str is permitted now.".format(type(key))
log.error(error_msg)
raise LineageParamTypeError(error_msg)
if not isinstance(value, (int, str, float)):
error_msg = "Dict value type {} is not supported in user defined info." \
"Only str, int and float are permitted now.".format(type(value))
log.error(error_msg)
raise LineageParamTypeError(error_msg)

field_map = set(FIELD_MAPPING.keys())
user_defined_keys = set(user_defined_info.keys())
insertion = list(field_map & user_defined_keys)

if insertion:
for key in insertion:
user_defined_info.pop(key)
raise LineageParamValueError("There are some keys have defined in lineage. "
"Duplicated key(s): %s. " % insertion)


def make_directory(path):
"""Make directory."""
if path is None or not isinstance(path, str) or not path.strip():
log.error("Invalid input path: %r.", path)
raise LineageParamTypeError("Invalid path type")

# convert relative path to abs path
path = os.path.realpath(path)
log.debug("The abs path is %r", path)

# check path exist and its write permissions]
if os.path.exists(path):
real_path = path
else:
# All exceptions need to be caught because create directory maybe have some limit(permissions)
log.debug("The directory(%s) doesn't exist, will create it", path)
try:
os.makedirs(path, exist_ok=True)
real_path = path
except PermissionError as err:
log.error("No write permission on the directory(%r), error = %r", path, err)
raise LineageParamTypeError("No write permission on the directory.")
return real_path

Loading…
Cancel
Save