From c2b6e6efddc9f5183105843b3fcaba01bb6806be Mon Sep 17 00:00:00 2001 From: Zheng Xi Zhou Date: Wed, 10 Mar 2021 10:44:58 +0800 Subject: [PATCH] Store capability OpenAPI V3 JSON schema in ConfigMap (#1106) * Store capability OpenAPI V3 JSON schema in ConfigMap Store the OpenAPI v3 JSON Schema generated from the parameters of a capability which could be used by api server To fix #899 address comments try to fix data race issue Co-authored-by: Jianbo Sun * address comments: generate cue instance from cue json instead of local file * update ConfigMap data at any time * add more unit-test * fix conflicts * adapt to new spec.schematic.cue.template * adapt to new spec.schematic.cue.template for controller unittest cases * fix ci issues * adapt to namespaced scope definition * add more testcases on namespaced definitions with and without namespaces Co-authored-by: Jianbo Sun --- apis/core.oam.dev/v1alpha2/core_types.go | 36 +- .../v1alpha2/zz_generated.deepcopy.go | 18 + apis/types/capability.go | 8 + .../crds/core.oam.dev_traitdefinitions.yaml | 32 ++ .../core.oam.dev_workloaddefinitions.yaml | 35 +- docs/en/_sidebar.md | 1 + .../openapi-v3-json-schema.md | 135 ++++++++ docs/resources/json-schema-render-example.jpg | Bin 0 -> 66949 bytes go.sum | 179 ---------- .../crds/core.oam.dev_traitdefinitions.yaml | 32 ++ .../core.oam.dev_workloaddefinitions.yaml | 35 +- .../application/application_controller.go | 2 +- .../applicationconfiguration.go | 2 +- .../applicationdeployment_controller.go | 2 +- .../scopes/healthscope/healthscope_test.go | 2 +- .../manualscalertrait_controller.go | 6 +- .../traitdefinition_controller.go | 87 +++++ .../traitdefinition_controller_test.go | 254 ++++++++++++++ .../traitdefinition_suite_test.go | 107 ++++++ ...containerizedworkload_controller_helper.go | 6 +- .../workloaddefinition_controller.go | 91 +++++ .../workloaddefinition_controller_test.go | 310 ++++++++++++++++++ .../workloaddefinition_suite_test.go | 107 ++++++ pkg/controller/core.oam.dev/v1alpha2/setup.go | 10 +- .../autoscaler/autoscaler_controller.go | 4 +- .../metrics/metricstrait_controller.go | 2 +- .../v1alpha1/routes/route_controller.go | 2 +- pkg/controller/utils/capability.go | 281 ++++++++++++++++ .../utils/capability_integrate_test.go | 214 ++++++++++++ pkg/controller/utils/capability_suite_test.go | 69 ++++ pkg/controller/utils/capability_test.go | 132 ++++++++ .../definition/normalOpenAPISchema.json | 0 .../definition/normalOpenAPISchemaFixed.json | 0 .../normalOpenAPISchemaParameter.json | 0 .../testdata/definition/shortTagSchema.json | 0 .../definition/shortTagSchemaFixed.json | 0 .../testdata/definition/webservice.json | 0 .../testdata/definition/webserviceFixed.json | 0 .../utils}/testdata/definition/workload1.cue | 0 .../definition/workloadNoParameter.cue | 0 pkg/oam/util/helper.go | 19 +- pkg/oam/util/helper_test.go | 16 +- pkg/oam/util/template.go | 8 +- pkg/utils/common/common.go | 13 - pkg/utils/common/common_test.go | 112 ++++--- .../application/validating_handler.go | 2 +- .../validating_handler.go | 2 +- references/README.md | 2 +- references/apiserver/definitionHandler.go | 9 +- references/cli/dryrun.go | 2 +- references/common/capability.go | 10 + references/common/definition.go | 204 ------------ references/common/definition_test.go | 233 ------------- references/plugins/cluster.go | 2 +- 54 files changed, 2091 insertions(+), 744 deletions(-) create mode 100644 docs/en/platform-engineers/openapi-v3-json-schema.md create mode 100644 docs/resources/json-schema-render-example.jpg create mode 100644 pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_controller.go create mode 100644 pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_controller_test.go create mode 100644 pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_suite_test.go create mode 100644 pkg/controller/core.oam.dev/v1alpha2/core/workloads/workloaddefinition/workloaddefinition_controller.go create mode 100644 pkg/controller/core.oam.dev/v1alpha2/core/workloads/workloaddefinition/workloaddefinition_controller_test.go create mode 100644 pkg/controller/core.oam.dev/v1alpha2/core/workloads/workloaddefinition/workloaddefinition_suite_test.go create mode 100644 pkg/controller/utils/capability.go create mode 100644 pkg/controller/utils/capability_integrate_test.go create mode 100644 pkg/controller/utils/capability_suite_test.go create mode 100644 pkg/controller/utils/capability_test.go rename {references/common => pkg/controller/utils}/testdata/definition/normalOpenAPISchema.json (100%) rename {references/common => pkg/controller/utils}/testdata/definition/normalOpenAPISchemaFixed.json (100%) rename {references/common => pkg/controller/utils}/testdata/definition/normalOpenAPISchemaParameter.json (100%) rename {references/common => pkg/controller/utils}/testdata/definition/shortTagSchema.json (100%) rename {references/common => pkg/controller/utils}/testdata/definition/shortTagSchemaFixed.json (100%) rename {references/common => pkg/controller/utils}/testdata/definition/webservice.json (100%) rename {references/common => pkg/controller/utils}/testdata/definition/webserviceFixed.json (100%) rename {references/common => pkg/controller/utils}/testdata/definition/workload1.cue (100%) rename {references/common => pkg/controller/utils}/testdata/definition/workloadNoParameter.cue (100%) delete mode 100644 references/common/definition.go delete mode 100644 references/common/definition_test.go diff --git a/apis/core.oam.dev/v1alpha2/core_types.go b/apis/core.oam.dev/v1alpha2/core_types.go index 449144222..668ebd12a 100644 --- a/apis/core.oam.dev/v1alpha2/core_types.go +++ b/apis/core.oam.dev/v1alpha2/core_types.go @@ -82,11 +82,6 @@ type WorkloadDefinitionSpec struct { // +optional Status *Status `json:"status,omitempty"` - // Template defines the abstraction template data of the workload, it will replace the old template in extension field. - // the data format depends on templateType, by default it's CUE - // +optional - Template string `json:"template,omitempty"` - // Schematic defines the data format and template of the encapsulation of the workload // +optional Schematic *Schematic `json:"schematic,omitempty"` @@ -97,6 +92,11 @@ type WorkloadDefinitionSpec struct { Extension *runtime.RawExtension `json:"extension,omitempty"` } +// CapabilityStatus is the status of WorkloadDefinition and TraitDefinition +type CapabilityStatus struct { + runtimev1alpha1.ConditionedStatus `json:",inline"` +} + // Status defines the loop back status of the abstraction by using CUE template type Status struct { // CustomStatus defines the custom status message that could display to user @@ -119,7 +119,18 @@ type WorkloadDefinition struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` - Spec WorkloadDefinitionSpec `json:"spec,omitempty"` + Spec WorkloadDefinitionSpec `json:"spec,omitempty"` + Status CapabilityStatus `json:"status,omitempty"` +} + +// SetConditions set condition for WorkloadDefinition +func (wd *WorkloadDefinition) SetConditions(c ...runtimev1alpha1.Condition) { + wd.Status.SetConditions(c...) +} + +// GetCondition gets condition from WorkloadDefinition +func (wd *WorkloadDefinition) GetCondition(conditionType runtimev1alpha1.ConditionType) runtimev1alpha1.Condition { + return wd.Status.GetCondition(conditionType) } // +kubebuilder:object:root=true @@ -189,7 +200,18 @@ type TraitDefinition struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` - Spec TraitDefinitionSpec `json:"spec,omitempty"` + Spec TraitDefinitionSpec `json:"spec,omitempty"` + Status CapabilityStatus `json:"status,omitempty"` +} + +// SetConditions set condition for TraitDefinition +func (td *TraitDefinition) SetConditions(c ...runtimev1alpha1.Condition) { + td.Status.SetConditions(c...) +} + +// GetCondition gets condition from TraitDefinition +func (td *TraitDefinition) GetCondition(conditionType runtimev1alpha1.ConditionType) runtimev1alpha1.Condition { + return td.Status.GetCondition(conditionType) } // +kubebuilder:object:root=true diff --git a/apis/core.oam.dev/v1alpha2/zz_generated.deepcopy.go b/apis/core.oam.dev/v1alpha2/zz_generated.deepcopy.go index e0400ef1e..c483e9ba3 100644 --- a/apis/core.oam.dev/v1alpha2/zz_generated.deepcopy.go +++ b/apis/core.oam.dev/v1alpha2/zz_generated.deepcopy.go @@ -514,6 +514,22 @@ func (in *CUE) DeepCopy() *CUE { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CapabilityStatus) DeepCopyInto(out *CapabilityStatus) { + *out = *in + in.ConditionedStatus.DeepCopyInto(&out.ConditionedStatus) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CapabilityStatus. +func (in *CapabilityStatus) DeepCopy() *CapabilityStatus { + if in == nil { + return nil + } + out := new(CapabilityStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ChildResourceKind) DeepCopyInto(out *ChildResourceKind) { *out = *in @@ -1798,6 +1814,7 @@ func (in *TraitDefinition) DeepCopyInto(out *TraitDefinition) { 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 TraitDefinition. @@ -1959,6 +1976,7 @@ func (in *WorkloadDefinition) DeepCopyInto(out *WorkloadDefinition) { 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 WorkloadDefinition. diff --git a/apis/types/capability.go b/apis/types/capability.go index 3056535c4..e8a447eeb 100644 --- a/apis/types/capability.go +++ b/apis/types/capability.go @@ -86,6 +86,14 @@ const ( TypeScope CapType = "scope" ) +// CapabilityConfigMapNamePrefix is the prefix for capability ConfigMap name +const CapabilityConfigMapNamePrefix = "schema-" + +const ( + // OpenapiV3JSONSchema is the key to store OpenAPI v3 JSON schema in ConfigMap + OpenapiV3JSONSchema string = "openapi-v3-json-schema" +) + // CapabilityCategory defines the category of a capability type CapabilityCategory string diff --git a/charts/vela-core/crds/core.oam.dev_traitdefinitions.yaml b/charts/vela-core/crds/core.oam.dev_traitdefinitions.yaml index cc7d53c8e..290362b6d 100644 --- a/charts/vela-core/crds/core.oam.dev_traitdefinitions.yaml +++ b/charts/vela-core/crds/core.oam.dev_traitdefinitions.yaml @@ -95,6 +95,38 @@ spec: description: WorkloadRefPath indicates where/if a trait accepts a workloadRef object type: string type: object + status: + description: CapabilityStatus is the status of WorkloadDefinition and TraitDefinition + properties: + conditions: + description: Conditions of the resource. + items: + description: A Condition that may apply to a resource. + properties: + lastTransitionTime: + description: LastTransitionTime is the last time this condition transitioned from one status to another. + format: date-time + type: string + message: + description: A Message containing details about this condition's last transition from one status to another, if any. + type: string + reason: + description: A Reason for this condition's last transition from one status to another. + type: string + status: + description: Status of this condition; is it currently True, False, or Unknown? + type: string + type: + description: Type of this condition. At most one of each condition type may apply to a resource at any point in time. + type: string + required: + - lastTransitionTime + - reason + - status + - type + type: object + type: array + type: object type: object served: true storage: true diff --git a/charts/vela-core/crds/core.oam.dev_workloaddefinitions.yaml b/charts/vela-core/crds/core.oam.dev_workloaddefinitions.yaml index 51a59d457..05d7bd074 100644 --- a/charts/vela-core/crds/core.oam.dev_workloaddefinitions.yaml +++ b/charts/vela-core/crds/core.oam.dev_workloaddefinitions.yaml @@ -105,12 +105,41 @@ spec: description: HealthPolicy defines the health check policy for the abstraction type: string type: object - template: - description: Template defines the abstraction template data of the workload, it will replace the old template in extension field. the data format depends on templateType, by default it's CUE - type: string required: - definitionRef type: object + status: + description: CapabilityStatus is the status of WorkloadDefinition and TraitDefinition + properties: + conditions: + description: Conditions of the resource. + items: + description: A Condition that may apply to a resource. + properties: + lastTransitionTime: + description: LastTransitionTime is the last time this condition transitioned from one status to another. + format: date-time + type: string + message: + description: A Message containing details about this condition's last transition from one status to another, if any. + type: string + reason: + description: A Reason for this condition's last transition from one status to another. + type: string + status: + description: Status of this condition; is it currently True, False, or Unknown? + type: string + type: + description: Type of this condition. At most one of each condition type may apply to a resource at any point in time. + type: string + required: + - lastTransitionTime + - reason + - status + - type + type: object + type: array + type: object type: object served: true storage: true diff --git a/docs/en/_sidebar.md b/docs/en/_sidebar.md index e4e9ee514..c625ac504 100644 --- a/docs/en/_sidebar.md +++ b/docs/en/_sidebar.md @@ -11,6 +11,7 @@ - [Workload Type](/en/platform-engineers/workload-type.md) - [Trait](/en/platform-engineers/trait.md) - [Cloud Services](/en/platform-engineers/cloud-services.md) + - [OpenAPI v3 JSON schema](./platform-engineers/openapi-v3-json-schema.md) - CUE - [CUE Basic](/en/cue/basic.md) - [Workload Type](/en/cue/workload-type.md) diff --git a/docs/en/platform-engineers/openapi-v3-json-schema.md b/docs/en/platform-engineers/openapi-v3-json-schema.md new file mode 100644 index 000000000..b639a4d02 --- /dev/null +++ b/docs/en/platform-engineers/openapi-v3-json-schema.md @@ -0,0 +1,135 @@ +# OpenAPI v3 JSON Schema of a definition + +## Why is OpenAPI v3 JSON Schema of a definition needed? + +In definitions, [parameter](https://kubevela.io/#/en/platform-engineers/workload-type?id=_4-define-template) section are expected to be set by developers when creating `Application` object. +While there is another GUI way for developers to input all parameter fields by rendering `parameter` section to [OpenAPI v3 Specification](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#format). + +For example, after you created a definition object, KubeVela will generate OpenAPI v3 JSON Schema from `parameter` of Workload Type [webservice](https://kubevela.io/#/en/developers/references/workload-types/webservice). + +```json +{ + "properties": { + "cmd": { + "description": "Commands to run in the container", + "items": { + "type": "string" + }, + "title": "cmd", + "type": "array" + }, + "cpu": { + "description": "Number of CPU units for the service, like `0.5` (0.5 CPU core), `1` (1 CPU core)", + "title": "cpu", + "type": "string" + }, + "env": { + "description": "Define arguments by using environment variables", + "items": { + "properties": { + "name": { + "description": "Environment variable name", + "title": "name", + "type": "string" + }, + "value": { + "description": "The value of the environment variable", + "title": "value", + "type": "string" + }, + "valueFrom": { + "description": "Specifies a source the value of this var should come from", + "properties": { + "secretKeyRef": { + "description": "Selects a key of a secret in the pod's namespace", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key", + "title": "key", + "type": "string" + }, + "name": { + "description": "The name of the secret in the pod's namespace to select from", + "title": "name", + "type": "string" + } + }, + "required": ["name", "key"], + "title": "secretKeyRef", + "type": "object" + } + }, + "required": ["secretKeyRef"], + "title": "valueFrom", + "type": "object" + } + }, + "required": ["name"], + "type": "object" + }, + "title": "env", + "type": "array" + }, + "image": { + "description": "Which image would you like to use for your service", + "title": "image", + "type": "string" + }, + "port": { + "default": 80, + "description": "Which port do you want customer traffic sent to", + "title": "port", + "type": "integer" + } + }, + "required": ["image", "port"], + "type": "object" +} +``` + +You can render the schema by [form-render](https://github.com/alibaba/form-render) or [React JSON Schema form](https://github.com/rjsf-team/react-jsonschema-form). A web form can be as below. + +![](../../resources/json-schema-render-example.jpg) + +## How to use the generated JSON Schema of definition + +When a platform builder applies a WorkloadDefinition or TraitDefinition, a ConfigMap will be created in a namespace same +as the definition (by default it will be in `vela-system` namespace) and labeled with `definition.oam.dev=schema`. + +```shell +$ kubectl get cm -n vela-system -l definition.oam.dev=schema +NAME DATA AGE +schema-ingress 1 19s +schema-scaler 1 19s +schema-task 1 19s +schema-webservice 1 19s +schema-worker 1 20s +``` + +The ConfigMap name is in the format `schema-$definitionName`, and the key of ConfigMap data is `openapi-v3-json-schema`. +For example, we can use the following command to get the JSON Schema of `webservice`. + +```shell +$ kubectl get cm schema-webservice -n vela-system -o yaml +apiVersion: v1 +data: + openapi-v3-json-schema: '{"properties":{"cmd":{"description":"Commands to run in + the container","items":{"type":"string"},"title":"cmd","type":"array"},"cpu":{"description":"Number + of CPU units for the service, like `0.5` (0.5 CPU core), `1` (1 CPU core)","title":"cpu","type":"string"},"env":{"description":"Define + arguments by using environment variables","items":{"properties":{"name":{"description":"Environment + variable name","title":"name","type":"string"},"value":{"description":"The value + of the environment variable","title":"value","type":"string"},"valueFrom":{"description":"Specifies + a source the value of this var should come from","properties":{"secretKeyRef":{"description":"Selects + a key of a secret in the pod''s namespace","properties":{"key":{"description":"The + key of the secret to select from. Must be a valid secret key","title":"key","type":"string"},"name":{"description":"The + name of the secret in the pod''s namespace to select from","title":"name","type":"string"}},"required":["name","key"],"title":"secretKeyRef","type":"object"}},"required":["secretKeyRef"],"title":"valueFrom","type":"object"}},"required":["name"],"type":"object"},"title":"env","type":"array"},"image":{"description":"Which + image would you like to use for your service","title":"image","type":"string"},"port":{"default":80,"description":"Which + port do you want customer traffic sent to","title":"port","type":"integer"}},"required":["image","port"],"type":"object"}' +kind: ConfigMap +metadata: + name: schema-webservice + namespace: vela-system +``` + +If you adopt [KubeVela API Server](https://github.com/oam-dev/kubevela/tree/master/references/apiserver), you can get the +schema by API [/api/definitions/{definitionName}](https://kubevela.io/en/developers/references/restful-api/index.html#api-Definitions-getDefinition). diff --git a/docs/resources/json-schema-render-example.jpg b/docs/resources/json-schema-render-example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..245563cc0b94b4b74f486842f7708a8867ba4747 GIT binary patch literal 66949 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 z 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 literal 0 HcmV?d00001 diff --git a/go.sum b/go.sum index 79c841304..498922bd7 100644 --- a/go.sum +++ b/go.sum @@ -4,7 +4,6 @@ cloud.google.com/go v0.25.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.30.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= cloud.google.com/go v0.40.0/go.mod h1:Tk58MuI9rbLMKlAjeO/bDnteAx7tX2gJIXw4T5Jwlro= @@ -12,7 +11,6 @@ cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7p cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1 h1:lRi0CHyU+ytlvylOlFKKq0af6JncuyoRh1J+QJBqQx0= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.47.0/go.mod h1:5p3Ky/7f3N10VBkhuR5LFtddroTiMyjZV/Kj5qOQFxU= @@ -23,12 +21,10 @@ cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO 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.55.0/go.mod h1:ZHmoY+/lIMNkN2+fBmuTiqZ4inFhvQad8ft7MT8IV5Y= -cloud.google.com/go v0.56.0 h1:WRz29PgAsVEyPSDHyk+0fpEkwEFyfhHn+JbksT6gIL4= 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.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= cloud.google.com/go v0.61.0/go.mod h1:XukKJg4Y7QsUu0Hxg3qQKUWR4VuWivmyMK2+rUyxAqw= -cloud.google.com/go v0.62.0 h1:RmDygqvj27Zf3fCQjQRtLyC7KwFcHkeJitcO0OoGOcA= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= @@ -85,7 +81,6 @@ github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuE github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= github.com/Azure/azure-pipeline-go v0.1.9/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2 h1:6oiIS9yaG6XCCzhgAgKFfIWyo4LLCiDhZot6ltoThhY= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v19.1.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= @@ -118,7 +113,6 @@ github.com/Azure/go-autorest/autorest v0.10.2 h1:NuSF3gXetiHyUbVdneJMEVyPUYAe5wh github.com/Azure/go-autorest/autorest v0.10.2/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest/adal v0.1.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0 h1:CxTzQrySOxDnKpLjFJeZAS5Qrv/qFPkgLjx5bOAi//I= github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.8.1-0.20191028180845-3492b2aff503/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= @@ -284,7 +278,6 @@ github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= 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= @@ -366,7 +359,6 @@ github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqh github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2 h1:ForxmXkA6tPIvffbrDAcPUIB32QgXkt2XFj+F0UxetA= github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.3 h1:LoIzb5y9x5l8VKAlyrbusNPXqBY0+kviRloxFUMFwKc= github.com/containerd/containerd v1.3.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= @@ -391,11 +383,9 @@ github.com/coreos/go-semver v0.0.0-20180108230905-e214231b295a/go.mod h1:nnelYz7 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 h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/prometheus-operator v0.41.1 h1:MEhY9syliPlQg+VlFRUfNodUEVXRXJ2n1pFG0aBp+mI= github.com/coreos/prometheus-operator v0.41.1/go.mod h1:LhLfEBydppl7nvfEA1jIqlF3xJ9myHCnzrU+HHDxRd4= @@ -425,7 +415,6 @@ github.com/denisenkom/go-mssqldb v0.0.0-20190111225525-2fea367d496d/go.mod h1:xN github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/devigned/tab v0.1.1 h1:3mD6Kb1mUOYeLpJvTVSDwSg5ZsfSxfvxGRTxRsJsITA= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= @@ -436,13 +425,11 @@ github.com/dgryski/go-gk v0.0.0-20200319235926-a69029f61654/go.mod h1:qm+vckxRlD github.com/dgryski/go-lttb v0.0.0-20180810165845-318fcdf10a77/go.mod h1:Va5MyIzkU0rAM92tn3hb3Anb7oz7KcnixF49+2wOMe4= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= github.com/djherbis/atime v1.0.0/go.mod h1:5W+KBIuTwVGcqjIfaTwt+KSYX1o6uep8dtevevQP/f8= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/cli v0.0.0-20190925022749-754388324470/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v0.0.0-20200130152716-5d0cf8839492 h1:FwssHbCDJD025h+BchanCwE1Q8fyMgqDr2mOQAWOLGw= github.com/docker/cli v0.0.0-20200130152716-5d0cf8839492/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v0.0.0-20200210162036-a4bedce16568 h1:AbI1uj9w4yt6TvfKHfRu7G55KuQe7NCvWPQRKDoXggE= github.com/docker/cli v0.0.0-20200210162036-a4bedce16568/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= @@ -468,11 +455,8 @@ github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdf github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q= github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= @@ -507,7 +491,6 @@ github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v0.0.0-20180516100307-2d684516a886/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= @@ -520,7 +503,6 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.8.1 h1:PvpJR0Uq8SdX+zagCMsarBMlhz6ysGTf1+pRmCsRXqY= github.com/frankban/quicktest v1.8.1/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -576,7 +558,6 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/zapr v0.1.0 h1:h+WVe9j6HAA01niTJPA/kKH0i7e0rLZBCwauQFcRE54= github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v0.1.1 h1:qXBXPDdNncunGs7XeEpsJt8wCjYBygluzfdLO0G5baE= github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= @@ -601,7 +582,6 @@ github.com/go-openapi/jsonpointer v0.17.2/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwds github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -611,7 +591,6 @@ github.com/go-openapi/jsonreference v0.17.2/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3Hfo github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= @@ -635,11 +614,9 @@ github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsd github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/spec v0.19.7 h1:0xWSeMd35y5avQAThZR2PkEuqSosoS5t6gDH4L8n11M= github.com/go-openapi/spec v0.19.7/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg= github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= @@ -656,10 +633,8 @@ github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/ github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= -github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE= github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/swag v0.19.11 h1:RFTu/dlFySpyVvJDfp/7674JY4SDglYWKztbiIGFpmc= github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY= @@ -678,13 +653,11 @@ github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTM github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-sql-driver/mysql v0.0.0-20160411075031-7ebe0a500653/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -752,7 +725,6 @@ github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= @@ -762,18 +734,15 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721 h1:KRMr9A3qfbVM7iV/WcLY/rL5LICqwMHLhwRXKu99fXw= github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/lint v0.0.0-20180702182130-06c8688daad7 h1:2hRPrmiwPrp3fQX967rNJIhQPtiGXdlQWAxKbKw3VHA= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -786,9 +755,7 @@ github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+ github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= 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= @@ -797,9 +764,7 @@ github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:x 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 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= @@ -844,10 +809,8 @@ github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= 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 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= 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= @@ -875,7 +838,6 @@ github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVgg github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -917,7 +879,6 @@ github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsC github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/googleapis/gnostic v0.4.0 h1:BXDUo8p/DaxC+4FJY/SSx3gvnx9C1VdHNgaUkiEL5mk= github.com/googleapis/gnostic v0.4.0/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= @@ -935,14 +896,11 @@ github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhj github.com/goreleaser/nfpm v1.3.0/go.mod h1:w0p7Kc9TAUgWMyrub63ex3M2Mgw88M4GZXoTq5UCb40= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/csrf v1.6.2/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAkHEGI= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33 h1:893HsJqtxp9z1SF76gg6hY70hRY1wVlTSnC/h1yUDCo= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= @@ -957,7 +915,6 @@ github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7 github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc h1:f8eY6cV/x1x+HLjOp4r72s/31/V2aTUtg5oKRRPf8/Q= github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -987,7 +944,6 @@ github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyN github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= @@ -1005,20 +961,16 @@ github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iP github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v0.0.0-20171204182908-b7773ae21874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= -github.com/hashicorp/go-retryablehttp v0.6.6 h1:HJunrbHTDDbBb/ay4kxa1n+dLmttUlnP3V9oNE4hmsM= github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -1028,13 +980,10 @@ github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+d github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 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 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= 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= @@ -1048,7 +997,6 @@ github.com/hashicorp/serf v0.8.5/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/huandu/xstrings v1.3.1 h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs= @@ -1056,11 +1004,8 @@ github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -1081,7 +1026,6 @@ github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1: github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8= github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jenkins-x/go-scm v1.5.65/go.mod h1:MgGRkJScE/rJ30J/bXYqduN5sDPZqZFITJopsnZmTOw= github.com/jenkins-x/go-scm v1.5.79/go.mod h1:PCT338UhP/pQ0IeEeMEf/hoLTYKcH7qjGEKd7jPkeYg= @@ -1102,7 +1046,6 @@ github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5 h1:lrdPtrORjGv1HbbEvKWDUAy97mPpFm4B8hp77tcCUJY= github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= @@ -1115,16 +1058,13 @@ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22 github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -1150,7 +1090,6 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.5 h1:U+CaK85mrNNb4k8BNOfgJtJ/gr6kswUCFj6miSzVC6M= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.10.5 h1:7q6vHIqubShURwQz8cQK6yIe/xC3IF0Vm7TGfqjewrc= @@ -1165,25 +1104,20 @@ github.com/klauspost/pgzip v1.2.1 h1:oIPZROsWuPHpOdMVWLuJZXwgjhrW8r1yEX8UqMyeNHM github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/knative/build v0.1.2/go.mod h1:/sU74ZQkwlYA5FwYDJhYTy61i/Kn+5eWfln2jDbw3Qo= github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.0.0/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5 h1:hyz3dwM5QLc1Rfoz4FuWJQG5BN7tc6K1MndAUnGpQr4= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -1223,10 +1157,8 @@ github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 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 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.1-0.20191009090205-6c0755d89d1e/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -1239,23 +1171,19 @@ github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859 github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a/go.mod h1:M1qoD/MqPgTZIk0EWKB38wE28ACRfVcn+cU08jyArI0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20191113090002-7c0f6868bffe/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= @@ -1264,9 +1192,7 @@ github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHX github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.6 h1:V2iyH+aX9C5fsYCpK60U8BYIvmhqxuOL3JZcqc1NB7k= github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0= github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -1275,7 +1201,6 @@ github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lL github.com/mattn/go-sqlite3 v0.0.0-20160514122348-38ee283dabf1/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.12.0 h1:u/x3mp++qUxvYfulZ4HKOvVO0JWhk7HtE8lWhbGz/Do= github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v2.0.1+incompatible h1:xQ15muvnzGBHpIpdrNi1DA5x0+TcBZzsIDwmw9uTHzw= github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -1311,13 +1236,11 @@ github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdI github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452 h1:hOY53G+kBFhbYFpRVxHl5eS7laP6B1+Cq+Z9Dry1iMU= github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/hashstructure/v2 v2.0.1 h1:L60q1+q7cXE4JeEJJKMnh2brFIe3rZxCihYAB61ypAY= github.com/mitchellh/hashstructure/v2 v2.0.1/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= -github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/ioprogress v0.0.0-20180201004757-6a23b12fa88e/go.mod h1:waEya8ee1Ro/lgxpVhkJI4BVASzkm3UZqkx/cFJiYHM= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -1397,7 +1320,6 @@ github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= @@ -1411,17 +1333,14 @@ github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34= github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -1431,7 +1350,6 @@ github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zM github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJGY8Y= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700 h1:eNUVfm/RFLIi1G7flU5/ZRTHvd4kcVuzfRnL6OFlzCI= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/openkruise/kruise-api v0.7.0 h1:BBQotEfeZ2l1+R0uvlsVK2FN8C4RTlG+JT86ba2hOR4= @@ -1472,14 +1390,12 @@ github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rK github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.2.6+incompatible h1:6aCX4/YZ9v8q69hTyiR7dNLnTA3fgtKHVVW5BCd5Znw= github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.0.0-20180311214515-816c9085562c/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1500,9 +1416,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.2.0/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= @@ -1516,7 +1430,6 @@ github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1: github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= 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.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1530,9 +1443,7 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= @@ -1546,11 +1457,8 @@ github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.6/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= @@ -1576,7 +1484,6 @@ github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.4.0 h1:LUa41nrWTQNGhzdsZ5lTnkwbNjj6rXTdazA1cSdjkOY= github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.6.0 h1:IZRgg4sfrDH7nsAD1Y/Nwj+GzIfEwpJSLjCaNC3SbsI= @@ -1599,7 +1506,6 @@ github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHi github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= github.com/satori/go.uuid v0.0.0-20160603004225-b111a074d5ef/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v0.0.0-20160713180306-0aa62d5ddceb/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= @@ -1634,7 +1540,6 @@ github.com/sirupsen/logrus v1.1.1/go.mod h1:zrgwTnHtNr00buQ1vSptGe8m1f/BbgsPukg8 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -1654,7 +1559,6 @@ github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVj github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= @@ -1663,10 +1567,8 @@ github.com/spf13/cobra v0.0.0-20180319062004-c439c4fa0937/go.mod h1:1l0Ry5zgKvJa github.com/spf13/cobra v0.0.0-20180629152535-a114f312e075/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= @@ -1691,14 +1593,12 @@ github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5J github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 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 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= @@ -1755,23 +1655,18 @@ github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6 github.com/ugorji/go v1.1.1/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.5-pre/go.mod h1:FwP/aQVg39TXzItUBMwnWp9T9gPQnXw4Poh4/oBQZ/0= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.1.13 h1:nB3O5kBSQGjEQAcfe1aLUYuxmXdFKmYgBZhY32rQb6Q= github.com/ugorji/go v1.1.13/go.mod h1:jxau1n+/wyTGLQoCkjok9r5zFa/FxT6eI5HiHKQszjc= github.com/ugorji/go v1.2.1 h1:dz+JxTe7GZQdErTo7SREc1jQj/hFP1k7jyIAwODoW+k= github.com/ugorji/go v1.2.1/go.mod h1:cSVypSfTLm2o9fKxXvQgn3rMmkPXovcWor6Qn5tbFmI= github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.5-pre/go.mod h1:tULtS6Gy1AE1yCENaw4Vb//HLH5njI2tfCQDUqRd8fI= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.1.13 h1:013LbFhocBoIqgHeIHKlV4JWYhqogATYWZhIcH0WHn4= github.com/ugorji/go/codec v1.1.13/go.mod h1:oNVt3Dq+FO91WNQ/9JnHKQP2QJxTzoN7wCBFCq1OeuU= github.com/ugorji/go/codec v1.2.1 h1:/TRfW3XKkvWvmAYyCUaQlhoCDGjcvNR8xVVA/l5p/jQ= github.com/ugorji/go/codec v1.2.1/go.mod h1:s/WxCRi46t8rA+fowL40EnmD7ec0XhR7ZypxeBNdzsM= github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= -github.com/ulikunitz/xz v0.5.6 h1:jGHAfXawEGZQ3blwU5wnWKQJvAraT7Ftq9EXjnXYgt8= github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= github.com/ulikunitz/xz v0.5.7 h1:YvTNdFzX6+W5m9msiYg/zpkSURPPtOlzbqYjrFn7Yt4= github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -1783,7 +1678,6 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= -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/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= @@ -1801,10 +1695,8 @@ github.com/wonderflow/keda-api v0.0.0-20201026084048-e7c39fa208e8/go.mod h1:oVev github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -1840,7 +1732,6 @@ go.etcd.io/bbolt v1.3.1-etcd.7/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XK go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20181031231232-83304cfc808c/go.mod h1:weASp41xM3dk0YHg1s/W8ecdGP5G4teSTMBPpYAaUgA= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738 h1:VcrIfasaLFkyjk6KNlXQSzO+B0fZcnECiDrKJsfxka0= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= @@ -1852,19 +1743,15 @@ go.opencensus.io v0.17.0/go.mod h1:mp1VrMQxhlqqDpKvH4UcQUa4YwlzNmymAjPrDdfxNpI= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4-0.20200608061201-1901b56b9515/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1873,9 +1760,7 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/automaxprocs v1.2.0/go.mod h1:YfO3fm683kQpzETxlTGZhGIVmXAhaw3gxeBADbpZtnU= go.uber.org/automaxprocs v1.3.0/go.mod h1:9CWT6lKIep8U41DDaPiH6eFscnTyjfTANNQNx6LrIcA= go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= @@ -1885,9 +1770,7 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.9.2-0.20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= @@ -1928,18 +1811,13 @@ golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200414173820-0848c9571904 h1:bXoxMPcSLOq08zI3/c5dEBT6lE4eh+jOh886GHrn6V8= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200422194213-44a606286825 h1:dSChiwOTvzwbHFTMq2l6uRardHH7/E6SqEkqccinS/o= golang.org/x/crypto v0.0.0-20200422194213-44a606286825/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9 h1:sYNJzB4J8toYPQTM6pAkcmBRgw9SnQKP9oXCHfgy604= golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= @@ -1959,7 +1837,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 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/exp v0.0.0-20200513190911-00229845015e h1:rMqLP+9XLy+LdbCXHjJHAmTfXCr93W7oruWA6Hq1Alc= golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= @@ -1974,7 +1851,6 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= @@ -1985,7 +1861,6 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG 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 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -2023,7 +1898,6 @@ golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -2032,7 +1906,6 @@ golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLL 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 h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= 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= @@ -2042,16 +1915,11 @@ golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/ 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-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= 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 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73 h1:MXfv8rhZWmFeqX3GNZRsd6vOLoaCHjYEX3qkRo3YBUA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0 h1:wBouT66WTYFXdxfVdz9sVWARVd/2vfGcmI45D2gj45M= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11 h1:lwlPPsmjDKK0J6eG6xDWd5XPehI0R024zxjDnw3esPA= @@ -2062,7 +1930,6 @@ golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAG golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= @@ -2073,11 +1940,8 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190412183630-56d357773e84/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 h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2093,18 +1957,14 @@ golang.org/x/text v0.3.1-0.20171227012246-e19ae1496984/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.1-0.20180805044716-cb6730876b98/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/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 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= 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-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2223,18 +2083,14 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc 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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3 h1:DywqrEscRX7O2phNjkT0L6lhHKGBoMLCNX+XcAe7t6s= golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= 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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 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.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= gomodules.xyz/jsonpatch/v2 v2.1.0 h1:Phva6wqu+xR//Njw6iorylFFgn/z547tw5Ne3HZPQ+k= gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= @@ -2278,12 +2134,9 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= @@ -2303,7 +2156,6 @@ google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dT google.golang.org/genproto v0.0.0-20190708153700-3bdd9d9f5532/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= 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-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -2332,7 +2184,6 @@ google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1m google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200528110217-3d3490e7e671/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200603110839-e855014d5736 h1:+IE3xTD+6Eb7QWG5JFp+dQr/XjKpjmrNkh4pdjTdHEs= google.golang.org/genproto v0.0.0-20200603110839-e855014d5736/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -2341,7 +2192,6 @@ google.golang.org/genproto v0.0.0-20200709005830-7a2ca40e9dc3/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200711021454-869866162049/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200726014623-da3ae01ef02d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200731012542-8145dea6a485 h1:wTk5DQB3+1darAz4Ldomo0r5bUOCKX7gilxQ4sb2kno= google.golang.org/genproto v0.0.0-20200731012542-8145dea6a485/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= @@ -2365,17 +2215,13 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= 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.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= 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 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1 h1:SfXqXS5hkufcdZ/mHtYCh53P2b+92WQq/DZcKLgsFRs= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= @@ -2387,7 +2233,6 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi 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 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= @@ -2396,16 +2241,13 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= @@ -2424,13 +2266,10 @@ gopkg.in/ini.v1 v1.46.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.52.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw= gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM= gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= gopkg.in/jcmturner/gokrb5.v7 v7.2.3/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0 h1:QHIUxTX1ISuAv9dD2wJ9HWQVuWDX/Zc0PfeC2tjc4rU= gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= gopkg.in/natefinch/lumberjack.v2 v2.0.0-20150622162204-20b71e5b60d7/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= @@ -2452,20 +2291,16 @@ gopkg.in/yaml.v2 v2.0.0/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 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= 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.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20190709130402-674ba3eaed22/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200603094226-e3079894b1e8 h1:jL/vaozO53FMfZLySWM+4nulF3gQEC6q5jH90LPomDo= gopkg.in/yaml.v3 v3.0.0-20200603094226-e3079894b1e8/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= @@ -2481,9 +2316,7 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.2/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.5 h1:nI5egYTGJakVyOryqLs1cQO5dO0ksin5XXs2pspk75k= honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= @@ -2622,7 +2455,6 @@ k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKf k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-openapi v0.0.0-20200316234421-82d701f24f9d/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= -k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6 h1:Oh3Mzx5pJ+yIumsAD0MOECPVeXsVot0UkiaCGVyfGQY= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29 h1:NeQXVJ2XFSkRoPzRo8AId01ZER+j8oV4SZADT4iBOXQ= k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= @@ -2631,9 +2463,7 @@ k8s.io/kubectl v0.18.0/go.mod h1:LOkWx9Z5DXMEg5KtOjHhRiC1fqJPLyCr3KtQgEolCkU= k8s.io/kubectl v0.18.6 h1:IFPNuLPkZ59vSGQzynXY8XGz9yuOSRpkJupnobdYvO4= k8s.io/kubectl v0.18.6/go.mod h1:3TLzFOrF9h4mlRPAvdNkDbs5NWspN4e0EnPnEB41CGo= k8s.io/kubernetes v1.11.10/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/kubernetes v1.14.7 h1:wJx/r2HuPVaaBeCUk/P47GSK0eyrj3mI/kESRFBp6/A= k8s.io/kubernetes v1.14.7/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/legacy-cloud-providers v0.17.0/go.mod h1:DdzaepJ3RtRy+e5YhNtrCYwlgyK87j/5+Yfp0L9Syp8= k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js= @@ -2655,9 +2485,7 @@ k8s.io/utils v0.0.0-20190907131718-3d4f5b7dea0b/go.mod h1:sZAwmy6armz5eXlNoLmJcl k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200124190032-861946025e34/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89 h1:d4vVOjXm687F1iLSP2q3lyPPuyvTUt3aVoBpi2DqRsU= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200414100711-2df71ebbae66 h1:Ly1Oxdu5p5ZFmiVT71LFgeZETvMfZ1iBIGeOenT2JeM= k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451 h1:v8ud2Up6QK1lNOKFgiIVrZdMg7MpmSnvtrOieolJKoE= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= @@ -2692,11 +2520,9 @@ mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZI mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc= mvdan.cc/xurls/v2 v2.0.0/go.mod h1:2/webFPYOXN9jp/lzuj0zuAVlF+9g4KPFJANH1oJhRU= pack.ag/amqp v0.11.0/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= -pack.ag/amqp v0.11.2 h1:cuNDWLUTbKRtEZwhB0WQBXf9pGbm87pUBXQhvcFxBWg= pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= pgregory.net/rapid v0.3.3/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/letsencrypt v0.0.3 h1:H7xDfhkaFFSYEJlKeq38RwX2jYcnTeHuDQyT+mMNMwM= rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= @@ -2709,9 +2535,7 @@ sigs.k8s.io/controller-runtime v0.3.0/go.mod h1:Cw6PkEg0Sa7dAYovGT4R0tRkGhHXpYij sigs.k8s.io/controller-runtime v0.4.0/go.mod h1:ApC79lpY3PHW9xj/w9pj+lYkLgwAAUZwfXkME1Lajns= sigs.k8s.io/controller-runtime v0.5.0/go.mod h1:REiJzC7Y00U+2YkMbT8wxgrsX5USpXKGhb2sCtAXiT8= sigs.k8s.io/controller-runtime v0.5.4/go.mod h1:JZUwSMVbxDupo0lTJSSFP5pimEyxGynROImSsqIOx1A= -sigs.k8s.io/controller-runtime v0.6.0 h1:Fzna3DY7c4BIP6KwfSlrfnj20DJ+SeMBK8HSFvOk9NM= sigs.k8s.io/controller-runtime v0.6.0/go.mod h1:CpYf5pdNY/B352A1TFLAS2JVSlnGQ5O2cftPHndTroo= -sigs.k8s.io/controller-runtime v0.6.1 h1:LcK2+nk0kmaOnKGN+vBcWHqY5WDJNJNB/c5pW+sU8fc= sigs.k8s.io/controller-runtime v0.6.1/go.mod h1:XRYBPdbf5XJu9kpS84VJiZ7h/u1hF3gEORz0efEja7A= sigs.k8s.io/controller-runtime v0.6.2 h1:jkAnfdTYBpFwlmBn3pS5HFO06SfxvnTZ1p5PeEF/zAA= sigs.k8s.io/controller-runtime v0.6.2/go.mod h1:vhcq/rlnENJ09SIRp3EveTaZ0yqH526hjf9iJdbUJ/E= @@ -2720,7 +2544,6 @@ sigs.k8s.io/controller-tools v0.2.4/go.mod h1:m/ztfQNocGYBgTTCmFdnK94uVvgxeZeE3L sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= sigs.k8s.io/structured-merge-diff v0.0.0-20190302045857-e85c7b244fd2/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= @@ -2728,13 +2551,11 @@ sigs.k8s.io/structured-merge-diff v1.0.1 h1:LOs1LZWMsz1xs77Phr/pkB4LFaavH7IVq/3+ sigs.k8s.io/structured-merge-diff v1.0.1/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.1-0.20200706213357-43c19bbb7fba h1:AAbnc5KQuTWKuh2QSnyghKIOTFzB0Jayv7/OFDn3Cy4= sigs.k8s.io/structured-merge-diff/v3 v3.0.1-0.20200706213357-43c19bbb7fba/go.mod h1:V06abazjHneE37ZdSY/UUwPVgcJMKI/jU5XGUjgIKoc= sigs.k8s.io/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U= sigs.k8s.io/testing_frameworks v0.1.2/go.mod h1:ToQrwSC3s8Xf/lADdZp3Mktcql9CG0UAmdJG9th5i0w= -sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/legacy/charts/vela-core-legacy/crds/core.oam.dev_traitdefinitions.yaml b/legacy/charts/vela-core-legacy/crds/core.oam.dev_traitdefinitions.yaml index 59d919ecd..4709cc751 100644 --- a/legacy/charts/vela-core-legacy/crds/core.oam.dev_traitdefinitions.yaml +++ b/legacy/charts/vela-core-legacy/crds/core.oam.dev_traitdefinitions.yaml @@ -94,6 +94,38 @@ spec: description: WorkloadRefPath indicates where/if a trait accepts a workloadRef object type: string type: object + status: + description: CapabilityStatus is the status of WorkloadDefinition and TraitDefinition + properties: + conditions: + description: Conditions of the resource. + items: + description: A Condition that may apply to a resource. + properties: + lastTransitionTime: + description: LastTransitionTime is the last time this condition transitioned from one status to another. + format: date-time + type: string + message: + description: A Message containing details about this condition's last transition from one status to another, if any. + type: string + reason: + description: A Reason for this condition's last transition from one status to another. + type: string + status: + description: Status of this condition; is it currently True, False, or Unknown? + type: string + type: + description: Type of this condition. At most one of each condition type may apply to a resource at any point in time. + type: string + required: + - lastTransitionTime + - reason + - status + - type + type: object + type: array + type: object type: object version: v1alpha2 versions: diff --git a/legacy/charts/vela-core-legacy/crds/core.oam.dev_workloaddefinitions.yaml b/legacy/charts/vela-core-legacy/crds/core.oam.dev_workloaddefinitions.yaml index 48b5cab90..f59aaf1cc 100644 --- a/legacy/charts/vela-core-legacy/crds/core.oam.dev_workloaddefinitions.yaml +++ b/legacy/charts/vela-core-legacy/crds/core.oam.dev_workloaddefinitions.yaml @@ -104,12 +104,41 @@ spec: description: HealthPolicy defines the health check policy for the abstraction type: string type: object - template: - description: Template defines the abstraction template data of the workload, it will replace the old template in extension field. the data format depends on templateType, by default it's CUE - type: string required: - definitionRef type: object + status: + description: CapabilityStatus is the status of WorkloadDefinition and TraitDefinition + properties: + conditions: + description: Conditions of the resource. + items: + description: A Condition that may apply to a resource. + properties: + lastTransitionTime: + description: LastTransitionTime is the last time this condition transitioned from one status to another. + format: date-time + type: string + message: + description: A Message containing details about this condition's last transition from one status to another, if any. + type: string + reason: + description: A Reason for this condition's last transition from one status to another. + type: string + status: + description: Status of this condition; is it currently True, False, or Unknown? + type: string + type: + description: Type of this condition. At most one of each condition type may apply to a resource at any point in time. + type: string + required: + - lastTransitionTime + - reason + - status + - type + type: object + type: array + type: object type: object version: v1alpha2 versions: diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/application_controller.go b/pkg/controller/core.oam.dev/v1alpha2/application/application_controller.go index f6ec5d34e..0ccbbb62d 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/application_controller.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/application_controller.go @@ -82,7 +82,7 @@ func (r *Reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { // parse template appParser := appfile.NewApplicationParser(r.Client, r.dm) - ctx = oamutil.SetNnamespaceInCtx(ctx, app.Namespace) + ctx = oamutil.SetNamespaceInCtx(ctx, app.Namespace) appfile, err := appParser.GenerateAppFile(ctx, app.Name, app) if err != nil { diff --git a/pkg/controller/core.oam.dev/v1alpha2/applicationconfiguration/applicationconfiguration.go b/pkg/controller/core.oam.dev/v1alpha2/applicationconfiguration/applicationconfiguration.go index e5155ed5f..558ccfcde 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/applicationconfiguration/applicationconfiguration.go +++ b/pkg/controller/core.oam.dev/v1alpha2/applicationconfiguration/applicationconfiguration.go @@ -230,7 +230,7 @@ func (r *OAMApplicationReconciler) Reconcile(req reconcile.Request) (result reco return reconcile.Result{}, errors.Wrap(err, errGetAppConfig) } acPatch := ac.DeepCopy() - ctx = util.SetNnamespaceInCtx(ctx, ac.Namespace) + ctx = util.SetNamespaceInCtx(ctx, ac.Namespace) if ac.ObjectMeta.DeletionTimestamp.IsZero() { if registerFinalizers(ac) { log.Debug("Register new finalizers", "finalizers", ac.ObjectMeta.Finalizers) diff --git a/pkg/controller/core.oam.dev/v1alpha2/applicationdeployment/applicationdeployment_controller.go b/pkg/controller/core.oam.dev/v1alpha2/applicationdeployment/applicationdeployment_controller.go index 4551d0281..01fa6d460 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/applicationdeployment/applicationdeployment_controller.go +++ b/pkg/controller/core.oam.dev/v1alpha2/applicationdeployment/applicationdeployment_controller.go @@ -73,7 +73,7 @@ func (r *Reconciler) Reconcile(req ctrl.Request) (res reconcile.Result, retErr e // TODO: check if the target/source has changed r.handleFinalizer(&appRollout) - ctx = oamutil.SetNnamespaceInCtx(ctx, appRollout.Namespace) + ctx = oamutil.SetNamespaceInCtx(ctx, appRollout.Namespace) // Get the target application var targetApp oamv1alpha2.ApplicationConfiguration diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/scopes/healthscope/healthscope_test.go b/pkg/controller/core.oam.dev/v1alpha2/core/scopes/healthscope/healthscope_test.go index cdcdf042a..c9ab7a954 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/core/scopes/healthscope/healthscope_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/core/scopes/healthscope/healthscope_test.go @@ -428,7 +428,7 @@ func TestCheckDaemonsetHealth(t *testing.T) { } func TestCheckUnknownWorkload(t *testing.T) { - mockError := fmt.Errorf("mock error") + mockError := errors.New("mock error") mockClient := test.NewMockClient() unknownWL := runtimev1alpha1.TypedReference{} tests := []struct { diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/traits/manualscalertrait/manualscalertrait_controller.go b/pkg/controller/core.oam.dev/v1alpha2/core/traits/manualscalertrait/manualscalertrait_controller.go index 893dbc558..a5f5eab42 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/core/traits/manualscalertrait/manualscalertrait_controller.go +++ b/pkg/controller/core.oam.dev/v1alpha2/core/traits/manualscalertrait/manualscalertrait_controller.go @@ -95,7 +95,7 @@ func (r *Reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { return ctrl.Result{}, client.IgnoreNotFound(err) } - ctx = util.SetNnamespaceInCtx(ctx, manualScalar.Namespace) + ctx = util.SetNamespaceInCtx(ctx, manualScalar.Namespace) r.log.Info("Get the manualscalar trait", "ReplicaCount", manualScalar.Spec.ReplicaCount, "Annotations", manualScalar.GetAnnotations()) @@ -120,7 +120,7 @@ func (r *Reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { mLog.Error(err, "Error while fetching the workload child resources", "workload", workload.UnstructuredContent()) r.record.Event(eventObj, event.Warning(util.ErrFetchChildResources, err)) return util.ReconcileWaitResult, util.PatchCondition(ctx, r, &manualScalar, - cpv1alpha1.ReconcileError(fmt.Errorf(util.ErrFetchChildResources))) + cpv1alpha1.ReconcileError(errors.New(util.ErrFetchChildResources))) } // include the workload itself if there is no child resources if len(resources) == 0 { @@ -195,7 +195,7 @@ func (r *Reconciler) scaleResources(ctx context.Context, mLog logr.Logger, if !found { mLog.Info("Cannot locate any resource", "total resources", len(resources)) return util.ReconcileWaitResult, - util.PatchCondition(ctx, r, &manualScalar, cpv1alpha1.ReconcileError(fmt.Errorf(errScaleResource))) + util.PatchCondition(ctx, r, &manualScalar, cpv1alpha1.ReconcileError(errors.New(errScaleResource))) } return ctrl.Result{}, nil } diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_controller.go b/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_controller.go new file mode 100644 index 000000000..1d48a1bb1 --- /dev/null +++ b/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_controller.go @@ -0,0 +1,87 @@ +/* + + +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 traitdefinition + +import ( + "context" + "fmt" + + cpv1alpha1 "github.com/crossplane/crossplane-runtime/apis/core/v1alpha1" + "github.com/crossplane/crossplane-runtime/pkg/event" + "github.com/crossplane/crossplane-runtime/pkg/logging" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/klog/v2" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" + controller "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev" + "github.com/oam-dev/kubevela/pkg/controller/utils" + "github.com/oam-dev/kubevela/pkg/oam/discoverymapper" + "github.com/oam-dev/kubevela/pkg/oam/util" +) + +// Reconciler reconciles a TraitDefinition object +type Reconciler struct { + client.Client + dm discoverymapper.DiscoveryMapper + Scheme *runtime.Scheme + record event.Recorder +} + +// Reconcile is the main logic for TraitDefinition controller +func (r *Reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { + definitionName := req.NamespacedName.Name + klog.InfoS("Reconciling TraitDefinition...", "Name", definitionName, "Namespace", req.Namespace) + ctx := context.Background() + var def utils.CapabilityTraitDefinition + def.Name = req.NamespacedName.Name + + err := def.StoreOpenAPISchema(ctx, r, req.Namespace, req.Name) + if err != nil { + klog.ErrorS(err, "cannot store capability in ConfigMap") + r.record.Event(&(def.TraitDefinition), event.Warning("cannot store capability in ConfigMap", err)) + // TODO(zzxwill) The error message should also be patched into Status + return ctrl.Result{}, util.PatchCondition(ctx, r, &def.TraitDefinition, + cpv1alpha1.ReconcileError(fmt.Errorf(util.ErrStoreCapabilityInConfigMap, def.Name, err))) + } + klog.Info("Successfully stored Capability Schema in ConfigMap") + return ctrl.Result{}, nil +} + +// SetupWithManager will setup with event recorder +func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error { + r.record = event.NewAPIRecorder(mgr.GetEventRecorderFor("TraitDefinition")). + WithAnnotations("controller", "TraitDefinition") + return ctrl.NewControllerManagedBy(mgr). + For(&v1alpha2.TraitDefinition{}). + Complete(r) +} + +// Setup adds a controller that reconciles TraitDefinition. +func Setup(mgr ctrl.Manager, _ controller.Args, _ logging.Logger) error { + dm, err := discoverymapper.New(mgr.GetConfig()) + if err != nil { + return err + } + r := Reconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + dm: dm, + } + return r.SetupWithManager(mgr) +} diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_controller_test.go b/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_controller_test.go new file mode 100644 index 000000000..069911f65 --- /dev/null +++ b/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_controller_test.go @@ -0,0 +1,254 @@ +/* +Copyright 2020 The KubeVela Authors. + +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 traitdefinition + +import ( + "context" + "fmt" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + "sigs.k8s.io/yaml" + + "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" + "github.com/oam-dev/kubevela/apis/types" + "github.com/oam-dev/kubevela/pkg/oam/util" +) + +var _ = Describe("Apply TraitDefinition to store its schema to ConfigMap Test", func() { + ctx := context.Background() + var ns corev1.Namespace + + Context("When the TraitDefinition is valid, but the namespace doesn't exist, should occur errors", func() { + It("Apply TraitDefinition", func() { + By("Apply TraitDefinition") + var validTraitDefinition = ` +apiVersion: core.oam.dev/v1alpha2 +kind: TraitDefinition +metadata: + namespace: ns-tr-def + annotations: + definition.oam.dev/description: "Configures replicas for your service." + name: scaler1 +spec: + appliesToWorkloads: + - webservice + - worker + definitionRef: + name: manualscalertraits.core.oam.dev + workloadRefPath: spec.workloadRef + schematic: + cue: + template: | + outputs: scaler: { + apiVersion: "core.oam.dev/v1alpha2" + kind: "ManualScalerTrait" + spec: { + replicaCount: parameter.replicas + } + } + parameter: { + //+short=r + //+usage=Replicas of the workload + replicas: *1 | int + } +` + + var def v1alpha2.TraitDefinition + Expect(yaml.Unmarshal([]byte(validTraitDefinition), &def)).Should(BeNil()) + Expect(k8sClient.Create(ctx, &def)).Should(Not(Succeed())) + }) + }) + + Context("When the TraitDefinition is valid, but the namespace is blank, should create a ConfigMap", func() { + var traitDefinitionName = "scaler-no-ns" + var namespace = "default" + req := reconcile.Request{NamespacedName: client.ObjectKey{Name: traitDefinitionName, Namespace: namespace}} + + BeforeEach(func() { + ns = corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: namespace, + }, + } + By("Create a namespace") + Expect(k8sClient.Create(ctx, &ns)).Should(SatisfyAny(Succeed(), &util.AlreadyExistMatcher{})) + }) + + It("Apply TraitDefinition", func() { + By("Apply TraitDefinition") + var validTraitDefinition = ` +apiVersion: core.oam.dev/v1alpha2 +kind: TraitDefinition +metadata: + annotations: + definition.oam.dev/description: "Configures replicas for your service." + name: scaler-no-ns +spec: + appliesToWorkloads: + - webservice + - worker + definitionRef: + name: manualscalertraits.core.oam.dev + workloadRefPath: spec.workloadRef + schematic: + cue: + template: | + outputs: scaler: { + apiVersion: "core.oam.dev/v1alpha2" + kind: "ManualScalerTrait" + spec: { + replicaCount: parameter.replicas + } + } + parameter: { + //+short=r + //+usage=Replicas of the workload + replicas: *1 | int + } +` + + var def v1alpha2.TraitDefinition + Expect(yaml.Unmarshal([]byte(validTraitDefinition), &def)).Should(BeNil()) + def.Namespace = namespace + Expect(k8sClient.Create(ctx, &def)).Should(Succeed()) + + By("Check whether ConfigMap is created") + reconcileRetry(&r, req) + var cm corev1.ConfigMap + name := fmt.Sprintf("%s%s", types.CapabilityConfigMapNamePrefix, traitDefinitionName) + Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: namespace, Name: name}, &cm)).Should(Succeed()) + Expect(cm.Data[types.OpenapiV3JSONSchema]).Should(Not(Equal(""))) + }) + }) + + Context("When the TraitDefinition is valid, should create a ConfigMap", func() { + var traitDefinitionName = "scaler1" + var namespace = "ns-tr-def" + req := reconcile.Request{NamespacedName: client.ObjectKey{Name: traitDefinitionName, Namespace: namespace}} + + BeforeEach(func() { + ns = corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: namespace, + }, + } + By("Create a namespace") + Expect(k8sClient.Create(ctx, &ns)).Should(SatisfyAny(Succeed(), &util.AlreadyExistMatcher{})) + }) + + It("Apply TraitDefinition", func() { + By("Apply TraitDefinition") + var validTraitDefinition = ` +apiVersion: core.oam.dev/v1alpha2 +kind: TraitDefinition +metadata: + namespace: ns-tr-def + annotations: + definition.oam.dev/description: "Configures replicas for your service." + name: scaler1 +spec: + appliesToWorkloads: + - webservice + - worker + definitionRef: + name: manualscalertraits.core.oam.dev + workloadRefPath: spec.workloadRef + schematic: + cue: + template: | + outputs: scaler: { + apiVersion: "core.oam.dev/v1alpha2" + kind: "ManualScalerTrait" + spec: { + replicaCount: parameter.replicas + } + } + parameter: { + //+short=r + //+usage=Replicas of the workload + replicas: *1 | int + } +` + + var def v1alpha2.TraitDefinition + Expect(yaml.Unmarshal([]byte(validTraitDefinition), &def)).Should(BeNil()) + Expect(k8sClient.Create(ctx, &def)).Should(Succeed()) + + By("Check whether ConfigMap is created") + reconcileRetry(&r, req) + var cm corev1.ConfigMap + name := fmt.Sprintf("%s%s", types.CapabilityConfigMapNamePrefix, traitDefinitionName) + Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: namespace, Name: name}, &cm)).Should(Succeed()) + Expect(cm.Data[types.OpenapiV3JSONSchema]).Should(Not(Equal(""))) + }) + }) + + Context("When the TraitDefinition is invalid, should report issues", func() { + var invalidTraitDefinitionName = "invalid-tr1" + var namespace = "ns-tr-def" + BeforeEach(func() { + ns = corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: namespace, + }, + } + By("Create a namespace") + Expect(k8sClient.Create(ctx, &ns)).Should(SatisfyAny(Succeed(), &util.AlreadyExistMatcher{})) + }) + + It("Applying invalid TraitDefinition", func() { + By("Apply the TraitDefinition") + var invalidTraitDefinition = ` +apiVersion: core.oam.dev/v1alpha2 +kind: TraitDefinition +metadata: + namespace: ns-tr-def + annotations: + definition.oam.dev/description: "Configures replicas for your service." + name: invalid-tr1 +spec: + appliesToWorkloads: + - webservice + - worker + definitionRef: + name: manualscalertraits.core.oam.dev + workloadRefPath: spec.workloadRef + schematic: + cue: + template: | + outputs: scaler: { + apiVersion: "core.oam.dev/v1alpha2" + kind: "ManualScalerTrait" + spec: { + replicaCount: 2 + } + } +` + + var invalidDef v1alpha2.TraitDefinition + Expect(yaml.Unmarshal([]byte(invalidTraitDefinition), &invalidDef)).Should(BeNil()) + Expect(k8sClient.Create(ctx, &invalidDef)).Should(Succeed()) + gotTraitDefinition := &v1alpha2.TraitDefinition{} + Expect(k8sClient.Get(ctx, client.ObjectKey{Name: invalidTraitDefinitionName, Namespace: namespace}, gotTraitDefinition)).Should(BeNil()) + }) + }) +}) diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_suite_test.go b/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_suite_test.go new file mode 100644 index 000000000..f6ba9c671 --- /dev/null +++ b/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_suite_test.go @@ -0,0 +1,107 @@ +/* +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 traitdefinition + +import ( + "path/filepath" + "testing" + "time" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/envtest" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + oamCore "github.com/oam-dev/kubevela/apis/core.oam.dev" + "github.com/oam-dev/kubevela/pkg/oam/discoverymapper" +) + +var cfg *rest.Config +var k8sClient client.Client +var testEnv *envtest.Environment +var controllerDone chan struct{} +var r Reconciler + +func TestTraitdefinition(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "TraitDefinition Suite") +} + +var _ = BeforeSuite(func(done Done) { + By("Bootstrapping test environment") + useExistCluster := false + testEnv = &envtest.Environment{ + CRDDirectoryPaths: []string{ + filepath.Join("../../../../../../..", "charts/vela-core/crds"), // this has all the required CRDs, + }, + UseExistingCluster: &useExistCluster, + } + var err error + cfg, err = testEnv.Start() + Expect(err).ToNot(HaveOccurred()) + Expect(cfg).ToNot(BeNil()) + + err = oamCore.AddToScheme(scheme.Scheme) + Expect(err).NotTo(HaveOccurred()) + + By("Create the k8s client") + k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) + Expect(err).ToNot(HaveOccurred()) + Expect(k8sClient).ToNot(BeNil()) + + By("Starting the controller in the background") + mgr, err := ctrl.NewManager(cfg, ctrl.Options{ + Scheme: scheme.Scheme, + MetricsBindAddress: "0", + Port: 48081, + }) + Expect(err).ToNot(HaveOccurred()) + dm, err := discoverymapper.New(mgr.GetConfig()) + Expect(err).ToNot(HaveOccurred()) + + r = Reconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + dm: dm, + } + Expect(r.SetupWithManager(mgr)).ToNot(HaveOccurred()) + controllerDone = make(chan struct{}, 1) + go func() { + defer GinkgoRecover() + Expect(mgr.Start(controllerDone)).ToNot(HaveOccurred()) + }() + + close(done) +}, 60) + +var _ = AfterSuite(func() { + By("Stop the controller") + close(controllerDone) + + By("Tearing down the test environment") + err := testEnv.Stop() + Expect(err).ToNot(HaveOccurred()) +}) + +func reconcileRetry(r reconcile.Reconciler, req reconcile.Request) { + Eventually(func() error { + _, err := r.Reconcile(req) + return err + }, 3*time.Second, time.Second).Should(BeNil()) +} diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/workloads/containerizedworkload/containerizedworkload_controller_helper.go b/pkg/controller/core.oam.dev/v1alpha2/core/workloads/containerizedworkload/containerizedworkload_controller_helper.go index 614f29629..b0db9b832 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/core/workloads/containerizedworkload/containerizedworkload_controller_helper.go +++ b/pkg/controller/core.oam.dev/v1alpha2/core/workloads/containerizedworkload/containerizedworkload_controller_helper.go @@ -2,7 +2,7 @@ package containerizedworkload import ( "context" - "fmt" + "errors" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -28,7 +28,7 @@ func (r *Reconciler) renderDeployment(ctx context.Context, deploy, ok := resources[0].(*appsv1.Deployment) if !ok { - return nil, fmt.Errorf("internal error, deployment is not rendered correctly") + return nil, errors.New("internal error, deployment is not rendered correctly") } // make sure we don't have opinion on the replica count deploy.Spec.Replicas = nil @@ -60,7 +60,7 @@ func (r *Reconciler) renderService(ctx context.Context, } service, ok := resources[1].(*corev1.Service) if !ok { - return nil, fmt.Errorf("internal error, service is not rendered correctly") + return nil, errors.New("internal error, service is not rendered correctly") } // the service injector lib doesn't set the namespace and serviceType service.Namespace = workload.Namespace diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/workloads/workloaddefinition/workloaddefinition_controller.go b/pkg/controller/core.oam.dev/v1alpha2/core/workloads/workloaddefinition/workloaddefinition_controller.go new file mode 100644 index 000000000..4cc39b611 --- /dev/null +++ b/pkg/controller/core.oam.dev/v1alpha2/core/workloads/workloaddefinition/workloaddefinition_controller.go @@ -0,0 +1,91 @@ +/* + + +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 workloaddefinition + +import ( + "context" + "fmt" + + cpv1alpha1 "github.com/crossplane/crossplane-runtime/apis/core/v1alpha1" + "github.com/crossplane/crossplane-runtime/pkg/event" + "github.com/crossplane/crossplane-runtime/pkg/logging" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/klog/v2" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" + controller "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev" + "github.com/oam-dev/kubevela/pkg/controller/utils" + "github.com/oam-dev/kubevela/pkg/oam/discoverymapper" + "github.com/oam-dev/kubevela/pkg/oam/util" +) + +// Reconciler reconciles a WorkloadDefinition object +type Reconciler struct { + client.Client + dm discoverymapper.DiscoveryMapper + Scheme *runtime.Scheme + record event.Recorder +} + +// Reconcile is the main logic for WorkloadDefinition controller +func (r *Reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { + definitionName := req.NamespacedName.Name + if definitionName == "containerizedworkloads.core.oam.dev" { + return ctrl.Result{}, nil + } + + klog.InfoS("Reconciling WorkloadDefinition", "Name", definitionName, "Namespace", req.Namespace) + ctx := context.Background() + var def utils.CapabilityWorkloadDefinition + def.Name = req.NamespacedName.Name + + err := def.StoreOpenAPISchema(ctx, r, req.Namespace, req.Name) + if err != nil { + klog.ErrorS(err, "cannot store capability in ConfigMap") + r.record.Event(&(def.WorkloadDefinition), event.Warning("cannot store capability in ConfigMap", err)) + // TODO(zzxwill) The error message should also be patched into Status + return ctrl.Result{}, util.PatchCondition(ctx, r, &(def.WorkloadDefinition), + cpv1alpha1.ReconcileError(fmt.Errorf(util.ErrStoreCapabilityInConfigMap, def.Name, err))) + } + klog.Info("Successfully stored Capability Schema in ConfigMap") + return ctrl.Result{}, nil +} + +// SetupWithManager will setup with event recorder +func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error { + r.record = event.NewAPIRecorder(mgr.GetEventRecorderFor("WorkloadDefinition")). + WithAnnotations("controller", "WorkloadDefinition") + return ctrl.NewControllerManagedBy(mgr). + For(&v1alpha2.WorkloadDefinition{}). + Complete(r) +} + +// Setup adds a controller that reconciles WorkloadDefinition. +func Setup(mgr ctrl.Manager, _ controller.Args, _ logging.Logger) error { + dm, err := discoverymapper.New(mgr.GetConfig()) + if err != nil { + return err + } + r := Reconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + dm: dm, + } + return r.SetupWithManager(mgr) +} diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/workloads/workloaddefinition/workloaddefinition_controller_test.go b/pkg/controller/core.oam.dev/v1alpha2/core/workloads/workloaddefinition/workloaddefinition_controller_test.go new file mode 100644 index 000000000..6424e80cc --- /dev/null +++ b/pkg/controller/core.oam.dev/v1alpha2/core/workloads/workloaddefinition/workloaddefinition_controller_test.go @@ -0,0 +1,310 @@ +/* +Copyright 2020 The KubeVela Authors. + +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 workloaddefinition + +import ( + "context" + "fmt" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + "sigs.k8s.io/yaml" + + "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" + "github.com/oam-dev/kubevela/apis/types" + "github.com/oam-dev/kubevela/pkg/oam/util" +) + +var _ = Describe("Apply WorkloadDefinition to store its schema to ConfigMap Test", func() { + ctx := context.Background() + var ns corev1.Namespace + + Context("When the WorkloadDefinition's namespace doesn't exist, should occur error", func() { + It("Applying WorkloadDefinition", func() { + By("Apply WorkloadDefinition") + var validWorkloadDefinition = ` +apiVersion: core.oam.dev/v1alpha2 +kind: WorkloadDefinition +metadata: + name: wd-without-ready-ns + namespace: ns-def + annotations: + definition.oam.dev/description: "test" +spec: + definitionRef: + name: deployments.apps + schematic: + cue: + template: | + output: { + apiVersion: "apps/v1" + kind: "Deployment" + spec: { + selector: matchLabels: { + "app.oam.dev/component": context.name + } + + template: { + metadata: labels: { + "app.oam.dev/component": context.name + } + + spec: { + containers: [{ + name: context.name + image: parameter.image + + if parameter["cmd"] != _|_ { + command: parameter.cmd + } + }] + } + } + } + } + parameter: { + // +usage=Which image would you like to use for your service + // +short=i + image: string + + // +usage=Commands to run in the container + cmd?: [...string] + } +` + + var def v1alpha2.WorkloadDefinition + Expect(yaml.Unmarshal([]byte(validWorkloadDefinition), &def)).Should(BeNil()) + Expect(k8sClient.Create(ctx, &def)).Should(Not(Succeed())) + }) + }) + + Context("When the WorkloadDefinition without namespace is valid, should create a ConfigMap", func() { + var workloadDefinitionName = "web-no-ns" + var namespace = "default" + req := reconcile.Request{NamespacedName: client.ObjectKey{Name: workloadDefinitionName, Namespace: namespace}} + + It("Applying valid WorkloadDefinition", func() { + By("Apply WorkloadDefinition") + var validWorkloadDefinition = ` +apiVersion: core.oam.dev/v1alpha2 +kind: WorkloadDefinition +metadata: + name: web-no-ns + annotations: + definition.oam.dev/description: "test" +spec: + definitionRef: + name: deployments.apps + schematic: + cue: + template: | + output: { + apiVersion: "apps/v1" + kind: "Deployment" + spec: { + selector: matchLabels: { + "app.oam.dev/component": context.name + } + + template: { + metadata: labels: { + "app.oam.dev/component": context.name + } + + spec: { + containers: [{ + name: context.name + image: parameter.image + + if parameter["cmd"] != _|_ { + command: parameter.cmd + } + }] + } + } + } + } + parameter: { + // +usage=Which image would you like to use for your service + // +short=i + image: string + + // +usage=Commands to run in the container + cmd?: [...string] + } +` + + var def v1alpha2.WorkloadDefinition + Expect(yaml.Unmarshal([]byte(validWorkloadDefinition), &def)).Should(BeNil()) + // API server will convert blank namespace to `default` + def.Namespace = namespace + Expect(k8sClient.Create(ctx, &def)).Should(Succeed()) + + By("Check whether ConfigMap is created") + reconcileRetry(&r, req) + var cm corev1.ConfigMap + name := fmt.Sprintf("%s%s", types.CapabilityConfigMapNamePrefix, workloadDefinitionName) + Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: namespace, Name: name}, &cm)).Should(Succeed()) + Expect(cm.Data[types.OpenapiV3JSONSchema]).Should(Not(Equal(""))) + }) + }) + + Context("When the WorkloadDefinition with namespace is valid, should create a ConfigMap", func() { + var workloadDefinitionName = "web" + var namespace = "ns-def" + req := reconcile.Request{NamespacedName: client.ObjectKey{Name: workloadDefinitionName, Namespace: namespace}} + + BeforeEach(func() { + ns = corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: namespace, + }, + } + By("Create a namespace") + Expect(k8sClient.Create(ctx, &ns)).Should(SatisfyAny(Succeed(), &util.AlreadyExistMatcher{})) + }) + + It("Applying valid WorkloadDefinition", func() { + By("Apply WorkloadDefinition") + var validWorkloadDefinition = ` +apiVersion: core.oam.dev/v1alpha2 +kind: WorkloadDefinition +metadata: + name: web + namespace: ns-def + annotations: + definition.oam.dev/description: "test" +spec: + definitionRef: + name: deployments.apps + schematic: + cue: + template: | + output: { + apiVersion: "apps/v1" + kind: "Deployment" + spec: { + selector: matchLabels: { + "app.oam.dev/component": context.name + } + + template: { + metadata: labels: { + "app.oam.dev/component": context.name + } + + spec: { + containers: [{ + name: context.name + image: parameter.image + + if parameter["cmd"] != _|_ { + command: parameter.cmd + } + }] + } + } + } + } + parameter: { + // +usage=Which image would you like to use for your service + // +short=i + image: string + + // +usage=Commands to run in the container + cmd?: [...string] + } +` + + var def v1alpha2.WorkloadDefinition + Expect(yaml.Unmarshal([]byte(validWorkloadDefinition), &def)).Should(BeNil()) + Expect(k8sClient.Create(ctx, &def)).Should(Succeed()) + + By("Check whether ConfigMap is created") + reconcileRetry(&r, req) + var cm corev1.ConfigMap + name := fmt.Sprintf("%s%s", types.CapabilityConfigMapNamePrefix, workloadDefinitionName) + Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: namespace, Name: name}, &cm)).Should(Succeed()) + Expect(cm.Data[types.OpenapiV3JSONSchema]).Should(Not(Equal(""))) + }) + }) + + Context("When the WorkloadDefinition is invalid, should hit issues", func() { + var invalidWorkloadDefinitionName = "invalid-wd1" + var namespace = "ns-def" + BeforeEach(func() { + ns = corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: namespace, + }, + } + By("Create a namespace") + Expect(k8sClient.Create(ctx, &ns)).Should(SatisfyAny(Succeed(), &util.AlreadyExistMatcher{})) + }) + + It("Applying invalid WorkloadDefinition", func() { + By("Apply the WorkloadDefinition") + var invalidWorkloadDefinition = ` +apiVersion: core.oam.dev/v1alpha2 +kind: WorkloadDefinition +metadata: + name: invalid-wd1 + namespace: ns-def + annotations: + definition.oam.dev/description: "test" +spec: + definitionRef: + name: deployments.apps + schematic: + cue: + template: | + output: { + apiVersion: "apps/v1" + kind: "Deployment" + spec: { + selector: matchLabels: { + "app.oam.dev/component": context.name + } + + template: { + metadata: labels: { + "app.oam.dev/component": context.name + } + + spec: { + containers: [{ + name: context.name + image: "nginx:1.9.2" + }] + } + } + } + } +` + + var invalidDef v1alpha2.WorkloadDefinition + Expect(yaml.Unmarshal([]byte(invalidWorkloadDefinition), &invalidDef)).Should(BeNil()) + Expect(k8sClient.Create(ctx, &invalidDef)).Should(Succeed()) + gotWorkloadDefinition := &v1alpha2.WorkloadDefinition{} + Expect(k8sClient.Get(ctx, client.ObjectKey{Name: invalidWorkloadDefinitionName, Namespace: namespace}, gotWorkloadDefinition)).Should(BeNil()) + }) + }) +}) diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/workloads/workloaddefinition/workloaddefinition_suite_test.go b/pkg/controller/core.oam.dev/v1alpha2/core/workloads/workloaddefinition/workloaddefinition_suite_test.go new file mode 100644 index 000000000..2a199a51c --- /dev/null +++ b/pkg/controller/core.oam.dev/v1alpha2/core/workloads/workloaddefinition/workloaddefinition_suite_test.go @@ -0,0 +1,107 @@ +/* +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 workloaddefinition + +import ( + "path/filepath" + "testing" + "time" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/envtest" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + oamCore "github.com/oam-dev/kubevela/apis/core.oam.dev" + "github.com/oam-dev/kubevela/pkg/oam/discoverymapper" +) + +var cfg *rest.Config +var k8sClient client.Client +var testEnv *envtest.Environment +var controllerDone chan struct{} +var r Reconciler + +func TestWorkloadDefinition(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "WorkloadDefinition Suite") +} + +var _ = BeforeSuite(func(done Done) { + By("Bootstrapping test environment") + useExistCluster := false + testEnv = &envtest.Environment{ + CRDDirectoryPaths: []string{ + filepath.Join("../../../../../../..", "charts/vela-core/crds"), // this has all the required CRDs, + }, + UseExistingCluster: &useExistCluster, + } + var err error + cfg, err = testEnv.Start() + Expect(err).ToNot(HaveOccurred()) + Expect(cfg).ToNot(BeNil()) + + err = oamCore.AddToScheme(scheme.Scheme) + Expect(err).NotTo(HaveOccurred()) + + By("Create the k8s client") + k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) + Expect(err).ToNot(HaveOccurred()) + Expect(k8sClient).ToNot(BeNil()) + + By("Starting the controller in the background") + mgr, err := ctrl.NewManager(cfg, ctrl.Options{ + Scheme: scheme.Scheme, + MetricsBindAddress: "0", + Port: 48081, + }) + Expect(err).ToNot(HaveOccurred()) + dm, err := discoverymapper.New(mgr.GetConfig()) + Expect(err).ToNot(HaveOccurred()) + + r = Reconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + dm: dm, + } + Expect(r.SetupWithManager(mgr)).ToNot(HaveOccurred()) + controllerDone = make(chan struct{}, 1) + go func() { + defer GinkgoRecover() + Expect(mgr.Start(controllerDone)).ToNot(HaveOccurred()) + }() + + close(done) +}, 60) + +var _ = AfterSuite(func() { + By("Stop the controller") + close(controllerDone) + + By("Tearing down the test environment") + err := testEnv.Stop() + Expect(err).ToNot(HaveOccurred()) +}) + +func reconcileRetry(r reconcile.Reconciler, req reconcile.Request) { + Eventually(func() error { + _, err := r.Reconcile(req) + return err + }, 3*time.Second, time.Second).Should(BeNil()) +} diff --git a/pkg/controller/core.oam.dev/v1alpha2/setup.go b/pkg/controller/core.oam.dev/v1alpha2/setup.go index 686830aca..bf2477613 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/setup.go +++ b/pkg/controller/core.oam.dev/v1alpha2/setup.go @@ -17,18 +17,18 @@ limitations under the License. package v1alpha2 import ( + "github.com/crossplane/crossplane-runtime/pkg/logging" ctrl "sigs.k8s.io/controller-runtime" - "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/application" - - "github.com/crossplane/crossplane-runtime/pkg/logging" - controller "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev" + "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/application" "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/applicationconfiguration" "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/applicationdeployment" "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/core/scopes/healthscope" "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/core/traits/manualscalertrait" + "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition" "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/core/workloads/containerizedworkload" + "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/core/workloads/workloaddefinition" ) // Setup workload controllers. @@ -36,7 +36,7 @@ func Setup(mgr ctrl.Manager, args controller.Args, l logging.Logger) error { for _, setup := range []func(ctrl.Manager, controller.Args, logging.Logger) error{ applicationconfiguration.Setup, containerizedworkload.Setup, manualscalertrait.Setup, healthscope.Setup, - application.Setup, applicationdeployment.Setup, + application.Setup, applicationdeployment.Setup, traitdefinition.Setup, workloaddefinition.Setup, } { if err := setup(mgr, args, l); err != nil { return err diff --git a/pkg/controller/standard.oam.dev/v1alpha1/autoscaler/autoscaler_controller.go b/pkg/controller/standard.oam.dev/v1alpha1/autoscaler/autoscaler_controller.go index 82e9feb56..26a389ca2 100644 --- a/pkg/controller/standard.oam.dev/v1alpha1/autoscaler/autoscaler_controller.go +++ b/pkg/controller/standard.oam.dev/v1alpha1/autoscaler/autoscaler_controller.go @@ -73,7 +73,7 @@ func (r *Reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { } log.Info("Retrieved trait Autoscaler", "APIVersion", scaler.APIVersion, "Kind", scaler.Kind) - ctx = util.SetNnamespaceInCtx(ctx, scaler.Namespace) + ctx = util.SetNamespaceInCtx(ctx, scaler.Namespace) // find the resource object to record the event to, default is the parent appConfig. eventObj, err := util.LocateParentAppConfig(ctx, r.Client, &scaler) @@ -149,7 +149,7 @@ func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error { Complete(r) } -// Setup adds a controller that reconciles MetricsTrait. +// Setup adds a controller that reconciles Auto-Scale Trait. func Setup(mgr ctrl.Manager) error { dm, err := discoverymapper.New(mgr.GetConfig()) if err != nil { diff --git a/pkg/controller/standard.oam.dev/v1alpha1/metrics/metricstrait_controller.go b/pkg/controller/standard.oam.dev/v1alpha1/metrics/metricstrait_controller.go index c68dd7d17..9141d15c7 100644 --- a/pkg/controller/standard.oam.dev/v1alpha1/metrics/metricstrait_controller.go +++ b/pkg/controller/standard.oam.dev/v1alpha1/metrics/metricstrait_controller.go @@ -103,7 +103,7 @@ func (r *Reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { "workload reference", metricsTrait.Spec.WorkloadReference, "labels", metricsTrait.GetLabels()) - ctx = oamutil.SetNnamespaceInCtx(ctx, metricsTrait.Namespace) + ctx = oamutil.SetNamespaceInCtx(ctx, metricsTrait.Namespace) // find the resource object to record the event to, default is the parent appConfig. eventObj, err := oamutil.LocateParentAppConfig(ctx, r.Client, &metricsTrait) diff --git a/pkg/controller/standard.oam.dev/v1alpha1/routes/route_controller.go b/pkg/controller/standard.oam.dev/v1alpha1/routes/route_controller.go index 95c2d9fcf..4abe3c996 100644 --- a/pkg/controller/standard.oam.dev/v1alpha1/routes/route_controller.go +++ b/pkg/controller/standard.oam.dev/v1alpha1/routes/route_controller.go @@ -82,7 +82,7 @@ func (r *Reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { "workload reference", routeTrait.Spec.WorkloadReference, "labels", routeTrait.GetLabels()) - ctx = oamutil.SetNnamespaceInCtx(ctx, routeTrait.Namespace) + ctx = oamutil.SetNamespaceInCtx(ctx, routeTrait.Namespace) // find the resource object to record the event to, default is the parent appConfig. eventObj, err := oamutil.LocateParentAppConfig(ctx, r.Client, &routeTrait) diff --git a/pkg/controller/utils/capability.go b/pkg/controller/utils/capability.go new file mode 100644 index 000000000..a5bd8c5d2 --- /dev/null +++ b/pkg/controller/utils/capability.go @@ -0,0 +1,281 @@ +package utils + +import ( + "context" + "fmt" + "regexp" + "strings" + + "cuelang.org/go/cue" + "github.com/getkin/kin-openapi/openapi3" + v1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/pointer" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" + "github.com/oam-dev/kubevela/apis/types" + mycue "github.com/oam-dev/kubevela/pkg/cue" + "github.com/oam-dev/kubevela/pkg/oam/util" + "github.com/oam-dev/kubevela/pkg/utils/common" +) + +const ( + // UsageTag is usage comment annotation + UsageTag = "+usage=" + // ShortTag is the short alias annotation + ShortTag = "+short" +) + +// CapabilityDefinitionInterface is the interface for Capability (WorkloadDefinition and TraitDefinition) +type CapabilityDefinitionInterface interface { + GetCapabilityObject(ctx context.Context, k8sClient client.Client, namespace, name string) (types.Capability, error) + GetOpenAPISchema(ctx context.Context, k8sClient client.Client, objectKey client.ObjectKey) ([]byte, error) +} + +// CapabilityWorkloadDefinition is the struct for WorkloadDefinition +type CapabilityWorkloadDefinition struct { + Name string `json:"name"` + WorkloadDefinition v1alpha2.WorkloadDefinition `json:"workloadDefinition"` + CapabilityBaseDefinition +} + +// GetCapabilityObject gets types.Capability object by WorkloadDefinition name +func (def *CapabilityWorkloadDefinition) GetCapabilityObject(ctx context.Context, k8sClient client.Client, namespace, name string) (*types.Capability, error) { + var workloadDefinition v1alpha2.WorkloadDefinition + var capability types.Capability + capability.Name = def.Name + objectKey := client.ObjectKey{ + Namespace: namespace, + Name: name, + } + err := k8sClient.Get(ctx, objectKey, &workloadDefinition) + if err != nil { + return nil, fmt.Errorf("failed to get WorkloadDefinition %s: %v", def.Name, err) + } + def.WorkloadDefinition = workloadDefinition + capability, err = util.ConvertTemplateJSON2Object(name, workloadDefinition.Spec.Extension, workloadDefinition.Spec.Schematic) + if err != nil { + return nil, fmt.Errorf("failed to convert WorkloadDefinition to Capability Object") + } + return &capability, err +} + +// GetOpenAPISchema gets OpenAPI v3 schema by WorkloadDefinition name +func (def *CapabilityWorkloadDefinition) GetOpenAPISchema(ctx context.Context, k8sClient client.Client, namespace, name string) ([]byte, error) { + capability, err := def.GetCapabilityObject(ctx, k8sClient, namespace, name) + if err != nil { + return nil, err + } + return getOpenAPISchema(*capability) +} + +// StoreOpenAPISchema stores OpenAPI v3 schema in ConfigMap from WorkloadDefinition +func (def *CapabilityWorkloadDefinition) StoreOpenAPISchema(ctx context.Context, k8sClient client.Client, namespace, name string) error { + jsonSchema, err := def.GetOpenAPISchema(ctx, k8sClient, namespace, name) + if err != nil { + return fmt.Errorf("failed to generate OpenAPI v3 JSON schema for capability %s: %v", def.Name, err) + } + workloadDefinition := def.WorkloadDefinition + ownerReference := []metav1.OwnerReference{{ + APIVersion: workloadDefinition.APIVersion, + Kind: workloadDefinition.Kind, + Name: workloadDefinition.Name, + UID: workloadDefinition.GetUID(), + Controller: pointer.BoolPtr(true), + BlockOwnerDeletion: pointer.BoolPtr(true), + }} + return def.CreateOrUpdateConfigMap(ctx, k8sClient, namespace, workloadDefinition.Name, jsonSchema, ownerReference) +} + +// CapabilityTraitDefinition is the Capability struct for TraitDefinition +type CapabilityTraitDefinition struct { + Name string `json:"name"` + TraitDefinition v1alpha2.TraitDefinition `json:"traitDefinition"` + CapabilityBaseDefinition +} + +// GetCapabilityObject gets types.Capability object by TraitDefinition name +func (def *CapabilityTraitDefinition) GetCapabilityObject(ctx context.Context, k8sClient client.Client, namespace, name string) (*types.Capability, error) { + var traitDefinition v1alpha2.TraitDefinition + var capability types.Capability + capability.Name = def.Name + objectKey := client.ObjectKey{ + Namespace: namespace, + Name: name, + } + err := k8sClient.Get(ctx, objectKey, &traitDefinition) + if err != nil { + return &capability, fmt.Errorf("failed to get WorkloadDefinition %s: %v", def.Name, err) + } + def.TraitDefinition = traitDefinition + capability, err = util.ConvertTemplateJSON2Object(name, traitDefinition.Spec.Extension, traitDefinition.Spec.Schematic) + if err != nil { + return nil, fmt.Errorf("failed to convert WorkloadDefinition to Capability Object") + } + return &capability, err +} + +// GetOpenAPISchema gets OpenAPI v3 schema by TraitDefinition name +func (def *CapabilityTraitDefinition) GetOpenAPISchema(ctx context.Context, k8sClient client.Client, namespace, name string) ([]byte, error) { + capability, err := def.GetCapabilityObject(ctx, k8sClient, namespace, name) + if err != nil { + return nil, err + } + return getOpenAPISchema(*capability) +} + +// StoreOpenAPISchema stores OpenAPI v3 schema from TraitDefinition in ConfigMap +func (def *CapabilityTraitDefinition) StoreOpenAPISchema(ctx context.Context, k8sClient client.Client, namespace, name string) error { + jsonSchema, err := def.GetOpenAPISchema(ctx, k8sClient, namespace, name) + if err != nil { + return fmt.Errorf(util.ErrGenerateOpenAPIV2JSONSchemaForCapability, def.Name, err) + } + + traitDefinition := def.TraitDefinition + ownerReference := []metav1.OwnerReference{{ + APIVersion: traitDefinition.APIVersion, + Kind: traitDefinition.Kind, + Name: traitDefinition.Name, + UID: traitDefinition.GetUID(), + Controller: pointer.BoolPtr(true), + BlockOwnerDeletion: pointer.BoolPtr(true), + }} + return def.CreateOrUpdateConfigMap(ctx, k8sClient, namespace, traitDefinition.Name, jsonSchema, ownerReference) +} + +// CapabilityBaseDefinition is the base struct for CapabilityWorkloadDefinition and CapabilityTraitDefinition +type CapabilityBaseDefinition struct { +} + +// CreateOrUpdateConfigMap creates ConfigMap to store OpenAPI v3 schema or or updates data in ConfigMap +func (def *CapabilityBaseDefinition) CreateOrUpdateConfigMap(ctx context.Context, k8sClient client.Client, namespace, definitionName string, jsonSchema []byte, ownerReferences []metav1.OwnerReference) error { + cmName := fmt.Sprintf("%s%s", types.CapabilityConfigMapNamePrefix, definitionName) + var cm v1.ConfigMap + var data = map[string]string{ + types.OpenapiV3JSONSchema: string(jsonSchema), + } + // No need to check the existence of namespace, if it doesn't exist, API server will return the error message + // before it's to be reconciled by WorkloadDefinition/TraitDefinition controller. + err := k8sClient.Get(ctx, client.ObjectKey{Namespace: namespace, Name: cmName}, &cm) + if err != nil && apierrors.IsNotFound(err) { + cm = v1.ConfigMap{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "ConfigMap", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: cmName, + Namespace: namespace, + OwnerReferences: ownerReferences, + Labels: map[string]string{ + "definition.oam.dev": "schema", + }, + }, + Data: data, + } + err = k8sClient.Create(ctx, &cm) + if err != nil { + return fmt.Errorf(util.ErrUpdateCapabilityInConfigMap, definitionName, err) + } + return nil + } + + cm.Data = data + if err = k8sClient.Update(ctx, &cm); err != nil { + return fmt.Errorf(util.ErrUpdateCapabilityInConfigMap, definitionName, err) + } + return nil +} + +// getDefinition is the main function for GetDefinition API +func getOpenAPISchema(capability types.Capability) ([]byte, error) { + openAPISchema, err := generateOpenAPISchemaFromCapabilityParameter(capability) + if err != nil { + return nil, err + } + swagger, err := openapi3.NewSwaggerLoader().LoadSwaggerFromData(openAPISchema) + if err != nil { + return nil, err + } + schemaRef := swagger.Components.Schemas["parameter"] + if schemaRef == nil { + return nil, fmt.Errorf(util.ErrGenerateOpenAPIV2JSONSchemaForCapability, capability.Name, nil) + } + schema := schemaRef.Value + fixOpenAPISchema("", schema) + + parameter, err := schema.MarshalJSON() + if err != nil { + return nil, err + } + return parameter, nil +} + +// generateOpenAPISchemaFromCapabilityParameter returns the parameter of a definition in cue.Value format +func generateOpenAPISchemaFromCapabilityParameter(capability types.Capability) ([]byte, error) { + name := capability.Name + template, err := prepareParameterCue(name, capability.CueTemplate) + if err != nil { + return nil, err + } + + // append context section in CUE string + template += mycue.BaseTemplate + + var r cue.Runtime + cueInst, err := r.Compile("-", template) + if err != nil { + return nil, err + } + return common.GenOpenAPI(cueInst) +} + +// prepareParameterCue cuts `parameter` section form definition .cue file +func prepareParameterCue(capabilityName, capabilityTemplate string) (string, error) { + var template string + var withParameterFlag bool + r := regexp.MustCompile("[[:space:]]*parameter:[[:space:]]*{.*") + + for _, text := range strings.Split(capabilityTemplate, "\n") { + if r.MatchString(text) { + // a variable has to be refined as a definition which starts with "#" + text = fmt.Sprintf("parameter: #parameter\n#%s", text) + withParameterFlag = true + } + template += fmt.Sprintf("%s\n", text) + } + + if !withParameterFlag { + return "", fmt.Errorf("capability %s doesn't contain section `parmeter`", capabilityName) + } + return template, nil +} + +// fixOpenAPISchema fixes tainted `description` filed, missing of title `field`. +func fixOpenAPISchema(name string, schema *openapi3.Schema) { + t := schema.Type + switch t { + case "object": + for k, v := range schema.Properties { + s := v.Value + fixOpenAPISchema(k, s) + } + case "array": + fixOpenAPISchema("", schema.Items.Value) + } + if name != "" { + schema.Title = name + } + + description := schema.Description + if strings.Contains(description, UsageTag) { + description = strings.Split(description, UsageTag)[1] + } + if strings.Contains(description, ShortTag) { + description = strings.Split(description, ShortTag)[0] + description = strings.TrimSpace(description) + } + schema.Description = description +} diff --git a/pkg/controller/utils/capability_integrate_test.go b/pkg/controller/utils/capability_integrate_test.go new file mode 100644 index 000000000..a4ac93042 --- /dev/null +++ b/pkg/controller/utils/capability_integrate_test.go @@ -0,0 +1,214 @@ +/* +Copyright 2020 The KubeVela Authors. + +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 utils + +import ( + "context" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/pointer" + "sigs.k8s.io/yaml" + + "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" + "github.com/oam-dev/kubevela/pkg/oam/util" +) + +var _ = Describe("Test Capability", func() { + ctx := context.Background() + var ( + namespace = "ns-cap" + ns corev1.Namespace + ) + + Context("When the definition is WorkloadDefinition", func() { + var workloadDefinitionName = "web1" + BeforeEach(func() { + ns = corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: namespace, + }, + } + By("Create a namespace") + Expect(k8sClient.Create(ctx, &ns)).Should(SatisfyAny(Succeed(), &util.AlreadyExistMatcher{})) + }) + + It("Test CapabilityWorkloadDefinition", func() { + By("Apply WorkloadDefinition") + var validWorkloadDefinition = ` +apiVersion: core.oam.dev/v1alpha2 +kind: WorkloadDefinition +metadata: + name: web1 + namespace: ns-cap + annotations: + definition.oam.dev/description: "test" +spec: + definitionRef: + name: deployments.apps + schematic: + cue: + template: | + outputs: { + apiVersion: "apps/v1" + kind: "Deployment" + spec: { + selector: matchLabels: { + "app.oam.dev/component": context.name + } + + template: { + metadata: labels: { + "app.oam.dev/component": context.name + } + + spec: { + containers: [{ + name: context.name + image: parameter.image + + if parameter["cmd"] != _|_ { + command: parameter.cmd + } + }] + } + } + } + } + parameter: { + // +usage=Which image would you like to use for your service + // +short=i + image: string + + // +usage=Commands to run in the container + cmd?: [...string] + } + +` + var workloadDefinition v1alpha2.WorkloadDefinition + Expect(yaml.Unmarshal([]byte(validWorkloadDefinition), &workloadDefinition)).Should(BeNil()) + Expect(k8sClient.Create(ctx, &workloadDefinition)).Should(Succeed()) + + By("Test GetCapabilityObject") + def := &CapabilityWorkloadDefinition{Name: workloadDefinitionName} + capability, err := def.GetCapabilityObject(ctx, k8sClient, namespace, workloadDefinitionName) + Expect(err).Should(BeNil()) + Expect(capability).Should(Not(BeNil())) + + By("Test GetOpenAPISchema") + schema, err := def.GetOpenAPISchema(ctx, k8sClient, namespace, workloadDefinitionName) + Expect(err).Should(BeNil()) + Expect(schema).Should(Not(BeNil())) + + }) + }) + + Context("When the definition is TraitDefinition", func() { + var traitDefinitionName = "scaler1" + + BeforeEach(func() { + ns = corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: namespace, + }, + } + By("Create a namespace") + Expect(k8sClient.Create(ctx, &ns)).Should(SatisfyAny(Succeed(), &util.AlreadyExistMatcher{})) + }) + + It("Test CapabilityTraitDefinition", func() { + By("Apply TraitDefinition") + var validTraitDefinition = ` +apiVersion: core.oam.dev/v1alpha2 +kind: TraitDefinition +metadata: + namespace: ns-cap + annotations: + definition.oam.dev/description: "Configures replicas for your service." + name: scaler1 +spec: + appliesToWorkloads: + - webservice + - worker + definitionRef: + name: manualscalertraits.core.oam.dev + workloadRefPath: spec.workloadRef + schematic: + cue: + template: | + outputs: scaler: { + apiVersion: "core.oam.dev/v1alpha2" + kind: "ManualScalerTrait" + spec: { + replicaCount: parameter.replicas + } + } + parameter: { + //+short=r + //+usage=Replicas of the workload + replicas: *1 | int + } +` + + var traitDefinition v1alpha2.TraitDefinition + Expect(yaml.Unmarshal([]byte(validTraitDefinition), &traitDefinition)).Should(BeNil()) + Expect(k8sClient.Create(ctx, &traitDefinition)).Should(Succeed()) + + By("Test GetCapabilityObject") + def := &CapabilityTraitDefinition{Name: traitDefinitionName} + capability, err := def.GetCapabilityObject(ctx, k8sClient, namespace, traitDefinitionName) + Expect(err).Should(BeNil()) + Expect(capability).Should(Not(BeNil())) + + By("Test GetOpenAPISchema") + var expectedSchema = "{\"properties\":{\"replicas\":{\"default\":1,\"description\":\"Replicas of the workload\",\"title\":\"replicas\",\"type\":\"integer\"}},\"required\":[\"replicas\"],\"type\":\"object\"}" + schema, err := def.GetOpenAPISchema(ctx, k8sClient, namespace, traitDefinitionName) + Expect(err).Should(BeNil()) + Expect(string(schema)).Should(Equal(expectedSchema)) + }) + }) + + Context("When the definition is CapabilityBaseDefinition", func() { + BeforeEach(func() { + ns = corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: namespace, + }, + } + By("Create a namespace") + Expect(k8sClient.Create(ctx, &ns)).Should(SatisfyAny(Succeed(), &util.AlreadyExistMatcher{})) + }) + + It("Test CapabilityTraitDefinition", func() { + By("Test CreateOrUpdateConfigMap") + definitionName := "n1" + def := &CapabilityBaseDefinition{} + ownerReference := []metav1.OwnerReference{{ + APIVersion: "v1", + Kind: "k1", + Name: definitionName, + UID: "123456", + Controller: pointer.BoolPtr(true), + BlockOwnerDeletion: pointer.BoolPtr(true), + }} + err := def.CreateOrUpdateConfigMap(ctx, k8sClient, namespace, definitionName, []byte(""), ownerReference) + Expect(err).Should(BeNil()) + }) + }) +}) diff --git a/pkg/controller/utils/capability_suite_test.go b/pkg/controller/utils/capability_suite_test.go new file mode 100644 index 000000000..a01b2d66b --- /dev/null +++ b/pkg/controller/utils/capability_suite_test.go @@ -0,0 +1,69 @@ +/* +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 utils + +import ( + "path/filepath" + "testing" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/envtest" + + oamCore "github.com/oam-dev/kubevela/apis/core.oam.dev" +) + +var cfg *rest.Config +var k8sClient client.Client +var testEnv *envtest.Environment + +func TestCapability(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Capability Suite") +} + +var _ = BeforeSuite(func(done Done) { + By("Bootstrapping test environment") + useExistCluster := false + testEnv = &envtest.Environment{ + CRDDirectoryPaths: []string{ + filepath.Join("../../..", "charts/vela-core/crds"), // this has all the required CRDs, + }, + UseExistingCluster: &useExistCluster, + } + var err error + cfg, err = testEnv.Start() + Expect(err).ToNot(HaveOccurred()) + Expect(cfg).ToNot(BeNil()) + + err = oamCore.AddToScheme(scheme.Scheme) + Expect(err).NotTo(HaveOccurred()) + + By("Create the k8s client") + k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) + Expect(err).ToNot(HaveOccurred()) + Expect(k8sClient).ToNot(BeNil()) + + close(done) +}, 60) + +var _ = AfterSuite(func() { + By("Tearing down the test environment") + err := testEnv.Stop() + Expect(err).ToNot(HaveOccurred()) +}) diff --git a/pkg/controller/utils/capability_test.go b/pkg/controller/utils/capability_test.go new file mode 100644 index 000000000..7a87972b1 --- /dev/null +++ b/pkg/controller/utils/capability_test.go @@ -0,0 +1,132 @@ +package utils + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/crossplane/crossplane-runtime/pkg/test" + "github.com/getkin/kin-openapi/openapi3" + "github.com/google/go-cmp/cmp" + "gotest.tools/assert" + + "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" + "github.com/oam-dev/kubevela/apis/types" + "github.com/oam-dev/kubevela/pkg/oam/util" + "github.com/oam-dev/kubevela/pkg/utils/system" +) + +const TestDir = "testdata/definition" + +func TestGetOpenAPISchema(t *testing.T) { + type want struct { + data string + err error + } + cases := map[string]struct { + reason string + name string + fileDir string + fileName string + want want + }{ + "PrepareANormalParameterCueFile": { + reason: "Prepare a normal parameter cue file", + name: "workload1", + fileDir: TestDir, + fileName: "workload1.cue", + want: want{data: "{\"properties\":{\"min\":{\"title\":\"min\",\"type\":\"integer\"}},\"required\":[\"min\"],\"type\":\"object\"}", err: nil}, + }, + "CueFileNotContainParameter": { + reason: "Prepare a cue file which doesn't contain `parameter` section", + name: "invalidWorkload", + fileDir: TestDir, + fileName: "workloadNoParameter.cue", + want: want{data: "", err: fmt.Errorf("capability invalidWorkload doesn't contain section `parmeter`")}, + }, + } + + for name, tc := range cases { + t.Run(name, func(t *testing.T) { + data, _ := ioutil.ReadFile(filepath.Join(tc.fileDir, tc.fileName)) + schematic := &v1alpha2.Schematic{ + CUE: &v1alpha2.CUE{ + Template: string(data), + }, + } + capability, _ := util.ConvertTemplateJSON2Object(tc.name, nil, schematic) + schema, err := getOpenAPISchema(capability) + if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { + t.Errorf("\n%s\ngetOpenAPISchema(...): -want error, +got error:\n%s", tc.reason, diff) + } + if tc.want.err == nil { + assert.Equal(t, string(schema), tc.want.data) + } + }) + } +} + +func TestFixOpenAPISchema(t *testing.T) { + cases := map[string]struct { + inputFile string + fixedFile string + }{ + "StandardWorkload": { + inputFile: "webservice.json", + fixedFile: "webserviceFixed.json", + }, + "ShortTagJson": { + inputFile: "shortTagSchema.json", + fixedFile: "shortTagSchemaFixed.json", + }, + } + + for name, tc := range cases { + t.Run(name, func(t *testing.T) { + swagger, _ := openapi3.NewSwaggerLoader().LoadSwaggerFromFile(filepath.Join(TestDir, tc.inputFile)) + schema := swagger.Components.Schemas["parameter"].Value + fixOpenAPISchema("", schema) + fixedSchema, _ := schema.MarshalJSON() + expectedSchema, _ := ioutil.ReadFile(filepath.Join(TestDir, tc.fixedFile)) + assert.Equal(t, string(fixedSchema), string(expectedSchema)) + }) + } +} + +func TestGenerateOpenAPISchemaFromCapabilityParameter(t *testing.T) { + var invalidWorkloadName = "IAmAnInvalidWorkloadDefinition" + capabilityDir, _ := system.GetCapabilityDir() + if _, err := os.Stat(capabilityDir); err != nil && os.IsNotExist(err) { + os.MkdirAll(capabilityDir, 0755) + } + + type want struct { + data []byte + err error + } + + cases := map[string]struct { + reason string + capability types.Capability + want want + }{ + "GenerateOpenAPISchemaFromInvalidCapability": { + reason: "generate OpenAPI schema for an invalid Workload/Trait", + capability: types.Capability{Name: invalidWorkloadName}, + want: want{data: nil, err: fmt.Errorf("capability IAmAnInvalidWorkloadDefinition doesn't contain section `parmeter`")}, + }, + } + for name, tc := range cases { + t.Run(name, func(t *testing.T) { + got, err := generateOpenAPISchemaFromCapabilityParameter(tc.capability) + if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { + t.Errorf("\n%s\ngetDefinition(...): -want error, +got error:\n%s", tc.reason, diff) + } + if diff := cmp.Diff(tc.want.data, got); diff != "" { + t.Errorf("\n%s\ngetDefinition(...): -want, +got:\n%s", tc.reason, diff) + } + }) + } +} diff --git a/references/common/testdata/definition/normalOpenAPISchema.json b/pkg/controller/utils/testdata/definition/normalOpenAPISchema.json similarity index 100% rename from references/common/testdata/definition/normalOpenAPISchema.json rename to pkg/controller/utils/testdata/definition/normalOpenAPISchema.json diff --git a/references/common/testdata/definition/normalOpenAPISchemaFixed.json b/pkg/controller/utils/testdata/definition/normalOpenAPISchemaFixed.json similarity index 100% rename from references/common/testdata/definition/normalOpenAPISchemaFixed.json rename to pkg/controller/utils/testdata/definition/normalOpenAPISchemaFixed.json diff --git a/references/common/testdata/definition/normalOpenAPISchemaParameter.json b/pkg/controller/utils/testdata/definition/normalOpenAPISchemaParameter.json similarity index 100% rename from references/common/testdata/definition/normalOpenAPISchemaParameter.json rename to pkg/controller/utils/testdata/definition/normalOpenAPISchemaParameter.json diff --git a/references/common/testdata/definition/shortTagSchema.json b/pkg/controller/utils/testdata/definition/shortTagSchema.json similarity index 100% rename from references/common/testdata/definition/shortTagSchema.json rename to pkg/controller/utils/testdata/definition/shortTagSchema.json diff --git a/references/common/testdata/definition/shortTagSchemaFixed.json b/pkg/controller/utils/testdata/definition/shortTagSchemaFixed.json similarity index 100% rename from references/common/testdata/definition/shortTagSchemaFixed.json rename to pkg/controller/utils/testdata/definition/shortTagSchemaFixed.json diff --git a/references/common/testdata/definition/webservice.json b/pkg/controller/utils/testdata/definition/webservice.json similarity index 100% rename from references/common/testdata/definition/webservice.json rename to pkg/controller/utils/testdata/definition/webservice.json diff --git a/references/common/testdata/definition/webserviceFixed.json b/pkg/controller/utils/testdata/definition/webserviceFixed.json similarity index 100% rename from references/common/testdata/definition/webserviceFixed.json rename to pkg/controller/utils/testdata/definition/webserviceFixed.json diff --git a/references/common/testdata/definition/workload1.cue b/pkg/controller/utils/testdata/definition/workload1.cue similarity index 100% rename from references/common/testdata/definition/workload1.cue rename to pkg/controller/utils/testdata/definition/workload1.cue diff --git a/references/common/testdata/definition/workloadNoParameter.cue b/pkg/controller/utils/testdata/definition/workloadNoParameter.cue similarity index 100% rename from references/common/testdata/definition/workloadNoParameter.cue rename to pkg/controller/utils/testdata/definition/workloadNoParameter.cue diff --git a/pkg/oam/util/helper.go b/pkg/oam/util/helper.go index 1c06fab8f..4e5a37d11 100644 --- a/pkg/oam/util/helper.go +++ b/pkg/oam/util/helper.go @@ -70,6 +70,13 @@ const ( errFmtControllerRevisionData = "cannot get valid component data from controllerRevision %q" errFmtGetComponent = "cannot get component %q" errFmtInvalidRevisionType = "invalid type of revision %s, type should not be %v" + + // ErrStoreCapabilityInConfigMap is the error while storing capability in ConfigMap + ErrStoreCapabilityInConfigMap = "cannot store capability %s in ConfigMap: %v" + // ErrGenerateOpenAPIV2JSONSchemaForCapability is the error while generating OpenAPI v3 schema + ErrGenerateOpenAPIV2JSONSchemaForCapability = "cannot generate OpenAPI v3 JSON schema for capability %s: %v" + // ErrUpdateCapabilityInConfigMap is the error while creating or updating a capability + ErrUpdateCapabilityInConfigMap = "cannot create or update capability %s in ConfigMap: %v" ) type namespaceContextKey int @@ -219,15 +226,15 @@ func GetDefinitionNamespaceWithCtx(ctx context.Context) string { return appNs } -// SetNnamespaceInCtx set app namespace in context, +// SetNamespaceInCtx set app namespace in context, // Sometimes webhook handler may receive request that appNs is empty string, and will cause error when search definition // So if namespace is empty, it will use `default` namespace by default. -func SetNnamespaceInCtx(ctx context.Context, appNs string) context.Context { - if appNs == "" { - // compatible with some webhook handlers that maybe recei ve empty string as app namespace which means `default` namespace - appNs = "default" +func SetNamespaceInCtx(ctx context.Context, namespace string) context.Context { + if namespace == "" { + // compatible with some webhook handlers that maybe receive empty string as app namespace which means `default` namespace + namespace = "default" } - ctx = context.WithValue(ctx, AppDefinitionNamespace, appNs) + ctx = context.WithValue(ctx, AppDefinitionNamespace, namespace) return ctx } diff --git a/pkg/oam/util/helper_test.go b/pkg/oam/util/helper_test.go index 0b75a6b8b..ed5f506a7 100644 --- a/pkg/oam/util/helper_test.go +++ b/pkg/oam/util/helper_test.go @@ -1367,8 +1367,8 @@ func TestGenDefinitionNsFromCtx(t *testing.T) { } testcases := []testcase{ {ctx: context.TODO(), wantNs: "vela-system"}, - {ctx: util.SetNnamespaceInCtx(context.Background(), "vela-app"), wantNs: "vela-app"}, - {ctx: util.SetNnamespaceInCtx(context.Background(), ""), wantNs: "default"}, + {ctx: util.SetNamespaceInCtx(context.Background(), "vela-app"), wantNs: "vela-app"}, + {ctx: util.SetNamespaceInCtx(context.Background(), ""), wantNs: "default"}, } for _, ts := range testcases { resNs := util.GetDefinitionNamespaceWithCtx(ts.ctx) @@ -1381,7 +1381,7 @@ func TestGenDefinitionNsFromCtx(t *testing.T) { // will get an error that tpye is not found func TestGetDefinitionError(t *testing.T) { ctx := context.Background() - ctx = util.SetNnamespaceInCtx(ctx, "vela-app") + ctx = util.SetNamespaceInCtx(ctx, "vela-app") errNotFound := apierrors.NewNotFound(schema.GroupResource{Group: "core.oma.dev", Resource: "traitDefinition"}, "mock") errNeedNamespace := fmt.Errorf("an empty namespace may not be set when a resource name is provided") @@ -1406,7 +1406,7 @@ func TestGetDefinitionError(t *testing.T) { // if not found will search in app namespace, still cannot find it, try to search definition without namespace func TestGetDefinitionWithClusterScope(t *testing.T) { ctx := context.Background() - ctx = util.SetNnamespaceInCtx(ctx, "vela-app") + ctx = util.SetNamespaceInCtx(ctx, "vela-app") // system-level definition sys := v1alpha2.TraitDefinition{ ObjectMeta: metav1.ObjectMeta{ @@ -1524,7 +1524,7 @@ func TestGetDefinitionWithClusterScope(t *testing.T) { func TestGetWorkloadDefinition(t *testing.T) { // Test common variables ctx := context.Background() - ctx = util.SetNnamespaceInCtx(ctx, "vela-app") + ctx = util.SetNamespaceInCtx(ctx, "vela-app") // sys workload Definition sysWorkloadDefinition := v1alpha2.WorkloadDefinition{ @@ -1616,7 +1616,7 @@ func TestGetWorkloadDefinition(t *testing.T) { func TestGetTraitDefinition(t *testing.T) { // Test common variables ctx := context.Background() - ctx = util.SetNnamespaceInCtx(ctx, "vela-app") + ctx = util.SetNamespaceInCtx(ctx, "vela-app") // sys workload Definition sysTraitDefinition := v1alpha2.TraitDefinition{ @@ -1748,7 +1748,7 @@ func TestGetDefinition(t *testing.T) { }} ctx := context.Background() - ctx = util.SetNnamespaceInCtx(ctx, "vela-app") + ctx = util.SetNamespaceInCtx(ctx, "vela-app") appTd := new(v1alpha2.TraitDefinition) err := util.GetDefinition(ctx, &cli, appTd, "mockTrait") assert.Equal(t, nil, err) @@ -1765,7 +1765,7 @@ func TestGetDefinition(t *testing.T) { func TestGetScopeDefiniton(t *testing.T) { ctx := context.Background() namespace := "vela-app" - ctx = util.SetNnamespaceInCtx(ctx, namespace) + ctx = util.SetNamespaceInCtx(ctx, namespace) scopeDefinitionKind := "ScopeDefinition" mockVerision := "core.oam.dev/v1alpha2" scopeDefinitionName := "mockscopes.core.oam.dev" diff --git a/pkg/oam/util/template.go b/pkg/oam/util/template.go index 67f94ce54..053357785 100644 --- a/pkg/oam/util/template.go +++ b/pkg/oam/util/template.go @@ -112,19 +112,19 @@ func NewTemplate(schematic *v1alpha2.Schematic, status *v1alpha2.Status, raw *ru } // ConvertTemplateJSON2Object convert spec.extension to object -func ConvertTemplateJSON2Object(in *runtime.RawExtension, schematic *v1alpha2.Schematic) (types.Capability, error) { +func ConvertTemplateJSON2Object(capabilityName string, in *runtime.RawExtension, schematic *v1alpha2.Schematic) (types.Capability, error) { var t types.Capability + t.Name = capabilityName capTemplate, err := NewTemplate(schematic, nil, in) + if err != nil { return t, errors.Wrapf(err, "parse cue template") } - var extension types.Capability if in != nil && in.Raw != nil { - err := json.Unmarshal(in.Raw, &extension) + err := json.Unmarshal(in.Raw, &t) if err != nil { return t, errors.Wrapf(err, "parse extension fail") } - t = extension } if capTemplate.TemplateStr != "" { t.CueTemplate = capTemplate.TemplateStr diff --git a/pkg/utils/common/common.go b/pkg/utils/common/common.go index 96f218aa1..fabd70b55 100644 --- a/pkg/utils/common/common.go +++ b/pkg/utils/common/common.go @@ -14,7 +14,6 @@ import ( "path/filepath" "cuelang.org/go/cue" - "cuelang.org/go/cue/load" "cuelang.org/go/encoding/openapi" "github.com/AlecAivazis/survey/v2" certmanager "github.com/wonderflow/cert-manager-api/pkg/apis/certmanager/v1" @@ -115,18 +114,6 @@ func GenOpenAPI(inst *cue.Instance) ([]byte, error) { return out.Bytes(), nil } -// GenOpenAPIFromFile generates OpenAPI json schema from cue file -func GenOpenAPIFromFile(filePath string, fileName string) ([]byte, error) { - filename := filepath.FromSlash(fileName) - inst := cue.Build(load.Instances([]string{filename}, &load.Config{ - Dir: filePath, - }))[0] - if inst.Err != nil { - return nil, inst.Err - } - return GenOpenAPI(inst) -} - // RealtimePrintCommandOutput prints command output in real time // If logFile is "", it will prints the stdout, or it will write to local file func RealtimePrintCommandOutput(cmd *exec.Cmd, logFile string) error { diff --git a/pkg/utils/common/common_test.go b/pkg/utils/common/common_test.go index ee56d71a7..4cd579841 100644 --- a/pkg/utils/common/common_test.go +++ b/pkg/utils/common/common_test.go @@ -1,9 +1,12 @@ package common import ( + "context" "errors" "fmt" "io/ioutil" + "net/http" + "net/http/httptest" "os" "os/exec" "path/filepath" @@ -16,6 +19,58 @@ import ( "github.com/stretchr/testify/assert" ) +var ResponseString = "Hello HTTP Get." + +func TestInitBaseRestConfig(t *testing.T) { + args, err := InitBaseRestConfig() + assert.NotNil(t, t, args) + assert.NoError(t, err) +} + +func TestHTTPGet(t *testing.T) { + type want struct { + data string + errStr string + } + var ctx = context.Background() + + testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, ResponseString) + })) + defer testServer.Close() + + cases := map[string]struct { + reason string + url string + want want + }{ + "normal case": { + reason: "url is valid\n", + url: testServer.URL, + want: want{ + data: fmt.Sprintf("%s\n", ResponseString), + errStr: "", + }, + }, + } + + for name, tc := range cases { + t.Run(name, func(t *testing.T) { + got, err := HTTPGet(ctx, tc.url) + if tc.want.errStr != "" { + if diff := cmp.Diff(tc.want.errStr, err.Error(), test.EquateErrors()); diff != "" { + t.Errorf("\n%s\nHTTPGet(...): -want error, +got error:\n%s", tc.reason, diff) + } + } + + if diff := cmp.Diff(tc.want.data, string(got)); diff != "" { + t.Errorf("\n%s\nHTTPGet(...): -want, +got:\n%s", tc.reason, diff) + } + }) + } + +} + func TestGetCUEParameterValue(t *testing.T) { type want struct { err error @@ -98,63 +153,6 @@ name } } -func TestGenOpenAPIFromFile(t *testing.T) { - type want struct { - data []byte - err error - } - var dir = "testdata" - var validCueFile = "workload1.cue" - var validTargetSchema = "workload1.json" - targetFile := filepath.Join(dir, validTargetSchema) - expect, _ := ioutil.ReadFile(targetFile) - - normalWant := want{ - data: expect, - err: nil, - } - - cases := map[string]struct { - reason string - fileDir string - fileName string - targetSchema string - want want - }{ - "GenOpenAPIFromFile": { - reason: "generate OpenAPI schema from a cue file", - fileDir: dir, - fileName: validCueFile, - targetSchema: validTargetSchema, - want: normalWant, - }, - "CueFileIsNotValid": { - reason: "generate OpenAPI schema from a cue file which is invalid", - fileDir: dir, - fileName: "workload2Invalid.cue", - want: want{ - data: nil, - err: errors.New("expected 'EOF', found '}'"), - }, - }, - } - - for name, tc := range cases { - t.Run(name, func(t *testing.T) { - got, err := GenOpenAPIFromFile(tc.fileDir, tc.fileName) - if tc.want.err != nil { - if diff := cmp.Diff(tc.want.err, errors.New(err.Error()), test.EquateErrors()); diff != "" { - t.Errorf("\n%s\nGenOpenAPIFromFile(...): -want error, +got error:\n%s", tc.reason, diff) - } - } - - if diff := cmp.Diff(tc.want.data, got); diff != "" { - t.Errorf("\n%s\nGenOpenAPIFromFile(...): -want, +got:\n%s", tc.reason, diff) - } - }) - } -} - func TestGenOpenAPI(t *testing.T) { type want struct { data []byte diff --git a/pkg/webhook/core.oam.dev/v1alpha2/application/validating_handler.go b/pkg/webhook/core.oam.dev/v1alpha2/application/validating_handler.go index 57b880102..c5ef6fb74 100644 --- a/pkg/webhook/core.oam.dev/v1alpha2/application/validating_handler.go +++ b/pkg/webhook/core.oam.dev/v1alpha2/application/validating_handler.go @@ -54,7 +54,7 @@ func (h *ValidatingHandler) Handle(ctx context.Context, req admission.Request) a if err := h.Decoder.Decode(req, app); err != nil { return admission.Errored(http.StatusBadRequest, err) } - ctx = util.SetNnamespaceInCtx(ctx, app.Namespace) + ctx = util.SetNamespaceInCtx(ctx, app.Namespace) switch req.Operation { case admissionv1beta1.Create: if allErrs := h.ValidateCreate(ctx, app); len(allErrs) > 0 { diff --git a/pkg/webhook/core.oam.dev/v1alpha2/applicationconfiguration/validating_handler.go b/pkg/webhook/core.oam.dev/v1alpha2/applicationconfiguration/validating_handler.go index f5b73d555..39ba42c55 100644 --- a/pkg/webhook/core.oam.dev/v1alpha2/applicationconfiguration/validating_handler.go +++ b/pkg/webhook/core.oam.dev/v1alpha2/applicationconfiguration/validating_handler.go @@ -119,7 +119,7 @@ func (h *ValidatingHandler) Handle(ctx context.Context, req admission.Request) a func (h *ValidatingHandler) ValidateCreate(ctx context.Context, obj *v1alpha2.ApplicationConfiguration) field.ErrorList { var componentErrs field.ErrorList vAppConfig := &ValidatingAppConfig{} - ctx = util.SetNnamespaceInCtx(ctx, obj.Namespace) + ctx = util.SetNamespaceInCtx(ctx, obj.Namespace) if err := vAppConfig.PrepareForValidation(ctx, h.Client, h.Mapper, obj); err != nil { klog.InfoS("failed to prepare information before validation ", " name: ", obj.Name, " errMsg: ", err.Error()) componentErrs = append(componentErrs, field.Invalid(field.NewPath("spec"), obj.Spec, diff --git a/references/README.md b/references/README.md index 675e1c595..c2a2af0a3 100644 --- a/references/README.md +++ b/references/README.md @@ -2,6 +2,6 @@ This folder contains all reference implementation of vela cli, apiserver and dashboard. It provides a PoC of how to integrate KubeVela with your own system, -you can refer to these implementation and build your own. +you can refer to these implementations and build your own. The formal KubeVela APIServer is a standalone project called [velacp](https://github.com/oam-dev/velacp). \ No newline at end of file diff --git a/references/apiserver/definitionHandler.go b/references/apiserver/definitionHandler.go index eed824d5b..c87d52311 100644 --- a/references/apiserver/definitionHandler.go +++ b/references/apiserver/definitionHandler.go @@ -1,8 +1,11 @@ package apiserver import ( + "errors" + "github.com/gin-gonic/gin" + "github.com/oam-dev/kubevela/apis/types" "github.com/oam-dev/kubevela/references/apiserver/util" "github.com/oam-dev/kubevela/references/common" ) @@ -17,10 +20,10 @@ import ( // @Router /definitions/{definitionName} [get] func (s *APIServer) GetDefinition(c *gin.Context) { definitionName := c.Param("name") - parameter, err := common.GetDefinition(definitionName) + cm, err := common.GetCapabilityConfigMap(s.KubeClient, definitionName) if err != nil { - util.HandleError(c, util.StatusInternalServerError, err) + util.HandleError(c, util.StatusInternalServerError, errors.New("OpenAPI v3 JSON Schema is not ready")) return } - util.AssembleResponse(c, string(parameter), nil) + util.AssembleResponse(c, cm.Data[types.OpenapiV3JSONSchema], nil) } diff --git a/references/cli/dryrun.go b/references/cli/dryrun.go index 9c58b3cd8..5f50d55a3 100644 --- a/references/cli/dryrun.go +++ b/references/cli/dryrun.go @@ -54,7 +54,7 @@ func NewDryRunCommand(c types.Args, ioStreams cmdutil.IOStreams) *cobra.Command parser := appfile.NewApplicationParser(newClient, dm) - ctx := oamutil.SetNnamespaceInCtx(context.Background(), app.Namespace) + ctx := oamutil.SetNamespaceInCtx(context.Background(), app.Namespace) appFile, err := parser.GenerateAppFile(ctx, app.Name, app) if err != nil { return errors.WithMessage(err, "generate appFile") diff --git a/references/common/capability.go b/references/common/capability.go index 03e14d8cf..2c4e57062 100644 --- a/references/common/capability.go +++ b/references/common/capability.go @@ -10,6 +10,8 @@ import ( "path/filepath" "strings" + corev1 "k8s.io/api/core/v1" + "github.com/ghodss/yaml" apierrors "k8s.io/apimachinery/pkg/api/errors" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -445,3 +447,11 @@ func addSourceIntoExtension(in *runtime.RawExtension, source *types.Source) erro in.Raw = data return nil } + +// GetCapabilityConfigMap gets the ConfigMap which stores the information of a capability +func GetCapabilityConfigMap(kubeClient client.Client, capabilityName string) (corev1.ConfigMap, error) { + cmName := fmt.Sprintf("%s%s", types.CapabilityConfigMapNamePrefix, capabilityName) + var cm corev1.ConfigMap + err := kubeClient.Get(context.Background(), client.ObjectKey{Namespace: types.DefaultKubeVelaNS, Name: cmName}, &cm) + return cm, err +} diff --git a/references/common/definition.go b/references/common/definition.go deleted file mode 100644 index 3ed6156d3..000000000 --- a/references/common/definition.go +++ /dev/null @@ -1,204 +0,0 @@ -package common - -import ( - "bufio" - "encoding/json" - "fmt" - "os" - "path/filepath" - "regexp" - "strings" - - "github.com/getkin/kin-openapi/openapi3" - - mycue "github.com/oam-dev/kubevela/pkg/cue" - "github.com/oam-dev/kubevela/pkg/utils/common" - "github.com/oam-dev/kubevela/pkg/utils/system" -) - -const ( - // OpenAPISchemaDir is the folder name under ~/.vela/capabilities - OpenAPISchemaDir = "openapi" - // UsageTag is usage comment annotation - UsageTag = "+usage=" - // ShortTag is the short alias annotation - ShortTag = "+short" -) - -// OpenAPISchema is the struct for OpenAPI Schema generated by Cue OpenAPI -type OpenAPISchema struct { - OpenAPI string `json:"openapi"` - Components Components `json:"components"` -} - -// Components is the struct filed of OpenAPISchema -type Components struct { - Schemas Schemas `json:"schemas"` -} - -// Schemas is the struct filed of Components -type Schemas struct { - Parameter map[string]interface{} `json:"parameter"` -} - -// GetDefinition is the main function for GetDefinition API -func GetDefinition(name string) ([]byte, error) { - openAPISchema, err := generateOpenAPISchemaFromCapabilityParameter(name) - if err != nil { - return nil, err - } - swagger, err := openapi3.NewSwaggerLoader().LoadSwaggerFromData(openAPISchema) - if err != nil { - return nil, err - } - schemaRef := swagger.Components.Schemas["parameter"] - schema := schemaRef.Value - fixOpenAPISchema("", schema) - - parameter, err := schema.MarshalJSON() - if err != nil { - return nil, err - } - return parameter, nil -} - -// generateOpenAPISchemaFromCapabilityParameter returns the parameter of a definition in cue.Value format -func generateOpenAPISchemaFromCapabilityParameter(name string) ([]byte, error) { - dir, err := system.GetCapabilityDir() - if err != nil { - return nil, err - } - - definitionCueName := fmt.Sprintf("%s.cue", name) - schemaDir := filepath.Join(dir, OpenAPISchemaDir) - if err = prepareParameterCue(dir, definitionCueName, schemaDir); err != nil { - return nil, err - } - - if err = appendCueReference(filepath.Join(dir, OpenAPISchemaDir, definitionCueName)); err != nil { - return nil, err - } - - filename := filepath.FromSlash(definitionCueName) - return common.GenOpenAPIFromFile(filepath.Join(dir, OpenAPISchemaDir), filename) -} - -// prepareParameterCue cuts `parameter` section form definition .cue file -func prepareParameterCue(fileDir, fileName string, targetSchemaDir string) error { - if _, err := os.Stat(targetSchemaDir); err != nil && os.IsNotExist(err) { - if err := os.Mkdir(targetSchemaDir, 0750); err != nil { - return err - } - } - - cueFile := filepath.Join(fileDir, fileName) - f, err := os.Open(filepath.Clean(cueFile)) - if err != nil { - return err - } - //nolint - defer f.Close() - schemaFile := filepath.Join(targetSchemaDir, fileName) - _, err = os.Stat(schemaFile) - if err == nil { - if err = os.Truncate(schemaFile, 0); err != nil { - return err - } - } - targetFile, err := os.OpenFile(filepath.Clean(schemaFile), os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600) - if err != nil { - return err - } - //nolint - defer targetFile.Close() - - scanner := bufio.NewScanner(f) - var withParameterFlag bool - r := regexp.MustCompile("[[:space:]]*parameter:[[:space:]]*{.*") - - for scanner.Scan() { - text := scanner.Text() - if r.MatchString(text) { - // a variable has to be refined as a definition which starts with "#" - text = fmt.Sprintf("parameter: #parameter\n#%s", text) - withParameterFlag = true - } - if _, err := targetFile.WriteString(fmt.Sprintf("%s\n", text)); err != nil { - return err - } - } - - if !withParameterFlag { - return fmt.Errorf("cue file %s doesn't contain section `parmeter`", cueFile) - } - return nil -} - -// appendCueReference appends `context` filed to parameter .cue file -func appendCueReference(cueFile string) error { - f, err := os.OpenFile(filepath.Clean(cueFile), os.O_APPEND|os.O_WRONLY, 0600) - if err != nil { - return err - } - //nolint - defer f.Close() - - if _, err := f.WriteString(mycue.BaseTemplate); err != nil { - return err - } - return nil -} - -// fixOpenAPISchema fixes tainted `description` filed, missing of title `field`. -func fixOpenAPISchema(name string, schema *openapi3.Schema) { - t := schema.Type - switch t { - case "object": - for k, v := range schema.Properties { - s := v.Value - fixOpenAPISchema(k, s) - } - case "array": - fixOpenAPISchema("", schema.Items.Value) - } - if name != "" { - schema.Title = name - } - - description := schema.Description - if strings.Contains(description, UsageTag) { - description = strings.Split(description, UsageTag)[1] - } - if strings.Contains(description, ShortTag) { - description = strings.Split(description, ShortTag)[0] - description = strings.TrimSpace(description) - } - schema.Description = description -} - -// getParameterItemName gets the name of a parameter item -func getParameterItemName(previousLine string) (string, error) { - // parse property name, like from `"cmd": {\n` - tempPropertyName := strings.Split(previousLine, "\"") - if len(tempPropertyName) <= 1 { - return "", fmt.Errorf("could not get property name from: %s", previousLine) - } - propertyName := strings.Split(tempPropertyName[1], "\"")[0] - return propertyName, nil -} - -// getParameterFromOpenAPISchema retrieves needs section from OpenAPI schema for front-end requirements -func getParameterFromOpenAPISchema(openAPISchema []byte) ([]byte, error) { - var schema OpenAPISchema - var parameterJSON []byte - var err error - if err = json.Unmarshal(openAPISchema, &schema); err != nil { - return nil, err - } - - parameter := schema.Components.Schemas.Parameter - if parameterJSON, err = json.Marshal(parameter); err != nil { - return nil, err - } - return parameterJSON, nil -} diff --git a/references/common/definition_test.go b/references/common/definition_test.go deleted file mode 100644 index 221b3b11b..000000000 --- a/references/common/definition_test.go +++ /dev/null @@ -1,233 +0,0 @@ -package common - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "strings" - "testing" - - "github.com/getkin/kin-openapi/openapi3" - - "github.com/crossplane/crossplane-runtime/pkg/test" - "github.com/google/go-cmp/cmp" - "github.com/stretchr/testify/assert" - - "github.com/oam-dev/kubevela/pkg/utils/system" -) - -const TestDir = "testdata/definition" - -func TestGenerateOpenAPISchemaFromCapabilityParameter(t *testing.T) { - - var invalidWorkloadName = "IAmAnInvalidWorkloadDefinition" - capabilityDir, _ := system.GetCapabilityDir() - if _, err := os.Stat(capabilityDir); err != nil && os.IsNotExist(err) { - os.MkdirAll(capabilityDir, 0755) - } - invalidWorkloadPath := filepath.Join(capabilityDir, fmt.Sprintf("%s.cue", invalidWorkloadName)) - - type want struct { - data []byte - err error - } - - cases := map[string]struct { - reason string - name string - want want - }{ - "GenerateOpenAPISchemaFromInvalidCapability": { - reason: "generate OpenAPI schema for an invalid Workload/Trait", - name: invalidWorkloadName, - want: want{data: nil, err: &os.PathError{Op: "open", Path: invalidWorkloadPath, Err: fmt.Errorf("no such file or directory")}}, - }, - } - for name, tc := range cases { - t.Run(name, func(t *testing.T) { - got, err := generateOpenAPISchemaFromCapabilityParameter(tc.name) - if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { - t.Errorf("\n%s\ngetDefinition(...): -want error, +got error:\n%s", tc.reason, diff) - } - if diff := cmp.Diff(tc.want.data, got); diff != "" { - t.Errorf("\n%s\ngetDefinition(...): -want, +got:\n%s", tc.reason, diff) - } - }) - } -} - -func TestPrepareParameterCue(t *testing.T) { - targetSchemaDir := filepath.Join(TestDir, "openapi") - var noParameterCueName = "workloadNoParameter.cue" - var err = fmt.Errorf("cue file %s doesn't contain section `parmeter`", filepath.Join(TestDir, noParameterCueName)) - - var invalidDir = "IAmAnInvalidDirectory/openapi" - var invalidDirErr = &os.PathError{Op: "mkdir", Path: invalidDir, Err: fmt.Errorf("no such file or directory")} - - var invalidSourceFile = "IAmAnInvalidFile" - invalidSourceFilePath := filepath.Join(TestDir, invalidSourceFile) - var invalidSourceFileErr = &os.PathError{Op: "open", Path: invalidSourceFilePath, Err: fmt.Errorf("no such file or directory")} // - // fmt.Errorf("open %s: no such file or directory", ) - cases := map[string]struct { - reason string - fileDir string - fileName string - targetSchemaDir string - want error - }{ - "PrepareANormalParameterCueFile": { - reason: "Prepare a normal parameter cue file", - fileDir: TestDir, - fileName: "workload1.cue", - targetSchemaDir: targetSchemaDir, - want: nil, - }, - "CueFileNotContainParameter": { - reason: "Prepare a cue file which doesn't contain `parameter` section", - fileDir: TestDir, - fileName: noParameterCueName, - targetSchemaDir: targetSchemaDir, - want: err, - }, - "InvalidTargetSchemaDir": { - reason: "target schema directory is invalid", - fileDir: "", - fileName: "", - targetSchemaDir: invalidDir, - want: invalidDirErr, - }, - "InvalidSourceCueFile": { - reason: "source cue file is invalid", - fileDir: TestDir, - fileName: invalidSourceFile, - targetSchemaDir: TestDir, - want: invalidSourceFileErr, - }, - } - - for name, tc := range cases { - t.Run(name, func(t *testing.T) { - err := prepareParameterCue(tc.fileDir, tc.fileName, tc.targetSchemaDir) - if diff := cmp.Diff(tc.want, err, test.EquateErrors()); diff != "" { - t.Errorf("\n%s\nprepareParameterCue(...): -want error, +got error:\n%s", tc.reason, diff) - } - - }) - } - os.RemoveAll(targetSchemaDir) -} - -func TestAppendCueReference(t *testing.T) { - var cueStr = ` -#parameter: { - min: int -} -` - temporaryDir := filepath.Join(TestDir, "temp") - os.Mkdir(temporaryDir, 0750) - var cueFile = filepath.Join(temporaryDir, "workloadPureParameter.cue") - ioutil.WriteFile(cueFile, []byte(cueStr), 0750) - cases := map[string]struct { - reason string - cueFile string - want error - }{ - "AppendCueReference": { - reason: "Append Cue Reference", - cueFile: cueFile, - want: nil, - }, - } - - for name, tc := range cases { - t.Run(name, func(t *testing.T) { - err := appendCueReference(tc.cueFile) - if (err == nil && tc.want != nil) || (err != nil && tc.want == nil) { - t.Errorf("%s\nappendCueReference(...): -want %s, +got %s", tc.reason, tc.want, err) - } - data, err := ioutil.ReadFile(tc.cueFile) - if err != nil { - t.Errorf("%s\nappendCueReference(...): target file %s could not be read: %s", tc.reason, tc.cueFile, err) - } - if strings.HasSuffix(string(data), "context: {") { - t.Errorf("%s\nappendCueReference(...): target file %s doesn't contain `parameter` section", tc.reason, tc.cueFile) - } - }) - } - os.RemoveAll(temporaryDir) -} - -func TestFixOpenAPISchema(t *testing.T) { - cases := map[string]struct { - inputFile string - fixedFile string - }{ - "StandardWorkload": { - inputFile: "webservice.json", - fixedFile: "webserviceFixed.json", - }, - "ShortTagJson": { - inputFile: "shortTagSchema.json", - fixedFile: "shortTagSchemaFixed.json", - }, - } - - for name, tc := range cases { - t.Run(name, func(t *testing.T) { - swagger, _ := openapi3.NewSwaggerLoader().LoadSwaggerFromFile(filepath.Join(TestDir, tc.inputFile)) - schema := swagger.Components.Schemas["parameter"].Value - fixOpenAPISchema("", schema) - fixedSchema, _ := schema.MarshalJSON() - expectedSchema, _ := ioutil.ReadFile(filepath.Join(TestDir, tc.fixedFile)) - assert.Equal(t, fixedSchema, expectedSchema) - }) - } -} - -func TestGetParameterItemName(t *testing.T) { - got, err := getParameterItemName(" \"cmd\": {\n") - name := "cmd" - assert.NoError(t, err) - assert.Equal(t, name, got) -} - -func TestGetParameterFromOpenAPISchema(t *testing.T) { - cases := map[string]struct { - reason string - fileDir string - fileName string - targetFile string - want error - }{ - "GetParameterFromOpenAPISchema": { - reason: "get parameter from OpenAPI schema", - fileDir: TestDir, - fileName: "normalOpenAPISchemaFixed.json", - targetFile: "normalOpenAPISchemaParameter.json", - want: nil, - }, - } - - for name, tc := range cases { - t.Run(name, func(t *testing.T) { - rawFile := filepath.Join(tc.fileDir, tc.fileName) - raw, err := ioutil.ReadFile(rawFile) - if err != nil { - t.Errorf("%s\ngetParameterFromOpenAPISchema(...): raw file %s could not be read: %s", tc.reason, rawFile, err) - } - got, err := getParameterFromOpenAPISchema(raw) - if (err == nil && tc.want != nil) || (err != nil && tc.want == nil) { - t.Errorf("%s\ngetParameterFromOpenAPISchema(...): -want %s, +got %s", tc.reason, tc.want, err) - } - targetFile := filepath.Join(tc.fileDir, tc.targetFile) - expect, err := ioutil.ReadFile(targetFile) - if err != nil { - t.Errorf("%s\ngetParameterFromOpenAPISchema(...): target file %s could not be read: %s", tc.reason, targetFile, err) - } - if strings.Compare(string(got), string(expect)) != 0 { - t.Errorf("%s\ngetParameterFromOpenAPISchema(...): pure parameter schema %s isn't retrieved", tc.reason, targetFile) - } - }) - } -} diff --git a/references/plugins/cluster.go b/references/plugins/cluster.go index 4d8a22e21..e1dbad075 100644 --- a/references/plugins/cluster.go +++ b/references/plugins/cluster.go @@ -163,7 +163,7 @@ func GetDescription(annotation map[string]string) string { // HandleTemplate will handle definition template to capability func HandleTemplate(in *runtime.RawExtension, schematic *corev1alpha2.Schematic, name, syncDir string) (types.Capability, error) { - tmp, err := util.ConvertTemplateJSON2Object(in, schematic) + tmp, err := util.ConvertTemplateJSON2Object(name, in, schematic) if err != nil { return types.Capability{}, err }