azure-sdk-for-go icon indicating copy to clipboard operation
azure-sdk-for-go copied to clipboard

ServiceBus Admin Client - receives 401 responses after migration from standard to premium tier

Open dldl-cmd opened this issue 1 year ago • 5 comments

Bug Report

When using the ServiceBus Admin client it does not automatically connect to the Premium namespace when a Standard Tier namespace is migrated to premium as documented here: https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-migrate-standard-premium#what-happens-when-the-migration-is-committed Instead it always runs into an unauthenticated error. Restarting the application does fix the issue, but according to the documentation it should not be necessary.

GET https://XXX.servicebus.windows.net/TOPIC/Subscriptions/SUBSCRIPTION-------------------------------------------------------------------------------- RESPONSE 401: 401 Unauthorized ERROR CODE: 401 -------------------------------------------------------------------------------- Error Code 401 </Code> Detail Connection rejected after GeoDR failover. TrackingId:e6768e23-213f-476c-a654-f7bab349c5af_G4, SystemTracker:XXX.servicebus.windows.net:TOPIC/Subscriptions/SUBSCRIPTION, Timestamp:2023-05-16T13:24:18 </Detail> </Error> --------------------------------------------------------------------------------

The problem was noticed with KEDA: kedacore/keda#4678.

The problem can be easily reproduced with running the following program:

package main

import (
	"context"
	"fmt"
	"time"

	"github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus/admin"
)

func GetAdminClient() *admin.Client {
	connectionString := "<connection string>"
	client, err := admin.NewClientFromConnectionString(connectionString, nil)
	if err != nil {
		panic(err)
	}

	return client

}

func PrintMessageCountOrError(ctx context.Context, client *admin.Client) {
	properties, err := client.GetSubscriptionRuntimeProperties(ctx, "mytopic", "mysubscription", nil)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(properties.TotalMessageCount)
	}
}

func main() {
	ctx := context.TODO()
	client := GetAdminClient()

	for {
		time.Sleep(1)
		PrintMessageCountOrError(ctx, client)
	}
}

Furthermore the Standard Tier ServiceBus namespace needs to have a topic: mytopic and a subscription: mysubscription. Then during the runtime of the program the namespace can be migrated to a Premium namespace through the Azure Portal. After the migration is completed (a few seconds/minutes later) the application will start to log, that it is not able to connect anymore.

As far as I was able to debug the problem already, it occurs because the connection is after the migration still to the standard namespace. Therefore restarting the application causes it to connect to the new premium namespace. Also doing a long pause in the debugger, so that the connection gets closed, causes it to work again.

  • SDK versions:
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0 h1:8kDqDngH+DmVBiCtIjCFTGa7MBnsIOkF9IccInFEbjk=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM=
github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.4.0 h1:MxbPJrYY81a8xnMml4qICSq1z2WusPw3jSfdIMupnYM=
github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.4.0/go.mod h1:pXDkeh10bAqElvd+S5Ppncj+DCKvJGXNa8rRT2R7rIw=
github.com/Azure/go-amqp v1.0.0 h1:QfCugi1M+4F2JDTRgVnRw7PYXLXZ9hmqk3+9+oJh3OA=
github.com/Azure/go-amqp v1.0.0/go.mod h1:+bg0x3ce5+Q3ahCEXnCsGG3ETpDQe3MEVnOuT2ywPwc=
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY=
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o=
github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU=
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
  • output of go version: go version go1.20.5 linux/amd64

dldl-cmd avatar Jul 14 '23 16:07 dldl-cmd