-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
129 lines (115 loc) · 3.67 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package main
import (
"context"
"fmt"
"os"
"path/filepath"
"time"
v1 "k8s.io/api/apps/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
)
func main() {
var (
client *kubernetes.Clientset
deploymentLabels map[string]string
expectedPods int32
err error
)
ctx := context.Background()
if client, err = getClient(); err != nil {
fmt.Fprintf(os.Stderr, "Error: %s", err)
os.Exit(1)
}
if deploymentLabels, expectedPods, err = deploy(ctx, client); err != nil {
fmt.Fprintf(os.Stderr, "Error: %s", err)
os.Exit(1)
}
if err = waitForPods(ctx, client, deploymentLabels, expectedPods); err != nil {
fmt.Fprintf(os.Stderr, "Error: %s", err)
os.Exit(1)
}
fmt.Printf("deploy finished, the deployment has lables: %s\n", deploymentLabels)
}
func getClient() (*kubernetes.Clientset, error) {
// use the current context in kubeconfig
config, err := clientcmd.BuildConfigFromFlags("", filepath.Join(homedir.HomeDir(), ".kube", "config"))
if err != nil {
return nil, err
}
// create the clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, err
}
return clientset, nil
}
func deploy(ctx context.Context, client *kubernetes.Clientset) (map[string]string, int32, error) {
var deployment *v1.Deployment
appFile, err := os.ReadFile("app.yaml")
if err != nil {
return nil, 0, fmt.Errorf("readfile error: %s", err)
}
obj, groupVersionKind, err := scheme.Codecs.UniversalDeserializer().Decode(appFile, nil, nil)
if err != nil {
return nil, 0, fmt.Errorf("Decode error: %s", err)
}
//checking whether it's a deployment k8s object
//or any other object
switch obj.(type) {
case *v1.Deployment:
deployment = obj.(*v1.Deployment)
default:
return nil, 0, fmt.Errorf("unrecognized type: %s", groupVersionKind)
}
_, err = client.AppsV1().Deployments("default").Get(ctx, deployment.Name, metav1.GetOptions{})
if err != nil && errors.IsNotFound(err) {
deploymentResponse, err := client.AppsV1().Deployments("default").Create(ctx, deployment, metav1.CreateOptions{})
if err != nil {
return nil, 0, fmt.Errorf("deployment error: %s", err)
}
return deploymentResponse.Spec.Template.Labels, *deploymentResponse.Spec.Replicas, nil
} else if err != nil && !errors.IsNotFound(err) {
return nil, 0, fmt.Errorf("deployment name issue: %s", err)
}
deploymentResponse, err := client.AppsV1().Deployments("default").Update(ctx, deployment, metav1.UpdateOptions{})
if err != nil {
return nil, 0, fmt.Errorf("deployment error: %s", err)
}
return deploymentResponse.Spec.Template.Labels, *deploymentResponse.Spec.Replicas, nil
}
func waitForPods(ctx context.Context, client *kubernetes.Clientset, deployLabels map[string]string, expectedPods int32) error {
for {
valid, err := labels.ValidatedSelectorFromSet(deployLabels)
if err != nil {
return fmt.Errorf("validatedselectorfromset error: %s", err)
}
podList, err := client.CoreV1().Pods("default").List(ctx, metav1.ListOptions{
LabelSelector: valid.String(),
})
if err != nil {
return fmt.Errorf("pod list error: %s", err)
}
podsRunning := 0
for _, pod := range podList.Items {
if pod.Status.Phase == "Running" {
podsRunning++
}
}
if podsRunning == 0 {
continue
} else {
fmt.Printf("Waiting for pods to become ready (running %d / %d)\n", podsRunning, len(podList.Items))
}
if podsRunning > 0 && podsRunning == len(podList.Items) && podsRunning == int(expectedPods) {
break
}
time.Sleep(5 * time.Second)
}
return nil
}