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..38623a8e --- /dev/null +++ b/openshift/ansiblegen/examples/k8s_v1_horizontal_pod_autoscaler.yml @@ -0,0 +1,12 @@ +# v1_horizontal_pod_autoscaler.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/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/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) diff --git a/test/functional/conftest.py b/test/functional/conftest.py index b6801066..a64c3014 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,29 @@ 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 _get_id(argvalue): op_type = '' if argvalue.get('create'): 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 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..82ad1680 --- /dev/null +++ b/test/functional/test_k8s_v1beta1_stateful_set.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from __future__ import print_function + +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 + + +@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 + k8s_obj = k8s_ansible_helper.get_object(name, namespace) + 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 + k8s_ansible_helper.delete_object(name, namespace) + k8s_obj = k8s_ansible_helper.get_object(name, namespace) + assert k8s_obj is None