Skip to content

Commit

Permalink
Make unit tests run with Python 3.5 (kubeflow#210)
Browse files Browse the repository at this point in the history
  • Loading branch information
ckadner authored Jul 6, 2020
1 parent 6a60696 commit cfdc996
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 26 deletions.
8 changes: 8 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@

matrix:
include:
- name: "Unit tests, Python 3.5"
language: python
python: "3.5"
env: TOXENV=py35
install:
- python3 -m pip install -e sdk/python
script:
- make unit_test
- name: "Unit tests, Python 3.6"
language: python
python: "3.6"
Expand Down
6 changes: 3 additions & 3 deletions sdk/python/kfp_tekton/compiler/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ def _create_pipeline_workflow(self, args, pipeline, op_transformers=None, pipeli
for arg in args:
param = {'name': arg.name}
if arg.value is not None:
if isinstance(arg.value, (list, tuple)):
if isinstance(arg.value, (list, tuple, dict)):
param['default'] = json.dumps(arg.value, sort_keys=True)
else:
param['default'] = str(arg.value)
Expand Down Expand Up @@ -478,8 +478,8 @@ def _create_pipeline_workflow(self, args, pipeline, op_transformers=None, pipeli
'name': sanitize_k8s_name(pipeline.name or 'Pipeline', suffix_space=4),
'labels': get_default_telemetry_labels(),
'annotations': {
'tekton.dev/output_artifacts': json.dumps(self.output_artifacts),
'tekton.dev/input_artifacts': json.dumps(self.input_artifacts),
'tekton.dev/output_artifacts': json.dumps(self.output_artifacts, sort_keys=True),
'tekton.dev/input_artifacts': json.dumps(self.input_artifacts, sort_keys=True),
'sidecar.istio.io/inject': 'false' # disable Istio inject since Tekton cannot run with Istio sidecar
}
},
Expand Down
31 changes: 28 additions & 3 deletions sdk/python/tests/compiler/compiler_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,17 @@
# See the License for the specific language governing permissions and
# limitations under the License.

import json
import logging
import os
import re
import shutil
import sys
import tempfile
import textwrap
import unittest
import yaml

from os import environ as env

from kfp_tekton import compiler
Expand Down Expand Up @@ -230,8 +233,14 @@ def test_katib_workflow(self):
"""
Test compiling a katib workflow.
"""
from .testdata.katib import mnist_hpo
self._test_pipeline_workflow(mnist_hpo, 'katib.yaml')
# dictionaries and lists do not preserve insertion order before Python 3.6.
# katib.py uses (string-serialized) dictionaries containing dsl.PipelineParam objects
# which can't be JSON-serialized so using json.dumps(sorted) is not an alternative
if sys.version_info < (3, 6, 0):
logging.warning("Skipping katib workflow test for Python version < 3.6.0")
else:
from .testdata.katib import mnist_hpo
self._test_pipeline_workflow(mnist_hpo, 'katib.yaml')

def test_load_from_yaml_workflow(self):
"""
Expand Down Expand Up @@ -352,4 +361,20 @@ def _verify_compiled_workflow(self, golden_yaml_file, compiled_workflow):
with open(golden_yaml_file, 'r') as f:
golden = yaml.safe_load(f)
self.maxDiff = None
self.assertEqual(golden, compiled_workflow)

# sort dicts and lists, insertion order was not guaranteed before Python 3.6
if sys.version_info < (3, 6, 0):
def sort_items(obj):
from collections import OrderedDict
if isinstance(obj, dict):
return OrderedDict({k: sort_items(v) for k, v in sorted(obj.items())})
elif isinstance(obj, list):
return sorted([sort_items(o) for o in obj], key=lambda x: str(x))
else:
return obj
golden = sort_items(golden)
compiled_workflow = sort_items(compiled_workflow)

self.assertEqual(golden, compiled_workflow,
msg="\n===[ " + golden_yaml_file.split(os.path.sep)[-1] + " ]===\n"
+ json.dumps(compiled_workflow, indent=2))
12 changes: 6 additions & 6 deletions sdk/python/tests/compiler/k8s_helper_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,13 +66,13 @@ def test_sanitize_k8s_labels(self):
"My-other-hobbies": "eating-drinking.-sleeping"
}
self.assertEqual(
list(map(lambda k: sanitize_k8s_name(k, allow_capital_underscore=True, allow_dot=True,
allow_slash=True, max_length=253), labels.keys())),
list(expected_labels.keys()))
sorted(map(lambda k: sanitize_k8s_name(k, allow_capital_underscore=True, allow_dot=True,
allow_slash=True, max_length=253), labels.keys())),
sorted(expected_labels.keys()))
self.assertEqual(
list(map(lambda v: sanitize_k8s_name(v, allow_capital_underscore=True, allow_dot=True,
allow_slash=False, max_length=63), labels.values())),
list(expected_labels.values()))
sorted(map(lambda v: sanitize_k8s_name(v, allow_capital_underscore=True, allow_dot=True,
allow_slash=False, max_length=63), labels.values())),
sorted(expected_labels.values()))

def test_sanitize_k8s_annotations(self):
annotation_keys = {
Expand Down
22 changes: 11 additions & 11 deletions sdk/python/tests/compiler/testdata/big_data_passing.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,21 @@ metadata:
annotations:
pipelines.kubeflow.org/pipeline_spec: '{"name": "File passing pipelines"}'
sidecar.istio.io/inject: 'false'
tekton.dev/input_artifacts: '{"print-text": [{"name": "repeat-line-output_text",
"parent_task": "repeat-line"}], "print-text-2": [{"name": "split-text-lines-odd_lines",
"parent_task": "split-text-lines"}], "print-text-3": [{"name": "split-text-lines-even_lines",
tekton.dev/input_artifacts: '{"print-params": [{"name": "gen-params-output", "parent_task":
"gen-params"}], "print-text": [{"name": "repeat-line-output_text", "parent_task":
"repeat-line"}], "print-text-2": [{"name": "split-text-lines-odd_lines", "parent_task":
"split-text-lines"}], "print-text-3": [{"name": "split-text-lines-even_lines",
"parent_task": "split-text-lines"}], "print-text-4": [{"name": "write-numbers-numbers",
"parent_task": "write-numbers"}], "sum-numbers": [{"name": "write-numbers-numbers",
"parent_task": "write-numbers"}], "print-text-5": [{"name": "sum-numbers-output",
"parent_task": "sum-numbers"}], "print-params": [{"name": "gen-params-output",
"parent_task": "gen-params"}]}'
tekton.dev/output_artifacts: '{"repeat-line": [{"name": "repeat-line-output_text",
"parent_task": "sum-numbers"}], "sum-numbers": [{"name": "write-numbers-numbers",
"parent_task": "write-numbers"}]}'
tekton.dev/output_artifacts: '{"gen-params": [{"name": "gen-params-output", "path":
"/tmp/outputs/Output/data"}], "repeat-line": [{"name": "repeat-line-output_text",
"path": "/tmp/outputs/output_text/data"}], "split-text-lines": [{"name": "split-text-lines-even_lines",
"path": "/tmp/outputs/even_lines/data"}, {"name": "split-text-lines-odd_lines",
"path": "/tmp/outputs/odd_lines/data"}], "write-numbers": [{"name": "write-numbers-numbers",
"path": "/tmp/outputs/numbers/data"}], "sum-numbers": [{"name": "sum-numbers-output",
"path": "/tmp/outputs/Output/data"}], "gen-params": [{"name": "gen-params-output",
"path": "/tmp/outputs/Output/data"}]}'
"path": "/tmp/outputs/odd_lines/data"}], "sum-numbers": [{"name": "sum-numbers-output",
"path": "/tmp/outputs/Output/data"}], "write-numbers": [{"name": "write-numbers-numbers",
"path": "/tmp/outputs/numbers/data"}]}'
labels:
pipelines.kubeflow.org/pipeline-sdk-type: kfp
name: file-passing-pipelines
Expand Down
5 changes: 2 additions & 3 deletions sdk/python/tests/compiler/testdata/withitem_nested.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,9 @@ metadata:
"optional": true, "type": "Integer"}], "name": "my-pipeline"}'
sidecar.istio.io/inject: 'false'
tekton.dev/input_artifacts: '{"my-in-coop1": [{"name": "loop-item-param-00000001-subvar-a",
"parent_task": null}], "my-in-coop2": [{"name": "loop-item-param-00000001-subvar-b",
"parent_task": null}], "my-inner-inner-coop": [{"name": "loop-item-param-00000001-subvar-a",
"parent_task": null}, {"name": "loop-item-param-00000002", "parent_task": null}],
"my-in-coop2": [{"name": "loop-item-param-00000001-subvar-b", "parent_task":
null}]}'
"parent_task": null}, {"name": "loop-item-param-00000002", "parent_task": null}]}'
tekton.dev/output_artifacts: '{}'
labels:
pipelines.kubeflow.org/pipeline-sdk-type: kfp
Expand Down

0 comments on commit cfdc996

Please sign in to comment.