Add "imagePullPolicy" parameter in Kubernetes container 27/59927/2
authorRodolfo Alonso Hernandez <rodolfo.alonso.hernandez@intel.com>
Wed, 18 Jul 2018 11:02:58 +0000 (12:02 +0100)
committerRodolfo Alonso Hernandez <rodolfo.alonso.hernandez@intel.com>
Thu, 19 Jul 2018 08:07:29 +0000 (08:07 +0000)
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 <rodolfo.alonso.hernandez@intel.com>
yardstick/common/exceptions.py
yardstick/orchestrator/kubernetes.py
yardstick/tests/unit/orchestrator/test_kubernetes.py

index c25acba..51db552 100644 (file)
@@ -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'
 
index 9883290..ec35883 100644 (file)
@@ -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
 
 
index 8d351e4..394ab58 100644 (file)
@@ -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):