Skip to content

Commit

Permalink
feat: add operating system version field to discovery
Browse files Browse the repository at this point in the history
Fixes #4232

The result:

```
talosctl -n 172.20.0.2 get members
NODE         NAMESPACE   TYPE     ID                       VERSION   HOSTNAME                 MACHINE TYPE   OS                                           ADDRESSES
172.20.0.2   cluster     Member   talos-default-master-1   2         talos-default-master-1   controlplane   Talos (v0.13.0-alpha.0-13-gfdd80a12-dirty)   ["172.20.0.2","fdd1:f54:2697:3902:44f8:92ff:fe2e:1aea"]
172.20.0.2   cluster     Member   talos-default-worker-1   1         talos-default-worker-1   worker         Talos (v0.13.0-alpha.0-13-gfdd80a12-dirty)   ["172.20.0.3","fdd1:f54:2697:3902:d4ba:55ff:fe8a:f551"]
172.20.0.2   cluster     Member   talos-default-worker-2   1         talos-default-worker-2   worker         Talos (v0.13.0-alpha.0-13-gfdd80a12-dirty)   ["172.20.0.4","fdd1:f54:2697:3902:e00d:f4ff:fecf:51c8"]
```

Signed-off-by: Andrey Smirnov <andrey.smirnov@talos-systems.com>
  • Loading branch information
smira committed Sep 17, 2021
1 parent 085c61b commit 50a2410
Show file tree
Hide file tree
Showing 8 changed files with 49 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"github.com/talos-systems/talos/pkg/resources/k8s"
"github.com/talos-systems/talos/pkg/resources/kubespan"
"github.com/talos-systems/talos/pkg/resources/network"
"github.com/talos-systems/talos/pkg/version"
)

// LocalAffiliateController builds Affiliate resource for the local node.
Expand Down Expand Up @@ -178,6 +179,7 @@ func (ctrl *LocalAffiliateController) Run(ctx context.Context, r controller.Runt
spec.Hostname = hostname.(*network.HostnameStatus).TypedSpec().FQDN()
spec.Nodename = nodename.(*k8s.Nodename).TypedSpec().Nodename
spec.MachineType = machineType.(*config.MachineType).MachineType()
spec.OperatingSystem = fmt.Sprintf("%s (%s)", version.Name, version.Tag)

spec.KubeSpan = cluster.KubeSpanAffiliateSpec{}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ func (suite *LocalAffiliateSuite) TestGeneration() {
suite.Assert().Equal("example1", spec.Hostname)
suite.Assert().Equal("example1.com", spec.Nodename)
suite.Assert().Equal(machine.TypeWorker, spec.MachineType)
suite.Assert().Equal(" ()", spec.OperatingSystem) // build tags are not set for unit-tests
suite.Assert().Equal(cluster.KubeSpanAffiliateSpec{}, spec.KubeSpan)

return nil
Expand Down
1 change: 1 addition & 0 deletions internal/app/machined/pkg/controllers/cluster/member.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ func (ctrl *MemberController) Run(ctx context.Context, r controller.Runtime, log
spec.Addresses = append([]netaddr.IP(nil), affiliateSpec.Addresses...)
spec.Hostname = affiliateSpec.Hostname
spec.MachineType = affiliateSpec.MachineType
spec.OperatingSystem = affiliateSpec.OperatingSystem
spec.NodeID = affiliateSpec.NodeID

return nil
Expand Down
13 changes: 7 additions & 6 deletions internal/app/machined/pkg/controllers/cluster/member_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
// 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/.

//nolint:dupl
package cluster_test

import (
Expand Down Expand Up @@ -30,11 +29,12 @@ func (suite *MemberSuite) TestReconcileDefault() {

affiliate1 := cluster.NewAffiliate(cluster.NamespaceName, "7x1SuC8Ege5BGXdAfTEff5iQnlWZLfv9h1LGMxA2pYkC")
*affiliate1.TypedSpec() = cluster.AffiliateSpec{
NodeID: "7x1SuC8Ege5BGXdAfTEff5iQnlWZLfv9h1LGMxA2pYkC",
Hostname: "foo.com",
Nodename: "bar",
MachineType: machine.TypeControlPlane,
Addresses: []netaddr.IP{netaddr.MustParseIP("192.168.3.4")},
NodeID: "7x1SuC8Ege5BGXdAfTEff5iQnlWZLfv9h1LGMxA2pYkC",
Hostname: "foo.com",
Nodename: "bar",
MachineType: machine.TypeControlPlane,
OperatingSystem: "Talos (v1.0.0)",
Addresses: []netaddr.IP{netaddr.MustParseIP("192.168.3.4")},
KubeSpan: cluster.KubeSpanAffiliateSpec{
PublicKey: "PLPNBddmTgHJhtw0vxltq1ZBdPP9RNOEUd5JjJZzBRY=",
Address: netaddr.MustParseIP("fd50:8d60:4238:6302:f857:23ff:fe21:d1e0"),
Expand Down Expand Up @@ -72,6 +72,7 @@ func (suite *MemberSuite) TestReconcileDefault() {
suite.Assert().Equal([]netaddr.IP{netaddr.MustParseIP("192.168.3.4")}, spec.Addresses)
suite.Assert().Equal("foo.com", spec.Hostname)
suite.Assert().Equal(machine.TypeControlPlane, spec.MachineType)
suite.Assert().Equal("Talos (v1.0.0)", spec.OperatingSystem)

return nil
}),
Expand Down
2 changes: 2 additions & 0 deletions internal/pkg/discovery/registry/kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ func AffiliateFromNode(node *v1.Node) *cluster.AffiliateSpec {
affiliate.MachineType = machine.TypeControlPlane
}

affiliate.OperatingSystem = node.Status.NodeInfo.OSImage

// Every other field is pulled from node annotations.
if publicKey, ok := node.Annotations[constants.KubeSpanPublicKeyAnnotation]; ok {
affiliate.KubeSpan.PublicKey = publicKey
Expand Down
14 changes: 9 additions & 5 deletions internal/pkg/discovery/registry/kubernetes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,14 +113,18 @@ func TestAffiliateFromNode(t *testing.T) {
Address: "foo.com",
},
},
NodeInfo: v1.NodeSystemInfo{
OSImage: "Talos (v1.0.0)",
},
},
},
expected: &cluster.AffiliateSpec{
NodeID: "29QQTc97U5ZyFTIX33Dp9NqtwxqQI8QI13scCLzffrZ",
Hostname: "foo.com",
Nodename: "bar",
MachineType: machine.TypeControlPlane,
Addresses: []netaddr.IP{netaddr.MustParseIP("10.0.0.2"), netaddr.MustParseIP("192.168.3.4")},
NodeID: "29QQTc97U5ZyFTIX33Dp9NqtwxqQI8QI13scCLzffrZ",
Hostname: "foo.com",
Nodename: "bar",
MachineType: machine.TypeControlPlane,
Addresses: []netaddr.IP{netaddr.MustParseIP("10.0.0.2"), netaddr.MustParseIP("192.168.3.4")},
OperatingSystem: "Talos (v1.0.0)",
KubeSpan: cluster.KubeSpanAffiliateSpec{
PublicKey: "PLPNBddmTgHJhtw0vxltq1ZBdPP9RNOEUd5JjJZzBRY=",
Address: netaddr.MustParseIP("fd50:8d60:4238:6302:f857:23ff:fe21:d1e0"),
Expand Down
24 changes: 13 additions & 11 deletions pkg/resources/cluster/affiliate.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,13 @@ type Affiliate struct {

// AffiliateSpec describes Affiliate state.
type AffiliateSpec struct {
NodeID string `yaml:"nodeId"`
Addresses []netaddr.IP `yaml:"addresses"`
Hostname string `yaml:"hostname"`
Nodename string `yaml:"nodename,omitempty"`
MachineType machine.Type `yaml:"machineType"`
KubeSpan KubeSpanAffiliateSpec `yaml:"kubespan,omitempty"`
NodeID string `yaml:"nodeId"`
Addresses []netaddr.IP `yaml:"addresses"`
Hostname string `yaml:"hostname"`
Nodename string `yaml:"nodename,omitempty"`
OperatingSystem string `yaml:"operatingSystem"`
MachineType machine.Type `yaml:"machineType"`
KubeSpan KubeSpanAffiliateSpec `yaml:"kubespan,omitempty"`
}

// KubeSpanAffiliateSpec describes additional information specific for the KubeSpan.
Expand Down Expand Up @@ -74,11 +75,12 @@ func (r *Affiliate) DeepCopy() resource.Resource {
return &Affiliate{
md: r.md,
spec: AffiliateSpec{
NodeID: r.spec.NodeID,
Addresses: append([]netaddr.IP(nil), r.spec.Addresses...),
Hostname: r.spec.Hostname,
Nodename: r.spec.Nodename,
MachineType: r.spec.MachineType,
NodeID: r.spec.NodeID,
Addresses: append([]netaddr.IP(nil), r.spec.Addresses...),
Hostname: r.spec.Hostname,
Nodename: r.spec.Nodename,
OperatingSystem: r.spec.OperatingSystem,
MachineType: r.spec.MachineType,
KubeSpan: KubeSpanAffiliateSpec{
PublicKey: r.spec.KubeSpan.PublicKey,
Address: r.spec.KubeSpan.Address,
Expand Down
22 changes: 14 additions & 8 deletions pkg/resources/cluster/member.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,11 @@ type Member struct {

// MemberSpec describes Member state.
type MemberSpec struct {
NodeID string `yaml:"nodeId"`
Addresses []netaddr.IP `yaml:"addresses"`
Hostname string `yaml:"hostname"`
MachineType machine.Type `yaml:"machineType"`
NodeID string `yaml:"nodeId"`
Addresses []netaddr.IP `yaml:"addresses"`
Hostname string `yaml:"hostname"`
MachineType machine.Type `yaml:"machineType"`
OperatingSystem string `yaml:"operatingSystem"`
}

// NewMember initializes a Member resource.
Expand Down Expand Up @@ -64,10 +65,11 @@ func (r *Member) DeepCopy() resource.Resource {
return &Member{
md: r.md,
spec: MemberSpec{
NodeID: r.spec.NodeID,
Addresses: append([]netaddr.IP(nil), r.spec.Addresses...),
Hostname: r.spec.Hostname,
MachineType: r.spec.MachineType,
NodeID: r.spec.NodeID,
Addresses: append([]netaddr.IP(nil), r.spec.Addresses...),
Hostname: r.spec.Hostname,
MachineType: r.spec.MachineType,
OperatingSystem: r.spec.OperatingSystem,
},
}
}
Expand All @@ -87,6 +89,10 @@ func (r *Member) ResourceDefinition() meta.ResourceDefinitionSpec {
Name: "Machine Type",
JSONPath: `{.machineType}`,
},
{
Name: "OS",
JSONPath: `{.operatingSystem}`,
},
{
Name: "Addresses",
JSONPath: `{.addresses}`,
Expand Down

0 comments on commit 50a2410

Please sign in to comment.