summaryrefslogtreecommitdiffstats
path: root/clover/cloverctl/src/cloverkube/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'clover/cloverctl/src/cloverkube/main.go')
-rw-r--r--clover/cloverctl/src/cloverkube/main.go400
1 files changed, 400 insertions, 0 deletions
diff --git a/clover/cloverctl/src/cloverkube/main.go b/clover/cloverctl/src/cloverkube/main.go
new file mode 100644
index 0000000..e2854b5
--- /dev/null
+++ b/clover/cloverctl/src/cloverkube/main.go
@@ -0,0 +1,400 @@
+// Copyright (c) Authors of Clover
+//
+// 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
+
+package cloverkube
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+
+ appsv1 "k8s.io/api/apps/v1"
+ apiv1 "k8s.io/api/core/v1"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/client-go/kubernetes"
+ "k8s.io/client-go/tools/clientcmd"
+)
+
+func setClient() kubernetes.Interface {
+
+
+ kubeconfig := filepath.Join(
+ os.Getenv("HOME"), ".kube", "config",
+ )
+ config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
+ if err != nil {
+ panic(err.Error())
+ }
+
+ // create the clientset
+ clientset, err := kubernetes.NewForConfig(config)
+ if err != nil {
+ panic(err.Error())
+ }
+ return clientset
+}
+
+func setControllerDeploy () (*appsv1.Deployment, *apiv1.Service) {
+
+ deployment := &appsv1.Deployment{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "clover-controller",
+ },
+ Spec: appsv1.DeploymentSpec{
+ Selector: &metav1.LabelSelector{
+ MatchLabels: map[string]string{
+ "app": "clover-controller",
+ },
+ },
+ Template: apiv1.PodTemplateSpec{
+ ObjectMeta: metav1.ObjectMeta{
+ Labels: map[string]string{
+ "app": "clover-controller",
+ },
+ },
+ Spec: apiv1.PodSpec{
+ Containers: []apiv1.Container{
+ {
+ Name: "clover-controller",
+ Image: "localhost:5000/clover-controller:latest",
+ Ports: []apiv1.ContainerPort{
+ {
+ Name: "redis",
+ Protocol: apiv1.ProtocolTCP,
+ ContainerPort: 6379,
+ },
+ {
+ Name: "grpc",
+ Protocol: apiv1.ProtocolTCP,
+ ContainerPort: 50054,
+ },
+ {
+ Name: "gprcsecurity",
+ Protocol: apiv1.ProtocolTCP,
+ ContainerPort: 50052,
+ },
+ {
+ Name: "cassandra",
+ Protocol: apiv1.ProtocolTCP,
+ ContainerPort: 9042,
+ },
+
+
+ },
+ },
+ },
+ },
+ },
+ },
+ }
+
+ service := &apiv1.Service{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "clover-controller",
+ Labels: map[string]string{
+ "app": "clover-controller",
+ },
+
+ },
+ Spec: apiv1.ServiceSpec{
+ Selector: map[string]string{
+ "app": "clover-controller",
+ },
+ Type: "NodePort",
+ Ports: []apiv1.ServicePort{
+ {
+ Name: "http",
+ Port: 80,
+ NodePort: 32044,
+ Protocol: "TCP",
+ },
+ },
+ },
+ }
+
+ return deployment, service
+
+}
+
+func setCollectorDeploy () (*appsv1.Deployment, *apiv1.Service) {
+
+ deployment := &appsv1.Deployment{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "clover-collector",
+ },
+ Spec: appsv1.DeploymentSpec{
+ Selector: &metav1.LabelSelector{
+ MatchLabels: map[string]string{
+ "app": "clover-collector",
+ },
+ },
+ Template: apiv1.PodTemplateSpec{
+ ObjectMeta: metav1.ObjectMeta{
+ Labels: map[string]string{
+ "app": "clover-collector",
+ },
+ },
+ Spec: apiv1.PodSpec{
+ Containers: []apiv1.Container{
+ {
+ Name: "clover-collector",
+ Image: "localhost:5000/clover-collector:latest",
+ Ports: []apiv1.ContainerPort{
+ {
+ Name: "redis",
+ Protocol: apiv1.ProtocolTCP,
+ ContainerPort: 6379,
+ },
+ {
+ Name: "grpc",
+ Protocol: apiv1.ProtocolTCP,
+ ContainerPort: 50054,
+ },
+ {
+ Name: "prometheus",
+ Protocol: apiv1.ProtocolTCP,
+ ContainerPort: 9090,
+ },
+ {
+ Name: "jaeger",
+ Protocol: apiv1.ProtocolTCP,
+ ContainerPort: 16686,
+ },
+ {
+ Name: "cassandra",
+ Protocol: apiv1.ProtocolTCP,
+ ContainerPort: 9042,
+ },
+
+
+ },
+ },
+ },
+ },
+ },
+ },
+ }
+
+ service := &apiv1.Service{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "clover-collector",
+ Labels: map[string]string{
+ "app": "clover-collector",
+ },
+
+ },
+ Spec: apiv1.ServiceSpec{
+ Selector: map[string]string{
+ "app": "clover-collector",
+ },
+ Ports: []apiv1.ServicePort{
+ {
+ Name: "grpc",
+ Port: 50054,
+ },
+ {
+ Name: "redis",
+ Port: 6379,
+ },
+ {
+ Name: "prometheus",
+ Port: 9090,
+ },
+ {
+ Name: "jaeger",
+ Port: 16686,
+ },
+ {
+ Name: "cassandra",
+ Port: 9042,
+ },
+
+ },
+ },
+ }
+ return deployment, service
+}
+
+func DeployCloverSystem(action string, namespace string) {
+ if action == "create" {
+ // Create clover-system namespace
+ configNamespace("clover-system", "create")
+ // Controller
+ deployment, service := setControllerDeploy()
+ DeployService(deployment, service, namespace)
+ // Collector
+ deployment, service = setCollectorDeploy()
+ DeployService(deployment, service, namespace)
+ } else if action == "delete" {
+ fmt.Println("Deleting clover-system services...\n")
+ DeleteService("clover-controller", namespace)
+ DeleteService("clover-collector", namespace)
+ configNamespace("clover-system", "delete")
+ }
+
+}
+
+func DeleteService(deploy_name string, namespace string) {
+
+ clientset := setClient()
+ deploymentsClient := clientset.AppsV1().Deployments(namespace)
+ servicesClient := clientset.CoreV1().Services(namespace)
+
+ // Delete Deployment
+ deletePolicy := metav1.DeletePropagationForeground
+ if err := deploymentsClient.Delete(deploy_name, &metav1.DeleteOptions{
+ PropagationPolicy: &deletePolicy,
+ }); err != nil {
+ panic(err)
+ }
+ fmt.Printf("Deleted %s deployment\n", deploy_name)
+
+ // Delete Service
+ if err := servicesClient.Delete(deploy_name, &metav1.DeleteOptions{
+ PropagationPolicy: &deletePolicy,
+ }); err != nil {
+ panic(err)
+ }
+ fmt.Printf("Deleted %s service\n", deploy_name)
+}
+
+func DeployService(deployment *appsv1.Deployment, service *apiv1.Service, namespace string) {
+
+ clientset := setClient()
+ deploymentsClient := clientset.AppsV1().Deployments(namespace)
+
+
+ // Create Deployment
+ fmt.Println("Creating deployment...")
+ result, err := deploymentsClient.Create(deployment)
+ if err != nil {
+ panic(err)
+ }
+ fmt.Printf("Created deployment %q.\n", result.GetObjectMeta().GetName())
+
+ // Create Service
+ fmt.Println("Creating service...")
+ servicesClient := clientset.CoreV1().Services(namespace)
+
+ result1, err := servicesClient.Create(service)
+ if err != nil {
+ panic(err)
+ }
+ fmt.Printf("Created service %q.\n", result1.GetObjectMeta().GetName())
+
+}
+
+func configNamespace (name string, action string) {
+ clientset := setClient()
+ nameClient := clientset.CoreV1().Namespaces()
+
+ if action == "create" {
+ namespace := &apiv1.Namespace{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: name,
+ },
+ }
+ nameClient.Create(namespace)
+ fmt.Printf("Created %s namespace\n", name)
+ } else if action == "delete" {
+ deletePolicy := metav1.DeletePropagationForeground
+ if err := nameClient.Delete(name, &metav1.DeleteOptions{
+ PropagationPolicy: &deletePolicy,
+ }); err != nil {
+ panic(err)
+ }
+ fmt.Printf("Deleted %s namespace\n", name)
+ }
+}
+
+func GetServices() *apiv1.ServiceList {
+
+ clientset := setClient()
+ services, err := clientset.Core().Services("").List(metav1.ListOptions{})
+ for _, service := range services.Items {
+ if err != nil {
+ panic(err.Error())
+ }
+ fmt.Printf(" * SERVICE Name: %s\n", service.GetName())
+ fmt.Printf("Kind: %s\n", service.Kind)
+ fmt.Printf("Labels: %s\n", service.GetLabels())
+ fmt.Printf("Type: %s\n", service.Spec.Type)
+ //fmt.Printf("External IP: %v\n", service.Spec.ExternalIPs)
+ fmt.Printf("Cluster IP: %s\n", service.Spec.ClusterIP)
+
+ for _, port := range service.Spec.Ports {
+ fmt.Printf("Port Name: %s, Port# %d, NodePort: %d\n", port.Name, port.Port, port.NodePort)
+ }
+
+ for _, ip := range service.Status.LoadBalancer.Ingress {
+ fmt.Printf("LB IP: %s \n", ip.IP)
+ }
+ }
+ return services
+}
+
+func GetDeployments(namespace string) []appsv1.Deployment {
+
+ clientset := setClient()
+
+ deploymentsClient := clientset.AppsV1().Deployments(namespace)
+ list, err := deploymentsClient.List(metav1.ListOptions{})
+ if err != nil {
+ panic(err)
+ }
+ for _, d := range list.Items {
+ fmt.Printf(" * %s (%d replicas)\n", d.Name, *d.Spec.Replicas)
+ }
+ return list.Items
+}
+
+func GetServicesPortIP(service_name string) (int32, string) {
+
+ clientset := setClient()
+ services, err := clientset.Core().Services("").List(metav1.ListOptions{})
+ var nodeport int32
+ var ipaddress string
+ nodeport = 0
+ ipaddress = ""
+ for _, service := range services.Items {
+ if err != nil {
+ panic(err.Error())
+ }
+ if service.GetName() == service_name {
+ for _, port := range service.Spec.Ports {
+ if port.NodePort > 0 {
+ nodeport = port.NodePort
+ }
+ }
+ for _, ip := range service.Status.LoadBalancer.Ingress {
+ ipaddress = ip.IP
+ }
+ }
+ }
+
+ return nodeport, ipaddress
+}
+
+func GetPodsIP(pod_name string, namespace string) []string {
+
+ clientset := setClient()
+
+ var ips []string
+ pods, err := clientset.CoreV1().Pods(namespace).List(metav1.ListOptions{})
+ if err != nil {
+ panic(err)
+ }
+ for _, pod := range pods.Items {
+ if strings.Contains(pod.Name, pod_name) {
+ fmt.Println(pod.Name, pod.Status.PodIP)
+ ips = append(ips, pod.Status.PodIP)
+ }
+ }
+
+ return ips
+}