pkg/engine/customfiles.go (68 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
package engine
import (
"bytes"
"fmt"
"io"
"os"
"strings"
"github.com/Azure/aks-engine-azurestack/pkg/api"
)
// CustomFileReader takes represents the source text of a file as an io.Reader and
// the desired destination to add it to
type CustomFileReader struct {
Source io.Reader
Dest string
}
func masterCustomFiles(profile *api.Properties) []api.CustomFile {
if profile.MasterProfile.CustomFiles != nil {
return *profile.MasterProfile.CustomFiles
}
return []api.CustomFile{}
}
func customfilesIntoReaders(customFiles []api.CustomFile) ([]CustomFileReader, error) {
customFileReaders := make([]CustomFileReader, len(customFiles))
for idx, customFile := range customFiles {
file, err := os.Open(customFile.Source)
if err != nil {
return []CustomFileReader{}, err
}
customFileReaders[idx] = CustomFileReader{
Source: file,
Dest: customFile.Dest,
}
}
return customFileReaders, nil
}
func substituteConfigStringCustomFiles(input string, customFiles []CustomFileReader, placeholder string) string {
var config string
for _, customFile := range customFiles {
config += buildConfigStringCustomFiles(
customFile.Source,
customFile.Dest)
}
return strings.Replace(input, placeholder, config, -1)
}
func buildConfigStringCustomFiles(source io.Reader, destinationFile string) string {
contents := []string{
fmt.Sprintf("- path: %s", destinationFile),
" permissions: \\\"0644\\\"",
" encoding: gzip",
" owner: \\\"root\\\"",
" content: !!binary |",
fmt.Sprintf(" %s\\n\\n", getBase64CustomFile(source)),
}
return strings.Join(contents, "\\n")
}
func getBase64CustomFile(source io.Reader) string {
buf := new(bytes.Buffer)
_, _ = buf.ReadFrom(source)
cfStr := buf.String()
cfStr = strings.Replace(cfStr, "\r\n", "\n", -1)
return getBase64EncodedGzippedCustomScriptFromStr(cfStr)
}
func containsCustomFile(customFiles []api.CustomFile, filepath string) bool {
for _, cu := range customFiles {
if cu.Dest == filepath {
return true
}
}
return false
}