* Add test highlighting the expectations
* Propagate errors and call os.Exit only in 'main' functions
See ExitInMain[1] and ExitInMain_ExitOnce[2] coding convention guidelines.
[1] https://github.com/redhat-developer/odo/wiki/Dev:-Coding-Conventions#exit-in-main
[2] https://github.com/redhat-developer/odo/wiki/Dev:-Coding-Conventions#exit-once
* Handle errors returned by Cleanuper#Cleanup
This makes sure the exit code of the command
is mapped onto any error returned by Cleanup
* Do not return an error when the watch loop in 'odo dev' is interrupted
* Test that the exit code of 'odo dev' matches the error returned by the cleanup logic
* Implement HTTP Server based on OpenAPI spec
Signed-off-by: Parthvi Vala <pvala@redhat.com>
Co-authored-by: Armel Soro <asoro@redhat.com>
Co-authored-by: Philippe Martin <phmartin@redhat.com>
* Starter server when odo dev starts
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Add --api-server and --api-server-port flags to start API Server; write the port to stat file; TODO: make this feature experimental
Signed-off-by: Parthvi Vala <pvala@redhat.com>
Co-authored-by: Armel Soro <asoro@redhat.com>
Co-authored-by: Philippe Martin <phmartin@redhat.com>
Signed-off-by: Parthvi Vala <pvala@redhat.com>
Make the flag experimental
Signed-off-by: Parthvi Vala <pvala@redhat.com>
Make apiserver and apiserverport flag local
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Use container image to run openapi-generator-tool instead of a local CLI
Co-authored-by: Armel Soro <asoro@redhat.com>
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Add integration test
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Use label podman
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Regenerate the api files with openapitool v6.6.0 and changes from review
Signed-off-by: Parthvi Vala <pvala@redhat.com>
Co-authored-by: Armel Soro <asoro@redhat.com>
---------
Signed-off-by: Parthvi Vala <pvala@redhat.com>
Co-authored-by: Armel Soro <asoro@redhat.com>
Co-authored-by: Philippe Martin <phmartin@redhat.com>
* Document the '--no-commands' flag
Co-authored-by: Philippe Martin <phmartin@redhat.com>
* Add integration tests highlighting the expectations
* Add '--no-commands' flag to the 'dev' sub-command
* Implement '--no-command' on Podman
* Implement '--no-command' on cluster
* Validate the '--no-commands' flag in the CLI
For example, it should not be possible to call it alongside '--build-command' or '--run-command',
because we won't be able to know what to do.
* Fix 'odo dev' tests when the run/debug does not exist
For consistency with how e.g., the build command works,
instead of erroring out, `odo dev` will
now simply log the error message and wait for new input.
* Check for command existence when we want to run them
As suggested in review, this makes it more adaptable.
As a consequence, if the default (or single) build/run command does not exist,
"odo dev" will not error out immediately; instead, it will behave a bit like
"odo dev --no-commands" (by starting, but printing a warning about the
missing command).
The difference here is that if a run command is added later on
during the dev session, "odo dev" will pick it up and run it,
but "odo dev --no-commands" will continue to purposely ignore it.
The existence of the optional default Build is already checked
by the 'libdevfile.Build' command. It does not error out if there is
no default (or single) Build command. It errors out only if the specified
'--build-command' does not exist in the Devfile.
Co-authored-by: Philippe Martin <phmartin@redhat.com>
* Check for application ports only if the Devfile has run or debug command and if there are ports to forward
This prevents:
i) displaying the "Waiting for the application to be ready" spinner for nothing,
if there are no ports to forward
ii) waiting until the timeout of 1m has expired if there was no run/debug command executed,
in which case, it is less unlikely that the application ports defined in the Devfile
will ever be reachable.
* Test "odo run" command against a Dev Session started with and without "--no-commands"
---------
Co-authored-by: Philippe Martin <phmartin@redhat.com>
* Change NewRunHandler params with Options
* Pass an options to RunHandler to show logs
* Hide spinner and std output since outputs are displayed
* Integration tests with failing command
* Fix outputs
* use raw terminal and local standard i/o streams
* Fix podman i/o
* Fix stdout/err
* Test if in/out are terminal
* command reference doc
* Add a run command
* Check command name passed as arg
* Check platform is available
* Add a Run method to the DevClient
* Run command on cluster
* Add test with run command on cluster
* Implement and test run on podman
* Enhance test to check that command has been executed in container
* Fix `odo help` test
* Refactor common code for podman/cluster
* Test Apply commands on Kubernetes/Images
* Test a msg is displayed when executing odo run without odo dev
* Review
* makes GetRunningPodFromSelector return only Running pods on Podman
* Check that the "Syncing files into the container" spinner is correctly displayed on both Podman and cluster
* Add missing "Syncing files into the container" spinner when running 'odo dev' on Podman
This indicates to the user that we are sync'ing the files,
which might be a potentially long operation.
This is to be consistent with the output when using 'odo dev' on cluster.
* Add integration test highlighting the expectations
* Record parameter (and value) set or unset using the 'odo preference set/unset' commands
By default, values are anonymized.
Only parameters explicitly declared list will be recorded verbatim.
This list is currently empty, but that might change later on.
* Mark all current preference parameters except ImageRegistry as clear-text
Co-authored-by: Philippe Martin <phmartin@redhat.com>
---------
Co-authored-by: Philippe Martin <phmartin@redhat.com>
* Add integration test highlighting the expectations
* Use the cancellable context derived from 'cmd.Context' where needed
* Introduce new 'wasTelemetryEnabled' telemetry property
This is recorded before any command is run.
And it will help determine if telemetry was
changed (e.g., from enabled to disabled),
so that we can record the event in this case.
* Send telemetry if it was enabled previously or if it is currently enabled
This is done by reading the actual telemetry setting
(either from env vars or the preferences file)
at the moment we want to record the telemetry event.
This covers cases where a command ('odo preference set ConsentTelemetry')
or an environment variable ('ODO_TRACKING_CONSENT')
updated the telemetry consent for example.
* Document current implementations of command handlers
* Add unit tests for execHAndler
* Refactor pkg/devfile/image to inject Backend as dependency
* Use same handler for kubedev/podmandev
* Fail after SelectBackend==nil only if backend is needed
* Move runHandler to dev/common
* Unit tests for runHandler
* Create a component.ExecuteTerminatingCommand
* ExecuteTerminatingCommand/ExecuteNonTerminatingCommand for Handler
* Fix calling other command types
* Consider parent group to determine if a command is terminating
* Replace component.execHandler by common.runHandler
* Remove execHandler
* Make runHandler and most of fields private and pass containersRunning to handler
* Pass containersRunning value
* deploy using common Handler
* Fix tests
* Use specific Dev/Deploy mode for Apply
* Fix cmdline for job
* Fix unit tests
* Pass appName and componentName with ctx to handler
* Move handler to pkg/component package
* Update doc
* Unit tests Deploy
* Unit tests Build
* Unit tests Run
* Unit tests PostStart
* Unit tests PreStop
* Update doc
* Fix Podman tests
* Fix hotReload on podman
* Change podman version timeout to 30s for tests
* Cleanup + fix doc
* Fix 'odo dev' tests by randomizing some missing component names
* Force setting a component name when copying example Devfiles
This way, we won't forget about this in the future.
* Add integration tests highlighting our expectations
* Bump Devfile library to latest commit
f041d79870
* Expose preference that allows users to globally configure an image registry
* Return the effective Devfile view by default from the initial context
This is supposed to be read-only, so that tools can rely on it
and to the operations they need to perform right away.
Raw Devfile objects can still be obtained upon request
if there is need to update them (for example via 'odo add/remove
binding' commands.
* Pass the image registry preference to the Devfile parser to build the effective view
* Fix 'odo init' integration tests
- The test spec was actually not doing what it was supposed to do
- Now 'odo init' returns a complete Devfile, where the parent is flattened,
because the goal of 'odo init' is to bootstrap a Devfile.
Previously, 'odo init' would not download the parent referenced,
making it hard to understand the resulting Devfile.
* Document how odo now handles relative image names as selectors
* fixup! Document how odo now handles relative image names as selectors
Co-authored-by: Philippe Martin <phmartin@redhat.com>
* Revert "Fix 'odo init' integration tests"
This reverts commit 78868b03fd.
Co-authored-by: Philippe Martin <phmartin@redhat.com>
* Do not make `odo init` return an effective Devfile as a result
This would change the behavior of `odo init`.
Furthermore, due to an issue [1] in the Devfile library,
it is not possible to parse some Devfiles with parents linked as GitHub URLs (like GitHub release artifacts).
[1] https://github.com/devfile/api/issues/1119
Co-authored-by: Philippe Martin <phmartin@redhat.com>
* fixup! Document how odo now handles relative image names as selectors
---------
Co-authored-by: Philippe Martin <phmartin@redhat.com>
* Add test highlighting the issue and setting the expectations
* Add a timeout of 1s to the 'podman version' command
This command is called at dependency injection time to initialize a (nil-able) Podman client,
even if users won't use Podman at all.
As discussed, this command is supposed to be
quite fast to return, hence this timeout of 1 second.
Initially, we were using cmd.Output to get the command output,
but as reported in [1], cmd.Output does not respect the context timeout.
This explains the workaround of reading from both stdout and stderr pipes,
*and* relying on cmd.Wait() to close those pipes properly when the program exits
(either as expected or when the timeout is reached).
[1] https://github.com/golang/go/issues/57129
Co-authored-by: Philippe Martin <phmartin@redhat.com>
* Log the errors returned at dependency injection time when the optional Kubernetes/Podman clients could not be initialized
This helps debug such potential issues instead of swallowing the errors.
* Make the timeout configurable via the 'PODMAN_CMD_INIT_TIMEOUT' env var
This will allow setting a different value for environments like
in GitHub where the Podman client would take slightly more time to return
(I guess because of we are running a lot of Podman commands in parallel?).
* Increase the timeout for Podman tests to an arbitrary value of 10s
Some tests did not pass because the Podman client did not
initialize in 1s; I guess because we are running a lot of Podman commands in parallel?
This should hopefully improve this situation.
* fixup! Add a timeout of 1s to the 'podman version' command
---------
Co-authored-by: Philippe Martin <phmartin@redhat.com>
* On cluster, run Build command again only if Build command itself is not hotReloadCapable
* On Podman, execute Build command only if itself is not hotReloadcapable
* Handle hotReloadCapable in handler
* Add integration tests
* Update doc
* review
* Allow passing extra build flags to Podman/Docker
This is supported via 2 new env vars:
- ODO_IMAGE_BUILD_ARGS: passed when building images via Podman/Docker
- ODO_CONTAINER_RUN_ARGS: passed when running odo dev on Podman
Those are comma-separated list of options
that can be passed to either Podman or Docker
(depending on the PODMAN_CMD env var).
* Refactor 'build-images' tests to make it easier to add additional tests
* Add integration tests for passing build extra args
* Add integration tests for passing global extra args to Podman
* Distinguish between global options passed to Podman and specific options for 'podman play kube'
Previously, we were handling 'ODO_CONTAINER_RUN_ARGS' as global options for Podman,
but this turns our not being that useful if we want to pass dedicated options to 'podman play kube'.
This commit introduces a new 'ODO_CONTAINER_BACKEND_GLOBAL_ARGS' env var,
which will be used as global options passed to every Podman command we execute.
This paves the way to isolating our Podman-related tests further
using the '--root' and '--runroot' global options.
* Use `ODO_IMAGE_BUILD_ARGS` in the Advanced Guides
* Use a semicolon as delimiter for extra flags
Doing so because some of the options of Podman/Docker can actually be either repeated or comma-separated.
* Custom address for port forwarding
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Add integration tests
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Use private variables for custom address and ports
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Update pkg/util/util.go
Co-authored-by: Armel Soro <armel@rm3l.org>
* Assign custom address to HostIP for podman
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Add validation for free port when --port-forward is provided in the Validate() method, add integration test for running parallel dev sessions on same platform, same port and different addresses
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Fix unit test failure
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Attempt at fixing windows failure
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Add documentation
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Use default value for --address flag
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Changes from review
Co-authored-by: Armel Soro <asoro@redhat.com>
Signed-off-by: Parthvi Vala <pvala@redhat.com>
---------
Signed-off-by: Parthvi Vala <pvala@redhat.com>
Co-authored-by: Armel Soro <armel@rm3l.org>
Co-authored-by: Armel Soro <asoro@redhat.com>
* Same signature for reconcile in kubedev/podmandev
* Do not call initial reconcile
* Do not retry + filter deployment events
* Integration tests
* Move logs back to level 4
* Remove unnecessary files
* Log state + Set state to ready when build fails
* Fix flaky test using custom port mapping when running specs in parallel
Using a global counter currently does not work
because Ginkgo runs parallel specs by isolating them in
completely different processes [1].
This relies on the parallel process index returned by Ginkgo
to get a value that can be used as starting port.
Callers can then safely increment this value if needed in the
specs to get a different custom value.
[1] https://onsi.github.io/ginkgo/#mental-model-how-ginkgo-runs-parallel-specs
* Apply suggestions from code review
Co-authored-by: Parthvi Vala <pvala@redhat.com>
* fixup! Apply suggestions from code review
---------
Co-authored-by: Parthvi Vala <pvala@redhat.com>
In those examples, the build and run commands are running in
different container components.
Without mounting sources in the container used for the 'run' command,
this command will not start because Maven would not be able
to resolve the 'spring-boot' plugin:
```
✓ Building your application in container (command: defaultbuild) [39s]
• Executing the application (command: defaultrun) ...
✗ Finished executing the application (command: defaultrun) [151ms]
⚠ Devfile command "defaultrun" exited with an error status in 20 second(s)
⚠ Last 100 lines of log:
✗ Waiting for the application to be ready [1m]
⚠ Port forwarding might not work correctly: timeout while checking for ports; ports not listening: (8080 in container "runtime"): context deadline exceeded
⚠ Running `odo logs --follow` might help in identifying the problem.
- Forwarding from 127.0.0.1:20001 -> 8080
```
This was not caught in the tests because failing to run the
'run' command current does not prevent the Dev session from starting.
This change might actually make the test faster as we would not have to wait 1 minute
to find out that the application port is not reachable.
* Cleanup e2e tests
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Revert "Cleanup e2e tests"
This reverts commit fa61002d86a1994a26bc766b29b458ebdbaf2059.
* Use java devfile for odo dev testing and nodejs for debugging
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Use a specific container name
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Increase timeout for odo dev now that we are waiting for the application to be ready
Signed-off-by: Parthvi Vala <pvala@redhat.com>
---------
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Add test cases simulating build or run commands that take very long
* Pass a context around to relevant functions and methods
This will allow to handle cancellations and timeouts and deadlines as needed
* Pass the context to Podman exec command too
* fixup! Add test cases simulating build or run commands that take very long
* Temp Change
* Custom port mapping works with podman
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Add unit tests
* Move custom port forward formation to the general getPortMapping function
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Integration test
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Fix unit tests
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Refactor integration test
Signed-off-by: Parthvi Vala <pvala@redhat.com>
Add dev --debug integration test for podman
Signed-off-by: Parthvi Vala <pvala@redhat.com>
Add dev --debug integration test for podman
Signed-off-by: Parthvi Vala <pvala@redhat.com>
Fix ci failures
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Use order to iterate over ceMapping and fix a check with debug integration test
Signed-off-by: Parthvi Vala <pvala@redhat.com>
---------
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Simplify AddOdoProjectVolume and AddOdoMandatoryVolume
* Rename / Clarify HandleEphemeralStorage function
* Regroup volume-specific code
* Move volume specific code to a separated function
* Add a new module configAutomount
* Automount PVC (without options)
* Add unit tests
* Separate functions
* Mount secrets
* Mount configmaps
* Specific mount path
* MountAs annotation
* Mounting cm/secret as env
* Refacto: use inAllContainers + replace result with volume
* Mounting cm/secret as subpath
* Read-only
* Integration tests
* Rename label
* Automount during odo deploy Exec command
* Add documentation
* Fix TODO
* Review
* Fix indentation
* Rename labels/annotations
* Add function in 'port' package allowing to check whether given ports are actually opened and in LISTEN state in specified containers
* Wait on Kubernetes until the application is ready by checking the ports to forward to are actually opened (or a timeout expires)
This allows to display port-forwarding messages when the application is ready to accept requests.
Otherwise, if the application takes time to listen on the port,
and we try to reach the local forwarded port, port forwarding will
be restarted.
If we are using --random-ports, new random ports will be generated.
Known issue: with the backo-go exponential backoff implementation,
it seems hitting Ctrl-C does not stop waiting =>
we need to wait until the timeout is reached or the backoff is done.
* Wait on Podman until the application is ready by checking the ports to forward to are actually opened (or a timeout expires)
This allows to display port-forwarding messages when the application is ready to accept requests.
Otherwise, if the application takes time to listen on the port,
and we try to reach the local forwarded port, port forwarding will
be restarted.
If we are using --random-ports, new random ports will be generated.
Known issue: with the backo-go exponential backoff implementation,
it seems hitting Ctrl-C does not stop waiting =>
we need to wait until the timeout is reached or the backoff is done.
* Display warnings instead if the ports are not opened
While iterating on the application, it might feel
weird to stop the Dev Session immediately.
Plus, a lot of integration tests are not passing because
of source code not strictly matching the ports declared in the
(too many) Devfiles.
* Fix integration test checking the behavior when simulating an app taking long to start
* Fix output expected for documentation tests
* Add hint to run 'odo logs --follow [--platform]' to help understand why app is not listening on the expected ports
Co-authored-by: Parthvi Vala <pvala@redhat.com>
* Collect all unreachable ports along with the containers and return the list to the users
Co-authored-by: Parthvi Vala <pvala@redhat.com>
* Apply suggestions from code review
Co-authored-by: Parthvi Vala <pvala@redhat.com>
* fixup! Add hint to run 'odo logs --follow [--platform]' to help understand why app is not listening on the expected ports
* fixup! Add hint to run 'odo logs --follow [--platform]' to help understand why app is not listening on the expected ports
---------
Co-authored-by: Parthvi Vala <pvala@redhat.com>
* Remove additional non-nil checks on component fields since they are already filtered by type
We are confident that the fields we expect
(comp.{Image,Kubernetes,OpenShift}) are non-nil.
* Rename 'libdevfile.GetImageComponentsToPush' into 'libdevfile.GetImageComponentsToPushAutomatically'
* Document with examples cases where 'deployByDefault' and 'autoBuild' are `false` and the component is not referenced
* Rename 'image-autobuild-true-and-referenced' command into 'image-autobuild-true' in test Devfile
* Simplify parsing the output on Podman in the tests when looking for K8s/OpenShift components
* Use 'source/nodejs' instead of 'source/devfiles/nodejs/project' in the tests
* Revert "Rename 'image-autobuild-true-and-referenced' command into 'image-autobuild-true' in test Devfile"
This reverts commit 65812b857c.
* Allow users to define custom port-mappings for port forwarding: add methods to parse and validate the flag
* Add methods to kube port-forwarding to obtain custom port pairs
Co-authored-by: Armel Soro <asoro@redhat.com>
Co-authored-by: Philippe Martin <phmartin@redhat.com>
* Pass custom port-mappings from CLI to Business layer
Co-authored-by: Armel Soro <asoro@redhat.com>
Co-authored-by: Philippe Martin <phmartin@redhat.com>
* Add integration test
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Add integration test for debug
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Add check for using --random-ports and --port-forward together
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Return all validation errors for --port-forward flag at once
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Use random local ports for integration testing
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Fix ci failures
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Print invalids of --port-forward to stderr so that they are printed when debugging
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Attempt at fixing the test failure on windows
Signed-off-by: Parthvi Vala <pvala@redhat.com>
Remove the use of seed for randomzing
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Use global counters for generate port number
Signed-off-by: Parthvi Vala <pvala@redhat.com>
* Apply changes from code review
Co-authored-by: Armel Soro <asoro@redhat.com>
---------
Signed-off-by: Parthvi Vala <pvala@redhat.com>
Co-authored-by: Armel Soro <asoro@redhat.com>
Co-authored-by: Philippe Martin <phmartin@redhat.com>