diff --git a/cmd/static-server/main.go b/cmd/static-server/main.go index 7db2b3fa..a6de7951 100644 --- a/cmd/static-server/main.go +++ b/cmd/static-server/main.go @@ -69,6 +69,7 @@ func loadStaticNMState(fsys fs.FS, env *env.EnvInputs, nmstateDir string, imageS if err != nil { return errors.WithMessagef(err, "problem reading %s", path.Join(nmstateDir, f.Name())) } + hostname := strings.TrimSuffix(f.Name(), path.Ext(f.Name())) igBuilder, err := ignition.New(b, registries, env.IronicBaseURL, env.IronicAgentImage, @@ -78,6 +79,7 @@ func loadStaticNMState(fsys fs.FS, env *env.EnvInputs, nmstateDir string, imageS env.HttpProxy, env.HttpsProxy, env.NoProxy, + hostname, ) if err != nil { return errors.WithMessage(err, "failed to configure ignition") diff --git a/pkg/ignition/builder.go b/pkg/ignition/builder.go index 549a789b..791a70f7 100644 --- a/pkg/ignition/builder.go +++ b/pkg/ignition/builder.go @@ -3,6 +3,7 @@ package ignition import ( "encoding/json" "errors" + "fmt" "os/exec" "strings" @@ -30,9 +31,10 @@ type ignitionBuilder struct { httpProxy string httpsProxy string noProxy string + hostname string } -func New(nmStateData, registriesConf []byte, ironicBaseURL, ironicAgentImage, ironicAgentPullSecret, ironicRAMDiskSSHKey, ipOptions, httpProxy, httpsProxy, noProxy string) (*ignitionBuilder, error) { +func New(nmStateData, registriesConf []byte, ironicBaseURL, ironicAgentImage, ironicAgentPullSecret, ironicRAMDiskSSHKey, ipOptions string, httpProxy, httpsProxy, noProxy string, hostname string) (*ignitionBuilder, error) { if ironicBaseURL == "" { return nil, errors.New("ironicBaseURL is required") } @@ -51,6 +53,7 @@ func New(nmStateData, registriesConf []byte, ironicBaseURL, ironicAgentImage, ir httpProxy: httpProxy, httpsProxy: httpsProxy, noProxy: noProxy, + hostname: hostname, }, nil } @@ -99,10 +102,15 @@ func (b *ignitionBuilder) Generate() ([]byte, error) { "/etc/NetworkManager/conf.d/clientid.conf", 0644, false, []byte("[connection]\nipv6.dhcp-duid=ll\nipv6.dhcp-iaid=mac"))) + + update_hostname := fmt.Sprintf(` + [[ "$DHCP6_FQDN_FQDN" =~ "." ]] && hostnamectl set-hostname --static --transient $DHCP6_FQDN_FQDN + [[ "$(< /proc/sys/kernel/hostname)" =~ (localhost|localhost.localdomain) ]] && hostnamectl set-hostname --transient %s`, b.hostname) + config.Storage.Files = append(config.Storage.Files, ignitionFileEmbed( "/etc/NetworkManager/dispatcher.d/01-hostname", 0744, false, - []byte("[[ \"$DHCP6_FQDN_FQDN\" =~ \".\" ]] && hostnamectl set-hostname --static --transient $DHCP6_FQDN_FQDN"))) + []byte(update_hostname))) if len(b.registriesConf) > 0 { registriesFile := ignitionFileEmbed("/etc/containers/registries.conf", diff --git a/pkg/ignition/builder_test.go b/pkg/ignition/builder_test.go index 203d147c..d8e47b30 100644 --- a/pkg/ignition/builder_test.go +++ b/pkg/ignition/builder_test.go @@ -18,7 +18,7 @@ func TestGenerateRegistries(t *testing.T) { builder, err := New([]byte{}, []byte(registries), "http://ironic.example.com", "quay.io/openshift-release-dev/ironic-ipa-image", - "", "", "", "", "", "") + "", "", "", "", "", "", "virthost") if err != nil { t.Fatalf("Unexpected error %v", err) } diff --git a/pkg/imageprovider/rhcos.go b/pkg/imageprovider/rhcos.go index 058413a4..4ac089c5 100644 --- a/pkg/imageprovider/rhcos.go +++ b/pkg/imageprovider/rhcos.go @@ -45,7 +45,7 @@ func (ip *rhcosImageProvider) SupportsFormat(format metal3.ImageFormat) bool { } } -func (ip *rhcosImageProvider) buildIgnitionConfig(networkData imageprovider.NetworkData) ([]byte, error) { +func (ip *rhcosImageProvider) buildIgnitionConfig(networkData imageprovider.NetworkData, hostname string) ([]byte, error) { nmstateData := networkData["nmstate"] builder, err := ignition.New(nmstateData, ip.RegistriesConf, @@ -57,6 +57,7 @@ func (ip *rhcosImageProvider) buildIgnitionConfig(networkData imageprovider.Netw ip.EnvInputs.HttpProxy, ip.EnvInputs.HttpsProxy, ip.EnvInputs.NoProxy, + hostname, ) if err != nil { return nil, imageprovider.BuildInvalidError(err) @@ -84,7 +85,7 @@ func imageKey(data imageprovider.ImageData) string { } func (ip *rhcosImageProvider) BuildImage(data imageprovider.ImageData, networkData imageprovider.NetworkData, log logr.Logger) (string, error) { - ignitionConfig, err := ip.buildIgnitionConfig(networkData) + ignitionConfig, err := ip.buildIgnitionConfig(networkData, data.ImageMetadata.Name) if err != nil { return "", err }