Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion hotfix/hotfix_generate_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,8 @@ def test_config_modules_are_independently_hotfixable(self):
self.assertEqual({variable}, blocks[0][0])
self.assertIn(f"- path: {{{{{path_function}}}}}", template)
self.assertIn('permissions: "0744"', template)
self.assertIn("encoding: gzip", template)
self.assertIn("encoding: {{GetCloudInitFileEncoding}}", template)
self.assertIn("| GetCloudInitFileContent}}", template)
self.assertNotIn("{{if", template)

def test_mariner_package_update_is_not_embedded_in_custom_data(self):
Expand Down
16 changes: 8 additions & 8 deletions hotfix/render-nodecustomdata/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,16 @@ func TestRenderSelectedHotfixScripts(t *testing.T) {
const initCloudBlock = `{{if IsAKSCustomCloud}}
- path: {{GetInitAKSCloudFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "initAKSCloud"}}
content: {{GetVariableProperty "cloudInitData" "initAKSCloud" | GetCloudInitFileContent}}
{{end}}
`
const helperBlock = `- path: {{GetCSEHelpersScriptFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionSource"}}
content: {{GetVariableProperty "cloudInitData" "provisionSource" | GetCloudInitFileContent}}
`
for _, distro := range []datamodel.Distro{
datamodel.AKSUbuntuContainerd2204Gen2,
Expand All @@ -47,8 +45,9 @@ func TestRenderSelectedHotfixScripts(t *testing.T) {
require.NoError(t, err)
var payload struct {
WriteFiles []struct {
Path string `yaml:"path"`
Content string `yaml:"content"`
Path string `yaml:"path"`
Encoding string `yaml:"encoding"`
Content string `yaml:"content"`
} `yaml:"write_files"`
}
require.NoError(t, yaml.Unmarshal([]byte(rendered), &payload))
Expand All @@ -62,6 +61,7 @@ func TestRenderSelectedHotfixScripts(t *testing.T) {
require.Len(t, payload.WriteFiles, 1+wantInitCount)
for _, file := range payload.WriteFiles {
require.NotEmpty(t, file.Content)
require.Empty(t, file.Encoding)
}
})
}
Expand Down
135 changes: 54 additions & 81 deletions parts/linux/cloud-init/nodecustomdata.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,201 +28,174 @@ write_files:
{{if IsAKSCustomCloud}}
- path: {{GetInitAKSCloudFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "initAKSCloud"}}
content: {{GetVariableProperty "cloudInitData" "initAKSCloud" | GetCloudInitFileContent}}
{{end}}

{{- else }}
- path: {{GetCSEHelpersScriptFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionSource"}}
content: {{GetVariableProperty "cloudInitData" "provisionSource" | GetCloudInitFileContent}}


{{if IsACL }}
- path: {{GetCSEHelpersScriptDistroFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionSourceACL"}}
content: {{GetVariableProperty "cloudInitData" "provisionSourceACL" | GetCloudInitFileContent}}
{{- else if IsAzlOSGuard}}
- path: {{GetCSEHelpersScriptDistroFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionSourceAzlOSGuard"}}
content: {{GetVariableProperty "cloudInitData" "provisionSourceAzlOSGuard" | GetCloudInitFileContent}}
{{- else if IsMariner}}
- path: {{GetCSEHelpersScriptDistroFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionSourceMariner"}}
content: {{GetVariableProperty "cloudInitData" "provisionSourceMariner" | GetCloudInitFileContent}}
{{- else if IsFlatcar }}
- path: {{GetCSEHelpersScriptDistroFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionSourceFlatcar"}}
content: {{GetVariableProperty "cloudInitData" "provisionSourceFlatcar" | GetCloudInitFileContent}}
{{- else }}
- path: {{GetCSEHelpersScriptDistroFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionSourceUbuntu"}}
content: {{GetVariableProperty "cloudInitData" "provisionSourceUbuntu" | GetCloudInitFileContent}}
{{end}}

{{ if not IsCustomImage -}}
- path: /opt/azure/containers/provision_start.sh
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionStartScript"}}
content: {{GetVariableProperty "cloudInitData" "provisionStartScript" | GetCloudInitFileContent}}
{{- end }}

- path: /opt/azure/containers/provision.sh
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionScript"}}
content: {{GetVariableProperty "cloudInitData" "provisionScript" | GetCloudInitFileContent}}

- path: {{GetCSEInstallScriptFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionInstalls"}}
content: {{GetVariableProperty "cloudInitData" "provisionInstalls" | GetCloudInitFileContent}}

{{if IsACL }}
- path: {{GetCSEInstallScriptDistroFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionInstallsACL"}}
content: {{GetVariableProperty "cloudInitData" "provisionInstallsACL" | GetCloudInitFileContent}}
{{- else if IsAzlOSGuard}}
- path: {{GetCSEInstallScriptDistroFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionInstallsAzlOSGuard"}}
content: {{GetVariableProperty "cloudInitData" "provisionInstallsAzlOSGuard" | GetCloudInitFileContent}}
{{- else if IsMariner}}
- path: {{GetCSEInstallScriptDistroFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionInstallsMariner"}}
content: {{GetVariableProperty "cloudInitData" "provisionInstallsMariner" | GetCloudInitFileContent}}
{{- else if IsFlatcar }}
- path: {{GetCSEInstallScriptDistroFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionInstallsFlatcar"}}
content: {{GetVariableProperty "cloudInitData" "provisionInstallsFlatcar" | GetCloudInitFileContent}}
{{- else }}
- path: {{GetCSEInstallScriptDistroFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionInstallsUbuntu"}}
content: {{GetVariableProperty "cloudInitData" "provisionInstallsUbuntu" | GetCloudInitFileContent}}
{{end}}

- path: {{GetCSEConfigScriptFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionConfigs"}}
content: {{GetVariableProperty "cloudInitData" "provisionConfigs" | GetCloudInitFileContent}}

- path: {{GetCSEConfigGPUScriptFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionConfigsGPU"}}
content: {{GetVariableProperty "cloudInitData" "provisionConfigsGPU" | GetCloudInitFileContent}}

- path: {{GetCSEConfigLocalDNSScriptFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionConfigsLocalDNS"}}
content: {{GetVariableProperty "cloudInitData" "provisionConfigsLocalDNS" | GetCloudInitFileContent}}

- path: {{GetCSEConfigKubeletScriptFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionConfigsKubelet"}}
content: {{GetVariableProperty "cloudInitData" "provisionConfigsKubelet" | GetCloudInitFileContent}}

- path: {{GetCSEConfigNetworkScriptFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionConfigsNetwork"}}
content: {{GetVariableProperty "cloudInitData" "provisionConfigsNetwork" | GetCloudInitFileContent}}

- path: {{GetCSEConfigAddonsScriptFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionConfigsAddons"}}
content: {{GetVariableProperty "cloudInitData" "provisionConfigsAddons" | GetCloudInitFileContent}}

- path: {{GetCSEConfigChronyScriptFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "provisionConfigsChrony"}}
content: {{GetVariableProperty "cloudInitData" "provisionConfigsChrony" | GetCloudInitFileContent}}

{{if IsAKSCustomCloud}}
- path: {{GetInitAKSCloudFilepath}}
permissions: "0744"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "initAKSCloud"}}
content: {{GetVariableProperty "cloudInitData" "initAKSCloud" | GetCloudInitFileContent}}
{{end}}

- path: /etc/systemd/system/reconcile-private-hosts.service
permissions: "0644"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "reconcilePrivateHostsService"}}
content: {{GetVariableProperty "cloudInitData" "reconcilePrivateHostsService" | GetCloudInitFileContent}}

- path: /etc/systemd/system/kubelet.service
permissions: "0600"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "kubeletSystemdService"}}
content: {{GetVariableProperty "cloudInitData" "kubeletSystemdService" | GetCloudInitFileContent}}

- path: /opt/azure-network/configure-azure-network.sh
permissions: "0755"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "configureAzureNetworkScript"}}
content: {{GetVariableProperty "cloudInitData" "configureAzureNetworkScript" | GetCloudInitFileContent}}

- path: /etc/udev/rules.d/99-azure-network.rules
permissions: "0644"
encoding: gzip
encoding: {{GetCloudInitFileEncoding}}
owner: root
content: !!binary |
{{GetVariableProperty "cloudInitData" "azureNetworkUdevRule"}}
content: {{GetVariableProperty "cloudInitData" "azureNetworkUdevRule" | GetCloudInitFileContent}}
{{- end }}
50 changes: 41 additions & 9 deletions pkg/agent/baker.go
Original file line number Diff line number Diff line change
Expand Up @@ -346,17 +346,20 @@ func buildScriptlessCustomData(cloudInitTemplate, fileListTemplate, separator st
// GetLinuxNodeCustomDataJSONObject returns Linux customData JSON object in the form.
// { "customData": "<customData string>" }.
func (t *TemplateGenerator) getLinuxNodeCustomDataJSONObject(config *datamodel.NodeBootstrappingConfiguration) string {
// get parameters
parameters := getParameters(config)
// get variable cloudInit
variables := getCustomDataVariables(config)
str, e := t.getSingleLineForTemplate(kubernetesNodeCustomDataYaml, config.AgentPoolProfile, getBakerFuncMap(config, parameters, variables), true)

if e != nil {
panic(e)
b, err := parts.Templates.ReadFile(kubernetesNodeCustomDataYaml)
if err != nil {
panic(err)
}
str, err := RenderLinuxNodeCustomDataTemplate(b, config)
if err != nil {
panic(err)
}

return fmt.Sprintf("{\"customData\": \"%s\"}", str)
customData, err := json.Marshal(map[string]string{"customData": str})
if err != nil {
panic(err)
}
return string(customData)
}

const (
Expand Down Expand Up @@ -677,6 +680,8 @@ func (t *TemplateGenerator) getSingleLine(textFilename string, profile interface
// same variables and functions used by the production AgentBaker path.
// Callers must supply a complete configuration, as required by the production
// rendering helpers.
// File entries must use GetCloudInitFileEncoding and GetCloudInitFileContent
// to select the encoding for the delivery mode.
func RenderLinuxNodeCustomDataTemplate(templateContent []byte, config *datamodel.NodeBootstrappingConfiguration) (string, error) {
parameters := getParameters(config)
variables := getCustomDataVariables(config)
Expand All @@ -694,10 +699,37 @@ func RenderLinuxNodeCustomDataTemplate(templateContent []byte, config *datamodel
return buffer.String(), nil
}

// Traditional custom data is gzipped as a whole, so its files need no inner encoding.
func usePlainCloudInit(config *datamodel.NodeBootstrappingConfiguration) bool {
return !config.EnableScriptlessCSECmd && !config.IsFlatcar() && !config.IsACL()
}

func getCloudInitFileEncoding(config *datamodel.NodeBootstrappingConfiguration) string {
if usePlainCloudInit(config) {
return `""`
}
return encodingGZIP
}

func getCloudInitFileContent(config *datamodel.NodeBootstrappingConfiguration, content string) (string, error) {
if usePlainCloudInit(config) {
encoded, err := json.Marshal(content)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am worried about this line, marshalling plain text in json, i am worried that some introduction of text might break this in future.

return string(encoded), err
}
return "!!binary |\n " + content, nil
}

// getTemplateFuncMap returns the general purpose template func map from getContainerServiceFuncMap.
func getBakerFuncMap(config *datamodel.NodeBootstrappingConfiguration, params paramsMap, variables paramsMap) template.FuncMap {
funcMap := getContainerServiceFuncMap(config)

funcMap["GetCloudInitFileEncoding"] = func() string {
return getCloudInitFileEncoding(config)
}
funcMap["GetCloudInitFileContent"] = func(content string) (string, error) {
return getCloudInitFileContent(config, content)
}

funcMap["GetParameter"] = func(s string) interface{} {
if v, ok := params[s].(paramsMap); ok && v != nil {
if v["value"] == nil {
Expand Down
Loading
Loading