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:
parent
45e1a7d967
commit
d5ff9e7eba
|
@ -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"
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue