Skip to content

Commit

Permalink
feat: hostname configuration improvements on the NoCloud platform
Browse files Browse the repository at this point in the history
* support for local-hostname parameter
* support for hostnames passed via user-data (for Proxmox VE)

Signed-off-by: Andrei Kvapil <[email protected]>
Signed-off-by: Andrey Smirnov <[email protected]>
  • Loading branch information
kvaps authored and smira committed Oct 12, 2023
1 parent 7bb205e commit 6142d87
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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))
})
}
}

0 comments on commit 6142d87

Please sign in to comment.