package cmd
import (
"context"
"flag"
"fmt"
"io"
"os"
"github.com/openeuler/Conch/internal/cli/client"
)
func PrintImagePullHelp(out io.Writer) {
fmt.Fprintln(out, "Usage:")
fmt.Fprintln(out, " conch image pull [options] <image-name>")
fmt.Fprintln(out, "")
fmt.Fprintln(out, "Description:")
fmt.Fprintln(out, " Pull a standard OCI image into the containerd content store.")
fmt.Fprintln(out, " Conch does not unpack OCI images. Boot Indexes must be pulled with")
fmt.Fprintln(out, " `conch template pull`.")
fmt.Fprintln(out, "")
fmt.Fprintln(out, "Options:")
fmt.Fprintln(out, " -api-url string")
fmt.Fprintln(out, " conchd API base URL (default: conchd unix socket from config)")
fmt.Fprintln(out, " -address string")
fmt.Fprintln(out, " deprecated alias for -api-url")
fmt.Fprintln(out, " -config string")
fmt.Fprintln(out, " config file path (default: auto-detect common config paths)")
fmt.Fprintln(out, " --plain-http")
fmt.Fprintln(out, " allow plain HTTP / disable TLS verification for source image pulls")
fmt.Fprintln(out, " --user string")
fmt.Fprintln(out, " registry credentials in username:password format for source image pulls")
fmt.Fprintln(out, "Example:")
fmt.Fprintln(out, " conch image pull docker.io/library/nginx:latest")
fmt.Fprintln(out, " conch image pull --plain-http --user example-user:example-password docker.io/library/nginx:latest")
}
func RunImagePull(ctx context.Context, args []string) error {
fs := flag.NewFlagSet("image pull", flag.ContinueOnError)
fs.SetOutput(os.Stderr)
apiURL := fs.String("api-url", "", "conchd API base URL")
addr := fs.String("address", "", "deprecated alias for -api-url")
configPath := fs.String("config", "", "config file path")
plainHTTP := fs.Bool("plain-http", false, "allow plain HTTP / disable TLS verification for source image pulls")
user := fs.String("user", "", "registry credentials in username:password format for source image pulls")
fs.Usage = func() { PrintImagePullHelp(os.Stderr) }
if err := fs.Parse(args); err != nil {
return err
}
if fs.NArg() != 1 {
fs.Usage()
return fmt.Errorf("conch image pull: exactly one image name is required")
}
imageName := fs.Arg(0)
username, password, err := ParseRegistryUser(*user)
if err != nil {
return fmt.Errorf("conch image pull: %w", err)
}
conchClient, err := client.New(client.Options{
BaseURL: ResolveConchAPIURL(*apiURL, *addr),
ConfigPath: *configPath,
})
if err != nil {
return fmt.Errorf("conch image pull: create API client: %w", err)
}
fmt.Println("------------------------------------------------------------")
fmt.Printf("Pulling image: %s\n", imageName)
if err := conchClient.PullImage(ctx, client.PullImageRequest{
ImageName: imageName,
PlainHTTP: *plainHTTP,
Username: username,
Password: password,
}); err != nil {
return fmt.Errorf("conch image pull: %w", err)
}
fmt.Printf("Pulled image: %s\n", imageName)
return nil
}