From 9e5544207cb1bfe0364abed87bfc81d06ddc8222 Mon Sep 17 00:00:00 2001 From: Farnaz <39217806+FarnazZ@users.noreply.github.com> Date: Sun, 24 Apr 2022 01:54:17 +0430 Subject: [PATCH] Add Organization ID in GrafanaDatasource (#9) * feat: Adding Organization ID * adding enviroments variables * Update namespace_controller.go Remove grafana info * Update manager.yaml fix env name Co-authored-by: Farnaz Babaeian --- config/manager/manager.yaml | 16 ++++++++ controllers/namespace_controller.go | 57 ++++++++++++++++++++++------- go.mod | 3 ++ go.sum | 31 ++++++++++++++++ 4 files changed, 93 insertions(+), 14 deletions(-) diff --git a/config/manager/manager.yaml b/config/manager/manager.yaml index 9ece7fe..6fdb797 100644 --- a/config/manager/manager.yaml +++ b/config/manager/manager.yaml @@ -32,6 +32,22 @@ spec: args: - --leader-elect image: ghcr.io/snapp-incubator/grafana-complementary-operator:0.2.1 + env: + - name: GRAFANA_PASSWORD + valueFrom: + secretKeyRef: + name: grafana-operated-dashboard-credentials + key: grafana-password + - name: GRAFANA_USERNAME + valueFrom: + secretKeyRef: + name: grafana-operated-dashboard-credentials + key: grafana-username + - name: GRAFANA_URL + valueFrom: + configMapKeyRef: + name: grafana-complementary-config + key: grafana-url imagePullPolicy: Always name: manager securityContext: diff --git a/controllers/namespace_controller.go b/controllers/namespace_controller.go index c2e166a..3344926 100644 --- a/controllers/namespace_controller.go +++ b/controllers/namespace_controller.go @@ -19,9 +19,11 @@ package controllers import ( "context" "fmt" + "os" "reflect" grafanav1alpha1 "github.com/grafana-operator/grafana-operator/v4/api/integreatly/v1alpha1" + "github.com/grafana-tools/sdk" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -37,8 +39,14 @@ const ( baseSa = "monitoring-datasource" prometheusURL = "https://thanos-querier-custom.openshift-monitoring.svc.cluster.local:9092" nsMonitoringLabel = "monitoring.snappcloud.io/grafana-datasource" + teamLabel = "snappcloud.io/team" ) +// Get Grafana URL and PassWord as a env. +var grafanaPassword = os.Getenv("GRAFANA_PASSWORD") +var grafanaUsername = os.Getenv("GRAFANA_USERNAME") +var grafanaURL = os.Getenv("GRAFANA_URL") + // NamespaceReconciler reconciles a Namespace object type NamespaceReconciler struct { client.Client @@ -85,18 +93,25 @@ func (r *NamespaceReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( return ctrl.Result{}, nil } - logger.Info("Reconciling Namespace", "Namespace.Name", req.NamespacedName) + // Ignore namespaces which does not have team label + team, ok := ns.Labels[teamLabel] + if !ok { + logger.Info("Namespace does not have team label. Ignoring", "namespace", ns.Name, "team name ", team) + return ctrl.Result{}, nil + } - // getting serviceAccount + logger.Info("Reconciling Namespace", "Namespace.Name", req.NamespacedName, "Team", team) + + // Getting serviceAccount logger.Info("Getting serviceAccount", "serviceAccount.Name", baseSa, "Namespace.Name", req.NamespacedName) sa := &corev1.ServiceAccount{} err = r.Get(ctx, types.NamespacedName{Name: baseSa, Namespace: req.Name}, sa) if err != nil { - logger.Error(err, "unable to get ServiceAccount") + logger.Error(err, "Unable to get ServiceAccount") return ctrl.Result{}, err } - // getting serviceaccount token + // Getting serviceaccount token secret := &corev1.Secret{} var token string for _, ref := range sa.Secrets { @@ -105,11 +120,11 @@ func (r *NamespaceReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( // get secret err = r.Get(ctx, types.NamespacedName{Name: ref.Name, Namespace: req.Name}, secret) if err != nil { - logger.Error(err, "unable to get Secret") + logger.Error(err, "Unable to get Secret") return ctrl.Result{}, err } - // check if secret is a token for the serviceaccount + // Check if secret is a token for the serviceaccount if secret.Type != corev1.SecretTypeServiceAccountToken { continue } @@ -117,8 +132,8 @@ func (r *NamespaceReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( uid := secret.Annotations[corev1.ServiceAccountUIDKey] tokenData := secret.Data[corev1.ServiceAccountTokenKey] //tmp - logger.Info("token data", "token", string(tokenData)) - logger.Info("token meta", "name", name, "uid", uid, "ref.Name", ref.Name, "ref.UID", ref.UID) + logger.Info("Token data", "token", string(tokenData)) + logger.Info("Token meta", "name", name, "uid", uid, "ref.Name", ref.Name, "ref.UID", ref.UID) if name == sa.Name && uid == string(sa.UID) && len(tokenData) > 0 { // found token, the first token found is used token = string(tokenData) @@ -132,7 +147,7 @@ func (r *NamespaceReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( logger.Error(fmt.Errorf("did not found service account token for service account %q", sa.Name), "") return ctrl.Result{}, err } - gfDs, err := r.generateGfDataSource(req.Name, token, ns) + gfDs, err := r.generateGfDataSource(ctx, req.Name, team, token, ns) if err != nil { logger.Error(err, "Error generating grafanaDatasource manifest") return ctrl.Result{}, err @@ -142,10 +157,10 @@ func (r *NamespaceReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( found := &grafanav1alpha1.GrafanaDataSource{} err = r.Get(ctx, types.NamespacedName{Name: req.Name, Namespace: baseNs}, found) if err != nil && errors.IsNotFound(err) { - logger.Info("creating grafana datasource", "grafanaDatasource.Name", gfDs.Name) + logger.Info("Creating grafana datasource", "grafanaDatasource.Name", gfDs.Name) err = r.Create(ctx, gfDs) if err != nil { - logger.Error(err, "unable to create GrafanaDataSource") + logger.Error(err, "Unable to create GrafanaDataSource") return ctrl.Result{}, err } // grafanaDatasource created successfully - return and requeue @@ -177,8 +192,22 @@ func (r *NamespaceReconciler) SetupWithManager(mgr ctrl.Manager) error { Complete(r) } -func (r *NamespaceReconciler) generateGfDataSource(name, token string, nsOwner *corev1.Namespace) (*grafanav1alpha1.GrafanaDataSource, error) { +func (r *NamespaceReconciler) generateGfDataSource(ctx context.Context, name, team, token string, nsOwner *corev1.Namespace) (*grafanav1alpha1.GrafanaDataSource, error) { + logger := log.FromContext(ctx) + // Connecting to the Grafana API + client, _ := sdk.NewClient(grafanaURL, fmt.Sprintf("%s:%s", grafanaUsername, grafanaPassword), sdk.DefaultHTTPClient) + + // Retrieving the Organization Info + retrievedOrg, err := client.GetOrgByOrgName(ctx, team) + if err != nil { + logger.Error(err, "Failed to retrieve the organization", "Team name:", team, "Namespace", name) + } + if retrievedOrg.Name != team { + logger.Error(err, "Got wrong org:", "got", retrievedOrg.Name, "expected", team) + } + // Generating the datasource + logger.Info("Start creating Datasource", "Team name:", team, "Team ID:", retrievedOrg.ID, "Namespace", name) grafanaDatasource := &grafanav1alpha1.GrafanaDataSource{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -191,7 +220,7 @@ func (r *NamespaceReconciler) generateGfDataSource(name, token string, nsOwner * Editable: false, IsDefault: false, Name: name, - OrgId: 1, + OrgId: int(retrievedOrg.ID), Type: "prometheus", Url: prometheusURL, Version: 1, @@ -210,7 +239,7 @@ func (r *NamespaceReconciler) generateGfDataSource(name, token string, nsOwner * } // Set target Namespace as the owner of GrafanaDatasource in another Namespace - err := ctrl.SetControllerReference(nsOwner, grafanaDatasource, r.Scheme) + err = ctrl.SetControllerReference(nsOwner, grafanaDatasource, r.Scheme) if err != nil { return nil, err } diff --git a/go.mod b/go.mod index 0127aff..62fc6dc 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.17 require ( github.com/grafana-operator/grafana-operator/v4 v4.2.0 + github.com/grafana-tools/sdk v0.0.0-20220402173226-77f22ba83269 github.com/onsi/ginkgo v1.16.5 github.com/onsi/gomega v1.19.0 k8s.io/api v0.23.5 @@ -36,6 +37,8 @@ require ( github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.1.2 // indirect github.com/googleapis/gnostic v0.5.5 // indirect + github.com/gosimple/slug v1.12.0 // indirect + github.com/gosimple/unidecode v1.0.1 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect diff --git a/go.sum b/go.sum index bc20b2d..503e74c 100644 --- a/go.sum +++ b/go.sum @@ -113,6 +113,13 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chromedp/cdproto v0.0.0-20210526005521-9e51b9051fd0/go.mod h1:At5TxYYdxkbQL0TSefRjhLE3Q0lgvqKKMSFUglJ7i1U= +github.com/chromedp/cdproto v0.0.0-20210706234513-2bc298e8be7f h1:lg5k1KAxmknil6Z19LaaeiEs5Pje7hPzRfyWSSnWLP0= +github.com/chromedp/cdproto v0.0.0-20210706234513-2bc298e8be7f/go.mod h1:At5TxYYdxkbQL0TSefRjhLE3Q0lgvqKKMSFUglJ7i1U= +github.com/chromedp/chromedp v0.7.3 h1:FvgJICfjvXtDX+miuMUY0NHuY8zQvjS/TcEQEG6Ldzs= +github.com/chromedp/chromedp v0.7.3/go.mod h1:9gC521Yzgrk078Ulv6KIgG7hJ2x9aWrxMBBobTFk30A= +github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= +github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= 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= @@ -258,7 +265,14 @@ github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTM github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobs/pretty v0.0.0-20180724170744-09732c25a95b/go.mod h1:Xo4aNUOrJnVruqWQJBtW6+bTBDTniY8yZum5rF3b5jw= github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.1.0-rc.5 h1:QOAag7FoBaBYYHRqzqkhhd8fq5RTubvI4v3Ft/gDVVQ= +github.com/gobwas/ws v1.1.0-rc.5/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= github.com/goccy/go-yaml v1.8.1/go.mod h1:wS4gNoLalDSJxo/SpngzPQ2BN4uuZVLCmbM4S3vd4+Y= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -359,8 +373,17 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gosimple/slug v1.1.1/go.mod h1:ER78kgg1Mv0NQGlXiDe57DpCyfbNywXXZ9mIorhxAf0= +github.com/gosimple/slug v1.12.0 h1:xzuhj7G7cGtd34NXnW/yF0l+AGNfWqwgh/IXgFy7dnc= +github.com/gosimple/slug v1.12.0/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= +github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o= +github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc= github.com/grafana-operator/grafana-operator/v4 v4.2.0 h1:zq9mYuklJrSBt8vtA2YtMk/OVtRhhPnSjsio3ppvFIk= github.com/grafana-operator/grafana-operator/v4 v4.2.0/go.mod h1:t6p0gbMXqe2PFK6EK5qQB+qfZwdDcJ2wMi/fGKGA/LU= +github.com/grafana-tools/sdk v0.0.0-20220402173226-77f22ba83269 h1:730mFhwDnWHkimN3URriW84LJs8k0PJccN1lDn7cxHA= +github.com/grafana-tools/sdk v0.0.0-20220402173226-77f22ba83269/go.mod h1:AHHlOEv1+GGQ3ktHMlhuTUwo3zljV3QJbC0+8o2kn+4= +github.com/grafana/grafana-api-golang-client v0.5.1 h1:PsYNB9mZ2LBC348eciPnU2y5lMqsQg6nANbBEAgG+Po= +github.com/grafana/grafana-api-golang-client v0.5.1/go.mod h1:24W29gPe9yl0/3A9X624TPkAOR8DpHno490cPwnkv8E= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -373,6 +396,8 @@ github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBt github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= @@ -401,6 +426,7 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -442,6 +468,8 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -554,6 +582,7 @@ github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be/go.mod h1:MIDFMn7db1kT65GmV94GzpX9Qdi7N/pQlwb+AN8wh+Q= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -872,6 +901,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -884,6 +914,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=