Merge "Add restart policy for actions"
This commit is contained in:
commit
2303b0300a
|
@ -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