From a0ead05e5ed044a601101b4088675d5f9b4fc981 Mon Sep 17 00:00:00 2001 From: Fabian von Feilitzsch Date: Mon, 10 Apr 2017 13:48:19 -0400 Subject: [PATCH 1/6] No longer pass API version in request body Fixes stateful set api mismatch errors. --- openshift/helper/ansible.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openshift/helper/ansible.py b/openshift/helper/ansible.py index 426f9f5e..b1a40e36 100644 --- a/openshift/helper/ansible.py +++ b/openshift/helper/ansible.py @@ -211,7 +211,6 @@ def object_from_params(self, module_params, obj=None): def request_body_from_params(self, module_params): request = { 'kind': self.base_model_name, - 'apiVersion': self.api_version.lower() } for param_name, param_value in module_params.items(): spec = self.find_arg_spec(param_name) From 7fb3e3d7e8df24f7b832199de872e613db8f314e Mon Sep 17 00:00:00 2001 From: Fabian von Feilitzsch Date: Tue, 11 Apr 2017 14:52:09 -0400 Subject: [PATCH 2/6] add tests for replica and stateful sets --- .../examples/k8s_v1beta1_replica_set.yml | 17 ++++++ .../examples/k8s_v1beta1_stateful_set.yml | 18 +++++++ .../test_k8s_v1beta1_replica_set.py | 53 +++++++++++++++++++ .../test_k8s_v1beta1_stateful_set.py | 53 +++++++++++++++++++ 4 files changed, 141 insertions(+) create mode 100644 openshift/ansiblegen/examples/k8s_v1beta1_replica_set.yml create mode 100644 openshift/ansiblegen/examples/k8s_v1beta1_stateful_set.yml create mode 100644 test/functional/test_k8s_v1beta1_replica_set.py create mode 100644 test/functional/test_k8s_v1beta1_stateful_set.py diff --git a/openshift/ansiblegen/examples/k8s_v1beta1_replica_set.yml b/openshift/ansiblegen/examples/k8s_v1beta1_replica_set.yml new file mode 100644 index 00000000..ff024bfb --- /dev/null +++ b/openshift/ansiblegen/examples/k8s_v1beta1_replica_set.yml @@ -0,0 +1,17 @@ +# v1beta1_replica_set.yml +--- + +- create: + name: myreplicaset + namespace: test + replicas: 3 + # spec_selector_match_labels: + # name: myreplicaset + # spec_selector_match_expressions: + # - {key: name, operator: In, values: [myreplicaset]} + spec_template_metadata_labels: + name: myreplicaset + containers: + - name: myreplicaset + image: openshift/origin-ruby-sample:v1.0 + name: Create replica set diff --git a/openshift/ansiblegen/examples/k8s_v1beta1_stateful_set.yml b/openshift/ansiblegen/examples/k8s_v1beta1_stateful_set.yml new file mode 100644 index 00000000..eb2cea97 --- /dev/null +++ b/openshift/ansiblegen/examples/k8s_v1beta1_stateful_set.yml @@ -0,0 +1,18 @@ +# v1beta1_stateful_set.yml +--- + +- create: + name: test + labels: + name: test + namespace: test + service_name: test + replicas: 3 + spec_template_metadata_labels: + name: test + spec_template_metadata_name: test + termination_grace_period_seconds: 10 + containers: + - name: test + image: openshift/origin-ruby-sample:v1.0 + name: Create stateful set diff --git a/test/functional/test_k8s_v1beta1_replica_set.py b/test/functional/test_k8s_v1beta1_replica_set.py new file mode 100644 index 00000000..67f38c32 --- /dev/null +++ b/test/functional/test_k8s_v1beta1_replica_set.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from __future__ import print_function + +import copy + +import pytest + +from openshift.helper.exceptions import KubernetesException + + +@pytest.fixture() +def create_params(create_tasks, project, object_name): + parameters = create_tasks['create'] + parameters['namespace'] = project + parameters['name'] = object_name + return parameters + + +@pytest.fixture() +def replica_set(k8s_ansible_helper, create_params): + request_body = k8s_ansible_helper.request_body_from_params(create_params) + namespace = create_params.get('namespace') + name = create_params.get('name') + k8s_obj = k8s_ansible_helper.create_object(namespace, body=request_body) + + yield k8s_obj + + try: + k8s_ansible_helper.delete_object(name, namespace) + except KubernetesException as ex: + # Swallow exception if object is already removed + if ex.value.get('status') != 404: + raise + + +def test_create_replica_set(k8s_ansible_helper, create_params, replica_set, obj_compare): + obj_compare(k8s_ansible_helper, replica_set, create_params) + + +def test_get_replica_set(k8s_ansible_helper, replica_set): + name = replica_set.metadata.name + namespace = replica_set.metadata.namespace + k8s_obj = k8s_ansible_helper.get_object(name, namespace) + assert k8s_obj is not None + + +def test_remove_replica_set(k8s_ansible_helper, replica_set): + name = replica_set.metadata.name + namespace = replica_set.metadata.namespace + k8s_ansible_helper.delete_object(name, namespace) + k8s_obj = k8s_ansible_helper.get_object(name, namespace) + assert k8s_obj is None diff --git a/test/functional/test_k8s_v1beta1_stateful_set.py b/test/functional/test_k8s_v1beta1_stateful_set.py new file mode 100644 index 00000000..9a26eb77 --- /dev/null +++ b/test/functional/test_k8s_v1beta1_stateful_set.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from __future__ import print_function + +import copy + +import pytest + +from openshift.helper.exceptions import KubernetesException + + +@pytest.fixture() +def create_params(create_tasks, project, object_name): + parameters = create_tasks['create'] + parameters['namespace'] = project + parameters['name'] = object_name + return parameters + + +@pytest.fixture() +def stateful_set(k8s_ansible_helper, create_params): + request_body = k8s_ansible_helper.request_body_from_params(create_params) + namespace = create_params.get('namespace') + name = create_params.get('name') + k8s_obj = k8s_ansible_helper.create_object(namespace, body=request_body) + + yield k8s_obj + + try: + k8s_ansible_helper.delete_object(name, namespace) + except KubernetesException as ex: + # Swallow exception if object is already removed + if ex.value.get('status') != 404: + raise + + +def test_create_stateful_set(k8s_ansible_helper, create_params, stateful_set, obj_compare): + obj_compare(k8s_ansible_helper, stateful_set, create_params) + + +def test_get_stateful_set(k8s_ansible_helper, stateful_set): + name = stateful_set.metadata.name + namespace = stateful_set.metadata.namespace + k8s_obj = k8s_ansible_helper.get_object(name, namespace) + assert k8s_obj is not None + + +def test_remove_stateful_set(k8s_ansible_helper, stateful_set): + name = stateful_set.metadata.name + namespace = stateful_set.metadata.namespace + k8s_ansible_helper.delete_object(name, namespace) + k8s_obj = k8s_ansible_helper.get_object(name, namespace) + assert k8s_obj is None From 2566e45d1da4d7282311b295999ce1f837e7d742 Mon Sep 17 00:00:00 2001 From: Fabian von Feilitzsch Date: Tue, 11 Apr 2017 15:43:17 -0400 Subject: [PATCH 3/6] add test for horizontal pod autoscaler --- .../k8s_v1_horizontal_pod_autoscaler.yml | 12 +++++ .../test_k8s_v1_horizontal_pod_autoscaler.py | 53 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 openshift/ansiblegen/examples/k8s_v1_horizontal_pod_autoscaler.yml create mode 100644 test/functional/test_k8s_v1_horizontal_pod_autoscaler.py diff --git a/openshift/ansiblegen/examples/k8s_v1_horizontal_pod_autoscaler.yml b/openshift/ansiblegen/examples/k8s_v1_horizontal_pod_autoscaler.yml new file mode 100644 index 00000000..f9bb2d2a --- /dev/null +++ b/openshift/ansiblegen/examples/k8s_v1_horizontal_pod_autoscaler.yml @@ -0,0 +1,12 @@ +# v1beta1_replica_set.yml +--- + +- create: + name: test-scaler + namespace: test + scale_target_ref_kind: ReplicaSet + scale_target_ref_name: test + min_replicas: 2 + max_replicas: 5 + # target_cpu_utilization_percentage: 50 + name: Create replica set diff --git a/test/functional/test_k8s_v1_horizontal_pod_autoscaler.py b/test/functional/test_k8s_v1_horizontal_pod_autoscaler.py new file mode 100644 index 00000000..a1976217 --- /dev/null +++ b/test/functional/test_k8s_v1_horizontal_pod_autoscaler.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from __future__ import print_function + +import copy + +import pytest + +from openshift.helper.exceptions import KubernetesException + + +@pytest.fixture() +def create_params(create_tasks, project, object_name): + parameters = create_tasks['create'] + parameters['namespace'] = project + parameters['name'] = object_name + return parameters + + +@pytest.fixture() +def horizontal_pod_autoscaler(k8s_ansible_helper, create_params): + request_body = k8s_ansible_helper.request_body_from_params(create_params) + namespace = create_params.get('namespace') + name = create_params.get('name') + k8s_obj = k8s_ansible_helper.create_object(namespace, body=request_body) + + yield k8s_obj + + try: + k8s_ansible_helper.delete_object(name, namespace) + except KubernetesException as ex: + # Swallow exception if object is already removed + if ex.value.get('status') != 404: + raise + + +def test_create_horizontal_pod_autoscaler(k8s_ansible_helper, create_params, horizontal_pod_autoscaler, obj_compare): + obj_compare(k8s_ansible_helper, horizontal_pod_autoscaler, create_params) + + +def test_get_horizontal_pod_autoscaler(k8s_ansible_helper, horizontal_pod_autoscaler): + name = horizontal_pod_autoscaler.metadata.name + namespace = horizontal_pod_autoscaler.metadata.namespace + k8s_obj = k8s_ansible_helper.get_object(name, namespace) + assert k8s_obj is not None + + +def test_remove_horizontal_pod_autoscaler(k8s_ansible_helper, horizontal_pod_autoscaler): + name = horizontal_pod_autoscaler.metadata.name + namespace = horizontal_pod_autoscaler.metadata.namespace + k8s_ansible_helper.delete_object(name, namespace) + k8s_obj = k8s_ansible_helper.get_object(name, namespace) + assert k8s_obj is None From 765590c3e0774c0676aa5ce473f415234ce616e7 Mon Sep 17 00:00:00 2001 From: Fabian von Feilitzsch Date: Wed, 12 Apr 2017 12:54:17 -0400 Subject: [PATCH 4/6] fix copy paste comment error --- .../ansiblegen/examples/k8s_v1_horizontal_pod_autoscaler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openshift/ansiblegen/examples/k8s_v1_horizontal_pod_autoscaler.yml b/openshift/ansiblegen/examples/k8s_v1_horizontal_pod_autoscaler.yml index f9bb2d2a..38623a8e 100644 --- a/openshift/ansiblegen/examples/k8s_v1_horizontal_pod_autoscaler.yml +++ b/openshift/ansiblegen/examples/k8s_v1_horizontal_pod_autoscaler.yml @@ -1,4 +1,4 @@ -# v1beta1_replica_set.yml +# v1_horizontal_pod_autoscaler.yml --- - create: From 9beb2669e1f38fcfbdea29a0d5e0ef30395b032d Mon Sep 17 00:00:00 2001 From: Fabian von Feilitzsch Date: Wed, 12 Apr 2017 15:04:44 -0400 Subject: [PATCH 5/6] add skip condition on version mismatch --- test/functional/conftest.py | 39 +++++++++++++++++++ .../test_k8s_v1beta1_stateful_set.py | 5 ++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/test/functional/conftest.py b/test/functional/conftest.py index b6801066..a22831bc 100644 --- a/test/functional/conftest.py +++ b/test/functional/conftest.py @@ -15,6 +15,8 @@ import requests import json +from pkg_resources import parse_version + from openshift.client import models from kubernetes.client import V1Namespace, V1ObjectMeta from openshift.helper.ansible import KubernetesAnsibleModuleHelper, OpenShiftAnsibleModuleHelper @@ -239,6 +241,43 @@ def project(kubeconfig): helper.delete_object(name, None) +@pytest.fixture +def openshift_version(): + return pytest.config.getoption('--openshift-version') + + +@pytest.fixture(autouse=True) +def skip_by_version(request, openshift_version): + if request.node.get_marker('version_limit') and openshift_version: + + lowest_version = request.node.get_marker('version_limit').kwargs.get('lowest_version') + highest_version = request.node.get_marker('version_limit').kwargs.get('highest_version') + skip_latest = request.node.get_marker('version_limit').kwargs.get('skip_latest') + + if openshift_version == 'latest' and skip_latest: + pytest.skip('This API is not supported in the latest openshift version') + + too_low = lowest_version and parse_version(lowest_version) > parse_version(openshift_version) + too_high = highest_version and parse_version(highest_version) < parse_version(openshift_version) + + if too_low or too_high: + pytest.skip('This API is not supported in openshift versions < {}'.format(openshift_version)) + + + +def version_mismatch(lowest_version=None, highest_version=None, skip_latest=False): + openshift_version = pytest.config.getoption('--openshift-version') + if openshift_version == 'latest' or not openshift_version: + return pytest.mark.skipif( + skip_latest, + reason='This API is not supported in the latest openshift version' + ) + + return pytest.mark.skipif( + (lowest_version and parse_version(lowest_version) > parse_version(openshift_version)) or + (highest_version and parse_version(highest_version) < parse_version(openshift_version)), + reason='This API is not supported in openshift versions < {}'.format(openshift_version) + ) def _get_id(argvalue): op_type = '' if argvalue.get('create'): diff --git a/test/functional/test_k8s_v1beta1_stateful_set.py b/test/functional/test_k8s_v1beta1_stateful_set.py index 9a26eb77..82ad1680 100644 --- a/test/functional/test_k8s_v1beta1_stateful_set.py +++ b/test/functional/test_k8s_v1beta1_stateful_set.py @@ -2,8 +2,6 @@ from __future__ import absolute_import from __future__ import print_function -import copy - import pytest from openshift.helper.exceptions import KubernetesException @@ -34,10 +32,12 @@ def stateful_set(k8s_ansible_helper, create_params): raise +@pytest.mark.version_limit(lowest_version='1.5') def test_create_stateful_set(k8s_ansible_helper, create_params, stateful_set, obj_compare): obj_compare(k8s_ansible_helper, stateful_set, create_params) +@pytest.mark.version_limit(lowest_version='1.5') def test_get_stateful_set(k8s_ansible_helper, stateful_set): name = stateful_set.metadata.name namespace = stateful_set.metadata.namespace @@ -45,6 +45,7 @@ def test_get_stateful_set(k8s_ansible_helper, stateful_set): assert k8s_obj is not None +@pytest.mark.version_limit(lowest_version='1.5') def test_remove_stateful_set(k8s_ansible_helper, stateful_set): name = stateful_set.metadata.name namespace = stateful_set.metadata.namespace From 5877459a499c85e8b1847c3050a320224a0b77b6 Mon Sep 17 00:00:00 2001 From: Fabian von Feilitzsch Date: Thu, 13 Apr 2017 21:54:14 -0400 Subject: [PATCH 6/6] remove dead function --- test/functional/conftest.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/test/functional/conftest.py b/test/functional/conftest.py index a22831bc..a64c3014 100644 --- a/test/functional/conftest.py +++ b/test/functional/conftest.py @@ -264,20 +264,6 @@ def skip_by_version(request, openshift_version): pytest.skip('This API is not supported in openshift versions < {}'.format(openshift_version)) - -def version_mismatch(lowest_version=None, highest_version=None, skip_latest=False): - openshift_version = pytest.config.getoption('--openshift-version') - if openshift_version == 'latest' or not openshift_version: - return pytest.mark.skipif( - skip_latest, - reason='This API is not supported in the latest openshift version' - ) - - return pytest.mark.skipif( - (lowest_version and parse_version(lowest_version) > parse_version(openshift_version)) or - (highest_version and parse_version(highest_version) < parse_version(openshift_version)), - reason='This API is not supported in openshift versions < {}'.format(openshift_version) - ) def _get_id(argvalue): op_type = '' if argvalue.get('create'):