exporter: multiple names support in docker exporter

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
docker-19.03
Tonis Tiigi 2019-03-18 17:23:05 -07:00
parent 271f59fe60
commit 84a13a6cfc
2 changed files with 28 additions and 27 deletions

View File

@ -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)

View File

@ -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
}