-
Notifications
You must be signed in to change notification settings - Fork 5
/
vpub.go
133 lines (115 loc) · 3.77 KB
/
vpub.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
126
127
128
129
130
131
132
133
package initlib
import (
"fmt"
"os"
"path/filepath"
"strings"
"github.com/trimble-oss/tierceron/buildopts/coreopts"
eUtils "github.com/trimble-oss/tierceron/pkg/utils"
helperkv "github.com/trimble-oss/tierceron/pkg/vaulthelper/kv"
)
func UploadTemplateDirectory(c *eUtils.DriverConfig, mod *helperkv.Modifier, dirName string) ([]string, error) {
dirs, err := os.ReadDir(dirName)
if err != nil {
fmt.Println("Read directory couldn't be completed.")
return nil, err
}
// Parse each subdirectory as a service name
for _, subDir := range dirs {
if subDir.IsDir() {
pathName := dirName + "/" + subDir.Name()
warn, err := UploadTemplates(c, mod, pathName)
if err != nil || len(warn) > 0 {
fmt.Printf("Upload templates couldn't be completed. %v", err)
return warn, err
}
}
}
return nil, nil
}
func UploadTemplates(c *eUtils.DriverConfig, mod *helperkv.Modifier, dirName string) ([]string, error) {
// Open directory
files, err := os.ReadDir(dirName)
if err != nil {
return nil, err
}
// Use name of containing directory as the template subdirectory
splitDir := strings.SplitAfterN(dirName, "/", 2)
subDir := splitDir[len(splitDir)-1]
// Parse through files
for _, file := range files {
// Extract extension and name
if file.IsDir() { // Recurse folders
warn, err := UploadTemplates(c, mod, dirName+"/"+file.Name())
if err != nil || len(warn) > 0 {
return warn, err
}
continue
}
ext := filepath.Ext(file.Name())
name := file.Name()
name = name[0 : len(name)-len(ext)] // Truncate extension
if ext == ".tmpl" { // Only upload template files
if c != nil && c.IsShell {
c.Log.Printf("Found template file %s for %s\n", file.Name(), mod.Env)
} else {
fmt.Printf("Found template file %s for %s\n", file.Name(), mod.Env)
if c != nil {
c.Log.Printf("Found template file %s for %s\n", file.Name(), mod.Env)
}
}
// Seperate name and extension one more time for saving to vault
ext = filepath.Ext(name)
name = name[0 : len(name)-len(ext)]
c.Log.Printf("dirName: %s\n", dirName)
c.Log.Printf("file name: %s\n", file.Name())
// Extract values
extractedValues, err := eUtils.Parse(dirName+"/"+file.Name(), subDir, name)
if err != nil {
return nil, err
}
// Open file
f, err := os.Open(dirName + "/" + file.Name())
if err != nil {
return nil, err
}
// Read the file
fileInfo, err := file.Info()
if err != nil {
return nil, err
}
fileBytes := make([]byte, fileInfo.Size())
_, err = f.Read(fileBytes)
if err != nil {
return nil, err
}
dirSplit := strings.Split(subDir, "/")
if len(dirSplit) >= 2 {
project, _, _, _ := coreopts.BuildOptions.FindIndexForService(dirSplit[0], dirSplit[1])
if project != "" && strings.Contains(string(fileBytes), "{or") {
fmt.Printf("Cannot have an indexed template with default values for or %s for %s \n", file.Name(), mod.Env)
return nil, nil
}
}
// Construct template path for vault
templatePath := "templates/" + subDir + "/" + name + "/template-file"
c.Log.Printf("\tUploading template to path:\t%s\n", templatePath)
// Construct value path for vault
valuePath := "values/" + subDir + "/" + name
c.Log.Printf("\tUploading values to path:\t%s\n", valuePath)
// Write templates to vault and output errors/warnings
warn, err := mod.Write(templatePath, map[string]interface{}{"data": fileBytes, "ext": ext}, c.Log)
if err != nil || len(warn) > 0 {
return warn, err
}
// Write values to vault and output any errors/warnings
warn, err = mod.Write(valuePath, extractedValues, c.Log)
if err != nil || len(warn) > 0 {
return warn, err
}
} else {
c.Log.Printf("\tSkippping template (templates must end in .tmpl):\t%s\n", file.Name())
}
}
return nil, nil
}