From 05f9d53dab468546918a332f0fc18449de774487 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 16:46:34 -0700 Subject: [PATCH 1/3] build(deps): Bump k8s.io/apimachinery from 0.28.2 to 0.28.3 (#652) Bumps [k8s.io/apimachinery](https://github.com/kubernetes/apimachinery) from 0.28.2 to 0.28.3.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=k8s.io/apimachinery&package-manager=go_modules&previous-version=0.28.2&new-version=0.28.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index fabfe7874..35af8a4d5 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( golang.org/x/exp v0.0.0-20230810033253-352e893a4cad golang.org/x/tools v0.14.0 gopkg.in/yaml.v3 v3.0.1 - k8s.io/apimachinery v0.28.2 + k8s.io/apimachinery v0.28.3 ) require ( @@ -76,7 +76,7 @@ require ( github.com/xanzy/ssh-agent v0.2.1 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/mod v0.13.0 // indirect - golang.org/x/net v0.16.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect diff --git a/go.sum b/go.sum index bcc0473d0..56c7423db 100644 --- a/go.sum +++ b/go.sum @@ -478,8 +478,8 @@ golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -898,8 +898,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= -k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= From 4d942f550c86106a224e97f32f1bf90f1b4d44cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 16:51:00 -0700 Subject: [PATCH 2/3] build(deps): Bump github.com/runfinch/common-tests from 0.7.7 to 0.7.8 (#617) Bumps [github.com/runfinch/common-tests](https://github.com/runfinch/common-tests) from 0.7.7 to 0.7.8.
Release notes

Sourced from github.com/runfinch/common-tests's releases.

v0.7.8

0.7.8 (2023-10-10)

Build System or External Dependencies

  • deps: Bump github.com/onsi/ginkgo/v2 from 2.12.1 to 2.13.0 (#93) (dcd9dee)
Changelog

Sourced from github.com/runfinch/common-tests's changelog.

0.7.8 (2023-10-10)

Build System or External Dependencies

  • deps: Bump github.com/onsi/ginkgo/v2 from 2.12.1 to 2.13.0 (#93) (dcd9dee)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/runfinch/common-tests&package-manager=go_modules&previous-version=0.7.7&new-version=0.7.8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 35af8a4d5..ad64572b5 100644 --- a/go.mod +++ b/go.mod @@ -8,11 +8,11 @@ require ( github.com/golang/mock v1.6.0 github.com/google/go-licenses v1.6.0 github.com/lima-vm/lima v0.17.2 - github.com/onsi/ginkgo/v2 v2.12.1 + github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.28.0 github.com/pelletier/go-toml v1.9.5 github.com/pkg/sftp v1.13.6 - github.com/runfinch/common-tests v0.7.7 + github.com/runfinch/common-tests v0.7.8 github.com/shirou/gopsutil/v3 v3.23.9 github.com/sirupsen/logrus v1.9.3 github.com/spf13/afero v1.10.0 diff --git a/go.sum b/go.sum index 56c7423db..7fdc98e7a 100644 --- a/go.sum +++ b/go.sum @@ -279,8 +279,8 @@ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= -github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.28.0 h1:i2rg/p9n/UqIDAMFUJ6qIUUMcsqOuUHgbpbu235Vr1c= github.com/onsi/gomega v1.28.0/go.mod h1:A1H2JE76sI14WIP57LMKj7FVfCHx3g3BcZVjJG8bjX8= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= @@ -313,8 +313,8 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/runfinch/common-tests v0.7.7 h1:ZJjRI4fk02C1Qoj3A9Z+Jdkk2pUZiSqH5L/3peIN1Qs= -github.com/runfinch/common-tests v0.7.7/go.mod h1:3BP9a6r5HeILCy/0IiTeC0zwyAgkUI0X2WZWZIctPj4= +github.com/runfinch/common-tests v0.7.8 h1:uXskg7qUSLp+2H+BT3rsAn5RZ90XVTn8LYOOj6ODsUg= +github.com/runfinch/common-tests v0.7.8/go.mod h1:SiFfCOWo+b2SpA/MwEa3z3cFTCyuEJQJXBJ6ItH6G64= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= From 3e2504382508abf2615e6925e13d0d19e003604e Mon Sep 17 00:00:00 2001 From: Justin Date: Mon, 23 Oct 2023 19:47:07 -0400 Subject: [PATCH 3/3] docs: auto-generate docs (#651) Issue #, if available: *Description of changes:* - Add `finch gen-docs generate` command, which can be used to generate documentation - This actually runs all of the commands, so a finch vm needs to be running - This is because many of the commands shell out to nerdctl inside of a Linux VM, so simply leveraging cobra's built-in documentation generation won't work - Actually running the commands and then parsing the output into a markdown file is... kinda hacky, so this might break from time to time - This only works for top-level nerdctl commands right now, because those are the only commands that finch "knows" about. Meaning, while `finch volume create` is a command, with it's own usage information, it won't have a page here. The doc for `finch volume` does reference its subcommands, however. *Testing done:* - TODO - [x] unit tests - [x] I've reviewed the guidance in CONTRIBUTING.md #### License Acceptance By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Signed-off-by: Justin Alvarez --- .markdownlintignore | 6 + cmd/finch/doc.TEMPLATE | 38 ++++ cmd/finch/gen_docs.go | 235 ++++++++++++++++++++++ cmd/finch/gen_docs_test.go | 180 +++++++++++++++++ cmd/finch/main.go | 1 + cmd/finch/main_test.go | 4 +- docs/cmd/finch_build.md | 32 +++ docs/cmd/finch_builder.md | 21 ++ docs/cmd/finch_commit.md | 17 ++ docs/cmd/finch_completion_bash.md | 25 +++ docs/cmd/finch_completion_fish.md | 24 +++ docs/cmd/finch_completion_powershell.md | 21 ++ docs/cmd/finch_completion_zsh.md | 27 +++ docs/cmd/finch_compose.md | 48 +++++ docs/cmd/finch_container.md | 40 ++++ docs/cmd/finch_cp.md | 18 ++ docs/cmd/finch_create.md | 95 +++++++++ docs/cmd/finch_events.md | 14 ++ docs/cmd/finch_exec.md | 21 ++ docs/cmd/finch_help.md | 14 ++ docs/cmd/finch_history.md | 16 ++ docs/cmd/finch_image.md | 32 +++ docs/cmd/finch_images.md | 31 +++ docs/cmd/finch_info.md | 15 ++ docs/cmd/finch_inspect.md | 16 ++ docs/cmd/finch_kill.md | 14 ++ docs/cmd/finch_load.md | 16 ++ docs/cmd/finch_login.md | 16 ++ docs/cmd/finch_logout.md | 13 ++ docs/cmd/finch_logs.md | 23 +++ docs/cmd/finch_network.md | 23 +++ docs/cmd/finch_pause.md | 13 ++ docs/cmd/finch_port.md | 13 ++ docs/cmd/finch_ps.md | 21 ++ docs/cmd/finch_pull.md | 24 +++ docs/cmd/finch_push.md | 25 +++ docs/cmd/finch_restart.md | 14 ++ docs/cmd/finch_rm.md | 15 ++ docs/cmd/finch_rmi.md | 15 ++ docs/cmd/finch_run.md | 96 +++++++++ docs/cmd/finch_save.md | 16 ++ docs/cmd/finch_start.md | 15 ++ docs/cmd/finch_stats.md | 17 ++ docs/cmd/finch_stop.md | 14 ++ docs/cmd/finch_support-bundle_generate.md | 15 ++ docs/cmd/finch_system.md | 21 ++ docs/cmd/finch_tag.md | 13 ++ docs/cmd/finch_top.md | 13 ++ docs/cmd/finch_unpause.md | 13 ++ docs/cmd/finch_update.md | 26 +++ docs/cmd/finch_version.md | 13 ++ docs/cmd/finch_vm_init.md | 13 ++ docs/cmd/finch_vm_remove.md | 14 ++ docs/cmd/finch_vm_start.md | 13 ++ docs/cmd/finch_vm_status.md | 13 ++ docs/cmd/finch_vm_stop.md | 14 ++ docs/cmd/finch_volume.md | 23 +++ docs/cmd/finch_wait.md | 13 ++ pkg/mocks/gen_docs_system_deps.go | 80 ++++++++ pkg/system/stdlib.go | 8 + pkg/system/system.go | 10 + 61 files changed, 1707 insertions(+), 2 deletions(-) create mode 100644 .markdownlintignore create mode 100644 cmd/finch/doc.TEMPLATE create mode 100644 cmd/finch/gen_docs.go create mode 100644 cmd/finch/gen_docs_test.go create mode 100644 docs/cmd/finch_build.md create mode 100644 docs/cmd/finch_builder.md create mode 100644 docs/cmd/finch_commit.md create mode 100644 docs/cmd/finch_completion_bash.md create mode 100644 docs/cmd/finch_completion_fish.md create mode 100644 docs/cmd/finch_completion_powershell.md create mode 100644 docs/cmd/finch_completion_zsh.md create mode 100644 docs/cmd/finch_compose.md create mode 100644 docs/cmd/finch_container.md create mode 100644 docs/cmd/finch_cp.md create mode 100644 docs/cmd/finch_create.md create mode 100644 docs/cmd/finch_events.md create mode 100644 docs/cmd/finch_exec.md create mode 100644 docs/cmd/finch_help.md create mode 100644 docs/cmd/finch_history.md create mode 100644 docs/cmd/finch_image.md create mode 100644 docs/cmd/finch_images.md create mode 100644 docs/cmd/finch_info.md create mode 100644 docs/cmd/finch_inspect.md create mode 100644 docs/cmd/finch_kill.md create mode 100644 docs/cmd/finch_load.md create mode 100644 docs/cmd/finch_login.md create mode 100644 docs/cmd/finch_logout.md create mode 100644 docs/cmd/finch_logs.md create mode 100644 docs/cmd/finch_network.md create mode 100644 docs/cmd/finch_pause.md create mode 100644 docs/cmd/finch_port.md create mode 100644 docs/cmd/finch_ps.md create mode 100644 docs/cmd/finch_pull.md create mode 100644 docs/cmd/finch_push.md create mode 100644 docs/cmd/finch_restart.md create mode 100644 docs/cmd/finch_rm.md create mode 100644 docs/cmd/finch_rmi.md create mode 100644 docs/cmd/finch_run.md create mode 100644 docs/cmd/finch_save.md create mode 100644 docs/cmd/finch_start.md create mode 100644 docs/cmd/finch_stats.md create mode 100644 docs/cmd/finch_stop.md create mode 100644 docs/cmd/finch_support-bundle_generate.md create mode 100644 docs/cmd/finch_system.md create mode 100644 docs/cmd/finch_tag.md create mode 100644 docs/cmd/finch_top.md create mode 100644 docs/cmd/finch_unpause.md create mode 100644 docs/cmd/finch_update.md create mode 100644 docs/cmd/finch_version.md create mode 100644 docs/cmd/finch_vm_init.md create mode 100644 docs/cmd/finch_vm_remove.md create mode 100644 docs/cmd/finch_vm_start.md create mode 100644 docs/cmd/finch_vm_status.md create mode 100644 docs/cmd/finch_vm_stop.md create mode 100644 docs/cmd/finch_volume.md create mode 100644 docs/cmd/finch_wait.md create mode 100644 pkg/mocks/gen_docs_system_deps.go diff --git a/.markdownlintignore b/.markdownlintignore new file mode 100644 index 000000000..30628358c --- /dev/null +++ b/.markdownlintignore @@ -0,0 +1,6 @@ +deps/ +# Since the current documentation generation works by just capturing stdout, we don't do any post processing +# The completion files have issues with code block style +docs/cmd/*completion*.md +# finch_logs.md has issues with the list not being surrounded by newlines +docs/cmd/finch_logs.md diff --git a/cmd/finch/doc.TEMPLATE b/cmd/finch/doc.TEMPLATE new file mode 100644 index 000000000..9a0c7c264 --- /dev/null +++ b/cmd/finch/doc.TEMPLATE @@ -0,0 +1,38 @@ +# {{ .CmdPath }} + +{{if gt (len .Description) 0}}{{ .Description }} + +{{end}}{{if gt (len .Properties) 0}}## Properties + +{{.Properties}} + +{{end}}```text +{{ .Usage }} +```{{if gt (len .Aliases) 0}} + +## Aliases + +{{.Aliases}} +{{end}}{{if gt (len .Examples) 0}} + +## Examples + +{{.Examples}} +{{end}}{{if gt (len .Commands) 0}} + +## Commands + +```text +{{ .Commands }} +```{{end}}{{if gt (len .Options) 0}} + +## Options + +```text +{{ .Options }} +```{{end}}{{if gt (len .SeeAlso) 0}} + +## SEE ALSO + +{{ .SeeAlso }} +{{end}} diff --git a/cmd/finch/gen_docs.go b/cmd/finch/gen_docs.go new file mode 100644 index 000000000..4aa0f9330 --- /dev/null +++ b/cmd/finch/gen_docs.go @@ -0,0 +1,235 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package main + +import ( + "bytes" + _ "embed" + "fmt" + "io" + "os" + "path/filepath" + "regexp" + "strings" + "text/template" + + "github.com/spf13/afero" + "github.com/spf13/cobra" + + "github.com/runfinch/finch/pkg/flog" + "github.com/runfinch/finch/pkg/system" +) + +// GenDocsSystemDeps contains the system dependencies for newGenDocsCommand. +// +//go:generate mockgen -copyright_file=../../copyright_header -destination=../../pkg/mocks/gen_docs_system_deps.go -package=mocks -mock_names GenDocsSystemDeps=GenDocsSystemDeps -source=gen_docs.go GenDocsSystemDeps +type GenDocsSystemDeps interface { + system.PipeGetter + system.StdoutGetter + system.StdoutSetter +} + +func newGenDocsCommand( + rootCmd *cobra.Command, + logger flog.Logger, + fs afero.Fs, + deps GenDocsSystemDeps, +) *cobra.Command { + genDocsCommand := &cobra.Command{ + Use: "gen-docs", + Short: "Document generation", + } + genDocsCommand.AddCommand( + newGenDocsGenerateCommand(rootCmd, logger, fs, deps), + ) + return genDocsCommand +} + +func newGenDocsGenerateCommand( + rootCmd *cobra.Command, + logger flog.Logger, + fs afero.Fs, + deps GenDocsSystemDeps, +) *cobra.Command { + genDocsGenerateCommand := &cobra.Command{ + Use: "generate", + Args: cobra.NoArgs, + Hidden: true, + Short: "Generate Finch docs", + RunE: newGenDocsGenerateAction(rootCmd, logger, fs, deps).runAdapter, + } + + genDocsGenerateCommand.Flags().StringP("path", "p", "", "Doc output directory") + // Ignore error since we check if the flag is set anyway + _ = genDocsGenerateCommand.MarkFlagRequired("path") + + return genDocsGenerateCommand +} + +type genDocsAction struct { + rootCmd *cobra.Command + logger flog.Logger + fs afero.Fs + deps GenDocsSystemDeps +} + +func newGenDocsGenerateAction( + rootCmd *cobra.Command, + logger flog.Logger, + fs afero.Fs, + deps GenDocsSystemDeps, +) *genDocsAction { + return &genDocsAction{ + rootCmd: rootCmd, + logger: logger, + deps: deps, + fs: fs, + } +} + +func (gd *genDocsAction) runAdapter(cmd *cobra.Command, _ []string) error { + path, err := cmd.Flags().GetString("path") + if err != nil { + return fmt.Errorf("failed to get required parameter 'path': %w", err) + } + return gd.run(path) +} + +func (gd *genDocsAction) run(outDir string) error { + return gd.captureHelpOutput(gd.rootCmd, outDir) +} + +func (gd *genDocsAction) captureHelpOutput(cmd *cobra.Command, outDir string) error { + for _, c := range cmd.Commands() { + if err := gd.captureHelpOutput(c, outDir); err != nil { + return fmt.Errorf("error while generating docs for %s: %w", c.CommandPath(), err) + } + } + + if !cmd.Runnable() || cmd.Hidden { + return nil + } + + gd.logger.Infof("Creating doc for command: %s", cmd.CommandPath()) + + baseName := strings.ReplaceAll(cmd.CommandPath(), " ", "_") + ".md" + fileName := filepath.Clean(filepath.Join(outDir, baseName)) + f, err := gd.fs.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o666) + if err != nil { + return fmt.Errorf("error while creating out file %q: %w", fileName, err) + } + + // redirect Stdout to pipe + rescueStdout := gd.deps.Stdout() + r, w, err := gd.deps.Pipe() + if err != nil { + return fmt.Errorf("error while creating pipe to capture stdout: %w", err) + } + gd.deps.SetStdout(w) + + rootCmd := cmd.Root() + + // everything except the initial `finch` + args := strings.Split(cmd.CommandPath(), " ")[1:] + args = append(args, "--help") + rootCmd.SetArgs(args) + // rootCmd.SetOutput() would work for all "default finch" commands, but doesn't work + // for the nerdctl commands. Getting it to work would remove the need to capture all Stdout. + if err := rootCmd.Execute(); err != nil { + // This is pretty much impossible because cobra checks if --help is set and if it is it doesn't + // actually run the command. + // https://github.com/spf13/cobra/blob/main/command.go#L1096-L1099 + return fmt.Errorf("error while executing command (args=%v): %w", args, err) + } + gd.deps.SetStdout(rescueStdout) + + _ = w.Close() + helpText, err := io.ReadAll(r) + if err != nil { + return fmt.Errorf("error while reading stdout from pipe: %w", err) + } + + // Link to parent command page if parent command is also runnable. + // For example, if `finch vm` and `finch vm init` both had their own Run/RunE methods defined, + // finch vm init's documentation page would link to finch vm's page. + // If this condition is not met, then there is no "SEE ALSO" section. + seeAlso := "" + if cmd.HasParent() && cmd.Parent().Runnable() { + parentName := cmd.Parent().CommandPath() + parentDocFile := parentName + ".md" + parentDocFile = strings.ReplaceAll(parentDocFile, " ", "_") + parentShortDescription := cmd.Parent().Short + seeAlso = fmt.Sprintf("* [%s](%s)\t - %s\n", parentName, parentDocFile, parentShortDescription) + } + + mdOut, err := convertToMarkdown(cmd.CommandPath(), seeAlso, string(helpText)) + if err != nil { + return fmt.Errorf("error while converting docs to markdown: %w", err) + } + + if _, err := f.WriteString(mdOut); err != nil { + return fmt.Errorf("error while writing docs to file (%q): %w", f.Name(), err) + } + + _ = f.Close() + + return nil +} + +//go:embed doc.TEMPLATE +var docTmpl string + +type docTmplOpts struct { + CmdPath string + Description string + Properties string + Usage string + Aliases string + Examples string + Commands string + Options string + SeeAlso string +} + +func convertToMarkdown(cmdPath, seeAlso, helpText string) (string, error) { + t := template.Must(template.New("docTmpl").Parse(docTmpl)) + opts := docTmplOpts{ + CmdPath: cmdPath, + } + + opts.SeeAlso = seeAlso + + // Assume that everything up until "header section" (i.e. `Usage:\n`) is a description + re := regexp.MustCompile(`(?msU)^(.*)[A-Z]\w*:\s`) + matches := re.FindStringSubmatch(helpText) + // Take the last index (if no match, 0 or if match, 1) as the description. + // This handles the rare case in where the only help info is a description. + opts.Description = strings.TrimSpace(matches[len(matches)-1]) + + // The rest of the fields are treated as optional. + // A reference of all fields and how they may appear in help out put can + // be found here: https://github.com/spf13/cobra/blob/v1.7.0/command.go#L539-L568 + opts.Properties = tryExtractField(helpText, "Properties") + opts.Usage = tryExtractField(helpText, "Usage") + opts.Aliases = tryExtractField(helpText, "Aliases") + opts.Examples = tryExtractField(helpText, "Examples") + opts.Commands = tryExtractField(helpText, "Commands") + opts.Options = tryExtractField(helpText, "Flags") + + var tmpl bytes.Buffer + if err := t.Execute(&tmpl, opts); err != nil { + return "", err + } + + return tmpl.String(), nil +} + +func tryExtractField(helpString, fieldName string) string { + re := regexp.MustCompile(fmt.Sprintf(`(?smU)^%s:\s(.*)^\s?$`, fieldName)) + matches := re.FindStringSubmatch(strings.TrimSpace(helpString)) + if len(matches) == 2 { + return strings.TrimSuffix(strings.TrimSuffix(matches[1], " "), "\n") + } + return "" +} diff --git a/cmd/finch/gen_docs_test.go b/cmd/finch/gen_docs_test.go new file mode 100644 index 000000000..5d5905127 --- /dev/null +++ b/cmd/finch/gen_docs_test.go @@ -0,0 +1,180 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package main + +import ( + "fmt" + "os" + "testing" + + "github.com/spf13/afero" + "github.com/spf13/cobra" + + "github.com/runfinch/finch/pkg/mocks" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestNewGenDocsCommand(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + logger := mocks.NewLogger(ctrl) + mFs := afero.NewMemMapFs() + deps := mocks.NewGenDocsSystemDeps(ctrl) + cmd := newGenDocsCommand(&cobra.Command{}, logger, mFs, deps) + assert.Equal(t, cmd.Name(), "gen-docs") +} + +func TestNewGenDocsGenerateCommand(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + logger := mocks.NewLogger(ctrl) + mFs := afero.NewMemMapFs() + deps := mocks.NewGenDocsSystemDeps(ctrl) + cmd := newGenDocsGenerateCommand(&cobra.Command{}, logger, mFs, deps) + assert.Equal(t, cmd.Name(), "generate") +} + +var codeBlock = "```" + +//nolint:paralleltest // This function manipulates stdout +func TestGenDocsAction_runAdapter(t *testing.T) { + testCases := []struct { + name string + cmd func(t *testing.T) *cobra.Command + mockSvc func( + ctrl *gomock.Controller, + t *testing.T, + logger *mocks.Logger, + mFs afero.Fs, + deps *mocks.GenDocsSystemDeps, + stdout *os.File, + ) + want error + postRunCheck func(t *testing.T, fs afero.Fs) + }{ + { + name: "path is set and exists", + cmd: func(t *testing.T) *cobra.Command { + c := &cobra.Command{ + Use: "test-command", + Run: func(_ *cobra.Command, _ []string) {}, + } + c.Flags().StringP("path", "p", "", "Doc output directory") + require.NoError(t, c.Flags().Set("path", "outDir")) + require.NoError(t, c.Execute()) + return c + }, + mockSvc: func( + ctrl *gomock.Controller, + t *testing.T, + logger *mocks.Logger, + mFs afero.Fs, + deps *mocks.GenDocsSystemDeps, + stdout *os.File, + ) { + require.NoError(t, mFs.Mkdir("outDir", 0o666)) + logger.EXPECT().Infof("Creating doc for command: %s", "test-command") + // Hijack stdout before the command does and replace it with a pipe + stdoutR, stdoutW, err := os.Pipe() + require.NoError(t, err) + os.Stdout = stdoutW + deps.EXPECT().Stdout().Return(os.Stdout) + deps.EXPECT().Pipe().Return(stdoutR, stdoutW, nil) + deps.EXPECT().SetStdout(stdoutW) + deps.EXPECT().SetStdout(os.Stdout) + }, + want: nil, + postRunCheck: func(t *testing.T, fs afero.Fs) { + buf, err := afero.ReadFile(fs, "outDir/test-command.md") + require.NoError(t, err) + require.Equal(t, string(buf), fmt.Sprintf(`# test-command + +%stext + test-command [flags] +%s +`, codeBlock, codeBlock)) + }, + }, + { + name: "path is set and exists but can't create pipe", + cmd: func(t *testing.T) *cobra.Command { + c := &cobra.Command{ + Use: "test-command", + Run: func(_ *cobra.Command, _ []string) {}, + } + c.Flags().StringP("path", "p", "", "Doc output directory") + require.NoError(t, c.Flags().Set("path", "outDir")) + require.NoError(t, c.Execute()) + return c + }, + mockSvc: func( + ctrl *gomock.Controller, + t *testing.T, + logger *mocks.Logger, + mFs afero.Fs, + deps *mocks.GenDocsSystemDeps, + stdout *os.File, + ) { + require.NoError(t, mFs.Mkdir("outDir", 0o666)) + logger.EXPECT().Infof("Creating doc for command: %s", "test-command") + stdoutR, stdoutW, err := os.Pipe() + require.NoError(t, err) + deps.EXPECT().Stdout().Return(stdoutW) + deps.EXPECT().Pipe().Return(stdoutR, stdoutW, fmt.Errorf("can't create pipe")) + }, + want: fmt.Errorf("error while creating pipe to capture stdout: %w", fmt.Errorf("can't create pipe")), + postRunCheck: func(t *testing.T, fs afero.Fs) { + buf, err := afero.ReadFile(fs, "outDir/test-command.md") + require.NoError(t, err) + require.Equal(t, buf, []byte(``)) + }, + }, + { + name: "path is set and command is not runnable", + cmd: func(t *testing.T) *cobra.Command { + c := &cobra.Command{ + Use: "test-command", + } + c.Flags().StringP("path", "p", "", "Doc output directory") + require.NoError(t, c.Flags().Set("path", "outDir")) + require.NoError(t, c.Execute()) + return c + }, + mockSvc: func( + ctrl *gomock.Controller, + t *testing.T, + logger *mocks.Logger, + mFs afero.Fs, + deps *mocks.GenDocsSystemDeps, + stdout *os.File, + ) { + }, + want: nil, + postRunCheck: func(t *testing.T, fs afero.Fs) { + }, + }, + } + + //nolint:paralleltest // This function manipulates stdout + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + ctrl := gomock.NewController(t) + logger := mocks.NewLogger(ctrl) + mFs := afero.NewMemMapFs() + deps := mocks.NewGenDocsSystemDeps(ctrl) + rescueStdout := os.Stdout + tc.mockSvc(ctrl, t, logger, mFs, deps, os.Stdout) + got := newGenDocsGenerateAction(tc.cmd(t), logger, mFs, deps).runAdapter(tc.cmd(t), nil) + os.Stdout = rescueStdout + assert.Equal(t, tc.want, got) + tc.postRunCheck(t, mFs) + }) + } +} diff --git a/cmd/finch/main.go b/cmd/finch/main.go index 1c95ca958..57d6079a7 100644 --- a/cmd/finch/main.go +++ b/cmd/finch/main.go @@ -107,6 +107,7 @@ var newApp = func(logger flog.Logger, fp path.Finch, fs afero.Fs, fc *config.Fin newVersionCommand(lcc, logger, stdOut), virtualMachineCommands(logger, fp, lcc, ecc, fs, fc), newSupportBundleCommand(logger, supportBundleBuilder, lcc), + newGenDocsCommand(rootCmd, logger, fs, system.NewStdLib()), ) rootCmd.AddCommand(allCommands...) diff --git a/cmd/finch/main_test.go b/cmd/finch/main_test.go index 43df113a7..0b03c5e9e 100644 --- a/cmd/finch/main_test.go +++ b/cmd/finch/main_test.go @@ -138,8 +138,8 @@ func TestNewApp(t *testing.T) { assert.Equal(t, cmd.Version, version.Version) assert.Equal(t, cmd.SilenceUsage, true) assert.Equal(t, cmd.SilenceErrors, true) - // confirm the number of command, comprised of nerdctl commands + finch commands (version, vm, support-bundle) - assert.Equal(t, len(cmd.Commands()), len(nerdctlCmds)+3) + // confirm the number of command, comprised of nerdctl commands + finch commands + assert.Equal(t, len(cmd.Commands()), len(nerdctlCmds)+4) // PersistentPreRunE should set logger level to debug if the debug flag exists. mockCmd := &cobra.Command{} diff --git a/docs/cmd/finch_build.md b/docs/cmd/finch_build.md new file mode 100644 index 000000000..02213dfa7 --- /dev/null +++ b/docs/cmd/finch_build.md @@ -0,0 +1,32 @@ +# finch build + +Build an image from a Dockerfile. Needs buildkitd to be running. +If Dockerfile is not present and -f is not specified, it will look for Containerfile and build with it. + +```text +finch build [flags] PATH +``` + +## Options + +```text + --build-arg stringArray Set build-time variables + --buildkit-host string BuildKit address [$BUILDKIT_HOST] (default "unix:///run/buildkit/buildkitd.sock") + --cache-from stringArray External cache sources (eg. user/app:cache, type=local,src=path/to/dir) + --cache-to stringArray Cache export destinations (eg. user/app:cache, type=local,dest=path/to/dir) + -f, --file string Name of the Dockerfile + -h, --help help for build + --iidfile string Write the image ID to the file + --label stringArray Set metadata for an image + --network string Set type of network for build (format:network=default|none|host) (default "default") + --no-cache Do not use cache when building the image + -o, --output string Output destination (format: type=local,dest=path) + --platform strings Set target platform for build (e.g., "amd64", "arm64") + --progress string Set type of progress output (auto, plain, tty). Use plain to show container output (default "auto") + -q, --quiet Suppress the build output and print image ID on success + --rm Remove intermediate containers after a successful build (default true) + --secret stringArray Secret file to expose to the build: id=mysecret,src=/local/secret + --ssh stringArray SSH agent socket or keys to expose to the build (format: default|[=|[,]]) + -t, --tag stringArray Name and optionally a tag in the 'name:tag' format + --target string Set the target build stage to build +``` diff --git a/docs/cmd/finch_builder.md b/docs/cmd/finch_builder.md new file mode 100644 index 000000000..f184efa3e --- /dev/null +++ b/docs/cmd/finch_builder.md @@ -0,0 +1,21 @@ +# finch builder + +Manage builds + +```text +finch builder [flags] +``` + +## Commands + +```text + build Build an image from a Dockerfile. Needs buildkitd to be running. + debug Debug Dockerfile + prune Clean up BuildKit build cache +``` + +## Options + +```text + -h, --help help for builder +``` diff --git a/docs/cmd/finch_commit.md b/docs/cmd/finch_commit.md new file mode 100644 index 000000000..a1af07dcc --- /dev/null +++ b/docs/cmd/finch_commit.md @@ -0,0 +1,17 @@ +# finch commit + +Create a new image from a container's changes + +```text +finch commit [flags] CONTAINER REPOSITORY[:TAG] +``` + +## Options + +```text + -a, --author string Author (e.g., "finch contributor ") + -c, --change stringArray Apply Dockerfile instruction to the created image (supported directives: [CMD, ENTRYPOINT]) + -h, --help help for commit + -m, --message string Commit message + -p, --pause Pause container during commit (default true) +``` diff --git a/docs/cmd/finch_completion_bash.md b/docs/cmd/finch_completion_bash.md new file mode 100644 index 000000000..f23daf008 --- /dev/null +++ b/docs/cmd/finch_completion_bash.md @@ -0,0 +1,25 @@ +# finch completion bash + +Generate the autocompletion script for the bash shell. + +This script depends on the 'bash-completion' package. +If it is not installed already, you can install it via your OS's package manager. + +To load completions in your current shell session: + + source <(finch completion bash) + +To load completions for every new session, execute once: + +#### + +```text + finch completion bash +``` + +## Options + +```text + -h, --help help for bash + --no-descriptions disable completion descriptions +``` diff --git a/docs/cmd/finch_completion_fish.md b/docs/cmd/finch_completion_fish.md new file mode 100644 index 000000000..7bd00d9f9 --- /dev/null +++ b/docs/cmd/finch_completion_fish.md @@ -0,0 +1,24 @@ +# finch completion fish + +Generate the autocompletion script for the fish shell. + +To load completions in your current shell session: + + finch completion fish | source + +To load completions for every new session, execute once: + + finch completion fish > ~/.config/fish/completions/finch.fish + +You will need to start a new shell for this setup to take effect. + +```text + finch completion fish [flags] +``` + +## Options + +```text + -h, --help help for fish + --no-descriptions disable completion descriptions +``` diff --git a/docs/cmd/finch_completion_powershell.md b/docs/cmd/finch_completion_powershell.md new file mode 100644 index 000000000..2665ec6b4 --- /dev/null +++ b/docs/cmd/finch_completion_powershell.md @@ -0,0 +1,21 @@ +# finch completion powershell + +Generate the autocompletion script for powershell. + +To load completions in your current shell session: + + finch completion powershell | Out-String | Invoke-Expression + +To load completions for every new session, add the output of the above command +to your powershell profile. + +```text + finch completion powershell [flags] +``` + +## Options + +```text + -h, --help help for powershell + --no-descriptions disable completion descriptions +``` diff --git a/docs/cmd/finch_completion_zsh.md b/docs/cmd/finch_completion_zsh.md new file mode 100644 index 000000000..0ad834d53 --- /dev/null +++ b/docs/cmd/finch_completion_zsh.md @@ -0,0 +1,27 @@ +# finch completion zsh + +Generate the autocompletion script for the zsh shell. + +If shell completion is not already enabled in your environment you will need +to enable it. You can execute the following once: + + echo "autoload -U compinit; compinit" >> ~/.zshrc + +To load completions in your current shell session: + + source <(finch completion zsh) + +To load completions for every new session, execute once: + +#### + +```text + finch completion zsh [flags] +``` + +## Options + +```text + -h, --help help for zsh + --no-descriptions disable completion descriptions +``` diff --git a/docs/cmd/finch_compose.md b/docs/cmd/finch_compose.md new file mode 100644 index 000000000..1b6925380 --- /dev/null +++ b/docs/cmd/finch_compose.md @@ -0,0 +1,48 @@ +# finch compose + +Compose + +```text +finch compose [flags] COMMAND +``` + +## Commands + +```text + build Build or rebuild services + config Validate and view the Compose file + cp Copy files/folders between a service container and the local filesystem + create Creates containers for one or more services + down Remove containers and associated resources + exec Execute a command in a running container of the service + images List images used by created containers in services + kill Force stop service containers + logs Show logs of running containers + pause Pause all processes within containers of service(s). They can be unpaused with finch compose unpause + port Print the public port for a port binding + ps List containers of services + pull Pull service images + push Push service images + restart Restart containers of given (or all) services + rm Remove stopped service containers + run Run a one-off command on a service + start Start existing containers for service(s) + stop Stop running containers without removing them. + top Display the running processes of service containers + unpause Unpause all processes within containers of service(s). + up Create and start containers + version Show the Compose version information +``` + +## Options + +```text + --env-file string Specify an alternate environment file + -f, --f stringArray Alias of --file + --file stringArray Specify an alternate compose file + -h, --help help for compose + --ipfs-address string multiaddr of IPFS API (default uses $IPFS_PATH env variable if defined or local directory ~/.ipfs) + --profile stringArray Specify a profile to enable + --project-directory string Specify an alternate working directory + -p, --project-name string Specify an alternate project name +``` diff --git a/docs/cmd/finch_container.md b/docs/cmd/finch_container.md new file mode 100644 index 000000000..3aa6daa16 --- /dev/null +++ b/docs/cmd/finch_container.md @@ -0,0 +1,40 @@ +# finch container + +Manage containers + +```text +finch container [flags] +``` + +## Commands + +```text + attach Attach stdin, stdout, and stderr to a running container. + commit Create a new image from a container's changes + cp Copy files/folders between a running container and the local filesystem. + create Create a new container. Optionally specify "ipfs://" or "ipns://" scheme to pull image from IPFS. + exec Run a command in a running container + inspect Display detailed information on one or more containers. + kill Kill one or more running containers + logs Fetch the logs of a container. Expected to be used with 'finch run -d'. + ls List containers + pause Pause all processes within one or more containers + port List port mappings or a specific mapping for the container + prune Remove all stopped containers + rename rename a container + restart Restart one or more running containers + rm Remove one or more containers + run Run a command in a new container. Optionally specify "ipfs://" or "ipns://" scheme to pull image from IPFS. + start Start one or more running containers + stats Display a live stream of container(s) resource usage statistics. + stop Stop one or more running containers + unpause Unpause all processes within one or more containers + update Update one or more running containers + wait Block until one or more containers stop, then print their exit codes. +``` + +## Options + +```text + -h, --help help for container +``` diff --git a/docs/cmd/finch_cp.md b/docs/cmd/finch_cp.md new file mode 100644 index 000000000..cc82dfb55 --- /dev/null +++ b/docs/cmd/finch_cp.md @@ -0,0 +1,18 @@ +# finch cp + +Copy files/folders between a running container and the local filesystem. +This command requires 'tar' to be installed on the host (not in the container). +Using GNU tar is recommended. +The path of the 'tar' binary can be specified with an environment variable '$TAR'. + +```text +finch cp [flags] CONTAINER:SRC_PATH DEST_PATH|- + finch cp [flags] SRC_PATH|- CONTAINER:DEST_PATH +``` + +## Options + +```text + -L, --follow-link Always follow symbolic link in SRC_PATH. + -h, --help help for cp +``` diff --git a/docs/cmd/finch_create.md b/docs/cmd/finch_create.md new file mode 100644 index 000000000..8aabc79f6 --- /dev/null +++ b/docs/cmd/finch_create.md @@ -0,0 +1,95 @@ +# finch create + +Create a new container. Optionally specify "ipfs://" or "ipns://" scheme to pull image from IPFS. + +```text +finch create [flags] IMAGE [COMMAND] [ARG...] +``` + +## Options + +```text + --add-host strings Add a custom host-to-IP mapping (host:ip) + --blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0) + --cap-add strings Add Linux capabilities + --cap-drop strings Drop Linux capabilities + --cgroup-conf strings Configure cgroup v2 (key=value) + --cgroup-parent string Optional parent cgroup for the container + --cgroupns string Cgroup namespace to use, the default depends on the cgroup version ("host"|"private") (default "private") + --cidfile string Write the container ID to the file + --cosign-certificate-identity string The identity expected in a valid Fulcio certificate for --verify=cosign. Valid values include email address, DNS names, IP addresses, and URIs. Either --cosign-certificate-identity or --cosign-certificate-identity-regexp must be set for keyless flows + --cosign-certificate-identity-regexp string A regular expression alternative to --cosign-certificate-identity for --verify=cosign. Accepts the Go regular expression syntax described at https://golang.org/s/re2syntax. Either --cosign-certificate-identity or --cosign-certificate-identity-regexp must be set for keyless flows + --cosign-certificate-oidc-issuer string The OIDC issuer expected in a valid Fulcio certificate for --verify=cosign, e.g. https://token.actions.githubusercontent.com or https://oauth2.sigstore.dev/auth. Either --cosign-certificate-oidc-issuer or --cosign-certificate-oidc-issuer-regexp must be set for keyless flows + --cosign-certificate-oidc-issuer-regexp string A regular expression alternative to --certificate-oidc-issuer for --verify=cosign. Accepts the Go regular expression syntax described at https://golang.org/s/re2syntax. Either --cosign-certificate-oidc-issuer or --cosign-certificate-oidc-issuer-regexp must be set for keyless flows + --cosign-key string Path to the public key file, KMS, URI or Kubernetes Secret for --verify=cosign + --cpu-period uint Limit CPU CFS (Completely Fair Scheduler) period + --cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota (default -1) + --cpu-shares uint CPU shares (relative weight) + --cpus float Number of CPUs + --cpuset-cpus string CPUs in which to allow execution (0-3, 0,1) + --cpuset-mems string MEMs in which to allow execution (0-3, 0,1) + --detach-keys string Override the default detach keys (default "ctrl-p,ctrl-q") + --device strings Add a host device to the container + --dns strings Set custom DNS servers + --dns-opt strings Set DNS options + --dns-option strings Set DNS options + --dns-search strings Set custom DNS search domains + --entrypoint stringArray Overwrite the default ENTRYPOINT of the image + -e, --env stringArray Set environment variables + --env-file strings Set environment variables from file + --gpus stringArray GPU devices to add to the container ('all' to pass all GPUs) + --group-add strings Add additional groups to join + --help show help + -h, --hostname string Container host name + --init Run an init process inside the container, Default to use tini + --init-binary string The custom binary to use as the init process (default "tini") + -i, --interactive Keep STDIN open even if not attached + --ip string IPv4 address to assign to the container + --ipc string IPC namespace to use ("host"|"private") + --ipfs-address string multiaddr of IPFS API (default uses $IPFS_PATH env variable if defined or local directory ~/.ipfs) + --isolation string Specify isolation technology for container. On Linux the only valid value is default. Windows options are host, process and hyperv with process isolation as the default (default "default") + --kernel-memory string Kernel memory limit (deprecated) + -l, --label stringArray Set metadata on container + --label-file strings Set metadata on container from file + --log-driver string Logging driver for the container. Default is json-file. It also supports logURI (eg: --log-driver binary://) (default "json-file") + --log-opt stringArray Log driver options + --mac-address string MAC address to assign to the container + -m, --memory string Memory limit + --memory-reservation string Memory soft limit + --memory-swap string Swap limit equal to memory plus swap: '-1' to enable unlimited swap + --memory-swappiness int Tune container memory swappiness (0 to 100) (default -1) (default -1) + --mount stringArray Attach a filesystem mount to the container + --name string Assign a name to the container + --net strings Connect a container to a network ("bridge"|"host"|"none"|) (default [bridge]) + --network strings Connect a container to a network ("bridge"|"host"|"none"|"container:"|) (default [bridge]) + --oom-kill-disable Disable OOM Killer + --oom-score-adj int Tune container’s OOM preferences (-1000 to 1000, rootless: 100 to 1000) + --pid string PID namespace to use + --pidfile string file path to write the task's pid + --pids-limit int Tune container pids limit (set -1 for unlimited) (default -1) + --platform string Set platform (e.g. "amd64", "arm64") + --privileged Give extended privileges to this container + -p, --publish strings Publish a container's port(s) to the host + --pull string Pull image before running ("always"|"missing"|"never") (default "missing") + --rdt-class string Name of the RDT class (or CLOS) to associate the container with + --read-only Mount the container's root filesystem as read only + --restart string Restart policy to apply when a container exits (implemented values: "no"|"always|on-failure:n|unless-stopped") (default "no") + --rm Automatically remove the container when it exits + --rootfs The first argument is not an image but the rootfs to the exploded container + --runtime string Runtime to use for this container, e.g. "crun", or "io.containerd.runsc.v1" (default "io.containerd.runc.v2") + --security-opt stringArray Security options + --shm-size string Size of /dev/shm + --stop-signal string Signal to stop a container (default "SIGTERM") + --stop-timeout int Timeout (in seconds) to stop a container + --sysctl stringArray Sysctl options + --tmpfs stringArray Mount a tmpfs directory + -t, --tty Allocate a pseudo-TTY + --ulimit strings Ulimit options + --umask string Set the umask inside the container. Defaults to 0022 + -u, --user string Username or UID (format: [:]) + --uts string UTS namespace to use + --verify string Verify the image (none|cosign|notation) (default "none") + -v, --volume stringArray Bind mount a volume + --volumes-from stringArray Mount volumes from the specified container(s) + -w, --workdir string Working directory inside the container +``` diff --git a/docs/cmd/finch_events.md b/docs/cmd/finch_events.md new file mode 100644 index 000000000..e061afcf3 --- /dev/null +++ b/docs/cmd/finch_events.md @@ -0,0 +1,14 @@ +# finch events + +Get real time events from the server + +```text +finch events [flags] +``` + +## Options + +```text + --format string Format the output using the given Go template, e.g, '{{json .}}' + -h, --help help for events +``` diff --git a/docs/cmd/finch_exec.md b/docs/cmd/finch_exec.md new file mode 100644 index 000000000..d5f3c09b9 --- /dev/null +++ b/docs/cmd/finch_exec.md @@ -0,0 +1,21 @@ +# finch exec + +Run a command in a running container + +```text +finch exec [flags] CONTAINER COMMAND [ARG...] +``` + +## Options + +```text + -d, --detach Detached mode: run command in the background + -e, --env stringArray Set environment variables + --env-file strings Set environment variables from file + -h, --help help for exec + -i, --interactive Keep STDIN open even if not attached + --privileged Give extended privileges to the command + -t, --tty Allocate a pseudo-TTY + -u, --user string Username or UID (format: [:]) + -w, --workdir string Working directory inside the container +``` diff --git a/docs/cmd/finch_help.md b/docs/cmd/finch_help.md new file mode 100644 index 000000000..f70168002 --- /dev/null +++ b/docs/cmd/finch_help.md @@ -0,0 +1,14 @@ +# finch help + +Help provides help for any command in the application. +Simply type finch help [path to command] for full details. + +```text + finch help [command] [flags] +``` + +## Options + +```text + -h, --help help for help +``` diff --git a/docs/cmd/finch_history.md b/docs/cmd/finch_history.md new file mode 100644 index 000000000..a7be4cfb6 --- /dev/null +++ b/docs/cmd/finch_history.md @@ -0,0 +1,16 @@ +# finch history + +Show the history of an image + +```text +finch history [flags] IMAGE +``` + +## Options + +```text + -f, --format string Format the output using the given Go template, e.g, '{{json .}}' + -h, --help help for history + --no-trunc Don't truncate output + -q, --quiet Only show numeric IDs +``` diff --git a/docs/cmd/finch_image.md b/docs/cmd/finch_image.md new file mode 100644 index 000000000..65463aa1f --- /dev/null +++ b/docs/cmd/finch_image.md @@ -0,0 +1,32 @@ +# finch image + +Manage images + +```text +finch image [flags] +``` + +## Commands + +```text + build Build an image from a Dockerfile. Needs buildkitd to be running. + convert convert an image + decrypt decrypt an image + encrypt encrypt image layers + history Show the history of an image + inspect Display detailed information on one or more images. + load Load an image from a tar archive or STDIN + ls List images + prune Remove unused images + pull Pull an image from a registry. Optionally specify "ipfs://" or "ipns://" scheme to pull image from IPFS. + push Push an image or a repository to a registry. Optionally specify "ipfs://" or "ipns://" scheme to push image to IPFS. + rm Remove one or more images + save Save one or more images to a tar archive (streamed to STDOUT by default) + tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE +``` + +## Options + +```text + -h, --help help for image +``` diff --git a/docs/cmd/finch_images.md b/docs/cmd/finch_images.md new file mode 100644 index 000000000..e8afd62d5 --- /dev/null +++ b/docs/cmd/finch_images.md @@ -0,0 +1,31 @@ +# finch images + +List images + +## Properties + +- REPOSITORY: Repository +- TAG: Tag +- NAME: Name of the image, --names for skip parsing as repository and tag. +- IMAGE ID: OCI Digest. Usually different from Docker image ID. Shared for multi-platform images. +- CREATED: Created time +- PLATFORM: Platform +- SIZE: Size of the unpacked snapshots +- BLOB SIZE: Size of the blobs (such as layer tarballs) in the content store + +```text +finch images [flags] [REPOSITORY[:TAG]] +``` + +## Options + +```text + -a, --all (unimplemented yet, always true) (default true) + --digests Show digests (compatible with Docker, unlike ID) + -f, --filter strings Filter output based on conditions provided + --format string Format the output using the given Go template, e.g, '{{json .}}', 'wide' + -h, --help help for images + --names Show image names + --no-trunc Don't truncate output + -q, --quiet Only show numeric IDs +``` diff --git a/docs/cmd/finch_info.md b/docs/cmd/finch_info.md new file mode 100644 index 000000000..d86ec8cb8 --- /dev/null +++ b/docs/cmd/finch_info.md @@ -0,0 +1,15 @@ +# finch info + +Display system-wide information + +```text +finch info [flags] +``` + +## Options + +```text + -f, --format string Format the output using the given Go template, e.g, '{{json .}}' + -h, --help help for info + --mode string Information mode, "dockercompat" for Docker-compatible output, "native" for containerd-native output (default "dockercompat") +``` diff --git a/docs/cmd/finch_inspect.md b/docs/cmd/finch_inspect.md new file mode 100644 index 000000000..758a4177a --- /dev/null +++ b/docs/cmd/finch_inspect.md @@ -0,0 +1,16 @@ +# finch inspect + +Return low-level information on objects. + +```text +finch inspect [flags] +``` + +## Options + +```text + -f, --format string Format the output using the given Go template, e.g, '{{json .}}' + -h, --help help for inspect + --mode string Inspect mode, "dockercompat" for Docker-compatible output, "native" for containerd-native output (default "dockercompat") + --type string Return JSON for specified type +``` diff --git a/docs/cmd/finch_kill.md b/docs/cmd/finch_kill.md new file mode 100644 index 000000000..536fcc44c --- /dev/null +++ b/docs/cmd/finch_kill.md @@ -0,0 +1,14 @@ +# finch kill + +Kill one or more running containers + +```text +finch kill [flags] CONTAINER [CONTAINER, ...] +``` + +## Options + +```text + -h, --help help for kill + -s, --signal string Signal to send to the container (default "KILL") +``` diff --git a/docs/cmd/finch_load.md b/docs/cmd/finch_load.md new file mode 100644 index 000000000..d60dfc636 --- /dev/null +++ b/docs/cmd/finch_load.md @@ -0,0 +1,16 @@ +# finch load + +Supports both Docker Image Spec v1.2 and OCI Image Spec v1.0. + +```text +finch load [flags] +``` + +## Options + +```text + --all-platforms Import content for all platforms + -h, --help help for load + -i, --input string Read from tar archive file, instead of STDIN + --platform strings Import content for a specific platform +``` diff --git a/docs/cmd/finch_login.md b/docs/cmd/finch_login.md new file mode 100644 index 000000000..d8ca14965 --- /dev/null +++ b/docs/cmd/finch_login.md @@ -0,0 +1,16 @@ +# finch login + +Log in to a container registry + +```text +finch login [flags] [SERVER] +``` + +## Options + +```text + -h, --help help for login + -p, --password string Password + --password-stdin Take the password from stdin + -u, --username string Username +``` diff --git a/docs/cmd/finch_logout.md b/docs/cmd/finch_logout.md new file mode 100644 index 000000000..39346977c --- /dev/null +++ b/docs/cmd/finch_logout.md @@ -0,0 +1,13 @@ +# finch logout + +Log out from a container registry + +```text +finch logout [flags] [SERVER] +``` + +## Options + +```text + -h, --help help for logout +``` diff --git a/docs/cmd/finch_logs.md b/docs/cmd/finch_logs.md new file mode 100644 index 000000000..39efc2773 --- /dev/null +++ b/docs/cmd/finch_logs.md @@ -0,0 +1,23 @@ +# finch logs + +Fetch the logs of a container. + +The following containers are supported: +- Containers created with 'finch run -d'. The log is currently empty for containers created without '-d'. +- Containers created with 'finch compose'. +- Containers created with Kubernetes (EXPERIMENTAL). + +```text +finch logs [flags] CONTAINER +``` + +## Options + +```text + -f, --follow Follow log output + -h, --help help for logs + --since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) + -n, --tail string Number of lines to show from the end of the logs (default "all") + -t, --timestamps Show timestamps + --until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) +``` diff --git a/docs/cmd/finch_network.md b/docs/cmd/finch_network.md new file mode 100644 index 000000000..1fb3b0415 --- /dev/null +++ b/docs/cmd/finch_network.md @@ -0,0 +1,23 @@ +# finch network + +Manage networks + +```text +finch network [flags] +``` + +## Commands + +```text + create Create a network + inspect Display detailed information on one or more networks + ls List networks + prune Remove all unused networks + rm Remove one or more networks +``` + +## Options + +```text + -h, --help help for network +``` diff --git a/docs/cmd/finch_pause.md b/docs/cmd/finch_pause.md new file mode 100644 index 000000000..13231d848 --- /dev/null +++ b/docs/cmd/finch_pause.md @@ -0,0 +1,13 @@ +# finch pause + +Pause all processes within one or more containers + +```text +finch pause [flags] CONTAINER [CONTAINER, ...] +``` + +## Options + +```text + -h, --help help for pause +``` diff --git a/docs/cmd/finch_port.md b/docs/cmd/finch_port.md new file mode 100644 index 000000000..94ba2d781 --- /dev/null +++ b/docs/cmd/finch_port.md @@ -0,0 +1,13 @@ +# finch port + +List port mappings or a specific mapping for the container + +```text +finch port [flags] CONTAINER [PRIVATE_PORT[/PROTO]] +``` + +## Options + +```text + -h, --help help for port +``` diff --git a/docs/cmd/finch_ps.md b/docs/cmd/finch_ps.md new file mode 100644 index 000000000..a4dda03dd --- /dev/null +++ b/docs/cmd/finch_ps.md @@ -0,0 +1,21 @@ +# finch ps + +List containers + +```text +finch ps [flags] +``` + +## Options + +```text + -a, --all Show all containers (default shows just running) + -f, --filter strings Filter matches containers based on given conditions + --format string Format the output using the given Go template, e.g, '{{json .}}', 'wide' + -h, --help help for ps + -n, --last int Show n last created containers (includes all states) (default -1) + -l, --latest Show the latest created container (includes all states) + --no-trunc Don't truncate output + -q, --quiet Only display container IDs + -s, --size Display total file sizes +``` diff --git a/docs/cmd/finch_pull.md b/docs/cmd/finch_pull.md new file mode 100644 index 000000000..7c5b0366b --- /dev/null +++ b/docs/cmd/finch_pull.md @@ -0,0 +1,24 @@ +# finch pull + +Pull an image from a registry. Optionally specify "ipfs://" or "ipns://" scheme to pull image from IPFS. + +```text +finch pull [flags] NAME[:TAG] +``` + +## Options + +```text + --all-platforms Pull content for all platforms + --cosign-certificate-identity string The identity expected in a valid Fulcio certificate for --verify=cosign. Valid values include email address, DNS names, IP addresses, and URIs. Either --cosign-certificate-identity or --cosign-certificate-identity-regexp must be set for keyless flows + --cosign-certificate-identity-regexp string A regular expression alternative to --cosign-certificate-identity for --verify=cosign. Accepts the Go regular expression syntax described at https://golang.org/s/re2syntax. Either --cosign-certificate-identity or --cosign-certificate-identity-regexp must be set for keyless flows + --cosign-certificate-oidc-issuer string The OIDC issuer expected in a valid Fulcio certificate for --verify=cosign,, e.g. https://token.actions.githubusercontent.com or https://oauth2.sigstore.dev/auth. Either --cosign-certificate-oidc-issuer or --cosign-certificate-oidc-issuer-regexp must be set for keyless flows + --cosign-certificate-oidc-issuer-regexp string A regular expression alternative to --certificate-oidc-issuer for --verify=cosign,. Accepts the Go regular expression syntax described at https://golang.org/s/re2syntax. Either --cosign-certificate-oidc-issuer or --cosign-certificate-oidc-issuer-regexp must be set for keyless flows + --cosign-key string Path to the public key file, KMS, URI or Kubernetes Secret for --verify=cosign + -h, --help help for pull + --ipfs-address string multiaddr of IPFS API (default uses $IPFS_PATH env variable if defined or local directory ~/.ipfs) + --platform strings Pull content for a specific platform + -q, --quiet Suppress verbose output + --unpack string Unpack the image for the current single platform (auto/true/false) (default "auto") + --verify string Verify the image (none|cosign|notation) (default "none") +``` diff --git a/docs/cmd/finch_push.md b/docs/cmd/finch_push.md new file mode 100644 index 000000000..e2ba4a661 --- /dev/null +++ b/docs/cmd/finch_push.md @@ -0,0 +1,25 @@ +# finch push + +Push an image or a repository to a registry. Optionally specify "ipfs://" or "ipns://" scheme to push image to IPFS. + +```text +finch push [flags] NAME[:TAG] +``` + +## Options + +```text + --all-platforms Push content for all platforms + --allow-nondistributable-artifacts Allow pushing images with non-distributable blobs + --cosign-key string Path to the private key file, KMS URI or Kubernetes Secret for --sign=cosign + --estargz Convert the image into eStargz + -h, --help help for push + --ipfs-address string multiaddr of IPFS API (default uses $IPFS_PATH env variable if defined or local directory ~/.ipfs) + --ipfs-ensure-image Ensure the entire contents of the image is locally available before push (default true) + --notation-key-name string Signing key name for a key previously added to notation's key list for --sign=notation + --platform strings Push content for a specific platform + -q, --quiet Suppress verbose output + --sign string Sign the image (none|cosign|notation (default "none") + --soci-min-layer-size int Minimum layer size to build zTOC for. Smaller layers won't have zTOC and not lazy pulled. Default is 10 MiB. (default -1) + --soci-span-size int Span size that soci index uses to segment layer data. Default is 4 MiB. (default -1) +``` diff --git a/docs/cmd/finch_restart.md b/docs/cmd/finch_restart.md new file mode 100644 index 000000000..78881a81a --- /dev/null +++ b/docs/cmd/finch_restart.md @@ -0,0 +1,14 @@ +# finch restart + +Restart one or more running containers + +```text +finch restart [flags] CONTAINER [CONTAINER, ...] +``` + +## Options + +```text + -h, --help help for restart + -t, --time uint Seconds to wait for stop before killing it (default 10) +``` diff --git a/docs/cmd/finch_rm.md b/docs/cmd/finch_rm.md new file mode 100644 index 000000000..a99986707 --- /dev/null +++ b/docs/cmd/finch_rm.md @@ -0,0 +1,15 @@ +# finch rm + +Remove one or more containers + +```text +finch rm [flags] CONTAINER [CONTAINER, ...] +``` + +## Options + +```text + -f, --force Force the removal of a running|paused|unknown container (uses SIGKILL) + -h, --help help for rm + -v, --volumes Remove volumes associated with the container +``` diff --git a/docs/cmd/finch_rmi.md b/docs/cmd/finch_rmi.md new file mode 100644 index 000000000..a9e6bbad0 --- /dev/null +++ b/docs/cmd/finch_rmi.md @@ -0,0 +1,15 @@ +# finch rmi + +Remove one or more images + +```text +finch rmi [flags] IMAGE [IMAGE, ...] +``` + +## Options + +```text + --async Asynchronous mode + -f, --force Force removal of the image + -h, --help help for rmi +``` diff --git a/docs/cmd/finch_run.md b/docs/cmd/finch_run.md new file mode 100644 index 000000000..79f004e8a --- /dev/null +++ b/docs/cmd/finch_run.md @@ -0,0 +1,96 @@ +# finch run + +Run a command in a new container. Optionally specify "ipfs://" or "ipns://" scheme to pull image from IPFS. + +```text +finch run [flags] IMAGE [COMMAND] [ARG...] +``` + +## Options + +```text + --add-host strings Add a custom host-to-IP mapping (host:ip) + --blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0) + --cap-add strings Add Linux capabilities + --cap-drop strings Drop Linux capabilities + --cgroup-conf strings Configure cgroup v2 (key=value) + --cgroup-parent string Optional parent cgroup for the container + --cgroupns string Cgroup namespace to use, the default depends on the cgroup version ("host"|"private") (default "private") + --cidfile string Write the container ID to the file + --cosign-certificate-identity string The identity expected in a valid Fulcio certificate for --verify=cosign. Valid values include email address, DNS names, IP addresses, and URIs. Either --cosign-certificate-identity or --cosign-certificate-identity-regexp must be set for keyless flows + --cosign-certificate-identity-regexp string A regular expression alternative to --cosign-certificate-identity for --verify=cosign. Accepts the Go regular expression syntax described at https://golang.org/s/re2syntax. Either --cosign-certificate-identity or --cosign-certificate-identity-regexp must be set for keyless flows + --cosign-certificate-oidc-issuer string The OIDC issuer expected in a valid Fulcio certificate for --verify=cosign, e.g. https://token.actions.githubusercontent.com or https://oauth2.sigstore.dev/auth. Either --cosign-certificate-oidc-issuer or --cosign-certificate-oidc-issuer-regexp must be set for keyless flows + --cosign-certificate-oidc-issuer-regexp string A regular expression alternative to --certificate-oidc-issuer for --verify=cosign. Accepts the Go regular expression syntax described at https://golang.org/s/re2syntax. Either --cosign-certificate-oidc-issuer or --cosign-certificate-oidc-issuer-regexp must be set for keyless flows + --cosign-key string Path to the public key file, KMS, URI or Kubernetes Secret for --verify=cosign + --cpu-period uint Limit CPU CFS (Completely Fair Scheduler) period + --cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota (default -1) + --cpu-shares uint CPU shares (relative weight) + --cpus float Number of CPUs + --cpuset-cpus string CPUs in which to allow execution (0-3, 0,1) + --cpuset-mems string MEMs in which to allow execution (0-3, 0,1) + -d, --detach Run container in background and print container ID + --detach-keys string Override the default detach keys (default "ctrl-p,ctrl-q") + --device strings Add a host device to the container + --dns strings Set custom DNS servers + --dns-opt strings Set DNS options + --dns-option strings Set DNS options + --dns-search strings Set custom DNS search domains + --entrypoint stringArray Overwrite the default ENTRYPOINT of the image + -e, --env stringArray Set environment variables + --env-file strings Set environment variables from file + --gpus stringArray GPU devices to add to the container ('all' to pass all GPUs) + --group-add strings Add additional groups to join + --help show help + -h, --hostname string Container host name + --init Run an init process inside the container, Default to use tini + --init-binary string The custom binary to use as the init process (default "tini") + -i, --interactive Keep STDIN open even if not attached + --ip string IPv4 address to assign to the container + --ipc string IPC namespace to use ("host"|"private") + --ipfs-address string multiaddr of IPFS API (default uses $IPFS_PATH env variable if defined or local directory ~/.ipfs) + --isolation string Specify isolation technology for container. On Linux the only valid value is default. Windows options are host, process and hyperv with process isolation as the default (default "default") + --kernel-memory string Kernel memory limit (deprecated) + -l, --label stringArray Set metadata on container + --label-file strings Set metadata on container from file + --log-driver string Logging driver for the container. Default is json-file. It also supports logURI (eg: --log-driver binary://) (default "json-file") + --log-opt stringArray Log driver options + --mac-address string MAC address to assign to the container + -m, --memory string Memory limit + --memory-reservation string Memory soft limit + --memory-swap string Swap limit equal to memory plus swap: '-1' to enable unlimited swap + --memory-swappiness int Tune container memory swappiness (0 to 100) (default -1) (default -1) + --mount stringArray Attach a filesystem mount to the container + --name string Assign a name to the container + --net strings Connect a container to a network ("bridge"|"host"|"none"|) (default [bridge]) + --network strings Connect a container to a network ("bridge"|"host"|"none"|"container:"|) (default [bridge]) + --oom-kill-disable Disable OOM Killer + --oom-score-adj int Tune container’s OOM preferences (-1000 to 1000, rootless: 100 to 1000) + --pid string PID namespace to use + --pidfile string file path to write the task's pid + --pids-limit int Tune container pids limit (set -1 for unlimited) (default -1) + --platform string Set platform (e.g. "amd64", "arm64") + --privileged Give extended privileges to this container + -p, --publish strings Publish a container's port(s) to the host + --pull string Pull image before running ("always"|"missing"|"never") (default "missing") + --rdt-class string Name of the RDT class (or CLOS) to associate the container with + --read-only Mount the container's root filesystem as read only + --restart string Restart policy to apply when a container exits (implemented values: "no"|"always|on-failure:n|unless-stopped") (default "no") + --rm Automatically remove the container when it exits + --rootfs The first argument is not an image but the rootfs to the exploded container + --runtime string Runtime to use for this container, e.g. "crun", or "io.containerd.runsc.v1" (default "io.containerd.runc.v2") + --security-opt stringArray Security options + --shm-size string Size of /dev/shm + --stop-signal string Signal to stop a container (default "SIGTERM") + --stop-timeout int Timeout (in seconds) to stop a container + --sysctl stringArray Sysctl options + --tmpfs stringArray Mount a tmpfs directory + -t, --tty Allocate a pseudo-TTY + --ulimit strings Ulimit options + --umask string Set the umask inside the container. Defaults to 0022 + -u, --user string Username or UID (format: [:]) + --uts string UTS namespace to use + --verify string Verify the image (none|cosign|notation) (default "none") + -v, --volume stringArray Bind mount a volume + --volumes-from stringArray Mount volumes from the specified container(s) + -w, --workdir string Working directory inside the container +``` diff --git a/docs/cmd/finch_save.md b/docs/cmd/finch_save.md new file mode 100644 index 000000000..15e78e4b4 --- /dev/null +++ b/docs/cmd/finch_save.md @@ -0,0 +1,16 @@ +# finch save + +The archive implements both Docker Image Spec v1.2 and OCI Image Spec v1.0. + +```text +finch save [flags] +``` + +## Options + +```text + --all-platforms Export content for all platforms + -h, --help help for save + -o, --output string Write to a file, instead of STDOUT + --platform strings Export content for a specific platform +``` diff --git a/docs/cmd/finch_start.md b/docs/cmd/finch_start.md new file mode 100644 index 000000000..fa70a3ea2 --- /dev/null +++ b/docs/cmd/finch_start.md @@ -0,0 +1,15 @@ +# finch start + +Start one or more running containers + +```text +finch start [flags] CONTAINER [CONTAINER, ...] +``` + +## Options + +```text + -a, --attach Attach STDOUT/STDERR and forward signals + --detach-keys string Override the default detach keys (default "ctrl-p,ctrl-q") + -h, --help help for start +``` diff --git a/docs/cmd/finch_stats.md b/docs/cmd/finch_stats.md new file mode 100644 index 000000000..93b8c8bfb --- /dev/null +++ b/docs/cmd/finch_stats.md @@ -0,0 +1,17 @@ +# finch stats + +Display a live stream of container(s) resource usage statistics. + +```text +finch stats [flags] +``` + +## Options + +```text + -a, --all Show all containers (default shows just running) + --format string Pretty-print images using a Go template, e.g, '{{json .}}' + -h, --help help for stats + --no-stream Disable streaming stats and only pull the first result + --no-trunc Do not truncate output +``` diff --git a/docs/cmd/finch_stop.md b/docs/cmd/finch_stop.md new file mode 100644 index 000000000..5800177f3 --- /dev/null +++ b/docs/cmd/finch_stop.md @@ -0,0 +1,14 @@ +# finch stop + +Stop one or more running containers + +```text +finch stop [flags] CONTAINER [CONTAINER, ...] +``` + +## Options + +```text + -h, --help help for stop + -t, --time int Seconds to wait before sending a SIGKILL (default 10) +``` diff --git a/docs/cmd/finch_support-bundle_generate.md b/docs/cmd/finch_support-bundle_generate.md new file mode 100644 index 000000000..e2974168f --- /dev/null +++ b/docs/cmd/finch_support-bundle_generate.md @@ -0,0 +1,15 @@ +# finch support-bundle generate + +Generates a collection of logs and configs that can be uploaded to a Github issue to help debug issues. + +```text + finch support-bundle generate [flags] +``` + +## Options + +```text + --exclude stringArray files to exclude from the support bundle. if you specify a base name, all files matching that base name will be excluded. if you specify an absolute or relative path, only exact matches will be excluded + -h, --help help for generate + --include stringArray additional files to include in the support bundle, specified by absolute or relative path. to include a file from the VM, prefix the file path with "vm:" +``` diff --git a/docs/cmd/finch_system.md b/docs/cmd/finch_system.md new file mode 100644 index 000000000..30783bc2b --- /dev/null +++ b/docs/cmd/finch_system.md @@ -0,0 +1,21 @@ +# finch system + +Manage containerd + +```text +finch system [flags] +``` + +## Commands + +```text + events Get real time events from the server + info Display system-wide information + prune Remove unused data +``` + +## Options + +```text + -h, --help help for system +``` diff --git a/docs/cmd/finch_tag.md b/docs/cmd/finch_tag.md new file mode 100644 index 000000000..9afa9abbc --- /dev/null +++ b/docs/cmd/finch_tag.md @@ -0,0 +1,13 @@ +# finch tag + +Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE + +```text +finch tag [flags] SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] +``` + +## Options + +```text + -h, --help help for tag +``` diff --git a/docs/cmd/finch_top.md b/docs/cmd/finch_top.md new file mode 100644 index 000000000..207800903 --- /dev/null +++ b/docs/cmd/finch_top.md @@ -0,0 +1,13 @@ +# finch top + +Display the running processes of a container + +```text +finch top CONTAINER [ps OPTIONS] [flags] +``` + +## Options + +```text + -h, --help help for top +``` diff --git a/docs/cmd/finch_unpause.md b/docs/cmd/finch_unpause.md new file mode 100644 index 000000000..3ed37619a --- /dev/null +++ b/docs/cmd/finch_unpause.md @@ -0,0 +1,13 @@ +# finch unpause + +Unpause all processes within one or more containers + +```text +finch unpause [flags] CONTAINER [CONTAINER, ...] +``` + +## Options + +```text + -h, --help help for unpause +``` diff --git a/docs/cmd/finch_update.md b/docs/cmd/finch_update.md new file mode 100644 index 000000000..829df1317 --- /dev/null +++ b/docs/cmd/finch_update.md @@ -0,0 +1,26 @@ +# finch update + +Update one or more running containers + +```text +finch update [flags] CONTAINER [CONTAINER, ...] +``` + +## Options + +```text + --blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0) + --cpu-period uint Limit CPU CFS (Completely Fair Scheduler) period + --cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota (default -1) + --cpu-shares uint CPU shares (relative weight) + --cpus float Number of CPUs + --cpuset-cpus string CPUs in which to allow execution (0-3, 0,1) + --cpuset-mems string MEMs in which to allow execution (0-3, 0,1) + -h, --help help for update + --kernel-memory string Kernel memory limit (deprecated) + -m, --memory string Memory limit + --memory-reservation string Memory soft limit + --memory-swap string Swap limit equal to memory plus swap: '-1' to enable unlimited swap + --pids-limit int Tune container pids limit (set -1 for unlimited) (default -1) + --restart string Restart policy to apply when a container exits (implemented values: "no"|"always|on-failure:n|unless-stopped") (default "no") +``` diff --git a/docs/cmd/finch_version.md b/docs/cmd/finch_version.md new file mode 100644 index 000000000..9f18cd88f --- /dev/null +++ b/docs/cmd/finch_version.md @@ -0,0 +1,13 @@ +# finch version + +Shows Finch version information + +```text + finch version [flags] +``` + +## Options + +```text + -h, --help help for version +``` diff --git a/docs/cmd/finch_vm_init.md b/docs/cmd/finch_vm_init.md new file mode 100644 index 000000000..00e3e5093 --- /dev/null +++ b/docs/cmd/finch_vm_init.md @@ -0,0 +1,13 @@ +# finch vm init + +Initialize the virtual machine + +```text + finch vm init [flags] +``` + +## Options + +```text + -h, --help help for init +``` diff --git a/docs/cmd/finch_vm_remove.md b/docs/cmd/finch_vm_remove.md new file mode 100644 index 000000000..d027de487 --- /dev/null +++ b/docs/cmd/finch_vm_remove.md @@ -0,0 +1,14 @@ +# finch vm remove + +Remove the virtual machine instance + +```text + finch vm remove [flags] +``` + +## Options + +```text + -f, --force forcibly remove finch VM + -h, --help help for remove +``` diff --git a/docs/cmd/finch_vm_start.md b/docs/cmd/finch_vm_start.md new file mode 100644 index 000000000..720e24ca1 --- /dev/null +++ b/docs/cmd/finch_vm_start.md @@ -0,0 +1,13 @@ +# finch vm start + +Start the virtual machine + +```text + finch vm start [flags] +``` + +## Options + +```text + -h, --help help for start +``` diff --git a/docs/cmd/finch_vm_status.md b/docs/cmd/finch_vm_status.md new file mode 100644 index 000000000..ef43aef59 --- /dev/null +++ b/docs/cmd/finch_vm_status.md @@ -0,0 +1,13 @@ +# finch vm status + +Status of the virtual machine + +```text + finch vm status [flags] +``` + +## Options + +```text + -h, --help help for status +``` diff --git a/docs/cmd/finch_vm_stop.md b/docs/cmd/finch_vm_stop.md new file mode 100644 index 000000000..4ea379834 --- /dev/null +++ b/docs/cmd/finch_vm_stop.md @@ -0,0 +1,14 @@ +# finch vm stop + +Stop the virtual machine + +```text + finch vm stop [flags] +``` + +## Options + +```text + -f, --force forcibly stop finch VM + -h, --help help for stop +``` diff --git a/docs/cmd/finch_volume.md b/docs/cmd/finch_volume.md new file mode 100644 index 000000000..bd79abcc4 --- /dev/null +++ b/docs/cmd/finch_volume.md @@ -0,0 +1,23 @@ +# finch volume + +Manage volumes + +```text +finch volume [flags] +``` + +## Commands + +```text + create Create a volume + inspect Display detailed information on one or more volumes + ls List volumes + prune Remove all unused local volumes + rm Remove one or more volumes +``` + +## Options + +```text + -h, --help help for volume +``` diff --git a/docs/cmd/finch_wait.md b/docs/cmd/finch_wait.md new file mode 100644 index 000000000..fb5af58a8 --- /dev/null +++ b/docs/cmd/finch_wait.md @@ -0,0 +1,13 @@ +# finch wait + +Block until one or more containers stop, then print their exit codes. + +```text +finch wait [flags] CONTAINER [CONTAINER, ...] +``` + +## Options + +```text + -h, --help help for wait +``` diff --git a/pkg/mocks/gen_docs_system_deps.go b/pkg/mocks/gen_docs_system_deps.go new file mode 100644 index 000000000..465e37894 --- /dev/null +++ b/pkg/mocks/gen_docs_system_deps.go @@ -0,0 +1,80 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// Code generated by MockGen. DO NOT EDIT. +// Source: gen_docs.go + +// Package mocks is a generated GoMock package. +package mocks + +import ( + os "os" + reflect "reflect" + + gomock "github.com/golang/mock/gomock" +) + +// GenDocsSystemDeps is a mock of GenDocsSystemDeps interface. +type GenDocsSystemDeps struct { + ctrl *gomock.Controller + recorder *GenDocsSystemDepsMockRecorder +} + +// GenDocsSystemDepsMockRecorder is the mock recorder for GenDocsSystemDeps. +type GenDocsSystemDepsMockRecorder struct { + mock *GenDocsSystemDeps +} + +// NewGenDocsSystemDeps creates a new mock instance. +func NewGenDocsSystemDeps(ctrl *gomock.Controller) *GenDocsSystemDeps { + mock := &GenDocsSystemDeps{ctrl: ctrl} + mock.recorder = &GenDocsSystemDepsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *GenDocsSystemDeps) EXPECT() *GenDocsSystemDepsMockRecorder { + return m.recorder +} + +// Pipe mocks base method. +func (m *GenDocsSystemDeps) Pipe() (*os.File, *os.File, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Pipe") + ret0, _ := ret[0].(*os.File) + ret1, _ := ret[1].(*os.File) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// Pipe indicates an expected call of Pipe. +func (mr *GenDocsSystemDepsMockRecorder) Pipe() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Pipe", reflect.TypeOf((*GenDocsSystemDeps)(nil).Pipe)) +} + +// SetStdout mocks base method. +func (m *GenDocsSystemDeps) SetStdout(arg0 *os.File) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetStdout", arg0) +} + +// SetStdout indicates an expected call of SetStdout. +func (mr *GenDocsSystemDepsMockRecorder) SetStdout(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetStdout", reflect.TypeOf((*GenDocsSystemDeps)(nil).SetStdout), arg0) +} + +// Stdout mocks base method. +func (m *GenDocsSystemDeps) Stdout() *os.File { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stdout") + ret0, _ := ret[0].(*os.File) + return ret0 +} + +// Stdout indicates an expected call of Stdout. +func (mr *GenDocsSystemDepsMockRecorder) Stdout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stdout", reflect.TypeOf((*GenDocsSystemDeps)(nil).Stdout)) +} diff --git a/pkg/system/stdlib.go b/pkg/system/stdlib.go index dc2102971..33b29eb64 100644 --- a/pkg/system/stdlib.go +++ b/pkg/system/stdlib.go @@ -42,6 +42,10 @@ func (s *StdLib) LookupEnv(key string) (string, bool) { return os.LookupEnv(key) } +func (s *StdLib) Pipe() (*os.File, *os.File, error) { + return os.Pipe() +} + func (s *StdLib) Stdin() *os.File { return os.Stdin } @@ -50,6 +54,10 @@ func (s *StdLib) Stdout() *os.File { return os.Stdout } +func (s *StdLib) SetStdout(w *os.File) { + os.Stdout = w +} + func (s *StdLib) Stderr() *os.File { return os.Stderr } diff --git a/pkg/system/system.go b/pkg/system/system.go index 9c589b4da..8143f88c8 100644 --- a/pkg/system/system.go +++ b/pkg/system/system.go @@ -52,6 +52,11 @@ type EnvChecker interface { LookupEnv(key string) (string, bool) } +// PipeGetter mocks out os.Pipe. +type PipeGetter interface { + Pipe() (*os.File, *os.File, error) +} + // StdinGetter mocks out os.Stdin. type StdinGetter interface { Stdin() *os.File @@ -62,6 +67,11 @@ type StdoutGetter interface { Stdout() *os.File } +// StdoutSetter mocks out redirecting os.Stdout. +type StdoutSetter interface { + SetStdout(*os.File) +} + // StderrGetter mocks out os.Stderr. type StderrGetter interface { Stderr() *os.File