This repository has been archived by the owner on May 13, 2022. It is now read-only.
/
load_package.go
125 lines (104 loc) · 3.41 KB
/
load_package.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package loader
import (
"fmt"
"os"
"path/filepath"
"github.com/hyperledger/burrow/deploy/def"
"github.com/hyperledger/burrow/logging"
"github.com/spf13/viper"
)
func LoadPlaybook(fileName string, args *def.DeployArgs, logger *logging.Logger) (*def.Playbook, error) {
return loadPlaybook(fileName, args, nil, logger)
}
func loadPlaybook(fileName string, args *def.DeployArgs, parent *def.Playbook, logger *logging.Logger) (*def.Playbook, error) {
logger.InfoMsg("Loading Playbook File.")
playbook := new(def.Playbook)
deployJobs := viper.New()
if parent != nil {
// if subYAMLPath does not exist, try YAMLPath relative to paremt.Path
if _, err := os.Stat(fileName); os.IsNotExist(err) {
fileName = filepath.Join(parent.Path, fileName)
logger.InfoMsg("Trying Playbook relative to Path", "filename", fileName, "path", parent.Path)
}
}
playbook.Filename = fileName
playbook.Path = filepath.Dir(fileName)
if args.BinPath == "[dir]/bin" {
playbook.BinPath = filepath.Join(playbook.Path, "bin")
} else {
playbook.BinPath = args.BinPath
}
if err := os.MkdirAll(playbook.BinPath, 0775); err != nil {
return nil, err
}
// setup file
abs, err := filepath.Abs(fileName)
if err != nil {
return nil, fmt.Errorf("sorry, the marmots were unable to find the absolute path to the playbook file")
}
base := filepath.Base(abs)
extName := filepath.Ext(base)
bName := base[:len(base)-len(extName)]
logger.InfoMsg("Loading playbook file",
"path", playbook.Path,
"filename", playbook.Filename,
)
deployJobs.SetConfigType("yaml")
deployJobs.SetConfigName(bName)
r, err := os.Open(fileName)
if err != nil {
return nil, err
}
// load file
if err := deployJobs.ReadConfig(r); err != nil {
return nil, fmt.Errorf("Sorry, the marmots were unable to load the playbook file. Please check your path: %v", err)
}
// marshall file
if err := deployJobs.UnmarshalExact(playbook); err != nil {
return nil, fmt.Errorf(`Sorry, the marmots could not figure that playbook file out.
Please check that your deploy.yaml is properly formatted: %v`, err)
}
// TODO more file sanity check (fail before running)
err = playbook.Validate()
if err != nil {
return nil, err
}
for _, job := range playbook.Jobs {
if job.Meta != nil {
metaPlaybook, err := loadPlaybook(job.Meta.File, args, playbook, logger)
if err != nil {
return nil, err
}
// set the deploy contract jobs relative to the newDo's root directory
for _, job := range metaPlaybook.Jobs {
if job.Deploy != nil {
job.Deploy.Contract = filepath.Join(metaPlaybook.Path, job.Deploy.Contract)
}
}
// We do not set the parent for this playbook; the parent is used for
// backreferencing variables
job.Meta.Playbook = metaPlaybook
}
if job.Proposal != nil {
for _, job := range job.Proposal.Jobs {
if job.Meta != nil {
metaPlaybook, err := loadPlaybook(job.Meta.File, args, playbook, logger)
if err != nil {
return nil, err
}
// set the deploy contract jobs relative to the newDo's root directory
for _, job := range metaPlaybook.Jobs {
if job.Deploy != nil {
job.Deploy.Contract = filepath.Join(metaPlaybook.Path, job.Deploy.Contract)
}
}
// Set the parent for the playbook so that the proposal can backreference e.g.
// deployed contracts addresses
metaPlaybook.Parent = playbook
job.Meta.Playbook = metaPlaybook
}
}
}
}
return playbook, nil
}