aboutsummaryrefslogtreecommitdiffstats
path: root/tools/k8s/app-deployment/helm/pyscript
diff options
context:
space:
mode:
authorshreyagupta30 <shreyagupta3011@gmail.com>2021-09-27 14:35:36 +0530
committershreyagupta30 <shreyagupta3011@gmail.com>2021-10-11 23:16:53 +0530
commiteef9fef1141c6295b824b884ad86d645cd1c094f (patch)
tree1d1b6a8b08015eb190bb6cfbd56536ac4f10ad2d /tools/k8s/app-deployment/helm/pyscript
parent17e20bfa70d1a9ce5e6ee6687245e3e22f3633a8 (diff)
Automated deployment of helm charts with python
This patch adds demo helm charts and a python script that automatically deploys any helm chart of user's choice and print all the useful information about the chart. Signed-off-by: Shreya Gupta <shreyagupta3011@gmail.com> Change-Id: I06e3a8012602e09f601f70def386ef267c870e94
Diffstat (limited to 'tools/k8s/app-deployment/helm/pyscript')
-rw-r--r--tools/k8s/app-deployment/helm/pyscript/Pipfile18
-rw-r--r--tools/k8s/app-deployment/helm/pyscript/main.py172
2 files changed, 190 insertions, 0 deletions
diff --git a/tools/k8s/app-deployment/helm/pyscript/Pipfile b/tools/k8s/app-deployment/helm/pyscript/Pipfile
new file mode 100644
index 00000000..dd60181c
--- /dev/null
+++ b/tools/k8s/app-deployment/helm/pyscript/Pipfile
@@ -0,0 +1,18 @@
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+kubernetes = "*"
+pyyaml = "*"
+pick = "*"
+simplejson = "*"
+nested-lookup = "*"
+rich = "*"
+pylint = "*"
+
+[dev-packages]
+
+[requires]
+python_version = "3.9"
diff --git a/tools/k8s/app-deployment/helm/pyscript/main.py b/tools/k8s/app-deployment/helm/pyscript/main.py
new file mode 100644
index 00000000..1419f345
--- /dev/null
+++ b/tools/k8s/app-deployment/helm/pyscript/main.py
@@ -0,0 +1,172 @@
+# Copyright 2015-2017 Intel Corporation.
+#
+# 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.
+
+'''
+This script automatically develop helm charts and returns
+useful informations
+'''
+
+import os
+import subprocess
+from subprocess import PIPE, STDOUT
+import time
+import re
+from ast import literal_eval
+import yaml
+from rich.console import Console
+from rich.table import Table
+
+console = Console()
+
+def check_system_installations():
+ ''' Check system installations necessary for successful run of this script '''
+ try:
+ subprocess.run("helm version",shell=True,check=True)
+ subprocess.run("kubectl version --client",shell=True,
+ check= True)
+ subprocess.run("minikube version",shell=True,check=True)
+
+ except subprocess.CalledProcessError as error:
+ print (error.output)
+
+
+def parse_helm_chart(helm_path):
+ ''' Extract name of the chart '''
+ values_file = os.path.join(helm_path,"Chart.yaml")
+ with open(values_file, 'r', encoding='utf-8') as file:
+ doc = yaml.load(file)
+ name_of_chart = doc['name']
+
+ values_file = os.path.join(helm_path,"values.yaml")
+ with open(values_file, 'r',encoding='utf-8') as file:
+ doc = yaml.load(file)
+ n_pods = doc['replicas']
+ return (name_of_chart, n_pods)
+
+
+def service_details(name):
+ ''' Extract Service Details'''
+ print("\nDEPLOYEMENT DETAILS\n")
+
+ with subprocess.Popen(f"kubectl get service -o json {name}",shell=True,
+ stdin=PIPE, stdout=PIPE, stderr=STDOUT) as process:
+ output = process.stdout.read()
+ string = output.decode().replace("'", '"')
+ _j = literal_eval(string)
+
+ table = Table(show_header=True)
+
+ table.add_column("NAME")
+ table.add_column("Type")
+ table.add_column("CLUSTER-IP")
+ table.add_column("EXTERNAL-IP")
+ table.add_column("PORT(S)")
+
+ col=f'{_j["spec"]["ports"][0]["port"]}:{_j["spec"]["ports"][0]["nodePort"]}/{_j["spec"]["ports"][0]["protocol"]}'
+
+ table.add_row(
+ f'{_j["metadata"]["name"]}',
+ f'{_j["spec"]["type"]}',
+ f'{_j["spec"]["clusterIP"]}',
+ f'{_j["status"]["loadBalancer"]}',
+ col,
+ )
+ console.print(table)
+
+
+def pod_details(replicas):
+ ''' Extract Pod Details'''
+ print("\nPOD DETAILS\n")
+ with subprocess.Popen("kubectl get pods -o json", shell=True,
+ stdin=PIPE, stdout=PIPE, stderr=STDOUT) as process:
+ output = process.stdout.read()
+ pod_string = output.decode().replace("'", '"')
+ # true = True
+ # null = None
+ # false = False
+ pod_json = literal_eval(pod_string)
+
+ table = Table(show_header=True)
+
+ table.add_column("POD NAME")
+ table.add_column("NAMESPACE")
+ table.add_column("HOST-IP")
+ table.add_column("PHASE")
+ table.add_column("POD-IP")
+ table.add_column("POD-IPs")
+ podname = pod_json["items"][0]["metadata"]["name"]
+
+ for i in range(replicas):
+ table.add_row(
+ f'{pod_json["items"][i]["metadata"]["name"]}',
+ f'{pod_json["items"][i]["metadata"]["namespace"]}',
+ f'{pod_json["items"][i]["status"]["hostIP"]}',
+ f'{pod_json["items"][i]["status"]["phase"]}',
+ f'{pod_json["items"][i]["status"]["podIP"]}',
+ f'{pod_json["items"][i]["status"]["podIPs"]}',
+ )
+ console.print(table)
+
+ ip_interface(podname)
+
+
+def ip_interface(podname):
+ ''' Extract Network IP'''
+ with subprocess.Popen(f"kubectl exec -i {podname} -c nginx -- ip -o a", shell=True,
+ stdin=PIPE, stdout=PIPE, stderr=STDOUT) as process:
+ output = process.stdout.read()
+ _string = output.decode().replace("'", '"')
+ ipregex = r"((?:[0-9]{1,3}[.]){3}[0-9]{1,3}/[0-9]{1,2})"
+ ipregex2 = r"((?:[0-9]{1,3}[.]){3}[0-9]{1,3})"
+ list1=re.findall(ipregex, _string)
+ list2=re.findall(ipregex2 ,_string)
+ ip_list = list1 + list2
+ ip_string = ', '.join(ip_list)
+
+ table = Table(show_header=True)
+
+ table.add_column("POD NAME")
+ table.add_column("INTERFACE IPs")
+
+ table.add_row(
+ podname,
+ ip_string,
+ )
+ console.print(table)
+
+
+def main():
+ ''' Main Function '''
+ check_system_installations()
+
+ helm_location = input("Enter the location of helm chart: ")
+ name,replicas = parse_helm_chart(helm_location)
+
+ subprocess.run(f"helm install {name} {helm_location}",shell=True,
+ check = True).stdout.read()
+ time.sleep(10)
+
+ # status of helm charts
+ print("\nStatus of helm charts\n")
+ subprocess.Popen("helm list", shell =True,stdout=subprocess.PIPE,).communicate()
+ print("--" * 50)
+
+ #pod details
+ pod_details(replicas)
+
+ #deployment details
+ service_details(name)
+
+if __name__ == "__main__":
+ main()