From 1435a7da89320faabb76f61a610882117a839f71 Mon Sep 17 00:00:00 2001 From: Daniel Cleyrat Date: Tue, 12 May 2020 14:44:47 -0400 Subject: [PATCH 01/15] 0.10.0 remove collections --- Makefile | 12 +- build/Dockerfile | 1 - cmd/admission-webhook/main.go | 6 - cmd/manager/collection/main.go | 119 -- config/samples/collection.yaml | 15 - config/samples/default.yaml | 2 +- config/samples/full.yaml | 25 +- config/versions.yaml | 44 +- deploy/crds/kabanero.io_kabaneros_crd.yaml | 1468 +++++++---------- pkg/apis/addtoscheme_kabanero_v1alpha1.go | 10 - .../kabanero/v1alpha1/collection_types.go | 124 -- pkg/apis/kabanero/v1alpha1/doc.go | 4 - pkg/apis/kabanero/v1alpha1/kabanero_types.go | 321 ---- pkg/apis/kabanero/v1alpha1/register.go | 19 - .../v1alpha1/zz_generated.deepcopy.go | 852 ---------- .../v1alpha1/zz_generated.defaults.go | 16 - .../kabanero/v1alpha1/zz_generated.openapi.go | 443 ----- pkg/controller/collection/archive.go | 269 --- pkg/controller/collection/archive_test.go | 59 - pkg/controller/collection/collection.go | 55 - .../collection/collection_controller.go | 514 ------ .../collection/collection_controller_test.go | 360 ---- pkg/controller/collection/collection_index.go | 23 - pkg/controller/collection/controller.go | 18 - .../collection/directive_processor.go | 73 - .../collection/directive_processor_test.go | 161 -- pkg/controller/collection/httpcache.go | 149 -- pkg/controller/collection/httpcache_test.go | 192 --- pkg/controller/collection/register.go | 6 - pkg/controller/collection/renderer.go | 7 - pkg/controller/collection/resolver.go | 89 - pkg/controller/collection/resolver_test.go | 145 -- .../collection/testdata/bad.pipeline.tar.gz | Bin 437 -> 0 bytes .../collection/testdata/basic.pipeline.tar.gz | Bin 436 -> 0 bytes .../testdata/digest1.pipeline.tar.gz | Bin 430 -> 0 bytes .../testdata/digest2.pipeline.tar.gz | Bin 457 -> 0 bytes .../testdata/trigger.pipeline.tar.gz | Bin 543 -> 0 bytes .../kabaneroplatform/collection-operator.go | 193 --- .../kabaneroplatform_controller.go | 70 +- pkg/webhook/collection/mutatingwebhook.go | 212 --- .../collection/mutatingwebhook_test.go | 401 ----- pkg/webhook/collection/validatingwebhook.go | 73 - .../collection/validatingwebhook_test.go | 94 -- .../kabanero/v1alpha1/mutatingwebhook.go | 69 - .../kabanero/v1alpha1/validatingwebhook.go | 92 -- registry/Dockerfile | 2 +- ...perator.v0.10.0.clusterserviceversion.yaml | 290 ++++ .../0.9.0}/kabanero.io_collections_crd.yaml | 0 .../0.9.0/kabanero.io_kabaneros_crd.yaml | 977 +++++++++++ .../0.9.0/kabanero.io_stacks_crd.yaml | 210 +++ .../kabanero-operator-package.yaml | 4 +- 51 files changed, 2108 insertions(+), 6180 deletions(-) delete mode 100755 cmd/manager/collection/main.go delete mode 100644 config/samples/collection.yaml delete mode 100644 pkg/apis/addtoscheme_kabanero_v1alpha1.go delete mode 100644 pkg/apis/kabanero/v1alpha1/collection_types.go delete mode 100644 pkg/apis/kabanero/v1alpha1/doc.go delete mode 100644 pkg/apis/kabanero/v1alpha1/kabanero_types.go delete mode 100644 pkg/apis/kabanero/v1alpha1/register.go delete mode 100644 pkg/apis/kabanero/v1alpha1/zz_generated.deepcopy.go delete mode 100644 pkg/apis/kabanero/v1alpha1/zz_generated.defaults.go delete mode 100644 pkg/apis/kabanero/v1alpha1/zz_generated.openapi.go delete mode 100644 pkg/controller/collection/archive.go delete mode 100644 pkg/controller/collection/archive_test.go delete mode 100644 pkg/controller/collection/collection.go delete mode 100644 pkg/controller/collection/collection_controller.go delete mode 100644 pkg/controller/collection/collection_controller_test.go delete mode 100644 pkg/controller/collection/collection_index.go delete mode 100644 pkg/controller/collection/controller.go delete mode 100644 pkg/controller/collection/directive_processor.go delete mode 100644 pkg/controller/collection/directive_processor_test.go delete mode 100644 pkg/controller/collection/httpcache.go delete mode 100644 pkg/controller/collection/httpcache_test.go delete mode 100644 pkg/controller/collection/register.go delete mode 100644 pkg/controller/collection/renderer.go delete mode 100644 pkg/controller/collection/resolver.go delete mode 100644 pkg/controller/collection/resolver_test.go delete mode 100644 pkg/controller/collection/testdata/bad.pipeline.tar.gz delete mode 100644 pkg/controller/collection/testdata/basic.pipeline.tar.gz delete mode 100644 pkg/controller/collection/testdata/digest1.pipeline.tar.gz delete mode 100644 pkg/controller/collection/testdata/digest2.pipeline.tar.gz delete mode 100644 pkg/controller/collection/testdata/trigger.pipeline.tar.gz delete mode 100644 pkg/controller/kabaneroplatform/collection-operator.go delete mode 100644 pkg/webhook/collection/mutatingwebhook.go delete mode 100644 pkg/webhook/collection/mutatingwebhook_test.go delete mode 100644 pkg/webhook/collection/validatingwebhook.go delete mode 100644 pkg/webhook/collection/validatingwebhook_test.go delete mode 100644 pkg/webhook/kabanero/v1alpha1/mutatingwebhook.go delete mode 100644 pkg/webhook/kabanero/v1alpha1/validatingwebhook.go create mode 100644 registry/manifests/kabanero-operator/0.10.0/kabanero-operator.v0.10.0.clusterserviceversion.yaml rename {deploy/crds => registry/manifests/kabanero-operator/0.9.0}/kabanero.io_collections_crd.yaml (100%) create mode 100644 registry/manifests/kabanero-operator/0.9.0/kabanero.io_kabaneros_crd.yaml create mode 100644 registry/manifests/kabanero-operator/0.9.0/kabanero.io_stacks_crd.yaml diff --git a/Makefile b/Makefile index cdb13f8f..4f3951f9 100755 --- a/Makefile +++ b/Makefile @@ -53,7 +53,7 @@ IMAGE_SHA = $(lastword $(subst @, ,$(IMAGE_REPO_DIGEST))) REGISTRY_IMAGE_SHA = $(lastword $(subst @, ,$(REGISTRY_IMAGE_REPO_DIGEST))) # Current release (used for CSV management) -CURRENT_RELEASE=0.9.0 +CURRENT_RELEASE=0.10.0 # OS detection ifeq ($(OS),Windows_NT) @@ -66,11 +66,10 @@ endif endif -.PHONY: build deploy deploy-olm build-image build-registry-image push-image push-registry-image push-manifest int-test-install int-test-collections int-test-uninstall int-test-lifecycle +.PHONY: build deploy deploy-olm build-image build-registry-image push-image push-registry-image push-manifest int-test-install int-test-stacks int-test-uninstall int-test-lifecycle build: generate GO111MODULE=on go install ./cmd/manager - GO111MODULE=on go install ./cmd/manager/collection GO111MODULE=on go install ./cmd/manager/stack GO111MODULE=on go install ./cmd/admission-webhook @@ -80,7 +79,6 @@ build-image: generate # commands separately here. # operator-sdk build ${IMAGE} GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -o build/_output/bin/kabanero-operator -gcflags "all=-trimpath=$(GOPATH)" -asmflags "all=-trimpath=$(GOPATH)" -ldflags "-X main.GitTag=$(TRAVIS_TAG) -X main.GitCommit=$(TRAVIS_COMMIT) -X main.GitRepoSlug=$(TRAVIS_REPO_SLUG) -X main.BuildDate=`date -u +%Y%m%d.%H%M%S`" github.com/kabanero-io/kabanero-operator/cmd/manager - GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -o build/_output/bin/kabanero-operator-collection-controller -gcflags "all=-trimpath=$(GOPATH)" -asmflags "all=-trimpath=$(GOPATH)" -ldflags "-X main.GitTag=$(TRAVIS_TAG) -X main.GitCommit=$(TRAVIS_COMMIT) -X main.GitRepoSlug=$(TRAVIS_REPO_SLUG) -X main.BuildDate=`date -u +%Y%m%d.%H%M%S`" github.com/kabanero-io/kabanero-operator/cmd/manager/collection GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -o build/_output/bin/kabanero-operator-stack-controller -gcflags "all=-trimpath=$(GOPATH)" -asmflags "all=-trimpath=$(GOPATH)" -ldflags "-X main.GitTag=$(TRAVIS_TAG) -X main.GitCommit=$(TRAVIS_COMMIT) -X main.GitRepoSlug=$(TRAVIS_REPO_SLUG) -X main.BuildDate=`date -u +%Y%m%d.%H%M%S`" github.com/kabanero-io/kabanero-operator/cmd/manager/stack GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -o build/_output/bin/admission-webhook -gcflags "all=-trimpath=$(GOPATH)" -asmflags "all=-trimpath=$(GOPATH)" -ldflags "-X main.GitTag=$(TRAVIS_TAG) -X main.GitCommit=$(TRAVIS_COMMIT) -X main.GitRepoSlug=$(TRAVIS_REPO_SLUG) -X main.BuildDate=`date -u +%Y%m%d.%H%M%S`" github.com/kabanero-io/kabanero-operator/cmd/admission-webhook @@ -88,11 +86,12 @@ build-image: generate build-registry-image: # Build an OLM private registry for Kabanero. Should be run after push-image so the IMAGE SHA is generated + rm -Rf build/registry mkdir -p build/registry cp LICENSE build/registry/LICENSE cp -R registry/manifests build/registry/ cp registry/Dockerfile build/registry/Dockerfile - cp deploy/crds/kabanero.io_kabaneros_crd.yaml deploy/crds/kabanero.io_collections_crd.yaml deploy/crds/kabanero.io_stacks_crd.yaml build/registry/manifests/kabanero-operator/$(CURRENT_RELEASE)/ + cp deploy/crds/kabanero.io_kabaneros_crd.yaml deploy/crds/kabanero.io_stacks_crd.yaml build/registry/manifests/kabanero-operator/$(CURRENT_RELEASE)/ # Use the internal service address in the CSV ifdef INTERNAL_REGISTRY @@ -156,7 +155,6 @@ generate: install: kubectl config set-context $$(kubectl config current-context) --namespace=kabanero kubectl apply -f deploy/crds/kabanero.io_kabaneros_crd.yaml - kubectl apply -f deploy/crds/kabanero.io_collections_crd.yaml kubectl apply -f deploy/crds/kabanero.io_stacks_crd.yaml deploy: @@ -197,7 +195,7 @@ ifndef GITHUB_TOKEN endif mkdir -p build/bin curl -L https://github.com/mitchellh/golicense/releases/download/v0.2.0/golicense_0.2.0_$(detected_OS)_x86_64.tar.gz | tar -C build/bin -xzf - golicense - build/bin/golicense -plain ./license-rules.json build/_output/bin/admission-webhook build/_output/bin/kabanero-operator build/_output/bin/kabanero-operator-collection-controller build/_output/bin/kabanero-operator-stack-controller | sort > 3RD_PARTY || true + build/bin/golicense -plain ./license-rules.json build/_output/bin/admission-webhook build/_output/bin/kabanero-operator build/_output/bin/kabanero-operator-stack-controller | sort > 3RD_PARTY || true rm build/bin/golicense # Integration Tests diff --git a/build/Dockerfile b/build/Dockerfile index 659be6eb..b08c6662 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -16,7 +16,6 @@ ENV OPERATOR=/usr/local/bin/kabanero-operator \ # install operator binary and supporting controllers. COPY build/_output/bin/kabanero-operator ${OPERATOR} COPY build/_output/bin/kabanero-operator-stack-controller /usr/local/bin/kabanero-operator-stack-controller -COPY build/_output/bin/kabanero-operator-collection-controller /usr/local/bin/kabanero-operator-collection-controller COPY build/_output/bin/admission-webhook /usr/local/bin/admission-webhook COPY build/bin /usr/local/bin diff --git a/cmd/admission-webhook/main.go b/cmd/admission-webhook/main.go index 57e9fa8c..2d794d61 100644 --- a/cmd/admission-webhook/main.go +++ b/cmd/admission-webhook/main.go @@ -9,8 +9,6 @@ import ( _ "k8s.io/client-go/plugin/pkg/client/auth" "github.com/kabanero-io/kabanero-operator/pkg/apis" - collectionwebhook "github.com/kabanero-io/kabanero-operator/pkg/webhook/collection" - kabanerowebhookv1alpha1 "github.com/kabanero-io/kabanero-operator/pkg/webhook/kabanero/v1alpha1" kabanerowebhookv1alpha2 "github.com/kabanero-io/kabanero-operator/pkg/webhook/kabanero/v1alpha2" stackwebhook "github.com/kabanero-io/kabanero-operator/pkg/webhook/stack" @@ -98,10 +96,6 @@ func main() { // Setup the webhook server hookServer := mgr.GetWebhookServer() hookServer.Port = 9443 - hookServer.Register("/validate-collections", collectionwebhook.BuildValidatingWebhook(&mgr)) - hookServer.Register("/mutate-collections", collectionwebhook.BuildMutatingWebhook(&mgr)) - hookServer.Register("/validate-kabaneros", kabanerowebhookv1alpha1.BuildValidatingWebhook(&mgr)) - hookServer.Register("/mutate-kabaneros", kabanerowebhookv1alpha1.BuildMutatingWebhook(&mgr)) hookServer.Register("/validate-kabaneros/v1alpha2", kabanerowebhookv1alpha2.BuildValidatingWebhook(&mgr)) hookServer.Register("/validate-stacks", stackwebhook.BuildValidatingWebhook(&mgr)) hookServer.Register("/mutate-stacks", stackwebhook.BuildMutatingWebhook(&mgr)) diff --git a/cmd/manager/collection/main.go b/cmd/manager/collection/main.go deleted file mode 100755 index 618f6a3a..00000000 --- a/cmd/manager/collection/main.go +++ /dev/null @@ -1,119 +0,0 @@ -package main - -import ( - "fmt" - "os" - "runtime" - - // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) - _ "k8s.io/client-go/plugin/pkg/client/auth" - - "github.com/kabanero-io/kabanero-operator/pkg/apis" - "github.com/kabanero-io/kabanero-operator/pkg/controller/collection" - "sigs.k8s.io/controller-runtime/pkg/client/config" - "sigs.k8s.io/controller-runtime/pkg/manager" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/log/zap" - "sigs.k8s.io/controller-runtime/pkg/manager/signals" - - pipelinev1alpha1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" -) - -// Change below variables to serve metrics on different host or port. -var ( - metricsHost = "0.0.0.0" - metricsPort int32 = 8383 -) -var log = logf.Log.WithName("cmd") - -// These variables are injected during the build using ldflags -var GitTag string -var GitCommit string -var GitRepoSlug string -var BuildDate string - -func printCollectionControllerData() { - log.Info(fmt.Sprintf("Go Version: %s", runtime.Version())) - log.Info(fmt.Sprintf("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH)) - - if len(GitTag) > 0 { - log.Info(fmt.Sprintf("kabanero-collection-operator Git tag: %s", GitTag)) - } - - if len(GitCommit) > 0 { - log.Info(fmt.Sprintf("kabanero-collection-operator Git commit: %s", GitCommit)) - } - - if len(GitRepoSlug) > 0 { - log.Info(fmt.Sprintf("kabanero-collection-operator Git repository: %s", GitRepoSlug)) - } - - if len(BuildDate) == 0 { - BuildDate = "unspecified" - } - log.Info(fmt.Sprintf("kabanero-collection-operator build date: %s", BuildDate)) -} - -func main() { - logf.SetLogger(zap.Logger(false)) - - printCollectionControllerData() - - namespace, err := getCollectionControllerNamespace() - if err != nil { - log.Error(err, "Failed to get watch namespace") - os.Exit(1) - } - - // Get a config to talk to the apiserver - cfg, err := config.GetConfig() - if err != nil { - log.Error(err, "") - os.Exit(1) - } - - // Create a new Cmd to provide shared dependencies and start components - mgr, err := manager.New(cfg, manager.Options{ - Namespace: namespace, - }) - if err != nil { - log.Error(err, "") - os.Exit(1) - } - - log.Info("Registering Components.") - - // Setup Scheme for all resources - if err := apis.AddToScheme(mgr.GetScheme()); err != nil { - log.Error(err, "") - os.Exit(1) - } - - if err := pipelinev1alpha1.AddToScheme(mgr.GetScheme()); err != nil { - log.Error(err, "") - os.Exit(1) - } - - // Setup all Controllers - if err := collection.AddToManager(mgr); err != nil { - log.Error(err, "") - os.Exit(1) - } - - log.Info("Starting the Cmd.") - - // Start the Cmd - if err := mgr.Start(signals.SetupSignalHandler()); err != nil { - log.Error(err, "Manager exited non-zero") - os.Exit(1) - } -} - -// Returns the namespace the collection controller is running in. -func getCollectionControllerNamespace() (string, error) { - ns, found := os.LookupEnv("KABANERO_NAMESPACE") - if !found { - return "", fmt.Errorf("KABANERO_NAMESPACE must be set as an environment variable") - } - return ns, nil -} diff --git a/config/samples/collection.yaml b/config/samples/collection.yaml deleted file mode 100644 index 097b59fe..00000000 --- a/config/samples/collection.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: kabanero.io/v1alpha1 -kind: Collection -metadata: - name: java-microprofile -spec: - version: 0.0.2 - - # Triggers the activation or deactivation of a collection's assets based on - # the allowd values of active and inactive. - # The initial desiredState value for a collection is determined by the - # activateDefaultCollections setting specified in the collection repo section of - # the kabanero CR instance. Post kabanero CR instance deployment, the desiredState - # value of collection can be updated by editing the collection's resource. If the - # value entered is not one of the allowed values, the value of active is used. - desiredState: active diff --git a/config/samples/default.yaml b/config/samples/default.yaml index 9cf63087..adbd0ab3 100644 --- a/config/samples/default.yaml +++ b/config/samples/default.yaml @@ -3,7 +3,7 @@ kind: Kabanero metadata: name: kabanero spec: - version: "0.9.0" + version: "0.10.0" stacks: repositories: - name: central diff --git a/config/samples/full.yaml b/config/samples/full.yaml index 515c9d1e..be215cf3 100644 --- a/config/samples/full.yaml +++ b/config/samples/full.yaml @@ -9,14 +9,14 @@ metadata: spec: # The platform version determines the desired version for all components, but those # can be overriden individually as well - version: "0.9.0" + version: "0.10.0" targetNamespaces: - kabanero cliServices: # Overrides the setting for version on this component - version: "0.9.0" + version: "0.10.0" # Overrides the image as a separate repository or tag repository: kabanero/kabanero-command-line-services @@ -31,20 +31,9 @@ spec: # You can include multiple values in a single entry. For example, 1m30s is equivalent to 90 seconds. sessionExpirationSeconds: "1440m" - collectionController: - # Overrides the setting for version on this component - version: "0.9.0" - - # Overrides the image as a separate repository or tag - repository: kabanero/kabanero-operator - tag: "TRAVIS_TAG" - - # Overrides the image uri - image: kabanero/kabanero-operator:TRAVIS_TAG - stackController: # Overrides the setting for version on this component - version: "0.9.0" + version: "0.10.0" # Overrides the image as a separate repository or tag repository: kabanero/kabanero-operator @@ -58,7 +47,7 @@ spec: enable: true # Overrides the setting for version on this component - version: "0.9.0" + version: "0.10.0" # Overrides the image as a separate repository or tag repository: kabanero/landing @@ -69,7 +58,7 @@ spec: admissionControllerWebhook: # Overrides the setting for version on this component - version: "0.9.0" + version: "0.10.0" # Overrides the image as a separate repository or tag repository: kabanero/kabanero-operator @@ -88,7 +77,7 @@ spec: # Image used in Devfile registry deployment. devFileRegistryImage: # Overrides the setting for version on this component. - version: "0.9.0" + version: "0.10.0" # Overrides the image as a separate repository or tag repository: kabanero/che-devfile-registry @@ -161,7 +150,7 @@ spec: # Overrides the version of the events operator, as defined in # config/versions.yaml - version: "0.9.0" + version: "0.10.0" # Overrides the events-operator image as a separate repository or tag repository: kabanero/events-operator diff --git a/config/versions.yaml b/config/versions.yaml index 4bf807ee..a0b4718e 100644 --- a/config/versions.yaml +++ b/config/versions.yaml @@ -9,10 +9,20 @@ # When the Kabanero instance does not specify which version of Kabanero to use, # this is the value -default: "0.9.0" +default: "0.10.0" # Top level: relates Kabanero versions to software versions kabanero: +- version: "0.10.0" + related-versions: + cli-services: "0.10.0" + landing: "0.10.0" + events: "0.10.0" + stack-controller: "0.10.0" + admission-webhook: "0.10.0" + sso: "7.3.2" + codeready-workspaces: "0.10.0" + - version: "0.9.0" related-versions: cli-services: "0.9.0" @@ -70,6 +80,11 @@ kabanero: related-software: landing: + - version: "0.10.0" + orchestrations: "orchestrations/landing/0.2" + identifiers: + repository: "kabanero/landing" + tag: "0.9.0-rc.1" - version: "0.9.0" orchestrations: "orchestrations/landing/0.2" identifiers: @@ -92,6 +107,11 @@ related-software: tag: "0.6.0" cli-services: + - version: "0.10.0" + orchestrations: "orchestrations/cli-services/0.2" + identifiers: + repository: "kabanero/kabanero-command-line-services" + tag: "0.9.0-rc.1" - version: "0.9.0" orchestrations: "orchestrations/cli-services/0.2" identifiers: @@ -114,6 +134,11 @@ related-software: tag: "0.6.0" codeready-workspaces: + - version: "0.10.0" + orchestrations: "orchestrations/codeready-workspaces/0.1" + identifiers: + devfile-reg-repository: "kabanero/che-devfile-registry" + devfile-reg-tag: "0.11.0" - version: "0.9.0" orchestrations: "orchestrations/codeready-workspaces/0.1" identifiers: @@ -131,6 +156,11 @@ related-software: devfile-reg-tag: "0.8.0" events: + - version: "0.10.0" + orchestrations: "orchestrations/events/0.2" + identifiers: + repository: "kabanero/events-operator" + tag: "0.1.0" - version: "0.9.0" orchestrations: "orchestrations/events/0.2" identifiers: @@ -169,7 +199,12 @@ related-software: repository: "kabanero/kabanero-operator-collection-controller" tag: "0.6.0" - stack-controller: + stack-controller: + - version: "0.10.0" + orchestrations: "orchestrations/stack-controller/0.1" + identifiers: + repository: "FROM_POD" + tag: "FROM_POD" - version: "0.9.0" orchestrations: "orchestrations/stack-controller/0.1" identifiers: @@ -197,6 +232,11 @@ related-software: tag: "0.6.0" admission-webhook: + - version: "0.10.0" + orchestrations: "orchestrations/admission-webhook/0.2" + identifiers: + repository: "FROM_POD" + tag: "FROM_POD" - version: "0.9.0" orchestrations: "orchestrations/admission-webhook/0.2" identifiers: diff --git a/deploy/crds/kabanero.io_kabaneros_crd.yaml b/deploy/crds/kabanero.io_kabaneros_crd.yaml index bbb58bb7..23fe5168 100644 --- a/deploy/crds/kabanero.io_kabaneros_crd.yaml +++ b/deploy/crds/kabanero.io_kabaneros_crd.yaml @@ -28,950 +28,618 @@ spec: scope: Namespaced subresources: status: {} - version: v1alpha1 - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KabaneroSpec defines the desired state of Kabanero - properties: - admissionControllerWebhook: - properties: - image: - type: string - repository: - type: string - tag: - type: string - version: - type: string - type: object - che: - description: CheCustomizationSpec defines customization entries for - Che. - properties: - cheOperatorInstance: - description: CheOperatorInstanceSpec defines customization entries - for the Che operator instance. - properties: - cheWorkspaceClusterRole: - type: string - type: object - enable: - type: boolean - kabaneroChe: - description: KabaneroCheSpec defines customization entries for - Kabanero Che. - properties: - image: - type: string - repository: - type: string - tag: - type: string - version: - type: string - type: object - type: object - cliServices: - description: KabaneroCliServicesCustomizationSpec defines customization - entries for the Kabanero CLI. - properties: - image: - type: string - repository: - type: string - sessionExpirationSeconds: - type: string - tag: - type: string - version: - description: 'Future: Enable bool `json:"enable,omitempty"`' - type: string - type: object - collectionController: - description: CollectionControllerSpec defines customization entried - for the Kabanero collection controller. - properties: - image: - type: string - repository: - type: string - tag: - type: string - version: - type: string - type: object - collections: - description: InstanceCollectionConfig defines the customization entries - for a set of collections. - properties: - repositories: - items: - description: RepositoryConfig defines customization entries - for a collection. + validation: + openAPIV3Schema: + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: KabaneroSpec defines the desired state of Kabanero + properties: + admissionControllerWebhook: + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + cliServices: + description: KabaneroCliServicesCustomizationSpec defines customization + entries for the Kabanero CLI. + properties: + image: + type: string + repository: + type: string + sessionExpirationSeconds: + type: string + tag: + type: string + version: + description: 'Future: Enable bool `json:"enable,omitempty"`' + type: string + type: object + codeReadyWorkspaces: + description: CRWCustomizationSpec defines customization entries for + codeready-workspaces. + properties: + enable: + type: boolean + operator: + description: CRWOperatorSpec defines customization entries for the + codeready-workspaces operator. + properties: + customResourceInstance: + description: CRWOperatorCustomResourceSpec defines custom resource + customization entries for the codeready-workspaces operator. properties: - activateDefaultCollections: - type: boolean - name: + cheWorkspaceClusterRole: type: string - skipCertVerification: + devFileRegistryImage: + description: CWRCustomResourceDevFileRegImage defines DevFileRegistryImage + custom resource customization for the codeready-workspaces + operator. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + openShiftOAuth: + type: boolean + selfSignedCert: + type: boolean + tlsSupport: type: boolean - url: - type: string type: object - type: array - type: object - events: - properties: - enable: - type: boolean - image: - type: string - repository: - type: string - tag: - type: string - version: - type: string - type: object - github: - description: GithubConfig represents the Github information (public - or GHE) where the organization and teams managing the collections - live. Members of the specified team in the specified organization - will have admin authority in the Kabanero CLI. - properties: - apiUrl: - type: string - organization: - type: string - teams: - items: - type: string - type: array - type: object - landing: - description: KabaneroLandingCustomizationSpec defines customization - entries for Kabanero landing page. - properties: - enable: - type: boolean - version: - type: string - type: object - targetNamespaces: - items: + type: object + type: object + collectionController: + description: CollectionControllerSpec defines customization entried + for the Kabanero collection controller. + properties: + image: type: string - type: array - tekton: - description: TektonCustomizationSpec defines customization entries - for Tekton - properties: - disabled: - type: boolean - version: - type: string - type: object - version: - type: string - type: object - status: - description: KabaneroStatus defines the observed state of the Kabanero - instance. - properties: - admissionControllerWebhook: - description: Admission webhook instance status - properties: - errorMessage: - type: string - ready: - type: string - type: object - appsody: - description: Appsody instance readiness status. - properties: - errorMessage: - type: string - ready: - type: string - version: - type: string - type: object - che: - description: Che instance readiness status. - properties: - cheOperator: - description: CheOperatorStatus defines the observed status details - of the Che operator. - properties: - version: - type: string - type: object - errorMessage: - type: string - kabaneroChe: - description: KabaneroCheStatus defines the observed status details - of Kabanero Che. - properties: - version: - type: string - type: object - kabaneroCheInstance: - description: KabaneroCheInstanceStatus defines the observed status - details of Che instance. + repository: + type: string + tag: + type: string + version: + type: string + type: object + events: + properties: + enable: + type: boolean + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + github: + description: GithubConfig represents the Github information (public + or GHE) where the organization and teams managing the stacks live. Members + of the specified team in the specified organization will have admin + authority in the Kabanero CLI. + properties: + apiUrl: + type: string + organization: + type: string + teams: + items: + type: string + type: array + type: object + gitops: + properties: + pipelines: + items: + description: PipelineSpec defines a set of pipelines and associated + resources for a component. properties: - cheImage: - type: string - cheImageTag: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a file + over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: type: string - cheWorkspaceClusterRole: + sha256: type: string type: object - ready: - type: string - type: object - cli: - description: CLI readiness status. - properties: - errorMessage: - type: string - hostnames: - items: - type: string - type: array - ready: - type: string - type: object - collectionController: - description: Kabanero collection controller readiness status. - properties: - errorMessage: - type: string - ready: - type: string - version: - type: string - type: object - events: - description: Events instance status - properties: - errorMessage: - type: string - hostnames: - items: - type: string - type: array - ready: - type: string - type: object - kabaneroInstance: - description: Kabanero operator instance readiness status. The status - is directly correlated to the availability of resources dependencies. - properties: - errorMessage: - type: string - ready: - type: string - version: - type: string - type: object - kappnav: - description: Kabanero Application Navigator instance readiness status. - properties: - apiLocations: - items: - type: string - type: array - errorMessage: - type: string - ready: - type: string - uiLocations: - items: - type: string - type: array - type: object - knativeEventing: - description: Knative eventing instance readiness status. - properties: - errorMessage: - type: string - ready: - type: string - version: - type: string - type: object - landing: - description: Kabanero Landing page readiness status. - properties: - errorMessage: - type: string - ready: - type: string - version: - type: string - type: object - serverless: - description: OpenShift serverless operator status. - properties: - errorMessage: - type: string - knativeServing: - description: KnativeServingStatus defines the observed status - details of Knative Serving. + type: array + type: object + governancePolicy: + description: GovernancePolicyConfig defines customization entries for + governance policies. + properties: + stackPolicy: + type: string + type: object + landing: + description: KabaneroLandingCustomizationSpec defines customization + entries for Kabanero landing page. + properties: + enable: + type: boolean + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + sso: + properties: + adminSecretName: + type: string + enable: + type: boolean + provider: + type: string + type: object + stackController: + description: StackControllerSpec defines customization entried for the + Kabanero stack controller. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + stacks: + description: InstanceStackConfig defines the customization entries for + a set of stacks. + properties: + pipelines: + items: + description: PipelineSpec defines a set of pipelines and associated + resources for a component. properties: - errorMessage: - type: string - ready: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a file + over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: type: string - version: + sha256: type: string type: object - ready: - type: string - version: - type: string - type: object - tekton: - description: Tekton instance readiness status. - properties: - errorMessage: - type: string - ready: - type: string - version: - type: string - type: object - type: object - type: object - served: true - storage: false - - name: v1alpha2 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KabaneroSpec defines the desired state of Kabanero - properties: - admissionControllerWebhook: - properties: - image: - type: string - repository: - type: string - tag: - type: string - version: - type: string - type: object - cliServices: - description: KabaneroCliServicesCustomizationSpec defines customization - entries for the Kabanero CLI. - properties: - image: - type: string - repository: - type: string - sessionExpirationSeconds: - type: string - tag: - type: string - version: - description: 'Future: Enable bool `json:"enable,omitempty"`' - type: string - type: object - codeReadyWorkspaces: - description: CRWCustomizationSpec defines customization entries for - codeready-workspaces. - properties: - enable: - type: boolean - operator: - description: CRWOperatorSpec defines customization entries for - the codeready-workspaces operator. + type: array + repositories: + items: + description: RepositoryConfig defines customization entries for + a stack. properties: - customResourceInstance: - description: CRWOperatorCustomResourceSpec defines custom - resource customization entries for the codeready-workspaces - operator. + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. properties: - cheWorkspaceClusterRole: + assetName: type: string - devFileRegistryImage: - description: CWRCustomResourceDevFileRegImage defines - DevFileRegistryImage custom resource customization for - the codeready-workspaces operator. - properties: - image: - type: string - repository: - type: string - tag: - type: string - version: - type: string - type: object - openShiftOAuth: - type: boolean - selfSignedCert: + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: type: boolean - tlsSupport: + type: object + https: + description: HttpsProtocolFile defines how to retrieve a file + over https + properties: + skipCertVerification: type: boolean + url: + type: string type: object - type: object - type: object - collectionController: - description: CollectionControllerSpec defines customization entried - for the Kabanero collection controller. - properties: - image: - type: string - repository: - type: string - tag: - type: string - version: - type: string - type: object - events: - properties: - enable: - type: boolean - image: - type: string - repository: - type: string - tag: - type: string - version: - type: string - type: object - github: - description: GithubConfig represents the Github information (public - or GHE) where the organization and teams managing the stacks live. Members - of the specified team in the specified organization will have admin - authority in the Kabanero CLI. - properties: - apiUrl: - type: string - organization: - type: string - teams: - items: - type: string - type: array - type: object - gitops: - properties: - pipelines: - items: - description: PipelineSpec defines a set of pipelines and associated - resources for a component. - properties: - gitRelease: - description: GitReleaseSpec defines customization entries - for a Git release. - properties: - assetName: - type: string - hostname: - type: string - organization: - type: string - project: - type: string - release: - type: string - skipCertVerification: - type: boolean - type: object - https: - description: HttpsProtocolFile defines how to retrieve a - file over https - properties: - skipCertVerification: - type: boolean - url: - type: string - type: object - id: - type: string - sha256: - type: string - type: object - type: array - type: object - governancePolicy: - description: GovernancePolicyConfig defines customization entries - for governance policies. - properties: - stackPolicy: - type: string - type: object - landing: - description: KabaneroLandingCustomizationSpec defines customization - entries for Kabanero landing page. - properties: - enable: - type: boolean - image: - type: string - repository: - type: string - tag: - type: string - version: - type: string - type: object - sso: - properties: - adminSecretName: - type: string - enable: - type: boolean - provider: - type: string - type: object - stackController: - description: StackControllerSpec defines customization entried for - the Kabanero stack controller. - properties: - image: - type: string - repository: - type: string - tag: - type: string - version: - type: string - type: object - stacks: - description: InstanceStackConfig defines the customization entries - for a set of stacks. - properties: - pipelines: - items: - description: PipelineSpec defines a set of pipelines and associated - resources for a component. - properties: - gitRelease: - description: GitReleaseSpec defines customization entries - for a Git release. - properties: - assetName: - type: string - hostname: - type: string - organization: - type: string - project: - type: string - release: - type: string - skipCertVerification: - type: boolean - type: object - https: - description: HttpsProtocolFile defines how to retrieve a - file over https - properties: - skipCertVerification: - type: boolean - url: - type: string - type: object - id: - type: string - sha256: - type: string - type: object - type: array - repositories: - items: - description: RepositoryConfig defines customization entries - for a stack. - properties: - gitRelease: - description: GitReleaseSpec defines customization entries - for a Git release. + name: + type: string + pipelines: + items: + description: PipelineSpec defines a set of pipelines and + associated resources for a component. properties: - assetName: - type: string - hostname: - type: string - organization: - type: string - project: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve + a file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: type: string - release: - type: string - skipCertVerification: - type: boolean - type: object - https: - description: HttpsProtocolFile defines how to retrieve a - file over https - properties: - skipCertVerification: - type: boolean - url: + sha256: type: string type: object - name: - type: string - pipelines: - items: - description: PipelineSpec defines a set of pipelines and - associated resources for a component. - properties: - gitRelease: - description: GitReleaseSpec defines customization - entries for a Git release. - properties: - assetName: - type: string - hostname: - type: string - organization: - type: string - project: - type: string - release: - type: string - skipCertVerification: - type: boolean - type: object - https: - description: HttpsProtocolFile defines how to retrieve - a file over https - properties: - skipCertVerification: - type: boolean - url: - type: string - type: object - id: - type: string - sha256: - type: string - type: object - type: array - type: object - type: array - skipRegistryCertVerification: - type: boolean - type: object - targetNamespaces: - items: - type: string - type: array - triggers: - items: - description: TriggerSpec defines the sets of default triggers for - the stacks + type: array + type: object + type: array + skipRegistryCertVerification: + type: boolean + type: object + targetNamespaces: + items: + type: string + type: array + triggers: + items: + description: TriggerSpec defines the sets of default triggers for + the stacks + properties: + gitRelease: + description: GitReleaseSpec defines customization entries for + a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a file + over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + version: + type: string + type: object + status: + description: KabaneroStatus defines the observed state of the Kabanero instance. + properties: + admissionControllerWebhook: + description: Admission webhook instance status + properties: + message: + type: string + ready: + type: string + type: object + appsody: + description: Appsody instance readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + cli: + description: CLI readiness status. + properties: + hostnames: + items: + type: string + type: array + message: + type: string + ready: + type: string + type: object + codereadyWorkspaces: + description: Codeready-workspaces instance readiness status. + properties: + message: + type: string + operator: + description: CRWOperatorStatus defines the observed status details + of the codeready-workspaces operator. properties: - gitRelease: - description: GitReleaseSpec defines customization entries for - a Git release. + instance: + description: CRWInstanceStatus defines the observed status details + of the codeready-workspaces operator custom resource. properties: - assetName: - type: string - hostname: - type: string - organization: + cheWorkspaceClusterRole: type: string - project: + devfileRegistryImage: type: string - release: - type: string - skipCertVerification: + openShiftOAuth: type: boolean - type: object - https: - description: HttpsProtocolFile defines how to retrieve a file - over https - properties: - skipCertVerification: + selfSignedCert: type: boolean - url: - type: string + tlsSupport: + type: boolean + required: + - cheWorkspaceClusterRole + - devfileRegistryImage + - openShiftOAuth + - selfSignedCert + - tlsSupport type: object - id: - type: string - sha256: + version: type: string type: object - type: array - version: - type: string - type: object - status: - description: KabaneroStatus defines the observed state of the Kabanero - instance. - properties: - admissionControllerWebhook: - description: Admission webhook instance status - properties: - message: - type: string - ready: - type: string - type: object - appsody: - description: Appsody instance readiness status. - properties: - message: - type: string - ready: - type: string - version: - type: string - type: object - cli: - description: CLI readiness status. - properties: - hostnames: - items: - type: string - type: array - message: - type: string - ready: - type: string - type: object - codereadyWorkspaces: - description: Codeready-workspaces instance readiness status. - properties: - message: - type: string - operator: - description: CRWOperatorStatus defines the observed status details - of the codeready-workspaces operator. + ready: + type: string + type: object + collectionController: + description: Kabanero collection controller readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + events: + description: Events instance status + properties: + hostnames: + items: + type: string + type: array + message: + type: string + ready: + type: string + type: object + gitops: + description: The status of the gitops pipelines + properties: + message: + type: string + pipelines: + items: + description: PipelineStatus defines the observed state of the + assets located within a single pipeline .tar.gz. properties: - instance: - description: CRWInstanceStatus defines the observed status - details of the codeready-workspaces operator custom resource. - properties: - cheWorkspaceClusterRole: - type: string - devfileRegistryImage: - type: string - openShiftOAuth: - type: boolean - selfSignedCert: - type: boolean - tlsSupport: - type: boolean - required: - - cheWorkspaceClusterRole - - devfileRegistryImage - - openShiftOAuth - - selfSignedCert - - tlsSupport - type: object - version: - type: string - type: object - ready: - type: string - type: object - collectionController: - description: Kabanero collection controller readiness status. - properties: - message: - type: string - ready: - type: string - version: - type: string - type: object - events: - description: Events instance status - properties: - hostnames: - items: - type: string - type: array - message: - type: string - ready: - type: string - type: object - gitops: - description: The status of the gitops pipelines - properties: - message: - type: string - pipelines: - items: - description: PipelineStatus defines the observed state of the - assets located within a single pipeline .tar.gz. - properties: - activeAssets: - items: - description: RepositoryAssetStatus defines the observed - state of a single asset in a pipelines respository. - properties: - assetDigest: - type: string - assetName: - type: string - group: - type: string - kind: - type: string - namespace: - type: string - status: - type: string - statusMessage: - type: string - version: - type: string - type: object - type: array - digest: - type: string - gitRelease: - description: GitReleaseInfo is all of the GitReleaseSpec - information, minus the "skip cert verification" information, - which is not relevant for status. + activeAssets: + items: + description: RepositoryAssetStatus defines the observed + state of a single asset in a pipelines respository. properties: + assetDigest: + type: string assetName: type: string - hostname: + group: type: string - organization: + kind: type: string - project: + namespace: type: string - release: + status: + type: string + statusMessage: + type: string + version: type: string type: object - name: - type: string - url: - type: string - type: object - type: array - ready: - type: string - type: object - kabaneroInstance: - description: Kabanero operator instance readiness status. The status - is directly correlated to the availability of resources dependencies. - properties: - message: - type: string - ready: - type: string - version: - type: string - type: object - kappnav: - description: Kabanero Application Navigator instance readiness status. - properties: - apiLocations: - items: - type: string - type: array - message: - type: string - ready: - type: string - uiLocations: - items: - type: string - type: array - type: object - landing: - description: Kabanero Landing page readiness status. - properties: - message: - type: string - ready: - type: string - version: - type: string - type: object - serverless: - description: OpenShift serverless operator status. - properties: - knativeServing: - description: KnativeServingStatus defines the observed status - details of Knative Serving. - properties: - message: + type: array + digest: type: string - ready: + gitRelease: + description: GitReleaseInfo is all of the GitReleaseSpec information, + minus the "skip cert verification" information, which is + not relevant for status. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + type: object + name: type: string - version: + url: type: string type: object - message: - type: string - ready: - type: string - version: - type: string - type: object - sso: - description: SSO server status - properties: - configured: - type: string - message: - type: string - ready: - type: string - type: object - stackController: - description: Kabanero stack controller readiness status. - properties: - message: - type: string - ready: - type: string - version: - type: string - type: object - tekton: - description: Tekton instance readiness status. - properties: - message: - type: string - ready: - type: string - version: - type: string - type: object - type: object - type: object + type: array + ready: + type: string + type: object + kabaneroInstance: + description: Kabanero operator instance readiness status. The status + is directly correlated to the availability of resources dependencies. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + kappnav: + description: Kabanero Application Navigator instance readiness status. + properties: + apiLocations: + items: + type: string + type: array + message: + type: string + ready: + type: string + uiLocations: + items: + type: string + type: array + type: object + landing: + description: Kabanero Landing page readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + serverless: + description: OpenShift serverless operator status. + properties: + knativeServing: + description: KnativeServingStatus defines the observed status details + of Knative Serving. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + message: + type: string + ready: + type: string + version: + type: string + type: object + sso: + description: SSO server status + properties: + configured: + type: string + message: + type: string + ready: + type: string + type: object + stackController: + description: Kabanero stack controller readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + tekton: + description: Tekton instance readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + type: object + type: object + version: v1alpha2 + versions: + - name: v1alpha2 served: true storage: true diff --git a/pkg/apis/addtoscheme_kabanero_v1alpha1.go b/pkg/apis/addtoscheme_kabanero_v1alpha1.go deleted file mode 100644 index e981e6af..00000000 --- a/pkg/apis/addtoscheme_kabanero_v1alpha1.go +++ /dev/null @@ -1,10 +0,0 @@ -package apis - -import ( - "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1" -) - -func init() { - // Register the types with the Scheme so the components can map objects to GroupVersionKinds and back - AddToSchemes = append(AddToSchemes, v1alpha1.SchemeBuilder.AddToScheme) -} diff --git a/pkg/apis/kabanero/v1alpha1/collection_types.go b/pkg/apis/kabanero/v1alpha1/collection_types.go deleted file mode 100644 index 3a80082f..00000000 --- a/pkg/apis/kabanero/v1alpha1/collection_types.go +++ /dev/null @@ -1,124 +0,0 @@ -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. -// NOTE: The +listType=set marker are required by OpenAPI generation for list types. - -const ( - // CollectionDesiredStateActive represents a desired collection active state. - // It indicates that the collection needs activation. - CollectionDesiredStateActive = "active" - - // CollectionDesiredStateInactive represents a desired collection inactive state. - // It indicates that the collection needs to be deactivated. - CollectionDesiredStateInactive = "inactive" -) - -// CollectionSpec defines the desired composition of a Collection -// +k8s:openapi-gen=true -type CollectionSpec struct { - RepositoryUrl string `json:"repositoryUrl,omitempty"` - SkipCertVerification bool `json:"skipCertVerification,omitempty"` - Name string `json:"name,omitempty"` - Version string `json:"version,omitempty"` - DesiredState string `json:"desiredState,omitempty"` - // +listType=set - Versions []CollectionVersion `json:"versions,omitempty"` -} - -// CollectionVersion defines the desired composition of a specific collection version. -type CollectionVersion struct { - RepositoryUrl string `json:"repositoryUrl,omitempty"` - Version string `json:"version,omitempty"` - DesiredState string `json:"desiredState,omitempty"` - SkipCertVerification bool `json:"skipCertVerification,omitempty"` -} - -// PipelineStatus defines the observed state of the assets located within a single pipeline .tar.gz. -type PipelineStatus struct { - Name string `json:"name,omitEmpty"` - Url string `json:"url,omitEmpty"` - Digest string `json:"digest,omitEmpty"` - // +listType=set - ActiveAssets []RepositoryAssetStatus `json:"activeAssets,omitempty"` -} - -// RepositoryAssetStatus defines the observed state of a single asset in a respository, in the collection. -type RepositoryAssetStatus struct { - Name string `json:"assetName,omitempty"` - Namespace string `json:"namespace,omitempty"` - Group string `json:"group,omitempty"` - Version string `json:"version,omitempty"` - Kind string `json:"kind,omitempty"` - Digest string `json:"assetDigest,omitempty"` - Status string `json:"status,omitempty"` - StatusMessage string `json:"statusMessage,omitempty"` -} - -// CollectionStatus defines the observed state of a collection -// +k8s:openapi-gen=true -type CollectionStatus struct { - ActiveVersion string `json:"activeVersion,omitempty"` - ActiveLocation string `json:"activeLocation,omitempty"` - // +listType=set - ActivePipelines []PipelineStatus `json:"activePipelines,omitempty"` - AvailableVersion string `json:"availableVersion,omitempty"` - AvailableLocation string `json:"availableLocation,omitempty"` - Status string `json:"status,omitempty"` - StatusMessage string `json:"statusMessage,omitempty"` - // +listType=set - Images []Image `json:"images,omitempty"` - // +listType=set - Versions []CollectionVersionStatus `json:"versions,omitempty"` -} - -// CollectionVersionStatus defines the observed state of a specific collection version. -type CollectionVersionStatus struct { - Version string `json:"version,omitempty"` - Location string `json:"location,omitempty"` - // +listType=set - Pipelines []PipelineStatus `json:"pipelines,omitempty"` - Status string `json:"status,omitempty"` - StatusMessage string `json:"statusMessage,omitempty"` - // +listType=set - Images []Image `json:"images,omitempty"` -} - -// Image defines a container image used by a collection -type Image struct { - Id string `json:"id,omitempty"` - Image string `json:"image,omitempty"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// Collection is the Schema for the collections API -// +k8s:openapi-gen=true -// +kubebuilder:subresource:status -// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp",description="CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations." -// +kubebuilder:printcolumn:name="Status",type="string",JSONPath=".status.status",description="Collection status." -// +kubebuilder:resource:path=collections,scope=Namespaced -type Collection struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec CollectionSpec `json:"spec,omitempty"` - Status CollectionStatus `json:"status,omitempty"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// CollectionList contains a list of Collection -type CollectionList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - // +listType=set - Items []Collection `json:"items"` -} - -func init() { - SchemeBuilder.Register(&Collection{}, &CollectionList{}) -} diff --git a/pkg/apis/kabanero/v1alpha1/doc.go b/pkg/apis/kabanero/v1alpha1/doc.go deleted file mode 100644 index 1e9ae95d..00000000 --- a/pkg/apis/kabanero/v1alpha1/doc.go +++ /dev/null @@ -1,4 +0,0 @@ -// Package v1alpha1 contains API Schema definitions for the kabanero v1alpha1 API group -// +k8s:deepcopy-gen=package,register -// +groupName=kabanero.io -package v1alpha1 diff --git a/pkg/apis/kabanero/v1alpha1/kabanero_types.go b/pkg/apis/kabanero/v1alpha1/kabanero_types.go deleted file mode 100644 index 5480ff0d..00000000 --- a/pkg/apis/kabanero/v1alpha1/kabanero_types.go +++ /dev/null @@ -1,321 +0,0 @@ -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! -// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. -// NOTE: The +listType=set marker is required by OpenAPI generation for list types. - -// +kubebuilder:subresource:status - -// KabaneroSpec defines the desired state of Kabanero -// +k8s:openapi-gen=true -type KabaneroSpec struct { - // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster - // Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file - // Add custom validation using kubebuilder tags: https://book.kubebuilder.io/beyond_basics/generating_crd.html - - Version string `json:"version,omitempty"` - - // +listType=set - TargetNamespaces []string `json:"targetNamespaces,omitempty"` - - Github GithubConfig `json:"github,omitempty"` - - Collections InstanceCollectionConfig `json:"collections,omitempty"` - - Tekton TektonCustomizationSpec `json:"tekton,omitempty"` - - CliServices KabaneroCliServicesCustomizationSpec `json:"cliServices,omitempty"` - - Landing KabaneroLandingCustomizationSpec `json:"landing,omitempty"` - - Che CheCustomizationSpec `json:"che,omitempty"` - - Events EventsCustomizationSpec `json:"events,omitempty"` - - CollectionController CollectionControllerSpec `json:"collectionController,omitempty"` - - AdmissionControllerWebhook AdmissionControllerWebhookCustomizationSpec `json:"admissionControllerWebhook,omitempty"` -} - -// InstanceCollectionConfig defines the customization entries for a set of collections. -type InstanceCollectionConfig struct { - // +listType=set - Repositories []RepositoryConfig `json:"repositories,omitempty"` -} - -// GithubConfig represents the Github information (public or GHE) where -// the organization and teams managing the collections live. Members -// of the specified team in the specified organization will have admin -// authority in the Kabanero CLI. -type GithubConfig struct { - Organization string `json:"organization,omitempty"` - // +listType=set - Teams []string `json:"teams,omitempty"` - ApiUrl string `json:"apiUrl,omitempty"` -} - -// RepositoryConfig defines customization entries for a collection. -type RepositoryConfig struct { - Name string `json:"name,omitempty"` - Url string `json:"url,omitempty"` - ActivateDefaultCollections bool `json:"activateDefaultCollections,omitempty"` - SkipCertVerification bool `json:"skipCertVerification,omitempty"` -} - -// TektonCustomizationSpec defines customization entries for Tekton -type TektonCustomizationSpec struct { - Disabled bool `json:"disabled,omitempty"` - Version string `json:"version,omitempty"` -} - -// KabaneroCliServicesCustomizationSpec defines customization entries for the Kabanero CLI. -type KabaneroCliServicesCustomizationSpec struct { - //Future: Enable bool `json:"enable,omitempty"` - Version string `json:"version,omitempty"` - Image string `json:"image,omitempty"` - Repository string `json:"repository,omitempty"` - Tag string `json:"tag,omitempty"` - SessionExpirationSeconds string `json:"sessionExpirationSeconds,omitempty"` -} - -// KabaneroLandingCustomizationSpec defines customization entries for Kabanero landing page. -type KabaneroLandingCustomizationSpec struct { - Enable *bool `json:"enable,omitempty"` - Version string `json:"version,omitempty"` -} - -// CheCustomizationSpec defines customization entries for Che. -type CheCustomizationSpec struct { - Enable *bool `json:"enable,omitempty"` - CheOperatorInstance CheOperatorInstanceSpec `json:"cheOperatorInstance,omitempty"` - KabaneroChe KabaneroCheSpec `json:"kabaneroChe,omitempty"` -} - -// CheOperatorInstanceSpec defines customization entries for the Che operator instance. -type CheOperatorInstanceSpec struct { - CheWorkspaceClusterRole string `json:"cheWorkspaceClusterRole,omitempty"` -} - -// KabaneroCheSpec defines customization entries for Kabanero Che. -type KabaneroCheSpec struct { - Version string `json:"version,omitempty"` - Image string `json:"image,omitempty"` - Repository string `json:"repository,omitempty"` - Tag string `json:"tag,omitempty"` -} - -type EventsCustomizationSpec struct { - Enable bool `json:"enable,omitempty"` - Version string `json:"version,omitempty"` - Image string `json:"image,omitempty"` - Repository string `json:"repository,omitempty"` - Tag string `json:"tag,omitempty"` -} - -// CollectionControllerSpec defines customization entried for the Kabanero collection controller. -type CollectionControllerSpec struct { - Version string `json:"version,omitempty"` - Image string `json:"image,omitempty"` - Repository string `json:"repository,omitempty"` - Tag string `json:"tag,omitempty"` -} - -type AdmissionControllerWebhookCustomizationSpec struct { - Version string `json:"version,omitempty"` - Image string `json:"image,omitempty"` - Repository string `json:"repository,omitempty"` - Tag string `json:"tag,omitempty"` -} - -// KabaneroStatus defines the observed state of the Kabanero instance. -// +k8s:openapi-gen=true -type KabaneroStatus struct { - // Kabanero operator instance readiness status. The status is directly correlated to the availability of resources dependencies. - KabaneroInstance KabaneroInstanceStatus `json:"kabaneroInstance,omitempty"` - - // Knative eventing instance readiness status. - KnativeEventing KnativeEventingStatus `json:"knativeEventing,omitempty"` - - // OpenShift serverless operator status. - Serverless ServerlessStatus `json:"serverless,omitempty"` - - // Tekton instance readiness status. - Tekton TektonStatus `json:"tekton,omitempty"` - - // CLI readiness status. - Cli CliStatus `json:"cli,omitempty"` - - // Kabanero Landing page readiness status. - Landing *KabaneroLandingPageStatus `json:"landing,omitempty"` - - // Appsody instance readiness status. - Appsody AppsodyStatus `json:"appsody,omitempty"` - - // Kabanero Application Navigator instance readiness status. - Kappnav *KappnavStatus `json:"kappnav,omitempty"` - - // Che instance readiness status. - Che *CheStatus `json:"che,omitempty"` - - // Events instance status - Events *EventsStatus `json:"events,omitempty"` - - // Kabanero collection controller readiness status. - CollectionController CollectionControllerStatus `json:"collectionController,omitempty"` - - // Admission webhook instance status - AdmissionControllerWebhook AdmissionControllerWebhookStatus `json:"admissionControllerWebhook,omitempty"` -} - -// KabaneroInstanceStatus defines the observed status details of Kabanero operator instance -type KabaneroInstanceStatus struct { - Ready string `json:"ready,omitempty"` - ErrorMessage string `json:"errorMessage,omitempty"` - Version string `json:"version,omitempty"` -} - -// TektonStatus defines the observed status details of Tekton. -type TektonStatus struct { - Ready string `json:"ready,omitempty"` - ErrorMessage string `json:"errorMessage,omitempty"` - Version string `json:"version,omitempty"` -} - -// KnativeEventingStatus defines the observed status details of Knative Eventing. -type KnativeEventingStatus struct { - Ready string `json:"ready,omitempty"` - ErrorMessage string `json:"errorMessage,omitempty"` - Version string `json:"version,omitempty"` -} - -// ServerlessStatus defines the observed status details of Open Shift serverless. -type ServerlessStatus struct { - Ready string `json:"ready,omitempty"` - ErrorMessage string `json:"errorMessage,omitempty"` - Version string `json:"version,omitempty"` - KnativeServing KnativeServingStatus `json:"knativeServing,omitempty"` -} - -// KnativeServingStatus defines the observed status details of Knative Serving. -type KnativeServingStatus struct { - Ready string `json:"ready,omitempty"` - ErrorMessage string `json:"errorMessage,omitempty"` - Version string `json:"version,omitempty"` -} - -// CliStatus defines the observed status details of the Kabanero CLI. -type CliStatus struct { - Ready string `json:"ready,omitempty"` - ErrorMessage string `json:"errorMessage,omitempty"` - // +listType=set - Hostnames []string `json:"hostnames,omitempty"` -} - -// KabaneroLandingPageStatus defines the observed status details of the Kabanero landing page. -type KabaneroLandingPageStatus struct { - Ready string `json:"ready,omitempty"` - ErrorMessage string `json:"errorMessage,omitempty"` - Version string `json:"version,omitempty"` -} - -// AppsodyStatus defines the observed status details of Appsody. -type AppsodyStatus struct { - Ready string `json:"ready,omitempty"` - ErrorMessage string `json:"errorMessage,omitempty"` - Version string `json:"version,omitempty"` -} - -// KappnavStatus defines the observed status details of Kubernetes Application Navigator. -type KappnavStatus struct { - Ready string `json:"ready,omitempty"` - ErrorMessage string `json:"errorMessage,omitempty"` - // +listType=set - UiLocations []string `json:"uiLocations,omitempty"` - // +listType=set - ApiLocations []string `json:"apiLocations,omitempty"` -} - -// CheStatus defines the observed status details of Che. -type CheStatus struct { - Ready string `json:"ready,omitempty"` - ErrorMessage string `json:"errorMessage,omitempty"` - CheOperator CheOperatorStatus `json:"cheOperator,omitempty"` - KabaneroChe KabaneroCheStatus `json:"kabaneroChe,omitempty"` - KabaneroCheInstance KabaneroCheInstanceStatus `json:"kabaneroCheInstance,omitempty"` -} - -// CheOperatorStatus defines the observed status details of the Che operator. -type CheOperatorStatus struct { - Version string `json:"version,omitempty"` -} - -// KabaneroCheStatus defines the observed status details of Kabanero Che. -type KabaneroCheStatus struct { - Version string `json:"version,omitempty"` -} - -// KabaneroCheInstanceStatus defines the observed status details of Che instance. -type KabaneroCheInstanceStatus struct { - CheImage string `json:"cheImage,omitempty"` - CheImageTag string `json:"cheImageTag,omitempty"` - CheWorkspaceClusterRole string `json:"cheWorkspaceClusterRole,omitempty"` -} - -// EventsStatus defines the observed status details of the Kabanero events. -type EventsStatus struct { - Ready string `json:"ready,omitempty"` - ErrorMessage string `json:"errorMessage,omitempty"` - // +listType=set - Hostnames []string `json:"hostnames,omitempty"` -} - -// CollectionControllerStatus defines the observed status details of the Kabanero collection controller. -type CollectionControllerStatus struct { - Ready string `json:"ready,omitempty"` - ErrorMessage string `json:"errorMessage,omitempty"` - Version string `json:"version,omitempty"` -} - -// AdmissionControllerWebhookStatus defines the observed status details of the Kabanero mutating and validating admission webhooks. -type AdmissionControllerWebhookStatus struct { - Ready string `json:"ready,omitempty"` - ErrorMessage string `json:"errorMessage,omitempty"` -} - -// Kabanero is the Schema for the kabaneros API -// Note that kubebuilder and operator-sdk currently disagree about what the -// plural of this type should be. The +kubebuilder:resource marker sets the -// plural to what operator-sdk expects. - -// +k8s:openapi-gen=true -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +kubebuilder:subresource:status -// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp",description="CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations." -// +kubebuilder:printcolumn:name="Version",type="string",JSONPath=".status.kabaneroInstance.version",description="Kabanero operator instance version." -// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.kabaneroInstance.ready",description="Kabanero operator instance readiness status. The status is directly correlated to the availability of the operator's resources dependencies." -// +kubebuilder:resource:path=kabaneros,scope=Namespaced -type Kabanero struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec KabaneroSpec `json:"spec,omitempty"` - Status KabaneroStatus `json:"status,omitempty"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// KabaneroList contains a list of Kabanero -type KabaneroList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - // +listType=set - Items []Kabanero `json:"items"` -} - -func init() { - SchemeBuilder.Register(&Kabanero{}, &KabaneroList{}) -} diff --git a/pkg/apis/kabanero/v1alpha1/register.go b/pkg/apis/kabanero/v1alpha1/register.go deleted file mode 100644 index 8790de61..00000000 --- a/pkg/apis/kabanero/v1alpha1/register.go +++ /dev/null @@ -1,19 +0,0 @@ -// NOTE: Boilerplate only. Ignore this file. - -// Package v1alpha1 contains API Schema definitions for the kabanero v1alpha1 API group -// +k8s:deepcopy-gen=package,register -// +groupName=kabanero.io -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // SchemeGroupVersion is group version used to register these objects - SchemeGroupVersion = schema.GroupVersion{Group: "kabanero.io", Version: "v1alpha1"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion} -) diff --git a/pkg/apis/kabanero/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/kabanero/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 731008bb..00000000 --- a/pkg/apis/kabanero/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,852 +0,0 @@ -// +build !ignore_autogenerated - -// Code generated by operator-sdk. DO NOT EDIT. - -package v1alpha1 - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AdmissionControllerWebhookCustomizationSpec) DeepCopyInto(out *AdmissionControllerWebhookCustomizationSpec) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AdmissionControllerWebhookCustomizationSpec. -func (in *AdmissionControllerWebhookCustomizationSpec) DeepCopy() *AdmissionControllerWebhookCustomizationSpec { - if in == nil { - return nil - } - out := new(AdmissionControllerWebhookCustomizationSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AdmissionControllerWebhookStatus) DeepCopyInto(out *AdmissionControllerWebhookStatus) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AdmissionControllerWebhookStatus. -func (in *AdmissionControllerWebhookStatus) DeepCopy() *AdmissionControllerWebhookStatus { - if in == nil { - return nil - } - out := new(AdmissionControllerWebhookStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AppsodyStatus) DeepCopyInto(out *AppsodyStatus) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AppsodyStatus. -func (in *AppsodyStatus) DeepCopy() *AppsodyStatus { - if in == nil { - return nil - } - out := new(AppsodyStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CheCustomizationSpec) DeepCopyInto(out *CheCustomizationSpec) { - *out = *in - if in.Enable != nil { - in, out := &in.Enable, &out.Enable - *out = new(bool) - **out = **in - } - out.CheOperatorInstance = in.CheOperatorInstance - out.KabaneroChe = in.KabaneroChe - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CheCustomizationSpec. -func (in *CheCustomizationSpec) DeepCopy() *CheCustomizationSpec { - if in == nil { - return nil - } - out := new(CheCustomizationSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CheOperatorInstanceSpec) DeepCopyInto(out *CheOperatorInstanceSpec) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CheOperatorInstanceSpec. -func (in *CheOperatorInstanceSpec) DeepCopy() *CheOperatorInstanceSpec { - if in == nil { - return nil - } - out := new(CheOperatorInstanceSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CheOperatorStatus) DeepCopyInto(out *CheOperatorStatus) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CheOperatorStatus. -func (in *CheOperatorStatus) DeepCopy() *CheOperatorStatus { - if in == nil { - return nil - } - out := new(CheOperatorStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CheStatus) DeepCopyInto(out *CheStatus) { - *out = *in - out.CheOperator = in.CheOperator - out.KabaneroChe = in.KabaneroChe - out.KabaneroCheInstance = in.KabaneroCheInstance - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CheStatus. -func (in *CheStatus) DeepCopy() *CheStatus { - if in == nil { - return nil - } - out := new(CheStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CliStatus) DeepCopyInto(out *CliStatus) { - *out = *in - if in.Hostnames != nil { - in, out := &in.Hostnames, &out.Hostnames - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CliStatus. -func (in *CliStatus) DeepCopy() *CliStatus { - if in == nil { - return nil - } - out := new(CliStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Collection) DeepCopyInto(out *Collection) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Collection. -func (in *Collection) DeepCopy() *Collection { - if in == nil { - return nil - } - out := new(Collection) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Collection) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CollectionControllerSpec) DeepCopyInto(out *CollectionControllerSpec) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CollectionControllerSpec. -func (in *CollectionControllerSpec) DeepCopy() *CollectionControllerSpec { - if in == nil { - return nil - } - out := new(CollectionControllerSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CollectionControllerStatus) DeepCopyInto(out *CollectionControllerStatus) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CollectionControllerStatus. -func (in *CollectionControllerStatus) DeepCopy() *CollectionControllerStatus { - if in == nil { - return nil - } - out := new(CollectionControllerStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CollectionList) DeepCopyInto(out *CollectionList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Collection, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CollectionList. -func (in *CollectionList) DeepCopy() *CollectionList { - if in == nil { - return nil - } - out := new(CollectionList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *CollectionList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CollectionSpec) DeepCopyInto(out *CollectionSpec) { - *out = *in - if in.Versions != nil { - in, out := &in.Versions, &out.Versions - *out = make([]CollectionVersion, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CollectionSpec. -func (in *CollectionSpec) DeepCopy() *CollectionSpec { - if in == nil { - return nil - } - out := new(CollectionSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CollectionStatus) DeepCopyInto(out *CollectionStatus) { - *out = *in - if in.ActivePipelines != nil { - in, out := &in.ActivePipelines, &out.ActivePipelines - *out = make([]PipelineStatus, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Images != nil { - in, out := &in.Images, &out.Images - *out = make([]Image, len(*in)) - copy(*out, *in) - } - if in.Versions != nil { - in, out := &in.Versions, &out.Versions - *out = make([]CollectionVersionStatus, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CollectionStatus. -func (in *CollectionStatus) DeepCopy() *CollectionStatus { - if in == nil { - return nil - } - out := new(CollectionStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CollectionVersion) DeepCopyInto(out *CollectionVersion) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CollectionVersion. -func (in *CollectionVersion) DeepCopy() *CollectionVersion { - if in == nil { - return nil - } - out := new(CollectionVersion) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CollectionVersionStatus) DeepCopyInto(out *CollectionVersionStatus) { - *out = *in - if in.Pipelines != nil { - in, out := &in.Pipelines, &out.Pipelines - *out = make([]PipelineStatus, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Images != nil { - in, out := &in.Images, &out.Images - *out = make([]Image, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CollectionVersionStatus. -func (in *CollectionVersionStatus) DeepCopy() *CollectionVersionStatus { - if in == nil { - return nil - } - out := new(CollectionVersionStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *EventsCustomizationSpec) DeepCopyInto(out *EventsCustomizationSpec) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventsCustomizationSpec. -func (in *EventsCustomizationSpec) DeepCopy() *EventsCustomizationSpec { - if in == nil { - return nil - } - out := new(EventsCustomizationSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *EventsStatus) DeepCopyInto(out *EventsStatus) { - *out = *in - if in.Hostnames != nil { - in, out := &in.Hostnames, &out.Hostnames - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventsStatus. -func (in *EventsStatus) DeepCopy() *EventsStatus { - if in == nil { - return nil - } - out := new(EventsStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *GithubConfig) DeepCopyInto(out *GithubConfig) { - *out = *in - if in.Teams != nil { - in, out := &in.Teams, &out.Teams - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GithubConfig. -func (in *GithubConfig) DeepCopy() *GithubConfig { - if in == nil { - return nil - } - out := new(GithubConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Image) DeepCopyInto(out *Image) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Image. -func (in *Image) DeepCopy() *Image { - if in == nil { - return nil - } - out := new(Image) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *InstanceCollectionConfig) DeepCopyInto(out *InstanceCollectionConfig) { - *out = *in - if in.Repositories != nil { - in, out := &in.Repositories, &out.Repositories - *out = make([]RepositoryConfig, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InstanceCollectionConfig. -func (in *InstanceCollectionConfig) DeepCopy() *InstanceCollectionConfig { - if in == nil { - return nil - } - out := new(InstanceCollectionConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Kabanero) DeepCopyInto(out *Kabanero) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Kabanero. -func (in *Kabanero) DeepCopy() *Kabanero { - if in == nil { - return nil - } - out := new(Kabanero) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Kabanero) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KabaneroCheInstanceStatus) DeepCopyInto(out *KabaneroCheInstanceStatus) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KabaneroCheInstanceStatus. -func (in *KabaneroCheInstanceStatus) DeepCopy() *KabaneroCheInstanceStatus { - if in == nil { - return nil - } - out := new(KabaneroCheInstanceStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KabaneroCheSpec) DeepCopyInto(out *KabaneroCheSpec) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KabaneroCheSpec. -func (in *KabaneroCheSpec) DeepCopy() *KabaneroCheSpec { - if in == nil { - return nil - } - out := new(KabaneroCheSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KabaneroCheStatus) DeepCopyInto(out *KabaneroCheStatus) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KabaneroCheStatus. -func (in *KabaneroCheStatus) DeepCopy() *KabaneroCheStatus { - if in == nil { - return nil - } - out := new(KabaneroCheStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KabaneroCliServicesCustomizationSpec) DeepCopyInto(out *KabaneroCliServicesCustomizationSpec) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KabaneroCliServicesCustomizationSpec. -func (in *KabaneroCliServicesCustomizationSpec) DeepCopy() *KabaneroCliServicesCustomizationSpec { - if in == nil { - return nil - } - out := new(KabaneroCliServicesCustomizationSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KabaneroInstanceStatus) DeepCopyInto(out *KabaneroInstanceStatus) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KabaneroInstanceStatus. -func (in *KabaneroInstanceStatus) DeepCopy() *KabaneroInstanceStatus { - if in == nil { - return nil - } - out := new(KabaneroInstanceStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KabaneroLandingCustomizationSpec) DeepCopyInto(out *KabaneroLandingCustomizationSpec) { - *out = *in - if in.Enable != nil { - in, out := &in.Enable, &out.Enable - *out = new(bool) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KabaneroLandingCustomizationSpec. -func (in *KabaneroLandingCustomizationSpec) DeepCopy() *KabaneroLandingCustomizationSpec { - if in == nil { - return nil - } - out := new(KabaneroLandingCustomizationSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KabaneroLandingPageStatus) DeepCopyInto(out *KabaneroLandingPageStatus) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KabaneroLandingPageStatus. -func (in *KabaneroLandingPageStatus) DeepCopy() *KabaneroLandingPageStatus { - if in == nil { - return nil - } - out := new(KabaneroLandingPageStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KabaneroList) DeepCopyInto(out *KabaneroList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Kabanero, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KabaneroList. -func (in *KabaneroList) DeepCopy() *KabaneroList { - if in == nil { - return nil - } - out := new(KabaneroList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *KabaneroList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KabaneroSpec) DeepCopyInto(out *KabaneroSpec) { - *out = *in - if in.TargetNamespaces != nil { - in, out := &in.TargetNamespaces, &out.TargetNamespaces - *out = make([]string, len(*in)) - copy(*out, *in) - } - in.Github.DeepCopyInto(&out.Github) - in.Collections.DeepCopyInto(&out.Collections) - out.Tekton = in.Tekton - out.CliServices = in.CliServices - in.Landing.DeepCopyInto(&out.Landing) - in.Che.DeepCopyInto(&out.Che) - out.Events = in.Events - out.CollectionController = in.CollectionController - out.AdmissionControllerWebhook = in.AdmissionControllerWebhook - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KabaneroSpec. -func (in *KabaneroSpec) DeepCopy() *KabaneroSpec { - if in == nil { - return nil - } - out := new(KabaneroSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KabaneroStatus) DeepCopyInto(out *KabaneroStatus) { - *out = *in - out.KabaneroInstance = in.KabaneroInstance - out.KnativeEventing = in.KnativeEventing - out.Serverless = in.Serverless - out.Tekton = in.Tekton - in.Cli.DeepCopyInto(&out.Cli) - if in.Landing != nil { - in, out := &in.Landing, &out.Landing - *out = new(KabaneroLandingPageStatus) - **out = **in - } - out.Appsody = in.Appsody - if in.Kappnav != nil { - in, out := &in.Kappnav, &out.Kappnav - *out = new(KappnavStatus) - (*in).DeepCopyInto(*out) - } - if in.Che != nil { - in, out := &in.Che, &out.Che - *out = new(CheStatus) - **out = **in - } - if in.Events != nil { - in, out := &in.Events, &out.Events - *out = new(EventsStatus) - (*in).DeepCopyInto(*out) - } - out.CollectionController = in.CollectionController - out.AdmissionControllerWebhook = in.AdmissionControllerWebhook - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KabaneroStatus. -func (in *KabaneroStatus) DeepCopy() *KabaneroStatus { - if in == nil { - return nil - } - out := new(KabaneroStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KappnavStatus) DeepCopyInto(out *KappnavStatus) { - *out = *in - if in.UiLocations != nil { - in, out := &in.UiLocations, &out.UiLocations - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.ApiLocations != nil { - in, out := &in.ApiLocations, &out.ApiLocations - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KappnavStatus. -func (in *KappnavStatus) DeepCopy() *KappnavStatus { - if in == nil { - return nil - } - out := new(KappnavStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KnativeEventingStatus) DeepCopyInto(out *KnativeEventingStatus) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KnativeEventingStatus. -func (in *KnativeEventingStatus) DeepCopy() *KnativeEventingStatus { - if in == nil { - return nil - } - out := new(KnativeEventingStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KnativeServingStatus) DeepCopyInto(out *KnativeServingStatus) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KnativeServingStatus. -func (in *KnativeServingStatus) DeepCopy() *KnativeServingStatus { - if in == nil { - return nil - } - out := new(KnativeServingStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PipelineStatus) DeepCopyInto(out *PipelineStatus) { - *out = *in - if in.ActiveAssets != nil { - in, out := &in.ActiveAssets, &out.ActiveAssets - *out = make([]RepositoryAssetStatus, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PipelineStatus. -func (in *PipelineStatus) DeepCopy() *PipelineStatus { - if in == nil { - return nil - } - out := new(PipelineStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RepositoryAssetStatus) DeepCopyInto(out *RepositoryAssetStatus) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RepositoryAssetStatus. -func (in *RepositoryAssetStatus) DeepCopy() *RepositoryAssetStatus { - if in == nil { - return nil - } - out := new(RepositoryAssetStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RepositoryConfig) DeepCopyInto(out *RepositoryConfig) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RepositoryConfig. -func (in *RepositoryConfig) DeepCopy() *RepositoryConfig { - if in == nil { - return nil - } - out := new(RepositoryConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServerlessStatus) DeepCopyInto(out *ServerlessStatus) { - *out = *in - out.KnativeServing = in.KnativeServing - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServerlessStatus. -func (in *ServerlessStatus) DeepCopy() *ServerlessStatus { - if in == nil { - return nil - } - out := new(ServerlessStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TektonCustomizationSpec) DeepCopyInto(out *TektonCustomizationSpec) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TektonCustomizationSpec. -func (in *TektonCustomizationSpec) DeepCopy() *TektonCustomizationSpec { - if in == nil { - return nil - } - out := new(TektonCustomizationSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TektonStatus) DeepCopyInto(out *TektonStatus) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TektonStatus. -func (in *TektonStatus) DeepCopy() *TektonStatus { - if in == nil { - return nil - } - out := new(TektonStatus) - in.DeepCopyInto(out) - return out -} diff --git a/pkg/apis/kabanero/v1alpha1/zz_generated.defaults.go b/pkg/apis/kabanero/v1alpha1/zz_generated.defaults.go deleted file mode 100644 index 7985166a..00000000 --- a/pkg/apis/kabanero/v1alpha1/zz_generated.defaults.go +++ /dev/null @@ -1,16 +0,0 @@ -// +build !ignore_autogenerated - -// Code generated by defaulter-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// RegisterDefaults adds defaulters functions to the given scheme. -// Public to allow building arbitrary schemes. -// All generated defaulters are covering - they call all nested defaulters. -func RegisterDefaults(scheme *runtime.Scheme) error { - return nil -} diff --git a/pkg/apis/kabanero/v1alpha1/zz_generated.openapi.go b/pkg/apis/kabanero/v1alpha1/zz_generated.openapi.go deleted file mode 100644 index 6b4289e4..00000000 --- a/pkg/apis/kabanero/v1alpha1/zz_generated.openapi.go +++ /dev/null @@ -1,443 +0,0 @@ -// +build !ignore_autogenerated - -// This file was autogenerated by openapi-gen. Do not edit it manually! - -package v1alpha1 - -import ( - spec "github.com/go-openapi/spec" - common "k8s.io/kube-openapi/pkg/common" -) - -func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { - return map[string]common.OpenAPIDefinition{ - "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.Collection": schema_pkg_apis_kabanero_v1alpha1_Collection(ref), - "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CollectionSpec": schema_pkg_apis_kabanero_v1alpha1_CollectionSpec(ref), - "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CollectionStatus": schema_pkg_apis_kabanero_v1alpha1_CollectionStatus(ref), - "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.Kabanero": schema_pkg_apis_kabanero_v1alpha1_Kabanero(ref), - "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KabaneroSpec": schema_pkg_apis_kabanero_v1alpha1_KabaneroSpec(ref), - "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KabaneroStatus": schema_pkg_apis_kabanero_v1alpha1_KabaneroStatus(ref), - } -} - -func schema_pkg_apis_kabanero_v1alpha1_Collection(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "Collection is the Schema for the collections API", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), - }, - }, - "spec": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CollectionSpec"), - }, - }, - "status": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CollectionStatus"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CollectionSpec", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CollectionStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, - } -} - -func schema_pkg_apis_kabanero_v1alpha1_CollectionSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "CollectionSpec defines the desired composition of a Collection", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "repositoryUrl": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "skipCertVerification": { - SchemaProps: spec.SchemaProps{ - Type: []string{"boolean"}, - Format: "", - }, - }, - "name": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "version": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "desiredState": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "versions": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "set", - }, - }, - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CollectionVersion"), - }, - }, - }, - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CollectionVersion"}, - } -} - -func schema_pkg_apis_kabanero_v1alpha1_CollectionStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "CollectionStatus defines the observed state of a collection", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "activeVersion": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "activeLocation": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "activePipelines": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "set", - }, - }, - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.PipelineStatus"), - }, - }, - }, - }, - }, - "availableVersion": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "availableLocation": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "status": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "statusMessage": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "images": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "set", - }, - }, - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.Image"), - }, - }, - }, - }, - }, - "versions": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "set", - }, - }, - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CollectionVersionStatus"), - }, - }, - }, - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CollectionVersionStatus", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.Image", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.PipelineStatus"}, - } -} - -func schema_pkg_apis_kabanero_v1alpha1_Kabanero(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), - }, - }, - "spec": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KabaneroSpec"), - }, - }, - "status": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KabaneroStatus"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KabaneroSpec", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KabaneroStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, - } -} - -func schema_pkg_apis_kabanero_v1alpha1_KabaneroSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "KabaneroSpec defines the desired state of Kabanero", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "version": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "targetNamespaces": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "set", - }, - }, - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - "github": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.GithubConfig"), - }, - }, - "collections": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.InstanceCollectionConfig"), - }, - }, - "tekton": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.TektonCustomizationSpec"), - }, - }, - "cliServices": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KabaneroCliServicesCustomizationSpec"), - }, - }, - "landing": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KabaneroLandingCustomizationSpec"), - }, - }, - "che": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CheCustomizationSpec"), - }, - }, - "events": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.EventsCustomizationSpec"), - }, - }, - "collectionController": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CollectionControllerSpec"), - }, - }, - "admissionControllerWebhook": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.AdmissionControllerWebhookCustomizationSpec"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.AdmissionControllerWebhookCustomizationSpec", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CheCustomizationSpec", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CollectionControllerSpec", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.EventsCustomizationSpec", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.GithubConfig", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.InstanceCollectionConfig", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KabaneroCliServicesCustomizationSpec", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KabaneroLandingCustomizationSpec", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.TektonCustomizationSpec"}, - } -} - -func schema_pkg_apis_kabanero_v1alpha1_KabaneroStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "KabaneroStatus defines the observed state of the Kabanero instance.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kabaneroInstance": { - SchemaProps: spec.SchemaProps{ - Description: "Kabanero operator instance readiness status. The status is directly correlated to the availability of resources dependencies.", - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KabaneroInstanceStatus"), - }, - }, - "knativeEventing": { - SchemaProps: spec.SchemaProps{ - Description: "Knative eventing instance readiness status.", - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KnativeEventingStatus"), - }, - }, - "serverless": { - SchemaProps: spec.SchemaProps{ - Description: "OpenShift serverless operator status.", - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.ServerlessStatus"), - }, - }, - "tekton": { - SchemaProps: spec.SchemaProps{ - Description: "Tekton instance readiness status.", - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.TektonStatus"), - }, - }, - "cli": { - SchemaProps: spec.SchemaProps{ - Description: "CLI readiness status.", - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CliStatus"), - }, - }, - "landing": { - SchemaProps: spec.SchemaProps{ - Description: "Kabanero Landing page readiness status.", - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KabaneroLandingPageStatus"), - }, - }, - "appsody": { - SchemaProps: spec.SchemaProps{ - Description: "Appsody instance readiness status.", - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.AppsodyStatus"), - }, - }, - "kappnav": { - SchemaProps: spec.SchemaProps{ - Description: "Kabanero Application Navigator instance readiness status.", - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KappnavStatus"), - }, - }, - "che": { - SchemaProps: spec.SchemaProps{ - Description: "Che instance readiness status.", - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CheStatus"), - }, - }, - "events": { - SchemaProps: spec.SchemaProps{ - Description: "Events instance status", - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.EventsStatus"), - }, - }, - "collectionController": { - SchemaProps: spec.SchemaProps{ - Description: "Kabanero collection controller readiness status.", - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CollectionControllerStatus"), - }, - }, - "admissionControllerWebhook": { - SchemaProps: spec.SchemaProps{ - Description: "Admission webhook instance status", - Ref: ref("github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.AdmissionControllerWebhookStatus"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.AdmissionControllerWebhookStatus", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.AppsodyStatus", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CheStatus", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CliStatus", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.CollectionControllerStatus", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.EventsStatus", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KabaneroInstanceStatus", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KabaneroLandingPageStatus", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KappnavStatus", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.KnativeEventingStatus", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.ServerlessStatus", "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1.TektonStatus"}, - } -} diff --git a/pkg/controller/collection/archive.go b/pkg/controller/collection/archive.go deleted file mode 100644 index 129e3457..00000000 --- a/pkg/controller/collection/archive.go +++ /dev/null @@ -1,269 +0,0 @@ -package collection - -import ( - "archive/tar" - "bytes" - "compress/gzip" - "crypto/sha256" - "encoding/hex" - "errors" - "fmt" - "io" - "strings" - "unicode" - - "github.com/go-logr/logr" - yml "gopkg.in/yaml.v2" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/util/yaml" -) - -// Collection archive manifest.yaml -type CollectionManifest struct { - Contents []CollectionContents `yaml:"contents,omitempty"` -} - -type CollectionContents struct { - File string `yaml:"file,omitempty"` - Sha256 string `yaml:"sha256,omitempty"` -} - -// This is the rendered asset, including its sha256 from the manifest. -type CollectionAsset struct { - Name string - Group string - Version string - Kind string - Sha256 string - Yaml unstructured.Unstructured -} - -func DownloadToByte(url string) ([]byte, error) { - return getFromCache(url, false) -} - -// Print something that looks similar to xxd output -func commTrace(buffer []byte) string { - var sb strings.Builder - for bytesLeft := len(buffer); bytesLeft > 0; { - var bytesThisRound []byte - if bytesLeft >= 16 { - bytesThisRound = buffer[len(buffer)-bytesLeft:len(buffer)-bytesLeft+16] - } else { - bytesThisRound = buffer[len(buffer)-bytesLeft:] - } - - // Build up the line to print - sb.WriteString(fmt.Sprintf("%.08X: ", len(buffer)-bytesLeft)) - for i := 0; i < 16; i = i + 2 { - x := len(bytesThisRound) - i - if x >= 2 { - sb.WriteString(fmt.Sprintf("%.04X ", bytesThisRound[i:i+2])) - } else if x == 1 { - sb.WriteString(fmt.Sprintf("%.02X ", bytesThisRound[i])) - } else { - sb.WriteString(" ") - } - } - - for _, b := range bytesThisRound { - if unicode.IsPrint(rune(b)) { - sb.WriteByte(b) - } else { - sb.WriteString(".") - } - } - sb.WriteString("\n") - - // Subtract for next loop - bytesLeft -= len(bytesThisRound) - } - - return sb.String() -} - -// Read X bytes from reader. -func readBytesFromReader(size int64, r io.Reader) ([]byte, error) { - b := make([]byte, size) - for bytesLeft := size; bytesLeft > 0; { - i, err := r.Read(b[size-bytesLeft:]) - bytesLeft -= int64(i) - // An EOF error is normal as long as we read all the bytes. - if err != nil { - if err == io.EOF { - if bytesLeft != 0 { - return nil, fmt.Errorf("EOF received before end of file: %v", err.Error()) - } - - break; - } - - // Otherwise, just return the error. - return nil, err - } - } - - return b, nil -} - -//Read the manifests from a tar.gz archive -//It would be better to use the manifest.yaml as the index, and check the signatures -//For now, ignore manifest.yaml and return all other yaml files from the archive -func decodeManifests(archive []byte, renderingContext map[string]interface{}, reqLogger logr.Logger) ([]CollectionAsset, error) { - manifests := []CollectionAsset{} - var collectionmanifest CollectionManifest - - // Read the manifest.yaml from the collection archive - r := bytes.NewReader(archive) - gzReader, err := gzip.NewReader(r) - if err != nil { - return nil, errors.New(fmt.Sprintf("Could not read manifest gzip")) - } - tarReader := tar.NewReader(gzReader) - - foundManifest := false - var headers []string - for { - header, err := tarReader.Next() - - if err == io.EOF { - break - } - - if err != nil { - return nil, errors.New(fmt.Sprintf("Could not read manifest tar")) - } - - headers = append(headers, header.Name) - - switch { - case strings.TrimPrefix(header.Name, "./") == "manifest.yaml": - //Buffer the document for further processing - b, err := readBytesFromReader(header.Size, tarReader) - if err != nil { - return nil, fmt.Errorf("Error reading archive %v: %v", header.Name, err.Error()) - } - err = yml.Unmarshal(b, &collectionmanifest) - if err != nil { - return nil, err - } - foundManifest = true - } - } - - reqLogger.Info(fmt.Sprintf("Header names: %v", strings.Join(headers, ","))) - - if foundManifest != true { - return nil, fmt.Errorf("Error reading archive, unable to read manifest.yaml") - } - - // Re-Read the archive and validate against archive manifest.yaml - r = bytes.NewReader(archive) - gzReader, err = gzip.NewReader(r) - if err != nil { - return nil, errors.New(fmt.Sprintf("Could not read manifest gzip")) - } - tarReader = tar.NewReader(gzReader) - - for { - header, err := tarReader.Next() - - if err == io.EOF { - break - } - - if err != nil { - return nil, errors.New(fmt.Sprintf("Could not read manifest tar")) - } - - // Ignore manifest.yaml on this pass, only read yaml files - switch { - case strings.TrimPrefix(header.Name, "./") == "manifest.yaml": - break - case strings.HasSuffix(header.Name, ".yaml"): - //Buffer the document for further processing - b, err := readBytesFromReader(header.Size, tarReader) - if err != nil { - return nil, fmt.Errorf("Error reading archive %v: %v", header.Name, err.Error()) - } - - // Checksum. Lookup the read file in the index and compare sha256 - match := false - b_sum := sha256.Sum256(b) - assetSumString := "" - for _, content := range collectionmanifest.Contents { - if content.File == strings.TrimPrefix(header.Name, "./") { - // Older releases may not have a sha256 in the manifest.yaml - assetSumString = content.Sha256 - if content.Sha256 != "" { - var c_sum [32]byte - decoded, err := hex.DecodeString(content.Sha256) - if err != nil { - return nil, err - } - copy(c_sum[:], decoded) - if b_sum != c_sum { - return nil, fmt.Errorf("Archive file: %v manifest.yaml checksum: %x did not match file checksum: %x", header.Name, c_sum, b_sum) - } - match = true - } else { - // Would be nice if we could make this a warning message, but it seems like the only - // options are error and info. It's possible that some implementation has other methods - // but someone needs to investigate. - reqLogger.Info(fmt.Sprintf("Archive file %v was listed in the manifest but had no checksum. Checksum validation for this file is skipped.", header.Name)) - match = true - } - } - } - if match != true { - return nil, fmt.Errorf("File %v was found in the archive, but not in the manifest.yaml", header.Name) - } - - //Apply the Kabanero yaml directive processor - s := &DirectiveProcessor{} - b, err = s.Render(b, renderingContext) - if err != nil { - return nil, fmt.Errorf("Error processing directives %v: %v", header.Name, err.Error()) - } - - decoder := yaml.NewYAMLToJSONDecoder(bytes.NewReader(b)) - out := unstructured.Unstructured{} - for err = decoder.Decode(&out); err == nil; { - gvk := out.GroupVersionKind() - manifests = append(manifests, CollectionAsset{Name: out.GetName(), Group: gvk.Group, Version: gvk.Version, Kind: gvk.Kind, Yaml: out, Sha256: assetSumString}) - out = unstructured.Unstructured{} - err = decoder.Decode(&out) - } - - if (err != nil) && (err != io.EOF) { - return nil, fmt.Errorf("Error decoding %v: %v", header.Name, err.Error()) - } - } - } - return manifests, nil -} - -func GetManifests(url string, checksum string, renderingContext map[string]interface{}, reqLogger logr.Logger) ([]CollectionAsset, error) { - b, err := DownloadToByte(url) - if err != nil { - return nil, err - } - - b_sum := sha256.Sum256(b) - var c_sum [32]byte - decoded, err := hex.DecodeString(checksum) - if err != nil { - return nil, err - } - copy(c_sum[:], decoded) - - if b_sum != c_sum { - return nil, fmt.Errorf("Index checksum: %x not match download checksum: %x", c_sum, b_sum) - } - - manifests, err := decodeManifests(b, renderingContext, reqLogger) - if err != nil { - return nil, err - } - return manifests, err -} diff --git a/pkg/controller/collection/archive_test.go b/pkg/controller/collection/archive_test.go deleted file mode 100644 index 9e64c6a0..00000000 --- a/pkg/controller/collection/archive_test.go +++ /dev/null @@ -1,59 +0,0 @@ -package collection - -import ( - "fmt" - "testing" - logf "sigs.k8s.io/controller-runtime/pkg/log" -) - -func TestGetManifests(t *testing.T) { - reqLogger := logf.NullLogger{} - sha256 := "8eacd2a6870c2b7c729ae1441cc58d6f1356bde08a022875f9f50bca8fc66543" - manifests, err := GetManifests("https://github.com/kabanero-io/collections/releases/download/v0.0.1/incubator.java-microprofile.pipeline.default.tar.gz", sha256, map[string]interface{}{"CollectionName": "Eclipse Microprofile", "CollectionId": "java-microprofile"}, reqLogger) - if err != nil { - t.Fatal(err) - } - - for _, manifest := range manifests { - t.Log(manifest) - } -} - -func TestCommTraceZero(t *testing.T) { - out := commTrace(nil) - if out != "" { - t.Fatal(fmt.Sprintf("Trace of zero bytes should yield an empty string, but got: %v", out)) - } -} - -func TestCommTraceSixteen(t *testing.T) { - buffer := "1234567890123456" - out := commTrace([]byte(buffer)) - if out != "00000000: 3132 3334 3536 3738 3930 3132 3334 3536 1234567890123456\n" { - t.Fatal(fmt.Sprintf("Trace of 16 bytes incorrect output: %v", out)) - } -} - -func TestCommTraceEight(t *testing.T) { - buffer := "12345678" - out := commTrace([]byte(buffer)) - if out != "00000000: 3132 3334 3536 3738 12345678\n" { - t.Fatal(fmt.Sprintf("Trace of 8 bytes incorrect output: %v", out)) - } -} - -func TestCommTraceNine(t *testing.T) { - buffer := "123456789" - out := commTrace([]byte(buffer)) - if out != "00000000: 3132 3334 3536 3738 39 123456789\n" { - t.Fatal(fmt.Sprintf("Trace of 9 bytes incorrect output: %v", out)) - } -} - -func TestCommTraceThirtyTwo(t *testing.T) { - buffer := "12345678901234567890123456789012" - out := commTrace([]byte(buffer)) - if out != "00000000: 3132 3334 3536 3738 3930 3132 3334 3536 1234567890123456\n00000010: 3738 3930 3132 3334 3536 3738 3930 3132 7890123456789012\n" { - t.Fatal(fmt.Sprintf("Trace of 9 bytes incorrect output: %v", out)) - } -} diff --git a/pkg/controller/collection/collection.go b/pkg/controller/collection/collection.go deleted file mode 100644 index 89c98fc8..00000000 --- a/pkg/controller/collection/collection.go +++ /dev/null @@ -1,55 +0,0 @@ -package collection - -// Collection holds collection specific data. -type Collection struct { - DefaultDashboard string `yaml:"default-dashboard,omitempty"` - DefaultImage string `yaml:"default-image,omitempty"` - DefaultPipeline string `yaml:"default-pipeline,omitempty"` - DefaultTemplate string `yaml:"default-template,omitempty"` - Description string `yaml:"description,omitempty"` - Id string `yaml:"id,omitempty"` - Images []Images `yaml:"images,omitempty"` - License string `yaml:"license,omitempty"` - Maintainers []Maintainers `yaml:"maintainers,omitempty"` - Name string `yaml:"name,omitempty"` - Pipelines []Pipelines `yaml:"pipelines,omitempty"` - Templates []Templates `yaml:"templates,omitempty"` - Version string `yaml:"version,omitempty"` -} - -// Images holds a collection image data. -type Images struct { - Id string `yaml:"id,omitempty"` - Image string `yaml:"image,omitempty"` -} - -// Maintainers holds collection maintainer information. -type Maintainers struct { - Email string `yaml:"email,omitempty"` - GithubId string `yaml:"github-id,omitempty"` - Name string `yaml:"name,omitempty"` -} - -// Pipelines holds a collection's associated pipeline data. -type Pipelines struct { - Id string `yaml:"id,omitempty"` - Sha256 string `yaml:"sha256,omitempty"` - Url string `yaml:"url,omitempty"` -} - -// Templates holds the collection's associated template data. -type Templates struct { - Id string `yaml:"id,omitempty"` - Url string `yaml:"url,omitempty"` -} - -// PipelineManifest holds the collection's associated pipeline manifests. -type PipelineManifest struct { - Contents []PipelineFiles `yaml:"contents,omitempty"` -} - -// PipelineFiles holds the collection's associated pipeline files. -type PipelineFiles struct { - File string `yaml:"file,omitempty"` - Sha256 string `yaml:"sha256,omitempty"` -} diff --git a/pkg/controller/collection/collection_controller.go b/pkg/controller/collection/collection_controller.go deleted file mode 100644 index 6251594e..00000000 --- a/pkg/controller/collection/collection_controller.go +++ /dev/null @@ -1,514 +0,0 @@ -package collection - -import ( - "context" - "fmt" - - "github.com/go-logr/logr" - kabanerov1alpha1 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1" - kabanerov1alpha2 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha2" - sutils "github.com/kabanero-io/kabanero-operator/pkg/controller/stack/utils" - pipelinev1alpha1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/handler" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/predicate" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" -) - -var log = logf.Log.WithName("controller_collection") - -const ( - // Finalizer. - collectionFinalizerName = "kabanero.io/collection-controller" -) - -// Add creates a new Collection Controller and adds it to the Manager. The Manager will set fields on the Controller -// and Start it when the Manager is Started. -func Add(mgr manager.Manager) error { - return add(mgr, newReconciler(mgr)) -} - -// newReconciler returns a new reconcile.Reconciler -func newReconciler(mgr manager.Manager) reconcile.Reconciler { - return &ReconcileCollection{client: mgr.GetClient(), scheme: mgr.GetScheme(), indexResolver: ResolveIndex} -} - -// add adds a new Controller to mgr with r as the reconcile.Reconciler -func add(mgr manager.Manager, r reconcile.Reconciler) error { - // Create a new controller - c, err := controller.New("collection-controller", mgr, controller.Options{Reconciler: r}) - if err != nil { - return err - } - - // Create Collection predicate - cPred := predicate.Funcs{ - GenericFunc: func(e event.GenericEvent) bool { - return false - }, - UpdateFunc: func(e event.UpdateEvent) bool { - // Returning true only when the metadata generation has changed, - // allows us to ignore events where only the object status has changed, - // since the generation is not incremented when only the status changes - return e.MetaOld.GetGeneration() != e.MetaNew.GetGeneration() - }, - } - - // Watch for changes to primary resource Collection - err = c.Watch(&source.Kind{Type: &kabanerov1alpha1.Collection{}}, &handler.EnqueueRequestForObject{}, cPred) - if err != nil { - return err - } - - // Create a handler for handling Tekton Pipeline & Task events - tH := &handler.EnqueueRequestForOwner{ - IsController: true, - OwnerType: &kabanerov1alpha1.Collection{}, - } - - // Create Tekton predicate - tPred := predicate.Funcs{ - CreateFunc: func(e event.CreateEvent) bool { - // ignore Create. Collection create applies the documents. Watch would unnecessarily requeue. - return false - }, - GenericFunc: func(e event.GenericEvent) bool { - return false - }, - UpdateFunc: func(e event.UpdateEvent) bool { - // Returning true only when the metadata generation has changed, - // allows us to ignore events where only the object status has changed, - // since the generation is not incremented when only the status changes - return e.MetaOld.GetGeneration() != e.MetaNew.GetGeneration() - }, - } - - // Watch for changes to Collection Tekton Pipeline objects - err = c.Watch(&source.Kind{Type: &pipelinev1alpha1.Pipeline{}}, tH, tPred) - if err != nil { - log.Info(fmt.Sprintf("Tekton Pipelines may not be installed")) - return err - } - - err = c.Watch(&source.Kind{Type: &pipelinev1alpha1.Task{}}, tH, tPred) - if err != nil { - log.Info(fmt.Sprintf("Tekton Pipelines may not be installed")) - return err - } - - return nil -} - -// blank assignment to verify that ReconcileCollection implements reconcile.Reconciler -var _ reconcile.Reconciler = &ReconcileCollection{} - -// ReconcileCollection reconciles a Collection object -type ReconcileCollection struct { - // This client, initialized using mgr.Client() above, is a split client - // that reads objects from the cache and writes to the apiserver - client client.Client - scheme *runtime.Scheme - - //The indexResolver which will be used during reconciliation - indexResolver func(kabanerov1alpha1.RepositoryConfig, []Pipelines, []Trigger, string) (*Index, error) -} - -// Reconcile processes collection resource instances. -// The Controller will requeue the Request to be processed again if the returned error is non-nil or -// Result.Requeue is true, otherwise upon completion it will remove the work from the queue. -// NOTE: -// Collection resources are deprecated as of Kabanero Operator version 0.6.0 and are replaced with Stack resources. -// Therefore, the function of this controller is to handle collection migration to stacks and collection deletion. -func (r *ReconcileCollection) Reconcile(request reconcile.Request) (reconcile.Result, error) { - ctx := context.Background() - - reqLogger := log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name) - reqLogger.Info("Reconciling Collection") - - // Fetch the Collection instance - instance := &kabanerov1alpha1.Collection{} - err := r.client.Get(context.TODO(), request.NamespacedName, instance) - if err != nil { - if errors.IsNotFound(err) { - return reconcile.Result{}, nil - } - return reconcile.Result{}, err - } - - // Resolve the kabanero instance - var k *kabanerov1alpha1.Kabanero - l := kabanerov1alpha1.KabaneroList{} - err = r.client.List(context.Background(), &l, client.InNamespace(instance.GetNamespace())) - if err != nil { - return reconcile.Result{}, err - } - for _, _k := range l.Items { - k = &_k - } - reqLogger.Info("Resolved Kabanero", "kabanero", k) - - // If the collection is being deleted, and our finalizer is set, process it. - beingDeleted, err := processDeletion(ctx, instance, r.client, reqLogger) - if err != nil { - return reconcile.Result{}, err - } - - if beingDeleted { - return reconcile.Result{}, nil - } - - // The collection is not being deleted. Migrate the collection to a stack. - collectionName := instance.ObjectMeta.Name - collectionNamespace := instance.ObjectMeta.Namespace - - // Before we convert the collection instance to a stack instance, see if - // the stack with that same name in the same namespace is already available. - stack := kabanerov1alpha2.Stack{} - name := types.NamespacedName{ - Name: collectionName, - Namespace: collectionNamespace, - } - - err = r.client.Get(context.TODO(), name, &stack) - if err != nil { - if errors.IsNotFound(err) { - stackInstance, err := r.convertCollectionToStack(k, instance) - - if err != nil { - reqLogger.Error(err, fmt.Sprintf("Unable convert collection with the name of %v to stack.", collectionName)) - return reconcile.Result{}, err - } - - err = r.client.Create(context.TODO(), stackInstance) - if err != nil { - reqLogger.Error(err, fmt.Sprintf("Unable create a stack from collection with the name of %v.", collectionName)) - return reconcile.Result{}, err - } - } else { - return reconcile.Result{}, err - } - } - - // Clean up existing collection assets. - err = deleteCollection(r.client, instance, reqLogger) - if err != nil { - reqLogger.Error(err, fmt.Sprintf("Unable delete collection with the name of %v.", collectionName)) - return reconcile.Result{}, err - } - - return reconcile.Result{}, nil -} - -// Converts a collection to a stack. -func (r *ReconcileCollection) convertCollectionToStack(k *kabanerov1alpha1.Kabanero, collection *kabanerov1alpha1.Collection) (*kabanerov1alpha2.Stack, error) { - ownerIsController := true - stackInstance := &kabanerov1alpha2.Stack{ - ObjectMeta: metav1.ObjectMeta{ - Name: collection.ObjectMeta.Name, - Namespace: collection.ObjectMeta.Namespace, - OwnerReferences: []metav1.OwnerReference{ - metav1.OwnerReference{ - APIVersion: k.TypeMeta.APIVersion, - Kind: k.TypeMeta.Kind, - Name: k.ObjectMeta.Name, - UID: k.ObjectMeta.UID, - Controller: &ownerIsController, - }, - }, - }, - Spec: kabanerov1alpha2.StackSpec{ - Name: collection.Spec.Name, - }, - } - - // Add the versions field. - cCopy := collection.DeepCopy() - if len(collection.Spec.Versions) == 0 && len(collection.Spec.Version) != 0 { - cCopy.Spec.Versions = []kabanerov1alpha1.CollectionVersion{{ - RepositoryUrl: collection.Spec.RepositoryUrl, - Version: collection.Spec.Version, - DesiredState: collection.Spec.DesiredState, - SkipCertVerification: collection.Spec.SkipCertVerification, - }} - } - err := r.processVersionsField(k, stackInstance, cCopy) - if err != nil { - return nil, err - } - - return stackInstance, nil -} - -// Adds collection information to the versions field of the input stack object. -func (r *ReconcileCollection) processVersionsField(k *kabanerov1alpha1.Kabanero, stackInstance *kabanerov1alpha2.Stack, collection *kabanerov1alpha1.Collection) error { - stackInstance.Spec.Versions = make([]kabanerov1alpha2.StackVersion, len(collection.Spec.Versions)) - - for i, cv := range collection.Spec.Versions { - stackInstance.Spec.Versions[i] = kabanerov1alpha2.StackVersion{ - Version: cv.Version, - DesiredState: cv.DesiredState, - SkipCertVerification: cv.SkipCertVerification, - } - - // Add pipelines and images entries to the stack's versions field. - // This information is obtained from the collection's status fields. However, if there is reason to believe - // that the data reported in the collection's status fields is not accurate or it does not exists, try to - // get the information from the index specified in the kabanero instance. - var images []kabanerov1alpha1.Image = []kabanerov1alpha1.Image{} - var pipelines []kabanerov1alpha1.PipelineStatus = []kabanerov1alpha1.PipelineStatus{} - for _, scvData := range collection.Status.Versions { - if cv.Version == scvData.Version { - images = scvData.Images - pipelines = scvData.Pipelines - break - } - } - - if collection.Status.Status != kabanerov1alpha1.CollectionDesiredStateActive || len(images) == 0 || len(pipelines) == 0 { - collections, err := r.readCollectionsFromIndex(k) - if err != nil { - return err - } - - cByNameMap, ok := collections[collection.Spec.Name] - if ok { - indexCollection, ok := cByNameMap[cv.Version] - if ok { - stackInstance.Spec.Versions[i].Images = make([]kabanerov1alpha2.Image, len(indexCollection.Images)) - for j, m := range indexCollection.Images { - repo, err := sutils.GetImageRepository(m.Image) - if err != nil { - return fmt.Errorf(fmt.Sprintf("Collection %v %v contained an invalid image. Image: %v. Error: %v", collection.Spec.Name, collection.Spec.Versions[i].Version, m.Image, err)) - } - stackInstance.Spec.Versions[i].Images[j].Image = repo - stackInstance.Spec.Versions[i].Images[j].Id = m.Id - } - - stackInstance.Spec.Versions[i].Pipelines = make([]kabanerov1alpha2.PipelineSpec, len(indexCollection.Pipelines)) - for k, p := range indexCollection.Pipelines { - stackInstance.Spec.Versions[i].Pipelines[k].Id = p.Id - stackInstance.Spec.Versions[i].Pipelines[k].Sha256 = p.Sha256 - stackInstance.Spec.Versions[i].Pipelines[k].Https.Url = p.Url - } - - continue - } - } - - err = fmt.Errorf(fmt.Sprintf("Collection with the name of %v and version of %v was not found in kabanero configured indexes.", collection.Name, cv.Version)) - return err - } - - // Copy data from the status section - stackInstance.Spec.Versions[i].Images = make([]kabanerov1alpha2.Image, len(images)) - for j, m := range images { - repo, err := sutils.GetImageRepository(m.Image) - if err != nil { - return fmt.Errorf(fmt.Sprintf("Collection %v %v contained an invalid image. Image: %v. Error: %v", collection.Spec.Name, collection.Spec.Versions[i].Version, m.Image, err)) - } - stackInstance.Spec.Versions[i].Images[j].Image = repo - stackInstance.Spec.Versions[i].Images[j].Id = m.Id - } - stackInstance.Spec.Versions[i].Pipelines = make([]kabanerov1alpha2.PipelineSpec, len(pipelines)) - for k, p := range pipelines { - stackInstance.Spec.Versions[i].Pipelines[k].Id = p.Name - stackInstance.Spec.Versions[i].Pipelines[k].Sha256 = p.Digest - stackInstance.Spec.Versions[i].Pipelines[k].Https.Url = p.Url - } - } - - return nil -} - -// Retrieves all collection objects associated with the kabanero specified indexes. -func (r *ReconcileCollection) readCollectionsFromIndex(k *kabanerov1alpha1.Kabanero) (map[string]map[string]Collection, error) { - collectionMap := make(map[string]map[string]Collection) - for _, repo := range k.Spec.Collections.Repositories { - index, err := r.indexResolver(repo, []Pipelines{}, []Trigger{}, "") - if err != nil { - return nil, err - } - versionMap := make(map[string]Collection) - for i, c := range index.Collections { - versionMap[index.Collections[i].Version] = c - collectionMap[c.Id] = versionMap - } - } - - return collectionMap, nil -} - -// Deletes the specified collection. -func deleteCollection(c client.Client, collection *kabanerov1alpha1.Collection, reqLogger logr.Logger) error { - // Clean up existing collection assets. - err := cleanupAssets(context.TODO(), collection, c, reqLogger) - if err != nil { - reqLogger.Error(err, "Error during cleanup processing.") - return err - } - - // Remove the finalizer entry from the instance. - err = removeCollectionFinalizer(context.TODO(), collection, c, reqLogger) - if err != nil { - reqLogger.Error(err, "Error while attempting to remove the finalizer.") - return err - } - - // Delete the collection. - err = c.Delete(context.TODO(), collection) - if err != nil { - reqLogger.Error(err, "Error while attempting to remove the finalizer.") - return err - } - - return nil -} - -// Drives collection instance deletion processing. This includes creating a finalizer, handling -// collection instance cleanup logic, and finalizer removal. -func processDeletion(ctx context.Context, collection *kabanerov1alpha1.Collection, c client.Client, reqLogger logr.Logger) (bool, error) { - // The collection instance is not deleted. Create a finalizer if it was not created already. - foundFinalizer := false - for _, finalizer := range collection.Finalizers { - if finalizer == collectionFinalizerName { - foundFinalizer = true - } - } - - beingDeleted := !collection.DeletionTimestamp.IsZero() - if !beingDeleted { - if !foundFinalizer { - collection.Finalizers = append(collection.Finalizers, collectionFinalizerName) - err := c.Update(ctx, collection) - if err != nil { - reqLogger.Error(err, "Unable to set the collection controller finalizer.") - return beingDeleted, err - } - } - - return beingDeleted, nil - } - - // The instance is being deleted. - if foundFinalizer { - // Drive collection cleanup processing. - err := cleanupAssets(ctx, collection, c, reqLogger) - if err != nil { - reqLogger.Error(err, "Error during cleanup processing.") - return beingDeleted, err - } - - // Remove the finalizer entry from the instance. - err = removeCollectionFinalizer(ctx, collection, c, reqLogger) - if err != nil { - reqLogger.Error(err, "Error while attempting to remove the finalizer.") - return beingDeleted, err - } - } - - return beingDeleted, nil -} - -// Removes the collection finalizer. -func removeCollectionFinalizer(ctx context.Context, collection *kabanerov1alpha1.Collection, c client.Client, reqLogger logr.Logger) error { - var newFinalizerList []string - for _, finalizer := range collection.Finalizers { - if finalizer == collectionFinalizerName { - continue - } - newFinalizerList = append(newFinalizerList, finalizer) - } - - collection.Finalizers = newFinalizerList - err := c.Update(ctx, collection) - - return err -} - -// Handles the finalizer cleanup logic for the Collection instance. -func cleanupAssets(ctx context.Context, collection *kabanerov1alpha1.Collection, c client.Client, reqLogger logr.Logger) error { - ownerIsController := false - assetOwner := metav1.OwnerReference{ - APIVersion: collection.APIVersion, - Kind: collection.Kind, - Name: collection.Name, - UID: collection.UID, - Controller: &ownerIsController, - } - - // Run thru the status and delete everything.... we're just going to try once since it's unlikely - // that anything that goes wrong here would be rectified by a retry. - for _, version := range collection.Status.Versions { - for _, pipeline := range version.Pipelines { - for _, asset := range pipeline.ActiveAssets { - // Old assets may not have a namespace set - correct that now. - if len(asset.Namespace) == 0 { - asset.Namespace = collection.GetNamespace() - } - - deleteAsset(c, asset, assetOwner) - } - } - } - - return nil -} - -// Deletes an asset. This can mean removing an object owner, or completely deleting it. -func deleteAsset(c client.Client, asset kabanerov1alpha1.RepositoryAssetStatus, assetOwner metav1.OwnerReference) error { - u := &unstructured.Unstructured{} - u.SetGroupVersionKind(schema.GroupVersionKind{ - Group: asset.Group, - Version: asset.Version, - Kind: asset.Kind, - }) - - err := c.Get(context.Background(), client.ObjectKey{ - Namespace: asset.Namespace, - Name: asset.Name, - }, u) - - if err != nil { - if errors.IsNotFound(err) == false { - log.Error(err, fmt.Sprintf("Unable to check asset name %v", asset.Name)) - return err - } - } else { - // Get the owner references. See if we're the last one. - ownerRefs := u.GetOwnerReferences() - newOwnerRefs := []metav1.OwnerReference{} - for _, ownerRef := range ownerRefs { - if ownerRef.UID != assetOwner.UID { - newOwnerRefs = append(newOwnerRefs, ownerRef) - } - } - - if len(newOwnerRefs) == 0 { - err = c.Delete(context.TODO(), u) - if err != nil { - log.Error(err, fmt.Sprintf("Unable to delete asset name %v", asset.Name)) - return err - } - } else { - u.SetOwnerReferences(newOwnerRefs) - err = c.Update(context.TODO(), u) - if err != nil { - log.Error(err, fmt.Sprintf("Unable to delete owner reference from %v", asset.Name)) - return err - } - } - } - - return nil -} diff --git a/pkg/controller/collection/collection_controller_test.go b/pkg/controller/collection/collection_controller_test.go deleted file mode 100644 index f0073f94..00000000 --- a/pkg/controller/collection/collection_controller_test.go +++ /dev/null @@ -1,360 +0,0 @@ -package collection - -import ( - "fmt" - "testing" - - "github.com/google/go-cmp/cmp" - kabanerov1alpha1 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1" - kabanerov1alpha2 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha2" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -var cPipelines []kabanerov1alpha1.PipelineStatus = []kabanerov1alpha1.PipelineStatus{ - {Name: "commonPipeline", Url: "http://pipelinelink", Digest: "abc121cba"}} - -var cImages []kabanerov1alpha1.Image = []kabanerov1alpha1.Image{ - {Id: "a1b22b1a", Image: "docker.io/kabanero/java-microprofile:0.2"}} - -var cInstance *kabanerov1alpha1.Collection = &kabanerov1alpha1.Collection{ - ObjectMeta: metav1.ObjectMeta{ - Name: "java-microprofile", - Namespace: "Kabanero", - OwnerReferences: []metav1.OwnerReference{ - metav1.OwnerReference{ - APIVersion: "a/1", - Kind: "Kabanero", - Name: "kabanero", - UID: "1234567890", - }, - }, - }, - Spec: kabanerov1alpha1.CollectionSpec{ - Name: "java-microprofile", - Version: "1.2.3", - RepositoryUrl: "https://java-microprofile", - SkipCertVerification: true, - DesiredState: "active", - Versions: []kabanerov1alpha1.CollectionVersion{ - { - Version: "1.2.3", - RepositoryUrl: "https://java-microprofile/1.2.3", - SkipCertVerification: true, - DesiredState: "active", - }, - { - Version: "4.5.6", - RepositoryUrl: "https://java-microprofile/4.5.6", - SkipCertVerification: true, - DesiredState: "active", - }}, - }, - Status: kabanerov1alpha1.CollectionStatus{ - Status: "active", - ActivePipelines: cPipelines, - Images: cImages, - Versions: []kabanerov1alpha1.CollectionVersionStatus{ - { - Version: "1.2.3", - Pipelines: cPipelines, - Images: cImages, - }, - { - Version: "4.5.6", - Pipelines: cPipelines, - Images: cImages, - }, - }, - }, -} - -var sInstance *kabanerov1alpha2.Stack = &kabanerov1alpha2.Stack{ - ObjectMeta: metav1.ObjectMeta{ - Name: "java-microprofile", - Namespace: "Kabanero", - OwnerReferences: []metav1.OwnerReference{ - metav1.OwnerReference{ - APIVersion: "a/1", - Kind: "Kabanero", - Name: "kabanero", - UID: "1234567890", - }, - }, - }, - Spec: kabanerov1alpha2.StackSpec{ - Name: "java-microprofile", - Versions: []kabanerov1alpha2.StackVersion{ - { - Version: "1.2.3", - SkipCertVerification: true, - DesiredState: "active", - Pipelines: []kabanerov1alpha2.PipelineSpec{{Id: "commonPipeline", Sha256: "abc121cba", Https: kabanerov1alpha2.HttpsProtocolFile{Url: "http://pipelinelink"}}}, - Images: []kabanerov1alpha2.Image{{Id: "a1b22b1a", Image: "docker.io/kabanero/java-microprofile"}}, - }, - { - Version: "4.5.6", - SkipCertVerification: true, - DesiredState: "active", - Pipelines: []kabanerov1alpha2.PipelineSpec{{Id: "commonPipeline", Sha256: "abc121cba", Https: kabanerov1alpha2.HttpsProtocolFile{Url: "http://pipelinelink"}}}, - Images: []kabanerov1alpha2.Image{{Id: "a1b22b1a", Image: "docker.io/kabanero/java-microprofile"}}, - }, - }, - }, -} - -var kInstance *kabanerov1alpha1.Kabanero = &kabanerov1alpha1.Kabanero{ - TypeMeta: metav1.TypeMeta{Kind: "Kabanero", - APIVersion: "a/1"}, - ObjectMeta: metav1.ObjectMeta{Name: "kabanero", UID: "1234567890"}, - Spec: kabanerov1alpha1.KabaneroSpec{ - Version: "4.5.6", - Collections: kabanerov1alpha1.InstanceCollectionConfig{ - Repositories: []kabanerov1alpha1.RepositoryConfig{{ - Name: "incubator", - Url: "https://github.com/kabanero-io/collections/releases/download/0.5.0/kabanero-index.yaml", - ActivateDefaultCollections: true, - SkipCertVerification: false, - }}, - }, - }, -} - -var r *ReconcileCollection = &ReconcileCollection{indexResolver: ResolveIndex} - -// Tests a fully deployed collection (status filled in) conversion to stack structure. -func TestConvertNormalCollectionToStack(t *testing.T) { - - expectedStack := *sInstance - stack, err := r.convertCollectionToStack(kInstance, cInstance) - - if err != nil { - t.Fatal(err) - } - - if stack.ObjectMeta.Name != expectedStack.ObjectMeta.Name { - t.Fatal(fmt.Sprintf("The expected stack.ObjectMeta.Name does not match resulting stack.ObjectMeta.Name. Converted: %v. Expected: %v", stack.ObjectMeta.Name, expectedStack.ObjectMeta.Name)) - } - if stack.ObjectMeta.Namespace != expectedStack.ObjectMeta.Namespace { - t.Fatal(fmt.Sprintf("The expected stack.ObjectMeta.Namespace does not match resulting stack.ObjectMeta.Namespace. Converted: %v. Expected: %v", stack.ObjectMeta.Namespace, expectedStack.ObjectMeta.Namespace)) - } - if len(stack.ObjectMeta.OwnerReferences) != 1 { - t.Fatal(fmt.Sprintf("The resulting stack.ObjectMeta.OwnerReferences does not contain an owner entry. It should have one.")) - } - if stack.ObjectMeta.OwnerReferences[0].Kind != kInstance.TypeMeta.Kind { - t.Fatal(fmt.Sprintf("The resulting stack.ObjectMeta.OwnerReferences[0].Kind does not match expected kInstance.TypeMeta.Kind. Converted %v. Expected %v", stack.ObjectMeta.OwnerReferences[0].Kind, kInstance.TypeMeta.Kind)) - } - if stack.ObjectMeta.OwnerReferences[0].UID != kInstance.ObjectMeta.UID { - t.Fatal(fmt.Sprintf("The resulting stack.ObjectMeta.OwnerReferences[0].UID does not match expected kInstance.ObjectMeta.UID. Converted %v. Expected %v", stack.ObjectMeta.OwnerReferences[0].UID, kInstance.ObjectMeta.UID)) - } - if !cmp.Equal(stack.Spec, expectedStack.Spec) { - t.Fatal(fmt.Sprintf("The expected stack and resulting stack are not the same. Coverted: %v. Expected: %v", stack, expectedStack)) - } -} - -// Tests the conversion of a collection resource with no versions[]. -func TestConvertCollectionNoVersionsToStack(t *testing.T) { - expectedStack := sInstance.DeepCopy() - expectedStack.Spec.Versions = []kabanerov1alpha2.StackVersion{ - { - Version: "1.2.3", - SkipCertVerification: true, - DesiredState: "active", - Pipelines: []kabanerov1alpha2.PipelineSpec{{Id: "commonPipeline", Sha256: "abc121cba", Https: kabanerov1alpha2.HttpsProtocolFile{Url: "http://pipelinelink"}}}, - Images: []kabanerov1alpha2.Image{{Id: "a1b22b1a", Image: "docker.io/kabanero/java-microprofile"}}, - }} - tc := cInstance.DeepCopy() - tc.Spec.Versions = nil - - stack, err := r.convertCollectionToStack(kInstance, tc) - if err != nil { - t.Fatal(err) - } - - if stack.ObjectMeta.Name != expectedStack.ObjectMeta.Name { - t.Fatal(fmt.Sprintf("The expected stack.ObjectMeta.Name does not match resulting stack.ObjectMeta.Name. Converted: %v. Expected: %v", stack.ObjectMeta.Name, expectedStack.ObjectMeta.Name)) - } - if stack.ObjectMeta.Namespace != expectedStack.ObjectMeta.Namespace { - t.Fatal(fmt.Sprintf("The expected stack.ObjectMeta.Namespace does not match resulting stack.ObjectMeta.Namespace. Converted: %v. Expected: %v", stack.ObjectMeta.Namespace, expectedStack.ObjectMeta.Namespace)) - } - if len(stack.ObjectMeta.OwnerReferences) != 1 { - t.Fatal(fmt.Sprintf("The resulting stack.ObjectMeta.OwnerReferences does not contain an owner entry. It should have one.")) - } - if stack.ObjectMeta.OwnerReferences[0].Kind != kInstance.TypeMeta.Kind { - t.Fatal(fmt.Sprintf("The resulting stack.ObjectMeta.OwnerReferences[0].Kind does not match expected kInstance.TypeMeta.Kind. Converted %v. Expected %v", stack.ObjectMeta.OwnerReferences[0].Kind, kInstance.TypeMeta.Kind)) - } - if stack.ObjectMeta.OwnerReferences[0].UID != kInstance.ObjectMeta.UID { - t.Fatal(fmt.Sprintf("The resulting stack.ObjectMeta.OwnerReferences[0].UID does not match expected kInstance.ObjectMeta.UID. Converted %v. Expected %v", stack.ObjectMeta.OwnerReferences[0].UID, kInstance.ObjectMeta.UID)) - } - if !cmp.Equal(stack.Spec, expectedStack.Spec) { - t.Fatal(fmt.Sprintf("The expected stack and resulting stack are not the same. Coverted: %v. Expected: %v", stack, expectedStack)) - } -} - -// Tests the conversion of a collection resource where both versions do not have pipelines and images in the status section. -// The pipeline and image data are obtained from the kabnanero instance's index URL. -func TestConvertToStackUsingCollectionWithEmptyPipelineAndImageAllVersions(t *testing.T) { - expectedStack := *sInstance - tc := cInstance.DeepCopy() - tc.Status.ActivePipelines = nil - tc.Status.Images = nil - tc.Spec.Version = "0.2.21" - tc.Status.Versions[0].Pipelines = nil - tc.Status.Versions[0].Images = nil - tc.Spec.Versions[0].Version = "0.2.21" - tc.Status.Versions[1].Pipelines = nil - tc.Status.Versions[1].Images = nil - tc.Spec.Versions[1].Version = "0.2.21" - - stack, err := r.convertCollectionToStack(kInstance, tc) - if err != nil { - t.Fatal(err) - } - - if stack.ObjectMeta.Name != expectedStack.ObjectMeta.Name { - t.Fatal(fmt.Sprintf("The expected stack.ObjectMeta.Name does not match resulting stack.ObjectMeta.Name. Converted: %v. Expected: %v", stack.ObjectMeta.Name, expectedStack.ObjectMeta.Name)) - } - if stack.ObjectMeta.Namespace != expectedStack.ObjectMeta.Namespace { - t.Fatal(fmt.Sprintf("The expected stack.ObjectMeta.Namespace does not match resulting stack.ObjectMeta.Namespace. Converted: %v. Expected: %v", stack.ObjectMeta.Namespace, expectedStack.ObjectMeta.Namespace)) - } - if len(stack.ObjectMeta.OwnerReferences) != 1 { - t.Fatal(fmt.Sprintf("The resulting stack.ObjectMeta.OwnerReferences does not contain an owner entry. It should have one.")) - } - if stack.ObjectMeta.OwnerReferences[0].Kind != kInstance.TypeMeta.Kind { - t.Fatal(fmt.Sprintf("The resulting stack.ObjectMeta.OwnerReferences[0].Kind does not match expected kInstance.TypeMeta.Kind. Converted %v. Expected %v", stack.ObjectMeta.OwnerReferences[0].Kind, kInstance.TypeMeta.Kind)) - } - if stack.ObjectMeta.OwnerReferences[0].UID != kInstance.ObjectMeta.UID { - t.Fatal(fmt.Sprintf("The resulting stack.ObjectMeta.OwnerReferences[0].UID does not match expected kInstance.ObjectMeta.UID. Converted %v. Expected %v", stack.ObjectMeta.OwnerReferences[0].UID, kInstance.ObjectMeta.UID)) - } - - // This version of the collection had no status. - if len(stack.Spec.Versions[0].Images) == 0 { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[0].Images array is empty. An entry was expected.")) - } - if stack.Spec.Versions[0].Images[0].Id != "java-microprofile" { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[0].Images[0].Id is not java-microprofile as expected. It instead shows: " + stack.Spec.Versions[0].Images[0].Id)) - } - - if len(stack.Spec.Versions[0].Pipelines) == 0 { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[0].Pipelines array is empty. An entry was expected.")) - } - if stack.Spec.Versions[0].Pipelines[0].Id != "default" { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[0].Pipelines[0].Id is not default as expected. It instead shows: " + stack.Spec.Versions[0].Pipelines[0].Id)) - } - - // This version of the collection had a status. - if len(stack.Spec.Versions[1].Images) == 0 { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[1].Images array is empty. An entry was expected.")) - } - if stack.Spec.Versions[1].Images[0].Id != "java-microprofile" { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[1].Images[0].Id is not java-microprofile as expected. It instead shows: " + stack.Spec.Versions[0].Images[0].Id)) - } - - if len(stack.Spec.Versions[1].Pipelines) == 0 { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[1].Pipelines array is empty. An entry was expected.")) - } - if stack.Spec.Versions[1].Pipelines[0].Id != "default" { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[1].Pipelines[0].Id is not default as expected. It instead shows: " + stack.Spec.Versions[0].Pipelines[0].Id)) - } -} - -// Tests the conversion of a collection resource where one version does not have pipelines and images in the status section. -// The pipeline and image data are obtained from the kabnanero instance's index URL. -// The second version has pipeline and image entries defined in the status section. The data is taken from the status. -func TestConvertToStackUsingCollectionWithOneVersionHasEmptyPipelineAndImage(t *testing.T) { - expectedStack := *sInstance - tc := cInstance.DeepCopy() - tc.Status.ActivePipelines = nil - tc.Status.Images = nil - tc.Spec.Version = "0.2.21" - tc.Status.Versions[0].Pipelines = nil - tc.Status.Versions[0].Images = nil - tc.Spec.Versions[0].Version = "0.2.21" - - stack, err := r.convertCollectionToStack(kInstance, tc) - if err != nil { - t.Fatal(err) - } - - if stack.ObjectMeta.Name != expectedStack.ObjectMeta.Name { - t.Fatal(fmt.Sprintf("The expected stack.ObjectMeta.Name does not match resulting stack.ObjectMeta.Name. Converted: %v. Expected: %v", stack.ObjectMeta.Name, expectedStack.ObjectMeta.Name)) - } - if stack.ObjectMeta.Namespace != expectedStack.ObjectMeta.Namespace { - t.Fatal(fmt.Sprintf("The expected stack.ObjectMeta.Namespace does not match resulting stack.ObjectMeta.Namespace. Converted: %v. Expected: %v", stack.ObjectMeta.Namespace, expectedStack.ObjectMeta.Namespace)) - } - if len(stack.ObjectMeta.OwnerReferences) != 1 { - t.Fatal(fmt.Sprintf("The resulting stack.ObjectMeta.OwnerReferences does not contain an owner entry. It should have one.")) - } - if stack.ObjectMeta.OwnerReferences[0].Kind != kInstance.TypeMeta.Kind { - t.Fatal(fmt.Sprintf("The resulting stack.ObjectMeta.OwnerReferences[0].Kind does not match expected kInstance.TypeMeta.Kind. Converted %v. Expected %v", stack.ObjectMeta.OwnerReferences[0].Kind, kInstance.TypeMeta.Kind)) - } - if stack.ObjectMeta.OwnerReferences[0].UID != kInstance.ObjectMeta.UID { - t.Fatal(fmt.Sprintf("The resulting stack.ObjectMeta.OwnerReferences[0].UID does not match expected kInstance.ObjectMeta.UID. Converted %v. Expected %v", stack.ObjectMeta.OwnerReferences[0].UID, kInstance.ObjectMeta.UID)) - } - - // This version of the collection had no status. - if len(stack.Spec.Versions[0].Images) == 0 { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[0].Images array is empty. An entry was expected.")) - } - if stack.Spec.Versions[0].Images[0].Id != "java-microprofile" { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[0].Images[0].Id is not java-microprofile as expected. It instead shows: " + stack.Spec.Versions[0].Images[0].Id)) - } - - if len(stack.Spec.Versions[0].Pipelines) == 0 { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[0].Pipelines array is empty. An entry was expected.")) - } - if stack.Spec.Versions[0].Pipelines[0].Id != "default" { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[0].Pipelines[0].Id is not default as expected. It instead shows: " + stack.Spec.Versions[0].Pipelines[0].Id)) - } - - // This version of the collection had a status. - if len(stack.Spec.Versions[1].Images) == 0 { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[1].Images array is empty. An entry was expected.")) - } - if stack.Spec.Versions[1].Images[0].Id != "a1b22b1a" { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[1].Images[0].Id is not a1b22b1a as expected. It instead shows: " + stack.Spec.Versions[0].Images[0].Id)) - } - if stack.Spec.Versions[1].Images[0].Image != "docker.io/kabanero/java-microprofile" { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[1].Images[0].Id is not docker.io/kabanero/java-microprofile as expected. It instead shows: " + stack.Spec.Versions[0].Images[0].Image)) - } - - if len(stack.Spec.Versions[1].Pipelines) == 0 { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[1].Pipelines array is empty. An entry was expected.")) - } - if stack.Spec.Versions[1].Pipelines[0].Id != "commonPipeline" { - t.Fatal(fmt.Sprintf("The resulting stack.Spec.Versions[1].Pipelines[0].Id is not commonPipeline as expected. It instead shows: " + stack.Spec.Versions[0].Pipelines[0].Id)) - } -} - -// Tests the conversion of a collection with no Images and Pipelines defined and the index.yaml does not -// contain the version of the collection. The collection to stack conversion should fail. -func TestConvertToStackUsingCollectionWithEmptyPipelineAndImageVersionNotFound(t *testing.T) { - tc := cInstance.DeepCopy() - tc.Status.ActivePipelines = nil - tc.Status.Images = nil - tc.Status.Versions[0].Pipelines = nil - tc.Status.Versions[0].Images = nil - - stack, err := r.convertCollectionToStack(kInstance, tc) - if err == nil { - t.Fatal("An error was expected to be thrown because the index did not contain a stack with the name specified in the collection.") - } - if stack != nil { - t.Fatal("A nil stack was expected because there was an error. Instead, the following was found stack was found: ", stack) - } -} - -// Tests the conversion of a collection with inactive status and a name that could not be found in the index.yaml -// associated with the kabanero instance. -func TestConvertToStackUsingCollectionWithInactiveStateAndUnknownStack(t *testing.T) { - tc := cInstance.DeepCopy() - tc.Status.Status = "inactive" - tc.ObjectMeta.Name = "someBogusName" - tc.Spec.Name = "someBogusName" - stack, err := r.convertCollectionToStack(kInstance, tc) - if err == nil { - t.Fatal("An error was expected to be thrown because the index did not contain a stack with the name specified in the collection.") - } - if stack != nil { - t.Fatal("A nil stack was expected because there was an error. Instead, the following was found stack was found: ", stack) - } -} diff --git a/pkg/controller/collection/collection_index.go b/pkg/controller/collection/collection_index.go deleted file mode 100644 index 54c37ccc..00000000 --- a/pkg/controller/collection/collection_index.go +++ /dev/null @@ -1,23 +0,0 @@ -package collection - -// Index holds data pertaining to an index referencing a set of collections. -type Index struct { - // API Version. - APIVersion string `yaml:"apiVersion,omitempty"` - - // Holds version 2 collection's data. - Collections []Collection `yaml:"stacks,omitempty"` - - // Holds version 2 collection's data. - Triggers []Trigger `yaml:"triggers,omitempty"` - - // Source URL of this index - URL string `yaml:"url,omitempty"` -} - -// Trigger holds Trigger information. -type Trigger struct { - Id string `yaml:"id,omitempty"` - Url string `yaml:"url,omitempty"` - Sha256 string `yaml:"sha256,omitempty"` -} \ No newline at end of file diff --git a/pkg/controller/collection/controller.go b/pkg/controller/collection/controller.go deleted file mode 100644 index b1203a5f..00000000 --- a/pkg/controller/collection/controller.go +++ /dev/null @@ -1,18 +0,0 @@ -package collection - -import ( - "sigs.k8s.io/controller-runtime/pkg/manager" -) - -// AddToManagerFuncs is a list of functions to add all Controllers to the Manager -var AddToManagerFuncs []func(manager.Manager) error - -// AddToManager adds all Controllers to the Manager -func AddToManager(m manager.Manager) error { - for _, f := range AddToManagerFuncs { - if err := f(m); err != nil { - return err - } - } - return nil -} diff --git a/pkg/controller/collection/directive_processor.go b/pkg/controller/collection/directive_processor.go deleted file mode 100644 index ff297914..00000000 --- a/pkg/controller/collection/directive_processor.go +++ /dev/null @@ -1,73 +0,0 @@ -package collection - -import ( - "bufio" - "bytes" - "fmt" - "io" - "regexp" - "strings" -) - -// The DirectiveProcessor processes text processing directives found in the yaml source -type DirectiveProcessor struct { -} - -func (g DirectiveProcessor) Render(b []byte, context map[string]interface{}) ([]byte, error) { - //Search for directives - directiveExpr := regexp.MustCompile(`\s?(#Kabanero!.*)$`) - directives := make([]string, 0) - reader := bufio.NewReader(bytes.NewReader(b)) - for { - line, _, err := reader.ReadLine() - - if err == io.EOF { - break - } - - if directiveExpr.Match(line) { - directive := directiveExpr.FindStringSubmatch(string(line))[1] - directives = append(directives, directive) - } - } - - text := string(b) - for _, directive := range directives { - var err error - text, err = g.process_directive(directive, text, context) - if err != nil { - return nil, err - } - } - - return []byte(text), nil -} - -//process_directive processes an individual directive like: #Kabanero! on activate substitute CollectionName for text '${collection-name}' -func (g DirectiveProcessor) process_directive(directive string, text string, context map[string]interface{}) (string, error) { - textSubstitutionExpr := regexp.MustCompile(`#Kabanero!\son\sactivate\s(substitute\s(.+?)\s(for text)\s'(.+?)')`) - if textSubstitutionExpr.MatchString(directive) { - groups := textSubstitutionExpr.FindStringSubmatch(directive) - - //group[0]: e.g. #Kabanero! on activate substitute CollectionName for text '${collection-name}' - //group[1]: e.g. substitute CollectionName for text '${collection-name}' - key := groups[2] // The variable found in the context (CollectionName) - substitution_type := groups[3] //e.g. for text - - if substitution_type == "for text" { - text_to_replace := groups[4] //e.g. '${collection-name}' - - //Prune the directive from the text first - text = strings.Replace(text, directive, "", 1) - text = strings.TrimSpace(text) - - text = strings.ReplaceAll(text, text_to_replace, context[key].(string)) - - return text, nil - } else { - return "", fmt.Errorf("Unknown substitution: %v", substitution_type) - } - } else { - return "", fmt.Errorf("Unknown directive: %v", directive) - } -} diff --git a/pkg/controller/collection/directive_processor_test.go b/pkg/controller/collection/directive_processor_test.go deleted file mode 100644 index 2411a511..00000000 --- a/pkg/controller/collection/directive_processor_test.go +++ /dev/null @@ -1,161 +0,0 @@ -package collection - -import ( - "fmt" - "strings" - "testing" -) - -func TestDirectiveProcessor(t *testing.T) { - tests := []struct { - name string - provided []byte - expected []byte - }{{ - name: "Substitute CollectionName", - provided: []byte(` -#Kabanero! on activate substitute CollectionName for text '${collection-name}' -apiVersion: tekton.dev/v1alpha1 -kind: Pipeline -metadata: - name: ${collection-name}-build-deploy-pipeline -spec: - resources: - - resource1 - tasks: - - name: build-task - taskRef: - name: ${collection-name}-build-task - `), - - expected: []byte(` -apiVersion: tekton.dev/v1alpha1 -kind: Pipeline -metadata: - name: My Collection Name-build-deploy-pipeline -spec: - resources: - - resource1 - tasks: - - name: build-task - taskRef: - name: My Collection Name-build-task - `), - }, - { - name: "Substitute CollectionId", - provided: []byte(` -#Kabanero! on activate substitute CollectionId for text 'CollectionId' -apiVersion: tekton.dev/v1alpha1 -kind: Pipeline -metadata: - name: CollectionId-build-deploy-pipeline -spec: - resources: - - resource1 - tasks: - - name: build-task - taskRef: - name: CollectionId-build-task - `), - - expected: []byte(` -apiVersion: tekton.dev/v1alpha1 -kind: Pipeline -metadata: - name: my-collection-build-deploy-pipeline -spec: - resources: - - resource1 - tasks: - - name: build-task - taskRef: - name: my-collection-build-task - `), - }, - { - name: "Substitute Digest", - provided: []byte(` -#Kabanero! on activate substitute Digest for text 'Digest' -apiVersion: tekton.dev/v1alpha1 -kind: Pipeline -metadata: - name: build-deploy-pipeline-Digest -spec: - resources: - - resource1 - tasks: - - name: build-task - taskRef: - name: build-task-Digest - `), - - expected: []byte(` -apiVersion: tekton.dev/v1alpha1 -kind: Pipeline -metadata: - name: build-deploy-pipeline-12345678 -spec: - resources: - - resource1 - tasks: - - name: build-task - taskRef: - name: build-task-12345678 - `), - }, - { - name: "Substitute StackId Digest", - provided: []byte(` -#Kabanero! on activate substitute StackId for text 'StackId' -#Kabanero! on activate substitute Digest for text 'Digest' -apiVersion: tekton.dev/v1alpha1 -kind: Pipeline -metadata: - name: StackId-build-deploy-pipeline-Digest -spec: - resources: - - resource1 - tasks: - - name: build-task - taskRef: - name: StackId-build-task-Digest - `), - - expected: []byte(` -apiVersion: tekton.dev/v1alpha1 -kind: Pipeline -metadata: - name: my-stack-build-deploy-pipeline-12345678 -spec: - resources: - - resource1 - tasks: - - name: build-task - taskRef: - name: my-stack-build-task-12345678 - `), - }, - } - - for _, tc := range tests { - t.Run(fmt.Sprintf("%s", tc.name), func(t *testing.T) { - context := map[string]interface{}{ - "CollectionName": "My Collection Name", - "CollectionId": "my-collection", - "Digest": "12345678", - "StackId": "my-stack", - } - - r := &DirectiveProcessor{} - b_output, err := r.Render(tc.provided, context) - - if err != nil { - t.Fatal(err) - } - if strings.TrimSpace(string(b_output)) != strings.TrimSpace(string(tc.expected)) { - t.Fatal("Output did not match expectations", string(b_output), string(tc.expected)) - } - }) - } -} diff --git a/pkg/controller/collection/httpcache.go b/pkg/controller/collection/httpcache.go deleted file mode 100644 index efa9c3b3..00000000 --- a/pkg/controller/collection/httpcache.go +++ /dev/null @@ -1,149 +0,0 @@ -package collection - -import ( - "crypto/tls" - "fmt" - "io/ioutil" - "net/http" - "sync" - "time" - rlog "sigs.k8s.io/controller-runtime/pkg/log" -) - -var cachelog = rlog.Log.WithName("httpcache") - -// Value in the cache map. This contains the etag returned from the remote -// server, which is used on subsequent requests to use the cached data. -type cacheValue struct { - etag string - date string - body []byte - lastUsed time.Time -} - -// The cache is stored as a map. We are storing the value as a struct -// instead of a pointer because multiple threads will be using the values -// concurrently. -var httpCache = make(map[string]cacheValue) - -// Initialization mutex -var startPurgeTicker sync.Once - -// The Duration at which a cache entry will be purged. -const purgeDuration = 12 * time.Hour - -// The amount of time between cache purge ticker cycles -const tickerDuration = 30 * time.Minute - -// Mutex for concurrent map access -var cacheLock sync.Mutex - -// Returns the requested resource, either from the cache, or from the -// remote server. The cache is not meant to be a "high performance" or -// "heavily concurrent" cache. -func getFromCache(url string, skipCertVerify bool) ([]byte, error) { - - // Build the request. - req, err := http.NewRequest(http.MethodGet, url, nil) - if err != nil { - return nil, err - } - - // See if the object is in the cache. Drop the lock after adding the - // header so we're not holding the lock around the HTTP request. - cacheLock.Lock() - cacheData, ok := httpCache[url] - cacheLock.Unlock() - if ok { - req.Header.Add("If-None-Match", cacheData.etag) - req.Header.Add("If-Modified-Since", cacheData.date) - } - - // Drive the request. Certificate validation is not disabled by default. - transport := &http.Transport{DisableCompression: true} - if skipCertVerify { - config := &tls.Config{InsecureSkipVerify: skipCertVerify} - transport.TLSClientConfig = config - } - - client := &http.Client{Transport: transport} - resp, err := client.Do(req) - - // If something went horribly wrong, tell the user. - if err != nil { - return nil, err - } - defer resp.Body.Close() - - // Check to see if we're going to use the cached data. - if resp.StatusCode == http.StatusNotModified { - cachelog.Info(fmt.Sprintf("Retrieved from cache: %v", url)) - - // Update the last used time so the entry does not get purged. - cacheData.lastUsed = time.Now() - cacheLock.Lock() - httpCache[url] = cacheData - cacheLock.Unlock() - - return cacheData.body, nil - } else if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf(fmt.Sprintf("Could not retrieve the resource: %v. Http status code: %v", url, resp.StatusCode)) - } - - // We got some new data back. Read it, and then see if we can cache it. - r := resp.Body - b, err := ioutil.ReadAll(r) - if err != nil { - return nil, err - } - - etag := resp.Header.Get("ETag") - date := resp.Header.Get("Date") - - // Re-lock the cache before either adding or removing the response from it. - cacheLock.Lock() - defer cacheLock.Unlock() - if (len(etag) > 0) && (len(date) > 0) { - // Before adding an entry to the cache, make sure the purge task is running. - startPurgeTicker.Do(startCachePurgeTask) - httpCache[url] = cacheValue{etag: etag, date: date, body: b, lastUsed: time.Now()} - cachelog.Info(fmt.Sprintf("Stored to cache: %v", url)) - } else { - // Take the entry out of the map if it's already there. - delete(httpCache, url) - } - - return b, nil -} - -// Starts the periodic purge task -func startCachePurgeTask() { - // Start a ticker that will receive periodic requests to purge the cache. - purgeTicker := time.NewTicker(tickerDuration) - - // This is the function that will purge the cache. Note that this function - // never ends since we expect this to be running in a Kube pod which will - // never end on its own. - go func() { - for { - select { - case <-purgeTicker.C: - cachelog.Info("Started cache purge") - purgeCache(purgeDuration) - cachelog.Info("Finished cache purge") - } - } - }() -} - -// Purges the cache -func purgeCache(localPurgeDuration time.Duration) { - cacheLock.Lock() - defer cacheLock.Unlock() - for key, _ := range httpCache { - if time.Since(httpCache[key].lastUsed) > localPurgeDuration { - cachelog.Info("Purging from cache: " + key) - delete(httpCache, key) - } - } -} diff --git a/pkg/controller/collection/httpcache_test.go b/pkg/controller/collection/httpcache_test.go deleted file mode 100644 index e9ccd6ba..00000000 --- a/pkg/controller/collection/httpcache_test.go +++ /dev/null @@ -1,192 +0,0 @@ -package collection - -import ( - "testing" - - "bytes" - "net/http" - "net/http/httptest" -) - -const theResponse = "The response." -const theResponse2 = "The response2." - -// HTTP handler that lets us know if the caller asked for the etag. -type CacheHandler struct { - etag string - cacheHits *int32 -} - -func (ch CacheHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { - // Check to see if the request specified the If-None-Match header - etagHeader := req.Header.Get("If-None-Match") - if etagHeader == ch.etag { - // Indicate the resource has not changed. - rw.WriteHeader(http.StatusNotModified) - *(ch.cacheHits) += 1 - } else { - // Just write the response - rw.Header().Add("ETag", ch.etag) - rw.Header().Add("Date", "GarbageDate") - rw.Write([]byte(theResponse)) - } -} - -// Show that the client is sending the correct etag on a subsequent request. -func TestCachePage(t *testing.T) { - var cacheHits int32 = 0 - handler := CacheHandler{etag: "ABCDE", cacheHits: &cacheHits} - server := httptest.NewServer(handler) - defer server.Close() - - // Get the page twice... the first time should not cache, the second should cache. - data, err := getFromCache(server.URL, false) - if err != nil { - t.Fatal(err) - } - if bytes.Compare([]byte(theResponse), data) != 0 { - t.Fatal("Response 1 not correct") - } - - data, err = getFromCache(server.URL, false) - if err != nil { - t.Fatal(err) - } - if bytes.Compare([]byte(theResponse), data) != 0 { - t.Fatal("Response 2 not correct") - } - - // Make sure that the cache hit one time. - if cacheHits != 1 { - t.Fatalf("Wrong number of cache hits: %v", cacheHits) - } -} - -// HTTP handler that lets us know if the caller asked for the etag. -type CacheChangeHandler struct { - etag1, etag2 string - cacheHits *int32 -} - -func (ch CacheChangeHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { - // Check to see if the request specified the If-None-Match header - etagHeader := req.Header.Get("If-None-Match") - if etagHeader == ch.etag1 { - // Got back the first etag, change it up and return the second. - rw.Header().Add("ETag", ch.etag2) - rw.Header().Add("Date", "GarbageDate") - rw.Write([]byte(theResponse2)) - } else if etagHeader == ch.etag2 { - // Indicate the resource has not changed. - rw.WriteHeader(http.StatusNotModified) - *(ch.cacheHits) += 1 - } else { - // Just write the response - rw.Header().Add("ETag", ch.etag1) - rw.Header().Add("Date", "GarbageDate") - rw.Write([]byte(theResponse)) - } -} - -// Show that if the server changes the etag, the client will update it. -func TestCacheChangePage(t *testing.T) { - var cacheHits int32 = 0 - handler := CacheChangeHandler{etag1: "ABCDE", etag2: "EFGHI", cacheHits: &cacheHits} - server := httptest.NewServer(handler) - defer server.Close() - - // Get the page thrice... the first time and second time should not cache, the third should cache. - data, err := getFromCache(server.URL, false) - if err != nil { - t.Fatal(err) - } - if bytes.Compare([]byte(theResponse), data) != 0 { - t.Fatal("Response 1 not correct") - } - - data, err = getFromCache(server.URL, false) - if err != nil { - t.Fatal(err) - } - if bytes.Compare([]byte(theResponse2), data) != 0 { - t.Fatal("Response 2 not correct") - } - - data, err = getFromCache(server.URL, false) - if err != nil { - t.Fatal(err) - } - if bytes.Compare([]byte(theResponse2), data) != 0 { - t.Fatal("Response 3 not correct") - } - - // Make sure that the cache hit one time. - if cacheHits != 1 { - t.Fatalf("Wrong number of cache hits: %v", cacheHits) - } -} - -// HTTP handler that does not cache -type NoCacheHandler struct {} - -func (ch NoCacheHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { - rw.Write([]byte(theResponse)) -} - -// Show that the cache doesn't care if the server does not send etags -func TestNoCachePage(t *testing.T) { - handler := NoCacheHandler{} - server := httptest.NewServer(handler) - defer server.Close() - - // Get the page twice... - data, err := getFromCache(server.URL, false) - if err != nil { - t.Fatal(err) - } - if bytes.Compare([]byte(theResponse), data) != 0 { - t.Fatal("Response 1 not correct") - } - - data, err = getFromCache(server.URL, false) - if err != nil { - t.Fatal(err) - } - if bytes.Compare([]byte(theResponse), data) != 0 { - t.Fatal("Response 2 not correct") - } -} - -// Test that we can purge an entry from the cache successfully. -func TestCachePurge(t *testing.T) { - var cacheHits int32 = 0 - handler := CacheHandler{etag: "ABCDE", cacheHits: &cacheHits} - server := httptest.NewServer(handler) - defer server.Close() - - // Get the page twice... the first time should not cache. - data, err := getFromCache(server.URL, false) - if err != nil { - t.Fatal(err) - } - if bytes.Compare([]byte(theResponse), data) != 0 { - t.Fatal("Response 1 not correct") - } - - // Now purge the cache - purgeCache(0) - - // Get the page the second time... it should not be cached. - data, err = getFromCache(server.URL, false) - if err != nil { - t.Fatal(err) - } - if bytes.Compare([]byte(theResponse), data) != 0 { - t.Fatal("Response 2 not correct") - } - - // Make sure that the cache did not hit. - if cacheHits != 0 { - t.Fatalf("Wrong number of cache hits: %v", cacheHits) - } -} diff --git a/pkg/controller/collection/register.go b/pkg/controller/collection/register.go deleted file mode 100644 index 295b3b0d..00000000 --- a/pkg/controller/collection/register.go +++ /dev/null @@ -1,6 +0,0 @@ -package collection - -func init() { - // AddToManagerFuncs is a list of functions to create controllers and add them to a manager. - AddToManagerFuncs = append(AddToManagerFuncs, Add) -} diff --git a/pkg/controller/collection/renderer.go b/pkg/controller/collection/renderer.go deleted file mode 100644 index 01baf3ba..00000000 --- a/pkg/controller/collection/renderer.go +++ /dev/null @@ -1,7 +0,0 @@ -package collection - -// An ActivationRenderer customizes the source content from the repository before it is applied -type ActivationRenderer interface { - //Render processes the yaml source content before it is unmarshaled into an object model - Render(b []byte, context map[string]interface{}) ([]byte, error) -} diff --git a/pkg/controller/collection/resolver.go b/pkg/controller/collection/resolver.go deleted file mode 100644 index 83a7b716..00000000 --- a/pkg/controller/collection/resolver.go +++ /dev/null @@ -1,89 +0,0 @@ -package collection - -import ( - "regexp" - "strconv" - - "github.com/blang/semver" - kabanerov1alpha1 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1" - "gopkg.in/yaml.v2" -) - -// ResolveIndex returns a structure representation of the yaml file represented by the index. -func ResolveIndex(repoConf kabanerov1alpha1.RepositoryConfig, pipelines []Pipelines, triggers []Trigger, imagePrefix string) (*Index, error) { - url := repoConf.Url - - // user may specify url to yaml file or directory - matched, err := regexp.MatchString(`/([^/]+)[.]yaml$`, url) - if err != nil { - return nil, err - } - if !matched { - url = url + "/index.yaml" - } - - b, err := getFromCache(url, repoConf.SkipCertVerification) - if err != nil { - return nil, err - } - - var index Index - err = yaml.Unmarshal(b, &index) - if err != nil { - return nil, err - } - - processIndexPostRead(&index, pipelines, triggers, imagePrefix) - - index.URL = url - - return &index, nil -} - -// Updates the loaded stack index structure for compliance with the current implementation. -func processIndexPostRead(index *Index, pipelines []Pipelines, triggers []Trigger, imagePrefix string) error { - // Add common pipelines and image. - for i, collection := range index.Collections { - if len(collection.Pipelines) == 0 { - collection.Pipelines = pipelines - } - - if len(collection.Images) == 0 { - version, err := semver.ParseTolerant(collection.Version) - if err != nil { - return err - } - - image := imagePrefix + "/" + collection.Id + ":" + strconv.FormatUint(version.Major, 10) + "." + strconv.FormatUint(version.Minor, 10) - collection.Images = append(collection.Images, Images{Id: collection.Id, Image: image}) - } - - index.Collections[i] = collection - } - - // Add common triggers. - if len(index.Triggers) == 0 { - index.Triggers = triggers - } - - return nil -} - -// SearchCollection returns all collections in the index matching the given name. -func SearchCollection(collectionName string, index *Index) ([]Collection, error) { - //Locate the desired collection in the index - var collectionRefs []Collection - - for _, collectionRef := range index.Collections { - if collectionRef.Id == collectionName { - collectionRefs = append(collectionRefs, collectionRef) - } - } - - if len(collectionRefs) == 0 { - //The collection referenced in the Collection resource has no match in the index - return nil, nil - } - - return collectionRefs, nil -} diff --git a/pkg/controller/collection/resolver_test.go b/pkg/controller/collection/resolver_test.go deleted file mode 100644 index 76def53a..00000000 --- a/pkg/controller/collection/resolver_test.go +++ /dev/null @@ -1,145 +0,0 @@ -package collection - -import ( - "testing" - - kabanerov1alpha1 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1" -) - -func TestResolveIndex(t *testing.T) { - repoConfig := kabanerov1alpha1.RepositoryConfig{ - Name: "name", - Url: "https://github.com/kabanero-io/collections/releases/download/v0.0.1/incubator-index.yaml", - ActivateDefaultCollections: true, - } - - index, err := ResolveIndex(repoConfig, []Pipelines{}, []Trigger{}, "") - if err != nil { - t.Fatal(err) - } - - if index == nil { - t.Fatal("Returned index was nil") - } - - if index.APIVersion != "v2" { - t.Fatal("Expected apiVersion == v2") - } -} - -func TestResolveIndexForStacks(t *testing.T) { - repoConfig := kabanerov1alpha1.RepositoryConfig{ - Name: "openLibertyTest", - Url: "https://github.com/appsody/stacks/releases/download/java-openliberty-v0.1.2/incubator-index.yaml", - ActivateDefaultCollections: true, - } - - pipelines := []Pipelines{{Id: "testPipeline", Sha256: "1234567890", Url: "https://github.com/kabanero-io/collections/releases/download/0.5.0-rc.2/incubator.common.pipeline.default.tar.gz"}} - triggers := []Trigger{{Id: "testTrigger", Sha256: "0987654321", Url: "https://github.com/kabanero-io/collections/releases/download/0.5.0-rc.2/incubator.trigger.tar.gz"}} - index, err := ResolveIndex(repoConfig, pipelines, triggers, "kabanerobeta") - - if err != nil { - t.Fatal(err) - } - - if index == nil { - t.Fatal("The resulting index structure was nil") - } - - // Validate pipeline entries. - numStacks := len(index.Collections) - if len(index.Collections[numStacks-numStacks].Pipelines) == 0 { - t.Fatal("Index.Collections[0].Pipelines is empty. An entry was expected") - } - - c0p0 := index.Collections[numStacks-numStacks].Pipelines[0] - if c0p0.Id != "testPipeline" { - t.Fatal("Expected Index.Collections[umStacks-numStacks].Pipelines[0] to have a pipeline name of testPipeline. Instead it was: " + c0p0.Id) - } - - if len(index.Collections[numStacks-1].Pipelines) == 0 { - t.Fatal("Index.Collections[numStacks-1].Pipelines is empty. An entry was expected") - } - - cLastP0 := index.Collections[numStacks-1].Pipelines[0] - if cLastP0.Id != "testPipeline" { - t.Fatal("Expected Index.Collections[0].Pipelines[0] to have a pipeline name of testPipeline. Instead it was: " + cLastP0.Id) - } - - // Validate trigger entry. - if len(index.Triggers) == 0 { - t.Fatal("Index.Triggers is empty. An entry was expected") - } - trgr := index.Triggers[0] - if trgr.Id != "testTrigger" { - t.Fatal("Expected Index.Triggers[0] to have a trigger name of testTrigger. Instead it was: " + trgr.Id) - } - - // Validate image entry. - if len(index.Collections[0].Images) == 0 { - t.Fatal("index.Collections[0].Images is empty. An entry was expected") - } - - image := index.Collections[0].Images[0] - if len(image.Image) == 0 { - t.Fatal("Expected index.Collections[0].Images[0].Image to have a non-empty value.") - } - - if len(image.Id) == 0 { - t.Fatal("Expected index.Collections[0].Images[0].Id to have a non-empty value.") - } -} - -func TestSearchCollection(t *testing.T) { - index := &Index{ - URL: "http://some/URL/to/V2/collection/index", - APIVersion: "v2", - Collections: []Collection{ - Collection{ - DefaultImage: "java-microprofile", - DefaultPipeline: "default", - DefaultTemplate: "default", - Description: "Test collection", - Id: "java-microprofile", - Images: []Images{ - Images{}, - }, - Maintainers: []Maintainers{ - Maintainers{}, - }, - Name: "Eclipse Microprofile", - Pipelines: []Pipelines{ - Pipelines{}, - }, - }, - Collection{ - DefaultImage: "java-microprofile2", - DefaultPipeline: "default2", - DefaultTemplate: "default2", - Description: "Test collection 2", - Id: "java-microprofile2", - Images: []Images{ - Images{}, - }, - Maintainers: []Maintainers{ - Maintainers{}, - }, - Name: "Eclipse Microprofile 2", - Pipelines: []Pipelines{ - Pipelines{}, - }, - }, - }, - } - - collections, err := SearchCollection("java-microprofile2", index) - if err != nil { - t.Fatal(err) - } - - if len(collections) != 1 { - t.Fatal("The expected number of collections is 1, but found: ", len(collections)) - } - - t.Log(collections) -} diff --git a/pkg/controller/collection/testdata/bad.pipeline.tar.gz b/pkg/controller/collection/testdata/bad.pipeline.tar.gz deleted file mode 100644 index 1c5b703219582da5c24434dc3a846a7ae0e60566..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437 zcmV;m0ZRTKiwFQe$>v=E1MSv3Z`&{s0AS7f6$~_R)jp-C*=}>e(z7WDPWtgCN2y>B^*lt6*FJIaDzRVeH02iVNrY0ySX`8_hD=y80)h3S}3hAAl} z7ae6n7}^nfqVIWSUn=Yf>DJ&LA9DHab8pT6r7rKlLJqs-f-ISUtLXqWkg~U>rn+yJ zAD4L!ZG6eMp2THGYWP~o)$#CE58L!5>`J?v+WfjM`PzrWhXaFodk?H%r|c(k1O9W% zwSE&Sc&IS-gk;!+>D3}DyHE3TR`&0`J^#Gtz22s6m{Sg?=>l)of17LduZ_~2GS%u| zYAUh*&*7}~|LI4X{aFL}nUvTBPG|!;#Zc;dp8taLm-Amgo&Sm&tp9UxORgc;GW9DG z)7&cY7bili(sB=6>4^-|80#$8mP3$&8PDQitPZ^O5#ywjfl3&pbi){}9qGtNWyC9aD~veosf)kuCci%Ly8{g4>sdrr+-;_Du_H=x4R50!CKsB2& z_nmn2rOcWw73iTr*9eheOWlK6*7%?(n?Joq|FX|ZU0~TfP4-VN=HHy<-{_iu6HMUz zU&B@N|F)Ld?`8i~kevG~*g_r$TFTR<|8o9~{+54LH~yM`Cq3u?8q%B#<+60mS`6b< z(}+Kw2y0T8JJ8N|BH9ozq4ubOtWlv?Lk#Fi*Z)XJHd&GuqO~cu17a&%-MV0+1Vl=x zzMJOj#&b4BXa@)wQXtb~u$ZE^wJ?;^^~Fx3HK8@B9vTrb>ZAu{ol+qX7#}HG{%>>Z0>z03E1jqcpgp23@ zODnA>vwy5R%>8THKu)nO|K-wuKL3Kthx{9U%)g=<^Zye3l55DdjQxtlH2-xg-`7P; zZMg-m^hm6rK}9-P%{&cs;97weQd$K{EA8|!NNTLsvF)mi%yI}224jb4fk*wvFuyLI zM?(bH&I%E^cEU?eZJeU^-Z3>ez_W&pW0DPI-LjV8( diff --git a/pkg/controller/collection/testdata/digest2.pipeline.tar.gz b/pkg/controller/collection/testdata/digest2.pipeline.tar.gz deleted file mode 100644 index c7b2f0d18a3265acd23e8301f9f9e506dcfbc984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457 zcmV;)0XF_0iwFRbx9VL01MStjZrd;v24K&63I-W6+2LK6xm!`7L(%<^I*bX)lp)bZ z)2FW-H%591yu=CGoNu8Z5+XsJpLDy}x65tZVjmN(?qSm}UK*cStq-jz4S(7`kfm4% zWlCw3GKXUIk|54W;!9l`txMD+M;B(wVMmFu- zlw;n_k00V4PML*aWEsC@c5{4jQ@}QU#c_&5YUZ9U4{6on{&p{*->yLvT}*AmKL0GO zVuKl4$j}swCD>rY+%L7aJbt&h{sbMeyhire!`kB#+86?knDT11D&BhI{u9T4kYVaB zll_CU`4{q(e<|&pe^n|;`F{-;&;OUXw4TlWq3#}Y|JFP4K5ZbyFmM0m(tkexO6pVo zEfwFsn@sT$fd4oiITPaH6)s7>7|b*DS7QwbmUgo%(ZekZ@N88fbhm@F`UzwO6A{_fcLf9m~b4A|3pcqfKlV9f0n zGl_8%#@yyj`S@|@Ix6Rf{!=5;uojuVWpQzM`eKT!_A9N&@@-zm7kTI}8`^%@D(qG_ zsHTgyZ|365eVa{}l(E5#^QjO$E@}R#$}Bu;%IRy*(Ob5k>Wt&!G}+%dntyYUf1^wO zjW?e2e-3BO|5a(T=VgD_kevH7xS#HIdwoso6D?Se)EqkN-M<%1(#))5~e0!hFMAXaq> zp_a9-tv8j#5GV%qq|C#E=RpZyC-lKbPo@bTLaZD(t(4W}kF5@1d~ITRX$&D$I_jjr zD&;+)aTQhYw8X*Qc2Gq_Oops=C`}|?*VaG+lY+7ll5(adXoB>CjMUm!p^_CQmCD@# hdYyO~VvI4y7-Nhv#u#IaF~-IdJ 0 { - return fmt.Errorf("Deletion blocked waiting for %v owned Collections to be deleted", collectionCount) - } - - // There used to be delete logic here for cross-namespace objects (the role binding for - // triggers). This is owned by the stack controler now, and so has been deleted from here. - return nil -} - -// Returns the readiness status of the Kabanero collection controller installation. -func getCollectionControllerStatus(ctx context.Context, k *kabanerov1alpha2.Kabanero, c client.Client) (bool, error) { - k.Status.CollectionController.Message = "" - k.Status.CollectionController.Ready = "False" - - // Retrieve the Kabanero collection controller version. - rev, err := resolveSoftwareRevision(k, ccVersionSoftCompName, k.Spec.CollectionController.Version) - if err != nil { - message := "Unable to retrieve the collection controller version." - cclog.Error(err, message) - k.Status.CollectionController.Message = message + ": " + err.Error() - return false, err - } - k.Status.CollectionController.Version = rev.Version - - // Base the status on the Kabanero collection controller's deployment resource. - ccdeployment := &appsv1.Deployment{} - err = c.Get(ctx, client.ObjectKey{ - Name: ccDeploymentResourceName, - Namespace: k.ObjectMeta.Namespace}, ccdeployment) - - if err != nil { - message := "Unable to retrieve the Kabanero collection controller deployment object." - cclog.Error(err, message) - k.Status.CollectionController.Message = message + ": " + err.Error() - return false, err - } - - conditions := ccdeployment.Status.Conditions - ready := false - for _, condition := range conditions { - if strings.ToLower(string(condition.Type)) == "available" { - if strings.ToLower(string(condition.Status)) == "true" { - ready = true - k.Status.CollectionController.Ready = "True" - } else { - k.Status.CollectionController.Message = condition.Message - } - - break - } - } - - return ready, err -} diff --git a/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go b/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go index 34961147..5c45e0cc 100644 --- a/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go +++ b/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go @@ -2,7 +2,6 @@ package kabaneroplatform import ( "context" - "encoding/json" "fmt" "os" "strings" @@ -10,7 +9,6 @@ import ( "time" "github.com/go-logr/logr" - kabanerov1alpha1 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1" kabanerov1alpha2 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha2" "github.com/kabanero-io/kabanero-operator/pkg/controller/utils/timer" @@ -46,7 +44,6 @@ type reconcileFuncType struct { } var reconcileFuncs = []reconcileFuncType{ - {name: "collection controller", function: reconcileCollectionController}, {name: "stack controller", function: reconcileStackController}, {name: "landing page", function: deployLandingPage}, {name: "cli service", function: reconcileKabaneroCli}, @@ -232,46 +229,7 @@ func (r *ReconcileKabanero) determineHowToRequeue(ctx context.Context, request r } -// Convert a v1alpha1 Kabanero CR instance, with collection repositories, to v1alpha2 -func (r *ReconcileKabanero) convertTo_v1alpha2(kabInstanceUnstructured *unstructured.Unstructured, reqLogger logr.Logger) { - // First populate a v1alpha1 object from the unstructured - data, err := kabInstanceUnstructured.MarshalJSON() - if err != nil { - reqLogger.Error(err, "Error marshalling unstructured data: ") - return - } - - kabInstanceV1 := &kabanerov1alpha1.Kabanero{} - err = json.Unmarshal(data, kabInstanceV1) - if err != nil { - reqLogger.Error(err, "Error unmarshalling unstructured data to Kabanero v1alpha1: ") - return - } - - // Next populate a v1alpha2 object from the unstructured. We'll keep the common fields. - kabInstanceV2 := &kabanerov1alpha2.Kabanero{} - err = json.Unmarshal(data, kabInstanceV2) - if err != nil { - reqLogger.Error(err, "Error unmarshalling unstructured data to Kabanero v1alpha2: ") - return - } - - // Now convert the collections to stacks - for _, collectionRepoConfig := range kabInstanceV1.Spec.Collections.Repositories { - httpsConfig := kabanerov1alpha2.HttpsProtocolFile{Url: collectionRepoConfig.Url, SkipCertVerification: collectionRepoConfig.SkipCertVerification} - stackRepoConfig := kabanerov1alpha2.RepositoryConfig{Name: collectionRepoConfig.Name, Https: httpsConfig} - // TODO: Pipelines? - kabInstanceV2.Spec.Stacks.Repositories = append(kabInstanceV2.Spec.Stacks.Repositories, stackRepoConfig) - } - - // TODO: Triggers? - // Write the object back. - err = r.client.Update(context.TODO(), kabInstanceV2) - if err != nil { - reqLogger.Error(err, "Error converting to Kabanero v1alpha2: ") - } -} // Reconcile reads that state of the cluster for a Kabanero object and makes changes based on the state read // and what is in the Kabanero.Spec @@ -294,8 +252,7 @@ func (r *ReconcileKabanero) Reconcile(request reconcile.Request) (reconcile.Resu } }) - // TODO: Retrieve kabanero as unstructured and see if there is a collection hub defined. If so, - // convert it, update, and retry. + // TODO: Retrieve kabanero as unstructured kabInstanceUnstructured := &unstructured.Unstructured{} kabInstanceUnstructured.SetGroupVersionKind(schema.GroupVersionKind{ Kind: "Kabanero", @@ -315,17 +272,6 @@ func (r *ReconcileKabanero) Reconcile(request reconcile.Request) (reconcile.Resu return reconcile.Result{}, err } - // See about the collection hub... - _, found, err := unstructured.NestedSlice(kabInstanceUnstructured.Object, "spec", "collections", "repositories") - if err != nil { - reqLogger.Error(err, "Unable to parse Kabanero instance for conversion") - } else { - if found { - // Do the conversion - r.convertTo_v1alpha2(kabInstanceUnstructured, reqLogger) - return reconcile.Result{}, nil // Will run again since we changed the object - } - } // Fetch the Kabanero instance instance := &kabanerov1alpha2.Kabanero{} @@ -362,7 +308,7 @@ func (r *ReconcileKabanero) Reconcile(request reconcile.Request) (reconcile.Resu } // Wait for the admission controller webhook to be ready before we try - // to deploy the featured collections. + // to deploy the featured stacks. isAdmissionControllerWebhookReady, _ := getAdmissionControllerWebhookStatus(instance, r.client, reqLogger) if isAdmissionControllerWebhookReady == false { processStatus(ctx, request, instance, r.client, reqLogger) @@ -387,7 +333,7 @@ func (r *ReconcileKabanero) Reconcile(request reconcile.Request) (reconcile.Resu return reconcile.Result{}, err } - // Deploy feature collection resources. + // Deploy featured stack resources. err = reconcileFeaturedStacks(ctx, instance, r.client, reqLogger) if err != nil { reqLogger.Error(err, "Error reconciling featured stacks.") @@ -492,12 +438,6 @@ func cleanup(ctx context.Context, k *kabanerov1alpha2.Kabanero, client client.Cl return err } - // Remove the cross-namespace objects that the collection controller uses. - err = cleanupCollectionController(ctx, k, client) - if err != nil { - return err - } - // Remove the cross-namespace objects that the stack controller uses. err = cleanupStackController(ctx, k, client) if err != nil { @@ -540,7 +480,6 @@ func processStatus(ctx context.Context, request reconcile.Request, k *kabanerov1 k.Status.KabaneroInstance.Ready = "False" // Gather the status of all resource dependencies. - isCollectionControllerReady, _ := getCollectionControllerStatus(ctx, k, c) isStackControllerReady, _ := getStackControllerStatus(ctx, k, c) isAppsodyReady, _ := getAppsodyStatus(k, c, reqLogger) isTektonReady, _ := getTektonStatus(k, c) @@ -555,8 +494,7 @@ func processStatus(ctx context.Context, request reconcile.Request, k *kabanerov1 isGitopsReady, _ := getGitopsStatus(k) // Set the overall status. - isKabaneroReady := isCollectionControllerReady && - isStackControllerReady && + isKabaneroReady := isStackControllerReady && isTektonReady && isServerlessReady && isCliRouteReady && diff --git a/pkg/webhook/collection/mutatingwebhook.go b/pkg/webhook/collection/mutatingwebhook.go deleted file mode 100644 index 03054058..00000000 --- a/pkg/webhook/collection/mutatingwebhook.go +++ /dev/null @@ -1,212 +0,0 @@ -package collection - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - - kabanerov1alpha1 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1" - "k8s.io/apimachinery/pkg/api/errors" - - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission" -) - -// BuildMutatingWebhook builds the webhook for the manager to register -func BuildMutatingWebhook(mgr *manager.Manager) *admission.Webhook { - return &admission.Webhook{Handler: &collectionMutator{}} -} - -// collectionMutator mutates collections -type collectionMutator struct { - client client.Client - decoder *admission.Decoder -} - -// Implement admission.Handler so the controller can handle admission request. -// This no-op assignment ensures that the struct implements the interface. -var _ admission.Handler = &collectionMutator{} - -// collectionMutator verifies that the collection version singleton and array -// are not in conflict. -func (a *collectionMutator) Handle(ctx context.Context, req admission.Request) admission.Response { - collection := &kabanerov1alpha1.Collection{} - - err := a.decoder.Decode(req, collection) - if err != nil { - return admission.Errored(http.StatusBadRequest, err) - } - - err = a.mutateCollectionFn(ctx, collection) - if err != nil { - return admission.Errored(http.StatusInternalServerError, err) - } - - marshaledCollection, err := json.Marshal(collection) - if err != nil { - return admission.Errored(http.StatusInternalServerError, err) - } - - return admission.PatchResponseFromRaw(req.Object.Raw, marshaledCollection) -} - -// mutateCollectionFn updates collection version entries. -func (a *collectionMutator) mutateCollectionFn(ctx context.Context, collection *kabanerov1alpha1.Collection) error { - // Get the currently installed collection. - current := &kabanerov1alpha1.Collection{} - err := a.client.Get(ctx, client.ObjectKey{ - Name: collection.Name, - Namespace: collection.Namespace}, current) - if err != nil { - if !errors.IsNotFound(err) { - return fmt.Errorf("Unable to retrieve installed collection object. Error: %v", err) - } - } - - err = processUpdate(current, collection) - - return err -} - -// Processes the needed changes when a collection update takes place. More precisely, it makes sure that -// that the values in new collection.Spec.Version[0] match the ones in new collection.Spec prior to processing the udpate. -func processUpdate(current *kabanerov1alpha1.Collection, new *kabanerov1alpha1.Collection) error { - // New collection.Spec.versions[0] is defined. - if len(new.Spec.Versions) > 0 { - // New collection.Spec and new collection.Spec.Versions[0] values are the same. - if areMixedVersionModelCollectionsEqual(new, new) { - // Make a basic check to see if new collection.Spec.Versions[0] and new collection.Spec values are the same because they are cleared. - if areSpecVersionValuesCleared(new) && areSpecVersions0ValuesCleared(new) { - return fmt.Errorf("The new collection.Spec and collection.Spec.versions[0] were not specified. New Collection: %v. Current collection: %v", new, current) - } - - return nil - } - - // New collection.Spec != new collection.Spec.Versions[0]. - // Current collection.Spec == new collection.Spec. - if areSpecVersionValuesEqual(current, new) { - // Current collection.Spec != New collection.Spec.Versions[0]. - if !areMixedVersionModelCollectionsEqual(current, new) { - // New Collection.Spec.Versions[0] values were cleared. Copy collection.Spec to collection.Spec.Versions[0]. - if areSpecVersions0ValuesCleared(new) { - new.Spec.Versions[0].Version = new.Spec.Version - new.Spec.Versions[0].RepositoryUrl = new.Spec.RepositoryUrl - new.Spec.Versions[0].DesiredState = new.Spec.DesiredState - return nil - } - - // Update new collection.Spec with values with collection.Spec.Versions[0] values. - new.Spec.Version = new.Spec.Versions[0].Version - new.Spec.RepositoryUrl = new.Spec.Versions[0].RepositoryUrl - new.Spec.DesiredState = new.Spec.Versions[0].DesiredState - return nil - } - - // No updates. - return nil - } - - // New collection.Spec != new collection.Spec.Versions[0]. - // Current collection.Spec != new collection.Spec. - // Current collection.Spec == new collection.Spec.Versions[0]. - if areMixedVersionModelCollectionsEqual(current, new) { - // New Collection.Spec values were cleared. Copy collection.Spec.Versions[0] to collection.Spec - if areSpecVersionValuesCleared(new) { - new.Spec.Version = new.Spec.Versions[0].Version - new.Spec.RepositoryUrl = new.Spec.Versions[0].RepositoryUrl - new.Spec.DesiredState = new.Spec.Versions[0].DesiredState - return nil - } - // Update new collection.Spec.Versions[0] with new collection.Spec values. - new.Spec.Versions[0].Version = new.Spec.Version - new.Spec.Versions[0].RepositoryUrl = new.Spec.RepositoryUrl - new.Spec.Versions[0].DesiredState = new.Spec.DesiredState - return nil - } - - // New collection.Spec != new collection.Spec.Versions[0]. - // Current collection.Spec != new collection.Spec. - // Current collection.Spec != new collection.Spec.Versions[0]. - // Current collection.Spec.Versions[0] = new collection.Spec.Versions[0]. - if len(current.Spec.Versions) > 0 && areSpecVersions0ValuesEqual(current, new) { - // Update new collection.Spec.Versions[0] with new collection.Spec values - new.Spec.Versions[0].Version = new.Spec.Version - new.Spec.Versions[0].RepositoryUrl = new.Spec.RepositoryUrl - new.Spec.Versions[0].DesiredState = new.Spec.DesiredState - return nil - } - - return fmt.Errorf("current collection.Spec, current, collection.Spec.Versions[0], new collection.Spec, and new collection.Spec.versions[0] have different values. Invalid update. New Collection: %v. Current collection: %v", new, current) - } - - // New collection.Spec.Versions[0] was NOT defined. - // Collection.Spec values were cleared. - if areSpecVersionValuesCleared(new) { - return fmt.Errorf("The new collection information under Spec and Spec.versions[0] were. New Collection: %v. Current collection: %v", new, current) - } - - // New collection.Spec.Versions[0] was NOT defined. - // Collection.Spec values were NOT cleared. - // Copy new collection.Spec to collection.Spec.Versions[0]. - versionsEntry := kabanerov1alpha1.CollectionVersion{ - Version: new.Spec.Version, - RepositoryUrl: new.Spec.RepositoryUrl, - DesiredState: new.Spec.DesiredState, - } - new.Spec.Versions = append(new.Spec.Versions, versionsEntry) - if len(new.Spec.Versions) != 1 { - return fmt.Errorf("Updated Spec.versions[] length of %v was not expected. Expected length: 1. New collection: %v", len(new.Spec.Versions), new) - } - - return nil -} - -// Returns true if all version related values in collection.Spec have a length of zero. Returns false otherwise. -func areSpecVersionValuesCleared(collection *kabanerov1alpha1.Collection) bool { - return (len(collection.Spec.Version) == 0 && - len(collection.Spec.RepositoryUrl) == 0 && - len(collection.Spec.DesiredState) == 0) -} - -// Returns true if all values in collection.Spec.Versions[0] have a length of zero. Returns false otherwise. -func areSpecVersions0ValuesCleared(collection *kabanerov1alpha1.Collection) bool { - return (len(collection.Spec.Versions[0].Version) == 0 && - len(collection.Spec.Versions[0].RepositoryUrl) == 0 && - len(collection.Spec.Versions[0].DesiredState) == 0) -} - -// Returns true if the version related values in the two input collection entries are the same. Returns false otherwise. -func areSpecVersionValuesEqual(this *kabanerov1alpha1.Collection, that *kabanerov1alpha1.Collection) bool { - return this.Spec.Version == that.Spec.Version && - this.Spec.RepositoryUrl == that.Spec.RepositoryUrl && - this.Spec.DesiredState == that.Spec.DesiredState -} - -// Returns true if collection.Spec.versions[0] values in the two input collection entries are the same. Returns false otherwise. -func areSpecVersions0ValuesEqual(this *kabanerov1alpha1.Collection, that *kabanerov1alpha1.Collection) bool { - return this.Spec.Versions[0].Version == that.Spec.Versions[0].Version && - this.Spec.Versions[0].RepositoryUrl == that.Spec.Versions[0].RepositoryUrl && - this.Spec.Versions[0].DesiredState == that.Spec.Versions[0].DesiredState -} - -// Returns true if version related values in input collection.Spec and input collection.Spec.Versions[0] are the same. Returns false otherwise. -func areMixedVersionModelCollectionsEqual(this *kabanerov1alpha1.Collection, that *kabanerov1alpha1.Collection) bool { - return this.Spec.Version == that.Spec.Versions[0].Version && - this.Spec.RepositoryUrl == that.Spec.Versions[0].RepositoryUrl && - this.Spec.DesiredState == that.Spec.Versions[0].DesiredState -} - -// InjectClient injects the client. -func (v *collectionMutator) InjectClient(c client.Client) error { - v.client = c - return nil -} - -// InjectDecoder injects the decoder. -func (v *collectionMutator) InjectDecoder(d *admission.Decoder) error { - v.decoder = d - return nil -} diff --git a/pkg/webhook/collection/mutatingwebhook_test.go b/pkg/webhook/collection/mutatingwebhook_test.go deleted file mode 100644 index 74fa85bf..00000000 --- a/pkg/webhook/collection/mutatingwebhook_test.go +++ /dev/null @@ -1,401 +0,0 @@ -package collection - -import ( - "testing" - - kabanerov1alpha1 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// Base collection with no collection.Spec.Versions[] defined. -var mutatingBaseCollection kabanerov1alpha1.Collection = kabanerov1alpha1.Collection{ - ObjectMeta: metav1.ObjectMeta{ - Name: "java-microprofile", - Namespace: "Kabanero", - UID: "1", - OwnerReferences: []metav1.OwnerReference{ - metav1.OwnerReference{ - APIVersion: "a/1", - Kind: "Kabanero", - Name: "kabanero", - UID: "1", - }, - }, - }, - Spec: kabanerov1alpha1.CollectionSpec{ - Name: "java-microprofile", - DesiredState: "active", - RepositoryUrl: "https://github.com/some/collection/kabanero-index.yaml", - Version: "1.2.3", - }, - Status: kabanerov1alpha1.CollectionStatus{ - ActiveVersion: "1.2.3", - ActiveLocation: "https://github.com/some/collection/kabanero-index.yaml", - ActivePipelines: []kabanerov1alpha1.PipelineStatus{}, - Status: "active", - Images: []kabanerov1alpha1.Image{{ - Id: "java-microprofile", - Image: "kabanero/java-microprofile:1.2.3"}}, - }, -} - -// Base collection with no collection.Spec.Versions[0] defined. -var mutatingBaseCollectionVersions kabanerov1alpha1.Collection = kabanerov1alpha1.Collection{ - ObjectMeta: metav1.ObjectMeta{ - Name: "java-microprofile", - Namespace: "Kabanero", - UID: "1", - OwnerReferences: []metav1.OwnerReference{ - metav1.OwnerReference{ - APIVersion: "a/1", - Kind: "Kabanero", - Name: "kabanero", - UID: "1", - }, - }, - }, - Spec: kabanerov1alpha1.CollectionSpec{ - Name: "java-microprofile", - DesiredState: "active", - RepositoryUrl: "https://github.com/some/collection/kabanero-index.yaml", - Version: "1.2.3", - Versions: []kabanerov1alpha1.CollectionVersion{{ - DesiredState: "active", - RepositoryUrl: "https://github.com/some/collection/kabanero-index.yaml", - Version: "1.2.3", - }}, - }, - Status: kabanerov1alpha1.CollectionStatus{ - ActiveVersion: "1.2.3", - ActiveLocation: "https://github.com/some/collection/kabanero-index.yaml", - ActivePipelines: []kabanerov1alpha1.PipelineStatus{}, - Status: "active", - Images: []kabanerov1alpha1.Image{{ - Id: "java-microprofile", - Image: "kabanero/java-microprofile:1.2.3"}}, - Versions: []kabanerov1alpha1.CollectionVersionStatus{{ - Version: "1.2.3", - Location: "https://github.com/some/collection/kabanero-index.yaml", - Pipelines: []kabanerov1alpha1.PipelineStatus{}, - Status: "active", - Images: []kabanerov1alpha1.Image{{ - Id: "java-microprofile", - Image: "kabanero/java-microprofile:1.2.3"}}, - }}, - }, -} - -// Current collection.Spec = New collection.Spec. -// Current collection.Spec.Versions[] (empty) = and New collection.Spec.Versions[] (empty). -// Expectation: collection.Spec.versions[0] should be added with the contents of collection.Spec data. -func Test1(t *testing.T) { - newCollection := mutatingBaseCollection.DeepCopy() - err := processUpdate(&mutatingBaseCollection, newCollection) - if err != nil { - t.Fatal("Unexpected error during mutation.", err) - } - - expectedversion0 := kabanerov1alpha1.CollectionVersion{ - RepositoryUrl: "https://github.com/some/collection/kabanero-index.yaml", - Version: "1.2.3", - DesiredState: "active"} - - //fmt.Println("Here is the base collection: ", mutatingBaseCollection) - //fmt.Println("Here is the new collection: ", newCollection) - - if newCollection.Spec.Versions[0] != expectedversion0 { - t.Fatal("Mutated versions[0] does not match expected versions[0] values. Mutated versions[0]: ", newCollection.Spec.Versions[0], "Expected versions[0]: ", expectedversion0) - } - -} - -// Current collection.Spec != New collection.Spec. -// Current collection.Spec.Versions[] (empty) = and New collection.Spec.Versions[] (empty). -// Expectation: collection.Spec.versions[0] should be added with the contents of collection.Spec data. -func Test2(t *testing.T) { - newCollection := mutatingBaseCollection.DeepCopy() - newCollection.Spec.RepositoryUrl = "https://github.com/some/collection/alternate-kabanero-index.yaml" - newCollection.Spec.Version = "4.5.6" - err := processUpdate(&mutatingBaseCollection, newCollection) - if err != nil { - t.Fatal("Unexpected error during mutation.", err) - } - - expectedversion0 := kabanerov1alpha1.CollectionVersion{ - RepositoryUrl: "https://github.com/some/collection/alternate-kabanero-index.yaml", - Version: "4.5.6", - DesiredState: "active"} - - if newCollection.Spec.Versions[0] != expectedversion0 { - t.Fatal("Mutated versions[0] does not match expected versions[0] values. Mutated versions[0]: ", newCollection.Spec.Versions[0], "Expected versions[0]: ", expectedversion0) - } -} - -// Current collection.Spec != New collection.Spec. -// Current collection.Spec.Versions[] (empty) = and New collection.Spec.Versions[] (empty). -// Expectation: An error condition should be reported. -func Test3(t *testing.T) { - newCollection := mutatingBaseCollection.DeepCopy() - newCollection.Spec.RepositoryUrl = "" - newCollection.Spec.Version = "" - newCollection.Spec.DesiredState = "" - err := processUpdate(&mutatingBaseCollection, newCollection) - if err == nil { - t.Fatal("An error condition should have been reported. Spec and Spec.versions were not properly defined.", err) - } -} - -// Current collection.Spec != New collection.Spec. -// Current collection.Spec == New collection.Spec.versions[0] -// Current collection.Spec.Versions[] (empty). -// Expectation: New collection.Spec should have been copied to New collection.Spec.versions[0]. -func Test4(t *testing.T) { - newCollection := mutatingBaseCollectionVersions.DeepCopy() - newCollection.Spec.RepositoryUrl = "https://github.com/some/collection/alternate-kabanero-index.yaml" - newCollection.Spec.Version = "4.5.6" - newCollection.Spec.DesiredState = "inactive" - err := processUpdate(&mutatingBaseCollection, newCollection) - if err != nil { - t.Fatal("Unexpected error during mutation.", err) - } - - expectedversion0 := kabanerov1alpha1.CollectionVersion{ - RepositoryUrl: "https://github.com/some/collection/alternate-kabanero-index.yaml", - Version: "4.5.6", - DesiredState: "inactive"} - - if newCollection.Spec.Versions[0] != expectedversion0 { - t.Fatal("New collection.Spec.Versions[0] values do not match expected collection.Spec.Versions[0] values. New versions[0]: ", newCollection.Spec.Versions[0], "Expected versions[0]: ", expectedversion0) - } -} - -// Current collection.Spec == New collection.Spec. -// Current collection.Spec != New collection.Spec.versions[0] -// Current collection.Spec.Versions[] (empty). -// Expectation: New collection.Spec.versions[0] values should have been copied to New collection.Spec. -func Test5(t *testing.T) { - newCollection := mutatingBaseCollectionVersions.DeepCopy() - newCollection.Spec.Versions[0].RepositoryUrl = "https://github.com/some/collection/alternate-kabanero-index.yaml" - newCollection.Spec.Versions[0].Version = "4.5.6" - newCollection.Spec.Versions[0].DesiredState = "inactive" - err := processUpdate(&mutatingBaseCollection, newCollection) - if err != nil { - t.Fatal("Unexpected error during mutation.", err) - } - - if newCollection.Spec.RepositoryUrl != "https://github.com/some/collection/alternate-kabanero-index.yaml" { - t.Fatal("New collection.Spec.RepositoryUrl values do not match expected value of https://github.com/some/collection/alternate-kabanero-index.yaml. RepositoryUrl found: ", newCollection.Spec.RepositoryUrl) - } - if newCollection.Spec.Version != "4.5.6" { - t.Fatal("New collection.Spec.Version values do not match expected value of 4.5.6. Version found: ", newCollection.Spec.Version) - } - if newCollection.Spec.DesiredState != "inactive" { - t.Fatal("New collection.Spec.DesiredState values do not match expected value of inactive. DesiredStateme found: ", newCollection.Spec.DesiredState) - } -} - -// Current collection.Spec != New collection.Spec. -// Current collection.Spec != New collection.Spec.versions[0] -// Current collection.Spec.Versions[] (empty). -// Expectation: An error condition should be reported. -func Test6(t *testing.T) { - newCollection := mutatingBaseCollectionVersions.DeepCopy() - newCollection.Spec.RepositoryUrl = "https://github.com/some/collection/other-alternate-kabanero-index.yaml" - newCollection.Spec.Version = "7.8.9" - newCollection.Spec.DesiredState = "active" - newCollection.Spec.Versions[0].RepositoryUrl = "https://github.com/some/collection/alternate-kabanero-index.yaml" - newCollection.Spec.Versions[0].Version = "4.5.6" - newCollection.Spec.Versions[0].DesiredState = "inactive" - err := processUpdate(&mutatingBaseCollection, newCollection) - if err == nil { - t.Fatal("An error condition should have been reported. New collection.Spec and new collection.Spec.versions[0] contain conflicting data.", err) - } -} - -// Current collection.Spec == New collection.Spec. -// Current collection.Spec == New collection.Spec.versions[0] -// Current collection.Spec.Versions[] (empty). -// Expectation: No change should have taken place. Everything should still be the same. -func Test7(t *testing.T) { - newCollection := mutatingBaseCollectionVersions.DeepCopy() - err := processUpdate(&mutatingBaseCollection, newCollection) - if err != nil { - t.Fatal("Unexpected error during mutation.", err) - } - - expectedversion0 := kabanerov1alpha1.CollectionVersion{ - DesiredState: "active", - RepositoryUrl: "https://github.com/some/collection/kabanero-index.yaml", - Version: "1.2.3"} - - if newCollection.Spec.Versions[0] != expectedversion0 { - t.Fatal("New collection.Spec.Versions[0] values do not match expected collection.Spec.Versions[0] values. New versions[0]: ", newCollection.Spec.Versions[0], "Expected versions[0]: ", expectedversion0) - } - - if newCollection.Spec.RepositoryUrl != "https://github.com/some/collection/kabanero-index.yaml" { - t.Fatal("New collection.Spec.RepositoryUrl values do not match expected value of https://github.com/some/collection/kabanero-index.yaml. RepositoryUrl found: ", newCollection.Spec.RepositoryUrl) - } - if newCollection.Spec.Version != "1.2.3" { - t.Fatal("New collection.Spec.Version values do not match expected value of 1.2.3. Version found: ", newCollection.Spec.Version) - } - if newCollection.Spec.DesiredState != "active" { - t.Fatal("New collection.Spec.DesiredState values do not match expected value of active. DesiredStateme found: ", newCollection.Spec.DesiredState) - } -} - -// Current collection.Spec == New collection.Spec. -// Current collection.Spec != New collection.Spec.versions[0] because collection.Spec.versions[0] values were cleared. -// Current collection.Spec.Versions[] (empty). -// Expectation: New collection.Spec values should have been copied to New collection.Spec.versions[0]. The same behavior -// should be applied as the case where collection.Spec.versions is empty. -func Test8(t *testing.T) { - newCollection := mutatingBaseCollectionVersions.DeepCopy() - newCollection.Spec.Versions[0].RepositoryUrl = "" - newCollection.Spec.Versions[0].Version = "" - newCollection.Spec.Versions[0].DesiredState = "" - - err := processUpdate(&mutatingBaseCollection, newCollection) - if err != nil { - t.Fatal("Unexpected error during mutation.", err) - } - - expectedversion0 := kabanerov1alpha1.CollectionVersion{ - DesiredState: "active", - RepositoryUrl: "https://github.com/some/collection/kabanero-index.yaml", - Version: "1.2.3"} - - if newCollection.Spec.Versions[0] != expectedversion0 { - t.Fatal("New collection.Spec.Versions[0] values do not match expected collection.Spec.Versions[0] values. New versions[0]: ", newCollection.Spec.Versions[0], "Expected versions[0]: ", expectedversion0) - } -} - -// New collection.Spec.Versions[0] == New collection.Spec. -// New collection.Spec.Versions[0] has all values cleared == New collection.Spec has all values cleared. -// Expectation: This is an invalid case. -func Test9(t *testing.T) { - newCollection := mutatingBaseCollectionVersions.DeepCopy() - newCollection.Spec.RepositoryUrl = "" - newCollection.Spec.Version = "" - newCollection.Spec.DesiredState = "" - newCollection.Spec.Versions[0].RepositoryUrl = "" - newCollection.Spec.Versions[0].Version = "" - newCollection.Spec.Versions[0].DesiredState = "" - - err := processUpdate(&mutatingBaseCollection, newCollection) - if err == nil { - t.Fatal("An error condition should have been reported. New collection.Spec and new collection.Spec.versions[0] contain empty fields.", err) - } -} - -// New colleciton.Spec != new collection.Spec.Versions[0]. -// Current colleciton.Spec != new collection.Spec. -// Current collection.Spec != new collection.Spec.Versions[0]. -// Current collection.Spec.Versions[0] = new collection.Spec.Versions[0]. -// Expectation: new collection.Spec values should be copied to new collection.Spec.Versions[0] -func Test10(t *testing.T) { - custommutatingBaseCollection := mutatingBaseCollectionVersions.DeepCopy() - newCollection := mutatingBaseCollectionVersions.DeepCopy() - custommutatingBaseCollection.Spec.Version = "1.2.4" - newCollection.Spec.Version = "1.2.5" - custommutatingBaseCollection.Spec.Versions[0].Version = "2.0.0" - newCollection.Spec.Versions[0].Version = "2.0.0" - - err := processUpdate(custommutatingBaseCollection, newCollection) - if err != nil { - t.Fatal("Unexpected error during mutation.", err) - } - - expectedversion0 := kabanerov1alpha1.CollectionVersion{ - DesiredState: "active", - RepositoryUrl: "https://github.com/some/collection/kabanero-index.yaml", - Version: "1.2.5"} - - if newCollection.Spec.Versions[0] != expectedversion0 { - t.Fatal("New collection.Spec.Versions[0] values do not match expected collection.Spec.Versions[0] values. New versions[0]: ", newCollection.Spec.Versions[0], "Expected versions[0]: ", expectedversion0) - } -} - -// New colleciton.Spec != new collection.Spec.Versions[0]. -// Current colleciton.Spec == new collection.Spec. -// Current collection.Spec != new collection.Spec.Versions[0]. -// Current collection.Spec.Versions[0] != new collection.Spec.Versions[0]. -// Expectation: new collection.Spec.Versions[0] values should be copied to new collection.Spec. -func Test11(t *testing.T) { - custommutatingBaseCollection := mutatingBaseCollectionVersions.DeepCopy() - newCollection := mutatingBaseCollectionVersions.DeepCopy() - custommutatingBaseCollection.Spec.Version = "1.2.4" - newCollection.Spec.Version = "1.2.4" - custommutatingBaseCollection.Spec.Versions[0].Version = "2.0.0" - newCollection.Spec.Versions[0].Version = "2.0.1" - - err := processUpdate(custommutatingBaseCollection, newCollection) - if err != nil { - t.Fatal("Unexpected error during mutation.", err) - } - - if newCollection.Spec.RepositoryUrl != "https://github.com/some/collection/kabanero-index.yaml" { - t.Fatal("New collection.Spec.RepositoryUrl values do not match expected value of https://github.com/some/collection/kabanero-index.yaml. RepositoryUrl found: ", newCollection.Spec.RepositoryUrl) - } - if newCollection.Spec.Version != "2.0.1" { - t.Fatal("New collection.Spec.Version values do not match expected value of 1.2.3. Version found: ", newCollection.Spec.Version) - } - if newCollection.Spec.DesiredState != "active" { - t.Fatal("New collection.Spec.DesiredState values do not match expected value of active. DesiredStateme found: ", newCollection.Spec.DesiredState) - } -} - -// New colleciton.Spec == new collection.Spec.Versions[0]. -// Current colleciton.Spec != new collection.Spec. -// Current collection.Spec.Versions[0] == new collection.Spec.Versions[0]. -// Expectation: No updates are expected. -func Test12(t *testing.T) { - custommutatingBaseCollection := mutatingBaseCollectionVersions.DeepCopy() - newCollection := mutatingBaseCollectionVersions.DeepCopy() - custommutatingBaseCollection.Spec.Version = "1.2.3" - newCollection.Spec.Version = "1.2.4" - custommutatingBaseCollection.Spec.Versions[0].Version = "1.2.4" - newCollection.Spec.Versions[0].Version = "1.2.4" - - err := processUpdate(custommutatingBaseCollection, newCollection) - if err != nil { - t.Fatal("Unexpected error during mutation.", err) - } - - expectedversion0 := kabanerov1alpha1.CollectionVersion{ - DesiredState: "active", - RepositoryUrl: "https://github.com/some/collection/kabanero-index.yaml", - Version: "1.2.4"} - - if newCollection.Spec.Versions[0] != expectedversion0 { - t.Fatal("New collection.Spec.Versions[0] values do not match expected collection.Spec.Versions[0] values. New versions[0]: ", newCollection.Spec.Versions[0], "Expected versions[0]: ", expectedversion0) - } - - if newCollection.Spec.RepositoryUrl != "https://github.com/some/collection/kabanero-index.yaml" { - t.Fatal("New collection.Spec.RepositoryUrl values do not match expected value of https://github.com/some/collection/kabanero-index.yaml. RepositoryUrl found: ", newCollection.Spec.RepositoryUrl) - } - if newCollection.Spec.Version != "1.2.4" { - t.Fatal("New collection.Spec.Version values do not match expected value of 1.2.3. Version found: ", newCollection.Spec.Version) - } - if newCollection.Spec.DesiredState != "active" { - t.Fatal("New collection.Spec.DesiredState values do not match expected value of active. DesiredStateme found: ", newCollection.Spec.DesiredState) - } -} - -// New colleciton.Spec != new collection.Spec.Versions[0]. -// Current colleciton.Spec != new collection.Spec. -// Current collection.Spec != new collection.Spec.Versions[0]. -// Current collection.Spec.Versions[0] = new collection.Spec.Versions[0]. -// Expectation: This is an invalid case and is unrecoverable. New and current version values are different. -// The instance may need to be re-deployed. -func Test13(t *testing.T) { - custommutatingBaseCollection := mutatingBaseCollectionVersions.DeepCopy() - newCollection := mutatingBaseCollectionVersions.DeepCopy() - custommutatingBaseCollection.Spec.Version = "1.2.4" - newCollection.Spec.Version = "1.2.5" - custommutatingBaseCollection.Spec.Versions[0].Version = "2.0.0" - newCollection.Spec.Versions[0].Version = "2.0.1" - err := processUpdate(custommutatingBaseCollection, newCollection) - if err == nil { - t.Fatal("An error condition should have been reported. Current and new collection.Spec and current and new collection.Spec.versions[0] have different values.", err) - } -} diff --git a/pkg/webhook/collection/validatingwebhook.go b/pkg/webhook/collection/validatingwebhook.go deleted file mode 100644 index 7871727b..00000000 --- a/pkg/webhook/collection/validatingwebhook.go +++ /dev/null @@ -1,73 +0,0 @@ -package collection - -// The controller-runtime example webhook (v0.10) was used to build this -// webhook implementation. - -import ( - "context" - "fmt" - "net/http" - - kabanerov1alpha1 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1" - - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission" -) - -// BuildValidatingWebhook builds the webhook for the manager to register -func BuildValidatingWebhook(mgr *manager.Manager) *admission.Webhook { - return &admission.Webhook{Handler: &collectionValidator{}} -} - -// collectionValidator validates Collections -type collectionValidator struct { - client client.Client - decoder *admission.Decoder -} - -// Implement admission.Handler so the controller can handle admission request. -// This no-op assignment ensures that the struct implements the interface. -var _ admission.Handler = &collectionValidator{} - -// collectionValidator admits a collection if it passes validity checks -func (v *collectionValidator) Handle(ctx context.Context, req admission.Request) admission.Response { - collection := &kabanerov1alpha1.Collection{} - - err := v.decoder.Decode(req, collection) - if err != nil { - return admission.Errored(http.StatusBadRequest, err) - } - - allowed, reason, err := v.validateCollectionFn(ctx, collection) - if err != nil { - return admission.Errored(http.StatusInternalServerError, err) - } - return admission.ValidationResponse(allowed, reason) -} - -func (v *collectionValidator) validateCollectionFn(ctx context.Context, collection *kabanerov1alpha1.Collection) (bool, string, error) { - allowed := collection.Spec.Version == collection.Spec.Versions[0].Version && - collection.Spec.RepositoryUrl == collection.Spec.Versions[0].RepositoryUrl && - collection.Spec.DesiredState == collection.Spec.Versions[0].DesiredState - - if !allowed { - reason := fmt.Sprintf("Single version collection model values do not match multiple collection model values. collection: %v", collection) - err := fmt.Errorf(reason) - return false, reason, err - } - - return true, "", nil -} - -// InjectClient injects the client. -func (v *collectionValidator) InjectClient(c client.Client) error { - v.client = c - return nil -} - -// InjectDecoder injects the decoder. -func (v *collectionValidator) InjectDecoder(d *admission.Decoder) error { - v.decoder = d - return nil -} diff --git a/pkg/webhook/collection/validatingwebhook_test.go b/pkg/webhook/collection/validatingwebhook_test.go deleted file mode 100644 index 68b50433..00000000 --- a/pkg/webhook/collection/validatingwebhook_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package collection - -import ( - "testing" - - kabanerov1alpha1 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// Base collection with collection.Spec.Versions[0] defined. -var validatingCollectionVersions kabanerov1alpha1.Collection = kabanerov1alpha1.Collection{ - ObjectMeta: metav1.ObjectMeta{ - Name: "java-microprofile", - Namespace: "Kabanero", - UID: "1", - OwnerReferences: []metav1.OwnerReference{ - metav1.OwnerReference{ - APIVersion: "a/1", - Kind: "Kabanero", - Name: "kabanero", - UID: "1", - }, - }, - }, - Spec: kabanerov1alpha1.CollectionSpec{ - Name: "java-microprofile", - DesiredState: "active", - RepositoryUrl: "https://github.com/some/collection/kabanero-index.yaml", - Version: "1.2.3", - Versions: []kabanerov1alpha1.CollectionVersion{{ - DesiredState: "active", - RepositoryUrl: "https://github.com/some/collection/kabanero-index.yaml", - Version: "1.2.3", - }}, - }, - Status: kabanerov1alpha1.CollectionStatus{ - ActiveVersion: "1.2.3", - ActiveLocation: "https://github.com/some/collection/kabanero-index.yaml", - ActivePipelines: []kabanerov1alpha1.PipelineStatus{}, - Status: "active", - Images: []kabanerov1alpha1.Image{{ - Id: "java-microprofile", - Image: "kabanero/java-microprofile:1.2.3"}}, - Versions: []kabanerov1alpha1.CollectionVersionStatus{{ - Version: "1.2.3", - Location: "https://github.com/some/collection/kabanero-index.yaml", - Pipelines: []kabanerov1alpha1.PipelineStatus{}, - Status: "active", - Images: []kabanerov1alpha1.Image{{ - Id: "java-microprofile", - Image: "kabanero/java-microprofile:1.2.3"}}, - }}, - }, -} - -// Collection.Spec = New collection.Spec.Versions -func validationSuccess(t *testing.T) { - newCollection := validatingCollectionVersions.DeepCopy() - cv := collectionValidator{} - allowed, msg, err := cv.validateCollectionFn(nil, newCollection) - - if !allowed { - t.Fatal("Validation should have passed. The validation was not allowed") - } - - if len(msg) != 0 { - t.Fatal("Validation succeeded. A message was not expected. Message: ", msg) - } - - if err != nil { - t.Fatal("Validation succeeded. An error was not expected. Error: ", err) - } -} - -// Collection.Spec != New collection.Spec.Versions -func validationFailure(t *testing.T) { - newCollection := validatingCollectionVersions.DeepCopy() - newCollection.Spec.Version = "4.5.6" - - cv := collectionValidator{} - allowed, msg, err := cv.validateCollectionFn(nil, newCollection) - - if allowed { - t.Fatal("Validation should have failed. The validation was allowed instead.") - } - - if len(msg) == 0 { - t.Fatal("Validation failed. A message was expected.") - } - - if err == nil { - t.Fatal("Validation failed. An error was expected") - } -} diff --git a/pkg/webhook/kabanero/v1alpha1/mutatingwebhook.go b/pkg/webhook/kabanero/v1alpha1/mutatingwebhook.go deleted file mode 100644 index 23fcca12..00000000 --- a/pkg/webhook/kabanero/v1alpha1/mutatingwebhook.go +++ /dev/null @@ -1,69 +0,0 @@ -package kabanero - -import ( - "context" - "encoding/json" - "net/http" - - kabanerov1alpha1 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1" - - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission" -) - -// Builds the webhook for the manager to register -func BuildMutatingWebhook(mgr *manager.Manager) *admission.Webhook { - return &admission.Webhook{Handler: &kabaneroMutator{}} -} - -// kabaneroMutator mutates kabaneros -type kabaneroMutator struct { - client client.Client - decoder *admission.Decoder -} - -// Implement admission.Handler so the controller can handle admission request. -// This no-op assignment ensures that the struct implements the interface. -var _ admission.Handler = &kabaneroMutator{} - -// kabaneroMutator verifies that the kabanero version singleton and array -// are not in conflict. -func (a *kabaneroMutator) Handle(ctx context.Context, req admission.Request) admission.Response { - kabanero := &kabanerov1alpha1.Kabanero{} - - err := a.decoder.Decode(req, kabanero) - if err != nil { - return admission.Errored(http.StatusBadRequest, err) - } - - err = a.mutatekabaneroFn(ctx, kabanero) - if err != nil { - return admission.Errored(http.StatusInternalServerError, err) - } - - marshaledKabanero, err := json.Marshal(kabanero) - if err != nil { - return admission.Errored(http.StatusInternalServerError, err) - } - - return admission.PatchResponseFromRaw(req.Object.Raw, marshaledKabanero) -} - -// mutatekabaneroFn add an annotation to the given pod -func (a *kabaneroMutator) mutatekabaneroFn(ctx context.Context, kabanero *kabanerov1alpha1.Kabanero) error { - // TODO: Business logic - return nil -} - -// InjectClient injects the client. -func (v *kabaneroMutator) InjectClient(c client.Client) error { - v.client = c - return nil -} - -// InjectDecoder injects the decoder. -func (v *kabaneroMutator) InjectDecoder(d *admission.Decoder) error { - v.decoder = d - return nil -} diff --git a/pkg/webhook/kabanero/v1alpha1/validatingwebhook.go b/pkg/webhook/kabanero/v1alpha1/validatingwebhook.go deleted file mode 100644 index 06024cd1..00000000 --- a/pkg/webhook/kabanero/v1alpha1/validatingwebhook.go +++ /dev/null @@ -1,92 +0,0 @@ -package kabanero - -// The controller-runtime example webhook (v0.10) was used to build this -// webhook implementation. - -import ( - "context" - "net/http" - "fmt" - - kabanerov1alpha1 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha1" - - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission" -) - -// Builds the webhook for the manager to register -func BuildValidatingWebhook(mgr *manager.Manager) *admission.Webhook { - return &admission.Webhook{Handler: &kabaneroValidator{}} -} - -// kabaneroValidator validates kabaneros -type kabaneroValidator struct { - client client.Client - decoder *admission.Decoder -} - -// Implement admission.Handler so the controller can handle admission request. -// This no-op assignment ensures that the struct implements the interface. -var _ admission.Handler = &kabaneroValidator{} - -// kabaneroValidator admits a kabanero if it passes validity checks -func (v *kabaneroValidator) Handle(ctx context.Context, req admission.Request) admission.Response { - kabanero := &kabanerov1alpha1.Kabanero{} - - err := v.decoder.Decode(req, kabanero) - if err != nil { - return admission.Errored(http.StatusBadRequest, err) - } - - allowed, reason, err := v.validatekabaneroFn(ctx, kabanero) - if err != nil { - return admission.Errored(http.StatusInternalServerError, err) - } - return admission.ValidationResponse(allowed, reason) -} - -func (v *kabaneroValidator) validatekabaneroFn(ctx context.Context, pod *kabanerov1alpha1.Kabanero) (bool, string, error) { - // For now, just reject everything. - - name := pod.ObjectMeta.Name - namespace := pod.ObjectMeta.Namespace - kabaneroList := &kabanerov1alpha1.KabaneroList{} - options := []client.ListOption{client.InNamespace(namespace)} - - err := v.client.List(ctx, kabaneroList, options...) - if err != nil { - return false, fmt.Sprintf("Failed to list Kabaneros in namespace: %s", namespace), err - } - - // If there is a Kabanero in this namespace other than a named match (update), reject. - // Do not allow more than 1 Kabanero per namespace. - allow := true - for _, kabanero := range kabaneroList.Items { - if name == kabanero.Name { - // Matching name, allow Update - break - } else { - // This is an additional instance, reject - allow = false - } - } - - if allow { - return true, fmt.Sprintf("Kabanero %s in namespace %s approved", name, namespace), nil - } else { - return false, fmt.Sprintf("Rejecting additional Kabanero instance: %s in namespace: %s. Multiple Kabanero instances are not allowed.", name, namespace), nil - } -} - -// InjectClient injects the client. -func (v *kabaneroValidator) InjectClient(c client.Client) error { - v.client = c - return nil -} - -// InjectDecoder injects the decoder. -func (v *kabaneroValidator) InjectDecoder(d *admission.Decoder) error { - v.decoder = d - return nil -} diff --git a/registry/Dockerfile b/registry/Dockerfile index bf3e60aa..7d925c09 100644 --- a/registry/Dockerfile +++ b/registry/Dockerfile @@ -1,4 +1,4 @@ -FROM quay.io/operator-framework/upstream-registry-builder:v1.5.6 as builder +FROM quay.io/operator-framework/upstream-registry-builder:v1.12.2 as builder # This dockerfile is taken from the operator-registry upstream example COPY manifests manifests diff --git a/registry/manifests/kabanero-operator/0.10.0/kabanero-operator.v0.10.0.clusterserviceversion.yaml b/registry/manifests/kabanero-operator/0.10.0/kabanero-operator.v0.10.0.clusterserviceversion.yaml new file mode 100644 index 00000000..04fa6927 --- /dev/null +++ b/registry/manifests/kabanero-operator/0.10.0/kabanero-operator.v0.10.0.clusterserviceversion.yaml @@ -0,0 +1,290 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + name: kabanero-operator.v0.10.0 + namespace: placeholder + annotations: + capabilities: Basic Install + categories: "Integration & Delivery" + certified: "false" + containerImage: kabanero/kabanero-operator:latest + createdAt: 2019-11-19T12:00:00.000-0500 + description: Bringings together foundational open source technologies into a modern microservices-based framework. + olm.skipRange: '>=0.6.1 <0.10.0' + repository: https://github.com/kabanero-io/kabanero-operator + support: IBM + alm-examples: |- + [ + { + "apiVersion": "kabanero.io/v1alpha2", + "kind": "Kabanero", + "metadata": { + "name": "kabanero" + }, + "spec": { + "version": "0.10.0", + "stacks": { + "repositories": [ + { + "name": "incubator", + "https": { + "url": "https://github.com/kabanero-io/kabanero-stack-hub/releases/download/0.9.0-rc.1/kabanero-stack-hub-index.yaml" + } + } + ], + "pipelines": [ + { + "id": "default", + "sha256": "850dfa631d957ba66978a4701dc08b8bd41cc9ca52c0cde8344941032354a770", + "https": { + "url": "https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.0-rc.2/default-kabanero-pipelines.tar.gz" + } + } + ] + } + } + }, + { + "apiVersion": "kabanero.io/v1alpha2", + "kind": "Stack", + "metadata": { + "name": "java-openliberty" + }, + "spec": { + "name": "java-openliberty", + "versions": [ + { "version": "0.2.11", + "pipelines": [ + { "id": "default", + "sha256": "850dfa631d957ba66978a4701dc08b8bd41cc9ca52c0cde8344941032354a770", + "https": { + "url": "https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.0-rc.2/default-kabanero-pipelines.tar.gz" + } + } + ], + "images": [ + { "id": "java-openliberty", + "image": "docker.io/appsody/java-openliberty:0.2.11" + } + ] + } + ] + } + } + ] +spec: + minKubeVersion: 1.16.0 + apiservicedefinitions: {} + maturity: alpha + version: 0.10.0 + replaces: kabanero-operator.v0.9.0 + displayName: Kabanero Operator + description: | + The Kabanero operator is used to manage Kabanero Foundation instances on your Open Shift or Kubernetes cluster. + + [Kabanero](http://kabanero.io) is an open source project focused on bringing together foundational open source technologies into a modern microservices-based framework. + + Use our application stacks infused with expertise to select proven technologies, languages, and runtimes for building applications for Kubernetes. Apply customizations before sharing the application stack with developers and operations teams, to ensure your business process and governance needs are met. Application stacks reduce the decision-cycle time, enabling developers to focus on delivering line-of-business value without having to become full stack experts. + + ## Prerequisites + The Kabanero operator creates objects that are processed by other + operators. The target environment is OpenShift Container Platform + 4.2. The following operators must be installed in the cluster: + * [OpenShift Service Mesh](https://docs.openshift.com/container-platform/4.2/service_mesh/service_mesh_install/installing-ossm.html) + * [OpenShift Serverless Operator](https://docs.openshift.com/container-platform/4.2/serverless/installing-openshift-serverless.html) + * [Openshift Pipelines Operator](https://github.com/openshift/tektoncd-pipeline-operator) + * [Appsody Operator](https://github.com/appsody/appsody-operator/) + + We recommend you use the sample install.sh script located under "Assets" in each of the [Kabanero Operator Releases](https://github.com/kabanero-io/kabanero-operator/releases) to install the prerequisites from the appropriate operator catalogs. + icon: + - base64data: iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAe3UlEQVR4Ae1dC3RU1bn+zplnJpNMXiQhQCCQEAgKiIgIXqUqIFJfrbWV2qftum3va9X2rnattlZd7fW23tXnbV3UWqu1tnpbe9VWaisgFEQe8pQqARNIDAmEvDOTzOvM/f49c8YoVCfUnDnhzoaZOXNmn3P2/r/9//t/7R0twYJcOWcpoJ+zPct1TFEgB/A5PhByAOcAPscpcI53L8fBbwPwuaB/5gD+GwCb4Jqff6Oa7U/nAD4DRAKqYRgwwTU/z1DV9qdyAL8FIhPMnp4eNDc3IxQKQdO0NwH+lkts/TUH8BngEUBPnTqFu+++Gxs2bEiDbAJ9hktseyoH8AhohHsFxEgkgqamJhw8cADXXXcd1q5di8bGRsTjcei6rrh5xGW2PnTcyWLrFlrcOAG4tbUV3//e9xCORjF58mTcf//96Ovrg8ftRtWkSfB4PGp+lrp2LxpHbc4XPQIlIcexY8dw+PBhlJaWYmBgAM8//zyED2bPno2v33EHVq5ciaLiYsXJwtF2LjmAR6Aj4MpLRLRwp3BqlFzc3t6OLVu24DOf/Sx4Ag8+/DCuXrUKeXl5qp6tOZkdypURFKB5lP7GOTdhfu/t7U089thjIu0Sl112WWLr1q2JWCym6pp10hfa6MDe8mUEd1l1KNxIfNJzrByLchUIBLBixQrce++92Lx5M5588kl0dXWlmyX17FhyAJ8BFQHZfMkca2rOAvIqiubK8nJs374dO3bsQDgcVnXPcBtbnMoBnAEMJtjyKVr11++6C5s2bcK2F15AP7VrKSbXZ3A7S6vkAB4FuQVEv9+P+fPnq6tE2xaTinOx4mI7iukcwBkCLNwrxeFwKPNp2eWX4zW6MtuOH7e1mM4BnCHAUs3kUJ/Ph1mzZuHFF19ULk3hYLuWHMCjQMbkYjc9WmUTJgjikKDESIDNQTCK245p1RzAZ0Fe0apdLpe6cnBw8E0An8XtxvSSHMBnQV6xi8XDJUW4125cO7JLOYBHUiPDY7F9TSeHgJ0DOEPCjZdqkgQgwQgp5rxs17bnODhDZEwulVQeCR3u3r07faWdQc4BnIbpnQ8EyOHhYbxO50Z3d7e6QCJKI0OGdgPb+c7dytUYSYFgMIi9+/ZBo8NjCoP/FRUVELPJriUHcIbImJwpuVpPPvUUplVXK3DLGXgwTaYMb2VptZyIHgW5h4aGVK7WfnKwcG1lZWWag805ehS3s6RqDuAMyGyCJ8rVnj171BWHDh1CSUmJAlk4WOqYXJ7BLS2rkgP4HUg9Erguiud169ahipwrpb6+HsXMzZIi4NoR4HNrDiYXyT/5ny4MApH0gkD61NkchKhcNTOV9gXGgC+44AJUVlWhoaHB1gqW9HNcA6xwpF36pqK/mZOEA5lYlQZY4+8C+WhLJ7n3BUaPHE6nck9KNGnatGlw8rspwkd7Tyvqj0sRLcAq0FLAaXT+my/JeoyFGAAYHEBsKCgVlUmjftd0fk0BngF1TfEsfucjR47gnnvuwaKFC3GACfG1tbVKwRKA7Vzs3bozUE5xC7lSRK7MeUYsgvCpTkT6exHt7UK48xTBDSERJbBuHc6iALyVE+EpLUceQ3y6O0+F+WSAqDmT93in0tHRodJmpZ7X61XVRTwXFBSkL7Xj/CuNG1cAJ8ElMLqDAEYQ7GjDwKsHETr4Moab9iHS8gqME51IDAwJ4yrORcAHR/UU5J1/JQrmL0Th7Ab4Jk2B7qJzQgaKvKS8BWiTeyVHWjj2zjvvxJIlS3CcGRzLmV1ZV1en7F/VpuQdbPk+bgA2OVfAjQ30oe/lveh69gmEnnkWRtdhaEVEtBDQy0qASp+aZRPREIxQC2KvtqBvy1YMFC9Az9WLMWH1DSiauxDuImrAJsAj4DHBlc+jR49i/fr16ldJhD/ENUqrrrkG1XR02JVrR3RlHHGwzLecayM9nTj1/B/R9fNHEHvpT9AbNDirJzFZimOVcywrAXHiJqo0udSR54ce4LeqGIzBVxD89m4M7TyA4U9+DOXLV8NbUZmcz3mlACagmgBLMF9yoH/4wx/iwgUcHCn/89y5czGB4t4E2PwcSVi7HI8LDk7EmfNEzo10deDE//4KPT/5gppcXJfOgOZkPDYeREL3IhEkx3Z5YEQIMpUprZDiPEAFzMmgPMJwTCiDfoMXseN/QfsX/4rI13pRdeMH4auanAZZwJXggcR5Je/5iSeeUMH9/Px87Nq5E6tXr1b2ryhXElmyM7gyyGwPcIKEFs6MdLej/dcPov/+r0KfTIYtq0Mi1otEJMReVCF+fAjOCVXwXbsKTiaoG+EYhg9zbt75CDR/NXT6jI3+o+TqfLhp3sSKhtH1z19kSkYck25eg7yJk2HEDY4j0bQNbNu2Dffddx82c+HZQmrO/f39CDGSJObR1KlTFZfbhUvfrh22BVg4STQl4ZBI3yl0/PrnClxHfTH0/FLOrcfI1YXkzgrEu5iv/J6bUHHzx+ElN2q62KbEbrAfffvfj86f/gDh5zbCffVcJEI9VMKOwVk4CdpV5ei9+0tUxtyYfMsapWn39fZi/caNePCBB7B95w5MpzkUpaIlqwylTGIEqaysLC3Gcxz8dsPr7X4jQho5V0A6+eSjGHjoK3A1cK5l/DVBcDVXCfF3w+DCgrxFKzHp058nF1a/6Y6uggA8JRPg5fn2KT/GwHcfgPv6eorqBhi9x6AXUJOeC/T+4r/g8OWjmiAHI1Hc8aH3IVIzEzOmz8AggY1Qiog4nkbOFeVKlK3xIJ6FGLZzdCglh8QUx0Scjoqu9U+h7xefh2MaJbWPNmz4BFvtpplDoLs74Jo8GxUf/HgKXCpIFLPqHhwgImp1jxdF58/DlH/9Esrv/wHi+w4hvOEgEhTruq8Ujsrp0Dxt6H7oW2hf93uUBfLxlUf+B4cPNaplpIGiIvhp73aeOIFyxn5H2r5vGk02/WIvEU2xSj2WABLc4SH07tyEnke+Q5Es0ngGEuFOiu0Qv8+gMjVEwBtQeNX74a87T5FXvFQa59B0EdtWZLXmgH8a7dYbC5BXMwPdz/weoV/dh5jHDee8yXDWzEO8cx9Orr0T3iI/rr1mJR785aP4pw+vQQHNrpq6epxP/3NvT69K10nfX+4t5S02dPKkPd5ttYUDNy8SalEDjmHgFdq5D/+IytNGKlV1nFB7FPia7qF49iPe0gTvJbdiwrUfgJtiOJGar08jtkl8guH0FSB/ylR4Oa86z18Iw+VDdN8mPiMMvYjmUvwIBg+0oGjWHNRfeBEWLbsCw5QIzzz9NHQjrpaq1NbVqiBDYWGhkhTyPDvPw7YBOKlUkQPJvUOtzej+3c8Q3vYgHNNreC5MgIcIfpzilApOL1fg5xej6L2fQGDeRWRQJzRhJhVI+BucQyDkGVLXU1IG3/RaeGfUQp9K7tV9iLefpPgPIrq7CX3HOlA6awZmnDcXdQ1z0DBvPtz+Ajg0J7b/ZStmzpqJmTPrKGgc6YfZFWT7iGjhQBIsSkdG3+Z1GN74fboYJ0J3kq/D5F4H59zYIP3LbsTbmuBb/UUUNMxVLkcFnMmpaZKffqBAIMgJ1nXmFyBw/gL4a2dhYNFi9O3ehcHtm+AobUPkpXVovGMQVbd9EnMuuwI1N70Pl158MY40N+PI4UZyrI7wcBguUdKkmKI6+c1WItsee3SI41gEsBFF9/PPoHvtv1EJOk4PFLXmSD/pR9sUdHY48ilG82G0coOU2x9H2ZXXUd/ypOZZivZRFCUx5KkyMPj8OE2hoY5W9O/dhYGdGxHcshfRTTuRf9utKH/vKhQtuAQoLkGIdrOHGRwer+zPwfme/7WEaA7yL3k/O3GzLThYcaCI5qZDGHjul5yDW+AITCfdGe4T2SuikH5lR+FURPYchOeyz8FX10Bw3YqsGTDvadCnuVlxnwYHtW3/1DoGIqZhwuUrMHjDIfTu3Y5++rubP/JhOBZcjvwLZqFg8SIYU2sRKy1hewJwevJ5rUdp6zozLQ1xzHCwag4ZcKMbdKc18l04kXUOFk+VpKDG+rvR+cTDGHzq89AnUqlKDIunggASXAGB8x/cFYi+uB8lX/8lyq66ln5mhuuE+4WT3oWiHmNiQqXK4LqjcHcnQq8fw2DjIQzu3o7hTesQ3dUKbcnFyKubDNekcjhKqpBXW4/AnPNQMJXuU/rAkx44As2Bm82SXYCFojRtQNOmd/uf0fPTj9GBwHnWV05wB4grxXKCAMe5D4Z/BiKvtcFVvwwVn/4q/DPPU3OpMqvebU5hu9iqtHaciEVhRGOI0i6P9kjMuRO9u7ai994vI9ZCT+miYvq9Z8JZMRX+y5agYuVqSoNatp934SubIGdVRCsiEtzIqTYEd2ymV6od+qR6+pd7SV5xU8oEJ+NfguwE++RJFHzqWngn02NFuay9i9wrT0kXdW9pHfGRN4eLwSq+6EXzlpQiv7oGgdlzULZsOU4+9Vv03fcfbC63ctC2o+eBFxDatx8Va9agdNFSXsogiADNko25OYsAc2SryTOB0Kt7ENn7DeglUwhalKRg9EdEmxCGNrGWV4UYA/meJVfDP2c+NeCAIpiAPGYlde/kE9iOJEZ8HAcWlSxXgGZaoIgx5RJmjZSg9+Hv8qca2uxOhB79GdpaX4H273ei9JL30BJwZc21mZ0JQomuJH7R7hMY2r8DiX7qUn4GD+L9ylwS8BVxnTRFNL76OlC46lPk3ulJTBVXjCHAI0eOgG2+BGn5z+dziMI3eRoqb/gA/Nd/EvGdzQQ/D54V5yH89Da0P/ZbDDYdZuVk0MTk5JG3Huvj7ACc6pWI2OGWQ4i+uoGuSDorNDGXkiaTJk4NikbdWQjj1B54l30W/vmLoXt9yZGR4rCxJtBp95eBl3qRLdXPeZWTUbZiFdxXrqBnbD993Drcq2Zi6Ec/walN6xFl4oC6Rg3stCg47dZjcSILACc5QDgiER1G5OghArg16WuO01vFUJ+m0dTQXXwxuBDlRmT5/4CilR+Fu6xiLGhw1vcU0FTyHqcT/4w6FFy5GolXOf64xMVRxEQDusgHtu5A8OhrrMfEBKmvJM9ZP3LUF1oPsAxgkazsaKT7JAE+kvzucXH+ZQCBgQH+SFFXAM1gcl24EAXXfw75s+ZRdFNlEAKRULYobEcyz5oWXGEx/PX0cddTBnVRb3DE4CyfhOi6R9C/fw9iwSCbbX27rQdYJjD2U9JwYtSe48fp+qOSLJkUSZNnmFMulShytzHUB9/Sa1F06Uo6EsjNIhKzQKS3G0xK6koFavzuskq4LrweRkczTzjoiWNHqTMGD+xBlGm9qpq8WcjFWQBYRjGhjEcRpWvQ6P4THAU1BE+0ZwYRmFKjRvpgKzwzCe6KNXAWFCtRaDdwBStVFGD0b3P/LOfESQAVRgFYc1G5qmavmtoxdPx11ecEB4KVYtpagNVwFxlNPIdDiJJ7EaZY9tIjZYh4lgB9CUVcK3OobkDhio/BXTmVPJ8yqWzGvdIPGa6q8EDPYw528QSgVRiaADO6pRcXUko1Y/h4C2PclE7pC8wLx/bTWoClL9JDAh1nnpXRcUJ5IGUFghbvVfauERQiROBbzA23Z17AuYxKl3i7LCbMaMhuNk3aqru9Sfe5OGkkASGfedp9uxE5eZzZnpHUbZODfDTPONu6lgKsukWAE1xuEjvVQU5lXpTPTUCTm3lqTv4thO5GuGd+Br55SxVHvKFUmWQ8265acJ3oCCoLlM8iZTVOO7qHg5d6Y+zEcXpc6V9XJTnIU1/G9MNSgM2eGFx2Eu1sZR7zJvqdqzi/UjxLEl0oqnwa3nlL4KmqIfCp5lkt18yGZvApg5Z8qmrGOe3EaRlotfJV/OgcuIxnS3JyrKePsxBTfFmoe6tPK94sBTjdrWiY3NvM0T5Ikca4qsGMDYbd0PtXuGtvg7duvhJ1Qjq7F+XAkI7RaRM9dRLRxg1w1HAejhFMOa8TfnJwIhJDnLFkVdKESH4dy3frAB6pYA0NJke6mLxcmaDkmTiFOEV5Zl+iFCsxOxS+NuZeBYz0i0W4N9TUiNjOlxlVIsCShSKKloAp/ZSSqitXWDV0rQNYOqhAMxgJlORz2oUUXUIAjclvGKSSVV7NVQf1nJdTyzLHAbhKPJN7h1qbEGSivF7K/ngIH8OdEueWDqo+ysL0LMSGLQSYnSaYYv8aQQIc5kZiBFgS5XRmSSb6Wyieb1XeHyXaRnC8jA1bFrZRwBPlaZBLWMOb18LZMIuSiOKZGrX0g//Vm8Pr4KkkuSVJRZ23oFMWApzsDf8WDRJcfa8x10p3lnBUc5mJIVTisqHqOq4rKktSRKpbRYVk00b3LgNQhTQNBJteRf+m55TJ5yhif5icL4ESEdEwSGJWdQQKGCihN45FpRNY1DfLAWbSEhUO5loZDAsyU1JzMluS3OygaHOVc2G2h+JaiiKARVRIPnEU70QsNYuKC7J/2wZEDzwIJ9N2EsOcarjygoZ9UkRL3IS1ncVc2ehigqAqcr01fbMOYOmTFAbwMUxwE60c1hzRDnZ6uAl6xYcIMrcnklGvxHOyuh3fpXlEkY6LMPr3bENo87OMhpXRUUM0o10ctLTtJQYsc3CEjpu8WrgquFSGKymSxRpw5VnWAawy04mdeKXiYvBzpHONLWdgaGGuOqigckWfsypCQZsqWMqPnGrbUMtr6GPWpdH3HAdnkUo10iTMKdwtSfhy3NcG55QG5M+YTV81dQ3poIV9sw5g1TPpHQ/o8ZE+KhuSI12klaN0EhwSzJdi3QBPPi/TdyVZkm6NaNcJ9PzxcUQPP0n/MzMpdQZKuBBdSSRZP5XHOSfE2ZZjOX/JUviYhGdKJyvDhtYBnAYtdcAPNZAlBsxwoaOogl4sSa7jALBwhGeKrapHgMXUMcIh9GxZh9DGuyiaKXXcnHailEhMzBcPlsZpR3MFEGs7AveFt6Bo6XKuRyaHK9k+qif+3ZWtA9hsquArsV95sgBJL5aeV8GQITVqUUKE07lSwHZFJE1Ka+7fvx19j/4jF6zNoc1L+1YyUWTAsk8aA8C6t4zrj3uUilG06r3In17P35K6hZXcKzS0DuAUaEosy9zL/so8JSaSljedURc/T5jApuW5tNEGRaQKSUUODDa+jO6ff5ODsY7t5vlYF89TDouyKNzrJBdrfhjH2pG/6hsoWnyVsgzSqx8t7o11AJsdI6GUaeSYTDgp8mg2afncTsEr4i1VbCSiRawmUoNz+PUmdP92LeId6+Go4HQSbk7OJg4JETJQwoRB3VeJ+LG9cM9bgWJJxOMGbCKW1NDNQr+sB1hElTuf0o5mhURbqF3reYGkSWECbJNPc84UXCKdr6Pn2Ucx/MKP4Zq+iM6ao2wzXarsD3cRUeJb802ij527wbP9xTcxj6zu/DfmXTUnWd8x6wBOSV9RUiS/SnOKSJY0nTi/c+kHPT92Km+AqyHW14W+TU8i9Ic74KpdSInczvayQ6SezLmy8kH3VBD0ZiROAkUf/wlF8zIOXrorRbHKAueatLQOYPOJkvXAzclklT49HCQQuViOJWNSlezPv0lwKVYJTCzInXpeWIfgM1/hfh7csUXvplI1mORYBS41ZrpcjYGjSPQMI3Drd1By1XVc6SqrL2gOimKWxWLh0zniZTBzGYfmp8acx1eigydoYohZIaLbBkWBK6k2FKkGw5r92/+EwWfuYzu5Y56f3BplRp2kEUnuNt2smoNbOfQeUrllBTf/ACXXfAiuEnKz2Po26JOFABM9MTUo13Q/RbJkSgriCToI2IqUBM8uxCJO+ZKNXCQpf2DXBgSf/m/mvTIMOEE8VdSY1ShlPW77oDm44VrvYSYncOnozfej5OqbmTo7kd2k4phFsTySiKZcHHlubI5Vh0kYFp1ZlHpxFbQWAkuAJdKfSJAjslpEWya4FKkS0uwnuP2/+0/ub8lNwMsbCDg35FLKlJh43GlACzBbcj/33FqCwutuR+DiK2nLcxDIemdxU/6/A1iBl+JTOjT04hq6amdSYWmknjVAE1IULilZ4GUCq+xUilTFuTvXo/+x29kuRrnKBFwmJ8guP05KHidBDEdgtO2He84tKFz9afjnXaJSjCQUagb5k33J/rt1HDyirzIPO4orEfOSeCECTAImJMqkinC5RSDLo0QsC8MR3PhgDwZ3PIv+x29hMiAdGX5Gt8KnyJUhfp/Cyty+qeslasuAb/ndCCy/Ed6aBp4Xrk+FB23CuWyUKtYDLGKQAOtF5YweTWTyHWks2R1MxHujWACy6APymJSWGz3BbRpefBrB3/8Lt2RYQFtdls60EHgJ1FfzmNPIyZe4hnk68q/7Ggq4VtlVwgEg0TGaeopz3+iAbY6sBVgYU3GMrBikFl1YSsLwVJDLOkLJtTtjzr3yfFXYGHGVMnAw3HIYwY2PIrz32/RQzeOv3J440kNgZS9pLt7ufJn1iPmCL6Dgimvhm8W9uZgNmlamlN81dVubfVgL8AjRqzFNVilajIEnBncwwYMegiid9tzyIDkI3mUxbQKruJb3plIX6zqJ4b++iNCWR7mH9G+4W3wDbVxu20Tvmubl7nm0gY2eRnLt5chbsgb5i1fAUzk1pf0nFbIxH5B/54CxGGC2Vggs2ImiVVJNP/RSoGsrF6E1c70S86S5Ql4BLB17NzB+K7AEzwj2Idx6iDu//wHRg08xP52LtotrqdGTcyVZLiG72B5USrPngtu5wnE1d9RZAIe/KNl+aZsyMN+NBsrNxq5YD7DQhESXZDudMWDdP522JAFu46uHkZcC5hSLmZEeCWfZeQHWVHjkk8AmIkOIdbZg6MDzCO/bAOPk45S70gbmUmnU4iVBjnNqglv/63lLkfeeW+C7aBVzxRgYYRqOcl5w1CXdyvYHVyhnPcAmXuKTLqSiFeDSFepYic7fcIPRGzkH1jDGysiSAshkd/OiDD8V18q1LARX1kLFu15HuHEXgd2E2LEfq5CzXlhHCvDvDsbEZSpDitPDANdGVX8EvmWfgIcrLBxmGpG5NtkcNOrm9n/LDsAKN2ZjFZRy3iMHt5FQVGLijb+DUX0e96ikz/dsCCnAKm8Z4RLtmMfx7rYksAc2I9b0I87zEQ6smeRcAkvzR6UPOQO0x/m3lkKn4L3oq/BdtgbuqunKJam4VtrC+40Pnn3zoLMeYAVcirs43+rlnPtcF5GY9Gid+g1ijVdAK5lEscmcJgFL1c+AtMJhUlL+33hvOzdO4/ZMBwns4W9xfudPfgJbVpi0u6NcJOYWt6KsaNxJm3c+fNd8H/kL6ZEKMIbLwaK0ZGVGZfD85NNt9249wCYJlBglFxNgvXQp58PvAYHFMF6+EzFuDeiat4omFFVs+nWJMl8cFGfi6tRYMe1ZY6AT0ab93LnnL4geuZ+uxuMEr0b9BTRxpiTCr3M+5Zrd/GlU7Nq4hOY4nLNvQ96lH4W3/kKCzulBiWM+zgbBApNcZ/uZHYAFKAGYH2Iq6VMvgtHMr2VMK/VGET/4EJUc7s9ct5RgmMniqS6qgSGo8mK5D/9LMQa7mOTWiOgrW5jp+BCBO8gN8qbRV0xxb9BJwdQaCdCLR8rghihG+04++zy4r7kL3nnLmLdck+R+AVdxbfK+4/09+3tVEiSjp5Vb966F8eo3kWACHldLE+yb4Dj/g1S6ZhEoxo898vIp84p7wyrxLX9Sxwj2Kk6MHtlFUfwrpZHDQ63XTRHPkpBghsb5FpQGIdq1fXSNcnp21H8ZnguWU5G6kIEhxm5l4MjrHAJX+p9dgEXsppjROHEEsZf/DOP4Ti5E20cnwx5yHhsYWM4UiVnUtmv5OVFtiSDZl8lFbN30Mh0mN24ksLuIGuPKnim8JW/KTEe1DkrEsjhQhqnJcVxolZ+Be/blcNcvYiBhCrnalQRWUSMlDuT4HClZBphUFK5Jza2JIAHjtg6JTjo9Oo+QM48RuFaC00mwiLbaR+sETZxhfifI9F8n6HlSy1Al41bn3CrsGaeDO06YZfDIy0VRXzIXzukXwlm3CK5KBhJkI3GR76qSHJ574LJX2eZgaQLLCJDFhSimjEGnhPojVpxbExTDCdnfYphhxeFu5bAwuOYH3JU2EeGe0qyfiAXJ8eRUeqFUCquIdB/93X5q5EXVcHAXW+FYtRWieCpM9JNei2Q7zsH37HNwmqhkNUV0ctJIbhLARczKbxK5Ud/lkxwtyhODBbIITP6gBmL8FJHrJriy5b5oxPyu0oTUqgnhWF6nyluek27HuXVgI4CFsAIcP0RaKrDlmNyWUUmBrgbHGa4xOdbUvjO65/ivZDOARxJUkGZJfSS/jHwXQPnd5HYZFKoIl5rX8tP8XX4beZysfM6/2xjg0dI+BbhcpsBOIz7aG51T9bPj6BgTEhLQHKanUfYMk9VpdXInxjEFcgCPY/AyaXoO4EyoNI7r5AAex+Bl0vQcwJlQaRzXyQE8jsHLpOk5gDOh0jiukwN4HIOXSdNzAGdCpXFcJwfwOAYvk6bnAM6ESuO4Tg7gcQxeJk3PAZwJlcZxnRzA4xi8TJqeAzgTKo3jOv8H1R6W26jPIb0AAAAASUVORK5CYII= + mediatype: image/png + maintainers: + - name: Tim Kaczynski + email: kaczynsk@us.ibm.com + - name: Ed Mezarina + email: mezarina@us.ibm.com + - name: Dan Cleyrat + email: dacleyra@us.ibm.com + links: + - name: Kabanero.io + url: https://kabanero.io + - name: Kabanero Operator + url: https://github.com/kabanero-io/kabanero-operator + keywords: + - 'Microservice' + - 'Knative' + - 'Istio' + - 'Codewind' + - 'Appsody' + - 'Tekton' + customresourcedefinitions: + owned: + - kind: Stack + name: stacks.kabanero.io + version: v1alpha2 + group: kabanero.io + description: Kabanero Stack + displayName: Kabanero Stack + resources: + - kind: Pipeline + name: '' + version: v1alpha1 + - kind: Task + name: '' + version: v1alpha1 + - kind: Condition + name: '' + version: v1alpha1 + - kind: ServiceAccount + name: '' + version: v1 + statusDescriptors: + - description: Version of the stack + displayName: Version + path: activeVersion + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: The URL where the stack is located + displayName: Location + path: activeLocation + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: The status of the stack + displayName: Status + path: status + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - kind: Kabanero + name: kabaneros.kabanero.io + version: v1alpha2 + group: kabanero.io + description: Kabanero Platform + displayName: Kabanero + resources: + - kind: Stack + name: "" + version: v1alpha2 + - kind: ConfigMap + name: "" + version: v1 + - kind: Deployment + name: "" + version: v1 + - kind: Pod + name: "" + version: v1 + - kind: Role + name: "" + version: v1 + - kind: RoleBinding + name: "" + version: v1 + - kind: ServiceAccount + name: "" + version: v1 + statusDescriptors: + - description: Kabanero foundation version + displayName: Version + path: kabaneroInstance.version + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: Kabanero operator readiness status. + displayName: Kabanero Readiness + path: kabaneroInstance.ready + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: Serverless readiness status. + displayName: Serverless Readiness + path: serverless.ready + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: Knative serving readiness status. + displayName: Knative Serving Readiness + path: serverless.knativeServing.ready + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: Tekton readiness status. + displayName: Tekton Readiness + path: tekton.ready + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: Kabanero CLI service readiness status. + displayName: Kabanero CLI Readiness + path: cli.ready + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: Appsody readiness status. + displayName: Appsody Readiness + path: appsody.ready + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + # The required CRDs are not listed due to OLM's random catalog selection, + # but the following are required: + # Knative Serving, Tekton, Appsody + required: + install: + spec: + deployments: + - name: kabanero-operator + spec: + replicas: 1 + selector: + matchLabels: + name: kabanero-operator + strategy: {} + template: + metadata: + labels: + name: kabanero-operator + app.kubernetes.io/name: kabanero + app.kubernetes.io/instance: + app.kubernetes.io/version: '0.10.0' + app.kubernetes.io/component: operator + app.kubernetes.io/part-of: kabanero + app.kubernetes.io/managed-by: olm + spec: + containers: + - command: + - kabanero-operator + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: kabanero-operator + image: kabanero/kabanero-operator:latest + imagePullPolicy: Always + name: kabanero-operator + resources: {} + serviceAccountName: kabanero-operator + clusterPermissions: + - rules: + - apiGroups: + - '*' + resources: + - '*' + verbs: + - '*' + - nonResourceURLs: + - '*' + verbs: + - '*' + serviceAccountName: kabanero-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: false + type: AllNamespaces + provider: + name: IBM diff --git a/deploy/crds/kabanero.io_collections_crd.yaml b/registry/manifests/kabanero-operator/0.9.0/kabanero.io_collections_crd.yaml similarity index 100% rename from deploy/crds/kabanero.io_collections_crd.yaml rename to registry/manifests/kabanero-operator/0.9.0/kabanero.io_collections_crd.yaml diff --git a/registry/manifests/kabanero-operator/0.9.0/kabanero.io_kabaneros_crd.yaml b/registry/manifests/kabanero-operator/0.9.0/kabanero.io_kabaneros_crd.yaml new file mode 100644 index 00000000..bbb58bb7 --- /dev/null +++ b/registry/manifests/kabanero-operator/0.9.0/kabanero.io_kabaneros_crd.yaml @@ -0,0 +1,977 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: kabaneros.kabanero.io +spec: + additionalPrinterColumns: + - JSONPath: .metadata.creationTimestamp + description: CreationTimestamp is a timestamp representing the server time when + this object was created. It is not guaranteed to be set in happens-before order + across separate operations. + name: Age + type: date + - JSONPath: .status.kabaneroInstance.version + description: Kabanero operator instance version. + name: Version + type: string + - JSONPath: .status.kabaneroInstance.ready + description: Kabanero operator instance readiness status. The status is directly + correlated to the availability of the operator's resources dependencies. + name: Ready + type: string + group: kabanero.io + names: + kind: Kabanero + listKind: KabaneroList + plural: kabaneros + singular: kabanero + scope: Namespaced + subresources: + status: {} + version: v1alpha1 + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: KabaneroSpec defines the desired state of Kabanero + properties: + admissionControllerWebhook: + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + che: + description: CheCustomizationSpec defines customization entries for + Che. + properties: + cheOperatorInstance: + description: CheOperatorInstanceSpec defines customization entries + for the Che operator instance. + properties: + cheWorkspaceClusterRole: + type: string + type: object + enable: + type: boolean + kabaneroChe: + description: KabaneroCheSpec defines customization entries for + Kabanero Che. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + type: object + cliServices: + description: KabaneroCliServicesCustomizationSpec defines customization + entries for the Kabanero CLI. + properties: + image: + type: string + repository: + type: string + sessionExpirationSeconds: + type: string + tag: + type: string + version: + description: 'Future: Enable bool `json:"enable,omitempty"`' + type: string + type: object + collectionController: + description: CollectionControllerSpec defines customization entried + for the Kabanero collection controller. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + collections: + description: InstanceCollectionConfig defines the customization entries + for a set of collections. + properties: + repositories: + items: + description: RepositoryConfig defines customization entries + for a collection. + properties: + activateDefaultCollections: + type: boolean + name: + type: string + skipCertVerification: + type: boolean + url: + type: string + type: object + type: array + type: object + events: + properties: + enable: + type: boolean + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + github: + description: GithubConfig represents the Github information (public + or GHE) where the organization and teams managing the collections + live. Members of the specified team in the specified organization + will have admin authority in the Kabanero CLI. + properties: + apiUrl: + type: string + organization: + type: string + teams: + items: + type: string + type: array + type: object + landing: + description: KabaneroLandingCustomizationSpec defines customization + entries for Kabanero landing page. + properties: + enable: + type: boolean + version: + type: string + type: object + targetNamespaces: + items: + type: string + type: array + tekton: + description: TektonCustomizationSpec defines customization entries + for Tekton + properties: + disabled: + type: boolean + version: + type: string + type: object + version: + type: string + type: object + status: + description: KabaneroStatus defines the observed state of the Kabanero + instance. + properties: + admissionControllerWebhook: + description: Admission webhook instance status + properties: + errorMessage: + type: string + ready: + type: string + type: object + appsody: + description: Appsody instance readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + che: + description: Che instance readiness status. + properties: + cheOperator: + description: CheOperatorStatus defines the observed status details + of the Che operator. + properties: + version: + type: string + type: object + errorMessage: + type: string + kabaneroChe: + description: KabaneroCheStatus defines the observed status details + of Kabanero Che. + properties: + version: + type: string + type: object + kabaneroCheInstance: + description: KabaneroCheInstanceStatus defines the observed status + details of Che instance. + properties: + cheImage: + type: string + cheImageTag: + type: string + cheWorkspaceClusterRole: + type: string + type: object + ready: + type: string + type: object + cli: + description: CLI readiness status. + properties: + errorMessage: + type: string + hostnames: + items: + type: string + type: array + ready: + type: string + type: object + collectionController: + description: Kabanero collection controller readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + events: + description: Events instance status + properties: + errorMessage: + type: string + hostnames: + items: + type: string + type: array + ready: + type: string + type: object + kabaneroInstance: + description: Kabanero operator instance readiness status. The status + is directly correlated to the availability of resources dependencies. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + kappnav: + description: Kabanero Application Navigator instance readiness status. + properties: + apiLocations: + items: + type: string + type: array + errorMessage: + type: string + ready: + type: string + uiLocations: + items: + type: string + type: array + type: object + knativeEventing: + description: Knative eventing instance readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + landing: + description: Kabanero Landing page readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + serverless: + description: OpenShift serverless operator status. + properties: + errorMessage: + type: string + knativeServing: + description: KnativeServingStatus defines the observed status + details of Knative Serving. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + ready: + type: string + version: + type: string + type: object + tekton: + description: Tekton instance readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + type: object + type: object + served: true + storage: false + - name: v1alpha2 + schema: + openAPIV3Schema: + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: KabaneroSpec defines the desired state of Kabanero + properties: + admissionControllerWebhook: + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + cliServices: + description: KabaneroCliServicesCustomizationSpec defines customization + entries for the Kabanero CLI. + properties: + image: + type: string + repository: + type: string + sessionExpirationSeconds: + type: string + tag: + type: string + version: + description: 'Future: Enable bool `json:"enable,omitempty"`' + type: string + type: object + codeReadyWorkspaces: + description: CRWCustomizationSpec defines customization entries for + codeready-workspaces. + properties: + enable: + type: boolean + operator: + description: CRWOperatorSpec defines customization entries for + the codeready-workspaces operator. + properties: + customResourceInstance: + description: CRWOperatorCustomResourceSpec defines custom + resource customization entries for the codeready-workspaces + operator. + properties: + cheWorkspaceClusterRole: + type: string + devFileRegistryImage: + description: CWRCustomResourceDevFileRegImage defines + DevFileRegistryImage custom resource customization for + the codeready-workspaces operator. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + openShiftOAuth: + type: boolean + selfSignedCert: + type: boolean + tlsSupport: + type: boolean + type: object + type: object + type: object + collectionController: + description: CollectionControllerSpec defines customization entried + for the Kabanero collection controller. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + events: + properties: + enable: + type: boolean + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + github: + description: GithubConfig represents the Github information (public + or GHE) where the organization and teams managing the stacks live. Members + of the specified team in the specified organization will have admin + authority in the Kabanero CLI. + properties: + apiUrl: + type: string + organization: + type: string + teams: + items: + type: string + type: array + type: object + gitops: + properties: + pipelines: + items: + description: PipelineSpec defines a set of pipelines and associated + resources for a component. + properties: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a + file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + type: object + governancePolicy: + description: GovernancePolicyConfig defines customization entries + for governance policies. + properties: + stackPolicy: + type: string + type: object + landing: + description: KabaneroLandingCustomizationSpec defines customization + entries for Kabanero landing page. + properties: + enable: + type: boolean + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + sso: + properties: + adminSecretName: + type: string + enable: + type: boolean + provider: + type: string + type: object + stackController: + description: StackControllerSpec defines customization entried for + the Kabanero stack controller. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + stacks: + description: InstanceStackConfig defines the customization entries + for a set of stacks. + properties: + pipelines: + items: + description: PipelineSpec defines a set of pipelines and associated + resources for a component. + properties: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a + file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + repositories: + items: + description: RepositoryConfig defines customization entries + for a stack. + properties: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a + file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + name: + type: string + pipelines: + items: + description: PipelineSpec defines a set of pipelines and + associated resources for a component. + properties: + gitRelease: + description: GitReleaseSpec defines customization + entries for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve + a file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + type: object + type: array + skipRegistryCertVerification: + type: boolean + type: object + targetNamespaces: + items: + type: string + type: array + triggers: + items: + description: TriggerSpec defines the sets of default triggers for + the stacks + properties: + gitRelease: + description: GitReleaseSpec defines customization entries for + a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a file + over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + version: + type: string + type: object + status: + description: KabaneroStatus defines the observed state of the Kabanero + instance. + properties: + admissionControllerWebhook: + description: Admission webhook instance status + properties: + message: + type: string + ready: + type: string + type: object + appsody: + description: Appsody instance readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + cli: + description: CLI readiness status. + properties: + hostnames: + items: + type: string + type: array + message: + type: string + ready: + type: string + type: object + codereadyWorkspaces: + description: Codeready-workspaces instance readiness status. + properties: + message: + type: string + operator: + description: CRWOperatorStatus defines the observed status details + of the codeready-workspaces operator. + properties: + instance: + description: CRWInstanceStatus defines the observed status + details of the codeready-workspaces operator custom resource. + properties: + cheWorkspaceClusterRole: + type: string + devfileRegistryImage: + type: string + openShiftOAuth: + type: boolean + selfSignedCert: + type: boolean + tlsSupport: + type: boolean + required: + - cheWorkspaceClusterRole + - devfileRegistryImage + - openShiftOAuth + - selfSignedCert + - tlsSupport + type: object + version: + type: string + type: object + ready: + type: string + type: object + collectionController: + description: Kabanero collection controller readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + events: + description: Events instance status + properties: + hostnames: + items: + type: string + type: array + message: + type: string + ready: + type: string + type: object + gitops: + description: The status of the gitops pipelines + properties: + message: + type: string + pipelines: + items: + description: PipelineStatus defines the observed state of the + assets located within a single pipeline .tar.gz. + properties: + activeAssets: + items: + description: RepositoryAssetStatus defines the observed + state of a single asset in a pipelines respository. + properties: + assetDigest: + type: string + assetName: + type: string + group: + type: string + kind: + type: string + namespace: + type: string + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + digest: + type: string + gitRelease: + description: GitReleaseInfo is all of the GitReleaseSpec + information, minus the "skip cert verification" information, + which is not relevant for status. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + type: object + name: + type: string + url: + type: string + type: object + type: array + ready: + type: string + type: object + kabaneroInstance: + description: Kabanero operator instance readiness status. The status + is directly correlated to the availability of resources dependencies. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + kappnav: + description: Kabanero Application Navigator instance readiness status. + properties: + apiLocations: + items: + type: string + type: array + message: + type: string + ready: + type: string + uiLocations: + items: + type: string + type: array + type: object + landing: + description: Kabanero Landing page readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + serverless: + description: OpenShift serverless operator status. + properties: + knativeServing: + description: KnativeServingStatus defines the observed status + details of Knative Serving. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + message: + type: string + ready: + type: string + version: + type: string + type: object + sso: + description: SSO server status + properties: + configured: + type: string + message: + type: string + ready: + type: string + type: object + stackController: + description: Kabanero stack controller readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + tekton: + description: Tekton instance readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + type: object + type: object + served: true + storage: true diff --git a/registry/manifests/kabanero-operator/0.9.0/kabanero.io_stacks_crd.yaml b/registry/manifests/kabanero-operator/0.9.0/kabanero.io_stacks_crd.yaml new file mode 100644 index 00000000..854aa37d --- /dev/null +++ b/registry/manifests/kabanero-operator/0.9.0/kabanero.io_stacks_crd.yaml @@ -0,0 +1,210 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: stacks.kabanero.io +spec: + additionalPrinterColumns: + - JSONPath: .metadata.creationTimestamp + description: CreationTimestamp is a timestamp representing the server time when + this object was created. It is not guaranteed to be set in happens-before order + across separate operations. + name: Age + type: date + - JSONPath: .status.summary + description: Stack summary. + name: Summary + type: string + group: kabanero.io + names: + kind: Stack + listKind: StackList + plural: stacks + singular: stack + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + description: Stack is the Schema for the stack API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: StackSpec defines the desired composition of a Stack + properties: + name: + type: string + versions: + items: + description: StackVersion defines the desired composition of a specific + stack version. + properties: + desiredState: + type: string + images: + items: + description: Image defines a container image used by a stack + properties: + id: + type: string + image: + type: string + type: object + type: array + pipelines: + items: + description: PipelineSpec defines a set of pipelines and associated + resources for a component. + properties: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a + file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + skipCertVerification: + type: boolean + skipRegistryCertVerification: + type: boolean + version: + type: string + type: object + type: array + type: object + status: + description: StackStatus defines the observed state of a stack + properties: + statusMessage: + type: string + summary: + type: string + versions: + items: + description: StackVersionStatus defines the observed state of a specific + stack version. + properties: + images: + items: + description: ImageStatus defines a container image status used + by a stack + properties: + digest: + description: ImageDigest defines a container image digest + used by a stack + properties: + activation: + type: string + message: + type: string + type: object + id: + type: string + image: + type: string + type: object + type: array + location: + type: string + pipelines: + items: + description: PipelineStatus defines the observed state of the + assets located within a single pipeline .tar.gz. + properties: + activeAssets: + items: + description: RepositoryAssetStatus defines the observed + state of a single asset in a pipelines respository. + properties: + assetDigest: + type: string + assetName: + type: string + group: + type: string + kind: + type: string + namespace: + type: string + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + digest: + type: string + gitRelease: + description: GitReleaseInfo is all of the GitReleaseSpec + information, minus the "skip cert verification" information, + which is not relevant for status. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + type: object + name: + type: string + url: + type: string + type: object + type: array + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + type: object + type: object + version: v1alpha2 + versions: + - name: v1alpha2 + served: true + storage: true diff --git a/registry/manifests/kabanero-operator/kabanero-operator-package.yaml b/registry/manifests/kabanero-operator/kabanero-operator-package.yaml index c4bdf809..e12463f8 100644 --- a/registry/manifests/kabanero-operator/kabanero-operator-package.yaml +++ b/registry/manifests/kabanero-operator/kabanero-operator-package.yaml @@ -16,5 +16,7 @@ channels: currentCSV: kabanero-operator.v0.8.0 - name: release-0.9 currentCSV: kabanero-operator.v0.9.0 -defaultChannel: release-0.9 +- name: release-0.10 + currentCSV: kabanero-operator.v0.10.0 +defaultChannel: release-0.10 From 5977a82353274fb055c1e757809408fe4f05a549 Mon Sep 17 00:00:00 2001 From: Daniel Cleyrat Date: Wed, 13 May 2020 16:01:59 -0400 Subject: [PATCH 02/15] remove collections --- build/Dockerfile | 2 +- .../samples/override_software_versions.yaml | 10 ++-- config/samples/simple.yaml | 2 +- contrib/gen_operator_deployment.sh | 1 - deploy/install.sh | 7 +-- deploy/kabanero-subscriptions.yaml | 2 +- deploy/uninstall.sh | 2 +- doc/collections.md | 40 -------------- doc/resources.md | 16 +++--- doc/stacks.md | 55 +++++++++++++++++++ 10 files changed, 75 insertions(+), 62 deletions(-) delete mode 100644 doc/collections.md create mode 100644 doc/stacks.md diff --git a/build/Dockerfile b/build/Dockerfile index b08c6662..ff0bd4eb 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -4,7 +4,7 @@ FROM registry.access.redhat.com/ubi7/ubi-minimal:latest LABEL vendor="Kabanero" \ name="Kabanero Operator" \ summary="Image for Kabanero Operator" \ - description="This image contains the controller for the Kabanero Foundation and Collection. See https://github.com/kabanero-io/kabanero-operator/" + description="This image contains the controller for the Kabanero Foundation. See https://github.com/kabanero-io/kabanero-operator/" # The license must be here for Redhat container certification COPY LICENSE /licenses/ diff --git a/config/samples/override_software_versions.yaml b/config/samples/override_software_versions.yaml index df2af341..f34f9233 100644 --- a/config/samples/override_software_versions.yaml +++ b/config/samples/override_software_versions.yaml @@ -1,4 +1,4 @@ -apiVersion: kabanero.io/v1alpha1 +apiVersion: kabanero.io/v1alpha2 kind: Kabanero metadata: name: kabanero1 @@ -9,7 +9,7 @@ spec: # Overrides the internally determined CLI services version with the provided value version: "0.1.0" --- -apiVersion: kabanero.io/v1alpha1 +apiVersion: kabanero.io/v1alpha2 kind: Kabanero metadata: name: kabanero1 @@ -18,7 +18,7 @@ spec: # Overrides the internally determined CLI services image with the provided value image: kabanero/kabanero-command-line-services:0.1.0 --- -apiVersion: kabanero.io/v1alpha1 +apiVersion: kabanero.io/v1alpha2 kind: Kabanero metadata: name: kabanero2 @@ -28,7 +28,7 @@ spec: # The tag will be internally determined repository: kabanero/kabanero-command-line-services --- -apiVersion: kabanero.io/v1alpha1 +apiVersion: kabanero.io/v1alpha2 kind: Kabanero metadata: name: kabanero2 @@ -38,7 +38,7 @@ spec: # The repository will be internally determined tag: "0.1.1" --- -apiVersion: kabanero.io/v1alpha1 +apiVersion: kabanero.io/v1alpha2 kind: Kabanero metadata: name: kabanero3 diff --git a/config/samples/simple.yaml b/config/samples/simple.yaml index 12ecc413..612aa82e 100644 --- a/config/samples/simple.yaml +++ b/config/samples/simple.yaml @@ -1,4 +1,4 @@ -apiVersion: kabanero.io/v1alpha1 +apiVersion: kabanero.io/v1alpha2 kind: Kabanero metadata: name: kabanero diff --git a/contrib/gen_operator_deployment.sh b/contrib/gen_operator_deployment.sh index babff880..1bc4ec9c 100755 --- a/contrib/gen_operator_deployment.sh +++ b/contrib/gen_operator_deployment.sh @@ -130,7 +130,6 @@ EOF # Add all needed yaml files. cat $DEST_DIR/dependencies.yaml >> $DEST_FILE_TMP; echo "---" >> $DEST_FILE_TMP cat $DEST_DIR/crds/kabanero_kabanero_crd.yaml >> $DEST_FILE_TMP; echo "---" >> $DEST_FILE_TMP -cat $DEST_DIR/crds/kabanero_collection_crd.yaml >> $DEST_FILE_TMP; echo "---" >> $DEST_FILE_TMP cat $DEST_DIR/service_account.yaml >> $DEST_FILE_TMP; echo "---" >> $DEST_FILE_TMP cat $DEST_DIR/operator.yaml >> $DEST_FILE_TMP; echo "---" >> $DEST_FILE_TMP; echo cat $DEST_DIR/role.yaml >> $DEST_FILE_TMP; echo "---" >> $DEST_FILE_TMP; diff --git a/deploy/install.sh b/deploy/install.sh index f4f5d755..d652c727 100755 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -333,7 +333,7 @@ fi # Create service account to used by pipelines oc apply -f $KABANERO_CUSTOMRESOURCES_YAML --selector kabanero.io/install=24-pipeline-sa -# Role used by the collection controller to manipulate triggers in the +# Role used to manipulate triggers in the # tekton-pipelines namespace (for use by tekton github webhooks extension) oc apply -f $KABANERO_CUSTOMRESOURCES_YAML --selector kabanero.io/install=25-triggers-role @@ -351,9 +351,8 @@ sleep 3 echo "***************************************************************************" echo "* " echo "* The installation script is complete. You can now create an instance " -echo "* of the Kabanero CR. If you have cloned and curated a collection set, " -echo "* apply the Kabanero CR that you created. Or, to create the default " -echo "* instance: " +echo "* of the Kabanero CR. If you have cloned and curated a stack hub, apply " +echo "* the Kabanero CR that you created. Or, to create the default instance: " echo "* " echo "* oc apply -n kabanero -f ${SAMPLE_KAB_INSTANCE_URL} " echo "* " diff --git a/deploy/kabanero-subscriptions.yaml b/deploy/kabanero-subscriptions.yaml index 3fd24611..29c17032 100644 --- a/deploy/kabanero-subscriptions.yaml +++ b/deploy/kabanero-subscriptions.yaml @@ -169,7 +169,7 @@ metadata: labels: kabanero.io/install: 14-subscription spec: - channel: release-0.9 + channel: release-0.10 installPlanApproval: Automatic name: kabanero-operator source: kabanero-catalog diff --git a/deploy/uninstall.sh b/deploy/uninstall.sh index 51fa33b2..92a388de 100755 --- a/deploy/uninstall.sh +++ b/deploy/uninstall.sh @@ -99,7 +99,7 @@ oc delete serviceaccounts,deployments --selector=kabanero.io/component=kappnav - oc delete clusterroles,clusterrolebindings,crds --selector=kabanero.io/component=kappnav --ignore-not-found oc delete namespaces --selector=kabanero.io/component=kappnav --ignore-not-found -# Delete the Role used by the collection controller to manipulate triggers +# Delete the Role used to manipulate triggers oc delete --ignore-not-found -f $KABANERO_CUSTOMRESOURCES_YAML --selector kabanero.io/install=25-triggers-role # Tekton Dashboard diff --git a/doc/collections.md b/doc/collections.md deleted file mode 100644 index 04fdde35..00000000 --- a/doc/collections.md +++ /dev/null @@ -1,40 +0,0 @@ -# Collections - -Collection contents are maintained in a Kabanero repository. A Kabanero instance refers to one or more collections repositories and can additionally specify whether *featured* collections are to be activated through the `enableFeatured` attribute. - -*TODO:* consider moving the enableFeatured attribute to the repository. - -## Collection Activation - -Collections are said to be *activated* based upon the presence of a Collection resource kind which references a collection by name and version. When searching for a collection by name, the repository ordering found in the Kabanero instance will be respected. - -## Collection Upgrade - -Only one version of a collection can be active in a particular namespace at a time. The collection resource will reference the currently activated version. By updating the 'version' attribute of the collection spec, a new version can be activated. - -## Featured Collections - -The maintainer of a collections repository can choose to flag certain collections are being "featured". When a collections repository is added to a Kabanero instance and the installation of featured collections is enabled, the featured collections are identified and activated. - -## Removal of Collection Repositories - -A collection repository can be removed from a Kabanero instance by updating the collection repository list, for example: - -``` - collections: - repositories: - - name: experimental - url: https://github.com/kabanero-io/kabanero-collection/blob/master/experimental - - name: my-experimental - url: https://myrepo.com/experimental -``` - -could be changed to: -``` - collections: - repositories: - - name: experimental - url: https://myrepo.com/experimental -``` - -When a collection repository is removed from the list, no action is taken unless all of the referenced collection resources have also been removed. diff --git a/doc/resources.md b/doc/resources.md index f16a4b85..ab539cc3 100644 --- a/doc/resources.md +++ b/doc/resources.md @@ -3,7 +3,7 @@ A Kabanero instance is described by a resource definition with `kind: Kabanero`: ``` -apiVersion: kabanero.io/v1alpha1 +apiVersion: kabanero.io/v1alpha2 kind: Kabanero metadata: name: kabanero @@ -15,16 +15,16 @@ Creation of a Kabanero Instance has multiple impacts: * May cause cluster level configuration, such as KNative Serving being enabled on the cluster * May cause deployment of instance specific resources, such as dashboard user interfaces, API endpoints, etc. -## Collections +## Stacks -A collection is scoped to a namespace. When a collection is applied, there may be a number of Kubernetes resources which come with the collection, and these are applied into the same namespace as the collection resource. +A stack is scoped to a namespace. When a stack is applied, there may be a number of Kubernetes resources which come with the stack, and these are applied into the same namespace as the stack resource. ### Example -The following `Collection` resource is assigned to the namespace `mynamespace`: +The following `Stack` resource is assigned to the namespace `mynamespace`: ``` -apiVersion: kabanero.io/v1alpha1 -kind: Collection +apiVersion: kabanero.io/v1alpha2 +kind: Stack metadata: name: java-microprofile namespace: mynamespace @@ -32,7 +32,7 @@ spec: version: 1.0.0 ``` -This collection will create a number of Tekton pipelines in the same namespace: +This stack will create a number of Tekton pipelines in the same namespace: ``` apiVersion: kind: Pipeline @@ -43,4 +43,4 @@ spec: ... ``` -For further details see [collections](collections.md) \ No newline at end of file +For further details see [stacks](stacks.md) \ No newline at end of file diff --git a/doc/stacks.md b/doc/stacks.md new file mode 100644 index 00000000..30fa398a --- /dev/null +++ b/doc/stacks.md @@ -0,0 +1,55 @@ +# Stacks + +Stack contents are maintained in a Kabanero repository. A Kabanero instance refers to one or more stacks repositories and can additionally specify whether *featured* stacks are to be activated through the `enableFeatured` attribute. + +*TODO:* consider moving the enableFeatured attribute to the repository. + +## Stack Activation + +Stacks are said to be *activated* based upon the presence of a Stack resource kind which references a stack by name and version. When searching for a stack by name, the repository ordering found in the Kabanero instance will be respected. + +## Stack Upgrade + +Only one version of a stack can be active in a particular namespace at a time. The stack resource will reference the currently activated version. By updating the 'version' attribute of the stack spec, a new version can be activated. + +## Featured Stacks + +The maintainer of a stacks repository can choose to flag certain stacks are being "featured". When a stacks repository is added to a Kabanero instance and the installation of featured stacks is enabled, the featured stacks are identified and activated. + +## Removal of Stack Repositories + +A stack repository can be removed from a Kabanero instance by updating the stack repository list, for example: + +``` + stacks: + # A list of those repositories which are searched for stacks + repositories: + - name: release-0.8 + https: + url: https://github.com/kabanero-io/kabanero-stack-hub/releases/download/0.8.0/kabanero-stack-hub-index.yaml + - name: incubator + https: + url: https://github.com/kabanero-io/kabanero-stack-hub/releases/download/0.9.0-rc.1/kabanero-stack-hub-index.yaml + pipelines: + - id: default + sha256: 3f3e440b3eed24273fd43c40208fdd95de6eadeb82b7bb461f52e1e5da7e239d + https: + url: https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.8.0/default-kabanero-pipelines.tar.gz +``` + +could be changed to: +``` + stacks: + # A list of those repositories which are searched for stacks + repositories: + - name: release-0.8 + https: + url: https://github.com/kabanero-io/kabanero-stack-hub/releases/download/0.8.0/kabanero-stack-hub-index.yaml + pipelines: + - id: default + sha256: 3f3e440b3eed24273fd43c40208fdd95de6eadeb82b7bb461f52e1e5da7e239d + https: + url: https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.8.0/default-kabanero-pipelines.tar.gz +``` + +When a stack repository is removed from the list, no action is taken unless all of the referenced stack resources have also been removed. From d596d8dd27e48e991ad59c8b32c2baa7ed16a43f Mon Sep 17 00:00:00 2001 From: Daniel Cleyrat Date: Tue, 2 Jun 2020 11:28:46 -0400 Subject: [PATCH 03/15] serving for devfile --- Makefile | 4 +- build/Dockerfile | 3 + cmd/serving/index.json | 66 +++++++++ cmd/serving/main.go | 17 +++ .../orchestrations/serving/0.1/serving.yaml | 80 +++++++++++ config/samples/full.yaml | 11 ++ config/versions.yaml | 5 + deploy/crds/kabanero.io_kabaneros_crd.yaml | 11 ++ pkg/apis/kabanero/v1alpha2/kabanero_types.go | 9 ++ .../v1alpha2/zz_generated.deepcopy.go | 17 +++ .../kabaneroplatform_controller.go | 9 +- pkg/controller/kabaneroplatform/serving.go | 129 ++++++++++++++++++ 12 files changed, 359 insertions(+), 2 deletions(-) create mode 100644 cmd/serving/index.json create mode 100644 cmd/serving/main.go create mode 100644 config/orchestrations/serving/0.1/serving.yaml create mode 100644 pkg/controller/kabaneroplatform/serving.go diff --git a/Makefile b/Makefile index 46e7ff0d..19e7b0b4 100755 --- a/Makefile +++ b/Makefile @@ -73,6 +73,7 @@ build: generate GO111MODULE=on go install ./cmd/manager/collection GO111MODULE=on go install ./cmd/manager/stack GO111MODULE=on go install ./cmd/admission-webhook + GO111MODULE=on go install ./cmd/serving build-image: generate # These commands were taken from operator-sdk 0.8.1. The sdk did not let us @@ -83,6 +84,7 @@ build-image: generate GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -o build/_output/bin/kabanero-operator-collection-controller -gcflags "all=-trimpath=$(GOPATH)" -asmflags "all=-trimpath=$(GOPATH)" -ldflags "-X main.GitTag=$(TRAVIS_TAG) -X main.GitCommit=$(TRAVIS_COMMIT) -X main.GitRepoSlug=$(TRAVIS_REPO_SLUG) -X main.BuildDate=`date -u +%Y%m%d.%H%M%S`" github.com/kabanero-io/kabanero-operator/cmd/manager/collection GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -o build/_output/bin/kabanero-operator-stack-controller -gcflags "all=-trimpath=$(GOPATH)" -asmflags "all=-trimpath=$(GOPATH)" -ldflags "-X main.GitTag=$(TRAVIS_TAG) -X main.GitCommit=$(TRAVIS_COMMIT) -X main.GitRepoSlug=$(TRAVIS_REPO_SLUG) -X main.BuildDate=`date -u +%Y%m%d.%H%M%S`" github.com/kabanero-io/kabanero-operator/cmd/manager/stack GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -o build/_output/bin/admission-webhook -gcflags "all=-trimpath=$(GOPATH)" -asmflags "all=-trimpath=$(GOPATH)" -ldflags "-X main.GitTag=$(TRAVIS_TAG) -X main.GitCommit=$(TRAVIS_COMMIT) -X main.GitRepoSlug=$(TRAVIS_REPO_SLUG) -X main.BuildDate=`date -u +%Y%m%d.%H%M%S`" github.com/kabanero-io/kabanero-operator/cmd/admission-webhook + GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -o build/_output/bin/serving -gcflags "all=-trimpath=$(GOPATH)" -asmflags "all=-trimpath=$(GOPATH)" -ldflags "-X main.GitTag=$(TRAVIS_TAG) -X main.GitCommit=$(TRAVIS_COMMIT) -X main.GitRepoSlug=$(TRAVIS_REPO_SLUG) -X main.BuildDate=`date -u +%Y%m%d.%H%M%S`" github.com/kabanero-io/kabanero-operator/cmd/serving docker build -f build/Dockerfile -t $(IMAGE) . @@ -197,7 +199,7 @@ ifndef GITHUB_TOKEN endif mkdir -p build/bin curl -L https://github.com/mitchellh/golicense/releases/download/v0.2.0/golicense_0.2.0_$(detected_OS)_x86_64.tar.gz | tar -C build/bin -xzf - golicense - build/bin/golicense -plain ./license-rules.json build/_output/bin/admission-webhook build/_output/bin/kabanero-operator build/_output/bin/kabanero-operator-collection-controller build/_output/bin/kabanero-operator-stack-controller | sort > 3RD_PARTY || true + build/bin/golicense -plain ./license-rules.json build/_output/bin/admission-webhook build/_output/bin/kabanero-operator build/_output/bin/kabanero-operator-collection-controller build/_output/bin/kabanero-operator-stack-controller build/_output/bin/serving | sort > 3RD_PARTY || true rm build/bin/golicense # Integration Tests diff --git a/build/Dockerfile b/build/Dockerfile index 659be6eb..d2cb10a7 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -18,6 +18,9 @@ COPY build/_output/bin/kabanero-operator ${OPERATOR} COPY build/_output/bin/kabanero-operator-stack-controller /usr/local/bin/kabanero-operator-stack-controller COPY build/_output/bin/kabanero-operator-collection-controller /usr/local/bin/kabanero-operator-collection-controller COPY build/_output/bin/admission-webhook /usr/local/bin/admission-webhook +COPY build/_output/bin/serving /usr/local/bin/serving + +COPY cmd/serving/index.json /devfiles/index.json COPY build/bin /usr/local/bin RUN /usr/local/bin/user_setup diff --git a/cmd/serving/index.json b/cmd/serving/index.json new file mode 100644 index 00000000..6bf9abf9 --- /dev/null +++ b/cmd/serving/index.json @@ -0,0 +1,66 @@ +[ + { + "displayName": "Maven Java", + "description": "Upstream Maven and OpenJDK 11", + "tags": [ + "Java", + "Maven" + ], + "projectType": "maven", + "language": "java", + "links": { + "self": "/devfiles/eclipse/maven/1.0.0/devfile.yaml" + } + }, + { + "displayName": "NodeJS Express Web Application", + "description": "Stack with NodeJS 10", + "tags": [ + "NodeJS", + "Express", + "ubi8" + ], + "projectType": "nodejs", + "language": "nodejs", + "links": { + "self": "/devfiles/eclipse/nodejs/1.0.0/devfile.yaml" + } + }, + { + "displayName": "Open Liberty", + "description": "Open Liberty microservice in Java", + "projectType": "docker", + "language": "java", + "links": { + "self": "/devfiles/eclipse/openLiberty/1.0.0/devfile.yaml" + } + }, + { + "displayName": "Spring Boot®", + "description": "Spring Boot® using Java", + "tags": [ + "Java", + "Spring" + ], + "globalMemoryLimit": "2674Mi", + "icon": "https://www.eclipse.org/che/images/logo-eclipseche.svg", + "projectType": "spring", + "language": "java", + "links": { + "self": "/devfiles/eclipse/springBoot/1.0.0/devfile.yaml" + } + }, + { + "displayName": "Quarkus Java", + "description": "Upstream Quarkus with Java+GraalVM", + "tags": [ + "Java", + "Quarkus" + ], + "projectType": "quarkus", + "language": "java", + "links": { + "self": "/devfiles/eclipse/quarkus/1.0.0/devfile.yaml" + } + } +] diff --git a/cmd/serving/main.go b/cmd/serving/main.go new file mode 100644 index 00000000..ce33ed0b --- /dev/null +++ b/cmd/serving/main.go @@ -0,0 +1,17 @@ +package main + +import ( + "log" + "net/http" +) + +func response(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + http.ServeFile(w, r, "/devfiles/index.json") +} + +func main() { + http.HandleFunc("/",response) + log.Fatal(http.ListenAndServeTLS(":443","/tmp/serving-certs/tls.crt","/tmp/serving-certs/tls.key",nil)) +} diff --git a/config/orchestrations/serving/0.1/serving.yaml b/config/orchestrations/serving/0.1/serving.yaml new file mode 100644 index 00000000..28da9a24 --- /dev/null +++ b/config/orchestrations/serving/0.1/serving.yaml @@ -0,0 +1,80 @@ +apiVersion: v1 +kind: Service +metadata: + name: kabanero-operator-serving + annotations: + service.beta.openshift.io/serving-cert-secret-name: kabanero-operator-serving-cert + labels: + app.kubernetes.io/name: kabanero-operator-serving + app.kubernetes.io/instance: {{ .instance }} + app.kubernetes.io/version: {{ .version }} + app.kubernetes.io/component: serving + app.kubernetes.io/part-of: kabanero + app.kubernetes.io/managed-by: kabanero-operator +spec: + selector: + name: kabanero-operator-serving + ports: + - protocol: TCP + port: 443 + targetPort: 8443 +--- +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + name: kabanero-operator-serving +spec: + to: + kind: Service + name: kabanero-operator-serving + tls: + termination: reencrypt + insecureEdgeTerminationPolicy: Redirect +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: kabanero-operator-serving + labels: + name: kabanero-operator-serving + app.kubernetes.io/name: kabanero-operator-serving + app.kubernetes.io/instance: {{ .instance }} + app.kubernetes.io/version: {{ .version }} + app.kubernetes.io/component: serving + app.kubernetes.io/part-of: kabanero + app.kubernetes.io/managed-by: kabanero-operator +spec: + replicas: 1 + selector: + matchLabels: + name: kabanero-operator-serving + template: + metadata: + labels: + name: kabanero-operator-serving + app.kubernetes.io/name: kabanero-operator-serving + app.kubernetes.io/instance: {{ .instance }} + app.kubernetes.io/version: {{ .version }} + app.kubernetes.io/component: serving + app.kubernetes.io/part-of: kabanero + app.kubernetes.io/managed-by: kabanero-operator + spec: + containers: + - name: kabanero-operator-serving + image: {{ .image }} + imagePullPolicy: Always + command: + - /usr/local/bin/serving + env: + - name: KABANERO_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + volumeMounts: + - mountPath: /tmp/serving-certs + name: kabanero-operator-serving-cert + readOnly: true + volumes: + - name: kabanero-operator-serving-cert + secret: + secretName: kabanero-operator-serving-cert diff --git a/config/samples/full.yaml b/config/samples/full.yaml index 1570e13c..ccfb2bcf 100644 --- a/config/samples/full.yaml +++ b/config/samples/full.yaml @@ -77,6 +77,17 @@ spec: # Overrides the image uri image: kabanero/kabanero-operator:TRAVIS_TAG + + serving: + # Overrides the setting for version on this component + version: "0.9.0" + + # Overrides the image as a separate repository or tag + repository: kabanero/kabanero-operator + tag: "TRAVIS_TAG" + + # Overrides the image uri + image: kabanero/kabanero-operator:TRAVIS_TAG codeReadyWorkspaces: # CodeReadyWorkspaces CR instance deployment is disabled by default. To enable it, set the enable value to true. diff --git a/config/versions.yaml b/config/versions.yaml index fb617f4e..7c5ec0c5 100644 --- a/config/versions.yaml +++ b/config/versions.yaml @@ -23,6 +23,7 @@ kabanero: admission-webhook: "0.9.0" sso: "7.3.2" codeready-workspaces: "0.9.0" + serving: "0.9.0" - version: "0.8.0" related-versions: @@ -231,3 +232,7 @@ related-software: sso: - version: "7.3.2" orchestrations: "orchestrations/sso/0.1" + + serving: + - version: "0.9.0" + orchestrations: "orchestrations/serving/0.1" diff --git a/deploy/crds/kabanero.io_kabaneros_crd.yaml b/deploy/crds/kabanero.io_kabaneros_crd.yaml index bbb58bb7..15c51d82 100644 --- a/deploy/crds/kabanero.io_kabaneros_crd.yaml +++ b/deploy/crds/kabanero.io_kabaneros_crd.yaml @@ -549,6 +549,17 @@ spec: version: type: string type: object + serving: + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object sso: properties: adminSecretName: diff --git a/pkg/apis/kabanero/v1alpha2/kabanero_types.go b/pkg/apis/kabanero/v1alpha2/kabanero_types.go index a7155875..a6945e92 100644 --- a/pkg/apis/kabanero/v1alpha2/kabanero_types.go +++ b/pkg/apis/kabanero/v1alpha2/kabanero_types.go @@ -45,6 +45,8 @@ type KabaneroSpec struct { AdmissionControllerWebhook AdmissionControllerWebhookCustomizationSpec `json:"admissionControllerWebhook,omitempty"` + Serving ServingSpec `json:"serving,omitempty"` + Sso SsoCustomizationSpec `json:"sso,omitempty"` Gitops GitopsSpec `json:"gitops,omitempty"` @@ -232,6 +234,13 @@ type AdmissionControllerWebhookCustomizationSpec struct { Tag string `json:"tag,omitempty"` } +type ServingSpec struct { + Version string `json:"version,omitempty"` + Image string `json:"image,omitempty"` + Repository string `json:"repository,omitempty"` + Tag string `json:"tag,omitempty"` +} + type SsoCustomizationSpec struct { Enable bool `json:"enable,omitempty"` Provider string `json:"provider,omitempty"` diff --git a/pkg/apis/kabanero/v1alpha2/zz_generated.deepcopy.go b/pkg/apis/kabanero/v1alpha2/zz_generated.deepcopy.go index 5959947a..e60dadeb 100644 --- a/pkg/apis/kabanero/v1alpha2/zz_generated.deepcopy.go +++ b/pkg/apis/kabanero/v1alpha2/zz_generated.deepcopy.go @@ -647,6 +647,7 @@ func (in *KabaneroSpec) DeepCopyInto(out *KabaneroSpec) { out.CollectionController = in.CollectionController out.StackController = in.StackController out.AdmissionControllerWebhook = in.AdmissionControllerWebhook + out.Serving = in.Serving out.Sso = in.Sso in.Gitops.DeepCopyInto(&out.Gitops) return @@ -846,6 +847,22 @@ func (in *ServerlessStatus) DeepCopy() *ServerlessStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ServingSpec) DeepCopyInto(out *ServingSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServingSpec. +func (in *ServingSpec) DeepCopy() *ServingSpec { + if in == nil { + return nil + } + out := new(ServingSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SsoCustomizationSpec) DeepCopyInto(out *SsoCustomizationSpec) { *out = *in diff --git a/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go b/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go index 34961147..439ca019 100644 --- a/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go +++ b/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go @@ -54,6 +54,7 @@ var reconcileFuncs = []reconcileFuncType{ {name: "events", function: reconcileEvents}, {name: "sso", function: reconcileSso}, {name: "gitops", function: reconcileGitopsPipelines}, + {name: "serving", function: reconcileServing}, } // Add creates a new Kabanero Controller and adds it to the Manager. The Manager will set fields on the Controller @@ -515,7 +516,13 @@ func cleanup(ctx context.Context, k *kabanerov1alpha2.Kabanero, client client.Cl if err != nil { return err } - + + // Cleanup the Serving and their cross-namespace objects + err = cleanupServing(k, client, reqLogger) + if err != nil { + return err + } + return nil } diff --git a/pkg/controller/kabaneroplatform/serving.go b/pkg/controller/kabaneroplatform/serving.go new file mode 100644 index 00000000..d560bcba --- /dev/null +++ b/pkg/controller/kabaneroplatform/serving.go @@ -0,0 +1,129 @@ +package kabaneroplatform + +import ( + "context" + "github.com/go-logr/logr" + kabanerov1alpha2 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha2" + + corev1 "k8s.io/api/core/v1" + + mf "github.com/manifestival/manifestival" + mfc "github.com/manifestival/controller-runtime-client" + "k8s.io/apimachinery/pkg/api/errors" + "sigs.k8s.io/controller-runtime/pkg/client" + "strings" +) + +func reconcileServing(ctx context.Context, k *kabanerov1alpha2.Kabanero, c client.Client, reqLogger logr.Logger) error { + + // Figure out what version of the orchestration we are going to use. + rev, err := resolveSoftwareRevision(k, "serving", k.Spec.Serving.Version) + if err != nil { + return err + } + + templateContext := rev.Identifiers + + image, err := imageUriWithOverrides(k.Spec.Serving.Repository, k.Spec.Serving.Tag, k.Spec.Serving.Image, rev) + if err != nil { + return err + } + + templateContext["image"] = image + templateContext["instance"] = k.ObjectMeta.UID + templateContext["version"] = rev.Version + + f, err := rev.OpenOrchestration("serving.yaml") + if err != nil { + return err + } + + s, err := renderOrchestration(f, templateContext) + if err != nil { + return err + } + + mOrig, err := mf.ManifestFrom(mf.Reader(strings.NewReader(s)), mf.UseClient(mfc.NewClient(c)), mf.UseLogger(reqLogger.WithName("manifestival"))) + if err != nil { + return err + } + + transforms := []mf.Transformer{ + mf.InjectOwner(k), + mf.InjectNamespace(k.GetNamespace()), + } + + m, err := mOrig.Transform(transforms...) + if err != nil { + return err + } + + err = m.Apply() + if err != nil { + return err + } + + return nil +} + + +func cleanupServing(k *kabanerov1alpha2.Kabanero, c client.Client, reqLogger logr.Logger) error { + + rev, err := resolveSoftwareRevision(k, "serving", k.Spec.Serving.Version) + if err != nil { + return err + } + + //The context which will be used to render any templates + templateContext := rev.Identifiers + + // TODO + image, err := imageUriWithOverrides(k.Spec.Serving.Repository, k.Spec.Serving.Tag, k.Spec.Serving.Image, rev) + if err != nil { + return err + } + templateContext["image"] = image + templateContext["instance"] = k.ObjectMeta.UID + templateContext["version"] = rev.Version + + f, err := rev.OpenOrchestration("serving.yaml") + if err != nil { + return err + } + + s, err := renderOrchestration(f, templateContext) + if err != nil { + return err + } + + mOrig, err := mf.ManifestFrom(mf.Reader(strings.NewReader(s)), mf.UseClient(mfc.NewClient(c)), mf.UseLogger(reqLogger.WithName("manifestival"))) + if err != nil { + return err + } + + transforms := []mf.Transformer{mf.InjectNamespace(k.GetNamespace())} + m, err := mOrig.Transform(transforms...) + if err != nil { + return err + } + + // Manifestival ignores the "NotFound" error for us. + err = m.Delete() + if err != nil { + return err + } + + + // Now, clean up the things that the controller-runtime created on + // our behalf. + secretInstance := &corev1.Secret{} + secretInstance.Name = "kabanero-operator-serving-cert" + secretInstance.Namespace = k.GetNamespace() + err = c.Delete(context.TODO(), secretInstance) + + if (err != nil) && (errors.IsNotFound(err) == false) { + return err + } + + return nil +} From 09ba3df63d2cfadc3e6ebf5684b993a3e13d8abd Mon Sep 17 00:00:00 2001 From: Daniel Cleyrat Date: Tue, 2 Jun 2020 14:47:04 -0400 Subject: [PATCH 04/15] serving for devfile --- cmd/serving/main.go | 8 +++++++- config/versions.yaml | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/cmd/serving/main.go b/cmd/serving/main.go index ce33ed0b..60253d37 100644 --- a/cmd/serving/main.go +++ b/cmd/serving/main.go @@ -13,5 +13,11 @@ func response(w http.ResponseWriter, r *http.Request) { func main() { http.HandleFunc("/",response) - log.Fatal(http.ListenAndServeTLS(":443","/tmp/serving-certs/tls.crt","/tmp/serving-certs/tls.key",nil)) + log.Fatal(http.ListenAndServeTLS(":8443","/tmp/serving-certs/tls.crt","/tmp/serving-certs/tls.key",nil)) } + +// Watch Stacks + +// Build registry from Stack spec + +// Regenerate index.json diff --git a/config/versions.yaml b/config/versions.yaml index 7c5ec0c5..4a3b378e 100644 --- a/config/versions.yaml +++ b/config/versions.yaml @@ -236,3 +236,6 @@ related-software: serving: - version: "0.9.0" orchestrations: "orchestrations/serving/0.1" + identifiers: + repository: "FROM_POD" + tag: "FROM_POD" From 83f4b78f84923467b42a6fcf23ed6a8c47c4e3c9 Mon Sep 17 00:00:00 2001 From: Daniel Cleyrat Date: Wed, 3 Jun 2020 13:40:06 -0400 Subject: [PATCH 05/15] serving --- build/Dockerfile | 1 - cmd/serving/index.json | 66 ------- cmd/serving/main.go | 218 ++++++++++++++++++++-- go.sum | 2 + pkg/apis/kabanero/v1alpha2/stack_types.go | 4 +- pkg/serving/index.go | 80 ++++++++ pkg/serving/stack_controller.go | 145 ++++++++++++++ 7 files changed, 437 insertions(+), 79 deletions(-) delete mode 100644 cmd/serving/index.json create mode 100644 pkg/serving/index.go create mode 100644 pkg/serving/stack_controller.go diff --git a/build/Dockerfile b/build/Dockerfile index d2cb10a7..e8df32f9 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -20,7 +20,6 @@ COPY build/_output/bin/kabanero-operator-collection-controller /usr/local/bin/ka COPY build/_output/bin/admission-webhook /usr/local/bin/admission-webhook COPY build/_output/bin/serving /usr/local/bin/serving -COPY cmd/serving/index.json /devfiles/index.json COPY build/bin /usr/local/bin RUN /usr/local/bin/user_setup diff --git a/cmd/serving/index.json b/cmd/serving/index.json deleted file mode 100644 index 6bf9abf9..00000000 --- a/cmd/serving/index.json +++ /dev/null @@ -1,66 +0,0 @@ -[ - { - "displayName": "Maven Java", - "description": "Upstream Maven and OpenJDK 11", - "tags": [ - "Java", - "Maven" - ], - "projectType": "maven", - "language": "java", - "links": { - "self": "/devfiles/eclipse/maven/1.0.0/devfile.yaml" - } - }, - { - "displayName": "NodeJS Express Web Application", - "description": "Stack with NodeJS 10", - "tags": [ - "NodeJS", - "Express", - "ubi8" - ], - "projectType": "nodejs", - "language": "nodejs", - "links": { - "self": "/devfiles/eclipse/nodejs/1.0.0/devfile.yaml" - } - }, - { - "displayName": "Open Liberty", - "description": "Open Liberty microservice in Java", - "projectType": "docker", - "language": "java", - "links": { - "self": "/devfiles/eclipse/openLiberty/1.0.0/devfile.yaml" - } - }, - { - "displayName": "Spring Boot®", - "description": "Spring Boot® using Java", - "tags": [ - "Java", - "Spring" - ], - "globalMemoryLimit": "2674Mi", - "icon": "https://www.eclipse.org/che/images/logo-eclipseche.svg", - "projectType": "spring", - "language": "java", - "links": { - "self": "/devfiles/eclipse/springBoot/1.0.0/devfile.yaml" - } - }, - { - "displayName": "Quarkus Java", - "description": "Upstream Quarkus with Java+GraalVM", - "tags": [ - "Java", - "Quarkus" - ], - "projectType": "quarkus", - "language": "java", - "links": { - "self": "/devfiles/eclipse/quarkus/1.0.0/devfile.yaml" - } - } -] diff --git a/cmd/serving/main.go b/cmd/serving/main.go index 60253d37..92ba41a8 100644 --- a/cmd/serving/main.go +++ b/cmd/serving/main.go @@ -1,23 +1,219 @@ package main import ( - "log" - "net/http" + "context" + "errors" + "flag" + "fmt" + "os" + "runtime" + "strings" + + // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) + _ "k8s.io/client-go/plugin/pkg/client/auth" + "k8s.io/client-go/rest" + + "github.com/kabanero-io/kabanero-operator/pkg/apis" + "github.com/kabanero-io/kabanero-operator/pkg/serving" + + "github.com/operator-framework/operator-sdk/pkg/k8sutil" + kubemetrics "github.com/operator-framework/operator-sdk/pkg/kube-metrics" + "github.com/operator-framework/operator-sdk/pkg/leader" + "github.com/operator-framework/operator-sdk/pkg/log/zap" + "github.com/operator-framework/operator-sdk/pkg/metrics" + sdkVersion "github.com/operator-framework/operator-sdk/version" + "github.com/spf13/pflag" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/intstr" + "sigs.k8s.io/controller-runtime/pkg/cache" + "sigs.k8s.io/controller-runtime/pkg/client/config" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/manager/signals" +) + +// Change below variables to serve metrics on different host or port. +var ( + metricsHost = "0.0.0.0" + metricsPort int32 = 8383 + operatorMetricsPort int32 = 8686 ) +var log = logf.Log.WithName("cmd") -func response(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - w.Header().Set("Content-Type", "application/json") - http.ServeFile(w, r, "/devfiles/index.json") +func printVersion() { + log.Info(fmt.Sprintf("Operator Version: %s", version.Version)) + log.Info(fmt.Sprintf("Go Version: %s", runtime.Version())) + log.Info(fmt.Sprintf("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH)) + log.Info(fmt.Sprintf("Version of operator-sdk: %v", sdkVersion.Version)) } func main() { - http.HandleFunc("/",response) - log.Fatal(http.ListenAndServeTLS(":8443","/tmp/serving-certs/tls.crt","/tmp/serving-certs/tls.key",nil)) + // Add the zap logger flag set to the CLI. The flag set must + // be added before calling pflag.Parse(). + pflag.CommandLine.AddFlagSet(zap.FlagSet()) + + // Add flags registered by imported packages (e.g. glog and + // controller-runtime) + pflag.CommandLine.AddGoFlagSet(flag.CommandLine) + + pflag.Parse() + + // Use a zap logr.Logger implementation. If none of the zap + // flags are configured (or if the zap flag set is not being + // used), this defaults to a production zap logger. + // + // The logger instantiated here can be changed to any logger + // implementing the logr.Logger interface. This logger will + // be propagated through the whole operator, generating + // uniform and structured logs. + logf.SetLogger(zap.Logger()) + + printVersion() + + namespace, err := k8sutil.GetWatchNamespace() + if err != nil { + log.Error(err, "Failed to get watch namespace") + os.Exit(1) + } + + // Get a config to talk to the apiserver + cfg, err := config.GetConfig() + if err != nil { + log.Error(err, "") + os.Exit(1) + } + + ctx := context.TODO() + // Become the leader before proceeding + err = leader.Become(ctx, "memcached-operator-lock") + if err != nil { + log.Error(err, "") + os.Exit(1) + } + + // Set default manager options + options := manager.Options{ + Namespace: namespace, + MetricsBindAddress: fmt.Sprintf("%s:%d", metricsHost, metricsPort), + } + + // Add support for MultiNamespace set in WATCH_NAMESPACE (e.g ns1,ns2) + // Note that this is not intended to be used for excluding namespaces, this is better done via a Predicate + // Also note that you may face performance issues when using this with a high number of namespaces. + // More Info: https://godoc.org/github.com/kubernetes-sigs/controller-runtime/pkg/cache#MultiNamespacedCacheBuilder + if strings.Contains(namespace, ",") { + options.Namespace = "" + options.NewCache = cache.MultiNamespacedCacheBuilder(strings.Split(namespace, ",")) + } + + // Create a new manager to provide shared dependencies and start components + mgr, err := manager.New(cfg, options) + if err != nil { + log.Error(err, "") + os.Exit(1) + } + + log.Info("Registering Components.") + + // Setup Scheme for all resources + if err := apis.AddToScheme(mgr.GetScheme()); err != nil { + log.Error(err, "") + os.Exit(1) + } + + // Setup all Controllers + if err := controller.AddToManager(mgr); err != nil { + log.Error(err, "") + os.Exit(1) + } + + // Add the Metrics Service + addMetrics(ctx, cfg) + + // Start serving devfiles index + fs := http.FileServer(http.Dir("/devfiles")) + http.Handle("/", fs) + log.Println("Starting Devfile registry on port :8443...") + err := http.ListenAndServeTLS(":8443","/tmp/serving-certs/tls.crt","/tmp/serving-certs/tls.key",nil) + if err != nil { + log.Fatal(err) + } + + log.Info("Starting the Cmd.") + + // Start the Cmd + if err := mgr.Start(signals.SetupSignalHandler()); err != nil { + log.Error(err, "Manager exited non-zero") + os.Exit(1) + } } -// Watch Stacks +// addMetrics will create the Services and Service Monitors to allow the operator export the metrics by using +// the Prometheus operator +func addMetrics(ctx context.Context, cfg *rest.Config) { + // Get the namespace the operator is currently deployed in. + operatorNs, err := k8sutil.GetOperatorNamespace() + if err != nil { + if errors.Is(err, k8sutil.ErrRunLocal) { + log.Info("Skipping CR metrics server creation; not running in a cluster.") + return + } + } + + if err := serveCRMetrics(cfg, operatorNs); err != nil { + log.Info("Could not generate and serve custom resource metrics", "error", err.Error()) + } -// Build registry from Stack spec + // Add to the below struct any other metrics ports you want to expose. + servicePorts := []v1.ServicePort{ + {Port: metricsPort, Name: metrics.OperatorPortName, Protocol: v1.ProtocolTCP, TargetPort: intstr.IntOrString{Type: intstr.Int, IntVal: metricsPort}}, + {Port: operatorMetricsPort, Name: metrics.CRPortName, Protocol: v1.ProtocolTCP, TargetPort: intstr.IntOrString{Type: intstr.Int, IntVal: operatorMetricsPort}}, + } -// Regenerate index.json + // Create Service object to expose the metrics port(s). + service, err := metrics.CreateMetricsService(ctx, cfg, servicePorts) + if err != nil { + log.Info("Could not create metrics Service", "error", err.Error()) + } + + // CreateServiceMonitors will automatically create the prometheus-operator ServiceMonitor resources + // necessary to configure Prometheus to scrape metrics from this operator. + services := []*v1.Service{service} + + // The ServiceMonitor is created in the same namespace where the operator is deployed + _, err = metrics.CreateServiceMonitors(cfg, operatorNs, services) + if err != nil { + log.Info("Could not create ServiceMonitor object", "error", err.Error()) + // If this operator is deployed to a cluster without the prometheus-operator running, it will return + // ErrServiceMonitorNotPresent, which can be used to safely skip ServiceMonitor creation. + if err == metrics.ErrServiceMonitorNotPresent { + log.Info("Install prometheus-operator in your cluster to create ServiceMonitor objects", "error", err.Error()) + } + } +} + +// serveCRMetrics gets the Operator/CustomResource GVKs and generates metrics based on those types. +// It serves those metrics on "http://metricsHost:operatorMetricsPort". +func serveCRMetrics(cfg *rest.Config, operatorNs string) error { + // The function below returns a list of filtered operator/CR specific GVKs. For more control, override the GVK list below + // with your own custom logic. Note that if you are adding third party API schemas, probably you will need to + // customize this implementation to avoid permissions issues. + filteredGVK, err := k8sutil.GetGVKsFromAddToScheme(apis.AddToScheme) + if err != nil { + return err + } + + // The metrics will be generated from the namespaces which are returned here. + // NOTE that passing nil or an empty list of namespaces in GenerateAndServeCRMetrics will result in an error. + ns, err := kubemetrics.GetNamespacesForMetrics(operatorNs) + if err != nil { + return err + } + + // Generate and serve custom resource specific metrics. + err = kubemetrics.GenerateAndServeCRMetrics(cfg, ns, filteredGVK, metricsHost, operatorMetricsPort) + if err != nil { + return err + } + return nil +} diff --git a/go.sum b/go.sum index 68c7791c..cb31508c 100644 --- a/go.sum +++ b/go.sum @@ -249,6 +249,8 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elsony/devfile2-registry v0.0.0-20200528212517-f1b6f7216872 h1:XnJh44fe+mEAZ5xs3CIP2DVumJ+7OHF2irFUA9ut0uc= +github.com/elsony/devfile2-registry/tools v0.0.0-20200528212517-f1b6f7216872 h1:s3/e9/JXjx65H8RJvAbbEDJtnDtiYPlRlvWl8F92ffE= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.6.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= diff --git a/pkg/apis/kabanero/v1alpha2/stack_types.go b/pkg/apis/kabanero/v1alpha2/stack_types.go index b90faf18..7b84edd5 100644 --- a/pkg/apis/kabanero/v1alpha2/stack_types.go +++ b/pkg/apis/kabanero/v1alpha2/stack_types.go @@ -61,7 +61,9 @@ type StackVersion struct { DesiredState string `json:"desiredState,omitempty"` SkipCertVerification bool `json:"skipCertVerification,omitempty"` // +listType=set - Images []Image `json:"images,omitempty"` + Images []Image `json:"images,omitempty"` + Devfile string `json:"devfile,omitempty"` + Metafile string `json:"metafile,omitempty"` } func (sv StackVersion) GetVersion() string { diff --git a/pkg/serving/index.go b/pkg/serving/index.go new file mode 100644 index 00000000..49742faf --- /dev/null +++ b/pkg/serving/index.go @@ -0,0 +1,80 @@ +package main + +import ( + "encoding/json" + "flag" + "fmt" + "io/ioutil" + "log" + "path/filepath" + + "github.com/elsony/devfile2-registry/tools/types" + "gopkg.in/yaml.v2" +) + +// genIndex generate new index from meta.yaml files in dir. +// meta.yaml file is expected to be in dir//meta.yaml +func genIndex(dir string) ([]types.MetaIndex, error) { + + var index []types.MetaIndex + + dirs, err := ioutil.ReadDir(dir) + if err != nil { + return nil, err + } + + for _, file := range dirs { + if file.IsDir() { + var meta types.Meta + metaFile, err := ioutil.ReadFile(filepath.Join(dir, file.Name(), "meta.yaml")) + if err != nil { + return nil, err + } + err = yaml.Unmarshal(metaFile, &meta) + if err != nil { + return nil, err + } + + self := fmt.Sprintf("/%s/%s/%s", filepath.Base(dir), file.Name(), "devfile.yaml") + + metaIndex := types.MetaIndex{ + Meta: meta, + Links: types.Links{ + Self: self, + }, + } + index = append(index, metaIndex) + } + } + return index, nil +} + +func main() { + devfiles := flag.String("devfiles-dir", "", "Directory containing devfiles.") + output := flag.String("index", "", "Index filaname. This is where the index in JSON format will be saved.") + + flag.Parse() + + if *devfiles == "" { + log.Fatal("Provide devfile directory.") + } + + if *output == "" { + log.Fatal("Provide index file.") + } + + index, err := genIndex(*devfiles) + if err != nil { + log.Fatal(err) + } + b, err := json.MarshalIndent(index, "", " ") + if err != nil { + log.Fatal(err) + + } + err = ioutil.WriteFile(*output, b, 0644) + if err != nil { + log.Fatal(err) + + } +} diff --git a/pkg/serving/stack_controller.go b/pkg/serving/stack_controller.go new file mode 100644 index 00000000..e2daa8c5 --- /dev/null +++ b/pkg/serving/stack_controller.go @@ -0,0 +1,145 @@ +package stack + +import ( + "context" + "fmt" + "os" + + kabanerov1alpha2 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha2" + // corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + // metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + // "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" + // "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/handler" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + "sigs.k8s.io/controller-runtime/pkg/source" + + d2index "github.com/elsony/devfile2-registry/tools/cmd/index" +) + +var log = logf.Log.WithName("controller_stack") + +// Add creates a new Stack Controller and adds it to the Manager. The Manager will set fields on the Controller +// and Start it when the Manager is Started. +func Add(mgr manager.Manager) error { + return add(mgr, newReconciler(mgr)) +} + +// newReconciler returns a new reconcile.Reconciler +func newReconciler(mgr manager.Manager) reconcile.Reconciler { + return &ReconcileStack{client: mgr.GetClient(), scheme: mgr.GetScheme()} +} + +// add adds a new Controller to mgr with r as the reconcile.Reconciler +func add(mgr manager.Manager, r reconcile.Reconciler) error { + // Create a new controller + c, err := controller.New("stack-controller", mgr, controller.Options{Reconciler: r}) + if err != nil { + return err + } + + // Watch for changes to primary resource Stack + err = c.Watch(&source.Kind{Type: &kabanerov1alpha2.Stack{}}, &handler.EnqueueRequestForObject{}) + if err != nil { + return err + } + + return nil +} + +// blank assignment to verify that ReconcileStack implements reconcile.Reconciler +var _ reconcile.Reconciler = &ReconcileStack{} + +// ReconcileStack reconciles a Stack object +type ReconcileStack struct { + // This client, initialized using mgr.Client() above, is a split client + // that reads objects from the cache and writes to the apiserver + client client.Client + scheme *runtime.Scheme +} + +// Reconcile reads that state of the cluster for a Stack object and makes changes based on the state read +// and what is in the Stack.Spec +// TODO(user): Modify this Reconcile function to implement your Controller logic. This example creates +// a Pod as an example +// Note: +// The Controller will requeue the Request to be processed again if the returned error is non-nil or +// Result.Requeue is true, otherwise upon completion it will remove the work from the queue. +func (r *ReconcileStack) Reconcile(request reconcile.Request) (reconcile.Result, error) { + reqLogger := log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name) + reqLogger.Info("Reconciling Stack") + + // Fetch the Stack instance + instance := &kabanerov1alpha2.Stack{} + err := r.client.Get(context.TODO(), request.NamespacedName, instance) + if err != nil { + if errors.IsNotFound(err) { + // Request object not found, could have been deleted after reconcile request. + // Owned objects are automatically garbage collected. For additional cleanup logic use finalizers. + // Return and don't requeue + return reconcile.Result{}, nil + } + // Error reading the object - requeue the request. + return reconcile.Result{}, err + } + + // Copy the yaml from the Stack to local devfile registry + for _, version := range instance.Spec.Versions { + + basePath := "/devfiles" + devfile := fmt.Sprintf("%v/eclipse/%v/%v/devfile.yaml", basePath, instance.ObjectMeta.Name, version.Version) + metafile := fmt.Sprintf("%v/eclipse/%v/%v/meta.yaml", basePath, instance.ObjectMeta.Name, version.Version) + + f, err := os.Create(devfile) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error creating devfile %v", devfile)) + } + defer f.Close() + _, err = f.WriteString(version.Devfile) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error writing devfile %v", devfile)) + } + f.Sync() + + f, err = os.Create(metafile) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error creating metafile %v", metafile)) + } + defer f.Close() + _, err = f.WriteString(version.Devfile) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error writing metafile %v", metafile)) + } + f.Sync() + + } + + // Regenerate the index + indexfile := fmt.Sprintf("%v/index.json", basePath) + index, err := d2index.genIndex(basePath) + if err != nil { + reqLogger.Error(err, "Error generating devfile index") + } + b, err := json.MarshalIndent(index, "", " ") + if err != nil { + reqLogger.Error(err, "Error during marshal index") + } + f, err = os.Create(indexfile) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error creating indexfile %v", indexfile)) + } + defer f.Close() + _, err = f.Write(b) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error writing indexfile %v", metafile)) + } + f.Sync() + + return reconcile.Result{}, nil +} From fba5b77656e24e1de3079f2bdc109bde09f0b6c3 Mon Sep 17 00:00:00 2001 From: kaczyns Date: Thu, 28 May 2020 15:36:45 -0400 Subject: [PATCH 06/15] v0.9.1-rc.1 --- Makefile | 2 +- config/samples/default.yaml | 6 +- config/samples/full.yaml | 16 +- config/versions.yaml | 34 +- ...operator.v0.9.0.clusterserviceversion.yaml | 13 +- .../0.9.0/kabanero.io_collections_crd.yaml | 207 ++++ .../0.9.0/kabanero.io_kabaneros_crd.yaml | 977 ++++++++++++++++++ .../0.9.0/kabanero.io_stacks_crd.yaml | 210 ++++ ...operator.v0.9.1.clusterserviceversion.yaml | 334 ++++++ .../kabanero-operator-package.yaml | 2 +- 10 files changed, 1782 insertions(+), 19 deletions(-) create mode 100644 registry/manifests/kabanero-operator/0.9.0/kabanero.io_collections_crd.yaml create mode 100644 registry/manifests/kabanero-operator/0.9.0/kabanero.io_kabaneros_crd.yaml create mode 100644 registry/manifests/kabanero-operator/0.9.0/kabanero.io_stacks_crd.yaml create mode 100644 registry/manifests/kabanero-operator/0.9.1/kabanero-operator.v0.9.1.clusterserviceversion.yaml diff --git a/Makefile b/Makefile index 46e7ff0d..60552ca2 100755 --- a/Makefile +++ b/Makefile @@ -53,7 +53,7 @@ IMAGE_SHA = $(lastword $(subst @, ,$(IMAGE_REPO_DIGEST))) REGISTRY_IMAGE_SHA = $(lastword $(subst @, ,$(REGISTRY_IMAGE_REPO_DIGEST))) # Current release (used for CSV management) -CURRENT_RELEASE=0.9.0 +CURRENT_RELEASE=0.9.1 # OS detection ifeq ($(OS),Windows_NT) diff --git a/config/samples/default.yaml b/config/samples/default.yaml index 463e01bd..cec1980e 100644 --- a/config/samples/default.yaml +++ b/config/samples/default.yaml @@ -3,7 +3,7 @@ kind: Kabanero metadata: name: kabanero spec: - version: "0.9.0" + version: "0.9.1" stacks: repositories: - name: central @@ -11,6 +11,6 @@ spec: url: https://github.com/kabanero-io/kabanero-stack-hub/releases/download/0.9.0/kabanero-stack-hub-index.yaml pipelines: - id: default - sha256: 63b98242b60f6a1cf240b430d24659b9727d16013935553a798be1e6c122c479 + sha256: 1348e90cc3269b6e65837f71011bef6f0dc662781a41442cb5ce3714cb91b890 https: - url: https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.0/default-kabanero-pipelines.tar.gz + url: https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1-rc.2/default-kabanero-pipelines.tar.gz diff --git a/config/samples/full.yaml b/config/samples/full.yaml index 1570e13c..0feb8240 100644 --- a/config/samples/full.yaml +++ b/config/samples/full.yaml @@ -9,7 +9,7 @@ metadata: spec: # The platform version determines the desired version for all components, but those # can be overriden individually as well - version: "0.9.0" + version: "0.9.1" targetNamespaces: - kabanero @@ -33,7 +33,7 @@ spec: collectionController: # Overrides the setting for version on this component - version: "0.9.0" + version: "0.9.1" # Overrides the image as a separate repository or tag repository: kabanero/kabanero-operator @@ -44,7 +44,7 @@ spec: stackController: # Overrides the setting for version on this component - version: "0.9.0" + version: "0.9.1" # Overrides the image as a separate repository or tag repository: kabanero/kabanero-operator @@ -69,7 +69,7 @@ spec: admissionControllerWebhook: # Overrides the setting for version on this component - version: "0.9.0" + version: "0.9.1" # Overrides the image as a separate repository or tag repository: kabanero/kabanero-operator @@ -120,16 +120,16 @@ spec: url: https://github.com/kabanero-io/kabanero-stack-hub/releases/download/0.9.0/kabanero-stack-hub-index.yaml pipelines: - id: default - sha256: 63b98242b60f6a1cf240b430d24659b9727d16013935553a798be1e6c122c479 + sha256: 1348e90cc3269b6e65837f71011bef6f0dc662781a41442cb5ce3714cb91b890 https: - url: https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.0/default-kabanero-pipelines.tar.gz + url: https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1-rc.2/default-kabanero-pipelines.tar.gz gitops: pipelines: - id: gitops - sha256: 683e8a05482a166ad4d76b6358227d3807a66e7edd8bc80483d6a88bca6c4095 + sha256: 2b0f31cfb31f49454e68542deb301a98c409d8c2a233c6b8a32eb476090c2cd6 https: - url: https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.0/kabanero-gitops-pipelines.tar.gz + url: https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1-rc.2/kabanero-gitops-pipelines.tar.gz governancePolicy: # Provide governance configuration for all stacks managed by Kabanero. The allowed configuration policies are: diff --git a/config/versions.yaml b/config/versions.yaml index fb617f4e..d73e2101 100644 --- a/config/versions.yaml +++ b/config/versions.yaml @@ -9,10 +9,21 @@ # When the Kabanero instance does not specify which version of Kabanero to use, # this is the value -default: "0.9.0" +default: "0.9.1" # Top level: relates Kabanero versions to software versions kabanero: +- version: "0.9.1" + related-versions: + cli-services: "0.9.0" + landing: "0.9.0" + events: "0.9.0" + collection-controller: "0.9.1" + stack-controller: "0.9.1" + admission-webhook: "0.9.1" + sso: "7.3.2" + codeready-workspaces: "0.9.0" + - version: "0.9.0" related-versions: cli-services: "0.9.0" @@ -148,11 +159,16 @@ related-software: tag: "0.1" collection-controller: - - version: "0.9.0" + - version: "0.9.1" orchestrations: "orchestrations/collection-controller/0.1" identifiers: repository: "FROM_POD" tag: "FROM_POD" + - version: "0.9.0" + orchestrations: "orchestrations/collection-controller/0.1" + identifiers: + repository: "kabanero/kabanero-operator" + tag: "0.9.0" - version: "0.8.0" orchestrations: "orchestrations/collection-controller/0.1" identifiers: @@ -175,11 +191,16 @@ related-software: tag: "0.6.0" stack-controller: - - version: "0.9.0" + - version: "0.9.1" orchestrations: "orchestrations/stack-controller/0.1" identifiers: repository: "FROM_POD" tag: "FROM_POD" + - version: "0.9.0" + orchestrations: "orchestrations/stack-controller/0.1" + identifiers: + repository: "kabanero/kabanero-operator" + tag: "0.9.0" - version: "0.8.0" orchestrations: "orchestrations/stack-controller/0.1" identifiers: @@ -202,11 +223,16 @@ related-software: tag: "0.6.0" admission-webhook: - - version: "0.9.0" + - version: "0.9.1" orchestrations: "orchestrations/admission-webhook/0.2" identifiers: repository: "FROM_POD" tag: "FROM_POD" + - version: "0.9.0" + orchestrations: "orchestrations/admission-webhook/0.2" + identifiers: + repository: "kabanero/kabanero-operator" + tag: "0.9.0" - version: "0.8.0" orchestrations: "orchestrations/admission-webhook/0.2" identifiers: diff --git a/registry/manifests/kabanero-operator/0.9.0/kabanero-operator.v0.9.0.clusterserviceversion.yaml b/registry/manifests/kabanero-operator/0.9.0/kabanero-operator.v0.9.0.clusterserviceversion.yaml index 6a7dfc4b..ed563ea9 100644 --- a/registry/manifests/kabanero-operator/0.9.0/kabanero-operator.v0.9.0.clusterserviceversion.yaml +++ b/registry/manifests/kabanero-operator/0.9.0/kabanero-operator.v0.9.0.clusterserviceversion.yaml @@ -7,7 +7,7 @@ metadata: capabilities: Basic Install categories: "Integration & Delivery" certified: "false" - containerImage: kabanero/kabanero-operator:latest + containerImage: kabanero/kabanero-operator@sha256:3ec321bb84127e108d4f65b6d2c97f102072b7622fa545ce1a78ef6935c2f3a8 createdAt: 2019-11-19T12:00:00.000-0500 description: Bringings together foundational open source technologies into a modern microservices-based framework. olm.skipRange: '>=0.6.1 <0.9.0' @@ -302,7 +302,7 @@ spec: fieldPath: metadata.name - name: OPERATOR_NAME value: kabanero-operator - image: kabanero/kabanero-operator:latest + image: kabanero/kabanero-operator@sha256:3ec321bb84127e108d4f65b6d2c97f102072b7622fa545ce1a78ef6935c2f3a8 imagePullPolicy: Always name: kabanero-operator resources: {} @@ -332,3 +332,12 @@ spec: type: AllNamespaces provider: name: IBM + relatedImages: + - image: kabanero/kabanero-command-line-services:0.9.0 + name: cli-services-0.9.0 + - image: kabanero/landing:0.9.0 + name: landing-0.9.0 + - image: kabanero/events-operator:0.1.0 + name: events-0.9.0 + - image: kabanero/che-devfile-registry:0.11.0 + name: codeready-workspaces-0.9.0 diff --git a/registry/manifests/kabanero-operator/0.9.0/kabanero.io_collections_crd.yaml b/registry/manifests/kabanero-operator/0.9.0/kabanero.io_collections_crd.yaml new file mode 100644 index 00000000..aea1ef02 --- /dev/null +++ b/registry/manifests/kabanero-operator/0.9.0/kabanero.io_collections_crd.yaml @@ -0,0 +1,207 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: collections.kabanero.io +spec: + additionalPrinterColumns: + - JSONPath: .metadata.creationTimestamp + description: CreationTimestamp is a timestamp representing the server time when + this object was created. It is not guaranteed to be set in happens-before order + across separate operations. + name: Age + type: date + - JSONPath: .status.status + description: Collection status. + name: Status + type: string + group: kabanero.io + names: + kind: Collection + listKind: CollectionList + plural: collections + singular: collection + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + description: Collection is the Schema for the collections API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: CollectionSpec defines the desired composition of a Collection + properties: + desiredState: + type: string + name: + type: string + repositoryUrl: + type: string + skipCertVerification: + type: boolean + version: + type: string + versions: + items: + description: CollectionVersion defines the desired composition of + a specific collection version. + properties: + desiredState: + type: string + repositoryUrl: + type: string + skipCertVerification: + type: boolean + version: + type: string + type: object + type: array + type: object + status: + description: CollectionStatus defines the observed state of a collection + properties: + activeLocation: + type: string + activePipelines: + items: + description: PipelineStatus defines the observed state of the assets + located within a single pipeline .tar.gz. + properties: + activeAssets: + items: + description: RepositoryAssetStatus defines the observed state + of a single asset in a respository, in the collection. + properties: + assetDigest: + type: string + assetName: + type: string + group: + type: string + kind: + type: string + namespace: + type: string + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + digest: + type: string + name: + type: string + url: + type: string + required: + - digest + - name + - url + type: object + type: array + activeVersion: + type: string + availableLocation: + type: string + availableVersion: + type: string + images: + items: + description: Image defines a container image used by a collection + properties: + id: + type: string + image: + type: string + type: object + type: array + status: + type: string + statusMessage: + type: string + versions: + items: + description: CollectionVersionStatus defines the observed state of + a specific collection version. + properties: + images: + items: + description: Image defines a container image used by a collection + properties: + id: + type: string + image: + type: string + type: object + type: array + location: + type: string + pipelines: + items: + description: PipelineStatus defines the observed state of the + assets located within a single pipeline .tar.gz. + properties: + activeAssets: + items: + description: RepositoryAssetStatus defines the observed + state of a single asset in a respository, in the collection. + properties: + assetDigest: + type: string + assetName: + type: string + group: + type: string + kind: + type: string + namespace: + type: string + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + digest: + type: string + name: + type: string + url: + type: string + required: + - digest + - name + - url + type: object + type: array + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + type: object + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true diff --git a/registry/manifests/kabanero-operator/0.9.0/kabanero.io_kabaneros_crd.yaml b/registry/manifests/kabanero-operator/0.9.0/kabanero.io_kabaneros_crd.yaml new file mode 100644 index 00000000..bbb58bb7 --- /dev/null +++ b/registry/manifests/kabanero-operator/0.9.0/kabanero.io_kabaneros_crd.yaml @@ -0,0 +1,977 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: kabaneros.kabanero.io +spec: + additionalPrinterColumns: + - JSONPath: .metadata.creationTimestamp + description: CreationTimestamp is a timestamp representing the server time when + this object was created. It is not guaranteed to be set in happens-before order + across separate operations. + name: Age + type: date + - JSONPath: .status.kabaneroInstance.version + description: Kabanero operator instance version. + name: Version + type: string + - JSONPath: .status.kabaneroInstance.ready + description: Kabanero operator instance readiness status. The status is directly + correlated to the availability of the operator's resources dependencies. + name: Ready + type: string + group: kabanero.io + names: + kind: Kabanero + listKind: KabaneroList + plural: kabaneros + singular: kabanero + scope: Namespaced + subresources: + status: {} + version: v1alpha1 + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: KabaneroSpec defines the desired state of Kabanero + properties: + admissionControllerWebhook: + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + che: + description: CheCustomizationSpec defines customization entries for + Che. + properties: + cheOperatorInstance: + description: CheOperatorInstanceSpec defines customization entries + for the Che operator instance. + properties: + cheWorkspaceClusterRole: + type: string + type: object + enable: + type: boolean + kabaneroChe: + description: KabaneroCheSpec defines customization entries for + Kabanero Che. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + type: object + cliServices: + description: KabaneroCliServicesCustomizationSpec defines customization + entries for the Kabanero CLI. + properties: + image: + type: string + repository: + type: string + sessionExpirationSeconds: + type: string + tag: + type: string + version: + description: 'Future: Enable bool `json:"enable,omitempty"`' + type: string + type: object + collectionController: + description: CollectionControllerSpec defines customization entried + for the Kabanero collection controller. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + collections: + description: InstanceCollectionConfig defines the customization entries + for a set of collections. + properties: + repositories: + items: + description: RepositoryConfig defines customization entries + for a collection. + properties: + activateDefaultCollections: + type: boolean + name: + type: string + skipCertVerification: + type: boolean + url: + type: string + type: object + type: array + type: object + events: + properties: + enable: + type: boolean + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + github: + description: GithubConfig represents the Github information (public + or GHE) where the organization and teams managing the collections + live. Members of the specified team in the specified organization + will have admin authority in the Kabanero CLI. + properties: + apiUrl: + type: string + organization: + type: string + teams: + items: + type: string + type: array + type: object + landing: + description: KabaneroLandingCustomizationSpec defines customization + entries for Kabanero landing page. + properties: + enable: + type: boolean + version: + type: string + type: object + targetNamespaces: + items: + type: string + type: array + tekton: + description: TektonCustomizationSpec defines customization entries + for Tekton + properties: + disabled: + type: boolean + version: + type: string + type: object + version: + type: string + type: object + status: + description: KabaneroStatus defines the observed state of the Kabanero + instance. + properties: + admissionControllerWebhook: + description: Admission webhook instance status + properties: + errorMessage: + type: string + ready: + type: string + type: object + appsody: + description: Appsody instance readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + che: + description: Che instance readiness status. + properties: + cheOperator: + description: CheOperatorStatus defines the observed status details + of the Che operator. + properties: + version: + type: string + type: object + errorMessage: + type: string + kabaneroChe: + description: KabaneroCheStatus defines the observed status details + of Kabanero Che. + properties: + version: + type: string + type: object + kabaneroCheInstance: + description: KabaneroCheInstanceStatus defines the observed status + details of Che instance. + properties: + cheImage: + type: string + cheImageTag: + type: string + cheWorkspaceClusterRole: + type: string + type: object + ready: + type: string + type: object + cli: + description: CLI readiness status. + properties: + errorMessage: + type: string + hostnames: + items: + type: string + type: array + ready: + type: string + type: object + collectionController: + description: Kabanero collection controller readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + events: + description: Events instance status + properties: + errorMessage: + type: string + hostnames: + items: + type: string + type: array + ready: + type: string + type: object + kabaneroInstance: + description: Kabanero operator instance readiness status. The status + is directly correlated to the availability of resources dependencies. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + kappnav: + description: Kabanero Application Navigator instance readiness status. + properties: + apiLocations: + items: + type: string + type: array + errorMessage: + type: string + ready: + type: string + uiLocations: + items: + type: string + type: array + type: object + knativeEventing: + description: Knative eventing instance readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + landing: + description: Kabanero Landing page readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + serverless: + description: OpenShift serverless operator status. + properties: + errorMessage: + type: string + knativeServing: + description: KnativeServingStatus defines the observed status + details of Knative Serving. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + ready: + type: string + version: + type: string + type: object + tekton: + description: Tekton instance readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + type: object + type: object + served: true + storage: false + - name: v1alpha2 + schema: + openAPIV3Schema: + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: KabaneroSpec defines the desired state of Kabanero + properties: + admissionControllerWebhook: + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + cliServices: + description: KabaneroCliServicesCustomizationSpec defines customization + entries for the Kabanero CLI. + properties: + image: + type: string + repository: + type: string + sessionExpirationSeconds: + type: string + tag: + type: string + version: + description: 'Future: Enable bool `json:"enable,omitempty"`' + type: string + type: object + codeReadyWorkspaces: + description: CRWCustomizationSpec defines customization entries for + codeready-workspaces. + properties: + enable: + type: boolean + operator: + description: CRWOperatorSpec defines customization entries for + the codeready-workspaces operator. + properties: + customResourceInstance: + description: CRWOperatorCustomResourceSpec defines custom + resource customization entries for the codeready-workspaces + operator. + properties: + cheWorkspaceClusterRole: + type: string + devFileRegistryImage: + description: CWRCustomResourceDevFileRegImage defines + DevFileRegistryImage custom resource customization for + the codeready-workspaces operator. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + openShiftOAuth: + type: boolean + selfSignedCert: + type: boolean + tlsSupport: + type: boolean + type: object + type: object + type: object + collectionController: + description: CollectionControllerSpec defines customization entried + for the Kabanero collection controller. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + events: + properties: + enable: + type: boolean + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + github: + description: GithubConfig represents the Github information (public + or GHE) where the organization and teams managing the stacks live. Members + of the specified team in the specified organization will have admin + authority in the Kabanero CLI. + properties: + apiUrl: + type: string + organization: + type: string + teams: + items: + type: string + type: array + type: object + gitops: + properties: + pipelines: + items: + description: PipelineSpec defines a set of pipelines and associated + resources for a component. + properties: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a + file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + type: object + governancePolicy: + description: GovernancePolicyConfig defines customization entries + for governance policies. + properties: + stackPolicy: + type: string + type: object + landing: + description: KabaneroLandingCustomizationSpec defines customization + entries for Kabanero landing page. + properties: + enable: + type: boolean + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + sso: + properties: + adminSecretName: + type: string + enable: + type: boolean + provider: + type: string + type: object + stackController: + description: StackControllerSpec defines customization entried for + the Kabanero stack controller. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + stacks: + description: InstanceStackConfig defines the customization entries + for a set of stacks. + properties: + pipelines: + items: + description: PipelineSpec defines a set of pipelines and associated + resources for a component. + properties: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a + file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + repositories: + items: + description: RepositoryConfig defines customization entries + for a stack. + properties: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a + file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + name: + type: string + pipelines: + items: + description: PipelineSpec defines a set of pipelines and + associated resources for a component. + properties: + gitRelease: + description: GitReleaseSpec defines customization + entries for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve + a file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + type: object + type: array + skipRegistryCertVerification: + type: boolean + type: object + targetNamespaces: + items: + type: string + type: array + triggers: + items: + description: TriggerSpec defines the sets of default triggers for + the stacks + properties: + gitRelease: + description: GitReleaseSpec defines customization entries for + a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a file + over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + version: + type: string + type: object + status: + description: KabaneroStatus defines the observed state of the Kabanero + instance. + properties: + admissionControllerWebhook: + description: Admission webhook instance status + properties: + message: + type: string + ready: + type: string + type: object + appsody: + description: Appsody instance readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + cli: + description: CLI readiness status. + properties: + hostnames: + items: + type: string + type: array + message: + type: string + ready: + type: string + type: object + codereadyWorkspaces: + description: Codeready-workspaces instance readiness status. + properties: + message: + type: string + operator: + description: CRWOperatorStatus defines the observed status details + of the codeready-workspaces operator. + properties: + instance: + description: CRWInstanceStatus defines the observed status + details of the codeready-workspaces operator custom resource. + properties: + cheWorkspaceClusterRole: + type: string + devfileRegistryImage: + type: string + openShiftOAuth: + type: boolean + selfSignedCert: + type: boolean + tlsSupport: + type: boolean + required: + - cheWorkspaceClusterRole + - devfileRegistryImage + - openShiftOAuth + - selfSignedCert + - tlsSupport + type: object + version: + type: string + type: object + ready: + type: string + type: object + collectionController: + description: Kabanero collection controller readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + events: + description: Events instance status + properties: + hostnames: + items: + type: string + type: array + message: + type: string + ready: + type: string + type: object + gitops: + description: The status of the gitops pipelines + properties: + message: + type: string + pipelines: + items: + description: PipelineStatus defines the observed state of the + assets located within a single pipeline .tar.gz. + properties: + activeAssets: + items: + description: RepositoryAssetStatus defines the observed + state of a single asset in a pipelines respository. + properties: + assetDigest: + type: string + assetName: + type: string + group: + type: string + kind: + type: string + namespace: + type: string + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + digest: + type: string + gitRelease: + description: GitReleaseInfo is all of the GitReleaseSpec + information, minus the "skip cert verification" information, + which is not relevant for status. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + type: object + name: + type: string + url: + type: string + type: object + type: array + ready: + type: string + type: object + kabaneroInstance: + description: Kabanero operator instance readiness status. The status + is directly correlated to the availability of resources dependencies. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + kappnav: + description: Kabanero Application Navigator instance readiness status. + properties: + apiLocations: + items: + type: string + type: array + message: + type: string + ready: + type: string + uiLocations: + items: + type: string + type: array + type: object + landing: + description: Kabanero Landing page readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + serverless: + description: OpenShift serverless operator status. + properties: + knativeServing: + description: KnativeServingStatus defines the observed status + details of Knative Serving. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + message: + type: string + ready: + type: string + version: + type: string + type: object + sso: + description: SSO server status + properties: + configured: + type: string + message: + type: string + ready: + type: string + type: object + stackController: + description: Kabanero stack controller readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + tekton: + description: Tekton instance readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + type: object + type: object + served: true + storage: true diff --git a/registry/manifests/kabanero-operator/0.9.0/kabanero.io_stacks_crd.yaml b/registry/manifests/kabanero-operator/0.9.0/kabanero.io_stacks_crd.yaml new file mode 100644 index 00000000..854aa37d --- /dev/null +++ b/registry/manifests/kabanero-operator/0.9.0/kabanero.io_stacks_crd.yaml @@ -0,0 +1,210 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: stacks.kabanero.io +spec: + additionalPrinterColumns: + - JSONPath: .metadata.creationTimestamp + description: CreationTimestamp is a timestamp representing the server time when + this object was created. It is not guaranteed to be set in happens-before order + across separate operations. + name: Age + type: date + - JSONPath: .status.summary + description: Stack summary. + name: Summary + type: string + group: kabanero.io + names: + kind: Stack + listKind: StackList + plural: stacks + singular: stack + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + description: Stack is the Schema for the stack API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: StackSpec defines the desired composition of a Stack + properties: + name: + type: string + versions: + items: + description: StackVersion defines the desired composition of a specific + stack version. + properties: + desiredState: + type: string + images: + items: + description: Image defines a container image used by a stack + properties: + id: + type: string + image: + type: string + type: object + type: array + pipelines: + items: + description: PipelineSpec defines a set of pipelines and associated + resources for a component. + properties: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a + file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + skipCertVerification: + type: boolean + skipRegistryCertVerification: + type: boolean + version: + type: string + type: object + type: array + type: object + status: + description: StackStatus defines the observed state of a stack + properties: + statusMessage: + type: string + summary: + type: string + versions: + items: + description: StackVersionStatus defines the observed state of a specific + stack version. + properties: + images: + items: + description: ImageStatus defines a container image status used + by a stack + properties: + digest: + description: ImageDigest defines a container image digest + used by a stack + properties: + activation: + type: string + message: + type: string + type: object + id: + type: string + image: + type: string + type: object + type: array + location: + type: string + pipelines: + items: + description: PipelineStatus defines the observed state of the + assets located within a single pipeline .tar.gz. + properties: + activeAssets: + items: + description: RepositoryAssetStatus defines the observed + state of a single asset in a pipelines respository. + properties: + assetDigest: + type: string + assetName: + type: string + group: + type: string + kind: + type: string + namespace: + type: string + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + digest: + type: string + gitRelease: + description: GitReleaseInfo is all of the GitReleaseSpec + information, minus the "skip cert verification" information, + which is not relevant for status. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + type: object + name: + type: string + url: + type: string + type: object + type: array + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + type: object + type: object + version: v1alpha2 + versions: + - name: v1alpha2 + served: true + storage: true diff --git a/registry/manifests/kabanero-operator/0.9.1/kabanero-operator.v0.9.1.clusterserviceversion.yaml b/registry/manifests/kabanero-operator/0.9.1/kabanero-operator.v0.9.1.clusterserviceversion.yaml new file mode 100644 index 00000000..fab7bd2d --- /dev/null +++ b/registry/manifests/kabanero-operator/0.9.1/kabanero-operator.v0.9.1.clusterserviceversion.yaml @@ -0,0 +1,334 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + name: kabanero-operator.v0.9.1 + namespace: placeholder + annotations: + capabilities: Basic Install + categories: "Integration & Delivery" + certified: "false" + containerImage: kabanero/kabanero-operator:latest + createdAt: 2019-11-19T12:00:00.000-0500 + description: Bringings together foundational open source technologies into a modern microservices-based framework. + olm.skipRange: '>=0.6.1 <0.9.1' + repository: https://github.com/kabanero-io/kabanero-operator + support: IBM + alm-examples: |- + [ + { + "apiVersion": "kabanero.io/v1alpha2", + "kind": "Kabanero", + "metadata": { + "name": "kabanero" + }, + "spec": { + "version": "0.9.1", + "stacks": { + "repositories": [ + { + "name": "incubator", + "https": { + "url": "https://github.com/kabanero-io/kabanero-stack-hub/releases/download/0.9.0/kabanero-stack-hub-index.yaml" + } + } + ], + "pipelines": [ + { + "id": "default", + "sha256": "1348e90cc3269b6e65837f71011bef6f0dc662781a41442cb5ce3714cb91b890", + "https": { + "url": "https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1-rc.2/default-kabanero-pipelines.tar.gz" + } + } + ] + } + } + }, + { + "apiVersion": "kabanero.io/v1alpha1", + "kind": "Collection", + "metadata": { + "name": "java-openliberty" + }, + "spec": { + "version": "0.2.11", + "name": "java-openliberty", + "desiredState": "inactive" + } + }, + { + "apiVersion": "kabanero.io/v1alpha2", + "kind": "Stack", + "metadata": { + "name": "java-openliberty" + }, + "spec": { + "name": "java-openliberty", + "versions": [ + { "version": "0.2.11", + "pipelines": [ + { "id": "default", + "sha256": "1348e90cc3269b6e65837f71011bef6f0dc662781a41442cb5ce3714cb91b890", + "https": { + "url": "https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1-rc.2/default-kabanero-pipelines.tar.gz" + } + } + ], + "images": [ + { "id": "java-openliberty", + "image": "docker.io/appsody/java-openliberty:0.2.11" + } + ] + } + ] + } + } + ] +spec: + minKubeVersion: 1.16.0 + apiservicedefinitions: {} + maturity: alpha + version: 0.9.1 + replaces: kabanero-operator.v0.9.0 + displayName: Kabanero Operator + description: | + The Kabanero operator is used to manage Kabanero Foundation instances on your Open Shift or Kubernetes cluster. + + [Kabanero](http://kabanero.io) is an open source project focused on bringing together foundational open source technologies into a modern microservices-based framework. + + Use our application stacks infused with expertise to select proven technologies, languages, and runtimes for building applications for Kubernetes. Apply customizations before sharing the application stack with developers and operations teams, to ensure your business process and governance needs are met. Application stacks reduce the decision-cycle time, enabling developers to focus on delivering line-of-business value without having to become full stack experts. + + ## Prerequisites + The Kabanero operator creates objects that are processed by other + operators. The target environment is OpenShift Container Platform + 4.2. The following operators must be installed in the cluster: + * [OpenShift Service Mesh](https://docs.openshift.com/container-platform/4.2/service_mesh/service_mesh_install/installing-ossm.html) + * [OpenShift Serverless Operator](https://docs.openshift.com/container-platform/4.2/serverless/installing-openshift-serverless.html) + * [Openshift Pipelines Operator](https://github.com/openshift/tektoncd-pipeline-operator) + * [Appsody Operator](https://github.com/appsody/appsody-operator/) + + We recommend you use the sample install.sh script located under "Assets" in each of the [Kabanero Operator Releases](https://github.com/kabanero-io/kabanero-operator/releases) to install the prerequisites from the appropriate operator catalogs. + icon: + - base64data: iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAe3UlEQVR4Ae1dC3RU1bn+zplnJpNMXiQhQCCQEAgKiIgIXqUqIFJfrbWV2qftum3va9X2rnattlZd7fW23tXnbV3UWqu1tnpbe9VWaisgFEQe8pQqARNIDAmEvDOTzOvM/f49c8YoVCfUnDnhzoaZOXNmn3P2/r/9//t/7R0twYJcOWcpoJ+zPct1TFEgB/A5PhByAOcAPscpcI53L8fBbwPwuaB/5gD+GwCb4Jqff6Oa7U/nAD4DRAKqYRgwwTU/z1DV9qdyAL8FIhPMnp4eNDc3IxQKQdO0NwH+lkts/TUH8BngEUBPnTqFu+++Gxs2bEiDbAJ9hktseyoH8AhohHsFxEgkgqamJhw8cADXXXcd1q5di8bGRsTjcei6rrh5xGW2PnTcyWLrFlrcOAG4tbUV3//e9xCORjF58mTcf//96Ovrg8ftRtWkSfB4PGp+lrp2LxpHbc4XPQIlIcexY8dw+PBhlJaWYmBgAM8//zyED2bPno2v33EHVq5ciaLiYsXJwtF2LjmAR6Aj4MpLRLRwp3BqlFzc3t6OLVu24DOf/Sx4Ag8+/DCuXrUKeXl5qp6tOZkdypURFKB5lP7GOTdhfu/t7U089thjIu0Sl112WWLr1q2JWCym6pp10hfa6MDe8mUEd1l1KNxIfNJzrByLchUIBLBixQrce++92Lx5M5588kl0dXWlmyX17FhyAJ8BFQHZfMkca2rOAvIqiubK8nJs374dO3bsQDgcVnXPcBtbnMoBnAEMJtjyKVr11++6C5s2bcK2F15AP7VrKSbXZ3A7S6vkAB4FuQVEv9+P+fPnq6tE2xaTinOx4mI7iukcwBkCLNwrxeFwKPNp2eWX4zW6MtuOH7e1mM4BnCHAUs3kUJ/Ph1mzZuHFF19ULk3hYLuWHMCjQMbkYjc9WmUTJgjikKDESIDNQTCK245p1RzAZ0Fe0apdLpe6cnBw8E0An8XtxvSSHMBnQV6xi8XDJUW4125cO7JLOYBHUiPDY7F9TSeHgJ0DOEPCjZdqkgQgwQgp5rxs17bnODhDZEwulVQeCR3u3r07faWdQc4BnIbpnQ8EyOHhYbxO50Z3d7e6QCJKI0OGdgPb+c7dytUYSYFgMIi9+/ZBo8NjCoP/FRUVELPJriUHcIbImJwpuVpPPvUUplVXK3DLGXgwTaYMb2VptZyIHgW5h4aGVK7WfnKwcG1lZWWag805ehS3s6RqDuAMyGyCJ8rVnj171BWHDh1CSUmJAlk4WOqYXJ7BLS2rkgP4HUg9Erguiud169ahipwrpb6+HsXMzZIi4NoR4HNrDiYXyT/5ny4MApH0gkD61NkchKhcNTOV9gXGgC+44AJUVlWhoaHB1gqW9HNcA6xwpF36pqK/mZOEA5lYlQZY4+8C+WhLJ7n3BUaPHE6nck9KNGnatGlw8rspwkd7Tyvqj0sRLcAq0FLAaXT+my/JeoyFGAAYHEBsKCgVlUmjftd0fk0BngF1TfEsfucjR47gnnvuwaKFC3GACfG1tbVKwRKA7Vzs3bozUE5xC7lSRK7MeUYsgvCpTkT6exHt7UK48xTBDSERJbBuHc6iALyVE+EpLUceQ3y6O0+F+WSAqDmT93in0tHRodJmpZ7X61XVRTwXFBSkL7Xj/CuNG1cAJ8ElMLqDAEYQ7GjDwKsHETr4Moab9iHS8gqME51IDAwJ4yrORcAHR/UU5J1/JQrmL0Th7Ab4Jk2B7qJzQgaKvKS8BWiTeyVHWjj2zjvvxJIlS3CcGRzLmV1ZV1en7F/VpuQdbPk+bgA2OVfAjQ30oe/lveh69gmEnnkWRtdhaEVEtBDQy0qASp+aZRPREIxQC2KvtqBvy1YMFC9Az9WLMWH1DSiauxDuImrAJsAj4DHBlc+jR49i/fr16ldJhD/ENUqrrrkG1XR02JVrR3RlHHGwzLecayM9nTj1/B/R9fNHEHvpT9AbNDirJzFZimOVcywrAXHiJqo0udSR54ce4LeqGIzBVxD89m4M7TyA4U9+DOXLV8NbUZmcz3mlACagmgBLMF9yoH/4wx/iwgUcHCn/89y5czGB4t4E2PwcSVi7HI8LDk7EmfNEzo10deDE//4KPT/5gppcXJfOgOZkPDYeREL3IhEkx3Z5YEQIMpUprZDiPEAFzMmgPMJwTCiDfoMXseN/QfsX/4rI13pRdeMH4auanAZZwJXggcR5Je/5iSeeUMH9/Px87Nq5E6tXr1b2ryhXElmyM7gyyGwPcIKEFs6MdLej/dcPov/+r0KfTIYtq0Mi1otEJMReVCF+fAjOCVXwXbsKTiaoG+EYhg9zbt75CDR/NXT6jI3+o+TqfLhp3sSKhtH1z19kSkYck25eg7yJk2HEDY4j0bQNbNu2Dffddx82c+HZQmrO/f39CDGSJObR1KlTFZfbhUvfrh22BVg4STQl4ZBI3yl0/PrnClxHfTH0/FLOrcfI1YXkzgrEu5iv/J6bUHHzx+ElN2q62KbEbrAfffvfj86f/gDh5zbCffVcJEI9VMKOwVk4CdpV5ei9+0tUxtyYfMsapWn39fZi/caNePCBB7B95w5MpzkUpaIlqwylTGIEqaysLC3Gcxz8dsPr7X4jQho5V0A6+eSjGHjoK3A1cK5l/DVBcDVXCfF3w+DCgrxFKzHp058nF1a/6Y6uggA8JRPg5fn2KT/GwHcfgPv6eorqBhi9x6AXUJOeC/T+4r/g8OWjmiAHI1Hc8aH3IVIzEzOmz8AggY1Qiog4nkbOFeVKlK3xIJ6FGLZzdCglh8QUx0Scjoqu9U+h7xefh2MaJbWPNmz4BFvtpplDoLs74Jo8GxUf/HgKXCpIFLPqHhwgImp1jxdF58/DlH/9Esrv/wHi+w4hvOEgEhTruq8Ujsrp0Dxt6H7oW2hf93uUBfLxlUf+B4cPNaplpIGiIvhp73aeOIFyxn5H2r5vGk02/WIvEU2xSj2WABLc4SH07tyEnke+Q5Es0ngGEuFOiu0Qv8+gMjVEwBtQeNX74a87T5FXvFQa59B0EdtWZLXmgH8a7dYbC5BXMwPdz/weoV/dh5jHDee8yXDWzEO8cx9Orr0T3iI/rr1mJR785aP4pw+vQQHNrpq6epxP/3NvT69K10nfX+4t5S02dPKkPd5ttYUDNy8SalEDjmHgFdq5D/+IytNGKlV1nFB7FPia7qF49iPe0gTvJbdiwrUfgJtiOJGar08jtkl8guH0FSB/ylR4Oa86z18Iw+VDdN8mPiMMvYjmUvwIBg+0oGjWHNRfeBEWLbsCw5QIzzz9NHQjrpaq1NbVqiBDYWGhkhTyPDvPw7YBOKlUkQPJvUOtzej+3c8Q3vYgHNNreC5MgIcIfpzilApOL1fg5xej6L2fQGDeRWRQJzRhJhVI+BucQyDkGVLXU1IG3/RaeGfUQp9K7tV9iLefpPgPIrq7CX3HOlA6awZmnDcXdQ1z0DBvPtz+Ajg0J7b/ZStmzpqJmTPrKGgc6YfZFWT7iGjhQBIsSkdG3+Z1GN74fboYJ0J3kq/D5F4H59zYIP3LbsTbmuBb/UUUNMxVLkcFnMmpaZKffqBAIMgJ1nXmFyBw/gL4a2dhYNFi9O3ehcHtm+AobUPkpXVovGMQVbd9EnMuuwI1N70Pl158MY40N+PI4UZyrI7wcBguUdKkmKI6+c1WItsee3SI41gEsBFF9/PPoHvtv1EJOk4PFLXmSD/pR9sUdHY48ilG82G0coOU2x9H2ZXXUd/ypOZZivZRFCUx5KkyMPj8OE2hoY5W9O/dhYGdGxHcshfRTTuRf9utKH/vKhQtuAQoLkGIdrOHGRwer+zPwfme/7WEaA7yL3k/O3GzLThYcaCI5qZDGHjul5yDW+AITCfdGe4T2SuikH5lR+FURPYchOeyz8FX10Bw3YqsGTDvadCnuVlxnwYHtW3/1DoGIqZhwuUrMHjDIfTu3Y5++rubP/JhOBZcjvwLZqFg8SIYU2sRKy1hewJwevJ5rUdp6zozLQ1xzHCwag4ZcKMbdKc18l04kXUOFk+VpKDG+rvR+cTDGHzq89AnUqlKDIunggASXAGB8x/cFYi+uB8lX/8lyq66ln5mhuuE+4WT3oWiHmNiQqXK4LqjcHcnQq8fw2DjIQzu3o7hTesQ3dUKbcnFyKubDNekcjhKqpBXW4/AnPNQMJXuU/rAkx44As2Bm82SXYCFojRtQNOmd/uf0fPTj9GBwHnWV05wB4grxXKCAMe5D4Z/BiKvtcFVvwwVn/4q/DPPU3OpMqvebU5hu9iqtHaciEVhRGOI0i6P9kjMuRO9u7ai994vI9ZCT+miYvq9Z8JZMRX+y5agYuVqSoNatp934SubIGdVRCsiEtzIqTYEd2ymV6od+qR6+pd7SV5xU8oEJ+NfguwE++RJFHzqWngn02NFuay9i9wrT0kXdW9pHfGRN4eLwSq+6EXzlpQiv7oGgdlzULZsOU4+9Vv03fcfbC63ctC2o+eBFxDatx8Va9agdNFSXsogiADNko25OYsAc2SryTOB0Kt7ENn7DeglUwhalKRg9EdEmxCGNrGWV4UYA/meJVfDP2c+NeCAIpiAPGYlde/kE9iOJEZ8HAcWlSxXgGZaoIgx5RJmjZSg9+Hv8qca2uxOhB79GdpaX4H273ei9JL30BJwZc21mZ0JQomuJH7R7hMY2r8DiX7qUn4GD+L9ylwS8BVxnTRFNL76OlC46lPk3ulJTBVXjCHAI0eOgG2+BGn5z+dziMI3eRoqb/gA/Nd/EvGdzQQ/D54V5yH89Da0P/ZbDDYdZuVk0MTk5JG3Huvj7ACc6pWI2OGWQ4i+uoGuSDorNDGXkiaTJk4NikbdWQjj1B54l30W/vmLoXt9yZGR4rCxJtBp95eBl3qRLdXPeZWTUbZiFdxXrqBnbD993Drcq2Zi6Ec/walN6xFl4oC6Rg3stCg47dZjcSILACc5QDgiER1G5OghArg16WuO01vFUJ+m0dTQXXwxuBDlRmT5/4CilR+Fu6xiLGhw1vcU0FTyHqcT/4w6FFy5GolXOf64xMVRxEQDusgHtu5A8OhrrMfEBKmvJM9ZP3LUF1oPsAxgkazsaKT7JAE+kvzucXH+ZQCBgQH+SFFXAM1gcl24EAXXfw75s+ZRdFNlEAKRULYobEcyz5oWXGEx/PX0cddTBnVRb3DE4CyfhOi6R9C/fw9iwSCbbX27rQdYJjD2U9JwYtSe48fp+qOSLJkUSZNnmFMulShytzHUB9/Sa1F06Uo6EsjNIhKzQKS3G0xK6koFavzuskq4LrweRkczTzjoiWNHqTMGD+xBlGm9qpq8WcjFWQBYRjGhjEcRpWvQ6P4THAU1BE+0ZwYRmFKjRvpgKzwzCe6KNXAWFCtRaDdwBStVFGD0b3P/LOfESQAVRgFYc1G5qmavmtoxdPx11ecEB4KVYtpagNVwFxlNPIdDiJJ7EaZY9tIjZYh4lgB9CUVcK3OobkDhio/BXTmVPJ8yqWzGvdIPGa6q8EDPYw528QSgVRiaADO6pRcXUko1Y/h4C2PclE7pC8wLx/bTWoClL9JDAh1nnpXRcUJ5IGUFghbvVfauERQiROBbzA23Z17AuYxKl3i7LCbMaMhuNk3aqru9Sfe5OGkkASGfedp9uxE5eZzZnpHUbZODfDTPONu6lgKsukWAE1xuEjvVQU5lXpTPTUCTm3lqTv4thO5GuGd+Br55SxVHvKFUmWQ8265acJ3oCCoLlM8iZTVOO7qHg5d6Y+zEcXpc6V9XJTnIU1/G9MNSgM2eGFx2Eu1sZR7zJvqdqzi/UjxLEl0oqnwa3nlL4KmqIfCp5lkt18yGZvApg5Z8qmrGOe3EaRlotfJV/OgcuIxnS3JyrKePsxBTfFmoe6tPK94sBTjdrWiY3NvM0T5Ikca4qsGMDYbd0PtXuGtvg7duvhJ1Qjq7F+XAkI7RaRM9dRLRxg1w1HAejhFMOa8TfnJwIhJDnLFkVdKESH4dy3frAB6pYA0NJke6mLxcmaDkmTiFOEV5Zl+iFCsxOxS+NuZeBYz0i0W4N9TUiNjOlxlVIsCShSKKloAp/ZSSqitXWDV0rQNYOqhAMxgJlORz2oUUXUIAjclvGKSSVV7NVQf1nJdTyzLHAbhKPJN7h1qbEGSivF7K/ngIH8OdEueWDqo+ysL0LMSGLQSYnSaYYv8aQQIc5kZiBFgS5XRmSSb6Wyieb1XeHyXaRnC8jA1bFrZRwBPlaZBLWMOb18LZMIuSiOKZGrX0g//Vm8Pr4KkkuSVJRZ23oFMWApzsDf8WDRJcfa8x10p3lnBUc5mJIVTisqHqOq4rKktSRKpbRYVk00b3LgNQhTQNBJteRf+m55TJ5yhif5icL4ESEdEwSGJWdQQKGCihN45FpRNY1DfLAWbSEhUO5loZDAsyU1JzMluS3OygaHOVc2G2h+JaiiKARVRIPnEU70QsNYuKC7J/2wZEDzwIJ9N2EsOcarjygoZ9UkRL3IS1ncVc2ehigqAqcr01fbMOYOmTFAbwMUxwE60c1hzRDnZ6uAl6xYcIMrcnklGvxHOyuh3fpXlEkY6LMPr3bENo87OMhpXRUUM0o10ctLTtJQYsc3CEjpu8WrgquFSGKymSxRpw5VnWAawy04mdeKXiYvBzpHONLWdgaGGuOqigckWfsypCQZsqWMqPnGrbUMtr6GPWpdH3HAdnkUo10iTMKdwtSfhy3NcG55QG5M+YTV81dQ3poIV9sw5g1TPpHQ/o8ZE+KhuSI12klaN0EhwSzJdi3QBPPi/TdyVZkm6NaNcJ9PzxcUQPP0n/MzMpdQZKuBBdSSRZP5XHOSfE2ZZjOX/JUviYhGdKJyvDhtYBnAYtdcAPNZAlBsxwoaOogl4sSa7jALBwhGeKrapHgMXUMcIh9GxZh9DGuyiaKXXcnHailEhMzBcPlsZpR3MFEGs7AveFt6Bo6XKuRyaHK9k+qif+3ZWtA9hsquArsV95sgBJL5aeV8GQITVqUUKE07lSwHZFJE1Ka+7fvx19j/4jF6zNoc1L+1YyUWTAsk8aA8C6t4zrj3uUilG06r3In17P35K6hZXcKzS0DuAUaEosy9zL/so8JSaSljedURc/T5jApuW5tNEGRaQKSUUODDa+jO6ff5ODsY7t5vlYF89TDouyKNzrJBdrfhjH2pG/6hsoWnyVsgzSqx8t7o11AJsdI6GUaeSYTDgp8mg2afncTsEr4i1VbCSiRawmUoNz+PUmdP92LeId6+Go4HQSbk7OJg4JETJQwoRB3VeJ+LG9cM9bgWJJxOMGbCKW1NDNQr+sB1hElTuf0o5mhURbqF3reYGkSWECbJNPc84UXCKdr6Pn2Ucx/MKP4Zq+iM6ao2wzXarsD3cRUeJb802ij527wbP9xTcxj6zu/DfmXTUnWd8x6wBOSV9RUiS/SnOKSJY0nTi/c+kHPT92Km+AqyHW14W+TU8i9Ic74KpdSInczvayQ6SezLmy8kH3VBD0ZiROAkUf/wlF8zIOXrorRbHKAueatLQOYPOJkvXAzclklT49HCQQuViOJWNSlezPv0lwKVYJTCzInXpeWIfgM1/hfh7csUXvplI1mORYBS41ZrpcjYGjSPQMI3Drd1By1XVc6SqrL2gOimKWxWLh0zniZTBzGYfmp8acx1eigydoYohZIaLbBkWBK6k2FKkGw5r92/+EwWfuYzu5Y56f3BplRp2kEUnuNt2smoNbOfQeUrllBTf/ACXXfAiuEnKz2Po26JOFABM9MTUo13Q/RbJkSgriCToI2IqUBM8uxCJO+ZKNXCQpf2DXBgSf/m/mvTIMOEE8VdSY1ShlPW77oDm44VrvYSYncOnozfej5OqbmTo7kd2k4phFsTySiKZcHHlubI5Vh0kYFp1ZlHpxFbQWAkuAJdKfSJAjslpEWya4FKkS0uwnuP2/+0/ub8lNwMsbCDg35FLKlJh43GlACzBbcj/33FqCwutuR+DiK2nLcxDIemdxU/6/A1iBl+JTOjT04hq6amdSYWmknjVAE1IULilZ4GUCq+xUilTFuTvXo/+x29kuRrnKBFwmJ8guP05KHidBDEdgtO2He84tKFz9afjnXaJSjCQUagb5k33J/rt1HDyirzIPO4orEfOSeCECTAImJMqkinC5RSDLo0QsC8MR3PhgDwZ3PIv+x29hMiAdGX5Gt8KnyJUhfp/Cyty+qeslasuAb/ndCCy/Ed6aBp4Xrk+FB23CuWyUKtYDLGKQAOtF5YweTWTyHWks2R1MxHujWACy6APymJSWGz3BbRpefBrB3/8Lt2RYQFtdls60EHgJ1FfzmNPIyZe4hnk68q/7Ggq4VtlVwgEg0TGaeopz3+iAbY6sBVgYU3GMrBikFl1YSsLwVJDLOkLJtTtjzr3yfFXYGHGVMnAw3HIYwY2PIrz32/RQzeOv3J440kNgZS9pLt7ufJn1iPmCL6Dgimvhm8W9uZgNmlamlN81dVubfVgL8AjRqzFNVilajIEnBncwwYMegiid9tzyIDkI3mUxbQKruJb3plIX6zqJ4b++iNCWR7mH9G+4W3wDbVxu20Tvmubl7nm0gY2eRnLt5chbsgb5i1fAUzk1pf0nFbIxH5B/54CxGGC2Vggs2ImiVVJNP/RSoGsrF6E1c70S86S5Ql4BLB17NzB+K7AEzwj2Idx6iDu//wHRg08xP52LtotrqdGTcyVZLiG72B5USrPngtu5wnE1d9RZAIe/KNl+aZsyMN+NBsrNxq5YD7DQhESXZDudMWDdP522JAFu46uHkZcC5hSLmZEeCWfZeQHWVHjkk8AmIkOIdbZg6MDzCO/bAOPk45S70gbmUmnU4iVBjnNqglv/63lLkfeeW+C7aBVzxRgYYRqOcl5w1CXdyvYHVyhnPcAmXuKTLqSiFeDSFepYic7fcIPRGzkH1jDGysiSAshkd/OiDD8V18q1LARX1kLFu15HuHEXgd2E2LEfq5CzXlhHCvDvDsbEZSpDitPDANdGVX8EvmWfgIcrLBxmGpG5NtkcNOrm9n/LDsAKN2ZjFZRy3iMHt5FQVGLijb+DUX0e96ikz/dsCCnAKm8Z4RLtmMfx7rYksAc2I9b0I87zEQ6smeRcAkvzR6UPOQO0x/m3lkKn4L3oq/BdtgbuqunKJam4VtrC+40Pnn3zoLMeYAVcirs43+rlnPtcF5GY9Gid+g1ijVdAK5lEscmcJgFL1c+AtMJhUlL+33hvOzdO4/ZMBwns4W9xfudPfgJbVpi0u6NcJOYWt6KsaNxJm3c+fNd8H/kL6ZEKMIbLwaK0ZGVGZfD85NNt9249wCYJlBglFxNgvXQp58PvAYHFMF6+EzFuDeiat4omFFVs+nWJMl8cFGfi6tRYMe1ZY6AT0ab93LnnL4geuZ+uxuMEr0b9BTRxpiTCr3M+5Zrd/GlU7Nq4hOY4nLNvQ96lH4W3/kKCzulBiWM+zgbBApNcZ/uZHYAFKAGYH2Iq6VMvgtHMr2VMK/VGET/4EJUc7s9ct5RgmMniqS6qgSGo8mK5D/9LMQa7mOTWiOgrW5jp+BCBO8gN8qbRV0xxb9BJwdQaCdCLR8rghihG+04++zy4r7kL3nnLmLdck+R+AVdxbfK+4/09+3tVEiSjp5Vb966F8eo3kWACHldLE+yb4Dj/g1S6ZhEoxo898vIp84p7wyrxLX9Sxwj2Kk6MHtlFUfwrpZHDQ63XTRHPkpBghsb5FpQGIdq1fXSNcnp21H8ZnguWU5G6kIEhxm5l4MjrHAJX+p9dgEXsppjROHEEsZf/DOP4Ti5E20cnwx5yHhsYWM4UiVnUtmv5OVFtiSDZl8lFbN30Mh0mN24ksLuIGuPKnim8JW/KTEe1DkrEsjhQhqnJcVxolZ+Be/blcNcvYiBhCrnalQRWUSMlDuT4HClZBphUFK5Jza2JIAHjtg6JTjo9Oo+QM48RuFaC00mwiLbaR+sETZxhfifI9F8n6HlSy1Al41bn3CrsGaeDO06YZfDIy0VRXzIXzukXwlm3CK5KBhJkI3GR76qSHJ574LJX2eZgaQLLCJDFhSimjEGnhPojVpxbExTDCdnfYphhxeFu5bAwuOYH3JU2EeGe0qyfiAXJ8eRUeqFUCquIdB/93X5q5EXVcHAXW+FYtRWieCpM9JNei2Q7zsH37HNwmqhkNUV0ctJIbhLARczKbxK5Ud/lkxwtyhODBbIITP6gBmL8FJHrJriy5b5oxPyu0oTUqgnhWF6nyluek27HuXVgI4CFsAIcP0RaKrDlmNyWUUmBrgbHGa4xOdbUvjO65/ivZDOARxJUkGZJfSS/jHwXQPnd5HYZFKoIl5rX8tP8XX4beZysfM6/2xjg0dI+BbhcpsBOIz7aG51T9bPj6BgTEhLQHKanUfYMk9VpdXInxjEFcgCPY/AyaXoO4EyoNI7r5AAex+Bl0vQcwJlQaRzXyQE8jsHLpOk5gDOh0jiukwN4HIOXSdNzAGdCpXFcJwfwOAYvk6bnAM6ESuO4Tg7gcQxeJk3PAZwJlcZxnRzA4xi8TJqeAzgTKo3jOv8H1R6W26jPIb0AAAAASUVORK5CYII= + mediatype: image/png + maintainers: + - name: Tim Kaczynski + email: kaczynsk@us.ibm.com + - name: Ed Mezarina + email: mezarina@us.ibm.com + - name: Dan Cleyrat + email: dacleyra@us.ibm.com + links: + - name: Kabanero.io + url: https://kabanero.io + - name: Kabanero Operator + url: https://github.com/kabanero-io/kabanero-operator + keywords: + - 'Microservice' + - 'Knative' + - 'Istio' + - 'Codewind' + - 'Appsody' + - 'Tekton' + customresourcedefinitions: + owned: + - kind: Collection + name: collections.kabanero.io + version: v1alpha1 + group: kabanero.io + description: Kabanero Collection + displayName: Kabanero Collection + resources: + - kind: Pipeline + name: '' + version: v1alpha1 + - kind: Task + name: '' + version: v1alpha1 + - kind: ServiceAccount + name: '' + version: v1 + statusDescriptors: + - description: Version of the collection + displayName: Version + path: activeVersion + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: The URL where the collection is located + displayName: Location + path: activeLocation + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: The status of the collection + displayName: Status + path: status + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - kind: Stack + name: stacks.kabanero.io + version: v1alpha2 + group: kabanero.io + description: Kabanero Stack + displayName: Kabanero Stack + resources: + - kind: Pipeline + name: '' + version: v1alpha1 + - kind: Task + name: '' + version: v1alpha1 + - kind: Condition + name: '' + version: v1alpha1 + - kind: ServiceAccount + name: '' + version: v1 + statusDescriptors: + - description: Version of the stack + displayName: Version + path: activeVersion + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: The URL where the stack is located + displayName: Location + path: activeLocation + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: The status of the stack + displayName: Status + path: status + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - kind: Kabanero + name: kabaneros.kabanero.io + version: v1alpha2 + group: kabanero.io + description: Kabanero Platform + displayName: Kabanero + resources: + - kind: Stack + name: "" + version: v1alpha2 + - kind: ConfigMap + name: "" + version: v1 + - kind: Deployment + name: "" + version: v1 + - kind: Pod + name: "" + version: v1 + - kind: Role + name: "" + version: v1 + - kind: RoleBinding + name: "" + version: v1 + - kind: ServiceAccount + name: "" + version: v1 + statusDescriptors: + - description: Kabanero foundation version + displayName: Version + path: kabaneroInstance.version + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: Kabanero operator readiness status. + displayName: Kabanero Readiness + path: kabaneroInstance.ready + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: Serverless readiness status. + displayName: Serverless Readiness + path: serverless.ready + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: Knative serving readiness status. + displayName: Knative Serving Readiness + path: serverless.knativeServing.ready + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: Tekton readiness status. + displayName: Tekton Readiness + path: tekton.ready + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: Kabanero CLI service readiness status. + displayName: Kabanero CLI Readiness + path: cli.ready + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + - description: Appsody readiness status. + displayName: Appsody Readiness + path: appsody.ready + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:label' + # The required CRDs are not listed due to OLM's random catalog selection, + # but the following are required: + # Knative Serving, Tekton, Appsody + required: + install: + spec: + deployments: + - name: kabanero-operator + spec: + replicas: 1 + selector: + matchLabels: + name: kabanero-operator + strategy: {} + template: + metadata: + labels: + name: kabanero-operator + app.kubernetes.io/name: kabanero + app.kubernetes.io/instance: + app.kubernetes.io/version: '0.9.1' + app.kubernetes.io/component: operator + app.kubernetes.io/part-of: kabanero + app.kubernetes.io/managed-by: olm + spec: + containers: + - command: + - kabanero-operator + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: kabanero-operator + image: kabanero/kabanero-operator:latest + imagePullPolicy: Always + name: kabanero-operator + resources: {} + serviceAccountName: kabanero-operator + clusterPermissions: + - rules: + - apiGroups: + - '*' + resources: + - '*' + verbs: + - '*' + - nonResourceURLs: + - '*' + verbs: + - '*' + serviceAccountName: kabanero-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: false + type: AllNamespaces + provider: + name: IBM diff --git a/registry/manifests/kabanero-operator/kabanero-operator-package.yaml b/registry/manifests/kabanero-operator/kabanero-operator-package.yaml index c4bdf809..39ef7cdb 100644 --- a/registry/manifests/kabanero-operator/kabanero-operator-package.yaml +++ b/registry/manifests/kabanero-operator/kabanero-operator-package.yaml @@ -15,6 +15,6 @@ channels: - name: release-0.8 currentCSV: kabanero-operator.v0.8.0 - name: release-0.9 - currentCSV: kabanero-operator.v0.9.0 + currentCSV: kabanero-operator.v0.9.1 defaultChannel: release-0.9 From edcee004092be30ab57446c879bfe63754a8495a Mon Sep 17 00:00:00 2001 From: Daniel Cleyrat Date: Thu, 4 Jun 2020 15:53:59 -0400 Subject: [PATCH 07/15] devfile2 --- build/Dockerfile | 1 + cmd/serving/main.go | 65 ++++++----- .../orchestrations/serving/0.1/serving.yaml | 101 +++++++++++++++++- deploy/crds/kabanero.io_stacks_crd.yaml | 4 + go.mod | 3 +- go.sum | 5 + pkg/controller/serving/controller.go | 18 ++++ pkg/controller/serving/index.go | 57 ++++++++++ pkg/controller/serving/register.go | 6 ++ .../serving/serving_controller.go} | 93 ++++++++++------ pkg/serving/index.go | 80 -------------- 11 files changed, 287 insertions(+), 146 deletions(-) create mode 100644 pkg/controller/serving/controller.go create mode 100644 pkg/controller/serving/index.go create mode 100644 pkg/controller/serving/register.go rename pkg/{serving/stack_controller.go => controller/serving/serving_controller.go} (65%) delete mode 100644 pkg/serving/index.go diff --git a/build/Dockerfile b/build/Dockerfile index e8df32f9..c6ae79c1 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -20,6 +20,7 @@ COPY build/_output/bin/kabanero-operator-collection-controller /usr/local/bin/ka COPY build/_output/bin/admission-webhook /usr/local/bin/admission-webhook COPY build/_output/bin/serving /usr/local/bin/serving +RUN mkdir /devfiles && chmod +777 /devfiles COPY build/bin /usr/local/bin RUN /usr/local/bin/user_setup diff --git a/cmd/serving/main.go b/cmd/serving/main.go index 92ba41a8..e7cdffb0 100644 --- a/cmd/serving/main.go +++ b/cmd/serving/main.go @@ -6,22 +6,23 @@ import ( "flag" "fmt" "os" - "runtime" + // "runtime" "strings" + "net/http" // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) _ "k8s.io/client-go/plugin/pkg/client/auth" "k8s.io/client-go/rest" "github.com/kabanero-io/kabanero-operator/pkg/apis" - "github.com/kabanero-io/kabanero-operator/pkg/serving" + "github.com/kabanero-io/kabanero-operator/pkg/controller/serving" "github.com/operator-framework/operator-sdk/pkg/k8sutil" kubemetrics "github.com/operator-framework/operator-sdk/pkg/kube-metrics" "github.com/operator-framework/operator-sdk/pkg/leader" "github.com/operator-framework/operator-sdk/pkg/log/zap" "github.com/operator-framework/operator-sdk/pkg/metrics" - sdkVersion "github.com/operator-framework/operator-sdk/version" + // sdkVersion "github.com/operator-framework/operator-sdk/version" "github.com/spf13/pflag" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/intstr" @@ -40,13 +41,6 @@ var ( ) var log = logf.Log.WithName("cmd") -func printVersion() { - log.Info(fmt.Sprintf("Operator Version: %s", version.Version)) - log.Info(fmt.Sprintf("Go Version: %s", runtime.Version())) - log.Info(fmt.Sprintf("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH)) - log.Info(fmt.Sprintf("Version of operator-sdk: %v", sdkVersion.Version)) -} - func main() { // Add the zap logger flag set to the CLI. The flag set must // be added before calling pflag.Parse(). @@ -68,8 +62,6 @@ func main() { // uniform and structured logs. logf.SetLogger(zap.Logger()) - printVersion() - namespace, err := k8sutil.GetWatchNamespace() if err != nil { log.Error(err, "Failed to get watch namespace") @@ -85,7 +77,7 @@ func main() { ctx := context.TODO() // Become the leader before proceeding - err = leader.Become(ctx, "memcached-operator-lock") + err = leader.Become(ctx, "serving-lock") if err != nil { log.Error(err, "") os.Exit(1) @@ -122,7 +114,7 @@ func main() { } // Setup all Controllers - if err := controller.AddToManager(mgr); err != nil { + if err := serving.AddToManager(mgr); err != nil { log.Error(err, "") os.Exit(1) } @@ -130,24 +122,45 @@ func main() { // Add the Metrics Service addMetrics(ctx, cfg) - // Start serving devfiles index - fs := http.FileServer(http.Dir("/devfiles")) - http.Handle("/", fs) - log.Println("Starting Devfile registry on port :8443...") - err := http.ListenAndServeTLS(":8443","/tmp/serving-certs/tls.crt","/tmp/serving-certs/tls.key",nil) - if err != nil { - log.Fatal(err) - } - - log.Info("Starting the Cmd.") + //Start HTTTPS & Cmd + errs := Run(mgr) - // Start the Cmd - if err := mgr.Start(signals.SetupSignalHandler()); err != nil { + // Run until channel receives error + select { + case err := <-errs: log.Error(err, "Manager exited non-zero") os.Exit(1) } + } +func Run(mgr manager.Manager) chan error { + + errs := make(chan error) + + // Start serving devfiles index + go func() { + fs := http.FileServer(http.Dir("/devfiles")) + http.Handle("/", fs) + log.Info("Starting Devfile registry on port :8443...") + if err := http.ListenAndServeTLS(":8443","/tmp/serving-certs/tls.crt","/tmp/serving-certs/tls.key",nil); err != nil { + errs <- err + } + }() + + // Start the Cmd + go func() { + log.Info("Starting the Cmd.") + if err := mgr.Start(signals.SetupSignalHandler()); err != nil { + errs <- err + } + }() + + return errs +} + + + // addMetrics will create the Services and Service Monitors to allow the operator export the metrics by using // the Prometheus operator func addMetrics(ctx context.Context, cfg *rest.Config) { diff --git a/config/orchestrations/serving/0.1/serving.yaml b/config/orchestrations/serving/0.1/serving.yaml index 28da9a24..ddba8738 100644 --- a/config/orchestrations/serving/0.1/serving.yaml +++ b/config/orchestrations/serving/0.1/serving.yaml @@ -19,6 +19,92 @@ spec: port: 443 targetPort: 8443 --- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + creationTimestamp: null + name: kabanero-operator-serving +rules: +- apiGroups: + - "" + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - "get" + - "create" +- apiGroups: + - "" + resources: + - pods + verbs: + - get +- apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get +- apiGroups: + - kabanero.io + resources: + - "*" + verbs: + - "get" + - "list" + - "watch" +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: kabanero-operator-serving +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: kabanero-operator-serving +subjects: +- kind: ServiceAccount + name: kabanero-operator-serving +roleRef: + kind: Role + name: kabanero-operator-serving + apiGroup: rbac.authorization.k8s.io +--- apiVersion: route.openshift.io/v1 kind: Route metadata: @@ -59,6 +145,7 @@ spec: app.kubernetes.io/part-of: kabanero app.kubernetes.io/managed-by: kabanero-operator spec: + serviceAccount: kabanero-operator-serving containers: - name: kabanero-operator-serving image: {{ .image }} @@ -66,10 +153,16 @@ spec: command: - /usr/local/bin/serving env: - - name: KABANERO_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: "kabanero-operator-serving" volumeMounts: - mountPath: /tmp/serving-certs name: kabanero-operator-serving-cert diff --git a/deploy/crds/kabanero.io_stacks_crd.yaml b/deploy/crds/kabanero.io_stacks_crd.yaml index 854aa37d..547dcc64 100644 --- a/deploy/crds/kabanero.io_stacks_crd.yaml +++ b/deploy/crds/kabanero.io_stacks_crd.yaml @@ -51,6 +51,8 @@ spec: properties: desiredState: type: string + devfile: + type: string images: items: description: Image defines a container image used by a stack @@ -61,6 +63,8 @@ spec: type: string type: object type: array + metafile: + type: string pipelines: items: description: PipelineSpec defines a set of pipelines and associated diff --git a/go.mod b/go.mod index c1c9a1cd..37d9c9ca 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017 github.com/docker/distribution v2.7.1+incompatible github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7 + github.com/elsony/devfile2-registry/tools v0.0.0-20200603181527-db339ef8dd30 github.com/go-logr/logr v0.1.0 github.com/go-openapi/spec v0.19.4 github.com/google/go-cmp v0.3.1 @@ -26,7 +27,7 @@ require ( github.com/tektoncd/operator v0.0.0-20191017104520-be5a46fc149a github.com/tektoncd/pipeline v0.10.1 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 - gopkg.in/yaml.v2 v2.2.5 + gopkg.in/yaml.v2 v2.2.8 k8s.io/api v0.17.0 k8s.io/apiextensions-apiserver v0.0.0 k8s.io/apimachinery v0.17.1 diff --git a/go.sum b/go.sum index cb31508c..4f17e9b6 100644 --- a/go.sum +++ b/go.sum @@ -250,7 +250,10 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elsony/devfile2-registry v0.0.0-20200528212517-f1b6f7216872 h1:XnJh44fe+mEAZ5xs3CIP2DVumJ+7OHF2irFUA9ut0uc= +github.com/elsony/devfile2-registry v0.0.0-20200603181527-db339ef8dd30 h1:zUCwZrhcWRrYId4yDe56RvWD2V+juIve52z3kvcV45Q= github.com/elsony/devfile2-registry/tools v0.0.0-20200528212517-f1b6f7216872 h1:s3/e9/JXjx65H8RJvAbbEDJtnDtiYPlRlvWl8F92ffE= +github.com/elsony/devfile2-registry/tools v0.0.0-20200603181527-db339ef8dd30 h1:ogOtSuypgF1OHCAYE9gF5amZvDlmfwOYnAydWjEhXUU= +github.com/elsony/devfile2-registry/tools v0.0.0-20200603181527-db339ef8dd30/go.mod h1:MLIyyFUh3cQoyfvXXosqS2rr4twO106QiYGjyJrqiYY= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.6.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -1149,6 +1152,8 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= diff --git a/pkg/controller/serving/controller.go b/pkg/controller/serving/controller.go new file mode 100644 index 00000000..24bcc503 --- /dev/null +++ b/pkg/controller/serving/controller.go @@ -0,0 +1,18 @@ +package serving + +import ( + "sigs.k8s.io/controller-runtime/pkg/manager" +) + +// AddToManagerFuncs is a list of functions to add all Controllers to the Manager +var AddToManagerFuncs []func(manager.Manager) error + +// AddToManager adds all Controllers to the Manager +func AddToManager(m manager.Manager) error { + for _, f := range AddToManagerFuncs { + if err := f(m); err != nil { + return err + } + } + return nil +} diff --git a/pkg/controller/serving/index.go b/pkg/controller/serving/index.go new file mode 100644 index 00000000..4d25c099 --- /dev/null +++ b/pkg/controller/serving/index.go @@ -0,0 +1,57 @@ +package serving + +import ( + //"encoding/json" + //"flag" + // "fmt" + "io/ioutil" + //"log" + "path/filepath" + + "github.com/elsony/devfile2-registry/tools/types" + "gopkg.in/yaml.v2" +) + +// genIndex generate new index from meta.yaml files in dir. +// meta.yaml file is expected to be in dir///meta.yaml +func genIndex(dir string) ([]types.MetaIndex, error) { + + var index []types.MetaIndex + + stackdirs, err := ioutil.ReadDir(dir) + if err != nil { + return nil, err + } + + for _, stackdir := range stackdirs { + if stackdir.IsDir() { + versiondirs, err := ioutil.ReadDir(filepath.Join(dir, stackdir.Name())) + if err != nil { + return nil, err + } + for _, versiondir := range versiondirs { + var meta types.Meta + metaFile, err := ioutil.ReadFile(filepath.Join(dir, stackdir.Name(), versiondir.Name(), "meta.yaml")) + if err != nil { + return nil, err + } + err = yaml.Unmarshal(metaFile, &meta) + if err != nil { + return nil, err + } + + self := filepath.Join(stackdir.Name(), versiondir.Name(), "devfile.yaml") + + metaIndex := types.MetaIndex{ + Meta: meta, + Links: types.Links{ + Self: self, + }, + } + index = append(index, metaIndex) + } + } + } + return index, nil +} + diff --git a/pkg/controller/serving/register.go b/pkg/controller/serving/register.go new file mode 100644 index 00000000..81ad5b97 --- /dev/null +++ b/pkg/controller/serving/register.go @@ -0,0 +1,6 @@ +package serving + +func init() { + // AddToManagerFuncs is a list of functions to create controllers and add them to a manager. + AddToManagerFuncs = append(AddToManagerFuncs, Add) +} diff --git a/pkg/serving/stack_controller.go b/pkg/controller/serving/serving_controller.go similarity index 65% rename from pkg/serving/stack_controller.go rename to pkg/controller/serving/serving_controller.go index e2daa8c5..33c3cd77 100644 --- a/pkg/serving/stack_controller.go +++ b/pkg/controller/serving/serving_controller.go @@ -1,4 +1,4 @@ -package stack +package serving import ( "context" @@ -20,7 +20,8 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/source" - d2index "github.com/elsony/devfile2-registry/tools/cmd/index" + // d2index "github.com/elsony/devfile2-registry/tools/cmd/index" + "encoding/json" ) var log = logf.Log.WithName("controller_stack") @@ -89,55 +90,77 @@ func (r *ReconcileStack) Reconcile(request reconcile.Request) (reconcile.Result, return reconcile.Result{}, err } - // Copy the yaml from the Stack to local devfile registry - for _, version := range instance.Spec.Versions { + basePath := "/devfiles" + stackPath := fmt.Sprintf("%v/%v", basePath, instance.ObjectMeta.Name) + os.Mkdir(basePath, os.ModePerm) + + // Clean all files for this stack: a version may be removed or Stack deletion + os.RemoveAll(stackPath) - basePath := "/devfiles" - devfile := fmt.Sprintf("%v/eclipse/%v/%v/devfile.yaml", basePath, instance.ObjectMeta.Name, version.Version) - metafile := fmt.Sprintf("%v/eclipse/%v/%v/meta.yaml", basePath, instance.ObjectMeta.Name, version.Version) - - f, err := os.Create(devfile) - if err != nil { - reqLogger.Error(err, fmt.Sprintf("Error creating devfile %v", devfile)) - } - defer f.Close() - _, err = f.WriteString(version.Devfile) - if err != nil { - reqLogger.Error(err, fmt.Sprintf("Error writing devfile %v", devfile)) - } - f.Sync() - - f, err = os.Create(metafile) - if err != nil { - reqLogger.Error(err, fmt.Sprintf("Error creating metafile %v", metafile)) - } - defer f.Close() - _, err = f.WriteString(version.Devfile) - if err != nil { - reqLogger.Error(err, fmt.Sprintf("Error writing metafile %v", metafile)) + beingDeleted := !instance.DeletionTimestamp.IsZero() + + if !beingDeleted { + // Copy the yaml from the Stack to local devfile registry if it exists + for _, version := range instance.Spec.Versions { + if (len(version.Devfile) !=0) && (len(version.Metafile) !=0) { + versionPath := fmt.Sprintf("%v/%v", stackPath, version.Version) + devfile := fmt.Sprintf("%v/devfile.yaml", versionPath) + metafile := fmt.Sprintf("%v/meta.yaml", versionPath) + + os.MkdirAll(versionPath, os.ModePerm) + + f, err := os.Create(devfile) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error creating devfile %v", devfile)) + } + defer f.Close() + _, err = f.WriteString(version.Devfile) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error writing devfile %v", devfile)) + } + f.Sync() + + f, err = os.Create(metafile) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error creating metafile %v", metafile)) + } + defer f.Close() + _, err = f.WriteString(version.Devfile) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error writing metafile %v", metafile)) + } + f.Sync() + } } - f.Sync() - } // Regenerate the index indexfile := fmt.Sprintf("%v/index.json", basePath) - index, err := d2index.genIndex(basePath) + index, err := genIndex(basePath) if err != nil { reqLogger.Error(err, "Error generating devfile index") + return reconcile.Result{}, err } - b, err := json.MarshalIndent(index, "", " ") - if err != nil { - reqLogger.Error(err, "Error during marshal index") + var b []byte + + if len(index) !=0 { + b, err = json.MarshalIndent(index, "", " ") + if err != nil { + reqLogger.Error(err, "Error during marshal index") + return reconcile.Result{}, err + } } - f, err = os.Create(indexfile) + + f, err := os.Create(indexfile) if err != nil { reqLogger.Error(err, fmt.Sprintf("Error creating indexfile %v", indexfile)) + return reconcile.Result{}, err } defer f.Close() _, err = f.Write(b) if err != nil { - reqLogger.Error(err, fmt.Sprintf("Error writing indexfile %v", metafile)) + reqLogger.Error(err, fmt.Sprintf("Error writing indexfile %v", indexfile)) + return reconcile.Result{}, err } f.Sync() diff --git a/pkg/serving/index.go b/pkg/serving/index.go deleted file mode 100644 index 49742faf..00000000 --- a/pkg/serving/index.go +++ /dev/null @@ -1,80 +0,0 @@ -package main - -import ( - "encoding/json" - "flag" - "fmt" - "io/ioutil" - "log" - "path/filepath" - - "github.com/elsony/devfile2-registry/tools/types" - "gopkg.in/yaml.v2" -) - -// genIndex generate new index from meta.yaml files in dir. -// meta.yaml file is expected to be in dir//meta.yaml -func genIndex(dir string) ([]types.MetaIndex, error) { - - var index []types.MetaIndex - - dirs, err := ioutil.ReadDir(dir) - if err != nil { - return nil, err - } - - for _, file := range dirs { - if file.IsDir() { - var meta types.Meta - metaFile, err := ioutil.ReadFile(filepath.Join(dir, file.Name(), "meta.yaml")) - if err != nil { - return nil, err - } - err = yaml.Unmarshal(metaFile, &meta) - if err != nil { - return nil, err - } - - self := fmt.Sprintf("/%s/%s/%s", filepath.Base(dir), file.Name(), "devfile.yaml") - - metaIndex := types.MetaIndex{ - Meta: meta, - Links: types.Links{ - Self: self, - }, - } - index = append(index, metaIndex) - } - } - return index, nil -} - -func main() { - devfiles := flag.String("devfiles-dir", "", "Directory containing devfiles.") - output := flag.String("index", "", "Index filaname. This is where the index in JSON format will be saved.") - - flag.Parse() - - if *devfiles == "" { - log.Fatal("Provide devfile directory.") - } - - if *output == "" { - log.Fatal("Provide index file.") - } - - index, err := genIndex(*devfiles) - if err != nil { - log.Fatal(err) - } - b, err := json.MarshalIndent(index, "", " ") - if err != nil { - log.Fatal(err) - - } - err = ioutil.WriteFile(*output, b, 0644) - if err != nil { - log.Fatal(err) - - } -} From a950e37c89d3cb7a2a104634e2647034aa59911d Mon Sep 17 00:00:00 2001 From: Daniel Cleyrat Date: Fri, 5 Jun 2020 09:44:45 -0400 Subject: [PATCH 08/15] defile2 --- pkg/controller/serving/index.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/controller/serving/index.go b/pkg/controller/serving/index.go index 4d25c099..9e32c725 100644 --- a/pkg/controller/serving/index.go +++ b/pkg/controller/serving/index.go @@ -5,7 +5,7 @@ import ( //"flag" // "fmt" "io/ioutil" - //"log" + // "log" "path/filepath" "github.com/elsony/devfile2-registry/tools/types" @@ -15,6 +15,7 @@ import ( // genIndex generate new index from meta.yaml files in dir. // meta.yaml file is expected to be in dir///meta.yaml func genIndex(dir string) ([]types.MetaIndex, error) { + reqLogger := log.WithValues("Request.Namespace", "", "Request.Name", "") var index []types.MetaIndex @@ -32,6 +33,8 @@ func genIndex(dir string) ([]types.MetaIndex, error) { for _, versiondir := range versiondirs { var meta types.Meta metaFile, err := ioutil.ReadFile(filepath.Join(dir, stackdir.Name(), versiondir.Name(), "meta.yaml")) + reqLogger.Info(filepath.Join(dir, stackdir.Name(), versiondir.Name(), "meta.yaml")) + reqLogger.Info(string(metaFile)) if err != nil { return nil, err } @@ -39,6 +42,7 @@ func genIndex(dir string) ([]types.MetaIndex, error) { if err != nil { return nil, err } + reqLogger.Info(fmt.Sprintf("%v", meta) self := filepath.Join(stackdir.Name(), versiondir.Name(), "devfile.yaml") @@ -48,6 +52,7 @@ func genIndex(dir string) ([]types.MetaIndex, error) { Self: self, }, } + reqLogger.Info(fmt.Sprintf("%v", metaIndex) index = append(index, metaIndex) } } From a23b6f8c9068d70f97dfb912f5fabbf908e3661e Mon Sep 17 00:00:00 2001 From: Daniel Cleyrat Date: Fri, 5 Jun 2020 16:20:18 -0400 Subject: [PATCH 09/15] deffile2 --- pkg/controller/serving/index.go | 11 ++--------- pkg/controller/serving/serving_controller.go | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/pkg/controller/serving/index.go b/pkg/controller/serving/index.go index 9e32c725..9733544b 100644 --- a/pkg/controller/serving/index.go +++ b/pkg/controller/serving/index.go @@ -3,9 +3,9 @@ package serving import ( //"encoding/json" //"flag" - // "fmt" + //"fmt" "io/ioutil" - // "log" + //"log" "path/filepath" "github.com/elsony/devfile2-registry/tools/types" @@ -15,7 +15,6 @@ import ( // genIndex generate new index from meta.yaml files in dir. // meta.yaml file is expected to be in dir///meta.yaml func genIndex(dir string) ([]types.MetaIndex, error) { - reqLogger := log.WithValues("Request.Namespace", "", "Request.Name", "") var index []types.MetaIndex @@ -33,8 +32,6 @@ func genIndex(dir string) ([]types.MetaIndex, error) { for _, versiondir := range versiondirs { var meta types.Meta metaFile, err := ioutil.ReadFile(filepath.Join(dir, stackdir.Name(), versiondir.Name(), "meta.yaml")) - reqLogger.Info(filepath.Join(dir, stackdir.Name(), versiondir.Name(), "meta.yaml")) - reqLogger.Info(string(metaFile)) if err != nil { return nil, err } @@ -42,17 +39,13 @@ func genIndex(dir string) ([]types.MetaIndex, error) { if err != nil { return nil, err } - reqLogger.Info(fmt.Sprintf("%v", meta) - self := filepath.Join(stackdir.Name(), versiondir.Name(), "devfile.yaml") - metaIndex := types.MetaIndex{ Meta: meta, Links: types.Links{ Self: self, }, } - reqLogger.Info(fmt.Sprintf("%v", metaIndex) index = append(index, metaIndex) } } diff --git a/pkg/controller/serving/serving_controller.go b/pkg/controller/serving/serving_controller.go index 33c3cd77..43930ba7 100644 --- a/pkg/controller/serving/serving_controller.go +++ b/pkg/controller/serving/serving_controller.go @@ -125,7 +125,7 @@ func (r *ReconcileStack) Reconcile(request reconcile.Request) (reconcile.Result, reqLogger.Error(err, fmt.Sprintf("Error creating metafile %v", metafile)) } defer f.Close() - _, err = f.WriteString(version.Devfile) + _, err = f.WriteString(version.Metafile) if err != nil { reqLogger.Error(err, fmt.Sprintf("Error writing metafile %v", metafile)) } From 5ef33c439f91e3fdc622c4c12beb5a0cbc4b8ea8 Mon Sep 17 00:00:00 2001 From: Daniel Cleyrat Date: Wed, 10 Jun 2020 17:14:39 -0400 Subject: [PATCH 10/15] operator-sdk-0.17.1 --- .travis.yml | 2 +- cmd/manager/main.go | 25 +- deploy/crds/kabanero.io_collections_crd.yaml | 8 + deploy/crds/kabanero.io_kabaneros_crd.yaml | 19 + deploy/crds/kabanero.io_stacks_crd.yaml | 7 + go.mod | 65 +- go.sum | 1227 ++++++++++++++--- pkg/controller/kabaneroplatform/cli.go | 2 +- pkg/controller/kabaneroplatform/serverless.go | 2 +- 9 files changed, 1094 insertions(+), 263 deletions(-) diff --git a/.travis.yml b/.travis.yml index a44ffdfe..e67a1e50 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ services: # Install operator-sdk env: - - RELEASE_VERSION=v0.16.0 + - RELEASE_VERSION=v0.17.1 before_install: - curl -OJL https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu diff --git a/cmd/manager/main.go b/cmd/manager/main.go index ab3b1d92..31021a9e 100755 --- a/cmd/manager/main.go +++ b/cmd/manager/main.go @@ -7,6 +7,7 @@ import ( "fmt" "os" "runtime" + "strings" // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) _ "k8s.io/client-go/plugin/pkg/client/auth" @@ -15,7 +16,7 @@ import ( "github.com/kabanero-io/kabanero-operator/pkg/apis" "github.com/kabanero-io/kabanero-operator/pkg/controller" - knsapis "github.com/knative/serving-operator/pkg/apis" + knsapis "knative.dev/serving/pkg/apis/serving/v1alpha1" appsv1 "github.com/openshift/api/apps/v1" consolev1 "github.com/openshift/api/console/v1" operatorv1 "github.com/openshift/api/operator/v1" @@ -29,9 +30,9 @@ import ( "github.com/operator-framework/operator-sdk/pkg/leader" "github.com/operator-framework/operator-sdk/pkg/log/zap" "github.com/operator-framework/operator-sdk/pkg/metrics" - "github.com/operator-framework/operator-sdk/pkg/restmapper" sdkVersion "github.com/operator-framework/operator-sdk/version" "github.com/spf13/pflag" + "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client/config" "sigs.k8s.io/controller-runtime/pkg/manager" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -112,7 +113,6 @@ func main() { } ctx := context.TODO() - // Become the leader before proceeding err = leader.Become(ctx, "kabanero-operator-lock") if err != nil { @@ -120,12 +120,23 @@ func main() { os.Exit(1) } - // Create a new Cmd to provide shared dependencies and start components - mgr, err := manager.New(cfg, manager.Options{ + // Set default manager options + options := manager.Options{ Namespace: namespace, - MapperProvider: restmapper.NewDynamicRESTMapper, MetricsBindAddress: fmt.Sprintf("%s:%d", metricsHost, metricsPort), - }) + } + + // Add support for MultiNamespace set in WATCH_NAMESPACE (e.g ns1,ns2) + // Note that this is not intended to be used for excluding namespaces, this is better done via a Predicate + // Also note that you may face performance issues when using this with a high number of namespaces. + // More Info: https://godoc.org/github.com/kubernetes-sigs/controller-runtime/pkg/cache#MultiNamespacedCacheBuilder + if strings.Contains(namespace, ",") { + options.Namespace = "" + options.NewCache = cache.MultiNamespacedCacheBuilder(strings.Split(namespace, ",")) + } + + // Create a new manager to provide shared dependencies and start components + mgr, err := manager.New(cfg, options) if err != nil { log.Error(err, "") os.Exit(1) diff --git a/deploy/crds/kabanero.io_collections_crd.yaml b/deploy/crds/kabanero.io_collections_crd.yaml index aea1ef02..927ba881 100644 --- a/deploy/crds/kabanero.io_collections_crd.yaml +++ b/deploy/crds/kabanero.io_collections_crd.yaml @@ -67,6 +67,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set type: object status: description: CollectionStatus defines the observed state of a collection @@ -101,6 +102,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set digest: type: string name: @@ -113,6 +115,7 @@ spec: - url type: object type: array + x-kubernetes-list-type: set activeVersion: type: string availableLocation: @@ -129,6 +132,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set status: type: string statusMessage: @@ -148,6 +152,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set location: type: string pipelines: @@ -178,6 +183,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set digest: type: string name: @@ -190,6 +196,7 @@ spec: - url type: object type: array + x-kubernetes-list-type: set status: type: string statusMessage: @@ -198,6 +205,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set type: object type: object version: v1alpha1 diff --git a/deploy/crds/kabanero.io_kabaneros_crd.yaml b/deploy/crds/kabanero.io_kabaneros_crd.yaml index bbb58bb7..6048bdf8 100644 --- a/deploy/crds/kabanero.io_kabaneros_crd.yaml +++ b/deploy/crds/kabanero.io_kabaneros_crd.yaml @@ -135,6 +135,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set type: object events: properties: @@ -163,6 +164,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: set type: object landing: description: KabaneroLandingCustomizationSpec defines customization @@ -177,6 +179,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: set tekton: description: TektonCustomizationSpec defines customization entries for Tekton @@ -253,6 +256,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: set ready: type: string type: object @@ -275,6 +279,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: set ready: type: string type: object @@ -296,6 +301,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: set errorMessage: type: string ready: @@ -304,6 +310,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: set type: object knativeEventing: description: Knative eventing instance readiness status. @@ -486,6 +493,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: set type: object gitops: properties: @@ -526,6 +534,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set type: object governancePolicy: description: GovernancePolicyConfig defines customization entries @@ -612,6 +621,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set repositories: items: description: RepositoryConfig defines customization entries @@ -682,8 +692,10 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set type: object type: array + x-kubernetes-list-type: set skipRegistryCertVerification: type: boolean type: object @@ -691,6 +703,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: set triggers: items: description: TriggerSpec defines the sets of default triggers for @@ -728,6 +741,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set version: type: string type: object @@ -760,6 +774,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: set message: type: string ready: @@ -818,6 +833,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: set message: type: string ready: @@ -856,6 +872,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set digest: type: string gitRelease: @@ -901,6 +918,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: set message: type: string ready: @@ -909,6 +927,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: set type: object landing: description: Kabanero Landing page readiness status. diff --git a/deploy/crds/kabanero.io_stacks_crd.yaml b/deploy/crds/kabanero.io_stacks_crd.yaml index 854aa37d..e7241b60 100644 --- a/deploy/crds/kabanero.io_stacks_crd.yaml +++ b/deploy/crds/kabanero.io_stacks_crd.yaml @@ -61,6 +61,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set pipelines: items: description: PipelineSpec defines a set of pipelines and associated @@ -98,6 +99,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set skipCertVerification: type: boolean skipRegistryCertVerification: @@ -106,6 +108,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set type: object status: description: StackStatus defines the observed state of a stack @@ -139,6 +142,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set location: type: string pipelines: @@ -169,6 +173,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set digest: type: string gitRelease: @@ -193,6 +198,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set status: type: string statusMessage: @@ -201,6 +207,7 @@ spec: type: string type: object type: array + x-kubernetes-list-type: set type: object type: object version: v1alpha2 diff --git a/go.mod b/go.mod index c1c9a1cd..8d44f811 100644 --- a/go.mod +++ b/go.mod @@ -5,65 +5,40 @@ go 1.13 require ( github.com/blang/semver v3.5.1+incompatible github.com/coreos/go-semver v0.3.0 - github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017 + github.com/docker/cli v0.0.0-20200210162036-a4bedce16568 github.com/docker/distribution v2.7.1+incompatible - github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7 + github.com/docker/docker v1.13.1 github.com/go-logr/logr v0.1.0 - github.com/go-openapi/spec v0.19.4 - github.com/google/go-cmp v0.3.1 - github.com/google/go-containerregistry v0.0.0-20200115214256-379933c9c22b + github.com/go-openapi/spec v0.19.6 + github.com/google/go-cmp v0.4.0 + github.com/google/go-containerregistry v0.0.0-20200331213917-3d03ed9b1ca2 github.com/google/go-github/v29 v29.0.3 - github.com/knative/pkg v0.0.0-20190817231834-12ee58e32cc8 // indirect - github.com/knative/serving-operator v0.0.0-20190702004031-e30377b852ff github.com/manifestival/controller-runtime-client v0.1.1-0.20200218204725-1af9550ddf8f - github.com/manifestival/manifestival v0.1.1-0.20200219193505-fabb889b98f5 + github.com/manifestival/manifestival v0.5.1-0.20200526175228-b0136214e13f github.com/openshift/api v3.9.1-0.20190924102528-32369d4db2ad+incompatible github.com/operator-framework/operator-lifecycle-manager v3.11.0+incompatible - github.com/operator-framework/operator-sdk v0.16.0 - github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect - github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd // indirect + github.com/operator-framework/operator-sdk v0.17.1 github.com/spf13/pflag v1.0.5 github.com/tektoncd/operator v0.0.0-20191017104520-be5a46fc149a github.com/tektoncd/pipeline v0.10.1 - golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 - gopkg.in/yaml.v2 v2.2.5 - k8s.io/api v0.17.0 - k8s.io/apiextensions-apiserver v0.0.0 - k8s.io/apimachinery v0.17.1 + golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d + gopkg.in/yaml.v2 v2.2.8 + k8s.io/api v0.17.6 + k8s.io/apiextensions-apiserver v0.17.6 + k8s.io/apimachinery v0.17.6 k8s.io/client-go v12.0.0+incompatible - k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a - sigs.k8s.io/controller-runtime v0.4.0 -) - -// Pinned to kubernetes-1.16.2 -replace ( - k8s.io/api => k8s.io/api v0.0.0-20191016110408-35e52d86657a - k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.0.0-20191016113550-5357c4baaf65 - k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20191004115801-a2eda9f80ab8 - k8s.io/apiserver => k8s.io/apiserver v0.0.0-20191016112112-5190913f932d - k8s.io/cli-runtime => k8s.io/cli-runtime v0.0.0-20191016114015-74ad18325ed5 - k8s.io/client-go => k8s.io/client-go v0.0.0-20191016111102-bec269661e48 - k8s.io/cloud-provider => k8s.io/cloud-provider v0.0.0-20191016115326-20453efc2458 - k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.0.0-20191016115129-c07a134afb42 - k8s.io/code-generator => k8s.io/code-generator v0.0.0-20191004115455-8e001e5d1894 - k8s.io/component-base => k8s.io/component-base v0.0.0-20191016111319-039242c015a9 - k8s.io/cri-api => k8s.io/cri-api v0.0.0-20190828162817-608eb1dad4ac - k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.0.0-20191016115521-756ffa5af0bd - k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.0.0-20191016112429-9587704a8ad4 - k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.0.0-20191016114939-2b2b218dc1df - k8s.io/kube-proxy => k8s.io/kube-proxy v0.0.0-20191016114407-2e83b6f20229 - k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.0.0-20191016114748-65049c67a58b - k8s.io/kubectl => k8s.io/kubectl v0.0.0-20191016120415-2ed914427d51 - k8s.io/kubelet => k8s.io/kubelet v0.0.0-20191016114556-7841ed97f1b2 - k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.0.0-20191016115753-cf0698c3a16b - k8s.io/metrics => k8s.io/metrics v0.0.0-20191016113814-3b1a734dba6e - k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.0.0-20191016112829-06bb3c9d77c9 + k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29 + knative.dev/operator v0.15.0 + knative.dev/serving v0.15.1 + sigs.k8s.io/controller-runtime v0.5.3 ) replace github.com/openshift/api => github.com/openshift/api v0.0.0-20190924102528-32369d4db2ad // Required until https://github.com/operator-framework/operator-lifecycle-manager/pull/1241 is resolved -replace github.com/operator-framework/operator-sdk => github.com/operator-framework/operator-sdk v0.16.0 +replace github.com/operator-framework/operator-sdk => github.com/operator-framework/operator-sdk v0.17.1 replace github.com/docker/docker => github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 // Required by Helm -replace github.com/prometheus/prometheus => github.com/prometheus/prometheus v2.3.2+incompatible +replace github.com/Azure/go-autorest => github.com/Azure/go-autorest v13.3.2+incompatible // Required by OLM + +replace k8s.io/client-go => k8s.io/client-go v0.17.6 // Required by prometheus-operator diff --git a/go.sum b/go.sum index 68c7791c..8cae441e 100644 --- a/go.sum +++ b/go.sum @@ -1,45 +1,102 @@ -bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1:Ulb78X89vxKYgdL24HMTiXYHlyHEvruOj1ZPlqeNEZM= +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= bou.ke/monkey v1.0.1/go.mod h1:FgHuK96Rv2Nlf+0u1OOVDpCMdsWyOFmeeketDHE7LIg= +cloud.google.com/go v0.25.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.30.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.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= +cloud.google.com/go v0.40.0/go.mod h1:Tk58MuI9rbLMKlAjeO/bDnteAx7tX2gJIXw4T5Jwlro= cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= 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.44.3/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.47.0 h1:1JUtpcY9E7+eTospEwWS2QXP3DEn7poB3E2j0jN74mM= cloud.google.com/go v0.47.0/go.mod h1:5p3Ky/7f3N10VBkhuR5LFtddroTiMyjZV/Kj5qOQFxU= +cloud.google.com/go v0.49.0/go.mod h1:hGvAdzcWNbyuxS3nWhD7H2cIJxjRRTRLQVB0bdputVY= +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.55.0 h1:eoz/lYxKSL4CNAiaUJ0ZfD1J3bfMYbU5B3rwM1C1EIU= +cloud.google.com/go v0.55.0/go.mod h1:ZHmoY+/lIMNkN2+fBmuTiqZ4inFhvQad8ft7MT8IV5Y= 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/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/logging v1.0.0/go.mod h1:V1cc3ogwobYzQq5f2R7DS/GvRIrI4FKj01Gs5glwAls= 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/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.3.0/go.mod h1:9IAwXhoyBJ7z9LcAwkj0/7NnPzYaPeZxxVp3zm+5IqA= +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= +contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= contrib.go.opencensus.io/exporter/ocagent v0.4.12 h1:jGFvw3l57ViIVEPKKEUXPcLYIXJmQxLUh6ey1eJhwyc= contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA= +contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= +contrib.go.opencensus.io/exporter/ocagent v0.6.0 h1:Z1n6UAyr0QwM284yUuh5Zd8JlvxUGAhFZcgMJkMPrGM= +contrib.go.opencensus.io/exporter/ocagent v0.6.0/go.mod h1:zmKjrJcdo0aYcVS7bmEeSEBLPA9YJp5bjrofdU3pIXs= contrib.go.opencensus.io/exporter/prometheus v0.1.0 h1:SByaIoWwNgMdPSgl5sMqM2KDE5H/ukPWBRo314xiDvg= contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= +contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= contrib.go.opencensus.io/exporter/stackdriver v0.12.8 h1:iXI5hr7pUwMx0IwMphpKz5Q3If/G5JiWFVZ5MPPxP9E= contrib.go.opencensus.io/exporter/stackdriver v0.12.8/go.mod h1:XyyafDnFOsqoxHJgTFycKZMrRUrPThLh2iYTJF6uoO0= +contrib.go.opencensus.io/exporter/stackdriver v0.12.9-0.20191108183826-59d068f8d8ff/go.mod h1:XyyafDnFOsqoxHJgTFycKZMrRUrPThLh2iYTJF6uoO0= +contrib.go.opencensus.io/exporter/stackdriver v0.13.1 h1:RX9W6FelAqTVnBi/bRXJLXr9n18v4QkQwZYIdnNS51I= +contrib.go.opencensus.io/exporter/stackdriver v0.13.1/go.mod h1:z2tyTZtPmQ2HvWH4cOmVDgtY+1lomfKdbLnkJvZdc8c= +contrib.go.opencensus.io/exporter/zipkin v0.1.1/go.mod h1:GMvdSl3eJ2gapOaLKzTKE3qDgUkJ86k9k3yY2eqwkzc= +contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= +github.com/Azure/azure-pipeline-go v0.1.9/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v19.1.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v21.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v23.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v28.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v32.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v36.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v38.0.0+incompatible h1:3D2O4g8AwDwyWkM1HpMFVux/ccQJmGJHXsE004Wsu1Q= github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= github.com/Azure/azure-storage-blob-go v0.0.0-20181022225951-5152f14ace1c/go.mod h1:oGfmITT1V6x//CswqY2gtAHND+xIP64/qL7a5QJix0Y= +github.com/Azure/azure-storage-blob-go v0.0.0-20190123011202-457680cc0804/go.mod h1:oGfmITT1V6x//CswqY2gtAHND+xIP64/qL7a5QJix0Y= +github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= +github.com/Azure/go-amqp v0.12.7/go.mod h1:qApuH6OFTSKZFmCOxccvAv5rLizBQf4v8pRmG138DPo= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v13.3.2+incompatible h1:VxzPyuhtnlBOzc4IWCZHqpyH2d+QMLQEuy3wREyY4oc= +github.com/Azure/go-autorest v13.3.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.1.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg= +github.com/Azure/go-autorest/autorest v0.2.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.3-0.20191028180845-3492b2aff503/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3 h1:OZEIaBbMdUE/Js+BQKlpO81XlISgipr6yDJ+PSwsgi4= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.9.6 h1:5YWtOnckcudzIw8lPPBcWOnmIFWMtHci1ZWAZulMSx0= +github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest/adal v0.1.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/adal v0.8.1-0.20191028180845-3492b2aff503/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.8.1 h1:pZdL8o72rK+avFWl+p9nE8RWi1JInZrWJYlnpfXJwHk= github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.2 h1:O1X4oexUxnZCaEUGsvMnr8ZGj8HI37tNezwY4npRqA0= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= @@ -51,45 +108,52 @@ github.com/Azure/go-autorest/autorest/to v0.1.0/go.mod h1:GunWKJp1AEqgMaGLV+iocm github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8= github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/to v0.3.1-0.20191028180845-3492b2aff503/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= github.com/Azure/go-autorest/autorest/validation v0.2.0 h1:15vMO4y76dehZSq7pAaOLQxC6dZYsSrj2GQpflyM/L4= github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/autorest/validation v0.2.1-0.20191028180845-3492b2aff503/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.1.0/go.mod h1:ROEEAFwXycQw7Sn3DXNtEedEvdeRAgDr0izn4z5Ij88= github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= 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/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/sketches-go v0.0.0-20190923095040-43f19ad77ff7/go.mod h1:Q5DbzQ+3AkgGwymQO7aZFNP7ns2lZKGtvRBzRXfdi60= github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GoogleCloudPlatform/cloud-builders/gcs-fetcher v0.0.0-20191203181535-308b93ad1f39/go.mod h1:yfGmCjKuUzk9WzubMlW2zwjhCraIc/J+M40cufdemRM= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= -github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= +github.com/GoogleCloudPlatform/testgrid v0.0.1-alpha.3/go.mod h1:f96W2HYy3tiBNV5zbbRc+NczwYHgG1PHXMQfoEWv680= +github.com/GoogleCloudPlatform/testgrid v0.0.7/go.mod h1:lmtHGBL0M/MLbu1tR9BWV7FGZ1FEFIdPqmJiHNCL7y8= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/MakeNowJust/heredoc v0.0.0-20171113091838-e9091a26100e/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.0.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig/v3 v3.0.0/go.mod h1:NEUY/Qq8Gdm2xgYA+NwJM6wmfdRV9xkh8h/Rld20R0U= github.com/Masterminds/sprig/v3 v3.0.2/go.mod h1:oesJ8kPONMONaZgtiHNzUShJbksypC5kWczhZAf6+aU= -github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= +github.com/Masterminds/vcs v1.13.1/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.12/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/hcsshim v0.0.0-20190417211021-672e52e9209d/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.6 h1:ZfF0+zZeYdzMIVMZHKtDKJvLHj76XCuVae/jNkjj0IA= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/hcsshim v0.8.7 h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZpg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/OneOfOne/xxhash v1.2.6/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= @@ -97,17 +161,24 @@ github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Rican7/retry v0.1.0/go.mod h1:FgOROf8P5bebcC1DS0PdOQiqGUridaZvikzUmkFW6gg= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/sarama v1.23.1/go.mod h1:XLH1GYJnLVE0XCr6KdJGVJRTwY30moWNJ4sERjXX6fs= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/a8m/mark v0.1.1-0.20170507133748-44f2db618845/go.mod h1:c8Mh99Cw82nrsAnPgxQSZHkswVOJF7/MqZb1ZdvriLM= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/aliyun/aliyun-oss-go-sdk v2.0.4+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v0.0.0-20190621154722-5f990b63d2d6/go.mod h1:+lx6/Aqd1kLJ1GQfkvOnaZ1WGmLpMpbprPuIOOZX30U= +github.com/andygrunwald/go-gerrit v0.0.0-20190120104749-174420ebee6c/go.mod h1:0iuRQp6WJ44ts+iihy5E/WlPqfg5RNeQxOmzRkxCdtk= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/ant31/crd-validation v0.0.0-20180702145049-30f8a35d0ac2/go.mod h1:X0noFIik9YqfhGYBLEHg8LJKEwy7QIitLQuFMpKLcPk= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= @@ -115,87 +186,144 @@ github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= +github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/auth0/go-jwt-middleware v0.0.0-20170425171159-5493cabe49f7/go.mod h1:LWMyo4iOLWXHGdBki7NIht1kHru/0wM179h+d3g8ATM= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/aslakhellesoy/gox v1.0.100/go.mod h1:AJl542QsKKG96COVsv0N74HHzVQgDIQPceVUh1aeU2M= +github.com/aws/aws-k8s-tester v0.0.0-20190114231546-b411acf57dfe/go.mod h1:1ADF5tAtU1/mVtfMcHAYSm2fPw71DA7fFk0yed64/0I= +github.com/aws/aws-k8s-tester v0.9.3/go.mod h1:nsh1f7joi8ZI1lvR+Ron6kJM2QdCYPU/vFePghSSuTc= +github.com/aws/aws-sdk-go v0.0.0-20180507225419-00862f899353/go.mod h1:ZRmQr0FajVIyZ4ZzBYKG5P3ZqPz9IHG41ZoMu1ADI3k= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.90/go.mod h1:es1KtYUFs7le0xQ3rOihkuoVD90z7D0fR2Qm4S00/gU= +github.com/aws/aws-sdk-go v1.16.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.23.22/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.1 h1:MXnqY6SlWySaZAqNnXThOvjRFdiiOuKtC6i7baFdNdU= github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/bazelbuild/bazel-gazelle v0.0.0-20181012220611-c728ce9f663e/go.mod h1:uHBSeeATKpVazAACZBDPL/Nk/UhQDDsJWDlqYJo8/Us= -github.com/bazelbuild/buildtools v0.0.0-20180226164855-80c7f0d45d7e/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= +github.com/aws/aws-sdk-go v1.29.32/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg= +github.com/aws/aws-sdk-go v1.29.34 h1:yrzwfDaZFe9oT4AmQeNNunSQA7c0m2chz0B43+bJ1ok= +github.com/aws/aws-sdk-go v1.29.34/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg= +github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= +github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= +github.com/benbjohnson/clock v1.0.0/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bifurcation/mint v0.0.0-20180715133206-93c51c6ce115/go.mod h1:zVt7zX3K/aDCk9Tj+VM7YymsX66ERvzCJzw8rFCX2JU= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/biogo/store v0.0.0-20160505134755-913427a1d5e8/go.mod h1:Iev9Q3MErcn+w3UOJD/DkEzllvugfdx7bGcMOFhvr/4= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= github.com/brancz/gojsontoyaml v0.0.0-20190425155809-e8bd32d46b3d/go.mod h1:IyUJYN1gvWjtLF5ZuygmxbnsAyP3aJS6cHzIuZY50B0= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/bugsnag/bugsnag-go v1.5.0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/panicwrap v1.2.0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/caddyserver/caddy v1.0.3/go.mod h1:G+ouvOY32gENkJC+jhgl62TyhvqEsFaDiZ4uw0RzP1E= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/bwmarrin/snowflake v0.0.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= +github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= -github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenk/backoff v2.0.0+incompatible/go.mod h1:7FtoeaSnHoZnmZzz47cM35Y9nSW7tNyaidugnHTaFDE= +github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c/go.mod h1:Xe6ZsFhtM8HrDku0pxJ3/Lr51rwykrzgFwpmTzleatY= +github.com/certifi/gocertifi v0.0.0-20180905225744-ee1a9a0726d2/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4= +github.com/cespare/xxhash v0.0.0-20181017004759-096ff4a8a059/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= 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.0 h1:yTUvW7Vhb89inJ+8irsUqiWjh8iT6sQPZiQzI6ReGkA= github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= +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/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/checkpoint-restore/go-criu v0.0.0-20190109184317-bdb7599cd87b/go.mod h1:TrMrLQfeENAPYPRsJuq3jsqdlRh3lvi6trTZJG8+tho= -github.com/cheekybits/genny v0.0.0-20170328200008-9127e812e1e9/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +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/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clarketm/json v1.13.4/go.mod h1:ynr2LRfb0fQU34l07csRNBTcivjySLLiY1YzQqKVfdo= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudevents/sdk-go v0.0.0-20190509003705-56931988abe3/go.mod h1:j1nZWMLGg3om8SswStBoY6/SHvcLM19MuZqwDtMtmzs= -github.com/cloudflare/cfssl v0.0.0-20180726162950-56268a613adf/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= -github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0= +github.com/cloudevents/sdk-go v1.1.2/go.mod h1:ss+jWJ88wypiewnPEzChSBzTYXGpdcILoN9YHk8uhTQ= +github.com/cloudevents/sdk-go v1.2.0/go.mod h1:ss+jWJ88wypiewnPEzChSBzTYXGpdcILoN9YHk8uhTQ= +github.com/cloudevents/sdk-go/v2 v2.0.0-RC2/go.mod h1:f6d2RzSysHwhr4EsysDapUIWyJOFKqIhDisATXEa6Wk= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/cockroachdb/cmux v0.0.0-20170110192607-30d10be49292/go.mod h1:qRiX68mZX1lGBkTWyp3CLcenw9I94W2dLeRvMzcn9N4= +github.com/cockroachdb/cockroach v0.0.0-20170608034007-84bc9597164f/go.mod h1:xeT/CQ0qZHangbYbWShlCGAx31aV4AjGswDUjhKS6HQ= github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= -github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= -github.com/container-storage-interface/spec v1.1.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= -github.com/containerd/console v0.0.0-20170925154832-84eeaae905fa/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/containerd v1.0.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/containerd v1.2.7/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190823190603-4a2f61c4f2b4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.0 h1:xjvXQWABwS2uiv3TWgQt5Uth60Gu86LTGZXMJkjc7rY= github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/continuity v0.0.0-20181203112020-004b46473808 h1:4BX8f882bXEDKfWIf0wa8HRvpnBoPszJJXL+TVbBw4M= -github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/coredns/corefile-migration v1.0.2/go.mod h1:OFwBp/Wc9dJt5cAZzHWMNhK1r5L0p0jDwIBc6j8NC8E= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.3 h1:LoIzb5y9x5l8VKAlyrbusNPXqBY0+kviRloxFUMFwKc= +github.com/containerd/containerd v1.3.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200107194136-26c1120b8d41 h1:kIFnQBO7rQ0XkMe6xEwbybYHBEaWmh/f++laI6Emt7M= +github.com/containerd/continuity v0.0.0-20200107194136-26c1120b8d41/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.12+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.15+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.17+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v0.0.0-20180117170138-065b426bd416/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.0.0-20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/prometheus-operator v0.31.1 h1:+pS6+Ha01vuoGBh5glhfngk2sB1ELwe6tbXhMkMmp/U= github.com/coreos/prometheus-operator v0.31.1/go.mod h1:vHwtP2e+VmEeS6m6lgp87aH+npGVRQsCi5jhcuQA1sA= -github.com/coreos/prometheus-operator v0.34.0 h1:TF9qaydNeUamLKs0hniaapa4FBz8U8TIlRRtJX987A4= -github.com/coreos/prometheus-operator v0.34.0/go.mod h1:Li6rMllG/hYIyXfMuvUwhyC+hqwJVHdsDdP21hypT1M= -github.com/coreos/rkt v1.30.0/go.mod h1:O634mlH6U7qk87poQifK6M2rsFNt+FyUTWNMnP1hF1U= +github.com/coreos/prometheus-operator v0.38.0 h1:gF2xYIfO09XLFdyEecND46uihQ2KTaDwTozRZpXLtN4= +github.com/coreos/prometheus-operator v0.38.0/go.mod h1:xZC7/TgeC0/mBaJk+1H9dbHaiEvLYHgX6Mi1h40UPh8= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cucumber/gherkin-go/v11 v11.0.0/go.mod h1:CX33k2XU2qog4e+TFjOValoq6mIUq0DmVccZs238R9w= +github.com/cucumber/godog v0.9.0/go.mod h1:roWCHkpeK6UTOyIRRl7IR+fgfBeZ4vZR7OSq2J/NbM4= +github.com/cucumber/messages-go/v10 v10.0.1/go.mod h1:kA5T38CBlBbYLU12TIrJ4fk4wSkVVOgyh7Enyy8WnSg= +github.com/cucumber/messages-go/v10 v10.0.3/go.mod h1:9jMZ2Y8ZxjLY6TG2+x344nt5rXstVVDYSdS5ySfI1WY= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8= github.com/cznic/fileutil v0.0.0-20180108211300-6a051e75936f/go.mod h1:8S58EK26zhXSxzv7NQFpnliaOQsmDUxvoQO3rt154Vg= @@ -212,69 +340,102 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs 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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/deislabs/oras v0.7.0/go.mod h1:sqMKPG3tMyIX9xwXUBRLhZ24o+uT4y6jgBD2RzUTKDM= +github.com/deislabs/oras v0.8.1/go.mod h1:Mx0rMSbBNaNfY9hjpccEnxkOqJL6KGjtxNHPLC4G4As= +github.com/denisenkom/go-mssqldb v0.0.0-20190111225525-2fea367d496d/go.mod h1:xN/JuLBIz4bjkxNmByTiV1IbhfnYb6oo99phBn4Eqhc= github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dgrijalva/jwt-go v0.0.0-20161101193935-9ed569b5d1ac/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-gk v0.0.0-20200319235926-a69029f61654/go.mod h1:qm+vckxRlDt0aOla0RYJJVeqHZlWfOm2UIxHaqPB46E= +github.com/dgryski/go-lttb v0.0.0-20180810165845-318fcdf10a77/go.mod h1:Va5MyIzkU0rAM92tn3hb3Anb7oz7KcnixF49+2wOMe4= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/djherbis/atime v1.0.0/go.mod h1:5W+KBIuTwVGcqjIfaTwt+KSYX1o6uep8dtevevQP/f8= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v0.0.0-20190506213505-d88565df0c2d/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v0.0.0-20190925022749-754388324470/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017 h1:2HQmlpI3yI9deH18Q6xiSOIjXD4sLI55Y/gfpa8/558= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v0.0.0-20200130152716-5d0cf8839492/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v0.0.0-20200210162036-a4bedce16568 h1:AbI1uj9w4yt6TvfKHfRu7G55KuQe7NCvWPQRKDoXggE= +github.com/docker/cli v0.0.0-20200210162036-a4bedce16568/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20191216044856-a8371794149d/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.6.0-rc.1.0.20180327202408-83389a148052+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker-credential-helpers v0.6.1/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82 h1:X0fj836zx99zFu83v/M79DuBn84IL/Syx1SY6Y5ZEMA= -github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916 h1:yWHOI+vFjEsAakUTSrtqc/SAHrhSkmn48pqjidZX3QA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libnetwork v0.0.0-20180830151422-a9cd636e3789/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= -github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= +github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elastic/go-sysinfo v1.0.1/go.mod h1:O/D5m1VpYLwGjCYzEt63g3Z1uO3jXfwyzzjiW90t8cY= +github.com/elastic/go-sysinfo v1.1.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= +github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= +github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= +github.com/elastic/gosigar v0.9.0/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs= +github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.6.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.6+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.11.1+incompatible h1:CjKsv3uWcCMvySPQYKxO8XX3f9zD4FeZRsW4G0B4ffE= github.com/emicklei/go-restful v2.11.1+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful-swagger12 v0.0.0-20170208215640-dcef7f557305/go.mod h1:qr0VowGBT4CS4Q8vFF8BSeKz34PuqKGxs/L0IAQA9DQ= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= +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/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.1.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40egUymuWXxAe151lTNnCv97MddSOVsjpPPkityA= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/structtag v1.0.0/go.mod h1:IKitwq45uXL/yqi5mYghiD3w9H6eTOvI9vnk8tXMphA= github.com/fatih/structtag v1.1.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/frankban/quicktest v1.8.1/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsouza/fake-gcs-server v0.0.0-20180612165233-e85be23bdaa8/go.mod h1:1/HufuJ+eaDf4KTnYdS6HJMGvMRU8d4cYTuu/1QaBbI= github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk= -github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/gernest/wow v0.1.0/go.mod h1:dEPabJRi5BneI1Nev1VWo0ZlcTWibHWp43qxKms4elY= +github.com/getsentry/raven-go v0.1.2/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -283,9 +444,13 @@ github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-acme/lego v2.5.0+incompatible/go.mod h1:yzMNe9CasVUhkquNvti5nAtPmG94USbYxYrZfTkIn0M= -github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= +github.com/go-bindata/go-bindata v3.1.2+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= 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-ini/ini v1.21.1/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-ini/ini v1.46.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -295,15 +460,20 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v0.1.1 h1:qXBXPDdNncunGs7XeEpsJt8wCjYBygluzfdLO0G5baE= github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= +github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.17.2/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.17.2/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.17.2/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= @@ -311,119 +481,175 @@ github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm7232 github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.17.2/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.17.2/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.17.2/go.mod h1:QO936ZXeisByFmZEO1IS1Dqhtf4QV1sYYFtIq6Ld86Q= +github.com/go-openapi/runtime v0.18.0/go.mod h1:uI6pHuxWYTy94zZxgcwJkUWa9wbIlhteGfloI10GD4U= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo= github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.6 h1:rMMMj8cV38KVXK7SFc+I2MWClbEfbK705+j+dyqun5g= +github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.17.2/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.4/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.7 h1:VRuXN2EnMSsZdauzdss6JBC29YotDqG59BZ+tdlIL1s= +github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/validate v0.17.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.17.2/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= +github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-sql-driver/mysql v0.0.0-20160411075031-7ebe0a500653/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/gobuffalo/envy v1.6.5/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= github.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= +github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk= github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= -github.com/godbus/dbus v4.1.0+incompatible/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang-migrate/migrate/v4 v4.6.2/go.mod h1:JYi6reN3+Z734VZ0akNuyOJNcrg45ZL7LDBMW3WGJL0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20180924190550-6f2cf27854a4/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9 h1:uHTyIjqVhYRhLbJ8nIiOJHkEZZ+5YoOsAbD3sk82NiE= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/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 h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= 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.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 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 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= 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 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= +github.com/gomodule/redigo v1.7.0/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 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/cadvisor v0.34.0/go.mod h1:1nql6U13uTHaLYB8rLS5x9IJc2qT6Xd/Tr1sTX6NE48= -github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= 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 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-containerregistry v0.0.0-20191010200024-a3d713f9b7f8/go.mod h1:KyKXa9ciM8+lgMXwOVsXi7UxGrsf9mM61Mzs+xKUrKE= github.com/google/go-containerregistry v0.0.0-20200115214256-379933c9c22b h1:oGqapkPUiypdS9ch/Vu0npPe03RQ0BhVDYli+OEKNAA= github.com/google/go-containerregistry v0.0.0-20200115214256-379933c9c22b/go.mod h1:Wtl/v6YdQxv397EREtzwgd9+Ud7Q5D8XMbi3Zazgkrs= +github.com/google/go-containerregistry v0.0.0-20200123184029-53ce695e4179/go.mod h1:Wtl/v6YdQxv397EREtzwgd9+Ud7Q5D8XMbi3Zazgkrs= +github.com/google/go-containerregistry v0.0.0-20200331213917-3d03ed9b1ca2 h1:k2YJ1fw6LwICNNUQHZNp9vTtHMuVqHJtMjZOc5SDIJo= +github.com/google/go-containerregistry v0.0.0-20200331213917-3d03ed9b1ca2/go.mod h1:pD1UFYs7MCAx+ZLShBdttcaOSbyc8F9Na/9IZLNwJeA= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-github/v27 v27.0.6/go.mod h1:/0Gr8pJ55COkmv+S/yPKCczSkUPIM/LnFyubufRNIS0= github.com/google/go-github/v29 v29.0.3 h1:IktKCTwU//aFHnpA+2SLIi7Oo9uhAzgsdZNbcAqhgdc= github.com/google/go-github/v29 v29.0.3/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E= github.com/google/go-licenses v0.0.0-20191112164736-212ea350c932/go.mod h1:16wa6pRqNDUIhOtwF0GcROVqMeXHZJ7H6eGDFUh5Pfk= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= +github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= +github.com/google/gofuzz v0.0.0-20150304233714-bbcb9da2d746/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= 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/licenseclassifier v0.0.0-20190926221455-842c0d70d702/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= +github.com/google/licenseclassifier v0.0.0-20200402202327-879cb1424de0/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= +github.com/google/mako v0.0.0-20190821191249-122f8dcef9e3/go.mod h1:YzLcVlL+NqWnmUEPuhS1LxDDwGO9WNbVlEXaF4IH35g= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20180605153948-8b03ce837f34/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 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-20190723021845-34ac40c74b70/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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww= github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -431,72 +657,127 @@ github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.0.0-20180520015035-48a0ecefe2e4/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= +github.com/googleapis/gnostic v0.4.0 h1:BXDUo8p/DaxC+4FJY/SSx3gvnx9C1VdHNgaUkiEL5mk= +github.com/googleapis/gnostic v0.4.0/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/gophercloud/gophercloud v0.0.0-20190301152420-fca40860790e/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gophercloud/gophercloud v0.2.0 h1:lD2Bce2xBAMNNcFZ0dObTpXkGLlVIb33RPVUNVpw6ic= github.com/gophercloud/gophercloud v0.2.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gophercloud/gophercloud v0.3.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gophercloud/gophercloud v0.6.0 h1:Xb2lcqZtml1XjgYZxbeayEemq7ASbeTp09m36gQFpEU= +github.com/gophercloud/gophercloud v0.6.0/go.mod h1:GICNByuaEBibcjmjvI7QvYJSZEbGkcYwAR7EZK2WMqM= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20191106031601-ce3c9ade29de/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.4.0/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/csrf v1.6.2/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAkHEGI= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= +github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +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/gosuri/uitable v0.0.1/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= -github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190203031600-7a902570cb17/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= 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= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= +github.com/grpc-ecosystem/go-grpc-prometheus v0.0.0-20170330212424-2500245aa611/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/go-grpc-prometheus v0.0.0-20181025070259-68e3a13e4117/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.4 h1:5xLhQjsk4zqPf9EHCrja2qFZMx+yBqkO3XgJ14bNnU0= github.com/grpc-ecosystem/grpc-gateway v1.9.4/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/grpc-ecosystem/grpc-gateway v1.12.2 h1:D0EVSTwQoQOyfY35QNSuPJA4jpZRtkoGYWQMB7XNg5o= +github.com/grpc-ecosystem/grpc-gateway v1.12.2/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-health-probe v0.2.1-0.20181220223928-2bf0a5b182db/go.mod h1:uBKkC2RbarFsvS5jMJHpVhTLvGlGQj9JJwkaePE3FWI= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/h2non/gock v1.0.9/go.mod h1:CZMcB0Lg5IWnr9bF79pPMg9WeV6WumxQiUJ1UvdO1iE= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hashicorp/consul v1.4.4/go.mod h1:mFrjN1mfidgJfYP1xrJCF+AfRhr6Eaqhb2+sfyn/OOI= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= +github.com/hashicorp/go-multierror v0.0.0-20171204182908-b7773ae21874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v0.0.0-20160503143440-6bb64b370b90/go.mod h1:o4zcYY1e0GEZI6eSEr+43QDYmuGglw1qSO6qdHUHCgg= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= 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/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/heketi/heketi v9.0.0+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= -github.com/heketi/rest v0.0.0-20180404230133-aa6a65207413/go.mod h1:BeS3M108VzVlmAue3lv2WcGuPAX94/KN63MUURzbYSI= -github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= -github.com/heketi/utils v0.0.0-20170317161834-435bc5bdfa64/go.mod h1:RYlF4ghFZPPmk2TC5REt5OFwvfb6lzxFWrTWB+qs28s= -github.com/helm/helm-2to3 v0.2.0/go.mod h1:jQUVAWB0bM7zNIqKPIfHFzuFSK0kHYovJrjO+hqcvRk= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.1.5/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.8.5/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k= +github.com/helm/helm-2to3 v0.5.1/go.mod h1:AXFpQX2cSQpss+47ROPEeu7Sm4+CRJ1jKWCEQdHP3/c= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/iancoleman/strcase v0.0.0-20190422225806-e506e3ef7365/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/improbable-eng/thanos v0.3.2/go.mod h1:GZewVGILKuJVPNRn7L4Zw+7X96qzFOwj63b22xYGXBE= github.com/improbable-eng/thanos v0.5.0/go.mod h1:RXlsWB7YlTbhIod//QDyd5cBZsnEN0jROXZJY/ol4nk= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb v0.0.0-20161215172503-049f9b42e9a5/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= +github.com/influxdata/influxdb v0.0.0-20170331210902-15e594fc09f1/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= +github.com/influxdata/influxdb v1.7.7/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= +github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= +github.com/influxdata/tdigest v0.0.0-20191024211133-5d87a7585faa/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= +github.com/influxdata/tdigest v0.0.1/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= @@ -504,62 +785,92 @@ github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0 github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jcrossley3/manifestival v0.0.0-20190621184852-78b6b04ae6ff/go.mod h1:Zyg0bjHD0DiMRIHFRWY+mEYIofOz1M0aDDBLpSBUCzI= github.com/jenkins-x/go-scm v1.5.65/go.mod h1:MgGRkJScE/rJ30J/bXYqduN5sDPZqZFITJopsnZmTOw= +github.com/jessevdk/go-flags v0.0.0-20180331124232-1c38ed7ad0cc/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jimstudt/http-authentication v0.0.0-20140401203705-3eca13d6893a/go.mod h1:wK6yTYYcgjHE1Z1QtXACPDjcFJyBskHEdagmnq3vsP8= +github.com/jinzhu/gorm v0.0.0-20170316141641-572d0a0ab1eb/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= +github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs= +github.com/jinzhu/inflection v0.0.0-20190603042836-f5c5f50e6090/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= +github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.0.0-20141017032234-72f9bd7c4e0c/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jsonnet-bundler/jsonnet-bundler v0.1.0/go.mod h1:YKsSFc9VFhhLITkJS3X2PrRqWG9u2Jq99udTdDjQLfM= +github.com/jsonnet-bundler/jsonnet-bundler v0.2.0/go.mod h1:/by7P/OoohkI3q4CgSFqcoFsVY+IaNbzOVDknEsKDeU= 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/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= -github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kelseyhightower/envconfig v1.3.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/knative/pkg v0.0.0-20190817231834-12ee58e32cc8 h1:cYUW0Hf44iFo34VdB9UYXlqLTnUvw2jwocJZkvLlhg0= -github.com/knative/pkg v0.0.0-20190817231834-12ee58e32cc8/go.mod h1:7Ijfhw7rfB+H9VtosIsDYvZQ+qYTz7auK3fHW/5z4ww= -github.com/knative/serving-operator v0.0.0-20190702004031-e30377b852ff h1:H4JlAdaAs3pmA6ge2AFgsR56gJMbx2Q8wcixzSTwWhY= -github.com/knative/serving-operator v0.0.0-20190702004031-e30377b852ff/go.mod h1:MyxPjzS8amZskAEvHaOyQClK5IqO/CdVQM2rW68AFOA= +github.com/klauspost/cpuid v1.2.2/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/knative/build v0.1.2/go.mod h1:/sU74ZQkwlYA5FwYDJhYTy61i/Kn+5eWfln2jDbw3Qo= +github.com/knz/strtime v0.0.0-20181018220328-af2256ee352c/go.mod h1:4ZxfWkxwtc7dBeifERVVWRy9F9rTU9p0yCDgeCtlius= +github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= 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/pty v1.0.0/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= 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/kshvakov/clickhouse v1.3.5/go.mod h1:DMzX7FxRymoNkVgizH0DWAL8Cur7wHLgx3MUnGwJqpE= +github.com/kubernetes-incubator/custom-metrics-apiserver v0.0.0-20190918110929-3d9be26a50eb/go.mod h1:KWRxWvzVCNvDtG9ejU5UdpgvxdCZFMUZu0xroKWG8Bo= +github.com/kylelemons/godebug v0.0.0-20160406211939-eadb3ce320cb/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/leanovate/gopter v0.2.4/go.mod h1:gNcbPWNEWRe4lm+bycKqxUYoH5uoVje5SkOJ3uoLer8= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/libopenstorage/openstorage v1.0.0/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.15.6/go.mod h1:6AMpwZpsyCFwSovxzM78e+AsYxE8sGwiM6C3TytaWeI= +github.com/lightstep/lightstep-tracer-go v0.18.0/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lightstep/tracecontext.go v0.0.0-20181129014701-1757c391b1ac/go.mod h1:Frd2bnT3w5FB5q49ENTfVlztJES+1k/7lyWX2+9gq/M= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lovoo/gcloud-opentracing v0.3.0/go.mod h1:ZFqk2y38kMDDikZPAK7ynTTGuyt17nSPdS3K5e+ZTBY= -github.com/lpabon/godbc v0.1.1/go.mod h1:Jo9QV0cf3U6jZABgiJ2skINAXb9j8m51r07g4KI92ZA= -github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f/go.mod h1:JpH9J1c9oX6otFSgdUHwUBUizmKlrMjxWnIAjff4m04= -github.com/lucas-clemente/quic-clients v0.1.0/go.mod h1:y5xVIEoObKqULIKivu+gD/LU90pL73bTdtQjPBvtCBk= -github.com/lucas-clemente/quic-go v0.10.2/go.mod h1:hvaRS9IHjFLMq76puFJeWNfmn+H70QZ/CXoxqw9bzao= -github.com/lucas-clemente/quic-go-certificates v0.0.0-20160823095156-d2f86524cced/go.mod h1:NCcRLrOTZbzhZvixZLlERbJtDtYsmMw8Jc4vS8Z0g58= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -570,45 +881,72 @@ 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 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.1-0.20191009090205-6c0755d89d1e h1:jcoUdG1TzY/M/eM5BLFLP8DJeMximx5NQYSlLL9YeWc= +github.com/mailru/easyjson v0.7.1-0.20191009090205-6c0755d89d1e/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/manifestival/client-go-client v0.2.2/go.mod h1:lddTN8OB7VJAFaFXtMPHY/HP0G3uUp1cZJirE5x/Ct8= github.com/manifestival/controller-runtime-client v0.1.1-0.20200218204725-1af9550ddf8f h1:1tes5O5eRVhzX8+4DMKmYHgzSfTG+t3p9SdEMa1/Etg= github.com/manifestival/controller-runtime-client v0.1.1-0.20200218204725-1af9550ddf8f/go.mod h1:xK5vtLpVxkFQKIFk4ABGln7fpUKVf2UHybbP9wPWetw= -github.com/manifestival/manifestival v0.1.1-0.20200219193505-fabb889b98f5 h1:EUT0ZE7jQFR4paHrVSGWnLUSPxCh+HgOtKT1tHjW6lY= -github.com/manifestival/manifestival v0.1.1-0.20200219193505-fabb889b98f5/go.mod h1:jlYRi+Y1LEGR94OSBXU887tNJ7Y317sHd/DcNAHE2eI= -github.com/maorfr/helm-plugin-utils v0.0.0-20181205064038-588190cb5e3b/go.mod h1:p3gwmRSFqbWw6plBpR0sKl3n3vpu8kX70gvCJKMvvCA= +github.com/manifestival/manifestival v0.5.1-0.20200526175228-b0136214e13f h1:tjvlP9FAMD2GTc9S6n0SI+mpPopvGihMhCqKt/j6H68= +github.com/manifestival/manifestival v0.5.1-0.20200526175228-b0136214e13f/go.mod h1:jlYRi+Y1LEGR94OSBXU887tNJ7Y317sHd/DcNAHE2eI= +github.com/maorfr/helm-plugin-utils v0.0.0-20200216074820-36d2fcf6ae86/go.mod h1:p3gwmRSFqbWw6plBpR0sKl3n3vpu8kX70gvCJKMvvCA= github.com/markbates/inflect v1.0.4/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs= -github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/martinlindhe/base36 v1.0.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8= github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a h1:+J2gw7Bw77w/fbK7wnNJJDKmw1IbWft2Ul5BzrG1Qm8= github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a/go.mod h1:M1qoD/MqPgTZIk0EWKB38wE28ACRfVcn+cU08jyArI0= 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= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20191113090002-7c0f6868bffe/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.6/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-shellwords v1.0.9/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v0.0.0-20160514122348-38ee283dabf1/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= +github.com/matttproud/golang_protobuf_extensions v1.0.0/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.1/go.mod h1:F9YacGpnZbLQMzuPI0rR6op21YvNu/RjL705LJJpM3k= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/mesos/mesos-go v0.0.9/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= -github.com/mholt/certmagic v0.6.2-0.20190624175158-6a42ef9fe8c2/go.mod h1:g4cOPxcjV0oFq3qwpjSA30LReKD8AoIfwAY9VvG35NY= -github.com/miekg/dns v0.0.0-20181005163659-0d29b283ac0f/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mholt/archiver/v3 v3.3.0/go.mod h1:YnQtqsp+94Rwd0D/rk5cnLrxusUBUXg+08Ebtr1Mqao= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.8/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mindprince/gonvml v0.0.0-20171110221305-fee913ce8fb2/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= +github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/mikefarah/yaml/v2 v2.4.0/go.mod h1:ahVqZF4n1W4NqwvVnZzC4es67xsW9uR/RRf2RRxieJU= +github.com/mikefarah/yq/v2 v2.4.1/go.mod h1:i8SYf1XdgUvY2OFwSqGAtWOOgimD2McJ6iutoxRm4k0= github.com/minio/cli v1.20.0/go.mod h1:bYxnK0uS629N3Bq+AOZZ+6lwF77Sodk4+UL9vNuXhOY= github.com/minio/minio-go/v6 v6.0.27-0.20190529152532-de69c0e465ed/go.mod h1:vaNT59cWULS37E+E9zkuN/BVnKHyXtVGS+b04Boc66Y= -github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/minio/minio-go/v6 v6.0.49/go.mod h1:qD0lajrGW49lKZLtXKtCB4X/qkMf0a5tBvN2PaZg7Gg= +github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/go-homedir v0.0.0-20180523094522-3864e76763d9/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/ioprogress v0.0.0-20180201004757-6a23b12fa88e/go.mod h1:waEya8ee1Ro/lgxpVhkJI4BVASzkm3UZqkx/cFJiYHM= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 h1:cvy4lBOYN3gKfKj8Lzz5Q9TfviP+L7koMHY7SvkyTKs= github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= @@ -619,73 +957,103 @@ github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lN github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mozillazg/go-cos v0.12.0/go.mod h1:Zp6DvvXn0RUOXGJ2chmWt2bLEqRAnJnS3DnAZsJsoaE= +github.com/mozillazg/go-cos v0.13.0/go.mod h1:Zp6DvvXn0RUOXGJ2chmWt2bLEqRAnJnS3DnAZsJsoaE= github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60= -github.com/mrunalp/fileutils v0.0.0-20160930181131-4ee1cc9a8058/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20190414153302-2ae31c8b6b30/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= github.com/nats-io/gnatsd v1.4.1/go.mod h1:nqco77VO78hLCJpIcVfygDP2rPGfsEHkGTUk94uh5DQ= github.com/nats-io/go-nats v1.7.0/go.mod h1:+t7RHT5ApZebkrQdnn6AhQJmhJJiKAvJUio1PiiCtj0= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats-server/v2 v2.1.4/go.mod h1:Jw1Z28soD/QasIA2uWjXyM9El1jly3YwyFOuR8tH1rg= +github.com/nats-io/nats-streaming-server v0.17.0/go.mod h1:ewPBEsmp62Znl3dcRsYtlcfwudxHEdYMtYqUQSt4fE0= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.0/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nats-io/stan.go v0.6.0/go.mod h1:eIcD5bi3pqbHT/xIIvXMwvzXYElgouBvaVRftaE+eac= github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nwaples/rardecode v1.0.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= +github.com/oklog/oklog v0.0.0-20170918173356-f857583a70c3/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v0.0.0-20170117200651-66bb6560562f/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.4.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJGY8Y= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc2.0.20190611121236-6cc515888830 h1:yvQ/2Pupw60ON8TYEIGGTAI77yZsWYkiOeHFZWkwlCk= -github.com/opencontainers/runc v1.0.0-rc2.0.20190611121236-6cc515888830/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runtime-spec v1.0.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.2.2/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/openshift/api v0.0.0-20190924102528-32369d4db2ad h1:MiZEukiPd7ll8BQDwBfc3LKBxbqyeXIx+wl4CzVj5EQ= github.com/openshift/api v0.0.0-20190924102528-32369d4db2ad/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY= github.com/openshift/client-go v0.0.0-20190923180330-3b6373338c9b/go.mod h1:6rzn+JTr7+WYS2E1TExP4gByoABxMznR6y2SnUIkmxk= github.com/openshift/origin v0.0.0-20160503220234-8f127d736703/go.mod h1:0Rox5r9C8aQn6j1oAOQ0c1uC86mYbUFObzjBRvUKHII= github.com/openshift/prom-label-proxy v0.1.1-0.20191016113035-b8153a7f39f1/go.mod h1:p5MuxzsYP1JPsNGwtjtcgRHHlGziCJJfztff91nNixw= github.com/opentracing-contrib/go-stdlib v0.0.0-20170113013457-1de4cc2120e7/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= +github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.1-0.20190913142402-a7454ce5950e/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.0/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/operator-framework/api v0.0.0-20200120235816-80fd2f1a09c9/go.mod h1:S5IdlJvmKkF84K2tBvsrqJbI2FVy03P88R75snpRxJo= -github.com/operator-framework/operator-lifecycle-manager v0.0.0-20191115003340-16619cd27fa5 h1:rjaihxY50c5C+kbQIK4s36R8zxByATYrgRbua4eiG6o= -github.com/operator-framework/operator-lifecycle-manager v0.0.0-20191115003340-16619cd27fa5/go.mod h1:zL34MNy92LPutBH5gQK+gGhtgTUlZZX03I2G12vWHF4= +github.com/openzipkin/zipkin-go v0.2.2 h1:nY8Hti+WKaP0cRsSeQ026wU03QsM762XBeCXBb9NAWI= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/operator-framework/api v0.1.1/go.mod h1:yzNYR7qyJqRGOOp+bT6Z/iYSbSPNxeh3Si93Gx/3OBY= +github.com/operator-framework/operator-lifecycle-manager v0.0.0-20200321030439-57b580e57e88/go.mod h1:7Ut8p9jJ8C6RZyyhZfZypmlibCIJwK5Wcc+WZDgLkOA= github.com/operator-framework/operator-lifecycle-manager v3.11.0+incompatible h1:Po8C8RVLRWq7pNQ5pKonM9CXpC/osoBWbmsuf+HJnSI= github.com/operator-framework/operator-lifecycle-manager v3.11.0+incompatible/go.mod h1:Ma5ZXd4S1vmMyewWlF7aO8CZiokR7Sd8dhSfkGkNU4U= -github.com/operator-framework/operator-registry v1.5.1/go.mod h1:agrQlkWOo1q8U1SAaLSS2WQ+Z9vswNT2M2HFib9iuLY= github.com/operator-framework/operator-registry v1.5.3/go.mod h1:agrQlkWOo1q8U1SAaLSS2WQ+Z9vswNT2M2HFib9iuLY= -github.com/operator-framework/operator-registry v1.5.7-0.20200121213444-d8e2ec52c19a/go.mod h1:ekexcV4O8YMxdQuPb+Xco7MHfVmRIq7Jvj5e6NU7dHI= -github.com/operator-framework/operator-sdk v0.16.0 h1:+D61x7FjcITLzjVakzfzz5hqkkMDR+uEDMzXfyVZOw8= -github.com/operator-framework/operator-sdk v0.16.0/go.mod h1:1UykIjxOHX/Ltj/2Z0h0y0DZ7YGBYlcBI+ctaCjXVDk= +github.com/operator-framework/operator-registry v1.6.1/go.mod h1:sx4wWMiZtYhlUiaKscg3QQUPPM/c1bkrAs4n4KipDb4= +github.com/operator-framework/operator-registry v1.6.2-0.20200330184612-11867930adb5/go.mod h1:SHff373z8asEkPo6aWpN0qId4Y/feQTjZxRF8PRhti8= +github.com/operator-framework/operator-sdk v0.17.1 h1:ESV2s2oQsZPQiQ8VfC8S5DzEnO/azXF82Fj++5qpAkw= +github.com/operator-framework/operator-sdk v0.17.1/go.mod h1:wmYi08aoUmtgfoUamURmssI4dkdFGNtSI1Egj+ZfBnk= github.com/otiai10/copy v1.0.1/go.mod h1:8bMCJrAqOtN/d9oyh5HR7HhLQMvcGMpGdwRDYsfOCHc= github.com/otiai10/copy v1.0.2/go.mod h1:c7RpqBkwMom4bYTSkLSym4VSJz/XtncWRAj/J4PEIMY= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= @@ -693,112 +1061,189 @@ github.com/otiai10/curr v0.0.0-20190513014714-f5a3d24e5776/go.mod h1:3HNVkVOU7vZ github.com/otiai10/mint v1.2.3/go.mod h1:YnfyPNhBvnY8bW4SGQHCs/aAFhkgySlMZbrF5U0bOVw= github.com/otiai10/mint v1.2.4/go.mod h1:d+b7n/0R3tdyUYYylALXpWQ/kTN+QobSq/4SRGBkR3M= github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= -github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.3.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/peterbourgon/diskv v0.0.0-20180312054125-0646ccaebea1/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/freeport v0.0.0-20171002181615-b8543db493a5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= +github.com/peterbourgon/g2s v0.0.0-20170223122336-d4e7ad98afea/go.mod h1:1VcHEd3ro4QMoHfiNl/j7Jkln9+KQuorp0PItHMJYNg= +github.com/petermattis/goid v0.0.0-20170504144140-0ded85884ba5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/pquerna/ffjson v0.0.0-20180717144149-af8b230fcd20/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= +github.com/prometheus/alertmanager v0.18.0/go.mod h1:WcxHBl40VSPuOaqWae6l6HpnEOVRIycEJ7i9iYkadEE= +github.com/prometheus/alertmanager v0.20.0/go.mod h1:9g2i48FAyZW6BtbsnvHtMHQXl2aVtrORKwKVCQ+nbrg= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.2.0/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= github.com/prometheus/client_golang v1.2.1 h1:JnMpQc6ppsNgw9QPAGF6Dod479itz7lvlsMzzNayLOI= github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= +github.com/prometheus/client_golang v1.5.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA= +github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20180518154759-7600349dcfe1/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.3.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20180612222113-7d6f385de8be/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190129233650-316cf8ccfec5/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.6/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.10/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/prometheus v0.0.0-20180315085919-58e2a31db8de/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= +github.com/prometheus/prometheus v1.8.2-0.20200110114423-1e64d757f711/go.mod h1:7U90zPoLkWjEIQcy/rweQla82OCTUzxVHE51G3OhJbI= github.com/prometheus/prometheus v2.3.2+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= +github.com/prometheus/prometheus v2.9.2+incompatible/go.mod h1:vdLuLLM0uqhLSofrQ7Nev2b/rQUyZ+pkT3zF7LB/i1g= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.8.0/go.mod h1:fSI0j+IUQrDd7+ZtR9WKIGtoYAYAJUKcKhYLG25tN4g= -github.com/quobyte/api v0.1.2/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/rlmcpherson/s3gof3r v0.5.0/go.mod h1:s7vv7SMDPInkitQMuZzH615G7yWHdrU2r/Go7Bo71Rs= github.com/robfig/cron v0.0.0-20170526150127-736158dc09e1/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= -github.com/robfig/cron v1.1.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= 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.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.5.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rubenv/sql-migrate v0.0.0-20191025130928-9355dd04f4b3/go.mod h1:WS0rl9eEliYI8DPnr3TOwz4439pay+qNgzJoVya/DmY= github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= -github.com/russross/blackfriday v0.0.0-20170610170232-067529f716f4/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/rubyist/circuitbreaker v2.2.1+incompatible/go.mod h1:Ycs3JgJADPuzJDwffe12k6BZT8hxVi6lFK+gWYJLN4A= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20161028232340-1d7be4effb13/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/samuel/go-zookeeper v0.0.0-20190810000440-0ceca61e4d75/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4= +github.com/sasha-s/go-deadlock v0.0.0-20161201235124-341000892f3d/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= +github.com/satori/go.uuid v0.0.0-20160603004225-b111a074d5ef/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/go.uuid v0.0.0-20160713180306-0aa62d5ddceb/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shurcooL/githubv4 v0.0.0-20180925043049-51d7b505e2e9/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= github.com/shurcooL/githubv4 v0.0.0-20190718010115-4ba037080260/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= github.com/shurcooL/githubv4 v0.0.0-20191102174205-af46314aec7b/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/graphql v0.0.0-20180924043259-e4a3a37e6d42/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= +github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/vfsgen v0.0.0-20180711163814-62bca832be04/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/shurcooL/vfsgen v0.0.0-20180825020608-02ddb050ef6b/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd h1:ug7PpSOB5RBPK1Kg6qskGBoP3Vnj/aNYFTznWvlkGo0= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.1.1/go.mod h1:zrgwTnHtNr00buQ1vSptGe8m1f/BbgsPukg8qsT7A+A= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q= +github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.0-20180319062004-c439c4fa0937/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.4/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 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/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= -github.com/storageos/go-api v0.0.0-20180912212459-343b3eff91fc/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -807,72 +1252,121 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/syndtr/gocapability v0.0.0-20160928074757-e7cb7fa329f4/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tektoncd/operator v0.0.0-20191017104520-be5a46fc149a h1:AnesY6DFbgU/5BxmwtdgWLGhmhYvuctCSFTvx5jHCPM= github.com/tektoncd/operator v0.0.0-20191017104520-be5a46fc149a/go.mod h1:CSv2rTjT+E9SKntzh59gHvFHeX591ZFwpBvbd2UtQC0= +github.com/tektoncd/pipeline v0.8.0/go.mod h1:IZzJdiX9EqEMuUcgdnElozdYYRh0/ZRC+NKMLj1K3Yw= github.com/tektoncd/pipeline v0.10.1 h1:pDsYK2b70o/Ze/CE1nisELwKVVE54FxwyfLznsW1JiE= github.com/tektoncd/pipeline v0.10.1/go.mod h1:D2X0exT46zYx95BU7ByM8+erpjoN7thmUBvlKThOszU= github.com/tektoncd/plumbing v0.0.0-20191008065817-933f0722e02c/go.mod h1:dvZoTaPGpr3ZDqOUR1sc8VOhh/7OzYncVnbQETJTqvQ= github.com/tektoncd/plumbing v0.0.0-20191216083742-847dcf196de9/go.mod h1:QZHgU07PRBTRF6N57w4+ApRu8OgfYLFNqCDlfEZaD9Y= github.com/tektoncd/plumbing/pipelinerun-logs v0.0.0-20191206114338-712d544c2c21/go.mod h1:S62EUWtqmejjJgUMOGB1CCCHRp6C706laH06BoALkzU= -github.com/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= +github.com/thanos-io/thanos v0.11.0/go.mod h1:N/Yes7J68KqvmY+xM6J5CJqEvWIvKSR5sqGtmuD6wDc= github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tsenart/go-tsz v0.0.0-20180814235614-0bd30b3df1c3/go.mod h1:SWZznP1z5Ki7hDT2ioqiFKEse8K9tU2OUvaRI0NeGQo= +github.com/tsenart/vegeta v12.7.1-0.20190725001342-b5f4fca92137+incompatible/go.mod h1:Smz/ZWfhKRcyDDChZkG3CyTHdj87lHzio/HOCkbndXM= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/uber/jaeger-client-go v2.20.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.1/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.18.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/vdemeester/k8s-pkg-credentialprovider v0.0.0-20200107171650-7c61ffa44238/go.mod h1:JwQJCMWpUDqjZrB5jpw0f5VbN7U95zxFy1ZDpoEarGo= github.com/vdemeester/k8s-pkg-credentialprovider v1.13.12-1 h1:IBEhRIcu5HP+Pkhzn9E9z3wV0tp3TFjDkiAQtX2FXFM= github.com/vdemeester/k8s-pkg-credentialprovider v1.13.12-1/go.mod h1:Fko0rTxEtDW2kju5Ky7yFJNS3IcNvW8IPsp4/e9oev0= -github.com/vishvananda/netlink v0.0.0-20171020171820-b2de5d10e38e/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netns v0.0.0-20171111001504-be1fbeda1936/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vmware/govmomi v0.20.1/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJbreVojo06krnTgaeAz/Z7lynpPk/Q2c= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xenolf/lego v0.0.0-20160613233155-a9d8cec0e656/go.mod h1:fwiGnfsIjG7OHPfOvgK7Y/Qo6+2Ox0iozjNTkZICKbY= -github.com/xenolf/lego v0.3.2-0.20160613233155-a9d8cec0e656/go.mod h1:fwiGnfsIjG7OHPfOvgK7Y/Qo6+2Ox0iozjNTkZICKbY= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= +github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.6/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= +go.elastic.co/apm v1.5.0/go.mod h1:OdB9sPtM6Vt7oz3VXt7+KR96i9li74qrxBGHTQygFvk= +go.elastic.co/apm/module/apmhttp v1.5.0/go.mod h1:1FbmNuyD3ddauwzgVwFB0fqY6KbZt3JkV187tGCYYhY= +go.elastic.co/apm/module/apmot v1.5.0/go.mod h1:d2KYwhJParTpyw2WnTNy8geNlHKKFX+4oK3YLlsesWE= +go.elastic.co/fastjson v1.0.0/go.mod h1:PmeUOMMtLHQr9ZS9J9owrAVg0FkaZDRZJEFTTGHtchs= +go.etcd.io/bbolt v1.3.1-etcd.7/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20181031231232-83304cfc808c/go.mod h1:weASp41xM3dk0YHg1s/W8ecdGP5G4teSTMBPpYAaUgA= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +go.opencensus.io v0.17.0/go.mod h1:mp1VrMQxhlqqDpKvH4UcQUa4YwlzNmymAjPrDdfxNpI= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= 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.1 h1:8dP3SGL7MPB94crU3bEPplMPe83FI4EouesJUeFHv50= go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opentelemetry.io/otel v0.2.3/go.mod h1:OgNpQOjrlt33Ew6Ds0mGjmcTQg/rhUctsbkRdk/g1fw= go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/automaxprocs v1.2.0/go.mod h1:YfO3fm683kQpzETxlTGZhGIVmXAhaw3gxeBADbpZtnU= go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.2.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.9.2-0.20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo= +go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181015023909-0c41d7ab0a0e/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -882,14 +1376,24 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191028145041-f83a4685e152 h1:ZC1Xn5A1nlpSmQCIva4bZ3ob3lmhYIefc+GU+DLg1Ow= -golang.org/x/crypto v0.0.0-20191028145041-f83a4685e152/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200206161412-a0c6ece9d31a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqpHbR0AVFnyPEQq/wRWz9lM= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -898,6 +1402,12 @@ golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxT golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= +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-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -909,30 +1419,35 @@ golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHl 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 h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= +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/mobile v0.0.0-20190806162312-597adff16ade/go.mod h1:AlhUtkH4DA4asiFC5RgK7ZKmauvtkAVcy9L0epCzlWo= 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 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180112015858-5ccada7d0a7b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190206173232-65e2d4e15006/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-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190328230028-74de082e2cca/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -940,21 +1455,40 @@ golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 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-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914 h1:MlY3mEfbnWGmUi4rtHOtNnnnN4UJRGSyLPx+DXA5Sq4= golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/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 h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/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-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= 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 h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 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= @@ -962,25 +1496,25 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180117170059-2c42eef0765b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181004145325-8469e314837c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190102155601-82a175fd1598/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190116161447-11f53e031339/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/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-20190219203350-90b0e4468f99/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190310054646-10058d7d4faa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -991,83 +1525,169 @@ golang.org/x/sys v0.0.0-20190425145619-16072639606e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190426135247-a129542de9ae/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-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190912141932-bc967efca4b8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191028164358-195ce5e7f934/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191210023423-ac6580df4449 h1:gSbV7h1NRL2G1xTg/owz62CST1oJBmxy4QpMMregXVQ= golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/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-20200317113312-5766fd39f98d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200327173247-9dae0f8f5775 h1:TC0v2RSO1u2kn1ZugjrFXkRZAEaqMN/RW+OTZkBzmLE= +golang.org/x/sys v0.0.0-20200327173247-9dae0f8f5775/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +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.20171227012246-e19ae1496984/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180805044716-cb6730876b98/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.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.1/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20170824195420-5d2fd3ccab98/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190118193359-16909d206f00/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/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-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425222832-ad9eeb80039a/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-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190617190820-da514acc4774/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-20190624180213-70d37148ca0c/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-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190807223507-b346f7fd45de/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190813034749-528a2984e271/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/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-20190918214516-5a1a30219888/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191010171213-8abd42400456/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191018212557-ed542cd5b28a/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-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191030203535-5e247c9ad0a0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191111182352-50fa39b762bc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112005509-a3f652f18032/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-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +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-20200115165105-de0b1760071a/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-20200210192313-1ace956b0e17/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-20200303214625-2b0b585e22fe/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200317043434-63da46f3035e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200327195553-82bb89366a1e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65 h1:1KSbntBked74wYsKq0jzXYy7ZwcjAUtrl7EmPE97Iiw= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +gomodules.xyz/jsonpatch/v2 v2.1.0 h1:Phva6wqu+xR//Njw6iorylFFgn/z547tw5Ne3HZPQ+k= +gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +gomodules.xyz/jsonpatch/v3 v3.0.1/go.mod h1:CBhndykehEwTOlEfnsfJwvkFQbSN8YZFr9M+cIHAJto= +gomodules.xyz/orderedmap v0.1.0/go.mod h1:g9/TPUCm1t2gwD3j3zfV8uylyYhVdCNSi+xCEIu7yTU= +gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= gonum.org/v1/gonum v0.0.0-20190710053202-4340aa3071a0/go.mod h1:03dgh78c4UvU1WksguQ/lvJQXbezKQGJSrwwRq5MraQ= +gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181021000519-a2651947f503/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= 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.10.0 h1:7tmAxx3oKE98VMZ+SBZzvYYWRQ9HODBxmC8mXUsraSQ= google.golang.org/api v0.10.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.20.0 h1:jz2KixHX7EcCPiQrySzPdnYT7DbINAypCqKZ1Z7GM40= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 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= @@ -1075,22 +1695,44 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= +google.golang.org/genproto v0.0.0-20170731182057-09f6ed296fc6/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180608181217-32ee49c4dd80/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190128161407-8ac453e89fca/go.mod h1:L3J43x8/uS+qIUoksaLKe6OS3nUKxOKuIFz1sl2/jx4= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181016170114-94acd270e44e/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-20190404172233-64821d5d2107/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-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190708153700-3bdd9d9f5532/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 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-20190916214212-f660b8655731/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191028173616-919d9bdd9fe6 h1:UXl+Zk3jqqcbEVV7ace5lrt4YdA4tXiz3f/KbmD29Vo= -google.golang.org/genproto v0.0.0-20191028173616-919d9bdd9fe6/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +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-20200317114155-1f3552e48f24/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200326112834-f447254575fd h1:DVCc2PgW9UrvHGZGEv4Mt3uSeQtUrrs7r8pUw+bVwWI= +google.golang.org/genproto v0.0.0-20200326112834-f447254575fd/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.13.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.15.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1098,38 +1740,56 @@ google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLD google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +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 h1:bO/TA4OxCOummhSf10siHuG7vJOiwh7SpRpFZDkOgl4= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.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 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/fsnotify/fsnotify.v1 v1.3.1/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= +gopkg.in/imdario/mergo.v0 v0.3.7/go.mod h1:9qPP6AGrlC1G2PTNXko614FwGZvorN7MiBU0Eppok+U= gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.46.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.52.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= gopkg.in/jcmturner/gokrb5.v7 v7.2.3/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= +gopkg.in/natefinch/lumberjack.v2 v2.0.0-20150622162204-20b71e5b60d7/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v1 v1.1.2/go.mod h1:QpYS+a4WhS+DTlyQIi6Ka7MS3SuR9a055rgXNEe6EiA= +gopkg.in/robfig/cron.v2 v2.0.0-20150107220207-be2e0b0deed5/go.mod h1:hiOFpYm0ZJbusNj2ywpbrXowU3G8U6GIQzqn2mw1UIE= +gopkg.in/square/go-jose.v2 v2.0.0-20180411045311-89060dee6a84/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= @@ -1139,22 +1799,25 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.0.0/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.1.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20190709130402-674ba3eaed22/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/gotestsum v0.3.5/go.mod h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY= -helm.sh/helm/v3 v3.0.0/go.mod h1:sI7B9yfvMgxtTPMWdk1jSKJ2aa59UyP9qhPydqW6mgo= -helm.sh/helm/v3 v3.0.1/go.mod h1:sI7B9yfvMgxtTPMWdk1jSKJ2aa59UyP9qhPydqW6mgo= -helm.sh/helm/v3 v3.0.2/go.mod h1:KBxE6XWO57XSNA1PA9CvVLYRY0zWqYQTad84bNXp1lw= +helm.sh/helm/v3 v3.1.0/go.mod h1:WYsFJuMASa/4XUqLyv54s0U/f3mlAaRErGmyy4z921g= +helm.sh/helm/v3 v3.1.1/go.mod h1:WYsFJuMASa/4XUqLyv54s0U/f3mlAaRErGmyy4z921g= +helm.sh/helm/v3 v3.1.2/go.mod h1:WYsFJuMASa/4XUqLyv54s0U/f3mlAaRErGmyy4z921g= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 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= @@ -1162,85 +1825,233 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.2/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/api v0.0.0-20191016110408-35e52d86657a h1:VVUE9xTCXP6KUPMf92cQmN88orz600ebexcRRaBTepQ= -k8s.io/api v0.0.0-20191016110408-35e52d86657a/go.mod h1:/L5qH+AD540e7Cetbui1tuJeXdmNhO8jM6VkXeDdDhQ= -k8s.io/apiextensions-apiserver v0.0.0-20191016113550-5357c4baaf65 h1:kThoiqgMsSwBdMK/lPgjtYTsEjbUU9nXCA9DyU3feok= -k8s.io/apiextensions-apiserver v0.0.0-20191016113550-5357c4baaf65/go.mod h1:5BINdGqggRXXKnDgpwoJ7PyQH8f+Ypp02fvVNcIFy9s= -k8s.io/apimachinery v0.0.0-20191004115801-a2eda9f80ab8 h1:Iieh/ZEgT3BWwbLD5qEKcY06jKuPEl6zC7gPSehoLw4= -k8s.io/apimachinery v0.0.0-20191004115801-a2eda9f80ab8/go.mod h1:llRdnznGEAqC3DcNm6yEj472xaFVfLM7hnYofMb12tQ= -k8s.io/apiserver v0.0.0-20191016112112-5190913f932d/go.mod h1:7OqfAolfWxUM/jJ/HBLyE+cdaWFBUoo5Q5pHgJVj2ws= +honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +istio.io/api v0.0.0-20191109011807-2629c6ac1513/go.mod h1:+cyHH83OwC0rFpwk8eXctzPNpiCAbB+r6kmMiAxxBHw= +istio.io/api v0.0.0-20191115173247-e1a1952e5b81/go.mod h1:+cyHH83OwC0rFpwk8eXctzPNpiCAbB+r6kmMiAxxBHw= +istio.io/client-go v0.0.0-20191120150049-26c62a04cdbc/go.mod h1:Bn3fm/aQ7JXVHiMYB4TrSp+NnUlZ5A5sH20xwzureII= +istio.io/gogo-genproto v0.0.0-20190930162913-45029607206a/go.mod h1:OzpAts7jljZceG4Vqi5/zXy/pOg1b209T3jb7Nv5wIs= +istio.io/gogo-genproto v0.0.0-20191029161641-f7d19ec0141d/go.mod h1:OzpAts7jljZceG4Vqi5/zXy/pOg1b209T3jb7Nv5wIs= +k8s.io/api v0.0.0-20180904230853-4e7be11eab3f/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/api v0.0.0-20181018013834-843ad2d9b9ae/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/api v0.0.0-20181213150558-05914d821849/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/api v0.0.0-20190313235455-40a48860b5ab/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/api v0.0.0-20190612125737-db0771252981/go.mod h1:SR4nMi8IQTDnEi4768MsMCoZ9DyfRls7wy+TbRrFicA= +k8s.io/api v0.0.0-20190620084959-7cf5895f2711/go.mod h1:TBhBqb1AWbBQbW3XRusr7n7E4v2+5ZY8r8sAMnyFC5A= +k8s.io/api v0.0.0-20190813020757-36bff7324fb7/go.mod h1:3Iy+myeAORNCLgjd/Xu9ebwN7Vh59Bw0vh9jhoX+V58= +k8s.io/api v0.0.0-20190820101039-d651a1528133/go.mod h1:AlhL1I0Xqh5Tyz0HsxjEhy+iKci9l1Qy3UMDFW7iG3A= +k8s.io/api v0.0.0-20190918155943-95b840bb6a1f/go.mod h1:uWuOHnjmNrtQomJrvEBg0c0HRNyQ+8KTEERVsK0PW48= +k8s.io/api v0.0.0-20190918195907-bd6ac527cfd2/go.mod h1:AOxZTnaXR/xiarlQL0JUfwQPxjmKDvVYoRp58cA7lUo= +k8s.io/api v0.0.0-20191025225708-5524a3672fbb/go.mod h1:NMIXwlJTrA+pXie6lv562GUPkluJ4oRGzQfqWBLaceY= +k8s.io/api v0.0.0-20191115095533-47f6de673b26/go.mod h1:iA/8arsvelvo4IDqIhX4IbjTEKBGgvsf2OraTuRtLFU= +k8s.io/api v0.16.4/go.mod h1:AtzMnsR45tccQss5q8RnF+W8L81DH6XwXwo/joEx9u0= +k8s.io/api v0.16.7/go.mod h1:oUAiGRgo4t+5yqcxjOu5LoHT3wJ8JSbgczkaFYS5L7I= +k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= +k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= +k8s.io/api v0.17.3/go.mod h1:YZ0OTkuw7ipbe305fMpIdf3GLXZKRigjtZaV5gzC2J0= +k8s.io/api v0.17.4/go.mod h1:5qxx6vjmwUVG2nHQTKGlLts8Tbok8PzHl4vHtVFuZCA= +k8s.io/api v0.17.6 h1:S6qZSkjdOU0N/TYBZKoR1o7YVSiWMGFU0XXDoqs2ioA= +k8s.io/api v0.17.6/go.mod h1:1jKVwkj0UZ4huak/yRt3MFfU5wc32+B41SkNN5HhyFg= +k8s.io/apiextensions-apiserver v0.0.0-20190315093550-53c4693659ed/go.mod h1:IxkesAMoaCRoLrPJdZNZUQp9NfZnzqaVzLhb2VEQzXE= +k8s.io/apiextensions-apiserver v0.0.0-20190820104113-47893d27d7f7/go.mod h1:j2JUxOCJoS+t+fzOY/2ENPX0rcZyKfvKuJPGbAgGLuw= +k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783/go.mod h1:xvae1SZB3E17UpV59AWc271W/Ph25N+bjPyR63X6tPY= +k8s.io/apiextensions-apiserver v0.0.0-20190918201827-3de75813f604/go.mod h1:7H8sjDlWQu89yWB3FhZfsLyRCRLuoXoCoY5qtwW1q6I= +k8s.io/apiextensions-apiserver v0.16.4/go.mod h1:HYQwjujEkXmQNhap2C9YDdIVOSskGZ3et0Mvjcyjbto= +k8s.io/apiextensions-apiserver v0.16.7/go.mod h1:6xYRp4trGp6eT5WZ6tPi/TB2nfWQCzwUvBlpg8iswe0= +k8s.io/apiextensions-apiserver v0.17.0/go.mod h1:XiIFUakZywkUl54fVXa7QTEHcqQz9HG55nHd1DCoHj8= +k8s.io/apiextensions-apiserver v0.17.2/go.mod h1:4KdMpjkEjjDI2pPfBA15OscyNldHWdBCfsWMDWAmSTs= +k8s.io/apiextensions-apiserver v0.17.3/go.mod h1:CJbCyMfkKftAd/X/V6OTHYhVn7zXnDdnkUjS1h0GTeY= +k8s.io/apiextensions-apiserver v0.17.4/go.mod h1:rCbbbaFS/s3Qau3/1HbPlHblrWpFivoaLYccCffvQGI= +k8s.io/apiextensions-apiserver v0.17.6 h1:o5JWDya65ApIVez+RfR40PGrqjPUZHhlSmwAHCvL20E= +k8s.io/apiextensions-apiserver v0.17.6/go.mod h1:Z3CHLP3Tha+Rbav7JR3S+ye427UaJkHBomK2c4XtZ3A= +k8s.io/apimachinery v0.0.0-20180904193909-def12e63c512/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.0.0-20181015213631-60666be32c5d/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.0.0-20181127025237-2b1284ed4c93/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.0.0-20190313205120-d7deff9243b1/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.0.0-20190612125636-6a5db36e93ad/go.mod h1:I4A+glKBHiTgiEjQiCCQfCAIcIMFGt291SmsvcrFzJA= +k8s.io/apimachinery v0.0.0-20190612205821-1799e75a0719/go.mod h1:I4A+glKBHiTgiEjQiCCQfCAIcIMFGt291SmsvcrFzJA= +k8s.io/apimachinery v0.0.0-20190703205208-4cfb76a8bf76/go.mod h1:M2fZgZL9DbLfeJaPBCDqSqNsdsmLN+V29knYJnIXlMA= +k8s.io/apimachinery v0.0.0-20190809020650-423f5d784010/go.mod h1:Waf/xTS2FGRrgXCkO5FP3XxTOWh0qLf2QhL1qFZZ/R8= +k8s.io/apimachinery v0.0.0-20190816221834-a9f1d8a9c101/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.0.0-20190817020851-f2f3a405f61d/go.mod h1:3jediapYqJ2w1BFw7lAZPCx7scubsTfosqHkhXCWJKw= +k8s.io/apimachinery v0.0.0-20190820100750-21ddcbbef9e1/go.mod h1:EZoIMuAgG/4v58YL+bz0kqnivqupk28fKYxFCa5e6X8= +k8s.io/apimachinery v0.0.0-20190820100751-ac02f8882ef6/go.mod h1:EZoIMuAgG/4v58YL+bz0kqnivqupk28fKYxFCa5e6X8= +k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655/go.mod h1:nL6pwRT8NgfF8TT68DBI8uEePRt89cSvoXUVqbkWHq4= +k8s.io/apimachinery v0.0.0-20191025225532-af6325b3a843/go.mod h1:gA1T9z4LIup7PIegBwxkF2UYXUNVKhOAPvQWWnAc34k= +k8s.io/apimachinery v0.0.0-20191115015347-3c7067801da2/go.mod h1:dXFS2zaQR8fyzuvRdJDHw2Aerij/yVGJSre0bZQSVJA= +k8s.io/apimachinery v0.16.4/go.mod h1:llRdnznGEAqC3DcNm6yEj472xaFVfLM7hnYofMb12tQ= +k8s.io/apimachinery v0.16.5-beta.1/go.mod h1:llRdnznGEAqC3DcNm6yEj472xaFVfLM7hnYofMb12tQ= +k8s.io/apimachinery v0.16.7/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE= +k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +k8s.io/apimachinery v0.17.1/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +k8s.io/apimachinery v0.17.3/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= +k8s.io/apimachinery v0.17.4/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= +k8s.io/apimachinery v0.17.6 h1:P0MNfucrmKLPsOSRbhDuG0Tplrpg7hVY4fJHh5sUIUw= +k8s.io/apimachinery v0.17.6/go.mod h1:Lg8zZ5iC/O8UjCqW6DNhcQG2m4TdjF9kwG3891OWbbA= +k8s.io/apiserver v0.0.0-20190820102802-2de2c9b11bd7/go.mod h1:EohyHq2b/PKi9X08om2dBy/o/zQofaYMG9cz9B3TdyU= +k8s.io/apiserver v0.0.0-20190918160949-bfa5e2e684ad/go.mod h1:XPCXEwhjaFN29a8NldXA901ElnKeKLrLtREO9ZhFyhg= +k8s.io/apiserver v0.0.0-20190918200908-1e17798da8c1/go.mod h1:4FuDU+iKPjdsdQSN3GsEKZLB/feQsj1y9dhhBDVV2Ns= +k8s.io/apiserver v0.16.4/go.mod h1:kbLJOak655g6W7C+muqu1F76u9wnEycfKMqbVaXIdAc= +k8s.io/apiserver v0.16.7/go.mod h1:/5zSatF30/L9zYfMTl55jzzOnx7r/gGv5a5wtRp8yAw= +k8s.io/apiserver v0.17.0/go.mod h1:ABM+9x/prjINN6iiffRVNCBR2Wk7uY4z+EtEGZD48cg= +k8s.io/apiserver v0.17.2/go.mod h1:lBmw/TtQdtxvrTk0e2cgtOxHizXI+d0mmGQURIHQZlo= +k8s.io/apiserver v0.17.3/go.mod h1:iJtsPpu1ZpEnHaNawpSV0nYTGBhhX2dUlnn7/QS7QiY= +k8s.io/apiserver v0.17.4/go.mod h1:5ZDQ6Xr5MNBxyi3iUZXS84QOhZl+W7Oq2us/29c0j9I= +k8s.io/apiserver v0.17.6/go.mod h1:sAYqm8hUDNA9aj/TzqwsJoExWrxprKv0tqs/z88qym0= k8s.io/autoscaler v0.0.0-20190607113959-1b4f1855cb8e/go.mod h1:QEXezc9uKPT91dwqhSJq3GNI3B1HxFRQHiku9kmrsSA= -k8s.io/cli-runtime v0.0.0-20191016114015-74ad18325ed5/go.mod h1:sDl6WKSQkDM6zS1u9F49a0VooQ3ycYFBFLqd2jf2Xfo= -k8s.io/client-go v0.0.0-20191016111102-bec269661e48 h1:C2XVy2z0dV94q9hSSoCuTPp1KOG7IegvbdXuz9VGxoU= -k8s.io/client-go v0.0.0-20191016111102-bec269661e48/go.mod h1:hrwktSwYGI4JK+TJA3dMaFyyvHVi/aLarVHpbs8bgCU= -k8s.io/cloud-provider v0.0.0-20191016115326-20453efc2458/go.mod h1:O5SO5xcgxrjJV9EC9R/47RuBpbk5YX9URDBlg++FA5o= -k8s.io/cluster-bootstrap v0.0.0-20191016115129-c07a134afb42/go.mod h1:MzCL6kLExQuHruGaqibd8cugC8nw8QRxm3+lzR5l8SI= -k8s.io/code-generator v0.0.0-20191004115455-8e001e5d1894/go.mod h1:mJUgkl06XV4kstAnLHAIzJPVCOzVR+ZcfPIv4fUsFCY= -k8s.io/component-base v0.0.0-20191016111319-039242c015a9/go.mod h1:SuWowIgd/dtU/m/iv8OD9eOxp3QZBBhTIiWMsBQvKjI= -k8s.io/cri-api v0.0.0-20190828162817-608eb1dad4ac/go.mod h1:BvtUaNBr0fEpzb11OfrQiJLsLPtqbmulpo1fPwcpP6Q= -k8s.io/csi-translation-lib v0.0.0-20191016115521-756ffa5af0bd/go.mod h1:lf1VBseeLanBpSXD0N9tuPx1ylI8sA0j6f+rckCKiIk= +k8s.io/cli-runtime v0.17.2/go.mod h1:aa8t9ziyQdbkuizkNLAw3qe3srSyWh9zlSB7zTqRNPI= +k8s.io/cli-runtime v0.17.3/go.mod h1:X7idckYphH4SZflgNpOOViSxetiMj6xI0viMAjM81TA= +k8s.io/cli-runtime v0.17.4/go.mod h1:IVW4zrKKx/8gBgNNkhiUIc7nZbVVNhc1+HcQh+PiNHc= +k8s.io/client-go v0.17.6 h1:W/JkbAcIZUPb9vENRTC75ymjQQO3qEJAZyYhOIEOifM= +k8s.io/client-go v0.17.6/go.mod h1:tX5eAbQR/Kbqv+5R93rzHQoyRnPjjW2mm9i0lXnW218= +k8s.io/cloud-provider v0.17.0/go.mod h1:Ze4c3w2C0bRsjkBUoHpFi+qWe3ob1wI2/7cUn+YQIDE= +k8s.io/cloud-provider v0.17.4/go.mod h1:XEjKDzfD+b9MTLXQFlDGkk6Ho8SGMpaU8Uugx/KNK9U= +k8s.io/code-generator v0.0.0-20190311093542-50b561225d70/go.mod h1:MYiN+ZJZ9HkETbgVZdWw2AsuAi9PZ4V80cwfuf2axe8= +k8s.io/code-generator v0.0.0-20190612205613-18da4a14b22b/go.mod h1:G8bQwmHm2eafm5bgtX67XDZQ8CWKSGu9DekI+yN4Y5I= +k8s.io/code-generator v0.0.0-20190820100531-4a676795660b/go.mod h1:cGLmodO4Xf0bnfw8/mLEXWYjiT5N9RFA9NzrYzP8VhM= +k8s.io/code-generator v0.0.0-20190831074504-732c9ca86353/go.mod h1:V5BD6M4CyaN5m+VthcclXWsVcT1Hu+glwa1bi3MIsyE= +k8s.io/code-generator v0.0.0-20190912054826-cd179ad6a269/go.mod h1:V5BD6M4CyaN5m+VthcclXWsVcT1Hu+glwa1bi3MIsyE= +k8s.io/code-generator v0.16.4/go.mod h1:mJUgkl06XV4kstAnLHAIzJPVCOzVR+ZcfPIv4fUsFCY= +k8s.io/code-generator v0.16.7/go.mod h1:wFdrXdVi/UC+xIfLi+4l9elsTT/uEF61IfcN2wOLULQ= +k8s.io/code-generator v0.17.0/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= +k8s.io/code-generator v0.17.1/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= +k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= +k8s.io/code-generator v0.17.3/go.mod h1:l8BLVwASXQZTo2xamW5mQNFCe1XPiAesVq7Y1t7PiQQ= +k8s.io/code-generator v0.17.4/go.mod h1:l8BLVwASXQZTo2xamW5mQNFCe1XPiAesVq7Y1t7PiQQ= +k8s.io/code-generator v0.17.6/go.mod h1:iiHz51+oTx+Z9D0vB3CH3O4HDDPWrvZyUgUYaIE9h9M= +k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= +k8s.io/component-base v0.0.0-20190820102445-1391c9d535ae/go.mod h1:1+cN3+FO5lQOzpBhBsFmxSIJpCAcD9kEEZnUIaKuOGE= +k8s.io/component-base v0.0.0-20190918160511-547f6c5d7090/go.mod h1:933PBGtQFJky3TEwYx4aEPZ4IxqhWh3R6DCmzqIn1hA= +k8s.io/component-base v0.0.0-20190918200425-ed2f0867c778/go.mod h1:DFWQCXgXVLiWtzFaS17KxHdlUeUymP7FLxZSkmL9/jU= +k8s.io/component-base v0.16.4/go.mod h1:GYQ+4hlkEwdlpAp59Ztc4gYuFhdoZqiAJD1unYDJ3FM= +k8s.io/component-base v0.16.7/go.mod h1:ikdyfezOFMu5O0qJjy/Y9eXwj+fV3pVwdmt0ulVcIR0= +k8s.io/component-base v0.17.0/go.mod h1:rKuRAokNMY2nn2A6LP/MiwpoaMRHpfRnrPaUJJj1Yoc= +k8s.io/component-base v0.17.2/go.mod h1:zMPW3g5aH7cHJpKYQ/ZsGMcgbsA/VyhEugF3QT1awLs= +k8s.io/component-base v0.17.3/go.mod h1:GeQf4BrgelWm64PXkIXiPh/XS0hnO42d9gx9BtbZRp8= +k8s.io/component-base v0.17.4/go.mod h1:5BRqHMbbQPm2kKu35v3G+CpVq4K0RJKC7TRioF0I9lE= +k8s.io/component-base v0.17.6/go.mod h1:jgRLWl0B0rOzFNtxQ9E4BphPmDqoMafujdau6AdG2Xo= +k8s.io/csi-translation-lib v0.17.0/go.mod h1:HEF7MEz7pOLJCnxabi45IPkhSsE/KmxPQksuCrHKWls= +k8s.io/csi-translation-lib v0.17.4/go.mod h1:CsxmjwxEI0tTNMzffIAcgR9lX4wOh6AKHdxQrT7L0oo= +k8s.io/gengo v0.0.0-20190116091435-f8a0810f38af/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190306031000-7a1b7fb0289f/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190327210449-e17681d19d3a/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190813173942-955ffa8fcfc9/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20191010091904-7fa3014cb28f/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20191108084044-e500ee069b5c/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM= -k8s.io/helm v2.16.1+incompatible h1:L+k810plJlaGWEw1EszeT4deK8XVaKxac1oGcuB+WDc= -k8s.io/helm v2.16.1+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI= +k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200205140755-e0e292d8aa12/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/helm v2.16.3+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.1.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.3/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-aggregator v0.0.0-20191016112429-9587704a8ad4/go.mod h1:+aW0UZgSXdTSHTIFnWnueEuXjOqerDUxGIw6Ygr+vYY= -k8s.io/kube-controller-manager v0.0.0-20191016114939-2b2b218dc1df/go.mod h1:WgrTcPKYAfNa9C0LV1UeK+XqfbSOUH1WGq/vX5UiW40= +k8s.io/kube-aggregator v0.17.3/go.mod h1:1dMwMFQbmH76RKF0614L7dNenMl3dwnUJuOOyZ3GMXA= +k8s.io/kube-openapi v0.0.0-20180629012420-d83b052f768a/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= +k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190320154901-5e45bb682580/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190603182131-db7b694dc208/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20190918143330-0270cf2f1c1d/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-proxy v0.0.0-20191016114407-2e83b6f20229/go.mod h1:2Hxci1uzXO5ipP0h9n2+h18fvNkBTpYlckk5dOPu8zg= -k8s.io/kube-scheduler v0.0.0-20191016114748-65049c67a58b/go.mod h1:BgDUHHC5Wl0xcBUQgo2XEprE5nG5i9tlRR4iNgEFbL0= +k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29 h1:NeQXVJ2XFSkRoPzRo8AId01ZER+j8oV4SZADT4iBOXQ= +k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= k8s.io/kube-state-metrics v1.7.2 h1:6vdtgXrrRRMSgnyDmgua+qvgCYv954JNfxXAtDkeLVQ= k8s.io/kube-state-metrics v1.7.2/go.mod h1:U2Y6DRi07sS85rmVPmBFlmv+2peBcL8IWGjM+IjYA/E= -k8s.io/kubectl v0.0.0-20191016120415-2ed914427d51/go.mod h1:gL826ZTIfD4vXTGlmzgTbliCAT9NGiqpCqK2aNYv5MQ= -k8s.io/kubelet v0.0.0-20191016114556-7841ed97f1b2/go.mod h1:SBvrtLbuePbJygVXGGCMtWKH07+qrN2dE1iMnteSG8E= -k8s.io/kubernetes v1.16.0/go.mod h1:nlP2zevWKRGKuaaVbKIwozU0Rjg9leVDXkL4YTtjmVs= -k8s.io/kubernetes v1.16.2/go.mod h1:SmhGgKfQ30imqjFVj8AI+iW+zSyFsswNErKYeTfgoH0= -k8s.io/legacy-cloud-providers v0.0.0-20191016115753-cf0698c3a16b h1:cgLCVtQnxjALxIUjjEkiMaKlQZW5sGj6P3+3K5Y/d+8= -k8s.io/legacy-cloud-providers v0.0.0-20191016115753-cf0698c3a16b/go.mod h1:tKW3pKqdRW8pMveUTpF5pJuCjQxg6a25iLo+Z9BXVH0= -k8s.io/metrics v0.0.0-20191016113814-3b1a734dba6e/go.mod h1:ve7/vMWeY5lEBkZf6Bt5TTbGS3b8wAxwGbdXAsufjRs= -k8s.io/repo-infra v0.0.0-20181204233714-00fe14e3d1a3/go.mod h1:+G1xBfZDfVFsm1Tj/HNCvg4QqWx8rJ2Fxpqr1rqp/gQ= -k8s.io/sample-apiserver v0.0.0-20191016112829-06bb3c9d77c9/go.mod h1:sXltHZrQa4jdKL14nOFRRUhhzpmbnRF0qGuAhRQbaxc= +k8s.io/kubectl v0.17.2/go.mod h1:y4rfLV0n6aPmvbRCqZQjvOp3ezxsFgpqL+zF5jH/lxk= +k8s.io/kubectl v0.17.3/go.mod h1:NUn4IBY7f7yCMwSop2HCXlw/MVYP4HJBiUmOR3n9w28= +k8s.io/kubectl v0.17.4/go.mod h1:im5QWmh6fvtmJkkNm4HToLe8z9aM3jihYK5X/wOybcY= +k8s.io/kubernetes v1.11.10/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/kubernetes v1.14.7/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/legacy-cloud-providers v0.17.0/go.mod h1:DdzaepJ3RtRy+e5YhNtrCYwlgyK87j/5+Yfp0L9Syp8= +k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js= +k8s.io/metrics v0.17.2/go.mod h1:3TkNHET4ROd+NfzNxkjoVfQ0Ob4iZnaHmSEA4vYpwLw= +k8s.io/metrics v0.17.3/go.mod h1:HEJGy1fhHOjHggW9rMDBJBD3YuGroH3Y1pnIRw9FFaI= +k8s.io/metrics v0.17.4/go.mod h1:6rylW2iD3M9VppnEAAtJASY1XS8Pt9tcYh+tHxBeV3I= +k8s.io/test-infra v0.0.0-20181019233642-2e10a0bbe9b3/go.mod h1:2NzXB13Ji0nqpyublHeiPC4FZwU0TknfvyaaNfl/BTA= +k8s.io/test-infra v0.0.0-20191212060232-70b0b49fe247/go.mod h1:d8SKryJBXAwfCFVL4wieRez47J2NOOAb9d029sWLseQ= +k8s.io/test-infra v0.0.0-20200407001919-bc7f71ef65b8/go.mod h1:/WpJWcaDvuykB322WXP4kJbX8IpalOzuPxA62GpwkJk= +k8s.io/utils v0.0.0-20181019225348-5e321f9a457c/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= +k8s.io/utils v0.0.0-20190221042446-c2654d5206da/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= k8s.io/utils v0.0.0-20190308190857-21c4ce38f2a7/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= +k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20190907131718-3d4f5b7dea0b/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191010214722-8d271d903fe4 h1:Gi+/O1saihwDqnlmC8Vhv1M5Sp4+rbOmK9TbsLn8ZEA= k8s.io/utils v0.0.0-20191010214722-8d271d903fe4/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200124190032-861946025e34 h1:HjlUD6M0K3P8nRXmr2B9o4F9dUy9TCj/aEpReeyi6+k= +k8s.io/utils v0.0.0-20200124190032-861946025e34/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= knative.dev/caching v0.0.0-20190719140829-2032732871ff/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg= +knative.dev/caching v0.0.0-20200122154023-853d6022845c/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg= +knative.dev/caching v0.0.0-20200521155757-e78d17bc250e/go.mod h1:bsKPIG2XZFYL8uw5BAxg7EMBLp0vNpu9jZIGus8HUPU= +knative.dev/eventing v0.14.1-0.20200428210242-f355830c4d70/go.mod h1:rp45uCtr+TJLGsMRN8nRH15jFnDR7S59i0qyQpdaHOY= knative.dev/eventing-contrib v0.6.1-0.20190723221543-5ce18048c08b/go.mod h1:SnXZgSGgMSMLNFTwTnpaOH7hXDzTFtw0J8OmHflNx3g= +knative.dev/operator v0.15.0 h1:06IBLQEJPMF3Op9/BvQKiHm9tcgqpRMQpDqiDh3ObQ4= +knative.dev/operator v0.15.0/go.mod h1:7b3+hMnQscJc8llT9ax0YyBr0r136+2St2Df3MymJkE= +knative.dev/pkg v0.0.0-20191101194912-56c2594e4f11/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q= knative.dev/pkg v0.0.0-20191111150521-6d806b998379 h1:0IbJWfv82eUhoNymvIrTjxVqrAURRK1x39+//IZV7Cc= knative.dev/pkg v0.0.0-20191111150521-6d806b998379/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q= +knative.dev/pkg v0.0.0-20200428194351-90fc61bae7f7/go.mod h1:o+e8OVEJKIuvXPsGVPIautjXgs05xbos7G+QMRjuUps= +knative.dev/pkg v0.0.0-20200505191044-3da93ebb24c2/go.mod h1:Q6sL35DdGs8hIQZKdaCXJGgY8f90BmNBKSb8z6d/BTM= +knative.dev/pkg v0.0.0-20200515002500-16d7b963416f/go.mod h1:tMOHGbxtRz8zYFGEGpV/bpoTEM1o89MwYFC4YJXl3GY= +knative.dev/pkg v0.0.0-20200519155757-14eb3ae3a5a7/go.mod h1:QgNZTxnwpB/oSpNcfnLVlw+WpEwwyKAvJlvR3hgeltA= +knative.dev/pkg v0.0.0-20200528142800-1c6815d7e4c9 h1:bN9gghp5Osuw1bgKrvMaA+oiAvPuYmzSbRo54/EFSxI= +knative.dev/pkg v0.0.0-20200528142800-1c6815d7e4c9/go.mod h1:QgNZTxnwpB/oSpNcfnLVlw+WpEwwyKAvJlvR3hgeltA= +knative.dev/serving v0.15.1 h1:QU73BFJezlUPtWWL8yslv7qpMNq8GlcKdAscHHpms5s= +knative.dev/serving v0.15.1/go.mod h1:M8e9RHN3SfC18iEhRso2nj0YjIv3N8poTpSZgfQRfZM= +knative.dev/test-infra v0.0.0-20200407185800-1b88cb3b45a5/go.mod h1:xcdUkMJrLlBswIZqL5zCuBFOC22WIPMQoVX1L35i0vQ= +knative.dev/test-infra v0.0.0-20200505052144-5ea2f705bb55/go.mod h1:WqF1Azka+FxPZ20keR2zCNtiQA1MP9ZB4BH4HuI+SIU= +knative.dev/test-infra v0.0.0-20200513011557-d03429a76034/go.mod h1:aMif0KXL4g19YCYwsy4Ocjjz5xgPlseYV+B95Oo4JGE= +knative.dev/test-infra v0.0.0-20200519015156-82551620b0a9/go.mod h1:A5b2OAXTOeHT3hHhVQm3dmtbuWvIDP7qzgtqxA3/2pE= +knative.dev/test-infra v0.0.0-20200519161858-554a95a37986/go.mod h1:LeNa1Wvn47efeQUkpkn3XG7Fx9Ga+rhAP13SZyjaEGg= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +mvdan.cc/xurls/v2 v2.0.0/go.mod h1:2/webFPYOXN9jp/lzuj0zuAVlF+9g4KPFJANH1oJhRU= pack.ag/amqp v0.11.0/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= +pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/letsencrypt v0.0.1/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= +rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= +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/controller-runtime v0.1.12/go.mod h1:HFAYoOh6XMV+jKF1UjFwrknPbowfyHEHHRdJMf2jMX8= -sigs.k8s.io/controller-runtime v0.4.0 h1:wATM6/m+3w8lj8FXNaO6Fs/rq/vqoOjO1Q116Z9NPsg= -sigs.k8s.io/controller-runtime v0.4.0/go.mod h1:ApC79lpY3PHW9xj/w9pj+lYkLgwAAUZwfXkME1Lajns= +sigs.k8s.io/controller-runtime v0.3.0/go.mod h1:Cw6PkEg0Sa7dAYovGT4R0tRkGhHXpYijwNxYhAnAZZk= +sigs.k8s.io/controller-runtime v0.5.0/go.mod h1:REiJzC7Y00U+2YkMbT8wxgrsX5USpXKGhb2sCtAXiT8= +sigs.k8s.io/controller-runtime v0.5.2/go.mod h1:JZUwSMVbxDupo0lTJSSFP5pimEyxGynROImSsqIOx1A= +sigs.k8s.io/controller-runtime v0.5.3 h1:HGL1kpWxe6WiiN4yCmYA5SFtvUMQAkOwV+Ylh7M87E4= +sigs.k8s.io/controller-runtime v0.5.3/go.mod h1:JZUwSMVbxDupo0lTJSSFP5pimEyxGynROImSsqIOx1A= sigs.k8s.io/controller-tools v0.1.10/go.mod h1:6g08p9m9G/So3sBc1AOQifHfhxH/mb6Sc4z0LMI8XMw= sigs.k8s.io/controller-tools v0.2.4/go.mod h1:m/ztfQNocGYBgTTCmFdnK94uVvgxeZeE3LtJvd/jIzA= +sigs.k8s.io/controller-tools v0.2.8/go.mod h1:9VKHPszmf2DHz/QmHkcfZoewO6BL7pPs9uAiBVsaJSE= sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= +sigs.k8s.io/structured-merge-diff v0.0.0-20190302045857-e85c7b244fd2/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v0.0.0-20190724202554-0c1d754dd648/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= -sigs.k8s.io/testing_frameworks v0.1.2 h1:vK0+tvjF0BZ/RYFeZ1E6BYBwHJJXhjuZ3TdsEKH+UQM= -sigs.k8s.io/testing_frameworks v0.1.2/go.mod h1:ToQrwSC3s8Xf/lADdZp3Mktcql9CG0UAmdJG9th5i0w= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= +sigs.k8s.io/structured-merge-diff v1.0.1/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= +sigs.k8s.io/structured-merge-diff v1.0.2/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= +sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= +vbom.ml/util v0.0.0-20180919145318-efcd4e0f9787/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= diff --git a/pkg/controller/kabaneroplatform/cli.go b/pkg/controller/kabaneroplatform/cli.go index d40a5f24..f04e1652 100644 --- a/pkg/controller/kabaneroplatform/cli.go +++ b/pkg/controller/kabaneroplatform/cli.go @@ -173,7 +173,7 @@ func processTransformation(k *kabanerov1alpha2.Kabanero, manifest mf.Manifest, p return nil, err } - return manifestTrasformed, nil + return &manifestTrasformed, nil } // Tries to see if the CLI route has been assigned a hostname. diff --git a/pkg/controller/kabaneroplatform/serverless.go b/pkg/controller/kabaneroplatform/serverless.go index cdd8e61e..be393707 100644 --- a/pkg/controller/kabaneroplatform/serverless.go +++ b/pkg/controller/kabaneroplatform/serverless.go @@ -8,7 +8,7 @@ import ( "github.com/go-logr/logr" kabanerov1alpha2 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha2" - knsv1alpha1 "github.com/knative/serving-operator/pkg/apis/serving/v1alpha1" + knsv1alpha1 "knative.dev/operator/pkg/apis/operator/v1alpha1" olmapiv1alpha1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" From 9f95bbddbf586f4f57eec151012ef35c08197a0a Mon Sep 17 00:00:00 2001 From: kaczyns Date: Thu, 11 Jun 2020 15:54:12 -0400 Subject: [PATCH 11/15] v0.9.1 --- config/samples/default.yaml | 4 ++-- config/samples/full.yaml | 14 +++++++------- config/versions.yaml | 10 +++++----- ...nero-operator.v0.9.1.clusterserviceversion.yaml | 8 ++++---- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/config/samples/default.yaml b/config/samples/default.yaml index cec1980e..ec06b418 100644 --- a/config/samples/default.yaml +++ b/config/samples/default.yaml @@ -11,6 +11,6 @@ spec: url: https://github.com/kabanero-io/kabanero-stack-hub/releases/download/0.9.0/kabanero-stack-hub-index.yaml pipelines: - id: default - sha256: 1348e90cc3269b6e65837f71011bef6f0dc662781a41442cb5ce3714cb91b890 + sha256: deb5162495e1fe60ab52632f0879f9c9b95e943066590574865138791cbe948f https: - url: https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1-rc.2/default-kabanero-pipelines.tar.gz + url: https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1/default-kabanero-pipelines.tar.gz diff --git a/config/samples/full.yaml b/config/samples/full.yaml index 0feb8240..2f751b02 100644 --- a/config/samples/full.yaml +++ b/config/samples/full.yaml @@ -16,14 +16,14 @@ spec: cliServices: # Overrides the setting for version on this component - version: "0.9.0" + version: "0.9.1" # Overrides the image as a separate repository or tag repository: kabanero/kabanero-command-line-services - tag: "0.9.0" + tag: "0.9.1" # Overrides the image uri - image: kabanero/kabanero-command-line-services:0.9.0 + image: kabanero/kabanero-command-line-services:0.9.1 # Indicates the token expiration time # Specify a positive integer followed by a unit of time, which can be hours (h), minutes (m), or seconds (s). @@ -120,16 +120,16 @@ spec: url: https://github.com/kabanero-io/kabanero-stack-hub/releases/download/0.9.0/kabanero-stack-hub-index.yaml pipelines: - id: default - sha256: 1348e90cc3269b6e65837f71011bef6f0dc662781a41442cb5ce3714cb91b890 + sha256: deb5162495e1fe60ab52632f0879f9c9b95e943066590574865138791cbe948f https: - url: https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1-rc.2/default-kabanero-pipelines.tar.gz + url: https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1/default-kabanero-pipelines.tar.gz gitops: pipelines: - id: gitops - sha256: 2b0f31cfb31f49454e68542deb301a98c409d8c2a233c6b8a32eb476090c2cd6 + sha256: 7996bf29f338f8154e9c7db977833bf33d0a6d4e228109fab411d3b38ed4b99e https: - url: https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1-rc.2/kabanero-gitops-pipelines.tar.gz + url: https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1/kabanero-gitops-pipelines.tar.gz governancePolicy: # Provide governance configuration for all stacks managed by Kabanero. The allowed configuration policies are: diff --git a/config/versions.yaml b/config/versions.yaml index d73e2101..d9935ad2 100644 --- a/config/versions.yaml +++ b/config/versions.yaml @@ -15,7 +15,7 @@ default: "0.9.1" kabanero: - version: "0.9.1" related-versions: - cli-services: "0.9.0" + cli-services: "0.9.1" landing: "0.9.0" events: "0.9.0" collection-controller: "0.9.1" @@ -103,11 +103,11 @@ related-software: tag: "0.6.0" cli-services: - - version: "go-prototype" - orchestrations: "orchestrations/cli-services/0.3" + - version: "0.9.1" + orchestrations: "orchestrations/cli-services/0.2" identifiers: - repository: "davco01a/kabanero-command-line-services" - tag: "latest" + repository: "kabanero/kabanero-command-line-services" + tag: "0.9.1" - version: "0.9.0" orchestrations: "orchestrations/cli-services/0.2" identifiers: diff --git a/registry/manifests/kabanero-operator/0.9.1/kabanero-operator.v0.9.1.clusterserviceversion.yaml b/registry/manifests/kabanero-operator/0.9.1/kabanero-operator.v0.9.1.clusterserviceversion.yaml index fab7bd2d..34a7f5b0 100644 --- a/registry/manifests/kabanero-operator/0.9.1/kabanero-operator.v0.9.1.clusterserviceversion.yaml +++ b/registry/manifests/kabanero-operator/0.9.1/kabanero-operator.v0.9.1.clusterserviceversion.yaml @@ -35,9 +35,9 @@ metadata: "pipelines": [ { "id": "default", - "sha256": "1348e90cc3269b6e65837f71011bef6f0dc662781a41442cb5ce3714cb91b890", + "sha256": "deb5162495e1fe60ab52632f0879f9c9b95e943066590574865138791cbe948f", "https": { - "url": "https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1-rc.2/default-kabanero-pipelines.tar.gz" + "url": "https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1/default-kabanero-pipelines.tar.gz" } } ] @@ -68,9 +68,9 @@ metadata: { "version": "0.2.11", "pipelines": [ { "id": "default", - "sha256": "1348e90cc3269b6e65837f71011bef6f0dc662781a41442cb5ce3714cb91b890", + "sha256": "deb5162495e1fe60ab52632f0879f9c9b95e943066590574865138791cbe948f", "https": { - "url": "https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1-rc.2/default-kabanero-pipelines.tar.gz" + "url": "https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1/default-kabanero-pipelines.tar.gz" } } ], From 2f0ee45c0a498c57d8176f30b82007a86e568244 Mon Sep 17 00:00:00 2001 From: kaczyns Date: Tue, 16 Jun 2020 11:59:16 -0400 Subject: [PATCH 12/15] Remove collection controller objects after upgrade --- deploy/crds/kabanero.io_kabaneros_crd.yaml | 1 + .../kabaneroplatform_controller.go | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/deploy/crds/kabanero.io_kabaneros_crd.yaml b/deploy/crds/kabanero.io_kabaneros_crd.yaml index ae2c7a2d..b01128b3 100644 --- a/deploy/crds/kabanero.io_kabaneros_crd.yaml +++ b/deploy/crds/kabanero.io_kabaneros_crd.yaml @@ -993,6 +993,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: set ready: type: string type: object diff --git a/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go b/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go index c616038f..20fc6407 100644 --- a/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go +++ b/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go @@ -11,6 +11,9 @@ import ( "github.com/go-logr/logr" kabanerov1alpha2 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha2" "github.com/kabanero-io/kabanero-operator/pkg/controller/utils/timer" + "github.com/kabanero-io/kabanero-operator/pkg/versioning" + mfc "github.com/manifestival/controller-runtime-client" + mf "github.com/manifestival/manifestival" "github.com/operator-framework/operator-sdk/pkg/k8sutil" appsv1 "k8s.io/api/apps/v1" @@ -347,6 +350,10 @@ func (r *ReconcileKabanero) Reconcile(request reconcile.Request) (reconcile.Resu return reconcile.Result{}, err } + // Collections are no longer supported. Remove any objects that were used by + // the collection controller. + cleanupCollectionController(ctx, instance, r.client, reqLogger) + // Wait for the admission controller webhook to be ready before we try // to deploy the featured stacks. isAdmissionControllerWebhookReady, _ := getAdmissionControllerWebhookStatus(instance, r.client, reqLogger) @@ -582,3 +589,46 @@ func initializeDependencies(k *kabanerov1alpha2.Kabanero) { // Codeready-workspaces initialization. initializeCRW(k) } + +// Cleanup the collection controller (used in past releases) +func cleanupCollectionController(ctx context.Context, k *kabanerov1alpha2.Kabanero, cl client.Client, reqLogger logr.Logger) { + // Easiest thing to do is probably to load the orchestration and delete everything. + orchestrationPath := "orchestrations/collection-controller/0.1" + templateContext := make(map[string]interface{}) + templateContext["instance"] = "nil" + templateContext["version"] = "nil" + templateContext["image"] = "nil:nil" + templateContext["name"] = "kabanero-" + k.GetNamespace() + "-trigger-rolebinding" + templateContext["kabaneroNamespace"] = k.GetNamespace() + rev := versioning.SoftwareRevision{Version: "nil", OrchestrationPath: orchestrationPath, Identifiers: templateContext} + + transformMap := make(map[string][]mf.Transformer) + transformMap["collection-controller.yaml"] = []mf.Transformer{mf.InjectNamespace(k.GetNamespace())} + transformMap["collection-controller-tekton.yaml"] = []mf.Transformer{} + for yaml, transforms := range transformMap { + f, err := rev.OpenOrchestration(yaml) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Unable to open %v orchestration", yaml)) + } else { + s, err := renderOrchestration(f, templateContext) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Unable to render %v orchestration", yaml)) + } else { + m, err := mf.ManifestFrom(mf.Reader(strings.NewReader(s)), mf.UseClient(mfc.NewClient(cl)), mf.UseLogger(reqLogger.WithName("manifestival"))) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Unable to load manifests for %v orchestration", yaml)) + } else { + mt, err := m.Transform(transforms...) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Unable to transform manifests for %v orchestration", yaml)) + } else { + err = mt.Delete() + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Unable to delete %v objects", yaml)) + } + } + } + } + } + } +} From 3834ad3faeb7047bd0eac272ea70bb5ede896fcd Mon Sep 17 00:00:00 2001 From: kaczyns Date: Tue, 16 Jun 2020 12:04:36 -0400 Subject: [PATCH 13/15] update readme to reflect operator-sdk version --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a907e902..33005ce0 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ We suggest you install from a [release](https://github.com/kabanero-io/kabanero- [![Build Status](https://travis-ci.org/kabanero-io/kabanero-operator.svg?branch=master)](https://travis-ci.org/kabanero-io/kabanero-operator) The Kabanero operator is developed using: -* `operator-sdk` version 0.16.0. +* `operator-sdk` version 0.17.1. * `go` version 1.13.x ## Clone the Kabanero operator @@ -17,7 +17,7 @@ git clone https://github.com/kabanero-io/kabanero-operator cd kabanero-operator ``` -# Quickstart - OpenShift Container Platform (OCP) 4.3 +# Quickstart - OpenShift Container Platform (OCP) 4.4 We recommend you follow the install instructions referenced above to set up your cluster for the first time. If you would rather set it up manually, please continue with the following steps: @@ -31,7 +31,7 @@ oc login -u admin -p admin https://openshift.my.com:8443/ ## Deploy Prerequisite operators: The following operators need to be installed at the cluster scope: -* [OpenShift Serverless Operator](https://docs.openshift.com/container-platform/4.3/serverless/installing-openshift-serverless.html) +* [OpenShift Serverless Operator](https://docs.openshift.com/container-platform/4.4/serverless/installing-openshift-serverless.html) * OpenShift Pipelines Operator (from community-operators) * Appsody Operator (from certified-operators) * Open Liberty Operator (from certified-operators) From f2706ebd77e07de1e60fb7c5aa713d7ef847dd35 Mon Sep 17 00:00:00 2001 From: kaczyns Date: Tue, 16 Jun 2020 12:24:56 -0400 Subject: [PATCH 14/15] Fold v0.9.1 CRD/CSV into v0.10.0 CSV --- ...perator.v0.10.0.clusterserviceversion.yaml | 12 +- ...operator.v0.9.1.clusterserviceversion.yaml | 13 +- .../0.9.1/kabanero.io_collections_crd.yaml | 215 ++++ .../0.9.1/kabanero.io_kabaneros_crd.yaml | 977 ++++++++++++++++++ .../0.9.1/kabanero.io_stacks_crd.yaml | 210 ++++ 5 files changed, 1419 insertions(+), 8 deletions(-) create mode 100644 registry/manifests/kabanero-operator/0.9.1/kabanero.io_collections_crd.yaml create mode 100644 registry/manifests/kabanero-operator/0.9.1/kabanero.io_kabaneros_crd.yaml create mode 100644 registry/manifests/kabanero-operator/0.9.1/kabanero.io_stacks_crd.yaml diff --git a/registry/manifests/kabanero-operator/0.10.0/kabanero-operator.v0.10.0.clusterserviceversion.yaml b/registry/manifests/kabanero-operator/0.10.0/kabanero-operator.v0.10.0.clusterserviceversion.yaml index 04fa6927..fc035db5 100644 --- a/registry/manifests/kabanero-operator/0.10.0/kabanero-operator.v0.10.0.clusterserviceversion.yaml +++ b/registry/manifests/kabanero-operator/0.10.0/kabanero-operator.v0.10.0.clusterserviceversion.yaml @@ -28,16 +28,16 @@ metadata: { "name": "incubator", "https": { - "url": "https://github.com/kabanero-io/kabanero-stack-hub/releases/download/0.9.0-rc.1/kabanero-stack-hub-index.yaml" + "url": "https://github.com/kabanero-io/kabanero-stack-hub/releases/download/0.9.0/kabanero-stack-hub-index.yaml" } } ], "pipelines": [ { "id": "default", - "sha256": "850dfa631d957ba66978a4701dc08b8bd41cc9ca52c0cde8344941032354a770", + "sha256": "deb5162495e1fe60ab52632f0879f9c9b95e943066590574865138791cbe948f", "https": { - "url": "https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.0-rc.2/default-kabanero-pipelines.tar.gz" + "url": "https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1/default-kabanero-pipelines.tar.gz" } } ] @@ -56,9 +56,9 @@ metadata: { "version": "0.2.11", "pipelines": [ { "id": "default", - "sha256": "850dfa631d957ba66978a4701dc08b8bd41cc9ca52c0cde8344941032354a770", + "sha256": "deb5162495e1fe60ab52632f0879f9c9b95e943066590574865138791cbe948f", "https": { - "url": "https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.0-rc.2/default-kabanero-pipelines.tar.gz" + "url": "https://github.com/kabanero-io/kabanero-pipelines/releases/download/0.9.1/default-kabanero-pipelines.tar.gz" } } ], @@ -77,7 +77,7 @@ spec: apiservicedefinitions: {} maturity: alpha version: 0.10.0 - replaces: kabanero-operator.v0.9.0 + replaces: kabanero-operator.v0.9.1 displayName: Kabanero Operator description: | The Kabanero operator is used to manage Kabanero Foundation instances on your Open Shift or Kubernetes cluster. diff --git a/registry/manifests/kabanero-operator/0.9.1/kabanero-operator.v0.9.1.clusterserviceversion.yaml b/registry/manifests/kabanero-operator/0.9.1/kabanero-operator.v0.9.1.clusterserviceversion.yaml index 34a7f5b0..01c575b9 100644 --- a/registry/manifests/kabanero-operator/0.9.1/kabanero-operator.v0.9.1.clusterserviceversion.yaml +++ b/registry/manifests/kabanero-operator/0.9.1/kabanero-operator.v0.9.1.clusterserviceversion.yaml @@ -7,7 +7,7 @@ metadata: capabilities: Basic Install categories: "Integration & Delivery" certified: "false" - containerImage: kabanero/kabanero-operator:latest + containerImage: kabanero/kabanero-operator@sha256:26e3fa7765cdfb89610541528e9d8c4052a77a6e43254eb7c7513b4941711f4f createdAt: 2019-11-19T12:00:00.000-0500 description: Bringings together foundational open source technologies into a modern microservices-based framework. olm.skipRange: '>=0.6.1 <0.9.1' @@ -302,7 +302,7 @@ spec: fieldPath: metadata.name - name: OPERATOR_NAME value: kabanero-operator - image: kabanero/kabanero-operator:latest + image: kabanero/kabanero-operator@sha256:26e3fa7765cdfb89610541528e9d8c4052a77a6e43254eb7c7513b4941711f4f imagePullPolicy: Always name: kabanero-operator resources: {} @@ -332,3 +332,12 @@ spec: type: AllNamespaces provider: name: IBM + relatedImages: + - image: kabanero/kabanero-command-line-services:0.9.1 + name: cli-services-0.9.1 + - image: kabanero/landing:0.9.0 + name: landing-0.9.0 + - image: kabanero/events-operator:0.1.0 + name: events-0.9.0 + - image: kabanero/che-devfile-registry:0.11.0 + name: codeready-workspaces-0.9.0 diff --git a/registry/manifests/kabanero-operator/0.9.1/kabanero.io_collections_crd.yaml b/registry/manifests/kabanero-operator/0.9.1/kabanero.io_collections_crd.yaml new file mode 100644 index 00000000..927ba881 --- /dev/null +++ b/registry/manifests/kabanero-operator/0.9.1/kabanero.io_collections_crd.yaml @@ -0,0 +1,215 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: collections.kabanero.io +spec: + additionalPrinterColumns: + - JSONPath: .metadata.creationTimestamp + description: CreationTimestamp is a timestamp representing the server time when + this object was created. It is not guaranteed to be set in happens-before order + across separate operations. + name: Age + type: date + - JSONPath: .status.status + description: Collection status. + name: Status + type: string + group: kabanero.io + names: + kind: Collection + listKind: CollectionList + plural: collections + singular: collection + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + description: Collection is the Schema for the collections API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: CollectionSpec defines the desired composition of a Collection + properties: + desiredState: + type: string + name: + type: string + repositoryUrl: + type: string + skipCertVerification: + type: boolean + version: + type: string + versions: + items: + description: CollectionVersion defines the desired composition of + a specific collection version. + properties: + desiredState: + type: string + repositoryUrl: + type: string + skipCertVerification: + type: boolean + version: + type: string + type: object + type: array + x-kubernetes-list-type: set + type: object + status: + description: CollectionStatus defines the observed state of a collection + properties: + activeLocation: + type: string + activePipelines: + items: + description: PipelineStatus defines the observed state of the assets + located within a single pipeline .tar.gz. + properties: + activeAssets: + items: + description: RepositoryAssetStatus defines the observed state + of a single asset in a respository, in the collection. + properties: + assetDigest: + type: string + assetName: + type: string + group: + type: string + kind: + type: string + namespace: + type: string + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + x-kubernetes-list-type: set + digest: + type: string + name: + type: string + url: + type: string + required: + - digest + - name + - url + type: object + type: array + x-kubernetes-list-type: set + activeVersion: + type: string + availableLocation: + type: string + availableVersion: + type: string + images: + items: + description: Image defines a container image used by a collection + properties: + id: + type: string + image: + type: string + type: object + type: array + x-kubernetes-list-type: set + status: + type: string + statusMessage: + type: string + versions: + items: + description: CollectionVersionStatus defines the observed state of + a specific collection version. + properties: + images: + items: + description: Image defines a container image used by a collection + properties: + id: + type: string + image: + type: string + type: object + type: array + x-kubernetes-list-type: set + location: + type: string + pipelines: + items: + description: PipelineStatus defines the observed state of the + assets located within a single pipeline .tar.gz. + properties: + activeAssets: + items: + description: RepositoryAssetStatus defines the observed + state of a single asset in a respository, in the collection. + properties: + assetDigest: + type: string + assetName: + type: string + group: + type: string + kind: + type: string + namespace: + type: string + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + x-kubernetes-list-type: set + digest: + type: string + name: + type: string + url: + type: string + required: + - digest + - name + - url + type: object + type: array + x-kubernetes-list-type: set + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + x-kubernetes-list-type: set + type: object + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true diff --git a/registry/manifests/kabanero-operator/0.9.1/kabanero.io_kabaneros_crd.yaml b/registry/manifests/kabanero-operator/0.9.1/kabanero.io_kabaneros_crd.yaml new file mode 100644 index 00000000..bbb58bb7 --- /dev/null +++ b/registry/manifests/kabanero-operator/0.9.1/kabanero.io_kabaneros_crd.yaml @@ -0,0 +1,977 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: kabaneros.kabanero.io +spec: + additionalPrinterColumns: + - JSONPath: .metadata.creationTimestamp + description: CreationTimestamp is a timestamp representing the server time when + this object was created. It is not guaranteed to be set in happens-before order + across separate operations. + name: Age + type: date + - JSONPath: .status.kabaneroInstance.version + description: Kabanero operator instance version. + name: Version + type: string + - JSONPath: .status.kabaneroInstance.ready + description: Kabanero operator instance readiness status. The status is directly + correlated to the availability of the operator's resources dependencies. + name: Ready + type: string + group: kabanero.io + names: + kind: Kabanero + listKind: KabaneroList + plural: kabaneros + singular: kabanero + scope: Namespaced + subresources: + status: {} + version: v1alpha1 + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: KabaneroSpec defines the desired state of Kabanero + properties: + admissionControllerWebhook: + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + che: + description: CheCustomizationSpec defines customization entries for + Che. + properties: + cheOperatorInstance: + description: CheOperatorInstanceSpec defines customization entries + for the Che operator instance. + properties: + cheWorkspaceClusterRole: + type: string + type: object + enable: + type: boolean + kabaneroChe: + description: KabaneroCheSpec defines customization entries for + Kabanero Che. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + type: object + cliServices: + description: KabaneroCliServicesCustomizationSpec defines customization + entries for the Kabanero CLI. + properties: + image: + type: string + repository: + type: string + sessionExpirationSeconds: + type: string + tag: + type: string + version: + description: 'Future: Enable bool `json:"enable,omitempty"`' + type: string + type: object + collectionController: + description: CollectionControllerSpec defines customization entried + for the Kabanero collection controller. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + collections: + description: InstanceCollectionConfig defines the customization entries + for a set of collections. + properties: + repositories: + items: + description: RepositoryConfig defines customization entries + for a collection. + properties: + activateDefaultCollections: + type: boolean + name: + type: string + skipCertVerification: + type: boolean + url: + type: string + type: object + type: array + type: object + events: + properties: + enable: + type: boolean + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + github: + description: GithubConfig represents the Github information (public + or GHE) where the organization and teams managing the collections + live. Members of the specified team in the specified organization + will have admin authority in the Kabanero CLI. + properties: + apiUrl: + type: string + organization: + type: string + teams: + items: + type: string + type: array + type: object + landing: + description: KabaneroLandingCustomizationSpec defines customization + entries for Kabanero landing page. + properties: + enable: + type: boolean + version: + type: string + type: object + targetNamespaces: + items: + type: string + type: array + tekton: + description: TektonCustomizationSpec defines customization entries + for Tekton + properties: + disabled: + type: boolean + version: + type: string + type: object + version: + type: string + type: object + status: + description: KabaneroStatus defines the observed state of the Kabanero + instance. + properties: + admissionControllerWebhook: + description: Admission webhook instance status + properties: + errorMessage: + type: string + ready: + type: string + type: object + appsody: + description: Appsody instance readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + che: + description: Che instance readiness status. + properties: + cheOperator: + description: CheOperatorStatus defines the observed status details + of the Che operator. + properties: + version: + type: string + type: object + errorMessage: + type: string + kabaneroChe: + description: KabaneroCheStatus defines the observed status details + of Kabanero Che. + properties: + version: + type: string + type: object + kabaneroCheInstance: + description: KabaneroCheInstanceStatus defines the observed status + details of Che instance. + properties: + cheImage: + type: string + cheImageTag: + type: string + cheWorkspaceClusterRole: + type: string + type: object + ready: + type: string + type: object + cli: + description: CLI readiness status. + properties: + errorMessage: + type: string + hostnames: + items: + type: string + type: array + ready: + type: string + type: object + collectionController: + description: Kabanero collection controller readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + events: + description: Events instance status + properties: + errorMessage: + type: string + hostnames: + items: + type: string + type: array + ready: + type: string + type: object + kabaneroInstance: + description: Kabanero operator instance readiness status. The status + is directly correlated to the availability of resources dependencies. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + kappnav: + description: Kabanero Application Navigator instance readiness status. + properties: + apiLocations: + items: + type: string + type: array + errorMessage: + type: string + ready: + type: string + uiLocations: + items: + type: string + type: array + type: object + knativeEventing: + description: Knative eventing instance readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + landing: + description: Kabanero Landing page readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + serverless: + description: OpenShift serverless operator status. + properties: + errorMessage: + type: string + knativeServing: + description: KnativeServingStatus defines the observed status + details of Knative Serving. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + ready: + type: string + version: + type: string + type: object + tekton: + description: Tekton instance readiness status. + properties: + errorMessage: + type: string + ready: + type: string + version: + type: string + type: object + type: object + type: object + served: true + storage: false + - name: v1alpha2 + schema: + openAPIV3Schema: + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: KabaneroSpec defines the desired state of Kabanero + properties: + admissionControllerWebhook: + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + cliServices: + description: KabaneroCliServicesCustomizationSpec defines customization + entries for the Kabanero CLI. + properties: + image: + type: string + repository: + type: string + sessionExpirationSeconds: + type: string + tag: + type: string + version: + description: 'Future: Enable bool `json:"enable,omitempty"`' + type: string + type: object + codeReadyWorkspaces: + description: CRWCustomizationSpec defines customization entries for + codeready-workspaces. + properties: + enable: + type: boolean + operator: + description: CRWOperatorSpec defines customization entries for + the codeready-workspaces operator. + properties: + customResourceInstance: + description: CRWOperatorCustomResourceSpec defines custom + resource customization entries for the codeready-workspaces + operator. + properties: + cheWorkspaceClusterRole: + type: string + devFileRegistryImage: + description: CWRCustomResourceDevFileRegImage defines + DevFileRegistryImage custom resource customization for + the codeready-workspaces operator. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + openShiftOAuth: + type: boolean + selfSignedCert: + type: boolean + tlsSupport: + type: boolean + type: object + type: object + type: object + collectionController: + description: CollectionControllerSpec defines customization entried + for the Kabanero collection controller. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + events: + properties: + enable: + type: boolean + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + github: + description: GithubConfig represents the Github information (public + or GHE) where the organization and teams managing the stacks live. Members + of the specified team in the specified organization will have admin + authority in the Kabanero CLI. + properties: + apiUrl: + type: string + organization: + type: string + teams: + items: + type: string + type: array + type: object + gitops: + properties: + pipelines: + items: + description: PipelineSpec defines a set of pipelines and associated + resources for a component. + properties: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a + file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + type: object + governancePolicy: + description: GovernancePolicyConfig defines customization entries + for governance policies. + properties: + stackPolicy: + type: string + type: object + landing: + description: KabaneroLandingCustomizationSpec defines customization + entries for Kabanero landing page. + properties: + enable: + type: boolean + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + sso: + properties: + adminSecretName: + type: string + enable: + type: boolean + provider: + type: string + type: object + stackController: + description: StackControllerSpec defines customization entried for + the Kabanero stack controller. + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object + stacks: + description: InstanceStackConfig defines the customization entries + for a set of stacks. + properties: + pipelines: + items: + description: PipelineSpec defines a set of pipelines and associated + resources for a component. + properties: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a + file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + repositories: + items: + description: RepositoryConfig defines customization entries + for a stack. + properties: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a + file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + name: + type: string + pipelines: + items: + description: PipelineSpec defines a set of pipelines and + associated resources for a component. + properties: + gitRelease: + description: GitReleaseSpec defines customization + entries for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve + a file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + type: object + type: array + skipRegistryCertVerification: + type: boolean + type: object + targetNamespaces: + items: + type: string + type: array + triggers: + items: + description: TriggerSpec defines the sets of default triggers for + the stacks + properties: + gitRelease: + description: GitReleaseSpec defines customization entries for + a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a file + over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + version: + type: string + type: object + status: + description: KabaneroStatus defines the observed state of the Kabanero + instance. + properties: + admissionControllerWebhook: + description: Admission webhook instance status + properties: + message: + type: string + ready: + type: string + type: object + appsody: + description: Appsody instance readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + cli: + description: CLI readiness status. + properties: + hostnames: + items: + type: string + type: array + message: + type: string + ready: + type: string + type: object + codereadyWorkspaces: + description: Codeready-workspaces instance readiness status. + properties: + message: + type: string + operator: + description: CRWOperatorStatus defines the observed status details + of the codeready-workspaces operator. + properties: + instance: + description: CRWInstanceStatus defines the observed status + details of the codeready-workspaces operator custom resource. + properties: + cheWorkspaceClusterRole: + type: string + devfileRegistryImage: + type: string + openShiftOAuth: + type: boolean + selfSignedCert: + type: boolean + tlsSupport: + type: boolean + required: + - cheWorkspaceClusterRole + - devfileRegistryImage + - openShiftOAuth + - selfSignedCert + - tlsSupport + type: object + version: + type: string + type: object + ready: + type: string + type: object + collectionController: + description: Kabanero collection controller readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + events: + description: Events instance status + properties: + hostnames: + items: + type: string + type: array + message: + type: string + ready: + type: string + type: object + gitops: + description: The status of the gitops pipelines + properties: + message: + type: string + pipelines: + items: + description: PipelineStatus defines the observed state of the + assets located within a single pipeline .tar.gz. + properties: + activeAssets: + items: + description: RepositoryAssetStatus defines the observed + state of a single asset in a pipelines respository. + properties: + assetDigest: + type: string + assetName: + type: string + group: + type: string + kind: + type: string + namespace: + type: string + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + digest: + type: string + gitRelease: + description: GitReleaseInfo is all of the GitReleaseSpec + information, minus the "skip cert verification" information, + which is not relevant for status. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + type: object + name: + type: string + url: + type: string + type: object + type: array + ready: + type: string + type: object + kabaneroInstance: + description: Kabanero operator instance readiness status. The status + is directly correlated to the availability of resources dependencies. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + kappnav: + description: Kabanero Application Navigator instance readiness status. + properties: + apiLocations: + items: + type: string + type: array + message: + type: string + ready: + type: string + uiLocations: + items: + type: string + type: array + type: object + landing: + description: Kabanero Landing page readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + serverless: + description: OpenShift serverless operator status. + properties: + knativeServing: + description: KnativeServingStatus defines the observed status + details of Knative Serving. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + message: + type: string + ready: + type: string + version: + type: string + type: object + sso: + description: SSO server status + properties: + configured: + type: string + message: + type: string + ready: + type: string + type: object + stackController: + description: Kabanero stack controller readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + tekton: + description: Tekton instance readiness status. + properties: + message: + type: string + ready: + type: string + version: + type: string + type: object + type: object + type: object + served: true + storage: true diff --git a/registry/manifests/kabanero-operator/0.9.1/kabanero.io_stacks_crd.yaml b/registry/manifests/kabanero-operator/0.9.1/kabanero.io_stacks_crd.yaml new file mode 100644 index 00000000..854aa37d --- /dev/null +++ b/registry/manifests/kabanero-operator/0.9.1/kabanero.io_stacks_crd.yaml @@ -0,0 +1,210 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: stacks.kabanero.io +spec: + additionalPrinterColumns: + - JSONPath: .metadata.creationTimestamp + description: CreationTimestamp is a timestamp representing the server time when + this object was created. It is not guaranteed to be set in happens-before order + across separate operations. + name: Age + type: date + - JSONPath: .status.summary + description: Stack summary. + name: Summary + type: string + group: kabanero.io + names: + kind: Stack + listKind: StackList + plural: stacks + singular: stack + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + description: Stack is the Schema for the stack API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: StackSpec defines the desired composition of a Stack + properties: + name: + type: string + versions: + items: + description: StackVersion defines the desired composition of a specific + stack version. + properties: + desiredState: + type: string + images: + items: + description: Image defines a container image used by a stack + properties: + id: + type: string + image: + type: string + type: object + type: array + pipelines: + items: + description: PipelineSpec defines a set of pipelines and associated + resources for a component. + properties: + gitRelease: + description: GitReleaseSpec defines customization entries + for a Git release. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + skipCertVerification: + type: boolean + type: object + https: + description: HttpsProtocolFile defines how to retrieve a + file over https + properties: + skipCertVerification: + type: boolean + url: + type: string + type: object + id: + type: string + sha256: + type: string + type: object + type: array + skipCertVerification: + type: boolean + skipRegistryCertVerification: + type: boolean + version: + type: string + type: object + type: array + type: object + status: + description: StackStatus defines the observed state of a stack + properties: + statusMessage: + type: string + summary: + type: string + versions: + items: + description: StackVersionStatus defines the observed state of a specific + stack version. + properties: + images: + items: + description: ImageStatus defines a container image status used + by a stack + properties: + digest: + description: ImageDigest defines a container image digest + used by a stack + properties: + activation: + type: string + message: + type: string + type: object + id: + type: string + image: + type: string + type: object + type: array + location: + type: string + pipelines: + items: + description: PipelineStatus defines the observed state of the + assets located within a single pipeline .tar.gz. + properties: + activeAssets: + items: + description: RepositoryAssetStatus defines the observed + state of a single asset in a pipelines respository. + properties: + assetDigest: + type: string + assetName: + type: string + group: + type: string + kind: + type: string + namespace: + type: string + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + digest: + type: string + gitRelease: + description: GitReleaseInfo is all of the GitReleaseSpec + information, minus the "skip cert verification" information, + which is not relevant for status. + properties: + assetName: + type: string + hostname: + type: string + organization: + type: string + project: + type: string + release: + type: string + type: object + name: + type: string + url: + type: string + type: object + type: array + status: + type: string + statusMessage: + type: string + version: + type: string + type: object + type: array + type: object + type: object + version: v1alpha2 + versions: + - name: v1alpha2 + served: true + storage: true From 3aadbb4f768871124b8b91ac616c7bc6a42552b8 Mon Sep 17 00:00:00 2001 From: kaczyns Date: Tue, 16 Jun 2020 16:24:47 -0400 Subject: [PATCH 15/15] rename serving->devfile-registry, CRD list/map changes --- Makefile | 6 +- build/Dockerfile | 2 +- .../main.go | 464 +++++++++--------- .../0.1/devfile-registry-controller.yaml} | 54 +- config/samples/full.yaml | 4 +- config/versions.yaml | 8 +- deploy/crds/kabanero.io_kabaneros_crd.yaml | 62 ++- deploy/crds/kabanero.io_stacks_crd.yaml | 36 +- pkg/apis/kabanero/v1alpha1/kabanero_types.go | 3 +- pkg/apis/kabanero/v1alpha2/kabanero_types.go | 33 +- pkg/apis/kabanero/v1alpha2/stack_types.go | 22 +- .../v1alpha2/zz_generated.deepcopy.go | 34 +- .../controller.go | 2 +- .../devfile_registry_controller.go} | 338 ++++++------- .../{serving => devfileregistry}/index.go | 2 +- .../{serving => devfileregistry}/register.go | 2 +- .../{serving.go => devfile-registry.go} | 279 ++++++----- .../kabaneroplatform_controller.go | 6 +- 18 files changed, 727 insertions(+), 630 deletions(-) rename cmd/{serving => devfile-registry-controller}/main.go (95%) rename config/orchestrations/{serving/0.1/serving.yaml => devfile-registry-controller/0.1/devfile-registry-controller.yaml} (66%) rename pkg/controller/{serving => devfileregistry}/controller.go (94%) rename pkg/controller/{serving/serving_controller.go => devfileregistry/devfile_registry_controller.go} (96%) rename pkg/controller/{serving => devfileregistry}/index.go (98%) rename pkg/controller/{serving => devfileregistry}/register.go (87%) rename pkg/controller/kabaneroplatform/{serving.go => devfile-registry.go} (55%) diff --git a/Makefile b/Makefile index 52fbc5fe..156430fe 100755 --- a/Makefile +++ b/Makefile @@ -72,7 +72,7 @@ build: generate GO111MODULE=on go install ./cmd/manager GO111MODULE=on go install ./cmd/manager/stack GO111MODULE=on go install ./cmd/admission-webhook - GO111MODULE=on go install ./cmd/serving + GO111MODULE=on go install ./cmd/devfile-registry-controller build-image: generate # These commands were taken from operator-sdk 0.8.1. The sdk did not let us @@ -82,7 +82,7 @@ build-image: generate GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -o build/_output/bin/kabanero-operator -gcflags "all=-trimpath=$(GOPATH)" -asmflags "all=-trimpath=$(GOPATH)" -ldflags "-X main.GitTag=$(TRAVIS_TAG) -X main.GitCommit=$(TRAVIS_COMMIT) -X main.GitRepoSlug=$(TRAVIS_REPO_SLUG) -X main.BuildDate=`date -u +%Y%m%d.%H%M%S`" github.com/kabanero-io/kabanero-operator/cmd/manager GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -o build/_output/bin/kabanero-operator-stack-controller -gcflags "all=-trimpath=$(GOPATH)" -asmflags "all=-trimpath=$(GOPATH)" -ldflags "-X main.GitTag=$(TRAVIS_TAG) -X main.GitCommit=$(TRAVIS_COMMIT) -X main.GitRepoSlug=$(TRAVIS_REPO_SLUG) -X main.BuildDate=`date -u +%Y%m%d.%H%M%S`" github.com/kabanero-io/kabanero-operator/cmd/manager/stack GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -o build/_output/bin/admission-webhook -gcflags "all=-trimpath=$(GOPATH)" -asmflags "all=-trimpath=$(GOPATH)" -ldflags "-X main.GitTag=$(TRAVIS_TAG) -X main.GitCommit=$(TRAVIS_COMMIT) -X main.GitRepoSlug=$(TRAVIS_REPO_SLUG) -X main.BuildDate=`date -u +%Y%m%d.%H%M%S`" github.com/kabanero-io/kabanero-operator/cmd/admission-webhook - GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -o build/_output/bin/serving -gcflags "all=-trimpath=$(GOPATH)" -asmflags "all=-trimpath=$(GOPATH)" -ldflags "-X main.GitTag=$(TRAVIS_TAG) -X main.GitCommit=$(TRAVIS_COMMIT) -X main.GitRepoSlug=$(TRAVIS_REPO_SLUG) -X main.BuildDate=`date -u +%Y%m%d.%H%M%S`" github.com/kabanero-io/kabanero-operator/cmd/serving + GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -o build/_output/bin/devfile-registry-controller -gcflags "all=-trimpath=$(GOPATH)" -asmflags "all=-trimpath=$(GOPATH)" -ldflags "-X main.GitTag=$(TRAVIS_TAG) -X main.GitCommit=$(TRAVIS_COMMIT) -X main.GitRepoSlug=$(TRAVIS_REPO_SLUG) -X main.BuildDate=`date -u +%Y%m%d.%H%M%S`" github.com/kabanero-io/kabanero-operator/cmd/devfile-registry-controller docker build -f build/Dockerfile -t $(IMAGE) . @@ -197,7 +197,7 @@ ifndef GITHUB_TOKEN endif mkdir -p build/bin curl -L https://github.com/mitchellh/golicense/releases/download/v0.2.0/golicense_0.2.0_$(detected_OS)_x86_64.tar.gz | tar -C build/bin -xzf - golicense - build/bin/golicense -plain ./license-rules.json build/_output/bin/admission-webhook build/_output/bin/kabanero-operator build/_output/bin/kabanero-operator-stack-controller build/_output/bin/serving | sort > 3RD_PARTY || true + build/bin/golicense -plain ./license-rules.json build/_output/bin/admission-webhook build/_output/bin/kabanero-operator build/_output/bin/kabanero-operator-stack-controller build/_output/bin/devfile-registry-controller | sort > 3RD_PARTY || true rm build/bin/golicense # Integration Tests diff --git a/build/Dockerfile b/build/Dockerfile index ada9dd91..66d9f329 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -17,7 +17,7 @@ ENV OPERATOR=/usr/local/bin/kabanero-operator \ COPY build/_output/bin/kabanero-operator ${OPERATOR} COPY build/_output/bin/kabanero-operator-stack-controller /usr/local/bin/kabanero-operator-stack-controller COPY build/_output/bin/admission-webhook /usr/local/bin/admission-webhook -COPY build/_output/bin/serving /usr/local/bin/serving +COPY build/_output/bin/devfile-registry-controller /usr/local/bin/devfile-registry-controller RUN mkdir /devfiles && chmod +777 /devfiles diff --git a/cmd/serving/main.go b/cmd/devfile-registry-controller/main.go similarity index 95% rename from cmd/serving/main.go rename to cmd/devfile-registry-controller/main.go index e7cdffb0..86b4086d 100644 --- a/cmd/serving/main.go +++ b/cmd/devfile-registry-controller/main.go @@ -1,232 +1,232 @@ -package main - -import ( - "context" - "errors" - "flag" - "fmt" - "os" - // "runtime" - "strings" - "net/http" - - // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) - _ "k8s.io/client-go/plugin/pkg/client/auth" - "k8s.io/client-go/rest" - - "github.com/kabanero-io/kabanero-operator/pkg/apis" - "github.com/kabanero-io/kabanero-operator/pkg/controller/serving" - - "github.com/operator-framework/operator-sdk/pkg/k8sutil" - kubemetrics "github.com/operator-framework/operator-sdk/pkg/kube-metrics" - "github.com/operator-framework/operator-sdk/pkg/leader" - "github.com/operator-framework/operator-sdk/pkg/log/zap" - "github.com/operator-framework/operator-sdk/pkg/metrics" - // sdkVersion "github.com/operator-framework/operator-sdk/version" - "github.com/spf13/pflag" - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/intstr" - "sigs.k8s.io/controller-runtime/pkg/cache" - "sigs.k8s.io/controller-runtime/pkg/client/config" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/manager/signals" -) - -// Change below variables to serve metrics on different host or port. -var ( - metricsHost = "0.0.0.0" - metricsPort int32 = 8383 - operatorMetricsPort int32 = 8686 -) -var log = logf.Log.WithName("cmd") - -func main() { - // Add the zap logger flag set to the CLI. The flag set must - // be added before calling pflag.Parse(). - pflag.CommandLine.AddFlagSet(zap.FlagSet()) - - // Add flags registered by imported packages (e.g. glog and - // controller-runtime) - pflag.CommandLine.AddGoFlagSet(flag.CommandLine) - - pflag.Parse() - - // Use a zap logr.Logger implementation. If none of the zap - // flags are configured (or if the zap flag set is not being - // used), this defaults to a production zap logger. - // - // The logger instantiated here can be changed to any logger - // implementing the logr.Logger interface. This logger will - // be propagated through the whole operator, generating - // uniform and structured logs. - logf.SetLogger(zap.Logger()) - - namespace, err := k8sutil.GetWatchNamespace() - if err != nil { - log.Error(err, "Failed to get watch namespace") - os.Exit(1) - } - - // Get a config to talk to the apiserver - cfg, err := config.GetConfig() - if err != nil { - log.Error(err, "") - os.Exit(1) - } - - ctx := context.TODO() - // Become the leader before proceeding - err = leader.Become(ctx, "serving-lock") - if err != nil { - log.Error(err, "") - os.Exit(1) - } - - // Set default manager options - options := manager.Options{ - Namespace: namespace, - MetricsBindAddress: fmt.Sprintf("%s:%d", metricsHost, metricsPort), - } - - // Add support for MultiNamespace set in WATCH_NAMESPACE (e.g ns1,ns2) - // Note that this is not intended to be used for excluding namespaces, this is better done via a Predicate - // Also note that you may face performance issues when using this with a high number of namespaces. - // More Info: https://godoc.org/github.com/kubernetes-sigs/controller-runtime/pkg/cache#MultiNamespacedCacheBuilder - if strings.Contains(namespace, ",") { - options.Namespace = "" - options.NewCache = cache.MultiNamespacedCacheBuilder(strings.Split(namespace, ",")) - } - - // Create a new manager to provide shared dependencies and start components - mgr, err := manager.New(cfg, options) - if err != nil { - log.Error(err, "") - os.Exit(1) - } - - log.Info("Registering Components.") - - // Setup Scheme for all resources - if err := apis.AddToScheme(mgr.GetScheme()); err != nil { - log.Error(err, "") - os.Exit(1) - } - - // Setup all Controllers - if err := serving.AddToManager(mgr); err != nil { - log.Error(err, "") - os.Exit(1) - } - - // Add the Metrics Service - addMetrics(ctx, cfg) - - //Start HTTTPS & Cmd - errs := Run(mgr) - - // Run until channel receives error - select { - case err := <-errs: - log.Error(err, "Manager exited non-zero") - os.Exit(1) - } - -} - -func Run(mgr manager.Manager) chan error { - - errs := make(chan error) - - // Start serving devfiles index - go func() { - fs := http.FileServer(http.Dir("/devfiles")) - http.Handle("/", fs) - log.Info("Starting Devfile registry on port :8443...") - if err := http.ListenAndServeTLS(":8443","/tmp/serving-certs/tls.crt","/tmp/serving-certs/tls.key",nil); err != nil { - errs <- err - } - }() - - // Start the Cmd - go func() { - log.Info("Starting the Cmd.") - if err := mgr.Start(signals.SetupSignalHandler()); err != nil { - errs <- err - } - }() - - return errs -} - - - -// addMetrics will create the Services and Service Monitors to allow the operator export the metrics by using -// the Prometheus operator -func addMetrics(ctx context.Context, cfg *rest.Config) { - // Get the namespace the operator is currently deployed in. - operatorNs, err := k8sutil.GetOperatorNamespace() - if err != nil { - if errors.Is(err, k8sutil.ErrRunLocal) { - log.Info("Skipping CR metrics server creation; not running in a cluster.") - return - } - } - - if err := serveCRMetrics(cfg, operatorNs); err != nil { - log.Info("Could not generate and serve custom resource metrics", "error", err.Error()) - } - - // Add to the below struct any other metrics ports you want to expose. - servicePorts := []v1.ServicePort{ - {Port: metricsPort, Name: metrics.OperatorPortName, Protocol: v1.ProtocolTCP, TargetPort: intstr.IntOrString{Type: intstr.Int, IntVal: metricsPort}}, - {Port: operatorMetricsPort, Name: metrics.CRPortName, Protocol: v1.ProtocolTCP, TargetPort: intstr.IntOrString{Type: intstr.Int, IntVal: operatorMetricsPort}}, - } - - // Create Service object to expose the metrics port(s). - service, err := metrics.CreateMetricsService(ctx, cfg, servicePorts) - if err != nil { - log.Info("Could not create metrics Service", "error", err.Error()) - } - - // CreateServiceMonitors will automatically create the prometheus-operator ServiceMonitor resources - // necessary to configure Prometheus to scrape metrics from this operator. - services := []*v1.Service{service} - - // The ServiceMonitor is created in the same namespace where the operator is deployed - _, err = metrics.CreateServiceMonitors(cfg, operatorNs, services) - if err != nil { - log.Info("Could not create ServiceMonitor object", "error", err.Error()) - // If this operator is deployed to a cluster without the prometheus-operator running, it will return - // ErrServiceMonitorNotPresent, which can be used to safely skip ServiceMonitor creation. - if err == metrics.ErrServiceMonitorNotPresent { - log.Info("Install prometheus-operator in your cluster to create ServiceMonitor objects", "error", err.Error()) - } - } -} - -// serveCRMetrics gets the Operator/CustomResource GVKs and generates metrics based on those types. -// It serves those metrics on "http://metricsHost:operatorMetricsPort". -func serveCRMetrics(cfg *rest.Config, operatorNs string) error { - // The function below returns a list of filtered operator/CR specific GVKs. For more control, override the GVK list below - // with your own custom logic. Note that if you are adding third party API schemas, probably you will need to - // customize this implementation to avoid permissions issues. - filteredGVK, err := k8sutil.GetGVKsFromAddToScheme(apis.AddToScheme) - if err != nil { - return err - } - - // The metrics will be generated from the namespaces which are returned here. - // NOTE that passing nil or an empty list of namespaces in GenerateAndServeCRMetrics will result in an error. - ns, err := kubemetrics.GetNamespacesForMetrics(operatorNs) - if err != nil { - return err - } - - // Generate and serve custom resource specific metrics. - err = kubemetrics.GenerateAndServeCRMetrics(cfg, ns, filteredGVK, metricsHost, operatorMetricsPort) - if err != nil { - return err - } - return nil -} +package main + +import ( + "context" + "errors" + "flag" + "fmt" + "os" + // "runtime" + "strings" + "net/http" + + // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) + _ "k8s.io/client-go/plugin/pkg/client/auth" + "k8s.io/client-go/rest" + + "github.com/kabanero-io/kabanero-operator/pkg/apis" + "github.com/kabanero-io/kabanero-operator/pkg/controller/devfileregistry" + + "github.com/operator-framework/operator-sdk/pkg/k8sutil" + kubemetrics "github.com/operator-framework/operator-sdk/pkg/kube-metrics" + "github.com/operator-framework/operator-sdk/pkg/leader" + "github.com/operator-framework/operator-sdk/pkg/log/zap" + "github.com/operator-framework/operator-sdk/pkg/metrics" + // sdkVersion "github.com/operator-framework/operator-sdk/version" + "github.com/spf13/pflag" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/intstr" + "sigs.k8s.io/controller-runtime/pkg/cache" + "sigs.k8s.io/controller-runtime/pkg/client/config" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/manager/signals" +) + +// Change below variables to serve metrics on different host or port. +var ( + metricsHost = "0.0.0.0" + metricsPort int32 = 8383 + operatorMetricsPort int32 = 8686 +) +var log = logf.Log.WithName("cmd") + +func main() { + // Add the zap logger flag set to the CLI. The flag set must + // be added before calling pflag.Parse(). + pflag.CommandLine.AddFlagSet(zap.FlagSet()) + + // Add flags registered by imported packages (e.g. glog and + // controller-runtime) + pflag.CommandLine.AddGoFlagSet(flag.CommandLine) + + pflag.Parse() + + // Use a zap logr.Logger implementation. If none of the zap + // flags are configured (or if the zap flag set is not being + // used), this defaults to a production zap logger. + // + // The logger instantiated here can be changed to any logger + // implementing the logr.Logger interface. This logger will + // be propagated through the whole operator, generating + // uniform and structured logs. + logf.SetLogger(zap.Logger()) + + namespace, err := k8sutil.GetWatchNamespace() + if err != nil { + log.Error(err, "Failed to get watch namespace") + os.Exit(1) + } + + // Get a config to talk to the apiserver + cfg, err := config.GetConfig() + if err != nil { + log.Error(err, "") + os.Exit(1) + } + + ctx := context.TODO() + // Become the leader before proceeding + err = leader.Become(ctx, "devfile-registry-lock") + if err != nil { + log.Error(err, "") + os.Exit(1) + } + + // Set default manager options + options := manager.Options{ + Namespace: namespace, + MetricsBindAddress: fmt.Sprintf("%s:%d", metricsHost, metricsPort), + } + + // Add support for MultiNamespace set in WATCH_NAMESPACE (e.g ns1,ns2) + // Note that this is not intended to be used for excluding namespaces, this is better done via a Predicate + // Also note that you may face performance issues when using this with a high number of namespaces. + // More Info: https://godoc.org/github.com/kubernetes-sigs/controller-runtime/pkg/cache#MultiNamespacedCacheBuilder + if strings.Contains(namespace, ",") { + options.Namespace = "" + options.NewCache = cache.MultiNamespacedCacheBuilder(strings.Split(namespace, ",")) + } + + // Create a new manager to provide shared dependencies and start components + mgr, err := manager.New(cfg, options) + if err != nil { + log.Error(err, "") + os.Exit(1) + } + + log.Info("Registering Components.") + + // Setup Scheme for all resources + if err := apis.AddToScheme(mgr.GetScheme()); err != nil { + log.Error(err, "") + os.Exit(1) + } + + // Setup all Controllers + if err := devfileregistry.AddToManager(mgr); err != nil { + log.Error(err, "") + os.Exit(1) + } + + // Add the Metrics Service + addMetrics(ctx, cfg) + + //Start HTTTPS & Cmd + errs := Run(mgr) + + // Run until channel receives error + select { + case err := <-errs: + log.Error(err, "Manager exited non-zero") + os.Exit(1) + } + +} + +func Run(mgr manager.Manager) chan error { + + errs := make(chan error) + + // Start serving devfiles index + go func() { + fs := http.FileServer(http.Dir("/devfiles")) + http.Handle("/", fs) + log.Info("Starting Devfile registry on port :8443...") + if err := http.ListenAndServeTLS(":8443","/tmp/serving-certs/tls.crt","/tmp/serving-certs/tls.key",nil); err != nil { + errs <- err + } + }() + + // Start the Cmd + go func() { + log.Info("Starting the Cmd.") + if err := mgr.Start(signals.SetupSignalHandler()); err != nil { + errs <- err + } + }() + + return errs +} + + + +// addMetrics will create the Services and Service Monitors to allow the operator export the metrics by using +// the Prometheus operator +func addMetrics(ctx context.Context, cfg *rest.Config) { + // Get the namespace the operator is currently deployed in. + operatorNs, err := k8sutil.GetOperatorNamespace() + if err != nil { + if errors.Is(err, k8sutil.ErrRunLocal) { + log.Info("Skipping CR metrics server creation; not running in a cluster.") + return + } + } + + if err := serveCRMetrics(cfg, operatorNs); err != nil { + log.Info("Could not generate and serve custom resource metrics", "error", err.Error()) + } + + // Add to the below struct any other metrics ports you want to expose. + servicePorts := []v1.ServicePort{ + {Port: metricsPort, Name: metrics.OperatorPortName, Protocol: v1.ProtocolTCP, TargetPort: intstr.IntOrString{Type: intstr.Int, IntVal: metricsPort}}, + {Port: operatorMetricsPort, Name: metrics.CRPortName, Protocol: v1.ProtocolTCP, TargetPort: intstr.IntOrString{Type: intstr.Int, IntVal: operatorMetricsPort}}, + } + + // Create Service object to expose the metrics port(s). + service, err := metrics.CreateMetricsService(ctx, cfg, servicePorts) + if err != nil { + log.Info("Could not create metrics Service", "error", err.Error()) + } + + // CreateServiceMonitors will automatically create the prometheus-operator ServiceMonitor resources + // necessary to configure Prometheus to scrape metrics from this operator. + services := []*v1.Service{service} + + // The ServiceMonitor is created in the same namespace where the operator is deployed + _, err = metrics.CreateServiceMonitors(cfg, operatorNs, services) + if err != nil { + log.Info("Could not create ServiceMonitor object", "error", err.Error()) + // If this operator is deployed to a cluster without the prometheus-operator running, it will return + // ErrServiceMonitorNotPresent, which can be used to safely skip ServiceMonitor creation. + if err == metrics.ErrServiceMonitorNotPresent { + log.Info("Install prometheus-operator in your cluster to create ServiceMonitor objects", "error", err.Error()) + } + } +} + +// serveCRMetrics gets the Operator/CustomResource GVKs and generates metrics based on those types. +// It serves those metrics on "http://metricsHost:operatorMetricsPort". +func serveCRMetrics(cfg *rest.Config, operatorNs string) error { + // The function below returns a list of filtered operator/CR specific GVKs. For more control, override the GVK list below + // with your own custom logic. Note that if you are adding third party API schemas, probably you will need to + // customize this implementation to avoid permissions issues. + filteredGVK, err := k8sutil.GetGVKsFromAddToScheme(apis.AddToScheme) + if err != nil { + return err + } + + // The metrics will be generated from the namespaces which are returned here. + // NOTE that passing nil or an empty list of namespaces in GenerateAndServeCRMetrics will result in an error. + ns, err := kubemetrics.GetNamespacesForMetrics(operatorNs) + if err != nil { + return err + } + + // Generate and serve custom resource specific metrics. + err = kubemetrics.GenerateAndServeCRMetrics(cfg, ns, filteredGVK, metricsHost, operatorMetricsPort) + if err != nil { + return err + } + return nil +} diff --git a/config/orchestrations/serving/0.1/serving.yaml b/config/orchestrations/devfile-registry-controller/0.1/devfile-registry-controller.yaml similarity index 66% rename from config/orchestrations/serving/0.1/serving.yaml rename to config/orchestrations/devfile-registry-controller/0.1/devfile-registry-controller.yaml index ddba8738..31bb0ad6 100644 --- a/config/orchestrations/serving/0.1/serving.yaml +++ b/config/orchestrations/devfile-registry-controller/0.1/devfile-registry-controller.yaml @@ -1,19 +1,19 @@ apiVersion: v1 kind: Service metadata: - name: kabanero-operator-serving + name: kabanero-operator-devfile-registry annotations: - service.beta.openshift.io/serving-cert-secret-name: kabanero-operator-serving-cert + service.beta.openshift.io/serving-cert-secret-name: kabanero-operator-devfile-registry-cert labels: - app.kubernetes.io/name: kabanero-operator-serving + app.kubernetes.io/name: kabanero-operator-devfile-registry app.kubernetes.io/instance: {{ .instance }} app.kubernetes.io/version: {{ .version }} - app.kubernetes.io/component: serving + app.kubernetes.io/component: devfile-registry app.kubernetes.io/part-of: kabanero app.kubernetes.io/managed-by: kabanero-operator spec: selector: - name: kabanero-operator-serving + name: kabanero-operator-devfile-registry ports: - protocol: TCP port: 443 @@ -23,7 +23,7 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: creationTimestamp: null - name: kabanero-operator-serving + name: kabanero-operator-devfile-registry rules: - apiGroups: - "" @@ -91,28 +91,28 @@ rules: apiVersion: v1 kind: ServiceAccount metadata: - name: kabanero-operator-serving + name: kabanero-operator-devfile-registry --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: - name: kabanero-operator-serving + name: kabanero-operator-devfile-registry subjects: - kind: ServiceAccount - name: kabanero-operator-serving + name: kabanero-operator-devfile-registry roleRef: kind: Role - name: kabanero-operator-serving + name: kabanero-operator-devfile-registry apiGroup: rbac.authorization.k8s.io --- apiVersion: route.openshift.io/v1 kind: Route metadata: - name: kabanero-operator-serving + name: kabanero-operator-devfile-registry spec: to: kind: Service - name: kabanero-operator-serving + name: kabanero-operator-devfile-registry tls: termination: reencrypt insecureEdgeTerminationPolicy: Redirect @@ -120,38 +120,38 @@ spec: apiVersion: apps/v1 kind: Deployment metadata: - name: kabanero-operator-serving + name: kabanero-operator-devfile-registry labels: - name: kabanero-operator-serving - app.kubernetes.io/name: kabanero-operator-serving + name: kabanero-operator-devfile-registry + app.kubernetes.io/name: kabanero-operator-devfile-registry app.kubernetes.io/instance: {{ .instance }} app.kubernetes.io/version: {{ .version }} - app.kubernetes.io/component: serving + app.kubernetes.io/component: devfile-registry app.kubernetes.io/part-of: kabanero app.kubernetes.io/managed-by: kabanero-operator spec: replicas: 1 selector: matchLabels: - name: kabanero-operator-serving + name: kabanero-operator-devfile-registry template: metadata: labels: - name: kabanero-operator-serving - app.kubernetes.io/name: kabanero-operator-serving + name: kabanero-operator-devfile-registry + app.kubernetes.io/name: kabanero-operator-devfile-registry app.kubernetes.io/instance: {{ .instance }} app.kubernetes.io/version: {{ .version }} - app.kubernetes.io/component: serving + app.kubernetes.io/component: devfile-registry app.kubernetes.io/part-of: kabanero app.kubernetes.io/managed-by: kabanero-operator spec: - serviceAccount: kabanero-operator-serving + serviceAccount: kabanero-operator-devfile-registry containers: - - name: kabanero-operator-serving + - name: kabanero-operator-devfile-registry image: {{ .image }} imagePullPolicy: Always command: - - /usr/local/bin/serving + - /usr/local/bin/devfile-registry-controller env: - name: WATCH_NAMESPACE valueFrom: @@ -162,12 +162,12 @@ spec: fieldRef: fieldPath: metadata.name - name: OPERATOR_NAME - value: "kabanero-operator-serving" + value: "kabanero-operator-devfile-registry" volumeMounts: - mountPath: /tmp/serving-certs - name: kabanero-operator-serving-cert + name: kabanero-operator-devfile-registry-cert readOnly: true volumes: - - name: kabanero-operator-serving-cert + - name: kabanero-operator-devfile-registry-cert secret: - secretName: kabanero-operator-serving-cert + secretName: kabanero-operator-devfile-registry-cert diff --git a/config/samples/full.yaml b/config/samples/full.yaml index 3ecf9110..6fd9298f 100644 --- a/config/samples/full.yaml +++ b/config/samples/full.yaml @@ -67,9 +67,9 @@ spec: # Overrides the image uri image: kabanero/kabanero-operator:TRAVIS_TAG - serving: + devfileRegistry: # Overrides the setting for version on this component - version: "0.9.0" + version: "0.10.0" # Overrides the image as a separate repository or tag repository: kabanero/kabanero-operator diff --git a/config/versions.yaml b/config/versions.yaml index c46f0b88..cf8b8929 100644 --- a/config/versions.yaml +++ b/config/versions.yaml @@ -22,6 +22,7 @@ kabanero: admission-webhook: "0.10.0" sso: "7.3.2" codeready-workspaces: "0.10.0" + devfile-registry-controller: "0.10.0" - version: "0.9.1" related-versions: @@ -44,7 +45,6 @@ kabanero: admission-webhook: "0.9.0" sso: "7.3.2" codeready-workspaces: "0.9.0" - serving: "0.9.0" - version: "0.8.0" related-versions: @@ -304,9 +304,9 @@ related-software: - version: "7.3.2" orchestrations: "orchestrations/sso/0.1" - serving: - - version: "0.9.0" - orchestrations: "orchestrations/serving/0.1" + devfile-registry-controller: + - version: "0.10.0" + orchestrations: "orchestrations/devfile-registry-controller/0.1" identifiers: repository: "FROM_POD" tag: "FROM_POD" diff --git a/deploy/crds/kabanero.io_kabaneros_crd.yaml b/deploy/crds/kabanero.io_kabaneros_crd.yaml index 9c5796e5..bf34d8e0 100644 --- a/deploy/crds/kabanero.io_kabaneros_crd.yaml +++ b/deploy/crds/kabanero.io_kabaneros_crd.yaml @@ -135,7 +135,9 @@ spec: type: string type: object type: array - x-kubernetes-list-type: set + x-kubernetes-list-map-keys: + - url + x-kubernetes-list-type: map type: object events: properties: @@ -466,6 +468,17 @@ spec: version: type: string type: object + devfileRegistry: + properties: + image: + type: string + repository: + type: string + tag: + type: string + version: + type: string + type: object events: properties: enable: @@ -534,7 +547,10 @@ spec: type: string type: object type: array - x-kubernetes-list-type: set + x-kubernetes-list-map-keys: + - id + - sha256 + x-kubernetes-list-type: map type: object governancePolicy: description: GovernancePolicyConfig defines customization entries @@ -558,17 +574,6 @@ spec: version: type: string type: object - serving: - properties: - image: - type: string - repository: - type: string - tag: - type: string - version: - type: string - type: object sso: properties: adminSecretName: @@ -632,7 +637,10 @@ spec: type: string type: object type: array - x-kubernetes-list-type: set + x-kubernetes-list-map-keys: + - id + - sha256 + x-kubernetes-list-type: map repositories: items: description: RepositoryConfig defines customization entries @@ -703,10 +711,15 @@ spec: type: string type: object type: array - x-kubernetes-list-type: set + x-kubernetes-list-map-keys: + - id + - sha256 + x-kubernetes-list-type: map type: object type: array - x-kubernetes-list-type: set + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map skipRegistryCertVerification: type: boolean type: object @@ -752,7 +765,10 @@ spec: type: string type: object type: array - x-kubernetes-list-type: set + x-kubernetes-list-map-keys: + - id + - sha256 + x-kubernetes-list-type: map version: type: string type: object @@ -883,7 +899,13 @@ spec: type: string type: object type: array - x-kubernetes-list-type: set + x-kubernetes-list-map-keys: + - assetName + - namespace + - group + - version + - kind + x-kubernetes-list-type: map digest: type: string gitRelease: @@ -908,6 +930,10 @@ spec: type: string type: object type: array + x-kubernetes-list-map-keys: + - name + - digest + x-kubernetes-list-type: map ready: type: string type: object diff --git a/deploy/crds/kabanero.io_stacks_crd.yaml b/deploy/crds/kabanero.io_stacks_crd.yaml index 867df3e8..8b2dd02b 100644 --- a/deploy/crds/kabanero.io_stacks_crd.yaml +++ b/deploy/crds/kabanero.io_stacks_crd.yaml @@ -63,7 +63,10 @@ spec: type: string type: object type: array - x-kubernetes-list-type: set + x-kubernetes-list-map-keys: + - id + - image + x-kubernetes-list-type: map metafile: type: string pipelines: @@ -103,7 +106,10 @@ spec: type: string type: object type: array - x-kubernetes-list-type: set + x-kubernetes-list-map-keys: + - id + - sha256 + x-kubernetes-list-type: map skipCertVerification: type: boolean skipRegistryCertVerification: @@ -112,7 +118,9 @@ spec: type: string type: object type: array - x-kubernetes-list-type: set + x-kubernetes-list-map-keys: + - version + x-kubernetes-list-type: map type: object status: description: StackStatus defines the observed state of a stack @@ -146,7 +154,10 @@ spec: type: string type: object type: array - x-kubernetes-list-type: set + x-kubernetes-list-map-keys: + - id + - image + x-kubernetes-list-type: map location: type: string pipelines: @@ -177,7 +188,13 @@ spec: type: string type: object type: array - x-kubernetes-list-type: set + x-kubernetes-list-map-keys: + - assetName + - namespace + - group + - version + - kind + x-kubernetes-list-type: map digest: type: string gitRelease: @@ -202,7 +219,10 @@ spec: type: string type: object type: array - x-kubernetes-list-type: set + x-kubernetes-list-map-keys: + - name + - digest + x-kubernetes-list-type: map status: type: string statusMessage: @@ -211,7 +231,9 @@ spec: type: string type: object type: array - x-kubernetes-list-type: set + x-kubernetes-list-map-keys: + - version + x-kubernetes-list-type: map type: object type: object version: v1alpha2 diff --git a/pkg/apis/kabanero/v1alpha1/kabanero_types.go b/pkg/apis/kabanero/v1alpha1/kabanero_types.go index 583f75ab..f73ca5fd 100644 --- a/pkg/apis/kabanero/v1alpha1/kabanero_types.go +++ b/pkg/apis/kabanero/v1alpha1/kabanero_types.go @@ -43,7 +43,8 @@ type KabaneroSpec struct { // InstanceCollectionConfig defines the customization entries for a set of collections. type InstanceCollectionConfig struct { - // +listType=set + // +listType=map + // +listMapKey=url Repositories []RepositoryConfig `json:"repositories,omitempty"` } diff --git a/pkg/apis/kabanero/v1alpha2/kabanero_types.go b/pkg/apis/kabanero/v1alpha2/kabanero_types.go index c0fb11fc..226254b3 100644 --- a/pkg/apis/kabanero/v1alpha2/kabanero_types.go +++ b/pkg/apis/kabanero/v1alpha2/kabanero_types.go @@ -28,7 +28,9 @@ type KabaneroSpec struct { Stacks InstanceStackConfig `json:"stacks,omitempty"` - // +listType=set + // +listType=map + // +listMapKey=id + // +listMapKey=sha256 Triggers []TriggerSpec `json:"triggers,omitempty"` CliServices KabaneroCliServicesCustomizationSpec `json:"cliServices,omitempty"` @@ -45,7 +47,7 @@ type KabaneroSpec struct { AdmissionControllerWebhook AdmissionControllerWebhookCustomizationSpec `json:"admissionControllerWebhook,omitempty"` - Serving ServingSpec `json:"serving,omitempty"` + DevfileRegistry DevfileRegistrySpec `json:"devfileRegistry,omitempty"` Sso SsoCustomizationSpec `json:"sso,omitempty"` @@ -53,7 +55,9 @@ type KabaneroSpec struct { } type GitopsSpec struct { - // +listType=set + // +listType=map + // +listMapKey=id + // +listMapKey=sha256 Pipelines []PipelineSpec `json:"pipelines,omitempty"` } @@ -73,10 +77,13 @@ func (gs GitopsSpec) GetPipelines() []PipelineSpec { type InstanceStackConfig struct { SkipRegistryCertVerification bool `json:"skipRegistryCertVerification,omitempty"` - // +listType=set + // +listType=map + // +listMapKey=name Repositories []RepositoryConfig `json:"repositories,omitempty"` - // +listType=set + // +listType=map + // +listMapKey=id + // +listMapKey=sha256 Pipelines []PipelineSpec `json:"pipelines,omitempty"` } @@ -121,7 +128,9 @@ type GovernancePolicyConfig struct { // RepositoryConfig defines customization entries for a stack. type RepositoryConfig struct { Name string `json:"name,omitempty"` - // +listType=set + // +listType=map + // +listMapKey=id + // +listMapKey=sha256 Pipelines []PipelineSpec `json:"pipelines,omitempty"` Https HttpsProtocolFile `json:"https,omitempty"` GitRelease GitReleaseSpec `json:"gitRelease,omitempty"` @@ -234,7 +243,7 @@ type AdmissionControllerWebhookCustomizationSpec struct { Tag string `json:"tag,omitempty"` } -type ServingSpec struct { +type DevfileRegistrySpec struct { Version string `json:"version,omitempty"` Image string `json:"image,omitempty"` Repository string `json:"repository,omitempty"` @@ -311,12 +320,20 @@ type PipelineStatus struct { Url string `json:"url,omitempty"` GitRelease GitReleaseInfo `json:"gitRelease,omitempty"` Digest string `json:"digest,omitempty"` - // +listType=set + // +listType=map + // +listMapKey=assetName + // +listMapKey=namespace + // +listMapKey=group + // +listMapKey=version + // +listMapKey=kind ActiveAssets []RepositoryAssetStatus `json:"activeAssets,omitempty"` } // The status of the gitops pipelines type GitopsStatus struct { + // +listType=map + // +listMapKey=name + // +listMapKey=digest Pipelines []PipelineStatus `json:"pipelines,omitempty"` Ready string `json:"ready,omitempty"` Message string `json:"message,omitempty"` diff --git a/pkg/apis/kabanero/v1alpha2/stack_types.go b/pkg/apis/kabanero/v1alpha2/stack_types.go index 7b84edd5..cc28d28b 100644 --- a/pkg/apis/kabanero/v1alpha2/stack_types.go +++ b/pkg/apis/kabanero/v1alpha2/stack_types.go @@ -39,7 +39,8 @@ const ( // +k8s:openapi-gen=true type StackSpec struct { Name string `json:"name,omitempty"` - // +listType=set + // +listType=map + // +listMapKey=version Versions []StackVersion `json:"versions,omitempty"` } @@ -55,12 +56,16 @@ func (s StackSpec) GetVersions() []ComponentSpecVersion { type StackVersion struct { SkipRegistryCertVerification bool `json:"skipRegistryCertVerification,omitempty"` - // +listType=set + // +listType=map + // +listMapKey=id + // +listMapKey=sha256 Pipelines []PipelineSpec `json:"pipelines,omitempty"` Version string `json:"version,omitempty"` DesiredState string `json:"desiredState,omitempty"` SkipCertVerification bool `json:"skipCertVerification,omitempty"` - // +listType=set + // +listType=map + // +listMapKey=id + // +listMapKey=image Images []Image `json:"images,omitempty"` Devfile string `json:"devfile,omitempty"` Metafile string `json:"metafile,omitempty"` @@ -112,7 +117,8 @@ type RepositoryAssetStatus struct { // +k8s:openapi-gen=true type StackStatus struct { StatusMessage string `json:"statusMessage,omitempty"` - // +listType=set + // +listType=map + // +listMapKey=version Versions []StackVersionStatus `json:"versions,omitempty"` Summary string `json:"summary,omitempty"` } @@ -129,11 +135,15 @@ func (s StackStatus) GetVersions() []ComponentStatusVersion { type StackVersionStatus struct { Version string `json:"version,omitempty"` Location string `json:"location,omitempty"` - // +listType=set + // +listType=map + // +listMapKey=name + // +listMapKey=digest Pipelines []PipelineStatus `json:"pipelines,omitempty"` Status string `json:"status,omitempty"` StatusMessage string `json:"statusMessage,omitempty"` - // +listType=set + // +listType=map + // +listMapKey=id + // +listMapKey=image Images []ImageStatus `json:"images,omitempty"` } diff --git a/pkg/apis/kabanero/v1alpha2/zz_generated.deepcopy.go b/pkg/apis/kabanero/v1alpha2/zz_generated.deepcopy.go index e0f059d0..6428cfa9 100644 --- a/pkg/apis/kabanero/v1alpha2/zz_generated.deepcopy.go +++ b/pkg/apis/kabanero/v1alpha2/zz_generated.deepcopy.go @@ -246,6 +246,22 @@ func (in *CollectionControllerStatus) DeepCopy() *CollectionControllerStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DevfileRegistrySpec) DeepCopyInto(out *DevfileRegistrySpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DevfileRegistrySpec. +func (in *DevfileRegistrySpec) DeepCopy() *DevfileRegistrySpec { + if in == nil { + return nil + } + out := new(DevfileRegistrySpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *EventsCustomizationSpec) DeepCopyInto(out *EventsCustomizationSpec) { *out = *in @@ -647,7 +663,7 @@ func (in *KabaneroSpec) DeepCopyInto(out *KabaneroSpec) { out.CollectionController = in.CollectionController out.StackController = in.StackController out.AdmissionControllerWebhook = in.AdmissionControllerWebhook - out.Serving = in.Serving + out.DevfileRegistry = in.DevfileRegistry out.Sso = in.Sso in.Gitops.DeepCopyInto(&out.Gitops) return @@ -848,22 +864,6 @@ func (in *ServerlessStatus) DeepCopy() *ServerlessStatus { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServingSpec) DeepCopyInto(out *ServingSpec) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServingSpec. -func (in *ServingSpec) DeepCopy() *ServingSpec { - if in == nil { - return nil - } - out := new(ServingSpec) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SsoCustomizationSpec) DeepCopyInto(out *SsoCustomizationSpec) { *out = *in diff --git a/pkg/controller/serving/controller.go b/pkg/controller/devfileregistry/controller.go similarity index 94% rename from pkg/controller/serving/controller.go rename to pkg/controller/devfileregistry/controller.go index 24bcc503..82bda823 100644 --- a/pkg/controller/serving/controller.go +++ b/pkg/controller/devfileregistry/controller.go @@ -1,4 +1,4 @@ -package serving +package devfileregistry import ( "sigs.k8s.io/controller-runtime/pkg/manager" diff --git a/pkg/controller/serving/serving_controller.go b/pkg/controller/devfileregistry/devfile_registry_controller.go similarity index 96% rename from pkg/controller/serving/serving_controller.go rename to pkg/controller/devfileregistry/devfile_registry_controller.go index 7247e30d..9253f696 100644 --- a/pkg/controller/serving/serving_controller.go +++ b/pkg/controller/devfileregistry/devfile_registry_controller.go @@ -1,169 +1,169 @@ -package serving - -import ( - "context" - "fmt" - "os" - - kabanerov1alpha2 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha2" - // corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - // metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - // "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - // "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" - - // Prefer to import index func when it's moved to a pkg - // d2index "github.com/odo-devfiles/registry/tools/cmd/index" - "encoding/json" -) - -var log = logf.Log.WithName("controller_stack") - -// Add creates a new Stack Controller and adds it to the Manager. The Manager will set fields on the Controller -// and Start it when the Manager is Started. -func Add(mgr manager.Manager) error { - return add(mgr, newReconciler(mgr)) -} - -// newReconciler returns a new reconcile.Reconciler -func newReconciler(mgr manager.Manager) reconcile.Reconciler { - return &ReconcileStack{client: mgr.GetClient(), scheme: mgr.GetScheme()} -} - -// add adds a new Controller to mgr with r as the reconcile.Reconciler -func add(mgr manager.Manager, r reconcile.Reconciler) error { - // Create a new controller - c, err := controller.New("stack-controller", mgr, controller.Options{Reconciler: r}) - if err != nil { - return err - } - - // Watch for changes to primary resource Stack - err = c.Watch(&source.Kind{Type: &kabanerov1alpha2.Stack{}}, &handler.EnqueueRequestForObject{}) - if err != nil { - return err - } - - return nil -} - -// blank assignment to verify that ReconcileStack implements reconcile.Reconciler -var _ reconcile.Reconciler = &ReconcileStack{} - -// ReconcileStack reconciles a Stack object -type ReconcileStack struct { - // This client, initialized using mgr.Client() above, is a split client - // that reads objects from the cache and writes to the apiserver - client client.Client - scheme *runtime.Scheme -} - -// Reconcile reads that state of the cluster for a Stack object and makes changes based on the state read -// and what is in the Stack.Spec -// TODO(user): Modify this Reconcile function to implement your Controller logic. This example creates -// a Pod as an example -// Note: -// The Controller will requeue the Request to be processed again if the returned error is non-nil or -// Result.Requeue is true, otherwise upon completion it will remove the work from the queue. -func (r *ReconcileStack) Reconcile(request reconcile.Request) (reconcile.Result, error) { - reqLogger := log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name) - reqLogger.Info("Reconciling Stack") - - // Fetch the Stack instance - instance := &kabanerov1alpha2.Stack{} - err := r.client.Get(context.TODO(), request.NamespacedName, instance) - if err != nil { - if errors.IsNotFound(err) { - // Request object not found, could have been deleted after reconcile request. - // Owned objects are automatically garbage collected. For additional cleanup logic use finalizers. - // Return and don't requeue - return reconcile.Result{}, nil - } - // Error reading the object - requeue the request. - return reconcile.Result{}, err - } - - basePath := "/devfiles" - stackPath := fmt.Sprintf("%v/%v", basePath, instance.ObjectMeta.Name) - os.Mkdir(basePath, os.ModePerm) - - // Clean all files for this stack: a version may be removed or Stack deletion - os.RemoveAll(stackPath) - - beingDeleted := !instance.DeletionTimestamp.IsZero() - - if !beingDeleted { - // Copy the yaml from the Stack to local devfile registry if it exists - for _, version := range instance.Spec.Versions { - if (len(version.Devfile) !=0) && (len(version.Metafile) !=0) { - versionPath := fmt.Sprintf("%v/%v", stackPath, version.Version) - devfile := fmt.Sprintf("%v/devfile.yaml", versionPath) - metafile := fmt.Sprintf("%v/meta.yaml", versionPath) - - os.MkdirAll(versionPath, os.ModePerm) - - f, err := os.Create(devfile) - if err != nil { - reqLogger.Error(err, fmt.Sprintf("Error creating devfile %v", devfile)) - } - defer f.Close() - _, err = f.WriteString(version.Devfile) - if err != nil { - reqLogger.Error(err, fmt.Sprintf("Error writing devfile %v", devfile)) - } - f.Sync() - - f, err = os.Create(metafile) - if err != nil { - reqLogger.Error(err, fmt.Sprintf("Error creating metafile %v", metafile)) - } - defer f.Close() - _, err = f.WriteString(version.Metafile) - if err != nil { - reqLogger.Error(err, fmt.Sprintf("Error writing metafile %v", metafile)) - } - f.Sync() - } - } - } - - // Regenerate the index - indexfile := fmt.Sprintf("%v/index.json", basePath) - index, err := genIndex(basePath) - if err != nil { - reqLogger.Error(err, "Error generating devfile index") - return reconcile.Result{}, err - } - var b []byte - - if len(index) !=0 { - b, err = json.MarshalIndent(index, "", " ") - if err != nil { - reqLogger.Error(err, "Error during marshal index") - return reconcile.Result{}, err - } - } - - f, err := os.Create(indexfile) - if err != nil { - reqLogger.Error(err, fmt.Sprintf("Error creating indexfile %v", indexfile)) - return reconcile.Result{}, err - } - defer f.Close() - _, err = f.Write(b) - if err != nil { - reqLogger.Error(err, fmt.Sprintf("Error writing indexfile %v", indexfile)) - return reconcile.Result{}, err - } - f.Sync() - - return reconcile.Result{}, nil -} +package devfileregistry + +import ( + "context" + "fmt" + "os" + + kabanerov1alpha2 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha2" + // corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + // metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + // "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" + // "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/handler" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + "sigs.k8s.io/controller-runtime/pkg/source" + + // Prefer to import index func when it's moved to a pkg + // d2index "github.com/odo-devfiles/registry/tools/cmd/index" + "encoding/json" +) + +var log = logf.Log.WithName("controller_stack") + +// Add creates a new Stack Controller and adds it to the Manager. The Manager will set fields on the Controller +// and Start it when the Manager is Started. +func Add(mgr manager.Manager) error { + return add(mgr, newReconciler(mgr)) +} + +// newReconciler returns a new reconcile.Reconciler +func newReconciler(mgr manager.Manager) reconcile.Reconciler { + return &ReconcileStack{client: mgr.GetClient(), scheme: mgr.GetScheme()} +} + +// add adds a new Controller to mgr with r as the reconcile.Reconciler +func add(mgr manager.Manager, r reconcile.Reconciler) error { + // Create a new controller + c, err := controller.New("stack-controller", mgr, controller.Options{Reconciler: r}) + if err != nil { + return err + } + + // Watch for changes to primary resource Stack + err = c.Watch(&source.Kind{Type: &kabanerov1alpha2.Stack{}}, &handler.EnqueueRequestForObject{}) + if err != nil { + return err + } + + return nil +} + +// blank assignment to verify that ReconcileStack implements reconcile.Reconciler +var _ reconcile.Reconciler = &ReconcileStack{} + +// ReconcileStack reconciles a Stack object +type ReconcileStack struct { + // This client, initialized using mgr.Client() above, is a split client + // that reads objects from the cache and writes to the apiserver + client client.Client + scheme *runtime.Scheme +} + +// Reconcile reads that state of the cluster for a Stack object and makes changes based on the state read +// and what is in the Stack.Spec +// TODO(user): Modify this Reconcile function to implement your Controller logic. This example creates +// a Pod as an example +// Note: +// The Controller will requeue the Request to be processed again if the returned error is non-nil or +// Result.Requeue is true, otherwise upon completion it will remove the work from the queue. +func (r *ReconcileStack) Reconcile(request reconcile.Request) (reconcile.Result, error) { + reqLogger := log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name) + reqLogger.Info("Reconciling Stack") + + // Fetch the Stack instance + instance := &kabanerov1alpha2.Stack{} + err := r.client.Get(context.TODO(), request.NamespacedName, instance) + if err != nil { + if errors.IsNotFound(err) { + // Request object not found, could have been deleted after reconcile request. + // Owned objects are automatically garbage collected. For additional cleanup logic use finalizers. + // Return and don't requeue + return reconcile.Result{}, nil + } + // Error reading the object - requeue the request. + return reconcile.Result{}, err + } + + basePath := "/devfiles" + stackPath := fmt.Sprintf("%v/%v", basePath, instance.ObjectMeta.Name) + os.Mkdir(basePath, os.ModePerm) + + // Clean all files for this stack: a version may be removed or Stack deletion + os.RemoveAll(stackPath) + + beingDeleted := !instance.DeletionTimestamp.IsZero() + + if !beingDeleted { + // Copy the yaml from the Stack to local devfile registry if it exists + for _, version := range instance.Spec.Versions { + if (len(version.Devfile) !=0) && (len(version.Metafile) !=0) { + versionPath := fmt.Sprintf("%v/%v", stackPath, version.Version) + devfile := fmt.Sprintf("%v/devfile.yaml", versionPath) + metafile := fmt.Sprintf("%v/meta.yaml", versionPath) + + os.MkdirAll(versionPath, os.ModePerm) + + f, err := os.Create(devfile) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error creating devfile %v", devfile)) + } + defer f.Close() + _, err = f.WriteString(version.Devfile) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error writing devfile %v", devfile)) + } + f.Sync() + + f, err = os.Create(metafile) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error creating metafile %v", metafile)) + } + defer f.Close() + _, err = f.WriteString(version.Metafile) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error writing metafile %v", metafile)) + } + f.Sync() + } + } + } + + // Regenerate the index + indexfile := fmt.Sprintf("%v/index.json", basePath) + index, err := genIndex(basePath) + if err != nil { + reqLogger.Error(err, "Error generating devfile index") + return reconcile.Result{}, err + } + var b []byte + + if len(index) !=0 { + b, err = json.MarshalIndent(index, "", " ") + if err != nil { + reqLogger.Error(err, "Error during marshal index") + return reconcile.Result{}, err + } + } + + f, err := os.Create(indexfile) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error creating indexfile %v", indexfile)) + return reconcile.Result{}, err + } + defer f.Close() + _, err = f.Write(b) + if err != nil { + reqLogger.Error(err, fmt.Sprintf("Error writing indexfile %v", indexfile)) + return reconcile.Result{}, err + } + f.Sync() + + return reconcile.Result{}, nil +} diff --git a/pkg/controller/serving/index.go b/pkg/controller/devfileregistry/index.go similarity index 98% rename from pkg/controller/serving/index.go rename to pkg/controller/devfileregistry/index.go index c92d4c81..8d9ef3b0 100644 --- a/pkg/controller/serving/index.go +++ b/pkg/controller/devfileregistry/index.go @@ -1,4 +1,4 @@ -package serving +package devfileregistry import ( //"encoding/json" diff --git a/pkg/controller/serving/register.go b/pkg/controller/devfileregistry/register.go similarity index 87% rename from pkg/controller/serving/register.go rename to pkg/controller/devfileregistry/register.go index 81ad5b97..8c875069 100644 --- a/pkg/controller/serving/register.go +++ b/pkg/controller/devfileregistry/register.go @@ -1,4 +1,4 @@ -package serving +package devfileregistry func init() { // AddToManagerFuncs is a list of functions to create controllers and add them to a manager. diff --git a/pkg/controller/kabaneroplatform/serving.go b/pkg/controller/kabaneroplatform/devfile-registry.go similarity index 55% rename from pkg/controller/kabaneroplatform/serving.go rename to pkg/controller/kabaneroplatform/devfile-registry.go index d560bcba..c01e6b0d 100644 --- a/pkg/controller/kabaneroplatform/serving.go +++ b/pkg/controller/kabaneroplatform/devfile-registry.go @@ -1,129 +1,150 @@ -package kabaneroplatform - -import ( - "context" - "github.com/go-logr/logr" - kabanerov1alpha2 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha2" - - corev1 "k8s.io/api/core/v1" - - mf "github.com/manifestival/manifestival" - mfc "github.com/manifestival/controller-runtime-client" - "k8s.io/apimachinery/pkg/api/errors" - "sigs.k8s.io/controller-runtime/pkg/client" - "strings" -) - -func reconcileServing(ctx context.Context, k *kabanerov1alpha2.Kabanero, c client.Client, reqLogger logr.Logger) error { - - // Figure out what version of the orchestration we are going to use. - rev, err := resolveSoftwareRevision(k, "serving", k.Spec.Serving.Version) - if err != nil { - return err - } - - templateContext := rev.Identifiers - - image, err := imageUriWithOverrides(k.Spec.Serving.Repository, k.Spec.Serving.Tag, k.Spec.Serving.Image, rev) - if err != nil { - return err - } - - templateContext["image"] = image - templateContext["instance"] = k.ObjectMeta.UID - templateContext["version"] = rev.Version - - f, err := rev.OpenOrchestration("serving.yaml") - if err != nil { - return err - } - - s, err := renderOrchestration(f, templateContext) - if err != nil { - return err - } - - mOrig, err := mf.ManifestFrom(mf.Reader(strings.NewReader(s)), mf.UseClient(mfc.NewClient(c)), mf.UseLogger(reqLogger.WithName("manifestival"))) - if err != nil { - return err - } - - transforms := []mf.Transformer{ - mf.InjectOwner(k), - mf.InjectNamespace(k.GetNamespace()), - } - - m, err := mOrig.Transform(transforms...) - if err != nil { - return err - } - - err = m.Apply() - if err != nil { - return err - } - - return nil -} - - -func cleanupServing(k *kabanerov1alpha2.Kabanero, c client.Client, reqLogger logr.Logger) error { - - rev, err := resolveSoftwareRevision(k, "serving", k.Spec.Serving.Version) - if err != nil { - return err - } - - //The context which will be used to render any templates - templateContext := rev.Identifiers - - // TODO - image, err := imageUriWithOverrides(k.Spec.Serving.Repository, k.Spec.Serving.Tag, k.Spec.Serving.Image, rev) - if err != nil { - return err - } - templateContext["image"] = image - templateContext["instance"] = k.ObjectMeta.UID - templateContext["version"] = rev.Version - - f, err := rev.OpenOrchestration("serving.yaml") - if err != nil { - return err - } - - s, err := renderOrchestration(f, templateContext) - if err != nil { - return err - } - - mOrig, err := mf.ManifestFrom(mf.Reader(strings.NewReader(s)), mf.UseClient(mfc.NewClient(c)), mf.UseLogger(reqLogger.WithName("manifestival"))) - if err != nil { - return err - } - - transforms := []mf.Transformer{mf.InjectNamespace(k.GetNamespace())} - m, err := mOrig.Transform(transforms...) - if err != nil { - return err - } - - // Manifestival ignores the "NotFound" error for us. - err = m.Delete() - if err != nil { - return err - } - - - // Now, clean up the things that the controller-runtime created on - // our behalf. - secretInstance := &corev1.Secret{} - secretInstance.Name = "kabanero-operator-serving-cert" - secretInstance.Namespace = k.GetNamespace() - err = c.Delete(context.TODO(), secretInstance) - - if (err != nil) && (errors.IsNotFound(err) == false) { - return err - } - - return nil -} +package kabaneroplatform + +import ( + "context" + "github.com/go-logr/logr" + kabanerov1alpha2 "github.com/kabanero-io/kabanero-operator/pkg/apis/kabanero/v1alpha2" + "github.com/kabanero-io/kabanero-operator/pkg/versioning" + + corev1 "k8s.io/api/core/v1" + + mf "github.com/manifestival/manifestival" + mfc "github.com/manifestival/controller-runtime-client" + "k8s.io/apimachinery/pkg/api/errors" + "sigs.k8s.io/controller-runtime/pkg/client" + "strings" +) + +func reconcileDevfileRegistry(ctx context.Context, k *kabanerov1alpha2.Kabanero, c client.Client, reqLogger logr.Logger) error { + + // Figure out what version of the orchestration we are going to use. If this version doesn't have a devfile + // registry, then make sure the devfile registry is stopped. + rev, err := resolveSoftwareRevision(k, "devfile-registry-controller", k.Spec.DevfileRegistry.Version) + if err != nil { + // We'll need to re-evaluate this down the road, but for now assume the 0.10.0 version of the devfile + // registry controller might be installed, so lets try to remove it. + rev, err2 := resolveSoftwareRevision(k, "devfile-registry-controller", "0.10.0") + if err2 != nil { + return err + } + + err = cleanupDevfileRegistryForRevision(rev, k, c, reqLogger) + if err != nil { + return err + } + + return nil + } + + templateContext := rev.Identifiers + + image, err := imageUriWithOverrides(k.Spec.DevfileRegistry.Repository, k.Spec.DevfileRegistry.Tag, k.Spec.DevfileRegistry.Image, rev) + if err != nil { + return err + } + + templateContext["image"] = image + templateContext["instance"] = k.ObjectMeta.UID + templateContext["version"] = rev.Version + + f, err := rev.OpenOrchestration("devfile-registry-controller.yaml") + if err != nil { + return err + } + + s, err := renderOrchestration(f, templateContext) + if err != nil { + return err + } + + mOrig, err := mf.ManifestFrom(mf.Reader(strings.NewReader(s)), mf.UseClient(mfc.NewClient(c)), mf.UseLogger(reqLogger.WithName("manifestival"))) + if err != nil { + return err + } + + transforms := []mf.Transformer{ + mf.InjectOwner(k), + mf.InjectNamespace(k.GetNamespace()), + } + + m, err := mOrig.Transform(transforms...) + if err != nil { + return err + } + + err = m.Apply() + if err != nil { + return err + } + + return nil +} + + +func cleanupDevfileRegistry(k *kabanerov1alpha2.Kabanero, c client.Client, reqLogger logr.Logger) error { + + rev, err := resolveSoftwareRevision(k, "devfile-registry-controller", k.Spec.DevfileRegistry.Version) + if err != nil { + // It may be that this version of kabanero doesn't have a devfile registry, so just exit. + reqLogger.Error(err, "Error encountered when cleanup up the devfile registry") + return nil + } + + return cleanupDevfileRegistryForRevision(rev, k, c, reqLogger) +} + +func cleanupDevfileRegistryForRevision(rev versioning.SoftwareRevision, k *kabanerov1alpha2.Kabanero, c client.Client, reqLogger logr.Logger) error { + + //The context which will be used to render any templates + templateContext := rev.Identifiers + + // TODO + image, err := imageUriWithOverrides(k.Spec.DevfileRegistry.Repository, k.Spec.DevfileRegistry.Tag, k.Spec.DevfileRegistry.Image, rev) + if err != nil { + return err + } + templateContext["image"] = image + templateContext["instance"] = k.ObjectMeta.UID + templateContext["version"] = rev.Version + + f, err := rev.OpenOrchestration("devfile-registry-controller.yaml") + if err != nil { + return err + } + + s, err := renderOrchestration(f, templateContext) + if err != nil { + return err + } + + mOrig, err := mf.ManifestFrom(mf.Reader(strings.NewReader(s)), mf.UseClient(mfc.NewClient(c)), mf.UseLogger(reqLogger.WithName("manifestival"))) + if err != nil { + return err + } + + transforms := []mf.Transformer{mf.InjectNamespace(k.GetNamespace())} + m, err := mOrig.Transform(transforms...) + if err != nil { + return err + } + + // Manifestival ignores the "NotFound" error for us. + err = m.Delete() + if err != nil { + return err + } + + + // Now, clean up the things that the controller-runtime created on + // our behalf. + secretInstance := &corev1.Secret{} + secretInstance.Name = "kabanero-operator-devfile-registry-cert" + secretInstance.Namespace = k.GetNamespace() + err = c.Delete(context.TODO(), secretInstance) + + if (err != nil) && (errors.IsNotFound(err) == false) { + return err + } + + return nil +} diff --git a/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go b/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go index f7f3eae8..a17bdd64 100644 --- a/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go +++ b/pkg/controller/kabaneroplatform/kabaneroplatform_controller.go @@ -56,7 +56,7 @@ var reconcileFuncs = []reconcileFuncType{ {name: "sso", function: reconcileSso}, {name: "gitops", function: reconcileGitopsPipelines}, {name: "target namespaces", function: reconcileTargetNamespaces}, - {name: "serving", function: reconcileServing}, + {name: "devfile registry controller", function: reconcileDevfileRegistry}, } // Add creates a new Kabanero Controller and adds it to the Manager. The Manager will set fields on the Controller @@ -503,8 +503,8 @@ func cleanup(ctx context.Context, k *kabanerov1alpha2.Kabanero, client client.Cl return err } - // Cleanup the Serving and their cross-namespace objects - err = cleanupServing(k, client, reqLogger) + // Cleanup the Devfile registry controller and its cross-namespace objects + err = cleanupDevfileRegistry(k, client, reqLogger) if err != nil { return err }