From 0f16bb3b52b3791c58bedddb535e3a0f9fd9505e Mon Sep 17 00:00:00 2001 From: Gaurav Ghildiyal Date: Thu, 25 Sep 2025 07:12:48 +0000 Subject: [PATCH] feat: Add GCE Machine type as device attribute --- pkg/cloudprovider/gce/gce.go | 7 +++++++ pkg/inventory/cloud_test.go | 26 +++++++++++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/pkg/cloudprovider/gce/gce.go b/pkg/cloudprovider/gce/gce.go index b742381e..451f141c 100644 --- a/pkg/cloudprovider/gce/gce.go +++ b/pkg/cloudprovider/gce/gce.go @@ -20,6 +20,7 @@ import ( "context" "encoding/json" "fmt" + "path" "strings" "time" @@ -50,6 +51,7 @@ const ( AttrGCENetworkName = GCEAttrPrefix + "/" + "networkName" AttrGCENetworkProjectNumber = GCEAttrPrefix + "/" + "networkProjectNumber" AttrGCEIPAliases = GCEAttrPrefix + "/" + "ipAliases" + AttrGCEMachineType = GCEAttrPrefix + "/" + "machineType" ) var ( @@ -87,6 +89,10 @@ func GetInstance(ctx context.Context) (*cloudprovider.CloudInstance, error) { klog.Infof("could not get instance type on VM %s GCE ... retrying: %v", instanceName, err) return false, nil } + // Metadata server returns instanceType in the format + // "projects/{PROJECT_NUMBER}/machineTypes/{MACHINE_TYPE}". We only care + // about the specific name. + instanceType = path.Base(instanceType) // curl "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/?recursive=true" -H "Metadata-Flavor: Google" // [{"accessConfigs":[{"externalIp":"35.225.164.134","type":"ONE_TO_ONE_NAT"}],"dnsServers":["169.254.169.254"],"forwardedIps":[],"gateway":"10.128.0.1","ip":"10.128.0.70","ipAliases":["10.24.3.0/24"],"mac":"42:01:0a:80:00:46","mtu":1460,"network":"projects/628944397724/networks/default","subnetmask":"255.255.240.0","targetInstanceIps":[]},{"accessConfigs":[{"externalIp":"","type":"ONE_TO_ONE_NAT"}],"dnsServers":["169.254.169.254"],"forwardedIps":[],"gateway":"192.168.1.1","ip":"192.168.1.2","ipAliases":[],"mac":"42:01:c0:a8:01:02","mtu":8244,"network":"projects/628944397724/networks/aojea-dra-net-1","subnetmask":"255.255.255.0","targetInstanceIps":[]},{"accessConfigs":[{"externalIp":"","type":"ONE_TO_ONE_NAT"}],"dnsServers":["169.254.169.254"],"forwardedIps":[],"gateway":"192.168.2.1","ip":"192.168.2.2","ipAliases":[],"mac":"42:01:c0:a8:02:02","mtu":8244,"network":"projects/628944397724/networks/aojea-dra-net-2","subnetmask":"255.255.255.0","targetInstanceIps":[]},{"accessConfigs":[{"externalIp":"","type":"ONE_TO_ONE_NAT"}],"dnsServers":["169.254.169.254"],"forwardedIps":[],"gateway":"192.168.3.1","ip":"192.168.3.2","ipAliases":[],"mac":"42:01:c0:a8:03:02","mtu":8244,"network":"projects/628944397724/networks/aojea-dra-net-3","subnetmask":"255.255.255.0","targetInstanceIps":[]},{"accessConfigs":[{"externalIp":"","type":"ONE_TO_ONE_NAT"}],"dnsServers":["169.254.169.254"],"forwardedIps":[],"gateway":"192.168.4.1","ip":"192.168.4.2","ipAliases":[],"mac":"42:01:c0:a8:04:02","mtu":8244,"network":"projects/628944397724/networks/aojea-dra-net-4","subnetmask":"255.255.255.0","targetInstanceIps":[]}] @@ -128,6 +134,7 @@ func GetInstance(ctx context.Context) (*cloudprovider.CloudInstance, error) { // identified by it's MAC. func GetGCEAttributes(mac string, instance *cloudprovider.CloudInstance) map[resourceapi.QualifiedName]resourceapi.DeviceAttribute { attributes := make(map[resourceapi.QualifiedName]resourceapi.DeviceAttribute) + attributes[AttrGCEMachineType] = resourceapi.DeviceAttribute{StringValue: &instance.Type} topologyParts := strings.SplitN(strings.TrimPrefix(instance.Topology, "/"), "/", 3) // topology may not be always available diff --git a/pkg/inventory/cloud_test.go b/pkg/inventory/cloud_test.go index 0a8a0f5c..7dab4a2c 100644 --- a/pkg/inventory/cloud_test.go +++ b/pkg/inventory/cloud_test.go @@ -45,35 +45,43 @@ func TestGetProviderAttributes(t *testing.T) { mac: "00:11:22:33:44:55", instance: &cloudprovider.CloudInstance{ Provider: cloudprovider.CloudProviderGCE, + Type: "machine-type-a", Interfaces: []cloudprovider.NetworkInterface{}, }, - want: nil, + want: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{ + gce.AttrGCEMachineType: {StringValue: ptr.To("machine-type-a")}, + }, }, { name: "MAC not found in instance interfaces, no topology", mac: "00:11:22:33:44:FF", // MAC that won't be found instance: &cloudprovider.CloudInstance{ Provider: cloudprovider.CloudProviderGCE, + Type: "machine-type-a", Interfaces: []cloudprovider.NetworkInterface{ {Mac: "00:11:22:33:44:55", Network: "projects/12345/networks/test-network"}, }, }, - want: nil, + want: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{ + gce.AttrGCEMachineType: {StringValue: ptr.To("machine-type-a")}, + }, }, { name: "MAC not found in instance interfaces, has topology", mac: "00:11:22:33:44:FF", // MAC that won't be found instance: &cloudprovider.CloudInstance{ Provider: cloudprovider.CloudProviderGCE, + Type: "machine-type-a", Interfaces: []cloudprovider.NetworkInterface{ {Mac: "00:11:22:33:44:55", Network: "projects/12345/networks/test-network"}, }, Topology: "/block/subblock/host", }, want: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{ - gce.AttrGCEBlock: {StringValue: ptr.To("block")}, - gce.AttrGCESubBlock: {StringValue: ptr.To("subblock")}, - gce.AttrGCEHost: {StringValue: ptr.To("host")}, + gce.AttrGCEBlock: {StringValue: ptr.To("block")}, + gce.AttrGCESubBlock: {StringValue: ptr.To("subblock")}, + gce.AttrGCEHost: {StringValue: ptr.To("host")}, + gce.AttrGCEMachineType: {StringValue: ptr.To("machine-type-a")}, }, }, { @@ -81,6 +89,7 @@ func TestGetProviderAttributes(t *testing.T) { mac: "00:11:22:33:44:55", instance: &cloudprovider.CloudInstance{ Provider: cloudprovider.CloudProviderGCE, + Type: "machine-type-a", Interfaces: []cloudprovider.NetworkInterface{ {Mac: "00:11:22:33:44:55", Network: "projects/12345/networks/test-network"}, {Mac: "AA:BB:CC:DD:EE:FF", Network: "projects/67890/networks/other-network"}, @@ -93,6 +102,7 @@ func TestGetProviderAttributes(t *testing.T) { gce.AttrGCEBlock: {StringValue: ptr.To("block")}, gce.AttrGCESubBlock: {StringValue: ptr.To("subblock")}, gce.AttrGCEHost: {StringValue: ptr.To("host")}, + gce.AttrGCEMachineType: {StringValue: ptr.To("machine-type-a")}, }, }, { @@ -100,6 +110,7 @@ func TestGetProviderAttributes(t *testing.T) { mac: "00:11:22:33:44:55", instance: &cloudprovider.CloudInstance{ Provider: cloudprovider.CloudProviderGCE, + Type: "machine-type-a", Interfaces: []cloudprovider.NetworkInterface{ {Mac: "00:11:22:33:44:55", Network: "invalid-gce-network-string"}, }, @@ -111,6 +122,7 @@ func TestGetProviderAttributes(t *testing.T) { mac: "00:11:22:33:44:55", instance: &cloudprovider.CloudInstance{ Provider: cloudprovider.CloudProviderGCE, + Type: "machine-type-a", Interfaces: []cloudprovider.NetworkInterface{ {Mac: "00:11:22:33:44:55", Network: "projects/12345/networks/test-network"}, {Mac: "AA:BB:CC:DD:EE:FF", Network: "projects/67890/networks/other-network"}, @@ -120,6 +132,7 @@ func TestGetProviderAttributes(t *testing.T) { want: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{ gce.AttrGCENetworkName: {StringValue: ptr.To("test-network")}, gce.AttrGCENetworkProjectNumber: {IntValue: ptr.To(int64(12345))}, + gce.AttrGCEMachineType: {StringValue: ptr.To("machine-type-a")}, }, }, { @@ -127,6 +140,7 @@ func TestGetProviderAttributes(t *testing.T) { mac: "00:11:22:33:44:55", instance: &cloudprovider.CloudInstance{ Provider: cloudprovider.CloudProviderAWS, // Unsupported provider + Type: "machine-type-a", Interfaces: []cloudprovider.NetworkInterface{ {Mac: "00:11:22:33:44:55", Network: "aws-network-info"}, }, @@ -138,6 +152,7 @@ func TestGetProviderAttributes(t *testing.T) { mac: "00:11:22:33:44:55", instance: &cloudprovider.CloudInstance{ Provider: cloudprovider.CloudProviderGCE, + Type: "machine-type-a", Interfaces: []cloudprovider.NetworkInterface{ { Mac: "00:11:22:33:44:55", @@ -150,6 +165,7 @@ func TestGetProviderAttributes(t *testing.T) { gce.AttrGCENetworkName: {StringValue: ptr.To("test-network")}, gce.AttrGCENetworkProjectNumber: {IntValue: ptr.To(int64(12345))}, gce.AttrGCEIPAliases: {StringValue: ptr.To("10.0.0.1/24,10.0.0.2/24")}, + gce.AttrGCEMachineType: {StringValue: ptr.To("machine-type-a")}, }, }, }