INSTALLER_TYPE="$2"
shift
;;
- -i|--openstack-env)
+ -o|--openstack-env)
OPENSTACK_ENV="$2"
shift
;;
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
- --net="host" \
quay.io/prometheus/node-exporter:v0.14.0 \
-collector.procfs /host/proc \
-collector.sysfs /host/sys \
local_del_docker('barometer')
local_del_docker('grafana')
local_del_docker('collectd')
+local_del_docker('openstack-exporter')
pyroute2==0.4.10
elasticsearch==5.0.1
docker==2.0.2
+kubernetes==6.0.0
--- /dev/null
+##############################################################################\r
+# Copyright (c) 2018 Huawei Technologies Co.,Ltd. and others\r
+#\r
+# All rights reserved. This program and the accompanying materials\r
+# are made available under the terms of the Apache License, Version 2.0\r
+# which accompanies this distribution, and is available at\r
+# http://www.apache.org/licenses/LICENSE-2.0\r
+##############################################################################\r
--- /dev/null
+{\r
+ "task_group_1":[\r
+ {\r
+ "name": "http_yardstick_test",\r
+ "retryCount": 3,\r
+ "timeOutSeconds": 1200,\r
+ "timeOutPolicy": "TIME_OUT_WF",\r
+ "retryLogic": "FIXED",\r
+ "retryDelaySeconds": 600,\r
+ "responseTimeOutSeconds": 3600\r
+ }\r
+ ]\r
+}
\ No newline at end of file
--- /dev/null
+{\r
+ "name": "workflow_demo_05",\r
+ "description": "run a workflow of yardstick test service",\r
+ "version": 1,\r
+ "tasks": [\r
+ {\r
+ "name": "http_yardstick_test",\r
+ "taskReferenceName": "ping_test",\r
+ "inputParameters": {\r
+ "http_request": {\r
+ "uri": "http://192.168.199.105:8080/greet",\r
+ "method": "GET"\r
+ }\r
+ },\r
+ "type": "HTTP"\r
+ }\r
+ ],\r
+ "outputParameters": {\r
+ "header": "${ping_test.output.response.headers}",\r
+ "response": "${ping_test.output.response.body}",\r
+ "status": "${ping_test.output.response.statusCode}"\r
+ },\r
+ "schemaVersion": 2\r
+}
\ No newline at end of file
--- /dev/null
+##############################################################################\r
+# Copyright (c) 2018 Huawei Technologies Co.,Ltd. and others\r
+#\r
+# All rights reserved. This program and the accompanying materials\r
+# are made available under the terms of the Apache License, Version 2.0\r
+# which accompanies this distribution, and is available at\r
+# http://www.apache.org/licenses/LICENSE-2.0\r
+##############################################################################\r
+\r
+from conductor import conductor\r
+import json\r
+\r
+\r
+class WorkflowMgr(object):\r
+ def __init__(self, serverAddr):\r
+ self._serverAddr = serverAddr + '/api'\r
+ self._metaDataClient = conductor.MetadataClient(self._serverAddr)\r
+ self._workflowClient = conductor.WorkflowClient(self._serverAddr)\r
+ self._tasksDefined = False\r
+ self._workflowDefined = False\r
+ self._workflowName = ""\r
+\r
+ def setTaskDef(self, taskJson):\r
+ jsonObj = json.loads(taskJson)\r
+ print "define tasks:\n", taskJson\r
+ for (k, v) in jsonObj.items():\r
+ self._metaDataClient.registerTaskDefs(v)\r
+ self._tasksDefined = True\r
+\r
+ def setWorkflowDef(self, workflowJson):\r
+ jsonObj = json.loads(workflowJson)\r
+ print "define workflow:\n", workflowJson\r
+ try:\r
+ self._metaDataClient.createWorkflowDef(jsonObj)\r
+ except Exception as e:\r
+ print e\r
+ self._workflowName = jsonObj['name']\r
+ self._workflowDefined = True\r
+\r
+ def startWorkflow(self, param={}):\r
+ workflowId = ''\r
+ if not self._tasksDefined:\r
+ print "error: please define the task at first\n"\r
+ elif not self._workflowDefined:\r
+ print "error: please define the workflow at first\n"\r
+ else:\r
+ workflowId = self._workflowClient.startWorkflow(\r
+ self._workflowName, param)\r
+ return workflowId\r
+\r
+ def setTaskDefFromFile(self, taskFilePath):\r
+ with open(taskFilePath, 'r') as f:\r
+ self.setTaskDef(f.read())\r
+\r
+ def setWorkflowFromFile(self, workflowFilePath):\r
+ with open(workflowFilePath, 'r') as f:\r
+ self.setWorkflowDef(f.read())\r
+\r
+\r
+# test demo\r
+def main():\r
+ serverAddr = "http://192.168.199.131:8080"\r
+ wfMgr = WorkflowMgr(serverAddr)\r
+ wfMgr.setTaskDefFromFile('mock_tasks.json')\r
+ wfMgr.setWorkflowFromFile('mock_workflow.json')\r
+ inputParam = {'input': 'fake'}\r
+ wfMgr.startWorkflow(inputParam)\r
+\r
+\r
+if __name__ == "__main__":\r
+ main()\r
--- /dev/null
+##############################################################################\r
+# Copyright (c) 2018 Huawei Technologies Co.,Ltd. and others\r
+#\r
+# All rights reserved. This program and the accompanying materials\r
+# are made available under the terms of the Apache License, Version 2.0\r
+# which accompanies this distribution, and is available at\r
+# http://www.apache.org/licenses/LICENSE-2.0\r
+##############################################################################\r
--- /dev/null
+{\r
+ "name": "",\r
+ "retryCount": 6,\r
+ "timeOutSeconds": 1200,\r
+ "timeOutPolicy": "TIME_OUT_WF",\r
+ "retryLogic": "FIXED",\r
+ "retryDelaySeconds": 3,\r
+ "responseTimeOutSeconds": 3600\r
+}
\ No newline at end of file
--- /dev/null
+{\r
+ "name": "workflow_demo_05",\r
+ "description": "run a workflow of yardstick test service",\r
+ "version": 1,\r
+ "tasks": [\r
+ {\r
+ "name": "http_yardstick_test",\r
+ "taskReferenceName": "ping_test",\r
+ "inputParameters": {\r
+ "http_request": {\r
+ "uri": "http://192.168.199.105:8080/greet",\r
+ "method": "GET"\r
+ }\r
+ },\r
+ "type": "HTTP"\r
+ }\r
+ ],\r
+ "outputParameters": {\r
+ "header": "${ping_test.output.response.headers}",\r
+ "response": "${ping_test.output.response.body}",\r
+ "status": "${ping_test.output.response.statusCode}"\r
+ },\r
+ "schemaVersion": 2\r
+}
\ No newline at end of file
--- /dev/null
+##############################################################################\r
+# Copyright (c) 2018 Huawei Technologies Co.,Ltd. and others\r
+#\r
+# All rights reserved. This program and the accompanying materials\r
+# are made available under the terms of the Apache License, Version 2.0\r
+# which accompanies this distribution, and is available at\r
+# http://www.apache.org/licenses/LICENSE-2.0\r
+##############################################################################\r
+\r
+import json\r
+import os\r
+\r
+\r
+class TaskFile(object):\r
+ def __init__(self, taskName='task_0'):\r
+ self._defaultConfFile = self._getFilePath("defaultTaskFile.json")\r
+ with open(self._defaultConfFile) as defaultConf:\r
+ self._jsonObj = json.load(defaultConf)\r
+ self._jsonObj['name'] = taskName\r
+\r
+ def generateFromStep(self, stepObject):\r
+ self._jsonObj['name'] = stepObject.getName()\r
+ print "taskFile:", self._jsonObj['name']\r
+ return self._jsonObj\r
+\r
+ def _getFilePath(self, fileName):\r
+ dirPath = os.path.dirname(os.path.realpath(__file__))\r
+ return os.path.join(dirPath, fileName)\r
--- /dev/null
+##############################################################################\r
+# Copyright (c) 2018 Huawei Technologies Co.,Ltd. and others\r
+#\r
+# All rights reserved. This program and the accompanying materials\r
+# are made available under the terms of the Apache License, Version 2.0\r
+# which accompanies this distribution, and is available at\r
+# http://www.apache.org/licenses/LICENSE-2.0\r
+##############################################################################\r
+\r
+import random\r
+import collections\r
+import re\r
+from src.conductor_processor.task import TaskFile\r
+\r
+\r
+class WorkflowFile(object):\r
+ def __init__(self, name):\r
+ self._name = "workflow_" + name + "(%s)" % getRandString(10)\r
+ self._description = ''\r
+ self._version = 1\r
+ self._schemaVersion = 2\r
+ self._tasks = []\r
+ self._outputParameters = {}\r
+\r
+ def getDict(self):\r
+ d = collections.OrderedDict()\r
+ d['name'] = self._name\r
+ d['description'] = self._description\r
+ d['version'] = self._version\r
+ d['schemaVersion'] = self._schemaVersion\r
+ d['tasks'] = self._tasks\r
+ d['outputParameters'] = self._outputParameters\r
+\r
+ return d\r
+\r
+ def generateMetaData(self, flowList, stepObjArr):\r
+ flowParser = FlowParser(flowList, stepObjArr)\r
+ self._tasks, taskMetaList = flowParser.parseMainFlow()\r
+ normalTasks = flowParser.getNormalTaskList()\r
+ for normalTask in normalTasks:\r
+ taskName = normalTask['name']\r
+ referenceName = normalTask['taskReferenceName']\r
+ self._outputParameters["%s(%s)" % (taskName, referenceName)] = \\r
+ "${%s.output.response.body}" % referenceName\r
+ return self.getDict(), taskMetaList\r
+\r
+\r
+class FlowParser(object):\r
+ def __init__(self, flowList, stepObjArr):\r
+ self._mainFlow = {}\r
+ self._subFlowDict = {}\r
+ self._stepObjArr = stepObjArr\r
+ self._normalTasks = []\r
+ for flow in flowList:\r
+ if flow['name'] == "main":\r
+ self._mainFlow = flow\r
+ else:\r
+ self._subFlowDict[flow['name']] = flow\r
+\r
+ def parseMainFlow(self):\r
+ return self.parseOrderList(self._mainFlow['orders'], self._stepObjArr)\r
+\r
+ def parse(self, obj, stepObjArr):\r
+ if isinstance(obj, str):\r
+ return self.parseFlow(obj, stepObjArr)\r
+ else:\r
+ return self.parseOrderList(obj, stepObjArr)\r
+\r
+ def parseFlow(self, flowName, stepObjArr):\r
+ orderList = self._subFlowDict[flowName]['orders']\r
+ return self.parseOrderList(orderList, stepObjArr)\r
+\r
+ def parseOrderList(self, orderList, stepObjArr):\r
+ tasks = []\r
+ taskMetaAllList = []\r
+ for order in orderList:\r
+ if order['type'] == "normal":\r
+ genTask = NormalTask(order, stepObjArr, self)\r
+ self._normalTasks.append(genTask)\r
+ elif order['type'] == "switch":\r
+ genTask = SwitchTask(order, stepObjArr, self)\r
+ elif order['type'] == "parallel":\r
+ genTask = ParallelTask(order, stepObjArr, self)\r
+ tasks.append(genTask.getDict())\r
+\r
+ if order['type'] == "parallel":\r
+ joinTask = genTask.getJoinTask()\r
+ tasks.append(joinTask.getDict())\r
+\r
+ taskMetaList = genTask.getTaskMetaList()\r
+ if taskMetaList is not None:\r
+ taskMetaAllList.extend(taskMetaList)\r
+ return tasks, taskMetaAllList\r
+\r
+ def getNormalTaskList(self):\r
+ normalTasksDict = []\r
+ for normalTask in self._normalTasks:\r
+ normalTasksDict.append(normalTask.getDict())\r
+ return normalTasksDict\r
+\r
+ def getNormalTask(self, stepId):\r
+ for normalTask in self._normalTasks:\r
+ if normalTask.getStepId() == stepId:\r
+ return normalTask\r
+ return None\r
+\r
+\r
+class BaseWorkflowTask(object):\r
+ def __init__(self, name):\r
+ self._name = name\r
+ self._taskReferenceName = self._name + "_task_%s" % getRandString(10)\r
+ self._type = ''\r
+ self._args = {}\r
+\r
+ def __str__(self):\r
+ dictObj = self.getDict()\r
+ return str(dictObj)\r
+\r
+ def getDict(self):\r
+ d1 = {\r
+ "name": self._name,\r
+ "taskReferenceName": self._taskReferenceName,\r
+ "type": self._type\r
+ }\r
+ return dict(d1, **self._args)\r
+\r
+ def getName(self):\r
+ return self._name\r
+\r
+ def getReferenceName(self):\r
+ return self._taskReferenceName\r
+\r
+ def getTaskMetaList(self):\r
+ taskFile = TaskFile()\r
+ return [taskFile.generateFromStep(self)]\r
+\r
+\r
+class NormalTask(BaseWorkflowTask):\r
+ def __init__(self, order, stepObjArr, flowParser):\r
+ relatedStepObj = stepObjArr[order['step'] - 1]\r
+ super(NormalTask, self).__init__(relatedStepObj.getName())\r
+ self._taskReferenceName = "task_%s" % getRandString(10)\r
+ self._stepId = relatedStepObj.getId()\r
+ self._type = "HTTP"\r
+ self._args['inputParameters'] = relatedStepObj.getArgs()\r
+ self._paramTransform(self._args['inputParameters'], flowParser)\r
+ print "NormalTask:----------------------\n", relatedStepObj.getArgs()\r
+\r
+ def _paramTransform(self, argsDict, flowParser):\r
+ for (k, v) in argsDict.items():\r
+ if isinstance(v, str):\r
+ if re.match("^\(\(\d+\..*\)\)", v):\r
+ v = v[2:-2]\r
+ stepId, outputParam = v.split(".")\r
+ stepId = int(stepId)\r
+ normalTask = flowParser.getNormalTask(stepId)\r
+ if normalTask is None:\r
+ continue\r
+ argsDict[k] = "${%s.output.response.body.%s}" % \\r
+ (normalTask.getReferenceName(), outputParam)\r
+ elif isinstance(v, dict):\r
+ self._paramTransform(v, flowParser)\r
+\r
+ def getStepId(self):\r
+ return self._stepId\r
+\r
+\r
+class SwitchTask(BaseWorkflowTask):\r
+ seqNumber = 0\r
+\r
+ def __init__(self, order, stepObjArr, flowParser):\r
+ super(SwitchTask, self).__init__("switch_" + str(SwitchTask.seqNumber))\r
+ SwitchTask.seqNumber = SwitchTask.seqNumber + 1\r
+ if 'name' in order:\r
+ self._name = order['name']\r
+ self._type = "DECISION"\r
+ caseValueParam = 'value'\r
+ order['value'] = order['value'][2:-2]\r
+ stepId, outputParam = order['value'].split(".")\r
+ stepId = int(stepId)\r
+ normalTask = flowParser.getNormalTask(stepId)\r
+ caseValue = "${%s.output.response.body.%s}" % \\r
+ (normalTask.getReferenceName(), outputParam)\r
+ self._args['inputParameters'] = {caseValueParam: caseValue}\r
+ self._args['caseValueParam'] = caseValueParam\r
+ self._args['decisionCases'] = {}\r
+ self._childTaskMetaList = []\r
+ for case, caseOrders in order['cases'].items():\r
+ self._args['decisionCases'][case], taskMetaList = \\r
+ flowParser.parse(caseOrders, stepObjArr)\r
+ if taskMetaList is not None:\r
+ self._childTaskMetaList.extend(taskMetaList)\r
+\r
+ def getTaskMetaList(self):\r
+ selfTaskMetaList = super(SwitchTask, self).getTaskMetaList()\r
+ selfTaskMetaList.extend(self._childTaskMetaList)\r
+ return selfTaskMetaList\r
+\r
+\r
+class ParallelTask(BaseWorkflowTask):\r
+ seqNumber = 0\r
+\r
+ def __init__(self, order, stepObjArr, flowParser):\r
+ InstSeqNumber = ParallelTask.seqNumber\r
+ super(ParallelTask, self).__init__("parallel_" + str(InstSeqNumber))\r
+ ParallelTask.seqNumber = ParallelTask.seqNumber + 1\r
+ if 'name' in order:\r
+ self._name = order['name']\r
+ self._type = "FORK_JOIN"\r
+ self._args['forkTasks'] = []\r
+ self._childTaskMetaList = []\r
+ lastTasksNameList = []\r
+ parallelList = order['parallel'].items()\r
+ parallelList.sort()\r
+ for key, orderList in parallelList:\r
+ print orderList\r
+ taskList, taskMetaList = flowParser.parse(orderList, stepObjArr)\r
+ self._args['forkTasks'].append(taskList)\r
+ lastTasksNameList.append(taskList[-1]['taskReferenceName'])\r
+ if taskMetaList is not None:\r
+ self._childTaskMetaList.extend(taskMetaList)\r
+ self._joinTaskObj = ParallelJoinTask(InstSeqNumber, lastTasksNameList)\r
+\r
+ def getTaskMetaList(self):\r
+ selfTaskMetaList = super(ParallelTask, self).getTaskMetaList()\r
+ selfTaskMetaList.extend(self._childTaskMetaList)\r
+ selfTaskMetaList.extend(self._joinTaskObj.getTaskMetaList())\r
+ return selfTaskMetaList\r
+\r
+ def getJoinTask(self):\r
+ return self._joinTaskObj\r
+\r
+\r
+class ParallelJoinTask(BaseWorkflowTask):\r
+ def __init__(self, seqNumber, joinOnList):\r
+ super(ParallelJoinTask, self).__init__(\r
+ "paralleljoin_" + str(seqNumber))\r
+ self._type = "JOIN"\r
+ self._args['joinOn'] = joinOnList\r
+\r
+\r
+def getRandString(length):\r
+ return "".join(random.choice(str("0123456789")) for i in range(length))\r
echo "export OS_CACERT=${OS_CACERT}" >> ${OPENRC}
cat ${OPENRC}
else
- error "Couldn't find openstack cacert file: ${OS_CACERT}, please check if the it's been properly provided."
+ info "Couldn't find openstack cacert file: ${OS_CACERT}, please check if the it's been properly provided."
fi
else
error "Couldn't find openstack rc file: ${OPENRC}, please check if the it's been properly provided."
if [[ -f "/tmp/id_rsa" ]]; then
info "Path of ssh key file for openstack nodes is /tmp/id_rsa"
else
- error "Couldn't find the ssh key file for openstack nodes. If you are using user/pwd in pod.yaml, please ignore."
+ info "Couldn't find the ssh key file for openstack nodes. If you are using user/pwd in pod.yaml, please ignore."
fi
fi
def get_session():
auth = get_session_auth()
- try:
- cacert = os.environ['OS_CACERT']
- except KeyError:
- return session.Session(auth=auth)
- else:
- insecure = os.getenv('OS_INSECURE', '').lower() == 'true'
- cacert = False if insecure else cacert
+ if os.getenv('OS_INSECURE', '').lower() == 'true':
+ cacert = False
return session.Session(auth=auth, verify=cacert)
+ else:
+ try:
+ cacert = os.environ['OS_CACERT']
+ except KeyError:
+ return session.Session(auth=auth)
+ else:
+ return session.Session(auth=auth, verify=cacert)
def get_endpoint(service_type, endpoint_type='publicURL'):
--- /dev/null
+#!/bin/bash
+##############################################################################
+# Copyright (c) 2018 Huawei Technologies Co.,Ltd and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+usage="Script to install and config golang of specific version.
+
+usage:
+ bash $(basename "$0") [-h|--help] [-v|--version <version>] [--debug]
+
+where:
+ -h|--help show the help text
+ -v|--version input the version of golang
+ --debug debug option switch
+examples:
+ $(basename "$0") -v 1.10.3"
+
+# Debug option
+redirect="/dev/null"
+
+# Process input variables
+while [[ $# > 0 ]]
+ do
+ key="$1"
+ case $key in
+ -h|--help)
+ echo "$usage"
+ exit 0
+ shift
+ ;;
+ -v|--version)
+ GOLANG_VERSION="$2"
+ shift
+ ;;
+ --debug)
+ redirect="/dev/stdout"
+ shift
+ ;;
+ *)
+ echo "unkown option $1 $2"
+ exit 1
+ ;;
+ esac
+ shift
+done
+
+#set -e
+
+echo "=======Downloading golang of version: ${GOLANG_VERSION}========"
+
+if [[ -f go${GOLANG_VERSION}.linux-amd64.tar.gz ]]; then
+ rm go${GOLANG_VERSION}.linux-amd64.tar.gz
+fi
+curl -O https://storage.googleapis.com/golang/go${GOLANG_VERSION}.linux-amd64.tar.gz >${redirect}
+
+echo "Installing golang of version: ${GOLANG_VERSION}"
+if [[ -d /usr/local/go ]]; then
+ rm -rf /usr/local/go
+fi
+
+tar -C /usr/local -xzf go${GOLANG_VERSION}.linux-amd64.tar.gz >${redirect}
+
+if [[ -d $HOME/go ]]; then
+ rm -rf ${HOME}/go
+ mkdir ${HOME}/go
+ mkdir ${HOME}/go/bin
+ mkdir ${HOME}/go/src
+else
+ mkdir ${HOME}/go
+ mkdir ${HOME}/go/bin
+ mkdir ${HOME}/go/src
+fi
+
+echo "Adding golang env to ~/.bashrc"
+GOROOT=/usr/local/go
+GOPATH=${HOME}/go
+
+if [[ $(cat ${HOME}/.bashrc | grep GOROOT) ]]; then
+ echo "golang env alreay in ${HOME}/.bashrc"
+else
+ cat <<EOF >> ${HOME}/.bashrc
+
+export GOROOT=/usr/local/go
+export GOPATH=${HOME}/go
+export PATH=${PATH}:${GOROOT}/bin:${GOPATH}/bin
+EOF
+fi
+
+export GOROOT=/usr/local/go
+export GOPATH=${HOME}/go
+export PATH=${PATH}:${GOROOT}/bin:${GOPATH}/bin
+
+echo "Running go version command:"
+go version
+
+echo "=======Installation of golang-${GOLANG_VERSION} complete======="
+
--- /dev/null
+#!/bin/bash
+##############################################################################
+# Copyright (c) 2018 Huawei Tech and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+K8S_CONFIG="/tmp/k8s_conig"
+
+usage="Script to prepare kubenetes test configurations.
+
+usage:
+ bash $(basename "$0") [-h|--help] [-i|--installer <installer typer>] [-c|--config <k8s config>]
+
+where:
+ -h|--help show the help text
+ -i|--installer specify the installer for the system to be monitored
+ <installer type>
+ one of the following:
+ (compass)
+examples:
+ $(basename "$0") -i compass"
+
+
+info () {
+ logger -s -t "BOTTLENECKS INFO" "$*"
+}
+
+error () {
+ logger -s -t "BOTTLENECKS ERROR" "$*"
+ exit 1
+}
+
+# Process input variables
+while [[ $# > 0 ]]
+ do
+ key="$1"
+ case $key in
+ -h|--help)
+ echo "$usage"
+ exit 0
+ shift
+ ;;
+ -i|--installer)
+ INSTALLER_TYPE="$2"
+ shift
+ ;;
+ -c|--config)
+ K8S_CONFIG="$2"
+ shift
+ ;;
+ *)
+ error "unkown input options $1 $2"
+ exit 1
+ ;;
+ esac
+ shift
+done
+
+if [[ ${INSTALLER_TYPE} == 'compass' ]]; then
+ sshpass -p root scp root@192.16.1.222:~/.kube/config ${K8S_CONFIG}
+else
+ echo "BOTTLENECKS EROOR: unrecognized installer"
+fi
--- /dev/null
+#!/bin/bash
+##############################################################################
+# Copyright (c) 2018 Huawei Technologies Co.,Ltd and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+export GOROOT=/usr/local/go
+export GOPATH=${HOME}/go
+export PATH=${PATH}:${GOROOT}/bin:${GOPATH}/bin
+
--- /dev/null
+#!/usr/bin/env python
+##############################################################################
+# Copyright (c) 2018 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+import os
+import utils.logger as log
+from kubernetes import client, watch
+
+
+LOG = log.Logger(__name__).getLogger()
+INSTALLER_TYPE = os.getenv("INSTALLER_TYPE")
+
+
+def get_config_path(INSTALLER_TYPE=None, CONFIG_PATH="/tmp/k8s_config"):
+ if INSTALLER_TYPE:
+ CMD = "bash k8s_config_pre.sh -i " + INSTALLER_TYPE + \
+ " -c " + CONFIG_PATH
+ LOG.info("Executing command: " + CMD)
+ CONFIG_PATH = os.popen(CMD)
+ else:
+ if not os.path.exists(CONFIG_PATH):
+ raise Exception("Must at least specify the path \
+of k8s config!")
+ return CONFIG_PATH
+
+
+def get_core_api(version='v1'):
+ if version.lower() == 'v1':
+ API = client.CoreV1Api()
+ LOG.info(API)
+ else:
+ raise Exception("Must input a validate verison!")
+ return API
+
+
+def watch_namespace(namespace, count=3, stop=None, request_timeout=0):
+ w = watch.Watch()
+ LOG.debug("Watch object generated: {}".format(w))
+ LOG.info("Watch stream generated: {}".format(
+ w.stream(namespace, _request_timeout=request_timeout)))
+ for event in w.stream(namespace, _request_timeout=request_timeout):
+ LOG.info("Event: %s %s" %
+ (event['type'], event['object'].metadata.name))
+ if event['object'].metadata.name == stop:
+ LOG.info("Namesapce successfully added.\n")
+ w.stop()
+ count -= 1
+ if not count:
+ LOG.info("Ended.\n")
+ w.stop()
--- /dev/null
+#!/bin/bash
+##############################################################################
+# Copyright (c) 2018 Huawei Tech and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+OS_TYPE=$(uname -a)
+OS_UBUNTU=$(echo $OS_TYPE | grep ubuntu)
+
+if [[ $OS_UBUNTU ]]; then
+ apt-get update && apt-get install -y apt-transport-https
+ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
+ touch /etc/apt/sources.list.d/kubernetes.list
+ echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | tee -a /etc/apt/sources.list.d/kubernetes.list
+ apt-get update
+ apt-get install -y kubectl
+else
+ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
+[kubernetes]
+name=Kubernetes
+baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
+enabled=1
+gpgcheck=1
+repo_gpgcheck=1
+gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
+EOF
+ yum install -y kubectl
+fi
+