This repository has been archived by the owner on Jun 13, 2021. It is now read-only.
/
loader.go
82 lines (76 loc) · 2.66 KB
/
loader.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package loader
import (
"io"
"io/ioutil"
"os"
"path/filepath"
"strings"
"github.com/docker/app/internal"
"github.com/docker/app/types"
"github.com/docker/docker/pkg/archive"
"github.com/pkg/errors"
)
// LoadFromSingleFile loads a docker app from a single-file format (as a reader)
func LoadFromSingleFile(path string, r io.Reader, ops ...func(*types.App) error) (*types.App, error) {
data, err := ioutil.ReadAll(r)
if err != nil {
return nil, errors.Wrap(err, "error reading single-file")
}
parts := strings.Split(string(data), types.SingleFileSeparator)
if len(parts) != 3 {
return nil, errors.Errorf("malformed single-file application: expected 3 documents, got %d", len(parts))
}
// 0. is metadata
metadata := strings.NewReader(parts[0])
// 1. is compose
compose := strings.NewReader(parts[1])
// 2. is parameters
parameters := strings.NewReader(parts[2])
appOps := append([]func(*types.App) error{
types.WithComposes(compose),
types.WithParameters(parameters),
types.Metadata(metadata),
}, ops...)
return types.NewApp(path, appOps...)
}
// LoadFromDirectory loads a docker app from a directory
func LoadFromDirectory(path string, ops ...func(*types.App) error) (*types.App, error) {
if _, err := os.Stat(filepath.Join(path, internal.ParametersFileName)); os.IsNotExist(err) {
if _, err := os.Stat(filepath.Join(path, internal.DeprecatedSettingsFileName)); err == nil {
return nil, errors.Errorf("\"settings.yml\" has been deprecated in favor of \"parameters.yml\"; please rename \"settings.yml\" to \"parameters.yml\"")
}
}
return types.NewAppFromDefaultFiles(path, ops...)
}
// LoadFromTar loads a docker app from a tarball
func LoadFromTar(tar string, ops ...func(*types.App) error) (*types.App, error) {
f, err := os.Open(tar)
if err != nil {
return nil, errors.Wrap(err, "cannot load app from tar")
}
defer f.Close()
appOps := append(ops, types.WithPath(tar))
return LoadFromTarReader(f, appOps...)
}
// LoadFromTarReader loads a docker app from a tarball reader
func LoadFromTarReader(r io.Reader, ops ...func(*types.App) error) (*types.App, error) {
dir, err := ioutil.TempDir("", "load-from-tar")
if err != nil {
return nil, errors.Wrap(err, "cannot load app from tar")
}
if err := archive.Untar(r, dir, &archive.TarOptions{
NoLchown: true,
}); err != nil {
originalErr := errors.Wrap(err, "cannot load app from tar")
if err := os.RemoveAll(dir); err != nil {
return nil, errors.Wrapf(originalErr, "cannot remove temporary folder : %s", err.Error())
}
return nil, originalErr
}
appOps := append([]func(*types.App) error{
types.WithCleanup(func() {
os.RemoveAll(dir)
}),
}, ops...)
return LoadFromDirectory(dir, appOps...)
}