diff --git a/experiments/pipeline-service/.gitignore b/experiments/pipeline-service/.gitignore deleted file mode 100644 index df6114ada..000000000 --- a/experiments/pipeline-service/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/cmd/controller/controller diff --git a/experiments/pipeline-service/Makefile b/experiments/pipeline-service/Makefile deleted file mode 100644 index 9d987d7de..000000000 --- a/experiments/pipeline-service/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -build: - cd cmd/controller && go build -v -debug: - cd cmd/controller && dlv debug -run: build - cmd/controller/controller -lint: - go run github.com/golangci/golangci-lint/cmd/golangci-lint run -install-crds: - kapp deploy -a pipeline-service -f ./config/crd - - -release: - ytt --ignore-unknown-comments -f ./config | \ - ko resolve -f- > ./releases/release.yaml - - -generate-objects: - go run sigs.k8s.io/controller-tools/cmd/controller-gen \ - object \ - paths=./pkg/apis/v1alpha1 -generate-manifests: - go run sigs.k8s.io/controller-tools/cmd/controller-gen \ - crd \ - paths=./pkg/apis/v1alpha1 \ - output:crd:artifacts:config=config/crd/bases diff --git a/experiments/pipeline-service/README.md b/experiments/pipeline-service/README.md deleted file mode 100644 index 375d39cc1..000000000 --- a/experiments/pipeline-service/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# pipeline service - -_**THIS IS JUST A DRAFT/WORK IN PROGRESS/EXPERIMENT**, do not take it seriously -yet (specially the name)_. - -`pipeline-service` extends Kubernetes to provide the ability to express (in a -declarative form) the desire to have a pipeline run and ensuring that it does -so on any change to its specification. think of it as `kpack` but for pipeline -runners (tekton, argo workflows, jenkins, concourse jobs...), or, more broadly, -anything that has a "submit an invocation object to _run_" semantic. - - -## trying out - -Under [`./examples`](./examples) you'll find a walkthrough of pipeline-service -going from simple to elaborate examples. - -In the elaborate case (pipeline in a cartographer supplychain), it continuously -runs tests for a Go app on every commit, then builds a container image that -gets pushed to a container image registry, then deploys that using a plain -Kubernetes Deployment. - - - - SupplyChain - - - (src) (src) (img) - SOURCE-PROVIDER <--------- TESTS ---------------------- IMAGE --------- DEPLOYMENT - . . . . - . . . . - . carto.run/Pipeline . appsv1/Deployment - flux/GitRepository | kpack/Image - ' | - tekton.dev/PipelineRun ' - kpack/Build - - - -Check out [./examples](./examples). - - -### installing - -You can find a release manifest under the [releases directory](./releases). - -All it takes to install pipeline-service is submitting that manifest to your -Kubernetes cluster: - -```bash -kapp deploy -a pipeline-service -f ./releases/release.yaml -``` -```console -TODO -``` - -Somes examples in this repository depends on a few other controllers (flux' -source-controller, cert-manager, cartographer, kpack, and tekton), which must -be installed if you want to run them. - -Make sure you check out the examples' READMEs before proceeding with them. diff --git a/experiments/pipeline-service/assets/01-pipeline.png b/experiments/pipeline-service/assets/01-pipeline.png deleted file mode 100644 index 7085edcaa..000000000 Binary files a/experiments/pipeline-service/assets/01-pipeline.png and /dev/null differ diff --git a/experiments/pipeline-service/assets/02-pipeline.png b/experiments/pipeline-service/assets/02-pipeline.png deleted file mode 100644 index f3d5c2104..000000000 Binary files a/experiments/pipeline-service/assets/02-pipeline.png and /dev/null differ diff --git a/experiments/pipeline-service/cmd/controller/main.go b/experiments/pipeline-service/cmd/controller/main.go deleted file mode 100644 index 0ed6ebb86..000000000 --- a/experiments/pipeline-service/cmd/controller/main.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2021 VMware -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import ( - "context" - "fmt" - - "k8s.io/apimachinery/pkg/runtime" - "sigs.k8s.io/controller-runtime/pkg/client/config" - "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/log/zap" - "sigs.k8s.io/controller-runtime/pkg/manager" - - "github.com/vmware-tanzu/cartographer/experiments/pipeline-service/pkg/controller" -) - -func init() { - log.SetLogger(zap.New(zap.UseDevMode(true))) -} - -func run(ctx context.Context) error { - cfg, err := config.GetConfig() - if err != nil { - return fmt.Errorf("get config: %w", err) - } - - scheme := runtime.NewScheme() - if err := controller.AddToScheme(scheme); err != nil { - return fmt.Errorf("add to scheme: %w", err) - } - - mgr, err := manager.New(cfg, manager.Options{ - Scheme: scheme, - MetricsBindAddress: "0", - }) - if err != nil { - return fmt.Errorf("manager new: %w", err) - } - - if err := controller.RegisterControllers(mgr); err != nil { - return fmt.Errorf("register controllers: %w", err) - } - - if err := mgr.Start(ctx); err != nil { - return fmt.Errorf("manager start: %w", err) - } - - return nil -} - -func main() { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - if err := run(ctx); err != nil { - panic(err) - } -} diff --git a/experiments/pipeline-service/config/00-namespace.yaml b/experiments/pipeline-service/config/00-namespace.yaml deleted file mode 100644 index a4bb4b274..000000000 --- a/experiments/pipeline-service/config/00-namespace.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: v1 -kind: Namespace -metadata: - name: pipeline-service-system diff --git a/experiments/pipeline-service/config/01-serviceaccount.yaml b/experiments/pipeline-service/config/01-serviceaccount.yaml deleted file mode 100644 index c8ba9784c..000000000 --- a/experiments/pipeline-service/config/01-serviceaccount.yaml +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: v1 -kind: ServiceAccount -metadata: - name: pipeline-service-controller - namespace: pipeline-service-system diff --git a/experiments/pipeline-service/config/02-clusterrolebinding.yaml b/experiments/pipeline-service/config/02-clusterrolebinding.yaml deleted file mode 100644 index aae9b5aec..000000000 --- a/experiments/pipeline-service/config/02-clusterrolebinding.yaml +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: pipeline-service-cluster-admin -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-admin -subjects: - - kind: ServiceAccount - name: pipeline-service-controller - namespace: pipeline-service-system diff --git a/experiments/pipeline-service/config/02-deployment.yaml b/experiments/pipeline-service/config/02-deployment.yaml deleted file mode 100644 index 891f10d14..000000000 --- a/experiments/pipeline-service/config/02-deployment.yaml +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: apps/v1 -kind: Deployment -metadata: - name: pipeline-service-controller - namespace: pipeline-service-system -spec: - selector: - matchLabels: - app: pipeline-service-controller - replicas: 1 - revisionHistoryLimit: 0 - template: - metadata: - labels: - app: pipeline-service-controller - spec: - serviceAccount: pipeline-service-controller - containers: - - name: pipeline-service-controller - image: ko://github.com/vmware-tanzu/cartographer/experiments/pipeline-service/cmd/controller - securityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - runAsNonRoot: true - capabilities: - drop: - - all - resources: - requests: - cpu: 200m - memory: 200Mi diff --git a/experiments/pipeline-service/config/crd/bases/carto.run_pipelines.yaml b/experiments/pipeline-service/config/crd/bases/carto.run_pipelines.yaml deleted file mode 100644 index 8a3812c39..000000000 --- a/experiments/pipeline-service/config/crd/bases/carto.run_pipelines.yaml +++ /dev/null @@ -1,203 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.6.2 - creationTimestamp: null - name: pipelines.carto.run -spec: - group: carto.run - names: - kind: Pipeline - listKind: PipelineList - plural: pipelines - singular: pipeline - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Succeeded")].status - name: Succeeded - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - 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: - properties: - inputs: - description: Inputs define the parameters that should be passed onto - the run template. The contents of this field are used to provide - idempotency for the reconciler, being used to define a digest that's - compared before creating a new run. - type: object - x-kubernetes-preserve-unknown-fields: true - runTemplateName: - description: RunTemplateName is the name of the RunTemplate object - to use to dictate how to run an instance of a pipeline. - type: string - selector: - description: Selector is used for matching against an object to be - accessible for templating a Run (for instance, finding out the name - of a developer-provided tekton/Pipeline, or a ConfigMap to be embedded - in). - properties: - matchingLabels: - additionalProperties: - type: string - description: MatchingLabels indicates the label set to use when - searching for objects of a given gvr. - minProperties: 1 - type: object - resource: - description: Resource indicates a GVR to match against. - properties: - apiVersion: - description: APIVersion - type: string - kind: - description: Kind - type: string - required: - - apiVersion - - kind - type: object - required: - - matchingLabels - - resource - type: object - required: - - inputs - - runTemplateName - type: object - status: - properties: - conditions: - description: Conditions - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - latestInputs: - description: LatestInputs represents the set of inputs that were used - the last time that this reconciler observed a success for a run - that it created. - type: object - x-kubernetes-preserve-unknown-fields: true - latestOutputs: - description: LatestOutputs displays the set of outputs that were produced - in the last time that this reconciler observed a success for a run - that it created. - type: object - x-kubernetes-preserve-unknown-fields: true - required: - - conditions - type: object - required: - - metadata - - spec - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/experiments/pipeline-service/config/crd/bases/carto.run_runtemplates.yaml b/experiments/pipeline-service/config/crd/bases/carto.run_runtemplates.yaml deleted file mode 100644 index cdeca760c..000000000 --- a/experiments/pipeline-service/config/crd/bases/carto.run_runtemplates.yaml +++ /dev/null @@ -1,125 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.6.2 - creationTimestamp: null - name: runtemplates.carto.run -spec: - group: carto.run - names: - kind: RunTemplate - listKind: RunTemplateList - plural: runtemplates - singular: runtemplate - scope: Namespaced - 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: - properties: - completion: - description: Completion describe rules for determining whether the - invocation was successfull, failed, or is still running (neither - succeeded nor failed). - properties: - failed: - description: Failed provides the rule to evaluate to determine - if the invocation succeeded or failed. - properties: - key: - description: Key is the gjson query the perform to retrieve - an indication of success/failure. - type: string - value: - description: Value is the expected result to indicate success/failure. - type: string - type: object - succeeded: - description: Succeeded provides the rule to evaluate to determine - if the invocation succeeded or failed. - properties: - key: - description: Key is the gjson query the perform to retrieve - an indication of success/failure. - type: string - value: - description: Value is the expected result to indicate success/failure. - type: string - type: object - type: object - outputs: - description: Outputs lets you specify rules for capturing results - from the pipeline invocations. - items: - properties: - name: - description: Name indicates the value that should be used as - a key in the `carto.run/Pipeline`'s .status.latestOutputs. - type: string - path: - description: Path denotes the query that should be performed - to retrieve a value from the object stamped out according - to this RunTemplate template. - type: string - required: - - name - - path - type: object - type: array - x-kubernetes-preserve-unknown-fields: true - template: - description: "Template is the template that should be stamped out - when submitting a new pipeline invocation. \n To this template are - made available: \n \t- the pipeline object that is referencing this - RunTemplate \t- (optional) the object that matched the Pipeline's - selection rules. \n For instance: \n \tkind: ConfigMap \tapiVersion: - v1 \tmetadata: \t generateName: $(pipeline.metadata.name)- \tdata: - \t foo: $(selected.metadata.name)" - type: object - x-kubernetes-preserve-unknown-fields: true - required: - - template - type: object - required: - - metadata - - spec - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/experiments/pipeline-service/examples/01-tekton-standalone/00-tekton-pipeline.yaml b/experiments/pipeline-service/examples/01-tekton-standalone/00-tekton-pipeline.yaml deleted file mode 100644 index 6280a5ae0..000000000 --- a/experiments/pipeline-service/examples/01-tekton-standalone/00-tekton-pipeline.yaml +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: tekton.dev/v1beta1 -kind: Pipeline -metadata: - name: standalone -spec: - params: - - name: source-url - - name: source-revision - tasks: - - name: test - params: - - name: source-url - value: $(params.source-url) - - name: source-revision - value: $(params.source-revision) - taskSpec: - params: - - name: source-url - - name: source-revision - steps: - - name: test - image: golang - script: |- - cd `mktemp -d` - - git clone $(params.source-url) . - git checkout $(params.source-revision) - - go test -v ./... diff --git a/experiments/pipeline-service/examples/01-tekton-standalone/01-tekton-pipeline-run.yaml b/experiments/pipeline-service/examples/01-tekton-standalone/01-tekton-pipeline-run.yaml deleted file mode 100644 index 8939d3fcb..000000000 --- a/experiments/pipeline-service/examples/01-tekton-standalone/01-tekton-pipeline-run.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: tekton.dev/v1beta1 -kind: PipelineRun -metadata: - name: standalone-run-1 -spec: - pipelineRef: {name: standalone} - params: - - name: source-url - value: https://github.com/kontinue/hello-world - - name: source-revision - value: 19769456b6b229b3e78f2b90eced15a353eb4e7c diff --git a/experiments/pipeline-service/examples/01-tekton-standalone/02-tekton-pipeline-run.yaml b/experiments/pipeline-service/examples/01-tekton-standalone/02-tekton-pipeline-run.yaml deleted file mode 100644 index c65bb259a..000000000 --- a/experiments/pipeline-service/examples/01-tekton-standalone/02-tekton-pipeline-run.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: tekton.dev/v1beta1 -kind: PipelineRun -metadata: - name: standalone-run-2 -spec: - pipelineRef: {name: standalone} - params: - - name: source-url - value: https://github.com/kontinue/hello-world - - name: source-revision - value: 3d42c19a618bb8fc13f72178b8b5e214a2f989c4 diff --git a/experiments/pipeline-service/examples/01-tekton-standalone/README.md b/experiments/pipeline-service/examples/01-tekton-standalone/README.md deleted file mode 100644 index 6ec05354b..000000000 --- a/experiments/pipeline-service/examples/01-tekton-standalone/README.md +++ /dev/null @@ -1,180 +0,0 @@ -# Standalone Tekton Pipeline - -Here you'll find an example that demonstrates how you get to run Tekton -pipelines without the help of [cartographer] and pipeline-service. - -## Context - -Pipeline runners like [tekton], [argo-workflows], or even [kubernetes jobs] -don't provide a declarative way of expressing the intention of having a given -pipeline run whenever a set of inputs change. - -For instance, with Tekton one can define a [tekton/Pipeline], which defines a -series of [tekton/Task]s that accomplish a specific build or delivery goal, but -to actually run it, a [tekton/PipelineRun] object (pointing at the -tekton/Pipeline) must be submitted to Kubernetes so that Tekton actually runs -it. - -i.e.: - -1. define tekton/Tasks -2. define tekton/Pipeline that points at those tasks -3. define a tekton/PipelineRun with the parameters specified each time you want - to actually run it - -Because tekton itself doesn't provide a way of automatically running those -pipelines, [tekton-triggers] is usually used as a way of creating an endpoint -that source control management systems can make requests to so that on a new -commit, a new tekton/PipelineRun gets automatically created based on a -template. - -i.e.: -1. define tekton/Tasks -2. define tekton/Pipeline -3. define triggers/EventListener, for creating the endpoint to listen for webhook requests -4. define triggers/TriggerBinding, for mapping webhook content to parameters -4. define triggers/TriggerTemplate, for mapping parameters to tekton/PipelineRun - -_ps.: a very similar approach is taken by argo-workflows: [argo/Workflow] objects -represent the "running" of an [argo/WorkflowTemplate], but as you need somehow to -submit a Workflow anytime you want to run it, [argo-events] was created to let -you template out Workflow objects whenever there's a webhook request is made._ - -## Example - -### Prerequisites - -1. Kubernetes cluster, v1.19+ - -2. Tekton Pipelines - -```bash -kapp deploy --yes -a tekton -f https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.27.2/release.yaml -``` -```console -Target cluster 'https://127.0.0.1:39233' (nodes: kind-control-plane) - -Changes - -Namespace Name Kind Conds. Age Op Op st. Wait to Rs Ri -(cluster) clustertasks.tekton.dev CustomResourceDefinition - - create - reconcile - - -^ conditions.tekton.dev CustomResourceDefinition - - create - reconcile - - -^ config.webhook.pipeline.tekton.dev ValidatingWebhookConfiguration - - create - reconcile - - -^ pipelineresources.tekton.dev CustomResourceDefinition - - create - reconcile - - -... - -7:57:19AM: ok: reconcile deployment/tekton-pipelines-controller (apps/v1) namespace: tekton-pipelines -7:57:19AM: ok: reconcile deployment/tekton-pipelines-webhook (apps/v1) namespace: tekton-pipelines -7:57:19AM: ---- applying complete [47/47 done] ---- -7:57:19AM: ---- waiting complete [47/47 done] ---- - -Succeeded -``` - -ps.: refer to [tekton] for more details. - - -### Running - -In this example, we have two files: - -- [00-tekton-pipeline.yaml](./00-tekton-pipeline.yaml) contains the definition - of the tekton/Pipeline that declares the set of tasks we should run for a - given set of parameters (as mentioned before, it's just a "blueprint", it - doesn't run by itself) - -- [01-tekton-pipeline-run.yaml](./01-tekton-pipeline-runs.yaml) contains two - tekton/PipelineRun objects that represents the instantiation of runs - one - for a particular commit, and another for another. For each commit that we'd - like to run the pipeline against, we'd need to create one of these. - -- [02-tekton-pipeline-run.yaml](./02-tekton-pipeline-runs.yaml) same as the - other PipelineRun, but with a different set of parameters used in the - invocation. - -First, submit the `tekton/Pipeline` object from `00-tekton-pipeline.yaml`, the -definition of a blueprint of tasks that should be performed given a set of -parameters. - -```bash -kubectl apply -f ./00-tekton-pipeline.yaml -``` -```console -pipeline.tekton.dev/standalone created -``` - -With the definition there, now submit the first pipeline run invocation: - -```bash -kubectl apply -f ./01-tekton-pipeline-run.yaml -``` -```console -pipelinerun.tekton.dev/standalone-run-1 created -``` - -And then, using [tkn], the Tekton CLI, observe its result: - -```bash -tkn pipelinerun describe standalone-run-1 -``` -```console -Name: standalone-run-1 -Namespace: default -Pipeline Ref: standalone -Service Account: default -Timeout: 1h0m0s -Labels: - tekton.dev/pipeline=standalone - -🌡️ Status - -STARTED DURATION STATUS -4 minutes ago 17 seconds Succeeded - - -⚓ Params - - NAME VALUE - ∙ source-url https://github.com/kontinue/hello-world - ∙ source-revision 19769456b6b229b3e78f2b90eced15a353eb4e7c - - -🗂 Taskruns - - NAME TASK NAME STARTED DURATION STATUS - ∙ standalone-run-1-test-f62b4 test 4 minutes ago 17 seconds Succeeded -``` - -But then now, if we'd like to actually run against the latest commit of our -repository, we can't just expect that the tekton/Pipeline will magically -discover that - we have to create a new pipeline run invocation object with the -parameter set with the revision that we want to run tests against: - -```bash -kubectl apply -f ./02-tekton-pipeline-run.yaml -``` -```console -pipelinerun.tekton.dev/standalone-run-2 created -``` - ---- - -As we'll see in [next example], we can instead of manually submitting those -tekton/PipelineRun objects, have that templated in a way that pipeline-service -can take care of ensuring that they get submitted when we have new revisions. - - -[argo-events]: https://github.com/argoproj/argo-events -[argo-workflows]: https://github.com/argoproj/argo-workflows -[argo/WorkflowTemplate]: https://github.com/argoproj/argo-workflows/blob/master/docs/workflow-templates.md -[argo/Workflow]: https://github.com/argoproj/argo-workflows/blob/master/docs/workflow-concepts.md -[cartographer]: https://github.com/vmware-tanzu/cartographer -[kubernetes jobs]: https://kubernetes.io/docs/concepts/workloads/controllers/job/ -[tekton-triggers]: https://github.com/tektoncd/triggers -[tekton/PipelineRun]: https://github.com/tektoncd/pipeline/blob/main/docs/pipelineruns.md -[tekton/Pipeline]: https://github.com/tektoncd/pipeline/blob/main/docs/pipelines.md -[tekton/Task]: https://github.com/tektoncd/pipeline/blob/main/docs/tasks.md -[tekton]: https://github.com/tektoncd/pipeline -[tkn]: https://github.com/tektoncd/cli - -[next example]: ../02-simple-pipeline-service diff --git a/experiments/pipeline-service/examples/02-simple-pipeline-service/README.md b/experiments/pipeline-service/examples/02-simple-pipeline-service/README.md deleted file mode 100644 index a22fe0cdd..000000000 --- a/experiments/pipeline-service/examples/02-simple-pipeline-service/README.md +++ /dev/null @@ -1,194 +0,0 @@ -# Using carto.run/Pipeline to run Tekton Pipelines - -`pipeline-service` extends Kubernetes to provide the ability to express (in a -declarative form) the desire to have a pipeline run and ensure that it does so -on any change to its specification. - -Like we mentioned in the [previous example], in order to get a -[tekton/Pipeline] to run, we must submit an "invocation object": -[tekton/PipelineRun]. - - - -``` - - """"""""" """""""""" - blueprint invocation - """"""""" """""""""" - - - tekton/Pipeline tekton/PipelineRun - name: foo <------. name: invocation-1 - | - '------ pipelineRef: {name: foo} - params: params: - - name: url - {name: url, value: git.com/foo} - - name: revision - {name: revision, value: f00b4r} - - tasks: - - steps: - - script: |- - git clone $(params.url)$ - git checkout $(params.revision)$ -``` - -To make the creation of such invocations declarative, `pipeline-service` has -the `carto.run/RunTemplate` CRD: - - -```yaml -kind: RunTemplate -apiVersion: carto.run/v1alpha1 -metadata: - name: template -spec: - # - # definition of how the controller would be able to tell if the - # invocation finished successfully or not. - # - completion: - # - # let the controller know that to consider a PipelineRun succeeded, it must - # find under the conditions array an object with the field `type` with - # value 'Succeeded' to evaluate to `True`. - # - # - # for instance: - # - # status: - # conditions: - # - type: Succeeded ==> this run succeeded! - # status: True - # - # on the other hand, for detecting a failure: - # - # status: - # conditions: - # - type: Succeeded ==> this run failed! - # status: False - # - # - succeeded: {key: 'status.conditions.#(type=="Succeeded").status', value: "True"} - failed: {key: 'status.conditions.#(type=="Succeeded").status', value: "False"} - - # - # what should be stamped out to invoke a pipeline. - # - template: - apiVersion: tekton.dev/v1beta1 - kind: PipelineRun - metadata: - generateName: $(pipeline.metadata.name)$- - spec: - pipelineRef: {name: simple} - params: - - name: source-url - value: $(pipeline.spec.inputs.url)$ - - name: source-revision - value: $(pipeline.spec.inputs.revision)$ -``` - -With the definition of how invocations should be created, the next step is -providing the object that controls the inputs that are supplied to this -template: - - -```yaml -kind: Pipeline -apiVersion: carto.run/v1alpha1 -metadata: - name: pipeline -spec: - # - # name of the carto.run/RunTemplate object to pick up from this - # namespace to base invocations of - # - runTemplateName: simple - - # - # inputs that should be supplied to the pipeline invocations - # - inputs: - url: https://github.com/kontinue/hello-world - revision: 19769456b6b229b3e78f2b90eced15a353eb4e7c -``` - -This way, whenever an update to `pipeline.spec.inputs` occurs, the controller -takes care of instantiating a new invocation based on that -`carto.run/RunTemplate` and keeping track of whether it succeeded/failed. - - -## Running the example - -1. submit to kubernetes the objects in this directory - -```bash -kapp deploy -a example-simple -f . -``` -```console -Target cluster 'https://127.0.0.1:39233' (nodes: kind-control-plane) - -Changes - -Namespace Name Kind Conds. Age Op Op st. Wait to Rs Ri -default simple Pipeline - - create - reconcile - - -^ simple Pipeline - - create - reconcile - - -^ simple RunTemplate - - create - reconcile - - - -Op: 3 create, 0 delete, 0 update, 0 noop -Wait to: 3 reconcile, 0 delete, 0 noop - -Continue? [yN]: y -... -8:17:27AM: ok: reconcile pipeline/simple (tekton.dev/v1beta1) namespace: default -8:17:27AM: ---- applying complete [3/3 done] ---- -8:17:27AM: ---- waiting complete [3/3 done] ---- - -Succeeded -``` - - -2. observe that we got a tekton/PipelineRun (execution of a Tekton pipeline) - -```bash -kubectl tree pipelines.carto.run simple -``` -```console -GVK NAME -. carto.run/Pipeline simple -'---- tekton/PipelineRun simple-abcd - '---- tekton/TaskRun simple-abcd-test-defg - '---- Pod simple-abcd-test-defg-pod-deas -``` - -3. point the carto.run/Pipeline at a different revision - -```diff - apiVersion: carto.run/v1alpha1 - kind: Pipeline - metadata: - name: pipeline - spec: - inputs: - url: https://github.com/kontinue/hello-world -- revision: 19769456b6b229b3e78f2b90eced15a353eb4e7c -+ revision: 3d42c19a618bb8fc13f72178b8b5e214a2f989c4 -``` - -6. observe that a new tekton/PipelineRun was created - -```diff - . carto.run/Pipeline simple - +---- tekton/PipelineRun simple-abcd - | '---- tekton/TaskRun simple-abcd-test-defg - | -+ '---- tekton/PipelineRun simple-ncbd-test -+ '---- tekton/TaskRun simple-ncbd-test-lksd -``` - - -[tekton/PipelineRun]: https://github.com/tektoncd/pipeline/blob/main/docs/pipelineruns.md -[tekton/Pipeline]: https://github.com/tektoncd/pipeline/blob/main/docs/pipelines.md - -[previous example]: ../01-tekton-standalone - diff --git a/experiments/pipeline-service/examples/02-simple-pipeline-service/pipeline-service-pipeline.yaml b/experiments/pipeline-service/examples/02-simple-pipeline-service/pipeline-service-pipeline.yaml deleted file mode 100644 index f7af28a31..000000000 --- a/experiments/pipeline-service/examples/02-simple-pipeline-service/pipeline-service-pipeline.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - ---- -apiVersion: carto.run/v1alpha1 -kind: Pipeline -metadata: - name: simple -spec: - runTemplateName: simple - - inputs: - url: https://github.com/kontinue/hello-world - revision: 19769456b6b229b3e78f2b90eced15a353eb4e7c diff --git a/experiments/pipeline-service/examples/02-simple-pipeline-service/pipeline-service-run-template.yaml b/experiments/pipeline-service/examples/02-simple-pipeline-service/pipeline-service-run-template.yaml deleted file mode 100644 index 0792cbb10..000000000 --- a/experiments/pipeline-service/examples/02-simple-pipeline-service/pipeline-service-run-template.yaml +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: RunTemplate -metadata: - name: simple -spec: - completion: - succeeded: {key: 'status.conditions.#(type=="Succeeded").status', value: "True"} - failed: {key: 'status.conditions.#(type=="Succeeded").status', value: "False"} - - template: - apiVersion: tekton.dev/v1beta1 - kind: PipelineRun - metadata: - generateName: $(pipeline.metadata.name)$- - spec: - pipelineRef: {name: simple} - params: - - name: source-url - value: $(pipeline.spec.inputs.url)$ - - name: source-revision - value: $(pipeline.spec.inputs.revision)$ diff --git a/experiments/pipeline-service/examples/02-simple-pipeline-service/tekton-pipeline.yaml b/experiments/pipeline-service/examples/02-simple-pipeline-service/tekton-pipeline.yaml deleted file mode 100644 index a430dfe73..000000000 --- a/experiments/pipeline-service/examples/02-simple-pipeline-service/tekton-pipeline.yaml +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: tekton.dev/v1beta1 -kind: Pipeline -metadata: - name: simple -spec: - params: - - name: source-url - - name: source-revision - tasks: - - name: test - params: - - name: source-url - value: $(params.source-url) - - name: source-revision - value: $(params.source-revision) - taskSpec: - params: - - name: source-url - - name: source-revision - steps: - - name: test - image: golang - script: |- - cd `mktemp -d` - - git clone $(params.source-url) . - git checkout $(params.source-revision) - - go test -v ./... diff --git a/experiments/pipeline-service/examples/03-pipeline-service-with-selector/README.md b/experiments/pipeline-service/examples/03-pipeline-service-with-selector/README.md deleted file mode 100644 index 670ea1186..000000000 --- a/experiments/pipeline-service/examples/03-pipeline-service-with-selector/README.md +++ /dev/null @@ -1,115 +0,0 @@ -# Matching user-provided objects - -In the [previous example], we went through the process of creating a -`carto.run/RunTemplate` that describes how invocations of `tekton/Pipeline`s -(i.e., `tekton/PipelineRun` objects) should look like. - -Here we make use of an additional feature of `carto.run/Pipeline`: supplying -information about external objects to the `carto.run/RunTemplate` templates. - - -## The example - -Imagine that we have two groups: - -- operators, not familiar with the details of the applications being developed, - but very well acquainted with Tekton and Kubernetes in general - -- contracted app developers, experts in Go and the applications their - developing, but not familiar with neither Kubernetes nor Tekton. - - -In this case, it'd be great if: - -1. operators could provide the definitions of how Tekton pipelines should be run - according to their companies best practices - -2. contracted developers could "just plug in" scripts to run their tests - -Still being Kubernetes-native, **developers** would then supply their test -configuration via ConfigMaps, labelled with their "team id": - -```yaml -kind: ConfigMap -apiVersion: v1 -metadata: - name: team-1-testing-scripts - labels: - pipelines.carto.run/id: "one" -data: - 01-unit.sh: |- - go test -v ./... -``` - -**operators**, very familiar with Kubernetes, would then take care of defining -the common tekton/Pipeline, the definition of how to invoke the tekton/Pipeline -(i.e., the `carto.run/RunTemplate`), and the definition of the -`carto.run/Pipeline`s which point at that single `carto.run/RunTemplate`. - -The detail here is that those operators would need to include in the -`carto.run/RunTemplate` information about the `ConfigMap`s supplied by the -developers. - -To enable that, `pipeline-service` provides an extra field under -carto.run/Pipeline: `spec.selector`. - -```yaml -apiVersion: carto.run/v1alpha1 -kind: Pipeline -metadata: - name: pipeline-1 -spec: - runTemplateName: tekton - - inputs: - url: https://github.com/kontinue/hello-world - revision: 19769456b6b229b3e78f2b90eced15a353eb4e7c - - selector: - resource: - apiVersion: v1 - kind: ConfigMap - matchingLabels: - pipelines.carto.run/id: "one" -``` - -making available to the `carto.run/RunTemplate` as extra interpolation field: -`$(selected.<>)$`. - -```yaml -apiVersion: carto.run/v1alpha1 -kind: RunTemplate -metadata: - name: tekton -spec: - template: - apiVersion: tekton.dev/v1beta1 - kind: PipelineRun - metadata: - generateName: $(pipeline.metadata.name)$- - spec: - # ... - workspaces: - - name: commands - configmap: - name: $(selected.metadata.name)$ -``` - -In summary, we have the following: - - -``` -.── devs -│   │ (no k8s knowledge required) -│   ├── commands-dev-1.yaml // configmap -│   └── commands-dev-2.yaml // configmap -│ -└── operators - ├── pipeline-service-pipeline-1.yaml // carto.run/Pipeline matching on dev-1 - ├── pipeline-service-pipeline-2.yaml // carto.run/Pipeline matching on dev-2 - ├── pipeline-service-run-template.yaml // single carto.run/RunTemplate - └── tekton-pipeline.yaml // single tekton/Pipeline and set of common tasks -``` - - -[previous example]: ../02-simple-pipeline-service diff --git a/experiments/pipeline-service/examples/03-pipeline-service-with-selector/devs/commands-dev-1.yaml b/experiments/pipeline-service/examples/03-pipeline-service-with-selector/devs/commands-dev-1.yaml deleted file mode 100644 index 25cc40ac8..000000000 --- a/experiments/pipeline-service/examples/03-pipeline-service-with-selector/devs/commands-dev-1.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -kind: ConfigMap -apiVersion: v1 -metadata: - name: configmap-1 - labels: - pipelines.carto.run/id: "one" -data: - 01-test.sh: |- - echo "from configmap 1" - go test -v ./... diff --git a/experiments/pipeline-service/examples/03-pipeline-service-with-selector/devs/commands-dev-2.yaml b/experiments/pipeline-service/examples/03-pipeline-service-with-selector/devs/commands-dev-2.yaml deleted file mode 100644 index 98b7e1d46..000000000 --- a/experiments/pipeline-service/examples/03-pipeline-service-with-selector/devs/commands-dev-2.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -kind: ConfigMap -apiVersion: v1 -metadata: - name: configmap-2 - labels: - pipelines.carto.run/id: "two" -data: - 01-test.sh: |- - echo "from configmap 2" - go test -v ./... diff --git a/experiments/pipeline-service/examples/03-pipeline-service-with-selector/operators/pipeline-service-pipeline-1.yaml b/experiments/pipeline-service/examples/03-pipeline-service-with-selector/operators/pipeline-service-pipeline-1.yaml deleted file mode 100644 index c9a0fcf0a..000000000 --- a/experiments/pipeline-service/examples/03-pipeline-service-with-selector/operators/pipeline-service-pipeline-1.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: Pipeline -metadata: - name: pipeline-1 -spec: - runTemplateName: tekton - - selector: - resource: - apiVersion: v1 - kind: ConfigMap - matchingLabels: - pipelines.carto.run/id: "one" - - inputs: - url: https://github.com/kontinue/hello-world - revision: 19769456b6b229b3e78f2b90eced15a353eb4e7c diff --git a/experiments/pipeline-service/examples/03-pipeline-service-with-selector/operators/pipeline-service-pipeline-2.yaml b/experiments/pipeline-service/examples/03-pipeline-service-with-selector/operators/pipeline-service-pipeline-2.yaml deleted file mode 100644 index 4b7da0b50..000000000 --- a/experiments/pipeline-service/examples/03-pipeline-service-with-selector/operators/pipeline-service-pipeline-2.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: Pipeline -metadata: - name: pipeline-2 -spec: - runTemplateName: tekton - - selector: - resource: - apiVersion: v1 - kind: ConfigMap - matchingLabels: - pipelines.carto.run/id: "two" - - inputs: - url: https://github.com/kontinue/hello-world - revision: 19769456b6b229b3e78f2b90eced15a353eb4e7c diff --git a/experiments/pipeline-service/examples/03-pipeline-service-with-selector/operators/pipeline-service-run-template.yaml b/experiments/pipeline-service/examples/03-pipeline-service-with-selector/operators/pipeline-service-run-template.yaml deleted file mode 100644 index ed7e40737..000000000 --- a/experiments/pipeline-service/examples/03-pipeline-service-with-selector/operators/pipeline-service-run-template.yaml +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: RunTemplate -metadata: - name: tekton -spec: - completion: - succeeded: {key: 'status.conditions.#(type=="Succeeded").status', value: "True"} - failed: {key: 'status.conditions.#(type=="Succeeded").status', value: "False"} - - template: - apiVersion: tekton.dev/v1beta1 - kind: PipelineRun - metadata: - generateName: $(pipeline.metadata.name)$- - spec: - pipelineRef: {name: commands-via-configmaps} - - params: - - name: source-url - value: $(pipeline.spec.inputs.url)$ - - name: source-revision - value: $(pipeline.spec.inputs.revision)$ - - workspaces: - - name: source - volumeClaimTemplate: - spec: - accessModes: [ ReadWriteOnce ] - resources: - requests: - storage: 5Gi - - name: commands - configmap: - name: $(selected.metadata.name)$ diff --git a/experiments/pipeline-service/examples/03-pipeline-service-with-selector/operators/tekton-pipeline.yaml b/experiments/pipeline-service/examples/03-pipeline-service-with-selector/operators/tekton-pipeline.yaml deleted file mode 100644 index c773245ac..000000000 --- a/experiments/pipeline-service/examples/03-pipeline-service-with-selector/operators/tekton-pipeline.yaml +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: tekton.dev/v1beta1 -kind: Pipeline -metadata: - name: commands-via-configmaps -spec: - params: - - name: source-url - - name: source-revision - workspaces: - - name: source - - name: commands - tasks: - - name: git-clone - taskRef: - name: git-clone - workspaces: - - name: source - workspace: source - params: - - name: source-url - value: $(params.source-url) - - name: source-revision - value: $(params.source-revision) - - name: run-command - runAfter: [git-clone] - taskRef: - name: run-commands-in-workspace - workspaces: - - name: source - workspace: source - - name: commands - workspace: commands - ---- -apiVersion: tekton.dev/v1beta1 -kind: Task -metadata: - name: git-clone -spec: - params: - - name: source-url - - name: source-revision - workspaces: - - name: source - steps: - - name: main - image: golang - workingDir: $(workspaces.source.path) - script: |- - #!/bin/bash - set -o errexit - - export GIT_DISCOVERY_ACROSS_FILESYSTEM=true - git clone $(params.source-url) . - git checkout $(params.source-revision) - ---- -apiVersion: tekton.dev/v1beta1 -kind: Task -metadata: - name: run-commands-in-workspace -spec: - workspaces: - - name: source - - name: commands - steps: - - name: main - image: golang - workingDir: $(workspaces.source.path) - script: |- - #!/bin/bash - set -o errexit - set -o pipefail - - find $(workspaces.commands.path) -name "*.sh" -maxdepth 1 | xargs -n1 bash diff --git a/experiments/pipeline-service/examples/04-simple-supply-chain/README.md b/experiments/pipeline-service/examples/04-simple-supply-chain/README.md deleted file mode 100644 index 45357e155..000000000 --- a/experiments/pipeline-service/examples/04-simple-supply-chain/README.md +++ /dev/null @@ -1,102 +0,0 @@ -# Automatically mutating carto.run/Pipeline to achieve testing for every commit - -## Example - -### Prerequisites - -1. Kubernetes cluster, v1.19+ - -2. Tekton Pipelines - -```bash -kapp deploy --yes -a tekton -f https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.27.2/release.yaml -``` -```console -Target cluster 'https://127.0.0.1:39233' (nodes: kind-control-plane) - -Changes - -Namespace Name Kind Conds. Age Op Op st. Wait to Rs Ri -(cluster) clustertasks.tekton.dev CustomResourceDefinition - - create - reconcile - - -^ conditions.tekton.dev CustomResourceDefinition - - create - reconcile - - -^ config.webhook.pipeline.tekton.dev ValidatingWebhookConfiguration - - create - reconcile - - -^ pipelineresources.tekton.dev CustomResourceDefinition - - create - reconcile - - -... - -7:57:19AM: ok: reconcile deployment/tekton-pipelines-controller (apps/v1) namespace: tekton-pipelines -7:57:19AM: ok: reconcile deployment/tekton-pipelines-webhook (apps/v1) namespace: tekton-pipelines -7:57:19AM: ---- applying complete [47/47 done] ---- -7:57:19AM: ---- waiting complete [47/47 done] ---- - -Succeeded -``` - -ps.: refer to [tekton] for more details. - - -3. Cartographer - -See installation at [cartographer]'s README. - - -[cartographer]: https://github.com/vmware-tanzu/cartographer - -### Running - -0. Fork the repository and update the `carto.run/Workload` object - ([devs/workload.yaml](./devs/workload.yaml)) to point at the fork - -```diff - apiVersion: carto.run/v1alpha1 - kind: Workload - metadata: - name: dev-1-master - labels: - app.tanzu.vmware.com/workload-type: web - spec: - source: - git: -- url: https://github.com/kontinue/hello-world -+ url: https://github.com/YOUR_USER/hello-world - ref: {branch: main} -``` - -1. Submit the files to Kubernetes - -```bash -kapp deploy -a example -f . -``` -```console -``` - -2. Observe that we get a `tekton/PipelineRun` for the latest commit in the - repository - - -```bash -kubectl get pipelinerun -``` -```console -``` - - -3. See a new `tekton/PipelineRun` for a new commit that we push - -First, start by cloning the forked repository and then pushing a change: - -```bash -pushd `mktemp -d` -git clone https://github.com/YOUR_USER/hello-world . -touch no-op.txt -git add --all && git commit -m "no-op" && git push origin HEAD -popd -``` - -That done, observe that in a few moments a new `tekton/PipelineRun` gets -automatically created with no need of patching anything else in Kubernetes. - -```bash -kubectl get pipelinerun -``` -```console -``` diff --git a/experiments/pipeline-service/examples/04-simple-supply-chain/devs/workload.yaml b/experiments/pipeline-service/examples/04-simple-supply-chain/devs/workload.yaml deleted file mode 100644 index 810716e07..000000000 --- a/experiments/pipeline-service/examples/04-simple-supply-chain/devs/workload.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: Workload -metadata: - name: dev-1-master - labels: - app.tanzu.vmware.com/workload-type: web -spec: - source: - git: - url: https://github.com/kontinue/hello-world - ref: {branch: main} diff --git a/experiments/pipeline-service/examples/04-simple-supply-chain/operators/pipeline-service-run-template.yaml b/experiments/pipeline-service/examples/04-simple-supply-chain/operators/pipeline-service-run-template.yaml deleted file mode 100644 index 0792cbb10..000000000 --- a/experiments/pipeline-service/examples/04-simple-supply-chain/operators/pipeline-service-run-template.yaml +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: RunTemplate -metadata: - name: simple -spec: - completion: - succeeded: {key: 'status.conditions.#(type=="Succeeded").status', value: "True"} - failed: {key: 'status.conditions.#(type=="Succeeded").status', value: "False"} - - template: - apiVersion: tekton.dev/v1beta1 - kind: PipelineRun - metadata: - generateName: $(pipeline.metadata.name)$- - spec: - pipelineRef: {name: simple} - params: - - name: source-url - value: $(pipeline.spec.inputs.url)$ - - name: source-revision - value: $(pipeline.spec.inputs.revision)$ diff --git a/experiments/pipeline-service/examples/04-simple-supply-chain/operators/supply-chain-templates.yaml b/experiments/pipeline-service/examples/04-simple-supply-chain/operators/supply-chain-templates.yaml deleted file mode 100644 index fdf011f46..000000000 --- a/experiments/pipeline-service/examples/04-simple-supply-chain/operators/supply-chain-templates.yaml +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: ClusterSourceTemplate -metadata: - name: git-repository -spec: - urlPath: .status.artifact.url - revisionPath: .status.artifact.revision - - template: - apiVersion: source.toolkit.fluxcd.io/v1beta1 - kind: GitRepository - metadata: - name: $(workload.metadata.name)$ - spec: - interval: 1m - url: $(workload.spec.source.git.url)$ - ref: $(workload.spec.source.git.ref)$ - gitImplementation: libgit2 - ignore: "" - ---- -apiVersion: carto.run/v1alpha1 -kind: ClusterSourceTemplate -metadata: - name: testing-pipeline -spec: - urlPath: .status.latestInputs.params[?(@.name=="source-url")].value - revisionPath: .status.latestInputs.params[?(@.name=="source-revision")].value - - template: - apiVersion: carto.run/v1alpha1 - kind: Pipeline - metadata: - name: $(workload.metadata.name)$ - spec: - runTemplateName: simple - - inputs: - url: $(sources[0].url)$ - revision: $(sources[0].revision)$ diff --git a/experiments/pipeline-service/examples/04-simple-supply-chain/operators/supply-chain.yaml b/experiments/pipeline-service/examples/04-simple-supply-chain/operators/supply-chain.yaml deleted file mode 100644 index 0b9242c46..000000000 --- a/experiments/pipeline-service/examples/04-simple-supply-chain/operators/supply-chain.yaml +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# the supplychain provides the blueprint for how a workload should go from -# source code to an app running somewhere (or an artifact delivered). -# -apiVersion: carto.run/v1alpha1 -kind: ClusterSupplyChain -metadata: - name: supply-chain -spec: - selector: - app.tanzu.vmware.com/workload-type: web - - # - # - # source-provider <--[src]-- source-tester - # - # - components: - - name: source-provider - templateRef: - kind: ClusterSourceTemplate - name: git-repository - - - name: source-tester - templateRef: - kind: ClusterSourceTemplate - name: testing-pipeline - sources: - - component: source-provider - name: source diff --git a/experiments/pipeline-service/examples/04-simple-supply-chain/operators/tekton-pipeline.yaml b/experiments/pipeline-service/examples/04-simple-supply-chain/operators/tekton-pipeline.yaml deleted file mode 100644 index 43190f6d4..000000000 --- a/experiments/pipeline-service/examples/04-simple-supply-chain/operators/tekton-pipeline.yaml +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: tekton.dev/v1beta1 -kind: Pipeline -metadata: - name: simple -spec: - params: - - name: source-url - - name: source-revision - tasks: - - name: test - params: - - name: source-url - value: $(params.source-url) - - name: source-revision - value: $(params.source-revision) - taskSpec: - params: - - name: source-url - - name: source-revision - steps: - - name: test - image: golang - script: |- - cd `mktemp -d` - - wget -qO- $(params.source-url) | tar xvz - go test -v ./... diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/README.md b/experiments/pipeline-service/examples/05-complete-supply-chain/README.md deleted file mode 100644 index 73e44cc95..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/README.md +++ /dev/null @@ -1,151 +0,0 @@ -# carto.run/Pipeline in a carto.run/ClusterSupplyChain - -**tl;dr:** `git -> pipeline -> img -> deployment` for any git repo indicated by -a workload. - ---- - -In the previous examples, we were making use of `carto.run/Pipeline` as a way -of describing the set of inputs that we'd like some form of pipeline to run -with - - -![](../../assets/01-pipeline.png) - - -which, when having that set of inputs updated, it'd then create a new run for -us. - - -![](../../assets/02-pipeline.png) - - -But, manually updating that spec is not really practical - on every commit, -someone would need to manually patch the spec in order to have a pipeline -executed to test that commit. - -Not to mention that for each repository, we'd need to take care of creating new -Pipeline objects, etc etc. - -Here is where [cartographer] enters the game. - - -## Cartographer - -Making use of Cartographer, which provides us with the [ClusterSupplyChain] -primitive, we're able to tie different Kubernetes resources together in a way -that the reconciler choreographs passing data from one component to the next, -allowing us to effectively chain these disparate resources together to form a -software supply chain. - -For instance, [fluxcd/GitRepository] provides us with the ability of keeping -track of commits that landed in a repository, exposing under `.status.artifact` -that information - exactly what we'd like to plug into our `carto.run/Pipeline` -spec! - - - -``` -kind: GitRepository -apiVersion: source.toolkit.fluxcd.io/v1beta1 -spec: - url: -status: - artifact: - url: http://source-controller./b871db69.tar.gz ---. - revision: b871db69 -------------------------------|-----. - | | - | | ---- | | -kind: Pipeline | | -apiVersion: carto.run/v1alpha1 | | -spec: | | - inputs: | | - source: | | - url: <-------' | - revision: <-------------' - -``` - -Using `carto.run` terminology, that means that we can wrap a `GitRepository` in -a [ClusterSourceTemplate], as it provides source code information, and then -connect that to the `carto.run/Pipeline` making it consume that source -information, and then voilà, we now have the ability of running pipelines -whenever there's a new commit to a git repository. - - -## The example - -Like mentioned before, rather than having the `carto.run/Pipeline` object -carrying a hardcoded `revision` in its `spec.inputs` as in the previous -example, here we make use of [ClusterSupplyChain] to tie together a set -unrelated resources to bring code from source code to a container image in a -registry to a deployment. - - - -``` -SUPPLYCHAIN - - - ............... ............... .............. .......... - source-provider <----src---- pipeline-runner <----src---- image-provider <--img-- app-runner - ............... ............... .............. .......... - . . . . - . . . . - . . . . - fluxcd/GitRepository carto.run/Pipeline kpack/Image Deployment - | - ' - tektoncd/PipelineRun[1...n] - -``` - - -Also, because the `GitRepository` object is actually templated out based on a -`carto.run/Workload` definition, if there's a new repository that we want to -onboard (to make it go through the same software supply chain), all it'd take -is the creation of a new `carto.run/Workload` and then the reconciler would take -care of creating all the objects and doing the whole choreography for us. - -In this example, this is demonstrated by the directories [./developer/dev-1] -and [./developer/dev-2]. - - - - -``` - - WORKLOAD-1: url=gitlab.eng.vmware.com/foo/bar - - source-provider <--src-- pipeline-runner <--src-- image-provider <---img---- app-runner - | | | | - ' ' ' ' - find commits for run pipeline against build and push container have a deployment - foo/bar repo commits of that repo image only for those using the img built - commmits that passed the based on foo/bar source - tests - - - - - WORKLOAD-2: url=gitlab.eng.vmware.com/something/else - - source-provider <--src-- pipeline-runner <--src-- image-provider <---img---- app-runner - | | | | - ' ' ' ' - find commits for run pipeline against build and push container have a deployment - something/else repo commits of that repo image only for those using the img built - commmits that passed the based on something/else - tests source - -``` - - -[ClusterSourceTemplate]: http://carto.run/docs/reference/#clustersourcetemplate -[ClusterSupplyChain]: http://carto.run/docs/reference/#clustersupplychain -[cartographer]: https://github.com/vmware-tanzu/cartographer -[fluxcd/GitRepository]: https://fluxcd.io/docs/components/source/gitrepositories/ - -[./developer/dev-1]: ./developer/dev-1 -[./developer/dev-2]: ./developer/dev-2 diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/app-operator/README.md b/experiments/pipeline-service/examples/05-complete-supply-chain/app-operator/README.md deleted file mode 100644 index e861fc967..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/app-operator/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# app operators - -Here's where the work of the app operators live, i.e., those defining what the -software supplychain should look like, thus, you'll find: - -- [supply chain](./supply-chain.yaml): the definition of the software supply - chain, i.e., the definition of the steps that source code will flow through - to get to a deployment - -- [supply chain templates](./supply-chain-templates.yaml): the definition of - how resources should be stamped out to carry work (e.g., the templates for - `kpack/Image`, `carto.run/Pipeline`, etc) - -- [pipeline service run template](./pipeline-service-run-template.yaml): - configuration supplied by the app operator to describe how the pipeline - service controller should deal with instantiating runs for pipeline - executions. diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/app-operator/pipeline-service-run-template.yaml b/experiments/pipeline-service/examples/05-complete-supply-chain/app-operator/pipeline-service-run-template.yaml deleted file mode 100644 index 13134322a..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/app-operator/pipeline-service-run-template.yaml +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: RunTemplate -metadata: - name: tekton -spec: - completion: - succeeded: {key: 'status.conditions.#(type=="Succeeded").status', value: "True"} - failed: {key: 'status.conditions.#(type=="Succeeded").status', value: "False"} - - template: - apiVersion: tekton.dev/v1beta1 - kind: PipelineRun - metadata: - generateName: $(pipeline.metadata.name)$- - spec: - pipelineRef: - name: $(selected.metadata.name)$ - params: $(pipeline.spec.inputs.params)$ diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/app-operator/supply-chain-templates.yaml b/experiments/pipeline-service/examples/05-complete-supply-chain/app-operator/supply-chain-templates.yaml deleted file mode 100644 index 2f848ea70..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/app-operator/supply-chain-templates.yaml +++ /dev/null @@ -1,141 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#@ load("@ytt:data", "data") ---- - -# -# -# `git-repository` instantiates a GitRepository object, responsible for -# keeping track of commits made to a git repository, making them available as -# blobs to further components in the supply chain. -# -# -apiVersion: carto.run/v1alpha1 -kind: ClusterSourceTemplate -metadata: - name: git-repository -spec: - urlPath: .status.artifact.url - revisionPath: .status.artifact.revision - - template: - apiVersion: source.toolkit.fluxcd.io/v1beta1 - kind: GitRepository - metadata: - name: $(workload.metadata.name)$ - spec: - interval: 1m - url: $(workload.spec.source.git.url)$ - ref: $(workload.spec.source.git.ref)$ - gitImplementation: libgit2 - ignore: "" - ---- -# -# -# `testing-pipeline` instantiates a `carto.run/Pipeline` object that runs a -# developer-provided Tekton pipeline, based on label matching. -# -# -apiVersion: carto.run/v1alpha1 -kind: ClusterSourceTemplate -metadata: - name: testing-pipeline -spec: - urlPath: .status.latestInputs.params[?(@.name=="source-url")].value - revisionPath: .status.latestInputs.params[?(@.name=="source-revision")].value - - template: - apiVersion: carto.run/v1alpha1 - kind: Pipeline - metadata: - name: $(workload.metadata.name)$ - spec: - runTemplateName: tekton - - selector: - resource: - apiVersion: tekton.dev/v1beta1 - kind: Pipeline - matchingLabels: - pipelines.carto.run/group: $(workload.metadata.labels['pipelines\.carto\.run/group'])$ - pipelines.carto.run/stage: testing - - inputs: - params: - - name: source-url - value: $(sources[0].url)$ - - name: source-revision - value: $(sources[0].revision)$ - - ---- -# -# -# `image-build` instantiates a `kpack/Image` object, responsible for ensuring that -# there's a container image built and pushed to a container image registry -# whenever there's either new source code, or its image builder gets na update. -# -# -apiVersion: carto.run/v1alpha1 -kind: ClusterImageTemplate -metadata: - name: image-build -spec: - imagePath: .status.latestImage - - template: - apiVersion: kpack.io/v1alpha1 - kind: Image - metadata: - name: $(workload.metadata.name)$ - spec: - tag: #@ data.values.image_prefix + "$(workload.metadata.name)$" - serviceAccount: service-account - builder: - kind: ClusterBuilder - name: go-builder - source: - blob: - url: $(sources[0].url)$ - ---- -# -# -# `app-deploy` instantiates a deployment making use of a built container image. -# -# -apiVersion: carto.run/v1alpha1 -kind: ClusterTemplate -metadata: - name: app-deploy -spec: - template: - apiVersion: apps/v1 - kind: Deployment - metadata: - name: $(workload.metadata.name)$ - spec: - selector: - matchLabels: - app: $(workload.metadata.name)$ - template: - metadata: - labels: - app: $(workload.metadata.name)$ - spec: - containers: - - name: main - image: $(images[0].image)$ diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/app-operator/supply-chain.yaml b/experiments/pipeline-service/examples/05-complete-supply-chain/app-operator/supply-chain.yaml deleted file mode 100644 index 538467497..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/app-operator/supply-chain.yaml +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# the supplychain provides the blueprint for how a workload should go from -# source code to an app running somewhere (or an artifact delivered). -# -apiVersion: carto.run/v1alpha1 -kind: ClusterSupplyChain -metadata: - name: supply-chain -spec: - selector: - app.tanzu.vmware.com/workload-type: web - - # - # - # source-provider <--[src]-- source-tester <--[src]-- image-builder <--[img]-- app-runner - # - # - components: - - name: source-provider - templateRef: - kind: ClusterSourceTemplate - name: git-repository - - - name: source-tester - templateRef: - kind: ClusterSourceTemplate - name: testing-pipeline - sources: - - component: source-provider - name: source - - - name: image-builder - templateRef: - kind: ClusterImageTemplate - name: image-build - sources: - - component: source-tester - name: source - - - name: app-runner - templateRef: - kind: ClusterTemplate - name: app-deploy - images: - - component: image-builder - name: image diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/cluster/README.md b/experiments/pipeline-service/examples/05-complete-supply-chain/cluster/README.md deleted file mode 100644 index ab96b9654..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/cluster/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# cluster setup - -Aside from having [cartographer] and pipeline-service installed in the cluster, -here we also pre-load a secret with some credentials so anyone running this -example can get [kpack] to build and push the image to a sample repository in -https://harbor-repo.vmware.com. - -Nothing interesting to see here regarding pipeline-service. - - -[cartographer]: https://github.com/vmware-tanzu/cartographer -[kpack]: https://github.com/pivotal/kpack diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/cluster/kpack.yaml b/experiments/pipeline-service/examples/05-complete-supply-chain/cluster/kpack.yaml deleted file mode 100644 index 56e8086c9..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/cluster/kpack.yaml +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#@ load("@ytt:data", "data") ---- -apiVersion: kpack.io/v1alpha1 -kind: ClusterStore -metadata: - name: go-store -spec: - sources: - - image: gcr.io/paketo-buildpacks/go - ---- -apiVersion: kpack.io/v1alpha1 -kind: ClusterStack -metadata: - name: stack -spec: - id: "io.buildpacks.stacks.bionic" - buildImage: - image: "paketobuildpacks/build:base-cnb" - runImage: - image: "paketobuildpacks/run:base-cnb" ---- -apiVersion: kpack.io/v1alpha1 -kind: ClusterBuilder -metadata: - name: go-builder -spec: - serviceAccountRef: - name: service-account - namespace: default - tag: #@ data.values.image_prefix + "go-builder" - stack: - name: stack - kind: ClusterStack - store: - name: go-store - kind: ClusterStore - order: - - group: - - id: paketo-buildpacks/go diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/cluster/rbac.yaml b/experiments/pipeline-service/examples/05-complete-supply-chain/cluster/rbac.yaml deleted file mode 100644 index 7b45fcb90..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/cluster/rbac.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: service-account -secrets: - - name: registry-credentials -imagePullSecrets: - - name: registry-credentials diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/cluster/secrets.yaml b/experiments/pipeline-service/examples/05-complete-supply-chain/cluster/secrets.yaml deleted file mode 100644 index b4ae9d8c7..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/cluster/secrets.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#@ load("@ytt:data", "data") - ---- -apiVersion: v1 -kind: Secret -metadata: - name: registry-credentials - annotations: - kpack.io/docker: #@ data.values.registry.server - tekton.dev/docker-0: #@ data.values.registry.server -type: kubernetes.io/basic-auth -stringData: - username: #@ data.values.registry.username - password: #@ data.values.registry.password diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/developer/README.md b/experiments/pipeline-service/examples/05-complete-supply-chain/developer/README.md deleted file mode 100644 index 4428fc977..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/developer/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# development teams - -Here you'll find the definition of the developer workloads. - -Despite both teams sharing the very same supplychain, because each team is -equiped with the best knowledge of how to run testing pipelines for their -products, they also provide the definition of the Tekton pipeline that they'd -like to have executed for a particular stage pre-defined by the app operator -team. - -- [development team 1](./dev-1) -- [development team 2](./dev-2) diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-1/README.md b/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-1/README.md deleted file mode 100644 index 9c74ffb9b..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-1/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# dev-1 - -The `dev-1` development team wants to continuously deliver their application -from two branches: - -- `master` -- `dev` - -but doesn't want to submit a [tekton/Pipeline] to match each -[carto.run/Workload] as, after all, it's the same codebase. - -In order to do that, the team adds a shared label (that's unique to this team) -to both carto.run/Workloads (`pipelines.carto.run/group`) so that pipeline-service can -find that shared tekton/Pipeline when stamping out [tekton/PipelineRun]. - -See: - -- `carto.run/Workload` for `master` branch: - [workload-master.yaml](./workload-master.yaml) -- `carto.run/Workload` for `dev` branch: - [workload-dev.yaml](./workload-dev.yaml) -- `carto.run/ClusterSourceTemplate` where `carto.run/Pipeline` selects based on - those labels: - [supply-chain-templates.yaml](../../app-operator/supply-chain-templates.yaml) - -[tekton/Pipeline]: https://github.com/tektoncd/pipeline/blob/51f3ce8f36e605724bad3057d9a9b621bdb4df8e/docs/pipelines.md#configuring-a-pipeline -[tekton/PipelineRun]: https://github.com/tektoncd/pipeline/blob/51f3ce8f36e605724bad3057d9a9b621bdb4df8e/docs/pipelineruns.md -[carto.run/Workload]: http://carto.run/docs/reference/#workload diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-1/pipeline.yaml b/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-1/pipeline.yaml deleted file mode 100644 index b302c0d99..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-1/pipeline.yaml +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: tekton.dev/v1beta1 -kind: Pipeline -metadata: - name: pipeline-1 - labels: - pipelines.carto.run/group: dev-1 - pipelines.carto.run/stage: testing -spec: - params: - - name: source-url - - name: source-revision - tasks: - - name: test - params: - - name: source-url - value: $(params.source-url) - - name: source-revision - value: $(params.source-revision) - taskSpec: - params: - - name: source-url - - name: source-revision - steps: - - name: test - image: golang - script: |- - cd `mktemp -d` - - wget -qO- $(params.source-url) | tar xvz - make test diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-1/workload-dev.yaml b/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-1/workload-dev.yaml deleted file mode 100644 index 8684f3ed3..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-1/workload-dev.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: Workload -metadata: - name: dev-1-dev - labels: - app.tanzu.vmware.com/workload-type: web - pipelines.carto.run/group: dev-1 -spec: - source: - git: - url: https://github.com/kontinue/hello-world - ref: - branch: dev diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-1/workload-master.yaml b/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-1/workload-master.yaml deleted file mode 100644 index 63c651544..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-1/workload-master.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: Workload -metadata: - name: dev-1-master - labels: - app.tanzu.vmware.com/workload-type: web - pipelines.carto.run/group: dev-1 -spec: - source: - git: - url: https://github.com/kontinue/hello-world - ref: - branch: master diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-2/pipeline.yaml b/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-2/pipeline.yaml deleted file mode 100644 index 09ea75587..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-2/pipeline.yaml +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: tekton.dev/v1beta1 -kind: Pipeline -metadata: - name: pipeline-2 - labels: - pipelines.carto.run/group: dev-2 - pipelines.carto.run/stage: testing -spec: - params: - - name: source-url - - name: source-revision - tasks: - - name: test - params: - - name: source-url - value: $(params.source-url) - - name: source-revision - value: $(params.source-revision) - taskSpec: - params: - - name: source-url - - name: source-revision - steps: - - name: test - image: golang - script: |- - cd `mktemp -d` - - wget -qO- $(params.source-url) | tar xvz - make test diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-2/workload.yaml b/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-2/workload.yaml deleted file mode 100644 index 0ec297193..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/developer/dev-2/workload.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: Workload -metadata: - name: dev-2-master - labels: - app.tanzu.vmware.com/workload-type: web - pipelines.carto.run/group: dev-2 -spec: - source: - git: - url: https://github.com/kontinue/hello-world - ref: - branch: master diff --git a/experiments/pipeline-service/examples/05-complete-supply-chain/values.yaml b/experiments/pipeline-service/examples/05-complete-supply-chain/values.yaml deleted file mode 100644 index d123c8fd5..000000000 --- a/experiments/pipeline-service/examples/05-complete-supply-chain/values.yaml +++ /dev/null @@ -1,24 +0,0 @@ -#! vim: set filetype=txt : -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -#@data/values - ---- -image_prefix: projectcartographer/demo- -registry: - server: https://index.docker.io/v1/ - username: projectcartographer - password: a-very-hard-to-guess-password diff --git a/experiments/pipeline-service/examples/06-supply-chain-configmap/README.md b/experiments/pipeline-service/examples/06-supply-chain-configmap/README.md deleted file mode 100644 index f9fb01fb3..000000000 --- a/experiments/pipeline-service/examples/06-supply-chain-configmap/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# test configuration via configmaps - -In this example we illustrate how operators could've configured the mechanism -for developers to supply their testing configuration via [ConfigMap]s rather -then [tekton/Pipeline], considerably lowering the bar. - - -``` -SUPPLYCHAIN - - ............... ............... - source-provider <----src---- pipeline-runner - ............... ............... - . . - . . - . . - fluxcd/GitRepository carto.run/Pipeline - | - ' - tektoncd/PipelineRun[1...n] - -``` - - -[ConfigMap]: https://kubernetes.io/docs/concepts/configuration/configmap/ -[tekton/Pipeline]: https://github.com/tektoncd/pipeline/blob/main/docs/pipelines.md - diff --git a/experiments/pipeline-service/examples/06-supply-chain-configmap/app-operator/pipeline-service-run-template.yaml b/experiments/pipeline-service/examples/06-supply-chain-configmap/app-operator/pipeline-service-run-template.yaml deleted file mode 100644 index 7ba5f459a..000000000 --- a/experiments/pipeline-service/examples/06-supply-chain-configmap/app-operator/pipeline-service-run-template.yaml +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: RunTemplate -metadata: - name: tekton-configmaps -spec: - completion: - succeeded: {key: 'status.conditions.#(type=="Succeeded").status', value: "True"} - failed: {key: 'status.conditions.#(type=="Succeeded").status', value: "False"} - - template: - apiVersion: tekton.dev/v1beta1 - kind: PipelineRun - metadata: - generateName: $(pipeline.metadata.name)$- - spec: - pipelineRef: - name: commands-via-configmaps - - params: $(pipeline.spec.inputs.params)$ - - workspaces: - - name: source - volumeClaimTemplate: - spec: - accessModes: [ ReadWriteOnce ] - resources: - requests: - storage: 5Gi - - name: commands - configmap: - name: $(selected.metadata.name)$ diff --git a/experiments/pipeline-service/examples/06-supply-chain-configmap/app-operator/predefined-tekton-pipeline.yaml b/experiments/pipeline-service/examples/06-supply-chain-configmap/app-operator/predefined-tekton-pipeline.yaml deleted file mode 100644 index 7685a04c4..000000000 --- a/experiments/pipeline-service/examples/06-supply-chain-configmap/app-operator/predefined-tekton-pipeline.yaml +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: tekton.dev/v1beta1 -kind: Pipeline -metadata: - name: commands-via-configmaps -spec: - params: - - name: source-url - description: url of tarball with source-code. - - name: source-revision - description: revision of the code checked in - workspaces: - - name: source - description: where source code will be checked in - - name: commands - description: where commands get mounted to - tasks: - - name: fetch-blob - taskRef: - name: fetch-blob - workspaces: - - name: source - workspace: source - params: - - name: source-url - value: $(params.source-url) - - name: run-command - runAfter: [fetch-blob] - taskRef: - name: run-commands-in-workspace - workspaces: - - name: source - workspace: source - - name: commands - workspace: commands - params: - - name: base-image - value: golang ---- - -apiVersion: tekton.dev/v1beta1 -kind: Task -metadata: - name: fetch-blob -spec: - description: fetches a blob from a URL extracting its contents to the source workspace - params: - - name: source-url - - name: base-image - default: golang - workspaces: - - name: source - steps: - - name: main - image: $(params.base-image) - workingDir: $(workspaces.source.path) - script: |- - #!/bin/bash - set -o errexit - set -o pipefail - wget -qO- $(params.source-url) | tar xvz - ---- -apiVersion: tekton.dev/v1beta1 -kind: Task -metadata: - name: run-commands-in-workspace -spec: - description: runs commands from a configmap in a workspace with source code - params: - - name: base-image - default: golang - description: container image used when running commands against source code - workspaces: - - name: source - - name: commands - steps: - - name: main - image: $(params.base-image) - workingDir: $(workspaces.source.path) - script: |- - find $(workspaces.commands.path) -name "*.sh" | xargs -n1 bash diff --git a/experiments/pipeline-service/examples/06-supply-chain-configmap/app-operator/supply-chain-templates.yaml b/experiments/pipeline-service/examples/06-supply-chain-configmap/app-operator/supply-chain-templates.yaml deleted file mode 100644 index 87076e973..000000000 --- a/experiments/pipeline-service/examples/06-supply-chain-configmap/app-operator/supply-chain-templates.yaml +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: ClusterSourceTemplate -metadata: - name: git-repository-no-credentials -spec: - urlPath: .status.artifact.url - revisionPath: .status.artifact.revision - - template: - apiVersion: source.toolkit.fluxcd.io/v1beta1 - kind: GitRepository - metadata: - name: $(workload.metadata.name)$ - spec: - interval: 1m - gitImplementation: libgit2 - ignore: "" - url: $(workload.spec.source.git.url)$ - ref: $(workload.spec.source.git.ref)$ - - ---- -apiVersion: carto.run/v1alpha1 -kind: ClusterSourceTemplate -metadata: - name: configmap-pipeline -spec: - urlPath: .status.latestInputs.source.url - revisionPath: .status.latestInputs.source.revision - - template: - apiVersion: carto.run/v1alpha1 - kind: Pipeline - metadata: - name: $(workload.metadata.name)$ - spec: - inputs: - params: - - name: source-url - value: $(sources[0].url)$ - - name: source-revision - value: $(sources[0].revision)$ - runTemplateName: tekton-configmaps - selector: - resource: - apiVersion: v1 - kind: ConfigMap - matchingLabels: - pipelines.carto.run/group: $(workload.metadata.labels['pipelines\.carto\.run/group'])$ - pipelines.carto.run/stage: testing diff --git a/experiments/pipeline-service/examples/06-supply-chain-configmap/app-operator/supply-chain.yaml b/experiments/pipeline-service/examples/06-supply-chain-configmap/app-operator/supply-chain.yaml deleted file mode 100644 index 73a7bd420..000000000 --- a/experiments/pipeline-service/examples/06-supply-chain-configmap/app-operator/supply-chain.yaml +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: ClusterSupplyChain -metadata: - name: supply-chain -spec: - selector: - app.tanzu.vmware.com/workload-type: web - - # - # - # source-provider <--[src]-- source-tester - # - # - components: - - name: source-provider - templateRef: - kind: ClusterSourceTemplate - name: git-repository-no-credentials - - - name: source-tester - templateRef: - kind: ClusterSourceTemplate - name: configmap-pipeline - sources: - - component: source-provider - name: source diff --git a/experiments/pipeline-service/examples/06-supply-chain-configmap/developer/manifests.yaml b/experiments/pipeline-service/examples/06-supply-chain-configmap/developer/manifests.yaml deleted file mode 100644 index ffd5c9daa..000000000 --- a/experiments/pipeline-service/examples/06-supply-chain-configmap/developer/manifests.yaml +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: carto.run/v1alpha1 -kind: Workload -metadata: - name: helloworld - labels: - app.tanzu.vmware.com/workload-type: web - pipelines.carto.run/group: helloworld -spec: - source: - git: - url: https://github.com/go-training/helloworld - ref: - branch: master ---- - -apiVersion: v1 -kind: ConfigMap -metadata: - name: test-commands - labels: - pipelines.carto.run/group: helloworld - pipelines.carto.run/stage: testing -data: - 01-test.sh: |- - #!/bin/bash - set -o errexit - set -o pipefail - - go mod init foo || true - go test -v ./... diff --git a/experiments/pipeline-service/examples/README.md b/experiments/pipeline-service/examples/README.md deleted file mode 100644 index afd730d78..000000000 --- a/experiments/pipeline-service/examples/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Examples - -Here you'll find a guided tour of how one can make use of `pipeline-service`, going from using Tekton in a standalone manner, to a full integration within a [cartographer] supply chain. - - -1. [Standalone Tekton](./01-tekton-standalone): running Tekton pipelines by - hand to build up the reasoning behind something like pipeline-service. -2. [Triggering Tekton pipelines using pipeline - service](./02-simple-pipeline-service): using the declarative nature of - pipeline-service to trigger those previously manually submitted pipeline - runs. -3. [Reusing RunTemplate and Tekton - pipelines](./03-pipeline-service-with-selector): making use of the ability - to interpolate invocations using extra objects we build a Tekton pipeline - that runs scripts that developers provide via ConfigMaps. -4. [Integrating Pipeline in a simple SupplyChain](./04-simple-supply-chain): - similar to second example but integrating GitRepository with Pipeline so - that we run tests on every commit to a repository -5. [Complete SupplyChain with developer-provided Tekton - Pipelines](./05-complete-supply-chain): a definition of a supply chain from - fetching a commit, to running tests, building a container image, and - ultimately deploying it -6. [SupplyChain with developer-provided - ConfigMaps](./06-supply-chain-configmap): similar to the previous example, - but reduced to just continuously run tests from configmaps (no image - building) - - -[cartographer]: https://github.com/vmware-tanzu/cartographer diff --git a/experiments/pipeline-service/go.mod b/experiments/pipeline-service/go.mod deleted file mode 100644 index f701c16ff..000000000 --- a/experiments/pipeline-service/go.mod +++ /dev/null @@ -1,75 +0,0 @@ -module github.com/vmware-tanzu/cartographer/experiments/pipeline-service - -go 1.17 - -require ( - github.com/davecgh/go-spew v1.1.1 - github.com/go-logr/logr v0.4.0 - github.com/tidwall/gjson v1.7.5 - github.com/valyala/fasttemplate v1.2.1 - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b - k8s.io/api v0.22.1 - k8s.io/apimachinery v0.22.1 - k8s.io/utils v0.0.0-20210722164352-7f3ee0f31471 - sigs.k8s.io/controller-runtime v0.9.6 - sigs.k8s.io/controller-tools v0.6.2 - sigs.k8s.io/yaml v1.2.0 -) - -require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.1 // indirect - github.com/evanphx/json-patch v4.11.0+incompatible // indirect - github.com/fatih/color v1.12.0 // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/go-logr/zapr v0.4.0 // indirect - github.com/gobuffalo/flect v0.2.3 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/go-cmp v0.5.6 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/google/uuid v1.1.2 // indirect - github.com/googleapis/gnostic v0.5.5 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/json-iterator/go v1.1.11 // indirect - github.com/mattn/go-colorable v0.1.8 // indirect - github.com/mattn/go-isatty v0.0.12 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.1 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.11.0 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.26.0 // indirect - github.com/prometheus/procfs v0.6.0 // indirect - github.com/spf13/cobra v1.2.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/tidwall/match v1.0.3 // indirect - github.com/tidwall/pretty v1.1.0 // indirect - github.com/valyala/bytebufferpool v1.0.0 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.18.1 // indirect - golang.org/x/mod v0.4.2 // indirect - golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 // indirect - golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 // indirect - golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect - golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect - golang.org/x/text v0.3.6 // indirect - golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect - golang.org/x/tools v0.1.5 // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.26.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiextensions-apiserver v0.22.1 // indirect - k8s.io/client-go v0.22.1 // indirect - k8s.io/component-base v0.22.1 // indirect - k8s.io/klog/v2 v2.9.0 // indirect - k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect -) diff --git a/experiments/pipeline-service/go.sum b/experiments/pipeline-service/go.sum deleted file mode 100644 index 3955c3b6e..000000000 --- a/experiments/pipeline-service/go.sum +++ /dev/null @@ -1,1012 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -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/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -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/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -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-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -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/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -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/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/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.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -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/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -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-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-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM= -github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobuffalo/flect v0.2.3 h1:f/ZukRnSNA/DUpSNDadko7Qc0PhGvsew35p/2tu+CRY= -github.com/gobuffalo/flect v0.2.3/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/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-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/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.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -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.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.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -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/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -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/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -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.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -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.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -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/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -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.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -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/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -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/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -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/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= -github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 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/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/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/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -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/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -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.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.14.0 h1:ep6kpPVwmr/nTbklSx2nrLNSIO62DoYAhnPNIMhK8gI= -github.com/onsi/gomega v1.14.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -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/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -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/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -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.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/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/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-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -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.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -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.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -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/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/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/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -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.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -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/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.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tidwall/gjson v1.7.5 h1:zmAN/xmX7OtpAkv4Ovfso60r/BiCi5IErCDYGNJu+uc= -github.com/tidwall/gjson v1.7.5/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= -github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE= -github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.1.0 h1:K3hMW5epkdAVwibsQEfR/7Zj0Qgt4DxtNumTq/VloO8= -github.com/tidwall/pretty v1.1.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/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -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/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.18.1 h1:CSUJ2mjFszzEWt4CdKISEuChVIXGBn3lAPwkRGyVrc4= -go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/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-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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/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-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-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 h1:ADo5wSpq2gqaCGQWzk7S5vd//0iyyLeAratkEoG5dLE= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 h1:0Ja1LBD+yisY6RWM/BH7TJVXWsSjs2VwBSmvSX4HdBc= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-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-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -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-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/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-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-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-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/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-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -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-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-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/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -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.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -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/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.21.3/go.mod h1:hUgeYHUbBp23Ue4qdX9tR8/ANi/g3ehylAqDn9NWVOg= -k8s.io/api v0.22.1 h1:ISu3tD/jRhYfSW8jI/Q1e+lRxkR7w9UwQEZ7FgslrwY= -k8s.io/api v0.22.1/go.mod h1:bh13rkTp3F1XEaLGykbyRD2QaTTzPm0e/BMd8ptFONY= -k8s.io/apiextensions-apiserver v0.21.3/go.mod h1:kl6dap3Gd45+21Jnh6utCx8Z2xxLm8LGDkprcd+KbsE= -k8s.io/apiextensions-apiserver v0.22.1 h1:YSJYzlFNFSfUle+yeEXX0lSQyLEoxoPJySRupepb0gE= -k8s.io/apiextensions-apiserver v0.22.1/go.mod h1:HeGmorjtRmRLE+Q8dJu6AYRoZccvCMsghwS8XTUYb2c= -k8s.io/apimachinery v0.21.3/go.mod h1:H/IM+5vH9kZRNJ4l3x/fXP/5bOPJaVP/guptnZPeCFI= -k8s.io/apimachinery v0.22.1 h1:DTARnyzmdHMz7bFWFDDm22AM4pLWTQECMpRTFu2d2OM= -k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apiserver v0.21.3/go.mod h1:eDPWlZG6/cCCMj/JBcEpDoK+I+6i3r9GsChYBHSbAzU= -k8s.io/apiserver v0.22.1/go.mod h1:2mcM6dzSt+XndzVQJX21Gx0/Klo7Aen7i0Ai6tIa400= -k8s.io/client-go v0.21.3/go.mod h1:+VPhCgTsaFmGILxR/7E1N0S+ryO010QBeNCv5JwRGYU= -k8s.io/client-go v0.22.1 h1:jW0ZSHi8wW260FvcXHkIa0NLxFBQszTlhiAVsU5mopw= -k8s.io/client-go v0.22.1/go.mod h1:BquC5A4UOo4qVDUtoc04/+Nxp1MeHcVc1HJm1KmG8kk= -k8s.io/code-generator v0.21.3/go.mod h1:K3y0Bv9Cz2cOW2vXUrNZlFbflhuPvuadW6JdnN6gGKo= -k8s.io/code-generator v0.22.1/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= -k8s.io/component-base v0.21.3/go.mod h1:kkuhtfEHeZM6LkX0saqSK8PbdO7A0HigUngmhhrwfGQ= -k8s.io/component-base v0.22.1 h1:SFqIXsEN3v3Kkr1bS6rstrs1wd45StJqbtgbQ4nRQdo= -k8s.io/component-base v0.22.1/go.mod h1:0D+Bl8rrnsPN9v0dyYvkqFfBeAd4u7n77ze+p8CMiPo= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM= -k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e h1:KLHHjkdQFomZy8+06csTWZ0m1343QqxZhR2LJ1OxCYM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210722164352-7f3ee0f31471 h1:DnzUXII7sVg1FJ/4JX6YDRJfLNAC7idRatPwe07suiI= -k8s.io/utils v0.0.0-20210722164352-7f3ee0f31471/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.19/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/controller-runtime v0.9.6 h1:EevVMlgUj4fC1NVM4+DB3iPkWkmGRNarA66neqv9Qew= -sigs.k8s.io/controller-runtime v0.9.6/go.mod h1:q6PpkM5vqQubEKUKOM6qr06oXGzOBcCby1DA9FbyZeA= -sigs.k8s.io/controller-tools v0.6.2 h1:+Y8L0UsAugDipGRw8lrkPoAi6XqlQVZuf1DQHME3PgU= -sigs.k8s.io/controller-tools v0.6.2/go.mod h1:oaeGpjXn6+ZSEIQkUe/+3I40PNiDYp9aeawbt3xTgJ8= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -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= diff --git a/experiments/pipeline-service/hack/boilerplate.go.txt b/experiments/pipeline-service/hack/boilerplate.go.txt deleted file mode 100644 index a53d0a603..000000000 --- a/experiments/pipeline-service/hack/boilerplate.go.txt +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2021 VMware - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/experiments/pipeline-service/pkg/apis/v1alpha1/groupversion_info.go b/experiments/pipeline-service/pkg/apis/v1alpha1/groupversion_info.go deleted file mode 100644 index 68f0b4a73..000000000 --- a/experiments/pipeline-service/pkg/apis/v1alpha1/groupversion_info.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2021 VMware -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - SchemeGroupVersion = schema.GroupVersion{ - Group: "carto.run", - Version: "v1alpha1", - } - - SchemeBuilder = &scheme.Builder{ - GroupVersion: SchemeGroupVersion, - } - - AddToScheme = SchemeBuilder.AddToScheme -) diff --git a/experiments/pipeline-service/pkg/apis/v1alpha1/pipeline.go b/experiments/pipeline-service/pkg/apis/v1alpha1/pipeline.go deleted file mode 100644 index 9a1e0d5e5..000000000 --- a/experiments/pipeline-service/pkg/apis/v1alpha1/pipeline.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2021 VMware -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +versionName=v1alpha1 -// +groupName=carto.run -// +kubebuilder:object:generate=true - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// +kubebuilder:object:root=true -// +kubebuilder:subresource:status -// +kubebuilder:printcolumn:name="Succeeded",type=string,JSONPath=`.status.conditions[?(@.type=="Succeeded")].status` -// +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp` - -type Pipeline struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` - - Spec PipelineSpec `json:"spec"` - Status PipelineStatus `json:"status,omitempty"` -} - -type PipelineSpec struct { - // Inputs define the parameters that should be passed onto the run - // template. The contents of this field are used to provide idempotency - // for the reconciler, being used to define a digest that's compared - // before creating a new run. - // - // +kubebuilder:pruning:PreserveUnknownFields - Inputs runtime.RawExtension `json:"inputs"` - - // RunTemplateName is the name of the RunTemplate object to use to - // dictate how to run an instance of a pipeline. - // - RunTemplateName string `json:"runTemplateName"` - - // Selector is used for matching against an object to be accessible for - // templating a Run (for instance, finding out the name of a - // developer-provided tekton/Pipeline, or a ConfigMap to be embedded - // in). - // - Selector ObjectSelector `json:"selector,omitempty"` -} - -type ObjectSelector struct { - // Resource indicates a GVR to match against. - // - Resource ObjectSelectorResource `json:"resource"` - - // MatchingLabels indicates the label set to use when searching for - // objects of a given gvr. - // - // +kubebuilder:validation:MinProperties=1 - MatchingLabels map[string]string `json:"matchingLabels"` -} - -type ObjectSelectorResource struct { - // APIVersion - // - APIVersion string `json:"apiVersion"` - - // Kind - // - Kind string `json:"kind"` -} - -type PipelineStatus struct { - // Conditions - // - Conditions []metav1.Condition `json:"conditions"` - - // LatestInputs represents the set of inputs that were used the last - // time that this reconciler observed a success for a run that it - // created. - // - // +kubebuilder:pruning:PreserveUnknownFields - // - LatestInputs runtime.RawExtension `json:"latestInputs,omitempty"` - - // LatestOutputs displays the set of outputs that were produced in the - // last time that this reconciler observed a success for a run that it - // created. - // - // +kubebuilder:pruning:PreserveUnknownFields - // - LatestOutputs runtime.RawExtension `json:"latestOutputs,omitempty"` -} - -// +kubebuilder:object:root=true - -type PipelineList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []Pipeline `json:"items"` -} - -func init() { - SchemeBuilder.Register( - &Pipeline{}, - &PipelineList{}, - ) -} diff --git a/experiments/pipeline-service/pkg/apis/v1alpha1/run_template.go b/experiments/pipeline-service/pkg/apis/v1alpha1/run_template.go deleted file mode 100644 index 0fa68b003..000000000 --- a/experiments/pipeline-service/pkg/apis/v1alpha1/run_template.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2021 VMware -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +versionName=v1alpha1 -// +groupName=carto.run -// +kubebuilder:object:generate=true - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// +kubebuilder:object:root=true -// - -type RunTemplate struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` - - Spec RunTemplateSpec `json:"spec"` -} - -type RunTemplateSpec struct { - // Completion describe rules for determining whether the invocation was - // successfull, failed, or is still running (neither succeeded nor - // failed). - // - Completion Completion `json:"completion,omitempty"` - - // Outputs lets you specify rules for capturing results from the - // pipeline invocations. - // - // +kubebuilder:pruning:PreserveUnknownFields - Outputs []RunTemplateOutput `json:"outputs,omitempty"` - - // Template is the template that should be stamped out when submitting - // a new pipeline invocation. - // - // To this template are made available: - // - // - the pipeline object that is referencing this RunTemplate - // - (optional) the object that matched the Pipeline's selection rules. - // - // For instance: - // - // kind: ConfigMap - // apiVersion: v1 - // metadata: - // generateName: $(pipeline.metadata.name)- - // data: - // foo: $(selected.metadata.name) - // - // +kubebuilder:pruning:PreserveUnknownFields - Template runtime.RawExtension `json:"template"` -} - -type RunTemplateOutput struct { - // Name indicates the value that should be used as a key in the - // `carto.run/Pipeline`'s .status.latestOutputs. - // - Name string `json:"name"` - - // Path denotes the query that should be performed to retrieve a value - // from the object stamped out according to this RunTemplateRef template. - // - Path string `json:"path"` -} - -// +kubebuilder:object:root=true - -type RunTemplateList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []RunTemplate `json:"items"` -} - -func init() { - SchemeBuilder.Register( - &RunTemplate{}, - &RunTemplateList{}, - ) -} - -type Completion struct { - // Succeeded provides the rule to evaluate to determine if the - // invocation succeeded or failed. - // - Succeeded CompletionEvaluation `json:"succeeded,omitempty"` - - // Failed provides the rule to evaluate to determine if the invocation - // succeeded or failed. - // - Failed CompletionEvaluation `json:"failed,omitempty"` -} - -type CompletionEvaluation struct { - // Key is the gjson query the perform to retrieve an indication of - // success/failure. - // - Key string `json:"key,omitempty"` - - // Value is the expected result to indicate success/failure. - // - Value string `json:"value,omitempty"` -} diff --git a/experiments/pipeline-service/pkg/apis/v1alpha1/zz_generated.deepcopy.go b/experiments/pipeline-service/pkg/apis/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 1d7650eec..000000000 --- a/experiments/pipeline-service/pkg/apis/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,276 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Completion) DeepCopyInto(out *Completion) { - *out = *in - out.Succeeded = in.Succeeded - out.Failed = in.Failed -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Completion. -func (in *Completion) DeepCopy() *Completion { - if in == nil { - return nil - } - out := new(Completion) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CompletionEvaluation) DeepCopyInto(out *CompletionEvaluation) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CompletionEvaluation. -func (in *CompletionEvaluation) DeepCopy() *CompletionEvaluation { - if in == nil { - return nil - } - out := new(CompletionEvaluation) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ObjectSelector) DeepCopyInto(out *ObjectSelector) { - *out = *in - out.Resource = in.Resource - if in.MatchingLabels != nil { - in, out := &in.MatchingLabels, &out.MatchingLabels - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectSelector. -func (in *ObjectSelector) DeepCopy() *ObjectSelector { - if in == nil { - return nil - } - out := new(ObjectSelector) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ObjectSelectorResource) DeepCopyInto(out *ObjectSelectorResource) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectSelectorResource. -func (in *ObjectSelectorResource) DeepCopy() *ObjectSelectorResource { - if in == nil { - return nil - } - out := new(ObjectSelectorResource) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Pipeline) DeepCopyInto(out *Pipeline) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Pipeline. -func (in *Pipeline) DeepCopy() *Pipeline { - if in == nil { - return nil - } - out := new(Pipeline) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Pipeline) 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 *PipelineList) DeepCopyInto(out *PipelineList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Pipeline, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PipelineList. -func (in *PipelineList) DeepCopy() *PipelineList { - if in == nil { - return nil - } - out := new(PipelineList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *PipelineList) 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 *PipelineSpec) DeepCopyInto(out *PipelineSpec) { - *out = *in - in.Inputs.DeepCopyInto(&out.Inputs) - in.Selector.DeepCopyInto(&out.Selector) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PipelineSpec. -func (in *PipelineSpec) DeepCopy() *PipelineSpec { - if in == nil { - return nil - } - out := new(PipelineSpec) - 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.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make([]v1.Condition, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - in.LatestInputs.DeepCopyInto(&out.LatestInputs) - in.LatestOutputs.DeepCopyInto(&out.LatestOutputs) -} - -// 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 *RunTemplate) DeepCopyInto(out *RunTemplate) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RunTemplateRef. -func (in *RunTemplate) DeepCopy() *RunTemplate { - if in == nil { - return nil - } - out := new(RunTemplate) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *RunTemplate) 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 *RunTemplateList) DeepCopyInto(out *RunTemplateList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]RunTemplate, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RunTemplateList. -func (in *RunTemplateList) DeepCopy() *RunTemplateList { - if in == nil { - return nil - } - out := new(RunTemplateList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *RunTemplateList) 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 *RunTemplateOutput) DeepCopyInto(out *RunTemplateOutput) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RunTemplateOutput. -func (in *RunTemplateOutput) DeepCopy() *RunTemplateOutput { - if in == nil { - return nil - } - out := new(RunTemplateOutput) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RunTemplateSpec) DeepCopyInto(out *RunTemplateSpec) { - *out = *in - out.Completion = in.Completion - if in.Outputs != nil { - in, out := &in.Outputs, &out.Outputs - *out = make([]RunTemplateOutput, len(*in)) - copy(*out, *in) - } - in.Template.DeepCopyInto(&out.Template) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RunTemplateSpec. -func (in *RunTemplateSpec) DeepCopy() *RunTemplateSpec { - if in == nil { - return nil - } - out := new(RunTemplateSpec) - in.DeepCopyInto(out) - return out -} diff --git a/experiments/pipeline-service/pkg/controller/interpolator.go b/experiments/pipeline-service/pkg/controller/interpolator.go deleted file mode 100644 index 34cea0f95..000000000 --- a/experiments/pipeline-service/pkg/controller/interpolator.go +++ /dev/null @@ -1,268 +0,0 @@ -// Copyright 2021 VMware -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package controller - -import ( - "crypto/md5" - "encoding/json" - "fmt" - "io" - "reflect" - "strings" - - "github.com/davecgh/go-spew/spew" - "github.com/tidwall/gjson" - "github.com/valyala/fasttemplate" - yamlv3 "gopkg.in/yaml.v3" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime/serializer/yaml" - "k8s.io/utils/pointer" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -func InterpolateResource( - parent client.Object, - data map[string]interface{}, - resource string, -) (*unstructured.Unstructured, error) { - - obj := &unstructured.Unstructured{} - dec := yaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme) - _, _, err := dec.Decode([]byte(resource), nil, obj) - if err != nil { - return nil, fmt.Errorf("decoding template to unstructured: %w", err) - } - - if err := InterpolateInterface(data, obj.UnstructuredContent()); err != nil { - return nil, fmt.Errorf("interpolate interface: %w", err) - } - - hashCopy := obj.DeepCopy() - hashObj := hashCopy.UnstructuredContent() - - delete(hashObj, "metadata") - delete(hashObj, "kind") - delete(hashObj, "apiVersion") - - objectDigest, err := digest(hashObj, parent.GetName()) - if err != nil { - return nil, fmt.Errorf("digest: %w", err) - } - - labels := obj.GetLabels() - if labels == nil { - labels = map[string]string{} - } - - labels["carto.run/digest"] = objectDigest - - obj.SetNamespace(parent.GetNamespace()) // TODO maybe .. not? not sure - obj.SetLabels(labels) - obj.SetOwnerReferences([]metav1.OwnerReference{ - { - APIVersion: parent.GetObjectKind().GroupVersionKind().GroupVersion().String(), - Kind: parent.GetObjectKind().GroupVersionKind().Kind, - Name: parent.GetName(), - UID: parent.GetUID(), - BlockOwnerDeletion: pointer.BoolPtr(true), - Controller: pointer.BoolPtr(true), - }, - }) - - return obj, nil -} - -func InterpolateInterface(variables map[string]interface{}, iface interface{}) error { - rv := reflect.Indirect(reflect.ValueOf(iface)) - if !rv.IsValid() { - return nil - } - - switch rv.Kind() { - case reflect.Slice, reflect.Array: - if err := InterpolateSlice(rv, variables); err != nil { - return fmt.Errorf("interpolate slice: %w", err) - } - case reflect.Map: - if err := InterpolateMap(rv, variables); err != nil { - return fmt.Errorf("interpolate map: %w", err) - } - } - - return nil -} - -func InterpolateSlice(slice reflect.Value, variables map[string]interface{}) error { - for idx := 0; idx < slice.Len(); idx++ { - inner := slice.Index(idx).Elem() - if inner.Kind() != reflect.String { - if err := InterpolateInterface(variables, slice.Index(idx).Interface()); err != nil { - return fmt.Errorf("interpolate interface: %w", err) - } - - continue - } - - value, err := InterpolateStringValue(inner.String(), variables) - if err != nil { - return fmt.Errorf("interpolate field: %w", err) - } - - slice.Index(idx).Set(*value) - } - - return nil -} - -func InterpolateMap(mmap reflect.Value, variables map[string]interface{}) error { - for _, key := range mmap.MapKeys() { - inner := mmap.MapIndex(key).Elem() - if inner.Kind() != reflect.String { - if err := InterpolateInterface(variables, mmap.MapIndex(key).Interface()); err != nil { - return fmt.Errorf("interpolate interface: %w", err) - } - - continue - } - - value, err := InterpolateStringValue(inner.String(), variables) - if err != nil { - return fmt.Errorf("interpolate string value: %w", err) - } - - mmap.SetMapIndex(key, *value) - } - - return nil -} - -func InterpolateStringValue(field string, variables map[string]interface{}) (*reflect.Value, error) { - interpolated, err := InterpolateString(field, variables) - if err != nil { - return nil, fmt.Errorf("interpolate string: %w", err) - } - - value, err := StringValue(interpolated) - if err != nil { - return nil, fmt.Errorf("string value: %w", err) - } - - return value, nil -} - -func StringValue(str string) (*reflect.Value, error) { - v := new(interface{}) - if err := yamlv3.Unmarshal([]byte(str), v); err != nil { - return nil, fmt.Errorf("unmarshal to iface: %w", err) - } - - value := reflect.ValueOf(*v) - if value.Kind() == reflect.String { - value = reflect.ValueOf(str) - } - if value.Kind() == reflect.Int { - i := (*v).(int) - int64v := int64(i) - value = reflect.ValueOf(int64v) - } - - return &value, nil -} - -func InterpolateString(str string, data map[string]interface{}) (string, error) { - result, err := fasttemplate.ExecuteFuncStringWithErr(str, - `$(`, `)$`, - func(w io.Writer, tag string) (int, error) { - val, err := InterpolateTag(data, tag) - if err != nil { - return 0, fmt.Errorf("interpolate tag '%s': %w", tag, err) - } - - return w.Write([]byte(val)) - }, - ) - if err != nil { - return "", fmt.Errorf("execute func string with err: %w", err) - } - - return result, nil -} - -func digest(o ...interface{}) (string, error) { - h := md5.New() - - printer := spew.ConfigState{ - Indent: " ", - SortKeys: true, - DisableMethods: true, - SpewKeys: true, - } - _, err := printer.Fprintf(h, "%#v", o) - if err != nil { - return "", fmt.Errorf("printer Fprintf: %w", err) - } - - return fmt.Sprintf("%x", h.Sum(nil)), nil -} - -func InterpolateTag(data map[string]interface{}, tag string) (string, error) { - if tag == "" { - return "", fmt.Errorf("must not be empty") - } - - parts := strings.Split(tag, ".") - obj, found := data[parts[0]] - if !found { - return "", fmt.Errorf("key '%s' not found", parts[0]) - } - - objJson, err := json.Marshal(obj) - if err != nil { - return "", fmt.Errorf("json marshal: %w", err) - } - - if len(parts) == 1 { - return string(objJson), nil - } - - qry := strings.Join(parts[1:], ".") - - result := gjson.GetBytes(objJson, qry) - if !result.Exists() { - return "", fmt.Errorf("query '%s' found no results", qry) - } - - return result.String(), nil -} - -func Interpolate(data map[string]interface{}, str string) (string, error) { - result, err := fasttemplate.ExecuteFuncStringWithErr(str, - `$(`, `)$`, - func(w io.Writer, tag string) (int, error) { - val, err := InterpolateTag(data, tag) - if err != nil { - return 0, fmt.Errorf("interpolate tag '%s': %w", tag, err) - } - - return w.Write([]byte(val)) - }, - ) - if err != nil { - return "", fmt.Errorf("execute func string with err: %w", err) - } - - return result, nil -} diff --git a/experiments/pipeline-service/pkg/controller/pipeline_reconciler.go b/experiments/pipeline-service/pkg/controller/pipeline_reconciler.go deleted file mode 100644 index 6bda0024a..000000000 --- a/experiments/pipeline-service/pkg/controller/pipeline_reconciler.go +++ /dev/null @@ -1,430 +0,0 @@ -// Copyright 2021 VMware -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package controller - -import ( - "context" - "encoding/json" - "fmt" - "time" - - "github.com/davecgh/go-spew/spew" - "github.com/go-logr/logr" - "github.com/tidwall/gjson" - yamlv3 "gopkg.in/yaml.v3" - kerrors "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" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - syaml "sigs.k8s.io/yaml" - - "github.com/vmware-tanzu/cartographer/experiments/pipeline-service/pkg/apis/v1alpha1" -) - -type PipelineReconciler struct { - Client client.Client - Logger logr.Logger -} - -func (r *PipelineReconciler) Reconcile( - ctx context.Context, - req ctrl.Request, -) (ctrl.Result, error) { - logger := r.Logger.WithValues("name", req.Name, "namespace", req.Namespace) - - logger.Info("started") - defer logger.Info("finished") - - pipeline, err := r.GetPipeline(ctx, req.Name, req.Namespace) - if err != nil { - if kerrors.IsNotFound(err) { - return ctrl.Result{}, nil - } - - return ctrl.Result{}, fmt.Errorf("get pipeline: %w", err) - } - - pipelineToReconcile := pipeline.DeepCopy() - - if err := r.ReconcilePipeline(ctx, pipelineToReconcile); err != nil { - logger.Error(err, "reconciliation errored") - - pipelineToReconcile.Status.Conditions = []metav1.Condition{ - { - Type: "Errored", - LastTransitionTime: metav1.Now(), - Reason: "Errored", - Message: err.Error(), - Status: "True", - }, - } - - if r.hasStatusChanged(pipeline, pipelineToReconcile) { - updateErr := r.Client.Status().Update(ctx, pipelineToReconcile) - if updateErr != nil { - logger.Error(updateErr, "update error") - } - } - - return ctrl.Result{}, err - } - - if r.hasStatusChanged(pipeline, pipelineToReconcile) { - if err := r.Client.Status().Update(ctx, pipelineToReconcile); err != nil { - return ctrl.Result{}, fmt.Errorf("update status: %w", err) - } - } - - return ctrl.Result{ - RequeueAfter: 5 * time.Second, - }, nil -} - -func (r *PipelineReconciler) ReconcilePipeline( - ctx context.Context, - pipeline *v1alpha1.Pipeline, -) error { - stampingContext, err := r.BuildStampingContext(ctx, pipeline) - if err != nil { - return fmt.Errorf("build stamping context: %w", err) - } - - runTemplate, err := r.GetRunTemplate(ctx, pipeline.Spec.RunTemplateName, pipeline.Namespace) - if err != nil { - return fmt.Errorf("get runtemplate: %w", err) - } - - invocationObj, err := r.StampInvocationObj(ctx, pipeline, runTemplate, stampingContext) - if err != nil { - return fmt.Errorf("stamp invocation obj: %w", err) - } - - err = r.FindOrCreate(ctx, invocationObj) - if err != nil { - return fmt.Errorf("find or create: %w", err) - } - - err = r.FinalizePipelineStatus(ctx, pipeline, runTemplate, invocationObj) - if err != nil { - return fmt.Errorf("finalize pipeline status: %w", err) - } - - return nil -} - -func (r *PipelineReconciler) FinalizePipelineStatus( - ctx context.Context, - pipeline *v1alpha1.Pipeline, - runTemplate *v1alpha1.RunTemplate, - invocationObj *unstructured.Unstructured, -) error { - transitionTime := metav1.NewTime(time.Date(2020, time.February, 1, 1, 1, 1, 1, time.Local)) - - invocationStatus, err := r.ResourceCompletionStatus(ctx, invocationObj, runTemplate.Spec.Completion) - if err != nil { - return fmt.Errorf("resource completed: %w", err) - } - - switch invocationStatus { - case "Succeeded": - latestOutputs, err := r.CollectOutputs(ctx, invocationObj, runTemplate.Spec.Outputs) - if err != nil { - return fmt.Errorf("collect outputs: %w", err) - } - - b, err := json.Marshal(latestOutputs) - if err != nil { - return fmt.Errorf("marshal latest outputs: %w", err) - } - - pipeline.Status.LatestOutputs = runtime.RawExtension{Raw: b} - pipeline.Status.LatestInputs = pipeline.Spec.Inputs - pipeline.Status.Conditions = []metav1.Condition{ - { - LastTransitionTime: transitionTime, - Reason: "RunSucceeded", - Status: metav1.ConditionTrue, - Type: "Succeeded", - }, - } - return nil - - case "Failed": - pipeline.Status.Conditions = []metav1.Condition{ - { - LastTransitionTime: transitionTime, - Reason: "RunFailed", - Status: metav1.ConditionFalse, - Type: "Succeeded", - }, - } - return nil - - case "Unknown": - pipeline.Status.Conditions = []metav1.Condition{ - { - LastTransitionTime: transitionTime, - Reason: "RunRunning", - Status: metav1.ConditionUnknown, - Type: "Unknown", - }, - } - - return nil - } - - return fmt.Errorf("unexpected invocation status '%s'", invocationStatus) -} - -func (r *PipelineReconciler) BuildStampingContext( - ctx context.Context, - pipeline *v1alpha1.Pipeline, -) (map[string]interface{}, error) { - stamperContext := map[string]interface{}{} - - if pipeline.Spec.Selector.Resource.Kind != "" { - matchingObject, err := r.FindMatchingObject(ctx, pipeline) - if err != nil { - return nil, fmt.Errorf("find matching obj: %w", err) - } - - stamperContext["selected"] = matchingObject - } - - b, err := json.Marshal(pipeline) - if err != nil { - return nil, fmt.Errorf("marshal pipeline: %w", err) - } - - unstructuredPipeline := map[string]interface{}{} - if err := json.Unmarshal(b, &unstructuredPipeline); err != nil { - return nil, fmt.Errorf("unmarshal pipeline: %w", err) - } - - stamperContext["pipeline"] = unstructuredPipeline - - return stamperContext, nil -} - -func (r *PipelineReconciler) StampInvocationObj( - ctx context.Context, - pipeline *v1alpha1.Pipeline, - runTemplate *v1alpha1.RunTemplate, - interpolationData map[string]interface{}, -) (*unstructured.Unstructured, error) { - resource, err := syaml.JSONToYAML(runTemplate.Spec.Template.Raw) - if err != nil { - return nil, fmt.Errorf("json to yaml: %w", err) - } - - obj, err := InterpolateResource(pipeline, interpolationData, string(resource)) - if err != nil { - return nil, fmt.Errorf("interpolate resource: %w", err) - } - - return obj, nil -} - -func (r *PipelineReconciler) FindMatchingObject( - ctx context.Context, - pipeline *v1alpha1.Pipeline, -) (*unstructured.Unstructured, error) { - list := &unstructured.UnstructuredList{} - list.SetGroupVersionKind(schema.FromAPIVersionAndKind( - pipeline.Spec.Selector.Resource.APIVersion, - pipeline.Spec.Selector.Resource.Kind, - )) - - if err := r.Client.List(ctx, list, - client.InNamespace(pipeline.Namespace), - client.MatchingLabels(pipeline.Spec.Selector.MatchingLabels), - client.Limit(1), - ); err != nil { - return nil, fmt.Errorf("list: %w", err) - } - - if len(list.Items) != 1 { - return nil, fmt.Errorf("expected list w/ a single item, got %d", len(list.Items)) - } - - obj := &unstructured.Unstructured{} - *obj = list.Items[0] - - return obj, nil -} - -func (r *PipelineReconciler) CollectOutputs( - ctx context.Context, - obj *unstructured.Unstructured, - outputRules []v1alpha1.RunTemplateOutput, -) (map[string]interface{}, error) { - res := map[string]interface{}{} - - var err error - for _, rule := range outputRules { - res[rule.Name], err = r.CollectOutput(ctx, obj, rule) - if err != nil { - return nil, fmt.Errorf("collect output: %w", err) - } - } - - return res, nil -} - -func (r *PipelineReconciler) CollectOutput( - ctx context.Context, - obj *unstructured.Unstructured, - rule v1alpha1.RunTemplateOutput, -) (interface{}, error) { - v, err := Interpolate(obj.UnstructuredContent(), rule.Path) - if err != nil { - return nil, fmt.Errorf("interpol: %w", err) - } - - marshalledV := new(interface{}) - if err := yamlv3.Unmarshal([]byte(v), marshalledV); err != nil { - return nil, fmt.Errorf("unmarshal retrieved data: %w", err) - } - - return *marshalledV, nil -} - -func (r *PipelineReconciler) ResourceCompletionStatus( - ctx context.Context, - obj *unstructured.Unstructured, - completions v1alpha1.Completion, -) (string, error) { - if completions.Failed.Key == "" && completions.Succeeded.Key == "" { - return "Suceeded", nil - } - - manifest, err := obj.MarshalJSON() - if err != nil { - return "", fmt.Errorf("marshal json: %w", err) - } - - if completions.Failed.Key != "" { - if gjson.GetBytes(manifest, completions.Failed.Key).String() == completions.Failed.Value { - return "Failed", nil - } - } - - if completions.Succeeded.Key != "" { - if gjson.GetBytes(manifest, completions.Succeeded.Key).String() == completions.Succeeded.Value { - return "Succeeded", nil - } - } - - return "Unknown", nil -} - -func (r *PipelineReconciler) FindOrCreate(ctx context.Context, obj *unstructured.Unstructured) error { - list := &unstructured.UnstructuredList{} - list.SetGroupVersionKind(obj.GroupVersionKind()) - - if err := r.Client.List(ctx, list, - client.InNamespace(obj.GetNamespace()), - client.MatchingLabels(obj.GetLabels()), - client.Limit(1), - ); err != nil { - return fmt.Errorf("list: %w", err) - } - - if len(list.Items) > 0 { - *obj = list.Items[0] - return nil - } - - if err := r.Client.Create(ctx, obj); err != nil { - spew.Dump(obj) - return fmt.Errorf("create: %w", err) - } - - return nil -} - -func (r *PipelineReconciler) ListRunTemplates( - ctx context.Context, - opts ...client.ListOption, -) ([]*v1alpha1.RunTemplate, error) { - list := &v1alpha1.RunTemplateList{} - if err := r.Client.List(ctx, list, opts...); err != nil { - return nil, fmt.Errorf("list: %w", err) - } - - res := []*v1alpha1.RunTemplate{} - for _, item := range list.Items { - item := item - res = append(res, &item) - } - - return res, nil -} - -func (r *PipelineReconciler) GetRunTemplate( - ctx context.Context, - name, namespace string, -) (*v1alpha1.RunTemplate, error) { - obj := &v1alpha1.RunTemplate{} - - if err := r.Client.Get(ctx, client.ObjectKey{ - Name: name, - Namespace: namespace, - }, obj); err != nil { - return nil, fmt.Errorf("get '%s/%s': %w", namespace, name, err) - } - - return obj, nil -} - -func (r *PipelineReconciler) GetPipeline( - ctx context.Context, - name, namespace string, -) (*v1alpha1.Pipeline, error) { - obj := &v1alpha1.Pipeline{} - - if err := r.Client.Get(ctx, client.ObjectKey{ - Name: name, - Namespace: namespace, - }, obj); err != nil { - return nil, fmt.Errorf("get '%s/%s': %w", namespace, name, err) - } - - return obj, nil -} - -func (r *PipelineReconciler) hasStatusChanged( - before *v1alpha1.Pipeline, - after *v1alpha1.Pipeline, -) bool { - if len(before.Status.Conditions) == 0 || len(after.Status.Conditions) == 0 { - return true - } - - digestBefore, err := digest(before.Status) - if err != nil { - panic(fmt.Errorf("digest status before: %w", err)) - } - - digestAfter, err := digest(after.Status) - if err != nil { - panic(fmt.Errorf("digest status before: %w", err)) - } - - return digestBefore != digestAfter -} diff --git a/experiments/pipeline-service/pkg/controller/registrar.go b/experiments/pipeline-service/pkg/controller/registrar.go deleted file mode 100644 index 3588be597..000000000 --- a/experiments/pipeline-service/pkg/controller/registrar.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2021 VMware -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package controller - -import ( - "fmt" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/source" - - "github.com/vmware-tanzu/cartographer/experiments/pipeline-service/pkg/apis/v1alpha1" -) - -func AddToScheme(scheme *runtime.Scheme) error { - if err := corev1.AddToScheme(scheme); err != nil { - return fmt.Errorf("corev1 add to scheme: %w", err) - } - - if err := v1alpha1.AddToScheme(scheme); err != nil { - return fmt.Errorf("ppservice v1alpha1 add to scheme: %w", err) - } - - return nil -} - -func RegisterControllers(mgr manager.Manager) error { - if err := RegisterPipelineController(mgr); err != nil { - return fmt.Errorf("register pipeline controller: %w", err) - } - - return nil -} - -func RegisterPipelineController(mgr manager.Manager) error { - ctrl, err := controller.New("pipeline", mgr, controller.Options{ - Reconciler: &PipelineReconciler{ - Client: mgr.GetClient(), - Logger: mgr.GetLogger().WithName("pipeline"), - }, - }) - if err != nil { - return fmt.Errorf("controller new: %w", err) - } - - if err := ctrl.Watch( - &source.Kind{Type: &v1alpha1.Pipeline{}}, - &handler.EnqueueRequestForObject{}, - ); err != nil { - return fmt.Errorf("watch: %w", err) - } - - return nil -} diff --git a/experiments/pipeline-service/releases/release.yaml b/experiments/pipeline-service/releases/release.yaml deleted file mode 100644 index d6e4c712b..000000000 --- a/experiments/pipeline-service/releases/release.yaml +++ /dev/null @@ -1,304 +0,0 @@ -# Copyright 2021 VMware -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: v1 -kind: Namespace -metadata: - name: pipeline-service-system ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: pipeline-service-controller - namespace: pipeline-service-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: pipeline-service-cluster-admin -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-admin -subjects: - - kind: ServiceAccount - name: pipeline-service-controller - namespace: pipeline-service-system ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: pipeline-service-controller - namespace: pipeline-service-system -spec: - selector: - matchLabels: - app: pipeline-service-controller - replicas: 1 - revisionHistoryLimit: 0 - template: - metadata: - labels: - app: pipeline-service-controller - spec: - serviceAccount: pipeline-service-controller - containers: - - name: pipeline-service-controller - image: projectcartographer/controller-d632d1c5254f292a1dd64c68fcb09b9f@sha256:e123b43556d09cc420a67bed61ea3806034031506de87fe096c0cc905b85bff5 - securityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - runAsNonRoot: true - capabilities: - drop: - - all - resources: - requests: - cpu: 200m - memory: 200Mi ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.6.2 - creationTimestamp: null - name: pipelines.carto.run -spec: - group: carto.run - names: - kind: Pipeline - listKind: PipelineList - plural: pipelines - singular: pipeline - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Succeeded")].status - name: Succeeded - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - 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: - properties: - inputs: - description: Inputs define the parameters that should be passed onto the run template. The contents of this field are used to provide idempotency for the reconciler, being used to define a digest that's compared before creating a new run. - type: object - x-kubernetes-preserve-unknown-fields: true - runTemplateName: - description: RunTemplateName is the name of the RunTemplate object to use to dictate how to run an instance of a pipeline. - type: string - selector: - description: Selector is used for matching against an object to be accessible for templating a Run (for instance, finding out the name of a developer-provided tekton/Pipeline, or a ConfigMap to be embedded in). - properties: - matchingLabels: - additionalProperties: - type: string - description: MatchingLabels indicates the label set to use when searching for objects of a given gvr. - minProperties: 1 - type: object - resource: - description: Resource indicates a GVR to match against. - properties: - apiVersion: - type: string - kind: - type: string - required: - - apiVersion - - kind - type: object - required: - - matchingLabels - - resource - type: object - required: - - inputs - - runTemplateName - type: object - status: - properties: - conditions: - items: - description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - latestInputs: - description: LatestInputs represents the set of inputs that were used the last time that this reconciler observed a success for a run that it created. - type: object - x-kubernetes-preserve-unknown-fields: true - latestOutputs: - description: LatestOutputs displays the set of outputs that were produced in the last time that this reconciler observed a success for a run that it created. - type: object - x-kubernetes-preserve-unknown-fields: true - required: - - conditions - type: object - required: - - metadata - - spec - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.6.2 - creationTimestamp: null - name: runtemplates.carto.run -spec: - group: carto.run - names: - kind: RunTemplate - listKind: RunTemplateList - plural: runtemplates - singular: runtemplate - scope: Namespaced - 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: - properties: - completion: - description: Completion describe rules for determining whether the invocation was successfull, failed, or is still running (neither succeeded nor failed). - properties: - failed: - description: Failed provides the rule to evaluate to determine if the invocation succeeded or failed. - properties: - key: - description: Key is the gjson query the perform to retrieve an indication of success/failure. - type: string - value: - description: Value is the expected result to indicate success/failure. - type: string - type: object - succeeded: - description: Succeeded provides the rule to evaluate to determine if the invocation succeeded or failed. - properties: - key: - description: Key is the gjson query the perform to retrieve an indication of success/failure. - type: string - value: - description: Value is the expected result to indicate success/failure. - type: string - type: object - type: object - outputs: - description: Outputs lets you specify rules for capturing results from the pipeline invocations. - items: - properties: - name: - description: Name indicates the value that should be used as a key in the kontinue/Pipeline .status.latestOutputs. - type: string - path: - description: Path denotes the query that should be performed to retrieve a value from the object stamped out according to this RunTemplate template. - type: string - required: - - name - - path - type: object - type: array - x-kubernetes-preserve-unknown-fields: true - template: - description: "Template is the template that should be stamped out when submitting a new pipeline invocation. \n To this template are made available: \n \t- the pipeline object that is referencing this RunTemplate \t- (optional) the object that matched the Pipeline's selection rules. \n For instance: \n \tkind: ConfigMap \tapiVersion: v1 \tmetadata: \t generateName: $(pipeline.metadata.name)- \tdata: \t foo: $(selected.metadata.name)" - type: object - x-kubernetes-preserve-unknown-fields: true - required: - - template - type: object - required: - - metadata - - spec - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- diff --git a/experiments/pipeline-service/tools/tools.go b/experiments/pipeline-service/tools/tools.go deleted file mode 100644 index f91dfc56c..000000000 --- a/experiments/pipeline-service/tools/tools.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2021 VMware -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build tools - -package tools - -import ( - _ "sigs.k8s.io/controller-tools/cmd/controller-gen" -)