88 lines
3.0 KiB
Python
88 lines
3.0 KiB
Python
# Copyright 2018 Google LLC
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import re
|
|
|
|
from .. import dsl
|
|
|
|
|
|
def sanitize_k8s_name(name, allow_capital_underscore=False):
|
|
"""From _make_kubernetes_name
|
|
sanitize_k8s_name cleans and converts the names in the workflow.
|
|
|
|
Args:
|
|
name: original name,
|
|
allow_capital_underscore: whether to allow capital letter and underscore
|
|
in this name.
|
|
|
|
Returns:
|
|
sanitized name.
|
|
"""
|
|
if allow_capital_underscore:
|
|
return re.sub('-+', '-', re.sub('[^-_0-9A-Za-z]+', '-', name)).lstrip('-').rstrip('-')
|
|
else:
|
|
return re.sub('-+', '-', re.sub('[^-0-9a-z]+', '-', name.lower())).lstrip('-').rstrip('-')
|
|
|
|
|
|
def convert_k8s_obj_to_json(k8s_obj):
|
|
"""
|
|
Builds a JSON K8s object.
|
|
|
|
If obj is None, return None.
|
|
If obj is str, int, long, float, bool, return directly.
|
|
If obj is datetime.datetime, datetime.date
|
|
convert to string in iso8601 format.
|
|
If obj is list, sanitize each element in the list.
|
|
If obj is dict, return the dict.
|
|
If obj is swagger model, return the properties dict.
|
|
|
|
Args:
|
|
obj: The data to serialize.
|
|
Returns: The serialized form of data.
|
|
"""
|
|
|
|
from six import text_type, integer_types, iteritems
|
|
PRIMITIVE_TYPES = (float, bool, bytes, text_type) + integer_types
|
|
from datetime import date, datetime
|
|
if k8s_obj is None:
|
|
return None
|
|
elif isinstance(k8s_obj, PRIMITIVE_TYPES):
|
|
return k8s_obj
|
|
elif isinstance(k8s_obj, list):
|
|
return [convert_k8s_obj_to_json(sub_obj)
|
|
for sub_obj in k8s_obj]
|
|
elif isinstance(k8s_obj, tuple):
|
|
return tuple(convert_k8s_obj_to_json(sub_obj)
|
|
for sub_obj in k8s_obj)
|
|
elif isinstance(k8s_obj, (datetime, date)):
|
|
return k8s_obj.isoformat()
|
|
elif isinstance(k8s_obj, dsl.PipelineParam):
|
|
if isinstance(k8s_obj.value, str):
|
|
return k8s_obj.value
|
|
return '{{inputs.parameters.%s}}' % k8s_obj.full_name
|
|
|
|
if isinstance(k8s_obj, dict):
|
|
obj_dict = k8s_obj
|
|
else:
|
|
# Convert model obj to dict except
|
|
# attributes `swagger_types`, `attribute_map`
|
|
# and attributes which value is not None.
|
|
# Convert attribute name to json key in
|
|
# model definition for request.
|
|
obj_dict = {k8s_obj.attribute_map[attr]: getattr(k8s_obj, attr)
|
|
for attr in k8s_obj.attribute_map
|
|
if getattr(k8s_obj, attr) is not None}
|
|
|
|
return {key: convert_k8s_obj_to_json(val)
|
|
for key, val in iteritems(obj_dict)} |