feat: Add layer selection support to flux pull artifact

Signed-off-by: Pedro Pinho <ptfpinho@hotmail.com>
pull/4790/head
Pedro Pinho 8 months ago
parent 896e0fa46d
commit 07741c1c18
No known key found for this signature in database
GPG Key ID: 401363F069A596A9

@ -33,17 +33,20 @@ var pullArtifactCmd = &cobra.Command{
Use: "artifact", Use: "artifact",
Short: "Pull artifact", Short: "Pull artifact",
Long: withPreviewNote(`The pull artifact command downloads and extracts the OCI artifact content to the given path. Long: withPreviewNote(`The pull artifact command downloads and extracts the OCI artifact content to the given path.
The command can read the credentials from '~/.docker/config.json' but they can also be passed with --creds. It can also login to a supported provider with the --provider flag.`), The command can read the credentials from '~/.docker/config.json' but they can also be passed with --creds. It can also login to a supported provider with the --provider flag.
You can also pull a specific artifact layer by it's index with the --layer-index flag.`),
Example: ` # Pull an OCI artifact created by flux from GHCR Example: ` # Pull an OCI artifact created by flux from GHCR
flux pull artifact oci://ghcr.io/org/manifests/app:v0.0.1 --output ./path/to/local/manifests flux pull artifact oci://ghcr.io/org/manifests/app:v0.0.1 --output ./path/to/local/manifests --layer-index 1
`, `,
RunE: pullArtifactCmdRun, RunE: pullArtifactCmdRun,
} }
type pullArtifactFlags struct { type pullArtifactFlags struct {
output string output string
creds string creds string
provider flags.SourceOCIProvider layerIndex int
provider flags.SourceOCIProvider
} }
var pullArtifactArgs = newPullArtifactFlags() var pullArtifactArgs = newPullArtifactFlags()
@ -57,6 +60,7 @@ func newPullArtifactFlags() pullArtifactFlags {
func init() { func init() {
pullArtifactCmd.Flags().StringVarP(&pullArtifactArgs.output, "output", "o", "", "path where the artifact content should be extracted.") pullArtifactCmd.Flags().StringVarP(&pullArtifactArgs.output, "output", "o", "", "path where the artifact content should be extracted.")
pullArtifactCmd.Flags().StringVar(&pullArtifactArgs.creds, "creds", "", "credentials for OCI registry in the format <username>[:<password>] if --provider is generic") pullArtifactCmd.Flags().StringVar(&pullArtifactArgs.creds, "creds", "", "credentials for OCI registry in the format <username>[:<password>] if --provider is generic")
pullArtifactCmd.Flags().IntVar(&pullArtifactArgs.layerIndex, "layer-index", -1, "specific artifact layer index to pull")
pullArtifactCmd.Flags().Var(&pullArtifactArgs.provider, "provider", sourceOCIRepositoryArgs.provider.Description()) pullArtifactCmd.Flags().Var(&pullArtifactArgs.provider, "provider", sourceOCIRepositoryArgs.provider.Description())
pullCmd.AddCommand(pullArtifactCmd) pullCmd.AddCommand(pullArtifactCmd)
} }
@ -106,7 +110,13 @@ func pullArtifactCmdRun(cmd *cobra.Command, args []string) error {
logger.Actionf("pulling artifact from %s", url) logger.Actionf("pulling artifact from %s", url)
meta, err := ociClient.Pull(ctx, url, pullArtifactArgs.output) pullOptions := []oci.PullOption{}
if pullArtifactArgs.layerIndex != -1 {
logger.Actionf("pulling artifact layer by index %d", pullArtifactArgs.layerIndex)
pullOptions = append(pullOptions, oci.WithPullLayerIndex(pullArtifactArgs.layerIndex))
}
meta, err := ociClient.Pull(ctx, url, pullArtifactArgs.output, pullOptions...)
if err != nil { if err != nil {
return err return err
} }

Loading…
Cancel
Save