@@ -22,81 +22,97 @@ import (
2222 "fmt"
2323 "io"
2424 "net/http"
25+ "strings"
2526
27+ "github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
2628 "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
2729 compute "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute"
28- "k8s.io/kops/upup/pkg/fi"
2930)
3031
31- type instanceComputeMetadata struct {
32- ResourceGroupName string `json:"resourceGroupName"`
33- SubscriptionID string `json:"subscriptionId"`
34- }
35-
36- type instanceMetadata struct {
37- Compute * instanceComputeMetadata `json:"compute"`
38- }
39-
4032// client is an Azure client.
4133type client struct {
42- metadata * instanceMetadata
43- vmssesClient * compute.VirtualMachineScaleSetsClient
34+ subscriptionID string
35+ vmClient * compute.VirtualMachinesClient
36+ vmssClient * compute.VirtualMachineScaleSetVMsClient
4437}
4538
4639// newClient returns a new Client.
4740func newClient () (* client , error ) {
48- m , err := queryInstanceMetadata ()
41+ metadata , err := queryComputeInstanceMetadata ()
4942 if err != nil {
5043 return nil , fmt .Errorf ("error querying instance metadata: %s" , err )
5144 }
52- if m .Compute .SubscriptionID == "" {
53- return nil , fmt .Errorf ("empty subscription name" )
54- }
55- if m .Compute .ResourceGroupName == "" {
56- return nil , fmt .Errorf ("empty resource group name" )
45+ if metadata .SubscriptionID == "" {
46+ return nil , fmt .Errorf ("empty subscription ID" )
5747 }
5848
5949 cred , err := azidentity .NewDefaultAzureCredential (nil )
6050 if err != nil {
6151 return nil , fmt .Errorf ("creating identity: %w" , err )
6252 }
6353
64- vmssesClient , err := compute .NewVirtualMachineScaleSetsClient (m .Compute .SubscriptionID , cred , nil )
54+ vmClient , err := compute .NewVirtualMachinesClient (metadata .SubscriptionID , cred , nil )
55+ if err != nil {
56+ return nil , fmt .Errorf ("creating VMs client: %w" , err )
57+ }
58+
59+ vmssClient , err := compute .NewVirtualMachineScaleSetVMsClient (metadata .SubscriptionID , cred , nil )
6560 if err != nil {
66- return nil , fmt .Errorf ("creating VMSS client: %w" , err )
61+ return nil , fmt .Errorf ("creating VMSS VMs client: %w" , err )
6762 }
6863
6964 return & client {
70- metadata : m ,
71- vmssesClient : vmssesClient ,
65+ vmClient : vmClient ,
66+ vmssClient : vmssClient ,
7267 }, nil
7368}
7469
75- // getVMScaleSet returns the specified VM ScaleSet.
76- func (c * client ) getVMScaleSet (ctx context.Context , vmssName string ) (* compute.VirtualMachineScaleSet , error ) {
77- opts := & compute.VirtualMachineScaleSetsClientGetOptions {
78- Expand : fi .PtrTo (compute .ExpandTypesForGetVMScaleSetsUserData ),
70+ func (c * client ) getVMTags (ctx context.Context , providerID string ) (map [string ]* string , error ) {
71+ if ! strings .HasPrefix (providerID , "azure://" ) {
72+ return nil , fmt .Errorf ("unknown providerID : %s" , providerID )
7973 }
80- resp , err := c .vmssesClient .Get (ctx , c .metadata .Compute .ResourceGroupName , vmssName , opts )
74+
75+ res , err := arm .ParseResourceID (strings .TrimPrefix (providerID , "azure://" ))
8176 if err != nil {
82- return nil , fmt .Errorf ("getting VMSS: %w" , err )
77+ return nil , fmt .Errorf ("error parsing providerID: %v" , err )
78+ }
79+
80+ switch res .ResourceType .String () {
81+ case "Microsoft.Compute/virtualMachines" :
82+ resp , err := c .vmClient .Get (ctx , res .ResourceGroupName , res .Name , nil )
83+ if err != nil {
84+ return nil , fmt .Errorf ("getting VM: %w" , err )
85+ }
86+ return resp .VirtualMachine .Tags , nil
87+ case "Microsoft.Compute/virtualMachineScaleSets/virtualMachines" :
88+ resp , err := c .vmssClient .Get (ctx , res .ResourceGroupName , res .Parent .Name , res .Name , nil )
89+ if err != nil {
90+ return nil , fmt .Errorf ("getting VMSS VM: %w" , err )
91+ }
92+ return resp .VirtualMachineScaleSetVM .Tags , nil
93+ default :
94+ return nil , fmt .Errorf ("unsupported resource type %q for %q" , res .ResourceType , providerID )
8395 }
84- return & resp .VirtualMachineScaleSet , nil
8596}
8697
87- // queryInstanceMetadata queries Azure Instance Metadata documented in
88- // https://docs.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service.
89- func queryInstanceMetadata () (* instanceMetadata , error ) {
98+ type instanceMetadata struct {
99+ SubscriptionID string `json:"subscriptionId"`
100+ ResourceGroupName string `json:"resourceGroupName"`
101+ }
102+
103+ // queryComputeInstanceMetadata queries Azure Instance Metadata.
104+ // https://docs.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service
105+ func queryComputeInstanceMetadata () (* instanceMetadata , error ) {
90106 client := & http.Client {}
91- req , err := http .NewRequest ("GET" , "http://169.254.169.254/metadata/instance" , nil )
107+ req , err := http .NewRequest ("GET" , "http://169.254.169.254/metadata/instance/compute " , nil )
92108 if err != nil {
93109 return nil , fmt .Errorf ("error creating a new request: %s" , err )
94110 }
95111 req .Header .Add ("Metadata" , "True" )
96112
97113 q := req .URL .Query ()
114+ q .Add ("api-version" , "2025-04-07" )
98115 q .Add ("format" , "json" )
99- q .Add ("api-version" , "2020-06-01" )
100116 req .URL .RawQuery = q .Encode ()
101117
102118 resp , err := client .Do (req )
@@ -109,17 +125,9 @@ func queryInstanceMetadata() (*instanceMetadata, error) {
109125 if err != nil {
110126 return nil , fmt .Errorf ("error reading a response from the metadata server: %s" , err )
111127 }
112- metadata , err := unmarshalInstanceMetadata ( body )
113- if err != nil {
128+ metadata := & instanceMetadata {}
129+ if err := json . Unmarshal ( body , metadata ); err != nil {
114130 return nil , fmt .Errorf ("error unmarshalling metadata: %s" , err )
115131 }
116132 return metadata , nil
117133}
118-
119- func unmarshalInstanceMetadata (data []byte ) (* instanceMetadata , error ) {
120- m := & instanceMetadata {}
121- if err := json .Unmarshal (data , m ); err != nil {
122- return nil , err
123- }
124- return m , nil
125- }
0 commit comments