diff --git a/api/resource/definitions/enums/enums.proto b/api/resource/definitions/enums/enums.proto index 4b571b956..a0815e736 100755 --- a/api/resource/definitions/enums/enums.proto +++ b/api/resource/definitions/enums/enums.proto @@ -376,6 +376,18 @@ enum NethelpersVLANProtocol { VLAN_PROTOCOL8021_AD = 34984; } +// NethelpersWOLMode wraps ethtool.WOLMode for YAML marshaling. +enum NethelpersWOLMode { + NETHELPERS_WOLMODE_UNSPECIFIED = 0; + WOL_MODE_PHY = 1; + WOL_MODE_UNICAST = 2; + WOL_MODE_MULTICAST = 4; + WOL_MODE_BROADCAST = 8; + WOL_MODE_MAGIC = 32; + WOL_MODE_MAGIC_SECURE = 64; + WOL_MODE_FILTER = 128; +} + // BlockEncryptionKeyType describes encryption key type. enum BlockEncryptionKeyType { ENCRYPTION_KEY_STATIC = 0; diff --git a/api/resource/definitions/network/network.proto b/api/resource/definitions/network/network.proto index 014a31e26..5efbbaf8b 100755 --- a/api/resource/definitions/network/network.proto +++ b/api/resource/definitions/network/network.proto @@ -169,6 +169,7 @@ message EthernetSpecSpec { EthernetRingsSpec rings = 1; map features = 2; EthernetChannelsSpec channels = 3; + repeated talos.resource.definitions.enums.NethelpersWOLMode wake_on_lan = 4; } // EthernetStatusSpec describes status of rendered secrets. @@ -182,6 +183,7 @@ message EthernetStatusSpec { EthernetRingsStatus rings = 7; repeated EthernetFeatureStatus features = 8; EthernetChannelsStatus channels = 9; + repeated talos.resource.definitions.enums.NethelpersWOLMode wake_on_lan = 10; } // HardwareAddrSpec describes spec for the link. diff --git a/hack/release.toml b/hack/release.toml index 096d1c4cd..040af35f2 100644 --- a/hack/release.toml +++ b/hack/release.toml @@ -66,6 +66,13 @@ The list of overridden settings is available with `talosctl get kernelparamstatu title = "Extra Binaries" description = """\ Talos Linux now ships with `nft` binary in the rootfs to support CNIs which shell out to `nft` command. +""" + + [notes.ethernet-config] + title = "Ethernet Configuration" + description = """\ +The Ethernet configuration now includes a `wakeOnLAN` field to enable Wake-on-LAN (WOL) support. +This field can be set to enable WOL and specify the desired WOL modes. """ [make_deps] diff --git a/internal/app/machined/pkg/controllers/cluster/node_identity_test.go b/internal/app/machined/pkg/controllers/cluster/node_identity_test.go index 4d3485ffd..1b0057f98 100644 --- a/internal/app/machined/pkg/controllers/cluster/node_identity_test.go +++ b/internal/app/machined/pkg/controllers/cluster/node_identity_test.go @@ -87,6 +87,10 @@ func (suite *NodeIdentitySuite) TestLoad() { func TestNodeIdentitySuite(t *testing.T) { t.Parallel() + if os.Geteuid() != 0 { + t.Skip("skipping test that requires root privileges") + } + suite.Run(t, &NodeIdentitySuite{ DefaultSuite: ctest.DefaultSuite{ AfterSetup: func(suite *ctest.DefaultSuite) { diff --git a/internal/app/machined/pkg/controllers/config/acquire_test.go b/internal/app/machined/pkg/controllers/config/acquire_test.go index 1561a8052..5a3db37d2 100644 --- a/internal/app/machined/pkg/controllers/config/acquire_test.go +++ b/internal/app/machined/pkg/controllers/config/acquire_test.go @@ -297,6 +297,10 @@ func (suite *AcquireSuite) injectViaDisk(cfg []byte, wait bool) { } func (suite *AcquireSuite) TestFromDisk() { + if os.Geteuid() != 0 { + suite.T().Skip("skipping test that requires root privileges") + } + suite.presentStateVolume() suite.triggerAcquire() @@ -319,6 +323,10 @@ func (suite *AcquireSuite) TestFromDisk() { } func (suite *AcquireSuite) TestFromDiskFailure() { + if os.Geteuid() != 0 { + suite.T().Skip("skipping test that requires root privileges") + } + suite.presentStateVolume() suite.triggerAcquire() @@ -344,6 +352,10 @@ func (suite *AcquireSuite) TestFromDiskFailure() { } func (suite *AcquireSuite) TestFromDiskToMaintenance() { + if os.Geteuid() != 0 { + suite.T().Skip("skipping test that requires root privileges") + } + suite.presentStateVolume() suite.triggerAcquire() diff --git a/internal/app/machined/pkg/controllers/config/persistence_test.go b/internal/app/machined/pkg/controllers/config/persistence_test.go index 0562d1281..6b52e0a18 100644 --- a/internal/app/machined/pkg/controllers/config/persistence_test.go +++ b/internal/app/machined/pkg/controllers/config/persistence_test.go @@ -133,6 +133,10 @@ func (suite *PersistenceSuite) TestConfig() { func TestPersistenceSuite(t *testing.T) { t.Parallel() + if os.Geteuid() != 0 { + t.Skip("skipping test that requires root privileges") + } + sideroLinkCfg1 := siderolink.NewConfigV1Alpha1() sideroLinkCfg1.APIUrlConfig.URL = must(url.Parse("https://siderolink.api/?jointoken=secret&user=alice")) diff --git a/internal/app/machined/pkg/controllers/kubespan/identity_test.go b/internal/app/machined/pkg/controllers/kubespan/identity_test.go index 3c4b49305..f60ba1499 100644 --- a/internal/app/machined/pkg/controllers/kubespan/identity_test.go +++ b/internal/app/machined/pkg/controllers/kubespan/identity_test.go @@ -139,6 +139,10 @@ func TestIdentitySuite(t *testing.T) { t.Skip("skipping test in FIPS mode") } + if os.Geteuid() != 0 { + t.Skip("skipping test that requires root privileges") + } + suite.Run(t, &IdentitySuite{ DefaultSuite: ctest.DefaultSuite{ AfterSetup: func(suite *ctest.DefaultSuite) { diff --git a/internal/app/machined/pkg/controllers/network/etcfile_test.go b/internal/app/machined/pkg/controllers/network/etcfile_test.go index f5a1d6f32..ead605abf 100644 --- a/internal/app/machined/pkg/controllers/network/etcfile_test.go +++ b/internal/app/machined/pkg/controllers/network/etcfile_test.go @@ -342,5 +342,9 @@ func (suite *EtcFileConfigSuite) TearDownTest() { } func TestEtcFileConfigSuite(t *testing.T) { + if os.Geteuid() != 0 { + t.Skip("skipping test that requires root privileges") + } + suite.Run(t, new(EtcFileConfigSuite)) } diff --git a/internal/app/machined/pkg/controllers/network/ethernet_config.go b/internal/app/machined/pkg/controllers/network/ethernet_config.go index dda3cf632..9c8f7b931 100644 --- a/internal/app/machined/pkg/controllers/network/ethernet_config.go +++ b/internal/app/machined/pkg/controllers/network/ethernet_config.go @@ -83,6 +83,7 @@ func (ctrl *EthernetConfigController) apply(ctx context.Context, r controller.Ru spec.TypedSpec().Rings = network.EthernetRingsSpec(cfg.Rings()) spec.TypedSpec().Channels = network.EthernetChannelsSpec(cfg.Channels()) spec.TypedSpec().Features = cfg.Features() + spec.TypedSpec().WakeOnLAN = cfg.WakeOnLAN() return nil }); err != nil { diff --git a/internal/app/machined/pkg/controllers/network/ethernet_spec.go b/internal/app/machined/pkg/controllers/network/ethernet_spec.go index b042b717e..1d4bf8bf8 100644 --- a/internal/app/machined/pkg/controllers/network/ethernet_spec.go +++ b/internal/app/machined/pkg/controllers/network/ethernet_spec.go @@ -17,6 +17,7 @@ import ( "go.uber.org/zap" "github.com/siderolabs/talos/internal/app/machined/pkg/controllers/runtime" + "github.com/siderolabs/talos/pkg/machinery/nethelpers" "github.com/siderolabs/talos/pkg/machinery/resources/network" ) @@ -153,5 +154,22 @@ func (ctrl *EthernetSpecController) apply( } } + if spec.TypedSpec().WakeOnLAN != nil { + var wolModes nethelpers.WOLMode + + for _, mode := range spec.TypedSpec().WakeOnLAN { + wolModes |= mode + } + + if err := ethClient.SetWakeOnLAN(ethtool.WakeOnLAN{ + Interface: ethtool.Interface{ + Name: spec.Metadata().ID(), + }, + Modes: ethtool.WOLMode(wolModes), + }); err != nil { + return fmt.Errorf("error updating wake-on-lan: %w", err) + } + } + return nil } diff --git a/internal/app/machined/pkg/controllers/network/ethernet_status.go b/internal/app/machined/pkg/controllers/network/ethernet_status.go index 50695fad2..a1700c138 100644 --- a/internal/app/machined/pkg/controllers/network/ethernet_status.go +++ b/internal/app/machined/pkg/controllers/network/ethernet_status.go @@ -103,7 +103,7 @@ func (ctrl *EthernetStatusController) Run(ctx context.Context, r controller.Runt // reconcile function runs for every reconciliation loop querying the ethtool state and updating resources. // -//nolint:gocyclo +//nolint:gocyclo,cyclop func (ctrl *EthernetStatusController) reconcile( ctx context.Context, r controller.Runtime, @@ -145,6 +145,11 @@ func (ctrl *EthernetStatusController) reconcile( lgger.Warn("error getting channels", zap.Error(err)) } + wolMode, err := ethClient.WakeOnLAN(iface) + if err != nil && !errors.Is(err, os.ErrNotExist) { + lgger.Warn("error getting Wake-on-LAN", zap.Error(err)) + } + if err := safe.WriterModify(ctx, r, network.NewEthernetStatus(network.NamespaceName, iface.Name), func(res *network.EthernetStatus) error { res.TypedSpec().Port = nethelpers.Port(linkInfo.Port) @@ -211,6 +216,16 @@ func (ctrl *EthernetStatusController) reconcile( } } + res.TypedSpec().WakeOnLAN = nil + + if wolMode != nil { + for mode := nethelpers.WOLModeMin; mode <= nethelpers.WOLModeMax; mode <<= 1 { + if (nethelpers.WOLMode(wolMode.Modes) & mode) == mode { + res.TypedSpec().WakeOnLAN = append(res.TypedSpec().WakeOnLAN, mode) + } + } + } + return nil }); err != nil { return fmt.Errorf("error updating EthernetStatus resource: %w", err) diff --git a/internal/app/machined/pkg/controllers/network/platform_config_load_test.go b/internal/app/machined/pkg/controllers/network/platform_config_load_test.go index 112291819..59e1d65e9 100644 --- a/internal/app/machined/pkg/controllers/network/platform_config_load_test.go +++ b/internal/app/machined/pkg/controllers/network/platform_config_load_test.go @@ -72,6 +72,10 @@ func (suite *PlatformConfigLoadSuite) TestLoadConfig() { func TestPlatformConfigLoadSuite(t *testing.T) { t.Parallel() + if os.Geteuid() != 0 { + t.Skip("skipping test that requires root privileges") + } + suite.Run(t, &PlatformConfigLoadSuite{ DefaultSuite: ctest.DefaultSuite{ Timeout: 5 * time.Second, diff --git a/internal/app/machined/pkg/controllers/network/platform_config_store_test.go b/internal/app/machined/pkg/controllers/network/platform_config_store_test.go index 463049cc6..0c2828565 100644 --- a/internal/app/machined/pkg/controllers/network/platform_config_store_test.go +++ b/internal/app/machined/pkg/controllers/network/platform_config_store_test.go @@ -88,6 +88,10 @@ func (suite *PlatformConfigStoreSuite) TestStoreConfig() { func TestPlatformConfigStoreSuite(t *testing.T) { t.Parallel() + if os.Geteuid() != 0 { + t.Skip("skipping test that requires root privileges") + } + suite.Run(t, &PlatformConfigStoreSuite{ DefaultSuite: ctest.DefaultSuite{ Timeout: 5 * time.Second, diff --git a/internal/app/machined/pkg/controllers/secrets/encryption_salt_test.go b/internal/app/machined/pkg/controllers/secrets/encryption_salt_test.go index f46774848..278874fe0 100644 --- a/internal/app/machined/pkg/controllers/secrets/encryption_salt_test.go +++ b/internal/app/machined/pkg/controllers/secrets/encryption_salt_test.go @@ -95,6 +95,10 @@ func (suite *EncryptionSaltSuite) TestLoad() { func TestEncryptionSaltSuite(t *testing.T) { t.Parallel() + if os.Geteuid() != 0 { + t.Skip("skipping test that requires root privileges") + } + suite.Run(t, &EncryptionSaltSuite{ DefaultSuite: ctest.DefaultSuite{ AfterSetup: func(suite *ctest.DefaultSuite) { diff --git a/pkg/machinery/api/resource/definitions/enums/enums.pb.go b/pkg/machinery/api/resource/definitions/enums/enums.pb.go index 2091a1ddc..462bc1e42 100644 --- a/pkg/machinery/api/resource/definitions/enums/enums.pb.go +++ b/pkg/machinery/api/resource/definitions/enums/enums.pb.go @@ -1985,6 +1985,71 @@ func (NethelpersVLANProtocol) EnumDescriptor() ([]byte, []int) { return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{29} } +// NethelpersWOLMode wraps ethtool.WOLMode for YAML marshaling. +type NethelpersWOLMode int32 + +const ( + NethelpersWOLMode_NETHELPERS_WOLMODE_UNSPECIFIED NethelpersWOLMode = 0 + NethelpersWOLMode_WOL_MODE_PHY NethelpersWOLMode = 1 + NethelpersWOLMode_WOL_MODE_UNICAST NethelpersWOLMode = 2 + NethelpersWOLMode_WOL_MODE_MULTICAST NethelpersWOLMode = 4 + NethelpersWOLMode_WOL_MODE_BROADCAST NethelpersWOLMode = 8 + NethelpersWOLMode_WOL_MODE_MAGIC NethelpersWOLMode = 32 + NethelpersWOLMode_WOL_MODE_MAGIC_SECURE NethelpersWOLMode = 64 + NethelpersWOLMode_WOL_MODE_FILTER NethelpersWOLMode = 128 +) + +// Enum value maps for NethelpersWOLMode. +var ( + NethelpersWOLMode_name = map[int32]string{ + 0: "NETHELPERS_WOLMODE_UNSPECIFIED", + 1: "WOL_MODE_PHY", + 2: "WOL_MODE_UNICAST", + 4: "WOL_MODE_MULTICAST", + 8: "WOL_MODE_BROADCAST", + 32: "WOL_MODE_MAGIC", + 64: "WOL_MODE_MAGIC_SECURE", + 128: "WOL_MODE_FILTER", + } + NethelpersWOLMode_value = map[string]int32{ + "NETHELPERS_WOLMODE_UNSPECIFIED": 0, + "WOL_MODE_PHY": 1, + "WOL_MODE_UNICAST": 2, + "WOL_MODE_MULTICAST": 4, + "WOL_MODE_BROADCAST": 8, + "WOL_MODE_MAGIC": 32, + "WOL_MODE_MAGIC_SECURE": 64, + "WOL_MODE_FILTER": 128, + } +) + +func (x NethelpersWOLMode) Enum() *NethelpersWOLMode { + p := new(NethelpersWOLMode) + *p = x + return p +} + +func (x NethelpersWOLMode) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (NethelpersWOLMode) Descriptor() protoreflect.EnumDescriptor { + return file_resource_definitions_enums_enums_proto_enumTypes[30].Descriptor() +} + +func (NethelpersWOLMode) Type() protoreflect.EnumType { + return &file_resource_definitions_enums_enums_proto_enumTypes[30] +} + +func (x NethelpersWOLMode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use NethelpersWOLMode.Descriptor instead. +func (NethelpersWOLMode) EnumDescriptor() ([]byte, []int) { + return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{30} +} + // BlockEncryptionKeyType describes encryption key type. type BlockEncryptionKeyType int32 @@ -2022,11 +2087,11 @@ func (x BlockEncryptionKeyType) String() string { } func (BlockEncryptionKeyType) Descriptor() protoreflect.EnumDescriptor { - return file_resource_definitions_enums_enums_proto_enumTypes[30].Descriptor() + return file_resource_definitions_enums_enums_proto_enumTypes[31].Descriptor() } func (BlockEncryptionKeyType) Type() protoreflect.EnumType { - return &file_resource_definitions_enums_enums_proto_enumTypes[30] + return &file_resource_definitions_enums_enums_proto_enumTypes[31] } func (x BlockEncryptionKeyType) Number() protoreflect.EnumNumber { @@ -2035,7 +2100,7 @@ func (x BlockEncryptionKeyType) Number() protoreflect.EnumNumber { // Deprecated: Use BlockEncryptionKeyType.Descriptor instead. func (BlockEncryptionKeyType) EnumDescriptor() ([]byte, []int) { - return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{30} + return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{31} } // BlockEncryptionProviderType describes encryption provider type. @@ -2069,11 +2134,11 @@ func (x BlockEncryptionProviderType) String() string { } func (BlockEncryptionProviderType) Descriptor() protoreflect.EnumDescriptor { - return file_resource_definitions_enums_enums_proto_enumTypes[31].Descriptor() + return file_resource_definitions_enums_enums_proto_enumTypes[32].Descriptor() } func (BlockEncryptionProviderType) Type() protoreflect.EnumType { - return &file_resource_definitions_enums_enums_proto_enumTypes[31] + return &file_resource_definitions_enums_enums_proto_enumTypes[32] } func (x BlockEncryptionProviderType) Number() protoreflect.EnumNumber { @@ -2082,7 +2147,7 @@ func (x BlockEncryptionProviderType) Number() protoreflect.EnumNumber { // Deprecated: Use BlockEncryptionProviderType.Descriptor instead. func (BlockEncryptionProviderType) EnumDescriptor() ([]byte, []int) { - return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{31} + return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{32} } // BlockFilesystemType describes filesystem type. @@ -2128,11 +2193,11 @@ func (x BlockFilesystemType) String() string { } func (BlockFilesystemType) Descriptor() protoreflect.EnumDescriptor { - return file_resource_definitions_enums_enums_proto_enumTypes[32].Descriptor() + return file_resource_definitions_enums_enums_proto_enumTypes[33].Descriptor() } func (BlockFilesystemType) Type() protoreflect.EnumType { - return &file_resource_definitions_enums_enums_proto_enumTypes[32] + return &file_resource_definitions_enums_enums_proto_enumTypes[33] } func (x BlockFilesystemType) Number() protoreflect.EnumNumber { @@ -2141,7 +2206,7 @@ func (x BlockFilesystemType) Number() protoreflect.EnumNumber { // Deprecated: Use BlockFilesystemType.Descriptor instead. func (BlockFilesystemType) EnumDescriptor() ([]byte, []int) { - return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{32} + return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{33} } // BlockVolumePhase describes volume phase. @@ -2193,11 +2258,11 @@ func (x BlockVolumePhase) String() string { } func (BlockVolumePhase) Descriptor() protoreflect.EnumDescriptor { - return file_resource_definitions_enums_enums_proto_enumTypes[33].Descriptor() + return file_resource_definitions_enums_enums_proto_enumTypes[34].Descriptor() } func (BlockVolumePhase) Type() protoreflect.EnumType { - return &file_resource_definitions_enums_enums_proto_enumTypes[33] + return &file_resource_definitions_enums_enums_proto_enumTypes[34] } func (x BlockVolumePhase) Number() protoreflect.EnumNumber { @@ -2206,7 +2271,7 @@ func (x BlockVolumePhase) Number() protoreflect.EnumNumber { // Deprecated: Use BlockVolumePhase.Descriptor instead. func (BlockVolumePhase) EnumDescriptor() ([]byte, []int) { - return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{33} + return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{34} } // BlockVolumeType describes volume type. @@ -2252,11 +2317,11 @@ func (x BlockVolumeType) String() string { } func (BlockVolumeType) Descriptor() protoreflect.EnumDescriptor { - return file_resource_definitions_enums_enums_proto_enumTypes[34].Descriptor() + return file_resource_definitions_enums_enums_proto_enumTypes[35].Descriptor() } func (BlockVolumeType) Type() protoreflect.EnumType { - return &file_resource_definitions_enums_enums_proto_enumTypes[34] + return &file_resource_definitions_enums_enums_proto_enumTypes[35] } func (x BlockVolumeType) Number() protoreflect.EnumNumber { @@ -2265,7 +2330,7 @@ func (x BlockVolumeType) Number() protoreflect.EnumNumber { // Deprecated: Use BlockVolumeType.Descriptor instead. func (BlockVolumeType) EnumDescriptor() ([]byte, []int) { - return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{34} + return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{35} } // CriImageCacheStatus describes image cache status type. @@ -2305,11 +2370,11 @@ func (x CriImageCacheStatus) String() string { } func (CriImageCacheStatus) Descriptor() protoreflect.EnumDescriptor { - return file_resource_definitions_enums_enums_proto_enumTypes[35].Descriptor() + return file_resource_definitions_enums_enums_proto_enumTypes[36].Descriptor() } func (CriImageCacheStatus) Type() protoreflect.EnumType { - return &file_resource_definitions_enums_enums_proto_enumTypes[35] + return &file_resource_definitions_enums_enums_proto_enumTypes[36] } func (x CriImageCacheStatus) Number() protoreflect.EnumNumber { @@ -2318,7 +2383,7 @@ func (x CriImageCacheStatus) Number() protoreflect.EnumNumber { // Deprecated: Use CriImageCacheStatus.Descriptor instead. func (CriImageCacheStatus) EnumDescriptor() ([]byte, []int) { - return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{35} + return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{36} } // CriImageCacheCopyStatus describes image cache copy status type. @@ -2358,11 +2423,11 @@ func (x CriImageCacheCopyStatus) String() string { } func (CriImageCacheCopyStatus) Descriptor() protoreflect.EnumDescriptor { - return file_resource_definitions_enums_enums_proto_enumTypes[36].Descriptor() + return file_resource_definitions_enums_enums_proto_enumTypes[37].Descriptor() } func (CriImageCacheCopyStatus) Type() protoreflect.EnumType { - return &file_resource_definitions_enums_enums_proto_enumTypes[36] + return &file_resource_definitions_enums_enums_proto_enumTypes[37] } func (x CriImageCacheCopyStatus) Number() protoreflect.EnumNumber { @@ -2371,7 +2436,7 @@ func (x CriImageCacheCopyStatus) Number() protoreflect.EnumNumber { // Deprecated: Use CriImageCacheCopyStatus.Descriptor instead. func (CriImageCacheCopyStatus) EnumDescriptor() ([]byte, []int) { - return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{36} + return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{37} } // KubespanPeerState is KubeSpan peer current state. @@ -2408,11 +2473,11 @@ func (x KubespanPeerState) String() string { } func (KubespanPeerState) Descriptor() protoreflect.EnumDescriptor { - return file_resource_definitions_enums_enums_proto_enumTypes[37].Descriptor() + return file_resource_definitions_enums_enums_proto_enumTypes[38].Descriptor() } func (KubespanPeerState) Type() protoreflect.EnumType { - return &file_resource_definitions_enums_enums_proto_enumTypes[37] + return &file_resource_definitions_enums_enums_proto_enumTypes[38] } func (x KubespanPeerState) Number() protoreflect.EnumNumber { @@ -2421,7 +2486,7 @@ func (x KubespanPeerState) Number() protoreflect.EnumNumber { // Deprecated: Use KubespanPeerState.Descriptor instead. func (KubespanPeerState) EnumDescriptor() ([]byte, []int) { - return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{37} + return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{38} } // RuntimeMachineStage describes the stage of the machine boot/run process. @@ -2476,11 +2541,11 @@ func (x RuntimeMachineStage) String() string { } func (RuntimeMachineStage) Descriptor() protoreflect.EnumDescriptor { - return file_resource_definitions_enums_enums_proto_enumTypes[38].Descriptor() + return file_resource_definitions_enums_enums_proto_enumTypes[39].Descriptor() } func (RuntimeMachineStage) Type() protoreflect.EnumType { - return &file_resource_definitions_enums_enums_proto_enumTypes[38] + return &file_resource_definitions_enums_enums_proto_enumTypes[39] } func (x RuntimeMachineStage) Number() protoreflect.EnumNumber { @@ -2489,7 +2554,7 @@ func (x RuntimeMachineStage) Number() protoreflect.EnumNumber { // Deprecated: Use RuntimeMachineStage.Descriptor instead. func (RuntimeMachineStage) EnumDescriptor() ([]byte, []int) { - return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{38} + return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{39} } // RuntimeSELinuxState describes the current SELinux status. @@ -2526,11 +2591,11 @@ func (x RuntimeSELinuxState) String() string { } func (RuntimeSELinuxState) Descriptor() protoreflect.EnumDescriptor { - return file_resource_definitions_enums_enums_proto_enumTypes[39].Descriptor() + return file_resource_definitions_enums_enums_proto_enumTypes[40].Descriptor() } func (RuntimeSELinuxState) Type() protoreflect.EnumType { - return &file_resource_definitions_enums_enums_proto_enumTypes[39] + return &file_resource_definitions_enums_enums_proto_enumTypes[40] } func (x RuntimeSELinuxState) Number() protoreflect.EnumNumber { @@ -2539,7 +2604,7 @@ func (x RuntimeSELinuxState) Number() protoreflect.EnumNumber { // Deprecated: Use RuntimeSELinuxState.Descriptor instead. func (RuntimeSELinuxState) EnumDescriptor() ([]byte, []int) { - return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{39} + return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{40} } // RuntimeFIPSState describes the current FIPS status. @@ -2576,11 +2641,11 @@ func (x RuntimeFIPSState) String() string { } func (RuntimeFIPSState) Descriptor() protoreflect.EnumDescriptor { - return file_resource_definitions_enums_enums_proto_enumTypes[40].Descriptor() + return file_resource_definitions_enums_enums_proto_enumTypes[41].Descriptor() } func (RuntimeFIPSState) Type() protoreflect.EnumType { - return &file_resource_definitions_enums_enums_proto_enumTypes[40] + return &file_resource_definitions_enums_enums_proto_enumTypes[41] } func (x RuntimeFIPSState) Number() protoreflect.EnumNumber { @@ -2589,7 +2654,7 @@ func (x RuntimeFIPSState) Number() protoreflect.EnumNumber { // Deprecated: Use RuntimeFIPSState.Descriptor instead. func (RuntimeFIPSState) EnumDescriptor() ([]byte, []int) { - return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{40} + return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{41} } // NetworkConfigLayer describes network configuration layers, with lowest priority first. @@ -2632,11 +2697,11 @@ func (x NetworkConfigLayer) String() string { } func (NetworkConfigLayer) Descriptor() protoreflect.EnumDescriptor { - return file_resource_definitions_enums_enums_proto_enumTypes[41].Descriptor() + return file_resource_definitions_enums_enums_proto_enumTypes[42].Descriptor() } func (NetworkConfigLayer) Type() protoreflect.EnumType { - return &file_resource_definitions_enums_enums_proto_enumTypes[41] + return &file_resource_definitions_enums_enums_proto_enumTypes[42] } func (x NetworkConfigLayer) Number() protoreflect.EnumNumber { @@ -2645,7 +2710,7 @@ func (x NetworkConfigLayer) Number() protoreflect.EnumNumber { // Deprecated: Use NetworkConfigLayer.Descriptor instead. func (NetworkConfigLayer) EnumDescriptor() ([]byte, []int) { - return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{41} + return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{42} } // NetworkOperator enumerates Talos network operators. @@ -2682,11 +2747,11 @@ func (x NetworkOperator) String() string { } func (NetworkOperator) Descriptor() protoreflect.EnumDescriptor { - return file_resource_definitions_enums_enums_proto_enumTypes[42].Descriptor() + return file_resource_definitions_enums_enums_proto_enumTypes[43].Descriptor() } func (NetworkOperator) Type() protoreflect.EnumType { - return &file_resource_definitions_enums_enums_proto_enumTypes[42] + return &file_resource_definitions_enums_enums_proto_enumTypes[43] } func (x NetworkOperator) Number() protoreflect.EnumNumber { @@ -2695,7 +2760,7 @@ func (x NetworkOperator) Number() protoreflect.EnumNumber { // Deprecated: Use NetworkOperator.Descriptor instead. func (NetworkOperator) EnumDescriptor() ([]byte, []int) { - return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{42} + return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{43} } var File_resource_definitions_enums_enums_proto protoreflect.FileDescriptor @@ -2999,7 +3064,16 @@ const file_resource_definitions_enums_enums_proto_rawDesc = "" + "\x16NethelpersVLANProtocol\x12'\n" + "#NETHELPERS_VLANPROTOCOL_UNSPECIFIED\x10\x00\x12\x19\n" + "\x13VLAN_PROTOCOL8021_Q\x10\x80\x82\x02\x12\x1a\n" + - "\x14VLAN_PROTOCOL8021_AD\x10\xa8\x91\x02*\x7f\n" + + "\x14VLAN_PROTOCOL8021_AD\x10\xa8\x91\x02*\xd4\x01\n" + + "\x11NethelpersWOLMode\x12\"\n" + + "\x1eNETHELPERS_WOLMODE_UNSPECIFIED\x10\x00\x12\x10\n" + + "\fWOL_MODE_PHY\x10\x01\x12\x14\n" + + "\x10WOL_MODE_UNICAST\x10\x02\x12\x16\n" + + "\x12WOL_MODE_MULTICAST\x10\x04\x12\x16\n" + + "\x12WOL_MODE_BROADCAST\x10\b\x12\x12\n" + + "\x0eWOL_MODE_MAGIC\x10 \x12\x19\n" + + "\x15WOL_MODE_MAGIC_SECURE\x10@\x12\x14\n" + + "\x0fWOL_MODE_FILTER\x10\x80\x01*\x7f\n" + "\x16BlockEncryptionKeyType\x12\x19\n" + "\x15ENCRYPTION_KEY_STATIC\x10\x00\x12\x1a\n" + "\x16ENCRYPTION_KEY_NODE_ID\x10\x01\x12\x16\n" + @@ -3087,7 +3161,7 @@ func file_resource_definitions_enums_enums_proto_rawDescGZIP() []byte { return file_resource_definitions_enums_enums_proto_rawDescData } -var file_resource_definitions_enums_enums_proto_enumTypes = make([]protoimpl.EnumInfo, 43) +var file_resource_definitions_enums_enums_proto_enumTypes = make([]protoimpl.EnumInfo, 44) var file_resource_definitions_enums_enums_proto_goTypes = []any{ (MachineType)(0), // 0: talos.resource.definitions.enums.MachineType (NethelpersAddressFlag)(0), // 1: talos.resource.definitions.enums.NethelpersAddressFlag @@ -3119,19 +3193,20 @@ var file_resource_definitions_enums_enums_proto_goTypes = []any{ (NethelpersRoutingTable)(0), // 27: talos.resource.definitions.enums.NethelpersRoutingTable (NethelpersScope)(0), // 28: talos.resource.definitions.enums.NethelpersScope (NethelpersVLANProtocol)(0), // 29: talos.resource.definitions.enums.NethelpersVLANProtocol - (BlockEncryptionKeyType)(0), // 30: talos.resource.definitions.enums.BlockEncryptionKeyType - (BlockEncryptionProviderType)(0), // 31: talos.resource.definitions.enums.BlockEncryptionProviderType - (BlockFilesystemType)(0), // 32: talos.resource.definitions.enums.BlockFilesystemType - (BlockVolumePhase)(0), // 33: talos.resource.definitions.enums.BlockVolumePhase - (BlockVolumeType)(0), // 34: talos.resource.definitions.enums.BlockVolumeType - (CriImageCacheStatus)(0), // 35: talos.resource.definitions.enums.CriImageCacheStatus - (CriImageCacheCopyStatus)(0), // 36: talos.resource.definitions.enums.CriImageCacheCopyStatus - (KubespanPeerState)(0), // 37: talos.resource.definitions.enums.KubespanPeerState - (RuntimeMachineStage)(0), // 38: talos.resource.definitions.enums.RuntimeMachineStage - (RuntimeSELinuxState)(0), // 39: talos.resource.definitions.enums.RuntimeSELinuxState - (RuntimeFIPSState)(0), // 40: talos.resource.definitions.enums.RuntimeFIPSState - (NetworkConfigLayer)(0), // 41: talos.resource.definitions.enums.NetworkConfigLayer - (NetworkOperator)(0), // 42: talos.resource.definitions.enums.NetworkOperator + (NethelpersWOLMode)(0), // 30: talos.resource.definitions.enums.NethelpersWOLMode + (BlockEncryptionKeyType)(0), // 31: talos.resource.definitions.enums.BlockEncryptionKeyType + (BlockEncryptionProviderType)(0), // 32: talos.resource.definitions.enums.BlockEncryptionProviderType + (BlockFilesystemType)(0), // 33: talos.resource.definitions.enums.BlockFilesystemType + (BlockVolumePhase)(0), // 34: talos.resource.definitions.enums.BlockVolumePhase + (BlockVolumeType)(0), // 35: talos.resource.definitions.enums.BlockVolumeType + (CriImageCacheStatus)(0), // 36: talos.resource.definitions.enums.CriImageCacheStatus + (CriImageCacheCopyStatus)(0), // 37: talos.resource.definitions.enums.CriImageCacheCopyStatus + (KubespanPeerState)(0), // 38: talos.resource.definitions.enums.KubespanPeerState + (RuntimeMachineStage)(0), // 39: talos.resource.definitions.enums.RuntimeMachineStage + (RuntimeSELinuxState)(0), // 40: talos.resource.definitions.enums.RuntimeSELinuxState + (RuntimeFIPSState)(0), // 41: talos.resource.definitions.enums.RuntimeFIPSState + (NetworkConfigLayer)(0), // 42: talos.resource.definitions.enums.NetworkConfigLayer + (NetworkOperator)(0), // 43: talos.resource.definitions.enums.NetworkOperator } var file_resource_definitions_enums_enums_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type @@ -3151,7 +3226,7 @@ func file_resource_definitions_enums_enums_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_resource_definitions_enums_enums_proto_rawDesc), len(file_resource_definitions_enums_enums_proto_rawDesc)), - NumEnums: 43, + NumEnums: 44, NumMessages: 0, NumExtensions: 0, NumServices: 0, diff --git a/pkg/machinery/api/resource/definitions/network/network.pb.go b/pkg/machinery/api/resource/definitions/network/network.pb.go index 7caabf782..cad4fcbca 100644 --- a/pkg/machinery/api/resource/definitions/network/network.pb.go +++ b/pkg/machinery/api/resource/definitions/network/network.pb.go @@ -1336,10 +1336,11 @@ func (x *EthernetRingsStatus) GetTcpDataSplit() bool { // EthernetSpecSpec describes config of Ethernet link. type EthernetSpecSpec struct { - state protoimpl.MessageState `protogen:"open.v1"` - Rings *EthernetRingsSpec `protobuf:"bytes,1,opt,name=rings,proto3" json:"rings,omitempty"` - Features map[string]bool `protobuf:"bytes,2,rep,name=features,proto3" json:"features,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` - Channels *EthernetChannelsSpec `protobuf:"bytes,3,opt,name=channels,proto3" json:"channels,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Rings *EthernetRingsSpec `protobuf:"bytes,1,opt,name=rings,proto3" json:"rings,omitempty"` + Features map[string]bool `protobuf:"bytes,2,rep,name=features,proto3" json:"features,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + Channels *EthernetChannelsSpec `protobuf:"bytes,3,opt,name=channels,proto3" json:"channels,omitempty"` + WakeOnLan []enums.NethelpersWOLMode `protobuf:"varint,4,rep,packed,name=wake_on_lan,json=wakeOnLan,proto3,enum=talos.resource.definitions.enums.NethelpersWOLMode" json:"wake_on_lan,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1395,18 +1396,26 @@ func (x *EthernetSpecSpec) GetChannels() *EthernetChannelsSpec { return nil } +func (x *EthernetSpecSpec) GetWakeOnLan() []enums.NethelpersWOLMode { + if x != nil { + return x.WakeOnLan + } + return nil +} + // EthernetStatusSpec describes status of rendered secrets. type EthernetStatusSpec struct { - state protoimpl.MessageState `protogen:"open.v1"` - LinkState bool `protobuf:"varint,1,opt,name=link_state,json=linkState,proto3" json:"link_state,omitempty"` - SpeedMegabits int64 `protobuf:"varint,2,opt,name=speed_megabits,json=speedMegabits,proto3" json:"speed_megabits,omitempty"` - Port enums.NethelpersPort `protobuf:"varint,3,opt,name=port,proto3,enum=talos.resource.definitions.enums.NethelpersPort" json:"port,omitempty"` - Duplex enums.NethelpersDuplex `protobuf:"varint,4,opt,name=duplex,proto3,enum=talos.resource.definitions.enums.NethelpersDuplex" json:"duplex,omitempty"` - OurModes []string `protobuf:"bytes,5,rep,name=our_modes,json=ourModes,proto3" json:"our_modes,omitempty"` - PeerModes []string `protobuf:"bytes,6,rep,name=peer_modes,json=peerModes,proto3" json:"peer_modes,omitempty"` - Rings *EthernetRingsStatus `protobuf:"bytes,7,opt,name=rings,proto3" json:"rings,omitempty"` - Features []*EthernetFeatureStatus `protobuf:"bytes,8,rep,name=features,proto3" json:"features,omitempty"` - Channels *EthernetChannelsStatus `protobuf:"bytes,9,opt,name=channels,proto3" json:"channels,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + LinkState bool `protobuf:"varint,1,opt,name=link_state,json=linkState,proto3" json:"link_state,omitempty"` + SpeedMegabits int64 `protobuf:"varint,2,opt,name=speed_megabits,json=speedMegabits,proto3" json:"speed_megabits,omitempty"` + Port enums.NethelpersPort `protobuf:"varint,3,opt,name=port,proto3,enum=talos.resource.definitions.enums.NethelpersPort" json:"port,omitempty"` + Duplex enums.NethelpersDuplex `protobuf:"varint,4,opt,name=duplex,proto3,enum=talos.resource.definitions.enums.NethelpersDuplex" json:"duplex,omitempty"` + OurModes []string `protobuf:"bytes,5,rep,name=our_modes,json=ourModes,proto3" json:"our_modes,omitempty"` + PeerModes []string `protobuf:"bytes,6,rep,name=peer_modes,json=peerModes,proto3" json:"peer_modes,omitempty"` + Rings *EthernetRingsStatus `protobuf:"bytes,7,opt,name=rings,proto3" json:"rings,omitempty"` + Features []*EthernetFeatureStatus `protobuf:"bytes,8,rep,name=features,proto3" json:"features,omitempty"` + Channels *EthernetChannelsStatus `protobuf:"bytes,9,opt,name=channels,proto3" json:"channels,omitempty"` + WakeOnLan []enums.NethelpersWOLMode `protobuf:"varint,10,rep,packed,name=wake_on_lan,json=wakeOnLan,proto3,enum=talos.resource.definitions.enums.NethelpersWOLMode" json:"wake_on_lan,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1504,6 +1513,13 @@ func (x *EthernetStatusSpec) GetChannels() *EthernetChannelsStatus { return nil } +func (x *EthernetStatusSpec) GetWakeOnLan() []enums.NethelpersWOLMode { + if x != nil { + return x.WakeOnLan + } + return nil +} + // HardwareAddrSpec describes spec for the link. type HardwareAddrSpec struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -4646,14 +4662,15 @@ const file_resource_definitions_network_network_proto_rawDesc = "" + "\atx_push\x18\f \x01(\bR\x06txPush\x12\x17\n" + "\arx_push\x18\r \x01(\bR\x06rxPush\x12%\n" + "\x0ftx_push_buf_len\x18\x0e \x01(\rR\ftxPushBufLen\x12$\n" + - "\x0etcp_data_split\x18\x0f \x01(\bR\ftcpDataSplit\"\xd2\x02\n" + + "\x0etcp_data_split\x18\x0f \x01(\bR\ftcpDataSplit\"\xa7\x03\n" + "\x10EthernetSpecSpec\x12K\n" + "\x05rings\x18\x01 \x01(\v25.talos.resource.definitions.network.EthernetRingsSpecR\x05rings\x12^\n" + "\bfeatures\x18\x02 \x03(\v2B.talos.resource.definitions.network.EthernetSpecSpec.FeaturesEntryR\bfeatures\x12T\n" + - "\bchannels\x18\x03 \x01(\v28.talos.resource.definitions.network.EthernetChannelsSpecR\bchannels\x1a;\n" + + "\bchannels\x18\x03 \x01(\v28.talos.resource.definitions.network.EthernetChannelsSpecR\bchannels\x12S\n" + + "\vwake_on_lan\x18\x04 \x03(\x0e23.talos.resource.definitions.enums.NethelpersWOLModeR\twakeOnLan\x1a;\n" + "\rFeaturesEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\bR\x05value:\x028\x01\"\xa6\x04\n" + + "\x05value\x18\x02 \x01(\bR\x05value:\x028\x01\"\xfb\x04\n" + "\x12EthernetStatusSpec\x12\x1d\n" + "\n" + "link_state\x18\x01 \x01(\bR\tlinkState\x12%\n" + @@ -4665,7 +4682,9 @@ const file_resource_definitions_network_network_proto_rawDesc = "" + "peer_modes\x18\x06 \x03(\tR\tpeerModes\x12M\n" + "\x05rings\x18\a \x01(\v27.talos.resource.definitions.network.EthernetRingsStatusR\x05rings\x12U\n" + "\bfeatures\x18\b \x03(\v29.talos.resource.definitions.network.EthernetFeatureStatusR\bfeatures\x12V\n" + - "\bchannels\x18\t \x01(\v2:.talos.resource.definitions.network.EthernetChannelsStatusR\bchannels\"K\n" + + "\bchannels\x18\t \x01(\v2:.talos.resource.definitions.network.EthernetChannelsStatusR\bchannels\x12S\n" + + "\vwake_on_lan\x18\n" + + " \x03(\x0e23.talos.resource.definitions.enums.NethelpersWOLModeR\twakeOnLan\"K\n" + "\x10HardwareAddrSpec\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12#\n" + "\rhardware_addr\x18\x02 \x01(\fR\fhardwareAddr\"\xe5\x01\n" + @@ -5018,26 +5037,27 @@ var file_resource_definitions_network_network_proto_goTypes = []any{ (enums.NethelpersPrimaryReselect)(0), // 69: talos.resource.definitions.enums.NethelpersPrimaryReselect (enums.NethelpersFailOverMAC)(0), // 70: talos.resource.definitions.enums.NethelpersFailOverMAC (enums.NethelpersADSelect)(0), // 71: talos.resource.definitions.enums.NethelpersADSelect - (enums.NethelpersPort)(0), // 72: talos.resource.definitions.enums.NethelpersPort - (enums.NethelpersDuplex)(0), // 73: talos.resource.definitions.enums.NethelpersDuplex - (*common.NetIPPort)(nil), // 74: common.NetIPPort - (enums.NethelpersLinkType)(0), // 75: talos.resource.definitions.enums.NethelpersLinkType - (enums.NethelpersOperationalState)(0), // 76: talos.resource.definitions.enums.NethelpersOperationalState - (enums.NethelpersNfTablesChainHook)(0), // 77: talos.resource.definitions.enums.NethelpersNfTablesChainHook - (enums.NethelpersNfTablesChainPriority)(0), // 78: talos.resource.definitions.enums.NethelpersNfTablesChainPriority - (enums.NethelpersNfTablesVerdict)(0), // 79: talos.resource.definitions.enums.NethelpersNfTablesVerdict - (enums.NethelpersConntrackState)(0), // 80: talos.resource.definitions.enums.NethelpersConntrackState - (enums.NethelpersICMPType)(0), // 81: talos.resource.definitions.enums.NethelpersICMPType - (enums.NethelpersMatchOperator)(0), // 82: talos.resource.definitions.enums.NethelpersMatchOperator - (enums.NethelpersProtocol)(0), // 83: talos.resource.definitions.enums.NethelpersProtocol - (enums.NethelpersAddressSortAlgorithm)(0), // 84: talos.resource.definitions.enums.NethelpersAddressSortAlgorithm - (enums.NetworkOperator)(0), // 85: talos.resource.definitions.enums.NetworkOperator - (*runtime.PlatformMetadataSpec)(nil), // 86: talos.resource.definitions.runtime.PlatformMetadataSpec - (*durationpb.Duration)(nil), // 87: google.protobuf.Duration - (enums.NethelpersRoutingTable)(0), // 88: talos.resource.definitions.enums.NethelpersRoutingTable - (enums.NethelpersRouteType)(0), // 89: talos.resource.definitions.enums.NethelpersRouteType - (enums.NethelpersRouteProtocol)(0), // 90: talos.resource.definitions.enums.NethelpersRouteProtocol - (enums.NethelpersVLANProtocol)(0), // 91: talos.resource.definitions.enums.NethelpersVLANProtocol + (enums.NethelpersWOLMode)(0), // 72: talos.resource.definitions.enums.NethelpersWOLMode + (enums.NethelpersPort)(0), // 73: talos.resource.definitions.enums.NethelpersPort + (enums.NethelpersDuplex)(0), // 74: talos.resource.definitions.enums.NethelpersDuplex + (*common.NetIPPort)(nil), // 75: common.NetIPPort + (enums.NethelpersLinkType)(0), // 76: talos.resource.definitions.enums.NethelpersLinkType + (enums.NethelpersOperationalState)(0), // 77: talos.resource.definitions.enums.NethelpersOperationalState + (enums.NethelpersNfTablesChainHook)(0), // 78: talos.resource.definitions.enums.NethelpersNfTablesChainHook + (enums.NethelpersNfTablesChainPriority)(0), // 79: talos.resource.definitions.enums.NethelpersNfTablesChainPriority + (enums.NethelpersNfTablesVerdict)(0), // 80: talos.resource.definitions.enums.NethelpersNfTablesVerdict + (enums.NethelpersConntrackState)(0), // 81: talos.resource.definitions.enums.NethelpersConntrackState + (enums.NethelpersICMPType)(0), // 82: talos.resource.definitions.enums.NethelpersICMPType + (enums.NethelpersMatchOperator)(0), // 83: talos.resource.definitions.enums.NethelpersMatchOperator + (enums.NethelpersProtocol)(0), // 84: talos.resource.definitions.enums.NethelpersProtocol + (enums.NethelpersAddressSortAlgorithm)(0), // 85: talos.resource.definitions.enums.NethelpersAddressSortAlgorithm + (enums.NetworkOperator)(0), // 86: talos.resource.definitions.enums.NetworkOperator + (*runtime.PlatformMetadataSpec)(nil), // 87: talos.resource.definitions.runtime.PlatformMetadataSpec + (*durationpb.Duration)(nil), // 88: google.protobuf.Duration + (enums.NethelpersRoutingTable)(0), // 89: talos.resource.definitions.enums.NethelpersRoutingTable + (enums.NethelpersRouteType)(0), // 90: talos.resource.definitions.enums.NethelpersRouteType + (enums.NethelpersRouteProtocol)(0), // 91: talos.resource.definitions.enums.NethelpersRouteProtocol + (enums.NethelpersVLANProtocol)(0), // 92: talos.resource.definitions.enums.NethelpersVLANProtocol } var file_resource_definitions_network_network_proto_depIdxs = []int32{ 59, // 0: talos.resource.definitions.network.AddressSpecSpec.address:type_name -> common.NetIPPrefix @@ -5064,112 +5084,114 @@ var file_resource_definitions_network_network_proto_depIdxs = []int32{ 13, // 21: talos.resource.definitions.network.EthernetSpecSpec.rings:type_name -> talos.resource.definitions.network.EthernetRingsSpec 58, // 22: talos.resource.definitions.network.EthernetSpecSpec.features:type_name -> talos.resource.definitions.network.EthernetSpecSpec.FeaturesEntry 10, // 23: talos.resource.definitions.network.EthernetSpecSpec.channels:type_name -> talos.resource.definitions.network.EthernetChannelsSpec - 72, // 24: talos.resource.definitions.network.EthernetStatusSpec.port:type_name -> talos.resource.definitions.enums.NethelpersPort - 73, // 25: talos.resource.definitions.network.EthernetStatusSpec.duplex:type_name -> talos.resource.definitions.enums.NethelpersDuplex - 14, // 26: talos.resource.definitions.network.EthernetStatusSpec.rings:type_name -> talos.resource.definitions.network.EthernetRingsStatus - 12, // 27: talos.resource.definitions.network.EthernetStatusSpec.features:type_name -> talos.resource.definitions.network.EthernetFeatureStatus - 11, // 28: talos.resource.definitions.network.EthernetStatusSpec.channels:type_name -> talos.resource.definitions.network.EthernetChannelsStatus - 74, // 29: talos.resource.definitions.network.HostDNSConfigSpec.listen_addresses:type_name -> common.NetIPPort - 63, // 30: talos.resource.definitions.network.HostDNSConfigSpec.service_host_dns_address:type_name -> common.NetIP - 62, // 31: talos.resource.definitions.network.HostnameSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer - 75, // 32: talos.resource.definitions.network.LinkSpecSpec.type:type_name -> talos.resource.definitions.enums.NethelpersLinkType - 3, // 33: talos.resource.definitions.network.LinkSpecSpec.bond_slave:type_name -> talos.resource.definitions.network.BondSlave - 5, // 34: talos.resource.definitions.network.LinkSpecSpec.bridge_slave:type_name -> talos.resource.definitions.network.BridgeSlave - 55, // 35: talos.resource.definitions.network.LinkSpecSpec.vlan:type_name -> talos.resource.definitions.network.VLANSpec - 2, // 36: talos.resource.definitions.network.LinkSpecSpec.bond_master:type_name -> talos.resource.definitions.network.BondMasterSpec - 4, // 37: talos.resource.definitions.network.LinkSpecSpec.bridge_master:type_name -> talos.resource.definitions.network.BridgeMasterSpec - 57, // 38: talos.resource.definitions.network.LinkSpecSpec.wireguard:type_name -> talos.resource.definitions.network.WireguardSpec - 62, // 39: talos.resource.definitions.network.LinkSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer - 75, // 40: talos.resource.definitions.network.LinkStatusSpec.type:type_name -> talos.resource.definitions.enums.NethelpersLinkType - 76, // 41: talos.resource.definitions.network.LinkStatusSpec.operational_state:type_name -> talos.resource.definitions.enums.NethelpersOperationalState - 72, // 42: talos.resource.definitions.network.LinkStatusSpec.port:type_name -> talos.resource.definitions.enums.NethelpersPort - 73, // 43: talos.resource.definitions.network.LinkStatusSpec.duplex:type_name -> talos.resource.definitions.enums.NethelpersDuplex - 55, // 44: talos.resource.definitions.network.LinkStatusSpec.vlan:type_name -> talos.resource.definitions.network.VLANSpec - 4, // 45: talos.resource.definitions.network.LinkStatusSpec.bridge_master:type_name -> talos.resource.definitions.network.BridgeMasterSpec - 2, // 46: talos.resource.definitions.network.LinkStatusSpec.bond_master:type_name -> talos.resource.definitions.network.BondMasterSpec - 57, // 47: talos.resource.definitions.network.LinkStatusSpec.wireguard:type_name -> talos.resource.definitions.network.WireguardSpec - 59, // 48: talos.resource.definitions.network.NfTablesAddressMatch.include_subnets:type_name -> common.NetIPPrefix - 59, // 49: talos.resource.definitions.network.NfTablesAddressMatch.exclude_subnets:type_name -> common.NetIPPrefix - 77, // 50: talos.resource.definitions.network.NfTablesChainSpec.hook:type_name -> talos.resource.definitions.enums.NethelpersNfTablesChainHook - 78, // 51: talos.resource.definitions.network.NfTablesChainSpec.priority:type_name -> talos.resource.definitions.enums.NethelpersNfTablesChainPriority - 34, // 52: talos.resource.definitions.network.NfTablesChainSpec.rules:type_name -> talos.resource.definitions.network.NfTablesRule - 79, // 53: talos.resource.definitions.network.NfTablesChainSpec.policy:type_name -> talos.resource.definitions.enums.NethelpersNfTablesVerdict - 80, // 54: talos.resource.definitions.network.NfTablesConntrackStateMatch.states:type_name -> talos.resource.definitions.enums.NethelpersConntrackState - 81, // 55: talos.resource.definitions.network.NfTablesICMPTypeMatch.types:type_name -> talos.resource.definitions.enums.NethelpersICMPType - 82, // 56: talos.resource.definitions.network.NfTablesIfNameMatch.operator:type_name -> talos.resource.definitions.enums.NethelpersMatchOperator - 83, // 57: talos.resource.definitions.network.NfTablesLayer4Match.protocol:type_name -> talos.resource.definitions.enums.NethelpersProtocol - 33, // 58: talos.resource.definitions.network.NfTablesLayer4Match.match_source_port:type_name -> talos.resource.definitions.network.NfTablesPortMatch - 33, // 59: talos.resource.definitions.network.NfTablesLayer4Match.match_destination_port:type_name -> talos.resource.definitions.network.NfTablesPortMatch - 28, // 60: talos.resource.definitions.network.NfTablesLayer4Match.match_icmp_type:type_name -> talos.resource.definitions.network.NfTablesICMPTypeMatch - 40, // 61: talos.resource.definitions.network.NfTablesPortMatch.ranges:type_name -> talos.resource.definitions.network.PortRange - 29, // 62: talos.resource.definitions.network.NfTablesRule.match_o_if_name:type_name -> talos.resource.definitions.network.NfTablesIfNameMatch - 79, // 63: talos.resource.definitions.network.NfTablesRule.verdict:type_name -> talos.resource.definitions.enums.NethelpersNfTablesVerdict - 32, // 64: talos.resource.definitions.network.NfTablesRule.match_mark:type_name -> talos.resource.definitions.network.NfTablesMark - 32, // 65: talos.resource.definitions.network.NfTablesRule.set_mark:type_name -> talos.resource.definitions.network.NfTablesMark - 24, // 66: talos.resource.definitions.network.NfTablesRule.match_source_address:type_name -> talos.resource.definitions.network.NfTablesAddressMatch - 24, // 67: talos.resource.definitions.network.NfTablesRule.match_destination_address:type_name -> talos.resource.definitions.network.NfTablesAddressMatch - 30, // 68: talos.resource.definitions.network.NfTablesRule.match_layer4:type_name -> talos.resource.definitions.network.NfTablesLayer4Match - 29, // 69: talos.resource.definitions.network.NfTablesRule.match_i_if_name:type_name -> talos.resource.definitions.network.NfTablesIfNameMatch - 26, // 70: talos.resource.definitions.network.NfTablesRule.clamp_mss:type_name -> talos.resource.definitions.network.NfTablesClampMSS - 31, // 71: talos.resource.definitions.network.NfTablesRule.match_limit:type_name -> talos.resource.definitions.network.NfTablesLimitMatch - 27, // 72: talos.resource.definitions.network.NfTablesRule.match_conntrack_state:type_name -> talos.resource.definitions.network.NfTablesConntrackStateMatch - 59, // 73: talos.resource.definitions.network.NodeAddressFilterSpec.include_subnets:type_name -> common.NetIPPrefix - 59, // 74: talos.resource.definitions.network.NodeAddressFilterSpec.exclude_subnets:type_name -> common.NetIPPrefix - 84, // 75: talos.resource.definitions.network.NodeAddressSortAlgorithmSpec.algorithm:type_name -> talos.resource.definitions.enums.NethelpersAddressSortAlgorithm - 59, // 76: talos.resource.definitions.network.NodeAddressSpec.addresses:type_name -> common.NetIPPrefix - 84, // 77: talos.resource.definitions.network.NodeAddressSpec.sort_algorithm:type_name -> talos.resource.definitions.enums.NethelpersAddressSortAlgorithm - 85, // 78: talos.resource.definitions.network.OperatorSpecSpec.operator:type_name -> talos.resource.definitions.enums.NetworkOperator - 7, // 79: talos.resource.definitions.network.OperatorSpecSpec.dhcp4:type_name -> talos.resource.definitions.network.DHCP4OperatorSpec - 8, // 80: talos.resource.definitions.network.OperatorSpecSpec.dhcp6:type_name -> talos.resource.definitions.network.DHCP6OperatorSpec - 54, // 81: talos.resource.definitions.network.OperatorSpecSpec.vip:type_name -> talos.resource.definitions.network.VIPOperatorSpec - 62, // 82: talos.resource.definitions.network.OperatorSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer - 0, // 83: talos.resource.definitions.network.PlatformConfigSpec.addresses:type_name -> talos.resource.definitions.network.AddressSpecSpec - 22, // 84: talos.resource.definitions.network.PlatformConfigSpec.links:type_name -> talos.resource.definitions.network.LinkSpecSpec - 45, // 85: talos.resource.definitions.network.PlatformConfigSpec.routes:type_name -> talos.resource.definitions.network.RouteSpecSpec - 19, // 86: talos.resource.definitions.network.PlatformConfigSpec.hostnames:type_name -> talos.resource.definitions.network.HostnameSpecSpec - 43, // 87: talos.resource.definitions.network.PlatformConfigSpec.resolvers:type_name -> talos.resource.definitions.network.ResolverSpecSpec - 50, // 88: talos.resource.definitions.network.PlatformConfigSpec.time_servers:type_name -> talos.resource.definitions.network.TimeServerSpecSpec - 38, // 89: talos.resource.definitions.network.PlatformConfigSpec.operators:type_name -> talos.resource.definitions.network.OperatorSpecSpec - 63, // 90: talos.resource.definitions.network.PlatformConfigSpec.external_ips:type_name -> common.NetIP - 41, // 91: talos.resource.definitions.network.PlatformConfigSpec.probes:type_name -> talos.resource.definitions.network.ProbeSpecSpec - 86, // 92: talos.resource.definitions.network.PlatformConfigSpec.metadata:type_name -> talos.resource.definitions.runtime.PlatformMetadataSpec - 87, // 93: talos.resource.definitions.network.ProbeSpecSpec.interval:type_name -> google.protobuf.Duration - 49, // 94: talos.resource.definitions.network.ProbeSpecSpec.tcp:type_name -> talos.resource.definitions.network.TCPProbeSpec - 62, // 95: talos.resource.definitions.network.ProbeSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer - 63, // 96: talos.resource.definitions.network.ResolverSpecSpec.dns_servers:type_name -> common.NetIP - 62, // 97: talos.resource.definitions.network.ResolverSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer - 63, // 98: talos.resource.definitions.network.ResolverStatusSpec.dns_servers:type_name -> common.NetIP - 60, // 99: talos.resource.definitions.network.RouteSpecSpec.family:type_name -> talos.resource.definitions.enums.NethelpersFamily - 59, // 100: talos.resource.definitions.network.RouteSpecSpec.destination:type_name -> common.NetIPPrefix - 63, // 101: talos.resource.definitions.network.RouteSpecSpec.source:type_name -> common.NetIP - 63, // 102: talos.resource.definitions.network.RouteSpecSpec.gateway:type_name -> common.NetIP - 88, // 103: talos.resource.definitions.network.RouteSpecSpec.table:type_name -> talos.resource.definitions.enums.NethelpersRoutingTable - 61, // 104: talos.resource.definitions.network.RouteSpecSpec.scope:type_name -> talos.resource.definitions.enums.NethelpersScope - 89, // 105: talos.resource.definitions.network.RouteSpecSpec.type:type_name -> talos.resource.definitions.enums.NethelpersRouteType - 90, // 106: talos.resource.definitions.network.RouteSpecSpec.protocol:type_name -> talos.resource.definitions.enums.NethelpersRouteProtocol - 62, // 107: talos.resource.definitions.network.RouteSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer - 60, // 108: talos.resource.definitions.network.RouteStatusSpec.family:type_name -> talos.resource.definitions.enums.NethelpersFamily - 59, // 109: talos.resource.definitions.network.RouteStatusSpec.destination:type_name -> common.NetIPPrefix - 63, // 110: talos.resource.definitions.network.RouteStatusSpec.source:type_name -> common.NetIP - 63, // 111: talos.resource.definitions.network.RouteStatusSpec.gateway:type_name -> common.NetIP - 88, // 112: talos.resource.definitions.network.RouteStatusSpec.table:type_name -> talos.resource.definitions.enums.NethelpersRoutingTable - 61, // 113: talos.resource.definitions.network.RouteStatusSpec.scope:type_name -> talos.resource.definitions.enums.NethelpersScope - 89, // 114: talos.resource.definitions.network.RouteStatusSpec.type:type_name -> talos.resource.definitions.enums.NethelpersRouteType - 90, // 115: talos.resource.definitions.network.RouteStatusSpec.protocol:type_name -> talos.resource.definitions.enums.NethelpersRouteProtocol - 87, // 116: talos.resource.definitions.network.TCPProbeSpec.timeout:type_name -> google.protobuf.Duration - 62, // 117: talos.resource.definitions.network.TimeServerSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer - 63, // 118: talos.resource.definitions.network.VIPOperatorSpec.ip:type_name -> common.NetIP - 52, // 119: talos.resource.definitions.network.VIPOperatorSpec.equinix_metal:type_name -> talos.resource.definitions.network.VIPEquinixMetalSpec - 53, // 120: talos.resource.definitions.network.VIPOperatorSpec.h_cloud:type_name -> talos.resource.definitions.network.VIPHCloudSpec - 91, // 121: talos.resource.definitions.network.VLANSpec.protocol:type_name -> talos.resource.definitions.enums.NethelpersVLANProtocol - 87, // 122: talos.resource.definitions.network.WireguardPeer.persistent_keepalive_interval:type_name -> google.protobuf.Duration - 59, // 123: talos.resource.definitions.network.WireguardPeer.allowed_ips:type_name -> common.NetIPPrefix - 56, // 124: talos.resource.definitions.network.WireguardSpec.peers:type_name -> talos.resource.definitions.network.WireguardPeer - 125, // [125:125] is the sub-list for method output_type - 125, // [125:125] is the sub-list for method input_type - 125, // [125:125] is the sub-list for extension type_name - 125, // [125:125] is the sub-list for extension extendee - 0, // [0:125] is the sub-list for field type_name + 72, // 24: talos.resource.definitions.network.EthernetSpecSpec.wake_on_lan:type_name -> talos.resource.definitions.enums.NethelpersWOLMode + 73, // 25: talos.resource.definitions.network.EthernetStatusSpec.port:type_name -> talos.resource.definitions.enums.NethelpersPort + 74, // 26: talos.resource.definitions.network.EthernetStatusSpec.duplex:type_name -> talos.resource.definitions.enums.NethelpersDuplex + 14, // 27: talos.resource.definitions.network.EthernetStatusSpec.rings:type_name -> talos.resource.definitions.network.EthernetRingsStatus + 12, // 28: talos.resource.definitions.network.EthernetStatusSpec.features:type_name -> talos.resource.definitions.network.EthernetFeatureStatus + 11, // 29: talos.resource.definitions.network.EthernetStatusSpec.channels:type_name -> talos.resource.definitions.network.EthernetChannelsStatus + 72, // 30: talos.resource.definitions.network.EthernetStatusSpec.wake_on_lan:type_name -> talos.resource.definitions.enums.NethelpersWOLMode + 75, // 31: talos.resource.definitions.network.HostDNSConfigSpec.listen_addresses:type_name -> common.NetIPPort + 63, // 32: talos.resource.definitions.network.HostDNSConfigSpec.service_host_dns_address:type_name -> common.NetIP + 62, // 33: talos.resource.definitions.network.HostnameSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer + 76, // 34: talos.resource.definitions.network.LinkSpecSpec.type:type_name -> talos.resource.definitions.enums.NethelpersLinkType + 3, // 35: talos.resource.definitions.network.LinkSpecSpec.bond_slave:type_name -> talos.resource.definitions.network.BondSlave + 5, // 36: talos.resource.definitions.network.LinkSpecSpec.bridge_slave:type_name -> talos.resource.definitions.network.BridgeSlave + 55, // 37: talos.resource.definitions.network.LinkSpecSpec.vlan:type_name -> talos.resource.definitions.network.VLANSpec + 2, // 38: talos.resource.definitions.network.LinkSpecSpec.bond_master:type_name -> talos.resource.definitions.network.BondMasterSpec + 4, // 39: talos.resource.definitions.network.LinkSpecSpec.bridge_master:type_name -> talos.resource.definitions.network.BridgeMasterSpec + 57, // 40: talos.resource.definitions.network.LinkSpecSpec.wireguard:type_name -> talos.resource.definitions.network.WireguardSpec + 62, // 41: talos.resource.definitions.network.LinkSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer + 76, // 42: talos.resource.definitions.network.LinkStatusSpec.type:type_name -> talos.resource.definitions.enums.NethelpersLinkType + 77, // 43: talos.resource.definitions.network.LinkStatusSpec.operational_state:type_name -> talos.resource.definitions.enums.NethelpersOperationalState + 73, // 44: talos.resource.definitions.network.LinkStatusSpec.port:type_name -> talos.resource.definitions.enums.NethelpersPort + 74, // 45: talos.resource.definitions.network.LinkStatusSpec.duplex:type_name -> talos.resource.definitions.enums.NethelpersDuplex + 55, // 46: talos.resource.definitions.network.LinkStatusSpec.vlan:type_name -> talos.resource.definitions.network.VLANSpec + 4, // 47: talos.resource.definitions.network.LinkStatusSpec.bridge_master:type_name -> talos.resource.definitions.network.BridgeMasterSpec + 2, // 48: talos.resource.definitions.network.LinkStatusSpec.bond_master:type_name -> talos.resource.definitions.network.BondMasterSpec + 57, // 49: talos.resource.definitions.network.LinkStatusSpec.wireguard:type_name -> talos.resource.definitions.network.WireguardSpec + 59, // 50: talos.resource.definitions.network.NfTablesAddressMatch.include_subnets:type_name -> common.NetIPPrefix + 59, // 51: talos.resource.definitions.network.NfTablesAddressMatch.exclude_subnets:type_name -> common.NetIPPrefix + 78, // 52: talos.resource.definitions.network.NfTablesChainSpec.hook:type_name -> talos.resource.definitions.enums.NethelpersNfTablesChainHook + 79, // 53: talos.resource.definitions.network.NfTablesChainSpec.priority:type_name -> talos.resource.definitions.enums.NethelpersNfTablesChainPriority + 34, // 54: talos.resource.definitions.network.NfTablesChainSpec.rules:type_name -> talos.resource.definitions.network.NfTablesRule + 80, // 55: talos.resource.definitions.network.NfTablesChainSpec.policy:type_name -> talos.resource.definitions.enums.NethelpersNfTablesVerdict + 81, // 56: talos.resource.definitions.network.NfTablesConntrackStateMatch.states:type_name -> talos.resource.definitions.enums.NethelpersConntrackState + 82, // 57: talos.resource.definitions.network.NfTablesICMPTypeMatch.types:type_name -> talos.resource.definitions.enums.NethelpersICMPType + 83, // 58: talos.resource.definitions.network.NfTablesIfNameMatch.operator:type_name -> talos.resource.definitions.enums.NethelpersMatchOperator + 84, // 59: talos.resource.definitions.network.NfTablesLayer4Match.protocol:type_name -> talos.resource.definitions.enums.NethelpersProtocol + 33, // 60: talos.resource.definitions.network.NfTablesLayer4Match.match_source_port:type_name -> talos.resource.definitions.network.NfTablesPortMatch + 33, // 61: talos.resource.definitions.network.NfTablesLayer4Match.match_destination_port:type_name -> talos.resource.definitions.network.NfTablesPortMatch + 28, // 62: talos.resource.definitions.network.NfTablesLayer4Match.match_icmp_type:type_name -> talos.resource.definitions.network.NfTablesICMPTypeMatch + 40, // 63: talos.resource.definitions.network.NfTablesPortMatch.ranges:type_name -> talos.resource.definitions.network.PortRange + 29, // 64: talos.resource.definitions.network.NfTablesRule.match_o_if_name:type_name -> talos.resource.definitions.network.NfTablesIfNameMatch + 80, // 65: talos.resource.definitions.network.NfTablesRule.verdict:type_name -> talos.resource.definitions.enums.NethelpersNfTablesVerdict + 32, // 66: talos.resource.definitions.network.NfTablesRule.match_mark:type_name -> talos.resource.definitions.network.NfTablesMark + 32, // 67: talos.resource.definitions.network.NfTablesRule.set_mark:type_name -> talos.resource.definitions.network.NfTablesMark + 24, // 68: talos.resource.definitions.network.NfTablesRule.match_source_address:type_name -> talos.resource.definitions.network.NfTablesAddressMatch + 24, // 69: talos.resource.definitions.network.NfTablesRule.match_destination_address:type_name -> talos.resource.definitions.network.NfTablesAddressMatch + 30, // 70: talos.resource.definitions.network.NfTablesRule.match_layer4:type_name -> talos.resource.definitions.network.NfTablesLayer4Match + 29, // 71: talos.resource.definitions.network.NfTablesRule.match_i_if_name:type_name -> talos.resource.definitions.network.NfTablesIfNameMatch + 26, // 72: talos.resource.definitions.network.NfTablesRule.clamp_mss:type_name -> talos.resource.definitions.network.NfTablesClampMSS + 31, // 73: talos.resource.definitions.network.NfTablesRule.match_limit:type_name -> talos.resource.definitions.network.NfTablesLimitMatch + 27, // 74: talos.resource.definitions.network.NfTablesRule.match_conntrack_state:type_name -> talos.resource.definitions.network.NfTablesConntrackStateMatch + 59, // 75: talos.resource.definitions.network.NodeAddressFilterSpec.include_subnets:type_name -> common.NetIPPrefix + 59, // 76: talos.resource.definitions.network.NodeAddressFilterSpec.exclude_subnets:type_name -> common.NetIPPrefix + 85, // 77: talos.resource.definitions.network.NodeAddressSortAlgorithmSpec.algorithm:type_name -> talos.resource.definitions.enums.NethelpersAddressSortAlgorithm + 59, // 78: talos.resource.definitions.network.NodeAddressSpec.addresses:type_name -> common.NetIPPrefix + 85, // 79: talos.resource.definitions.network.NodeAddressSpec.sort_algorithm:type_name -> talos.resource.definitions.enums.NethelpersAddressSortAlgorithm + 86, // 80: talos.resource.definitions.network.OperatorSpecSpec.operator:type_name -> talos.resource.definitions.enums.NetworkOperator + 7, // 81: talos.resource.definitions.network.OperatorSpecSpec.dhcp4:type_name -> talos.resource.definitions.network.DHCP4OperatorSpec + 8, // 82: talos.resource.definitions.network.OperatorSpecSpec.dhcp6:type_name -> talos.resource.definitions.network.DHCP6OperatorSpec + 54, // 83: talos.resource.definitions.network.OperatorSpecSpec.vip:type_name -> talos.resource.definitions.network.VIPOperatorSpec + 62, // 84: talos.resource.definitions.network.OperatorSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer + 0, // 85: talos.resource.definitions.network.PlatformConfigSpec.addresses:type_name -> talos.resource.definitions.network.AddressSpecSpec + 22, // 86: talos.resource.definitions.network.PlatformConfigSpec.links:type_name -> talos.resource.definitions.network.LinkSpecSpec + 45, // 87: talos.resource.definitions.network.PlatformConfigSpec.routes:type_name -> talos.resource.definitions.network.RouteSpecSpec + 19, // 88: talos.resource.definitions.network.PlatformConfigSpec.hostnames:type_name -> talos.resource.definitions.network.HostnameSpecSpec + 43, // 89: talos.resource.definitions.network.PlatformConfigSpec.resolvers:type_name -> talos.resource.definitions.network.ResolverSpecSpec + 50, // 90: talos.resource.definitions.network.PlatformConfigSpec.time_servers:type_name -> talos.resource.definitions.network.TimeServerSpecSpec + 38, // 91: talos.resource.definitions.network.PlatformConfigSpec.operators:type_name -> talos.resource.definitions.network.OperatorSpecSpec + 63, // 92: talos.resource.definitions.network.PlatformConfigSpec.external_ips:type_name -> common.NetIP + 41, // 93: talos.resource.definitions.network.PlatformConfigSpec.probes:type_name -> talos.resource.definitions.network.ProbeSpecSpec + 87, // 94: talos.resource.definitions.network.PlatformConfigSpec.metadata:type_name -> talos.resource.definitions.runtime.PlatformMetadataSpec + 88, // 95: talos.resource.definitions.network.ProbeSpecSpec.interval:type_name -> google.protobuf.Duration + 49, // 96: talos.resource.definitions.network.ProbeSpecSpec.tcp:type_name -> talos.resource.definitions.network.TCPProbeSpec + 62, // 97: talos.resource.definitions.network.ProbeSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer + 63, // 98: talos.resource.definitions.network.ResolverSpecSpec.dns_servers:type_name -> common.NetIP + 62, // 99: talos.resource.definitions.network.ResolverSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer + 63, // 100: talos.resource.definitions.network.ResolverStatusSpec.dns_servers:type_name -> common.NetIP + 60, // 101: talos.resource.definitions.network.RouteSpecSpec.family:type_name -> talos.resource.definitions.enums.NethelpersFamily + 59, // 102: talos.resource.definitions.network.RouteSpecSpec.destination:type_name -> common.NetIPPrefix + 63, // 103: talos.resource.definitions.network.RouteSpecSpec.source:type_name -> common.NetIP + 63, // 104: talos.resource.definitions.network.RouteSpecSpec.gateway:type_name -> common.NetIP + 89, // 105: talos.resource.definitions.network.RouteSpecSpec.table:type_name -> talos.resource.definitions.enums.NethelpersRoutingTable + 61, // 106: talos.resource.definitions.network.RouteSpecSpec.scope:type_name -> talos.resource.definitions.enums.NethelpersScope + 90, // 107: talos.resource.definitions.network.RouteSpecSpec.type:type_name -> talos.resource.definitions.enums.NethelpersRouteType + 91, // 108: talos.resource.definitions.network.RouteSpecSpec.protocol:type_name -> talos.resource.definitions.enums.NethelpersRouteProtocol + 62, // 109: talos.resource.definitions.network.RouteSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer + 60, // 110: talos.resource.definitions.network.RouteStatusSpec.family:type_name -> talos.resource.definitions.enums.NethelpersFamily + 59, // 111: talos.resource.definitions.network.RouteStatusSpec.destination:type_name -> common.NetIPPrefix + 63, // 112: talos.resource.definitions.network.RouteStatusSpec.source:type_name -> common.NetIP + 63, // 113: talos.resource.definitions.network.RouteStatusSpec.gateway:type_name -> common.NetIP + 89, // 114: talos.resource.definitions.network.RouteStatusSpec.table:type_name -> talos.resource.definitions.enums.NethelpersRoutingTable + 61, // 115: talos.resource.definitions.network.RouteStatusSpec.scope:type_name -> talos.resource.definitions.enums.NethelpersScope + 90, // 116: talos.resource.definitions.network.RouteStatusSpec.type:type_name -> talos.resource.definitions.enums.NethelpersRouteType + 91, // 117: talos.resource.definitions.network.RouteStatusSpec.protocol:type_name -> talos.resource.definitions.enums.NethelpersRouteProtocol + 88, // 118: talos.resource.definitions.network.TCPProbeSpec.timeout:type_name -> google.protobuf.Duration + 62, // 119: talos.resource.definitions.network.TimeServerSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer + 63, // 120: talos.resource.definitions.network.VIPOperatorSpec.ip:type_name -> common.NetIP + 52, // 121: talos.resource.definitions.network.VIPOperatorSpec.equinix_metal:type_name -> talos.resource.definitions.network.VIPEquinixMetalSpec + 53, // 122: talos.resource.definitions.network.VIPOperatorSpec.h_cloud:type_name -> talos.resource.definitions.network.VIPHCloudSpec + 92, // 123: talos.resource.definitions.network.VLANSpec.protocol:type_name -> talos.resource.definitions.enums.NethelpersVLANProtocol + 88, // 124: talos.resource.definitions.network.WireguardPeer.persistent_keepalive_interval:type_name -> google.protobuf.Duration + 59, // 125: talos.resource.definitions.network.WireguardPeer.allowed_ips:type_name -> common.NetIPPrefix + 56, // 126: talos.resource.definitions.network.WireguardSpec.peers:type_name -> talos.resource.definitions.network.WireguardPeer + 127, // [127:127] is the sub-list for method output_type + 127, // [127:127] is the sub-list for method input_type + 127, // [127:127] is the sub-list for extension type_name + 127, // [127:127] is the sub-list for extension extendee + 0, // [0:127] is the sub-list for field type_name } func init() { file_resource_definitions_network_network_proto_init() } diff --git a/pkg/machinery/api/resource/definitions/network/network_vtproto.pb.go b/pkg/machinery/api/resource/definitions/network/network_vtproto.pb.go index 4cfdda2ec..5e4cfd35a 100644 --- a/pkg/machinery/api/resource/definitions/network/network_vtproto.pb.go +++ b/pkg/machinery/api/resource/definitions/network/network_vtproto.pb.go @@ -1228,6 +1228,27 @@ func (m *EthernetSpecSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.WakeOnLan) > 0 { + var pksize2 int + for _, num := range m.WakeOnLan { + pksize2 += protohelpers.SizeOfVarint(uint64(num)) + } + i -= pksize2 + j1 := i + for _, num1 := range m.WakeOnLan { + num := uint64(num1) + for num >= 1<<7 { + dAtA[j1] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j1++ + } + dAtA[j1] = uint8(num) + j1++ + } + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) + i-- + dAtA[i] = 0x22 + } if m.Channels != nil { size, err := m.Channels.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { @@ -1303,6 +1324,27 @@ func (m *EthernetStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.WakeOnLan) > 0 { + var pksize2 int + for _, num := range m.WakeOnLan { + pksize2 += protohelpers.SizeOfVarint(uint64(num)) + } + i -= pksize2 + j1 := i + for _, num1 := range m.WakeOnLan { + num := uint64(num1) + for num >= 1<<7 { + dAtA[j1] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j1++ + } + dAtA[j1] = uint8(num) + j1++ + } + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) + i-- + dAtA[i] = 0x52 + } if m.Channels != nil { size, err := m.Channels.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { @@ -4994,6 +5036,13 @@ func (m *EthernetSpecSpec) SizeVT() (n int) { l = m.Channels.SizeVT() n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } + if len(m.WakeOnLan) > 0 { + l = 0 + for _, e := range m.WakeOnLan { + l += protohelpers.SizeOfVarint(uint64(e)) + } + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l + } n += len(m.unknownFields) return n } @@ -5042,6 +5091,13 @@ func (m *EthernetStatusSpec) SizeVT() (n int) { l = m.Channels.SizeVT() n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } + if len(m.WakeOnLan) > 0 { + l = 0 + for _, e := range m.WakeOnLan { + l += protohelpers.SizeOfVarint(uint64(e)) + } + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l + } n += len(m.unknownFields) return n } @@ -9316,6 +9372,75 @@ func (m *EthernetSpecSpec) UnmarshalVT(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType == 0 { + var v enums.NethelpersWOLMode + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= enums.NethelpersWOLMode(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.WakeOnLan = append(m.WakeOnLan, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + if elementCount != 0 && len(m.WakeOnLan) == 0 { + m.WakeOnLan = make([]enums.NethelpersWOLMode, 0, elementCount) + } + for iNdEx < postIndex { + var v enums.NethelpersWOLMode + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= enums.NethelpersWOLMode(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.WakeOnLan = append(m.WakeOnLan, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field WakeOnLan", wireType) + } default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) @@ -9614,6 +9739,75 @@ func (m *EthernetStatusSpec) UnmarshalVT(dAtA []byte) error { return err } iNdEx = postIndex + case 10: + if wireType == 0 { + var v enums.NethelpersWOLMode + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= enums.NethelpersWOLMode(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.WakeOnLan = append(m.WakeOnLan, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + if elementCount != 0 && len(m.WakeOnLan) == 0 { + m.WakeOnLan = make([]enums.NethelpersWOLMode, 0, elementCount) + } + for iNdEx < postIndex { + var v enums.NethelpersWOLMode + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= enums.NethelpersWOLMode(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.WakeOnLan = append(m.WakeOnLan, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field WakeOnLan", wireType) + } default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) diff --git a/pkg/machinery/config/config/network.go b/pkg/machinery/config/config/network.go index c58c1b908..4dc3c99dd 100644 --- a/pkg/machinery/config/config/network.go +++ b/pkg/machinery/config/config/network.go @@ -71,6 +71,7 @@ type EthernetConfig interface { Rings() EthernetRingsConfig Channels() EthernetChannelsConfig Features() map[string]bool + WakeOnLAN() []nethelpers.WOLMode } // EthernetRingsConfig defines a configuration for Ethernet link rings. diff --git a/pkg/machinery/config/schemas/config.schema.json b/pkg/machinery/config/schemas/config.schema.json index 7910dde8a..ce6e06014 100644 --- a/pkg/machinery/config/schemas/config.schema.json +++ b/pkg/machinery/config/schemas/config.schema.json @@ -849,6 +849,16 @@ "description": "Configuration for Ethernet link channels.\n\nThis is similar to ethtool -L command.\n", "markdownDescription": "Configuration for Ethernet link channels.\n\nThis is similar to `ethtool -L` command.", "x-intellij-html-description": "\u003cp\u003eConfiguration for Ethernet link channels.\u003c/p\u003e\n\n\u003cp\u003eThis is similar to \u003ccode\u003eethtool -L\u003c/code\u003e command.\u003c/p\u003e\n" + }, + "wakeOnLan": { + "items": { + "type": "string" + }, + "type": "array", + "title": "wakeOnLan", + "description": "Wake-on-LAN modes to enable.\n\nIf this field is omitted, Wake-on-LAN configuration is not changed.\nAn empty list disables Wake-on-LAN.\n\nThis is similar to ethtool -s \u0026lt;link\u0026gt; wol \u0026lt;options\u0026gt; command.\n", + "markdownDescription": "Wake-on-LAN modes to enable.\n\nIf this field is omitted, Wake-on-LAN configuration is not changed.\nAn empty list disables Wake-on-LAN.\n\nThis is similar to `ethtool -s \u003clink\u003e wol \u003coptions\u003e` command.", + "x-intellij-html-description": "\u003cp\u003eWake-on-LAN modes to enable.\u003c/p\u003e\n\n\u003cp\u003eIf this field is omitted, Wake-on-LAN configuration is not changed.\nAn empty list disables Wake-on-LAN.\u003c/p\u003e\n\n\u003cp\u003eThis is similar to \u003ccode\u003eethtool -s \u0026lt;link\u0026gt; wol \u0026lt;options\u0026gt;\u003c/code\u003e command.\u003c/p\u003e\n" } }, "additionalProperties": false, diff --git a/pkg/machinery/config/types/network/deep_copy.generated.go b/pkg/machinery/config/types/network/deep_copy.generated.go index 70170ed69..91b78b7b5 100644 --- a/pkg/machinery/config/types/network/deep_copy.generated.go +++ b/pkg/machinery/config/types/network/deep_copy.generated.go @@ -101,6 +101,10 @@ func (o *EthernetConfigV1Alpha1) DeepCopy() *EthernetConfigV1Alpha1 { *cp.ChannelsConfig.Combined = *o.ChannelsConfig.Combined } } + if o.WakeOnLANConfig != nil { + cp.WakeOnLANConfig = make([]nethelpers.WOLMode, len(o.WakeOnLANConfig)) + copy(cp.WakeOnLANConfig, o.WakeOnLANConfig) + } return &cp } diff --git a/pkg/machinery/config/types/network/ethernet.go b/pkg/machinery/config/types/network/ethernet.go index f34475b80..cb7354d37 100644 --- a/pkg/machinery/config/types/network/ethernet.go +++ b/pkg/machinery/config/types/network/ethernet.go @@ -15,6 +15,7 @@ import ( "github.com/siderolabs/talos/pkg/machinery/config/internal/registry" "github.com/siderolabs/talos/pkg/machinery/config/types/meta" "github.com/siderolabs/talos/pkg/machinery/config/validation" + "github.com/siderolabs/talos/pkg/machinery/nethelpers" ) // EthernetKind is a Ethernet config document kind. @@ -69,6 +70,30 @@ type EthernetConfigV1Alpha1 struct { // // This is similar to `ethtool -L` command. ChannelsConfig *EthernetChannelsConfig `yaml:"channels,omitempty"` + // description: | + // Wake-on-LAN modes to enable. + // + // If this field is omitted, Wake-on-LAN configuration is not changed. + // An empty list disables Wake-on-LAN. + // + // This is similar to `ethtool -s wol ` command. + // values: + // - "phy" + // - "unicast" + // - "multicast" + // - "broadcast" + // - "arp" + // - "magic" + // - "magicsecure" + // - "filter" + // schema: + // type: array + // items: + // type: string + // examples: + // - value: > + // []nethelpers.WOLMode{nethelpers.WOLModeUnicast, nethelpers.WOLModeMagic} + WakeOnLANConfig []nethelpers.WOLMode `yaml:"wakeOnLan,omitempty"` } // EthernetRingsConfig is a configuration for Ethernet link rings. @@ -172,6 +197,11 @@ func (s *EthernetConfigV1Alpha1) Features() map[string]bool { return s.FeaturesConfig } +// WakeOnLAN implements config.EthernetConfig interface. +func (s *EthernetConfigV1Alpha1) WakeOnLAN() []nethelpers.WOLMode { + return s.WakeOnLANConfig +} + // Validate implements config.Validator interface. func (s *EthernetConfigV1Alpha1) Validate(validation.RuntimeMode, ...validation.Option) ([]string, error) { if s.MetaName == "" { diff --git a/pkg/machinery/config/types/network/ethernet_test.go b/pkg/machinery/config/types/network/ethernet_test.go index a30e987b2..07259e4af 100644 --- a/pkg/machinery/config/types/network/ethernet_test.go +++ b/pkg/machinery/config/types/network/ethernet_test.go @@ -16,6 +16,7 @@ import ( "github.com/siderolabs/talos/pkg/machinery/config/encoder" "github.com/siderolabs/talos/pkg/machinery/config/types/meta" "github.com/siderolabs/talos/pkg/machinery/config/types/network" + "github.com/siderolabs/talos/pkg/machinery/nethelpers" ) //go:embed testdata/ethernetconfig.yaml @@ -34,6 +35,10 @@ func TestEthernetConfigMarshalStability(t *testing.T) { cfg.ChannelsConfig = &network.EthernetChannelsConfig{ Combined: pointer.To[uint32](1), } + cfg.WakeOnLANConfig = []nethelpers.WOLMode{ + nethelpers.WOLModeUnicast, + nethelpers.WOLModeMulticast, + } marshaled, err := encoder.NewEncoder(cfg, encoder.WithComments(encoder.CommentsDisabled)).Encode() require.NoError(t, err) @@ -67,6 +72,10 @@ func TestEthernetConfigUnmarshal(t *testing.T) { ChannelsConfig: &network.EthernetChannelsConfig{ Combined: pointer.To[uint32](1), }, + WakeOnLANConfig: []nethelpers.WOLMode{ + nethelpers.WOLModeUnicast, + nethelpers.WOLModeMulticast, + }, }, docs[0]) } diff --git a/pkg/machinery/config/types/network/network_doc.go b/pkg/machinery/config/types/network/network_doc.go index a9f6aea5d..cf53f2418 100644 --- a/pkg/machinery/config/types/network/network_doc.go +++ b/pkg/machinery/config/types/network/network_doc.go @@ -10,6 +10,7 @@ import ( "net/netip" "github.com/siderolabs/talos/pkg/machinery/config/encoder" + "github.com/siderolabs/talos/pkg/machinery/nethelpers" ) func (DefaultActionConfigV1Alpha1) Doc() *encoder.Doc { @@ -72,11 +73,30 @@ func (EthernetConfigV1Alpha1) Doc() *encoder.Doc { Description: "Configuration for Ethernet link channels.\n\nThis is similar to `ethtool -L` command.", Comments: [3]string{"" /* encoder.HeadComment */, "Configuration for Ethernet link channels." /* encoder.LineComment */, "" /* encoder.FootComment */}, }, + { + Name: "wakeOnLan", + Type: "[]WOLMode", + Note: "", + Description: "Wake-on-LAN modes to enable.\n\nIf this field is omitted, Wake-on-LAN configuration is not changed.\nAn empty list disables Wake-on-LAN.\n\nThis is similar to `ethtool -s wol ` command.", + Comments: [3]string{"" /* encoder.HeadComment */, "Wake-on-LAN modes to enable." /* encoder.LineComment */, "" /* encoder.FootComment */}, + Values: []string{ + "phy", + "unicast", + "multicast", + "broadcast", + "arp", + "magic", + "magicsecure", + "filter", + }, + }, }, } doc.AddExample("", exampleEthernetConfigV1Alpha1()) + doc.Fields[5].AddExample("", []nethelpers.WOLMode{nethelpers.WOLModeUnicast, nethelpers.WOLModeMagic}) + return doc } diff --git a/pkg/machinery/config/types/network/testdata/ethernetconfig.yaml b/pkg/machinery/config/types/network/testdata/ethernetconfig.yaml index 1cb25deb2..09e23e410 100644 --- a/pkg/machinery/config/types/network/testdata/ethernetconfig.yaml +++ b/pkg/machinery/config/types/network/testdata/ethernetconfig.yaml @@ -7,3 +7,6 @@ rings: rx: 16 channels: combined: 1 +wakeOnLan: + - unicast + - multicast diff --git a/pkg/machinery/nethelpers/arpalltargets_enumer.go b/pkg/machinery/nethelpers/arpalltargets_enumer.go index da2b8128d..ea0249e63 100644 --- a/pkg/machinery/nethelpers/arpalltargets_enumer.go +++ b/pkg/machinery/nethelpers/arpalltargets_enumer.go @@ -1,4 +1,4 @@ -// Code generated by "enumer -type=ARPAllTargets,ARPValidate,AddressFlag,AddressSortAlgorithm,ADSelect,AutoHostnameKind,BondMode,BondXmitHashPolicy,ConntrackState,DefaultAction,Duplex,Family,LACPRate,LinkFlag,LinkType,MatchOperator,NfTablesChainHook,NfTablesChainPriority,NfTablesVerdict,OperationalState,Port,PrimaryReselect,Protocol,RouteFlag,RouteProtocol,RouteType,RoutingTable,Scope,Status,VLANProtocol -linecomment -text"; DO NOT EDIT. +// Code generated by "enumer -type=ARPAllTargets,ARPValidate,AddressFlag,AddressSortAlgorithm,ADSelect,AutoHostnameKind,BondMode,BondXmitHashPolicy,ConntrackState,DefaultAction,Duplex,Family,LACPRate,LinkFlag,LinkType,MatchOperator,NfTablesChainHook,NfTablesChainPriority,NfTablesVerdict,OperationalState,Port,PrimaryReselect,Protocol,RouteFlag,RouteProtocol,RouteType,RoutingTable,Scope,Status,VLANProtocol,WOLMode -linecomment -text"; DO NOT EDIT. package nethelpers @@ -3499,3 +3499,136 @@ func (i *VLANProtocol) UnmarshalText(text []byte) error { *i, err = VLANProtocolString(string(text)) return err } + +const ( + _WOLModeName_0 = "phyunicast" + _WOLModeLowerName_0 = "phyunicast" + _WOLModeName_1 = "multicast" + _WOLModeLowerName_1 = "multicast" + _WOLModeName_2 = "broadcast" + _WOLModeLowerName_2 = "broadcast" + _WOLModeName_3 = "magic" + _WOLModeLowerName_3 = "magic" + _WOLModeName_4 = "magicsecure" + _WOLModeLowerName_4 = "magicsecure" + _WOLModeName_5 = "filter" + _WOLModeLowerName_5 = "filter" +) + +var ( + _WOLModeIndex_0 = [...]uint8{0, 3, 10} + _WOLModeIndex_1 = [...]uint8{0, 9} + _WOLModeIndex_2 = [...]uint8{0, 9} + _WOLModeIndex_3 = [...]uint8{0, 5} + _WOLModeIndex_4 = [...]uint8{0, 11} + _WOLModeIndex_5 = [...]uint8{0, 6} +) + +func (i WOLMode) String() string { + switch { + case 1 <= i && i <= 2: + i -= 1 + return _WOLModeName_0[_WOLModeIndex_0[i]:_WOLModeIndex_0[i+1]] + case i == 4: + return _WOLModeName_1 + case i == 8: + return _WOLModeName_2 + case i == 32: + return _WOLModeName_3 + case i == 64: + return _WOLModeName_4 + case i == 128: + return _WOLModeName_5 + default: + return fmt.Sprintf("WOLMode(%d)", i) + } +} + +// An "invalid array index" compiler error signifies that the constant values have changed. +// Re-run the stringer command to generate them again. +func _WOLModeNoOp() { + var x [1]struct{} + _ = x[WOLModePhy-(1)] + _ = x[WOLModeUnicast-(2)] + _ = x[WOLModeMulticast-(4)] + _ = x[WOLModeBroadcast-(8)] + _ = x[WOLModeMagic-(32)] + _ = x[WOLModeMagicSecure-(64)] + _ = x[WOLModeFilter-(128)] +} + +var _WOLModeValues = []WOLMode{WOLModePhy, WOLModeUnicast, WOLModeMulticast, WOLModeBroadcast, WOLModeMagic, WOLModeMagicSecure, WOLModeFilter} + +var _WOLModeNameToValueMap = map[string]WOLMode{ + _WOLModeName_0[0:3]: WOLModePhy, + _WOLModeLowerName_0[0:3]: WOLModePhy, + _WOLModeName_0[3:10]: WOLModeUnicast, + _WOLModeLowerName_0[3:10]: WOLModeUnicast, + _WOLModeName_1[0:9]: WOLModeMulticast, + _WOLModeLowerName_1[0:9]: WOLModeMulticast, + _WOLModeName_2[0:9]: WOLModeBroadcast, + _WOLModeLowerName_2[0:9]: WOLModeBroadcast, + _WOLModeName_3[0:5]: WOLModeMagic, + _WOLModeLowerName_3[0:5]: WOLModeMagic, + _WOLModeName_4[0:11]: WOLModeMagicSecure, + _WOLModeLowerName_4[0:11]: WOLModeMagicSecure, + _WOLModeName_5[0:6]: WOLModeFilter, + _WOLModeLowerName_5[0:6]: WOLModeFilter, +} + +var _WOLModeNames = []string{ + _WOLModeName_0[0:3], + _WOLModeName_0[3:10], + _WOLModeName_1[0:9], + _WOLModeName_2[0:9], + _WOLModeName_3[0:5], + _WOLModeName_4[0:11], + _WOLModeName_5[0:6], +} + +// WOLModeString retrieves an enum value from the enum constants string name. +// Throws an error if the param is not part of the enum. +func WOLModeString(s string) (WOLMode, error) { + if val, ok := _WOLModeNameToValueMap[s]; ok { + return val, nil + } + + if val, ok := _WOLModeNameToValueMap[strings.ToLower(s)]; ok { + return val, nil + } + return 0, fmt.Errorf("%s does not belong to WOLMode values", s) +} + +// WOLModeValues returns all values of the enum +func WOLModeValues() []WOLMode { + return _WOLModeValues +} + +// WOLModeStrings returns a slice of all String values of the enum +func WOLModeStrings() []string { + strs := make([]string, len(_WOLModeNames)) + copy(strs, _WOLModeNames) + return strs +} + +// IsAWOLMode returns "true" if the value is listed in the enum definition. "false" otherwise +func (i WOLMode) IsAWOLMode() bool { + for _, v := range _WOLModeValues { + if i == v { + return true + } + } + return false +} + +// MarshalText implements the encoding.TextMarshaler interface for WOLMode +func (i WOLMode) MarshalText() ([]byte, error) { + return []byte(i.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface for WOLMode +func (i *WOLMode) UnmarshalText(text []byte) error { + var err error + *i, err = WOLModeString(string(text)) + return err +} diff --git a/pkg/machinery/nethelpers/nethelpers.go b/pkg/machinery/nethelpers/nethelpers.go index 7cdfd53eb..c11262090 100644 --- a/pkg/machinery/nethelpers/nethelpers.go +++ b/pkg/machinery/nethelpers/nethelpers.go @@ -5,5 +5,5 @@ // Package nethelpers provides types and type wrappers to support network resources. package nethelpers -//go:generate go tool github.com/dmarkham/enumer -type=ARPAllTargets,ARPValidate,AddressFlag,AddressSortAlgorithm,ADSelect,AutoHostnameKind,BondMode,BondXmitHashPolicy,ConntrackState,DefaultAction,Duplex,Family,LACPRate,LinkFlag,LinkType,MatchOperator,NfTablesChainHook,NfTablesChainPriority,NfTablesVerdict,OperationalState,Port,PrimaryReselect,Protocol,RouteFlag,RouteProtocol,RouteType,RoutingTable,Scope,Status,VLANProtocol -linecomment -text +//go:generate go tool github.com/dmarkham/enumer -type=ARPAllTargets,ARPValidate,AddressFlag,AddressSortAlgorithm,ADSelect,AutoHostnameKind,BondMode,BondXmitHashPolicy,ConntrackState,DefaultAction,Duplex,Family,LACPRate,LinkFlag,LinkType,MatchOperator,NfTablesChainHook,NfTablesChainPriority,NfTablesVerdict,OperationalState,Port,PrimaryReselect,Protocol,RouteFlag,RouteProtocol,RouteType,RoutingTable,Scope,Status,VLANProtocol,WOLMode -linecomment -text //go:generate go tool github.com/dmarkham/enumer -type=FailOverMAC -linecomment diff --git a/pkg/machinery/nethelpers/wol.go b/pkg/machinery/nethelpers/wol.go new file mode 100644 index 000000000..30d6cb7fc --- /dev/null +++ b/pkg/machinery/nethelpers/wol.go @@ -0,0 +1,29 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package nethelpers + +import "github.com/mdlayher/ethtool" + +// WOLMode wraps ethtool.WOLMode for YAML marshaling. +type WOLMode int + +// Constants copied from ethtool to provide Stringer interface. +// +//structprotogen:gen_enum +const ( + WOLModePhy WOLMode = WOLMode(ethtool.PHY) // phy + WOLModeUnicast WOLMode = WOLMode(ethtool.Unicast) // unicast + WOLModeMulticast WOLMode = WOLMode(ethtool.Multicast) // multicast + WOLModeBroadcast WOLMode = WOLMode(ethtool.Broadcast) // broadcast + WOLModeMagic WOLMode = WOLMode(ethtool.Magic) // magic + WOLModeMagicSecure WOLMode = WOLMode(ethtool.MagicSecure) // magicsecure + WOLModeFilter WOLMode = WOLMode(ethtool.Filter) // filter +) + +// WOLModeMin is the minimum valid WOLMode. +const WOLModeMin = WOLModePhy + +// WOLModeMax is the maximum valid WOLMode. +const WOLModeMax = WOLModeFilter diff --git a/pkg/machinery/resources/network/deep_copy.generated.go b/pkg/machinery/resources/network/deep_copy.generated.go index 385c5f39c..7a57f66b6 100644 --- a/pkg/machinery/resources/network/deep_copy.generated.go +++ b/pkg/machinery/resources/network/deep_copy.generated.go @@ -95,6 +95,10 @@ func (o EthernetSpecSpec) DeepCopy() EthernetSpecSpec { cp.Channels.Combined = new(uint32) *cp.Channels.Combined = *o.Channels.Combined } + if o.WakeOnLAN != nil { + cp.WakeOnLAN = make([]nethelpers.WOLMode, len(o.WakeOnLAN)) + copy(cp.WakeOnLAN, o.WakeOnLAN) + } return cp } @@ -217,6 +221,10 @@ func (o EthernetStatusSpec) DeepCopy() EthernetStatusSpec { *cp.Channels.Combined = *o.Channels.Combined } } + if o.WakeOnLAN != nil { + cp.WakeOnLAN = make([]nethelpers.WOLMode, len(o.WakeOnLAN)) + copy(cp.WakeOnLAN, o.WakeOnLAN) + } return cp } diff --git a/pkg/machinery/resources/network/ethernet_spec.go b/pkg/machinery/resources/network/ethernet_spec.go index a4c6a7bd5..104aa77c8 100644 --- a/pkg/machinery/resources/network/ethernet_spec.go +++ b/pkg/machinery/resources/network/ethernet_spec.go @@ -10,6 +10,7 @@ import ( "github.com/cosi-project/runtime/pkg/resource/protobuf" "github.com/cosi-project/runtime/pkg/resource/typed" + "github.com/siderolabs/talos/pkg/machinery/nethelpers" "github.com/siderolabs/talos/pkg/machinery/proto" ) @@ -23,9 +24,10 @@ type EthernetSpec = typed.Resource[EthernetSpecSpec, EthernetSpecExtension] // //gotagsrewrite:gen type EthernetSpecSpec struct { - Rings EthernetRingsSpec `yaml:"rings,omitempty" protobuf:"1"` - Features map[string]bool `yaml:"features,omitempty" protobuf:"2"` - Channels EthernetChannelsSpec `yaml:"channels,omitempty" protobuf:"3"` + Rings EthernetRingsSpec `yaml:"rings,omitempty" protobuf:"1"` + Features map[string]bool `yaml:"features,omitempty" protobuf:"2"` + Channels EthernetChannelsSpec `yaml:"channels,omitempty" protobuf:"3"` + WakeOnLAN []nethelpers.WOLMode `yaml:"wakeOnLan,omitempty" protobuf:"4"` } // EthernetRingsSpec describes config of Ethernet rings. diff --git a/pkg/machinery/resources/network/ethernet_status.go b/pkg/machinery/resources/network/ethernet_status.go index 3400cb71a..d9c41f59c 100644 --- a/pkg/machinery/resources/network/ethernet_status.go +++ b/pkg/machinery/resources/network/ethernet_status.go @@ -34,6 +34,7 @@ type EthernetStatusSpec struct { Rings *EthernetRingsStatus `yaml:"rings,omitempty" protobuf:"7"` Features EthernetFeatureStatusList `yaml:"features,omitempty" protobuf:"8"` Channels *EthernetChannelsStatus `yaml:"channels,omitempty" protobuf:"9"` + WakeOnLAN []nethelpers.WOLMode `yaml:"wakeOnLAN,omitempty" protobuf:"10"` } // EthernetFeatureStatusList is a list of EthernetFeatureStatus. diff --git a/pkg/provision/providers/qemu/launch.go b/pkg/provision/providers/qemu/launch.go index 5b2096363..d69c7c609 100644 --- a/pkg/provision/providers/qemu/launch.go +++ b/pkg/provision/providers/qemu/launch.go @@ -120,7 +120,7 @@ func launchVM(config *LaunchConfig) error { "-netdev", getNetdevParams(config.Network, "net0"), "-device", fmt.Sprintf("virtio-net-pci,netdev=net0,mac=%s", config.VMMac), // TODO: uncomment the following line to get another eth interface not connected to anything - // "-nic", "tap,model=virtio-net-pci", + // "-nic", "tap,model=e1000,script=no,downscript=no", "-device", "virtio-rng-pci", "-device", "virtio-balloon,deflate-on-oom=on", "-monitor", fmt.Sprintf("unix:%s,server,nowait", config.MonitorPath), diff --git a/website/content/v1.12/reference/api.md b/website/content/v1.12/reference/api.md index 99a291b2a..4aa8b9af0 100644 --- a/website/content/v1.12/reference/api.md +++ b/website/content/v1.12/reference/api.md @@ -288,6 +288,7 @@ description: Talos gRPC API reference. - [NethelpersRoutingTable](#talos.resource.definitions.enums.NethelpersRoutingTable) - [NethelpersScope](#talos.resource.definitions.enums.NethelpersScope) - [NethelpersVLANProtocol](#talos.resource.definitions.enums.NethelpersVLANProtocol) + - [NethelpersWOLMode](#talos.resource.definitions.enums.NethelpersWOLMode) - [NetworkConfigLayer](#talos.resource.definitions.enums.NetworkConfigLayer) - [NetworkOperator](#talos.resource.definitions.enums.NetworkOperator) - [RuntimeFIPSState](#talos.resource.definitions.enums.RuntimeFIPSState) @@ -5120,6 +5121,24 @@ NethelpersVLANProtocol is a VLAN protocol. + + +### NethelpersWOLMode +NethelpersWOLMode wraps ethtool.WOLMode for YAML marshaling. + +| Name | Number | Description | +| ---- | ------ | ----------- | +| NETHELPERS_WOLMODE_UNSPECIFIED | 0 | | +| WOL_MODE_PHY | 1 | | +| WOL_MODE_UNICAST | 2 | | +| WOL_MODE_MULTICAST | 4 | | +| WOL_MODE_BROADCAST | 8 | | +| WOL_MODE_MAGIC | 32 | | +| WOL_MODE_MAGIC_SECURE | 64 | | +| WOL_MODE_FILTER | 128 | | + + + ### NetworkConfigLayer @@ -8266,6 +8285,7 @@ EthernetSpecSpec describes config of Ethernet link. | rings | [EthernetRingsSpec](#talos.resource.definitions.network.EthernetRingsSpec) | | | | features | [EthernetSpecSpec.FeaturesEntry](#talos.resource.definitions.network.EthernetSpecSpec.FeaturesEntry) | repeated | | | channels | [EthernetChannelsSpec](#talos.resource.definitions.network.EthernetChannelsSpec) | | | +| wake_on_lan | [talos.resource.definitions.enums.NethelpersWOLMode](#talos.resource.definitions.enums.NethelpersWOLMode) | repeated | | @@ -8305,6 +8325,7 @@ EthernetStatusSpec describes status of rendered secrets. | rings | [EthernetRingsStatus](#talos.resource.definitions.network.EthernetRingsStatus) | | | | features | [EthernetFeatureStatus](#talos.resource.definitions.network.EthernetFeatureStatus) | repeated | | | channels | [EthernetChannelsStatus](#talos.resource.definitions.network.EthernetChannelsStatus) | | | +| wake_on_lan | [talos.resource.definitions.enums.NethelpersWOLMode](#talos.resource.definitions.enums.NethelpersWOLMode) | repeated | | diff --git a/website/content/v1.12/reference/configuration/network/ethernetconfig.md b/website/content/v1.12/reference/configuration/network/ethernetconfig.md index a143bfa69..308172b01 100644 --- a/website/content/v1.12/reference/configuration/network/ethernetconfig.md +++ b/website/content/v1.12/reference/configuration/network/ethernetconfig.md @@ -26,6 +26,11 @@ rings: # Configuration for Ethernet link channels. channels: rx: 4 # Number of RX channels. + +# # Wake-on-LAN modes to enable. +# wakeOnLan: +# - unicast +# - magic {{< /highlight >}} @@ -35,6 +40,11 @@ channels: |`features` |map[string]bool |Configuration for Ethernet features.

Set of features available and whether they can be enabled or disabled is driver specific.
Use `talosctl get ethernetstatus -o yaml` to get the list of available features and
their current status. | | |`rings` |EthernetRingsConfig |Configuration for Ethernet link rings.

This is similar to `ethtool -G` command. | | |`channels` |EthernetChannelsConfig |Configuration for Ethernet link channels.

This is similar to `ethtool -L` command. | | +|`wakeOnLan` |[]WOLMode |Wake-on-LAN modes to enable.

If this field is omitted, Wake-on-LAN configuration is not changed.
An empty list disables Wake-on-LAN.

This is similar to `ethtool -s wol ` command.
Show example(s){{< highlight yaml >}} +wakeOnLan: + - unicast + - magic +{{< /highlight >}}
|`phy`
`unicast`
`multicast`
`broadcast`
`arp`
`magic`
`magicsecure`
`filter`
| diff --git a/website/content/v1.12/schemas/config.schema.json b/website/content/v1.12/schemas/config.schema.json index 7910dde8a..ce6e06014 100644 --- a/website/content/v1.12/schemas/config.schema.json +++ b/website/content/v1.12/schemas/config.schema.json @@ -849,6 +849,16 @@ "description": "Configuration for Ethernet link channels.\n\nThis is similar to ethtool -L command.\n", "markdownDescription": "Configuration for Ethernet link channels.\n\nThis is similar to `ethtool -L` command.", "x-intellij-html-description": "\u003cp\u003eConfiguration for Ethernet link channels.\u003c/p\u003e\n\n\u003cp\u003eThis is similar to \u003ccode\u003eethtool -L\u003c/code\u003e command.\u003c/p\u003e\n" + }, + "wakeOnLan": { + "items": { + "type": "string" + }, + "type": "array", + "title": "wakeOnLan", + "description": "Wake-on-LAN modes to enable.\n\nIf this field is omitted, Wake-on-LAN configuration is not changed.\nAn empty list disables Wake-on-LAN.\n\nThis is similar to ethtool -s \u0026lt;link\u0026gt; wol \u0026lt;options\u0026gt; command.\n", + "markdownDescription": "Wake-on-LAN modes to enable.\n\nIf this field is omitted, Wake-on-LAN configuration is not changed.\nAn empty list disables Wake-on-LAN.\n\nThis is similar to `ethtool -s \u003clink\u003e wol \u003coptions\u003e` command.", + "x-intellij-html-description": "\u003cp\u003eWake-on-LAN modes to enable.\u003c/p\u003e\n\n\u003cp\u003eIf this field is omitted, Wake-on-LAN configuration is not changed.\nAn empty list disables Wake-on-LAN.\u003c/p\u003e\n\n\u003cp\u003eThis is similar to \u003ccode\u003eethtool -s \u0026lt;link\u0026gt; wol \u0026lt;options\u0026gt;\u003c/code\u003e command.\u003c/p\u003e\n" } }, "additionalProperties": false,