Skip to content

Commit bcac010

Browse files
committed
add | create kube resources from directory
1 parent 815d70c commit bcac010

File tree

7 files changed

+248
-136
lines changed

7 files changed

+248
-136
lines changed

go-automation/kube_clients.go

+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package goautomation
2+
3+
import (
4+
"context"
5+
"encoding/base64"
6+
"fmt"
7+
"io/ioutil"
8+
"log"
9+
"net/http"
10+
11+
"golang.org/x/oauth2"
12+
"golang.org/x/oauth2/google"
13+
"google.golang.org/api/container/v1"
14+
"google.golang.org/api/option"
15+
"k8s.io/client-go/kubernetes"
16+
"k8s.io/client-go/rest"
17+
"k8s.io/client-go/tools/clientcmd"
18+
)
19+
20+
func GetGKEClinetset(cluster *container.Cluster, ts oauth2.TokenSource) (*kubernetes.Clientset, error) {
21+
capem, err := base64.StdEncoding.DecodeString(cluster.MasterAuth.ClusterCaCertificate)
22+
if err != nil {
23+
return nil, fmt.Errorf("failed to decode cluster CA cert: %s", err)
24+
}
25+
26+
config := &rest.Config{
27+
Host: cluster.Endpoint,
28+
TLSClientConfig: rest.TLSClientConfig{
29+
CAData: capem,
30+
},
31+
}
32+
config.Wrap(func(rt http.RoundTripper) http.RoundTripper {
33+
return &oauth2.Transport{
34+
Source: ts,
35+
Base: rt,
36+
}
37+
})
38+
39+
clientset, err := kubernetes.NewForConfig(config)
40+
if err != nil {
41+
return nil, fmt.Errorf("failed to initialize clientset from config: %s", err)
42+
}
43+
return clientset, nil
44+
}
45+
46+
func GcpKubernetesSetup() (*kubernetes.Clientset, error){
47+
gcpServiceAccountKeyFile := "gcp_service_account_key.json"
48+
gkeLocation := "us-central1-c"
49+
gkeClusterName := "kube-cluster"
50+
// gkeNamespace := "default"
51+
52+
data, err := ioutil.ReadFile(gcpServiceAccountKeyFile)
53+
if err != nil {
54+
log.Fatalf("Failed to read GCP service account key file: %s", err)
55+
return nil, err
56+
}
57+
ctx := context.Background()
58+
59+
creds, err := google.CredentialsFromJSON(ctx, data, container.CloudPlatformScope)
60+
if err != nil {
61+
log.Fatalf("Failed to load GCP service account credintials: %s", err)
62+
return nil, err
63+
}
64+
65+
gkeService, err := container.NewService(ctx, option.WithHTTPClient(oauth2.NewClient(ctx, creds.TokenSource)))
66+
if err != nil {
67+
log.Fatalf("Failed to initialize kubernetes engine service: %s", err)
68+
return nil, err
69+
}
70+
71+
name := fmt.Sprintf("projects/%s/locations/%s/clusters/%s", creds.ProjectID, gkeLocation, gkeClusterName)
72+
cluster, err := container.NewProjectsLocationsClustersService(gkeService).Get(name).Do()
73+
if err != nil {
74+
log.Fatalf("Failed to load GKE cluster %q: %s", name, err)
75+
return nil, err
76+
}
77+
78+
clientset, err := GetGKEClinetset(cluster, creds.TokenSource)
79+
if err != nil {
80+
log.Fatalf("Failed to initialize kubernetes clientset: %s", err)
81+
return nil, err
82+
}
83+
84+
return clientset, nil
85+
}
86+
87+
func LocalKubernetesSetup() (*kubernetes.Clientset, error) {
88+
// load kubeconfig from the default config file
89+
kubeConfigPath := clientcmd.RecommendedHomeFile
90+
91+
// build config from config path
92+
config, err := clientcmd.BuildConfigFromFlags("", kubeConfigPath)
93+
if err != nil {
94+
panic(err.Error())
95+
}
96+
97+
// create a kubernetes clientset
98+
clientset, err := kubernetes.NewForConfig(config)
99+
if err != nil {
100+
panic(err.Error())
101+
}
102+
103+
return clientset, nil
104+
}
105+
106+

go-automation/kube_operations.go

+56
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ package goautomation
33
import (
44
"context"
55
"fmt"
6+
"os"
7+
"path/filepath"
8+
"sort"
9+
"strings"
610

711
appsv1 "k8s.io/api/apps/v1"
812
corev1 "k8s.io/api/core/v1"
@@ -142,3 +146,55 @@ func CreateResources(clientset *kubernetes.Clientset, yamlPath string) (error) {
142146
}
143147
return nil
144148
}
149+
150+
func getResourceKind(path string) string {
151+
dir := filepath.Dir(path)
152+
153+
parts := strings.Split(dir, string(os.PathSeparator))
154+
kind := parts[len(parts)-1]
155+
return kind
156+
}
157+
158+
func getOrderIndex(kind string) int {
159+
deploymentOrder := map[string]int{
160+
"configmap": 0,
161+
"deployment": 1,
162+
"service": 2,
163+
}
164+
return deploymentOrder[kind]
165+
}
166+
167+
func DeployResourcesFromDirectory(clientset *kubernetes.Clientset, kubeDir string) error {
168+
deploymentOrder := []string{"configmap", "deployment", "service"}
169+
resourceFiles := make(map[string][]string)
170+
err := filepath.Walk(kubeDir, func(path string, info os.FileInfo, err error) error {
171+
if err != nil {
172+
return err
173+
}
174+
175+
if !info.IsDir() {
176+
resourceKind := getResourceKind(path)
177+
resourceFiles[resourceKind] = append(resourceFiles[resourceKind], path)
178+
}
179+
return nil
180+
})
181+
if err != nil {
182+
return err
183+
}
184+
185+
sort.SliceStable(deploymentOrder, func(i, j int) bool {
186+
return getOrderIndex(deploymentOrder[i]) < getOrderIndex(deploymentOrder[j])
187+
})
188+
189+
for _, kind := range deploymentOrder{
190+
files := resourceFiles[kind]
191+
for _, file := range files {
192+
fmt.Printf("file : %s", file)
193+
err = CreateResources(clientset, file)
194+
if err != nil {
195+
return err
196+
}
197+
}
198+
}
199+
return nil
200+
}

go-automation/tests.go

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package goautomation
2+
3+
import (
4+
"fmt"
5+
"k8s.io/client-go/kubernetes"
6+
)
7+
8+
func ListAllResources(clientset *kubernetes.Clientset) {
9+
// testing list resource
10+
11+
// list the deployments in the default namespace
12+
deployments, err := ListResources(clientset, "Deployment")
13+
if err != nil {
14+
panic(err.Error())
15+
}
16+
fmt.Println("Deployments :")
17+
for _, deployment := range deployments{
18+
fmt.Println(deployment)
19+
}
20+
21+
// list the services in the default namespace
22+
services, err := ListResources(clientset, "Service")
23+
if err != nil {
24+
panic(err.Error())
25+
}
26+
fmt.Println("Services:")
27+
for _, service:= range services{
28+
fmt.Println(service)
29+
}
30+
31+
// list the configmaps in the default namespace
32+
configmaps, err := ListResources(clientset, "ConfigMap")
33+
if err != nil {
34+
panic(err.Error())
35+
}
36+
fmt.Println("Configmaps:")
37+
for _, configmap:= range configmaps{
38+
fmt.Println(configmap)
39+
}
40+
}

kube/nginx/configmap/configmap.yaml

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: nginx-configmap
5+
data:
6+
nginx.conf: |
7+
server {
8+
listen 80;
9+
server_name localhost;
10+
location / {
11+
root /usr/share/nginx/html;
12+
index index.html;
13+
}
14+
}

nginx-deployment.yaml kube/nginx/deployment/deployment.yaml

+10-2
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,25 @@ kind: Deployment
33
metadata:
44
name: nginx-deployment
55
spec:
6+
replicas: 1
67
selector:
78
matchLabels:
89
app: nginx
9-
replicas: 1
1010
template:
1111
metadata:
1212
labels:
1313
app: nginx
1414
spec:
1515
containers:
1616
- name: nginx
17-
image: nginx:latest
17+
image: nginx
1818
ports:
1919
- containerPort: 80
20+
volumeMounts:
21+
- name: nginx-config
22+
mountPath: /etc/nginx/nginx.conf
23+
subPath: nginx.conf
24+
volumes:
25+
- name: nginx-config
26+
configMap:
27+
name: nginx-configmap

kube/nginx/service/service.yaml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apiVersion: v1
2+
kind: Service
3+
metadata:
4+
name: nginx-service
5+
spec:
6+
selector:
7+
app: nginx
8+
ports:
9+
- protocol: TCP
10+
port: 80
11+
targetPort: 80
12+
type: LoadBalancer

0 commit comments

Comments
 (0)