feat: add cloud-init Go parser (Phase 2)
Implement a lightweight cloud-init system for first-boot configuration: - Go parser for YAML config (hostname, network, KubeSolo settings) - Static/DHCP network modes with DNS override - KubeSolo extra flags and API server SAN configuration - Portainer Edge Agent and air-gapped deployment support - New init stage 45-cloud-init.sh runs before network/hostname stages - Stages 50/60 skip gracefully when cloud-init has already applied - Build script compiles static Linux/amd64 binary (~2.7 MB) - 17 unit tests covering parsing, validation, and example files - Full documentation at docs/cloud-init.md Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
62
cloud-init/config.go
Normal file
62
cloud-init/config.go
Normal file
@@ -0,0 +1,62 @@
|
||||
// Package cloudinit implements a lightweight cloud-init parser for KubeSolo OS.
|
||||
//
|
||||
// It reads a simplified cloud-init YAML config and applies:
|
||||
// - hostname
|
||||
// - network configuration (static IP or DHCP)
|
||||
// - KubeSolo extra flags and settings
|
||||
// - NTP servers
|
||||
//
|
||||
// The config file is typically at /mnt/data/etc-kubesolo/cloud-init.yaml
|
||||
// or specified via kubesolo.cloudinit= boot parameter.
|
||||
package cloudinit
|
||||
|
||||
// Config is the top-level cloud-init configuration.
|
||||
type Config struct {
|
||||
Hostname string `yaml:"hostname"`
|
||||
Network NetworkConfig `yaml:"network"`
|
||||
KubeSolo KubeSoloConfig `yaml:"kubesolo"`
|
||||
NTP NTPConfig `yaml:"ntp"`
|
||||
Airgap AirgapConfig `yaml:"airgap"`
|
||||
Portainer PortainerConfig `yaml:"portainer"`
|
||||
}
|
||||
|
||||
// NetworkConfig defines network settings.
|
||||
type NetworkConfig struct {
|
||||
Mode string `yaml:"mode"` // "dhcp" or "static"
|
||||
Interface string `yaml:"interface"` // e.g. "eth0" (auto-detected if empty)
|
||||
Address string `yaml:"address"` // CIDR notation, e.g. "192.168.1.100/24"
|
||||
Gateway string `yaml:"gateway"` // e.g. "192.168.1.1"
|
||||
DNS []string `yaml:"dns"` // nameservers
|
||||
}
|
||||
|
||||
// KubeSoloConfig defines KubeSolo-specific settings.
|
||||
type KubeSoloConfig struct {
|
||||
ExtraFlags string `yaml:"extra-flags"`
|
||||
LocalStorage *bool `yaml:"local-storage"`
|
||||
ExtraSANs []string `yaml:"apiserver-extra-sans"`
|
||||
}
|
||||
|
||||
// NTPConfig defines NTP settings.
|
||||
type NTPConfig struct {
|
||||
Servers []string `yaml:"servers"`
|
||||
}
|
||||
|
||||
// AirgapConfig defines air-gapped deployment settings.
|
||||
type AirgapConfig struct {
|
||||
ImportImages bool `yaml:"import-images"`
|
||||
ImagesDir string `yaml:"images-dir"`
|
||||
}
|
||||
|
||||
// PortainerConfig defines Portainer Edge Agent settings.
|
||||
type PortainerConfig struct {
|
||||
EdgeAgent EdgeAgentConfig `yaml:"edge-agent"`
|
||||
}
|
||||
|
||||
// EdgeAgentConfig holds Portainer Edge Agent connection details.
|
||||
type EdgeAgentConfig struct {
|
||||
Enabled bool `yaml:"enabled"`
|
||||
EdgeID string `yaml:"edge-id"`
|
||||
EdgeKey string `yaml:"edge-key"`
|
||||
PortainerURL string `yaml:"portainer-url"`
|
||||
Image string `yaml:"image"`
|
||||
}
|
||||
Reference in New Issue
Block a user