From fe8c2780c889b324a7cfb0cdd9b001c586ff8970 Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Fri, 29 Sep 2023 09:25:52 +0200 Subject: [PATCH 1/3] warn user remote resource is disabled Signed-off-by: Nicolas De Loof --- cmd/compose/compose.go | 20 ++++---------------- pkg/remote/git.go | 15 ++++++++++++--- pkg/remote/oci.go | 17 +++++++++++++---- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/cmd/compose/compose.go b/cmd/compose/compose.go index 763b5cf2..7d89db2e 100644 --- a/cmd/compose/compose.go +++ b/cmd/compose/compose.go @@ -252,29 +252,17 @@ func (o *ProjectOptions) ToProject(dockerCli command.Cli, services []string, po } func (o *ProjectOptions) configureRemoteLoaders(dockerCli command.Cli, po []cli.ProjectOptionsFn) ([]cli.ProjectOptionsFn, error) { - enabled, err := remote.GitRemoteLoaderEnabled() + git, err := remote.NewGitRemoteLoader(o.Offline) if err != nil { return nil, err } - if enabled { - git, err := remote.NewGitRemoteLoader(o.Offline) - if err != nil { - return nil, err - } - po = append(po, cli.WithResourceLoader(git)) - } - enabled, err = remote.OCIRemoteLoaderEnabled() + oci, err := remote.NewOCIRemoteLoader(dockerCli, o.Offline) if err != nil { return nil, err } - if enabled { - git, err := remote.NewOCIRemoteLoader(dockerCli, o.Offline) - if err != nil { - return nil, err - } - po = append(po, cli.WithResourceLoader(git)) - } + + po = append(po, cli.WithResourceLoader(git), cli.WithResourceLoader(oci)) return po, nil } diff --git a/pkg/remote/git.go b/pkg/remote/git.go index 3e7c9a1d..b6228286 100644 --- a/pkg/remote/git.go +++ b/pkg/remote/git.go @@ -26,7 +26,6 @@ import ( "strconv" "github.com/adrg/xdg" - "github.com/compose-spec/compose-go/cli" "github.com/compose-spec/compose-go/loader" "github.com/compose-spec/compose-go/types" @@ -34,8 +33,10 @@ import ( "github.com/moby/buildkit/util/gitutil" ) -func GitRemoteLoaderEnabled() (bool, error) { - if v := os.Getenv("COMPOSE_EXPERIMENTAL_GIT_REMOTE"); v != "" { +const GIT_REMOTE_ENABLED = "COMPOSE_EXPERIMENTAL_GIT_REMOTE" + +func gitRemoteLoaderEnabled() (bool, error) { + if v := os.Getenv(GIT_REMOTE_ENABLED); v != "" { enabled, err := strconv.ParseBool(v) if err != nil { return false, fmt.Errorf("COMPOSE_EXPERIMENTAL_GIT_REMOTE environment variable expects boolean value: %w", err) @@ -74,6 +75,14 @@ func (g gitRemoteLoader) Accept(path string) bool { var commitSHA = regexp.MustCompile(`^[a-f0-9]{40}$`) func (g gitRemoteLoader) Load(ctx context.Context, path string) (string, error) { + enabled, err := gitRemoteLoaderEnabled() + if err != nil { + return "", err + } + if !enabled { + return "", fmt.Errorf("experimental git remote resource is disabled. %q must be set", GIT_REMOTE_ENABLED) + } + ref, err := gitutil.ParseGitRef(path) if err != nil { return "", err diff --git a/pkg/remote/oci.go b/pkg/remote/oci.go index 151559bf..4bb1b713 100644 --- a/pkg/remote/oci.go +++ b/pkg/remote/oci.go @@ -26,17 +26,18 @@ import ( "strings" "github.com/adrg/xdg" + "github.com/compose-spec/compose-go/loader" "github.com/distribution/reference" "github.com/docker/buildx/store/storeutil" "github.com/docker/buildx/util/imagetools" "github.com/docker/cli/cli/command" v1 "github.com/opencontainers/image-spec/specs-go/v1" - - "github.com/compose-spec/compose-go/loader" ) -func OCIRemoteLoaderEnabled() (bool, error) { - if v := os.Getenv("COMPOSE_EXPERIMENTAL_OCI_REMOTE"); v != "" { +const OCI_REMOTE_ENABLED = "COMPOSE_EXPERIMENTAL_OCI_REMOTE" + +func ociRemoteLoaderEnabled() (bool, error) { + if v := os.Getenv(OCI_REMOTE_ENABLED); v != "" { enabled, err := strconv.ParseBool(v) if err != nil { return false, fmt.Errorf("COMPOSE_EXPERIMENTAL_OCI_REMOTE environment variable expects boolean value: %w", err) @@ -76,6 +77,14 @@ func (g ociRemoteLoader) Accept(path string) bool { } func (g ociRemoteLoader) Load(ctx context.Context, path string) (string, error) { + enabled, err := ociRemoteLoaderEnabled() + if err != nil { + return "", err + } + if !enabled { + return "", fmt.Errorf("experimental OCI remote resource is disabled. %q must be set", OCI_REMOTE_ENABLED) + } + if g.offline { return "", nil } From 599e4b242a851d61bfe5cb8100329e93ff06417d Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Fri, 29 Sep 2023 10:18:11 +0200 Subject: [PATCH 2/3] extract method to reduce cyclomatic complexity Signed-off-by: Nicolas De Loof --- pkg/remote/oci.go | 77 ++++++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/pkg/remote/oci.go b/pkg/remote/oci.go index 4bb1b713..2a7e622e 100644 --- a/pkg/remote/oci.go +++ b/pkg/remote/oci.go @@ -108,50 +108,57 @@ func (g ociRemoteLoader) Load(ctx context.Context, path string) (string, error) local := filepath.Join(g.cache, descriptor.Digest.Hex()) composeFile := filepath.Join(local, "compose.yaml") if _, err = os.Stat(local); os.IsNotExist(err) { - - err = os.MkdirAll(local, 0o700) - if err != nil { - return "", err - } - - f, err := os.Create(composeFile) - if err != nil { - return "", err - } - defer f.Close() //nolint:errcheck - var manifest v1.Manifest err = json.Unmarshal(content, &manifest) if err != nil { return "", err } - if manifest.ArtifactType != "application/vnd.docker.compose.project" { - return "", fmt.Errorf("%s is not a compose project OCI artifact, but %s", ref.String(), manifest.ArtifactType) - } - - for i, layer := range manifest.Layers { - digested, err := reference.WithDigest(ref, layer.Digest) - if err != nil { - return "", err - } - content, _, err := resolver.Get(ctx, digested.String()) - if err != nil { - return "", err - } - if i > 0 { - _, err = f.Write([]byte("\n---\n")) - if err != nil { - return "", err - } - } - _, err = f.Write(content) - if err != nil { - return "", err - } + s, err2 := g.pullComposeFiles(ctx, local, composeFile, manifest, ref, resolver) + if err2 != nil { + return s, err2 } } return composeFile, nil } +func (g ociRemoteLoader) pullComposeFiles(ctx context.Context, local string, composeFile string, manifest v1.Manifest, ref reference.Named, resolver *imagetools.Resolver) (string, error) { + err := os.MkdirAll(local, 0o700) + if err != nil { + return "", err + } + + f, err := os.Create(composeFile) + if err != nil { + return "", err + } + defer f.Close() //nolint:errcheck + + if manifest.ArtifactType != "application/vnd.docker.compose.project" { + return "", fmt.Errorf("%s is not a compose project OCI artifact, but %s", ref.String(), manifest.ArtifactType) + } + + for i, layer := range manifest.Layers { + digested, err := reference.WithDigest(ref, layer.Digest) + if err != nil { + return "", err + } + content, _, err := resolver.Get(ctx, digested.String()) + if err != nil { + return "", err + } + if i > 0 { + _, err = f.Write([]byte("\n---\n")) + if err != nil { + return "", err + } + } + _, err = f.Write(content) + if err != nil { + return "", err + } + } + return "", nil +} + var _ loader.ResourceLoader = ociRemoteLoader{} From 3d0207ebc840d08df058dfd14292777856554bb7 Mon Sep 17 00:00:00 2001 From: Guillaume Lours <705411+glours@users.noreply.github.com> Date: Wed, 18 Oct 2023 12:42:11 +0200 Subject: [PATCH 3/3] remove uncessary return value of pullComposeFiles function Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> --- pkg/remote/oci.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/pkg/remote/oci.go b/pkg/remote/oci.go index 2a7e622e..9e3a1b73 100644 --- a/pkg/remote/oci.go +++ b/pkg/remote/oci.go @@ -114,51 +114,51 @@ func (g ociRemoteLoader) Load(ctx context.Context, path string) (string, error) return "", err } - s, err2 := g.pullComposeFiles(ctx, local, composeFile, manifest, ref, resolver) + err2 := g.pullComposeFiles(ctx, local, composeFile, manifest, ref, resolver) if err2 != nil { - return s, err2 + return "", err2 } } return composeFile, nil } -func (g ociRemoteLoader) pullComposeFiles(ctx context.Context, local string, composeFile string, manifest v1.Manifest, ref reference.Named, resolver *imagetools.Resolver) (string, error) { +func (g ociRemoteLoader) pullComposeFiles(ctx context.Context, local string, composeFile string, manifest v1.Manifest, ref reference.Named, resolver *imagetools.Resolver) error { err := os.MkdirAll(local, 0o700) if err != nil { - return "", err + return err } f, err := os.Create(composeFile) if err != nil { - return "", err + return err } defer f.Close() //nolint:errcheck if manifest.ArtifactType != "application/vnd.docker.compose.project" { - return "", fmt.Errorf("%s is not a compose project OCI artifact, but %s", ref.String(), manifest.ArtifactType) + return fmt.Errorf("%s is not a compose project OCI artifact, but %s", ref.String(), manifest.ArtifactType) } for i, layer := range manifest.Layers { digested, err := reference.WithDigest(ref, layer.Digest) if err != nil { - return "", err + return err } content, _, err := resolver.Get(ctx, digested.String()) if err != nil { - return "", err + return err } if i > 0 { _, err = f.Write([]byte("\n---\n")) if err != nil { - return "", err + return err } } _, err = f.Write(content) if err != nil { - return "", err + return err } } - return "", nil + return nil } var _ loader.ResourceLoader = ociRemoteLoader{}