diff --git a/cluster/juju/layers/kubernetes-master/actions.yaml b/cluster/juju/layers/kubernetes-master/actions.yaml index 18668ca0700..d2f6f495dd6 100644 --- a/cluster/juju/layers/kubernetes-master/actions.yaml +++ b/cluster/juju/layers/kubernetes-master/actions.yaml @@ -26,3 +26,23 @@ create-rbd-pv: required: - name - size +namespace-list: + description: List existing k8s namespaces +namespace-create: + description: Create new namespace + params: + name: + type: string + description: Namespace name eg. staging + minLength: 2 + required: + - name +namespace-delete: + description: Delete namespace + params: + name: + type: string + description: Namespace name eg. staging + minLength: 2 + required: + - name diff --git a/cluster/juju/layers/kubernetes-master/actions/namespace-create b/cluster/juju/layers/kubernetes-master/actions/namespace-create new file mode 100644 index 00000000000..56a6f5c8e40 --- /dev/null +++ b/cluster/juju/layers/kubernetes-master/actions/namespace-create @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 + +from yaml import safe_load as load +from charmhelpers.core.hookenv import ( + action_get, + action_set, + action_fail, + action_name +) +from charms.templating.jinja2 import render +from subprocess import check_output + + +def kubectl(args): + cmd = ['kubectl'] + args + return check_output(cmd) + + +def namespace_list(): + y = load(kubectl(['get', 'namespaces', '-o', 'yaml'])) + ns = [i['metadata']['name'] for i in y['items']] + action_set({'namespaces': ', '.join(ns)+'.'}) + return ns + + +def namespace_create(): + name = action_get('name') + if name in namespace_list(): + action_fail('Namespace "{}" already exists.'.format(name)) + return + + render('create-namespace.yaml.j2', '/etc/kubernetes/addons/create-namespace.yaml', + context={'name': name}) + kubectl(['create', '-f', '/etc/kubernetes/addons/create-namespace.yaml']) + action_set({'msg': 'Namespace "{}" created.'.format(name)}) + + +def namespace_delete(): + name = action_get('name') + if name in ['default', 'kube-system']: + action_fail('Not allowed to delete "{}".'.format(name)) + return + if name not in namespace_list(): + action_fail('Namespace "{}" does not exist.'.format(name)) + return + kubectl(['delete', 'ns/'+name]) + action_set({'msg': 'Namespace "{}" deleted.'.format(name)}) + + +action = action_name().replace('namespace-', '') +if action == 'create': + namespace_create() +elif action == 'list': + namespace_list() +elif action == 'delete': + namespace_delete() diff --git a/cluster/juju/layers/kubernetes-master/actions/namespace-delete b/cluster/juju/layers/kubernetes-master/actions/namespace-delete new file mode 120000 index 00000000000..358cddb12b9 --- /dev/null +++ b/cluster/juju/layers/kubernetes-master/actions/namespace-delete @@ -0,0 +1 @@ +namespace-create \ No newline at end of file diff --git a/cluster/juju/layers/kubernetes-master/actions/namespace-list b/cluster/juju/layers/kubernetes-master/actions/namespace-list new file mode 120000 index 00000000000..358cddb12b9 --- /dev/null +++ b/cluster/juju/layers/kubernetes-master/actions/namespace-list @@ -0,0 +1 @@ +namespace-create \ No newline at end of file diff --git a/cluster/juju/layers/kubernetes-master/templates/create-namespace.yaml.j2 b/cluster/juju/layers/kubernetes-master/templates/create-namespace.yaml.j2 new file mode 100644 index 00000000000..a121ecc6778 --- /dev/null +++ b/cluster/juju/layers/kubernetes-master/templates/create-namespace.yaml.j2 @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: {{ name }} + labels: + name: {{ name }}