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