Merge "Add restart policy for actions"

This commit is contained in:
Jenkins 2017-01-26 14:52:16 +00:00 committed by Gerrit Code Review
commit 2303b0300a
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):