@@ -18,12 +18,15 @@ import (
1818 "github.com/Azure/karpenter-provider-azure/pkg/utils"
1919 "github.com/awslabs/operatorpkg/status"
2020 "google.golang.org/grpc"
21+ "google.golang.org/grpc/codes"
22+ grpcstatus "google.golang.org/grpc/status"
2123 "k8s.io/apimachinery/pkg/runtime/schema"
2224 "sigs.k8s.io/controller-runtime/pkg/client"
2325 "sigs.k8s.io/controller-runtime/pkg/log"
2426 v1 "sigs.k8s.io/karpenter/pkg/apis/v1"
2527 corecloudprovider "sigs.k8s.io/karpenter/pkg/cloudprovider"
2628
29+ pluginapi "github.com/Azure/aks-flex/plugin/api"
2730 stretchhelper "github.com/Azure/aks-flex/plugin/pkg/helper"
2831 stretchservices "github.com/Azure/aks-flex/plugin/pkg/services"
2932 agentpoolsapi "github.com/Azure/aks-flex/plugin/pkg/services/agentpools/api"
@@ -50,6 +53,8 @@ type CloudProvider struct {
5053 instanceTypeProvider * instancetype.Provider
5154}
5255
56+ var flexAgentPoolTypeURL = "type.googleapis.com/" + string ((& flexvm.AgentPool {}).ProtoReflect ().Descriptor ().FullName ())
57+
5358func newCloudProvider (
5459 stretchPluginConn * grpc.ClientConn ,
5560 kubeClient client.Client ,
@@ -177,11 +182,8 @@ func (c *CloudProvider) Delete(ctx context.Context, nodeClaim *v1.NodeClaim) err
177182
178183 // Per CloudProvider.Delete contract: signal NodeClaimNotFoundError if the
179184 // remote resource is already gone (so karpenter knows it's safe to drop).
180- if _ , err := stretchhelper .Get [* flexvm.AgentPool ](
181- c .stretchAgentPoolsClient .Get ,
182- ctx , nodeClaim .Name ,
183- ); err != nil {
184- if IsNotFound (err ) {
185+ if _ , err := c .getFlexAgentPool (ctx , nodeClaim .Name ); err != nil {
186+ if IsNotFound (err ) || IsTypeMismatch (err ) {
185187 return corecloudprovider .NewNodeClaimNotFoundError (err )
186188 }
187189 // Non-NotFound get failure: log and proceed with delete in best effort.
@@ -192,6 +194,9 @@ func (c *CloudProvider) Delete(ctx context.Context, nodeClaim *v1.NodeClaim) err
192194 c .stretchAgentPoolsClient .Delete ,
193195 ctx , nodeClaim .Name ,
194196 ); err != nil {
197+ if IsNotFound (err ) || IsTypeMismatch (err ) {
198+ return corecloudprovider .NewNodeClaimNotFoundError (err )
199+ }
195200 return fmt .Errorf ("deleting azure-flex agent pool: %w" , err )
196201 }
197202 logger .Info ("deleted azure-flex agent pool" , "nodeClaim" , nodeClaim .Name )
@@ -203,12 +208,9 @@ func (c *CloudProvider) Get(ctx context.Context, providerID string) (*v1.NodeCla
203208 if err != nil {
204209 return nil , err
205210 }
206- ap , err := stretchhelper .Get [* flexvm.AgentPool ](
207- c .stretchAgentPoolsClient .Get ,
208- ctx , name ,
209- )
211+ ap , err := c .getFlexAgentPool (ctx , name )
210212 if err != nil {
211- if IsNotFound (err ) {
213+ if IsNotFound (err ) || IsTypeMismatch ( err ) {
212214 return nil , corecloudprovider .NewNodeClaimNotFoundError (err )
213215 }
214216 return nil , err
@@ -219,6 +221,26 @@ func (c *CloudProvider) Get(ctx context.Context, providerID string) (*v1.NodeCla
219221 return agentPoolToNodeClaim (ap , nil ), nil
220222}
221223
224+ func (c * CloudProvider ) getFlexAgentPool (ctx context.Context , id string ) (* flexvm.AgentPool , error ) {
225+ req := & pluginapi.GetRequest {}
226+ req .SetId (id )
227+ resp , err := c .stretchAgentPoolsClient .Get (ctx , req )
228+ if err != nil {
229+ return nil , err
230+ }
231+ return flexAgentPoolFromGetResponse (resp )
232+ }
233+
234+ func flexAgentPoolFromGetResponse (resp * pluginapi.GetResponse ) (* flexvm.AgentPool , error ) {
235+ if resp == nil || resp .GetItem () == nil {
236+ return nil , grpcstatus .Error (codes .NotFound , "" )
237+ }
238+ if resp .GetItem ().GetTypeUrl () != flexAgentPoolTypeURL {
239+ return nil , grpcstatus .Error (codes .NotFound , "" )
240+ }
241+ return stretchhelper.AnyTo [* flexvm.AgentPool ](resp .GetItem ())
242+ }
243+
222244func (c * CloudProvider ) List (ctx context.Context ) ([]* v1.NodeClaim , error ) {
223245 aps , err := stretchhelper .List [* flexvm.AgentPool ](
224246 c .stretchAgentPoolsClient .List ,
0 commit comments