azure-sdk-for-java: [BUG] "Max price change not allowed" error when changing vm tag.

Describe the bug I have been using this sdk to manage my vms juts fine until this week. I have a feature where users can use my app to change a tag on a vm.

VirtualMachine virtualMachine = azure.virtualMachines().getByResourceGroup(resourceGroup, vmName);
        virtualMachine.update().withTag(tagName, tagValue).apply();

This has been working fine until a couple of days ago. Now whenever I do that I get this error: Max price change is not allowed. For more information, see http://aka.ms/AzureSpot/errormessages

Exception or Stack Trace com.microsoft.azure.CloudException: Max price change is not allowed. For more information, see http://aka.ms/AzureSpot/errormessages at com.microsoft.azure.AzureClient.createExceptionFromResponse(AzureClient.java:771) ~[azure-client-runtime-1.7.0.jar!/:na] at com.microsoft.azure.AzureClient.access$100(AzureClient.java:33) ~[azure-client-runtime-1.7.0.jar!/:na] at com.microsoft.azure.AzureClient$3.call(AzureClient.java:160) ~[azure-client-runtime-1.7.0.jar!/:na] at com.microsoft.azure.AzureClient$3.call(AzureClient.java:157) ~[azure-client-runtime-1.7.0.jar!/:na] at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:69) ~[rxjava-1.3.8.jar!/:1.3.8] at retrofit2.adapter.rxjava.CallArbiter.deliverResponse(CallArbiter.java:120) ~[adapter-rxjava-2.6.2.jar!/:na] at retrofit2.adapter.rxjava.CallArbiter.emitResponse(CallArbiter.java:102) ~[adapter-rxjava-2.6.2.jar!/:na] at retrofit2.adapter.rxjava.CallExecuteOnSubscribe.call(CallExecuteOnSubscribe.java:46) ~[adapter-rxjava-2.6.2.jar!/:na] at retrofit2.adapter.rxjava.CallExecuteOnSubscribe.call(CallExecuteOnSubscribe.java:24) ~[adapter-rxjava-2.6.2.jar!/:na] at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeSingle.call(OnSubscribeSingle.java:81) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeSingle.call(OnSubscribeSingle.java:27) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.SingleToObservable.call(SingleToObservable.java:39) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.SingleToObservable.call(SingleToObservable.java:27) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.DeferredScalarSubscriber.subscribeTo(DeferredScalarSubscriber.java:153) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeTakeLastOne.call(OnSubscribeTakeLastOne.java:32) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeTakeLastOne.call(OnSubscribeTakeLastOne.java:22) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:230) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) ~[rxjava-1.3.8.jar!/:1.3.8] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_242] at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_242] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) ~[na:1.8.0_242] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) ~[na:1.8.0_242] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_242] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_242] at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_242] Caused by: rx.exceptions.OnErrorThrowable$OnNextValue: OnError while emitting onNext value: retrofit2.Response.class at rx.exceptions.OnErrorThrowable.addValueAsLastCause(OnErrorThrowable.java:118) ~[rxjava-1.3.8.jar!/:1.3.8] at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:73) ~[rxjava-1.3.8.jar!/:1.3.8] … 43 common frames omitted

To Reproduce Steps to reproduce the behavior: VirtualMachine virtualMachine = azure.virtualMachines().getByResourceGroup(resourceGroup, vmName); virtualMachine.update().withTag(tagName, tagValue).apply();

Code Snippet VirtualMachine virtualMachine = azure.virtualMachines().getByResourceGroup(resourceGroup, vmName); virtualMachine.update().withTag(tagName, tagValue).apply();

Expected behavior Update the vm tag with no error.

Screenshots If applicable, add screenshots to help explain your problem.

Setup (please complete the following information):

  • OS: [windows]
  • IDE : [IntelliJ]
  • Version of the Library used 1.33.0

Additional context Add any other context about the problem here.

Information Checklist Kindly make sure that you have added all the following information above and checkoff the required fields otherwise we will treat the issuer as an incomplete report

  • [ x] Bug Description Added
  • [x ] Repro Steps Added
  • [ x] Setup information Added

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Comments: 25 (9 by maintainers)

Most upvoted comments

Hi @puggianjv, apologies for the delayed response

We have uncovered a bug in our code. When the original create request does not contain a maxPrice but a subsequent PATCH request contains a maxPrice it is concluded as a price change even if the PATCH request contains a maxPrice = -1 which should be the default price when a price is not specified in the PUT request which means there really isn’t a change. you are seeing the failures because, the VM PATCH operation you are doing to update the tags also contained a maxPrice = -1

So as a work around until the fix is in place, we wanted you to do what you were doing earlier, that is when you used to do successful VM PATCH operation to update the tags (few weeks back), don’t include the billingProfile with maxPrice = -1 in the PATCH request to update the tags.

"billingProfile": {
  "maxPrice": -1.0
}

Let me know if you have questions.