From 84a13a6cfc9df7e5f90808c306b7a4da9d55adb9 Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Mon, 18 Mar 2019 17:23:05 -0700 Subject: [PATCH] exporter: multiple names support in docker exporter Signed-off-by: Tonis Tiigi --- client/client_test.go | 2 +- exporter/oci/export.go | 53 +++++++++++++++++++++--------------------- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/client/client_test.go b/client/client_test.go index f5473322..cf41ac20 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -355,7 +355,7 @@ func testFrontendImageNaming(t *testing.T, sb integration.Sandbox) { }, ExporterDocker: func(out, imageName string, exporterResponse map[string]string) { require.Contains(t, exporterResponse, "image.name") - require.Equal(t, exporterResponse["image.name"], imageName) + require.Equal(t, exporterResponse["image.name"], "docker.io/library/"+imageName) dt, err := ioutil.ReadFile(out) require.NoError(t, err) diff --git a/exporter/oci/export.go b/exporter/oci/export.go index c73f8fc8..3349157a 100644 --- a/exporter/oci/export.go +++ b/exporter/oci/export.go @@ -43,17 +43,6 @@ func New(opt Opt) (exporter.Exporter, error) { return im, nil } -func normalize(name string) (string, error) { - if name == "" { - return "", nil - } - parsed, err := reference.ParseNormalizedNamed(name) - if err != nil { - return "", errors.Wrapf(err, "failed to parse %s", name) - } - return reference.TagNameOnly(parsed).String(), nil -} - func (e *imageExporter) Resolve(ctx context.Context, opt map[string]string) (exporter.ExporterInstance, error) { id := session.FromContext(ctx) if id == "" { @@ -142,11 +131,16 @@ func (e *imageExporterInstance) Export(ctx context.Context, src exporter.Source) e.name = string(n) } - if e.name != "" { - resp["image.name"] = e.name + names, err := normalizedNames(e.name) + if err != nil { + return nil, err } - exp, err := getExporter(e.opt.Variant, e.name) + if len(names) != 0 { + resp["image.name"] = strings.Join(names, ",") + } + + exp, err := getExporter(e.opt.Variant, names) if err != nil { return nil, err } @@ -180,25 +174,32 @@ func oneOffProgress(ctx context.Context, id string) func(err error) error { } } -func getExporter(variant ExporterVariant, name string) (images.Exporter, error) { +func getExporter(variant ExporterVariant, names []string) (images.Exporter, error) { switch variant { case VariantOCI: - if name != "" { + if len(names) != 0 { return nil, errors.New("oci exporter cannot export named image") } return oci.ResolveV1ExportOpt(oci.WithAllPlatforms(true)) case VariantDocker: - names := strings.Split(name, ",") - var tagNames = make([]string, len(names)) - var err error - for i, nm := range names { - tagNames[i], err = normalize(nm) - if err != nil { - return nil, err - } - } - return &dockerexporter.DockerExporter{Names: tagNames}, nil + return &dockerexporter.DockerExporter{Names: names}, nil default: return nil, errors.Errorf("invalid variant %q", variant) } } + +func normalizedNames(name string) ([]string, error) { + if name == "" { + return nil, nil + } + names := strings.Split(name, ",") + var tagNames = make([]string, len(names)) + for i, name := range names { + parsed, err := reference.ParseNormalizedNamed(name) + if err != nil { + return nil, errors.Wrapf(err, "failed to parse %s", name) + } + tagNames[i] = reference.TagNameOnly(parsed).String() + } + return tagNames, nil +}