From 92238f78c873cfada8befbf0afd8bb35e16ed28d Mon Sep 17 00:00:00 2001 From: Valerii Kovalchuk Date: Wed, 20 Apr 2016 15:46:48 +0300 Subject: [PATCH] [kubernetes] Create actions to recreate pods and restart containers This patch adds actions to KubernetesPod class which allow to recreate a pod (delete it and create new one) and to restart docker containers on minion nodes. Change-Id: Ia03b27d72662700fb302960adba9dae20203b597 Closes-bug: #1466359 --- .../package/Classes/KubernetesCluster.yaml | 9 ++++++ .../package/Classes/KubernetesMinionNode.yaml | 14 +++++++++ .../Resources/RestartContainers.template | 30 +++++++++++++++++++ .../Resources/scripts/restartContainers.sh | 8 +++++ .../package/Classes/KubernetesPod.yaml | 18 +++++++++++ 5 files changed, 79 insertions(+) create mode 100644 Docker/Kubernetes/KubernetesCluster/package/Resources/RestartContainers.template create mode 100644 Docker/Kubernetes/KubernetesCluster/package/Resources/scripts/restartContainers.sh diff --git a/Docker/Kubernetes/KubernetesCluster/package/Classes/KubernetesCluster.yaml b/Docker/Kubernetes/KubernetesCluster/package/Classes/KubernetesCluster.yaml index c89e90cd..ab6b54ef 100644 --- a/Docker/Kubernetes/KubernetesCluster/package/Classes/KubernetesCluster.yaml +++ b/Docker/Kubernetes/KubernetesCluster/package/Classes/KubernetesCluster.yaml @@ -523,3 +523,12 @@ Methods: newSize => $newSize )) - $.masterNode.instance.agent.call($template, $resources) + + + restartContainers: + Arguments: + - podName: + Contract: $.string().notNull() + + Body: + - $.minionNodes.take($.nodeCount).pselect($.restartContainers(podName => $podName)) diff --git a/Docker/Kubernetes/KubernetesCluster/package/Classes/KubernetesMinionNode.yaml b/Docker/Kubernetes/KubernetesCluster/package/Classes/KubernetesMinionNode.yaml index 547fd969..346d5058 100644 --- a/Docker/Kubernetes/KubernetesCluster/package/Classes/KubernetesMinionNode.yaml +++ b/Docker/Kubernetes/KubernetesCluster/package/Classes/KubernetesMinionNode.yaml @@ -115,3 +115,17 @@ Methods: - $.setAttr(etcdConfigured, false) - $.setAttr(instanceDeployed, false) + + restartContainers: + Arguments: + - podName: + Contract: $.string().notNull() + + Body: + - $._environment.reporter.report($this, 'Restarting {0} containers on {1}'.format($podName, $.instance.name)) + - $resources: new(sys:Resources) + - $template: $resources.yaml('RestartContainers.template').bind(dict( + podName => $podName + )) + - $.instance.agent.call($template, $resources) + - $._environment.reporter.report($this, '{0} containers on {1} restarted'.format($podName, $.instance.name)) diff --git a/Docker/Kubernetes/KubernetesCluster/package/Resources/RestartContainers.template b/Docker/Kubernetes/KubernetesCluster/package/Resources/RestartContainers.template new file mode 100644 index 00000000..5d711330 --- /dev/null +++ b/Docker/Kubernetes/KubernetesCluster/package/Resources/RestartContainers.template @@ -0,0 +1,30 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Restart Docker Containers + +Parameters: + podName: $podName + +Body: | + restartContainers(args.podName) + +Scripts: + restartContainers: + Type: Application + Version: 1.0.0 + EntryPoint: restartContainers.sh + Options: + captureStdout: true + captureStderr: true diff --git a/Docker/Kubernetes/KubernetesCluster/package/Resources/scripts/restartContainers.sh b/Docker/Kubernetes/KubernetesCluster/package/Resources/scripts/restartContainers.sh new file mode 100644 index 00000000..d5ebe2cd --- /dev/null +++ b/Docker/Kubernetes/KubernetesCluster/package/Resources/scripts/restartContainers.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# $1 - POD NAME AS A PART OF CONTAINER NAME + +CONTAINERS=$(docker ps -q --filter "name=_$1-") +if (( ${#CONTAINERS} > 0 )); then + docker restart $CONTAINERS +fi \ No newline at end of file diff --git a/Docker/Kubernetes/KubernetesPod/package/Classes/KubernetesPod.yaml b/Docker/Kubernetes/KubernetesPod/package/Classes/KubernetesPod.yaml index 91e498b9..81efb52c 100644 --- a/Docker/Kubernetes/KubernetesPod/package/Classes/KubernetesPod.yaml +++ b/Docker/Kubernetes/KubernetesPod/package/Classes/KubernetesPod.yaml @@ -329,3 +329,21 @@ Methods: - $.kubernetesCluster.scaleRc(rcName => $._getReplicationControllerId(), newSize => $.replicas) Else: - $._environment.reporter.report($this, 'Cannot scale Pod up') + + + recreatePod: + Usage: Action + Body: + - $._environment.reporter.report($this, 'Recreating Pod {0}'.format($.name)) + - $.kubernetesCluster.deletePods(dict(id => $._getPodName())) + - If: $.replicas = 0 + Then: + - $._loadCurrentPodDefinition() + - $.kubernetesCluster.createPod(definition => $._podDefinition, isNew => true) + - $._environment.reporter.report($this, 'Pod {0} recreated'.format($.name)) + + + restartContainers: + Usage: Action + Body: + - $.kubernetesCluster.restartContainers(podName => $._getPodName())