-
Notifications
You must be signed in to change notification settings - Fork 752
Add a plugin mechanism to provide custom locator URL schemes #3937
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
00bb585 to
824daed
Compare
|
I just realized that the ❯ limactl url-github lima-vm/lima
https://raw.githubusercontent.com/lima-vm/lima/master/lima.yaml
❯ limactl url-my default
https://raw.githubusercontent.com/lima-vm/lima/master/templates/default.yamlIf we don't want this, then we need to use a longer prefix for plugins, like |
|
I've just tested, and you can use tags or commit ids instead of branch names too. These all work: ❯ limactl tmpl copy github:lima-vm/lima/examples/opensuse@v0.23.1 -
❯ limactl tmpl copy github:lima-vm/lima/examples/opensuse@74e2fda81 - |
|
This looks great!
I did say "something like" in the request to leave room for improvement! |
824daed to
6e87a32
Compare
|
I've updated the PR by refactoring the code to run subcommands with the |
6e87a32 to
ad26a40
Compare
|
What is the remaining task to merge this PR? CI? |
I was planning to move to Either or both could happen in separate PRs to keep the PR easier to review. |
ad26a40 to
f6ceb58
Compare
I think it will be best to create separate PRs for further changes, to keep things easy for review. I've made one more change in this PR: I've appended I've noticed that we also use |
5a1ab38 to
6032d5f
Compare
cmd/limactl/main.go
Outdated
| if err != nil || cmd == rootCmd { | ||
| // Function calls os.Exit() if it found and executed the plugin | ||
| runExternalPlugin(rootCmd.Context(), args[0], args[1:]) | ||
| _ = executil.WithExecutablePath(func() error { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why ignore err?
cmd/limactl/template.go
Outdated
| return err | ||
| } | ||
|
|
||
| func newTemplateURLCommand() *cobra.Command { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Needs docs and tests
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Docs can be added under https://deploy-preview-3972--lima-vm.netlify.app/docs/config/plugin after merging:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
|
I just created another URL scheme for testing: #!/bin/bash
echo "${LIMA_HOME:-$HOME/.lima}/$1/lima.yaml"With this you can create another instance with identical config like this (but unlike the ❯ limactl create -y --name clone instance:defaultAnd of course it works all the usual places: Not sure though if it is useful enough to be builtin. |
This is quite confusing; |
Yeah, let's not include it in Lima. I think the only scheme we want to have builtin is |
|
Needs rebase |
Extension ideas:
|
5dde020 to
5d72cc0
Compare
|
I think this PR is ready for review. Still missing, but could be done in several separate PRs:
|
Also fix the global option processing so that they are not passed on to the plugin commands. Signed-off-by: Jan Dubois <jan.dubois@suse.com>
d306d12 to
97a9d84
Compare
The template reader will attempt to call `limactl-url-$SCHEME` to rewrite a custom URL as either a local filename, or a URL with a supported URL like https. Signed-off-by: Jan Dubois <jan.dubois@suse.com>
97a9d84 to
8ed0180
Compare
I've made that change as well now (in a separate commit), but I think this PR is getting too big. Can we get this reviewed and merged, and do the remaining tasks in separate PRs? |
8ed0180 to
e46309e
Compare
README.md
Outdated
| To run containers with Docker: | ||
| ```bash | ||
| limactl start template://docker | ||
| limactl start template:docker |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The old form should be kept until people actually begin using v2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I kind of disagree. The website should document the released version, but the README.md should correspond to the state of the branch.
Otherwise we could also not close issues until their PRs have been included in a new release, which would make the whole workflow really awkward.
I'll revert for now, but after 2.0 we should rethink our workflow, and also figure out how to have a version of the docs for the last release, and a different version for the head of master.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Regardless to our intention, people will just refer to the README in the default branch and will continue opening "I followed README but it doesn't work" issues when the content conflicts with the latest release, so we have to care about them
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Regardless to our intention, people will just refer to the README in the default branch
I think the way to deal with that is to remove end-user instructions from the README and point them to the docs. There is no reason to repeat usage documentation in it.
README
Lima is Linux Machines running in a VM...
How to install and use?
Please read the [Documentation] and follow the [Installation] instructions.
Community channels
- New releases on GitHub
- GitHub Discussions and Issues
- Slack
- Community meetings (maybe?)
- Social media (if we start posting there)
Developing Lima
Required tools and their version
How to build
How to run tests
License
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I still prefer to keep the "TLDR" abstract in README.md.
First comers do not want to access the website when they do not even know what it is all about.
e46309e to
942bb17
Compare
The old style template://name URLs are malformed because they do not contain a valid AUTHORITY (host name), but treat the host name as part of the path. They are still fully supported, but will emit a warning. Signed-off-by: Jan Dubois <jan.dubois@suse.com>
942bb17 to
677fa1f
Compare
AkihiroSuda
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks
This is a reimplementation of the bash code in lima-vm#3937 (comment) Signed-off-by: Jan Dubois <jan.dubois@suse.com>
This is a reimplementation of the bash code in lima-vm#3937 (comment) Signed-off-by: Jan Dubois <jan.dubois@suse.com>
This is a reimplementation of the bash code in lima-vm#3937 (comment) Signed-off-by: Jan Dubois <jan.dubois@suse.com>
|
On the second thought, a locator plugin should return the YAML contents, not HTTPS URL, so as to support non-HTTP and non-local remotes |
This is a reimplementation of the bash code in lima-vm#3937 (comment) Signed-off-by: Jan Dubois <jan.dubois@suse.com>
This is a reimplementation of the bash code in lima-vm#3937 (comment) Signed-off-by: Jan Dubois <jan.dubois@suse.com>
This is a reimplementation of the bash code in lima-vm#3937 (comment) Signed-off-by: Jan Dubois <jan.dubois@suse.com>
This is a reimplementation of the bash code in lima-vm#3937 (comment) Signed-off-by: Jan Dubois <jan.dubois@suse.com>
This is a reimplementation of the bash code in lima-vm#3937 (comment) Signed-off-by: Jan Dubois <jan.dubois@suse.com>
⚠️ **CAUTION: this is a major update, indicating a breaking change!**⚠️ This MR contains the following updates: | Package | Update | Change | |---|---|---| | [lima-vm/lima](https://github.com/lima-vm/lima) | major | `v1.2.2` -> `v2.0.1` | MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot). **Proposed changes to behavior should be submitted there as MRs.** --- ### Release Notes <details> <summary>lima-vm/lima (lima-vm/lima)</summary> ### [`v2.0.1`](https://github.com/lima-vm/lima/releases/tag/v2.0.1) [Compare Source](lima-vm/lima@v2.0.0...v2.0.1) #### Changes - Binary release artifacts: - Fix a regression in v2.0.0 `level=fatal msg="template \"_images/<IMAGE>.yaml\" not found"` ([#​4313](lima-vm/lima#4313), thanks to [@​vvoland](https://github.com/vvoland)) - Misc: - pkg/networks/usernet: use `SIGINT` instead of `SIGKILL` ([#​4310](lima-vm/lima#4310), thanks to [@​norio-nomura](https://github.com/norio-nomura)) Full changes: <https://github.com/lima-vm/lima/milestone/64?closed=1> #### Usage ```console $ limactl create $ limactl start ... INFO[0029] READY. Run `lima` to open the shell. $ lima uname Linux ``` *** The binaries were built automatically on GitHub Actions. The build log is available for 90 days: <https://github.com/lima-vm/lima/actions/runs/19137304035> The sha256sum of the SHA256SUMS file itself is `25ad222fa1cf91a85ef7be67664f2ba65228a5d82a39be1adbbe842096854e24` . *** Release manager: [@​AkihiroSuda](https://github.com/AkihiroSuda) ### [`v2.0.0`](https://github.com/lima-vm/lima/releases/tag/v2.0.0) [Compare Source](lima-vm/lima@v1.2.2...v2.0.0) This is the second major release of Lima, featuring the support for [pluggable VM drivers](https://lima-vm.io/docs/dev/drivers/), [GPU acceleration](https://lima-vm.io/docs/config/gpu/), and [MCP](https://lima-vm.io/docs/config/ai/outside/mcp/). This release also commemorates the promotion of the project from CNCF [Sandbox](https://www.cncf.io/sandbox-projects/) to [Incubating](https://www.cncf.io/projects/) 🎉. #### Highlights - [Experimental plug-in subsystem for VM driver infrastructure](https://lima-vm.io/docs/dev/drivers/). This will help implementing third-party plugins without modifying the code base of Lima. Thanks to [GSoC 2025](https://gist.github.com/unsuman/ff31a323ecef2289bf065882726ed7f0) contributor [@​unsuman](https://github.com/unsuman) . - [Experimental krunkit VM driver](https://lima-vm.io/docs/config/vmtype/krunkit/) for supporting GPU acceleration ([#​4137](lima-vm/lima#4137), thanks to [@​unsuman](https://github.com/unsuman)) - [Experimental integration for Model Context Protocol (MCP)](https://lima-vm.io/docs/config/ai/outside/) ([#​3744](lima-vm/lima#3744)). i.e., Lima can be now used as a sandbox for AI agents such as Gemini. - Add `limactl (start|restart) --progress` flag to show the progress of provisioning ([#​3846](lima-vm/lima#3846), [#​3915](lima-vm/lima#3915), thanks to [@​olamilekan000](https://github.com/olamilekan000) [@​norio-nomura](https://github.com/norio-nomura)) - Add `limactl shell --preserve-env` flag to propagate env vars from the host to VM ([#​3830](lima-vm/lima#3830), thanks to [@​olamilekan000](https://github.com/olamilekan000)) #### Other notable changes - `/tmp/lima` is no longer mounted by default ([#​3951](lima-vm/lima#3951)) - SSH port is no longer hard-coded to 60022 for the "default" instance ([#​3780](lima-vm/lima#3780)) - Forward UDP ports by default ([#​4054](lima-vm/lima#4054)) - Support CLI plugins ([#​3834](lima-vm/lima#3834), [#​4009](lima-vm/lima#4009), thanks to [@​olamilekan000](https://github.com/olamilekan000)) - Support custom URL scheme plugins ([#​3937](lima-vm/lima#3937), thanks to [@​jandubois](https://github.com/jandubois)). `template://default` is now recommended to be written as `template:default`. The old form is still supported. ##### Details - VM driver infrastructure: - [Experimental plug-in subsystem for VM driver infrastructure](https://lima-vm.io/docs/dev/drivers/) ([multiple MRs](https://github.com/lima-vm/lima/pulls?q=is%3Apr+milestone%3Av2.0.0+is%3Aclosed+label%3Aarea%2Fvmdrivers), thanks to [@​unsuman](https://github.com/unsuman)) - krunkit: - [Experimental krunkit VM driver](https://lima-vm.io/docs/config/vmtype/krunkit/) for supporting GPU acceleration ([#​4137](lima-vm/lima#4137), thanks to [@​unsuman](https://github.com/unsuman)) - VZ: - Support Rosetta AOT Caching with CDI ([#​3858](lima-vm/lima#3858), thanks to [@​norio-nomura](https://github.com/norio-nomura)) - Support accelerating SSH using `AF_VSOCK` ([#​3979](lima-vm/lima#3979), thanks to [@​norio-nomura](https://github.com/norio-nomura)) - QEMU: - Fallback to TCG when KVM is not available on Linux hosts ([#​4204](lima-vm/lima#4204)) - MCP: - [Experimental integration for Model Context Protocol (MCP)](https://lima-vm.io/docs/config/ai/outside/) ([#​3744](lima-vm/lima#3744)). Lima now provides MCP tools for reading, writing, and executing local files using a VM sandbox. Known to work with Google Gemini CLI. - `limactl` CLI: - Add `limactl (start|restart) --progress` flag to show the progress of provisioning ([#​3846](lima-vm/lima#3846), [#​3915](lima-vm/lima#3915), thanks to [@​olamilekan000](https://github.com/olamilekan000) [@​norio-nomura](https://github.com/norio-nomura)) - Add `limactl (create|start|edit) --port-forward` flag for static port forwarding ([#​3699](lima-vm/lima#3699), thanks to [@​Horiodino](https://github.com/Horiodino)). Usually not needed, but useful for instances created with `--plain`. - Add `limactl (create|start|edit) --ssh-port` flag ([#​3791](lima-vm/lima#3791)) - Add `limactl (create|start|edit) --mount-only` flag ([#​3947](lima-vm/lima#3947)). Similar to `--mount`, but overrides the existing mounts. Useful for mounting `$(pwd)`. - Support specifying `--set` multiple times in `limactl (create|start|edit)` ([#​4197](lima-vm/lima#4197), thanks to [@​AndiDog](https://github.com/AndiDog)) - Add `limactl shell --preserve-env` flag to propagate env vars from the host to VM ([#​3830](lima-vm/lima#3830), thanks to [@​olamilekan000](https://github.com/olamilekan000)). See also [`LIMA_SHELLENV_ALLOW`](https://lima-vm.io/docs/config/environment-variables/#lima_shellenv_allow) and [`LIMA_SHELLENV_BLOCK`](https://lima-vm.io/docs/config/environment-variables/#lima_shellenv_block). - Support CLI plugins ([#​3834](lima-vm/lima#3834), [#​4009](lima-vm/lima#4009), thanks to [@​olamilekan000](https://github.com/olamilekan000)) - Support custom URL scheme plugins ([#​3937](lima-vm/lima#3937), thanks to [@​jandubois](https://github.com/jandubois)). `template://default` is now recommended to be written as `template:default`. The old form is still supported. - Add `limactl copy --backend=rsync` flag as an alternative to `scp` backend ([#​3143](lima-vm/lima#3143), thanks to [@​olamilekan000](https://github.com/olamilekan000)) - Add `limactl list--yq` and `limactl info --yq` flags ([#​3998](lima-vm/lima#3998), thanks to [@​jandubois](https://github.com/jandubois)) - Add `limactl rename OLD NEW` ([#​4207](lima-vm/lima#4207)) - Deprecate `--yes` and introduce `limactl (clone|rename|edit|shell) --start` instead ([#​4108](lima-vm/lima#4108), [#​4285](lima-vm/lima#4285), thanks to [@​Horiodino](https://github.com/Horiodino) [@​nlordell](https://github.com/nlordell)) - YAML: - Migrate `cpuType` to `vmOpts.qemu` ([#​3500](lima-vm/lima#3500), thanks to [@​unsuman](https://github.com/unsuman)) - Add `yq` provision mode ([#​3892](lima-vm/lima#3892), thanks to [@​norio-nomura](https://github.com/norio-nomura)) - Prohibit relative paths in YAML ([#​3950](lima-vm/lima#3950)). Relative paths were never intended to be supported, but they were accidentally allowed due to a regression in v1.1.0. The CLI command `limactl (create|start|edit) --mount DIR` still supports relative paths. - Default template: - Remove `/tmp/lima` mount ([#​3951](lima-vm/lima#3951)) - Stop hardcoding SSH port 60022 ([#​3780](lima-vm/lima#3780)) - Network: - Enable mDNS for vzNAT and socket\_vmnet ([#​4272](lima-vm/lima#4272), thanks to [@​norio-nomura](https://github.com/norio-nomura)) - Port forwarding: - Support port forwarding in plain mode ([#​3699](lima-vm/lima#3699), thanks to [@​Horiodino](https://github.com/Horiodino)) - Support host sockets in gRPC port forwarder ([#​4008](lima-vm/lima#4008), thanks to [@​norio-nomura](https://github.com/norio-nomura)) - Forward UDP ports by default ([#​4054](lima-vm/lima#4054)) - Eliminated 3-second delay for detecting ports ([#​4066](lima-vm/lima#4066)) - Removed iptables watcher for `sudo nerdctl run -p ...` ([#​4107](lima-vm/lima#4107)). `sudo nerdctl run -p ...` now requires nerdctl v2.1.6 or later. - Improved performance of gRPC forwarder ([#​4247](lima-vm/lima#4247), thanks to [@​balajiv113](https://github.com/balajiv113)) - Support UDP in Kubernetes ([#​4233](lima-vm/lima#4233)) - Change default of `guestIPMustBeZero` to `true` when `guestIP` is `0.0.0.0` ([#​4221](lima-vm/lima#4221), thanks to [@​jandubois](https://github.com/jandubois)) - Build system: - Remove `Kconfig` and `config.mk`, in favor of Makefile variables ([#​3732](lima-vm/lima#3732)) - Support Fedora, RHEL, and relevant host distributions ([#​4228](lima-vm/lima#4228), thanks to [@​valdela1](https://github.com/valdela1)) - Templates: - `alpine`, `alpine-iso`: update to Alpine 3.22 ([#​4184](lima-vm/lima#4184), [#​4190](lima-vm/lima#4190), thanks to [@​jandubois](https://github.com/jandubois)) - `debian`: update to Debian 13 ([#​4029](lima-vm/lima#4029), thanks to [@​unsuman](https://github.com/unsuman)) - `docker`, `docker-rootful`: Enable containerd image store ([#​3941](lima-vm/lima#3941), thanks to [@​norio-nomura](https://github.com/norio-nomura)) - `fedora`: update to Fedora 43 ([#​4255](lima-vm/lima#4255)) - `opensuse`: update to openSUSE Leap 16 ([#​4203](lima-vm/lima#4203)) - `oraclelinux`: update to Oracle Linux 10 ([#​4236](lima-vm/lima#4236), thanks to [@​valdela1](https://github.com/valdela1)) - `ubuntu`, `default`: update Ubuntu to 25.10 ([#​4202](lima-vm/lima#4202)) - `k0s`: New template ([#​3728](lima-vm/lima#3728), thanks to [@​plandem](https://github.com/plandem)) - `experimental/ubuntu-next`: update to Ubuntu 26.04 pre-release ([#​4311](lima-vm/lima#4311)) - Project: - Invite Ansuman Sahoo ([@​unsuman](https://github.com/unsuman)) as a Reviewer ([#​4003](lima-vm/lima#4003), thanks to [@​jandubois](https://github.com/jandubois)) - Promote from CNCF Sandbox to Incubating ([#​4201](lima-vm/lima#4201)) Full changes: <https://github.com/lima-vm/lima/milestone/59?closed=1> Thanks to [@​AndiDog](https://github.com/AndiDog) [@​Horiodino](https://github.com/Horiodino) [@​afbjorklund](https://github.com/afbjorklund) [@​alexandear](https://github.com/alexandear) [@​ashwat287](https://github.com/ashwat287) [@​balajiv113](https://github.com/balajiv113) [@​bonifaido](https://github.com/bonifaido) [@​dharsanb](https://github.com/dharsanb) [@​gnawhleinad](https://github.com/gnawhleinad) [@​iamleot](https://github.com/iamleot) [@​jandubois](https://github.com/jandubois) [@​kachick](https://github.com/kachick) [@​muchzill4](https://github.com/muchzill4) [@​ningmingxiao](https://github.com/ningmingxiao) [@​nlordell](https://github.com/nlordell) [@​norio-nomura](https://github.com/norio-nomura) [@​olamilekan000](https://github.com/olamilekan000) [@​plandem](https://github.com/plandem) [@​stek29](https://github.com/stek29) [@​unsuman](https://github.com/unsuman) [@​valdela1](https://github.com/valdela1) [@​vax-r](https://github.com/vax-r) [@​vishalanarase](https://github.com/vishalanarase) [@​zyfy29](https://github.com/zyfy29) #### EOL of v1.2 Lima v1.2 will continue to receive security updates and critical bug fixes until **2026-02-06** (3 months from now). See also <https://lima-vm.io/docs/releases/>. #### Usage ```console $ limactl create $ limactl start ... INFO[0029] READY. Run `lima` to open the shell. $ lima uname Linux ``` *** The binaries were built automatically on GitHub Actions. The build log is available for 90 days: <https://github.com/lima-vm/lima/actions/runs/19130682878> The sha256sum of the SHA256SUMS file itself is `112f1ef1d9850e29b4be425ca71e8b6ac686f593ff741164885b51fbd6919ca6` . *** Release manager: [@​AkihiroSuda](https://github.com/AkihiroSuda) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this MR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMCIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
The template reader will attempt to call
limactl-url-$SCHEMEto rewrite a custom URL as either a local filename, or a URL with a supported scheme likehttps.This change allows us to experiment with custom schemes, like the one requested in #3930.
Example implementation for the
github:scheme is at the end. You can use:FILEdefaults tolima, and files without an extension will have.yamlappended.The default branch is determined by the GitHub API if no
BRANCHis specified.This implementation has a few differences to the one requested in #3930:
masterlima.yamlinstead oftemplates/default.yamlas the default fileI believe this implementation is more versatile, but we can discuss this below. The plugin format makes it easy to experiment.
Here is a minimalistic
my:scheme to fetch default templates from the Lima repo:And here is
limactl-url-github. Which should become a builtin scheme (implemented in Go) once we agree on the specific semantics: