reason: sync patches from upstream, including relocate export package, clean code for tests and golint Signed-off-by: DCCooper <1866858@gmail.com>
154 lines
5.2 KiB
Diff
154 lines
5.2 KiB
Diff
From 0715aadaf5a5850d5ff1e6f74f7abafc4418f4d5 Mon Sep 17 00:00:00 2001
|
|
From: xingweizheng <xingweizheng@huawei.com>
|
|
Date: Sun, 29 Aug 2021 05:05:10 +0800
|
|
Subject: [PATCH 14/20] relocation exporter package and remove unused const
|
|
|
|
---
|
|
exporter/common.go | 91 +++++++++++++++++++++-------------------------
|
|
1 file changed, 42 insertions(+), 49 deletions(-)
|
|
|
|
diff --git a/exporter/common.go b/exporter/common.go
|
|
index cd976d21..b58f59cb 100644
|
|
--- a/exporter/common.go
|
|
+++ b/exporter/common.go
|
|
@@ -27,7 +27,6 @@ import (
|
|
"github.com/containers/image/v5/manifest"
|
|
"github.com/containers/image/v5/signature"
|
|
"github.com/containers/image/v5/types"
|
|
- "github.com/containers/storage/pkg/archive"
|
|
securejoin "github.com/cyphar/filepath-securejoin"
|
|
"github.com/docker/distribution/reference"
|
|
"github.com/opencontainers/go-digest"
|
|
@@ -40,11 +39,6 @@ import (
|
|
"isula.org/isula-build/util"
|
|
)
|
|
|
|
-const (
|
|
- // Uncompressed represents uncompressed
|
|
- Uncompressed = archive.Uncompressed
|
|
-)
|
|
-
|
|
// ExportOptions is a struct for exporter
|
|
type ExportOptions struct {
|
|
SystemContext *types.SystemContext
|
|
@@ -56,6 +50,28 @@ type ExportOptions struct {
|
|
ImageListSelection cp.ImageListSelection
|
|
}
|
|
|
|
+// parseExporter parses an exporter instance and inits it with the src and dest reference.
|
|
+func parseExporter(opts ExportOptions, src, destSpec string, localStore *store.Store) (Exporter, error) {
|
|
+ const partsNum = 2
|
|
+ // 1. parse exporter
|
|
+ parts := strings.SplitN(destSpec, ":", partsNum)
|
|
+ if len(parts) != partsNum {
|
|
+ return nil, errors.Errorf(`invalid dest spec %q, expected colon-separated exporter:reference`, destSpec)
|
|
+ }
|
|
+
|
|
+ ept := GetAnExporter(parts[0])
|
|
+ if ept == nil {
|
|
+ return nil, errors.Errorf(`invalid image name: %q, unknown exporter "%s"`, src, parts[0])
|
|
+ }
|
|
+
|
|
+ // 2. Init exporter reference
|
|
+ err := ept.Init(opts, src, destSpec, localStore)
|
|
+ if err != nil {
|
|
+ return nil, errors.Wrap(err, `fail to Init exporter"`)
|
|
+ }
|
|
+ return ept, nil
|
|
+}
|
|
+
|
|
// Export exports an image to an output destination
|
|
func Export(imageID, outputDest string, opts ExportOptions, localStore *store.Store) error {
|
|
eLog := logrus.WithField(util.LogKeySessionID, opts.Ctx.Value(util.LogFieldKey(util.LogKeySessionID)))
|
|
@@ -89,26 +105,6 @@ func Export(imageID, outputDest string, opts ExportOptions, localStore *store.St
|
|
return nil
|
|
}
|
|
|
|
-func exportToIsulad(ctx context.Context, tarPath string) error {
|
|
- // no tarPath need to export
|
|
- if len(tarPath) == 0 {
|
|
- return nil
|
|
- }
|
|
- defer func() {
|
|
- if rErr := os.Remove(tarPath); rErr != nil {
|
|
- logrus.Errorf("Remove file %s failed: %v", tarPath, rErr)
|
|
- }
|
|
- }()
|
|
- // dest here will not be influenced by external input, no security risk
|
|
- cmd := exec.CommandContext(ctx, "isula", "load", "-i", tarPath) // nolint:gosec
|
|
- if bytes, lErr := cmd.CombinedOutput(); lErr != nil {
|
|
- logrus.Errorf("Load image to isulad failed, stderr: %v, err: %v", string(bytes), lErr)
|
|
- return errors.Errorf("load image to isulad failed, stderr: %v, err: %v", string(bytes), lErr)
|
|
- }
|
|
-
|
|
- return nil
|
|
-}
|
|
-
|
|
func export(e Exporter, exOpts ExportOptions) (reference.Canonical, digest.Digest, error) {
|
|
var (
|
|
ref reference.Canonical
|
|
@@ -158,28 +154,6 @@ func export(e Exporter, exOpts ExportOptions) (reference.Canonical, digest.Diges
|
|
return ref, manifestDigest, nil
|
|
}
|
|
|
|
-// parseExporter parses an exporter instance and inits it with the src and dest reference.
|
|
-func parseExporter(opts ExportOptions, src, destSpec string, localStore *store.Store) (Exporter, error) {
|
|
- const partsNum = 2
|
|
- // 1. parse exporter
|
|
- parts := strings.SplitN(destSpec, ":", partsNum)
|
|
- if len(parts) != partsNum {
|
|
- return nil, errors.Errorf(`invalid dest spec %q, expected colon-separated exporter:reference`, destSpec)
|
|
- }
|
|
-
|
|
- ept := GetAnExporter(parts[0])
|
|
- if ept == nil {
|
|
- return nil, errors.Errorf(`invalid image name: %q, unknown exporter "%s"`, src, parts[0])
|
|
- }
|
|
-
|
|
- // 2. Init exporter reference
|
|
- err := ept.Init(opts, src, destSpec, localStore)
|
|
- if err != nil {
|
|
- return nil, errors.Wrap(err, `fail to Init exporter"`)
|
|
- }
|
|
- return ept, nil
|
|
-}
|
|
-
|
|
// NewCopyOptions will return copy options
|
|
func NewCopyOptions(opts ExportOptions) *cp.Options {
|
|
cpOpts := &cp.Options{}
|
|
@@ -206,6 +180,26 @@ func NewPolicyContext(sc *types.SystemContext) (*signature.PolicyContext, error)
|
|
return policyContext, nil
|
|
}
|
|
|
|
+func exportToIsulad(ctx context.Context, tarPath string) error {
|
|
+ // no tarPath need to export
|
|
+ if len(tarPath) == 0 {
|
|
+ return nil
|
|
+ }
|
|
+ defer func() {
|
|
+ if rErr := os.Remove(tarPath); rErr != nil {
|
|
+ logrus.Errorf("Remove file %s failed: %v", tarPath, rErr)
|
|
+ }
|
|
+ }()
|
|
+ // dest here will not be influenced by external input, no security risk
|
|
+ cmd := exec.CommandContext(ctx, "isula", "load", "-i", tarPath) // nolint:gosec
|
|
+ if bytes, lErr := cmd.CombinedOutput(); lErr != nil {
|
|
+ logrus.Errorf("Load image to isulad failed, stderr: %v, err: %v", string(bytes), lErr)
|
|
+ return errors.Errorf("load image to isulad failed, stderr: %v, err: %v", string(bytes), lErr)
|
|
+ }
|
|
+
|
|
+ return nil
|
|
+}
|
|
+
|
|
// CheckArchiveFormat used to check if save or load image format is either docker-archive or oci-archive
|
|
func CheckArchiveFormat(format string) error {
|
|
switch format {
|
|
@@ -237,4 +231,3 @@ func GetManifestType(format string) (string, error) {
|
|
}
|
|
return manifestType, nil
|
|
}
|
|
-
|
|
--
|
|
2.31.1
|
|
|