From: Rodolfo Alonso Hernandez Date: Wed, 18 Jul 2018 11:02:58 +0000 (+0100) Subject: Add "imagePullPolicy" parameter in Kubernetes container X-Git-Tag: opnfv-7.0.0~151^2 X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=commitdiff_plain;h=c8facac8b67176e61ab2e00b312cc2deafe57b79;p=yardstick.git Add "imagePullPolicy" parameter in Kubernetes container The configuration parameter "imagePullPolicy" defines how Kubernetes retrieves de image. By default, Kubernetes will always try to pull the latest image from the repository [1]. Three possible arguments are accepted: - Always - IfNotPresent - Never Example of Kubernetes pod definition: containers: - name: vcmts-pktgen-pod-0 image: openretriever/yardstick imagePullPolicy: IfNotPresent Example of Yardstick definition: context: name: k8syardstick type: Kubernetesservers: vnf: image: openretriever/yardstick imagePullPolicy: IfNotPresent [1] https://kubernetes.io/docs/concepts/containers/images/ JIRA: YARDSTICK-1328 Change-Id: I83bfb01670eef22218b1affd7d37af14e32a622e Signed-off-by: Rodolfo Alonso Hernandez --- diff --git a/yardstick/common/exceptions.py b/yardstick/common/exceptions.py index c25acbaf8..51db552ee 100644 --- a/yardstick/common/exceptions.py +++ b/yardstick/common/exceptions.py @@ -253,6 +253,10 @@ class KubernetesContainerPortNotDefined(YardstickException): message = 'Container port not defined in "%(port)s"' +class KubernetesContainerWrongImagePullPolicy(YardstickException): + message = 'Image pull policy must be "Always", "IfNotPresent" or "Never"' + + class ScenarioCreateNetworkError(YardstickException): message = 'Create Neutron Network Scenario failed' diff --git a/yardstick/orchestrator/kubernetes.py b/yardstick/orchestrator/kubernetes.py index 98832908c..ec3588371 100644 --- a/yardstick/orchestrator/kubernetes.py +++ b/yardstick/orchestrator/kubernetes.py @@ -24,6 +24,7 @@ class ContainerObject(object): COMMAND_DEFAULT = '/bin/bash' RESOURCES = ('requests', 'limits') PORT_OPTIONS = ('containerPort', 'hostIP', 'hostPort', 'name', 'protocol') + IMAGE_PULL_POLICY = ('Always', 'IfNotPresent', 'Never') def __init__(self, name, ssh_key, **kwargs): self._name = name @@ -36,6 +37,7 @@ class ContainerObject(object): self._env = kwargs.get('env', []) self._resources = kwargs.get('resources', {}) self._ports = kwargs.get('ports', []) + self._image_pull_policy = kwargs.get('imagePullPolicy') def _create_volume_mounts(self): """Return all "volumeMounts" items per container""" @@ -82,6 +84,10 @@ class ContainerObject(object): for res in (res for res in self._resources if res in self.RESOURCES): container['resources'][res] = self._resources[res] + if self._image_pull_policy: + if self._image_pull_policy not in self.IMAGE_PULL_POLICY: + raise exceptions.KubernetesContainerWrongImagePullPolicy() + container['imagePullPolicy'] = self._image_pull_policy return container diff --git a/yardstick/tests/unit/orchestrator/test_kubernetes.py b/yardstick/tests/unit/orchestrator/test_kubernetes.py index 8d351e419..394ab58d5 100644 --- a/yardstick/tests/unit/orchestrator/test_kubernetes.py +++ b/yardstick/tests/unit/orchestrator/test_kubernetes.py @@ -395,6 +395,17 @@ class ContainerObjectTestCase(base.BaseUnitTestCase): 'limits': {'key2': 'val2'}}} self.assertEqual(expected, container_obj.get_container_item()) + def test_get_container_item_image_pull_policy(self): + container_obj = kubernetes.ContainerObject( + 'cname', ssh_key='fake_sshkey', imagePullPolicy='Always') + expected = {'args': [], + 'command': [kubernetes.ContainerObject.COMMAND_DEFAULT], + 'image': kubernetes.ContainerObject.IMAGE_DEFAULT, + 'name': 'cname-container', + 'volumeMounts': container_obj._create_volume_mounts(), + 'imagePullPolicy':'Always'} + self.assertEqual(expected, container_obj.get_container_item()) + class CustomResourceDefinitionObjectTestCase(base.BaseUnitTestCase):