Manuel Alejandro de Brito Fontes f6cfa947f5 Refactor backup creation
2022-04-29 19:37:15 +05:30

82 lines
2.2 KiB
Go

// Copyright (c) 2020 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License-AGPL.txt in the project root for license information.
package content
import (
"context"
"io"
"os"
"github.com/containers/storage/pkg/archive"
"github.com/containers/storage/pkg/idtools"
"github.com/opentracing/opentracing-go"
"golang.org/x/xerrors"
"github.com/gitpod-io/gitpod/common-go/log"
"github.com/gitpod-io/gitpod/common-go/tracing"
carchive "github.com/gitpod-io/gitpod/content-service/pkg/archive"
)
// BuildTarbal creates an OCI compatible tar file dst from the folder src, expecting the overlay whiteout format
func BuildTarbal(ctx context.Context, src string, dst string, fullWorkspaceBackup bool, opts ...carchive.TarOption) (err error) {
var cfg carchive.TarConfig
for _, opt := range opts {
opt(&cfg)
}
//nolint:staticcheck,ineffassign
span, ctx := opentracing.StartSpanFromContext(ctx, "buildTarbal")
span.LogKV("src", src, "dst", dst)
defer tracing.FinishSpan(span, &err)
// ensure the src actually exists before trying to tar it
if _, err := os.Stat(src); err != nil {
return xerrors.Errorf("Unable to tar files: %v", err.Error())
}
if fullWorkspaceBackup {
log.Warn("Full workspace backup is disabled.")
}
uidMaps := make([]idtools.IDMap, len(cfg.UIDMaps))
for i, m := range cfg.UIDMaps {
uidMaps[i] = idtools.IDMap{
ContainerID: m.ContainerID,
HostID: m.HostID,
Size: m.Size,
}
}
gidMaps := make([]idtools.IDMap, len(cfg.GIDMaps))
for i, m := range cfg.GIDMaps {
gidMaps[i] = idtools.IDMap{
ContainerID: m.ContainerID,
HostID: m.HostID,
Size: m.Size,
}
}
tarReader, err := archive.TarWithOptions(src, &archive.TarOptions{
UIDMaps: uidMaps,
GIDMaps: gidMaps,
Compression: archive.Uncompressed,
})
if err != nil {
return
}
defer tarReader.Close()
tarFile, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY, 0755)
if err != nil {
return xerrors.Errorf("Unable to create tar file: %v", err.Error())
}
_, err = io.Copy(tarFile, tarReader)
if err != nil {
return xerrors.Errorf("Unable create tar file: %v", err.Error())
}
return
}