Add restart policy for actions

User can define two type of restarts for actions "never" and "always".
For "never" will be created pod object without restarts.
For "always" will be created job objects to be restarted until success.

Change-Id: I74afbe2a4bff21df6d28b8f49cdb3080ca8f69b7
This commit is contained in:
Sergey Reshetnyak 2017-01-18 19:18:24 +03:00
parent 45e1a7d967
commit d5ff9e7eba
2 changed files with 54 additions and 14 deletions

View File

@ -1,3 +1,4 @@
import copy
import json
import os
import uuid
@ -14,6 +15,9 @@ from fuel_ccp import templates
CONF = config.CONF
RESTART_POLICY_ALWAYS = "always"
RESTART_POLICY_NEVER = "never"
class Action(object):
def __init__(self, **kwargs):
@ -24,6 +28,8 @@ class Action(object):
self.command = kwargs.pop("command")
self.dependencies = kwargs.pop("dependencies", ())
self.files = kwargs.pop("files", ())
self.restart_policy = kwargs.pop("restart_policy",
RESTART_POLICY_NEVER)
if kwargs:
key_names = ", ".join(kwargs.keys())
@ -41,7 +47,7 @@ class Action(object):
def run(self):
self._create_configmap()
self._create_job()
self._create_action()
# configmap methods
@ -86,7 +92,7 @@ class Action(object):
# job methods
def _create_job(self):
def _create_action(self):
cont_spec = {
"name": self.k8s_name,
"image": config_images.image_spec(self.image),
@ -150,6 +156,28 @@ class Action(object):
]
}
}
if self.restart_policy == RESTART_POLICY_NEVER:
self._create_pod(pod_spec)
elif self.restart_policy == RESTART_POLICY_ALWAYS:
self._create_job(pod_spec)
else:
raise ValueError("Restart policy %s is not supported" % (
self.restart_policy))
def _create_pod(self, pod_spec):
spec = copy.deepcopy(pod_spec)
spec["metadata"].setdefault("labels", {})
spec["metadata"]["labels"].update({
"app": self.name,
"ccp": "true",
"ccp-action": "true",
"ccp-component": self.component})
spec.update({
"kind": "Pod",
"apiVersion": "v1"})
kubernetes.process_object(spec)
def _create_job(self, pod_spec):
job_spec = templates.serialize_job(
name=self.k8s_name,
spec=pod_spec,
@ -160,26 +188,36 @@ class Action(object):
class ActionStatus(object):
@classmethod
def get_actions(cls, action_name):
selector = "ccp-action=true"
if action_name:
selector += "," + "app=%s" % action_name
actions = []
for job in kubernetes.list_cluster_jobs(selector):
for job in kubernetes.list_cluster_jobs(selector=selector):
actions.append(cls(job))
for pod in kubernetes.list_cluster_pods(selector=selector):
actions.append(cls(pod))
return actions
def __init__(self, k8s_job):
self.name = k8s_job.name
self.component = k8s_job.labels["ccp-component"]
self.date = k8s_job.obj["metadata"]["creationTimestamp"]
self.restarts = k8s_job.obj["status"].get("failed", 0)
self.active = k8s_job.obj["status"].get("active", 0)
def __init__(self, k8s_spec):
self.name = k8s_spec.name
self.component = k8s_spec.labels["ccp-component"]
self.date = k8s_spec.obj["metadata"]["creationTimestamp"]
if k8s_spec.kind == "Job":
self.restarts = k8s_spec.obj["status"].get("failed", 0)
self.active = k8s_spec.obj["status"].get("active", 0)
self.failed = False
else:
phase = k8s_spec.obj["status"]["phase"]
self.restarts = 0
self.active = 1 if phase not in {"Failed", "Completed"} else 0
self.failed = phase == "Failed"
@property
def status(self):
if self.restarts:
if self.failed:
return "fail"
if self.active:
return "wip"

View File

@ -159,14 +159,16 @@ def list_cluster_deployments():
selector="ccp=true")
def list_cluster_pods(service=None):
selector = "ccp=true"
def list_cluster_pods(service=None, selector=None):
ccp_selector = "ccp=true"
if service:
selector = ",".join((selector, "app=%s" % service))
ccp_selector = ",".join((ccp_selector, "app=%s" % service))
if selector:
ccp_selector += "," + selector
client = get_client()
return pykube.Pod.objects(client).filter(
namespace=CONF.kubernetes.namespace,
selector=str(selector))
selector=str(ccp_selector))
def list_cluster_jobs(selector=None):