Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 38 additions & 46 deletions pkg/providers/imagefamily/nodeimageversionsclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,69 +18,61 @@ package imagefamily

import (
"context"
"encoding/json"
"fmt"
"net/http"
"strconv"
"strings"

"github.com/Azure/azure-sdk-for-go/sdk/azcore"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
"github.com/Azure/karpenter-provider-azure/pkg/auth"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v8"
types "github.com/Azure/karpenter-provider-azure/pkg/providers/imagefamily/types"
"github.com/samber/lo"
)

type NodeImageVersionsClient struct {
cred azcore.TokenCredential
cloud cloud.Configuration
client *armcontainerservice.Client
}

func NewNodeImageVersionsClient(cred azcore.TokenCredential, cloud cloud.Configuration) *NodeImageVersionsClient {
return &NodeImageVersionsClient{
cred: cred,
cloud: cloud,
func NewNodeImageVersionsClient(subscriptionID string, cred azcore.TokenCredential, opts *arm.ClientOptions) (*NodeImageVersionsClient, error) {
client, err := armcontainerservice.NewClient(subscriptionID, cred, opts)
if err != nil {
return nil, err
}
return &NodeImageVersionsClient{
client: client,
}, nil
}

func (l *NodeImageVersionsClient) List(ctx context.Context, location, subscription string) (types.NodeImageVersionsResponse, error) {
resourceManagerConfig := l.cloud.Services[cloud.ResourceManager]

resourceURL := fmt.Sprintf(
"%s/subscriptions/%s/providers/Microsoft.ContainerService/locations/%s/nodeImageVersions?api-version=%s",
resourceManagerConfig.Endpoint, subscription, location, "2024-04-02-preview",
)

token, err := l.cred.GetToken(ctx, policy.TokenRequestOptions{
Scopes: []string{auth.TokenScope(l.cloud)},
})
if err != nil {
return types.NodeImageVersionsResponse{}, err
}

req, err := http.NewRequestWithContext(context.Background(), "GET", resourceURL, nil)
if err != nil {
return types.NodeImageVersionsResponse{}, err
}

req.Header.Set("Authorization", "Bearer "+token.Token)
req.Header.Set("Content-Type", "application/json")

client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return types.NodeImageVersionsResponse{}, err
// Note: subscription parameter is part of the interface but not used here since
// the SDK client was already configured with subscriptionID during initialization.
// We maintain the parameter for interface compatibility with NodeImageVersionsAPI.
pager := l.client.NewListNodeImageVersionsPager(location, nil)

var allVersions []types.NodeImageVersion
for pager.More() {
page, err := pager.NextPage(ctx)
if err != nil {
return types.NodeImageVersionsResponse{}, err
}

// Convert SDK types to our internal types
for _, sdkVersion := range page.Value {
if sdkVersion == nil {
continue
}
nodeImageVersion := types.NodeImageVersion{
FullName: lo.FromPtr(sdkVersion.FullName),
OS: lo.FromPtr(sdkVersion.OS),
SKU: lo.FromPtr(sdkVersion.SKU),
Version: lo.FromPtr(sdkVersion.Version),
}
allVersions = append(allVersions, nodeImageVersion)
}
}
defer resp.Body.Close()

var response types.NodeImageVersionsResponse
decoder := json.NewDecoder(resp.Body)
err = decoder.Decode(&response)
if err != nil {
return types.NodeImageVersionsResponse{}, err
response := types.NodeImageVersionsResponse{
Values: FilteredNodeImages(allVersions),
}

response.Values = FilteredNodeImages(response.Values)
return response, nil
}

Expand Down
5 changes: 4 additions & 1 deletion pkg/providers/instance/azure_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,10 @@ func NewAZClient(ctx context.Context, cfg *auth.Config, env *auth.Environment, c
return nil, err
}

nodeImageVersionsClient := imagefamily.NewNodeImageVersionsClient(cred, opts.Cloud)
nodeImageVersionsClient, err := imagefamily.NewNodeImageVersionsClient(cfg.SubscriptionID, cred, opts)
if err != nil {
return nil, err
}

loadBalancersClient, err := armnetwork.NewLoadBalancersClient(cfg.SubscriptionID, cred, opts)
if err != nil {
Expand Down