talos/pkg/resources/network/link_status.go
Andrey Smirnov 8b8de11d9f feat: implement new controllers for hostname, resolvers and time servers
This is next part of networkd rewrite.

This implements three new resource types coupled with controllers which
process the default configuration, merges and applying changes.

TimeSync was set up to watch the time servers resource. This is a no-op
for now, but once DHCP is implemented, this would enable time server
configuration coming from DHCP.

Signed-off-by: Andrey Smirnov <smirnov.andrey@gmail.com>
2021-06-05 12:41:14 -07:00

125 lines
3.7 KiB
Go

// 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 network
import (
"fmt"
"github.com/cosi-project/runtime/pkg/resource"
"github.com/cosi-project/runtime/pkg/resource/meta"
"github.com/talos-systems/talos/pkg/machinery/nethelpers"
)
// LinkStatusType is type of LinkStatus resource.
const LinkStatusType = resource.Type("LinkStatuses.net.talos.dev")
// LinkStatus resource holds physical network link status.
type LinkStatus struct {
md resource.Metadata
spec LinkStatusSpec
}
// LinkStatusSpec describes status of rendered secrets.
type LinkStatusSpec struct {
// Fields coming from rtnetlink API.
Index uint32 `yaml:"index"`
Type nethelpers.LinkType `yaml:"type"`
LinkIndex uint32 `yaml:"linkIndex"`
Flags nethelpers.LinkFlags `yaml:"flags"`
HardwareAddr nethelpers.HardwareAddr `yaml:"hardwareAddr"`
BroadcastAddr nethelpers.HardwareAddr `yaml:"broadcastAddr"`
MTU uint32 `yaml:"mtu"`
QueueDisc string `yaml:"queueDisc"`
MasterIndex uint32 `yaml:"masterIndex,omitempty"`
OperationalState nethelpers.OperationalState `yaml:"operationalState"`
Kind string `yaml:"kind"`
SlaveKind string `yaml:"slaveKind"`
// Fields coming from ethtool API.
LinkState bool `yaml:"linkState"`
SpeedMegabits int `yaml:"speedMbit,omitempty"`
Port nethelpers.Port `yaml:"port"`
Duplex nethelpers.Duplex `yaml:"duplex"`
// Following fields are only populated with respective Kind.
VLAN VLANSpec `yaml:"vlan,omitempty"`
BondMaster BondMasterSpec `yaml:"bondMaster,omitempty"`
Wireguard WireguardSpec `yaml:"wireguard,omitempty"`
}
// NewLinkStatus initializes a LinkStatus resource.
func NewLinkStatus(namespace resource.Namespace, id resource.ID) *LinkStatus {
r := &LinkStatus{
md: resource.NewMetadata(namespace, LinkStatusType, id, resource.VersionUndefined),
spec: LinkStatusSpec{},
}
r.md.BumpVersion()
return r
}
// Metadata implements resource.Resource.
func (r *LinkStatus) Metadata() *resource.Metadata {
return &r.md
}
// Spec implements resource.Resource.
func (r *LinkStatus) Spec() interface{} {
return r.spec
}
func (r *LinkStatus) String() string {
return fmt.Sprintf("network.LinkStatus(%q)", r.md.ID())
}
// DeepCopy implements resource.Resource.
func (r *LinkStatus) DeepCopy() resource.Resource {
return &LinkStatus{
md: r.md,
spec: r.spec,
}
}
// ResourceDefinition implements meta.ResourceDefinitionProvider interface.
func (r *LinkStatus) ResourceDefinition() meta.ResourceDefinitionSpec {
return meta.ResourceDefinitionSpec{
Type: LinkStatusType,
Aliases: []resource.Type{"link", "links"},
DefaultNamespace: NamespaceName,
PrintColumns: []meta.PrintColumn{
{
Name: "Type",
JSONPath: `{.type}`,
},
{
Name: "Kind",
JSONPath: `{.kind}`,
},
{
Name: "Hw Addr",
JSONPath: `{.hardwareAddr}`,
},
{
Name: "Oper State",
JSONPath: `{.operationalState}`,
},
{
Name: "Link State",
JSONPath: `{.linkState}`,
},
},
}
}
// TypedSpec allows to access the Spec with the proper type.
func (r *LinkStatus) TypedSpec() *LinkStatusSpec {
return &r.spec
}
// Physical checks if the link is physical ethernet.
func (r *LinkStatus) Physical() bool {
return r.TypedSpec().Type == nethelpers.LinkEther && r.TypedSpec().Kind == ""
}