From 7a109db50e33ef27fd3df7e2a42bbd3f09c34ac1 Mon Sep 17 00:00:00 2001
From: Simon Barras <simon.barras02@gmail.com>
Date: Thu, 27 Apr 2023 16:37:24 +0200
Subject: [PATCH 01/18] Listen to namespace event

---
 cmd/main.go                  | 28 ++++++++++++++++++---
 go.mod                       | 47 ++++++++++++++++++++++++++++++++++++
 kubeconfig                   | 20 +++++++++++++++
 pkg/cluser/clusterFetcher.go |  5 ++++
 pkg/event/clusterListener.go | 29 ++++++++++++++++++++++
 pkg/helloWorld.go            |  5 ----
 6 files changed, 126 insertions(+), 8 deletions(-)
 create mode 100644 kubeconfig
 create mode 100644 pkg/cluser/clusterFetcher.go
 create mode 100644 pkg/event/clusterListener.go
 delete mode 100644 pkg/helloWorld.go

diff --git a/cmd/main.go b/cmd/main.go
index 7aaeeed..eedb23f 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -1,10 +1,32 @@
 package main
 
 import (
-	"container-clusterviewer/pkg"
-	"fmt"
+	"container-clusterviewer/pkg/event"
+	"context"
+	log "github.com/sirupsen/logrus"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/client-go/kubernetes"
+	"k8s.io/client-go/tools/clientcmd"
+)
+
+var (
+	config, _    = clientcmd.BuildConfigFromFlags("", "./kubeconfig")
+	clientset, _ = kubernetes.NewForConfig(config)
 )
 
 func main() {
-	fmt.Print(pkg.SayHello())
+
+	clusterLister := event.ClusterListener{}
+	err := clusterLister.ListenToEvent(clientset)
+	if err != nil {
+		return
+	}
+
+	list, _ := clientset.CoreV1().Namespaces().List(context.Background(), v1.ListOptions{})
+	pods, _ := clientset.CoreV1().Pods("").List(context.Background(), v1.ListOptions{})
+	log.Info(len(pods.Items))
+
+	for _, item := range list.Items {
+		log.Info(item.Name)
+	}
 }
diff --git a/go.mod b/go.mod
index 0ead7de..c683e40 100644
--- a/go.mod
+++ b/go.mod
@@ -1,3 +1,50 @@
 module container-clusterviewer
 
 go 1.19
+
+require (
+	github.com/sirupsen/logrus v1.9.0
+	k8s.io/apimachinery v0.27.1
+	k8s.io/client-go v0.27.1
+)
+
+require (
+	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/emicklei/go-restful/v3 v3.9.0 // indirect
+	github.com/go-logr/logr v1.2.3 // indirect
+	github.com/go-openapi/jsonpointer v0.19.6 // indirect
+	github.com/go-openapi/jsonreference v0.20.1 // indirect
+	github.com/go-openapi/swag v0.22.3 // indirect
+	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/golang/protobuf v1.5.3 // indirect
+	github.com/google/gnostic v0.5.7-v3refs // indirect
+	github.com/google/go-cmp v0.5.9 // indirect
+	github.com/google/gofuzz v1.1.0 // indirect
+	github.com/google/uuid v1.3.0 // indirect
+	github.com/imdario/mergo v0.3.6 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
+	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
+	github.com/spf13/pflag v1.0.5 // indirect
+	golang.org/x/net v0.8.0 // indirect
+	golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect
+	golang.org/x/sys v0.6.0 // indirect
+	golang.org/x/term v0.6.0 // indirect
+	golang.org/x/text v0.8.0 // indirect
+	golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
+	google.golang.org/appengine v1.6.7 // indirect
+	google.golang.org/protobuf v1.28.1 // indirect
+	gopkg.in/inf.v0 v0.9.1 // indirect
+	gopkg.in/yaml.v2 v2.4.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+	k8s.io/api v0.27.1 // indirect
+	k8s.io/klog/v2 v2.90.1 // indirect
+	k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a // indirect
+	k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect
+	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
+	sigs.k8s.io/yaml v1.3.0 // indirect
+)
diff --git a/kubeconfig b/kubeconfig
new file mode 100644
index 0000000..a86cc3f
--- /dev/null
+++ b/kubeconfig
@@ -0,0 +1,20 @@
+apiVersion: v1
+clusters:
+- cluster:
+    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdCakNDQSs2Z0F3SUJBZ0lVRjJjdmVQUUVGRS9FVjV2Zk9ZQ0tKNVpUdk5Bd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1dERUxNQWtHQTFVRUJoTUNRMGd4RFRBTEJnTlZCQWNNQkZwU1NERXhFVEFQQmdOVkJBb01DRVY0YjNOagpZV3hsTVF3d0NnWURWUVFMREFOVFMxTXhHVEFYQmdOVkJBTU1FR052Ym5SeWIyd3RjR3hoYm1VdFkyRXdJQmNOCk1qTXdOREUzTURneU9ERXpXaGdQTWpBM016QTBNRFF3T0RJNE1UaGFNRmd4Q3pBSkJnTlZCQVlUQWtOSU1RMHcKQ3dZRFZRUUhEQVJhVWtneE1SRXdEd1lEVlFRS0RBaEZlRzl6WTJGc1pURU1NQW9HQTFVRUN3d0RVMHRUTVJrdwpGd1lEVlFRRERCQmpiMjUwY205c0xYQnNZVzVsTFdOaE1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQXJHSUFJRlN1KzlUdjBETDZTeE55cy9HWUJwcXBrbHlnaHdienJqNGo0M3RvQWlhQ3pYRVAKTWZtdm5lRGRNL3pIUmZKd2tzY3NZa0IxL21mbVduMlZXNVRMekZqTFRNeGdlRmZ1c0E0UHBKdVl2WlB4Z3YzcgpzN0xMSkU1SlhxMTNld3B6YUt1YXJxV2Q4aGxVMHpXREhSbTZGdUFnaTRra1hZazVJVkpRMGdBc2M0L3doRlUwCkxLQ0tJdkRXUWlOQkFlUWdPd2d2Z29SK0pieHZJemVXa0VmaXpER3g1RUFWMVlMZ3ZYdUFRZ2dZMFZTT2RMRFYKT29rbmt1NUZuZUh0MExyL08rdDFORjZDQmRDSDZZMC90Q3Fhenc0VE94MnUzTW5pb1g3Vk1uZWlZdys0aWZoLwpUVDh2ayt1Zjd5c2ZqYzhteTlDOHNUN3lwSFVqUEhuZEVRelovM2w3a2R0clZ3anBvZWRwWXJ0L1lya3RRbHBpCkQrL095LzRaNVhUaXNOMWU2Y1BUenRzd2UwVnVkdDd5U3ZLcDZWS1VwaHVDcXZDR0MwdFNrdkhuNlRxRkl6NTcKWGE5TkRFN2U2emQ0b2Zvb3UvNnRvVDJ1WnQzQUJra3lVUXQwdFM3dHRvbEk1M3J3WkIvMFRtRm5RWDNod3hjTQphQjBGbzdhSkpGTU5JNGxBK2NaTlVncENnNHQxcUh1RHVwTmhLdzNpbVlpTjJpOW9QMnFCb1FWVGJhSU1ORDhyCjcrb25GcWVNdkg2dHlTWGRHSEhlZWJLZUNMU2MvU2hIREp6SkY0NWRLZ3lEd29McFNhTWFjdm9HbXRIanNzdk0Kd1pndFJRVnBIL3VTVmtzWHpWUU55RzNHZEpRSE00Wldud0JOTERJQmRTM1B2K2tNNWxQdVljVUNBd0VBQWFPQgp4VENCd2pCOUJnTlZIU01FZGpCMG9WeWtXakJZTVFzd0NRWURWUVFHRXdKRFNERU5NQXNHQTFVRUJ3d0VXbEpJCk1URVJNQThHQTFVRUNnd0lSWGh2YzJOaGJHVXhEREFLQmdOVkJBc01BMU5MVXpFWk1CY0dBMVVFQXd3UVkyOXUKZEhKdmJDMXdiR0Z1WlMxallZSVVGMmN2ZVBRRUZFL0VWNXZmT1lDS0o1WlR2TkF3SFFZRFZSME9CQllFRlBBKwp1NWZvN1lzUHMzejByZTByK3h2SURVRkJNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUF3RGdZRFZSMFBBUUgvCkJBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFDQmpPQzNwYVFlKzRCM2s1d00rM3pqbW5PNHZKaVUKWVduSS81ZHhndENUUmNRMW91WU9MSWUrcG41bWJjZi9udDNWbWhzdWsvNnhTZ3RHS3ZDeFhka2k3eE9rV1A0aApzNGQ1bU95RG11alVxVXVlTmpiUXcyQ2M3aXI0Y2tKU0Nlbm4zNExVU1kyYkxzaS85QTJ2WElmcGIrUGlkaEFRCjNqNmNwU1lFbmo1WHVNK0wzMjlOZUpqcFZPeUVDdDNjMVd1TXlSMm5wY0VoUGJSNmIydDR3MkQ5enRwSHRqeE4KeW45a29adzdEU0x0eFArNE9BSU5HdGJlam9Lai9MSkJyUGlHTVNNSGVKWHZqYU5rUzRLVEFMd1lwWkprT2RYYQpFSjFycnljQ2dZTXZDQVpwV0pjbnpNeVpSbndJQ2xsWGxLU25GSjU3T0tEaS9rbXU3Q0JhMlRtdWkxeXM5RmdtCndrUWc3SFhoV1VMOVE3UUoyam9JYldtakpPRXFtMTQzYm9TMXNxNFdPUDNlbCs4eFFnVEMvQkRldE9oSWg2cFEKRXJhVzN2WHUrUW9HNWVCSHVqdDRmZnIwSUN0US94UFlabGFsVHVET2JmYlVNakpLNjhrenpUZHJTS3NWaDM0VworTUVJTVFDbkNaQThRbHREZ0FLOVE3OVBhNlRvZFB2SXJmeWt5aFowLzBzdklSWjJsTnNjMS9hdXFLNkNWcDhUCnMrRlZEdkdGZk1sTWlobzFrUzkyc3ZSWElWVk5MSWRmZmhnbVpNcXJEcUdSc3pBTWp0Sk9oYUtZMWF5Q1FKc0cKdTlVMUdDNlFVSkhHTG9ZdDR3UEhqNXA2YXkvVEJjQW1WL2xIRnZza25tMVRHN1ZnYWxWc0h2cTVBK0p1Rm9hago4SzBlSW5OZWphbG02UT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
+    server: https://fa818a2e-0a5f-49cd-9582-abe745cc6223.sks-ch-dk-2.exo.io:443
+  name: exoscale
+contexts:
+- context:
+    cluster: exoscale
+    user: pi-admin
+  name: PI-GR4
+current-context: PI-GR4
+kind: Config
+preferences: {}
+users:
+- name: pi-admin
+  user:
+    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1RENDQTZDZ0F3SUJBZ0lVWHI2RVlkSW9yc0RVb212YmdKRUFZT1YyRHkwd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1ZERUxNQWtHQTFVRUJoTUNRMGd4RFRBTEJnTlZCQWNNQkZwU1NERXhFVEFQQmdOVkJBb01DRVY0YjNOagpZV3hsTVF3d0NnWURWUVFMREFOVFMxTXhGVEFUQmdOVkJBTU1ERzl3WlhKaGRHOXljeTFqWVRBZUZ3MHlNekEwCk1UY3hNVEE0TXpWYUZ3MHlNekExTVRjeE1UQTROREJhTUY0eEN6QUpCZ05WQkFZVEFrTklNUTB3Q3dZRFZRUUgKREFSYVVrZ3hNUmN3RlFZRFZRUUtEQTV6ZVhOMFpXMDZiV0Z6ZEdWeWN6RU1NQW9HQTFVRUN3d0RVMHRUTVJrdwpGd1lEVlFRRERCQnJkV0psY201bGRHVnpMV0ZrYldsdU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQXQyZTdSR1JGTlpSRVE1d0lUNXZpRHZZZUdYK0JiSGVlTlhMUHNvdG12MFMvdVdGNlRTeTcKWU5PUmd1Q2ZxRWUwdGF3c2JxVUp5UE5hUVA1VkVXQUIxaXhGSjE3b2tXbmc4NEx2YlJjb3NtQWhXOHgxZmlNRgp1cUp2c212bnhkWEMyQ2tsOU9zYVpiK3JEWjhHbXNnMFZKYk03ZFJyamlnSkpUbUFDYjFvOVR2akpUQ0hWeWlhClExdlNtdHlCV2hieTNtam9yS01SZlJoeHEyc0dOY0pMd2t5YTd3bklVRzVzcm9BckF2OHRaNXR3R3Jpc3dRMWwKeEkrZkNVN2cyeWc0N2NOaSs5c1J0SHJFMy9XMjlrRzlWQXcxWEZraU1xeG5wYkhGMno2MWREbkgyY3Fqb21hUQpzMmF2U0xrcVNkdWc4Rm1RNi9IWW9TaDV6Q2EycFVJT0w5b0NrNGxrVk13NDVSd1ZLN3hBVVNTM3czWDVXalpqClhPcERNZndyNHF6OFU3bzlEeUNRODVXaFdYWFNWY3Q2MkFCZEs4a1Fta3JDci9JNDVEU2RDN3JGQldOY1VCOWoKSDhFT3NoSzhWanM4Ym90KzY4ZDZvOTQ3MDFXZkswUzB4VlFpRDRQb0VkN0l6VXFReDVQNFNqeVR0YmVDWGhKSApCTThaUTViaWk2Ty85Q1RuZmxUVEt6aTM5UDVWUHZKQmJETXJQS3hlWDZlOW4wb0Y1QjJMbUVERXFWbkZma25oCk0yc3pCRVVYSkZqQzlnR0g0NHV2djAwUEJ3Q1RxZDNqK1VSYXh0K3ExelZPMDQvVmdDYmFUUVExc0JjeXk0dEgKWVJ4Z0FueHhJc2JqVXRpNDd2NGt0Q0c5T2p4cHl2SFVGdDhLNGdIQU5GYnlLRDdiRTM0eG9Ca0NBd0VBQWFONApNSFl3SHdZRFZSMGpCQmd3Rm9BVVlYcGI2YUdQR2Zqc2l3SnNndERZSkJwcEhnUXdIUVlEVlIwT0JCWUVGQko4CmRlODE5RGtSVU83WklLZFh4QnNwM20vM01Bd0dBMVVkRXdFQi93UUNNQUF3RGdZRFZSMFBBUUgvQkFRREFnV2cKTUJZR0ExVWRKUUVCL3dRTU1Bb0dDQ3NHQVFVRkJ3TUNNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJBVmxHTwo4MEtFUitSMEFBOCtlWE5ESDRuV3dwZmhyQmdJWUpIWkJIb2FrM0xtcHdwczBjSktGTnkxWXJlK2FFS3VPNGxKCjNIWk9BVFdpbXQ5WW5nRHFFWTRjaS9TSDRwTUhaaVdQYnNwdTFSYm9XZ3ZYMFNaam11SFI3WVVpdU0xemI3RUcKQzBCRXMvdGFLWTZnZTh4aUZ6UWdQQzBySGpkNks3OU1SbXFvR1dFL3pHWnlmWmJxNDJQZU10MzZ5dkZ3Q3AxZwpYNmRSbGprcWx5dE1VbHlNYlBmOWpuYzJOWGZmaDRqaWlhd1dWZTlxVXQxalpCQk5VbmplRlE4dUtvRmhyWUtMClNGUWY3NEptREtmZksyWDhBdjFHVk55YytDOStOSWtYMEtGdlJRL0M5QVFEMjRrMzdETGk5cjdMa0VBWVRmaGgKVG4xU1V4ZXFFRGZGQW1oZnhUSzdrdnYyMHYxNXFDa3hWUVdQdzhhZW96eVY4TmNWdUVIKzRzVVVMTHoxbTFHTwp3NlJuWW1vRHBIZklVT1A1S2ZhbWdWZ1hNVERpbE9QVEUwUk5qMjlUWHdjV3VPMEQ0a2RtdU5rMDdpL3hRZU5SCk4xV3NidmJaQWk2dXdoRmNpTTREbUIycXRrRktIQTZDY3plYm1SQTBjZ3BvdkdnWndxV3QrMDN6NDh4MjQxTXAKMERXRTVaVHltOXliWFlGMFhzblJUVTI2eUFrVG5pMkJML1NYcUxVbExnVnZUb28rRUpOQlRwdnQ4dDdnYlJGOApNOXFlSE80ZUszbUkzbGNkdHdxQXFVR3BobklYRENwNmFDTVBZZDV0QUpXNXNzUUo2TEtQMWNXbWVIUXJSR2IzCldULzVJeXRMcW4vU3lDQVBCKy9icEhyUDBDM2dHSk8yRHA4RExnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
+    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKSndJQkFBS0NBZ0VBdDJlN1JHUkZOWlJFUTV3SVQ1dmlEdlllR1grQmJIZWVOWExQc290bXYwUy91V0Y2ClRTeTdZTk9SZ3VDZnFFZTB0YXdzYnFVSnlQTmFRUDVWRVdBQjFpeEZKMTdva1duZzg0THZiUmNvc21BaFc4eDEKZmlNRnVxSnZzbXZueGRYQzJDa2w5T3NhWmIrckRaOEdtc2cwVkpiTTdkUnJqaWdKSlRtQUNiMW85VHZqSlRDSApWeWlhUTF2U210eUJXaGJ5M21qb3JLTVJmUmh4cTJzR05jSkx3a3lhN3duSVVHNXNyb0FyQXY4dFo1dHdHcmlzCndRMWx4SStmQ1U3ZzJ5ZzQ3Y05pKzlzUnRIckUzL1cyOWtHOVZBdzFYRmtpTXF4bnBiSEYyejYxZERuSDJjcWoKb21hUXMyYXZTTGtxU2R1ZzhGbVE2L0hZb1NoNXpDYTJwVUlPTDlvQ2s0bGtWTXc0NVJ3Vks3eEFVU1MzdzNYNQpXalpqWE9wRE1md3I0cXo4VTdvOUR5Q1E4NVdoV1hYU1ZjdDYyQUJkSzhrUW1rckNyL0k0NURTZEM3ckZCV05jClVCOWpIOEVPc2hLOFZqczhib3QrNjhkNm85NDcwMVdmSzBTMHhWUWlENFBvRWQ3SXpVcVF4NVA0U2p5VHRiZUMKWGhKSEJNOFpRNWJpaTZPLzlDVG5mbFRUS3ppMzlQNVZQdkpCYkRNclBLeGVYNmU5bjBvRjVCMkxtRURFcVZuRgpma25oTTJzekJFVVhKRmpDOWdHSDQ0dXZ2MDBQQndDVHFkM2orVVJheHQrcTF6Vk8wNC9WZ0NiYVRRUTFzQmN5Cnk0dEhZUnhnQW54eElzYmpVdGk0N3Y0a3RDRzlPanhweXZIVUZ0OEs0Z0hBTkZieUtEN2JFMzR4b0JrQ0F3RUEKQVFLQ0FnQXB0ZEVjZ2pOTk5wMTV4TXdORXRZTDhnUXhaMUtQVVBydGkrRlphU09pWHllOUtNS1FONXFic0RINQpFazJ0RHpXMVZXVTdlcFFwbTlLTVVtc1ZTd0RQN1B5RE1pM3hHQ085TGF0MjQxdnhpVFE4OU5oSnFmeGRFQ0VYCjhqdGhQamFVUTNOcTZtYnorZTJVYVBTdkVkWDQ0TnpWUDhpQUtYRy9BZjh3OTk4ZFdwUFRldUJrdllxcncvKzMKRVd2bmlhMk5VRTJPS1gzS05kdHdFU1IxNkd5alVSbXhRRWZLcHZwWGl6Vjg5bnlrZ2ZDeVd3cUsweG13Wkx0VgoraGJnTUpzVjA2ZzR2LzhjVFFsbUo3TUcrVGR1SEdLc1VHY2JJQ05vUnZCSTVzK01rYkYyUWdRSjVJcUhDbFRWCjFLcWQ1bkdKQjgyU0kwdlJodXVBTnRPMTdMcGQyMGNSek9qZDQyUE5nTmg2Mlh0NEZKQms0M1Nsc2dETVRmSDkKRk1lQ3JEd1l1T1VWd1pyOWdwSzk5MXZ2aVJJaTd3ZGdaUW9KbDNWZXBYc2tySSs0bUx4Sk05bWZJSW5zN1o2agpYc3pjMHkwNld5SWVrdUc0Z1BUQ0tLMzFET0pCdStVQlZaYmMybi9oZy96VjBUMmYwckxQZ2RtSWdFd3BUZWdZClpSbEJST0xLLzFqbnE5ZUJTdFhaWGVqbEtVbzVyVDJsektaT2NGMWdCSjBZNHZHQ2F3Ry9XZnlIaG00K2V0WHkKaHlzeHB4ODZYVEN4RkJaS0RseXYxTVVXblpGTlo4U2crMU1jTFlwVXBvdDVYRFpxQXRSNDY2SVczL2hTNlpsRgpSQ2ZYb2Z4MURKY2ZaL2ljRnp5TXFnQjNuaVhpWVFsSVVCWnB3czZOOVB5SWhkUDVpUUtDQVFFQXY0ZGswYmRKCm9qTkVaZG9rSENxK1RIMDIxbG1xMTlaWmR4c1BJM2ZPWndEbmxKT0I0SkNSK2VjNlA4eUo0QmxxNUZ6UTljRXgKQ3Qxb3lhcDUzUS9EOUV3QTZrL2RuYmdwdFlZWTNuNjRuNlYvbDd5WTlYbUh3VkdtVzVZMngxZ0tKSDRNNEFWcgoyOU5CMXAxeE81SXYya2l3bkxIdHZjNm5OWElVZVYxUTJKeGw5dExGYlhYVFEyMytIVjJkR1gvTy9BbUVYeERGCmM1aW1NWTI1dytyclV4bHVUK1lDa0FoYTFNRDFaZGQxcVBFRE5RaXhHSFJpQ1JiUG10cFYxanJQeklNcS9XZWoKWXJjZFdtQUdWMTZHdHFMekEvNzFxdThIU2JYeHl2YjNEV3pRQjUyelVlRW5Rd3ZPK2x2SXlVM2FVU000RHNEVgpTeDk4NFdxQStLaEZaUUtDQVFFQTlTUkwxdndtdC9wLzRzdEhmSVpCZldjQWJVV0s3WVl1US9YcjYrdjg2eGxqCkFuYWZUSG5ESWZZKzgxalYrZFRNSm1uTzYycjhKL3FLUWxVaGRldSs2dUVhNzg2QW12TTBPdVUwQVFiQTEvejMKalJreVB2ajRhTmh1VG9mSmxBRG4rb0xaRzJBak1WajUrV3RicXlkbW9hQ1lqdUZuRldXa1d3eFdTQ3A1VFovQgoxOU1jREZEWWdaanZyWFhrVlBkMkppb3lFeWtWcVhmckJTQ1JWanFEMFRzckNQdGNHd2h2Q2ljdWU0ZVJMRWVVCkluUUxrM1RWTS91dXdSZlpqKzJiNEZ1VG14VmdjN0hwRmhvWHFkck9Rb216SHFROE5jWjFzMjluSDlCcVRMWWYKTFl0MkZrRys2QUkxUmQyVUhqNldHQ0tBdndUZXhab1llOG80OFVYdXBRS0NBUUFLWGE2VU55SlNHQW84cFBqTgpXWGJoTnVtdjRqeC80QWNKampwY2hoQnl2TGJMOE12WHRwdGY5aWJONnlrUEt2RUJHUkRxTENHV1gvTmE3dElYCnA5SElPQkRZbmFmMThGQzVsVjlsTTJDVXEyVmpkZjZsVW9XSmJmemQraHhPMzdIMDFhbW11a1JqS21UbTA3Q2MKTThaSlB5UG41eTFoMTN4dlJSUmNtVE5WOWVrQzJkZDduQ1BxQTFyOGhlT0p6TVFNR2d2REJXcGFYa21vWnU1Rgo3MEg3Um1ZVkJ2TGVqc1V6dkpuTGdFVEs5dmhnZDI3MlR0NDdkYk9Zd3ZaZ1dPQ0VSaGtlaSt4bzNGWkhYT2thCjgyL0JGTUtvVmJWQUloMjMzSlFRa3hzOTY4UzZsTXR1eEF2VzhoMnFxU3NOMGh2ZHhsVXpYelpzRVhFMTFnalMKN0hDTkFvSUJBQjlUcHhsdkdhZVRMSHFZRGFlZEpJdFkrVlg5ZUJhSWVpc1hKekg3ODFNNzZFb3RUSWdpVzB4Zwp3b1NvaXBlbG1QMGpzbHlsVEZuemkyMlVvWFVIVGx1SHJzQ01mQ1RSQlpDdEw2c2Q2TkR4TTlWbExlV2NQV3B3CmxoQVZEQzZNdXhocFZrTklVdGNBanRsUDNlUU9ZZkF2cks4OW9NVzhPbmVrS1BhSjd2eDdlUE1TdUZmZWtQeG0KeGVJOTJaTCtHS3doNGtwT2lzVWdYUGxId3lyb3lXV1lrUlJSd3VCMWdITWt0S3oya3hlOGdmS3hMN1dGVGFXWgorU2dWMnlpb2JhNExKZDdBcVpXL1c1RUdmcFduTDRxVFBEK2pMMHFUOVFDY01PcUE0TVN5MVdNbG1rNlgwa1NsCjI1YjFEUE9jZmVQUnJQQThPQmU2Ykh5TlNCK1ZGejBDZ2dFQVF5K2t1cWd5RmNsKzJIbXptR0d0RUxvOEQ5SXAKb3JrQ21MTnM4OGRlTHJMU1lqQmN4dUZwVUcrQ1o2SUQyZ25udW00YXo5cVFxQy94TENkbWQyYzQrQWNIRUVkMAoxeTh3bWprKzBOQ1J2SFk2ZGtyT3QweGFWNHFDQTA1czRVVW5GY2xkUFM4Q0dZeEFuMXUwQzNjNFhVN2RqRHBaCmJ3bk5zMjRiM0dhM3psNTdnK0xJK2pydjYvMEk3eG1uYXNSSXFpR1V2alQ2ZENRK2dBcjNDUFFkcVZNTm5SSnMKY2t1c0tQVEF3dWNycXUwZnhDY01VcHk1UjlPYnFIcHc1dkFmYVpSeVlmOXBNcTY0ZGV2RFYrRWp5a1crcVNKRQpLMzJkRkRaOXFEdlhBeThLRld4dWtkcTgwTTVRd0dpeTJrMHI2blh6b2FMWEZ2R0pmL2hCNkF6emp3PT0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K
+
diff --git a/pkg/cluser/clusterFetcher.go b/pkg/cluser/clusterFetcher.go
new file mode 100644
index 0000000..fea4610
--- /dev/null
+++ b/pkg/cluser/clusterFetcher.go
@@ -0,0 +1,5 @@
+package cluser
+
+type ClusterFetcher interface {
+	fetch() (string, error)
+}
diff --git a/pkg/event/clusterListener.go b/pkg/event/clusterListener.go
new file mode 100644
index 0000000..43fe3c6
--- /dev/null
+++ b/pkg/event/clusterListener.go
@@ -0,0 +1,29 @@
+package event
+
+import (
+	"container-clusterviewer/pkg/cluser"
+	"context"
+	log "github.com/sirupsen/logrus"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/client-go/kubernetes"
+)
+
+type ClusterListener struct {
+	cluser.ClusterFetcher
+}
+
+func processEvent(typeEvent string, resourcesName string) {
+	log.Info("Event received, namespace: " + resourcesName + " " + typeEvent)
+}
+
+func (l *ClusterListener) ListenToEvent(client *kubernetes.Clientset) error {
+	// Subscribe to event
+	watcher, _ := client.CoreV1().Namespaces().Watch(context.Background(), metav1.ListOptions{})
+
+	for event := range watcher.ResultChan() {
+		item := event.Object.(*corev1.Namespace)
+		processEvent(string(event.Type), item.GetName())
+	}
+	return nil
+}
diff --git a/pkg/helloWorld.go b/pkg/helloWorld.go
deleted file mode 100644
index 1569f3b..0000000
--- a/pkg/helloWorld.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package pkg
-
-func SayHello() string {
-	return "Hello World"
-}
-- 
GitLab


From b6955674f047ffe39bbd1a708d8ec706c9389b21 Mon Sep 17 00:00:00 2001
From: Simon Barras <simon.barras02@gmail.com>
Date: Thu, 4 May 2023 16:33:50 +0200
Subject: [PATCH 02/18] Add event listener

---
 cmd/main.go                  |  21 +-
 go.sum                       | 488 +++++++++++++++++++++++++++++++++++
 kubeconfig                   |   8 +-
 pkg/event/clusterListener.go |  90 ++++++-
 pkg/event/eventFirer.go      |  39 +++
 5 files changed, 630 insertions(+), 16 deletions(-)
 create mode 100644 go.sum
 create mode 100644 pkg/event/eventFirer.go

diff --git a/cmd/main.go b/cmd/main.go
index eedb23f..7446b5f 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -9,15 +9,22 @@ import (
 	"k8s.io/client-go/tools/clientcmd"
 )
 
-var (
-	config, _    = clientcmd.BuildConfigFromFlags("", "./kubeconfig")
-	clientset, _ = kubernetes.NewForConfig(config)
-)
-
 func main() {
 
-	clusterLister := event.ClusterListener{}
-	err := clusterLister.ListenToEvent(clientset)
+	config, err := clientcmd.BuildConfigFromFlags("", "./kubeconfig")
+	if err != nil {
+		log.Error(err)
+		return
+	}
+
+	clientset, err := kubernetes.NewForConfig(config)
+	if err != nil {
+		log.Error(err)
+		return
+	}
+
+	clusterLister := event.CreateClusterListener(clientset)
+	err = clusterLister.ListenToEvent()
 	if err != nil {
 		return
 	}
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..10a9cb6
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,488 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=
+github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
+github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
+github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
+github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8=
+github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
+github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
+github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
+github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
+github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
+github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28=
+github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/onsi/ginkgo/v2 v2.9.1 h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk=
+github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
+github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
+github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg=
+golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=
+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
+golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
+google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
+google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
+gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+k8s.io/api v0.27.1 h1:Z6zUGQ1Vd10tJ+gHcNNNgkV5emCyW+v2XTmn+CLjSd0=
+k8s.io/api v0.27.1/go.mod h1:z5g/BpAiD+f6AArpqNjkY+cji8ueZDU/WV1jcj5Jk4E=
+k8s.io/apimachinery v0.27.1 h1:EGuZiLI95UQQcClhanryclaQE6xjg1Bts6/L3cD7zyc=
+k8s.io/apimachinery v0.27.1/go.mod h1:5ikh59fK3AJ287GUvpUsryoMFtH9zj/ARfWCo3AyXTM=
+k8s.io/client-go v0.27.1 h1:oXsfhW/qncM1wDmWBIuDzRHNS2tLhK3BZv512Nc59W8=
+k8s.io/client-go v0.27.1/go.mod h1:f8LHMUkVb3b9N8bWturc+EDtVVVwZ7ueTVquFAJb2vA=
+k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw=
+k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a h1:gmovKNur38vgoWfGtP5QOGNOA7ki4n6qNYoFAgMlNvg=
+k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY=
+k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY=
+k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
+sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
+sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
+sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
+sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
diff --git a/kubeconfig b/kubeconfig
index a86cc3f..25f1c54 100644
--- a/kubeconfig
+++ b/kubeconfig
@@ -1,8 +1,8 @@
 apiVersion: v1
 clusters:
 - cluster:
-    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdCakNDQSs2Z0F3SUJBZ0lVRjJjdmVQUUVGRS9FVjV2Zk9ZQ0tKNVpUdk5Bd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1dERUxNQWtHQTFVRUJoTUNRMGd4RFRBTEJnTlZCQWNNQkZwU1NERXhFVEFQQmdOVkJBb01DRVY0YjNOagpZV3hsTVF3d0NnWURWUVFMREFOVFMxTXhHVEFYQmdOVkJBTU1FR052Ym5SeWIyd3RjR3hoYm1VdFkyRXdJQmNOCk1qTXdOREUzTURneU9ERXpXaGdQTWpBM016QTBNRFF3T0RJNE1UaGFNRmd4Q3pBSkJnTlZCQVlUQWtOSU1RMHcKQ3dZRFZRUUhEQVJhVWtneE1SRXdEd1lEVlFRS0RBaEZlRzl6WTJGc1pURU1NQW9HQTFVRUN3d0RVMHRUTVJrdwpGd1lEVlFRRERCQmpiMjUwY205c0xYQnNZVzVsTFdOaE1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQXJHSUFJRlN1KzlUdjBETDZTeE55cy9HWUJwcXBrbHlnaHdienJqNGo0M3RvQWlhQ3pYRVAKTWZtdm5lRGRNL3pIUmZKd2tzY3NZa0IxL21mbVduMlZXNVRMekZqTFRNeGdlRmZ1c0E0UHBKdVl2WlB4Z3YzcgpzN0xMSkU1SlhxMTNld3B6YUt1YXJxV2Q4aGxVMHpXREhSbTZGdUFnaTRra1hZazVJVkpRMGdBc2M0L3doRlUwCkxLQ0tJdkRXUWlOQkFlUWdPd2d2Z29SK0pieHZJemVXa0VmaXpER3g1RUFWMVlMZ3ZYdUFRZ2dZMFZTT2RMRFYKT29rbmt1NUZuZUh0MExyL08rdDFORjZDQmRDSDZZMC90Q3Fhenc0VE94MnUzTW5pb1g3Vk1uZWlZdys0aWZoLwpUVDh2ayt1Zjd5c2ZqYzhteTlDOHNUN3lwSFVqUEhuZEVRelovM2w3a2R0clZ3anBvZWRwWXJ0L1lya3RRbHBpCkQrL095LzRaNVhUaXNOMWU2Y1BUenRzd2UwVnVkdDd5U3ZLcDZWS1VwaHVDcXZDR0MwdFNrdkhuNlRxRkl6NTcKWGE5TkRFN2U2emQ0b2Zvb3UvNnRvVDJ1WnQzQUJra3lVUXQwdFM3dHRvbEk1M3J3WkIvMFRtRm5RWDNod3hjTQphQjBGbzdhSkpGTU5JNGxBK2NaTlVncENnNHQxcUh1RHVwTmhLdzNpbVlpTjJpOW9QMnFCb1FWVGJhSU1ORDhyCjcrb25GcWVNdkg2dHlTWGRHSEhlZWJLZUNMU2MvU2hIREp6SkY0NWRLZ3lEd29McFNhTWFjdm9HbXRIanNzdk0Kd1pndFJRVnBIL3VTVmtzWHpWUU55RzNHZEpRSE00Wldud0JOTERJQmRTM1B2K2tNNWxQdVljVUNBd0VBQWFPQgp4VENCd2pCOUJnTlZIU01FZGpCMG9WeWtXakJZTVFzd0NRWURWUVFHRXdKRFNERU5NQXNHQTFVRUJ3d0VXbEpJCk1URVJNQThHQTFVRUNnd0lSWGh2YzJOaGJHVXhEREFLQmdOVkJBc01BMU5MVXpFWk1CY0dBMVVFQXd3UVkyOXUKZEhKdmJDMXdiR0Z1WlMxallZSVVGMmN2ZVBRRUZFL0VWNXZmT1lDS0o1WlR2TkF3SFFZRFZSME9CQllFRlBBKwp1NWZvN1lzUHMzejByZTByK3h2SURVRkJNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUF3RGdZRFZSMFBBUUgvCkJBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFDQmpPQzNwYVFlKzRCM2s1d00rM3pqbW5PNHZKaVUKWVduSS81ZHhndENUUmNRMW91WU9MSWUrcG41bWJjZi9udDNWbWhzdWsvNnhTZ3RHS3ZDeFhka2k3eE9rV1A0aApzNGQ1bU95RG11alVxVXVlTmpiUXcyQ2M3aXI0Y2tKU0Nlbm4zNExVU1kyYkxzaS85QTJ2WElmcGIrUGlkaEFRCjNqNmNwU1lFbmo1WHVNK0wzMjlOZUpqcFZPeUVDdDNjMVd1TXlSMm5wY0VoUGJSNmIydDR3MkQ5enRwSHRqeE4KeW45a29adzdEU0x0eFArNE9BSU5HdGJlam9Lai9MSkJyUGlHTVNNSGVKWHZqYU5rUzRLVEFMd1lwWkprT2RYYQpFSjFycnljQ2dZTXZDQVpwV0pjbnpNeVpSbndJQ2xsWGxLU25GSjU3T0tEaS9rbXU3Q0JhMlRtdWkxeXM5RmdtCndrUWc3SFhoV1VMOVE3UUoyam9JYldtakpPRXFtMTQzYm9TMXNxNFdPUDNlbCs4eFFnVEMvQkRldE9oSWg2cFEKRXJhVzN2WHUrUW9HNWVCSHVqdDRmZnIwSUN0US94UFlabGFsVHVET2JmYlVNakpLNjhrenpUZHJTS3NWaDM0VworTUVJTVFDbkNaQThRbHREZ0FLOVE3OVBhNlRvZFB2SXJmeWt5aFowLzBzdklSWjJsTnNjMS9hdXFLNkNWcDhUCnMrRlZEdkdGZk1sTWlobzFrUzkyc3ZSWElWVk5MSWRmZmhnbVpNcXJEcUdSc3pBTWp0Sk9oYUtZMWF5Q1FKc0cKdTlVMUdDNlFVSkhHTG9ZdDR3UEhqNXA2YXkvVEJjQW1WL2xIRnZza25tMVRHN1ZnYWxWc0h2cTVBK0p1Rm9hago4SzBlSW5OZWphbG02UT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
-    server: https://fa818a2e-0a5f-49cd-9582-abe745cc6223.sks-ch-dk-2.exo.io:443
+    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdCakNDQSs2Z0F3SUJBZ0lVUEE3b0ZZWjJicDhHSXYvVHpqbGlId0FGVjdVd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1dERUxNQWtHQTFVRUJoTUNRMGd4RFRBTEJnTlZCQWNNQkVkV1FUSXhFVEFQQmdOVkJBb01DRVY0YjNOagpZV3hsTVF3d0NnWURWUVFMREFOVFMxTXhHVEFYQmdOVkJBTU1FR052Ym5SeWIyd3RjR3hoYm1VdFkyRXdJQmNOCk1qTXdOVEF4TVRNMU1UVXpXaGdQTWpBM016QTBNVGd4TXpVeE5UaGFNRmd4Q3pBSkJnTlZCQVlUQWtOSU1RMHcKQ3dZRFZRUUhEQVJIVmtFeU1SRXdEd1lEVlFRS0RBaEZlRzl6WTJGc1pURU1NQW9HQTFVRUN3d0RVMHRUTVJrdwpGd1lEVlFRRERCQmpiMjUwY205c0xYQnNZVzVsTFdOaE1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQXZLb3ZkKzdUVXE5aWtuR3ZSRm9KYTN5YWtlSU9ydloyR0p4dFhFTStzUU8zY0h3Q2JkTEgKSVBCK2tQUGxxNXVpTEpkcFZ1NjV2UDhaQm4zVStUWWlzMzBDRFVybXdRa0xaejF2SWxReEtjUE5OYVpoNHRCOAorTmtjNTRPN3BTb3JvcHdPdTNKZ1NueVVRYUU1aUk1dHMrMW9EeXNrT2xCTS83L2tvUGU4U0Vqd09ZNVVPUVhPCm9Md0J3dzhaWVVOTzVxK050ZE1aM2JLeU8zYlZSRUYrNkdRY3lFNk5CQkJtZGh3QmxGMStMVldmMXhwKzFyNVIKQXZXdEFlVUNyaUl3OCs3QTdBdytFeDdhc3NkVStpWE9VbGdabkp4K0Zza280b3d6RkVNT2M4OFM0ZWZWOUxDVQp0NGtBeFBpZEM5dzBlYy9TQTNQdmhNQzEzbDN3dFRNWUpQYWpHbG5Od2gwdEc0cGhYa3VzRlB3R2U1d2ExOUswCkVWdHpVa3YyT3RJUmEyclNvay9WakZ0bCtINEZjbm5KNmtDL2xSdzMvVGg5OE0zcERvRWN2QS9CckpUZGlPamUKNHg1ZllaUlYzSFhESXVPOWNGREdtd0ZpSnAxSUkzSjR0TG42MGpQU25jOTNYbnhGbUtNOTFTQkwyVE52djFWdQo4MDJHS3ZUVENjWkRCOFhXYmUxNExmTDVpR3JUODNRUWhnQlUxay85WkFOVGcvRzQvRFpOS1pUbVkxakZFRjM1CldFQlNLNlY5bHZWaVJER21RenRxVUJBRGg3YVR6WXNMYllJYXR1ZlJMeG1VTHhKaUk4SVdWOEdpZDFHT2Z6OVoKMEhBT2xodE40WmxtV2RReUQ4R0d6OUVMc1lIM0lPcHBPNTEzWTAxZkxaMDlLNkFLLzNIcitnOENBd0VBQWFPQgp4VENCd2pCOUJnTlZIU01FZGpCMG9WeWtXakJZTVFzd0NRWURWUVFHRXdKRFNERU5NQXNHQTFVRUJ3d0VSMVpCCk1qRVJNQThHQTFVRUNnd0lSWGh2YzJOaGJHVXhEREFLQmdOVkJBc01BMU5MVXpFWk1CY0dBMVVFQXd3UVkyOXUKZEhKdmJDMXdiR0Z1WlMxallZSVVQQTdvRllaMmJwOEdJdi9UempsaUh3QUZWN1V3SFFZRFZSME9CQllFRkJBUApDK2sxWng1YjlHaDVlc2FGNm1lWHhtejhNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUF3RGdZRFZSMFBBUUgvCkJBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFDN2g1dlAvNi90eXRmWEp2TXlOQkFzWEVyaldLVUEKNno2UVlHVXk2eVVQQnhPS1RmRHprSWVFRURtdTRDekw0TkJvY0dwZTJwaU1WSnY0VW5hbksyb1JPemJSdnEyTAprVWJxL1l3dUI5anhyQXJiaFh0eFN6ZEMvQnRocWk1cHBZcDd0SHBIUjVzWUQ0TzFyazc5QTExc0VRWGJ1dWlsCk9UemdjZzZVRGx6ZUQwSXNlVEUrY3NGcEhjdlVhOTlIZWgwUklrbGhEa1E3TVpYczRCcEVSLzBQMmxUL3pnRHYKT1BUUldQUlBZZlZDZ1lKRkNZNytxQ3o0bWZ0TFF3ZFhMZ21EUmJJRWZLTy9JWGtWcVI4MHJXcElZUU5ybk9ZSgpBRzFQd0RTU1ZWd1A4Nk9WcDJBa2k1SGFmanFRUWRmYUhmc3B0S00zWU90cmFXT2NFUnNJV25xWm9Vb1BiTXNtCmNscWFqTmI5ZjNTVU1OZDlaem9aY3pIcjduSUFQT1U3Q09EaGdGcmk1d3E1dmtJT3RGRTRoU0hsUmZQa2hINDQKdFR1YTRjUFV3YzRoNUt0YXgwdk9kNjcrRUxTZGJDZGFzWGYrS3V5eDlibHFGQTlvWGhUcWxYNHRtVnFCMnRiegowZ3NEU2VyRGNDVjFNTjRIRmVNRllRVVJuUFRRanJzb0hkMkkzRVpWVkdpNVlRYnE4SjRmakxzUDdLU0g2alRZCmxtSmprd0xXcmlhS1J4Z2NlMmZFNlZDMjNyUGlRa25oUUsvZ1J5QW5vbllwTXZEajZqZld5TEdLTmxQcEdaYmkKbDBVTXNJbVMyVC84U0JnYS9NUlRnS05hcUJsa1Z1aFNqVGdoL0FiQTVRbmVSSVVCbHNWcnBzYmZETzJsSkpEVApDQkRaSERWZ3ZwU0E1Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
+    server: https://4bab7b3a-8545-447b-837d-e4fe213a33cb.sks-ch-gva-2.exo.io:443
   name: exoscale
 contexts:
 - context:
@@ -15,6 +15,6 @@ preferences: {}
 users:
 - name: pi-admin
   user:
-    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1RENDQTZDZ0F3SUJBZ0lVWHI2RVlkSW9yc0RVb212YmdKRUFZT1YyRHkwd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1ZERUxNQWtHQTFVRUJoTUNRMGd4RFRBTEJnTlZCQWNNQkZwU1NERXhFVEFQQmdOVkJBb01DRVY0YjNOagpZV3hsTVF3d0NnWURWUVFMREFOVFMxTXhGVEFUQmdOVkJBTU1ERzl3WlhKaGRHOXljeTFqWVRBZUZ3MHlNekEwCk1UY3hNVEE0TXpWYUZ3MHlNekExTVRjeE1UQTROREJhTUY0eEN6QUpCZ05WQkFZVEFrTklNUTB3Q3dZRFZRUUgKREFSYVVrZ3hNUmN3RlFZRFZRUUtEQTV6ZVhOMFpXMDZiV0Z6ZEdWeWN6RU1NQW9HQTFVRUN3d0RVMHRUTVJrdwpGd1lEVlFRRERCQnJkV0psY201bGRHVnpMV0ZrYldsdU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQXQyZTdSR1JGTlpSRVE1d0lUNXZpRHZZZUdYK0JiSGVlTlhMUHNvdG12MFMvdVdGNlRTeTcKWU5PUmd1Q2ZxRWUwdGF3c2JxVUp5UE5hUVA1VkVXQUIxaXhGSjE3b2tXbmc4NEx2YlJjb3NtQWhXOHgxZmlNRgp1cUp2c212bnhkWEMyQ2tsOU9zYVpiK3JEWjhHbXNnMFZKYk03ZFJyamlnSkpUbUFDYjFvOVR2akpUQ0hWeWlhClExdlNtdHlCV2hieTNtam9yS01SZlJoeHEyc0dOY0pMd2t5YTd3bklVRzVzcm9BckF2OHRaNXR3R3Jpc3dRMWwKeEkrZkNVN2cyeWc0N2NOaSs5c1J0SHJFMy9XMjlrRzlWQXcxWEZraU1xeG5wYkhGMno2MWREbkgyY3Fqb21hUQpzMmF2U0xrcVNkdWc4Rm1RNi9IWW9TaDV6Q2EycFVJT0w5b0NrNGxrVk13NDVSd1ZLN3hBVVNTM3czWDVXalpqClhPcERNZndyNHF6OFU3bzlEeUNRODVXaFdYWFNWY3Q2MkFCZEs4a1Fta3JDci9JNDVEU2RDN3JGQldOY1VCOWoKSDhFT3NoSzhWanM4Ym90KzY4ZDZvOTQ3MDFXZkswUzB4VlFpRDRQb0VkN0l6VXFReDVQNFNqeVR0YmVDWGhKSApCTThaUTViaWk2Ty85Q1RuZmxUVEt6aTM5UDVWUHZKQmJETXJQS3hlWDZlOW4wb0Y1QjJMbUVERXFWbkZma25oCk0yc3pCRVVYSkZqQzlnR0g0NHV2djAwUEJ3Q1RxZDNqK1VSYXh0K3ExelZPMDQvVmdDYmFUUVExc0JjeXk0dEgKWVJ4Z0FueHhJc2JqVXRpNDd2NGt0Q0c5T2p4cHl2SFVGdDhLNGdIQU5GYnlLRDdiRTM0eG9Ca0NBd0VBQWFONApNSFl3SHdZRFZSMGpCQmd3Rm9BVVlYcGI2YUdQR2Zqc2l3SnNndERZSkJwcEhnUXdIUVlEVlIwT0JCWUVGQko4CmRlODE5RGtSVU83WklLZFh4QnNwM20vM01Bd0dBMVVkRXdFQi93UUNNQUF3RGdZRFZSMFBBUUgvQkFRREFnV2cKTUJZR0ExVWRKUUVCL3dRTU1Bb0dDQ3NHQVFVRkJ3TUNNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJBVmxHTwo4MEtFUitSMEFBOCtlWE5ESDRuV3dwZmhyQmdJWUpIWkJIb2FrM0xtcHdwczBjSktGTnkxWXJlK2FFS3VPNGxKCjNIWk9BVFdpbXQ5WW5nRHFFWTRjaS9TSDRwTUhaaVdQYnNwdTFSYm9XZ3ZYMFNaam11SFI3WVVpdU0xemI3RUcKQzBCRXMvdGFLWTZnZTh4aUZ6UWdQQzBySGpkNks3OU1SbXFvR1dFL3pHWnlmWmJxNDJQZU10MzZ5dkZ3Q3AxZwpYNmRSbGprcWx5dE1VbHlNYlBmOWpuYzJOWGZmaDRqaWlhd1dWZTlxVXQxalpCQk5VbmplRlE4dUtvRmhyWUtMClNGUWY3NEptREtmZksyWDhBdjFHVk55YytDOStOSWtYMEtGdlJRL0M5QVFEMjRrMzdETGk5cjdMa0VBWVRmaGgKVG4xU1V4ZXFFRGZGQW1oZnhUSzdrdnYyMHYxNXFDa3hWUVdQdzhhZW96eVY4TmNWdUVIKzRzVVVMTHoxbTFHTwp3NlJuWW1vRHBIZklVT1A1S2ZhbWdWZ1hNVERpbE9QVEUwUk5qMjlUWHdjV3VPMEQ0a2RtdU5rMDdpL3hRZU5SCk4xV3NidmJaQWk2dXdoRmNpTTREbUIycXRrRktIQTZDY3plYm1SQTBjZ3BvdkdnWndxV3QrMDN6NDh4MjQxTXAKMERXRTVaVHltOXliWFlGMFhzblJUVTI2eUFrVG5pMkJML1NYcUxVbExnVnZUb28rRUpOQlRwdnQ4dDdnYlJGOApNOXFlSE80ZUszbUkzbGNkdHdxQXFVR3BobklYRENwNmFDTVBZZDV0QUpXNXNzUUo2TEtQMWNXbWVIUXJSR2IzCldULzVJeXRMcW4vU3lDQVBCKy9icEhyUDBDM2dHSk8yRHA4RExnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
-    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKSndJQkFBS0NBZ0VBdDJlN1JHUkZOWlJFUTV3SVQ1dmlEdlllR1grQmJIZWVOWExQc290bXYwUy91V0Y2ClRTeTdZTk9SZ3VDZnFFZTB0YXdzYnFVSnlQTmFRUDVWRVdBQjFpeEZKMTdva1duZzg0THZiUmNvc21BaFc4eDEKZmlNRnVxSnZzbXZueGRYQzJDa2w5T3NhWmIrckRaOEdtc2cwVkpiTTdkUnJqaWdKSlRtQUNiMW85VHZqSlRDSApWeWlhUTF2U210eUJXaGJ5M21qb3JLTVJmUmh4cTJzR05jSkx3a3lhN3duSVVHNXNyb0FyQXY4dFo1dHdHcmlzCndRMWx4SStmQ1U3ZzJ5ZzQ3Y05pKzlzUnRIckUzL1cyOWtHOVZBdzFYRmtpTXF4bnBiSEYyejYxZERuSDJjcWoKb21hUXMyYXZTTGtxU2R1ZzhGbVE2L0hZb1NoNXpDYTJwVUlPTDlvQ2s0bGtWTXc0NVJ3Vks3eEFVU1MzdzNYNQpXalpqWE9wRE1md3I0cXo4VTdvOUR5Q1E4NVdoV1hYU1ZjdDYyQUJkSzhrUW1rckNyL0k0NURTZEM3ckZCV05jClVCOWpIOEVPc2hLOFZqczhib3QrNjhkNm85NDcwMVdmSzBTMHhWUWlENFBvRWQ3SXpVcVF4NVA0U2p5VHRiZUMKWGhKSEJNOFpRNWJpaTZPLzlDVG5mbFRUS3ppMzlQNVZQdkpCYkRNclBLeGVYNmU5bjBvRjVCMkxtRURFcVZuRgpma25oTTJzekJFVVhKRmpDOWdHSDQ0dXZ2MDBQQndDVHFkM2orVVJheHQrcTF6Vk8wNC9WZ0NiYVRRUTFzQmN5Cnk0dEhZUnhnQW54eElzYmpVdGk0N3Y0a3RDRzlPanhweXZIVUZ0OEs0Z0hBTkZieUtEN2JFMzR4b0JrQ0F3RUEKQVFLQ0FnQXB0ZEVjZ2pOTk5wMTV4TXdORXRZTDhnUXhaMUtQVVBydGkrRlphU09pWHllOUtNS1FONXFic0RINQpFazJ0RHpXMVZXVTdlcFFwbTlLTVVtc1ZTd0RQN1B5RE1pM3hHQ085TGF0MjQxdnhpVFE4OU5oSnFmeGRFQ0VYCjhqdGhQamFVUTNOcTZtYnorZTJVYVBTdkVkWDQ0TnpWUDhpQUtYRy9BZjh3OTk4ZFdwUFRldUJrdllxcncvKzMKRVd2bmlhMk5VRTJPS1gzS05kdHdFU1IxNkd5alVSbXhRRWZLcHZwWGl6Vjg5bnlrZ2ZDeVd3cUsweG13Wkx0VgoraGJnTUpzVjA2ZzR2LzhjVFFsbUo3TUcrVGR1SEdLc1VHY2JJQ05vUnZCSTVzK01rYkYyUWdRSjVJcUhDbFRWCjFLcWQ1bkdKQjgyU0kwdlJodXVBTnRPMTdMcGQyMGNSek9qZDQyUE5nTmg2Mlh0NEZKQms0M1Nsc2dETVRmSDkKRk1lQ3JEd1l1T1VWd1pyOWdwSzk5MXZ2aVJJaTd3ZGdaUW9KbDNWZXBYc2tySSs0bUx4Sk05bWZJSW5zN1o2agpYc3pjMHkwNld5SWVrdUc0Z1BUQ0tLMzFET0pCdStVQlZaYmMybi9oZy96VjBUMmYwckxQZ2RtSWdFd3BUZWdZClpSbEJST0xLLzFqbnE5ZUJTdFhaWGVqbEtVbzVyVDJsektaT2NGMWdCSjBZNHZHQ2F3Ry9XZnlIaG00K2V0WHkKaHlzeHB4ODZYVEN4RkJaS0RseXYxTVVXblpGTlo4U2crMU1jTFlwVXBvdDVYRFpxQXRSNDY2SVczL2hTNlpsRgpSQ2ZYb2Z4MURKY2ZaL2ljRnp5TXFnQjNuaVhpWVFsSVVCWnB3czZOOVB5SWhkUDVpUUtDQVFFQXY0ZGswYmRKCm9qTkVaZG9rSENxK1RIMDIxbG1xMTlaWmR4c1BJM2ZPWndEbmxKT0I0SkNSK2VjNlA4eUo0QmxxNUZ6UTljRXgKQ3Qxb3lhcDUzUS9EOUV3QTZrL2RuYmdwdFlZWTNuNjRuNlYvbDd5WTlYbUh3VkdtVzVZMngxZ0tKSDRNNEFWcgoyOU5CMXAxeE81SXYya2l3bkxIdHZjNm5OWElVZVYxUTJKeGw5dExGYlhYVFEyMytIVjJkR1gvTy9BbUVYeERGCmM1aW1NWTI1dytyclV4bHVUK1lDa0FoYTFNRDFaZGQxcVBFRE5RaXhHSFJpQ1JiUG10cFYxanJQeklNcS9XZWoKWXJjZFdtQUdWMTZHdHFMekEvNzFxdThIU2JYeHl2YjNEV3pRQjUyelVlRW5Rd3ZPK2x2SXlVM2FVU000RHNEVgpTeDk4NFdxQStLaEZaUUtDQVFFQTlTUkwxdndtdC9wLzRzdEhmSVpCZldjQWJVV0s3WVl1US9YcjYrdjg2eGxqCkFuYWZUSG5ESWZZKzgxalYrZFRNSm1uTzYycjhKL3FLUWxVaGRldSs2dUVhNzg2QW12TTBPdVUwQVFiQTEvejMKalJreVB2ajRhTmh1VG9mSmxBRG4rb0xaRzJBak1WajUrV3RicXlkbW9hQ1lqdUZuRldXa1d3eFdTQ3A1VFovQgoxOU1jREZEWWdaanZyWFhrVlBkMkppb3lFeWtWcVhmckJTQ1JWanFEMFRzckNQdGNHd2h2Q2ljdWU0ZVJMRWVVCkluUUxrM1RWTS91dXdSZlpqKzJiNEZ1VG14VmdjN0hwRmhvWHFkck9Rb216SHFROE5jWjFzMjluSDlCcVRMWWYKTFl0MkZrRys2QUkxUmQyVUhqNldHQ0tBdndUZXhab1llOG80OFVYdXBRS0NBUUFLWGE2VU55SlNHQW84cFBqTgpXWGJoTnVtdjRqeC80QWNKampwY2hoQnl2TGJMOE12WHRwdGY5aWJONnlrUEt2RUJHUkRxTENHV1gvTmE3dElYCnA5SElPQkRZbmFmMThGQzVsVjlsTTJDVXEyVmpkZjZsVW9XSmJmemQraHhPMzdIMDFhbW11a1JqS21UbTA3Q2MKTThaSlB5UG41eTFoMTN4dlJSUmNtVE5WOWVrQzJkZDduQ1BxQTFyOGhlT0p6TVFNR2d2REJXcGFYa21vWnU1Rgo3MEg3Um1ZVkJ2TGVqc1V6dkpuTGdFVEs5dmhnZDI3MlR0NDdkYk9Zd3ZaZ1dPQ0VSaGtlaSt4bzNGWkhYT2thCjgyL0JGTUtvVmJWQUloMjMzSlFRa3hzOTY4UzZsTXR1eEF2VzhoMnFxU3NOMGh2ZHhsVXpYelpzRVhFMTFnalMKN0hDTkFvSUJBQjlUcHhsdkdhZVRMSHFZRGFlZEpJdFkrVlg5ZUJhSWVpc1hKekg3ODFNNzZFb3RUSWdpVzB4Zwp3b1NvaXBlbG1QMGpzbHlsVEZuemkyMlVvWFVIVGx1SHJzQ01mQ1RSQlpDdEw2c2Q2TkR4TTlWbExlV2NQV3B3CmxoQVZEQzZNdXhocFZrTklVdGNBanRsUDNlUU9ZZkF2cks4OW9NVzhPbmVrS1BhSjd2eDdlUE1TdUZmZWtQeG0KeGVJOTJaTCtHS3doNGtwT2lzVWdYUGxId3lyb3lXV1lrUlJSd3VCMWdITWt0S3oya3hlOGdmS3hMN1dGVGFXWgorU2dWMnlpb2JhNExKZDdBcVpXL1c1RUdmcFduTDRxVFBEK2pMMHFUOVFDY01PcUE0TVN5MVdNbG1rNlgwa1NsCjI1YjFEUE9jZmVQUnJQQThPQmU2Ykh5TlNCK1ZGejBDZ2dFQVF5K2t1cWd5RmNsKzJIbXptR0d0RUxvOEQ5SXAKb3JrQ21MTnM4OGRlTHJMU1lqQmN4dUZwVUcrQ1o2SUQyZ25udW00YXo5cVFxQy94TENkbWQyYzQrQWNIRUVkMAoxeTh3bWprKzBOQ1J2SFk2ZGtyT3QweGFWNHFDQTA1czRVVW5GY2xkUFM4Q0dZeEFuMXUwQzNjNFhVN2RqRHBaCmJ3bk5zMjRiM0dhM3psNTdnK0xJK2pydjYvMEk3eG1uYXNSSXFpR1V2alQ2ZENRK2dBcjNDUFFkcVZNTm5SSnMKY2t1c0tQVEF3dWNycXUwZnhDY01VcHk1UjlPYnFIcHc1dkFmYVpSeVlmOXBNcTY0ZGV2RFYrRWp5a1crcVNKRQpLMzJkRkRaOXFEdlhBeThLRld4dWtkcTgwTTVRd0dpeTJrMHI2blh6b2FMWEZ2R0pmL2hCNkF6emp3PT0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K
+    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1RENDQTZDZ0F3SUJBZ0lVWDE5RzQ1dmVMVkd0bjRtSmV4VjZNa3FKaGtnd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1ZERUxNQWtHQTFVRUJoTUNRMGd4RFRBTEJnTlZCQWNNQkVkV1FUSXhFVEFQQmdOVkJBb01DRVY0YjNOagpZV3hsTVF3d0NnWURWUVFMREFOVFMxTXhGVEFUQmdOVkJBTU1ERzl3WlhKaGRHOXljeTFqWVRBZUZ3MHlNekExCk1ERXhNelUwTWpkYUZ3MHlNekE0TURneE16VTBNekphTUY0eEN6QUpCZ05WQkFZVEFrTklNUTB3Q3dZRFZRUUgKREFSSFZrRXlNUmN3RlFZRFZRUUtEQTV6ZVhOMFpXMDZiV0Z6ZEdWeWN6RU1NQW9HQTFVRUN3d0RVMHRUTVJrdwpGd1lEVlFRRERCQnJkV0psY201bGRHVnpMV0ZrYldsdU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQTBaV2N5UlcyekR2MmxBQXVvWUV0UzJEOTlLd01SZmI2M0RKeG0ySjF4YkFveGxBNCtnU2EKQTRRaHZvUkhwTEtaVFBKRkhJSE5MNlJqWUJJdTNRWjJJZDZsbTE2Y1F3ZUlUWGFUT280TnE4V0crRWg0M21mWApjNnBpSFFjV0sxRHFRTktjaXcvSmIvZGVmYU81TFdwNWZHNzhUamRDb2xGVGZsODNsZ3VEM3l3TlFLeU1WSTNhCnpMdkxaVjNFK0RqeFpVODN0dkt2VDFtNUM3enk2YU1wTkt3RVpIbUJNdk5JOWxxNHNrd0JIUk9NZ3J3MzlCWi8KSVRJVDFFNUFTdlVWV3EzU3ZnOVRDakdqQ24weFdZMDJSOHJDb25aRFdCS2wwNUpMZVJ3eFZTQjRzVlc1QjE0bAorRGg5VE1ZeU9ZVk9ISFFvS2lZdnk2R215WGVVNUxzUmpqVFRuTTNQb1FleTdoNVBDenRrTVVhWUdSUWdrOG5ZCjV2VXpHbi9LZnNYVGNGM2I4SEQvQnU4TTdjNTZyNm1wN0NvYU9xL0x2bzVhQ01jaEhPM0NSZWhnZmsxaEFNOXgKUlpCYWtXaCtnSzJYejhvNEZacS8rbjhXdHIvRjRjK05rNVJWWG5Za2lZRTlsditTL1lHV3NKTkhuckxJMldhSAo0UjBCVW93aHE5cDdhaXQ2bWFWdzFOa2lRVVdRRXdQK3hGYzMzVW42N0MzenVYQWs4azZ3dU5VMEdzeFdnTlA5Ck5OUW9waTlHY21XSmIwYnBzSWJ6ZnYwOFlidUFlOExqZStxUkdWZHU4dkgwNzZwTS9ac1I1b29GR0JnRWl1dHEKSFFZcU44SWlXbG1ZRlViSmhKOGVvbUZnbkd4REZyOWY0Sy9rbEJBZnRucWE4TWZ6Y2Z1ek5Kc0NBd0VBQWFONApNSFl3SHdZRFZSMGpCQmd3Rm9BVVZJdDluRkxJVitLei9ocnVGZFpNWXhERVgyUXdIUVlEVlIwT0JCWUVGTTVLClBteDFaQlBITGtNV1dLQUVDRW9rdW5YcE1Bd0dBMVVkRXdFQi93UUNNQUF3RGdZRFZSMFBBUUgvQkFRREFnV2cKTUJZR0ExVWRKUUVCL3dRTU1Bb0dDQ3NHQVFVRkJ3TUNNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFlckpVaAo4eCtudU55dVVsc21tODlXYWtKQ0Y3Y3hQTktyeldoOGxGelZmMWEyK0tJNlNQTWtIQk1zWkZ1MzR0N1YvMGhhClEyVG1EanpkaHBjdGJmcDV1S25YQ3hXMnhnRTlFYnFGNTAxZU9USjZpNjdDNDFOOE54am44OFFmZ3lwZXQ3U3YKeGtPMGNKdG1zT2Z0YXRJSDhrN0ZjSGhFaGtHeDFHc2lKcUUwdVNiV2tHeGZKUlRzTEdvQUZPRVp1a1ovL09mMQpZNEJUUjdJcENPSHNjemlhZnZOUHhDQnAxODl0SGEvbzNsaGs0UUxIRXRSL1hIZWdSNVRPQnVVcUdhZVBJVTY2CmdmVnFpVnhIRnhQMmhnWVRXSit4WmlOZTc5RHZka05UdGxPQ1dwOTV2RkhXMXJtbEhKUC9MWnlTZDlscng1RWkKVHdNU2IrOUkzalJJOVBZV3N3a3g0eG90MjF3VURQdHQ0UDlwZFZrSU1jaS9WQ0tsc3JWODh6WVNFbDBRaXdDVApJWEU5dVkybkFYaHBNaGJDb0NEb2crMzZHUnJ2cmE2RDZUQXVrcTczNTI1MWdKWjJWUkpSMkhEY1JwMnpvZVo0CkFya1Z4NWZtWThVUWRrM2E2OHVMWk5JZjNuVG90TjZ2bm9VdVora3kvdzg3ek1vZFBuZmVENzRtUmVHNjdlRi8KK042dmZ2NVEwa0d5OFBYd1FYVlVFSTdrQ1pGSEs5bnl5K3hiSldtcU5TQUJmWWY4UnpFV1ZnMExNRXczVGRZVgpTQWJBaSt0WU1HRDg3QytxZVdROGpnWC9mYWtkemVmUit2L2RBU3BZSkFoaVI0OVgyZGdIUlI3MWRjN3QyTXN5Ckltc2xoYVYxRUFBdVd6ZFJpeUxja0Z4L1dYS1c1bzQ2dnkzN2RnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
+    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS0FJQkFBS0NBZ0VBMFpXY3lSVzJ6RHYybEFBdW9ZRXRTMkQ5OUt3TVJmYjYzREp4bTJKMXhiQW94bEE0CitnU2FBNFFodm9SSHBMS1pUUEpGSElITkw2UmpZQkl1M1FaMklkNmxtMTZjUXdlSVRYYVRPbzROcThXRytFaDQKM21mWGM2cGlIUWNXSzFEcVFOS2Npdy9KYi9kZWZhTzVMV3A1Zkc3OFRqZENvbEZUZmw4M2xndUQzeXdOUUt5TQpWSTNhekx2TFpWM0UrRGp4WlU4M3R2S3ZUMW01Qzd6eTZhTXBOS3dFWkhtQk12Tkk5bHE0c2t3QkhST01ncnczCjlCWi9JVElUMUU1QVN2VVZXcTNTdmc5VENqR2pDbjB4V1kwMlI4ckNvblpEV0JLbDA1SkxlUnd4VlNCNHNWVzUKQjE0bCtEaDlUTVl5T1lWT0hIUW9LaVl2eTZHbXlYZVU1THNSampUVG5NM1BvUWV5N2g1UEN6dGtNVWFZR1JRZwprOG5ZNXZVekduL0tmc1hUY0YzYjhIRC9CdThNN2M1NnI2bXA3Q29hT3EvTHZvNWFDTWNoSE8zQ1JlaGdmazFoCkFNOXhSWkJha1doK2dLMlh6OG80RlpxLytuOFd0ci9GNGMrTms1UlZYbllraVlFOWx2K1MvWUdXc0pOSG5yTEkKMldhSDRSMEJVb3docTlwN2FpdDZtYVZ3MU5raVFVV1FFd1AreEZjMzNVbjY3QzN6dVhBazhrNnd1TlUwR3N4VwpnTlA5Tk5Rb3BpOUdjbVdKYjBicHNJYnpmdjA4WWJ1QWU4TGplK3FSR1ZkdTh2SDA3NnBNL1pzUjVvb0ZHQmdFCml1dHFIUVlxTjhJaVdsbVlGVWJKaEo4ZW9tRmduR3hERnI5ZjRLL2tsQkFmdG5xYThNZnpjZnV6TkpzQ0F3RUEKQVFLQ0FnQVB3VFhvZmN2Z2ZXOXpQN0pCck1LNVpHQ2l5RjRoMGtlWVR1aHdYRTNySHV0cHdQVVBnbElMaXA2NAp3aHZhbXh4Z0J1UkFHTmZTU1lLNDRaVUpRMmVVOHpZeXdFRngzbnFXRENCVUtnS0lFNUNxVUZSWnI2ZW9CN3BaCllVTiszUlhHNnE0ZTNBQngvTC9ySk9nU0xHdFdlY2RZbjluUDl0b1dhVlQxNEFhNU80Z0JnUmNKY2lKcytuNzMKTHozVHhRQU1kQkNGbmFlbENPTWFxVWovWENjSVVSZ0JiNHJSU0MySGExbHYrYnVwc21NQkh1SDc1TWNJdVVsNQpUNnFRbCt6VGhMYVBWL3FQalJ5cStLOUJncForZmhUMGZueGdmZ0plTGFTanhZVkYxMnVMTlJ6MEcxVXlYQmk3Ck1UanNUd09JcXdpcjVuUDRWRDREN2d2UXgra3hTeGxqUnZNaUJxSjRlR3Q3aTgvdmNhWndYc3Z5WUNxbWk4TEMKU1kyYXRndXFQT1hDSUF2YTVUMHJMZWJUZ0ZZaDlDamtZNG1ZaUQrZTczL0NnVVh2L2VHcWRTWkNEVVlKTVdVdAp2Y1EwTEZsM2VkSGgwekJpNWJsRGRCcHZ3NCsydkV6QkJyS2FwYzFMaXlRdDhaK0hISkNnTDhJNWFTMmI1ZW5nCkFmYWZyc0doMEhINjVjZEU3ZUp1U1lGN3o0RUJyL1RoNXBLS2k1QndGTU1zcmE3Z2pUeTBjNnAvS3lyell3enUKUElQamFreG45OXRBTWdEdUR4MC9ESUllZlB3WktVMG5HRjBpMHBuQktRUUpKazgvNmpGNzkvWHQvanBUcUc0TQpSVk5pL0JzNXB5OUZHMW90NFJ3Z0lpaUFTN21qL0F4VVNiQWZ0NmgrMjE4bnZGSUFrUUtDQVFFQTMyL1p5ZE56CjVwYWNVcTFobi93cGtCdGxxTXd2VHlRNERmZGZwT1locVhUb2p2VE1pdTJQeDFMY1dBTFN4MkkydzhMdG9uRTgKcW8xT3V4dGlHdDZmMW1DemJDa1Z0dHFvZWR1VGFubTBaREtSd0ZTSE1EeXdSS1VXMHByZFJKY0xyaDhOTURseAorY2MraHAyVjdTcmNKV3ZCMFZ4MlRXSHpRQUFKNTl3SENyT1JKdVZMTmlBZGZuVHZtSG8vOWo3dFNUeEJqNUtmCk5VVFJ2OWRVY3hpRlBzWHVPRUdWMWZzVkdqSG5zNFQvZXk2Q3NqOGdieGhmSHlFY2g0N3hteHBGVUQ5WU5IU1EKcUZUY2ROTzdUczFzV1pxYU41UThUMGpiOHZrWTRkZlFxTW9UMCtoR1AxMUN5QWQ2QlJZc203dzdmUTdEc1N4RgpEMDdXSUpFWGpvT0NrUUtDQVFFQThDRHhVdVdaYUh1eG1MV1hxZ2tBT2NFQm5OV3lGTnJ4alRDb3VydG5Cek5PCnpQUldmdVVlQ0VKbVVPeU5nQ3BWZkRuUEdHd3lqSklHSkU0cXplQ3k4TmFLb3RNWkZSb3BjaVFacW5hMHQrT3QKOURPTUV2RllUZ2FmTkxPM01kaWNOMmdCQkhhTGhIT01MZ3FHQTg2bkkwZENVZTRITklnM0FGT0ZTcnRCcFJOegpsSlgyejNDVjFGdVNLcVJSbzJveGs5MDNoS2RnOGpCSm1xeEZtc1JIMlB1VmdBMWtTeGNxbk4raG1DVytKa0M0CmNvTytQL2N1aE9VSm5QUXAvYW91NnRqWEF6ZFQ3dXNZNlM0MjdRWGdDcERIMmFNQUR1MXRHZHZKRnlGL0NkVjUKbUFtNy9ZZGVwZzJYbm1meXJPNWJ3NG5Nb094MWRTakxPK1Z6MW82Q2F3S0NBUUFMTWp1amxXajFZUTZzUmV2aQpiR3hZd0VhejBxZDhPOEJqVXNZRUtWUCtmZEU1ZUtMWFExZzFFTDNoMnlKY3cxc2pMQjFrU25CVHk0anFiMURYCkw5aXFrV1hzUVpMSSt1UCtWelpuMjNsaW0vWVp3U0tWRkRWdyt5VE5vTno5bHVRSzhadGprejFXMnRrVFBjcEoKZkNCVDc3WmltMU9DUlNvL1JzRTRVUm81T3c1RytLNXdJK1BXZGwyYk1tVUtIZFVlR2xyZXF1WTNjUjloa1pTMQp2OEROaUhXTGRCM2gveGJyblJ5VExsTHZCVUdmVlBKM0hxMkZqYzgwSzhHSG1DVnBCQU9UZlZQU1c0NUFmR3VpClkwRE9yS1NWckdQcFJTbGdYNE1UcmhEU3BHMmg3TDI0WngvMWpncGJQdVUxV0pWU2l1N2JiZkIzOStkYThtcFAKeGQ5QkFvSUJBQy9hSUwwb1MvM3FTR1hxS2lNVVVCc3lQeVFGNGNzT0puekFhWjlzb1FkcVRoWEJ5MHJXVmJuSApvYVFXdjh2K283Snh3cmRYT0d1UzNlNTJOVWw1c2E4VTBlUEl0WUxqQjhkYk1sSXAvYkYzaWI3VVZ1R2ZmcjF0CnpHUXdQQjJPMFBLcG95cEVoV0VMdGErbklUVzVCTTJlOGJScC9yMlZONEMxSkNiVVVpeVhSNzBnZFdLNVNPSmMKclRBYU5ycWQrdXRBZGtQVkp4aWNUczZuN2ViOW5tTzdIdnU1cjNiWFV3S1gvaGZYemFESjNQZlZFU0NtSFhzVwpPV2d4ci95QTRZQ2pYWldpZlBOcm5qYzVvbkJ4YjBncnVlZkE5ODRCdW5BZ3dGMy9xdFZHMlVoWENFTnBxbzdrCnZvWXVxTW1WWm12OUZlNHJzT3g4Q0tRVEFaYU1KNmtDZ2dFQkFOM2dzUHo4a00wa2hRaWpUWlg5L3JsOVBBWmMKTXZEYldRU203anFsK2V4T2x5cWxVTm04OWpzZGt5S2MvZHJnbzNqOXVXMzFQZTh5clZxQnQyMWY2OXBvditDMgpROHdhdGN3YW11Q1JVZDV1aG1ZSy9VRzYxTk5RaGI1Z05jcVhHSENZZjEvRXVmaUlkTUQzVlA3MklpdytyWmJsCjdWYWNiTEpmbUtKTk9weW5wNnZidXFvNDIyZmpKNlFZQUNteDJ0MjFqcFFlYmtXT3B3TElleVN2UnJrWEphZkgKM28rTkh0VEVmYVkxRERMWE10SEcvZ1o4eHpLekN1OEFjQ01Cb0FRTGIxck1GUzhpZXl5S0NFOGM4bWM3RTBleApSQmlpekhlSnNieFI3Vk1Mb1p2WEtHb0JtOFpkL0x0L2ZXZ1pncnpZVmZ5cVgyOFQwZEZObER6MW5wOD0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K
 
diff --git a/pkg/event/clusterListener.go b/pkg/event/clusterListener.go
index 43fe3c6..37e72d7 100644
--- a/pkg/event/clusterListener.go
+++ b/pkg/event/clusterListener.go
@@ -6,24 +6,104 @@ import (
 	log "github.com/sirupsen/logrus"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/watch"
 	"k8s.io/client-go/kubernetes"
+	"sync"
 )
 
 type ClusterListener struct {
 	cluser.ClusterFetcher
+	e                         EventFirer
+	c                         *kubernetes.Clientset
+	registeredNamespaces      map[string]watch.Interface
+	registeredNamespacesMutex sync.Mutex
 }
 
-func processEvent(typeEvent string, resourcesName string) {
-	log.Info("Event received, namespace: " + resourcesName + " " + typeEvent)
+func CreateClusterListener(client *kubernetes.Clientset) *ClusterListener {
+	return &ClusterListener{
+		c: client,
+		// Map concurrent safe
+		registeredNamespaces:      make(map[string]watch.Interface),
+		registeredNamespacesMutex: sync.Mutex{},
+		e: *CreateEventFirer(10, func() error {
+			log.Warn("Event fired")
+			return nil
+		}),
+	}
+}
+
+func (l *ClusterListener) readRegisteredNamespaces(key string) watch.Interface {
+	l.registeredNamespacesMutex.Lock()
+	defer l.registeredNamespacesMutex.Unlock()
+	return l.registeredNamespaces[key]
+}
+
+func (l *ClusterListener) writeRegisteredNamespaces(key string, value watch.Interface) {
+	l.registeredNamespacesMutex.Lock()
+	defer l.registeredNamespacesMutex.Unlock()
+	l.registeredNamespaces[key] = value
+}
+
+func (l *ClusterListener) processEvent(namespace string, typeEvent string) {
+	log.Info("Event received, namespace: " + namespace + " " + typeEvent)
+	// Wait for 30 seconds of inactivity before sending the event
+	go l.e.registerEvent()
+
+}
+
+func (l *ClusterListener) unregisterNamespace(namespace string) {
+	log.Info("Unregister namespace: " + namespace)
+	l.readRegisteredNamespaces(namespace).Stop()
 }
 
-func (l *ClusterListener) ListenToEvent(client *kubernetes.Clientset) error {
+func (l *ClusterListener) registerNamespace(namespace string) {
+	watcher, err := l.c.CoreV1().Events(namespace).Watch(context.Background(), metav1.ListOptions{})
+	if err != nil {
+		log.Error(err)
+		return
+	}
+
+	// Map concurrent safe
+	l.writeRegisteredNamespaces(namespace, watcher)
+
+	log.Info("Register namespace: " + namespace)
+	for event := range watcher.ResultChan() {
+		if event.Type == "" {
+			return
+		}
+		item := event.Object.(*corev1.Event)
+		l.processEvent(namespace, item.GetName())
+	}
+	log.Info("Unregister namespace: " + namespace)
+}
+
+func (l *ClusterListener) ListenToEvent() error {
 	// Subscribe to event
-	watcher, _ := client.CoreV1().Namespaces().Watch(context.Background(), metav1.ListOptions{})
+	watcher, err := l.c.CoreV1().Namespaces().Watch(context.Background(), metav1.ListOptions{})
+
+	if err != nil {
+		return err
+	}
 
 	for event := range watcher.ResultChan() {
 		item := event.Object.(*corev1.Namespace)
-		processEvent(string(event.Type), item.GetName())
+		switch event.Type {
+		case watch.Added:
+			{
+				go l.registerNamespace(item.GetName())
+				l.processEvent("general", string(event.Type))
+			}
+		case watch.Modified:
+			{
+				l.processEvent("general", string(event.Type))
+			}
+		case watch.Error:
+		case watch.Deleted:
+			{
+				l.processEvent("general", string(event.Type))
+				l.unregisterNamespace(item.GetName())
+			}
+		}
 	}
 	return nil
 }
diff --git a/pkg/event/eventFirer.go b/pkg/event/eventFirer.go
new file mode 100644
index 0000000..402adde
--- /dev/null
+++ b/pkg/event/eventFirer.go
@@ -0,0 +1,39 @@
+package event
+
+import (
+	log "github.com/sirupsen/logrus"
+	"time"
+)
+
+type EventFirer struct {
+	waitTime int
+	move     func() error
+	counter  int
+}
+
+func CreateEventFirer(waitTime int, move func() error) *EventFirer {
+	return &EventFirer{
+		waitTime: waitTime,
+		move:     move,
+		counter:  0,
+	}
+}
+
+func (e *EventFirer) startCounter(timer int) {
+	e.counter = timer
+	for e.counter > 0 {
+		// Wait for 1 second
+		time.Sleep(1 * time.Second)
+		e.counter--
+		log.Info("Counter: " + string(e.counter))
+	}
+	e.move()
+}
+
+func (e *EventFirer) registerEvent() {
+	if e.counter == 0 {
+		go e.startCounter(e.waitTime)
+	} else {
+		e.counter = e.waitTime
+	}
+}
-- 
GitLab


From 05e1f856c3cca76a98dcf8122f434dc2481bbf2a Mon Sep 17 00:00:00 2001
From: Claudio Herren <claudio.herren@edu.hefr.ch>
Date: Thu, 11 May 2023 15:40:09 +0200
Subject: [PATCH 03/18] Add ClusterFetcher stuff (WIP)

---
 cmd/main.go                       |  24 +-
 go.mod                            |   2 +-
 go.sum                            | 488 ++++++++++++++++++++++++++++++
 kubeconfig                        |   9 +-
 pkg/cluser/clusterFetcher.go      |   5 -
 pkg/cluster/clusterFetcher.go     |  83 +++++
 pkg/cluster/objects/Cluster.go    |   5 +
 pkg/cluster/objects/Deployment.go |   5 +
 pkg/cluster/objects/Ingress.go    |   5 +
 pkg/cluster/objects/Namespace.go  |   8 +
 pkg/cluster/objects/Pod.go        |   5 +
 pkg/cluster/objects/Service.go    |   5 +
 pkg/mermaid/mermaidGenerator.go   |  94 ++++++
 13 files changed, 712 insertions(+), 26 deletions(-)
 create mode 100644 go.sum
 delete mode 100644 pkg/cluser/clusterFetcher.go
 create mode 100644 pkg/cluster/clusterFetcher.go
 create mode 100644 pkg/cluster/objects/Cluster.go
 create mode 100644 pkg/cluster/objects/Deployment.go
 create mode 100644 pkg/cluster/objects/Ingress.go
 create mode 100644 pkg/cluster/objects/Namespace.go
 create mode 100644 pkg/cluster/objects/Pod.go
 create mode 100644 pkg/cluster/objects/Service.go
 create mode 100644 pkg/mermaid/mermaidGenerator.go

diff --git a/cmd/main.go b/cmd/main.go
index eedb23f..ed9ea83 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -1,10 +1,7 @@
 package main
 
 import (
-	"container-clusterviewer/pkg/event"
-	"context"
-	log "github.com/sirupsen/logrus"
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	cluster2 "container-clusterviewer/pkg/cluster"
 	"k8s.io/client-go/kubernetes"
 	"k8s.io/client-go/tools/clientcmd"
 )
@@ -16,17 +13,14 @@ var (
 
 func main() {
 
-	clusterLister := event.ClusterListener{}
-	err := clusterLister.ListenToEvent(clientset)
-	if err != nil {
-		return
-	}
+	//clusterLister := event.ClusterListener{}
+	//err := clusterLister.ListenToEvent(clientset)
+	//if err != nil {
+	//return
+	//}
 
-	list, _ := clientset.CoreV1().Namespaces().List(context.Background(), v1.ListOptions{})
-	pods, _ := clientset.CoreV1().Pods("").List(context.Background(), v1.ListOptions{})
-	log.Info(len(pods.Items))
+	cluster, _ := cluster2.FetchClusterObjects()
+	print(cluster)
 
-	for _, item := range list.Items {
-		log.Info(item.Name)
-	}
+	// mermaid.CreateMermaid()
 }
diff --git a/go.mod b/go.mod
index c683e40..5de47d2 100644
--- a/go.mod
+++ b/go.mod
@@ -4,6 +4,7 @@ go 1.19
 
 require (
 	github.com/sirupsen/logrus v1.9.0
+	k8s.io/api v0.27.1
 	k8s.io/apimachinery v0.27.1
 	k8s.io/client-go v0.27.1
 )
@@ -40,7 +41,6 @@ require (
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
-	k8s.io/api v0.27.1 // indirect
 	k8s.io/klog/v2 v2.90.1 // indirect
 	k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a // indirect
 	k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..10a9cb6
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,488 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=
+github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
+github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
+github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
+github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8=
+github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
+github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
+github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
+github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
+github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
+github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28=
+github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/onsi/ginkgo/v2 v2.9.1 h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk=
+github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
+github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
+github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg=
+golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=
+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
+golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
+google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
+google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
+gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+k8s.io/api v0.27.1 h1:Z6zUGQ1Vd10tJ+gHcNNNgkV5emCyW+v2XTmn+CLjSd0=
+k8s.io/api v0.27.1/go.mod h1:z5g/BpAiD+f6AArpqNjkY+cji8ueZDU/WV1jcj5Jk4E=
+k8s.io/apimachinery v0.27.1 h1:EGuZiLI95UQQcClhanryclaQE6xjg1Bts6/L3cD7zyc=
+k8s.io/apimachinery v0.27.1/go.mod h1:5ikh59fK3AJ287GUvpUsryoMFtH9zj/ARfWCo3AyXTM=
+k8s.io/client-go v0.27.1 h1:oXsfhW/qncM1wDmWBIuDzRHNS2tLhK3BZv512Nc59W8=
+k8s.io/client-go v0.27.1/go.mod h1:f8LHMUkVb3b9N8bWturc+EDtVVVwZ7ueTVquFAJb2vA=
+k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw=
+k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a h1:gmovKNur38vgoWfGtP5QOGNOA7ki4n6qNYoFAgMlNvg=
+k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY=
+k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY=
+k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
+sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
+sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
+sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
+sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
diff --git a/kubeconfig b/kubeconfig
index a86cc3f..5799464 100644
--- a/kubeconfig
+++ b/kubeconfig
@@ -1,8 +1,8 @@
 apiVersion: v1
 clusters:
 - cluster:
-    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdCakNDQSs2Z0F3SUJBZ0lVRjJjdmVQUUVGRS9FVjV2Zk9ZQ0tKNVpUdk5Bd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1dERUxNQWtHQTFVRUJoTUNRMGd4RFRBTEJnTlZCQWNNQkZwU1NERXhFVEFQQmdOVkJBb01DRVY0YjNOagpZV3hsTVF3d0NnWURWUVFMREFOVFMxTXhHVEFYQmdOVkJBTU1FR052Ym5SeWIyd3RjR3hoYm1VdFkyRXdJQmNOCk1qTXdOREUzTURneU9ERXpXaGdQTWpBM016QTBNRFF3T0RJNE1UaGFNRmd4Q3pBSkJnTlZCQVlUQWtOSU1RMHcKQ3dZRFZRUUhEQVJhVWtneE1SRXdEd1lEVlFRS0RBaEZlRzl6WTJGc1pURU1NQW9HQTFVRUN3d0RVMHRUTVJrdwpGd1lEVlFRRERCQmpiMjUwY205c0xYQnNZVzVsTFdOaE1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQXJHSUFJRlN1KzlUdjBETDZTeE55cy9HWUJwcXBrbHlnaHdienJqNGo0M3RvQWlhQ3pYRVAKTWZtdm5lRGRNL3pIUmZKd2tzY3NZa0IxL21mbVduMlZXNVRMekZqTFRNeGdlRmZ1c0E0UHBKdVl2WlB4Z3YzcgpzN0xMSkU1SlhxMTNld3B6YUt1YXJxV2Q4aGxVMHpXREhSbTZGdUFnaTRra1hZazVJVkpRMGdBc2M0L3doRlUwCkxLQ0tJdkRXUWlOQkFlUWdPd2d2Z29SK0pieHZJemVXa0VmaXpER3g1RUFWMVlMZ3ZYdUFRZ2dZMFZTT2RMRFYKT29rbmt1NUZuZUh0MExyL08rdDFORjZDQmRDSDZZMC90Q3Fhenc0VE94MnUzTW5pb1g3Vk1uZWlZdys0aWZoLwpUVDh2ayt1Zjd5c2ZqYzhteTlDOHNUN3lwSFVqUEhuZEVRelovM2w3a2R0clZ3anBvZWRwWXJ0L1lya3RRbHBpCkQrL095LzRaNVhUaXNOMWU2Y1BUenRzd2UwVnVkdDd5U3ZLcDZWS1VwaHVDcXZDR0MwdFNrdkhuNlRxRkl6NTcKWGE5TkRFN2U2emQ0b2Zvb3UvNnRvVDJ1WnQzQUJra3lVUXQwdFM3dHRvbEk1M3J3WkIvMFRtRm5RWDNod3hjTQphQjBGbzdhSkpGTU5JNGxBK2NaTlVncENnNHQxcUh1RHVwTmhLdzNpbVlpTjJpOW9QMnFCb1FWVGJhSU1ORDhyCjcrb25GcWVNdkg2dHlTWGRHSEhlZWJLZUNMU2MvU2hIREp6SkY0NWRLZ3lEd29McFNhTWFjdm9HbXRIanNzdk0Kd1pndFJRVnBIL3VTVmtzWHpWUU55RzNHZEpRSE00Wldud0JOTERJQmRTM1B2K2tNNWxQdVljVUNBd0VBQWFPQgp4VENCd2pCOUJnTlZIU01FZGpCMG9WeWtXakJZTVFzd0NRWURWUVFHRXdKRFNERU5NQXNHQTFVRUJ3d0VXbEpJCk1URVJNQThHQTFVRUNnd0lSWGh2YzJOaGJHVXhEREFLQmdOVkJBc01BMU5MVXpFWk1CY0dBMVVFQXd3UVkyOXUKZEhKdmJDMXdiR0Z1WlMxallZSVVGMmN2ZVBRRUZFL0VWNXZmT1lDS0o1WlR2TkF3SFFZRFZSME9CQllFRlBBKwp1NWZvN1lzUHMzejByZTByK3h2SURVRkJNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUF3RGdZRFZSMFBBUUgvCkJBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFDQmpPQzNwYVFlKzRCM2s1d00rM3pqbW5PNHZKaVUKWVduSS81ZHhndENUUmNRMW91WU9MSWUrcG41bWJjZi9udDNWbWhzdWsvNnhTZ3RHS3ZDeFhka2k3eE9rV1A0aApzNGQ1bU95RG11alVxVXVlTmpiUXcyQ2M3aXI0Y2tKU0Nlbm4zNExVU1kyYkxzaS85QTJ2WElmcGIrUGlkaEFRCjNqNmNwU1lFbmo1WHVNK0wzMjlOZUpqcFZPeUVDdDNjMVd1TXlSMm5wY0VoUGJSNmIydDR3MkQ5enRwSHRqeE4KeW45a29adzdEU0x0eFArNE9BSU5HdGJlam9Lai9MSkJyUGlHTVNNSGVKWHZqYU5rUzRLVEFMd1lwWkprT2RYYQpFSjFycnljQ2dZTXZDQVpwV0pjbnpNeVpSbndJQ2xsWGxLU25GSjU3T0tEaS9rbXU3Q0JhMlRtdWkxeXM5RmdtCndrUWc3SFhoV1VMOVE3UUoyam9JYldtakpPRXFtMTQzYm9TMXNxNFdPUDNlbCs4eFFnVEMvQkRldE9oSWg2cFEKRXJhVzN2WHUrUW9HNWVCSHVqdDRmZnIwSUN0US94UFlabGFsVHVET2JmYlVNakpLNjhrenpUZHJTS3NWaDM0VworTUVJTVFDbkNaQThRbHREZ0FLOVE3OVBhNlRvZFB2SXJmeWt5aFowLzBzdklSWjJsTnNjMS9hdXFLNkNWcDhUCnMrRlZEdkdGZk1sTWlobzFrUzkyc3ZSWElWVk5MSWRmZmhnbVpNcXJEcUdSc3pBTWp0Sk9oYUtZMWF5Q1FKc0cKdTlVMUdDNlFVSkhHTG9ZdDR3UEhqNXA2YXkvVEJjQW1WL2xIRnZza25tMVRHN1ZnYWxWc0h2cTVBK0p1Rm9hago4SzBlSW5OZWphbG02UT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
-    server: https://fa818a2e-0a5f-49cd-9582-abe745cc6223.sks-ch-dk-2.exo.io:443
+    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdCakNDQSs2Z0F3SUJBZ0lVUEE3b0ZZWjJicDhHSXYvVHpqbGlId0FGVjdVd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1dERUxNQWtHQTFVRUJoTUNRMGd4RFRBTEJnTlZCQWNNQkVkV1FUSXhFVEFQQmdOVkJBb01DRVY0YjNOagpZV3hsTVF3d0NnWURWUVFMREFOVFMxTXhHVEFYQmdOVkJBTU1FR052Ym5SeWIyd3RjR3hoYm1VdFkyRXdJQmNOCk1qTXdOVEF4TVRNMU1UVXpXaGdQTWpBM016QTBNVGd4TXpVeE5UaGFNRmd4Q3pBSkJnTlZCQVlUQWtOSU1RMHcKQ3dZRFZRUUhEQVJIVmtFeU1SRXdEd1lEVlFRS0RBaEZlRzl6WTJGc1pURU1NQW9HQTFVRUN3d0RVMHRUTVJrdwpGd1lEVlFRRERCQmpiMjUwY205c0xYQnNZVzVsTFdOaE1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQXZLb3ZkKzdUVXE5aWtuR3ZSRm9KYTN5YWtlSU9ydloyR0p4dFhFTStzUU8zY0h3Q2JkTEgKSVBCK2tQUGxxNXVpTEpkcFZ1NjV2UDhaQm4zVStUWWlzMzBDRFVybXdRa0xaejF2SWxReEtjUE5OYVpoNHRCOAorTmtjNTRPN3BTb3JvcHdPdTNKZ1NueVVRYUU1aUk1dHMrMW9EeXNrT2xCTS83L2tvUGU4U0Vqd09ZNVVPUVhPCm9Md0J3dzhaWVVOTzVxK050ZE1aM2JLeU8zYlZSRUYrNkdRY3lFNk5CQkJtZGh3QmxGMStMVldmMXhwKzFyNVIKQXZXdEFlVUNyaUl3OCs3QTdBdytFeDdhc3NkVStpWE9VbGdabkp4K0Zza280b3d6RkVNT2M4OFM0ZWZWOUxDVQp0NGtBeFBpZEM5dzBlYy9TQTNQdmhNQzEzbDN3dFRNWUpQYWpHbG5Od2gwdEc0cGhYa3VzRlB3R2U1d2ExOUswCkVWdHpVa3YyT3RJUmEyclNvay9WakZ0bCtINEZjbm5KNmtDL2xSdzMvVGg5OE0zcERvRWN2QS9CckpUZGlPamUKNHg1ZllaUlYzSFhESXVPOWNGREdtd0ZpSnAxSUkzSjR0TG42MGpQU25jOTNYbnhGbUtNOTFTQkwyVE52djFWdQo4MDJHS3ZUVENjWkRCOFhXYmUxNExmTDVpR3JUODNRUWhnQlUxay85WkFOVGcvRzQvRFpOS1pUbVkxakZFRjM1CldFQlNLNlY5bHZWaVJER21RenRxVUJBRGg3YVR6WXNMYllJYXR1ZlJMeG1VTHhKaUk4SVdWOEdpZDFHT2Z6OVoKMEhBT2xodE40WmxtV2RReUQ4R0d6OUVMc1lIM0lPcHBPNTEzWTAxZkxaMDlLNkFLLzNIcitnOENBd0VBQWFPQgp4VENCd2pCOUJnTlZIU01FZGpCMG9WeWtXakJZTVFzd0NRWURWUVFHRXdKRFNERU5NQXNHQTFVRUJ3d0VSMVpCCk1qRVJNQThHQTFVRUNnd0lSWGh2YzJOaGJHVXhEREFLQmdOVkJBc01BMU5MVXpFWk1CY0dBMVVFQXd3UVkyOXUKZEhKdmJDMXdiR0Z1WlMxallZSVVQQTdvRllaMmJwOEdJdi9UempsaUh3QUZWN1V3SFFZRFZSME9CQllFRkJBUApDK2sxWng1YjlHaDVlc2FGNm1lWHhtejhNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUF3RGdZRFZSMFBBUUgvCkJBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFDN2g1dlAvNi90eXRmWEp2TXlOQkFzWEVyaldLVUEKNno2UVlHVXk2eVVQQnhPS1RmRHprSWVFRURtdTRDekw0TkJvY0dwZTJwaU1WSnY0VW5hbksyb1JPemJSdnEyTAprVWJxL1l3dUI5anhyQXJiaFh0eFN6ZEMvQnRocWk1cHBZcDd0SHBIUjVzWUQ0TzFyazc5QTExc0VRWGJ1dWlsCk9UemdjZzZVRGx6ZUQwSXNlVEUrY3NGcEhjdlVhOTlIZWgwUklrbGhEa1E3TVpYczRCcEVSLzBQMmxUL3pnRHYKT1BUUldQUlBZZlZDZ1lKRkNZNytxQ3o0bWZ0TFF3ZFhMZ21EUmJJRWZLTy9JWGtWcVI4MHJXcElZUU5ybk9ZSgpBRzFQd0RTU1ZWd1A4Nk9WcDJBa2k1SGFmanFRUWRmYUhmc3B0S00zWU90cmFXT2NFUnNJV25xWm9Vb1BiTXNtCmNscWFqTmI5ZjNTVU1OZDlaem9aY3pIcjduSUFQT1U3Q09EaGdGcmk1d3E1dmtJT3RGRTRoU0hsUmZQa2hINDQKdFR1YTRjUFV3YzRoNUt0YXgwdk9kNjcrRUxTZGJDZGFzWGYrS3V5eDlibHFGQTlvWGhUcWxYNHRtVnFCMnRiegowZ3NEU2VyRGNDVjFNTjRIRmVNRllRVVJuUFRRanJzb0hkMkkzRVpWVkdpNVlRYnE4SjRmakxzUDdLU0g2alRZCmxtSmprd0xXcmlhS1J4Z2NlMmZFNlZDMjNyUGlRa25oUUsvZ1J5QW5vbllwTXZEajZqZld5TEdLTmxQcEdaYmkKbDBVTXNJbVMyVC84U0JnYS9NUlRnS05hcUJsa1Z1aFNqVGdoL0FiQTVRbmVSSVVCbHNWcnBzYmZETzJsSkpEVApDQkRaSERWZ3ZwU0E1Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
+    server: https://4bab7b3a-8545-447b-837d-e4fe213a33cb.sks-ch-gva-2.exo.io:443
   name: exoscale
 contexts:
 - context:
@@ -15,6 +15,5 @@ preferences: {}
 users:
 - name: pi-admin
   user:
-    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1RENDQTZDZ0F3SUJBZ0lVWHI2RVlkSW9yc0RVb212YmdKRUFZT1YyRHkwd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1ZERUxNQWtHQTFVRUJoTUNRMGd4RFRBTEJnTlZCQWNNQkZwU1NERXhFVEFQQmdOVkJBb01DRVY0YjNOagpZV3hsTVF3d0NnWURWUVFMREFOVFMxTXhGVEFUQmdOVkJBTU1ERzl3WlhKaGRHOXljeTFqWVRBZUZ3MHlNekEwCk1UY3hNVEE0TXpWYUZ3MHlNekExTVRjeE1UQTROREJhTUY0eEN6QUpCZ05WQkFZVEFrTklNUTB3Q3dZRFZRUUgKREFSYVVrZ3hNUmN3RlFZRFZRUUtEQTV6ZVhOMFpXMDZiV0Z6ZEdWeWN6RU1NQW9HQTFVRUN3d0RVMHRUTVJrdwpGd1lEVlFRRERCQnJkV0psY201bGRHVnpMV0ZrYldsdU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQXQyZTdSR1JGTlpSRVE1d0lUNXZpRHZZZUdYK0JiSGVlTlhMUHNvdG12MFMvdVdGNlRTeTcKWU5PUmd1Q2ZxRWUwdGF3c2JxVUp5UE5hUVA1VkVXQUIxaXhGSjE3b2tXbmc4NEx2YlJjb3NtQWhXOHgxZmlNRgp1cUp2c212bnhkWEMyQ2tsOU9zYVpiK3JEWjhHbXNnMFZKYk03ZFJyamlnSkpUbUFDYjFvOVR2akpUQ0hWeWlhClExdlNtdHlCV2hieTNtam9yS01SZlJoeHEyc0dOY0pMd2t5YTd3bklVRzVzcm9BckF2OHRaNXR3R3Jpc3dRMWwKeEkrZkNVN2cyeWc0N2NOaSs5c1J0SHJFMy9XMjlrRzlWQXcxWEZraU1xeG5wYkhGMno2MWREbkgyY3Fqb21hUQpzMmF2U0xrcVNkdWc4Rm1RNi9IWW9TaDV6Q2EycFVJT0w5b0NrNGxrVk13NDVSd1ZLN3hBVVNTM3czWDVXalpqClhPcERNZndyNHF6OFU3bzlEeUNRODVXaFdYWFNWY3Q2MkFCZEs4a1Fta3JDci9JNDVEU2RDN3JGQldOY1VCOWoKSDhFT3NoSzhWanM4Ym90KzY4ZDZvOTQ3MDFXZkswUzB4VlFpRDRQb0VkN0l6VXFReDVQNFNqeVR0YmVDWGhKSApCTThaUTViaWk2Ty85Q1RuZmxUVEt6aTM5UDVWUHZKQmJETXJQS3hlWDZlOW4wb0Y1QjJMbUVERXFWbkZma25oCk0yc3pCRVVYSkZqQzlnR0g0NHV2djAwUEJ3Q1RxZDNqK1VSYXh0K3ExelZPMDQvVmdDYmFUUVExc0JjeXk0dEgKWVJ4Z0FueHhJc2JqVXRpNDd2NGt0Q0c5T2p4cHl2SFVGdDhLNGdIQU5GYnlLRDdiRTM0eG9Ca0NBd0VBQWFONApNSFl3SHdZRFZSMGpCQmd3Rm9BVVlYcGI2YUdQR2Zqc2l3SnNndERZSkJwcEhnUXdIUVlEVlIwT0JCWUVGQko4CmRlODE5RGtSVU83WklLZFh4QnNwM20vM01Bd0dBMVVkRXdFQi93UUNNQUF3RGdZRFZSMFBBUUgvQkFRREFnV2cKTUJZR0ExVWRKUUVCL3dRTU1Bb0dDQ3NHQVFVRkJ3TUNNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJBVmxHTwo4MEtFUitSMEFBOCtlWE5ESDRuV3dwZmhyQmdJWUpIWkJIb2FrM0xtcHdwczBjSktGTnkxWXJlK2FFS3VPNGxKCjNIWk9BVFdpbXQ5WW5nRHFFWTRjaS9TSDRwTUhaaVdQYnNwdTFSYm9XZ3ZYMFNaam11SFI3WVVpdU0xemI3RUcKQzBCRXMvdGFLWTZnZTh4aUZ6UWdQQzBySGpkNks3OU1SbXFvR1dFL3pHWnlmWmJxNDJQZU10MzZ5dkZ3Q3AxZwpYNmRSbGprcWx5dE1VbHlNYlBmOWpuYzJOWGZmaDRqaWlhd1dWZTlxVXQxalpCQk5VbmplRlE4dUtvRmhyWUtMClNGUWY3NEptREtmZksyWDhBdjFHVk55YytDOStOSWtYMEtGdlJRL0M5QVFEMjRrMzdETGk5cjdMa0VBWVRmaGgKVG4xU1V4ZXFFRGZGQW1oZnhUSzdrdnYyMHYxNXFDa3hWUVdQdzhhZW96eVY4TmNWdUVIKzRzVVVMTHoxbTFHTwp3NlJuWW1vRHBIZklVT1A1S2ZhbWdWZ1hNVERpbE9QVEUwUk5qMjlUWHdjV3VPMEQ0a2RtdU5rMDdpL3hRZU5SCk4xV3NidmJaQWk2dXdoRmNpTTREbUIycXRrRktIQTZDY3plYm1SQTBjZ3BvdkdnWndxV3QrMDN6NDh4MjQxTXAKMERXRTVaVHltOXliWFlGMFhzblJUVTI2eUFrVG5pMkJML1NYcUxVbExnVnZUb28rRUpOQlRwdnQ4dDdnYlJGOApNOXFlSE80ZUszbUkzbGNkdHdxQXFVR3BobklYRENwNmFDTVBZZDV0QUpXNXNzUUo2TEtQMWNXbWVIUXJSR2IzCldULzVJeXRMcW4vU3lDQVBCKy9icEhyUDBDM2dHSk8yRHA4RExnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
-    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKSndJQkFBS0NBZ0VBdDJlN1JHUkZOWlJFUTV3SVQ1dmlEdlllR1grQmJIZWVOWExQc290bXYwUy91V0Y2ClRTeTdZTk9SZ3VDZnFFZTB0YXdzYnFVSnlQTmFRUDVWRVdBQjFpeEZKMTdva1duZzg0THZiUmNvc21BaFc4eDEKZmlNRnVxSnZzbXZueGRYQzJDa2w5T3NhWmIrckRaOEdtc2cwVkpiTTdkUnJqaWdKSlRtQUNiMW85VHZqSlRDSApWeWlhUTF2U210eUJXaGJ5M21qb3JLTVJmUmh4cTJzR05jSkx3a3lhN3duSVVHNXNyb0FyQXY4dFo1dHdHcmlzCndRMWx4SStmQ1U3ZzJ5ZzQ3Y05pKzlzUnRIckUzL1cyOWtHOVZBdzFYRmtpTXF4bnBiSEYyejYxZERuSDJjcWoKb21hUXMyYXZTTGtxU2R1ZzhGbVE2L0hZb1NoNXpDYTJwVUlPTDlvQ2s0bGtWTXc0NVJ3Vks3eEFVU1MzdzNYNQpXalpqWE9wRE1md3I0cXo4VTdvOUR5Q1E4NVdoV1hYU1ZjdDYyQUJkSzhrUW1rckNyL0k0NURTZEM3ckZCV05jClVCOWpIOEVPc2hLOFZqczhib3QrNjhkNm85NDcwMVdmSzBTMHhWUWlENFBvRWQ3SXpVcVF4NVA0U2p5VHRiZUMKWGhKSEJNOFpRNWJpaTZPLzlDVG5mbFRUS3ppMzlQNVZQdkpCYkRNclBLeGVYNmU5bjBvRjVCMkxtRURFcVZuRgpma25oTTJzekJFVVhKRmpDOWdHSDQ0dXZ2MDBQQndDVHFkM2orVVJheHQrcTF6Vk8wNC9WZ0NiYVRRUTFzQmN5Cnk0dEhZUnhnQW54eElzYmpVdGk0N3Y0a3RDRzlPanhweXZIVUZ0OEs0Z0hBTkZieUtEN2JFMzR4b0JrQ0F3RUEKQVFLQ0FnQXB0ZEVjZ2pOTk5wMTV4TXdORXRZTDhnUXhaMUtQVVBydGkrRlphU09pWHllOUtNS1FONXFic0RINQpFazJ0RHpXMVZXVTdlcFFwbTlLTVVtc1ZTd0RQN1B5RE1pM3hHQ085TGF0MjQxdnhpVFE4OU5oSnFmeGRFQ0VYCjhqdGhQamFVUTNOcTZtYnorZTJVYVBTdkVkWDQ0TnpWUDhpQUtYRy9BZjh3OTk4ZFdwUFRldUJrdllxcncvKzMKRVd2bmlhMk5VRTJPS1gzS05kdHdFU1IxNkd5alVSbXhRRWZLcHZwWGl6Vjg5bnlrZ2ZDeVd3cUsweG13Wkx0VgoraGJnTUpzVjA2ZzR2LzhjVFFsbUo3TUcrVGR1SEdLc1VHY2JJQ05vUnZCSTVzK01rYkYyUWdRSjVJcUhDbFRWCjFLcWQ1bkdKQjgyU0kwdlJodXVBTnRPMTdMcGQyMGNSek9qZDQyUE5nTmg2Mlh0NEZKQms0M1Nsc2dETVRmSDkKRk1lQ3JEd1l1T1VWd1pyOWdwSzk5MXZ2aVJJaTd3ZGdaUW9KbDNWZXBYc2tySSs0bUx4Sk05bWZJSW5zN1o2agpYc3pjMHkwNld5SWVrdUc0Z1BUQ0tLMzFET0pCdStVQlZaYmMybi9oZy96VjBUMmYwckxQZ2RtSWdFd3BUZWdZClpSbEJST0xLLzFqbnE5ZUJTdFhaWGVqbEtVbzVyVDJsektaT2NGMWdCSjBZNHZHQ2F3Ry9XZnlIaG00K2V0WHkKaHlzeHB4ODZYVEN4RkJaS0RseXYxTVVXblpGTlo4U2crMU1jTFlwVXBvdDVYRFpxQXRSNDY2SVczL2hTNlpsRgpSQ2ZYb2Z4MURKY2ZaL2ljRnp5TXFnQjNuaVhpWVFsSVVCWnB3czZOOVB5SWhkUDVpUUtDQVFFQXY0ZGswYmRKCm9qTkVaZG9rSENxK1RIMDIxbG1xMTlaWmR4c1BJM2ZPWndEbmxKT0I0SkNSK2VjNlA4eUo0QmxxNUZ6UTljRXgKQ3Qxb3lhcDUzUS9EOUV3QTZrL2RuYmdwdFlZWTNuNjRuNlYvbDd5WTlYbUh3VkdtVzVZMngxZ0tKSDRNNEFWcgoyOU5CMXAxeE81SXYya2l3bkxIdHZjNm5OWElVZVYxUTJKeGw5dExGYlhYVFEyMytIVjJkR1gvTy9BbUVYeERGCmM1aW1NWTI1dytyclV4bHVUK1lDa0FoYTFNRDFaZGQxcVBFRE5RaXhHSFJpQ1JiUG10cFYxanJQeklNcS9XZWoKWXJjZFdtQUdWMTZHdHFMekEvNzFxdThIU2JYeHl2YjNEV3pRQjUyelVlRW5Rd3ZPK2x2SXlVM2FVU000RHNEVgpTeDk4NFdxQStLaEZaUUtDQVFFQTlTUkwxdndtdC9wLzRzdEhmSVpCZldjQWJVV0s3WVl1US9YcjYrdjg2eGxqCkFuYWZUSG5ESWZZKzgxalYrZFRNSm1uTzYycjhKL3FLUWxVaGRldSs2dUVhNzg2QW12TTBPdVUwQVFiQTEvejMKalJreVB2ajRhTmh1VG9mSmxBRG4rb0xaRzJBak1WajUrV3RicXlkbW9hQ1lqdUZuRldXa1d3eFdTQ3A1VFovQgoxOU1jREZEWWdaanZyWFhrVlBkMkppb3lFeWtWcVhmckJTQ1JWanFEMFRzckNQdGNHd2h2Q2ljdWU0ZVJMRWVVCkluUUxrM1RWTS91dXdSZlpqKzJiNEZ1VG14VmdjN0hwRmhvWHFkck9Rb216SHFROE5jWjFzMjluSDlCcVRMWWYKTFl0MkZrRys2QUkxUmQyVUhqNldHQ0tBdndUZXhab1llOG80OFVYdXBRS0NBUUFLWGE2VU55SlNHQW84cFBqTgpXWGJoTnVtdjRqeC80QWNKampwY2hoQnl2TGJMOE12WHRwdGY5aWJONnlrUEt2RUJHUkRxTENHV1gvTmE3dElYCnA5SElPQkRZbmFmMThGQzVsVjlsTTJDVXEyVmpkZjZsVW9XSmJmemQraHhPMzdIMDFhbW11a1JqS21UbTA3Q2MKTThaSlB5UG41eTFoMTN4dlJSUmNtVE5WOWVrQzJkZDduQ1BxQTFyOGhlT0p6TVFNR2d2REJXcGFYa21vWnU1Rgo3MEg3Um1ZVkJ2TGVqc1V6dkpuTGdFVEs5dmhnZDI3MlR0NDdkYk9Zd3ZaZ1dPQ0VSaGtlaSt4bzNGWkhYT2thCjgyL0JGTUtvVmJWQUloMjMzSlFRa3hzOTY4UzZsTXR1eEF2VzhoMnFxU3NOMGh2ZHhsVXpYelpzRVhFMTFnalMKN0hDTkFvSUJBQjlUcHhsdkdhZVRMSHFZRGFlZEpJdFkrVlg5ZUJhSWVpc1hKekg3ODFNNzZFb3RUSWdpVzB4Zwp3b1NvaXBlbG1QMGpzbHlsVEZuemkyMlVvWFVIVGx1SHJzQ01mQ1RSQlpDdEw2c2Q2TkR4TTlWbExlV2NQV3B3CmxoQVZEQzZNdXhocFZrTklVdGNBanRsUDNlUU9ZZkF2cks4OW9NVzhPbmVrS1BhSjd2eDdlUE1TdUZmZWtQeG0KeGVJOTJaTCtHS3doNGtwT2lzVWdYUGxId3lyb3lXV1lrUlJSd3VCMWdITWt0S3oya3hlOGdmS3hMN1dGVGFXWgorU2dWMnlpb2JhNExKZDdBcVpXL1c1RUdmcFduTDRxVFBEK2pMMHFUOVFDY01PcUE0TVN5MVdNbG1rNlgwa1NsCjI1YjFEUE9jZmVQUnJQQThPQmU2Ykh5TlNCK1ZGejBDZ2dFQVF5K2t1cWd5RmNsKzJIbXptR0d0RUxvOEQ5SXAKb3JrQ21MTnM4OGRlTHJMU1lqQmN4dUZwVUcrQ1o2SUQyZ25udW00YXo5cVFxQy94TENkbWQyYzQrQWNIRUVkMAoxeTh3bWprKzBOQ1J2SFk2ZGtyT3QweGFWNHFDQTA1czRVVW5GY2xkUFM4Q0dZeEFuMXUwQzNjNFhVN2RqRHBaCmJ3bk5zMjRiM0dhM3psNTdnK0xJK2pydjYvMEk3eG1uYXNSSXFpR1V2alQ2ZENRK2dBcjNDUFFkcVZNTm5SSnMKY2t1c0tQVEF3dWNycXUwZnhDY01VcHk1UjlPYnFIcHc1dkFmYVpSeVlmOXBNcTY0ZGV2RFYrRWp5a1crcVNKRQpLMzJkRkRaOXFEdlhBeThLRld4dWtkcTgwTTVRd0dpeTJrMHI2blh6b2FMWEZ2R0pmL2hCNkF6emp3PT0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K
-
+    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1RENDQTZDZ0F3SUJBZ0lVWDE5RzQ1dmVMVkd0bjRtSmV4VjZNa3FKaGtnd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1ZERUxNQWtHQTFVRUJoTUNRMGd4RFRBTEJnTlZCQWNNQkVkV1FUSXhFVEFQQmdOVkJBb01DRVY0YjNOagpZV3hsTVF3d0NnWURWUVFMREFOVFMxTXhGVEFUQmdOVkJBTU1ERzl3WlhKaGRHOXljeTFqWVRBZUZ3MHlNekExCk1ERXhNelUwTWpkYUZ3MHlNekE0TURneE16VTBNekphTUY0eEN6QUpCZ05WQkFZVEFrTklNUTB3Q3dZRFZRUUgKREFSSFZrRXlNUmN3RlFZRFZRUUtEQTV6ZVhOMFpXMDZiV0Z6ZEdWeWN6RU1NQW9HQTFVRUN3d0RVMHRUTVJrdwpGd1lEVlFRRERCQnJkV0psY201bGRHVnpMV0ZrYldsdU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQTBaV2N5UlcyekR2MmxBQXVvWUV0UzJEOTlLd01SZmI2M0RKeG0ySjF4YkFveGxBNCtnU2EKQTRRaHZvUkhwTEtaVFBKRkhJSE5MNlJqWUJJdTNRWjJJZDZsbTE2Y1F3ZUlUWGFUT280TnE4V0crRWg0M21mWApjNnBpSFFjV0sxRHFRTktjaXcvSmIvZGVmYU81TFdwNWZHNzhUamRDb2xGVGZsODNsZ3VEM3l3TlFLeU1WSTNhCnpMdkxaVjNFK0RqeFpVODN0dkt2VDFtNUM3enk2YU1wTkt3RVpIbUJNdk5JOWxxNHNrd0JIUk9NZ3J3MzlCWi8KSVRJVDFFNUFTdlVWV3EzU3ZnOVRDakdqQ24weFdZMDJSOHJDb25aRFdCS2wwNUpMZVJ3eFZTQjRzVlc1QjE0bAorRGg5VE1ZeU9ZVk9ISFFvS2lZdnk2R215WGVVNUxzUmpqVFRuTTNQb1FleTdoNVBDenRrTVVhWUdSUWdrOG5ZCjV2VXpHbi9LZnNYVGNGM2I4SEQvQnU4TTdjNTZyNm1wN0NvYU9xL0x2bzVhQ01jaEhPM0NSZWhnZmsxaEFNOXgKUlpCYWtXaCtnSzJYejhvNEZacS8rbjhXdHIvRjRjK05rNVJWWG5Za2lZRTlsditTL1lHV3NKTkhuckxJMldhSAo0UjBCVW93aHE5cDdhaXQ2bWFWdzFOa2lRVVdRRXdQK3hGYzMzVW42N0MzenVYQWs4azZ3dU5VMEdzeFdnTlA5Ck5OUW9waTlHY21XSmIwYnBzSWJ6ZnYwOFlidUFlOExqZStxUkdWZHU4dkgwNzZwTS9ac1I1b29GR0JnRWl1dHEKSFFZcU44SWlXbG1ZRlViSmhKOGVvbUZnbkd4REZyOWY0Sy9rbEJBZnRucWE4TWZ6Y2Z1ek5Kc0NBd0VBQWFONApNSFl3SHdZRFZSMGpCQmd3Rm9BVVZJdDluRkxJVitLei9ocnVGZFpNWXhERVgyUXdIUVlEVlIwT0JCWUVGTTVLClBteDFaQlBITGtNV1dLQUVDRW9rdW5YcE1Bd0dBMVVkRXdFQi93UUNNQUF3RGdZRFZSMFBBUUgvQkFRREFnV2cKTUJZR0ExVWRKUUVCL3dRTU1Bb0dDQ3NHQVFVRkJ3TUNNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFlckpVaAo4eCtudU55dVVsc21tODlXYWtKQ0Y3Y3hQTktyeldoOGxGelZmMWEyK0tJNlNQTWtIQk1zWkZ1MzR0N1YvMGhhClEyVG1EanpkaHBjdGJmcDV1S25YQ3hXMnhnRTlFYnFGNTAxZU9USjZpNjdDNDFOOE54am44OFFmZ3lwZXQ3U3YKeGtPMGNKdG1zT2Z0YXRJSDhrN0ZjSGhFaGtHeDFHc2lKcUUwdVNiV2tHeGZKUlRzTEdvQUZPRVp1a1ovL09mMQpZNEJUUjdJcENPSHNjemlhZnZOUHhDQnAxODl0SGEvbzNsaGs0UUxIRXRSL1hIZWdSNVRPQnVVcUdhZVBJVTY2CmdmVnFpVnhIRnhQMmhnWVRXSit4WmlOZTc5RHZka05UdGxPQ1dwOTV2RkhXMXJtbEhKUC9MWnlTZDlscng1RWkKVHdNU2IrOUkzalJJOVBZV3N3a3g0eG90MjF3VURQdHQ0UDlwZFZrSU1jaS9WQ0tsc3JWODh6WVNFbDBRaXdDVApJWEU5dVkybkFYaHBNaGJDb0NEb2crMzZHUnJ2cmE2RDZUQXVrcTczNTI1MWdKWjJWUkpSMkhEY1JwMnpvZVo0CkFya1Z4NWZtWThVUWRrM2E2OHVMWk5JZjNuVG90TjZ2bm9VdVora3kvdzg3ek1vZFBuZmVENzRtUmVHNjdlRi8KK042dmZ2NVEwa0d5OFBYd1FYVlVFSTdrQ1pGSEs5bnl5K3hiSldtcU5TQUJmWWY4UnpFV1ZnMExNRXczVGRZVgpTQWJBaSt0WU1HRDg3QytxZVdROGpnWC9mYWtkemVmUit2L2RBU3BZSkFoaVI0OVgyZGdIUlI3MWRjN3QyTXN5Ckltc2xoYVYxRUFBdVd6ZFJpeUxja0Z4L1dYS1c1bzQ2dnkzN2RnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
+    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS0FJQkFBS0NBZ0VBMFpXY3lSVzJ6RHYybEFBdW9ZRXRTMkQ5OUt3TVJmYjYzREp4bTJKMXhiQW94bEE0CitnU2FBNFFodm9SSHBMS1pUUEpGSElITkw2UmpZQkl1M1FaMklkNmxtMTZjUXdlSVRYYVRPbzROcThXRytFaDQKM21mWGM2cGlIUWNXSzFEcVFOS2Npdy9KYi9kZWZhTzVMV3A1Zkc3OFRqZENvbEZUZmw4M2xndUQzeXdOUUt5TQpWSTNhekx2TFpWM0UrRGp4WlU4M3R2S3ZUMW01Qzd6eTZhTXBOS3dFWkhtQk12Tkk5bHE0c2t3QkhST01ncnczCjlCWi9JVElUMUU1QVN2VVZXcTNTdmc5VENqR2pDbjB4V1kwMlI4ckNvblpEV0JLbDA1SkxlUnd4VlNCNHNWVzUKQjE0bCtEaDlUTVl5T1lWT0hIUW9LaVl2eTZHbXlYZVU1THNSampUVG5NM1BvUWV5N2g1UEN6dGtNVWFZR1JRZwprOG5ZNXZVekduL0tmc1hUY0YzYjhIRC9CdThNN2M1NnI2bXA3Q29hT3EvTHZvNWFDTWNoSE8zQ1JlaGdmazFoCkFNOXhSWkJha1doK2dLMlh6OG80RlpxLytuOFd0ci9GNGMrTms1UlZYbllraVlFOWx2K1MvWUdXc0pOSG5yTEkKMldhSDRSMEJVb3docTlwN2FpdDZtYVZ3MU5raVFVV1FFd1AreEZjMzNVbjY3QzN6dVhBazhrNnd1TlUwR3N4VwpnTlA5Tk5Rb3BpOUdjbVdKYjBicHNJYnpmdjA4WWJ1QWU4TGplK3FSR1ZkdTh2SDA3NnBNL1pzUjVvb0ZHQmdFCml1dHFIUVlxTjhJaVdsbVlGVWJKaEo4ZW9tRmduR3hERnI5ZjRLL2tsQkFmdG5xYThNZnpjZnV6TkpzQ0F3RUEKQVFLQ0FnQVB3VFhvZmN2Z2ZXOXpQN0pCck1LNVpHQ2l5RjRoMGtlWVR1aHdYRTNySHV0cHdQVVBnbElMaXA2NAp3aHZhbXh4Z0J1UkFHTmZTU1lLNDRaVUpRMmVVOHpZeXdFRngzbnFXRENCVUtnS0lFNUNxVUZSWnI2ZW9CN3BaCllVTiszUlhHNnE0ZTNBQngvTC9ySk9nU0xHdFdlY2RZbjluUDl0b1dhVlQxNEFhNU80Z0JnUmNKY2lKcytuNzMKTHozVHhRQU1kQkNGbmFlbENPTWFxVWovWENjSVVSZ0JiNHJSU0MySGExbHYrYnVwc21NQkh1SDc1TWNJdVVsNQpUNnFRbCt6VGhMYVBWL3FQalJ5cStLOUJncForZmhUMGZueGdmZ0plTGFTanhZVkYxMnVMTlJ6MEcxVXlYQmk3Ck1UanNUd09JcXdpcjVuUDRWRDREN2d2UXgra3hTeGxqUnZNaUJxSjRlR3Q3aTgvdmNhWndYc3Z5WUNxbWk4TEMKU1kyYXRndXFQT1hDSUF2YTVUMHJMZWJUZ0ZZaDlDamtZNG1ZaUQrZTczL0NnVVh2L2VHcWRTWkNEVVlKTVdVdAp2Y1EwTEZsM2VkSGgwekJpNWJsRGRCcHZ3NCsydkV6QkJyS2FwYzFMaXlRdDhaK0hISkNnTDhJNWFTMmI1ZW5nCkFmYWZyc0doMEhINjVjZEU3ZUp1U1lGN3o0RUJyL1RoNXBLS2k1QndGTU1zcmE3Z2pUeTBjNnAvS3lyell3enUKUElQamFreG45OXRBTWdEdUR4MC9ESUllZlB3WktVMG5HRjBpMHBuQktRUUpKazgvNmpGNzkvWHQvanBUcUc0TQpSVk5pL0JzNXB5OUZHMW90NFJ3Z0lpaUFTN21qL0F4VVNiQWZ0NmgrMjE4bnZGSUFrUUtDQVFFQTMyL1p5ZE56CjVwYWNVcTFobi93cGtCdGxxTXd2VHlRNERmZGZwT1locVhUb2p2VE1pdTJQeDFMY1dBTFN4MkkydzhMdG9uRTgKcW8xT3V4dGlHdDZmMW1DemJDa1Z0dHFvZWR1VGFubTBaREtSd0ZTSE1EeXdSS1VXMHByZFJKY0xyaDhOTURseAorY2MraHAyVjdTcmNKV3ZCMFZ4MlRXSHpRQUFKNTl3SENyT1JKdVZMTmlBZGZuVHZtSG8vOWo3dFNUeEJqNUtmCk5VVFJ2OWRVY3hpRlBzWHVPRUdWMWZzVkdqSG5zNFQvZXk2Q3NqOGdieGhmSHlFY2g0N3hteHBGVUQ5WU5IU1EKcUZUY2ROTzdUczFzV1pxYU41UThUMGpiOHZrWTRkZlFxTW9UMCtoR1AxMUN5QWQ2QlJZc203dzdmUTdEc1N4RgpEMDdXSUpFWGpvT0NrUUtDQVFFQThDRHhVdVdaYUh1eG1MV1hxZ2tBT2NFQm5OV3lGTnJ4alRDb3VydG5Cek5PCnpQUldmdVVlQ0VKbVVPeU5nQ3BWZkRuUEdHd3lqSklHSkU0cXplQ3k4TmFLb3RNWkZSb3BjaVFacW5hMHQrT3QKOURPTUV2RllUZ2FmTkxPM01kaWNOMmdCQkhhTGhIT01MZ3FHQTg2bkkwZENVZTRITklnM0FGT0ZTcnRCcFJOegpsSlgyejNDVjFGdVNLcVJSbzJveGs5MDNoS2RnOGpCSm1xeEZtc1JIMlB1VmdBMWtTeGNxbk4raG1DVytKa0M0CmNvTytQL2N1aE9VSm5QUXAvYW91NnRqWEF6ZFQ3dXNZNlM0MjdRWGdDcERIMmFNQUR1MXRHZHZKRnlGL0NkVjUKbUFtNy9ZZGVwZzJYbm1meXJPNWJ3NG5Nb094MWRTakxPK1Z6MW82Q2F3S0NBUUFMTWp1amxXajFZUTZzUmV2aQpiR3hZd0VhejBxZDhPOEJqVXNZRUtWUCtmZEU1ZUtMWFExZzFFTDNoMnlKY3cxc2pMQjFrU25CVHk0anFiMURYCkw5aXFrV1hzUVpMSSt1UCtWelpuMjNsaW0vWVp3U0tWRkRWdyt5VE5vTno5bHVRSzhadGprejFXMnRrVFBjcEoKZkNCVDc3WmltMU9DUlNvL1JzRTRVUm81T3c1RytLNXdJK1BXZGwyYk1tVUtIZFVlR2xyZXF1WTNjUjloa1pTMQp2OEROaUhXTGRCM2gveGJyblJ5VExsTHZCVUdmVlBKM0hxMkZqYzgwSzhHSG1DVnBCQU9UZlZQU1c0NUFmR3VpClkwRE9yS1NWckdQcFJTbGdYNE1UcmhEU3BHMmg3TDI0WngvMWpncGJQdVUxV0pWU2l1N2JiZkIzOStkYThtcFAKeGQ5QkFvSUJBQy9hSUwwb1MvM3FTR1hxS2lNVVVCc3lQeVFGNGNzT0puekFhWjlzb1FkcVRoWEJ5MHJXVmJuSApvYVFXdjh2K283Snh3cmRYT0d1UzNlNTJOVWw1c2E4VTBlUEl0WUxqQjhkYk1sSXAvYkYzaWI3VVZ1R2ZmcjF0CnpHUXdQQjJPMFBLcG95cEVoV0VMdGErbklUVzVCTTJlOGJScC9yMlZONEMxSkNiVVVpeVhSNzBnZFdLNVNPSmMKclRBYU5ycWQrdXRBZGtQVkp4aWNUczZuN2ViOW5tTzdIdnU1cjNiWFV3S1gvaGZYemFESjNQZlZFU0NtSFhzVwpPV2d4ci95QTRZQ2pYWldpZlBOcm5qYzVvbkJ4YjBncnVlZkE5ODRCdW5BZ3dGMy9xdFZHMlVoWENFTnBxbzdrCnZvWXVxTW1WWm12OUZlNHJzT3g4Q0tRVEFaYU1KNmtDZ2dFQkFOM2dzUHo4a00wa2hRaWpUWlg5L3JsOVBBWmMKTXZEYldRU203anFsK2V4T2x5cWxVTm04OWpzZGt5S2MvZHJnbzNqOXVXMzFQZTh5clZxQnQyMWY2OXBvditDMgpROHdhdGN3YW11Q1JVZDV1aG1ZSy9VRzYxTk5RaGI1Z05jcVhHSENZZjEvRXVmaUlkTUQzVlA3MklpdytyWmJsCjdWYWNiTEpmbUtKTk9weW5wNnZidXFvNDIyZmpKNlFZQUNteDJ0MjFqcFFlYmtXT3B3TElleVN2UnJrWEphZkgKM28rTkh0VEVmYVkxRERMWE10SEcvZ1o4eHpLekN1OEFjQ01Cb0FRTGIxck1GUzhpZXl5S0NFOGM4bWM3RTBleApSQmlpekhlSnNieFI3Vk1Mb1p2WEtHb0JtOFpkL0x0L2ZXZ1pncnpZVmZ5cVgyOFQwZEZObER6MW5wOD0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K
diff --git a/pkg/cluser/clusterFetcher.go b/pkg/cluser/clusterFetcher.go
deleted file mode 100644
index fea4610..0000000
--- a/pkg/cluser/clusterFetcher.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package cluser
-
-type ClusterFetcher interface {
-	fetch() (string, error)
-}
diff --git a/pkg/cluster/clusterFetcher.go b/pkg/cluster/clusterFetcher.go
new file mode 100644
index 0000000..e51feb9
--- /dev/null
+++ b/pkg/cluster/clusterFetcher.go
@@ -0,0 +1,83 @@
+package cluster
+
+import (
+	"container-clusterviewer/pkg/cluster/objects"
+	"context"
+	"fmt"
+	types "k8s.io/api/core/v1"
+	types2 "k8s.io/api/networking/v1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/client-go/kubernetes"
+	"k8s.io/client-go/tools/clientcmd"
+)
+
+var (
+	config, _    = clientcmd.BuildConfigFromFlags("", "./kubeconfig")
+	clientset, _ = kubernetes.NewForConfig(config)
+)
+
+func FetchClusterObjects() (*objects.Cluster, error) {
+	// Create Cluster object
+	//cluster := objects.Cluster{}
+
+	// Get the different objects
+	nsList, err := fetchNamespaces()
+	if err != nil {
+		return nil, err
+	}
+
+	for n := range nsList.Items {
+		fmt.Println(nsList.Items[n].Name)
+		pods := fetchPods(nsList.Items[n].Name)
+		for pod := range pods.Items { // pods
+			fmt.Println("\t" + pods.Items[pod].Name) // pod
+			//fmt.Println("\t\t" + pods.Items[pod].Labels["k8s-app"]) // deployment of the pod ("app" or "k8s-app")
+		}
+		fmt.Println("------------------")
+		services := fetchServices(nsList.Items[n].Name)
+		for service := range services.Items { // services
+			fmt.Println("\t" + services.Items[service].Name) // service
+		}
+	}
+
+	// Return the Cluster object
+	return nil, nil
+}
+
+func fetchNamespaces() (*types.NamespaceList, error) {
+	list, err := clientset.CoreV1().Namespaces().List(context.Background(), v1.ListOptions{})
+	if err != nil {
+		return nil, err
+	}
+	return list, nil
+}
+
+func fetchPods(namespace string) *types.PodList {
+	list, err := clientset.CoreV1().Pods(namespace).List(context.Background(), v1.ListOptions{})
+	if err != nil {
+		return nil
+	}
+	return list
+}
+
+func fetchServices(namespace string) *types.ServiceList {
+	list, err := clientset.CoreV1().Services(namespace).List(context.Background(), v1.ListOptions{})
+	if err != nil {
+		return nil
+	}
+	return list
+}
+
+/*
+func fetchDeployment(namespace string) *v1beta1.DeploymentList {
+	list, err := clientset.AppsV1().Deployments(namespace).List(context.Background(), v1.ListOptions{})
+	if err != nil {
+		return nil
+	}
+	return list
+}
+*/
+
+func fetchIngress(namespace string) *types2.IngressList {
+	return nil
+}
diff --git a/pkg/cluster/objects/Cluster.go b/pkg/cluster/objects/Cluster.go
new file mode 100644
index 0000000..9a6373e
--- /dev/null
+++ b/pkg/cluster/objects/Cluster.go
@@ -0,0 +1,5 @@
+package objects
+
+type Cluster struct {
+	nsList []Namespace
+}
diff --git a/pkg/cluster/objects/Deployment.go b/pkg/cluster/objects/Deployment.go
new file mode 100644
index 0000000..6062e61
--- /dev/null
+++ b/pkg/cluster/objects/Deployment.go
@@ -0,0 +1,5 @@
+package objects
+
+type Deployment struct {
+	podList []Pod
+}
diff --git a/pkg/cluster/objects/Ingress.go b/pkg/cluster/objects/Ingress.go
new file mode 100644
index 0000000..831f3c2
--- /dev/null
+++ b/pkg/cluster/objects/Ingress.go
@@ -0,0 +1,5 @@
+package objects
+
+type Ingress struct {
+	name string
+}
diff --git a/pkg/cluster/objects/Namespace.go b/pkg/cluster/objects/Namespace.go
new file mode 100644
index 0000000..75c9cb3
--- /dev/null
+++ b/pkg/cluster/objects/Namespace.go
@@ -0,0 +1,8 @@
+package objects
+
+type Namespace struct {
+	name           string
+	deploymentList []Deployment
+	serviceList    []Service
+	ingressList    []Ingress
+}
diff --git a/pkg/cluster/objects/Pod.go b/pkg/cluster/objects/Pod.go
new file mode 100644
index 0000000..792e702
--- /dev/null
+++ b/pkg/cluster/objects/Pod.go
@@ -0,0 +1,5 @@
+package objects
+
+type Pod struct {
+	name string
+}
diff --git a/pkg/cluster/objects/Service.go b/pkg/cluster/objects/Service.go
new file mode 100644
index 0000000..f0ccfb8
--- /dev/null
+++ b/pkg/cluster/objects/Service.go
@@ -0,0 +1,5 @@
+package objects
+
+type Service struct {
+	name string
+}
diff --git a/pkg/mermaid/mermaidGenerator.go b/pkg/mermaid/mermaidGenerator.go
new file mode 100644
index 0000000..8c4d94c
--- /dev/null
+++ b/pkg/mermaid/mermaidGenerator.go
@@ -0,0 +1,94 @@
+package mermaid
+
+import (
+	"context"
+	"fmt"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/client-go/kubernetes"
+	"k8s.io/client-go/tools/clientcmd"
+)
+
+func CreateMermaid() {
+	// Récupérer la configuration pour le cluster Kubernetes depuis le fichier kubeconfig
+	config, err := clientcmd.BuildConfigFromFlags("", "C:\\Users\\cloed\\.kube\\config")
+
+	// Créer un client pour accéder à l'API Kubernetes
+	clientset, err := kubernetes.NewForConfig(config)
+	if err != nil {
+		panic(err.Error())
+	}
+
+	// Récupérer les informations sur les namespaces
+	namespaces, err := clientset.CoreV1().Namespaces().List(context.Background(), metav1.ListOptions{})
+	if err != nil {
+		panic(err.Error())
+	}
+
+	// Générer le code Mermaid pour le diagramme
+	fmt.Println("graph LR")
+
+	// Subgraph pour le cluster Kubernetes
+	fmt.Println("subgraph Kubernetes Cluster")
+
+	// Subgraph pour les noeuds
+	fmt.Println("subgraph Nodes")
+
+	// Récupérer les informations sur les noeuds
+	nodes, err := clientset.CoreV1().Nodes().List(context.Background(), metav1.ListOptions{})
+	if err != nil {
+		panic(err.Error())
+	}
+
+	// Créer un noeud pour chaque noeud
+	for _, node := range nodes.Items {
+		fmt.Printf("    N[%s]\n", node.Name)
+	}
+
+	fmt.Println("end")
+
+	// Subgraph pour les namespaces
+	fmt.Println("subgraph Namespaces")
+
+	// Créer un noeud pour chaque namespace
+	for _, namespace := range namespaces.Items {
+		fmt.Printf("    NS[%s]\n", namespace.Name)
+
+		// Récupérer les informations sur les volumes dans ce namespace
+		volumes, err := clientset.CoreV1().PersistentVolumeClaims(namespace.Name).List(context.Background(), metav1.ListOptions{})
+		if err != nil {
+			panic(err.Error())
+		}
+
+		// Créer un noeud pour chaque volume
+		for _, volume := range volumes.Items {
+			fmt.Printf("    NS[%s] --> V[%s]\n", namespace.Name, volume.Name)
+		}
+	}
+
+	fmt.Println("end")
+
+	// Subgraph pour les pods
+	fmt.Println("subgraph Pods")
+
+	for _, namespace := range namespaces.Items {
+		// Récupérer les pods dans ce namespace
+		pods, err := clientset.CoreV1().Pods(namespace.Name).List(context.Background(), metav1.ListOptions{})
+		if err != nil {
+			panic(err.Error())
+		}
+
+		// Créer un noeud pour chaque pod
+		for _, pod := range pods.Items {
+			fmt.Printf("    NS[%s] --> P[%s]\n", namespace.Name, pod.Name)
+
+			// Récupérer les containers dans ce pod
+			for _, container := range pod.Spec.Containers {
+				fmt.Printf("    P[%s] --> C[%s]\n", pod.Name, container.Name)
+			}
+		}
+	}
+
+	fmt.Println("end")
+	fmt.Println("end")
+	fmt.Println("end")
+}
-- 
GitLab


From 44b4aaa76075e0eebde999ec5e7a63e6cd1364ee Mon Sep 17 00:00:00 2001
From: Claudio Herren <claudio.herren@edu.hefr.ch>
Date: Thu, 11 May 2023 15:45:29 +0200
Subject: [PATCH 04/18] Resolve merge issues

---
 cmd/main.go                  | 3 +--
 pkg/event/clusterListener.go | 2 --
 2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/cmd/main.go b/cmd/main.go
index a07365c..e1eb562 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -1,10 +1,9 @@
 package main
 
 import (
+	cluster2 "container-clusterviewer/pkg/cluster"
 	"container-clusterviewer/pkg/event"
-	"context"
 	log "github.com/sirupsen/logrus"
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/kubernetes"
 	"k8s.io/client-go/tools/clientcmd"
 )
diff --git a/pkg/event/clusterListener.go b/pkg/event/clusterListener.go
index 37e72d7..0f5ac34 100644
--- a/pkg/event/clusterListener.go
+++ b/pkg/event/clusterListener.go
@@ -1,7 +1,6 @@
 package event
 
 import (
-	"container-clusterviewer/pkg/cluser"
 	"context"
 	log "github.com/sirupsen/logrus"
 	corev1 "k8s.io/api/core/v1"
@@ -12,7 +11,6 @@ import (
 )
 
 type ClusterListener struct {
-	cluser.ClusterFetcher
 	e                         EventFirer
 	c                         *kubernetes.Clientset
 	registeredNamespaces      map[string]watch.Interface
-- 
GitLab


From 95aa9c7af7fbce1d8884bc3faa4ef23b84c094b9 Mon Sep 17 00:00:00 2001
From: Claudio Herren <claudio.herren@edu.hefr.ch>
Date: Thu, 11 May 2023 17:01:14 +0200
Subject: [PATCH 05/18] ClusterFetcher WIP

---
 cmd/main.go                        |  6 ++--
 pkg/cluster/clusterFetcher.go      | 50 ++++++++++++++++++++++++------
 pkg/cluster/objects/Cluster.go     |  2 +-
 pkg/cluster/objects/Deployment.go  |  2 +-
 pkg/cluster/objects/Ingress.go     |  2 +-
 pkg/cluster/objects/Namespace.go   |  9 +++---
 pkg/cluster/objects/Pod.go         |  2 +-
 pkg/cluster/objects/Service.go     |  2 +-
 pkg/cluster/objects/StatefulSet.go |  5 +++
 9 files changed, 59 insertions(+), 21 deletions(-)
 create mode 100644 pkg/cluster/objects/StatefulSet.go

diff --git a/cmd/main.go b/cmd/main.go
index e1eb562..ff2f8f4 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -22,14 +22,14 @@ func main() {
 		return
 	}
 
+	cluster, _ := cluster2.FetchClusterObjects()
+	print(cluster)
+
 	clusterLister := event.CreateClusterListener(clientset)
 	err = clusterLister.ListenToEvent()
 	if err != nil {
 		return
 	}
 
-	cluster, _ := cluster2.FetchClusterObjects()
-	print(cluster)
-
 	// mermaid.CreateMermaid()
 }
diff --git a/pkg/cluster/clusterFetcher.go b/pkg/cluster/clusterFetcher.go
index e51feb9..3e68199 100644
--- a/pkg/cluster/clusterFetcher.go
+++ b/pkg/cluster/clusterFetcher.go
@@ -4,6 +4,7 @@ import (
 	"container-clusterviewer/pkg/cluster/objects"
 	"context"
 	"fmt"
+	appV1 "k8s.io/api/apps/v1"
 	types "k8s.io/api/core/v1"
 	types2 "k8s.io/api/networking/v1"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -27,16 +28,37 @@ func FetchClusterObjects() (*objects.Cluster, error) {
 	}
 
 	for n := range nsList.Items {
-		fmt.Println(nsList.Items[n].Name)
+		ns := objects.Namespace{Name: nsList.Items[n].Name} // TODO - Add the other objects
+		fmt.Println(ns.Name)
+
+		fmt.Println("Pods ------------------")
 		pods := fetchPods(nsList.Items[n].Name)
 		for pod := range pods.Items { // pods
-			fmt.Println("\t" + pods.Items[pod].Name) // pod
-			//fmt.Println("\t\t" + pods.Items[pod].Labels["k8s-app"]) // deployment of the pod ("app" or "k8s-app")
+			pd := objects.Pod{pods.Items[pod].Name} // create pod object
+			fmt.Println("\t" + pd.Name)
 		}
-		fmt.Println("------------------")
+		fmt.Println("Services ------------------")
 		services := fetchServices(nsList.Items[n].Name)
 		for service := range services.Items { // services
-			fmt.Println("\t" + services.Items[service].Name) // service
+			svc := objects.Service{services.Items[service].Name}
+			fmt.Println("\t" + svc.Name) // service
+		}
+		fmt.Println("Deployments ------------------") // TODO - Add podlist for each deployment
+		deployments := fetchDeployment(nsList.Items[n].Name)
+		for deployment := range deployments.Items {
+			fmt.Println("\t" + deployments.Items[deployment].Name)
+		}
+		fmt.Println("Ingresses ------------------")
+		ingresses := fetchIngress(nsList.Items[n].Name)
+		for ingress := range ingresses.Items {
+			ing := objects.Ingress{ingresses.Items[ingress].Name}
+			fmt.Println("\t" + ing.Name)
+		}
+		fmt.Println("StatefulSet ------------------")
+		statefulsets := fetchStatefulSet(nsList.Items[n].Name)
+		for statefulset := range statefulsets.Items {
+			sfs := objects.StatefulSet{statefulsets.Items[statefulset].Name}
+			fmt.Println("\t" + sfs.Name)
 		}
 	}
 
@@ -68,16 +90,26 @@ func fetchServices(namespace string) *types.ServiceList {
 	return list
 }
 
-/*
-func fetchDeployment(namespace string) *v1beta1.DeploymentList {
+func fetchDeployment(namespace string) *appV1.DeploymentList {
 	list, err := clientset.AppsV1().Deployments(namespace).List(context.Background(), v1.ListOptions{})
 	if err != nil {
 		return nil
 	}
 	return list
 }
-*/
+
+func fetchStatefulSet(namespace string) *appV1.StatefulSetList {
+	list, err := clientset.AppsV1().StatefulSets(namespace).List(context.Background(), v1.ListOptions{})
+	if err != nil {
+		return nil
+	}
+	return list
+}
 
 func fetchIngress(namespace string) *types2.IngressList {
-	return nil
+	list, err := clientset.NetworkingV1().Ingresses(namespace).List(context.Background(), v1.ListOptions{})
+	if err != nil {
+		return nil
+	}
+	return list
 }
diff --git a/pkg/cluster/objects/Cluster.go b/pkg/cluster/objects/Cluster.go
index 9a6373e..16bd5c2 100644
--- a/pkg/cluster/objects/Cluster.go
+++ b/pkg/cluster/objects/Cluster.go
@@ -1,5 +1,5 @@
 package objects
 
 type Cluster struct {
-	nsList []Namespace
+	NsList []Namespace
 }
diff --git a/pkg/cluster/objects/Deployment.go b/pkg/cluster/objects/Deployment.go
index 6062e61..ff2e00d 100644
--- a/pkg/cluster/objects/Deployment.go
+++ b/pkg/cluster/objects/Deployment.go
@@ -1,5 +1,5 @@
 package objects
 
 type Deployment struct {
-	podList []Pod
+	PodList []Pod
 }
diff --git a/pkg/cluster/objects/Ingress.go b/pkg/cluster/objects/Ingress.go
index 831f3c2..e0d5b5f 100644
--- a/pkg/cluster/objects/Ingress.go
+++ b/pkg/cluster/objects/Ingress.go
@@ -1,5 +1,5 @@
 package objects
 
 type Ingress struct {
-	name string
+	Name string
 }
diff --git a/pkg/cluster/objects/Namespace.go b/pkg/cluster/objects/Namespace.go
index 75c9cb3..099d10a 100644
--- a/pkg/cluster/objects/Namespace.go
+++ b/pkg/cluster/objects/Namespace.go
@@ -1,8 +1,9 @@
 package objects
 
 type Namespace struct {
-	name           string
-	deploymentList []Deployment
-	serviceList    []Service
-	ingressList    []Ingress
+	Name           string
+	DeploymentList []Deployment
+	ServiceList    []Service
+	IngressList    []Ingress
+	StatefulList   []StatefulSet
 }
diff --git a/pkg/cluster/objects/Pod.go b/pkg/cluster/objects/Pod.go
index 792e702..395667b 100644
--- a/pkg/cluster/objects/Pod.go
+++ b/pkg/cluster/objects/Pod.go
@@ -1,5 +1,5 @@
 package objects
 
 type Pod struct {
-	name string
+	Name string
 }
diff --git a/pkg/cluster/objects/Service.go b/pkg/cluster/objects/Service.go
index f0ccfb8..30ac5bc 100644
--- a/pkg/cluster/objects/Service.go
+++ b/pkg/cluster/objects/Service.go
@@ -1,5 +1,5 @@
 package objects
 
 type Service struct {
-	name string
+	Name string
 }
diff --git a/pkg/cluster/objects/StatefulSet.go b/pkg/cluster/objects/StatefulSet.go
new file mode 100644
index 0000000..3199910
--- /dev/null
+++ b/pkg/cluster/objects/StatefulSet.go
@@ -0,0 +1,5 @@
+package objects
+
+type StatefulSet struct {
+	Name string
+}
-- 
GitLab


From 5f5740d14ee4873b137aa4dbeb58f14402a9203e Mon Sep 17 00:00:00 2001
From: Simon Barras <simon.barras02@gmail.com>
Date: Wed, 24 May 2023 16:46:32 +0200
Subject: [PATCH 06/18] Add fetcher

---
 cmd/main.go                        |  11 ++-
 pkg/cluster/clusterFetcher.go      |   5 +-
 pkg/cluster/objects/Cluster.go     |  65 ++++++++++++++-
 pkg/cluster/objects/Deployment.go  |  44 ++++++++++-
 pkg/cluster/objects/Element.go     |  34 ++++++++
 pkg/cluster/objects/Ingress.go     |  26 +++++-
 pkg/cluster/objects/Namespace.go   | 122 +++++++++++++++++++++++++++--
 pkg/cluster/objects/Pod.go         |  25 +++++-
 pkg/cluster/objects/Service.go     |  26 +++++-
 pkg/cluster/objects/StatefulSet.go |  26 +++++-
 10 files changed, 369 insertions(+), 15 deletions(-)
 create mode 100644 pkg/cluster/objects/Element.go

diff --git a/cmd/main.go b/cmd/main.go
index ff2f8f4..7b2a1bc 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -1,8 +1,9 @@
 package main
 
 import (
-	cluster2 "container-clusterviewer/pkg/cluster"
+	"container-clusterviewer/pkg/cluster/objects"
 	"container-clusterviewer/pkg/event"
+	"fmt"
 	log "github.com/sirupsen/logrus"
 	"k8s.io/client-go/kubernetes"
 	"k8s.io/client-go/tools/clientcmd"
@@ -22,8 +23,12 @@ func main() {
 		return
 	}
 
-	cluster, _ := cluster2.FetchClusterObjects()
-	print(cluster)
+	/*cluster, _ := cluster2.FetchClusterObjects()
+	print(cluster)*/
+
+	cluster := objects.Cluster{}
+	cluster.Fetch(clientset)
+	fmt.Println(cluster.ToMermaid(0))
 
 	clusterLister := event.CreateClusterListener(clientset)
 	err = clusterLister.ListenToEvent()
diff --git a/pkg/cluster/clusterFetcher.go b/pkg/cluster/clusterFetcher.go
index 3e68199..8093c1a 100644
--- a/pkg/cluster/clusterFetcher.go
+++ b/pkg/cluster/clusterFetcher.go
@@ -1,5 +1,6 @@
 package cluster
 
+/*
 import (
 	"container-clusterviewer/pkg/cluster/objects"
 	"context"
@@ -31,6 +32,8 @@ func FetchClusterObjects() (*objects.Cluster, error) {
 		ns := objects.Namespace{Name: nsList.Items[n].Name} // TODO - Add the other objects
 		fmt.Println(ns.Name)
 
+		fmt.Println("Namespaces ------------")
+
 		fmt.Println("Pods ------------------")
 		pods := fetchPods(nsList.Items[n].Name)
 		for pod := range pods.Items { // pods
@@ -112,4 +115,4 @@ func fetchIngress(namespace string) *types2.IngressList {
 		return nil
 	}
 	return list
-}
+}*/
diff --git a/pkg/cluster/objects/Cluster.go b/pkg/cluster/objects/Cluster.go
index 16bd5c2..eed7943 100644
--- a/pkg/cluster/objects/Cluster.go
+++ b/pkg/cluster/objects/Cluster.go
@@ -1,5 +1,68 @@
+// Copyright 2022 - Cluster viewer
+//
+// 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.
+
+/****************************************************************************
+ * @file   Cluster.go
+ * @author Simon Barras simon.barras.@edu.hefr.ch
+ * @author Claudio Herren claudio.herren@edu.hefr.ch
+ * @author Nicolas Terreaux nicolas.terreaux@edu.hefr.ch
+ *
+ * @brief Root of the composite pattern
+ *
+ * @version 1.0
+ ***************************************************************************/
+
 package objects
 
+import (
+	"context"
+	"fmt"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/client-go/kubernetes"
+)
+
+// Implement the Element interface
 type Cluster struct {
-	NsList []Namespace
+	nsList []Element
+}
+
+func (c *Cluster) GetName() string {
+	return ""
+}
+
+func (c *Cluster) ToMermaid(depth int) string {
+	result := "graph LR"
+	for _, ns := range c.nsList {
+		result += "\n" + ns.ToMermaid(depth+1)
+	}
+	return result
+}
+
+func (c *Cluster) Fetch(clientSet *kubernetes.Clientset) error {
+	fmt.Println("Fetching cluster")
+	ls, err := clientSet.CoreV1().Namespaces().List(context.Background(), v1.ListOptions{})
+	if err != nil {
+		return err
+	}
+	c.nsList = make([]Element, 0)
+	for _, ns := range ls.Items {
+		n := Namespace{name: ns.Name, parent: c}
+		err = n.Fetch(clientSet)
+		if err != nil {
+			return err
+		}
+		c.nsList = append(c.nsList, &n)
+	}
+	return nil
 }
diff --git a/pkg/cluster/objects/Deployment.go b/pkg/cluster/objects/Deployment.go
index ff2e00d..74b4b4e 100644
--- a/pkg/cluster/objects/Deployment.go
+++ b/pkg/cluster/objects/Deployment.go
@@ -1,5 +1,47 @@
 package objects
 
+import (
+	"context"
+	"fmt"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/client-go/kubernetes"
+)
+
 type Deployment struct {
-	PodList []Pod
+	parent   Element
+	name     string
+	elements []Pod
+}
+
+func (d *Deployment) GetName() string {
+	return d.name
+}
+
+func (d *Deployment) ToMermaid(depth int) string {
+	space := ""
+	for i := 0; i < depth; i++ {
+		space += "  "
+	}
+	result := space + d.name + "[\\" + d.name + "\\]"
+	for _, p := range d.elements {
+		result += "\n" + p.ToMermaid(depth)
+	}
+	return result
+}
+
+func (d *Deployment) Fetch(clientSet *kubernetes.Clientset) error {
+	fmt.Println("Fetching deployment " + d.name)
+	list, err := clientSet.CoreV1().Pods(d.parent.GetName()).List(context.Background(), v1.ListOptions{LabelSelector: "app=" + d.name})
+	if err != nil {
+		return err
+	}
+	for _, p := range list.Items {
+		p := Pod{name: p.Name}
+		err = p.Fetch(clientSet)
+		if err != nil {
+			return err
+		}
+		d.elements = append(d.elements, p)
+	}
+	return nil
 }
diff --git a/pkg/cluster/objects/Element.go b/pkg/cluster/objects/Element.go
new file mode 100644
index 0000000..cb5f909
--- /dev/null
+++ b/pkg/cluster/objects/Element.go
@@ -0,0 +1,34 @@
+// Copyright 2022 - Cluster viewer
+//
+// 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.
+
+/****************************************************************************
+ * @file   Element.go
+ * @author Simon Barras simon.barras.@edu.hefr.ch
+ * @author Claudio Herren claudio.herren@edu.hefr.ch
+ * @author Nicolas Terreaux nicolas.terreaux@edu.hefr.ch
+ *
+ * @brief Interface to implement the composite pattern
+ *
+ * @version 1.0
+ ***************************************************************************/
+
+package objects
+
+import "k8s.io/client-go/kubernetes"
+
+type Element interface {
+	GetName() string
+	ToMermaid(depth int) string
+	Fetch(clientSet *kubernetes.Clientset) error
+}
diff --git a/pkg/cluster/objects/Ingress.go b/pkg/cluster/objects/Ingress.go
index e0d5b5f..3c98a36 100644
--- a/pkg/cluster/objects/Ingress.go
+++ b/pkg/cluster/objects/Ingress.go
@@ -1,5 +1,29 @@
 package objects
 
+import (
+	"fmt"
+	"k8s.io/client-go/kubernetes"
+)
+
 type Ingress struct {
-	Name string
+	name   string
+	parent Element
+}
+
+func (i *Ingress) GetName() string {
+	return i.name
+}
+
+func (i *Ingress) ToMermaid(depth int) string {
+	space := ""
+	for i := 0; i < depth; i++ {
+		space += "  "
+	}
+	result := space + i.name + "([" + i.name + "])"
+	return result
+}
+
+func (i *Ingress) Fetch(clientSet *kubernetes.Clientset) error {
+	fmt.Println("Fetching ingress " + i.name)
+	return nil
 }
diff --git a/pkg/cluster/objects/Namespace.go b/pkg/cluster/objects/Namespace.go
index 099d10a..463a7fe 100644
--- a/pkg/cluster/objects/Namespace.go
+++ b/pkg/cluster/objects/Namespace.go
@@ -1,9 +1,121 @@
 package objects
 
+import (
+	"context"
+	"fmt"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/client-go/kubernetes"
+)
+
 type Namespace struct {
-	Name           string
-	DeploymentList []Deployment
-	ServiceList    []Service
-	IngressList    []Ingress
-	StatefulList   []StatefulSet
+	name     string
+	parent   Element
+	elements []Element
+}
+
+func (n *Namespace) GetName() string {
+	return n.name
+}
+func (n *Namespace) ToMermaid(depth int) string {
+	space := ""
+	for i := 0; i < depth; i++ {
+		space += "  "
+	}
+	result := space + "subgraph " + n.name
+	for _, e := range n.elements {
+		result += "\n" + e.ToMermaid(depth+1)
+	}
+	result += "\n" + space + "end"
+	return result
+}
+
+func (n *Namespace) Fetch(clientSet *kubernetes.Clientset) error {
+	fmt.Println("Fetching namespace " + n.name)
+
+	// Init the slice
+	var err error
+	n.elements = make([]Element, 0)
+
+	// Fetch the elements
+	err = n.fetchServices(clientSet)
+	if err != nil {
+		return err
+	}
+	err = n.fetchDeployments(clientSet)
+	if err != nil {
+		return err
+	}
+	err = n.fetchIngresses(clientSet)
+	if err != nil {
+		return err
+	}
+	err = n.fetchStatefulSets(clientSet)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (n *Namespace) fetchDeployments(clientSet *kubernetes.Clientset) error {
+	list, err := clientSet.AppsV1().Deployments(n.name).List(context.Background(), v1.ListOptions{})
+	if err != nil {
+		return nil
+	}
+	for _, d := range list.Items {
+		d := Deployment{name: d.Name, parent: n}
+		err = d.Fetch(clientSet)
+		if err != nil {
+			return err
+		}
+		n.elements = append(n.elements, &d)
+	}
+	return nil
+}
+
+func (n *Namespace) fetchServices(clientSet *kubernetes.Clientset) error {
+	list, err := clientSet.CoreV1().Services(n.name).List(context.Background(), v1.ListOptions{})
+	if err != nil {
+		return nil
+	}
+	for _, s := range list.Items {
+		s := Service{name: s.Name, parent: n}
+		err = s.Fetch(clientSet)
+		if err != nil {
+			return err
+		}
+		n.elements = append(n.elements, &s)
+	}
+	return nil
+}
+
+func (n *Namespace) fetchIngresses(clientSet *kubernetes.Clientset) error {
+	list, err := clientSet.NetworkingV1().Ingresses(n.name).List(context.Background(), v1.ListOptions{})
+	if err != nil {
+		return nil
+	}
+	for _, i := range list.Items {
+		i := Ingress{name: i.Name, parent: n}
+		err = i.Fetch(clientSet)
+		if err != nil {
+			return err
+		}
+		n.elements = append(n.elements, &i)
+	}
+	return nil
+}
+
+func (n *Namespace) fetchStatefulSets(clientSet *kubernetes.Clientset) error {
+	list, err := clientSet.AppsV1().StatefulSets(n.name).List(context.Background(), v1.ListOptions{})
+	if err != nil {
+		return nil
+	}
+	for _, s := range list.Items {
+		s := StatefulSet{name: s.Name, parent: n}
+		err = s.Fetch(clientSet)
+		if err != nil {
+			return err
+		}
+		n.elements = append(n.elements, &s)
+	}
+	return nil
 }
diff --git a/pkg/cluster/objects/Pod.go b/pkg/cluster/objects/Pod.go
index 395667b..d909f27 100644
--- a/pkg/cluster/objects/Pod.go
+++ b/pkg/cluster/objects/Pod.go
@@ -1,5 +1,28 @@
 package objects
 
+import (
+	"fmt"
+	"k8s.io/client-go/kubernetes"
+)
+
 type Pod struct {
-	Name string
+	parent Element
+	name   string
+}
+
+func (p *Pod) GetName() string {
+	return p.name
+}
+
+func (p *Pod) ToMermaid(depth int) string {
+	space := ""
+	for i := 0; i < depth; i++ {
+		space += "  "
+	}
+	return space + p.name + "[" + p.name + "]"
+}
+
+func (p *Pod) Fetch(clientSet *kubernetes.Clientset) error {
+	fmt.Println("Fetching pod " + p.name)
+	return nil
 }
diff --git a/pkg/cluster/objects/Service.go b/pkg/cluster/objects/Service.go
index 30ac5bc..35dc4c9 100644
--- a/pkg/cluster/objects/Service.go
+++ b/pkg/cluster/objects/Service.go
@@ -1,5 +1,29 @@
 package objects
 
+import (
+	"fmt"
+	"k8s.io/client-go/kubernetes"
+)
+
 type Service struct {
-	Name string
+	name   string
+	parent Element
+}
+
+func (s *Service) GetName() string {
+	return s.name
+}
+
+func (s *Service) ToMermaid(depth int) string {
+	space := ""
+	for i := 0; i < depth; i++ {
+		space += "  "
+	}
+	result := space + s.name + "(" + s.name + ")"
+	return result
+}
+
+func (s *Service) Fetch(clientSet *kubernetes.Clientset) error {
+	fmt.Println("Fetching service " + s.name)
+	return nil
 }
diff --git a/pkg/cluster/objects/StatefulSet.go b/pkg/cluster/objects/StatefulSet.go
index 3199910..6ab9e16 100644
--- a/pkg/cluster/objects/StatefulSet.go
+++ b/pkg/cluster/objects/StatefulSet.go
@@ -1,5 +1,29 @@
 package objects
 
+import (
+	"fmt"
+	"k8s.io/client-go/kubernetes"
+)
+
 type StatefulSet struct {
-	Name string
+	name   string
+	parent Element
+}
+
+func (s *StatefulSet) GetName() string {
+	return s.name
+}
+
+func (s *StatefulSet) ToMermaid(depth int) string {
+	space := ""
+	for i := 0; i < depth; i++ {
+		space += "  "
+	}
+	result := space + s.name + "[/" + s.name + "/]"
+	return result
+}
+
+func (s *StatefulSet) Fetch(clientSet *kubernetes.Clientset) error {
+	fmt.Println("Fetching statefulset " + s.name)
+	return nil
 }
-- 
GitLab


From c99d785d4975ea50b9072fdc5b7c14294236a36f Mon Sep 17 00:00:00 2001
From: Simon Barras <simon.barras02@gmail.com>
Date: Wed, 24 May 2023 17:09:04 +0200
Subject: [PATCH 07/18] Improve graphic design

---
 pkg/cluster/objects/Deployment.go | 5 +++--
 pkg/cluster/objects/Ingress.go    | 2 +-
 pkg/cluster/objects/Pod.go        | 2 +-
 pkg/cluster/objects/Service.go    | 2 +-
 4 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/pkg/cluster/objects/Deployment.go b/pkg/cluster/objects/Deployment.go
index 74b4b4e..5de8695 100644
--- a/pkg/cluster/objects/Deployment.go
+++ b/pkg/cluster/objects/Deployment.go
@@ -22,10 +22,11 @@ func (d *Deployment) ToMermaid(depth int) string {
 	for i := 0; i < depth; i++ {
 		space += "  "
 	}
-	result := space + d.name + "[\\" + d.name + "\\]"
+	result := space + "subgraph " + d.name
 	for _, p := range d.elements {
-		result += "\n" + p.ToMermaid(depth)
+		result += "\n" + p.ToMermaid(depth+1)
 	}
+	result += "\n" + space + "end"
 	return result
 }
 
diff --git a/pkg/cluster/objects/Ingress.go b/pkg/cluster/objects/Ingress.go
index 3c98a36..ebe7438 100644
--- a/pkg/cluster/objects/Ingress.go
+++ b/pkg/cluster/objects/Ingress.go
@@ -19,7 +19,7 @@ func (i *Ingress) ToMermaid(depth int) string {
 	for i := 0; i < depth; i++ {
 		space += "  "
 	}
-	result := space + i.name + "([" + i.name + "])"
+	result := space + "ingress-" + i.name + "([" + i.name + "])"
 	return result
 }
 
diff --git a/pkg/cluster/objects/Pod.go b/pkg/cluster/objects/Pod.go
index d909f27..0c1995c 100644
--- a/pkg/cluster/objects/Pod.go
+++ b/pkg/cluster/objects/Pod.go
@@ -19,7 +19,7 @@ func (p *Pod) ToMermaid(depth int) string {
 	for i := 0; i < depth; i++ {
 		space += "  "
 	}
-	return space + p.name + "[" + p.name + "]"
+	return space + "pod-" + p.name + "[" + p.name + "]"
 }
 
 func (p *Pod) Fetch(clientSet *kubernetes.Clientset) error {
diff --git a/pkg/cluster/objects/Service.go b/pkg/cluster/objects/Service.go
index 35dc4c9..7c095d6 100644
--- a/pkg/cluster/objects/Service.go
+++ b/pkg/cluster/objects/Service.go
@@ -19,7 +19,7 @@ func (s *Service) ToMermaid(depth int) string {
 	for i := 0; i < depth; i++ {
 		space += "  "
 	}
-	result := space + s.name + "(" + s.name + ")"
+	result := space + "service-" + s.name + "(" + s.name + ")"
 	return result
 }
 
-- 
GitLab


From 215656e63c37f6c24b9586bf128db414756a6eb6 Mon Sep 17 00:00:00 2001
From: Claudio Herren <claudio.herren@edu.hefr.ch>
Date: Wed, 24 May 2023 17:23:31 +0200
Subject: [PATCH 08/18] Generate HTML file

---
 cmd/main.go                    |  3 +--
 pkg/cluster/objects/Cluster.go | 45 ++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/cmd/main.go b/cmd/main.go
index 7b2a1bc..f9c98bf 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -3,7 +3,6 @@ package main
 import (
 	"container-clusterviewer/pkg/cluster/objects"
 	"container-clusterviewer/pkg/event"
-	"fmt"
 	log "github.com/sirupsen/logrus"
 	"k8s.io/client-go/kubernetes"
 	"k8s.io/client-go/tools/clientcmd"
@@ -28,7 +27,7 @@ func main() {
 
 	cluster := objects.Cluster{}
 	cluster.Fetch(clientset)
-	fmt.Println(cluster.ToMermaid(0))
+	cluster.ToHtml()
 
 	clusterLister := event.CreateClusterListener(clientset)
 	err = clusterLister.ListenToEvent()
diff --git a/pkg/cluster/objects/Cluster.go b/pkg/cluster/objects/Cluster.go
index eed7943..ebbd62a 100644
--- a/pkg/cluster/objects/Cluster.go
+++ b/pkg/cluster/objects/Cluster.go
@@ -28,8 +28,10 @@ package objects
 import (
 	"context"
 	"fmt"
+	log "github.com/sirupsen/logrus"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/kubernetes"
+	"os"
 )
 
 // Implement the Element interface
@@ -49,6 +51,49 @@ func (c *Cluster) ToMermaid(depth int) string {
 	return result
 }
 
+func (c *Cluster) ToHtml() {
+	f, err := os.Create("index.html")
+
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	defer f.Close()
+
+	mermaidCode := c.ToMermaid(0)
+
+	_, err2 := f.WriteString(
+		`
+<!DOCTYPE html>
+<html>
+<head>
+	<title>Graph</title>
+	<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
+	<script>
+		// Initialiser Mermaid
+		mermaid.initialize({
+			startOnLoad: true
+		});
+	</script>
+</head>
+<body>
+<h1>Graph of your Cluster</h1>
+<div class="mermaid">
+` +
+			mermaidCode + `
+</div>
+</body>
+</html>
+`,
+	)
+
+	if err2 != nil {
+		log.Fatal(err2)
+	}
+
+	fmt.Println("Finish")
+}
+
 func (c *Cluster) Fetch(clientSet *kubernetes.Clientset) error {
 	fmt.Println("Fetching cluster")
 	ls, err := clientSet.CoreV1().Namespaces().List(context.Background(), v1.ListOptions{})
-- 
GitLab


From 6616c3480a62783bcac9137f38a7cdb034246484 Mon Sep 17 00:00:00 2001
From: Simon Barras <simon.barras02@gmail.com>
Date: Wed, 24 May 2023 18:25:17 +0200
Subject: [PATCH 09/18] Add link between service and ingress and service and
 pods

---
 cmd/main.go                      | 11 ++++---
 pkg/cluster/objects/Namespace.go | 28 ++++++++++++------
 pkg/cluster/objects/Service.go   | 49 ++++++++++++++++++++++++++++++--
 3 files changed, 74 insertions(+), 14 deletions(-)

diff --git a/cmd/main.go b/cmd/main.go
index 7b2a1bc..b2e1ad0 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -2,7 +2,6 @@ package main
 
 import (
 	"container-clusterviewer/pkg/cluster/objects"
-	"container-clusterviewer/pkg/event"
 	"fmt"
 	log "github.com/sirupsen/logrus"
 	"k8s.io/client-go/kubernetes"
@@ -27,14 +26,18 @@ func main() {
 	print(cluster)*/
 
 	cluster := objects.Cluster{}
-	cluster.Fetch(clientset)
+	err = cluster.Fetch(clientset)
+	if err != nil {
+		log.Error(err)
+		return
+	}
 	fmt.Println(cluster.ToMermaid(0))
 
-	clusterLister := event.CreateClusterListener(clientset)
+	/*clusterLister := event.CreateClusterListener(clientset)
 	err = clusterLister.ListenToEvent()
 	if err != nil {
 		return
 	}
-
+	*/
 	// mermaid.CreateMermaid()
 }
diff --git a/pkg/cluster/objects/Namespace.go b/pkg/cluster/objects/Namespace.go
index 463a7fe..8f42ae4 100644
--- a/pkg/cluster/objects/Namespace.go
+++ b/pkg/cluster/objects/Namespace.go
@@ -7,10 +7,15 @@ import (
 	"k8s.io/client-go/kubernetes"
 )
 
+const serviceIndex = 0
+const deploymentIndex = 1
+const ingressIndex = 2
+const statefulSetIndex = 3
+
 type Namespace struct {
 	name     string
 	parent   Element
-	elements []Element
+	elements [][]Element
 }
 
 func (n *Namespace) GetName() string {
@@ -22,9 +27,12 @@ func (n *Namespace) ToMermaid(depth int) string {
 		space += "  "
 	}
 	result := space + "subgraph " + n.name
-	for _, e := range n.elements {
-		result += "\n" + e.ToMermaid(depth+1)
+	for _, es := range n.elements {
+		for _, e := range es {
+			result += "\n" + e.ToMermaid(depth+1)
+		}
 	}
+
 	result += "\n" + space + "end"
 	return result
 }
@@ -34,7 +42,7 @@ func (n *Namespace) Fetch(clientSet *kubernetes.Clientset) error {
 
 	// Init the slice
 	var err error
-	n.elements = make([]Element, 0)
+	n.elements = make([][]Element, 4)
 
 	// Fetch the elements
 	err = n.fetchServices(clientSet)
@@ -57,6 +65,7 @@ func (n *Namespace) Fetch(clientSet *kubernetes.Clientset) error {
 }
 
 func (n *Namespace) fetchDeployments(clientSet *kubernetes.Clientset) error {
+	n.elements[deploymentIndex] = make([]Element, 0)
 	list, err := clientSet.AppsV1().Deployments(n.name).List(context.Background(), v1.ListOptions{})
 	if err != nil {
 		return nil
@@ -67,12 +76,13 @@ func (n *Namespace) fetchDeployments(clientSet *kubernetes.Clientset) error {
 		if err != nil {
 			return err
 		}
-		n.elements = append(n.elements, &d)
+		n.elements[deploymentIndex] = append(n.elements[deploymentIndex], &d)
 	}
 	return nil
 }
 
 func (n *Namespace) fetchServices(clientSet *kubernetes.Clientset) error {
+	n.elements[serviceIndex] = make([]Element, 0)
 	list, err := clientSet.CoreV1().Services(n.name).List(context.Background(), v1.ListOptions{})
 	if err != nil {
 		return nil
@@ -83,12 +93,13 @@ func (n *Namespace) fetchServices(clientSet *kubernetes.Clientset) error {
 		if err != nil {
 			return err
 		}
-		n.elements = append(n.elements, &s)
+		n.elements[serviceIndex] = append(n.elements[serviceIndex], &s)
 	}
 	return nil
 }
 
 func (n *Namespace) fetchIngresses(clientSet *kubernetes.Clientset) error {
+	n.elements[ingressIndex] = make([]Element, 0)
 	list, err := clientSet.NetworkingV1().Ingresses(n.name).List(context.Background(), v1.ListOptions{})
 	if err != nil {
 		return nil
@@ -99,12 +110,13 @@ func (n *Namespace) fetchIngresses(clientSet *kubernetes.Clientset) error {
 		if err != nil {
 			return err
 		}
-		n.elements = append(n.elements, &i)
+		n.elements[ingressIndex] = append(n.elements[ingressIndex], &i)
 	}
 	return nil
 }
 
 func (n *Namespace) fetchStatefulSets(clientSet *kubernetes.Clientset) error {
+	n.elements[statefulSetIndex] = make([]Element, 0)
 	list, err := clientSet.AppsV1().StatefulSets(n.name).List(context.Background(), v1.ListOptions{})
 	if err != nil {
 		return nil
@@ -115,7 +127,7 @@ func (n *Namespace) fetchStatefulSets(clientSet *kubernetes.Clientset) error {
 		if err != nil {
 			return err
 		}
-		n.elements = append(n.elements, &s)
+		n.elements[statefulSetIndex] = append(n.elements[statefulSetIndex], &s)
 	}
 	return nil
 }
diff --git a/pkg/cluster/objects/Service.go b/pkg/cluster/objects/Service.go
index 7c095d6..961ac2f 100644
--- a/pkg/cluster/objects/Service.go
+++ b/pkg/cluster/objects/Service.go
@@ -1,13 +1,17 @@
 package objects
 
 import (
+	"context"
 	"fmt"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/kubernetes"
 )
 
 type Service struct {
-	name   string
-	parent Element
+	name          string
+	parent        Element
+	podLinked     []Element
+	IngressLinked []Element
 }
 
 func (s *Service) GetName() string {
@@ -20,10 +24,51 @@ func (s *Service) ToMermaid(depth int) string {
 		space += "  "
 	}
 	result := space + "service-" + s.name + "(" + s.name + ")"
+	for _, e := range s.podLinked {
+		result += "\n" + space + "service-" + s.name + " --- pod-" + e.GetName()
+	}
+	for _, e := range s.IngressLinked {
+		result += "\n" + space + "service-" + s.name + " --- ingress-" + e.GetName()
+	}
 	return result
 }
 
 func (s *Service) Fetch(clientSet *kubernetes.Clientset) error {
 	fmt.Println("Fetching service " + s.name)
+	// Search pods that are linked to this service
+	svc, _ := clientSet.CoreV1().Services(s.parent.GetName()).Get(context.Background(), s.name, v1.GetOptions{})
+
+	listOptions := v1.ListOptions{
+		LabelSelector: "app=" + svc.Spec.Selector["app"],
+	}
+	pods, _ := clientSet.CoreV1().Pods(s.parent.GetName()).List(context.Background(), listOptions)
+	for _, pod := range pods.Items {
+		p := Pod{
+			name:   pod.Name,
+			parent: s,
+		}
+		s.podLinked = append(s.podLinked, &p)
+	}
+	// Search ingress that are linked to this service with the rules backend
+	ingress, err := clientSet.NetworkingV1().Ingresses(s.parent.GetName()).List(context.Background(), v1.ListOptions{})
+	if err != nil {
+		fmt.Println(err)
+		return err
+	}
+
+	for _, ing := range ingress.Items {
+		for _, rule := range ing.Spec.Rules {
+			for _, httpPath := range rule.HTTP.Paths {
+				if httpPath.Backend.Service.Name == s.name {
+					i := Ingress{
+						name:   ing.Name,
+						parent: s,
+					}
+					s.IngressLinked = append(s.IngressLinked, &i)
+					break
+				}
+			}
+		}
+	}
 	return nil
 }
-- 
GitLab


From b9bccd43dff0386ae4b86fdb34930580ef7845b2 Mon Sep 17 00:00:00 2001
From: Claudio Herren <claudio.herren@edu.hefr.ch>
Date: Wed, 24 May 2023 18:29:17 +0200
Subject: [PATCH 10/18] Add Dockerfile

---
 Dockerfile | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)
 create mode 100644 Dockerfile

diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..1904061
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,26 @@
+############################
+# STEP 1 build executable binary
+############################
+FROM golang:alpine AS builder
+# Install git.
+# Git is required for fetching the dependencies.
+RUN apk update && apk add --no-cache git build-base
+WORKDIR $GOPATH/src/mypackage/myapp/
+COPY . .
+# Build the binary.
+RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -ldflags="-w -s" -o /go/bin/container-clusterviewer cmd/main.go
+
+ENTRYPOINT ["/go/bin/container-clusterviewer"]
+
+
+############################
+# STEP 2 build a small image
+############################
+
+# FROM scratch as clusterviewer
+# Copy our static executable.
+# COPY --from=builder /go/bin/container-clusterviewer /go/bin/app
+# COPY --from=builder /go/src/mypackage/myapp/kubeconfig /go/bin/app
+# Run the binary
+# ENTRYPOINT ["/go/bin/app"]
+
-- 
GitLab


From df759a23357ad9d6b23143cbe90aa69db260f8cf Mon Sep 17 00:00:00 2001
From: Claudio Herren <claudio.herren@edu.hefr.ch>
Date: Wed, 24 May 2023 23:25:59 +0200
Subject: [PATCH 11/18] Add deployment

---
 cmd/main.go                    |  2 +-
 deployment.yaml                | 75 ++++++++++++++++++++++++++++++++++
 pkg/cluster/objects/Cluster.go |  2 +-
 pkg/event/clusterListener.go   |  5 ++-
 4 files changed, 81 insertions(+), 3 deletions(-)
 create mode 100644 deployment.yaml

diff --git a/cmd/main.go b/cmd/main.go
index f9c98bf..87f8e1f 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -29,7 +29,7 @@ func main() {
 	cluster.Fetch(clientset)
 	cluster.ToHtml()
 
-	clusterLister := event.CreateClusterListener(clientset)
+	clusterLister := event.CreateClusterListener(clientset, cluster)
 	err = clusterLister.ListenToEvent()
 	if err != nil {
 		return
diff --git a/deployment.yaml b/deployment.yaml
new file mode 100644
index 0000000..7b07af7
--- /dev/null
+++ b/deployment.yaml
@@ -0,0 +1,75 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: clusterviewer-ns
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: clusterviewer
+  namespace: clusterviewer-ns
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: clusterviewer
+  template:
+    metadata:
+      labels:
+        app: clusterviewer
+    spec:
+      imagePullSecrets:
+        - name: regcred
+      containers:
+        - image: registry.forge.hefr.ch/simon.barras/container-clusterviewer:v2
+          name: clusterviewer
+          volumeMounts:
+            - name: html-volume
+              mountPath: /usr/share/nginx/html
+        - image: nginx:latest
+          name: nginx
+          ports:
+            - containerPort: 80
+              name: http
+              protocol: TCP
+          volumeMounts:
+            - name: html-volume
+              mountPath: /usr/share/nginx/html
+      volumes:
+        - name: html-volume
+          emptyDir: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: nginx-svc
+  namespace: clusterviewer-ns
+spec:
+  ports:
+    - name: http
+      protocol: TCP
+      port: 80
+      targetPort: 80
+  selector:
+    app: clusterviewer
+  type: ClusterIP
+---
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: nginx-http
+  namespace: clusterviewer-ns
+  annotations:
+    kubernetes.io/ingress.class: nginx
+spec:
+  rules:
+    - host: status.194.182.160.30.nip.io
+      http:
+        paths:
+          - path: /
+            pathType: Prefix
+            backend:
+              service:
+                name: nginx-svc
+                port:
+                  number: 80
\ No newline at end of file
diff --git a/pkg/cluster/objects/Cluster.go b/pkg/cluster/objects/Cluster.go
index ebbd62a..05b85cc 100644
--- a/pkg/cluster/objects/Cluster.go
+++ b/pkg/cluster/objects/Cluster.go
@@ -52,7 +52,7 @@ func (c *Cluster) ToMermaid(depth int) string {
 }
 
 func (c *Cluster) ToHtml() {
-	f, err := os.Create("index.html")
+	f, err := os.Create("/usr/share/nginx/html/index.html")
 
 	if err != nil {
 		log.Fatal(err)
diff --git a/pkg/event/clusterListener.go b/pkg/event/clusterListener.go
index 0f5ac34..06ba7f4 100644
--- a/pkg/event/clusterListener.go
+++ b/pkg/event/clusterListener.go
@@ -1,6 +1,7 @@
 package event
 
 import (
+	"container-clusterviewer/pkg/cluster/objects"
 	"context"
 	log "github.com/sirupsen/logrus"
 	corev1 "k8s.io/api/core/v1"
@@ -17,7 +18,7 @@ type ClusterListener struct {
 	registeredNamespacesMutex sync.Mutex
 }
 
-func CreateClusterListener(client *kubernetes.Clientset) *ClusterListener {
+func CreateClusterListener(client *kubernetes.Clientset, cluster objects.Cluster) *ClusterListener {
 	return &ClusterListener{
 		c: client,
 		// Map concurrent safe
@@ -25,6 +26,8 @@ func CreateClusterListener(client *kubernetes.Clientset) *ClusterListener {
 		registeredNamespacesMutex: sync.Mutex{},
 		e: *CreateEventFirer(10, func() error {
 			log.Warn("Event fired")
+			cluster.Fetch(client)
+			cluster.ToHtml()
 			return nil
 		}),
 	}
-- 
GitLab


From 86b703d15c4ffc96b682feb48509bea30dac8add Mon Sep 17 00:00:00 2001
From: Simon Barras <simon.barras02@gmail.com>
Date: Thu, 25 May 2023 09:07:08 +0200
Subject: [PATCH 12/18] Add sts management

---
 pkg/cluster/objects/Cluster.go     |  5 ++++-
 pkg/cluster/objects/Deployment.go  |  4 ++--
 pkg/cluster/objects/Namespace.go   |  2 +-
 pkg/cluster/objects/Service.go     | 12 +++++++++++-
 pkg/cluster/objects/StatefulSet.go | 26 +++++++++++++++++++++++---
 5 files changed, 41 insertions(+), 8 deletions(-)

diff --git a/pkg/cluster/objects/Cluster.go b/pkg/cluster/objects/Cluster.go
index 05b85cc..562a358 100644
--- a/pkg/cluster/objects/Cluster.go
+++ b/pkg/cluster/objects/Cluster.go
@@ -34,6 +34,9 @@ import (
 	"os"
 )
 
+const productionPath = "/usr/share/nginx/html/index.html"
+const devPath = "index.html"
+
 // Implement the Element interface
 type Cluster struct {
 	nsList []Element
@@ -52,7 +55,7 @@ func (c *Cluster) ToMermaid(depth int) string {
 }
 
 func (c *Cluster) ToHtml() {
-	f, err := os.Create("/usr/share/nginx/html/index.html")
+	f, err := os.Create(devPath)
 
 	if err != nil {
 		log.Fatal(err)
diff --git a/pkg/cluster/objects/Deployment.go b/pkg/cluster/objects/Deployment.go
index 5de8695..586b943 100644
--- a/pkg/cluster/objects/Deployment.go
+++ b/pkg/cluster/objects/Deployment.go
@@ -22,7 +22,7 @@ func (d *Deployment) ToMermaid(depth int) string {
 	for i := 0; i < depth; i++ {
 		space += "  "
 	}
-	result := space + "subgraph " + d.name
+	result := space + "subgraph deploy-" + d.name
 	for _, p := range d.elements {
 		result += "\n" + p.ToMermaid(depth+1)
 	}
@@ -37,7 +37,7 @@ func (d *Deployment) Fetch(clientSet *kubernetes.Clientset) error {
 		return err
 	}
 	for _, p := range list.Items {
-		p := Pod{name: p.Name}
+		p := Pod{name: p.Name, parent: d}
 		err = p.Fetch(clientSet)
 		if err != nil {
 			return err
diff --git a/pkg/cluster/objects/Namespace.go b/pkg/cluster/objects/Namespace.go
index 8f42ae4..2aa0a60 100644
--- a/pkg/cluster/objects/Namespace.go
+++ b/pkg/cluster/objects/Namespace.go
@@ -26,7 +26,7 @@ func (n *Namespace) ToMermaid(depth int) string {
 	for i := 0; i < depth; i++ {
 		space += "  "
 	}
-	result := space + "subgraph " + n.name
+	result := space + "subgraph ns-" + n.name
 	for _, es := range n.elements {
 		for _, e := range es {
 			result += "\n" + e.ToMermaid(depth+1)
diff --git a/pkg/cluster/objects/Service.go b/pkg/cluster/objects/Service.go
index 961ac2f..fc838de 100644
--- a/pkg/cluster/objects/Service.go
+++ b/pkg/cluster/objects/Service.go
@@ -37,7 +37,6 @@ func (s *Service) Fetch(clientSet *kubernetes.Clientset) error {
 	fmt.Println("Fetching service " + s.name)
 	// Search pods that are linked to this service
 	svc, _ := clientSet.CoreV1().Services(s.parent.GetName()).Get(context.Background(), s.name, v1.GetOptions{})
-
 	listOptions := v1.ListOptions{
 		LabelSelector: "app=" + svc.Spec.Selector["app"],
 	}
@@ -49,6 +48,17 @@ func (s *Service) Fetch(clientSet *kubernetes.Clientset) error {
 		}
 		s.podLinked = append(s.podLinked, &p)
 	}
+	listOptions = v1.ListOptions{
+		LabelSelector: "app.kubernetes.io/component=" + svc.Spec.Selector["app.kubernetes.io/component"],
+	}
+	pods, _ = clientSet.CoreV1().Pods(s.parent.GetName()).List(context.Background(), listOptions)
+	for _, pod := range pods.Items {
+		p := Pod{
+			name:   pod.Name,
+			parent: s,
+		}
+		s.podLinked = append(s.podLinked, &p)
+	}
 	// Search ingress that are linked to this service with the rules backend
 	ingress, err := clientSet.NetworkingV1().Ingresses(s.parent.GetName()).List(context.Background(), v1.ListOptions{})
 	if err != nil {
diff --git a/pkg/cluster/objects/StatefulSet.go b/pkg/cluster/objects/StatefulSet.go
index 6ab9e16..942d5ee 100644
--- a/pkg/cluster/objects/StatefulSet.go
+++ b/pkg/cluster/objects/StatefulSet.go
@@ -1,13 +1,16 @@
 package objects
 
 import (
+	"context"
 	"fmt"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/kubernetes"
 )
 
 type StatefulSet struct {
-	name   string
-	parent Element
+	name     string
+	parent   Element
+	elements []Element
 }
 
 func (s *StatefulSet) GetName() string {
@@ -19,11 +22,28 @@ func (s *StatefulSet) ToMermaid(depth int) string {
 	for i := 0; i < depth; i++ {
 		space += "  "
 	}
-	result := space + s.name + "[/" + s.name + "/]"
+	//result := space + s.name + "[/" + s.name + "/]"
+	result := space + "subgraph sts-" + s.name
+	for _, e := range s.elements {
+		result += "\n" + e.ToMermaid(depth+1)
+	}
+	result += "\n" + space + "end"
 	return result
 }
 
 func (s *StatefulSet) Fetch(clientSet *kubernetes.Clientset) error {
 	fmt.Println("Fetching statefulset " + s.name)
+	list, err := clientSet.CoreV1().Pods(s.parent.GetName()).List(context.Background(), v1.ListOptions{LabelSelector: "app.kubernetes.io/component=" + s.name})
+	if err != nil {
+		return err
+	}
+	for _, p := range list.Items {
+		p := Pod{name: p.Name, parent: s}
+		err = p.Fetch(clientSet)
+		if err != nil {
+			return err
+		}
+		s.elements = append(s.elements, &p)
+	}
 	return nil
 }
-- 
GitLab


From 8471578e256546289b6518a0806700b630fd980c Mon Sep 17 00:00:00 2001
From: Simon Barras <simon.barras02@gmail.com>
Date: Thu, 25 May 2023 11:55:57 +0200
Subject: [PATCH 13/18] Add persistentVolume for sts

---
 pkg/cluster/objects/Namespace.go        |  2 +-
 pkg/cluster/objects/PersistentVolume.go | 28 +++++++++++++++++++++++++
 pkg/cluster/objects/StatefulSet.go      | 28 ++++++++++++++++++++++---
 3 files changed, 54 insertions(+), 4 deletions(-)
 create mode 100644 pkg/cluster/objects/PersistentVolume.go

diff --git a/pkg/cluster/objects/Namespace.go b/pkg/cluster/objects/Namespace.go
index 2aa0a60..72f1446 100644
--- a/pkg/cluster/objects/Namespace.go
+++ b/pkg/cluster/objects/Namespace.go
@@ -42,7 +42,7 @@ func (n *Namespace) Fetch(clientSet *kubernetes.Clientset) error {
 
 	// Init the slice
 	var err error
-	n.elements = make([][]Element, 4)
+	n.elements = make([][]Element, 5)
 
 	// Fetch the elements
 	err = n.fetchServices(clientSet)
diff --git a/pkg/cluster/objects/PersistentVolume.go b/pkg/cluster/objects/PersistentVolume.go
new file mode 100644
index 0000000..3167783
--- /dev/null
+++ b/pkg/cluster/objects/PersistentVolume.go
@@ -0,0 +1,28 @@
+package objects
+
+import (
+	"fmt"
+	"k8s.io/client-go/kubernetes"
+)
+
+type PersistentVolume struct {
+	name   string
+	parent Element
+}
+
+func (p *PersistentVolume) GetName() string {
+	return p.name
+}
+
+func (p *PersistentVolume) ToMermaid(depth int) string {
+	space := ""
+	for i := 0; i < depth; i++ {
+		space += "  "
+	}
+	return space + "persistentVolume-" + p.name + "[(" + p.name + ")]"
+}
+
+func (p *PersistentVolume) Fetch(clientSet *kubernetes.Clientset) error {
+	fmt.Println("Fetching persistentvolume " + p.name)
+	return nil
+}
diff --git a/pkg/cluster/objects/StatefulSet.go b/pkg/cluster/objects/StatefulSet.go
index 942d5ee..b82fd23 100644
--- a/pkg/cluster/objects/StatefulSet.go
+++ b/pkg/cluster/objects/StatefulSet.go
@@ -8,9 +8,10 @@ import (
 )
 
 type StatefulSet struct {
-	name     string
-	parent   Element
-	elements []Element
+	name           string
+	parent         Element
+	elements       []Element
+	linkedElements []Element
 }
 
 func (s *StatefulSet) GetName() string {
@@ -28,6 +29,12 @@ func (s *StatefulSet) ToMermaid(depth int) string {
 		result += "\n" + e.ToMermaid(depth+1)
 	}
 	result += "\n" + space + "end"
+	for _, l := range s.linkedElements {
+		result += "\n" + l.ToMermaid(depth)
+		for _, e := range s.elements {
+			result += "\n pod-" + e.GetName() + " --- persistentVolume-" + l.GetName()
+		}
+	}
 	return result
 }
 
@@ -45,5 +52,20 @@ func (s *StatefulSet) Fetch(clientSet *kubernetes.Clientset) error {
 		}
 		s.elements = append(s.elements, &p)
 	}
+
+	// Fetch the persistent volume
+	listVol, err := clientSet.CoreV1().PersistentVolumes().List(context.Background(), v1.ListOptions{LabelSelector: "app.kubernetes.io/component=" + s.name})
+	if err != nil {
+		return err
+	}
+	for _, p := range listVol.Items {
+		p := PersistentVolume{name: p.Name, parent: s}
+		err = p.Fetch(clientSet)
+		if err != nil {
+			return err
+		}
+		s.linkedElements = append(s.linkedElements, &p)
+	}
+
 	return nil
 }
-- 
GitLab


From c30b16d2c2583d24d1202c6ab0d17fa8dfe9b768 Mon Sep 17 00:00:00 2001
From: Simon Barras <simon.barras02@gmail.com>
Date: Thu, 25 May 2023 13:25:01 +0200
Subject: [PATCH 14/18] Add all service connection and pods

---
 pkg/cluster/objects/Deployment.go | 12 ++++++++++++
 pkg/cluster/objects/Service.go    | 11 +++++++++++
 2 files changed, 23 insertions(+)

diff --git a/pkg/cluster/objects/Deployment.go b/pkg/cluster/objects/Deployment.go
index 586b943..ebf74d2 100644
--- a/pkg/cluster/objects/Deployment.go
+++ b/pkg/cluster/objects/Deployment.go
@@ -44,5 +44,17 @@ func (d *Deployment) Fetch(clientSet *kubernetes.Clientset) error {
 		}
 		d.elements = append(d.elements, p)
 	}
+	list, err = clientSet.CoreV1().Pods(d.parent.GetName()).List(context.Background(), v1.ListOptions{LabelSelector: "k8s-app=" + d.name})
+	if err != nil {
+		return err
+	}
+	for _, p := range list.Items {
+		p := Pod{name: p.Name, parent: d}
+		err = p.Fetch(clientSet)
+		if err != nil {
+			return err
+		}
+		d.elements = append(d.elements, p)
+	}
 	return nil
 }
diff --git a/pkg/cluster/objects/Service.go b/pkg/cluster/objects/Service.go
index fc838de..b237fed 100644
--- a/pkg/cluster/objects/Service.go
+++ b/pkg/cluster/objects/Service.go
@@ -48,6 +48,17 @@ func (s *Service) Fetch(clientSet *kubernetes.Clientset) error {
 		}
 		s.podLinked = append(s.podLinked, &p)
 	}
+	listOptions = v1.ListOptions{
+		LabelSelector: "k8s-app=" + svc.Spec.Selector["k8s-	app"],
+	}
+	pods, _ = clientSet.CoreV1().Pods(s.parent.GetName()).List(context.Background(), listOptions)
+	for _, pod := range pods.Items {
+		p := Pod{
+			name:   pod.Name,
+			parent: s,
+		}
+		s.podLinked = append(s.podLinked, &p)
+	}
 	listOptions = v1.ListOptions{
 		LabelSelector: "app.kubernetes.io/component=" + svc.Spec.Selector["app.kubernetes.io/component"],
 	}
-- 
GitLab


From 4e09888bd4e37c4f58a6905b6c7b48e27b93619b Mon Sep 17 00:00:00 2001
From: Simon Barras <simon.barras02@gmail.com>
Date: Thu, 25 May 2023 14:09:45 +0200
Subject: [PATCH 15/18] Add pipeline

---
 .gitlab-ci.yml | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fef13ef..4921746 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -7,7 +7,26 @@
 # See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
 stages:
 - test
+- deploy
+
+variables:
+  IMAGE_NAME: $CI_REGISTRY_IMAGE/container-clusterviewer
+
 sast:
   stage: test
 include:
 - template: Security/SAST.gitlab-ci.yml
+
+docker:
+  stage: deploy
+  image: docker:19.03.12
+  services:
+    - name: docker:19.03.12-dind
+  before_script:
+    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+  script:
+    - DOCKER_BUILDKIT=1 docker build --network host -t $IMAGE_NAME:$CI_COMMIT_SHORT_SHA -t $IMAGE_NAME:$CI_COMMIT_REF_NAME -t $IMAGE_NAME:latest .
+    - docker push $IMAGE_NAME:latest
+    - docker push $IMAGE_NAME:$CI_COMMIT_REF_NAME
+    - docker push $IMAGE_NAME:$CI_COMMIT_SHORT_SHA
+
-- 
GitLab


From ef37896fc9d4184194f56981d0474658481c612d Mon Sep 17 00:00:00 2001
From: Simon Barras <simon.barras02@gmail.com>
Date: Thu, 25 May 2023 14:14:12 +0200
Subject: [PATCH 16/18] Fix image name

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4921746..b3fe6d8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -10,7 +10,7 @@ stages:
 - deploy
 
 variables:
-  IMAGE_NAME: $CI_REGISTRY_IMAGE/container-clusterviewer
+  IMAGE_NAME: $CI_REGISTRY_IMAGE/operator
 
 sast:
   stage: test
-- 
GitLab


From 7e9bfd70e85e25ffe9001dcd8fbcb29200568e4d Mon Sep 17 00:00:00 2001
From: Simon Barras <simon.barras02@gmail.com>
Date: Thu, 25 May 2023 14:17:57 +0200
Subject: [PATCH 17/18] Fix create path

---
 pkg/cluster/objects/Cluster.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pkg/cluster/objects/Cluster.go b/pkg/cluster/objects/Cluster.go
index 562a358..bb411f9 100644
--- a/pkg/cluster/objects/Cluster.go
+++ b/pkg/cluster/objects/Cluster.go
@@ -55,7 +55,7 @@ func (c *Cluster) ToMermaid(depth int) string {
 }
 
 func (c *Cluster) ToHtml() {
-	f, err := os.Create(devPath)
+	f, err := os.Create(productionPath)
 
 	if err != nil {
 		log.Fatal(err)
-- 
GitLab


From de0a195d09e3745476733a4abe965875ea2baca2 Mon Sep 17 00:00:00 2001
From: Simon Barras <simon.barras02@gmail.com>
Date: Thu, 25 May 2023 14:27:06 +0200
Subject: [PATCH 18/18] Fix create path

---
 deployment.yaml                | 2 +-
 pkg/cluster/objects/Cluster.go | 5 +++--
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/deployment.yaml b/deployment.yaml
index 7b07af7..e0d48ea 100644
--- a/deployment.yaml
+++ b/deployment.yaml
@@ -21,7 +21,7 @@ spec:
       imagePullSecrets:
         - name: regcred
       containers:
-        - image: registry.forge.hefr.ch/simon.barras/container-clusterviewer:v2
+        - image: registry.forge.hefr.ch/simon.barras/container-clusterviewer/operator:latest
           name: clusterviewer
           volumeMounts:
             - name: html-volume
diff --git a/pkg/cluster/objects/Cluster.go b/pkg/cluster/objects/Cluster.go
index bb411f9..f3288fc 100644
--- a/pkg/cluster/objects/Cluster.go
+++ b/pkg/cluster/objects/Cluster.go
@@ -55,7 +55,8 @@ func (c *Cluster) ToMermaid(depth int) string {
 }
 
 func (c *Cluster) ToHtml() {
-	f, err := os.Create(productionPath)
+	path := "/usr/share/nginx/html/index.html"
+	f, err := os.Create(path)
 
 	if err != nil {
 		log.Fatal(err)
@@ -94,7 +95,7 @@ func (c *Cluster) ToHtml() {
 		log.Fatal(err2)
 	}
 
-	fmt.Println("Finish")
+	fmt.Println("Finish, file created at " + path)
 }
 
 func (c *Cluster) Fetch(clientSet *kubernetes.Clientset) error {
-- 
GitLab