mirror of
https://github.com/redhat-developer/odo.git
synced 2025-10-19 03:06:19 +03:00
Support autoBuild and deployByDefault on Image and Kubernetes/OpenShift components (#6654)
* Add sample Devfile with multiple autoBuild/deployByDefault combinations It will be used for integration tests. * Add helper function to update a given Devfile Command Group This will allow supporting cases where we need to run a custom command, but this is not implemented yet on odo (cases with 'odo dev --debug' and 'odo deploy'). In this case, this helper will allow updating the Devfile for example to unmark the current default command as non-default, and mark the custom one as default. * Add test cases for 'odo dev' * Add test cases for 'odo deploy' * Add test cases for 'odo build-images' 'odo build-images' should build all images regardless of the 'autoBuild' property. * Display the spinner when creating or updating Kubernetes resources This helps understand what resources are being patched. * Handle deployByDefault on K8s and OpenShift components * Add 'devfile.GetImageComponentsToPush' functions that returns the list of image components to auto-create See https://github.com/devfile/api/issues/852#issuecomment-1211928487 for more context. * Handle automatic image component creation for 'odo dev' on Kubernetes * Handle automatic image component creation for 'odo dev' on Podman * Handle automatic image and K8s/OpenShift component creation for 'odo deploy' * Bump Devfile library to the latest commit at this time (c1b23d2) This includes the fix for [1], which provides a way not to set default values automatically [1] https://github.com/devfile/api/issues/1067 * Do not set default values when parsing a Devfile See [1] for the rationale [1] https://github.com/redhat-developer/odo/issues/5694\#issuecomment-1465778398 * Add documentation in the Devfile reference page * Revert "Display the spinner when creating or updating Kubernetes resources" This reverts commit 6ad073e63cb0e685f165eed767619a90997393a3. * Avoid re-applying Image components multiple times 'adapter#Push' might get called several times when there are state transitions (either on the Deployment in the cluster, or from 'odo'). It might be confusing to apply Image components over and over again (and also it can be slower if we need to push images to remote registries). * Move GetK8sAndOcComponentsToPush and GetImageComponentsToPush to libdevfile package As suggested in review, this should be the responsibility of the devfile library Co-authored-by: Philippe Martin <phmartin@redhat.com> * fixup! Handle automatic image and K8s/OpenShift component creation for 'odo deploy' * fixup! Handle automatic image component creation for 'odo dev' on Podman * fixup! Avoid re-applying Image components multiple times * Apply suggestions from code review Co-authored-by: Parthvi Vala <pvala@redhat.com> * fixup! Do not set default values when parsing a Devfile * Fix devfile-deploy-functional-pods.yaml (used in 'odo logs' tests) Set deployByDefault to false on innerloop-pod component. Otherwise, since it is not referenced by any apply command, it will be automatically created by *both* 'odo dev' and 'odo deploy'. --------- Co-authored-by: Philippe Martin <phmartin@redhat.com> Co-authored-by: Parthvi Vala <pvala@redhat.com>
This commit is contained in:
@@ -19,7 +19,9 @@ For this reference, we use one singular (working) Node.js example which can be r
|
||||
|
||||
When `odo dev` is ran, `odo` creates the following Kubernetes resources from `container` (component) and `exec` (command) sections of the Devfile:
|
||||
* Deployment for running the containers
|
||||
* Service for accessibility
|
||||
* Service for accessibility
|
||||
|
||||
See [How odo dev translates a container component into Kubernetes resources](./architecture/how-odo-works.md#how-odo-dev-translates-a-container-component-into-kubernetes-resources) for more details.
|
||||
|
||||
### File Synchronization
|
||||
|
||||
@@ -90,7 +92,7 @@ The most common deploy scenario is the following:
|
||||
1. Use the `image` component to build a container
|
||||
2. Deploy a `kubernetes` component(s) with a Kubernetes resource defined
|
||||
|
||||
### How odo runs exec commands in Deploy mode
|
||||
### How `odo` runs exec commands in Deploy mode
|
||||
```yaml
|
||||
commands:
|
||||
- id: deploy-db
|
||||
@@ -140,6 +142,157 @@ Commands defined by the `exec` command are run inside a container started by a [
|
||||
4. The Kubernetes Job is created with appropriate annotations and labels so that it can be deleted by `odo delete component --name <name>` command if the need be.
|
||||
5. If the Kubernetes Job fails, a new pod is created to re-run the job instead of re-running it inside the same pod's container, this ensures that we can fetch the logs when needed.
|
||||
|
||||
### How `odo` determines components that are applied automatically
|
||||
|
||||
When running `odo dev` or `odo deploy`, `odo` determines components that need to be applied automatically by looking at several things:
|
||||
- whether the component is referenced by any [`apply` commands](https://devfile.io/docs/2.2.0/adding-an-apply-command);
|
||||
- and looking at dedicated fields that allow to explicitly control this behavior:
|
||||
- `autoBuild` on [Image components](https://devfile.io/docs/2.2.0/adding-an-image-component)
|
||||
- `deployByDefault` on [Kubernetes or OpenShift components](https://devfile.io/docs/2.2.0/adding-a-kubernetes-or-openshift-component)
|
||||
|
||||
#### `autoBuild` for Image Components
|
||||
|
||||
An Image component is applied automatically if **any** of the following conditions are met:
|
||||
- `autoBuild` is `true`
|
||||
- `autoBuild` is not set, **and** this Image component is not referenced in any `apply` commands
|
||||
|
||||
If the Image component is referenced by an `apply` command, it will be applied when this command is invoked.
|
||||
|
||||
For example, given the following excerpt:
|
||||
```yaml
|
||||
variables:
|
||||
CONTAINER_IMAGE_REPO: localhost:5000/odo-dev/node
|
||||
|
||||
components:
|
||||
# autoBuild true => automatically created on startup
|
||||
- image:
|
||||
autoBuild: true
|
||||
dockerfile:
|
||||
buildContext: .
|
||||
uri: Dockerfile
|
||||
imageName: "{{ CONTAINER_IMAGE_REPO }}:autobuild-true"
|
||||
name: "autobuild-true"
|
||||
|
||||
# autoBuild false, referenced in apply command => created when apply command is invoked
|
||||
- image:
|
||||
autoBuild: false
|
||||
dockerfile:
|
||||
buildContext: .
|
||||
uri: Dockerfile
|
||||
imageName: "{{ CONTAINER_IMAGE_REPO }}:autobuild-false-and-referenced"
|
||||
name: "autobuild-false-and-referenced"
|
||||
|
||||
# autoBuild not set, not referenced in apply command => automatically created on startup
|
||||
- image:
|
||||
dockerfile:
|
||||
buildContext: .
|
||||
uri: Dockerfile
|
||||
imageName: "{{ CONTAINER_IMAGE_REPO }}:autobuild-not-set-and-not-referenced"
|
||||
name: "autobuild-not-set-and-not-referenced"
|
||||
|
||||
- container:
|
||||
image: "{{ CONTAINER_IMAGE_REPO }}:autobuild-not-set-and-not-referenced"
|
||||
name: runtime
|
||||
commands:
|
||||
- apply:
|
||||
component: autobuild-false-and-referenced
|
||||
id: image-autobuild-false-and-referenced
|
||||
|
||||
- composite:
|
||||
commands:
|
||||
- image-autobuild-false-and-referenced
|
||||
- start-app
|
||||
group:
|
||||
isDefault: true
|
||||
kind: run
|
||||
id: run
|
||||
|
||||
- composite:
|
||||
commands:
|
||||
- image-autobuild-false-and-referenced
|
||||
- deploy-k8s
|
||||
group:
|
||||
isDefault: true
|
||||
kind: deploy
|
||||
id: deploy
|
||||
```
|
||||
|
||||
When running `odo`, the following Image components will be applied automatically, before applying any other components and invoking any commands:
|
||||
- `autobuild-true` because it has `autoBuild` set to `true`.
|
||||
- `autobuild-not-set-and-not-referenced` because it doesn't set `autoBuild` and is not referenced by any `apply` commands.
|
||||
|
||||
Because the `image` component `autobuild-false-and-referenced` is referenced by the `apply` command `image-autobuild-false-and-referenced`, it will be applied when this command
|
||||
is invoked, that is, in this example, when the `run` or `deploy` commands are invoked.
|
||||
|
||||
|
||||
#### `deployByDefault` for Kubernetes/OpenShift Components
|
||||
|
||||
A Kubernetes or OpenShift component is applied automatically if **any** of the following conditions are met:
|
||||
- `deployByDefault` is `true`
|
||||
- `deployByDefault` is not set, **and** this component is not referenced in any `apply` commands
|
||||
|
||||
If the component is referenced by an `apply` command, it will be applied when this command is invoked.
|
||||
|
||||
For example, given the following excerpt (simplified to use only Kubernetes components, but the same behavior applies to OpenShift ones):
|
||||
```yaml
|
||||
variables:
|
||||
CONTAINER_IMAGE_REPO: localhost:5000/odo-dev/node
|
||||
|
||||
components:
|
||||
# deployByDefault true => automatically created on startup
|
||||
- kubernetes:
|
||||
deployByDefault: true
|
||||
inlined: |
|
||||
[...]
|
||||
name: "k8s-deploybydefault-true"
|
||||
|
||||
# deployByDefault false, referenced in apply command => created when apply command is invoked
|
||||
- kubernetes:
|
||||
deployByDefault: false
|
||||
inlined: |
|
||||
[...]
|
||||
name: "k8s-deploybydefault-false-and-referenced"
|
||||
|
||||
# deployByDefault not set, not referenced in apply command => automatically created on startup
|
||||
- kubernetes:
|
||||
inlined: |
|
||||
[...]
|
||||
name: "k8s-deploybydefault-not-set-and-not-referenced"
|
||||
|
||||
- container:
|
||||
image: "{{ CONTAINER_IMAGE_REPO }}:autobuild-not-set-and-not-referenced"
|
||||
name: runtime
|
||||
commands:
|
||||
- apply:
|
||||
component: k8s-deploybydefault-false-and-referenced
|
||||
id: apply-k8s-deploybydefault-false-and-referenced
|
||||
|
||||
- composite:
|
||||
commands:
|
||||
- apply-k8s-deploybydefault-false-and-referenced
|
||||
- start-app
|
||||
group:
|
||||
isDefault: true
|
||||
kind: run
|
||||
id: run
|
||||
|
||||
- composite:
|
||||
commands:
|
||||
- apply-k8s-deploybydefault-false-and-referenced
|
||||
- deploy-k8s
|
||||
group:
|
||||
isDefault: true
|
||||
kind: deploy
|
||||
id: deploy
|
||||
```
|
||||
|
||||
When running `odo`, the following Kubernetes components will be applied automatically, before applying any other components and invoking any commands:
|
||||
- `k8s-deploybydefault-true` because it has `deployByDefault` set to `true`.
|
||||
- `k8s-deploybydefault-not-set-and-not-referenced` because it doesn't set `deployByDefault` and is not referenced by any `apply` commands.
|
||||
|
||||
Because the `kubernetes` component `k8s-deploybydefault-false-and-referenced` is referenced by the `apply` command `apply-k8s-deploybydefault-false-and-referenced` , it will be applied when this command
|
||||
is invoked, that is, in this example, when the `run` or `deploy` commands are invoked.
|
||||
|
||||
|
||||
## File Reference
|
||||
|
||||
|
||||
11
go.mod
11
go.mod
@@ -9,7 +9,7 @@ require (
|
||||
github.com/Xuanwo/go-locale v1.1.0
|
||||
github.com/blang/semver v3.5.1+incompatible
|
||||
github.com/devfile/api/v2 v2.2.0
|
||||
github.com/devfile/library/v2 v2.2.1-0.20230323124903-d36e409ff94f
|
||||
github.com/devfile/library/v2 v2.2.1-0.20230330160000-c1b23d25e652
|
||||
github.com/devfile/registry-support/index/generator v0.0.0-20230322155332-33914affc83b
|
||||
github.com/devfile/registry-support/registry-library v0.0.0-20221201200738-19293ac0b8ab
|
||||
github.com/fatih/color v1.14.1
|
||||
@@ -130,7 +130,6 @@ require (
|
||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||
github.com/hashicorp/go-version v1.4.0 // indirect
|
||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||
github.com/hinshun/vt10x v0.0.0-20220301184237-5011da428d02 // indirect
|
||||
github.com/imdario/mergo v0.3.13 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.0.1 // indirect
|
||||
@@ -143,14 +142,12 @@ require (
|
||||
github.com/klauspost/compress v1.15.1 // indirect
|
||||
github.com/kr/pty v1.1.8 // indirect
|
||||
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect
|
||||
github.com/magiconair/properties v1.8.5 // indirect
|
||||
github.com/mailru/easyjson v0.7.7 // indirect
|
||||
github.com/mattn/go-isatty v0.0.17 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.13 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect
|
||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
|
||||
github.com/mitchellh/go-wordwrap v1.0.0 // indirect
|
||||
github.com/mitchellh/mapstructure v1.4.1 // indirect
|
||||
github.com/mitchellh/reflectwalk v1.0.1 // indirect
|
||||
github.com/moby/buildkit v0.10.6 // indirect
|
||||
github.com/moby/locker v1.0.1 // indirect
|
||||
@@ -165,7 +162,6 @@ require (
|
||||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
||||
github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect
|
||||
github.com/openshift/library-go v0.0.0-20220210170159-18f172cff934 // indirect
|
||||
github.com/pelletier/go-toml v1.9.4 // indirect
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
|
||||
github.com/pjbgf/sha1cd v0.3.0 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
@@ -179,11 +175,7 @@ require (
|
||||
github.com/sergi/go-diff v1.2.0 // indirect
|
||||
github.com/sirupsen/logrus v1.8.1 // indirect
|
||||
github.com/skeema/knownhosts v1.1.0 // indirect
|
||||
github.com/spf13/cast v1.3.1 // indirect
|
||||
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||
github.com/spf13/viper v1.8.1 // indirect
|
||||
github.com/stretchr/testify v1.8.1 // indirect
|
||||
github.com/subosito/gotenv v1.2.0 // indirect
|
||||
github.com/tidwall/match v1.1.1 // indirect
|
||||
github.com/tidwall/pretty v1.2.0 // indirect
|
||||
github.com/xanzy/ssh-agent v0.3.3 // indirect
|
||||
@@ -205,7 +197,6 @@ require (
|
||||
google.golang.org/grpc v1.49.0 // indirect
|
||||
google.golang.org/protobuf v1.28.1 // indirect
|
||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||
gopkg.in/ini.v1 v1.62.0 // indirect
|
||||
gopkg.in/warnings.v0 v0.1.2 // indirect
|
||||
k8s.io/apiserver v0.26.1 // indirect
|
||||
k8s.io/component-base v0.26.1 // indirect
|
||||
|
||||
157
go.sum
157
go.sum
@@ -20,13 +20,6 @@ cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmW
|
||||
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
|
||||
cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
|
||||
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
|
||||
cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
|
||||
cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
|
||||
cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
|
||||
cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
|
||||
cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
|
||||
cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
|
||||
cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
|
||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||
@@ -162,8 +155,6 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU
|
||||
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
|
||||
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
|
||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||
github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
|
||||
github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
|
||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
||||
@@ -208,10 +199,7 @@ github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXe
|
||||
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
|
||||
github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
|
||||
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||
github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
||||
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
||||
@@ -242,9 +230,6 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH
|
||||
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
|
||||
github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
|
||||
github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
|
||||
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
|
||||
github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE=
|
||||
github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU=
|
||||
github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU=
|
||||
@@ -388,16 +373,14 @@ github.com/devfile/api/v2 v2.2.0/go.mod h1:dN7xFrOVG+iPqn4UKGibXLd5oVsdE8XyK9OEb
|
||||
github.com/devfile/library v1.2.1-0.20211104222135-49d635cb492f/go.mod h1:uFZZdTuRqA68FVe/JoJHP92CgINyQkyWnM2Qyiim+50=
|
||||
github.com/devfile/library v1.2.1-0.20220308191614-f0f7e11b17de/go.mod h1:GSPfJaBg0+bBjBHbwBE5aerJLH6tWGQu2q2rHYd9czM=
|
||||
github.com/devfile/library/v2 v2.0.1/go.mod h1:paJ0PARAVy0br13VpBEQ4fO3rZVDxWtooQ29+23PNBk=
|
||||
github.com/devfile/library/v2 v2.2.1-0.20230323124903-d36e409ff94f h1:DRWf62j2diJCEPPumsKUkypNlyMV2/P6e3q6zcDT+WM=
|
||||
github.com/devfile/library/v2 v2.2.1-0.20230323124903-d36e409ff94f/go.mod h1:9mHgcxKzzFYRrnac8BRJ2gC6Ff1A2ZeZ4Iy73N6Vrp0=
|
||||
github.com/devfile/library/v2 v2.2.1-0.20230330160000-c1b23d25e652 h1:Lrg3ypN1LyGJ2yZAjU5tKh19tUPmHSH9dClyaxh6vko=
|
||||
github.com/devfile/library/v2 v2.2.1-0.20230330160000-c1b23d25e652/go.mod h1:NWmKLN9RWVX5f4sCimjFtGX1REuXiYoBYU/Jcd11XAA=
|
||||
github.com/devfile/registry-support/index/generator v0.0.0-20220222194908-7a90a4214f3e/go.mod h1:iRPBxs+ZjfLEduVXpCCIOzdD2588Zv9OCs/CcXMcCCY=
|
||||
github.com/devfile/registry-support/index/generator v0.0.0-20220527155645-8328a8a883be/go.mod h1:1fyDJL+fPHtcrYA6yjSVWeLmXmjCNth0d5Rq1rvtryc=
|
||||
github.com/devfile/registry-support/index/generator v0.0.0-20221018203505-df96d34d4273 h1:DXENQSRTEDsk9com38njPg5511DD12HPIgzyFUErnpM=
|
||||
github.com/devfile/registry-support/index/generator v0.0.0-20221018203505-df96d34d4273/go.mod h1:ZJnaSLjTKCvGJhWmYgQoQ1O3g78qBe4Va6ZugLmi4dE=
|
||||
github.com/devfile/registry-support/index/generator v0.0.0-20230322155332-33914affc83b h1:IhZQnmff1ntrzplcM10/mj7H3X6E4NA3+paxD4HXfzc=
|
||||
github.com/devfile/registry-support/index/generator v0.0.0-20230322155332-33914affc83b/go.mod h1:ZJnaSLjTKCvGJhWmYgQoQ1O3g78qBe4Va6ZugLmi4dE=
|
||||
github.com/devfile/registry-support/registry-library v0.0.0-20220627163229-4aa39fcb0c0a/go.mod h1:kmEjH5oO465vh36kcYdZLYeG8edVD6N/ZgzyLs1x7qs=
|
||||
github.com/devfile/registry-support/registry-library v0.0.0-20221018213054-47b3ffaeadba/go.mod h1:NOtmnbozFn15w/DPD/Urc+KDlNRP4JH5m+KC5GZoAWA=
|
||||
github.com/devfile/registry-support/registry-library v0.0.0-20221201200738-19293ac0b8ab h1:MBZdywPNNDf1f7V+plOOHqAiaY/C+IELrI4Rfdq78e4=
|
||||
github.com/devfile/registry-support/registry-library v0.0.0-20221201200738-19293ac0b8ab/go.mod h1:NOtmnbozFn15w/DPD/Urc+KDlNRP4JH5m+KC5GZoAWA=
|
||||
github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
@@ -446,7 +429,6 @@ github.com/emicklei/dot v0.15.0 h1:XDBW0Xco1QNyRb33cqLe10cT04yMWL1XpCZfa98Q6Og=
|
||||
github.com/emicklei/dot v0.15.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s=
|
||||
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
||||
github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
||||
github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||
github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=
|
||||
github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
|
||||
@@ -479,7 +461,6 @@ github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=
|
||||
github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
|
||||
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
|
||||
github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
||||
github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
||||
@@ -496,7 +477,6 @@ github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYis
|
||||
github.com/gdamore/encoding v0.0.0-20151215212835-b23993cbb635/go.mod h1:yrQYJKKDTrHmbYxI7CYi+/hbdiDT2m4Hj+t0ikCjsrQ=
|
||||
github.com/gdamore/tcell v1.0.1-0.20180608172421-b3cebc399d6f/go.mod h1:tqyG50u7+Ctv1w5VX67kLzKcj9YXR/JSBZQq/+mLl1A=
|
||||
github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=
|
||||
github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
|
||||
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
@@ -537,16 +517,13 @@ github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg
|
||||
github.com/go-logr/logr v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
||||
github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
||||
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
||||
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||
github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
|
||||
github.com/go-logr/zapr v0.3.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU=
|
||||
github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
|
||||
github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=
|
||||
github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A=
|
||||
github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4=
|
||||
github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
|
||||
github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
|
||||
github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
|
||||
@@ -630,7 +607,6 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
|
||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
@@ -667,7 +643,6 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS
|
||||
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
|
||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk=
|
||||
github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k=
|
||||
github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
|
||||
@@ -675,7 +650,6 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
|
||||
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
|
||||
github.com/google/cel-go v0.12.6/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw=
|
||||
github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
|
||||
github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
@@ -690,7 +664,6 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0=
|
||||
@@ -703,7 +676,6 @@ github.com/google/licensecheck v0.3.1/go.mod h1:ORkR35t/JjW+emNKtfJDII0zlciG9Jgb
|
||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||
github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
|
||||
github.com/google/pprof v0.0.0-20181127221834-b4f47329b966/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
@@ -716,9 +688,6 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe
|
||||
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
|
||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
@@ -732,7 +701,6 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
|
||||
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
|
||||
github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
|
||||
github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=
|
||||
@@ -759,12 +727,10 @@ github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJr
|
||||
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
|
||||
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
||||
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
||||
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
@@ -791,7 +757,6 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
||||
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
|
||||
@@ -891,7 +856,6 @@ github.com/lucasb-eyer/go-colorful v0.0.0-20180526135729-345fbb3dbcdb/go.mod h1:
|
||||
github.com/lucasjones/reggen v0.0.0-20200904144131-37ba4fa293bb/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
|
||||
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
|
||||
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
@@ -946,7 +910,6 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4
|
||||
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
||||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
|
||||
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A=
|
||||
github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE=
|
||||
@@ -1014,12 +977,6 @@ github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k
|
||||
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
||||
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
|
||||
github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU=
|
||||
github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk=
|
||||
github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0=
|
||||
github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo=
|
||||
github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw=
|
||||
github.com/onsi/ginkgo/v2 v2.6.0 h1:9t9b9vRUbFq3C4qKFCGkVuq/fIHji802N1nrtkh1mNc=
|
||||
github.com/onsi/ginkgo/v2 v2.6.0/go.mod h1:63DOGlLAH8+REH8jUGdL3YpCpu7JODesutUjdENfUAc=
|
||||
github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
||||
@@ -1033,13 +990,6 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y
|
||||
github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
||||
github.com/onsi/gomega v1.14.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
|
||||
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
|
||||
github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo=
|
||||
github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc=
|
||||
github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM=
|
||||
github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg=
|
||||
github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg=
|
||||
github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E=
|
||||
github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM=
|
||||
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||
@@ -1082,7 +1032,6 @@ github.com/openshift/library-go v0.0.0-20220210170159-18f172cff934 h1:J3cN1DNqF0
|
||||
github.com/openshift/library-go v0.0.0-20220210170159-18f172cff934/go.mod h1:6AmNM4N4nHftckybV/U7bQW+5AvK5TW81ndSI6KEidw=
|
||||
github.com/openshift/oc v0.0.0-alpha.0.0.20220402064836-f1f09a392fd1 h1:/hyEDbpYV+84ivC1j8KXiQnEF9XwniJFsfghOBhPd0w=
|
||||
github.com/openshift/oc v0.0.0-alpha.0.0.20220402064836-f1f09a392fd1/go.mod h1:Zn2GW8pcxWzR3FzJXOGBtybuEbJqiIkUrGWMR7khdPU=
|
||||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/operator-framework/api v0.3.8/go.mod h1:Xbje9x0SHmh0nihE21kpesB38vk3cyxnE6JdDS8Jo1Q=
|
||||
github.com/operator-framework/api v0.17.3 h1:wddE1SLKTNiIzwt28DbBIO+vPG2GOV6dkB9xBkDfT3o=
|
||||
github.com/operator-framework/api v0.17.3/go.mod h1:34tb98EwTN5SZLkgoxwvRkhMJKLHUWHOrrcv1ZwvEeA=
|
||||
@@ -1095,8 +1044,6 @@ github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
|
||||
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||
github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
|
||||
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
||||
github.com/peterbourgon/mergemap v0.0.0-20130613134717-e21c03b7a721/go.mod h1:jQyRpOpE/KbvPc0VKXjAqctYglwUO5W6zAcGcFfbvlo=
|
||||
@@ -1117,7 +1064,6 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr
|
||||
github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo=
|
||||
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
|
||||
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
||||
github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI=
|
||||
github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
||||
@@ -1125,7 +1071,6 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn
|
||||
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
|
||||
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
|
||||
github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
|
||||
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
|
||||
github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=
|
||||
github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=
|
||||
@@ -1215,14 +1160,12 @@ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9
|
||||
github.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=
|
||||
github.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||
github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
||||
github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
|
||||
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
|
||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
|
||||
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
@@ -1230,14 +1173,11 @@ github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tL
|
||||
github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
|
||||
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
|
||||
github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
|
||||
github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
|
||||
github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
|
||||
github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
|
||||
github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
|
||||
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
|
||||
github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
|
||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
|
||||
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
|
||||
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
@@ -1249,7 +1189,6 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM
|
||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
||||
github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
||||
github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44=
|
||||
github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
|
||||
github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8=
|
||||
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
|
||||
@@ -1274,7 +1213,6 @@ github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
|
||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
||||
github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
||||
@@ -1289,7 +1227,6 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
|
||||
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
@@ -1346,15 +1283,8 @@ go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mI
|
||||
go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8=
|
||||
go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg=
|
||||
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
|
||||
go.etcd.io/etcd/api/v3 v3.5.5/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8=
|
||||
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
|
||||
go.etcd.io/etcd/client/pkg/v3 v3.5.5/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ=
|
||||
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
|
||||
go.etcd.io/etcd/client/v2 v2.305.5/go.mod h1:zQjKllfqfBVyVStbt4FaosoX2iYd8fV/GRy/PbowgP4=
|
||||
go.etcd.io/etcd/client/v3 v3.5.5/go.mod h1:aApjR4WGlSumpnJ2kloS75h6aHUmAyaPLjHMxpc7E7c=
|
||||
go.etcd.io/etcd/pkg/v3 v3.5.5/go.mod h1:6ksYFxttiUGzC2uxyqiyOEvhAiD0tuIqSZkX3TyPdaE=
|
||||
go.etcd.io/etcd/raft/v3 v3.5.5/go.mod h1:76TA48q03g1y1VpTue92jZLr9lIHKUNcYdZOOGyx8rI=
|
||||
go.etcd.io/etcd/server/v3 v3.5.5/go.mod h1:rZ95vDw/jrvsbj9XpTqPrTAB9/kzchVdhRirySPkUBc=
|
||||
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
|
||||
go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
|
||||
go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
|
||||
@@ -1368,35 +1298,16 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
||||
go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
|
||||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
||||
go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0/go.mod h1:E5NNboN0UqSAki0Atn9kVwaN7I+l25gGxDqBueo/74E=
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0/go.mod h1:h8TWwRAhQpOd0aM5nYsRD8+flnkj+526GEIVlarH7eY=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c=
|
||||
go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
|
||||
go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU=
|
||||
go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM=
|
||||
go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ=
|
||||
go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
|
||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0/go.mod h1:Krqnjl22jUJ0HgMzw5eveuCvFDXY4nSYb4F8t5gdrag=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0/go.mod h1:OfUCyyIiDvNXHWpcWgbF+MWvqPZiNa3YDEnivcnYsV0=
|
||||
go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
|
||||
go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A=
|
||||
go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
|
||||
go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
|
||||
go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI=
|
||||
go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE=
|
||||
go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=
|
||||
go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
|
||||
go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
|
||||
go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk=
|
||||
go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4=
|
||||
go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM=
|
||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||
go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg=
|
||||
go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
|
||||
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc=
|
||||
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
@@ -1404,10 +1315,7 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
|
||||
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||
go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
|
||||
go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
|
||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
|
||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||
@@ -1417,7 +1325,6 @@ go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
|
||||
go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
|
||||
go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
|
||||
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
|
||||
go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
|
||||
golang.org/x/arch v0.0.0-20180920145803-b19384d3c130/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8=
|
||||
golang.org/x/arch v0.1.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
||||
golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
@@ -1451,7 +1358,6 @@ golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5y
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
@@ -1546,7 +1452,6 @@ golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwY
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
@@ -1556,7 +1461,6 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd
|
||||
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
@@ -1564,12 +1468,9 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
|
||||
golang.org/x/net v0.0.0-20220107192237-5cfca573fb4d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
||||
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
||||
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
|
||||
golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
|
||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
|
||||
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
@@ -1586,9 +1487,6 @@ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ
|
||||
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
|
||||
golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE=
|
||||
@@ -1604,7 +1502,6 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
@@ -1704,19 +1601,13 @@ golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
@@ -1724,7 +1615,6 @@ golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
@@ -1734,7 +1624,6 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
@@ -1745,8 +1634,6 @@ golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
|
||||
golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
|
||||
golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
@@ -1760,7 +1647,6 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
|
||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
@@ -1842,11 +1728,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
|
||||
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
|
||||
golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
|
||||
golang.org/x/tools v0.4.0 h1:7mTAgkunk3fr4GAloyyCasadO6h9zSsQZbwvcaIciV4=
|
||||
@@ -1881,13 +1764,6 @@ google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjR
|
||||
google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
|
||||
google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
|
||||
google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
|
||||
google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
|
||||
google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
|
||||
google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
|
||||
google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
|
||||
google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
|
||||
google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
|
||||
google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
@@ -1920,7 +1796,6 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG
|
||||
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
@@ -1943,22 +1818,7 @@ google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6D
|
||||
google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
|
||||
google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
|
||||
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||
google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||
google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||
google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
|
||||
google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
|
||||
google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
|
||||
google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
|
||||
google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
|
||||
google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
|
||||
google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||
google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||
google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||
google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||
google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 h1:hrbNEivu7Zn1pxvHk6MBrq9iE22woVILTHqexqBxe6I=
|
||||
google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
|
||||
@@ -1986,19 +1846,12 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG
|
||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||
google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||
google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||
google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
|
||||
google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
|
||||
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
||||
google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
|
||||
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||
google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||
google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
|
||||
google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
|
||||
google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw=
|
||||
google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
|
||||
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
@@ -2035,7 +1888,6 @@ gopkg.in/imdario/mergo.v0 v0.3.7/go.mod h1:9qPP6AGrlC1G2PTNXko614FwGZvorN7MiBU0E
|
||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
|
||||
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
||||
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog=
|
||||
@@ -2134,7 +1986,6 @@ k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZ
|
||||
k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0=
|
||||
k8s.io/code-generator v0.21.3/go.mod h1:K3y0Bv9Cz2cOW2vXUrNZlFbflhuPvuadW6JdnN6gGKo=
|
||||
k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=
|
||||
k8s.io/code-generator v0.26.1/go.mod h1:OMoJ5Dqx1wgaQzKgc+ZWaZPfGjdRq/Y3WubFrZmeI3I=
|
||||
k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM=
|
||||
k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14=
|
||||
k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo=
|
||||
@@ -2158,7 +2009,6 @@ k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAE
|
||||
k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||
k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||
k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||
k8s.io/gengo v0.0.0-20220902162205-c0856e24416d/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||
k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
|
||||
k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
|
||||
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
|
||||
@@ -2170,7 +2020,6 @@ k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
|
||||
k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
|
||||
k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4=
|
||||
k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
|
||||
k8s.io/kms v0.26.1/go.mod h1:ReC1IEGuxgfN+PDCIpR6w8+XMmDE7uJhxcCwMZFdIYc=
|
||||
k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
|
||||
k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
|
||||
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
|
||||
@@ -2193,7 +2042,6 @@ k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/
|
||||
k8s.io/utils v0.0.0-20210722164352-7f3ee0f31471/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
||||
k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
||||
k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
||||
k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 h1:KTgPnR10d5zhztWptI952TNtt/4u5h3IzDXkdIMuo2Y=
|
||||
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||
oras.land/oras-go v1.1.0 h1:tfWM1RT7PzUwWphqHU6ptPU3ZhwVnSw/9nEGf519rYg=
|
||||
@@ -2207,7 +2055,6 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQb
|
||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
|
||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
|
||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.19/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
|
||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.35/go.mod h1:WxjusMwXlKzfAs4p9km6XJRndVt2FROgMVCE4cdohFo=
|
||||
sigs.k8s.io/controller-runtime v0.6.0/go.mod h1:CpYf5pdNY/B352A1TFLAS2JVSlnGQ5O2cftPHndTroo=
|
||||
sigs.k8s.io/controller-runtime v0.6.4/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY=
|
||||
sigs.k8s.io/controller-runtime v0.9.5/go.mod h1:q6PpkM5vqQubEKUKOM6qr06oXGzOBcCby1DA9FbyZeA=
|
||||
|
||||
@@ -50,8 +50,58 @@ func (o *DeployClient) Deploy(ctx context.Context) error {
|
||||
componentName = odocontext.GetComponentName(ctx)
|
||||
appName = odocontext.GetApplication(ctx)
|
||||
)
|
||||
deployHandler := newDeployHandler(ctx, o.fs, *devfileObj, path, o.kubeClient, appName, componentName)
|
||||
return libdevfile.Deploy(*devfileObj, deployHandler)
|
||||
|
||||
handler := newDeployHandler(ctx, o.fs, *devfileObj, path, o.kubeClient, appName, componentName)
|
||||
|
||||
err := o.buildPushAutoImageComponents(handler, *devfileObj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = o.applyAutoK8sOrOcComponents(handler, *devfileObj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return libdevfile.Deploy(*devfileObj, handler)
|
||||
}
|
||||
|
||||
func (o *DeployClient) buildPushAutoImageComponents(handler *deployHandler, devfileObj parser.DevfileObj) error {
|
||||
components, err := libdevfile.GetImageComponentsToPush(devfileObj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, c := range components {
|
||||
err = handler.ApplyImage(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *DeployClient) applyAutoK8sOrOcComponents(handler *deployHandler, devfileObj parser.DevfileObj) error {
|
||||
components, err := libdevfile.GetK8sAndOcComponentsToPush(devfileObj, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, c := range components {
|
||||
var f func(component2 v1alpha2.Component) error
|
||||
if c.Kubernetes != nil {
|
||||
f = handler.ApplyKubernetes
|
||||
} else if c.Openshift != nil {
|
||||
f = handler.ApplyOpenShift
|
||||
}
|
||||
if f == nil {
|
||||
continue
|
||||
}
|
||||
if err = f(c); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type deployHandler struct {
|
||||
|
||||
@@ -6,6 +6,8 @@ import (
|
||||
"io"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
|
||||
|
||||
"github.com/redhat-developer/odo/pkg/binding"
|
||||
_delete "github.com/redhat-developer/odo/pkg/component/delete"
|
||||
"github.com/redhat-developer/odo/pkg/dev"
|
||||
@@ -107,7 +109,9 @@ func (o *DevClient) Start(
|
||||
}
|
||||
|
||||
klog.V(4).Infoln("Creating inner-loop resources for the component")
|
||||
componentStatus := watch.ComponentStatus{}
|
||||
componentStatus := watch.ComponentStatus{
|
||||
ImageComponentsAutoApplied: make(map[string]v1alpha2.ImageComponent),
|
||||
}
|
||||
err := adapter.Push(ctx, pushParameters, &componentStatus)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -88,7 +88,9 @@ func (o *DevClient) Start(
|
||||
devfilePath = odocontext.GetDevfilePath(ctx)
|
||||
path = filepath.Dir(devfilePath)
|
||||
|
||||
componentStatus = watch.ComponentStatus{}
|
||||
componentStatus = watch.ComponentStatus{
|
||||
ImageComponentsAutoApplied: make(map[string]devfilev1.ImageComponent),
|
||||
}
|
||||
)
|
||||
|
||||
err := o.reconcile(ctx, out, errOut, options, &componentStatus)
|
||||
|
||||
@@ -14,9 +14,10 @@ import (
|
||||
|
||||
"github.com/redhat-developer/odo/pkg/api"
|
||||
"github.com/redhat-developer/odo/pkg/component"
|
||||
envcontext "github.com/redhat-developer/odo/pkg/config/context"
|
||||
"github.com/redhat-developer/odo/pkg/dev"
|
||||
"github.com/redhat-developer/odo/pkg/devfile"
|
||||
"github.com/redhat-developer/odo/pkg/devfile/adapters"
|
||||
"github.com/redhat-developer/odo/pkg/devfile/image"
|
||||
"github.com/redhat-developer/odo/pkg/libdevfile"
|
||||
"github.com/redhat-developer/odo/pkg/log"
|
||||
odocontext "github.com/redhat-developer/odo/pkg/odo/context"
|
||||
@@ -45,6 +46,11 @@ func (o *DevClient) reconcile(
|
||||
|
||||
o.warnAboutK8sComponents(*devfileObj)
|
||||
|
||||
err := o.buildPushAutoImageComponents(ctx, *devfileObj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
pod, fwPorts, err := o.deployPod(ctx, options)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -149,7 +155,7 @@ func (o *DevClient) reconcile(
|
||||
func (o *DevClient) warnAboutK8sComponents(devfileObj parser.DevfileObj) {
|
||||
var components []string
|
||||
// get all standalone k8s components for a given commandGK
|
||||
k8sComponents, _ := devfile.GetK8sAndOcComponentsToPush(devfileObj, false)
|
||||
k8sComponents, _ := libdevfile.GetK8sAndOcComponentsToPush(devfileObj, false)
|
||||
|
||||
if len(k8sComponents) == 0 {
|
||||
return
|
||||
@@ -162,6 +168,21 @@ func (o *DevClient) warnAboutK8sComponents(devfileObj parser.DevfileObj) {
|
||||
log.Warningf("Kubernetes components are not supported on Podman. Skipping: %v.", strings.Join(components, ", "))
|
||||
}
|
||||
|
||||
func (o *DevClient) buildPushAutoImageComponents(ctx context.Context, devfileObj parser.DevfileObj) error {
|
||||
components, err := libdevfile.GetImageComponentsToPush(devfileObj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, c := range components {
|
||||
err = image.BuildPushSpecificImage(ctx, o.fs, c, envcontext.GetEnvConfig(ctx).PushImages)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// deployPod deploys the component as a Pod in podman
|
||||
func (o *DevClient) deployPod(ctx context.Context, options dev.StartOptions) (*corev1.Pod, []api.ForwardedPort, error) {
|
||||
var (
|
||||
|
||||
@@ -16,7 +16,6 @@ import (
|
||||
"github.com/redhat-developer/odo/pkg/binding"
|
||||
"github.com/redhat-developer/odo/pkg/component"
|
||||
"github.com/redhat-developer/odo/pkg/dev/common"
|
||||
"github.com/redhat-developer/odo/pkg/devfile"
|
||||
"github.com/redhat-developer/odo/pkg/devfile/adapters"
|
||||
"github.com/redhat-developer/odo/pkg/devfile/adapters/kubernetes/storage"
|
||||
"github.com/redhat-developer/odo/pkg/devfile/adapters/kubernetes/utils"
|
||||
@@ -109,6 +108,17 @@ func (a Adapter) Push(ctx context.Context, parameters adapters.PushParameters, c
|
||||
return err
|
||||
}
|
||||
|
||||
if componentStatus.State == watch.StateSyncOutdated {
|
||||
// Clear the cache of image components already applied, hence forcing image components to be reapplied.
|
||||
componentStatus.ImageComponentsAutoApplied = make(map[string]devfilev1.ImageComponent)
|
||||
}
|
||||
|
||||
klog.V(4).Infof("component state: %q\n", componentStatus.State)
|
||||
err = a.buildPushAutoImageComponents(ctx, a.FS, a.Devfile, componentStatus)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
deployment, deploymentExists, err := a.getComponentDeployment()
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -631,7 +641,7 @@ func (a Adapter) getRemoteResourcesNotPresentInDevfile(selector string) (objects
|
||||
}
|
||||
|
||||
var devfileK8sResources []devfilev1.Component
|
||||
devfileK8sResources, err = devfile.GetK8sAndOcComponentsToPush(a.Devfile, true)
|
||||
devfileK8sResources, err = libdevfile.GetK8sAndOcComponentsToPush(a.Devfile, true)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("unable to obtain resources from the Devfile: %w", err)
|
||||
}
|
||||
|
||||
@@ -1,19 +1,25 @@
|
||||
package component
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
devfilev1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
|
||||
"github.com/devfile/library/v2/pkg/devfile/parser"
|
||||
appsv1 "k8s.io/api/apps/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/klog"
|
||||
|
||||
"github.com/redhat-developer/odo/pkg/component"
|
||||
"github.com/redhat-developer/odo/pkg/devfile"
|
||||
"github.com/redhat-developer/odo/pkg/devfile/adapters"
|
||||
"github.com/redhat-developer/odo/pkg/devfile/image"
|
||||
"github.com/redhat-developer/odo/pkg/kclient"
|
||||
odolabels "github.com/redhat-developer/odo/pkg/labels"
|
||||
"github.com/redhat-developer/odo/pkg/libdevfile"
|
||||
"github.com/redhat-developer/odo/pkg/service"
|
||||
"github.com/redhat-developer/odo/pkg/testingutil/filesystem"
|
||||
"github.com/redhat-developer/odo/pkg/watch"
|
||||
)
|
||||
|
||||
// getComponentDeployment returns the deployment associated with the component, if deployed
|
||||
@@ -34,6 +40,46 @@ func (a *Adapter) getComponentDeployment() (*appsv1.Deployment, bool, error) {
|
||||
return deployment, componentExists, nil
|
||||
}
|
||||
|
||||
func (a *Adapter) buildPushAutoImageComponents(ctx context.Context, fs filesystem.Filesystem, devfileObj parser.DevfileObj, compStatus *watch.ComponentStatus) error {
|
||||
components, err := libdevfile.GetImageComponentsToPush(devfileObj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, c := range components {
|
||||
if c.Image == nil {
|
||||
return fmt.Errorf("component %q should be an Image Component", c.Name)
|
||||
}
|
||||
alreadyApplied, ok := compStatus.ImageComponentsAutoApplied[c.Name]
|
||||
if ok && reflect.DeepEqual(*c.Image, alreadyApplied) {
|
||||
klog.V(1).Infof("Skipping image component %q; already applied and not changed", c.Name)
|
||||
continue
|
||||
}
|
||||
err = image.BuildPushSpecificImage(ctx, fs, c, true)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
compStatus.ImageComponentsAutoApplied[c.Name] = *c.Image
|
||||
}
|
||||
|
||||
// Remove keys that might no longer be valid
|
||||
devfileHasCompFn := func(n string) bool {
|
||||
for _, c := range components {
|
||||
if c.Name == n {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
for n := range compStatus.ImageComponentsAutoApplied {
|
||||
if !devfileHasCompFn(n) {
|
||||
delete(compStatus.ImageComponentsAutoApplied, n)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// pushDevfileKubernetesComponents gets the Kubernetes components from the Devfile and push them to the cluster
|
||||
// adding the specified labels and ownerreference to them
|
||||
func (a *Adapter) pushDevfileKubernetesComponents(
|
||||
@@ -43,7 +89,7 @@ func (a *Adapter) pushDevfileKubernetesComponents(
|
||||
) ([]devfilev1.Component, error) {
|
||||
// fetch the "kubernetes inlined components" to create them on cluster
|
||||
// from odo standpoint, these components contain yaml manifest of ServiceBinding
|
||||
k8sComponents, err := devfile.GetK8sAndOcComponentsToPush(a.Devfile, false)
|
||||
k8sComponents, err := libdevfile.GetK8sAndOcComponentsToPush(a.Devfile, false)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error while trying to fetch service(s) from devfile: %w", err)
|
||||
}
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
package devfile
|
||||
|
||||
import (
|
||||
devfilev1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
|
||||
"github.com/devfile/library/v2/pkg/devfile/parser"
|
||||
parsercommon "github.com/devfile/library/v2/pkg/devfile/parser/data/v2/common"
|
||||
)
|
||||
|
||||
// GetK8sAndOcComponentsToPush returns the list of Kubernetes and OpenShift components to push,
|
||||
// by getting the list of Kubernetes and OpenShift components and removing the ones
|
||||
// referenced from a command in the devfile
|
||||
// It takes an additional allowApply boolean, which set to true, will append the components from apply command to the list
|
||||
func GetK8sAndOcComponentsToPush(devfileObj parser.DevfileObj, allowApply bool) ([]devfilev1.Component, error) {
|
||||
k8sComponents, err := devfileObj.Data.GetComponents(parsercommon.DevfileOptions{
|
||||
ComponentOptions: parsercommon.ComponentOptions{ComponentType: devfilev1.KubernetesComponentType},
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ocComponents, err := devfileObj.Data.GetComponents(parsercommon.DevfileOptions{
|
||||
ComponentOptions: parsercommon.ComponentOptions{ComponentType: devfilev1.OpenshiftComponentType},
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
allComponents := []devfilev1.Component{}
|
||||
allComponents = append(allComponents, k8sComponents...)
|
||||
allComponents = append(allComponents, ocComponents...)
|
||||
|
||||
componentsMap := map[string]devfilev1.Component{}
|
||||
for _, component := range allComponents {
|
||||
componentsMap[component.Name] = component
|
||||
}
|
||||
|
||||
commands, err := devfileObj.Data.GetCommands(parsercommon.DevfileOptions{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, command := range commands {
|
||||
componentName := ""
|
||||
if command.Exec != nil {
|
||||
componentName = command.Exec.Component
|
||||
} else if !allowApply && command.Apply != nil {
|
||||
componentName = command.Apply.Component
|
||||
}
|
||||
if componentName == "" {
|
||||
continue
|
||||
}
|
||||
delete(componentsMap, componentName)
|
||||
}
|
||||
|
||||
allComponentsToPush := make([]devfilev1.Component, len(componentsMap))
|
||||
i := 0
|
||||
for _, v := range componentsMap {
|
||||
allComponentsToPush[i] = v
|
||||
i++
|
||||
}
|
||||
|
||||
return allComponentsToPush, err
|
||||
}
|
||||
@@ -1,186 +0,0 @@
|
||||
package devfile
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/google/go-cmp/cmp/cmpopts"
|
||||
|
||||
devfiletesting "github.com/redhat-developer/odo/pkg/devfile/testing"
|
||||
|
||||
devfilev1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
|
||||
"github.com/devfile/library/v2/pkg/devfile/parser"
|
||||
devfileCtx "github.com/devfile/library/v2/pkg/devfile/parser/context"
|
||||
devfileFileSystem "github.com/devfile/library/v2/pkg/testingutil/filesystem"
|
||||
)
|
||||
|
||||
func TestGetKubernetesComponentsToPush(t *testing.T) {
|
||||
fs := devfileFileSystem.NewFakeFs()
|
||||
|
||||
getDevfileWithoutApplyCommand := func() parser.DevfileObj {
|
||||
devfileObj := parser.DevfileObj{
|
||||
Data: devfiletesting.GetDevfileData(t, []devfiletesting.InlinedComponent{
|
||||
{
|
||||
Name: "component1",
|
||||
Inlined: "Component 1",
|
||||
},
|
||||
}, nil),
|
||||
Ctx: devfileCtx.FakeContext(fs, parser.OutputDevfileYamlPath),
|
||||
}
|
||||
return devfileObj
|
||||
}
|
||||
|
||||
getDevfileWithApplyCommand := func(applyComponentName string) parser.DevfileObj {
|
||||
const defaultComponentName = "component1"
|
||||
devfileObj := parser.DevfileObj{
|
||||
Data: devfiletesting.GetDevfileData(t, []devfiletesting.InlinedComponent{
|
||||
{
|
||||
Name: defaultComponentName,
|
||||
Inlined: "Component 1",
|
||||
},
|
||||
}, nil),
|
||||
Ctx: devfileCtx.FakeContext(fs, parser.OutputDevfileYamlPath),
|
||||
}
|
||||
applyCommand := devfilev1.Command{
|
||||
CommandUnion: devfilev1.CommandUnion{
|
||||
Apply: &devfilev1.ApplyCommand{
|
||||
Component: applyComponentName,
|
||||
},
|
||||
},
|
||||
}
|
||||
if applyComponentName != defaultComponentName {
|
||||
_ = devfileObj.Data.AddComponents([]devfilev1.Component{
|
||||
{
|
||||
Name: applyComponentName,
|
||||
ComponentUnion: devfilev1.ComponentUnion{
|
||||
Kubernetes: &devfilev1.KubernetesComponent{
|
||||
K8sLikeComponent: devfilev1.K8sLikeComponent{
|
||||
K8sLikeComponentLocation: devfilev1.K8sLikeComponentLocation{
|
||||
Inlined: applyComponentName,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
_ = devfileObj.Data.AddCommands([]devfilev1.Command{applyCommand})
|
||||
return devfileObj
|
||||
}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
devfileObj parser.DevfileObj
|
||||
want []devfilev1.Component
|
||||
allowApply bool
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "empty devfile",
|
||||
devfileObj: parser.DevfileObj{
|
||||
Data: devfiletesting.GetDevfileData(t, nil, nil),
|
||||
Ctx: devfileCtx.FakeContext(fs, parser.OutputDevfileYamlPath),
|
||||
},
|
||||
want: []devfilev1.Component{},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "no apply command",
|
||||
devfileObj: getDevfileWithoutApplyCommand(),
|
||||
want: []devfilev1.Component{
|
||||
{
|
||||
Name: "component1",
|
||||
ComponentUnion: devfilev1.ComponentUnion{
|
||||
Kubernetes: &devfilev1.KubernetesComponent{
|
||||
K8sLikeComponent: devfilev1.K8sLikeComponent{
|
||||
K8sLikeComponentLocation: devfilev1.K8sLikeComponentLocation{
|
||||
Inlined: "Component 1",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "apply command referencing the component",
|
||||
devfileObj: getDevfileWithApplyCommand("component1"),
|
||||
want: []devfilev1.Component{},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "apply command not referencing the component",
|
||||
devfileObj: getDevfileWithApplyCommand("other component"),
|
||||
want: []devfilev1.Component{
|
||||
{
|
||||
Name: "component1",
|
||||
ComponentUnion: devfilev1.ComponentUnion{
|
||||
Kubernetes: &devfilev1.KubernetesComponent{
|
||||
K8sLikeComponent: devfilev1.K8sLikeComponent{
|
||||
K8sLikeComponentLocation: devfilev1.K8sLikeComponentLocation{
|
||||
Inlined: "Component 1",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "allow component referenced by apply command when allowApply is true",
|
||||
devfileObj: getDevfileWithApplyCommand("component2"),
|
||||
allowApply: true,
|
||||
want: []devfilev1.Component{
|
||||
{
|
||||
Name: "component1",
|
||||
ComponentUnion: devfilev1.ComponentUnion{
|
||||
Kubernetes: &devfilev1.KubernetesComponent{
|
||||
K8sLikeComponent: devfilev1.K8sLikeComponent{
|
||||
K8sLikeComponentLocation: devfilev1.K8sLikeComponentLocation{
|
||||
Inlined: "Component 1",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "component2",
|
||||
ComponentUnion: devfilev1.ComponentUnion{
|
||||
Kubernetes: &devfilev1.KubernetesComponent{
|
||||
K8sLikeComponent: devfilev1.K8sLikeComponent{
|
||||
K8sLikeComponentLocation: devfilev1.K8sLikeComponentLocation{
|
||||
Inlined: "component2",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
}
|
||||
|
||||
lessFunc := func(x, y devfilev1.Component) bool {
|
||||
return x.Name < y.Name
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got, err := GetK8sAndOcComponentsToPush(tt.devfileObj, tt.allowApply)
|
||||
gotErr := err != nil
|
||||
if gotErr != tt.wantErr {
|
||||
t.Errorf("Got error %v, expected %v\n", err, tt.wantErr)
|
||||
}
|
||||
|
||||
if len(got) != len(tt.want) {
|
||||
t.Errorf("Got %d components, expected %d\n", len(got), len(tt.want))
|
||||
}
|
||||
|
||||
if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(lessFunc)); diff != "" {
|
||||
t.Errorf("GetK8sAndOcComponentsToPush() mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -2,11 +2,11 @@ package devfile
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"strings"
|
||||
|
||||
"github.com/devfile/library/v2/pkg/devfile"
|
||||
"github.com/devfile/library/v2/pkg/devfile/parser"
|
||||
"k8s.io/utils/pointer"
|
||||
|
||||
"github.com/redhat-developer/odo/pkg/devfile/validate"
|
||||
"github.com/redhat-developer/odo/pkg/log"
|
||||
@@ -44,7 +44,10 @@ func parseDevfile(args parser.ParserArgs) (parser.DevfileObj, error) {
|
||||
// ParseAndValidateFromFile reads, parses and validates devfile from a file
|
||||
// if there are warning it logs them on stdout
|
||||
func ParseAndValidateFromFile(devfilePath string) (parser.DevfileObj, error) {
|
||||
return parseDevfile(parser.ParserArgs{Path: devfilePath})
|
||||
return parseDevfile(parser.ParserArgs{
|
||||
Path: devfilePath,
|
||||
SetBooleanDefaults: pointer.Bool(false),
|
||||
})
|
||||
}
|
||||
|
||||
// ParseAndValidateFromFileWithVariables reads, parses and validates devfile from a file
|
||||
@@ -52,8 +55,9 @@ func ParseAndValidateFromFile(devfilePath string) (parser.DevfileObj, error) {
|
||||
// if there are warning it logs them on stdout
|
||||
func ParseAndValidateFromFileWithVariables(devfilePath string, variables map[string]string) (parser.DevfileObj, error) {
|
||||
return parseDevfile(parser.ParserArgs{
|
||||
Path: devfilePath,
|
||||
ExternalVariables: variables,
|
||||
Path: devfilePath,
|
||||
ExternalVariables: variables,
|
||||
SetBooleanDefaults: pointer.Bool(false),
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -284,7 +284,11 @@ func (o *InitClient) SelectAndPersonalizeDevfile(ctx context.Context, flags map[
|
||||
return parser.DevfileObj{}, "", nil, fmt.Errorf("unable to download devfile: %w", err)
|
||||
}
|
||||
|
||||
devfileObj, _, err := devfile.ParseDevfileAndValidate(parser.ParserArgs{Path: devfilePath, FlattenedDevfile: pointer.Bool(false)})
|
||||
devfileObj, _, err := devfile.ParseDevfileAndValidate(parser.ParserArgs{
|
||||
Path: devfilePath,
|
||||
FlattenedDevfile: pointer.Bool(false),
|
||||
SetBooleanDefaults: pointer.Bool(false),
|
||||
})
|
||||
if err != nil {
|
||||
return parser.DevfileObj{}, "", nil, fmt.Errorf("unable to parse devfile: %w", err)
|
||||
}
|
||||
|
||||
@@ -42,3 +42,15 @@ func newComponent(devfileObj parser.DevfileObj, devfileCmp v1alpha2.Component) (
|
||||
}
|
||||
return cmp, nil
|
||||
}
|
||||
|
||||
func isComponentReferenced(allApplyCommands []v1alpha2.Command, cmpName string) bool {
|
||||
for _, cmd := range allApplyCommands {
|
||||
if cmd.Apply == nil {
|
||||
continue
|
||||
}
|
||||
if cmd.Apply.Component == cmpName {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package libdevfile
|
||||
import (
|
||||
"github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
|
||||
"github.com/devfile/library/v2/pkg/devfile/parser"
|
||||
parsercommon "github.com/devfile/library/v2/pkg/devfile/parser/data/v2/common"
|
||||
)
|
||||
|
||||
// imageComponent implements the component interface
|
||||
@@ -27,3 +28,50 @@ func (e *imageComponent) CheckValidity() error {
|
||||
func (e *imageComponent) Apply(handler Handler) error {
|
||||
return handler.ApplyImage(e.component)
|
||||
}
|
||||
|
||||
// GetImageComponentsToPush returns the list of Image components that can be automatically created on startup.
|
||||
// The list returned is governed by the AutoBuild field in each component.
|
||||
// All components with AutoBuild set to true are included, along with those with no AutoBuild set and not-referenced.
|
||||
func GetImageComponentsToPush(devfileObj parser.DevfileObj) ([]v1alpha2.Component, error) {
|
||||
imageComponents, err := devfileObj.Data.GetComponents(parsercommon.DevfileOptions{
|
||||
ComponentOptions: parsercommon.ComponentOptions{ComponentType: v1alpha2.ImageComponentType},
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
allApplyCommands, err := devfileObj.Data.GetCommands(parsercommon.DevfileOptions{
|
||||
CommandOptions: parsercommon.CommandOptions{CommandType: v1alpha2.ApplyCommandType},
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
m := make(map[string]v1alpha2.Component)
|
||||
for _, comp := range imageComponents {
|
||||
if comp.Image == nil {
|
||||
continue
|
||||
}
|
||||
var add bool
|
||||
if comp.Image.AutoBuild == nil {
|
||||
// auto-created only if not referenced by any apply command
|
||||
if !isComponentReferenced(allApplyCommands, comp.Name) {
|
||||
add = true
|
||||
}
|
||||
} else if *comp.Image.AutoBuild {
|
||||
add = true
|
||||
}
|
||||
if !add {
|
||||
continue
|
||||
}
|
||||
if _, present := m[comp.Name]; !present {
|
||||
m[comp.Name] = comp
|
||||
}
|
||||
}
|
||||
|
||||
var result []v1alpha2.Component
|
||||
for _, comp := range m {
|
||||
result = append(result, comp)
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
202
pkg/libdevfile/component_image_test.go
Normal file
202
pkg/libdevfile/component_image_test.go
Normal file
@@ -0,0 +1,202 @@
|
||||
package libdevfile
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
devfilev1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
|
||||
devfilepkg "github.com/devfile/api/v2/pkg/devfile"
|
||||
"github.com/devfile/library/v2/pkg/devfile/parser"
|
||||
devfileCtx "github.com/devfile/library/v2/pkg/devfile/parser/context"
|
||||
"github.com/devfile/library/v2/pkg/devfile/parser/data"
|
||||
devfileFileSystem "github.com/devfile/library/v2/pkg/testingutil/filesystem"
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/google/go-cmp/cmp/cmpopts"
|
||||
"k8s.io/utils/pointer"
|
||||
|
||||
devfiletesting "github.com/redhat-developer/odo/pkg/devfile/testing"
|
||||
)
|
||||
|
||||
func TestGetImageComponentsToPush(t *testing.T) {
|
||||
fs := devfileFileSystem.NewFakeFs()
|
||||
|
||||
buildImageComponent := func(name string, autoBuild *bool, referenced bool) (devfilev1.Component, devfilev1.Command) {
|
||||
comp := devfilev1.Component{
|
||||
Name: name,
|
||||
ComponentUnion: devfilev1.ComponentUnion{
|
||||
Image: &devfilev1.ImageComponent{
|
||||
Image: devfilev1.Image{
|
||||
ImageName: "my-image:" + name,
|
||||
ImageUnion: devfilev1.ImageUnion{
|
||||
AutoBuild: autoBuild,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
if referenced {
|
||||
cmd := devfilev1.Command{
|
||||
Id: "apply-" + name,
|
||||
CommandUnion: devfilev1.CommandUnion{
|
||||
Apply: &devfilev1.ApplyCommand{
|
||||
Component: name,
|
||||
},
|
||||
},
|
||||
}
|
||||
return comp, cmd
|
||||
}
|
||||
return comp, devfilev1.Command{}
|
||||
}
|
||||
|
||||
var (
|
||||
autoBuildTrueReferenced, applyAutoBuildTrueReferenced = buildImageComponent(
|
||||
"autoBuildTrueReferenced", pointer.Bool(true), true)
|
||||
autoBuildTrueNotReferenced, _ = buildImageComponent(
|
||||
"autoBuildTrueNotReferenced", pointer.Bool(true), false)
|
||||
autoBuildFalseReferenced, applyAutoBuildFalseReferenced = buildImageComponent(
|
||||
"autoBuildFalseReferenced", pointer.Bool(false), true)
|
||||
autoBuildFalseNotReferenced, _ = buildImageComponent(
|
||||
"autoBuildFalseNotReferenced", pointer.Bool(false), false)
|
||||
autoBuildNotSetReferenced, applyAutoBuildNotSetReferenced = buildImageComponent(
|
||||
"autoBuildNotSetReferenced", nil, true)
|
||||
autoBuildNotSetNotReferenced, _ = buildImageComponent(
|
||||
"autoBuildNotSetNotReferenced", nil, false)
|
||||
)
|
||||
|
||||
buildFullDevfile := func() (parser.DevfileObj, error) {
|
||||
devfileData, err := data.NewDevfileData(string(data.APISchemaVersion220))
|
||||
if err != nil {
|
||||
return parser.DevfileObj{}, err
|
||||
}
|
||||
devfileData.SetMetadata(devfilepkg.DevfileMetadata{Name: "my-devfile"})
|
||||
err = devfileData.AddComponents([]devfilev1.Component{
|
||||
autoBuildTrueReferenced,
|
||||
autoBuildTrueNotReferenced,
|
||||
autoBuildFalseReferenced,
|
||||
autoBuildFalseNotReferenced,
|
||||
autoBuildNotSetReferenced,
|
||||
autoBuildNotSetNotReferenced,
|
||||
|
||||
//Add other kinds of components
|
||||
{
|
||||
Name: "my-k8s-component",
|
||||
ComponentUnion: devfilev1.ComponentUnion{
|
||||
Kubernetes: &devfilev1.KubernetesComponent{
|
||||
K8sLikeComponent: devfilev1.K8sLikeComponent{
|
||||
K8sLikeComponentLocation: devfilev1.K8sLikeComponentLocation{
|
||||
Inlined: "my-k8s-component-inlined",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "container-component",
|
||||
ComponentUnion: devfilev1.ComponentUnion{
|
||||
Container: &devfilev1.ContainerComponent{
|
||||
Container: devfilev1.Container{
|
||||
DedicatedPod: pointer.Bool(true),
|
||||
Image: "my-container-image",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return parser.DevfileObj{}, err
|
||||
}
|
||||
err = devfileData.AddCommands([]devfilev1.Command{
|
||||
applyAutoBuildTrueReferenced,
|
||||
applyAutoBuildFalseReferenced,
|
||||
applyAutoBuildNotSetReferenced,
|
||||
|
||||
//Add other kinds of components
|
||||
{
|
||||
Id: "apply-k8s-component",
|
||||
CommandUnion: devfilev1.CommandUnion{
|
||||
Apply: &devfilev1.ApplyCommand{
|
||||
Component: "my-k8s-component",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Id: "exec-command",
|
||||
CommandUnion: devfilev1.CommandUnion{
|
||||
Apply: &devfilev1.ApplyCommand{
|
||||
Component: "my-image-component",
|
||||
},
|
||||
Exec: &devfilev1.ExecCommand{
|
||||
CommandLine: "/path/to/my/command -success",
|
||||
Component: "container-component",
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return parser.DevfileObj{}, err
|
||||
}
|
||||
return parser.DevfileObj{
|
||||
Ctx: devfileCtx.FakeContext(fs, parser.OutputDevfileYamlPath),
|
||||
Data: devfileData,
|
||||
}, nil
|
||||
}
|
||||
|
||||
type args struct {
|
||||
devfileObj func() (parser.DevfileObj, error)
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want []devfilev1.Component
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "empty devfile",
|
||||
args: args{
|
||||
devfileObj: func() (parser.DevfileObj, error) {
|
||||
return parser.DevfileObj{
|
||||
Data: devfiletesting.GetDevfileData(t, nil, nil),
|
||||
Ctx: devfileCtx.FakeContext(fs, parser.OutputDevfileYamlPath),
|
||||
}, nil
|
||||
},
|
||||
},
|
||||
want: []devfilev1.Component{},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "return components that need to be created automatically on startup",
|
||||
args: args{
|
||||
devfileObj: buildFullDevfile,
|
||||
},
|
||||
want: []devfilev1.Component{
|
||||
autoBuildTrueReferenced,
|
||||
autoBuildTrueNotReferenced,
|
||||
autoBuildNotSetNotReferenced,
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
devfileObj, err := tt.args.devfileObj()
|
||||
if err != nil {
|
||||
t.Errorf("unable to create Devfile object: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
got, err := GetImageComponentsToPush(devfileObj)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("GetImageComponentsToPush() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
if len(got) != len(tt.want) {
|
||||
t.Errorf("Got %d components, expected %d\n", len(got), len(tt.want))
|
||||
}
|
||||
|
||||
lessFn := func(x, y devfilev1.Component) bool {
|
||||
return x.Name < y.Name
|
||||
}
|
||||
if diff := cmp.Diff(tt.want, got, cmpopts.EquateEmpty(), cmpopts.SortSlices(lessFn)); diff != "" {
|
||||
t.Errorf("GetImageComponentsToPush() mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package libdevfile
|
||||
import (
|
||||
"github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
|
||||
"github.com/devfile/library/v2/pkg/devfile/parser"
|
||||
parsercommon "github.com/devfile/library/v2/pkg/devfile/parser/data/v2/common"
|
||||
)
|
||||
|
||||
// kubernetesComponent implements the component interface
|
||||
@@ -27,3 +28,70 @@ func (e *kubernetesComponent) CheckValidity() error {
|
||||
func (e *kubernetesComponent) Apply(handler Handler) error {
|
||||
return handler.ApplyKubernetes(e.component)
|
||||
}
|
||||
|
||||
// GetK8sAndOcComponentsToPush returns the list of Kubernetes and OpenShift components to push,
|
||||
// The list returned is governed by the DeployByDefault field in each component.
|
||||
// All components with DeployByDefault set to true are included, along with those with no DeployByDefault set and not-referenced.
|
||||
// It takes an additional allowApply boolean, which set to true, will append the components referenced from apply commands to the list.
|
||||
func GetK8sAndOcComponentsToPush(devfileObj parser.DevfileObj, allowApply bool) ([]v1alpha2.Component, error) {
|
||||
var allComponents []v1alpha2.Component
|
||||
|
||||
k8sComponents, err := devfileObj.Data.GetComponents(parsercommon.DevfileOptions{
|
||||
ComponentOptions: parsercommon.ComponentOptions{ComponentType: v1alpha2.KubernetesComponentType},
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
allComponents = append(allComponents, k8sComponents...)
|
||||
|
||||
ocComponents, err := devfileObj.Data.GetComponents(parsercommon.DevfileOptions{
|
||||
ComponentOptions: parsercommon.ComponentOptions{ComponentType: v1alpha2.OpenshiftComponentType},
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
allComponents = append(allComponents, ocComponents...)
|
||||
|
||||
allApplyCommands, err := devfileObj.Data.GetCommands(parsercommon.DevfileOptions{
|
||||
CommandOptions: parsercommon.CommandOptions{CommandType: v1alpha2.ApplyCommandType},
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
m := make(map[string]v1alpha2.Component)
|
||||
for _, comp := range allComponents {
|
||||
if comp.Kubernetes == nil && comp.Openshift == nil {
|
||||
continue
|
||||
}
|
||||
var k v1alpha2.K8sLikeComponent
|
||||
if comp.Kubernetes != nil {
|
||||
k = comp.Kubernetes.K8sLikeComponent
|
||||
} else {
|
||||
k = comp.Openshift.K8sLikeComponent
|
||||
}
|
||||
var add bool
|
||||
if allowApply && isComponentReferenced(allApplyCommands, comp.Name) {
|
||||
add = true
|
||||
} else if k.DeployByDefault == nil {
|
||||
// auto-created only if not referenced by any apply command
|
||||
if !isComponentReferenced(allApplyCommands, comp.Name) {
|
||||
add = true
|
||||
}
|
||||
} else if *k.DeployByDefault {
|
||||
add = true
|
||||
}
|
||||
if !add {
|
||||
continue
|
||||
}
|
||||
if _, present := m[comp.Name]; !present {
|
||||
m[comp.Name] = comp
|
||||
}
|
||||
}
|
||||
|
||||
var result []v1alpha2.Component
|
||||
for _, comp := range m {
|
||||
result = append(result, comp)
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
254
pkg/libdevfile/component_kubernetes_test.go
Normal file
254
pkg/libdevfile/component_kubernetes_test.go
Normal file
@@ -0,0 +1,254 @@
|
||||
package libdevfile
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
|
||||
devfilepkg "github.com/devfile/api/v2/pkg/devfile"
|
||||
"github.com/devfile/library/v2/pkg/devfile/parser"
|
||||
devfileCtx "github.com/devfile/library/v2/pkg/devfile/parser/context"
|
||||
"github.com/devfile/library/v2/pkg/devfile/parser/data"
|
||||
devfileFileSystem "github.com/devfile/library/v2/pkg/testingutil/filesystem"
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/google/go-cmp/cmp/cmpopts"
|
||||
"k8s.io/utils/pointer"
|
||||
|
||||
devfiletesting "github.com/redhat-developer/odo/pkg/devfile/testing"
|
||||
)
|
||||
|
||||
func TestGetK8sAndOcComponentsToPush(t *testing.T) {
|
||||
fs := devfileFileSystem.NewFakeFs()
|
||||
|
||||
buildK8sOrOcComponent := func(k8s bool, name string, deployByDefault *bool, referenced bool) (v1alpha2.Component, v1alpha2.Command) {
|
||||
k8sLikeComponent := v1alpha2.K8sLikeComponent{
|
||||
DeployByDefault: deployByDefault,
|
||||
K8sLikeComponentLocation: v1alpha2.K8sLikeComponentLocation{
|
||||
Inlined: name,
|
||||
},
|
||||
}
|
||||
comp := v1alpha2.Component{Name: name}
|
||||
if k8s {
|
||||
comp.ComponentUnion.Kubernetes = &v1alpha2.KubernetesComponent{K8sLikeComponent: k8sLikeComponent}
|
||||
} else {
|
||||
comp.ComponentUnion.Openshift = &v1alpha2.OpenshiftComponent{K8sLikeComponent: k8sLikeComponent}
|
||||
}
|
||||
if referenced {
|
||||
cmd := v1alpha2.Command{
|
||||
Id: "apply-" + name,
|
||||
CommandUnion: v1alpha2.CommandUnion{
|
||||
Apply: &v1alpha2.ApplyCommand{
|
||||
Component: name,
|
||||
},
|
||||
},
|
||||
}
|
||||
return comp, cmd
|
||||
}
|
||||
return comp, v1alpha2.Command{}
|
||||
}
|
||||
|
||||
var (
|
||||
k8sDeployByDefaultTrueReferenced, applyK8sDeployByDefaultTrueReferenced = buildK8sOrOcComponent(
|
||||
true, "k8sDeployByDefaultTrueReferenced", pointer.Bool(true), true)
|
||||
ocDeployByDefaultTrueReferenced, applyOcDeployByDefaultTrueReferenced = buildK8sOrOcComponent(
|
||||
false, "ocDeployByDefaultTrueReferenced", pointer.Bool(true), true)
|
||||
|
||||
k8sDeployByDefaultTrueNotReferenced, _ = buildK8sOrOcComponent(
|
||||
true, "k8sDeployByDefaultTrueNotReferenced", pointer.Bool(true), false)
|
||||
ocDeployByDefaultTrueNotReferenced, _ = buildK8sOrOcComponent(
|
||||
false, "ocDeployByDefaultTrueNotReferenced", pointer.Bool(true), false)
|
||||
|
||||
k8sDeployByDefaultFalseReferenced, applyK8sDeployByDefaultFalseReferenced = buildK8sOrOcComponent(
|
||||
true, "k8sDeployByDefaultFalseReferenced", pointer.Bool(false), true)
|
||||
ocDeployByDefaultFalseReferenced, applyOcDeployByDefaultFalseReferenced = buildK8sOrOcComponent(
|
||||
false, "ocDeployByDefaultFalseReferenced", pointer.Bool(false), true)
|
||||
|
||||
k8sDeployByDefaultFalseNotReferenced, _ = buildK8sOrOcComponent(
|
||||
true, "k8sDeployByDefaultFalseNotReferenced", pointer.Bool(false), false)
|
||||
ocDeployByDefaultFalseNotReferenced, _ = buildK8sOrOcComponent(
|
||||
false, "ocDeployByDefaultFalseNotReferenced", pointer.Bool(false), false)
|
||||
|
||||
k8sDeployByDefaultNotSetReferenced, applyK8sDeployByDefaultNotSetReferenced = buildK8sOrOcComponent(
|
||||
true, "k8sDeployByDefaultNotSetReferenced", nil, true)
|
||||
ocDeployByDefaultNotSetReferenced, applyOcDeployByDefaultNotSetReferenced = buildK8sOrOcComponent(
|
||||
false, "ocDeployByDefaultNotSetReferenced", nil, true)
|
||||
|
||||
k8sDeployByDefaultNotSetNotReferenced, _ = buildK8sOrOcComponent(
|
||||
true, "k8sDeployByDefaultNotSetNotReferenced", nil, false)
|
||||
ocDeployByDefaultNotSetNotReferenced, _ = buildK8sOrOcComponent(
|
||||
false, "ocDeployByDefaultNotSetNotReferenced", nil, false)
|
||||
)
|
||||
|
||||
buildFullDevfile := func() (parser.DevfileObj, error) {
|
||||
devfileData, err := data.NewDevfileData(string(data.APISchemaVersion220))
|
||||
if err != nil {
|
||||
return parser.DevfileObj{}, err
|
||||
}
|
||||
devfileData.SetMetadata(devfilepkg.DevfileMetadata{Name: "my-devfile"})
|
||||
err = devfileData.AddComponents([]v1alpha2.Component{
|
||||
k8sDeployByDefaultNotSetNotReferenced,
|
||||
k8sDeployByDefaultNotSetReferenced,
|
||||
ocDeployByDefaultNotSetReferenced,
|
||||
ocDeployByDefaultNotSetNotReferenced,
|
||||
|
||||
k8sDeployByDefaultTrueNotReferenced,
|
||||
k8sDeployByDefaultTrueReferenced,
|
||||
ocDeployByDefaultTrueReferenced,
|
||||
ocDeployByDefaultTrueNotReferenced,
|
||||
|
||||
k8sDeployByDefaultFalseNotReferenced,
|
||||
k8sDeployByDefaultFalseReferenced,
|
||||
ocDeployByDefaultFalseReferenced,
|
||||
ocDeployByDefaultFalseNotReferenced,
|
||||
|
||||
//Add other kinds of components
|
||||
{
|
||||
Name: "my-image-component",
|
||||
ComponentUnion: v1alpha2.ComponentUnion{
|
||||
Image: &v1alpha2.ImageComponent{
|
||||
Image: v1alpha2.Image{
|
||||
ImageName: "image-component-1",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "container-component",
|
||||
ComponentUnion: v1alpha2.ComponentUnion{
|
||||
Container: &v1alpha2.ContainerComponent{
|
||||
Container: v1alpha2.Container{
|
||||
DedicatedPod: pointer.Bool(true),
|
||||
Image: "my-container-image",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return parser.DevfileObj{}, err
|
||||
}
|
||||
err = devfileData.AddCommands([]v1alpha2.Command{
|
||||
applyK8sDeployByDefaultNotSetReferenced,
|
||||
applyOcDeployByDefaultNotSetReferenced,
|
||||
applyK8sDeployByDefaultTrueReferenced,
|
||||
applyOcDeployByDefaultTrueReferenced,
|
||||
applyK8sDeployByDefaultFalseReferenced,
|
||||
applyOcDeployByDefaultFalseReferenced,
|
||||
|
||||
//Add other kinds of components
|
||||
{
|
||||
Id: "apply-image",
|
||||
CommandUnion: v1alpha2.CommandUnion{
|
||||
Apply: &v1alpha2.ApplyCommand{
|
||||
Component: "my-image-component",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Id: "exec-command",
|
||||
CommandUnion: v1alpha2.CommandUnion{
|
||||
Apply: &v1alpha2.ApplyCommand{
|
||||
Component: "my-image-component",
|
||||
},
|
||||
Exec: &v1alpha2.ExecCommand{
|
||||
CommandLine: "/path/to/my/command -success",
|
||||
Component: "container-component",
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return parser.DevfileObj{}, err
|
||||
}
|
||||
return parser.DevfileObj{
|
||||
Ctx: devfileCtx.FakeContext(fs, parser.OutputDevfileYamlPath),
|
||||
Data: devfileData,
|
||||
}, nil
|
||||
}
|
||||
|
||||
type args struct {
|
||||
devfileObj func() (parser.DevfileObj, error)
|
||||
allowApply bool
|
||||
}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want []v1alpha2.Component
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "empty devfile",
|
||||
args: args{
|
||||
devfileObj: func() (parser.DevfileObj, error) {
|
||||
return parser.DevfileObj{
|
||||
Data: devfiletesting.GetDevfileData(t, nil, nil),
|
||||
Ctx: devfileCtx.FakeContext(fs, parser.OutputDevfileYamlPath),
|
||||
}, nil
|
||||
},
|
||||
},
|
||||
want: []v1alpha2.Component{},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "allowApply=false => return components that need to be created automatically on startup",
|
||||
args: args{
|
||||
devfileObj: buildFullDevfile,
|
||||
allowApply: false,
|
||||
},
|
||||
want: []v1alpha2.Component{
|
||||
k8sDeployByDefaultTrueNotReferenced,
|
||||
k8sDeployByDefaultTrueReferenced,
|
||||
ocDeployByDefaultTrueNotReferenced,
|
||||
ocDeployByDefaultTrueReferenced,
|
||||
k8sDeployByDefaultNotSetNotReferenced,
|
||||
ocDeployByDefaultNotSetNotReferenced,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "allowApply=true => return components that need to be created automatically on startup and those referenced",
|
||||
args: args{
|
||||
devfileObj: buildFullDevfile,
|
||||
allowApply: true,
|
||||
},
|
||||
want: []v1alpha2.Component{
|
||||
k8sDeployByDefaultTrueNotReferenced,
|
||||
k8sDeployByDefaultTrueReferenced,
|
||||
ocDeployByDefaultTrueNotReferenced,
|
||||
ocDeployByDefaultTrueReferenced,
|
||||
k8sDeployByDefaultNotSetNotReferenced,
|
||||
ocDeployByDefaultNotSetNotReferenced,
|
||||
|
||||
k8sDeployByDefaultFalseReferenced,
|
||||
ocDeployByDefaultFalseReferenced,
|
||||
k8sDeployByDefaultNotSetReferenced,
|
||||
ocDeployByDefaultNotSetReferenced,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
devfileObj, err := tt.args.devfileObj()
|
||||
if err != nil {
|
||||
t.Errorf("unable to create Devfile object: %v", err)
|
||||
return
|
||||
}
|
||||
got, err := GetK8sAndOcComponentsToPush(devfileObj, tt.args.allowApply)
|
||||
gotErr := err != nil
|
||||
if gotErr != tt.wantErr {
|
||||
t.Errorf("Got error %v, expected %v\n", err, tt.wantErr)
|
||||
}
|
||||
|
||||
if len(got) != len(tt.want) {
|
||||
t.Errorf("Got %d components, expected %d\n", len(got), len(tt.want))
|
||||
}
|
||||
|
||||
lessFn := func(x, y v1alpha2.Component) bool {
|
||||
return x.Name < y.Name
|
||||
}
|
||||
if diff := cmp.Diff(tt.want, got, cmpopts.EquateEmpty(), cmpopts.SortSlices(lessFn)); diff != "" {
|
||||
t.Errorf("GetK8sAndOcComponentsToPush() mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -235,7 +235,11 @@ func (o *InitOptions) run(ctx context.Context) (devfileObj parser.DevfileObj, pa
|
||||
|
||||
// in case the starter project contains a devfile, read it again
|
||||
if _, err = o.clientset.FS.Stat(devfilePath); err == nil {
|
||||
devfileObj, _, err = devfile.ParseDevfileAndValidate(parser.ParserArgs{Path: devfilePath, FlattenedDevfile: pointer.Bool(false)})
|
||||
devfileObj, _, err = devfile.ParseDevfileAndValidate(parser.ParserArgs{
|
||||
Path: devfilePath,
|
||||
FlattenedDevfile: pointer.Bool(false),
|
||||
SetBooleanDefaults: pointer.Bool(false),
|
||||
})
|
||||
if err != nil {
|
||||
return parser.DevfileObj{}, "", "", nil, nil, err
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
devfileCtx "github.com/devfile/library/v2/pkg/devfile/parser/context"
|
||||
"github.com/devfile/library/v2/pkg/devfile/parser/data"
|
||||
devfilefs "github.com/devfile/library/v2/pkg/testingutil/filesystem"
|
||||
"k8s.io/utils/pointer"
|
||||
)
|
||||
|
||||
// GetFakeContainerComponent returns a fake container component for testing
|
||||
@@ -142,7 +143,10 @@ func GetTestDevfileObjFromFile(fileName string) parser.DevfileObj {
|
||||
// path to the devfile
|
||||
devfilePath := filepath.Join(filepath.Dir(filename), "..", "..", "tests", "examples", filepath.Join("source", "devfiles", "nodejs", fileName))
|
||||
|
||||
devfileObj, _, err := devfile.ParseDevfileAndValidate(parser.ParserArgs{Path: devfilePath})
|
||||
devfileObj, _, err := devfile.ParseDevfileAndValidate(parser.ParserArgs{
|
||||
Path: devfilePath,
|
||||
SetBooleanDefaults: pointer.Bool(false),
|
||||
})
|
||||
if err != nil {
|
||||
return parser.DevfileObj{}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,9 @@ type ComponentStatus struct {
|
||||
// Used for HotReload capability
|
||||
RunExecuted bool
|
||||
EndpointsForwarded map[string][]v1alpha2.Endpoint
|
||||
// ImageComponentsAutoApplied is a cache of all image components that have been auto-applied.
|
||||
// This map allows to avoid applying them too many times upon state changes in the cluster for example.
|
||||
ImageComponentsAutoApplied map[string]v1alpha2.ImageComponent
|
||||
}
|
||||
|
||||
func componentCanSyncFile(state State) bool {
|
||||
|
||||
@@ -0,0 +1,390 @@
|
||||
commands:
|
||||
- exec:
|
||||
commandLine: npm install
|
||||
component: runtime
|
||||
group:
|
||||
isDefault: true
|
||||
kind: build
|
||||
workingDir: ${PROJECT_SOURCE}
|
||||
id: build
|
||||
|
||||
- exec:
|
||||
commandLine: npm run start
|
||||
component: runtime
|
||||
group:
|
||||
isDefault: true
|
||||
kind: run
|
||||
workingDir: ${PROJECT_SOURCE}
|
||||
id: start-app
|
||||
- exec:
|
||||
commandLine: npm run debug
|
||||
component: runtime
|
||||
group:
|
||||
isDefault: true
|
||||
kind: debug
|
||||
workingDir: ${PROJECT_SOURCE}
|
||||
id: start-app-debug
|
||||
|
||||
- apply:
|
||||
component: autobuild-true-and-referenced
|
||||
id: image-autobuild-true-and-referenced
|
||||
- apply:
|
||||
component: autobuild-false-and-referenced
|
||||
id: image-autobuild-false-and-referenced
|
||||
- apply:
|
||||
component: autobuild-not-set-and-referenced
|
||||
id: image-autobuild-not-set-and-referenced
|
||||
|
||||
- composite:
|
||||
commands:
|
||||
- image-autobuild-true-and-referenced
|
||||
- image-autobuild-false-and-referenced
|
||||
- image-autobuild-not-set-and-referenced
|
||||
- apply-k8s-deploybydefault-true-and-referenced
|
||||
- apply-ocp-deploybydefault-true-and-referenced
|
||||
- apply-k8s-deploybydefault-false-and-referenced
|
||||
- apply-ocp-deploybydefault-false-and-referenced
|
||||
- apply-k8s-deploybydefault-not-set-and-referenced
|
||||
- apply-ocp-deploybydefault-not-set-and-referenced
|
||||
- start-app
|
||||
group:
|
||||
isDefault: false
|
||||
kind: run
|
||||
id: run-with-referenced-components
|
||||
- composite:
|
||||
commands:
|
||||
- image-autobuild-true-and-referenced
|
||||
- image-autobuild-false-and-referenced
|
||||
- image-autobuild-not-set-and-referenced
|
||||
- apply-k8s-deploybydefault-true-and-referenced
|
||||
- apply-ocp-deploybydefault-true-and-referenced
|
||||
- apply-k8s-deploybydefault-false-and-referenced
|
||||
- apply-ocp-deploybydefault-false-and-referenced
|
||||
- apply-k8s-deploybydefault-not-set-and-referenced
|
||||
- apply-ocp-deploybydefault-not-set-and-referenced
|
||||
- start-app-debug
|
||||
group:
|
||||
isDefault: false
|
||||
kind: debug
|
||||
id: debug-with-referenced-components
|
||||
|
||||
- composite:
|
||||
group:
|
||||
isDefault: true
|
||||
kind: deploy
|
||||
id: deploy
|
||||
|
||||
- apply:
|
||||
component: k8s-deploybydefault-true-and-referenced
|
||||
id: apply-k8s-deploybydefault-true-and-referenced
|
||||
- apply:
|
||||
component: ocp-deploybydefault-true-and-referenced
|
||||
id: apply-ocp-deploybydefault-true-and-referenced
|
||||
- apply:
|
||||
component: k8s-deploybydefault-false-and-referenced
|
||||
id: apply-k8s-deploybydefault-false-and-referenced
|
||||
- apply:
|
||||
component: ocp-deploybydefault-false-and-referenced
|
||||
id: apply-ocp-deploybydefault-false-and-referenced
|
||||
- apply:
|
||||
component: k8s-deploybydefault-not-set-and-referenced
|
||||
id: apply-k8s-deploybydefault-not-set-and-referenced
|
||||
- apply:
|
||||
component: ocp-deploybydefault-not-set-and-referenced
|
||||
id: apply-ocp-deploybydefault-not-set-and-referenced
|
||||
|
||||
- composite:
|
||||
commands:
|
||||
- image-autobuild-true-and-referenced
|
||||
- image-autobuild-false-and-referenced
|
||||
- image-autobuild-not-set-and-referenced
|
||||
- apply-k8s-deploybydefault-true-and-referenced
|
||||
- apply-ocp-deploybydefault-true-and-referenced
|
||||
- apply-k8s-deploybydefault-false-and-referenced
|
||||
- apply-ocp-deploybydefault-false-and-referenced
|
||||
- apply-k8s-deploybydefault-not-set-and-referenced
|
||||
- apply-ocp-deploybydefault-not-set-and-referenced
|
||||
group:
|
||||
isDefault: false
|
||||
kind: deploy
|
||||
id: deploy-with-referenced-components
|
||||
|
||||
|
||||
components:
|
||||
- container:
|
||||
command: [ 'tail' ]
|
||||
args: [ '-f', '/dev/null' ]
|
||||
endpoints:
|
||||
- name: "3000-tcp"
|
||||
targetPort: 3000
|
||||
- name: "debug"
|
||||
targetPort: 5858
|
||||
exposure: none
|
||||
env:
|
||||
- name: DEBUG_PORT_PROJECT
|
||||
value: "5858"
|
||||
image: registry.access.redhat.com/ubi8/nodejs-12:1-36
|
||||
memoryLimit: 1024Mi
|
||||
mountSources: true
|
||||
name: runtime
|
||||
|
||||
#######################
|
||||
# Kubernetes components
|
||||
#######################
|
||||
|
||||
# deployByDefault true, referenced in apply command => automatically created on startup
|
||||
- kubernetes:
|
||||
deployByDefault: true
|
||||
inlined: |
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: k8s-deploybydefault-true-and-referenced
|
||||
spec:
|
||||
containers:
|
||||
- name: main
|
||||
image: busybox
|
||||
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
|
||||
name: k8s-deploybydefault-true-and-referenced
|
||||
|
||||
# deployByDefault true, not referenced in apply command => automatically created on startup
|
||||
- kubernetes:
|
||||
deployByDefault: true
|
||||
inlined: |
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: k8s-deploybydefault-true-and-not-referenced
|
||||
spec:
|
||||
containers:
|
||||
- name: main
|
||||
image: busybox
|
||||
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
|
||||
name: k8s-deploybydefault-true-and-not-referenced
|
||||
|
||||
# deployByDefault false, referenced in apply command => created when apply command is invoked
|
||||
- kubernetes:
|
||||
deployByDefault: false
|
||||
inlined: |
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: k8s-deploybydefault-false-and-referenced
|
||||
spec:
|
||||
containers:
|
||||
- name: main
|
||||
image: busybox
|
||||
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
|
||||
name: k8s-deploybydefault-false-and-referenced
|
||||
|
||||
# deployByDefault false, not referenced in apply command => never started ???
|
||||
- kubernetes:
|
||||
deployByDefault: false
|
||||
inlined: |
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: k8s-deploybydefault-false-and-not-referenced
|
||||
spec:
|
||||
containers:
|
||||
- name: main
|
||||
image: busybox
|
||||
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
|
||||
name: k8s-deploybydefault-false-and-not-referenced
|
||||
|
||||
# deployByDefault not set, referenced in apply command => created when apply command is invoked
|
||||
- kubernetes:
|
||||
inlined: |
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: k8s-deploybydefault-not-set-and-referenced
|
||||
spec:
|
||||
containers:
|
||||
- name: main
|
||||
image: busybox
|
||||
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
|
||||
name: k8s-deploybydefault-not-set-and-referenced
|
||||
|
||||
# deployByDefault not set, not referenced in apply command => automatically created on startup
|
||||
- kubernetes:
|
||||
inlined: |
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: k8s-deploybydefault-not-set-and-not-referenced
|
||||
spec:
|
||||
containers:
|
||||
- name: main
|
||||
image: busybox
|
||||
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
|
||||
name: k8s-deploybydefault-not-set-and-not-referenced
|
||||
|
||||
#######################
|
||||
# OpenShift components
|
||||
#######################
|
||||
|
||||
# deployByDefault true, referenced in apply command => automatically created on startup
|
||||
- openshift:
|
||||
deployByDefault: true
|
||||
inlined: |
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: ocp-deploybydefault-true-and-referenced
|
||||
spec:
|
||||
containers:
|
||||
- name: main
|
||||
image: busybox
|
||||
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
|
||||
name: ocp-deploybydefault-true-and-referenced
|
||||
|
||||
# deployByDefault true, not referenced in apply command => automatically created on startup
|
||||
- openshift:
|
||||
deployByDefault: true
|
||||
inlined: |
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: ocp-deploybydefault-true-and-not-referenced
|
||||
spec:
|
||||
containers:
|
||||
- name: main
|
||||
image: busybox
|
||||
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
|
||||
name: ocp-deploybydefault-true-and-not-referenced
|
||||
|
||||
# deployByDefault false, referenced in apply command => created when apply command is invoked
|
||||
- openshift:
|
||||
deployByDefault: false
|
||||
inlined: |
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: ocp-deploybydefault-false-and-referenced
|
||||
spec:
|
||||
containers:
|
||||
- name: main
|
||||
image: busybox
|
||||
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
|
||||
name: ocp-deploybydefault-false-and-referenced
|
||||
|
||||
# deployByDefault false, not referenced in apply command => never started ???
|
||||
- openshift:
|
||||
deployByDefault: false
|
||||
inlined: |
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: ocp-deploybydefault-false-and-not-referenced
|
||||
spec:
|
||||
containers:
|
||||
- name: main
|
||||
image: busybox
|
||||
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
|
||||
name: ocp-deploybydefault-false-and-not-referenced
|
||||
|
||||
# deployByDefault not set, referenced in apply command => created when apply command is invoked
|
||||
- openshift:
|
||||
inlined: |
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: ocp-deploybydefault-not-set-and-referenced
|
||||
spec:
|
||||
containers:
|
||||
- name: main
|
||||
image: busybox
|
||||
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
|
||||
name: ocp-deploybydefault-not-set-and-referenced
|
||||
|
||||
# deployByDefault not set, not referenced in apply command => automatically created on startup
|
||||
- openshift:
|
||||
inlined: |
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: ocp-deploybydefault-not-set-and-not-referenced
|
||||
spec:
|
||||
containers:
|
||||
- name: main
|
||||
image: busybox
|
||||
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
|
||||
name: ocp-deploybydefault-not-set-and-not-referenced
|
||||
|
||||
#######################
|
||||
# Image components
|
||||
#######################
|
||||
|
||||
# autoBuild true, referenced in apply command => automatically created on startup
|
||||
- image:
|
||||
autoBuild: true
|
||||
dockerfile:
|
||||
buildContext: .
|
||||
uri: Dockerfile
|
||||
imageName: "{{ CONTAINER_IMAGE_REPO }}:autobuild-true-and-referenced"
|
||||
name: autobuild-true-and-referenced
|
||||
|
||||
# autoBuild true, not referenced in apply command => automatically created on startup
|
||||
- image:
|
||||
autoBuild: true
|
||||
dockerfile:
|
||||
buildContext: .
|
||||
uri: Dockerfile
|
||||
imageName: "{{ CONTAINER_IMAGE_REPO }}:autobuild-true-and-not-referenced"
|
||||
name: autobuild-true-and-not-referenced
|
||||
|
||||
# autoBuild false, referenced in apply command => created when apply command is invoked
|
||||
- image:
|
||||
autoBuild: false
|
||||
dockerfile:
|
||||
buildContext: .
|
||||
uri: Dockerfile
|
||||
imageName: "{{ CONTAINER_IMAGE_REPO }}:autobuild-false-and-referenced"
|
||||
name: autobuild-false-and-referenced
|
||||
|
||||
# autoBuild false, not referenced in apply command => never started ???
|
||||
- image:
|
||||
autoBuild: false
|
||||
dockerfile:
|
||||
buildContext: .
|
||||
uri: Dockerfile
|
||||
imageName: "{{ CONTAINER_IMAGE_REPO }}:autobuild-false-and-not-referenced"
|
||||
name: autobuild-false-and-not-referenced
|
||||
|
||||
# autoBuild not set, referenced in apply command => created when apply command is invoked
|
||||
- image:
|
||||
dockerfile:
|
||||
buildContext: .
|
||||
uri: Dockerfile
|
||||
imageName: "{{ CONTAINER_IMAGE_REPO }}:autobuild-not-set-and-referenced"
|
||||
name: autobuild-not-set-and-referenced
|
||||
|
||||
# autoBuild not set, not referenced in apply command => automatically created on startup
|
||||
- image:
|
||||
dockerfile:
|
||||
buildContext: .
|
||||
uri: Dockerfile
|
||||
imageName: "{{ CONTAINER_IMAGE_REPO }}:autobuild-not-set-and-not-referenced"
|
||||
name: autobuild-not-set-and-not-referenced
|
||||
|
||||
metadata:
|
||||
description: Stack with Node.js 14
|
||||
displayName: Node.js Runtime
|
||||
icon: https://nodejs.org/static/images/logos/nodejs-new-pantone-black.svg
|
||||
language: javascript
|
||||
name: my-node-app
|
||||
projectType: nodejs
|
||||
tags:
|
||||
- NodeJS
|
||||
- Express
|
||||
- ubi8
|
||||
version: 1.0.0
|
||||
schemaVersion: 2.2.0
|
||||
starterProjects:
|
||||
- git:
|
||||
remotes:
|
||||
origin: https://github.com/odo-devfiles/nodejs-ex.git
|
||||
name: nodejs-starter
|
||||
variables:
|
||||
CONTAINER_IMAGE_REPO: localhost:5000/odo-dev/node
|
||||
@@ -18,14 +18,22 @@ commands:
|
||||
isDefault: true
|
||||
kind: build
|
||||
workingDir: $PROJECT_SOURCE
|
||||
- id: run
|
||||
- id: innerloop-pod-command
|
||||
apply:
|
||||
component: innerloop-pod
|
||||
- id: start
|
||||
exec:
|
||||
commandLine: npm start
|
||||
component: runtime
|
||||
group:
|
||||
isDefault: true
|
||||
kind: run
|
||||
workingDir: $PROJECT_SOURCE
|
||||
- id: run
|
||||
composite:
|
||||
commands:
|
||||
- innerloop-pod-command
|
||||
- start
|
||||
group:
|
||||
kind: run
|
||||
isDefault: true
|
||||
- id: build-image
|
||||
apply:
|
||||
component: prod-image
|
||||
@@ -111,6 +119,9 @@ components:
|
||||
port: 3000
|
||||
- name: innerloop-pod
|
||||
kubernetes:
|
||||
# This will be applied only if referenced by an apply command, in which case it will be applied when the apply command is invoked.
|
||||
# Not setting deployByDefault to false and not referencing this component will make it automatically created by both 'odo dev' and 'odo deploy'.
|
||||
deployByDefault: false
|
||||
inlined: |
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
|
||||
85
tests/helper/helper_devfile.go
Normal file
85
tests/helper/helper_devfile.go
Normal file
@@ -0,0 +1,85 @@
|
||||
package helper
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
|
||||
"github.com/devfile/library/v2/pkg/devfile/parser"
|
||||
parsercommon "github.com/devfile/library/v2/pkg/devfile/parser/data/v2/common"
|
||||
. "github.com/onsi/gomega"
|
||||
"k8s.io/utils/pointer"
|
||||
)
|
||||
|
||||
// DevfileUpdater is a helper type that can mutate a Devfile object.
|
||||
// It is intended to be used in conjunction with the UpdateDevfileContent function.
|
||||
type DevfileUpdater func(*parser.DevfileObj) error
|
||||
|
||||
// DevfileMetadataNameSetter sets the 'metadata.name' field into the given Devfile
|
||||
var DevfileMetadataNameSetter = func(name string) DevfileUpdater {
|
||||
return func(d *parser.DevfileObj) error {
|
||||
return d.SetMetadataName(name)
|
||||
}
|
||||
}
|
||||
|
||||
// DevfileMetadataNameRemover removes the 'metadata.name' field from the given Devfile
|
||||
var DevfileMetadataNameRemover = DevfileMetadataNameSetter("")
|
||||
|
||||
// DevfileCommandGroupUpdater updates the group definition of the specified command.
|
||||
// It returns an error if the command was not found in the Devfile, or if there are multiple commands with the same name and type.
|
||||
var DevfileCommandGroupUpdater = func(cmdName string, cmdType v1alpha2.CommandType, group *v1alpha2.CommandGroup) DevfileUpdater {
|
||||
return func(d *parser.DevfileObj) error {
|
||||
cmds, err := d.Data.GetCommands(parsercommon.DevfileOptions{
|
||||
CommandOptions: parsercommon.CommandOptions{
|
||||
CommandType: cmdType,
|
||||
},
|
||||
FilterByName: cmdName,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(cmds) != 1 {
|
||||
return fmt.Errorf("found %v command(s) with name %q", len(cmds), cmdName)
|
||||
}
|
||||
cmd := cmds[0]
|
||||
switch cmdType {
|
||||
case v1alpha2.ApplyCommandType:
|
||||
cmd.Apply.Group = group
|
||||
case v1alpha2.CompositeCommandType:
|
||||
cmd.Composite.Group = group
|
||||
case v1alpha2.CustomCommandType:
|
||||
cmd.Custom.Group = group
|
||||
case v1alpha2.ExecCommandType:
|
||||
cmd.Exec.Group = group
|
||||
default:
|
||||
return fmt.Errorf("command type not handled: %q", cmdType)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// UpdateDevfileContent parses the Devfile at the given path, then updates its content using the given handlers, and writes the updated Devfile to the given path.
|
||||
//
|
||||
// The handlers are invoked in the order they are provided.
|
||||
//
|
||||
// No operation is performed if no handler function is specified.
|
||||
//
|
||||
// See DevfileMetadataNameRemover for an example of handler function that can operate on the Devfile content.
|
||||
func UpdateDevfileContent(path string, handlers []DevfileUpdater) {
|
||||
if len(handlers) == 0 {
|
||||
//Nothing to do => skip
|
||||
return
|
||||
}
|
||||
|
||||
d, err := parser.ParseDevfile(parser.ParserArgs{
|
||||
Path: path,
|
||||
FlattenedDevfile: pointer.Bool(false),
|
||||
SetBooleanDefaults: pointer.Bool(false),
|
||||
})
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
for _, h := range handlers {
|
||||
err = h(&d)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
}
|
||||
err = d.WriteYamlDevfile()
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
}
|
||||
@@ -8,10 +8,7 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/devfile/library/v2/pkg/devfile/parser"
|
||||
dfutil "github.com/devfile/library/v2/pkg/util"
|
||||
"k8s.io/utils/pointer"
|
||||
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
@@ -311,40 +308,3 @@ func AppendToFile(filepath string, s string) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DevfileUpdater is a helper type that can mutate a Devfile object.
|
||||
// It is intended to be used in conjunction with the UpdateDevfileContent function.
|
||||
type DevfileUpdater func(*parser.DevfileObj) error
|
||||
|
||||
// DevfileMetadataNameSetter sets the 'metadata.name' field into the given Devfile
|
||||
var DevfileMetadataNameSetter = func(name string) DevfileUpdater {
|
||||
return func(d *parser.DevfileObj) error {
|
||||
return d.SetMetadataName(name)
|
||||
}
|
||||
}
|
||||
|
||||
// DevfileMetadataNameRemover removes the 'metadata.name' field from the given Devfile
|
||||
var DevfileMetadataNameRemover = DevfileMetadataNameSetter("")
|
||||
|
||||
// UpdateDevfileContent parses the Devfile at the given path, then updates its content using the given handlers, and writes the updated Devfile to the given path.
|
||||
//
|
||||
// The handlers are invoked in the order they are provided.
|
||||
//
|
||||
// No operation is performed if no handler function is specified.
|
||||
//
|
||||
// See DevfileMetadataNameRemover for an example of handler function that can operate on the Devfile content.
|
||||
func UpdateDevfileContent(path string, handlers []DevfileUpdater) {
|
||||
if len(handlers) == 0 {
|
||||
//Nothing to do => skip
|
||||
return
|
||||
}
|
||||
|
||||
d, err := parser.ParseDevfile(parser.ParserArgs{Path: path, FlattenedDevfile: pointer.Bool(false)})
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
for _, h := range handlers {
|
||||
err = h(&d)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
}
|
||||
err = d.WriteYamlDevfile()
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
|
||||
"k8s.io/utils/pointer"
|
||||
|
||||
"github.com/redhat-developer/odo/pkg/labels"
|
||||
@@ -408,4 +409,327 @@ var _ = Describe("odo dev debug command tests", func() {
|
||||
})
|
||||
}))
|
||||
}
|
||||
|
||||
// More details on https://github.com/devfile/api/issues/852#issuecomment-1211928487
|
||||
for _, podman := range []bool{false, true} {
|
||||
podman := podman
|
||||
When("starting with Devfile with autoBuild or deployByDefault components",
|
||||
helper.LabelPodmanIf(podman, func() {
|
||||
BeforeEach(func() {
|
||||
helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), commonVar.Context)
|
||||
helper.CopyExample(filepath.Join("source", "nodejs", "Dockerfile"), filepath.Join(commonVar.Context, "Dockerfile"))
|
||||
helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-autobuild-deploybydefault.yaml"),
|
||||
filepath.Join(commonVar.Context, "devfile.yaml"),
|
||||
helper.DevfileMetadataNameSetter(cmpName))
|
||||
})
|
||||
|
||||
When("running odo dev with some components not referenced in the Devfile", func() {
|
||||
var devSession helper.DevSession
|
||||
var stdout, stderr string
|
||||
|
||||
BeforeEach(func() {
|
||||
var bOut, bErr []byte
|
||||
var err error
|
||||
var envvars []string
|
||||
if podman {
|
||||
envvars = append(envvars, "ODO_PUSH_IMAGES=false")
|
||||
} else {
|
||||
envvars = append(envvars, "PODMAN_CMD=echo")
|
||||
}
|
||||
args := []string{"--debug"}
|
||||
if podman {
|
||||
args = append(args, "--forward-localhost")
|
||||
}
|
||||
devSession, bOut, bErr, _, err = helper.StartDevMode(helper.DevSessionOpts{
|
||||
CmdlineArgs: args,
|
||||
EnvVars: envvars,
|
||||
RunOnPodman: podman,
|
||||
})
|
||||
Expect(err).ShouldNot(HaveOccurred())
|
||||
stdout = string(bOut)
|
||||
stderr = string(bErr)
|
||||
})
|
||||
|
||||
AfterEach(func() {
|
||||
devSession.Stop()
|
||||
if podman {
|
||||
devSession.WaitEnd()
|
||||
}
|
||||
})
|
||||
|
||||
It("should create the appropriate resources", func() {
|
||||
if podman {
|
||||
By("skipping Kubernetes/OpenShift components that would have been created automatically", func() {
|
||||
linesErr, _ := helper.ExtractLines(stderr)
|
||||
var skipped []string
|
||||
for _, l := range linesErr {
|
||||
if strings.Contains(l, "Kubernetes components are not supported on Podman. Skipping:") {
|
||||
sl := strings.SplitN(l, ": ", 2)
|
||||
if len(sl) < 2 {
|
||||
break
|
||||
}
|
||||
for _, s := range strings.Split(sl[1], ", ") {
|
||||
skipped = append(skipped, strings.TrimSuffix(s, "."))
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
expected := []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-true-and-not-referenced",
|
||||
"k8s-deploybydefault-not-set-and-not-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-true-and-not-referenced",
|
||||
"ocp-deploybydefault-not-set-and-not-referenced",
|
||||
}
|
||||
Expect(skipped).Should(ConsistOf(expected))
|
||||
})
|
||||
By("not handling Kubernetes/OpenShift components with deployByDefault=false", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-false-and-referenced",
|
||||
"k8s-deploybydefault-false-and-not-referenced",
|
||||
"ocp-deploybydefault-false-and-referenced",
|
||||
"ocp-deploybydefault-false-and-not-referenced",
|
||||
} {
|
||||
Expect(stderr).ShouldNot(ContainSubstring("Skipping: %s", l))
|
||||
}
|
||||
})
|
||||
By("not handling referenced Kubernetes/OpenShift components with deployByDefault unset", func() {
|
||||
Expect(stderr).ShouldNot(ContainSubstring("Skipping: k8s-deploybydefault-not-set-and-referenced"))
|
||||
})
|
||||
} else {
|
||||
By("automatically applying Kubernetes/OpenShift components with deployByDefault=true", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-true-and-not-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-true-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
By("automatically applying non-referenced Kubernetes/OpenShift components with deployByDefault not set", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-not-set-and-not-referenced",
|
||||
"ocp-deploybydefault-not-set-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
By("not applying Kubernetes/OpenShift components with deployByDefault=false", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-false-and-referenced",
|
||||
"k8s-deploybydefault-false-and-not-referenced",
|
||||
"ocp-deploybydefault-false-and-referenced",
|
||||
"ocp-deploybydefault-false-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
By("not applying referenced Kubernetes/OpenShift components with deployByDefault unset", func() {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("Creating resource Pod/k8s-deploybydefault-not-set-and-referenced"))
|
||||
})
|
||||
}
|
||||
|
||||
imageMessagePrefix := "Building & Pushing Image"
|
||||
if podman {
|
||||
imageMessagePrefix = "Building Image"
|
||||
}
|
||||
|
||||
By("automatically applying image components with autoBuild=true", func() {
|
||||
for _, tag := range []string{
|
||||
"autobuild-true-and-referenced",
|
||||
"autobuild-true-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("%s: localhost:5000/odo-dev/node:%s", imageMessagePrefix, tag))
|
||||
}
|
||||
})
|
||||
By("automatically applying non-referenced Image components with autoBuild not set", func() {
|
||||
Expect(stdout).Should(ContainSubstring("%s: localhost:5000/odo-dev/node:autobuild-not-set-and-not-referenced", imageMessagePrefix))
|
||||
})
|
||||
By("not applying image components with autoBuild=false", func() {
|
||||
for _, tag := range []string{
|
||||
"autobuild-false-and-referenced",
|
||||
"autobuild-false-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("localhost:5000/odo-dev/node:%s", tag))
|
||||
}
|
||||
})
|
||||
By("not applying referenced Image components with deployByDefault unset", func() {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("localhost:5000/odo-dev/node:autobuild-not-set-and-referenced"))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
When("running odo dev with some components referenced in the Devfile", func() {
|
||||
var devSession helper.DevSession
|
||||
var stdout, stderr string
|
||||
|
||||
BeforeEach(func() {
|
||||
var bOut, bErr []byte
|
||||
var err error
|
||||
//TODO (rm3l): we do not support passing a custom debug command yet. That's why we are manually updating the Devfile to change the default debug command.
|
||||
helper.UpdateDevfileContent(filepath.Join(commonVar.Context, "devfile.yaml"), []helper.DevfileUpdater{
|
||||
helper.DevfileCommandGroupUpdater("start-app-debug", v1alpha2.ExecCommandType, &v1alpha2.CommandGroup{
|
||||
Kind: v1alpha2.DebugCommandGroupKind,
|
||||
IsDefault: pointer.Bool(false),
|
||||
}),
|
||||
helper.DevfileCommandGroupUpdater("debug-with-referenced-components", v1alpha2.CompositeCommandType, &v1alpha2.CommandGroup{
|
||||
Kind: v1alpha2.DebugCommandGroupKind,
|
||||
IsDefault: pointer.Bool(true),
|
||||
}),
|
||||
})
|
||||
|
||||
var envvars []string
|
||||
if podman {
|
||||
envvars = append(envvars, "ODO_PUSH_IMAGES=false")
|
||||
} else {
|
||||
envvars = append(envvars, "PODMAN_CMD=echo")
|
||||
}
|
||||
args := []string{"--debug"}
|
||||
if podman {
|
||||
args = append(args, "--forward-localhost")
|
||||
}
|
||||
devSession, bOut, bErr, _, err = helper.StartDevMode(helper.DevSessionOpts{
|
||||
CmdlineArgs: args,
|
||||
EnvVars: envvars,
|
||||
RunOnPodman: podman,
|
||||
})
|
||||
Expect(err).ShouldNot(HaveOccurred())
|
||||
stdout = string(bOut)
|
||||
stderr = string(bErr)
|
||||
})
|
||||
|
||||
AfterEach(func() {
|
||||
devSession.Stop()
|
||||
if podman {
|
||||
devSession.WaitEnd()
|
||||
}
|
||||
})
|
||||
|
||||
It("should create the appropriate resources", func() {
|
||||
if podman {
|
||||
By("skipping Kubernetes/OpenShift components that would have been created automatically", func() {
|
||||
linesErr, _ := helper.ExtractLines(stderr)
|
||||
var skipped []string
|
||||
for _, l := range linesErr {
|
||||
if strings.Contains(l, "Kubernetes components are not supported on Podman. Skipping:") {
|
||||
sl := strings.SplitN(l, ": ", 2)
|
||||
if len(sl) < 2 {
|
||||
break
|
||||
}
|
||||
for _, s := range strings.Split(sl[1], ", ") {
|
||||
skipped = append(skipped, strings.TrimSuffix(s, "."))
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
expected := []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-true-and-not-referenced",
|
||||
"k8s-deploybydefault-not-set-and-not-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-true-and-not-referenced",
|
||||
"ocp-deploybydefault-not-set-and-not-referenced",
|
||||
}
|
||||
Expect(skipped).Should(ConsistOf(expected))
|
||||
})
|
||||
|
||||
By("skipping referenced Kubernetes/OpenShift components", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-false-and-referenced",
|
||||
"k8s-deploybydefault-not-set-and-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-false-and-referenced",
|
||||
"ocp-deploybydefault-not-set-and-referenced",
|
||||
} {
|
||||
Expect(stderr).Should(ContainSubstring("Skipping: %s", l))
|
||||
}
|
||||
})
|
||||
|
||||
By("not handling non-referenced Kubernetes/OpenShift components with deployByDefault=false", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-false-and-not-referenced",
|
||||
"ocp-deploybydefault-false-and-not-referenced",
|
||||
} {
|
||||
Expect(stderr).ShouldNot(ContainSubstring("Skipping: %s", l))
|
||||
}
|
||||
})
|
||||
} else {
|
||||
By("applying referenced Kubernetes/OpenShift components", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-false-and-referenced",
|
||||
"k8s-deploybydefault-not-set-and-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-false-and-referenced",
|
||||
"ocp-deploybydefault-not-set-and-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
|
||||
By("automatically applying Kubernetes/OpenShift components with deployByDefault=true", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-true-and-not-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-true-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
By("automatically applying non-referenced Kubernetes/OpenShift components with deployByDefault not set", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-not-set-and-not-referenced",
|
||||
"ocp-deploybydefault-not-set-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
|
||||
By("not applying non-referenced Kubernetes/OpenShift components with deployByDefault=false", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-false-and-not-referenced",
|
||||
"ocp-deploybydefault-false-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
imageMessagePrefix := "Building & Pushing Image"
|
||||
if podman {
|
||||
imageMessagePrefix = "Building Image"
|
||||
}
|
||||
|
||||
By("applying referenced image components", func() {
|
||||
for _, tag := range []string{
|
||||
"autobuild-true-and-referenced",
|
||||
"autobuild-false-and-referenced",
|
||||
"autobuild-not-set-and-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("%s: localhost:5000/odo-dev/node:%s", imageMessagePrefix, tag))
|
||||
}
|
||||
})
|
||||
By("automatically applying image components with autoBuild=true", func() {
|
||||
for _, tag := range []string{
|
||||
"autobuild-true-and-referenced",
|
||||
"autobuild-true-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("%s: localhost:5000/odo-dev/node:%s", imageMessagePrefix, tag))
|
||||
}
|
||||
})
|
||||
By("automatically applying non-referenced Image components with autoBuild not set", func() {
|
||||
Expect(stdout).Should(ContainSubstring("%s: localhost:5000/odo-dev/node:autobuild-not-set-and-not-referenced", imageMessagePrefix))
|
||||
})
|
||||
By("not applying non-referenced image components with autoBuild=false", func() {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("localhost:5000/odo-dev/node:autobuild-false-and-not-referenced"))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
}))
|
||||
}
|
||||
})
|
||||
|
||||
@@ -3593,4 +3593,305 @@ CMD ["npm", "start"]
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
for _, podman := range []bool{false, true} {
|
||||
podman := podman
|
||||
// More details on https://github.com/devfile/api/issues/852#issuecomment-1211928487
|
||||
When("starting with Devfile with autoBuild or deployByDefault components", helper.LabelPodmanIf(podman, func() {
|
||||
BeforeEach(func() {
|
||||
helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), commonVar.Context)
|
||||
helper.CopyExample(filepath.Join("source", "nodejs", "Dockerfile"), filepath.Join(commonVar.Context, "Dockerfile"))
|
||||
helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-autobuild-deploybydefault.yaml"),
|
||||
filepath.Join(commonVar.Context, "devfile.yaml"),
|
||||
helper.DevfileMetadataNameSetter(cmpName))
|
||||
})
|
||||
|
||||
When("running odo dev with some components not referenced in the Devfile", func() {
|
||||
var devSession helper.DevSession
|
||||
var stdout, stderr string
|
||||
|
||||
BeforeEach(func() {
|
||||
var bOut, bErr []byte
|
||||
var err error
|
||||
var envvars []string
|
||||
if podman {
|
||||
envvars = append(envvars, "ODO_PUSH_IMAGES=false")
|
||||
} else {
|
||||
envvars = append(envvars, "PODMAN_CMD=echo")
|
||||
}
|
||||
devSession, bOut, bErr, _, err = helper.StartDevMode(helper.DevSessionOpts{
|
||||
RunOnPodman: podman,
|
||||
EnvVars: envvars,
|
||||
})
|
||||
Expect(err).ShouldNot(HaveOccurred())
|
||||
stdout = string(bOut)
|
||||
stderr = string(bErr)
|
||||
})
|
||||
|
||||
AfterEach(func() {
|
||||
devSession.Stop()
|
||||
if podman {
|
||||
devSession.WaitEnd()
|
||||
}
|
||||
})
|
||||
|
||||
It("should create the appropriate resources", func() {
|
||||
if podman {
|
||||
By("skipping Kubernetes/OpenShift components that would have been created automatically", func() {
|
||||
linesErr, _ := helper.ExtractLines(stderr)
|
||||
var skipped []string
|
||||
for _, l := range linesErr {
|
||||
if strings.Contains(l, "Kubernetes components are not supported on Podman. Skipping:") {
|
||||
sl := strings.SplitN(l, ": ", 2)
|
||||
if len(sl) < 2 {
|
||||
break
|
||||
}
|
||||
for _, s := range strings.Split(sl[1], ", ") {
|
||||
skipped = append(skipped, strings.TrimSuffix(s, "."))
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
expected := []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-true-and-not-referenced",
|
||||
"k8s-deploybydefault-not-set-and-not-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-true-and-not-referenced",
|
||||
"ocp-deploybydefault-not-set-and-not-referenced",
|
||||
}
|
||||
Expect(skipped).Should(ConsistOf(expected))
|
||||
})
|
||||
By("not handling Kubernetes/OpenShift components with deployByDefault=false", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-false-and-referenced",
|
||||
"k8s-deploybydefault-false-and-not-referenced",
|
||||
"ocp-deploybydefault-false-and-referenced",
|
||||
"ocp-deploybydefault-false-and-not-referenced",
|
||||
} {
|
||||
Expect(stderr).ShouldNot(ContainSubstring("Skipping: %s", l))
|
||||
}
|
||||
})
|
||||
By("not handling referenced Kubernetes/OpenShift components with deployByDefault unset", func() {
|
||||
Expect(stderr).ShouldNot(ContainSubstring("Skipping: k8s-deploybydefault-not-set-and-referenced"))
|
||||
})
|
||||
} else {
|
||||
By("automatically applying Kubernetes/OpenShift components with deployByDefault=true", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-true-and-not-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-true-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
By("automatically applying non-referenced Kubernetes/OpenShift components with deployByDefault not set", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-not-set-and-not-referenced",
|
||||
"ocp-deploybydefault-not-set-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
By("not applying Kubernetes/OpenShift components with deployByDefault=false", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-false-and-referenced",
|
||||
"k8s-deploybydefault-false-and-not-referenced",
|
||||
"ocp-deploybydefault-false-and-referenced",
|
||||
"ocp-deploybydefault-false-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
By("not applying referenced Kubernetes/OpenShift components with deployByDefault unset", func() {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("Creating resource Pod/k8s-deploybydefault-not-set-and-referenced"))
|
||||
})
|
||||
}
|
||||
|
||||
imageMessagePrefix := "Building & Pushing Image"
|
||||
if podman {
|
||||
imageMessagePrefix = "Building Image"
|
||||
}
|
||||
|
||||
By("automatically applying image components with autoBuild=true", func() {
|
||||
for _, tag := range []string{
|
||||
"autobuild-true-and-referenced",
|
||||
"autobuild-true-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("%s: localhost:5000/odo-dev/node:%s", imageMessagePrefix, tag))
|
||||
}
|
||||
})
|
||||
By("automatically applying non-referenced Image components with autoBuild not set", func() {
|
||||
Expect(stdout).Should(ContainSubstring("%s: localhost:5000/odo-dev/node:autobuild-not-set-and-not-referenced", imageMessagePrefix))
|
||||
})
|
||||
By("not applying image components with autoBuild=false", func() {
|
||||
for _, tag := range []string{
|
||||
"autobuild-false-and-referenced",
|
||||
"autobuild-false-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("localhost:5000/odo-dev/node:%s", tag))
|
||||
}
|
||||
})
|
||||
By("not applying referenced Image components with deployByDefault unset", func() {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("localhost:5000/odo-dev/node:autobuild-not-set-and-referenced"))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
When("running odo dev with some components referenced in the Devfile", func() {
|
||||
var devSession helper.DevSession
|
||||
var stdout, stderr string
|
||||
|
||||
BeforeEach(func() {
|
||||
var bOut, bErr []byte
|
||||
var err error
|
||||
var envvars []string
|
||||
if podman {
|
||||
envvars = append(envvars, "ODO_PUSH_IMAGES=false")
|
||||
} else {
|
||||
envvars = append(envvars, "PODMAN_CMD=echo")
|
||||
}
|
||||
devSession, bOut, bErr, _, err = helper.StartDevMode(helper.DevSessionOpts{
|
||||
CmdlineArgs: []string{"--run-command", "run-with-referenced-components"},
|
||||
EnvVars: envvars,
|
||||
RunOnPodman: podman,
|
||||
})
|
||||
Expect(err).ShouldNot(HaveOccurred())
|
||||
stdout = string(bOut)
|
||||
stderr = string(bErr)
|
||||
})
|
||||
|
||||
AfterEach(func() {
|
||||
devSession.Stop()
|
||||
if podman {
|
||||
devSession.WaitEnd()
|
||||
}
|
||||
})
|
||||
|
||||
It("should create the appropriate resources", func() {
|
||||
if podman {
|
||||
By("skipping Kubernetes/OpenShift components that would have been created automatically", func() {
|
||||
linesErr, _ := helper.ExtractLines(stderr)
|
||||
var skipped []string
|
||||
for _, l := range linesErr {
|
||||
if strings.Contains(l, "Kubernetes components are not supported on Podman. Skipping:") {
|
||||
sl := strings.SplitN(l, ": ", 2)
|
||||
if len(sl) < 2 {
|
||||
break
|
||||
}
|
||||
for _, s := range strings.Split(sl[1], ", ") {
|
||||
skipped = append(skipped, strings.TrimSuffix(s, "."))
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
expected := []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-true-and-not-referenced",
|
||||
"k8s-deploybydefault-not-set-and-not-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-true-and-not-referenced",
|
||||
"ocp-deploybydefault-not-set-and-not-referenced",
|
||||
}
|
||||
Expect(skipped).Should(ConsistOf(expected))
|
||||
})
|
||||
|
||||
By("skipping referenced Kubernetes/OpenShift components", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-false-and-referenced",
|
||||
"k8s-deploybydefault-not-set-and-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-false-and-referenced",
|
||||
"ocp-deploybydefault-not-set-and-referenced",
|
||||
} {
|
||||
Expect(stderr).Should(ContainSubstring("Skipping: %s", l))
|
||||
}
|
||||
})
|
||||
|
||||
By("not handling non-referenced Kubernetes/OpenShift components with deployByDefault=false", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-false-and-not-referenced",
|
||||
"ocp-deploybydefault-false-and-not-referenced",
|
||||
} {
|
||||
Expect(stderr).ShouldNot(ContainSubstring("Skipping: %s", l))
|
||||
}
|
||||
})
|
||||
} else {
|
||||
By("applying referenced Kubernetes/OpenShift components", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-false-and-referenced",
|
||||
"k8s-deploybydefault-not-set-and-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-false-and-referenced",
|
||||
"ocp-deploybydefault-not-set-and-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
|
||||
By("automatically applying Kubernetes/OpenShift components with deployByDefault=true", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-true-and-not-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-true-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
By("automatically applying non-referenced Kubernetes/OpenShift components with deployByDefault not set", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-not-set-and-not-referenced",
|
||||
"ocp-deploybydefault-not-set-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
|
||||
By("not applying non-referenced Kubernetes/OpenShift components with deployByDefault=false", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-false-and-not-referenced",
|
||||
"ocp-deploybydefault-false-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
imageMessagePrefix := "Building & Pushing Image"
|
||||
if podman {
|
||||
imageMessagePrefix = "Building Image"
|
||||
}
|
||||
|
||||
By("applying referenced image components", func() {
|
||||
for _, tag := range []string{
|
||||
"autobuild-true-and-referenced",
|
||||
"autobuild-false-and-referenced",
|
||||
"autobuild-not-set-and-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("%s: localhost:5000/odo-dev/node:%s", imageMessagePrefix, tag))
|
||||
}
|
||||
})
|
||||
By("automatically applying image components with autoBuild=true", func() {
|
||||
for _, tag := range []string{
|
||||
"autobuild-true-and-referenced",
|
||||
"autobuild-true-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("%s: localhost:5000/odo-dev/node:%s", imageMessagePrefix, tag))
|
||||
}
|
||||
})
|
||||
By("automatically applying non-referenced Image components with autoBuild not set", func() {
|
||||
Expect(stdout).Should(ContainSubstring("%s: localhost:5000/odo-dev/node:autobuild-not-set-and-not-referenced", imageMessagePrefix))
|
||||
})
|
||||
By("not applying non-referenced image components with autoBuild=false", func() {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("localhost:5000/odo-dev/node:autobuild-false-and-not-referenced"))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
}))
|
||||
}
|
||||
})
|
||||
|
||||
@@ -15,26 +15,27 @@ import (
|
||||
)
|
||||
|
||||
var _ = Describe("odo devfile build-images command tests", func() {
|
||||
|
||||
var commonVar helper.CommonVar
|
||||
var cmpName string
|
||||
|
||||
var _ = BeforeEach(func() {
|
||||
cmpName = helper.RandString(6)
|
||||
commonVar = helper.CommonBeforeEach()
|
||||
helper.Chdir(commonVar.Context)
|
||||
})
|
||||
|
||||
// This is run after every Spec (It)
|
||||
var _ = AfterEach(func() {
|
||||
helper.CommonAfterEach(commonVar)
|
||||
})
|
||||
|
||||
for _, label := range []string{
|
||||
helper.LabelNoCluster, helper.LabelUnauth,
|
||||
} {
|
||||
label := label
|
||||
var _ = Context("label "+label, Label(label), func() {
|
||||
|
||||
var commonVar helper.CommonVar
|
||||
var cmpName string
|
||||
|
||||
var _ = BeforeEach(func() {
|
||||
cmpName = helper.RandString(6)
|
||||
commonVar = helper.CommonBeforeEach()
|
||||
helper.Chdir(commonVar.Context)
|
||||
})
|
||||
|
||||
// This is run after every Spec (It)
|
||||
var _ = AfterEach(func() {
|
||||
helper.CommonAfterEach(commonVar)
|
||||
})
|
||||
|
||||
When("using a devfile.yaml containing an Image component", func() {
|
||||
|
||||
BeforeEach(func() {
|
||||
@@ -271,4 +272,56 @@ CMD ["npm", "start"]
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// More details on https://github.com/devfile/api/issues/852#issuecomment-1211928487
|
||||
When("starting with Devfile with autoBuild or deployByDefault components", func() {
|
||||
BeforeEach(func() {
|
||||
helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), commonVar.Context)
|
||||
helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-autobuild-deploybydefault.yaml"),
|
||||
filepath.Join(commonVar.Context, "devfile.yaml"),
|
||||
helper.DevfileMetadataNameSetter(cmpName))
|
||||
})
|
||||
|
||||
When("building images", func() {
|
||||
var stdout string
|
||||
|
||||
BeforeEach(func() {
|
||||
stdout = helper.Cmd("odo", "build-images").AddEnv("PODMAN_CMD=echo").ShouldPass().Out()
|
||||
})
|
||||
|
||||
It("should build all Image components regardless of autoBuild", func() {
|
||||
for _, tag := range []string{
|
||||
"autobuild-true-and-referenced",
|
||||
"autobuild-true-and-not-referenced",
|
||||
"autobuild-false-and-referenced",
|
||||
"autobuild-false-and-not-referenced",
|
||||
"autobuild-not-set-and-referenced",
|
||||
"autobuild-not-set-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Building Image: localhost:5000/odo-dev/node:%s", tag))
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
When("building and pushing images", func() {
|
||||
var stdout string
|
||||
|
||||
BeforeEach(func() {
|
||||
stdout = helper.Cmd("odo", "build-images", "--push").AddEnv("PODMAN_CMD=echo").ShouldPass().Out()
|
||||
})
|
||||
|
||||
It("should build and push all Image components regardless of autoBuild", func() {
|
||||
for _, tag := range []string{
|
||||
"autobuild-true-and-referenced",
|
||||
"autobuild-true-and-not-referenced",
|
||||
"autobuild-false-and-referenced",
|
||||
"autobuild-false-and-not-referenced",
|
||||
"autobuild-not-set-and-referenced",
|
||||
"autobuild-not-set-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Building & Pushing Image: localhost:5000/odo-dev/node:%s", tag))
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -9,10 +9,14 @@ import (
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
|
||||
"github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
"github.com/onsi/gomega/gexec"
|
||||
"k8s.io/utils/pointer"
|
||||
|
||||
"github.com/redhat-developer/odo/pkg/labels"
|
||||
|
||||
segment "github.com/redhat-developer/odo/pkg/segment/context"
|
||||
"github.com/redhat-developer/odo/tests/helper"
|
||||
)
|
||||
@@ -650,4 +654,167 @@ CMD ["npm", "start"]
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
// More details on https://github.com/devfile/api/issues/852#issuecomment-1211928487
|
||||
When("starting with Devfile with autoBuild or deployByDefault components", func() {
|
||||
BeforeEach(func() {
|
||||
helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), commonVar.Context)
|
||||
helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-autobuild-deploybydefault.yaml"),
|
||||
filepath.Join(commonVar.Context, "devfile.yaml"),
|
||||
helper.DevfileMetadataNameSetter(cmpName))
|
||||
})
|
||||
|
||||
When("running odo deploy with some components not referenced in the Devfile", func() {
|
||||
var stdout string
|
||||
|
||||
BeforeEach(func() {
|
||||
stdout = helper.Cmd("odo", "deploy").AddEnv("PODMAN_CMD=echo").ShouldPass().Out()
|
||||
})
|
||||
|
||||
It("should create the appropriate resources", func() {
|
||||
By("automatically applying Kubernetes/OpenShift components with deployByDefault=true", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-true-and-not-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-true-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
By("automatically applying non-referenced Kubernetes/OpenShift components with deployByDefault not set", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-not-set-and-not-referenced",
|
||||
"ocp-deploybydefault-not-set-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
By("not applying Kubernetes/OpenShift components with deployByDefault=false", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-false-and-referenced",
|
||||
"k8s-deploybydefault-false-and-not-referenced",
|
||||
"ocp-deploybydefault-false-and-referenced",
|
||||
"ocp-deploybydefault-false-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
By("not applying referenced Kubernetes/OpenShift components with deployByDefault unset", func() {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("Creating resource Pod/k8s-deploybydefault-not-set-and-referenced"))
|
||||
})
|
||||
|
||||
By("automatically applying image components with autoBuild=true", func() {
|
||||
for _, tag := range []string{
|
||||
"autobuild-true-and-referenced",
|
||||
"autobuild-true-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Building & Pushing Image: localhost:5000/odo-dev/node:%s", tag))
|
||||
}
|
||||
})
|
||||
By("automatically applying non-referenced Image components with autoBuild not set", func() {
|
||||
Expect(stdout).Should(ContainSubstring("Building & Pushing Image: localhost:5000/odo-dev/node:autobuild-not-set-and-not-referenced"))
|
||||
})
|
||||
By("not applying image components with autoBuild=false", func() {
|
||||
for _, tag := range []string{
|
||||
"autobuild-false-and-referenced",
|
||||
"autobuild-false-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("localhost:5000/odo-dev/node:%s", tag))
|
||||
}
|
||||
})
|
||||
By("not applying referenced Image components with deployByDefault unset", func() {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("localhost:5000/odo-dev/node:autobuild-not-set-and-referenced"))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
When("running odo deploy with some components referenced in the Devfile", func() {
|
||||
var stdout string
|
||||
|
||||
BeforeEach(func() {
|
||||
//TODO (rm3l): we do not support passing a custom deploy command yet. That's why we are manually updating the Devfile to set the default deploy command.
|
||||
helper.UpdateDevfileContent(filepath.Join(commonVar.Context, "devfile.yaml"), []helper.DevfileUpdater{
|
||||
helper.DevfileCommandGroupUpdater("deploy", v1alpha2.CompositeCommandType, &v1alpha2.CommandGroup{
|
||||
Kind: v1alpha2.DeployCommandGroupKind,
|
||||
IsDefault: pointer.Bool(false),
|
||||
}),
|
||||
helper.DevfileCommandGroupUpdater("deploy-with-referenced-components", v1alpha2.CompositeCommandType, &v1alpha2.CommandGroup{
|
||||
Kind: v1alpha2.DeployCommandGroupKind,
|
||||
IsDefault: pointer.Bool(true),
|
||||
}),
|
||||
})
|
||||
|
||||
stdout = helper.Cmd("odo", "deploy").AddEnv("PODMAN_CMD=echo").ShouldPass().Out()
|
||||
})
|
||||
|
||||
It("should create the appropriate resources", func() {
|
||||
By("applying referenced Kubernetes/OpenShift components", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-false-and-referenced",
|
||||
"k8s-deploybydefault-not-set-and-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-false-and-referenced",
|
||||
"ocp-deploybydefault-not-set-and-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
|
||||
By("automatically applying Kubernetes/OpenShift components with deployByDefault=true", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-true-and-referenced",
|
||||
"k8s-deploybydefault-true-and-not-referenced",
|
||||
"ocp-deploybydefault-true-and-referenced",
|
||||
"ocp-deploybydefault-true-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
By("automatically applying non-referenced Kubernetes/OpenShift components with deployByDefault not set", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-not-set-and-not-referenced",
|
||||
"ocp-deploybydefault-not-set-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
|
||||
By("not applying non-referenced Kubernetes/OpenShift components with deployByDefault=false", func() {
|
||||
for _, l := range []string{
|
||||
"k8s-deploybydefault-false-and-not-referenced",
|
||||
"ocp-deploybydefault-false-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("Creating resource Pod/%s", l))
|
||||
}
|
||||
})
|
||||
|
||||
By("applying referenced image components", func() {
|
||||
for _, tag := range []string{
|
||||
"autobuild-true-and-referenced",
|
||||
"autobuild-false-and-referenced",
|
||||
"autobuild-not-set-and-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Building & Pushing Image: localhost:5000/odo-dev/node:%s", tag))
|
||||
}
|
||||
})
|
||||
By("automatically applying image components with autoBuild=true", func() {
|
||||
for _, tag := range []string{
|
||||
"autobuild-true-and-referenced",
|
||||
"autobuild-true-and-not-referenced",
|
||||
} {
|
||||
Expect(stdout).Should(ContainSubstring("Building & Pushing Image: localhost:5000/odo-dev/node:%s", tag))
|
||||
}
|
||||
})
|
||||
By("automatically applying non-referenced Image components with autoBuild not set", func() {
|
||||
Expect(stdout).Should(ContainSubstring("Building & Pushing Image: localhost:5000/odo-dev/node:autobuild-not-set-and-not-referenced"))
|
||||
})
|
||||
By("not applying non-referenced image components with autoBuild=false", func() {
|
||||
Expect(stdout).ShouldNot(ContainSubstring("localhost:5000/odo-dev/node:autobuild-false-and-not-referenced"))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
})
|
||||
})
|
||||
|
||||
13
vendor/github.com/devfile/library/v2/pkg/devfile/parser/parse.go
generated
vendored
13
vendor/github.com/devfile/library/v2/pkg/devfile/parser/parse.go
generated
vendored
@@ -108,6 +108,9 @@ type ParserArgs struct {
|
||||
ExternalVariables map[string]string
|
||||
// HTTPTimeout overrides the request and response timeout values for reading a parent devfile reference from the registry. If a negative value is specified, the default timeout will be used.
|
||||
HTTPTimeout *int
|
||||
// SetBooleanDefaults sets the boolean properties to their default values after a devfile been parsed.
|
||||
// The value is true by default. Clients can set this to false if they want to set the boolean properties themselves
|
||||
SetBooleanDefaults *bool
|
||||
}
|
||||
|
||||
// ParseDevfile func populates the devfile data, parses and validates the devfile integrity.
|
||||
@@ -144,9 +147,13 @@ func ParseDevfile(args ParserArgs) (d DevfileObj, err error) {
|
||||
return d, errors.Wrap(err, "failed to populateAndParseDevfile")
|
||||
}
|
||||
|
||||
//set defaults only if we are flattening parent and parsing succeeded
|
||||
if flattenedDevfile && err == nil {
|
||||
err = setDefaults(d)
|
||||
setBooleanDefaults := true
|
||||
if args.SetBooleanDefaults != nil {
|
||||
setBooleanDefaults = *args.SetBooleanDefaults
|
||||
}
|
||||
//set defaults only if parsing succeeded
|
||||
if err == nil && setBooleanDefaults {
|
||||
err := setDefaults(d)
|
||||
if err != nil {
|
||||
return d, errors.Wrap(err, "failed to setDefaults")
|
||||
}
|
||||
|
||||
22
vendor/modules.txt
vendored
22
vendor/modules.txt
vendored
@@ -146,8 +146,8 @@ github.com/devfile/api/v2/pkg/utils/overriding
|
||||
github.com/devfile/api/v2/pkg/utils/unions
|
||||
github.com/devfile/api/v2/pkg/validation
|
||||
github.com/devfile/api/v2/pkg/validation/variables
|
||||
# github.com/devfile/library/v2 v2.2.1-0.20230323124903-d36e409ff94f
|
||||
## explicit; go 1.15
|
||||
# github.com/devfile/library/v2 v2.2.1-0.20230330160000-c1b23d25e652
|
||||
## explicit; go 1.18
|
||||
github.com/devfile/library/v2/pkg/devfile
|
||||
github.com/devfile/library/v2/pkg/devfile/generator
|
||||
github.com/devfile/library/v2/pkg/devfile/parser
|
||||
@@ -428,8 +428,6 @@ github.com/hashicorp/go-multierror
|
||||
# github.com/hashicorp/go-version v1.4.0
|
||||
## explicit
|
||||
github.com/hashicorp/go-version
|
||||
# github.com/hashicorp/hcl v1.0.0
|
||||
## explicit
|
||||
# github.com/hinshun/vt10x v0.0.0-20220301184237-5011da428d02
|
||||
## explicit; go 1.14
|
||||
# github.com/imdario/mergo v0.3.13
|
||||
@@ -487,8 +485,6 @@ github.com/kubernetes-sigs/service-catalog/pkg/filter
|
||||
# github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de
|
||||
## explicit
|
||||
github.com/liggitt/tabwriter
|
||||
# github.com/magiconair/properties v1.8.5
|
||||
## explicit; go 1.13
|
||||
# github.com/mailru/easyjson v0.7.7
|
||||
## explicit; go 1.12
|
||||
github.com/mailru/easyjson/buffer
|
||||
@@ -512,8 +508,6 @@ github.com/mgutz/ansi
|
||||
# github.com/mitchellh/go-wordwrap v1.0.0
|
||||
## explicit
|
||||
github.com/mitchellh/go-wordwrap
|
||||
# github.com/mitchellh/mapstructure v1.4.1
|
||||
## explicit; go 1.14
|
||||
# github.com/mitchellh/reflectwalk v1.0.1
|
||||
## explicit
|
||||
github.com/mitchellh/reflectwalk
|
||||
@@ -680,8 +674,6 @@ github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientse
|
||||
# github.com/pborman/uuid v1.2.1
|
||||
## explicit
|
||||
github.com/pborman/uuid
|
||||
# github.com/pelletier/go-toml v1.9.4
|
||||
## explicit; go 1.12
|
||||
# github.com/peterbourgon/diskv v2.0.1+incompatible
|
||||
## explicit
|
||||
github.com/peterbourgon/diskv
|
||||
@@ -797,24 +789,16 @@ github.com/skeema/knownhosts
|
||||
## explicit; go 1.13
|
||||
github.com/spf13/afero
|
||||
github.com/spf13/afero/mem
|
||||
# github.com/spf13/cast v1.3.1
|
||||
## explicit
|
||||
# github.com/spf13/cobra v1.6.1
|
||||
## explicit; go 1.15
|
||||
github.com/spf13/cobra
|
||||
# github.com/spf13/jwalterweatherman v1.1.0
|
||||
## explicit
|
||||
# github.com/spf13/pflag v1.0.5
|
||||
## explicit; go 1.12
|
||||
github.com/spf13/pflag
|
||||
# github.com/spf13/viper v1.8.1
|
||||
## explicit; go 1.12
|
||||
# github.com/stretchr/testify v1.8.1
|
||||
## explicit; go 1.13
|
||||
github.com/stretchr/testify/assert
|
||||
github.com/stretchr/testify/require
|
||||
# github.com/subosito/gotenv v1.2.0
|
||||
## explicit
|
||||
# github.com/tidwall/gjson v1.14.4
|
||||
## explicit; go 1.12
|
||||
github.com/tidwall/gjson
|
||||
@@ -1014,8 +998,6 @@ gopkg.in/AlecAivazis/survey.v1/terminal
|
||||
# gopkg.in/inf.v0 v0.9.1
|
||||
## explicit
|
||||
gopkg.in/inf.v0
|
||||
# gopkg.in/ini.v1 v1.62.0
|
||||
## explicit
|
||||
# gopkg.in/segmentio/analytics-go.v3 v3.0.0-00010101000000-000000000000 => github.com/segmentio/analytics-go/v3 v3.2.1
|
||||
## explicit; go 1.17
|
||||
gopkg.in/segmentio/analytics-go.v3
|
||||
|
||||
Reference in New Issue
Block a user