Add "restartPolicy" parameter in Kubernetes policy 03/57403/9
authorJohn O Loughlin <john.oloughlin@intel.com>
Tue, 15 May 2018 15:20:33 +0000 (16:20 +0100)
committerRodolfo Alonso Hernandez <rodolfo.alonso.hernandez@intel.com>
Tue, 10 Jul 2018 09:29:48 +0000 (10:29 +0100)
This new parameter, "restartPolicy", will allow define the restart policy per pod.

Example of yaml definition in Kubernetes:
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
    - name: db
      ...
  restartPolicy: Always  # Possible values: "Always", "OnFailure" and "Never"

Example of definition in a Yardstick context:
context:
  type: Kubernetes
    servers:
      host:
        containers:
          - name: ...
        restartPolicy: Always  # Default value: "Always"

Restart policy [1].
[1] https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy

JIRA: YARDSTICK-1175

Change-Id: Id4317b909f98422e89d6d4553e8cfb0e1f593355
Signed-off-by: John O Loughlin <john.oloughlin@intel.com>
yardstick/common/exceptions.py
yardstick/orchestrator/kubernetes.py
yardstick/tests/unit/orchestrator/test_kubernetes.py

index 50def06..018654a 100644 (file)
@@ -237,6 +237,10 @@ class KubernetesNetworkObjectKindMissing(YardstickException):
     message = 'Kubernetes kind "Network" is not defined'
 
 
+class KubernetesWrongRestartPolicy(YardstickException):
+    message = 'Restart policy "%(rpolicy)s" is not valid'
+
+
 class ScenarioCreateNetworkError(YardstickException):
     message = 'Create Neutron Network Scenario failed'
 
index 07a7ab1..2c401fc 100644 (file)
@@ -77,6 +77,7 @@ class ContainerObject(object):
 class ReplicationControllerObject(object):
 
     SSHKEY_DEFAULT = 'yardstick_key'
+    RESTART_POLICY = ('Always', 'OnFailure', 'Never')
 
     def __init__(self, name, **kwargs):
         super(ReplicationControllerObject, self).__init__()
@@ -87,6 +88,10 @@ class ReplicationControllerObject(object):
         self._volumes = parameters.pop('volumes', [])
         self._security_context = parameters.pop('securityContext', None)
         self._networks = parameters.pop('networks', [])
+        self._restart_policy = parameters.pop('restartPolicy', 'Always')
+        if self._restart_policy not in self.RESTART_POLICY:
+            raise exceptions.KubernetesWrongRestartPolicy(
+                rpolicy=self._restart_policy)
 
         containers = parameters.pop('containers', None)
         if containers:
@@ -112,7 +117,8 @@ class ReplicationControllerObject(object):
                     "spec": {
                         "containers": [],
                         "volumes": [],
-                        "nodeSelector": {}
+                        "nodeSelector": {},
+                        "restartPolicy": self._restart_policy
                     }
                 }
             }
index 2451518..e9c3c97 100644 (file)
@@ -66,7 +66,8 @@ service ssh restart;while true ; do sleep 10000; done"
                         ],
                         "nodeSelector": {
                             "kubernetes.io/hostname": "node-01"
-                        }
+                        },
+                        "restartPolicy": "Always"
                     }
                 }
             }
@@ -77,13 +78,21 @@ service ssh restart;while true ; do sleep 10000; done"
 service ssh restart;while true ; do sleep 10000; done'],
             'ssh_key': 'k8s-86096c30-key',
             'nodeSelector': {'kubernetes.io/hostname': 'node-01'},
-            'volumes': []
+            'volumes': [],
+            'restartPolicy': 'Always'
         }
         name = 'host-k8s-86096c30'
         output_r = kubernetes.ReplicationControllerObject(
             name, **input_s).get_template()
         self.assertEqual(output_r, output_t)
 
+    def test_get_template_invalid_restart_policy(self):
+        input_s = {'restartPolicy': 'invalid_option'}
+        name = 'host-k8s-86096c30'
+        with self.assertRaises(exceptions.KubernetesWrongRestartPolicy):
+            kubernetes.ReplicationControllerObject(
+                name, **input_s).get_template()
+
 
 class GetRcPodsTestCase(base.BaseUnitTestCase):
 
@@ -321,6 +330,7 @@ class ContainerObjectTestCase(base.BaseUnitTestCase):
                                   'limits': {'key2': 'val2'}}}
         self.assertEqual(expected, container_obj.get_container_item())
 
+
 class CustomResourceDefinitionObjectTestCase(base.BaseUnitTestCase):
 
     def test__init(self):