diff --git a/internal/app/machined/pkg/runtime/v1alpha1/platform/nocloud/metadata.go b/internal/app/machined/pkg/runtime/v1alpha1/platform/nocloud/metadata.go index 86edf786a9..66b8166ec9 100644 --- a/internal/app/machined/pkg/runtime/v1alpha1/platform/nocloud/metadata.go +++ b/internal/app/machined/pkg/runtime/v1alpha1/platform/nocloud/metadata.go @@ -108,12 +108,13 @@ type Bonds struct { // MetadataConfig holds meta info. type MetadataConfig struct { - Hostname string `yaml:"hostname,omitempty"` - InstanceID string `yaml:"instance-id,omitempty"` - InstanceType string `yaml:"instance-type,omitempty"` - ProviderID string `yaml:"provider-id,omitempty"` - Region string `yaml:"region,omitempty"` - Zone string `yaml:"zone,omitempty"` + Hostname string `yaml:"hostname,omitempty"` + LocalHostname string `yaml:"local-hostname,omitempty"` + InstanceID string `yaml:"instance-id,omitempty"` + InstanceType string `yaml:"instance-type,omitempty"` + ProviderID string `yaml:"provider-id,omitempty"` + Region string `yaml:"region,omitempty"` + Zone string `yaml:"zone,omitempty"` } func (n *Nocloud) configFromNetwork(ctx context.Context, metaBaseURL string, r state.State) (metaConfig []byte, networkConfig []byte, machineConfig []byte, err error) { @@ -257,6 +258,15 @@ func (n *Nocloud) acquireConfig(ctx context.Context, r state.State) (metadataCon metadata.Hostname = hostname } + // Some providers may provide the hostname via user-data instead of meta-data (e.g. Proxmox VE) + // As long as the user doesn't use it for machine config, it can still be used to obtain the hostname + if metadata.Hostname == "" && metadata.LocalHostname == "" && machineConfigDl != nil { + fallbackMetadata := &MetadataConfig{} + _ = yaml.Unmarshal(machineConfigDl, fallbackMetadata) //nolint:errcheck + metadata.Hostname = fallbackMetadata.Hostname + metadata.LocalHostname = fallbackMetadata.LocalHostname + } + return metadataConfigDl, metadataNetworkConfigDl, machineConfigDl, metadata, err } diff --git a/internal/app/machined/pkg/runtime/v1alpha1/platform/nocloud/nocloud.go b/internal/app/machined/pkg/runtime/v1alpha1/platform/nocloud/nocloud.go index a67012f413..03f6610c45 100644 --- a/internal/app/machined/pkg/runtime/v1alpha1/platform/nocloud/nocloud.go +++ b/internal/app/machined/pkg/runtime/v1alpha1/platform/nocloud/nocloud.go @@ -33,12 +33,17 @@ func (n *Nocloud) Name() string { func (n *Nocloud) ParseMetadata(unmarshalledNetworkConfig *NetworkConfig, st state.State, metadata *MetadataConfig) (*runtime.PlatformNetworkConfig, error) { networkConfig := &runtime.PlatformNetworkConfig{} - if metadata.Hostname != "" { + hostname := metadata.Hostname + if hostname == "" { + hostname = metadata.LocalHostname + } + + if hostname != "" { hostnameSpec := network.HostnameSpecSpec{ ConfigLayer: network.ConfigPlatform, } - if err := hostnameSpec.ParseFQDN(metadata.Hostname); err != nil { + if err := hostnameSpec.ParseFQDN(hostname); err != nil { return nil, err } @@ -60,7 +65,7 @@ func (n *Nocloud) ParseMetadata(unmarshalledNetworkConfig *NetworkConfig, st sta networkConfig.Metadata = &runtimeres.PlatformMetadataSpec{ Platform: n.Name(), - Hostname: metadata.Hostname, + Hostname: hostname, InstanceID: metadata.InstanceID, InstanceType: metadata.InstanceType, ProviderID: metadata.ProviderID, diff --git a/internal/app/machined/pkg/runtime/v1alpha1/platform/nocloud/nocloud_test.go b/internal/app/machined/pkg/runtime/v1alpha1/platform/nocloud/nocloud_test.go index 079d59381b..5f7097ace5 100644 --- a/internal/app/machined/pkg/runtime/v1alpha1/platform/nocloud/nocloud_test.go +++ b/internal/app/machined/pkg/runtime/v1alpha1/platform/nocloud/nocloud_test.go @@ -74,16 +74,25 @@ func TestParseMetadata(t *testing.T) { Hostname: "talos.fqdn", InstanceID: "0", } + mc2 := nocloud.MetadataConfig{ + LocalHostname: "talos.fqdn", + InstanceID: "0", + } networkConfig, err := n.ParseMetadata(&m, st, &mc) require.NoError(t, err) + networkConfig2, err := n.ParseMetadata(&m, st, &mc2) + require.NoError(t, err) marshaled, err := yaml.Marshal(networkConfig) require.NoError(t, err) + marshaled2, err := yaml.Marshal(networkConfig2) + require.NoError(t, err) fmt.Print(string(marshaled)) assert.Equal(t, tt.expected, string(marshaled)) + assert.Equal(t, tt.expected, string(marshaled2)) }) } }