-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
97 lines (77 loc) · 3.34 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
package main
import (
"context"
"fmt"
"log"
"os"
"time"
"cloud.google.com/go/logging/logadmin"
"github.com/olekukonko/tablewriter"
flag "github.com/spf13/pflag"
"google.golang.org/api/iterator"
"google.golang.org/genproto/googleapis/cloud/audit"
)
func main() {
projectID := flag.String("projectID", "", "GCP Project ID")
clusterName := flag.String("clusterName", "", "GKE Cluster Name")
sinceDays := flag.Int64("sinceDays", 2, "How many days back to query for?")
flag.Parse()
if *projectID == "" || *clusterName == "" {
log.Fatal("required parameter is missing")
}
ctx := context.Background()
client, err := logadmin.NewClient(ctx, *projectID)
if err != nil {
log.Fatalf("failed creating log client: %v", err)
}
fmt.Printf("Showing GKE Master and worker node upgrades history of cluster [%v] at project ID [%v] for the last [%v] days. Please wait...\n", *clusterName, *projectID, *sinceDays)
fmt.Println("--- GKE Master Upgrades ---")
table := tablewriter.NewWriter(os.Stdout)
table.SetColWidth(60)
table.SetHeader([]string{"Time", "Previous Master Version", "Current Master Version"})
durationSince := time.Duration(*sinceDays) * 24 * time.Hour
sinceTs := time.Now().Add(-durationSince).Format(time.RFC3339)
logFilter := fmt.Sprintf("resource.labels.cluster_name=\"%s\" AND resource.type=\"gke_cluster\" AND\nlog_id(\"cloudaudit.googleapis.com/activity\") \nAND timestamp > \"%s\"", *clusterName, sinceTs)
it := client.Entries(ctx, logadmin.Filter(logFilter))
for {
entry, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Fatalf("failed using iterator: %v", err)
}
auditLogEntry := entry.Payload.(*audit.AuditLog)
if auditLogEntry.MethodName == "google.container.v1.ClusterManager.UpdateCluster" && auditLogEntry.GetMetadata().GetFields() != nil {
currentMasterVersion := auditLogEntry.Metadata.Fields["currentMasterVersion"]
previousMasterVersion := auditLogEntry.Metadata.Fields["previousMasterVersion"]
table.Append([]string{entry.Timestamp.String(), previousMasterVersion.GetStringValue(), currentMasterVersion.GetStringValue()})
}
if auditLogEntry.MethodName == "google.container.v1.ClusterManager.UpdateNodePool" && auditLogEntry.GetRequest().GetFields() != nil {
nodeVersion := auditLogEntry.Request.Fields["nodeVersion"]
fmt.Printf("Found GKE node pool upgrade. time: %v, currentVersion: %v\n", entry.Timestamp.String(), nodeVersion.GetStringValue())
}
}
table.Render()
fmt.Println("--- GKE Node Pool Upgrades ---")
table = tablewriter.NewWriter(os.Stdout)
table.SetColWidth(60)
table.SetHeader([]string{"Time", "Current Node Version"})
logFilter = fmt.Sprintf("resource.labels.cluster_name=\"%s\" AND log_id(\"cloudaudit.googleapis.com/activity\") AND\nresource.type=\"gke_nodepool\" \nAND timestamp > \"%s\"", *clusterName, sinceTs)
it = client.Entries(ctx, logadmin.Filter(logFilter))
for {
entry, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Fatalf("failed using iterator: %v", err)
}
auditLogEntry := entry.Payload.(*audit.AuditLog)
if auditLogEntry.MethodName == "google.container.v1.ClusterManager.UpdateNodePool" && auditLogEntry.GetRequest().GetFields() != nil {
nodeVersion := auditLogEntry.Request.Fields["nodeVersion"]
table.Append([]string{entry.Timestamp.String(), nodeVersion.GetStringValue()})
}
}
table.Render()
}