├── .gitignore ├── README.md ├── crossplane-configuration-development-with-poker ├── kuttl-test.yaml ├── package │ ├── playerhand │ │ ├── composition.yaml │ │ └── definition.yaml │ ├── theflop │ │ ├── composition.yaml │ │ └── definition.yaml │ ├── theriver │ │ ├── composition.yaml │ │ └── definition.yaml │ └── theturn │ │ ├── composition.yaml │ │ └── definition.yaml └── tests │ ├── init.yaml │ ├── playerhand │ ├── 00-assert.yaml │ └── 00-playerhand.yaml │ ├── theflop │ ├── 00-assert.yaml │ └── 00-theflop.yaml │ ├── theriver │ ├── 00-assert.yaml │ └── 00-theriver.yaml │ ├── theturn │ ├── 00-assert.yaml │ └── 00-theturn.yaml │ └── uxp-values.yaml ├── crossplane-package-tdd-with-skaffold ├── examples │ └── network.yaml ├── kuttl-test.yaml ├── package │ ├── crossplane.yaml │ └── network │ │ ├── composition.yaml │ │ └── definition.yaml ├── skaffold.yaml └── tests │ ├── compositions │ └── compositenetwork │ │ ├── 01-assert.yaml │ │ └── 01-network.yaml │ └── uxp-values.yaml ├── crossplane-package-testing-with-kuttl ├── examples │ └── network.yaml ├── kuttl-test.yaml ├── package │ ├── crossplane.yaml │ └── network │ │ ├── composition.yaml │ │ └── definition.yaml └── tests │ ├── compositions │ └── compositenetwork │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ └── 01-network.yaml │ ├── init │ └── providerConfig.yaml │ └── uxp-values.yaml └── crossplane-package-testing-with-sonobuoy ├── plugin ├── Dockerfile ├── README.md ├── build.sh ├── go.mod ├── go.sum ├── pkg │ ├── main_test.go │ └── platform_ref_aws_test.go └── plugin.yaml └── uxp-values.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | kind-logs-* 2 | kubeconfig 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # A Tour of Crossplane 2 | 3 | Examples for articles posted at https://aaroneaton.com/crossplane -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/kuttl-test.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestSuite 3 | commands: 4 | # Install Univerasal Crossplane (uxp). 5 | - command: helm install universal-crossplane https://charts.upbound.io/stable/universal-crossplane-1.6.3-up.1.tgz --namespace upbound-system --wait --create-namespace --values tests/uxp-values.yaml 6 | # Wait for provider-cards to become healthy. 7 | - command: kubectl wait --for condition=healthy --timeout=300s provider/aaroneaton-provider-cards 8 | # Set up a table for play 9 | - command: kubectl apply -f "${PWD}/tests/init.yaml" 10 | testDirs: 11 | - tests/ 12 | kindContext: kuttl-test 13 | startKIND: true -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/package/playerhand/composition.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.crossplane.io/v1 2 | kind: Composition 3 | metadata: 4 | name: poker-composition 5 | spec: 6 | writeConnectionSecretsToNamespace: upbound-system 7 | compositeTypeRef: 8 | apiVersion: cardgames.aaroneaton.com/v1alpha1 9 | kind: PlayerHand 10 | resources: 11 | - base: 12 | apiVersion: providercards.aaroneaton.com/v1alpha1 13 | kind: Card 14 | metadata: 15 | name: playerone-01 16 | spec: 17 | forProvider: {} 18 | providerConfigRef: 19 | name: tour 20 | connectionDetails: 21 | - type: FromFieldPath 22 | name: "01" 23 | fromFieldPath: status.atProvider.face 24 | patches: 25 | - fromFieldPath: spec.playerName 26 | transforms: 27 | - type: string 28 | string: 29 | fmt: "%s-01" 30 | toFieldPath: metadata.name 31 | - fromFieldPath: spec.tableName 32 | toFieldPath: spec.providerConfigRef.name 33 | - base: 34 | apiVersion: providercards.aaroneaton.com/v1alpha1 35 | kind: Card 36 | spec: 37 | forProvider: {} 38 | connectionDetails: 39 | - type: FromFieldPath 40 | name: "02" 41 | fromFieldPath: status.atProvider.face 42 | patches: 43 | - fromFieldPath: spec.playerName 44 | transforms: 45 | - type: string 46 | string: 47 | fmt: "%s-02" 48 | toFieldPath: metadata.name 49 | - fromFieldPath: spec.tableName 50 | toFieldPath: spec.providerConfigRef.name 51 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/package/playerhand/definition.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.crossplane.io/v1 2 | kind: CompositeResourceDefinition 3 | metadata: 4 | name: playerhands.cardgames.aaroneaton.com 5 | spec: 6 | claimNames: 7 | kind: DealMeIn 8 | plural: dealmeins 9 | group: cardgames.aaroneaton.com 10 | names: 11 | kind: PlayerHand 12 | plural: playerhands 13 | connectionSecretKeys: 14 | - "01" 15 | - "02" 16 | versions: 17 | - name: v1alpha1 18 | served: true 19 | referenceable: true 20 | schema: 21 | openAPIV3Schema: 22 | type: object 23 | properties: 24 | spec: 25 | type: object 26 | properties: 27 | playerName: 28 | type: string 29 | description: Name of Player holding this Hand 30 | tableName: 31 | type: string 32 | description: Name of Table for this Hand 33 | required: 34 | - playerName 35 | - tableName 36 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/package/theflop/composition.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.crossplane.io/v1 2 | kind: Composition 3 | metadata: 4 | name: theflop-composition 5 | spec: 6 | writeConnectionSecretsToNamespace: upbound-system 7 | compositeTypeRef: 8 | apiVersion: cardgames.aaroneaton.com/v1alpha1 9 | kind: TheFlop 10 | resources: 11 | - base: 12 | apiVersion: providercards.aaroneaton.com/v1alpha1 13 | kind: Card 14 | spec: 15 | forProvider: {} 16 | # this burned card is _not_ added to the connectionSecrets 17 | patches: 18 | - fromFieldPath: spec.tableName 19 | transforms: 20 | - type: string 21 | string: 22 | fmt: "%s-flop-burn" 23 | toFieldPath: metadata.name 24 | - fromFieldPath: spec.tableName 25 | toFieldPath: spec.providerConfigRef.name 26 | - base: 27 | apiVersion: providercards.aaroneaton.com/v1alpha1 28 | kind: Card 29 | spec: 30 | forProvider: {} 31 | connectionDetails: 32 | - type: FromFieldPath 33 | name: "01" 34 | fromFieldPath: status.atProvider.face 35 | patches: 36 | - fromFieldPath: spec.tableName 37 | transforms: 38 | - type: string 39 | string: 40 | fmt: "%s-flop-01" 41 | toFieldPath: metadata.name 42 | - fromFieldPath: spec.tableName 43 | toFieldPath: spec.providerConfigRef.name 44 | - base: 45 | apiVersion: providercards.aaroneaton.com/v1alpha1 46 | kind: Card 47 | spec: 48 | forProvider: {} 49 | connectionDetails: 50 | - type: FromFieldPath 51 | name: "02" 52 | fromFieldPath: status.atProvider.face 53 | patches: 54 | - fromFieldPath: spec.tableName 55 | transforms: 56 | - type: string 57 | string: 58 | fmt: "%s-flop-02" 59 | toFieldPath: metadata.name 60 | - fromFieldPath: spec.tableName 61 | toFieldPath: spec.providerConfigRef.name 62 | - base: 63 | apiVersion: providercards.aaroneaton.com/v1alpha1 64 | kind: Card 65 | spec: 66 | forProvider: {} 67 | connectionDetails: 68 | - type: FromFieldPath 69 | name: "03" 70 | fromFieldPath: status.atProvider.face 71 | patches: 72 | - fromFieldPath: spec.tableName 73 | transforms: 74 | - type: string 75 | string: 76 | fmt: "%s-flop-03" 77 | toFieldPath: metadata.name 78 | - fromFieldPath: spec.tableName 79 | toFieldPath: spec.providerConfigRef.name 80 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/package/theflop/definition.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.crossplane.io/v1 2 | kind: CompositeResourceDefinition 3 | metadata: 4 | name: theflops.cardgames.aaroneaton.com 5 | spec: 6 | claimNames: 7 | kind: DealTheFlop 8 | plural: dealtheflops 9 | group: cardgames.aaroneaton.com 10 | names: 11 | kind: TheFlop 12 | plural: theflops 13 | connectionSecretKeys: 14 | - "01" 15 | - "02" 16 | - "03" 17 | versions: 18 | - name: v1alpha1 19 | served: true 20 | referenceable: true 21 | schema: 22 | openAPIV3Schema: 23 | type: object 24 | properties: 25 | spec: 26 | type: object 27 | properties: 28 | tableName: 29 | type: string 30 | description: Name of Table for this Flop 31 | required: 32 | - tableName 33 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/package/theriver/composition.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.crossplane.io/v1 2 | kind: Composition 3 | metadata: 4 | name: theriver-composition 5 | spec: 6 | writeConnectionSecretsToNamespace: upbound-system 7 | compositeTypeRef: 8 | apiVersion: cardgames.aaroneaton.com/v1alpha1 9 | kind: TheRiver 10 | resources: 11 | - base: 12 | apiVersion: providercards.aaroneaton.com/v1alpha1 13 | kind: Card 14 | spec: 15 | forProvider: {} 16 | # this burned card is _not_ added to the connectionSecrets 17 | patches: 18 | - fromFieldPath: spec.tableName 19 | transforms: 20 | - type: string 21 | string: 22 | fmt: "%s-river-burn" 23 | toFieldPath: metadata.name 24 | - fromFieldPath: spec.tableName 25 | toFieldPath: spec.providerConfigRef.name 26 | - base: 27 | apiVersion: providercards.aaroneaton.com/v1alpha1 28 | kind: Card 29 | spec: 30 | forProvider: {} 31 | connectionDetails: 32 | - type: FromFieldPath 33 | name: "01" 34 | fromFieldPath: status.atProvider.face 35 | patches: 36 | - fromFieldPath: spec.tableName 37 | transforms: 38 | - type: string 39 | string: 40 | fmt: "%s-river-01" 41 | toFieldPath: metadata.name 42 | - fromFieldPath: spec.tableName 43 | toFieldPath: spec.providerConfigRef.name 44 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/package/theriver/definition.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.crossplane.io/v1 2 | kind: CompositeResourceDefinition 3 | metadata: 4 | name: therivers.cardgames.aaroneaton.com 5 | spec: 6 | claimNames: 7 | kind: DealTheRiver 8 | plural: dealtherivers 9 | group: cardgames.aaroneaton.com 10 | names: 11 | kind: TheRiver 12 | plural: therivers 13 | connectionSecretKeys: 14 | - "01" 15 | versions: 16 | - name: v1alpha1 17 | served: true 18 | referenceable: true 19 | schema: 20 | openAPIV3Schema: 21 | type: object 22 | properties: 23 | spec: 24 | type: object 25 | properties: 26 | tableName: 27 | type: string 28 | description: Name of Table for this River 29 | required: 30 | - tableName 31 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/package/theturn/composition.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.crossplane.io/v1 2 | kind: Composition 3 | metadata: 4 | name: theturn-composition 5 | spec: 6 | writeConnectionSecretsToNamespace: upbound-system 7 | compositeTypeRef: 8 | apiVersion: cardgames.aaroneaton.com/v1alpha1 9 | kind: TheTurn 10 | resources: 11 | - base: 12 | apiVersion: providercards.aaroneaton.com/v1alpha1 13 | kind: Card 14 | spec: 15 | forProvider: {} 16 | # this burned card is _not_ added to the connectionSecrets 17 | patches: 18 | - fromFieldPath: spec.tableName 19 | transforms: 20 | - type: string 21 | string: 22 | fmt: "%s-turn-burn" 23 | toFieldPath: metadata.name 24 | - fromFieldPath: spec.tableName 25 | toFieldPath: spec.providerConfigRef.name 26 | - base: 27 | apiVersion: providercards.aaroneaton.com/v1alpha1 28 | kind: Card 29 | spec: 30 | forProvider: {} 31 | connectionDetails: 32 | - type: FromFieldPath 33 | name: "01" 34 | fromFieldPath: status.atProvider.face 35 | patches: 36 | - fromFieldPath: spec.tableName 37 | transforms: 38 | - type: string 39 | string: 40 | fmt: "%s-turn-01" 41 | toFieldPath: metadata.name 42 | - fromFieldPath: spec.tableName 43 | toFieldPath: spec.providerConfigRef.name 44 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/package/theturn/definition.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.crossplane.io/v1 2 | kind: CompositeResourceDefinition 3 | metadata: 4 | name: theturns.cardgames.aaroneaton.com 5 | spec: 6 | claimNames: 7 | kind: DealTheTurn 8 | plural: dealtheturns 9 | group: cardgames.aaroneaton.com 10 | names: 11 | kind: TheTurn 12 | plural: theturns 13 | connectionSecretKeys: 14 | - "01" 15 | versions: 16 | - name: v1alpha1 17 | served: true 18 | referenceable: true 19 | schema: 20 | openAPIV3Schema: 21 | type: object 22 | properties: 23 | spec: 24 | type: object 25 | properties: 26 | tableName: 27 | type: string 28 | description: Name of Table for this Turn 29 | required: 30 | - tableName 31 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/tests/init.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: Secret 4 | metadata: 5 | namespace: upbound-system 6 | name: tour 7 | type: Opaque 8 | stringData: 9 | credentials: | 10 | { "seed": 1 } 11 | --- 12 | apiVersion: providercards.aaroneaton.com/v1alpha1 13 | kind: ProviderConfig 14 | metadata: 15 | name: tour 16 | spec: 17 | credentials: 18 | source: Secret 19 | secretRef: 20 | namespace: upbound-system 21 | name: tour 22 | key: credentials 23 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/tests/playerhand/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestAssert 3 | timeout: 30 4 | 5 | --- 6 | apiVersion: providercards.aaroneaton.com/v1alpha1 7 | kind: Card 8 | metadata: 9 | name: playerone-01 10 | spec: 11 | forProvider: {} 12 | providerConfigRef: 13 | name: tour 14 | 15 | --- 16 | apiVersion: providercards.aaroneaton.com/v1alpha1 17 | kind: Card 18 | metadata: 19 | name: playerone-02 20 | spec: 21 | forProvider: {} 22 | providerConfigRef: 23 | name: tour 24 | 25 | --- 26 | apiVersion: v1 27 | kind: Secret 28 | metadata: 29 | name: my-cards 30 | type: connection.crossplane.io/v1alpha1 31 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/tests/playerhand/00-playerhand.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | # Install XRDs 5 | - command: kubectl apply -f "${PWD}/package/playerhand/" 6 | # Wait for XRD to become "established" 7 | - command: kubectl wait --for condition=established --timeout=20s xrd/playerhands.cardgames.aaroneaton.com 8 | --- 9 | apiVersion: cardgames.aaroneaton.com/v1alpha1 10 | kind: DealMeIn 11 | metadata: 12 | name: my-hand 13 | spec: 14 | playerName: playerone 15 | tableName: tour 16 | writeConnectionSecretToRef: 17 | name: my-cards 18 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/tests/theflop/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestAssert 3 | timeout: 30 4 | 5 | --- 6 | apiVersion: providercards.aaroneaton.com/v1alpha1 7 | kind: Card 8 | metadata: 9 | name: tour-flop-burn 10 | spec: 11 | forProvider: {} 12 | providerConfigRef: 13 | name: tour 14 | 15 | --- 16 | apiVersion: providercards.aaroneaton.com/v1alpha1 17 | kind: Card 18 | metadata: 19 | name: tour-flop-01 20 | spec: 21 | forProvider: {} 22 | providerConfigRef: 23 | name: tour 24 | 25 | --- 26 | apiVersion: providercards.aaroneaton.com/v1alpha1 27 | kind: Card 28 | metadata: 29 | name: tour-flop-02 30 | spec: 31 | forProvider: {} 32 | providerConfigRef: 33 | name: tour 34 | 35 | --- 36 | apiVersion: providercards.aaroneaton.com/v1alpha1 37 | kind: Card 38 | metadata: 39 | name: tour-flop-03 40 | spec: 41 | forProvider: {} 42 | providerConfigRef: 43 | name: tour 44 | 45 | --- 46 | apiVersion: v1 47 | kind: Secret 48 | metadata: 49 | name: flop-cards 50 | type: connection.crossplane.io/v1alpha1 51 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/tests/theflop/00-theflop.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | # Install XRDs 5 | - command: kubectl apply -f "${PWD}/package/theflop/" 6 | # Wait for XRD to become "established" 7 | - command: kubectl wait --for condition=established --timeout=20s xrd/theflops.cardgames.aaroneaton.com 8 | --- 9 | apiVersion: cardgames.aaroneaton.com/v1alpha1 10 | kind: DealTheFlop 11 | metadata: 12 | name: tour 13 | spec: 14 | tableName: tour 15 | writeConnectionSecretToRef: 16 | name: flop-cards 17 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/tests/theriver/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestAssert 3 | timeout: 30 4 | 5 | --- 6 | apiVersion: providercards.aaroneaton.com/v1alpha1 7 | kind: Card 8 | metadata: 9 | name: tour-river-burn 10 | spec: 11 | forProvider: {} 12 | providerConfigRef: 13 | name: tour 14 | 15 | --- 16 | apiVersion: providercards.aaroneaton.com/v1alpha1 17 | kind: Card 18 | metadata: 19 | name: tour-river-01 20 | spec: 21 | forProvider: {} 22 | providerConfigRef: 23 | name: tour 24 | 25 | --- 26 | apiVersion: v1 27 | kind: Secret 28 | metadata: 29 | name: river-cards 30 | type: connection.crossplane.io/v1alpha1 31 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/tests/theriver/00-theriver.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | # Install XRDs 5 | - command: kubectl apply -f "${PWD}/package/theriver/" 6 | # Wait for XRD to become "established" 7 | - command: kubectl wait --for condition=established --timeout=20s xrd/therivers.cardgames.aaroneaton.com 8 | --- 9 | apiVersion: cardgames.aaroneaton.com/v1alpha1 10 | kind: DealTheRiver 11 | metadata: 12 | name: tour 13 | spec: 14 | tableName: tour 15 | writeConnectionSecretToRef: 16 | name: river-cards 17 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/tests/theturn/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestAssert 3 | timeout: 30 4 | 5 | --- 6 | apiVersion: providercards.aaroneaton.com/v1alpha1 7 | kind: Card 8 | metadata: 9 | name: tour-turn-burn 10 | spec: 11 | forProvider: {} 12 | providerConfigRef: 13 | name: tour 14 | 15 | --- 16 | apiVersion: providercards.aaroneaton.com/v1alpha1 17 | kind: Card 18 | metadata: 19 | name: tour-turn-01 20 | spec: 21 | forProvider: {} 22 | providerConfigRef: 23 | name: tour 24 | 25 | --- 26 | apiVersion: v1 27 | kind: Secret 28 | metadata: 29 | name: turn-cards 30 | type: connection.crossplane.io/v1alpha1 31 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/tests/theturn/00-theturn.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | # Install XRDs 5 | - command: kubectl apply -f "${PWD}/package/theturn/" 6 | # Wait for XRD to become "established" 7 | - command: kubectl wait --for condition=established --timeout=20s xrd/theturns.cardgames.aaroneaton.com 8 | --- 9 | apiVersion: cardgames.aaroneaton.com/v1alpha1 10 | kind: DealTheTurn 11 | metadata: 12 | name: tour 13 | spec: 14 | tableName: tour 15 | writeConnectionSecretToRef: 16 | name: turn-cards 17 | -------------------------------------------------------------------------------- /crossplane-configuration-development-with-poker/tests/uxp-values.yaml: -------------------------------------------------------------------------------- 1 | provider: 2 | packages: 3 | - registry.upbound.io/aaroneaton/provider-cards:v0.0.1 4 | args: 5 | - '-d' -------------------------------------------------------------------------------- /crossplane-package-tdd-with-skaffold/examples/network.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: aws.platformref.crossplane.io/v1alpha1 2 | kind: Network 3 | metadata: 4 | name: network 5 | spec: 6 | id: platform-ref-aws-network 7 | clusterRef: 8 | id: platform-ref-aws-cluster 9 | -------------------------------------------------------------------------------- /crossplane-package-tdd-with-skaffold/kuttl-test.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestSuite 3 | startKIND: false 4 | testDirs: 5 | - tests/compositions 6 | kindContext: kuttl-test 7 | skipClusterDelete: true 8 | -------------------------------------------------------------------------------- /crossplane-package-tdd-with-skaffold/package/crossplane.yaml: -------------------------------------------------------------------------------- 1 | # https://github.com/upbound/platform-ref-aws/blob/main/crossplane.yaml 2 | 3 | apiVersion: meta.pkg.crossplane.io/v1alpha1 4 | kind: Configuration 5 | metadata: 6 | name: platform-ref-aws 7 | annotations: 8 | meta.crossplane.io/maintainer: Jared Watts 9 | meta.crossplane.io/source: github.com/upbound/platform-ref-aws 10 | meta.crossplane.io/license: Apache-2.0 11 | meta.crossplane.io/description: | 12 | This reference platform Configuration for Kubernetes and Data Services 13 | is a starting point to build, run, and operate your own internal cloud 14 | platform and offer a self-service console and API to your internal teams. 15 | 16 | meta.crossplane.io/readme: | 17 | This reference platform `Configuration` for Kubernetes and Data Services 18 | is a starting point to build, run, and operate your own internal cloud 19 | platform and offer a self-service console and API to your internal teams. 20 | It provides platform APIs to provision fully configured EKS clusters, 21 | with secure networking, and stateful cloud services (RDS) designed to 22 | securely connect to the nodes in each EKS cluster -- all composed using 23 | cloud service primitives from the [Crossplane AWS 24 | Provider](https://doc.crds.dev/github.com/crossplane/provider-aws). App 25 | deployments can securely connect to the infrastructure they need using 26 | secrets distributed directly to the app namespace. 27 | 28 | [Quickstart 29 | Guide](https://github.com/upbound/platform-ref-aws/#quick-start) 30 | 31 | [APIs in this 32 | Configuration](https://github.com/upbound/platform-ref-aws/#apis-in-this-configuration) 33 | 34 | To learn more checkout the [GitHub 35 | repo](https://github.com/upbound/platform-ref-aws/) that you can copy and 36 | customize to meet the exact needs of your organization! 37 | 38 | meta.crossplane.io/iconURI: data:image/svg+xml;base64,CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNjUiIGhlaWdodD0iNjUiPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PHJlY3Qgd2lkdGg9IjY1IiBoZWlnaHQ9IjY1IiBmaWxsPSIjMjMyRjNFIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHJ4PSIxNiIvPjxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik0yMy4yNDYzNjU2IDI5Ljk2ODk5N2MwIC41NjQxODQ0LjA1NjQyNDYgMS4wMjE2MzEyLjE1NTE2NzYgMS4zNTcwOTIyLjExMjg0OTIuMzM1NDYxLjI1MzkxMDcuNzAxNDE4NC40NTEzOTY4IDEuMDk3ODcyMy4wNzA1MzA4LjEyMTk4NTguMDk4NzQzMS4yNDM5NzE2LjA5ODc0MzEuMzUwNzA5MiAwIC4xNTI0ODIzLS4wODQ2MzY5LjMwNDk2NDYtLjI2ODAxNjkuNDU3NDQ2OGwtLjg4ODY4NzUuNjQwNDI1NmMtLjEyNjk1NTMuMDkxNDg5My0uMjU0MDUxNy4xMzcyMzQtLjM2Njc1OTkuMTM3MjM0LS4xNDEwNjE1IDAtLjI4MjEyMy0uMDc2MjQxMS0uNDIzMTg0NS0uMjEzNDc1Mi0uMTk3NDg2MS0uMjI4NzIzNC0uMzY2NzU5OS0uNDcyNjk1LS41MDc4MjE0LS43MTY2NjY2LS4xNDEwNjE1LS4yNTkyMTk5LS4yODIxMjMtLjU0ODkzNjItLjQzNzI5MDYtLjg5OTY0NTQtMS4xMDA0MjA3OCAxLjQwMjgzNjgtMi40ODI2ODI0MiAyLjEwNDI1NTMtNC4xNDcyMDgxMyAyLjEwNDI1NTMtMS4xODQ5MTY2MSAwLTIuMTMwMDI4NjYtLjM2NTk1NzUtMi44MjEyMzAwMi0xLjA5Nzg3MjQtLjY5MTIwMTM1LS43MzE5MTQ4LTEuMDQzODU1MS0xLjcwNzgwMTQtMS4wNDM4NTUxLTIuOTI3NjU5NSAwLTEuMjk2MDk5MzIuNDIzMDQzNDQtMi4zNDgyMjY5OCAxLjI4MzY1OTY1LTMuMTQxMTM0NzguODYwNDc1MTYtLjc5MjkwNzggMi4wMDMwNzMzMS0xLjE4OTM2MTcgMy40NTYwMDY3Ny0xLjE4OTM2MTcuNDc5NDY4MDQgMCAuOTczMzI0MzYuMDQ1NzQ0NjggMS40OTUyNTE5MS4xMjE5ODU4MS41MjE5Mjc1NS4wNzYyNDExNCAxLjA1Nzk2MTI2LjE5ODIyNjk1IDEuNjIyMjA3MjYuMzM1NDYxdi0xLjExMzEyMDU3YzAtMS4xNTg4NjUyNS0uMjI1Njk4NC0xLjk2NzAyMTI4LS42NjI5ODkwNS0yLjQzOTcxNjMxLS40NTEzOTY4MS0uNDcyNjk1MDQtMS4yMTMxMjg5MS0uNzAxNDE4NDQtMi4yOTkzMDI0Ny0uNzAxNDE4NDQtLjQ5MzcxNTI1IDAtMS4wMDE1MzY2NS4wNjA5OTI5MS0xLjUyMzQ2NDIuMTk4MjI2OTUtLjUyMTkyNzU2LjEzNzIzNDA0LTEuMDI5NzQ4OTYuMzA0OTY0NTQtMS41MjM0NjQyMS41MTg0Mzk3MS0uMjI1Njk4NC4xMDY3Mzc1OS0uMzk0OTcyMi4xNjc3MzA1LS40OTM3MTUyNi4xOTgyMjY5Ni0uMDk4NzQzMDUuMDMwNDk2NDUtLjE2OTI3MzguMDQ1NzQ0NjgtLjIyNTgzOTQ2LjA0NTc0NDY4LS4xOTczNDUwNCAwLS4yOTYwODgwOS0uMTUyNDgyMjctLjI5NjA4ODA5LS40NzI2OTUwNHYtLjc0NzE2MzEyYzAtLjI0Mzk3MTYzLjAyODIxMjMtLjQyNjk1MDM1LjA5ODc0MzA1LS41MzM2ODc5NHMuMTk3MzQ1MDQtLjIxMzQ3NTE4LjM5NDk3MjItLjMyMDIxMjc3Yy40OTM1NzQyLS4yNzQ0NjgwOCAxLjA4NjE3MzU2LS41MDMxOTE0OSAxLjc3NzM3NDkxLS42ODYxNzAyMS42OTEyMDEzNi0uMTk4MjI2OTUgMS40MjQ3MjExNi0uMjg5NzE2MzEgMi4yMDA1NTk0Mi0uMjg5NzE2MzEgMS42Nzg2MzE4NSAwIDIuOTA1ODY2OTIuNDExNzAyMTIgMy42OTU4MTEzMiAxLjIzNTEwNjM4Ljc3NTgzODIuODIzNDA0MjUgMS4xNzA4MTA1IDIuMDczNzU4ODYgMS4xNzA4MTA1IDMuNzUxMDYzODNWMjkuOTY4OTk3aC4wMjgyMTIzem0tNS43MjcwOTY5OCAyLjMxNzczMDVjLjQ2NTUwMjk1IDAgLjk0NDk3MDk5LS4wOTE0ODk0IDEuNDUyOTMzNDYtLjI3NDQ2ODEuNTA3ODIxNC0uMTgyOTc4OC45NTkyMTgyLS41MTg0Mzk3IDEuMzQwMDg0MjYtLjk3NTg4NjYuMjI1Njk4NC0uMjg5NzE2My4zOTQ4MzExNC0uNjA5OTI5LjQ3OTYwOTEtLjk3NTg4NjUuMDg0NjM2OS0uMzY1OTU3NC4xNDEwNjE1LS44MDgxNTYwMS4xNDEwNjE1LTEuMzI2NTk1NzJ2LS42NDA0MjU1M2MtLjQwOTA3ODM1LS4xMDY3Mzc1OS0uODQ2MzY5MDEtLjE5ODIyNjk1LTEuMjk3NzY1ODEtLjI1OTIxOTg2LS40NTEzOTY4LS4wNjA5OTI5MS0uODg4Njg3NDUtLjA5MTQ4OTM2LTEuMzI1OTc4MS0uMDkxNDg5MzYtLjk0NTExMjA2IDAtMS42MzYzMTM0MS4xOTgyMjY5NS0yLjEwMTgxNjM3LjYwOTkyOTA3LS40NjU1MDI5NS40MTE3MDIxMy0uNjkxMjAxMzUuOTkxMTM0NzYtLjY5MTIwMTM1IDEuNzUzNTQ2MSAwIC43MTY2NjY3LjE2OTI3MzggMS4yNTAzNTQ2LjUyMTkyNzU1IDEuNjE2MzEyMS4zMzg1NDc2MS4zODEyMDU2LjgzMjI2Mjg2LjU2NDE4NDQgMS40ODExNDU3Ni41NjQxODQ0ek0yOC44NDY1MDcxIDMzLjkzMzUzNmMtLjI1MzkxMDcgMC0uNDIzMTg0NS0uMDQ1NzQ0Ny0uNTM2MDMzNy0uMTUyNDgyMy0uMTEyODQ5Mi0uMDkxNDg5NC0uMjExNTkyMi0uMzA0OTY0NS0uMjk2MjI5MS0uNTk0NjgwOUwyNC42OTkyOTkgMjEuMzk5NDkzNDFjLS4wODQ3NzgtLjMwNDk2NDUzLS4xMjY5NTUzLS41MDMxOTE0OC0uMTI2OTU1My0uNjA5OTI5MDcgMC0uMjQzOTcxNjMuMTEyNzA4MS0uMzgxMjA1NjguMzM4NTQ3Ni0uMzgxMjA1NjhoMS4zODI0MDI3Yy4yNjc4NzU4IDAgLjQ1MTM5NjguMDQ1NzQ0NjguNTUwMTM5OC4xNTI0ODIyNy4xMTI4NDkyLjA5MTQ4OTM2LjE5NzQ4NjEuMzA0OTY0NTQuMjgyMTIzLjU5NDY4MDg1TDI5LjQ5NTM5IDMxLjI0OTg0OGwyLjIwMDQxODQtMTAuMDk0MzI2MjJjLjA3MDY3MTgtLjMwNDk2NDU0LjE1NTE2NzYtLjUwMzE5MTQ5LjI2ODE1NzktLjU5NDY4MDg1LjExMjg0OTItLjA5MTQ4OTM2LjMxMDE5NDItLjE1MjQ4MjI3LjU2NDI0Ni0uMTUyNDgyMjdoMS4xMjg0OTJjLjI2Nzg3NTggMCAuNDUxMzk2OC4wNDU3NDQ2OC41NjQyNDYuMTUyNDgyMjcuMTEyODQ5Mi4wOTE0ODkzNi4yMTE1OTIzLjMwNDk2NDU0LjI2ODAxNjkuNTk0NjgwODVsMi4yMjg2MzA2IDEwLjIxNjMxMjAyIDIuNDQwNTA1LTEwLjIxNjMxMjAyYy4wODQ2MzY5LS4zMDQ5NjQ1NC4xODMzOC0uNTAzMTkxNDkuMjgyMTIzLS41OTQ2ODA4NS4xMTI4NDkyLS4wOTE0ODkzNi4yOTYyMjkyLS4xNTI0ODIyNy41NTAxMzk5LS4xNTI0ODIyN2gxLjMxMTg3MTljLjIyNTY5ODQgMCAuMzUyNjUzOC4xMjE5ODU4Mi4zNTI2NTM4LjM4MTIwNTY4IDAgLjA3NjI0MTEzLS4wMTQxMDYyLjE1MjQ4MjI3LS4wMjgyMTIzLjI0Mzk3MTYzLS4wMTQyNDcyLjA5MTQ4OTM2LS4wNDIzMTg1LjIxMzQ3NTE3LS4wOTg3NDMxLjM4MTIwNTY3TDM4LjEyODM1MzkgMzMuMjAxNjIxMWMtLjA4NDc3OC4zMDQ5NjQ1LS4xODM1MjEuNTAzMTkxNS0uMjk2MzcwMi41OTQ2ODA4LS4xMTI3MDgyLjA5MTQ4OTQtLjI5NjA4ODEuMTUyNDgyMy0uNTM1ODkyNy4xNTI0ODIzaC0xLjIxMzI2OTljLS4yNjc4NzU4IDAtLjQ1MTI1NTgtLjA0NTc0NDctLjU2NDI0Ni0uMTUyNDgyMy0uMTEyODQ5Mi0uMTA2NzM3Ni0uMjExNTkyMy0uMzA0OTY0NS0uMjY3ODc1OC0uNjA5OTI5MWwtMi4xODY0NTMzLTkuODM1MTA2MzQtMi4xNzIzNDcxIDkuODE5ODU4MTRjLS4wNzA2NzE4LjMwNDk2NDYtLjE1NTE2NzcuNTAzMTkxNS0uMjY4MDE2OS42MDk5MjkxLS4xMTI4NDkyLjEwNjczNzYtLjMxMDMzNTMuMTUyNDgyMy0uNTY0MjQ2LjE1MjQ4MjNoLTEuMjEzMTI4OXptMTguMTI2NDAyOS40MTE3MDIxYy0uNzMzNTE5OCAwLTEuNDY3MDM5Ni0uMDkxNDg5NC0yLjE3MjM0NzEtLjI3NDQ2ODFzLTEuMjU1NDQ3NC0uMzgxMjA1Ny0xLjYyMjIwNzMtLjYwOTkyOTFjLS4yMjU2OTg0LS4xMzcyMzQtLjM4MTAwNzEtLjI4OTcxNjMtLjQzNzI5MDYtLjQyNjk1MDMtLjA1NjQyNDYtLjEzNzIzNDEtLjA4NDYzNjktLjI4OTcxNjMtLjA4NDYzNjktLjQyNjk1MDR2LS43Nzc2NTk2YzAtLjMyMDIxMjcuMTEyODQ5Mi0uNDcyNjk1LjMyNDQ0MTQtLjQ3MjY5NS4wODQ2MzY5IDAgLjE2OTEzMjcuMDE1MjQ4Mi4yNTM3Njk2LjA0NTc0NDcuMDg0Nzc4LjAzMDQ5NjQuMjExNTkyMy4wOTE0ODk0LjM1Mjc5NDkuMTUyNDgyMy40Nzk0NjguMjI4NzIzNCAxLjAwMTUzNjYuNDExNzAyMSAxLjU1MTUzNTQuNTMzNjg3OS41NjQzODcxLjEyMTk4NTggMS4xMTQzODU5LjE4Mjk3ODcgMS42Nzg3NzI5LjE4Mjk3ODcuODg4Njg3NSAwIDEuNTc5ODg4OC0uMTY3NzMwNSAyLjA1OTM1NjktLjUwMzE5MTUuNDc5NzUwMS0uMzM1NDYxLjczMzY2MDgtLjgyMzQwNDIuNzMzNjYwOC0xLjQ0ODU4MTUgMC0uNDI2OTUwNC0uMTI2OTU1My0uNzc3NjU5Ni0uMzgxMDA3MS0xLjA2NzM3NTkxLS4yNTM3Njk2LS4yODk3MTYzMS0uNzMzMzc4Ny0uNTQ4OTM2MTctMS40MjQ3MjExLS43OTI5MDc4bC0yLjA0NTI1MDctLjY4NjE3MDIxYy0xLjAyOTc0OS0uMzUwNzA5MjItMS43OTE0ODExLS44NjkxNDg5NC0yLjI1Njk4NC0xLjU1NTMxOTE1LS40NjU1MDMtLjY3MDkyMTk5LS43MDU0NDg2LTEuNDE4MDg1MTEtLjcwNTQ0ODYtMi4yMTA5OTI5MSAwLS42NDA0MjU1My4xMjcwOTY0LTEuMjA0NjA5OTMuMzgxMDA3MS0xLjY5MjU1MzE5LjI1Mzc2OTYtLjQ4Nzk0MzI2LjU5MjQ1ODMtLjkxNDg5MzYyIDEuMDE1NjQyOC0xLjI1MDM1NDYxLjQyMzE4NDUtLjM1MDcwOTIyLjkwMjc5MzYtLjYwOTkyOTA4IDEuNDY3MDM5Ni0uNzkyOTA3OC41NjQyNDYtLjE4Mjk3ODcyIDEuMTU2NzA0My0uMjU5MjE5ODYgMS43NzczNzQ5LS4yNTkyMTk4Ni4zMTAxOTQzIDAgLjYzNDc3NjguMDE1MjQ4MjMuOTQ0OTcxLjA2MDk5MjkxLjMyNDU4MjUuMDQ1NzQ0NjguNjIwNjcwNi4xMDY3Mzc1OS45MTY4OTk4LjE2NzczMDUuMjgyMTIzLjA3NjI0MTEzLjU1MDEzOTguMTUyNDgyMjcuODA0MTkxNi4yNDM5NzE2My4yNTM3Njk2LjA5MTQ4OTM2LjQ1MTM5NjguMTgyOTc4NzIuNTkyNDU4My4yNzQ0NjgwOC4xOTc0ODYxLjEyMTk4NTgyLjMzODU0NzYuMjQzOTcxNjMuNDIzMTg0NS4zODEyMDU2OC4wODQ2MzY5LjEyMTk4NTgxLjEyNjk1NTMuMjg5NzE2MzEuMTI2OTU1My41MDMxOTE0OXYuNzE2NjY2NjZjMCAuMzIwMjEyNzctLjExMjg0OTIuNDg3OTQzMjYtLjMyNDQ0MTQuNDg3OTQzMjYtLjExMjg0OTIgMC0uMjk2MjI5Mi0uMDYwOTkyOS0uNTM2MDMzNy0uMTgyOTc4NzItLjgwNDA1MDYtLjM5NjQ1MzktMS43MDY4NDQyLS41OTQ2ODA4NS0yLjcwODM4MDgtLjU5NDY4MDg1LS44MDQwNTA2IDAtMS40Mzg4MjczLjEzNzIzNDA0LTEuODc2MTE4LjQyNjk1MDM1LS40MzcyOTA2LjI4OTcxNjMyLS42NjI5ODkuNzMxOTE0OS0uNjYyOTg5IDEuMzU3MDkyMiAwIC40MjY5NTAzNi4xNDEwNjE1Ljc5MjkwNzguNDIzMTg0NSAxLjA4MjYyNDEyLjI4MjEyMy4yODk3MTYzMS44MDQwNTA1LjU3OTQzMjYyIDEuNTUxNjc2NS44Mzg2NTI0OGwyLjAwMzA3MzMuNjg2MTcwMjFjMS4wMTU2NDI4LjM1MDcwOTIyIDEuNzQ5MTYyNi44Mzg2NTI0OCAyLjE4NjQ1MzIgMS40NjM4Mjk3OS40MzcyOTA3LjYyNTE3NzMuNjQ4ODgzIDEuMzQxODQzOTcuNjQ4ODgzIDIuMTM0NzUxNzUgMCAuNjU1NjczOC0uMTI2OTU1NCAxLjI1MDM1NDYtLjM2Njc1OTkgMS43Njg3OTQzLS4yNTM5MTA4LjUxODQzOTgtLjU5MjQ1ODQuOTc1ODg2Ni0xLjAyOTc0OSAxLjM0MTg0NC0uNDM3MjkwNy4zODEyMDU3LS45NTkyMTgyLjY1NTY3MzgtMS41NjU3ODI3Ljg1MzkwMDctLjYzNDc3NjcuMjEzNDc1Mi0xLjI5Nzc2NTguMzIwMjEyOC0yLjAxNzE3OTQuMzIwMjEyOHoiLz48cGF0aCBmaWxsPSIjRkY5OTAwIiBkPSJNNDkuODc1NTA3IDQxLjAwNTkzNzJjLTQuNzA1MTM2NyAzLjY3NDQwNTEtMTEuNTQxMTcxMiA1LjYyNTAxNTItMTcuNDE4ODczOCA1LjYyNTAxNTItOC4yMzc1NjQ2IDAtMTUuNjU5OTUzNjEtMy4yMjA3NzQ4LTIxLjI2NjA3Mzk4LTguNTczNjExOS0uNDQzNDg0MTYtLjQyMzM4ODItLjA0MjkwMzk4LS45OTc5ODY1LjQ4NjI0NTE0LS42NjUzMjQ0IDYuMDYzNzYyODUgMy43MTk3NjgyIDEzLjU0MzIxNDE0IDUuOTcyNzk4NCAyMS4yODAzNzUyNCA1Ljk3Mjc5ODQgNS4yMTk5ODQ2IDAgMTAuOTU0ODE2OS0xLjE0OTE5NjYgMTYuMjMyMDA2Ny0zLjUwODA3NC43ODY1NzMtLjM3ODAyNTIgMS40NTg3MzU0LjU0NDM1NjMuNjg2MzIwNyAxLjE0OTE5Njd6bTEuOTU5NDI0OS0yLjM1ODg3NzNjLS42MDA3OTg4LS44MTY1MzQ1LTMuOTc1NzY5LS4zOTMxNDYzLTUuNTA2MDExMS0uMTk2NTczMi0uNDU3Nzg1NS4wNjA0ODQxLS41MjkyOTIxLS4zNjI5MDQyLS4xMTQ0MTA2LS42ODA0NDUzIDIuNjg4NjQ5Ni0xLjk5NTk3MzIgNy4xMDc2MTY3LTEuNDIxMzc0OCA3LjYyMjYwNzYtLjc1NjA1MDUuNTE0ODQ3Ny42ODA0NDU0LS4xNDMwMTMzIDUuMzUyODM3MS0yLjY2MDE5IDcuNTkwNzQ2My0uMzg1OTkyOC4zNDc3ODMyLS43NTc4MjczLjE2NjMzMTEtLjU4NjM1NDQtLjI4NzI5OTEuNTcyMDUzMS0xLjQ5Njk3OTkgMS44NDUwMTQzLTQuODY4OTY0OCAxLjI0NDM1ODUtNS42NzAzNzgyeiIvPjwvZz48L3N2Zz4= 39 | 40 | friendly-name.meta.crossplane.io: AWS Reference Platform 41 | friendly-group-name.meta.crossplane.io/aws.platformref.crossplane.io: AWS 42 | 43 | friendly-kind-name.meta.crossplane.io/compositenetwork.aws.platformref.crossplane.io: Composite Network 44 | friendly-kind-name.meta.crossplane.io/network.aws.platformref.crossplane.io: Network 45 | 46 | friendly-kind-name.meta.crossplane.io/compositecluster.aws.platformref.crossplane.io: Composite Kubernetes Cluster 47 | friendly-kind-name.meta.crossplane.io/cluster.aws.platformref.crossplane.io: Kubernetes Cluster 48 | 49 | friendly-kind-name.meta.crossplane.io/services.aws.platformref.crossplane.io: Cluster Services 50 | friendly-kind-name.meta.crossplane.io/eks.aws.platformref.crossplane.io: EKS Cluster 51 | 52 | # TODO(negz): Remove these older style annotations once annotation consumers 53 | # have had a chance to update. 54 | company: Upbound 55 | maintainer: Jared Watts 56 | keywords: aws, cloud-native, kubernetes, example, platform, reference 57 | source: github.com/upbound/platform-ref-aws 58 | license: Apache-2.0 59 | descriptionShort: | 60 | The AWS reference platform for Kubernetes and Data Services. 61 | 62 | description: | 63 | This reference platform Configuration for Kubernetes and Data Services 64 | is a starting point to build, run, and operate your own internal cloud 65 | platform and offer a self-service console and API to your internal teams. 66 | 67 | readme: | 68 | This reference platform `Configuration` for Kubernetes and Data Services 69 | is a starting point to build, run, and operate your own internal cloud 70 | platform and offer a self-service console and API to your internal teams. 71 | It provides platform APIs to provision fully configured EKS clusters, 72 | with secure networking, and stateful cloud services (RDS) designed to 73 | securely connect to the nodes in each EKS cluster -- all composed using 74 | cloud service primitives from the [Crossplane AWS 75 | Provider](https://doc.crds.dev/github.com/crossplane/provider-aws). App 76 | deployments can securely connect to the infrastructure they need using 77 | secrets distributed directly to the app namespace. 78 | 79 | [Quickstart 80 | Guide](https://github.com/upbound/platform-ref-aws/#quick-start) 81 | 82 | [APIs in this 83 | Configuration](https://github.com/upbound/platform-ref-aws/#apis-in-this-configuration) 84 | 85 | To learn more checkout the [GitHub 86 | repo](https://github.com/upbound/platform-ref-aws/) that you can copy and 87 | customize to meet the exact needs of your organization! 88 | 89 | iconData: CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNjUiIGhlaWdodD0iNjUiPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PHJlY3Qgd2lkdGg9IjY1IiBoZWlnaHQ9IjY1IiBmaWxsPSIjMjMyRjNFIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHJ4PSIxNiIvPjxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik0yMy4yNDYzNjU2IDI5Ljk2ODk5N2MwIC41NjQxODQ0LjA1NjQyNDYgMS4wMjE2MzEyLjE1NTE2NzYgMS4zNTcwOTIyLjExMjg0OTIuMzM1NDYxLjI1MzkxMDcuNzAxNDE4NC40NTEzOTY4IDEuMDk3ODcyMy4wNzA1MzA4LjEyMTk4NTguMDk4NzQzMS4yNDM5NzE2LjA5ODc0MzEuMzUwNzA5MiAwIC4xNTI0ODIzLS4wODQ2MzY5LjMwNDk2NDYtLjI2ODAxNjkuNDU3NDQ2OGwtLjg4ODY4NzUuNjQwNDI1NmMtLjEyNjk1NTMuMDkxNDg5My0uMjU0MDUxNy4xMzcyMzQtLjM2Njc1OTkuMTM3MjM0LS4xNDEwNjE1IDAtLjI4MjEyMy0uMDc2MjQxMS0uNDIzMTg0NS0uMjEzNDc1Mi0uMTk3NDg2MS0uMjI4NzIzNC0uMzY2NzU5OS0uNDcyNjk1LS41MDc4MjE0LS43MTY2NjY2LS4xNDEwNjE1LS4yNTkyMTk5LS4yODIxMjMtLjU0ODkzNjItLjQzNzI5MDYtLjg5OTY0NTQtMS4xMDA0MjA3OCAxLjQwMjgzNjgtMi40ODI2ODI0MiAyLjEwNDI1NTMtNC4xNDcyMDgxMyAyLjEwNDI1NTMtMS4xODQ5MTY2MSAwLTIuMTMwMDI4NjYtLjM2NTk1NzUtMi44MjEyMzAwMi0xLjA5Nzg3MjQtLjY5MTIwMTM1LS43MzE5MTQ4LTEuMDQzODU1MS0xLjcwNzgwMTQtMS4wNDM4NTUxLTIuOTI3NjU5NSAwLTEuMjk2MDk5MzIuNDIzMDQzNDQtMi4zNDgyMjY5OCAxLjI4MzY1OTY1LTMuMTQxMTM0NzguODYwNDc1MTYtLjc5MjkwNzggMi4wMDMwNzMzMS0xLjE4OTM2MTcgMy40NTYwMDY3Ny0xLjE4OTM2MTcuNDc5NDY4MDQgMCAuOTczMzI0MzYuMDQ1NzQ0NjggMS40OTUyNTE5MS4xMjE5ODU4MS41MjE5Mjc1NS4wNzYyNDExNCAxLjA1Nzk2MTI2LjE5ODIyNjk1IDEuNjIyMjA3MjYuMzM1NDYxdi0xLjExMzEyMDU3YzAtMS4xNTg4NjUyNS0uMjI1Njk4NC0xLjk2NzAyMTI4LS42NjI5ODkwNS0yLjQzOTcxNjMxLS40NTEzOTY4MS0uNDcyNjk1MDQtMS4yMTMxMjg5MS0uNzAxNDE4NDQtMi4yOTkzMDI0Ny0uNzAxNDE4NDQtLjQ5MzcxNTI1IDAtMS4wMDE1MzY2NS4wNjA5OTI5MS0xLjUyMzQ2NDIuMTk4MjI2OTUtLjUyMTkyNzU2LjEzNzIzNDA0LTEuMDI5NzQ4OTYuMzA0OTY0NTQtMS41MjM0NjQyMS41MTg0Mzk3MS0uMjI1Njk4NC4xMDY3Mzc1OS0uMzk0OTcyMi4xNjc3MzA1LS40OTM3MTUyNi4xOTgyMjY5Ni0uMDk4NzQzMDUuMDMwNDk2NDUtLjE2OTI3MzguMDQ1NzQ0NjgtLjIyNTgzOTQ2LjA0NTc0NDY4LS4xOTczNDUwNCAwLS4yOTYwODgwOS0uMTUyNDgyMjctLjI5NjA4ODA5LS40NzI2OTUwNHYtLjc0NzE2MzEyYzAtLjI0Mzk3MTYzLjAyODIxMjMtLjQyNjk1MDM1LjA5ODc0MzA1LS41MzM2ODc5NHMuMTk3MzQ1MDQtLjIxMzQ3NTE4LjM5NDk3MjItLjMyMDIxMjc3Yy40OTM1NzQyLS4yNzQ0NjgwOCAxLjA4NjE3MzU2LS41MDMxOTE0OSAxLjc3NzM3NDkxLS42ODYxNzAyMS42OTEyMDEzNi0uMTk4MjI2OTUgMS40MjQ3MjExNi0uMjg5NzE2MzEgMi4yMDA1NTk0Mi0uMjg5NzE2MzEgMS42Nzg2MzE4NSAwIDIuOTA1ODY2OTIuNDExNzAyMTIgMy42OTU4MTEzMiAxLjIzNTEwNjM4Ljc3NTgzODIuODIzNDA0MjUgMS4xNzA4MTA1IDIuMDczNzU4ODYgMS4xNzA4MTA1IDMuNzUxMDYzODNWMjkuOTY4OTk3aC4wMjgyMTIzem0tNS43MjcwOTY5OCAyLjMxNzczMDVjLjQ2NTUwMjk1IDAgLjk0NDk3MDk5LS4wOTE0ODk0IDEuNDUyOTMzNDYtLjI3NDQ2ODEuNTA3ODIxNC0uMTgyOTc4OC45NTkyMTgyLS41MTg0Mzk3IDEuMzQwMDg0MjYtLjk3NTg4NjYuMjI1Njk4NC0uMjg5NzE2My4zOTQ4MzExNC0uNjA5OTI5LjQ3OTYwOTEtLjk3NTg4NjUuMDg0NjM2OS0uMzY1OTU3NC4xNDEwNjE1LS44MDgxNTYwMS4xNDEwNjE1LTEuMzI2NTk1NzJ2LS42NDA0MjU1M2MtLjQwOTA3ODM1LS4xMDY3Mzc1OS0uODQ2MzY5MDEtLjE5ODIyNjk1LTEuMjk3NzY1ODEtLjI1OTIxOTg2LS40NTEzOTY4LS4wNjA5OTI5MS0uODg4Njg3NDUtLjA5MTQ4OTM2LTEuMzI1OTc4MS0uMDkxNDg5MzYtLjk0NTExMjA2IDAtMS42MzYzMTM0MS4xOTgyMjY5NS0yLjEwMTgxNjM3LjYwOTkyOTA3LS40NjU1MDI5NS40MTE3MDIxMy0uNjkxMjAxMzUuOTkxMTM0NzYtLjY5MTIwMTM1IDEuNzUzNTQ2MSAwIC43MTY2NjY3LjE2OTI3MzggMS4yNTAzNTQ2LjUyMTkyNzU1IDEuNjE2MzEyMS4zMzg1NDc2MS4zODEyMDU2LjgzMjI2Mjg2LjU2NDE4NDQgMS40ODExNDU3Ni41NjQxODQ0ek0yOC44NDY1MDcxIDMzLjkzMzUzNmMtLjI1MzkxMDcgMC0uNDIzMTg0NS0uMDQ1NzQ0Ny0uNTM2MDMzNy0uMTUyNDgyMy0uMTEyODQ5Mi0uMDkxNDg5NC0uMjExNTkyMi0uMzA0OTY0NS0uMjk2MjI5MS0uNTk0NjgwOUwyNC42OTkyOTkgMjEuMzk5NDkzNDFjLS4wODQ3NzgtLjMwNDk2NDUzLS4xMjY5NTUzLS41MDMxOTE0OC0uMTI2OTU1My0uNjA5OTI5MDcgMC0uMjQzOTcxNjMuMTEyNzA4MS0uMzgxMjA1NjguMzM4NTQ3Ni0uMzgxMjA1NjhoMS4zODI0MDI3Yy4yNjc4NzU4IDAgLjQ1MTM5NjguMDQ1NzQ0NjguNTUwMTM5OC4xNTI0ODIyNy4xMTI4NDkyLjA5MTQ4OTM2LjE5NzQ4NjEuMzA0OTY0NTQuMjgyMTIzLjU5NDY4MDg1TDI5LjQ5NTM5IDMxLjI0OTg0OGwyLjIwMDQxODQtMTAuMDk0MzI2MjJjLjA3MDY3MTgtLjMwNDk2NDU0LjE1NTE2NzYtLjUwMzE5MTQ5LjI2ODE1NzktLjU5NDY4MDg1LjExMjg0OTItLjA5MTQ4OTM2LjMxMDE5NDItLjE1MjQ4MjI3LjU2NDI0Ni0uMTUyNDgyMjdoMS4xMjg0OTJjLjI2Nzg3NTggMCAuNDUxMzk2OC4wNDU3NDQ2OC41NjQyNDYuMTUyNDgyMjcuMTEyODQ5Mi4wOTE0ODkzNi4yMTE1OTIzLjMwNDk2NDU0LjI2ODAxNjkuNTk0NjgwODVsMi4yMjg2MzA2IDEwLjIxNjMxMjAyIDIuNDQwNTA1LTEwLjIxNjMxMjAyYy4wODQ2MzY5LS4zMDQ5NjQ1NC4xODMzOC0uNTAzMTkxNDkuMjgyMTIzLS41OTQ2ODA4NS4xMTI4NDkyLS4wOTE0ODkzNi4yOTYyMjkyLS4xNTI0ODIyNy41NTAxMzk5LS4xNTI0ODIyN2gxLjMxMTg3MTljLjIyNTY5ODQgMCAuMzUyNjUzOC4xMjE5ODU4Mi4zNTI2NTM4LjM4MTIwNTY4IDAgLjA3NjI0MTEzLS4wMTQxMDYyLjE1MjQ4MjI3LS4wMjgyMTIzLjI0Mzk3MTYzLS4wMTQyNDcyLjA5MTQ4OTM2LS4wNDIzMTg1LjIxMzQ3NTE3LS4wOTg3NDMxLjM4MTIwNTY3TDM4LjEyODM1MzkgMzMuMjAxNjIxMWMtLjA4NDc3OC4zMDQ5NjQ1LS4xODM1MjEuNTAzMTkxNS0uMjk2MzcwMi41OTQ2ODA4LS4xMTI3MDgyLjA5MTQ4OTQtLjI5NjA4ODEuMTUyNDgyMy0uNTM1ODkyNy4xNTI0ODIzaC0xLjIxMzI2OTljLS4yNjc4NzU4IDAtLjQ1MTI1NTgtLjA0NTc0NDctLjU2NDI0Ni0uMTUyNDgyMy0uMTEyODQ5Mi0uMTA2NzM3Ni0uMjExNTkyMy0uMzA0OTY0NS0uMjY3ODc1OC0uNjA5OTI5MWwtMi4xODY0NTMzLTkuODM1MTA2MzQtMi4xNzIzNDcxIDkuODE5ODU4MTRjLS4wNzA2NzE4LjMwNDk2NDYtLjE1NTE2NzcuNTAzMTkxNS0uMjY4MDE2OS42MDk5MjkxLS4xMTI4NDkyLjEwNjczNzYtLjMxMDMzNTMuMTUyNDgyMy0uNTY0MjQ2LjE1MjQ4MjNoLTEuMjEzMTI4OXptMTguMTI2NDAyOS40MTE3MDIxYy0uNzMzNTE5OCAwLTEuNDY3MDM5Ni0uMDkxNDg5NC0yLjE3MjM0NzEtLjI3NDQ2ODFzLTEuMjU1NDQ3NC0uMzgxMjA1Ny0xLjYyMjIwNzMtLjYwOTkyOTFjLS4yMjU2OTg0LS4xMzcyMzQtLjM4MTAwNzEtLjI4OTcxNjMtLjQzNzI5MDYtLjQyNjk1MDMtLjA1NjQyNDYtLjEzNzIzNDEtLjA4NDYzNjktLjI4OTcxNjMtLjA4NDYzNjktLjQyNjk1MDR2LS43Nzc2NTk2YzAtLjMyMDIxMjcuMTEyODQ5Mi0uNDcyNjk1LjMyNDQ0MTQtLjQ3MjY5NS4wODQ2MzY5IDAgLjE2OTEzMjcuMDE1MjQ4Mi4yNTM3Njk2LjA0NTc0NDcuMDg0Nzc4LjAzMDQ5NjQuMjExNTkyMy4wOTE0ODk0LjM1Mjc5NDkuMTUyNDgyMy40Nzk0NjguMjI4NzIzNCAxLjAwMTUzNjYuNDExNzAyMSAxLjU1MTUzNTQuNTMzNjg3OS41NjQzODcxLjEyMTk4NTggMS4xMTQzODU5LjE4Mjk3ODcgMS42Nzg3NzI5LjE4Mjk3ODcuODg4Njg3NSAwIDEuNTc5ODg4OC0uMTY3NzMwNSAyLjA1OTM1NjktLjUwMzE5MTUuNDc5NzUwMS0uMzM1NDYxLjczMzY2MDgtLjgyMzQwNDIuNzMzNjYwOC0xLjQ0ODU4MTUgMC0uNDI2OTUwNC0uMTI2OTU1My0uNzc3NjU5Ni0uMzgxMDA3MS0xLjA2NzM3NTkxLS4yNTM3Njk2LS4yODk3MTYzMS0uNzMzMzc4Ny0uNTQ4OTM2MTctMS40MjQ3MjExLS43OTI5MDc4bC0yLjA0NTI1MDctLjY4NjE3MDIxYy0xLjAyOTc0OS0uMzUwNzA5MjItMS43OTE0ODExLS44NjkxNDg5NC0yLjI1Njk4NC0xLjU1NTMxOTE1LS40NjU1MDMtLjY3MDkyMTk5LS43MDU0NDg2LTEuNDE4MDg1MTEtLjcwNTQ0ODYtMi4yMTA5OTI5MSAwLS42NDA0MjU1My4xMjcwOTY0LTEuMjA0NjA5OTMuMzgxMDA3MS0xLjY5MjU1MzE5LjI1Mzc2OTYtLjQ4Nzk0MzI2LjU5MjQ1ODMtLjkxNDg5MzYyIDEuMDE1NjQyOC0xLjI1MDM1NDYxLjQyMzE4NDUtLjM1MDcwOTIyLjkwMjc5MzYtLjYwOTkyOTA4IDEuNDY3MDM5Ni0uNzkyOTA3OC41NjQyNDYtLjE4Mjk3ODcyIDEuMTU2NzA0My0uMjU5MjE5ODYgMS43NzczNzQ5LS4yNTkyMTk4Ni4zMTAxOTQzIDAgLjYzNDc3NjguMDE1MjQ4MjMuOTQ0OTcxLjA2MDk5MjkxLjMyNDU4MjUuMDQ1NzQ0NjguNjIwNjcwNi4xMDY3Mzc1OS45MTY4OTk4LjE2NzczMDUuMjgyMTIzLjA3NjI0MTEzLjU1MDEzOTguMTUyNDgyMjcuODA0MTkxNi4yNDM5NzE2My4yNTM3Njk2LjA5MTQ4OTM2LjQ1MTM5NjguMTgyOTc4NzIuNTkyNDU4My4yNzQ0NjgwOC4xOTc0ODYxLjEyMTk4NTgyLjMzODU0NzYuMjQzOTcxNjMuNDIzMTg0NS4zODEyMDU2OC4wODQ2MzY5LjEyMTk4NTgxLjEyNjk1NTMuMjg5NzE2MzEuMTI2OTU1My41MDMxOTE0OXYuNzE2NjY2NjZjMCAuMzIwMjEyNzctLjExMjg0OTIuNDg3OTQzMjYtLjMyNDQ0MTQuNDg3OTQzMjYtLjExMjg0OTIgMC0uMjk2MjI5Mi0uMDYwOTkyOS0uNTM2MDMzNy0uMTgyOTc4NzItLjgwNDA1MDYtLjM5NjQ1MzktMS43MDY4NDQyLS41OTQ2ODA4NS0yLjcwODM4MDgtLjU5NDY4MDg1LS44MDQwNTA2IDAtMS40Mzg4MjczLjEzNzIzNDA0LTEuODc2MTE4LjQyNjk1MDM1LS40MzcyOTA2LjI4OTcxNjMyLS42NjI5ODkuNzMxOTE0OS0uNjYyOTg5IDEuMzU3MDkyMiAwIC40MjY5NTAzNi4xNDEwNjE1Ljc5MjkwNzguNDIzMTg0NSAxLjA4MjYyNDEyLjI4MjEyMy4yODk3MTYzMS44MDQwNTA1LjU3OTQzMjYyIDEuNTUxNjc2NS44Mzg2NTI0OGwyLjAwMzA3MzMuNjg2MTcwMjFjMS4wMTU2NDI4LjM1MDcwOTIyIDEuNzQ5MTYyNi44Mzg2NTI0OCAyLjE4NjQ1MzIgMS40NjM4Mjk3OS40MzcyOTA3LjYyNTE3NzMuNjQ4ODgzIDEuMzQxODQzOTcuNjQ4ODgzIDIuMTM0NzUxNzUgMCAuNjU1NjczOC0uMTI2OTU1NCAxLjI1MDM1NDYtLjM2Njc1OTkgMS43Njg3OTQzLS4yNTM5MTA4LjUxODQzOTgtLjU5MjQ1ODQuOTc1ODg2Ni0xLjAyOTc0OSAxLjM0MTg0NC0uNDM3MjkwNy4zODEyMDU3LS45NTkyMTgyLjY1NTY3MzgtMS41NjU3ODI3Ljg1MzkwMDctLjYzNDc3NjcuMjEzNDc1Mi0xLjI5Nzc2NTguMzIwMjEyOC0yLjAxNzE3OTQuMzIwMjEyOHoiLz48cGF0aCBmaWxsPSIjRkY5OTAwIiBkPSJNNDkuODc1NTA3IDQxLjAwNTkzNzJjLTQuNzA1MTM2NyAzLjY3NDQwNTEtMTEuNTQxMTcxMiA1LjYyNTAxNTItMTcuNDE4ODczOCA1LjYyNTAxNTItOC4yMzc1NjQ2IDAtMTUuNjU5OTUzNjEtMy4yMjA3NzQ4LTIxLjI2NjA3Mzk4LTguNTczNjExOS0uNDQzNDg0MTYtLjQyMzM4ODItLjA0MjkwMzk4LS45OTc5ODY1LjQ4NjI0NTE0LS42NjUzMjQ0IDYuMDYzNzYyODUgMy43MTk3NjgyIDEzLjU0MzIxNDE0IDUuOTcyNzk4NCAyMS4yODAzNzUyNCA1Ljk3Mjc5ODQgNS4yMTk5ODQ2IDAgMTAuOTU0ODE2OS0xLjE0OTE5NjYgMTYuMjMyMDA2Ny0zLjUwODA3NC43ODY1NzMtLjM3ODAyNTIgMS40NTg3MzU0LjU0NDM1NjMuNjg2MzIwNyAxLjE0OTE5Njd6bTEuOTU5NDI0OS0yLjM1ODg3NzNjLS42MDA3OTg4LS44MTY1MzQ1LTMuOTc1NzY5LS4zOTMxNDYzLTUuNTA2MDExMS0uMTk2NTczMi0uNDU3Nzg1NS4wNjA0ODQxLS41MjkyOTIxLS4zNjI5MDQyLS4xMTQ0MTA2LS42ODA0NDUzIDIuNjg4NjQ5Ni0xLjk5NTk3MzIgNy4xMDc2MTY3LTEuNDIxMzc0OCA3LjYyMjYwNzYtLjc1NjA1MDUuNTE0ODQ3Ny42ODA0NDU0LS4xNDMwMTMzIDUuMzUyODM3MS0yLjY2MDE5IDcuNTkwNzQ2My0uMzg1OTkyOC4zNDc3ODMyLS43NTc4MjczLjE2NjMzMTEtLjU4NjM1NDQtLjI4NzI5OTEuNTcyMDUzMS0xLjQ5Njk3OTkgMS44NDUwMTQzLTQuODY4OTY0OCAxLjI0NDM1ODUtNS42NzAzNzgyeiIvPjwvZz48L3N2Zz4= 90 | spec: 91 | crossplane: 92 | version: ">=v1.0.0-0" 93 | dependsOn: 94 | - provider: registry.upbound.io/crossplane/provider-aws 95 | version: ">=v0.19.0-0" 96 | - provider: registry.upbound.io/crossplane/provider-helm 97 | version: ">=v0.3.6-0" -------------------------------------------------------------------------------- /crossplane-package-tdd-with-skaffold/package/network/composition.yaml: -------------------------------------------------------------------------------- 1 | # https://raw.githubusercontent.com/upbound/platform-ref-aws/main/network/composition.yaml 2 | 3 | apiVersion: apiextensions.crossplane.io/v1 4 | kind: Composition 5 | metadata: 6 | name: compositenetworks.aws.platformref.crossplane.io 7 | labels: 8 | provider: aws 9 | spec: 10 | writeConnectionSecretsToNamespace: upbound-system 11 | compositeTypeRef: 12 | apiVersion: aws.platformref.crossplane.io/v1alpha1 13 | kind: CompositeNetwork 14 | resources: 15 | - base: 16 | apiVersion: ec2.aws.crossplane.io/v1beta1 17 | kind: VPC 18 | spec: 19 | forProvider: 20 | region: us-west-2 21 | cidrBlock: 192.168.0.0/16 22 | enableDnsSupport: true 23 | enableDnsHostNames: true 24 | patches: 25 | - fromFieldPath: spec.id 26 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 27 | - base: 28 | apiVersion: ec2.aws.crossplane.io/v1beta1 29 | kind: InternetGateway 30 | spec: 31 | forProvider: 32 | region: us-west-2 33 | vpcIdSelector: 34 | matchControllerRef: true 35 | patches: 36 | - fromFieldPath: spec.id 37 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 38 | - base: 39 | apiVersion: ec2.aws.crossplane.io/v1beta1 40 | kind: Subnet 41 | metadata: 42 | labels: 43 | zone: us-west-2a 44 | access: public 45 | spec: 46 | forProvider: 47 | region: us-west-2 48 | mapPublicIPOnLaunch: true 49 | cidrBlock: 192.168.0.0/18 50 | vpcIdSelector: 51 | matchControllerRef: true 52 | availabilityZone: us-west-2a 53 | tags: 54 | - key: kubernetes.io/role/elb 55 | value: "1" 56 | patches: 57 | - fromFieldPath: spec.id 58 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 59 | - base: 60 | apiVersion: ec2.aws.crossplane.io/v1beta1 61 | kind: Subnet 62 | metadata: 63 | labels: 64 | zone: us-west-2b 65 | access: public 66 | spec: 67 | forProvider: 68 | region: us-west-2 69 | mapPublicIPOnLaunch: true 70 | cidrBlock: 192.168.64.0/18 71 | vpcIdSelector: 72 | matchControllerRef: true 73 | availabilityZone: us-west-2b 74 | tags: 75 | - key: kubernetes.io/role/elb 76 | value: "1" 77 | patches: 78 | - fromFieldPath: spec.id 79 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 80 | - base: 81 | apiVersion: ec2.aws.crossplane.io/v1beta1 82 | kind: Subnet 83 | metadata: 84 | labels: 85 | zone: us-west-2a 86 | access: private 87 | spec: 88 | forProvider: 89 | region: us-west-2 90 | cidrBlock: 192.168.128.0/18 91 | vpcIdSelector: 92 | matchControllerRef: true 93 | availabilityZone: us-west-2a 94 | tags: 95 | - value: shared 96 | key: "" 97 | - key: kubernetes.io/role/internal-elb 98 | value: "1" 99 | patches: 100 | - fromFieldPath: spec.id 101 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 102 | - fromFieldPath: spec.clusterRef.id 103 | toFieldPath: spec.forProvider.tags[0].key 104 | transforms: 105 | - type: string 106 | string: 107 | fmt: "kubernetes.io/cluster/%s" 108 | - base: 109 | apiVersion: ec2.aws.crossplane.io/v1beta1 110 | kind: Subnet 111 | metadata: 112 | labels: 113 | zone: us-west-2b 114 | access: private 115 | spec: 116 | forProvider: 117 | region: us-west-2 118 | cidrBlock: 192.168.192.0/18 119 | vpcIdSelector: 120 | matchControllerRef: true 121 | availabilityZone: us-west-2b 122 | tags: 123 | - value: shared 124 | key: "" 125 | - key: kubernetes.io/role/internal-elb 126 | value: "1" 127 | patches: 128 | - fromFieldPath: spec.id 129 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 130 | - fromFieldPath: spec.clusterRef.id 131 | toFieldPath: spec.forProvider.tags[0].key 132 | transforms: 133 | - type: string 134 | string: 135 | fmt: "kubernetes.io/cluster/%s" 136 | - base: 137 | apiVersion: ec2.aws.crossplane.io/v1beta1 138 | kind: RouteTable 139 | spec: 140 | forProvider: 141 | region: us-west-2 142 | vpcIdSelector: 143 | matchControllerRef: true 144 | routes: 145 | - destinationCidrBlock: 0.0.0.0/0 146 | gatewayIdSelector: 147 | matchControllerRef: true 148 | associations: 149 | - subnetIdSelector: 150 | matchControllerRef: true 151 | matchLabels: 152 | zone: us-west-2a 153 | access: public 154 | - subnetIdSelector: 155 | matchControllerRef: true 156 | matchLabels: 157 | zone: us-west-2b 158 | access: public 159 | - subnetIdSelector: 160 | matchControllerRef: true 161 | matchLabels: 162 | zone: us-west-2a 163 | access: private 164 | - subnetIdSelector: 165 | matchControllerRef: true 166 | matchLabels: 167 | zone: us-west-2b 168 | access: private 169 | patches: 170 | - fromFieldPath: spec.id 171 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 172 | - base: 173 | apiVersion: ec2.aws.crossplane.io/v1beta1 174 | kind: SecurityGroup 175 | spec: 176 | forProvider: 177 | region: us-west-2 178 | vpcIdSelector: 179 | matchControllerRef: true 180 | groupName: platform-ref-aws-cluster 181 | description: Allow access to PostgreSQL 182 | ingress: 183 | - fromPort: 5432 184 | toPort: 5432 185 | ipProtocol: tcp 186 | ipRanges: 187 | - cidrIp: 0.0.0.0/0 188 | description: Everywhere 189 | patches: 190 | - fromFieldPath: spec.id 191 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 192 | -------------------------------------------------------------------------------- /crossplane-package-tdd-with-skaffold/package/network/definition.yaml: -------------------------------------------------------------------------------- 1 | # https://raw.githubusercontent.com/upbound/platform-ref-aws/main/network/definition.yaml 2 | 3 | apiVersion: apiextensions.crossplane.io/v1 4 | kind: CompositeResourceDefinition 5 | metadata: 6 | name: compositenetworks.aws.platformref.crossplane.io 7 | annotations: 8 | upbound.io/ui-schema: |- 9 | --- 10 | configSections: 11 | - title: Network Info 12 | description: Information about this network fabric 13 | items: 14 | - name: id 15 | controlType: singleInput 16 | type: string 17 | path: ".spec.id" 18 | title: Network ID 19 | description: Network ID that other objects will use to refer (and connect) to this network fabric 20 | default: platform-ref-aws-network 21 | validation: 22 | - required: true 23 | customError: Network ID is required. 24 | - title: Cluster Info 25 | description: The cluster used with this network fabric 26 | items: 27 | - name: clusterRef 28 | controlType: singleInput 29 | type: string 30 | path: ".spec.clusterRef.id" 31 | title: Cluster Ref 32 | description: ID of the Cluster object that will use this network fabric 33 | default: platform-ref-aws-cluster 34 | validation: 35 | - required: true 36 | customError: Cluster ref is required. 37 | spec: 38 | claimNames: 39 | kind: Network 40 | plural: networks 41 | group: aws.platformref.crossplane.io 42 | names: 43 | kind: CompositeNetwork 44 | plural: compositenetworks 45 | versions: 46 | - name: v1alpha1 47 | served: true 48 | referenceable: true 49 | schema: 50 | openAPIV3Schema: 51 | type: object 52 | properties: 53 | spec: 54 | type: object 55 | properties: 56 | id: 57 | type: string 58 | description: ID of this Network that other objects will use to refer to it. 59 | clusterRef: 60 | type: object 61 | description: "A reference to the Cluster object that this network will be used for." 62 | properties: 63 | id: 64 | type: string 65 | description: ID of the Cluster object this ref points to. 66 | required: 67 | - id 68 | required: 69 | - id 70 | - clusterRef -------------------------------------------------------------------------------- /crossplane-package-tdd-with-skaffold/skaffold.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: skaffold/v2beta24 2 | kind: Config 3 | deploy: 4 | helm: 5 | hooks: 6 | after: 7 | - host: 8 | command: 9 | [ 10 | "sh", 11 | "-c", 12 | "kubectl wait --for condition=healthy --timeout=300s provider/crossplane-provider-aws", 13 | ] 14 | releases: 15 | - name: universal-crossplane 16 | repo: https://charts.upbound.io/stable/ 17 | remoteChart: universal-crossplane 18 | namespace: upbound-system 19 | createNamespace: true 20 | valuesFiles: 21 | - tests/uxp-values.yaml 22 | version: 1.5.1-up.1 23 | wait: true 24 | kubectl: 25 | hooks: 26 | after: 27 | - host: 28 | command: 29 | [ 30 | "sh", 31 | "-c", 32 | "kubectl kuttl test --test ./tests/compositions/compositenetwork/; exit 0", 33 | ] 34 | manifests: 35 | - package/network/definition.yaml 36 | - package/network/composition.yaml 37 | # - examples/network.yaml 38 | 39 | -------------------------------------------------------------------------------- /crossplane-package-tdd-with-skaffold/tests/compositions/compositenetwork/01-assert.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: ec2.aws.crossplane.io/v1beta1 3 | kind: Subnet 4 | metadata: 5 | labels: 6 | access: private 7 | crossplane.io/claim-name: network 8 | networks.aws.platformref.crossplane.io/network-id: platform-ref-aws-network 9 | zone: us-west-2a 10 | spec: 11 | forProvider: 12 | region: us-west-2 13 | cidrBlock: 192.168.128.0/18 14 | vpcIdSelector: 15 | matchControllerRef: true 16 | availabilityZone: us-west-2a 17 | --- 18 | apiVersion: ec2.aws.crossplane.io/v1beta1 19 | kind: Subnet 20 | metadata: 21 | labels: 22 | access: public 23 | crossplane.io/claim-name: network 24 | networks.aws.platformref.crossplane.io/network-id: platform-ref-aws-network 25 | zone: us-west-2a 26 | spec: 27 | forProvider: 28 | region: us-west-2 29 | mapPublicIPOnLaunch: true 30 | cidrBlock: 192.168.0.0/18 31 | vpcIdSelector: 32 | matchControllerRef: true 33 | availabilityZone: us-west-2a 34 | --- 35 | apiVersion: ec2.aws.crossplane.io/v1beta1 36 | kind: VPC 37 | metadata: 38 | labels: 39 | crossplane.io/claim-name: network 40 | networks.aws.platformref.crossplane.io/network-id: platform-ref-aws-network 41 | spec: 42 | deletionPolicy: Delete 43 | forProvider: 44 | region: us-west-2 45 | cidrBlock: 192.168.0.0/16 46 | enableDnsSupport: true 47 | enableDnsHostNames: true 48 | tags: 49 | - key: crossplane-kind 50 | value: vpc.ec2.aws.crossplane.io 51 | - key: crossplane-name 52 | - key: crossplane-providerconfig 53 | -------------------------------------------------------------------------------- /crossplane-package-tdd-with-skaffold/tests/compositions/compositenetwork/01-network.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | # Wait for XRD to become "established" 5 | - command: kubectl wait --for condition=established --timeout=20s xrd/compositenetworks.aws.platformref.crossplane.io 6 | # Create the XR/Claim 7 | - command: kubectl apply -f "${PWD}/examples/network.yaml" 8 | -------------------------------------------------------------------------------- /crossplane-package-tdd-with-skaffold/tests/uxp-values.yaml: -------------------------------------------------------------------------------- 1 | provider: 2 | packages: 3 | - crossplane/provider-aws:v0.19.0 4 | -------------------------------------------------------------------------------- /crossplane-package-testing-with-kuttl/examples/network.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: aws.platformref.crossplane.io/v1alpha1 2 | kind: Network 3 | metadata: 4 | name: network 5 | spec: 6 | id: platform-ref-aws-network 7 | clusterRef: 8 | id: platform-ref-aws-cluster -------------------------------------------------------------------------------- /crossplane-package-testing-with-kuttl/kuttl-test.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestSuite 3 | commands: 4 | # Install Univerasal Crossplane (uxp). 5 | - command: helm install universal-crossplane https://charts.upbound.io/stable/universal-crossplane-1.5.1-up.1.tgz --namespace upbound-system --wait --create-namespace --values tests/uxp-values.yaml 6 | # Wait for provider-aws to become healthy. 7 | - command: kubectl wait --for condition=healthy --timeout=300s provider/crossplane-provider-aws 8 | # Install ProviderConfig for test. 9 | - command: kubectl apply -f tests/init/ 10 | testDirs: 11 | - tests/compositions/ 12 | startKIND: true 13 | kindContext: kuttl-test 14 | skipClusterDelete: false 15 | -------------------------------------------------------------------------------- /crossplane-package-testing-with-kuttl/package/crossplane.yaml: -------------------------------------------------------------------------------- 1 | # https://github.com/upbound/platform-ref-aws/blob/main/crossplane.yaml 2 | 3 | apiVersion: meta.pkg.crossplane.io/v1alpha1 4 | kind: Configuration 5 | metadata: 6 | name: platform-ref-aws 7 | annotations: 8 | meta.crossplane.io/maintainer: Jared Watts 9 | meta.crossplane.io/source: github.com/upbound/platform-ref-aws 10 | meta.crossplane.io/license: Apache-2.0 11 | meta.crossplane.io/description: | 12 | This reference platform Configuration for Kubernetes and Data Services 13 | is a starting point to build, run, and operate your own internal cloud 14 | platform and offer a self-service console and API to your internal teams. 15 | 16 | meta.crossplane.io/readme: | 17 | This reference platform `Configuration` for Kubernetes and Data Services 18 | is a starting point to build, run, and operate your own internal cloud 19 | platform and offer a self-service console and API to your internal teams. 20 | It provides platform APIs to provision fully configured EKS clusters, 21 | with secure networking, and stateful cloud services (RDS) designed to 22 | securely connect to the nodes in each EKS cluster -- all composed using 23 | cloud service primitives from the [Crossplane AWS 24 | Provider](https://doc.crds.dev/github.com/crossplane/provider-aws). App 25 | deployments can securely connect to the infrastructure they need using 26 | secrets distributed directly to the app namespace. 27 | 28 | [Quickstart 29 | Guide](https://github.com/upbound/platform-ref-aws/#quick-start) 30 | 31 | [APIs in this 32 | Configuration](https://github.com/upbound/platform-ref-aws/#apis-in-this-configuration) 33 | 34 | To learn more checkout the [GitHub 35 | repo](https://github.com/upbound/platform-ref-aws/) that you can copy and 36 | customize to meet the exact needs of your organization! 37 | 38 | meta.crossplane.io/iconURI: data:image/svg+xml;base64,CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNjUiIGhlaWdodD0iNjUiPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PHJlY3Qgd2lkdGg9IjY1IiBoZWlnaHQ9IjY1IiBmaWxsPSIjMjMyRjNFIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHJ4PSIxNiIvPjxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik0yMy4yNDYzNjU2IDI5Ljk2ODk5N2MwIC41NjQxODQ0LjA1NjQyNDYgMS4wMjE2MzEyLjE1NTE2NzYgMS4zNTcwOTIyLjExMjg0OTIuMzM1NDYxLjI1MzkxMDcuNzAxNDE4NC40NTEzOTY4IDEuMDk3ODcyMy4wNzA1MzA4LjEyMTk4NTguMDk4NzQzMS4yNDM5NzE2LjA5ODc0MzEuMzUwNzA5MiAwIC4xNTI0ODIzLS4wODQ2MzY5LjMwNDk2NDYtLjI2ODAxNjkuNDU3NDQ2OGwtLjg4ODY4NzUuNjQwNDI1NmMtLjEyNjk1NTMuMDkxNDg5My0uMjU0MDUxNy4xMzcyMzQtLjM2Njc1OTkuMTM3MjM0LS4xNDEwNjE1IDAtLjI4MjEyMy0uMDc2MjQxMS0uNDIzMTg0NS0uMjEzNDc1Mi0uMTk3NDg2MS0uMjI4NzIzNC0uMzY2NzU5OS0uNDcyNjk1LS41MDc4MjE0LS43MTY2NjY2LS4xNDEwNjE1LS4yNTkyMTk5LS4yODIxMjMtLjU0ODkzNjItLjQzNzI5MDYtLjg5OTY0NTQtMS4xMDA0MjA3OCAxLjQwMjgzNjgtMi40ODI2ODI0MiAyLjEwNDI1NTMtNC4xNDcyMDgxMyAyLjEwNDI1NTMtMS4xODQ5MTY2MSAwLTIuMTMwMDI4NjYtLjM2NTk1NzUtMi44MjEyMzAwMi0xLjA5Nzg3MjQtLjY5MTIwMTM1LS43MzE5MTQ4LTEuMDQzODU1MS0xLjcwNzgwMTQtMS4wNDM4NTUxLTIuOTI3NjU5NSAwLTEuMjk2MDk5MzIuNDIzMDQzNDQtMi4zNDgyMjY5OCAxLjI4MzY1OTY1LTMuMTQxMTM0NzguODYwNDc1MTYtLjc5MjkwNzggMi4wMDMwNzMzMS0xLjE4OTM2MTcgMy40NTYwMDY3Ny0xLjE4OTM2MTcuNDc5NDY4MDQgMCAuOTczMzI0MzYuMDQ1NzQ0NjggMS40OTUyNTE5MS4xMjE5ODU4MS41MjE5Mjc1NS4wNzYyNDExNCAxLjA1Nzk2MTI2LjE5ODIyNjk1IDEuNjIyMjA3MjYuMzM1NDYxdi0xLjExMzEyMDU3YzAtMS4xNTg4NjUyNS0uMjI1Njk4NC0xLjk2NzAyMTI4LS42NjI5ODkwNS0yLjQzOTcxNjMxLS40NTEzOTY4MS0uNDcyNjk1MDQtMS4yMTMxMjg5MS0uNzAxNDE4NDQtMi4yOTkzMDI0Ny0uNzAxNDE4NDQtLjQ5MzcxNTI1IDAtMS4wMDE1MzY2NS4wNjA5OTI5MS0xLjUyMzQ2NDIuMTk4MjI2OTUtLjUyMTkyNzU2LjEzNzIzNDA0LTEuMDI5NzQ4OTYuMzA0OTY0NTQtMS41MjM0NjQyMS41MTg0Mzk3MS0uMjI1Njk4NC4xMDY3Mzc1OS0uMzk0OTcyMi4xNjc3MzA1LS40OTM3MTUyNi4xOTgyMjY5Ni0uMDk4NzQzMDUuMDMwNDk2NDUtLjE2OTI3MzguMDQ1NzQ0NjgtLjIyNTgzOTQ2LjA0NTc0NDY4LS4xOTczNDUwNCAwLS4yOTYwODgwOS0uMTUyNDgyMjctLjI5NjA4ODA5LS40NzI2OTUwNHYtLjc0NzE2MzEyYzAtLjI0Mzk3MTYzLjAyODIxMjMtLjQyNjk1MDM1LjA5ODc0MzA1LS41MzM2ODc5NHMuMTk3MzQ1MDQtLjIxMzQ3NTE4LjM5NDk3MjItLjMyMDIxMjc3Yy40OTM1NzQyLS4yNzQ0NjgwOCAxLjA4NjE3MzU2LS41MDMxOTE0OSAxLjc3NzM3NDkxLS42ODYxNzAyMS42OTEyMDEzNi0uMTk4MjI2OTUgMS40MjQ3MjExNi0uMjg5NzE2MzEgMi4yMDA1NTk0Mi0uMjg5NzE2MzEgMS42Nzg2MzE4NSAwIDIuOTA1ODY2OTIuNDExNzAyMTIgMy42OTU4MTEzMiAxLjIzNTEwNjM4Ljc3NTgzODIuODIzNDA0MjUgMS4xNzA4MTA1IDIuMDczNzU4ODYgMS4xNzA4MTA1IDMuNzUxMDYzODNWMjkuOTY4OTk3aC4wMjgyMTIzem0tNS43MjcwOTY5OCAyLjMxNzczMDVjLjQ2NTUwMjk1IDAgLjk0NDk3MDk5LS4wOTE0ODk0IDEuNDUyOTMzNDYtLjI3NDQ2ODEuNTA3ODIxNC0uMTgyOTc4OC45NTkyMTgyLS41MTg0Mzk3IDEuMzQwMDg0MjYtLjk3NTg4NjYuMjI1Njk4NC0uMjg5NzE2My4zOTQ4MzExNC0uNjA5OTI5LjQ3OTYwOTEtLjk3NTg4NjUuMDg0NjM2OS0uMzY1OTU3NC4xNDEwNjE1LS44MDgxNTYwMS4xNDEwNjE1LTEuMzI2NTk1NzJ2LS42NDA0MjU1M2MtLjQwOTA3ODM1LS4xMDY3Mzc1OS0uODQ2MzY5MDEtLjE5ODIyNjk1LTEuMjk3NzY1ODEtLjI1OTIxOTg2LS40NTEzOTY4LS4wNjA5OTI5MS0uODg4Njg3NDUtLjA5MTQ4OTM2LTEuMzI1OTc4MS0uMDkxNDg5MzYtLjk0NTExMjA2IDAtMS42MzYzMTM0MS4xOTgyMjY5NS0yLjEwMTgxNjM3LjYwOTkyOTA3LS40NjU1MDI5NS40MTE3MDIxMy0uNjkxMjAxMzUuOTkxMTM0NzYtLjY5MTIwMTM1IDEuNzUzNTQ2MSAwIC43MTY2NjY3LjE2OTI3MzggMS4yNTAzNTQ2LjUyMTkyNzU1IDEuNjE2MzEyMS4zMzg1NDc2MS4zODEyMDU2LjgzMjI2Mjg2LjU2NDE4NDQgMS40ODExNDU3Ni41NjQxODQ0ek0yOC44NDY1MDcxIDMzLjkzMzUzNmMtLjI1MzkxMDcgMC0uNDIzMTg0NS0uMDQ1NzQ0Ny0uNTM2MDMzNy0uMTUyNDgyMy0uMTEyODQ5Mi0uMDkxNDg5NC0uMjExNTkyMi0uMzA0OTY0NS0uMjk2MjI5MS0uNTk0NjgwOUwyNC42OTkyOTkgMjEuMzk5NDkzNDFjLS4wODQ3NzgtLjMwNDk2NDUzLS4xMjY5NTUzLS41MDMxOTE0OC0uMTI2OTU1My0uNjA5OTI5MDcgMC0uMjQzOTcxNjMuMTEyNzA4MS0uMzgxMjA1NjguMzM4NTQ3Ni0uMzgxMjA1NjhoMS4zODI0MDI3Yy4yNjc4NzU4IDAgLjQ1MTM5NjguMDQ1NzQ0NjguNTUwMTM5OC4xNTI0ODIyNy4xMTI4NDkyLjA5MTQ4OTM2LjE5NzQ4NjEuMzA0OTY0NTQuMjgyMTIzLjU5NDY4MDg1TDI5LjQ5NTM5IDMxLjI0OTg0OGwyLjIwMDQxODQtMTAuMDk0MzI2MjJjLjA3MDY3MTgtLjMwNDk2NDU0LjE1NTE2NzYtLjUwMzE5MTQ5LjI2ODE1NzktLjU5NDY4MDg1LjExMjg0OTItLjA5MTQ4OTM2LjMxMDE5NDItLjE1MjQ4MjI3LjU2NDI0Ni0uMTUyNDgyMjdoMS4xMjg0OTJjLjI2Nzg3NTggMCAuNDUxMzk2OC4wNDU3NDQ2OC41NjQyNDYuMTUyNDgyMjcuMTEyODQ5Mi4wOTE0ODkzNi4yMTE1OTIzLjMwNDk2NDU0LjI2ODAxNjkuNTk0NjgwODVsMi4yMjg2MzA2IDEwLjIxNjMxMjAyIDIuNDQwNTA1LTEwLjIxNjMxMjAyYy4wODQ2MzY5LS4zMDQ5NjQ1NC4xODMzOC0uNTAzMTkxNDkuMjgyMTIzLS41OTQ2ODA4NS4xMTI4NDkyLS4wOTE0ODkzNi4yOTYyMjkyLS4xNTI0ODIyNy41NTAxMzk5LS4xNTI0ODIyN2gxLjMxMTg3MTljLjIyNTY5ODQgMCAuMzUyNjUzOC4xMjE5ODU4Mi4zNTI2NTM4LjM4MTIwNTY4IDAgLjA3NjI0MTEzLS4wMTQxMDYyLjE1MjQ4MjI3LS4wMjgyMTIzLjI0Mzk3MTYzLS4wMTQyNDcyLjA5MTQ4OTM2LS4wNDIzMTg1LjIxMzQ3NTE3LS4wOTg3NDMxLjM4MTIwNTY3TDM4LjEyODM1MzkgMzMuMjAxNjIxMWMtLjA4NDc3OC4zMDQ5NjQ1LS4xODM1MjEuNTAzMTkxNS0uMjk2MzcwMi41OTQ2ODA4LS4xMTI3MDgyLjA5MTQ4OTQtLjI5NjA4ODEuMTUyNDgyMy0uNTM1ODkyNy4xNTI0ODIzaC0xLjIxMzI2OTljLS4yNjc4NzU4IDAtLjQ1MTI1NTgtLjA0NTc0NDctLjU2NDI0Ni0uMTUyNDgyMy0uMTEyODQ5Mi0uMTA2NzM3Ni0uMjExNTkyMy0uMzA0OTY0NS0uMjY3ODc1OC0uNjA5OTI5MWwtMi4xODY0NTMzLTkuODM1MTA2MzQtMi4xNzIzNDcxIDkuODE5ODU4MTRjLS4wNzA2NzE4LjMwNDk2NDYtLjE1NTE2NzcuNTAzMTkxNS0uMjY4MDE2OS42MDk5MjkxLS4xMTI4NDkyLjEwNjczNzYtLjMxMDMzNTMuMTUyNDgyMy0uNTY0MjQ2LjE1MjQ4MjNoLTEuMjEzMTI4OXptMTguMTI2NDAyOS40MTE3MDIxYy0uNzMzNTE5OCAwLTEuNDY3MDM5Ni0uMDkxNDg5NC0yLjE3MjM0NzEtLjI3NDQ2ODFzLTEuMjU1NDQ3NC0uMzgxMjA1Ny0xLjYyMjIwNzMtLjYwOTkyOTFjLS4yMjU2OTg0LS4xMzcyMzQtLjM4MTAwNzEtLjI4OTcxNjMtLjQzNzI5MDYtLjQyNjk1MDMtLjA1NjQyNDYtLjEzNzIzNDEtLjA4NDYzNjktLjI4OTcxNjMtLjA4NDYzNjktLjQyNjk1MDR2LS43Nzc2NTk2YzAtLjMyMDIxMjcuMTEyODQ5Mi0uNDcyNjk1LjMyNDQ0MTQtLjQ3MjY5NS4wODQ2MzY5IDAgLjE2OTEzMjcuMDE1MjQ4Mi4yNTM3Njk2LjA0NTc0NDcuMDg0Nzc4LjAzMDQ5NjQuMjExNTkyMy4wOTE0ODk0LjM1Mjc5NDkuMTUyNDgyMy40Nzk0NjguMjI4NzIzNCAxLjAwMTUzNjYuNDExNzAyMSAxLjU1MTUzNTQuNTMzNjg3OS41NjQzODcxLjEyMTk4NTggMS4xMTQzODU5LjE4Mjk3ODcgMS42Nzg3NzI5LjE4Mjk3ODcuODg4Njg3NSAwIDEuNTc5ODg4OC0uMTY3NzMwNSAyLjA1OTM1NjktLjUwMzE5MTUuNDc5NzUwMS0uMzM1NDYxLjczMzY2MDgtLjgyMzQwNDIuNzMzNjYwOC0xLjQ0ODU4MTUgMC0uNDI2OTUwNC0uMTI2OTU1My0uNzc3NjU5Ni0uMzgxMDA3MS0xLjA2NzM3NTkxLS4yNTM3Njk2LS4yODk3MTYzMS0uNzMzMzc4Ny0uNTQ4OTM2MTctMS40MjQ3MjExLS43OTI5MDc4bC0yLjA0NTI1MDctLjY4NjE3MDIxYy0xLjAyOTc0OS0uMzUwNzA5MjItMS43OTE0ODExLS44NjkxNDg5NC0yLjI1Njk4NC0xLjU1NTMxOTE1LS40NjU1MDMtLjY3MDkyMTk5LS43MDU0NDg2LTEuNDE4MDg1MTEtLjcwNTQ0ODYtMi4yMTA5OTI5MSAwLS42NDA0MjU1My4xMjcwOTY0LTEuMjA0NjA5OTMuMzgxMDA3MS0xLjY5MjU1MzE5LjI1Mzc2OTYtLjQ4Nzk0MzI2LjU5MjQ1ODMtLjkxNDg5MzYyIDEuMDE1NjQyOC0xLjI1MDM1NDYxLjQyMzE4NDUtLjM1MDcwOTIyLjkwMjc5MzYtLjYwOTkyOTA4IDEuNDY3MDM5Ni0uNzkyOTA3OC41NjQyNDYtLjE4Mjk3ODcyIDEuMTU2NzA0My0uMjU5MjE5ODYgMS43NzczNzQ5LS4yNTkyMTk4Ni4zMTAxOTQzIDAgLjYzNDc3NjguMDE1MjQ4MjMuOTQ0OTcxLjA2MDk5MjkxLjMyNDU4MjUuMDQ1NzQ0NjguNjIwNjcwNi4xMDY3Mzc1OS45MTY4OTk4LjE2NzczMDUuMjgyMTIzLjA3NjI0MTEzLjU1MDEzOTguMTUyNDgyMjcuODA0MTkxNi4yNDM5NzE2My4yNTM3Njk2LjA5MTQ4OTM2LjQ1MTM5NjguMTgyOTc4NzIuNTkyNDU4My4yNzQ0NjgwOC4xOTc0ODYxLjEyMTk4NTgyLjMzODU0NzYuMjQzOTcxNjMuNDIzMTg0NS4zODEyMDU2OC4wODQ2MzY5LjEyMTk4NTgxLjEyNjk1NTMuMjg5NzE2MzEuMTI2OTU1My41MDMxOTE0OXYuNzE2NjY2NjZjMCAuMzIwMjEyNzctLjExMjg0OTIuNDg3OTQzMjYtLjMyNDQ0MTQuNDg3OTQzMjYtLjExMjg0OTIgMC0uMjk2MjI5Mi0uMDYwOTkyOS0uNTM2MDMzNy0uMTgyOTc4NzItLjgwNDA1MDYtLjM5NjQ1MzktMS43MDY4NDQyLS41OTQ2ODA4NS0yLjcwODM4MDgtLjU5NDY4MDg1LS44MDQwNTA2IDAtMS40Mzg4MjczLjEzNzIzNDA0LTEuODc2MTE4LjQyNjk1MDM1LS40MzcyOTA2LjI4OTcxNjMyLS42NjI5ODkuNzMxOTE0OS0uNjYyOTg5IDEuMzU3MDkyMiAwIC40MjY5NTAzNi4xNDEwNjE1Ljc5MjkwNzguNDIzMTg0NSAxLjA4MjYyNDEyLjI4MjEyMy4yODk3MTYzMS44MDQwNTA1LjU3OTQzMjYyIDEuNTUxNjc2NS44Mzg2NTI0OGwyLjAwMzA3MzMuNjg2MTcwMjFjMS4wMTU2NDI4LjM1MDcwOTIyIDEuNzQ5MTYyNi44Mzg2NTI0OCAyLjE4NjQ1MzIgMS40NjM4Mjk3OS40MzcyOTA3LjYyNTE3NzMuNjQ4ODgzIDEuMzQxODQzOTcuNjQ4ODgzIDIuMTM0NzUxNzUgMCAuNjU1NjczOC0uMTI2OTU1NCAxLjI1MDM1NDYtLjM2Njc1OTkgMS43Njg3OTQzLS4yNTM5MTA4LjUxODQzOTgtLjU5MjQ1ODQuOTc1ODg2Ni0xLjAyOTc0OSAxLjM0MTg0NC0uNDM3MjkwNy4zODEyMDU3LS45NTkyMTgyLjY1NTY3MzgtMS41NjU3ODI3Ljg1MzkwMDctLjYzNDc3NjcuMjEzNDc1Mi0xLjI5Nzc2NTguMzIwMjEyOC0yLjAxNzE3OTQuMzIwMjEyOHoiLz48cGF0aCBmaWxsPSIjRkY5OTAwIiBkPSJNNDkuODc1NTA3IDQxLjAwNTkzNzJjLTQuNzA1MTM2NyAzLjY3NDQwNTEtMTEuNTQxMTcxMiA1LjYyNTAxNTItMTcuNDE4ODczOCA1LjYyNTAxNTItOC4yMzc1NjQ2IDAtMTUuNjU5OTUzNjEtMy4yMjA3NzQ4LTIxLjI2NjA3Mzk4LTguNTczNjExOS0uNDQzNDg0MTYtLjQyMzM4ODItLjA0MjkwMzk4LS45OTc5ODY1LjQ4NjI0NTE0LS42NjUzMjQ0IDYuMDYzNzYyODUgMy43MTk3NjgyIDEzLjU0MzIxNDE0IDUuOTcyNzk4NCAyMS4yODAzNzUyNCA1Ljk3Mjc5ODQgNS4yMTk5ODQ2IDAgMTAuOTU0ODE2OS0xLjE0OTE5NjYgMTYuMjMyMDA2Ny0zLjUwODA3NC43ODY1NzMtLjM3ODAyNTIgMS40NTg3MzU0LjU0NDM1NjMuNjg2MzIwNyAxLjE0OTE5Njd6bTEuOTU5NDI0OS0yLjM1ODg3NzNjLS42MDA3OTg4LS44MTY1MzQ1LTMuOTc1NzY5LS4zOTMxNDYzLTUuNTA2MDExMS0uMTk2NTczMi0uNDU3Nzg1NS4wNjA0ODQxLS41MjkyOTIxLS4zNjI5MDQyLS4xMTQ0MTA2LS42ODA0NDUzIDIuNjg4NjQ5Ni0xLjk5NTk3MzIgNy4xMDc2MTY3LTEuNDIxMzc0OCA3LjYyMjYwNzYtLjc1NjA1MDUuNTE0ODQ3Ny42ODA0NDU0LS4xNDMwMTMzIDUuMzUyODM3MS0yLjY2MDE5IDcuNTkwNzQ2My0uMzg1OTkyOC4zNDc3ODMyLS43NTc4MjczLjE2NjMzMTEtLjU4NjM1NDQtLjI4NzI5OTEuNTcyMDUzMS0xLjQ5Njk3OTkgMS44NDUwMTQzLTQuODY4OTY0OCAxLjI0NDM1ODUtNS42NzAzNzgyeiIvPjwvZz48L3N2Zz4= 39 | 40 | friendly-name.meta.crossplane.io: AWS Reference Platform 41 | friendly-group-name.meta.crossplane.io/aws.platformref.crossplane.io: AWS 42 | 43 | friendly-kind-name.meta.crossplane.io/compositenetwork.aws.platformref.crossplane.io: Composite Network 44 | friendly-kind-name.meta.crossplane.io/network.aws.platformref.crossplane.io: Network 45 | 46 | friendly-kind-name.meta.crossplane.io/compositecluster.aws.platformref.crossplane.io: Composite Kubernetes Cluster 47 | friendly-kind-name.meta.crossplane.io/cluster.aws.platformref.crossplane.io: Kubernetes Cluster 48 | 49 | friendly-kind-name.meta.crossplane.io/services.aws.platformref.crossplane.io: Cluster Services 50 | friendly-kind-name.meta.crossplane.io/eks.aws.platformref.crossplane.io: EKS Cluster 51 | 52 | # TODO(negz): Remove these older style annotations once annotation consumers 53 | # have had a chance to update. 54 | company: Upbound 55 | maintainer: Jared Watts 56 | keywords: aws, cloud-native, kubernetes, example, platform, reference 57 | source: github.com/upbound/platform-ref-aws 58 | license: Apache-2.0 59 | descriptionShort: | 60 | The AWS reference platform for Kubernetes and Data Services. 61 | 62 | description: | 63 | This reference platform Configuration for Kubernetes and Data Services 64 | is a starting point to build, run, and operate your own internal cloud 65 | platform and offer a self-service console and API to your internal teams. 66 | 67 | readme: | 68 | This reference platform `Configuration` for Kubernetes and Data Services 69 | is a starting point to build, run, and operate your own internal cloud 70 | platform and offer a self-service console and API to your internal teams. 71 | It provides platform APIs to provision fully configured EKS clusters, 72 | with secure networking, and stateful cloud services (RDS) designed to 73 | securely connect to the nodes in each EKS cluster -- all composed using 74 | cloud service primitives from the [Crossplane AWS 75 | Provider](https://doc.crds.dev/github.com/crossplane/provider-aws). App 76 | deployments can securely connect to the infrastructure they need using 77 | secrets distributed directly to the app namespace. 78 | 79 | [Quickstart 80 | Guide](https://github.com/upbound/platform-ref-aws/#quick-start) 81 | 82 | [APIs in this 83 | Configuration](https://github.com/upbound/platform-ref-aws/#apis-in-this-configuration) 84 | 85 | To learn more checkout the [GitHub 86 | repo](https://github.com/upbound/platform-ref-aws/) that you can copy and 87 | customize to meet the exact needs of your organization! 88 | 89 | iconData: CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNjUiIGhlaWdodD0iNjUiPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PHJlY3Qgd2lkdGg9IjY1IiBoZWlnaHQ9IjY1IiBmaWxsPSIjMjMyRjNFIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHJ4PSIxNiIvPjxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik0yMy4yNDYzNjU2IDI5Ljk2ODk5N2MwIC41NjQxODQ0LjA1NjQyNDYgMS4wMjE2MzEyLjE1NTE2NzYgMS4zNTcwOTIyLjExMjg0OTIuMzM1NDYxLjI1MzkxMDcuNzAxNDE4NC40NTEzOTY4IDEuMDk3ODcyMy4wNzA1MzA4LjEyMTk4NTguMDk4NzQzMS4yNDM5NzE2LjA5ODc0MzEuMzUwNzA5MiAwIC4xNTI0ODIzLS4wODQ2MzY5LjMwNDk2NDYtLjI2ODAxNjkuNDU3NDQ2OGwtLjg4ODY4NzUuNjQwNDI1NmMtLjEyNjk1NTMuMDkxNDg5My0uMjU0MDUxNy4xMzcyMzQtLjM2Njc1OTkuMTM3MjM0LS4xNDEwNjE1IDAtLjI4MjEyMy0uMDc2MjQxMS0uNDIzMTg0NS0uMjEzNDc1Mi0uMTk3NDg2MS0uMjI4NzIzNC0uMzY2NzU5OS0uNDcyNjk1LS41MDc4MjE0LS43MTY2NjY2LS4xNDEwNjE1LS4yNTkyMTk5LS4yODIxMjMtLjU0ODkzNjItLjQzNzI5MDYtLjg5OTY0NTQtMS4xMDA0MjA3OCAxLjQwMjgzNjgtMi40ODI2ODI0MiAyLjEwNDI1NTMtNC4xNDcyMDgxMyAyLjEwNDI1NTMtMS4xODQ5MTY2MSAwLTIuMTMwMDI4NjYtLjM2NTk1NzUtMi44MjEyMzAwMi0xLjA5Nzg3MjQtLjY5MTIwMTM1LS43MzE5MTQ4LTEuMDQzODU1MS0xLjcwNzgwMTQtMS4wNDM4NTUxLTIuOTI3NjU5NSAwLTEuMjk2MDk5MzIuNDIzMDQzNDQtMi4zNDgyMjY5OCAxLjI4MzY1OTY1LTMuMTQxMTM0NzguODYwNDc1MTYtLjc5MjkwNzggMi4wMDMwNzMzMS0xLjE4OTM2MTcgMy40NTYwMDY3Ny0xLjE4OTM2MTcuNDc5NDY4MDQgMCAuOTczMzI0MzYuMDQ1NzQ0NjggMS40OTUyNTE5MS4xMjE5ODU4MS41MjE5Mjc1NS4wNzYyNDExNCAxLjA1Nzk2MTI2LjE5ODIyNjk1IDEuNjIyMjA3MjYuMzM1NDYxdi0xLjExMzEyMDU3YzAtMS4xNTg4NjUyNS0uMjI1Njk4NC0xLjk2NzAyMTI4LS42NjI5ODkwNS0yLjQzOTcxNjMxLS40NTEzOTY4MS0uNDcyNjk1MDQtMS4yMTMxMjg5MS0uNzAxNDE4NDQtMi4yOTkzMDI0Ny0uNzAxNDE4NDQtLjQ5MzcxNTI1IDAtMS4wMDE1MzY2NS4wNjA5OTI5MS0xLjUyMzQ2NDIuMTk4MjI2OTUtLjUyMTkyNzU2LjEzNzIzNDA0LTEuMDI5NzQ4OTYuMzA0OTY0NTQtMS41MjM0NjQyMS41MTg0Mzk3MS0uMjI1Njk4NC4xMDY3Mzc1OS0uMzk0OTcyMi4xNjc3MzA1LS40OTM3MTUyNi4xOTgyMjY5Ni0uMDk4NzQzMDUuMDMwNDk2NDUtLjE2OTI3MzguMDQ1NzQ0NjgtLjIyNTgzOTQ2LjA0NTc0NDY4LS4xOTczNDUwNCAwLS4yOTYwODgwOS0uMTUyNDgyMjctLjI5NjA4ODA5LS40NzI2OTUwNHYtLjc0NzE2MzEyYzAtLjI0Mzk3MTYzLjAyODIxMjMtLjQyNjk1MDM1LjA5ODc0MzA1LS41MzM2ODc5NHMuMTk3MzQ1MDQtLjIxMzQ3NTE4LjM5NDk3MjItLjMyMDIxMjc3Yy40OTM1NzQyLS4yNzQ0NjgwOCAxLjA4NjE3MzU2LS41MDMxOTE0OSAxLjc3NzM3NDkxLS42ODYxNzAyMS42OTEyMDEzNi0uMTk4MjI2OTUgMS40MjQ3MjExNi0uMjg5NzE2MzEgMi4yMDA1NTk0Mi0uMjg5NzE2MzEgMS42Nzg2MzE4NSAwIDIuOTA1ODY2OTIuNDExNzAyMTIgMy42OTU4MTEzMiAxLjIzNTEwNjM4Ljc3NTgzODIuODIzNDA0MjUgMS4xNzA4MTA1IDIuMDczNzU4ODYgMS4xNzA4MTA1IDMuNzUxMDYzODNWMjkuOTY4OTk3aC4wMjgyMTIzem0tNS43MjcwOTY5OCAyLjMxNzczMDVjLjQ2NTUwMjk1IDAgLjk0NDk3MDk5LS4wOTE0ODk0IDEuNDUyOTMzNDYtLjI3NDQ2ODEuNTA3ODIxNC0uMTgyOTc4OC45NTkyMTgyLS41MTg0Mzk3IDEuMzQwMDg0MjYtLjk3NTg4NjYuMjI1Njk4NC0uMjg5NzE2My4zOTQ4MzExNC0uNjA5OTI5LjQ3OTYwOTEtLjk3NTg4NjUuMDg0NjM2OS0uMzY1OTU3NC4xNDEwNjE1LS44MDgxNTYwMS4xNDEwNjE1LTEuMzI2NTk1NzJ2LS42NDA0MjU1M2MtLjQwOTA3ODM1LS4xMDY3Mzc1OS0uODQ2MzY5MDEtLjE5ODIyNjk1LTEuMjk3NzY1ODEtLjI1OTIxOTg2LS40NTEzOTY4LS4wNjA5OTI5MS0uODg4Njg3NDUtLjA5MTQ4OTM2LTEuMzI1OTc4MS0uMDkxNDg5MzYtLjk0NTExMjA2IDAtMS42MzYzMTM0MS4xOTgyMjY5NS0yLjEwMTgxNjM3LjYwOTkyOTA3LS40NjU1MDI5NS40MTE3MDIxMy0uNjkxMjAxMzUuOTkxMTM0NzYtLjY5MTIwMTM1IDEuNzUzNTQ2MSAwIC43MTY2NjY3LjE2OTI3MzggMS4yNTAzNTQ2LjUyMTkyNzU1IDEuNjE2MzEyMS4zMzg1NDc2MS4zODEyMDU2LjgzMjI2Mjg2LjU2NDE4NDQgMS40ODExNDU3Ni41NjQxODQ0ek0yOC44NDY1MDcxIDMzLjkzMzUzNmMtLjI1MzkxMDcgMC0uNDIzMTg0NS0uMDQ1NzQ0Ny0uNTM2MDMzNy0uMTUyNDgyMy0uMTEyODQ5Mi0uMDkxNDg5NC0uMjExNTkyMi0uMzA0OTY0NS0uMjk2MjI5MS0uNTk0NjgwOUwyNC42OTkyOTkgMjEuMzk5NDkzNDFjLS4wODQ3NzgtLjMwNDk2NDUzLS4xMjY5NTUzLS41MDMxOTE0OC0uMTI2OTU1My0uNjA5OTI5MDcgMC0uMjQzOTcxNjMuMTEyNzA4MS0uMzgxMjA1NjguMzM4NTQ3Ni0uMzgxMjA1NjhoMS4zODI0MDI3Yy4yNjc4NzU4IDAgLjQ1MTM5NjguMDQ1NzQ0NjguNTUwMTM5OC4xNTI0ODIyNy4xMTI4NDkyLjA5MTQ4OTM2LjE5NzQ4NjEuMzA0OTY0NTQuMjgyMTIzLjU5NDY4MDg1TDI5LjQ5NTM5IDMxLjI0OTg0OGwyLjIwMDQxODQtMTAuMDk0MzI2MjJjLjA3MDY3MTgtLjMwNDk2NDU0LjE1NTE2NzYtLjUwMzE5MTQ5LjI2ODE1NzktLjU5NDY4MDg1LjExMjg0OTItLjA5MTQ4OTM2LjMxMDE5NDItLjE1MjQ4MjI3LjU2NDI0Ni0uMTUyNDgyMjdoMS4xMjg0OTJjLjI2Nzg3NTggMCAuNDUxMzk2OC4wNDU3NDQ2OC41NjQyNDYuMTUyNDgyMjcuMTEyODQ5Mi4wOTE0ODkzNi4yMTE1OTIzLjMwNDk2NDU0LjI2ODAxNjkuNTk0NjgwODVsMi4yMjg2MzA2IDEwLjIxNjMxMjAyIDIuNDQwNTA1LTEwLjIxNjMxMjAyYy4wODQ2MzY5LS4zMDQ5NjQ1NC4xODMzOC0uNTAzMTkxNDkuMjgyMTIzLS41OTQ2ODA4NS4xMTI4NDkyLS4wOTE0ODkzNi4yOTYyMjkyLS4xNTI0ODIyNy41NTAxMzk5LS4xNTI0ODIyN2gxLjMxMTg3MTljLjIyNTY5ODQgMCAuMzUyNjUzOC4xMjE5ODU4Mi4zNTI2NTM4LjM4MTIwNTY4IDAgLjA3NjI0MTEzLS4wMTQxMDYyLjE1MjQ4MjI3LS4wMjgyMTIzLjI0Mzk3MTYzLS4wMTQyNDcyLjA5MTQ4OTM2LS4wNDIzMTg1LjIxMzQ3NTE3LS4wOTg3NDMxLjM4MTIwNTY3TDM4LjEyODM1MzkgMzMuMjAxNjIxMWMtLjA4NDc3OC4zMDQ5NjQ1LS4xODM1MjEuNTAzMTkxNS0uMjk2MzcwMi41OTQ2ODA4LS4xMTI3MDgyLjA5MTQ4OTQtLjI5NjA4ODEuMTUyNDgyMy0uNTM1ODkyNy4xNTI0ODIzaC0xLjIxMzI2OTljLS4yNjc4NzU4IDAtLjQ1MTI1NTgtLjA0NTc0NDctLjU2NDI0Ni0uMTUyNDgyMy0uMTEyODQ5Mi0uMTA2NzM3Ni0uMjExNTkyMy0uMzA0OTY0NS0uMjY3ODc1OC0uNjA5OTI5MWwtMi4xODY0NTMzLTkuODM1MTA2MzQtMi4xNzIzNDcxIDkuODE5ODU4MTRjLS4wNzA2NzE4LjMwNDk2NDYtLjE1NTE2NzcuNTAzMTkxNS0uMjY4MDE2OS42MDk5MjkxLS4xMTI4NDkyLjEwNjczNzYtLjMxMDMzNTMuMTUyNDgyMy0uNTY0MjQ2LjE1MjQ4MjNoLTEuMjEzMTI4OXptMTguMTI2NDAyOS40MTE3MDIxYy0uNzMzNTE5OCAwLTEuNDY3MDM5Ni0uMDkxNDg5NC0yLjE3MjM0NzEtLjI3NDQ2ODFzLTEuMjU1NDQ3NC0uMzgxMjA1Ny0xLjYyMjIwNzMtLjYwOTkyOTFjLS4yMjU2OTg0LS4xMzcyMzQtLjM4MTAwNzEtLjI4OTcxNjMtLjQzNzI5MDYtLjQyNjk1MDMtLjA1NjQyNDYtLjEzNzIzNDEtLjA4NDYzNjktLjI4OTcxNjMtLjA4NDYzNjktLjQyNjk1MDR2LS43Nzc2NTk2YzAtLjMyMDIxMjcuMTEyODQ5Mi0uNDcyNjk1LjMyNDQ0MTQtLjQ3MjY5NS4wODQ2MzY5IDAgLjE2OTEzMjcuMDE1MjQ4Mi4yNTM3Njk2LjA0NTc0NDcuMDg0Nzc4LjAzMDQ5NjQuMjExNTkyMy4wOTE0ODk0LjM1Mjc5NDkuMTUyNDgyMy40Nzk0NjguMjI4NzIzNCAxLjAwMTUzNjYuNDExNzAyMSAxLjU1MTUzNTQuNTMzNjg3OS41NjQzODcxLjEyMTk4NTggMS4xMTQzODU5LjE4Mjk3ODcgMS42Nzg3NzI5LjE4Mjk3ODcuODg4Njg3NSAwIDEuNTc5ODg4OC0uMTY3NzMwNSAyLjA1OTM1NjktLjUwMzE5MTUuNDc5NzUwMS0uMzM1NDYxLjczMzY2MDgtLjgyMzQwNDIuNzMzNjYwOC0xLjQ0ODU4MTUgMC0uNDI2OTUwNC0uMTI2OTU1My0uNzc3NjU5Ni0uMzgxMDA3MS0xLjA2NzM3NTkxLS4yNTM3Njk2LS4yODk3MTYzMS0uNzMzMzc4Ny0uNTQ4OTM2MTctMS40MjQ3MjExLS43OTI5MDc4bC0yLjA0NTI1MDctLjY4NjE3MDIxYy0xLjAyOTc0OS0uMzUwNzA5MjItMS43OTE0ODExLS44NjkxNDg5NC0yLjI1Njk4NC0xLjU1NTMxOTE1LS40NjU1MDMtLjY3MDkyMTk5LS43MDU0NDg2LTEuNDE4MDg1MTEtLjcwNTQ0ODYtMi4yMTA5OTI5MSAwLS42NDA0MjU1My4xMjcwOTY0LTEuMjA0NjA5OTMuMzgxMDA3MS0xLjY5MjU1MzE5LjI1Mzc2OTYtLjQ4Nzk0MzI2LjU5MjQ1ODMtLjkxNDg5MzYyIDEuMDE1NjQyOC0xLjI1MDM1NDYxLjQyMzE4NDUtLjM1MDcwOTIyLjkwMjc5MzYtLjYwOTkyOTA4IDEuNDY3MDM5Ni0uNzkyOTA3OC41NjQyNDYtLjE4Mjk3ODcyIDEuMTU2NzA0My0uMjU5MjE5ODYgMS43NzczNzQ5LS4yNTkyMTk4Ni4zMTAxOTQzIDAgLjYzNDc3NjguMDE1MjQ4MjMuOTQ0OTcxLjA2MDk5MjkxLjMyNDU4MjUuMDQ1NzQ0NjguNjIwNjcwNi4xMDY3Mzc1OS45MTY4OTk4LjE2NzczMDUuMjgyMTIzLjA3NjI0MTEzLjU1MDEzOTguMTUyNDgyMjcuODA0MTkxNi4yNDM5NzE2My4yNTM3Njk2LjA5MTQ4OTM2LjQ1MTM5NjguMTgyOTc4NzIuNTkyNDU4My4yNzQ0NjgwOC4xOTc0ODYxLjEyMTk4NTgyLjMzODU0NzYuMjQzOTcxNjMuNDIzMTg0NS4zODEyMDU2OC4wODQ2MzY5LjEyMTk4NTgxLjEyNjk1NTMuMjg5NzE2MzEuMTI2OTU1My41MDMxOTE0OXYuNzE2NjY2NjZjMCAuMzIwMjEyNzctLjExMjg0OTIuNDg3OTQzMjYtLjMyNDQ0MTQuNDg3OTQzMjYtLjExMjg0OTIgMC0uMjk2MjI5Mi0uMDYwOTkyOS0uNTM2MDMzNy0uMTgyOTc4NzItLjgwNDA1MDYtLjM5NjQ1MzktMS43MDY4NDQyLS41OTQ2ODA4NS0yLjcwODM4MDgtLjU5NDY4MDg1LS44MDQwNTA2IDAtMS40Mzg4MjczLjEzNzIzNDA0LTEuODc2MTE4LjQyNjk1MDM1LS40MzcyOTA2LjI4OTcxNjMyLS42NjI5ODkuNzMxOTE0OS0uNjYyOTg5IDEuMzU3MDkyMiAwIC40MjY5NTAzNi4xNDEwNjE1Ljc5MjkwNzguNDIzMTg0NSAxLjA4MjYyNDEyLjI4MjEyMy4yODk3MTYzMS44MDQwNTA1LjU3OTQzMjYyIDEuNTUxNjc2NS44Mzg2NTI0OGwyLjAwMzA3MzMuNjg2MTcwMjFjMS4wMTU2NDI4LjM1MDcwOTIyIDEuNzQ5MTYyNi44Mzg2NTI0OCAyLjE4NjQ1MzIgMS40NjM4Mjk3OS40MzcyOTA3LjYyNTE3NzMuNjQ4ODgzIDEuMzQxODQzOTcuNjQ4ODgzIDIuMTM0NzUxNzUgMCAuNjU1NjczOC0uMTI2OTU1NCAxLjI1MDM1NDYtLjM2Njc1OTkgMS43Njg3OTQzLS4yNTM5MTA4LjUxODQzOTgtLjU5MjQ1ODQuOTc1ODg2Ni0xLjAyOTc0OSAxLjM0MTg0NC0uNDM3MjkwNy4zODEyMDU3LS45NTkyMTgyLjY1NTY3MzgtMS41NjU3ODI3Ljg1MzkwMDctLjYzNDc3NjcuMjEzNDc1Mi0xLjI5Nzc2NTguMzIwMjEyOC0yLjAxNzE3OTQuMzIwMjEyOHoiLz48cGF0aCBmaWxsPSIjRkY5OTAwIiBkPSJNNDkuODc1NTA3IDQxLjAwNTkzNzJjLTQuNzA1MTM2NyAzLjY3NDQwNTEtMTEuNTQxMTcxMiA1LjYyNTAxNTItMTcuNDE4ODczOCA1LjYyNTAxNTItOC4yMzc1NjQ2IDAtMTUuNjU5OTUzNjEtMy4yMjA3NzQ4LTIxLjI2NjA3Mzk4LTguNTczNjExOS0uNDQzNDg0MTYtLjQyMzM4ODItLjA0MjkwMzk4LS45OTc5ODY1LjQ4NjI0NTE0LS42NjUzMjQ0IDYuMDYzNzYyODUgMy43MTk3NjgyIDEzLjU0MzIxNDE0IDUuOTcyNzk4NCAyMS4yODAzNzUyNCA1Ljk3Mjc5ODQgNS4yMTk5ODQ2IDAgMTAuOTU0ODE2OS0xLjE0OTE5NjYgMTYuMjMyMDA2Ny0zLjUwODA3NC43ODY1NzMtLjM3ODAyNTIgMS40NTg3MzU0LjU0NDM1NjMuNjg2MzIwNyAxLjE0OTE5Njd6bTEuOTU5NDI0OS0yLjM1ODg3NzNjLS42MDA3OTg4LS44MTY1MzQ1LTMuOTc1NzY5LS4zOTMxNDYzLTUuNTA2MDExMS0uMTk2NTczMi0uNDU3Nzg1NS4wNjA0ODQxLS41MjkyOTIxLS4zNjI5MDQyLS4xMTQ0MTA2LS42ODA0NDUzIDIuNjg4NjQ5Ni0xLjk5NTk3MzIgNy4xMDc2MTY3LTEuNDIxMzc0OCA3LjYyMjYwNzYtLjc1NjA1MDUuNTE0ODQ3Ny42ODA0NDU0LS4xNDMwMTMzIDUuMzUyODM3MS0yLjY2MDE5IDcuNTkwNzQ2My0uMzg1OTkyOC4zNDc3ODMyLS43NTc4MjczLjE2NjMzMTEtLjU4NjM1NDQtLjI4NzI5OTEuNTcyMDUzMS0xLjQ5Njk3OTkgMS44NDUwMTQzLTQuODY4OTY0OCAxLjI0NDM1ODUtNS42NzAzNzgyeiIvPjwvZz48L3N2Zz4= 90 | spec: 91 | crossplane: 92 | version: ">=v1.0.0-0" 93 | dependsOn: 94 | - provider: registry.upbound.io/crossplane/provider-aws 95 | version: ">=v0.19.0-0" 96 | - provider: registry.upbound.io/crossplane/provider-helm 97 | version: ">=v0.3.6-0" -------------------------------------------------------------------------------- /crossplane-package-testing-with-kuttl/package/network/composition.yaml: -------------------------------------------------------------------------------- 1 | # https://raw.githubusercontent.com/upbound/platform-ref-aws/main/network/composition.yaml 2 | 3 | apiVersion: apiextensions.crossplane.io/v1 4 | kind: Composition 5 | metadata: 6 | name: compositenetworks.aws.platformref.crossplane.io 7 | labels: 8 | provider: aws 9 | spec: 10 | writeConnectionSecretsToNamespace: upbound-system 11 | compositeTypeRef: 12 | apiVersion: aws.platformref.crossplane.io/v1alpha1 13 | kind: CompositeNetwork 14 | resources: 15 | - base: 16 | apiVersion: ec2.aws.crossplane.io/v1beta1 17 | kind: VPC 18 | spec: 19 | forProvider: 20 | region: us-west-2 21 | cidrBlock: 192.168.0.0/16 22 | enableDnsSupport: true 23 | enableDnsHostNames: true 24 | patches: 25 | - fromFieldPath: spec.id 26 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 27 | - base: 28 | apiVersion: ec2.aws.crossplane.io/v1beta1 29 | kind: InternetGateway 30 | spec: 31 | forProvider: 32 | region: us-west-2 33 | vpcIdSelector: 34 | matchControllerRef: true 35 | patches: 36 | - fromFieldPath: spec.id 37 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 38 | - base: 39 | apiVersion: ec2.aws.crossplane.io/v1beta1 40 | kind: Subnet 41 | metadata: 42 | labels: 43 | zone: us-west-2a 44 | access: public 45 | spec: 46 | forProvider: 47 | region: us-west-2 48 | mapPublicIPOnLaunch: true 49 | cidrBlock: 192.168.0.0/18 50 | vpcIdSelector: 51 | matchControllerRef: true 52 | availabilityZone: us-west-2a 53 | tags: 54 | - key: kubernetes.io/role/elb 55 | value: "1" 56 | patches: 57 | - fromFieldPath: spec.id 58 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 59 | - base: 60 | apiVersion: ec2.aws.crossplane.io/v1beta1 61 | kind: Subnet 62 | metadata: 63 | labels: 64 | zone: us-west-2b 65 | access: public 66 | spec: 67 | forProvider: 68 | region: us-west-2 69 | mapPublicIPOnLaunch: true 70 | cidrBlock: 192.168.64.0/18 71 | vpcIdSelector: 72 | matchControllerRef: true 73 | availabilityZone: us-west-2b 74 | tags: 75 | - key: kubernetes.io/role/elb 76 | value: "1" 77 | patches: 78 | - fromFieldPath: spec.id 79 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 80 | - base: 81 | apiVersion: ec2.aws.crossplane.io/v1beta1 82 | kind: Subnet 83 | metadata: 84 | labels: 85 | zone: us-west-2a 86 | access: private 87 | spec: 88 | forProvider: 89 | region: us-west-2 90 | cidrBlock: 192.168.128.0/18 91 | vpcIdSelector: 92 | matchControllerRef: true 93 | availabilityZone: us-west-2a 94 | tags: 95 | - value: shared 96 | key: "" 97 | - key: kubernetes.io/role/internal-elb 98 | value: "1" 99 | patches: 100 | - fromFieldPath: spec.id 101 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 102 | - fromFieldPath: spec.clusterRef.id 103 | toFieldPath: spec.forProvider.tags[0].key 104 | transforms: 105 | - type: string 106 | string: 107 | fmt: "kubernetes.io/cluster/%s" 108 | - base: 109 | apiVersion: ec2.aws.crossplane.io/v1beta1 110 | kind: Subnet 111 | metadata: 112 | labels: 113 | zone: us-west-2b 114 | access: private 115 | spec: 116 | forProvider: 117 | region: us-west-2 118 | cidrBlock: 192.168.192.0/18 119 | vpcIdSelector: 120 | matchControllerRef: true 121 | availabilityZone: us-west-2b 122 | tags: 123 | - value: shared 124 | key: "" 125 | - key: kubernetes.io/role/internal-elb 126 | value: "1" 127 | patches: 128 | - fromFieldPath: spec.id 129 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 130 | - fromFieldPath: spec.clusterRef.id 131 | toFieldPath: spec.forProvider.tags[0].key 132 | transforms: 133 | - type: string 134 | string: 135 | fmt: "kubernetes.io/cluster/%s" 136 | - base: 137 | apiVersion: ec2.aws.crossplane.io/v1beta1 138 | kind: RouteTable 139 | spec: 140 | forProvider: 141 | region: us-west-2 142 | vpcIdSelector: 143 | matchControllerRef: true 144 | routes: 145 | - destinationCidrBlock: 0.0.0.0/0 146 | gatewayIdSelector: 147 | matchControllerRef: true 148 | associations: 149 | - subnetIdSelector: 150 | matchControllerRef: true 151 | matchLabels: 152 | zone: us-west-2a 153 | access: public 154 | - subnetIdSelector: 155 | matchControllerRef: true 156 | matchLabels: 157 | zone: us-west-2b 158 | access: public 159 | - subnetIdSelector: 160 | matchControllerRef: true 161 | matchLabels: 162 | zone: us-west-2a 163 | access: private 164 | - subnetIdSelector: 165 | matchControllerRef: true 166 | matchLabels: 167 | zone: us-west-2b 168 | access: private 169 | patches: 170 | - fromFieldPath: spec.id 171 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] 172 | - base: 173 | apiVersion: ec2.aws.crossplane.io/v1beta1 174 | kind: SecurityGroup 175 | spec: 176 | forProvider: 177 | region: us-west-2 178 | vpcIdSelector: 179 | matchControllerRef: true 180 | groupName: platform-ref-aws-cluster 181 | description: Allow access to PostgreSQL 182 | ingress: 183 | - fromPort: 5432 184 | toPort: 5432 185 | ipProtocol: tcp 186 | ipRanges: 187 | - cidrIp: 0.0.0.0/0 188 | description: Everywhere 189 | patches: 190 | - fromFieldPath: spec.id 191 | toFieldPath: metadata.labels[networks.aws.platformref.crossplane.io/network-id] -------------------------------------------------------------------------------- /crossplane-package-testing-with-kuttl/package/network/definition.yaml: -------------------------------------------------------------------------------- 1 | # https://raw.githubusercontent.com/upbound/platform-ref-aws/main/network/definition.yaml 2 | 3 | apiVersion: apiextensions.crossplane.io/v1 4 | kind: CompositeResourceDefinition 5 | metadata: 6 | name: compositenetworks.aws.platformref.crossplane.io 7 | annotations: 8 | upbound.io/ui-schema: |- 9 | --- 10 | configSections: 11 | - title: Network Info 12 | description: Information about this network fabric 13 | items: 14 | - name: id 15 | controlType: singleInput 16 | type: string 17 | path: ".spec.id" 18 | title: Network ID 19 | description: Network ID that other objects will use to refer (and connect) to this network fabric 20 | default: platform-ref-aws-network 21 | validation: 22 | - required: true 23 | customError: Network ID is required. 24 | - title: Cluster Info 25 | description: The cluster used with this network fabric 26 | items: 27 | - name: clusterRef 28 | controlType: singleInput 29 | type: string 30 | path: ".spec.clusterRef.id" 31 | title: Cluster Ref 32 | description: ID of the Cluster object that will use this network fabric 33 | default: platform-ref-aws-cluster 34 | validation: 35 | - required: true 36 | customError: Cluster ref is required. 37 | spec: 38 | claimNames: 39 | kind: Network 40 | plural: networks 41 | group: aws.platformref.crossplane.io 42 | names: 43 | kind: CompositeNetwork 44 | plural: compositenetworks 45 | versions: 46 | - name: v1alpha1 47 | served: true 48 | referenceable: true 49 | schema: 50 | openAPIV3Schema: 51 | type: object 52 | properties: 53 | spec: 54 | type: object 55 | properties: 56 | id: 57 | type: string 58 | description: ID of this Network that other objects will use to refer to it. 59 | clusterRef: 60 | type: object 61 | description: "A reference to the Cluster object that this network will be used for." 62 | properties: 63 | id: 64 | type: string 65 | description: ID of the Cluster object this ref points to. 66 | required: 67 | - id 68 | required: 69 | - id 70 | - clusterRef -------------------------------------------------------------------------------- /crossplane-package-testing-with-kuttl/tests/compositions/compositenetwork/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | # Install the XRD 5 | - command: kubectl apply -f "${PWD}/package/network/definition.yaml" 6 | # Install the Composition 7 | - command: kubectl apply -f "${PWD}/package/network/composition.yaml" 8 | -------------------------------------------------------------------------------- /crossplane-package-testing-with-kuttl/tests/compositions/compositenetwork/01-assert.yaml: -------------------------------------------------------------------------------- 1 | 2 | --- 3 | apiVersion: ec2.aws.crossplane.io/v1beta1 4 | kind: Subnet 5 | metadata: 6 | labels: 7 | access: private 8 | crossplane.io/claim-name: network 9 | networks.aws.platformref.crossplane.io/network-id: platform-ref-aws-network 10 | zone: us-west-2a 11 | --- 12 | apiVersion: ec2.aws.crossplane.io/v1beta1 13 | kind: Subnet 14 | metadata: 15 | labels: 16 | access: public 17 | crossplane.io/claim-name: network 18 | networks.aws.platformref.crossplane.io/network-id: platform-ref-aws-network 19 | zone: us-west-2a 20 | --- 21 | apiVersion: ec2.aws.crossplane.io/v1beta1 22 | kind: VPC 23 | metadata: 24 | labels: 25 | crossplane.io/claim-name: network 26 | networks.aws.platformref.crossplane.io/network-id: platform-ref-aws-network 27 | spec: 28 | deletionPolicy: Delete 29 | forProvider: 30 | tags: 31 | - key: crossplane-kind 32 | value: vpc.ec2.aws.crossplane.io 33 | - key: crossplane-name 34 | - key: crossplane-providerconfig 35 | -------------------------------------------------------------------------------- /crossplane-package-testing-with-kuttl/tests/compositions/compositenetwork/01-network.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | # Wait for XRD to become "established" 5 | - command: kubectl wait --for condition=established --timeout=20s xrd/compositenetworks.aws.platformref.crossplane.io 6 | # Create the XR/Claim 7 | - command: kubectl apply -f "${PWD}/examples/network.yaml" 8 | -------------------------------------------------------------------------------- /crossplane-package-testing-with-kuttl/tests/init/providerConfig.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: Secret 4 | metadata: 5 | name: aws-creds 6 | namespace: upbound-system 7 | type: Opaque 8 | stringData: 9 | key: nocreds 10 | --- 11 | apiVersion: aws.crossplane.io/v1beta1 12 | kind: ProviderConfig 13 | metadata: 14 | name: default 15 | spec: 16 | credentials: 17 | source: Secret 18 | secretRef: 19 | namespace: upbound-system 20 | name: aws-creds 21 | key: key 22 | -------------------------------------------------------------------------------- /crossplane-package-testing-with-kuttl/tests/uxp-values.yaml: -------------------------------------------------------------------------------- 1 | provider: 2 | packages: 3 | - registry.upbound.io/crossplane/provider-aws:v0.19.0 4 | configuration: 5 | packages: 6 | - registry.upbound.io/upbound/platform-ref-aws:v0.2.1 7 | -------------------------------------------------------------------------------- /crossplane-package-testing-with-sonobuoy/plugin/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.17-buster as build 2 | 3 | # Install kubectl 4 | # Note: Latest version may be found on: 5 | # https://aur.archlinux.org/packages/kubectl-bin/ 6 | RUN wget https://storage.googleapis.com/kubernetes-release/release/v1.21.3/bin/linux/amd64/kubectl -O /usr/bin/kubectl && \ 7 | chmod +x /usr/bin/kubectl && \ 8 | apt-get update && \ 9 | apt-get install -y jq 10 | 11 | COPY ./pkg /src/pkg 12 | WORKDIR /src 13 | COPY go.* /src 14 | ENV CGO_ENABLED=0 15 | RUN go mod download 16 | 17 | RUN --mount=type=cache,target=/root/.cache/go-build \ 18 | go test -c -o custom.test ./... 19 | 20 | CMD ["bash", "-c", "go tool test2json ./custom.test -test.v"] 21 | -------------------------------------------------------------------------------- /crossplane-package-testing-with-sonobuoy/plugin/README.md: -------------------------------------------------------------------------------- 1 | # End-To-End (E2E) Tests for Platform-Ref-AWS 2 | 3 | This plugin is meant as a demo for writing conformance tests of crossplane packages. 4 | 5 | ## How to use this plugin 6 | 7 | - Clone this repo 8 | - Modify the build script to specify your registry/image/tag 9 | - Write tests (using main_test.go as a jumping off point) 10 | - Run ./build.sh to build the image and push it to your registry 11 | - `sonobuoy run -p plugin.yaml` to run your own plugin 12 | -------------------------------------------------------------------------------- /crossplane-package-testing-with-sonobuoy/plugin/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | REGISTRY=schnake 4 | IMG=custome2e 5 | TAG=v0.2.1 6 | 7 | docker build . -t $REGISTRY/$IMG:$TAG 8 | docker push $REGISTRY/$IMG:$TAG -------------------------------------------------------------------------------- /crossplane-package-testing-with-sonobuoy/plugin/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/aaronme/ATourOfCrossplane/crossplane-package-testing-with-sonobuoy 2 | 3 | go 1.17 4 | 5 | require ( 6 | github.com/vmware-tanzu/sonobuoy-plugins/plugin-helper v0.0.0-20211029183731-1d6848b67eec 7 | k8s.io/api v0.21.3 8 | k8s.io/apimachinery v0.21.3 9 | k8s.io/client-go v0.21.3 10 | sigs.k8s.io/e2e-framework v0.0.4-0.20211103134658-ebed03226136 11 | sigs.k8s.io/yaml v1.2.0 12 | ) 13 | 14 | require ( 15 | github.com/c2h5oh/datasize v0.0.0-20171227191756-4eba002a5eae // indirect 16 | github.com/davecgh/go-spew v1.1.1 // indirect 17 | github.com/evanphx/json-patch v4.11.0+incompatible // indirect 18 | github.com/go-logr/logr v0.4.0 // indirect 19 | github.com/gogo/protobuf v1.3.2 // indirect 20 | github.com/golang/protobuf v1.5.2 // indirect 21 | github.com/google/go-cmp v0.5.5 // indirect 22 | github.com/google/gofuzz v1.1.0 // indirect 23 | github.com/googleapis/gnostic v0.5.5 // indirect 24 | github.com/hashicorp/go-version v1.2.0 // indirect 25 | github.com/imdario/mergo v0.3.12 // indirect 26 | github.com/json-iterator/go v1.1.11 // indirect 27 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect 28 | github.com/modern-go/reflect2 v1.0.1 // indirect 29 | github.com/pkg/errors v0.9.1 // indirect 30 | github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b // indirect 31 | github.com/sirupsen/logrus v1.7.0 // indirect 32 | github.com/spf13/pflag v1.0.5 // indirect 33 | github.com/vmware-tanzu/sonobuoy v1.11.5-prerelease.1.0.20211004145628-b633b4fefcdc // indirect 34 | golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 // indirect 35 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect 36 | golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 // indirect 37 | golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect 38 | golang.org/x/text v0.3.6 // indirect 39 | golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect 40 | google.golang.org/appengine v1.6.7 // indirect 41 | google.golang.org/protobuf v1.26.0 // indirect 42 | gopkg.in/inf.v0 v0.9.1 // indirect 43 | gopkg.in/yaml.v2 v2.4.0 // indirect 44 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect 45 | k8s.io/klog/v2 v2.9.0 // indirect 46 | k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e // indirect 47 | k8s.io/utils v0.0.0-20210527160623-6fdb442a123b // indirect 48 | sigs.k8s.io/controller-runtime v0.9.0 // indirect 49 | sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect 50 | ) 51 | -------------------------------------------------------------------------------- /crossplane-package-testing-with-sonobuoy/plugin/go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 3 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 4 | cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= 5 | cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= 6 | cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= 7 | cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= 8 | cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= 9 | cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= 10 | cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= 11 | cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= 12 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= 13 | cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= 14 | cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= 15 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= 16 | cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= 17 | cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= 18 | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= 19 | cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= 20 | cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= 21 | cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= 22 | cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= 23 | cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= 24 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 25 | github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= 26 | github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= 27 | github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= 28 | github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= 29 | github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= 30 | github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= 31 | github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= 32 | github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= 33 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 34 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= 35 | github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= 36 | github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= 37 | github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= 38 | github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= 39 | github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= 40 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 41 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 42 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 43 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 44 | github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 45 | github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= 46 | github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= 47 | github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= 48 | github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= 49 | github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= 50 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 51 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 52 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 53 | github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= 54 | github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= 55 | github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= 56 | github.com/briandowns/spinner v1.6.1/go.mod h1://Zf9tMcxfRUA36V23M6YGEAv+kECGfvpnLTnb8n4XQ= 57 | github.com/c2h5oh/datasize v0.0.0-20171227191756-4eba002a5eae h1:2Zmk+8cNvAGuY8AyvZuWpUdpQUAXwfom4ReVMe/CTIo= 58 | github.com/c2h5oh/datasize v0.0.0-20171227191756-4eba002a5eae/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= 59 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 60 | github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= 61 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 62 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= 63 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= 64 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 65 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 66 | github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= 67 | github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= 68 | github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= 69 | github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= 70 | github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= 71 | github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= 72 | github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= 73 | github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= 74 | github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 75 | github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 76 | github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= 77 | github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= 78 | github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= 79 | github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 80 | github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= 81 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 82 | github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 83 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 84 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 85 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 86 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= 87 | github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= 88 | github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= 89 | github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 90 | github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 91 | github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= 92 | github.com/elazarl/goproxy v0.0.0-20190911111923-ecfe977594f1/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= 93 | github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= 94 | github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= 95 | github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= 96 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 97 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 98 | github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= 99 | github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= 100 | github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= 101 | github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= 102 | github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= 103 | github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= 104 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 105 | github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= 106 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= 107 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 108 | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= 109 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 110 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 111 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 112 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 113 | github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= 114 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 115 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 116 | github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= 117 | github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= 118 | github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= 119 | github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= 120 | github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= 121 | github.com/go-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM= 122 | github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= 123 | github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= 124 | github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= 125 | github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= 126 | github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= 127 | github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= 128 | github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= 129 | github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= 130 | github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= 131 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 132 | github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= 133 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 134 | github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= 135 | github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= 136 | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 137 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 138 | github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 139 | github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 140 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 141 | github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 142 | github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 143 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 144 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 145 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= 146 | github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 147 | github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 148 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 149 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 150 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 151 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 152 | github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 153 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 154 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 155 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 156 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 157 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 158 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 159 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 160 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 161 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 162 | github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= 163 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 164 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 165 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 166 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 167 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 168 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 169 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 170 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 171 | github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 172 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 173 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 174 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 175 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 176 | github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= 177 | github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 178 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 179 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 180 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 181 | github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 182 | github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 183 | github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 184 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 185 | github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 186 | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 187 | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 188 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 189 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= 190 | github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= 191 | github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= 192 | github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= 193 | github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= 194 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 195 | github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= 196 | github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= 197 | github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= 198 | github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 199 | github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= 200 | github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= 201 | github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= 202 | github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= 203 | github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= 204 | github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= 205 | github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= 206 | github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= 207 | github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 208 | github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= 209 | github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= 210 | github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= 211 | github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= 212 | github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= 213 | github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= 214 | github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= 215 | github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 216 | github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 217 | github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= 218 | github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 219 | github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= 220 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 221 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 222 | github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 223 | github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= 224 | github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= 225 | github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= 226 | github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= 227 | github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= 228 | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 229 | github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 230 | github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= 231 | github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= 232 | github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= 233 | github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= 234 | github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= 235 | github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= 236 | github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= 237 | github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 238 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 239 | github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 240 | github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 241 | github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= 242 | github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 243 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= 244 | github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= 245 | github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 246 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 247 | github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= 248 | github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= 249 | github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= 250 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 251 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 252 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 253 | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 254 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 255 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 256 | github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 257 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 258 | github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= 259 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 260 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 261 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 262 | github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= 263 | github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= 264 | github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= 265 | github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= 266 | github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 267 | github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 268 | github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= 269 | github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 270 | github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 271 | github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 272 | github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 273 | github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 274 | github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 275 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 276 | github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= 277 | github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= 278 | github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= 279 | github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 280 | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 281 | github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= 282 | github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= 283 | github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= 284 | github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 285 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 286 | github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= 287 | github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= 288 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 289 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 290 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 291 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 292 | github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= 293 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 294 | github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 295 | github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 296 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 297 | github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 298 | github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= 299 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= 300 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= 301 | github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= 302 | github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= 303 | github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= 304 | github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= 305 | github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= 306 | github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 307 | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 308 | github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 309 | github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= 310 | github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= 311 | github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= 312 | github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= 313 | github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= 314 | github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= 315 | github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= 316 | github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= 317 | github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= 318 | github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= 319 | github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= 320 | github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= 321 | github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= 322 | github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= 323 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 324 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 325 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 326 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 327 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 328 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 329 | github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= 330 | github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= 331 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 332 | github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= 333 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 334 | github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= 335 | github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= 336 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 337 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 338 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 339 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 340 | github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= 341 | github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 342 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 343 | github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= 344 | github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= 345 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 346 | github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 347 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 348 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 349 | github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 350 | github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= 351 | github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= 352 | github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM= 353 | github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 354 | github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= 355 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 356 | github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= 357 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 358 | github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= 359 | github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= 360 | github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= 361 | github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= 362 | github.com/sethgrid/pester v0.0.0-20190127155807-68a33a018ad0/go.mod h1:Ad7IjTpvzZO8Fl0vh9AzQ+j/jYZfyp2diGwI8m5q+ns= 363 | github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 364 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 365 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 366 | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= 367 | github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= 368 | github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= 369 | github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= 370 | github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= 371 | github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= 372 | github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 373 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= 374 | github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 375 | github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= 376 | github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= 377 | github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= 378 | github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= 379 | github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= 380 | github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= 381 | github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 382 | github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 383 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 384 | github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= 385 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 386 | github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= 387 | github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= 388 | github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= 389 | github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= 390 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 391 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 392 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= 393 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 394 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 395 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 396 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 397 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 398 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= 399 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 400 | github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= 401 | github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= 402 | github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= 403 | github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= 404 | github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= 405 | github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= 406 | github.com/vladimirvivien/gexe v0.1.1 h1:2A0SBaOSKH+cwLVdt6H+KkHZotZWRNLlWygANGw5DxE= 407 | github.com/vladimirvivien/gexe v0.1.1/go.mod h1:LHQL00w/7gDUKIak24n801ABp8C+ni6eBht9vGVst8w= 408 | github.com/vmware-tanzu/sonobuoy v1.11.5-prerelease.1.0.20211004145628-b633b4fefcdc h1:r2yO4l7SJdfTSBHWR2pVOQ+XND7qC0R14+aMoec+Zsk= 409 | github.com/vmware-tanzu/sonobuoy v1.11.5-prerelease.1.0.20211004145628-b633b4fefcdc/go.mod h1:VN3+v6dc8g3rU25U+xgi28JATPSWQmNTfVRhg+Y2RBQ= 410 | github.com/vmware-tanzu/sonobuoy-plugins/plugin-helper v0.0.0-20211029183731-1d6848b67eec h1:jveVSHL7tl0nQm3Bu1LJknjr5rSRJE1kEBKWyy2mftY= 411 | github.com/vmware-tanzu/sonobuoy-plugins/plugin-helper v0.0.0-20211029183731-1d6848b67eec/go.mod h1:nP6CB3acS+oEmj1md4P63HqdzDhF/YyJtHyk2qhcg1Y= 412 | github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= 413 | github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= 414 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 415 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 416 | go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= 417 | go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= 418 | go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= 419 | go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= 420 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 421 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= 422 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 423 | go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 424 | go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= 425 | go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= 426 | go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= 427 | go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= 428 | go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= 429 | go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= 430 | go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= 431 | go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= 432 | go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 433 | go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= 434 | go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= 435 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 436 | golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 437 | golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 438 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 439 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 440 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 441 | golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 442 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 443 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 444 | golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 445 | golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= 446 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 447 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 448 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= 449 | golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= 450 | golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= 451 | golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 452 | golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 453 | golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 454 | golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= 455 | golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= 456 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= 457 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 458 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 459 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 460 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 461 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 462 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 463 | golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 464 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 465 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= 466 | golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 467 | golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 468 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= 469 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= 470 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 471 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= 472 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 473 | golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 474 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 475 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 476 | golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 477 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 478 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 479 | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 480 | golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 481 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 482 | golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 483 | golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 484 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 485 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 486 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 487 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 488 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 489 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 490 | golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 491 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 492 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 493 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 494 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 495 | golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 496 | golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 497 | golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 498 | golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 499 | golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 500 | golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 501 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 502 | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 503 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 504 | golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 505 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 506 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 507 | golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 508 | golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= 509 | golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 h1:ADo5wSpq2gqaCGQWzk7S5vd//0iyyLeAratkEoG5dLE= 510 | golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 511 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 512 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 513 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 514 | golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 515 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= 516 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 517 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 518 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 519 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 520 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 521 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 522 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 523 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 524 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 525 | golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 526 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 527 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 528 | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 529 | golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 530 | golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 531 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 532 | golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 533 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 534 | golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 535 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 536 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 537 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 538 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 539 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 540 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 541 | golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 542 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 543 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 544 | golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 545 | golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 546 | golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 547 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 548 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 549 | golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 550 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 551 | golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 552 | golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 553 | golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 554 | golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 555 | golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 556 | golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 557 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 558 | golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 559 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 560 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 561 | golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 562 | golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 563 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 564 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 565 | golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 566 | golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 567 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 568 | golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 569 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 570 | golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 571 | golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 572 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 573 | golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio= 574 | golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 575 | golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 576 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 577 | golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 578 | golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE= 579 | golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 580 | golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 581 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 582 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 583 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 584 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 585 | golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 586 | golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= 587 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 588 | golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 589 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 590 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 591 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 592 | golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= 593 | golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 594 | golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 595 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 596 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 597 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 598 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 599 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 600 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 601 | golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 602 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 603 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 604 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 605 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 606 | golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 607 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 608 | golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 609 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 610 | golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 611 | golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 612 | golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 613 | golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 614 | golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 615 | golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 616 | golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 617 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 618 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 619 | golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 620 | golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 621 | golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 622 | golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 623 | golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 624 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 625 | golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 626 | golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 627 | golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 628 | golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 629 | golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= 630 | golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 631 | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 632 | golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 633 | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 634 | golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= 635 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 636 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 637 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 638 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= 639 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 640 | gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= 641 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 642 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= 643 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 644 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 645 | google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 646 | google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 647 | google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 648 | google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 649 | google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 650 | google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 651 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 652 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 653 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 654 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 655 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 656 | google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= 657 | google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 658 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 659 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 660 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 661 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 662 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 663 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 664 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 665 | google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= 666 | google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 667 | google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 668 | google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 669 | google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 670 | google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 671 | google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 672 | google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= 673 | google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 674 | google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 675 | google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 676 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 677 | google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 678 | google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 679 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 680 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= 681 | google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 682 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 683 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 684 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 685 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 686 | google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 687 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 688 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 689 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 690 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 691 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 692 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 693 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 694 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 695 | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= 696 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 697 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 698 | google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= 699 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 700 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 701 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 702 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 703 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 704 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= 705 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 706 | gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= 707 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 708 | gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= 709 | gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= 710 | gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= 711 | gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 712 | gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= 713 | gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 714 | gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= 715 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= 716 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 717 | gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 718 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 719 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 720 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 721 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 722 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 723 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 724 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 725 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 726 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 727 | gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 728 | gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 729 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= 730 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 731 | gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= 732 | gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= 733 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 734 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 735 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 736 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 737 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 738 | honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 739 | k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= 740 | k8s.io/api v0.21.3 h1:cblWILbLO8ar+Fj6xdDGr603HRsf8Wu9E9rngJeprZQ= 741 | k8s.io/api v0.21.3/go.mod h1:hUgeYHUbBp23Ue4qdX9tR8/ANi/g3ehylAqDn9NWVOg= 742 | k8s.io/apiextensions-apiserver v0.21.1 h1:AA+cnsb6w7SZ1vD32Z+zdgfXdXY8X9uGX5bN6EoPEIo= 743 | k8s.io/apiextensions-apiserver v0.21.1/go.mod h1:KESQFCGjqVcVsZ9g0xX5bacMjyX5emuWcS2arzdEouA= 744 | k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= 745 | k8s.io/apimachinery v0.21.3 h1:3Ju4nvjCngxxMYby0BimUk+pQHPOQp3eCGChk5kfVII= 746 | k8s.io/apimachinery v0.21.3/go.mod h1:H/IM+5vH9kZRNJ4l3x/fXP/5bOPJaVP/guptnZPeCFI= 747 | k8s.io/apiserver v0.21.1/go.mod h1:nLLYZvMWn35glJ4/FZRhzLG/3MPxAaZTgV4FJZdr+tY= 748 | k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= 749 | k8s.io/client-go v0.21.3 h1:J9nxZTOmvkInRDCzcSNQmPJbDYN/PjlxXT9Mos3HcLg= 750 | k8s.io/client-go v0.21.3/go.mod h1:+VPhCgTsaFmGILxR/7E1N0S+ryO010QBeNCv5JwRGYU= 751 | k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= 752 | k8s.io/component-base v0.21.1/go.mod h1:NgzFZ2qu4m1juby4TnrmpR8adRk6ka62YdH5DkIIyKA= 753 | k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= 754 | k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= 755 | k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= 756 | k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= 757 | k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= 758 | k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= 759 | k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= 760 | k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM= 761 | k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= 762 | k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= 763 | k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e h1:KLHHjkdQFomZy8+06csTWZ0m1343QqxZhR2LJ1OxCYM= 764 | k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= 765 | k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= 766 | k8s.io/utils v0.0.0-20210527160623-6fdb442a123b h1:MSqsVQ3pZvPGTqCjptfimO2WjG7A9un2zcpiHkA6M/s= 767 | k8s.io/utils v0.0.0-20210527160623-6fdb442a123b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= 768 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 769 | rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= 770 | rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= 771 | sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= 772 | sigs.k8s.io/controller-runtime v0.9.0 h1:ZIZ/dtpboPSbZYY7uUz2OzrkaBTOThx2yekLtpGB+zY= 773 | sigs.k8s.io/controller-runtime v0.9.0/go.mod h1:TgkfvrhhEw3PlI0BRL/5xM+89y3/yc0ZDfdbTl84si8= 774 | sigs.k8s.io/e2e-framework v0.0.4-0.20211103134658-ebed03226136 h1:2Xk1sfVNpFFxUp3xydC+jyl/BJaztZZpRo8BvzX1iu0= 775 | sigs.k8s.io/e2e-framework v0.0.4-0.20211103134658-ebed03226136/go.mod h1:tNBmdlhLgdouZmQwS7Z0CEiKpbZ1QeK7pC2kaUsLoxY= 776 | sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= 777 | sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= 778 | sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= 779 | sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= 780 | sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= 781 | sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= 782 | sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= 783 | -------------------------------------------------------------------------------- /crossplane-package-testing-with-sonobuoy/plugin/pkg/main_test.go: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2021 The Kubernetes Authors. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | package pkg 18 | 19 | import ( 20 | "context" 21 | "fmt" 22 | "os" 23 | "testing" 24 | 25 | plugin_helper "github.com/vmware-tanzu/sonobuoy-plugins/plugin-helper" 26 | v1 "k8s.io/api/core/v1" 27 | "k8s.io/client-go/dynamic" 28 | "k8s.io/client-go/rest" 29 | "k8s.io/client-go/tools/clientcmd" 30 | "sigs.k8s.io/e2e-framework/pkg/env" 31 | "sigs.k8s.io/e2e-framework/pkg/envconf" 32 | ) 33 | 34 | const ( 35 | ProgressReporterCtxKey = "SONOBUOY_PROGRESS_REPORTER" 36 | NamespacePrefixKey = "NS_PREFIX" 37 | ExternalClusterKubeconfig = "EXTERNAL_KUBECONFIG" 38 | ) 39 | 40 | var testenv env.Environment 41 | 42 | func TestMain(m *testing.M) { 43 | // Assume we are running in the cluster as a Sonobuoy plugin. 44 | testenv = env.NewInClusterConfig() 45 | 46 | // Specifying a run ID so that multiple runs wouldn't collide. Allow a prefix to be set via env var 47 | // so that a plugin configuration (yaml file) can easily set that without code changes. 48 | nsPrefix := os.Getenv(NamespacePrefixKey) 49 | runID := envconf.RandomName(nsPrefix, 4) 50 | 51 | // Create updateReporter; will also place into context during Setup for use in features. 52 | updateReporter := plugin_helper.NewProgressReporter(0) 53 | 54 | testenv.Setup(func(ctx context.Context, config *envconf.Config) (context.Context, error) { 55 | // Try and create the client; doing it before all the tests allows the tests to assume 56 | // it can be created without error and they can just use config.Client(). 57 | 58 | // If EXTERNAL_KUBECONFIG is set, create a client based on the kubeconfig 59 | externalKubeConfig := os.Getenv(ExternalClusterKubeconfig) 60 | 61 | var err error 62 | if externalKubeConfig != "" { 63 | _, err = config.WithKubeconfigFile(externalKubeConfig).NewClient() 64 | } else { 65 | _, err = config.NewClient() 66 | } 67 | return context.WithValue(ctx, ProgressReporterCtxKey, updateReporter), err 68 | }) 69 | 70 | testenv.BeforeEachTest(func(ctx context.Context, cfg *envconf.Config, t *testing.T) (context.Context, error) { 71 | updateReporter.StartTest(t.Name()) 72 | return createNSForTest(ctx, cfg, t, runID) 73 | }) 74 | testenv.AfterEachTest(func(ctx context.Context, cfg *envconf.Config, t *testing.T) (context.Context, error) { 75 | updateReporter.StopTest(t.Name(), t.Failed(), t.Skipped(), nil) 76 | return deleteNSForTest(ctx, cfg, t, runID) 77 | }) 78 | 79 | /* 80 | testenv.BeforeEachFeature(func(ctx context.Context, config *envconf.Config, info features.Feature) (context.Context, error) { 81 | // Note that you can also add logic here for before a feature is tested. There may be 82 | // more than one feature in a test. 83 | return ctx, nil 84 | }) 85 | testenv.AfterEachFeature(func(ctx context.Context, config *envconf.Config, info features.Feature) (context.Context, error) { 86 | // Note that you can also add logic here for after a feature is tested. There may be 87 | // more than one feature in a test. 88 | return ctx, nil 89 | }) 90 | */ 91 | 92 | os.Exit(testenv.Run(m)) 93 | } 94 | 95 | // CreateNSForTest creates a random namespace with the runID as a prefix. It is stored in the context 96 | // so that the deleteNSForTest routine can look it up and delete it. 97 | func createNSForTest(ctx context.Context, cfg *envconf.Config, t *testing.T, runID string) (context.Context, error) { 98 | ns := envconf.RandomName(runID, 10) 99 | ctx = context.WithValue(ctx, nsKey(t), ns) 100 | 101 | t.Logf("Creating namespace %v for test %v", ns, t.Name()) 102 | nsObj := v1.Namespace{} 103 | nsObj.Name = ns 104 | return ctx, cfg.Client().Resources().Create(ctx, &nsObj) 105 | } 106 | 107 | // DeleteNSForTest looks up the namespace corresponding to the given test and deletes it. 108 | func deleteNSForTest(ctx context.Context, cfg *envconf.Config, t *testing.T, runID string) (context.Context, error) { 109 | ns := fmt.Sprint(ctx.Value(nsKey(t))) 110 | t.Logf("Deleting namespace %v for test %v", ns, t.Name()) 111 | 112 | nsObj := v1.Namespace{} 113 | nsObj.Name = ns 114 | return ctx, cfg.Client().Resources().Delete(ctx, &nsObj) 115 | } 116 | 117 | func nsKey(t *testing.T) string { 118 | return "NS-for-%v" + t.Name() 119 | } 120 | 121 | func newDynamicClient() (dynamic.Interface, error) { 122 | externalKubeConfig := os.Getenv(ExternalClusterKubeconfig) 123 | 124 | if externalKubeConfig != "" { 125 | config, err := clientcmd.BuildConfigFromFlags("", "./kubeconfig") 126 | if err != nil { 127 | fmt.Printf("error getting Kubernetes config: %v\n", err) 128 | return nil, err 129 | } 130 | 131 | dynClient, err := dynamic.NewForConfig(config) 132 | if err != nil { 133 | return nil, err 134 | } 135 | 136 | return dynClient, nil 137 | 138 | } else { 139 | config, err := rest.InClusterConfig() 140 | if err != nil { 141 | return nil, err 142 | } 143 | 144 | dynClient, err := dynamic.NewForConfig(config) 145 | if err != nil { 146 | return nil, err 147 | } 148 | 149 | return dynClient, nil 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /crossplane-package-testing-with-sonobuoy/plugin/pkg/platform_ref_aws_test.go: -------------------------------------------------------------------------------- 1 | package pkg 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | "time" 8 | 9 | v1 "k8s.io/apimachinery/pkg/apis/meta/v1" 10 | "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" 11 | "k8s.io/apimachinery/pkg/runtime/schema" 12 | "sigs.k8s.io/e2e-framework/pkg/envconf" 13 | "sigs.k8s.io/e2e-framework/pkg/features" 14 | "sigs.k8s.io/yaml" 15 | ) 16 | 17 | func TestPlatformRefAWS(t *testing.T) { 18 | // We need to declare the GVR for both our XRs and Claims 19 | // This is the XR GroupVersionResource 20 | compositeResource := schema.GroupVersionResource{ 21 | Group: "aws.platformref.crossplane.io", 22 | Version: "v1alpha1", 23 | Resource: "compositenetworks", // remember to use the plural 24 | } 25 | 26 | // This is the Claim GroupVersionResource 27 | claimResource := schema.GroupVersionResource{ 28 | Group: "aws.platformref.crossplane.io", 29 | Version: "v1alpha1", 30 | Resource: "networks", // remember to use the plural 31 | } 32 | 33 | // This is a claim from https://github.com/upbound/platform-ref-aws/blob/main/examples/network.yaml 34 | claim := `--- 35 | apiVersion: aws.platformref.crossplane.io/v1alpha1 36 | kind: Network 37 | metadata: 38 | name: network 39 | spec: 40 | id: platform-ref-aws-network 41 | clusterRef: 42 | id: platform-ref-aws-cluster 43 | ` 44 | 45 | // Unmarshal the Yaml into an Unstructured Resource. 46 | // This requires going through Json. 47 | unstructuredClaim := unstructured.Unstructured{} 48 | json, err := yaml.YAMLToJSON([]byte(claim)) 49 | if err != nil { 50 | t.Fatal(err) 51 | } 52 | err = unstructuredClaim.UnmarshalJSON(json) 53 | if err != nil { 54 | t.Fatal(err) 55 | } 56 | 57 | // We need to capture the namespace key name here because the test name 58 | // changes inside Features and Assess methods 59 | namespaceKey := nsKey(t) 60 | 61 | f := features.New("Rendered"). 62 | Assess("Managed Resources", func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context { 63 | // We will name our claim after the namespace for the parent test. 64 | ns := fmt.Sprint(ctx.Value(namespaceKey)) 65 | claimName := fmt.Sprintf("%s-claim", ns) 66 | 67 | unstructuredClaim.SetName(claimName) 68 | unstructuredClaim.SetNamespace(ns) 69 | 70 | // The e2e-skeleton comes with a client based on their klient type. 71 | // We want to use a dynamic client, which enables working with 72 | // unstructured resources 73 | dynClient, err := newDynamicClient() 74 | if err != nil { 75 | t.Fatal(err) 76 | } 77 | 78 | // Create the Claim 79 | createClaim, err := dynClient.Resource(claimResource).Namespace(ns).Create(context.TODO(), &unstructuredClaim, v1.CreateOptions{}) 80 | if err != nil { 81 | t.Logf("creating Claim failed: +%v", createClaim) 82 | t.Fatal(err) 83 | } 84 | 85 | time.Sleep(3 * time.Second) 86 | 87 | // Retrieve the claim. This confirms our resource created and is also 88 | // necessary to lookup the XR name. 89 | getClaim, err := dynClient.Resource(claimResource).Namespace(ns).Get(context.TODO(), claimName, v1.GetOptions{}) 90 | if err != nil { 91 | t.Logf("getting Claim failed: +%v", getClaim) 92 | t.Fatal(err) 93 | } 94 | 95 | // Get the XR 96 | compositeName, exists, err := unstructured.NestedString(getClaim.UnstructuredContent(), "spec", "resourceRef", "name") 97 | if err != nil { 98 | t.Fatal(err) 99 | } 100 | 101 | if exists != true { 102 | t.Log(getClaim.UnstructuredContent()) 103 | t.Fatal("No composite name found.") 104 | } 105 | 106 | // Our first test: confirm that an XR was created. 107 | // This failure will indicate whether a successful composition template 108 | // was selected or not 109 | t.Run("Did create XR", func(t *testing.T) { 110 | t.Logf("Fetching XR %s", compositeName) 111 | getXR, err := dynClient.Resource(compositeResource).Get(context.TODO(), compositeName, v1.GetOptions{}) 112 | if err != nil { 113 | t.Logf("getting XR failed: +%v", getXR) 114 | t.Fatal(err) 115 | } 116 | }) 117 | 118 | // MRs we expect to be created by a Claim. 119 | // For the purpose of this demo, we only verify we have the correct number 120 | // of each resource type. 121 | var mrs = []struct { 122 | name string 123 | gvr schema.GroupVersionResource 124 | count int 125 | }{ 126 | {"VPC", schema.GroupVersionResource{Group: "ec2.aws.crossplane.io", Version: "v1beta1", Resource: "vpcs"}, 1}, 127 | {"InternetGateway", schema.GroupVersionResource{Group: "ec2.aws.crossplane.io", Version: "v1beta1", Resource: "internetgateways"}, 1}, 128 | {"SecurityGroup", schema.GroupVersionResource{Group: "ec2.aws.crossplane.io", Version: "v1beta1", Resource: "securitygroups"}, 1}, 129 | {"Subnet", schema.GroupVersionResource{Group: "ec2.aws.crossplane.io", Version: "v1beta1", Resource: "subnets"}, 4}, 130 | {"RouteTable", schema.GroupVersionResource{Group: "ec2.aws.crossplane.io", Version: "v1beta1", Resource: "routetables"}, 1}, 131 | } 132 | 133 | // MR Test Case Runs 134 | for _, mr := range mrs { 135 | mr := mr // rebind mr into this lexical scope 136 | t.Run(mr.name, func(t *testing.T) { 137 | 138 | got, err := dynClient.Resource(mr.gvr).List(context.TODO(), v1.ListOptions{}) 139 | if err != nil { 140 | t.Errorf("error retrieving %q: %q", mr.name, err) 141 | } 142 | 143 | count := len(got.Items) 144 | 145 | if count != mr.count { 146 | t.Errorf("resource %q count is wrong.", mr.name) 147 | } 148 | }) 149 | 150 | } 151 | 152 | return ctx 153 | }) 154 | testenv.Test(t, f.Feature()) 155 | } 156 | -------------------------------------------------------------------------------- /crossplane-package-testing-with-sonobuoy/plugin/plugin.yaml: -------------------------------------------------------------------------------- 1 | sonobuoy-config: 2 | driver: Job 3 | plugin-name: custom-e2e 4 | result-format: gojson 5 | source_url: https://raw.githubusercontent.com/aaronme/ATourOfCrossplane/main/crossplane-package-testing-with-sonobuoy/plugin/plugin.yaml 6 | description: e2e test of the crossplane configuration package platform-ref-aws. 7 | spec: 8 | command: 9 | - bash 10 | args: ["-c","go tool test2json ./custom.test -test.v | tee ${SONOBUOY_RESULTS_DIR}/out.json ; echo ${SONOBUOY_RESULTS_DIR}/out.json > ${SONOBUOY_RESULTS_DIR}/done"] 11 | image: aaron:aaron 12 | env: 13 | - name: NS_PREFIX 14 | value: custom 15 | - name: SONOBUOY_PROGRESS_PORT 16 | value: "8099" 17 | name: plugin 18 | resources: {} 19 | volumeMounts: 20 | - mountPath: /tmp/sonobuoy/results 21 | name: results 22 | -------------------------------------------------------------------------------- /crossplane-package-testing-with-sonobuoy/uxp-values.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | configuration: 3 | packages: 4 | - registry.upbound.io/upbound/platform-ref-aws:v0.2.1 5 | --------------------------------------------------------------------------------