diff --git a/ccm/cloud/vm.go b/ccm/cloud/vm.go index f28ad66e..e23a4907 100644 --- a/ccm/cloud/vm.go +++ b/ccm/cloud/vm.go @@ -29,6 +29,7 @@ type VM struct { NetID *string SubnetID *string VmType string + Roles []string cloudVm *osc.Vm } @@ -44,6 +45,11 @@ func FromOscVm(vm *osc.Vm) *VM { SubRegion: vm.Placement.SubregionName, cloudVm: vm, } + for _, t := range vm.Tags { + if after, ok := strings.CutPrefix(t.Key, tags.RolePrefix); ok { + v.Roles = append(v.Roles, after) + } + } v.Region = v.SubRegion[:len(v.SubRegion)-1] return v } diff --git a/ccm/helpers_test.go b/ccm/helpers_test.go index d69c23ef..86a6699c 100644 --- a/ccm/helpers_test.go +++ b/ccm/helpers_test.go @@ -56,6 +56,8 @@ var ( Tags: []osc.ResourceTag{{ Key: tags.VmNodeName, Value: vmNodeName, + }, { + Key: tags.RoleKey("worker"), }}, SubnetId: ptr.To("subnet-bar"), NetId: ptr.To("net-bar"), diff --git a/ccm/instances_v2.go b/ccm/instances_v2.go index 11dd6d61..4ce01522 100644 --- a/ccm/instances_v2.go +++ b/ccm/instances_v2.go @@ -15,6 +15,11 @@ import ( "k8s.io/klog/v2" ) +const ( + NetLabel = "topology.outscale.com/net" + RoleLabelPrefix = "role.outscale.com/" +) + // InstanceExists indicates whether a given node exists according to the cloud provider func (c *Provider) InstanceExists(ctx context.Context, node *v1.Node) (bool, error) { vm, err := c.getVmByNodeName(ctx, node.Name) @@ -47,7 +52,7 @@ func (c *Provider) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloudp if err != nil { return nil, err } - labels := make(map[string]string, len(c.opts.NodeLabels)) + labels := make(map[string]string, len(c.opts.NodeLabels)+2) for k, v := range c.opts.nodeLabelTemplates { str := strings.Builder{} err := v.Execute(&str, vm) @@ -57,6 +62,12 @@ func (c *Provider) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloudp } labels[k] = str.String() } + if vm.NetID != nil { + labels[NetLabel] = *vm.NetID + } + for _, role := range vm.Roles { + labels[RoleLabelPrefix+role] = "" + } return &cloudprovider.InstanceMetadata{ ProviderID: vm.ProviderID(), InstanceType: vm.VmType, diff --git a/ccm/instances_v2_test.go b/ccm/instances_v2_test.go index 7f7339f5..e49e9b96 100644 --- a/ccm/instances_v2_test.go +++ b/ccm/instances_v2_test.go @@ -85,7 +85,10 @@ func TestInstanceMetadata(t *testing.T) { {Type: v1.NodeInternalDNS, Address: "10.0.0.10.eu-west-2.compute.internal"}, {Type: v1.NodeHostName, Address: "10.0.0.10.eu-west-2.compute.internal"}, }, - AdditionalLabels: map[string]string{}, + AdditionalLabels: map[string]string{ + ccm.NetLabel: "net-bar", + ccm.RoleLabelPrefix + "worker": "", + }, }, meta) }) t.Run("Additional labels can be set", func(t *testing.T) { @@ -106,6 +109,7 @@ func TestInstanceMetadata(t *testing.T) { "label.foo": "foo", "label.bar": "barbar", "label.SubRegion": "eu-west-2a", + ccm.NetLabel: "net-bar", }, meta.AdditionalLabels) }) } diff --git a/tests/e2e/node.go b/tests/e2e/node.go index 43682471..f54a7bc6 100644 --- a/tests/e2e/node.go +++ b/tests/e2e/node.go @@ -6,6 +6,7 @@ import ( . "github.com/onsi/ginkgo/v2" //nolint: staticcheck "github.com/onsi/gomega" + "github.com/outscale/cloud-provider-osc/ccm" "github.com/outscale/cloud-provider-osc/labeler" e2eutils "github.com/outscale/cloud-provider-osc/tests/e2e/utils" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -25,6 +26,16 @@ var _ = Describe("[e2e][node] Adding labels to nodes", func() { gomega.Expect(node.Labels).To(gomega.HaveKey("clilabel")) } }) + + It("sets the net label", func() { + cl := f.ClientSet.CoreV1().Nodes() + lst, err := cl.List(context.Background(), metav1.ListOptions{}) + framework.ExpectNoError(err) + for _, node := range lst.Items { + // The CI does not set roles on nodes + gomega.Expect(node.Labels).To(gomega.HaveKey(ccm.NetLabel)) + } + }) }) var _ = Describe("[e2e][node] The node labeler works", func() {