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
59 changes: 7 additions & 52 deletions packer.mk
Original file line number Diff line number Diff line change
Expand Up @@ -8,58 +8,9 @@ ifeq (${ARCHITECTURE},ARM64)
endif
GOHOSTARCH = $(shell go env GOHOSTARCH)

build-packer: generate-prefetch-scripts build-aks-node-controller build-lister-binary
ifeq (${ARCHITECTURE},ARM64)
@echo "${MODE}: Building with Hyper-v generation 2 ARM64 VM"
ifeq (${OS_SKU},Ubuntu)
@echo "Using packer template file vhd-image-builder-arm64-gen2.json"
@packer build -timestamp-ui -var-file=vhdbuilder/packer/settings.json vhdbuilder/packer/vhd-image-builder-arm64-gen2.json
else ifeq (${OS_SKU},CBLMariner)
@echo "Using packer template file vhd-image-builder-mariner-arm64.json"
@packer build -timestamp-ui -var-file=vhdbuilder/packer/settings.json vhdbuilder/packer/vhd-image-builder-mariner-arm64.json
else ifeq (${OS_SKU},AzureLinux)
@echo "Using packer template file vhd-image-builder-mariner-arm64.json"
@packer build -timestamp-ui -var-file=vhdbuilder/packer/settings.json vhdbuilder/packer/vhd-image-builder-mariner-arm64.json
else ifeq (${OS_SKU},Flatcar)
@echo "Using packer template file vhd-image-builder-flatcar-arm64.json"
@packer build -timestamp-ui -var-file=vhdbuilder/packer/settings.json vhdbuilder/packer/vhd-image-builder-flatcar-arm64.json
else
$(error OS_SKU was invalid ${OS_SKU})
endif
else ifeq (${ARCHITECTURE},X86_64)
ifeq (${HYPERV_GENERATION},V2)
@echo "${MODE}: Building with Hyper-v generation 2 x86_64 VM"
else ifeq (${HYPERV_GENERATION},V1)
@echo "${MODE}: Building with Hyper-v generation 1 X86_64 VM"
else
$(error HYPERV_GENERATION was invalid ${HYPERV_GENERATION})
endif
ifeq (${OS_SKU},Ubuntu)
ifeq ($(findstring cvm,$(FEATURE_FLAGS)),cvm)
@echo "Using packer template file vhd-image-builder-cvm.json"
@packer build -timestamp-ui -var-file=vhdbuilder/packer/settings.json vhdbuilder/packer/vhd-image-builder-cvm.json
else
@echo "Using packer template file vhd-image-builder-base.json"
@packer build -timestamp-ui -var-file=vhdbuilder/packer/settings.json vhdbuilder/packer/vhd-image-builder-base.json
endif
else ifeq (${OS_SKU},CBLMariner)
@echo "Using packer template file vhd-image-builder-mariner.json"
@packer build -timestamp-ui -var-file=vhdbuilder/packer/settings.json vhdbuilder/packer/vhd-image-builder-mariner.json
else ifeq (${OS_SKU},AzureLinux)
ifeq ($(findstring cvm,$(FEATURE_FLAGS)),cvm)
@echo "Using packer template file vhd-image-builder-mariner-cvm.json"
@packer build -timestamp-ui -var-file=vhdbuilder/packer/settings.json vhdbuilder/packer/vhd-image-builder-mariner-cvm.json
else
@echo "Using packer template file vhd-image-builder-mariner.json"
@packer build -timestamp-ui -var-file=vhdbuilder/packer/settings.json vhdbuilder/packer/vhd-image-builder-mariner.json
endif
else ifeq (${OS_SKU},Flatcar)
@echo "Using packer template file vhd-image-builder-flatcar.json"
@packer build -timestamp-ui -var-file=vhdbuilder/packer/settings.json vhdbuilder/packer/vhd-image-builder-flatcar.json
else
$(error OS_SKU was invalid ${OS_SKU})
endif
endif
build-packer: generate-prefetch-scripts build-aks-node-controller build-lister-binary generate-packer-template-linux
@echo "MODE: ${MODE}, HYPERV_GENERATION: ${HYPERV_GENERATION}, ARCHITECTURE: ${ARCHITECTURE}; Using generated packer template: linux-template.json"
@packer build -timestamp-ui -var-file=vhdbuilder/packer/settings.json vhdbuilder/packer/linux-template.json

build-packer-windows:
ifeq (${MODE},windowsVhdMode)
Expand All @@ -79,6 +30,10 @@ endif
@packer build -timestamp-ui -var-file=vhdbuilder/packer/settings.json vhdbuilder/packer/windows/windows-vhd-builder-sig.json
endif

generate-packer-template-linux:
@echo "Generating Linux packer template"
@bash -c "pushd vhdbuilder/packer/templater; go run main.go --output-path=../linux-template.json || exit 1; popd"

build-imagecustomizer: generate-prefetch-scripts build-aks-node-controller build-lister-binary
@./vhdbuilder/packer/imagecustomizer/scripts/build-imagecustomizer-image.sh

Expand Down
4 changes: 2 additions & 2 deletions vhdbuilder/packer/packer_source.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ copyPackerFiles() {
ETC_ISSUE_CONFIG_DEST=/etc/issue
ETC_ISSUE_NET_CONFIG_SRC=/home/packer/etc-issue.net
ETC_ISSUE_NET_CONFIG_DEST=/etc/issue.net
SSHD_CONFIG_SRC=/home/packer/sshd_config
SSHD_CONFIG_DEST=/etc/ssh/sshd_config
MODPROBE_CIS_SRC=/home/packer/modprobe-CIS.conf
MODPROBE_CIS_DEST=/etc/modprobe.d/CIS.conf
FAILLOCK_CONF_SRC=/home/packer/faillock-CIS.conf
Expand Down Expand Up @@ -274,6 +272,8 @@ copyPackerFiles() {
NOTICE_SRC=/home/packer/NOTICE.txt
NOTICE_DEST=/NOTICE.txt

SSHD_CONFIG_SRC=/home/packer/sshd_config
SSHD_CONFIG_DEST=/etc/ssh/sshd_config
if [ ${UBUNTU_RELEASE} = "22.04" ] && [ ${ENABLE_FIPS,,} = "true" ]; then
SSHD_CONFIG_SRC=/home/packer/sshd_config_2204_fips
fi
Expand Down
3 changes: 3 additions & 0 deletions vhdbuilder/packer/templater/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module github.com/Azure/AgentBaker/vhdbuilder/packer/templater

go 1.23.6
154 changes: 154 additions & 0 deletions vhdbuilder/packer/templater/internal/config/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
package config

import (
"fmt"
"os"
"strconv"
"strings"
)

type VHD struct {
OS string
OSVersion string
HyperVGeneration string
Architecture string
CGroupsV2 bool
FIPS bool
TrustedLaunch bool
FeatureFlags FeatureFlags
}

type FeatureFlags struct {
CVM bool
Kata bool
GB200 bool
}

func LoadVHDConfigFromEnv() (VHD, error) {
os, err := getOSFromEnv()
if err != nil {
return VHD{}, fmt.Errorf("getting OS from environment: %w", err)
}
osVersion, err := getOSVersionFromEnv()
if err != nil {
return VHD{}, fmt.Errorf("getting OS version from environment: %w", err)
}
hyperVGeneration, err := getHyperVGenerationFromEnv()
if err != nil {
return VHD{}, fmt.Errorf("getting hyper-V generation version from environment: %w", err)
}
architecture, err := getArchitectureFromEnv()
if err != nil {
return VHD{}, fmt.Errorf("getting architecture from environment: %w", err)
}
cgroupsV2, err := getCGroupsV2FromEnv()
if err != nil {
return VHD{}, fmt.Errorf("determining cgroupsv2 enablement from environment: %w", err)
}
fips, err := getFIPSFromEnv()
if err != nil {
return VHD{}, fmt.Errorf("determining FIPS enablement from environment: %w", err)
}
trustedLaunch, err := getTrustedLaunchFromEnv()
if err != nil {
return VHD{}, fmt.Errorf("determining Trusted Launch enablement from environment: %w", err)
}
return VHD{
OS: os,
OSVersion: osVersion,
HyperVGeneration: hyperVGeneration,
Architecture: architecture,
CGroupsV2: cgroupsV2,
FIPS: fips,
TrustedLaunch: trustedLaunch,
FeatureFlags: getFeatureFlagsFromEnv(),
}, nil
}

func getOSFromEnv() (string, error) {
os := os.Getenv("OS_SKU")
if os == "" {
return "", fmt.Errorf("environment variable OS_SKU must be set")
}
switch strings.ToLower(os) {
case "ubuntu":
return "Ubuntu", nil
case "cblmariner", "azurelinux", "azurelinuxosguard":
return "Mariner", nil
case "flatcar":
return "Flatcar", nil
default:
return "", fmt.Errorf("unrecognized OS: %s", os)
}
}

func getOSVersionFromEnv() (string, error) {
osVersion := os.Getenv("OS_VERSION")
if osVersion == "" {
return "", fmt.Errorf("environment variable OS_VERSION must be set")
}
return osVersion, nil
}

func getHyperVGenerationFromEnv() (string, error) {
hyperVGeneration := os.Getenv("HYPERV_GENERATION")
if hyperVGeneration == "" {
return "", fmt.Errorf("environment variable HYPERV_GENERATION must be set")
}
switch strings.ToLower(hyperVGeneration) {
case "v1", "v2":
return hyperVGeneration, nil
default:
return "", fmt.Errorf("unrecognized hyperV generation: %s", hyperVGeneration)
}
}

func getArchitectureFromEnv() (string, error) {
architecture := os.Getenv("ARCHITECTURE")
if architecture == "" {
return "", fmt.Errorf("environment variable ARCHITECTURE must be set")
}
switch strings.ToLower(architecture) {
case "x86_64", "arm64":
return architecture, nil
default:
return "", fmt.Errorf("unrecognized architecture: %s", architecture)
}
}

func getCGroupsV2FromEnv() (bool, error) {
cgroupsV2 := os.Getenv("ENABLE_CGROUPV2")
if cgroupsV2 == "" {
return false, nil
}
return strconv.ParseBool(cgroupsV2)
}

func getFIPSFromEnv() (bool, error) {
fips := os.Getenv("ENABLE_FIPS")
if fips == "" {
return false, nil
}
return strconv.ParseBool(fips)
}

func getTrustedLaunchFromEnv() (bool, error) {
trustedLaunch := os.Getenv("ENABLE_TRUSTED_LAUNCH")
if trustedLaunch == "" {
return false, nil
}
return strconv.ParseBool(trustedLaunch)
}

func getFeatureFlagsFromEnv() FeatureFlags {
featureFlags := os.Getenv("FEATURE_FLAGS")
if featureFlags == "" {
return FeatureFlags{}
}
flags := strings.ToLower(featureFlags)
return FeatureFlags{
CVM: strings.Contains(flags, "cvm"),
Kata: strings.Contains(flags, "kata"),
GB200: strings.Contains(flags, "gb200"),
}
}
63 changes: 63 additions & 0 deletions vhdbuilder/packer/templater/internal/template.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package template

import (
"bytes"
_ "embed"
"strings"
"text/template"

"github.com/Azure/AgentBaker/vhdbuilder/packer/templater/internal/config"
)

var (
//go:embed templates/packer.gtpl
packerTemplate string
)

func BuildPackerTemplate(vhdConfig config.VHD) (string, error) {
tmpl := template.Must(template.New("packer").Funcs(getFuncMap(vhdConfig)).Parse(packerTemplate))
var buffer bytes.Buffer
if err := tmpl.Execute(&buffer, vhdConfig); err != nil {
return "", err
}
return buffer.String(), nil

}

func getFuncMap(vhdConfig config.VHD) template.FuncMap {
return template.FuncMap{
"ToLower": strings.ToLower,
"GetArchitectureExtension": func() string {
switch strings.ToLower(vhdConfig.Architecture) {
case "arm64":
return "arm64"
default:
return "amd64"
}
},
"GetRebootCommand": func() string {
switch strings.ToLower(vhdConfig.OS) {
case "flatcar":
return "reboot"
default:
return "sudo reboot"
}
},
"GetRebootPauseDuration": func() string {
switch strings.ToLower(vhdConfig.OS) {
case "flatcar":
return "0s"
default:
return "60s"
}
},
"GetWAAgentPath": func() string {
switch strings.ToLower(vhdConfig.OS) {
case "mariner":
return "waagent"
default:
return "/usr/sbin/waagent"
}
},
}
}
Loading
Loading