Repository: kubernetes-sigs/cloud-provider-azure
Pull request #1120 (2022-02-09 05:35:47)

chore: add subsID parameter in snapshot and disk client
<!--  Thanks for sending a pull request!  Here are some tips for you:

1. If this is your first time, please read our contributor guidelines: https://git.k8s.io/community/contributors/guide/first-contribution.md#your-first-contribution and developer guide https://git.k8s.io/community/contributors/devel/development.md#development-guide
2. Please label this pull request according to what type of issue you are addressing, especially if this is a release targeted pull request. For reference on required PR/issue labels, read here:
https://git.k8s.io/community/contributors/devel/sig-release/release.md#issuepr-kind-label
3. Ensure you have added or ran the appropriate tests for your PR: https://git.k8s.io/community/contributors/devel/sig-testing/testing.md
4. If you want *faster* PR reviews, read how: https://git.k8s.io/community/contributors/guide/pull-requests.md#best-practices-for-faster-reviews
5. If the PR is unfinished, see how to mark it: https://git.k8s.io/community/contributors/guide/pull-requests.md#marking-unfinished-pull-requests
-->

#### What type of PR is this?
/kind feature

#### What this PR does / why we need it:
chore: add subsID parameter in snapshot and disk client

#### Which issue(s) this PR fixes:
<!--
*Automatically closes linked issue when PR is merged.
Usage: `Fixes #<issue number>`, or `Fixes (paste link of issue)`.
_If PR is about `failing-tests or flakes`, please post the related issues/tests in a comment and do not use `Fixes`_*
-->
Fixes #

#### Special notes for your reviewer:

#### Does this PR introduce a user-facing change?
<!--
If no, just write "NONE" in the release-note block below.
If yes, a release note is required:
Enter your extended release note in the block below. If the PR requires additional action from users switching to the new release, include the string "action required".

For more information on release notes see: https://git.k8s.io/community/contributors/guide/release-notes.md
-->
```release-note
chore: add subsID parameter in snapshot and disk client
```

#### Additional documentation e.g., KEPs (Kubernetes Enhancement Proposals), usage docs, etc.:

<!--
This section can be blank if this pull request does not require a release note.

When adding links which point to resources within git repositories, like
KEPs or supporting documentation, please reference a specific commit and avoid
linking directly to the master branch. This ensures that links reference a
specific point in time, rather than a document that may change over time.

See here for guidance on getting permanent links to files: https://help.github.com/en/articles/getting-permanent-links-to-files

Please use the following format for linking documentation:
- [KEP]: <link>
- [Usage]: <link>
- [Other doc]: <link>
-->
```docs
chore: add subsID parameter in snapshot and disk client
```


k8s-ci-robot: @andyzhangx: Adding the "do-not-merge/release-note-label-needed" label because no release-note block was detected, please follow our [release note process](https://git.k8s.io/community/contributors/guide/release-notes.md) to remove it.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>
k8s-ci-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes-sigs/cloud-provider-azure/pull/1120#" title="Author self-approved">andyzhangx</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fcloud-provider-azure).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/kubernetes-sigs/cloud-provider-azure/blob/master/OWNERS)~~ [andyzhangx]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
coveralls: 
[![Coverage Status](https://coveralls.io/builds/46362242/badge)](https://coveralls.io/builds/46362242)

Coverage decreased (-0.04%) to 80.147% when pulling **8008c4503881bb3be03960df7ecfb1a57b0e6104 on andyzhangx:disk-cross-subs** into **dbcfc50868f53de0ad273d7492a8ad7d6b366038 on kubernetes-sigs:master**.

k8s-ci-robot: @andyzhangx: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm | 20a039795cd7ec1071c1c9457eb160c37eeeddee | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491292471886352384) | true | `/test pull-cloud-provider-azure-e2e-ccm`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: PR needs rebase.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm | 20a039795cd7ec1071c1c9457eb160c37eeeddee | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491292471886352384) | true | `/test pull-cloud-provider-azure-e2e-ccm`
pull-cloud-provider-azure-e2e-ccm-capz | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491426431652073472) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm | 20a039795cd7ec1071c1c9457eb160c37eeeddee | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491292471886352384) | true | `/test pull-cloud-provider-azure-e2e-ccm`
pull-cloud-provider-azure-e2e-ccm-capz | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491426431652073472) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-unit | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491426431685627904) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-check | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491426431387832320) | true | `/test pull-cloud-provider-azure-check`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-capz | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491426431652073472) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-unit | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491426431685627904) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-check | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491426431387832320) | true | `/test pull-cloud-provider-azure-check`
pull-cloud-provider-azure-e2e-ccm-vmss | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491426431597547520) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`
pull-cloud-provider-azure-e2e-ccm | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491426431547215872) | true | `/test pull-cloud-provider-azure-e2e-ccm`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-capz | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491426431652073472) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-unit | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491426431685627904) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-check | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491426431387832320) | true | `/test pull-cloud-provider-azure-check`
pull-cloud-provider-azure-e2e-ccm-vmss | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491426431597547520) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`
pull-cloud-provider-azure-e2e-ccm | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491426431547215872) | true | `/test pull-cloud-provider-azure-e2e-ccm`
pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb/1491426431488495616) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-capz | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491426431652073472) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-unit | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491426431685627904) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-check | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491426431387832320) | true | `/test pull-cloud-provider-azure-check`
pull-cloud-provider-azure-e2e-ccm-vmss | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491426431597547520) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`
pull-cloud-provider-azure-e2e-ccm | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491426431547215872) | true | `/test pull-cloud-provider-azure-e2e-ccm`
pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb/1491426431488495616) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb`
pull-cloud-provider-azure-e2e | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e/1491426431442358272) | true | `/test pull-cloud-provider-azure-e2e`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-unit | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491426431685627904) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-check | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491426431387832320) | true | `/test pull-cloud-provider-azure-check`
pull-cloud-provider-azure-e2e-ccm-vmss | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491426431597547520) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`
pull-cloud-provider-azure-e2e-ccm | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491426431547215872) | true | `/test pull-cloud-provider-azure-e2e-ccm`
pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb/1491426431488495616) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb`
pull-cloud-provider-azure-e2e | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e/1491426431442358272) | true | `/test pull-cloud-provider-azure-e2e`
pull-cloud-provider-azure-e2e-ccm-capz | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491427063981150208) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-unit | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491427064023093248) | true | `/test pull-cloud-provider-azure-unit`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-vmss | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491426431597547520) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`
pull-cloud-provider-azure-e2e-ccm | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491426431547215872) | true | `/test pull-cloud-provider-azure-e2e-ccm`
pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb/1491426431488495616) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb`
pull-cloud-provider-azure-e2e | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e/1491426431442358272) | true | `/test pull-cloud-provider-azure-e2e`
pull-cloud-provider-azure-e2e-ccm-capz | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491427063981150208) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-unit | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491427064023093248) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-check | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491427063721103360) | true | `/test pull-cloud-provider-azure-check`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-vmss | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491426431597547520) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`
pull-cloud-provider-azure-e2e-ccm | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491426431547215872) | true | `/test pull-cloud-provider-azure-e2e-ccm`
pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb/1491426431488495616) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb`
pull-cloud-provider-azure-e2e-ccm-capz | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491427063981150208) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-unit | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491427064023093248) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-check | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491427063721103360) | true | `/test pull-cloud-provider-azure-check`
pull-cloud-provider-azure-e2e | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e/1491427063784017920) | true | `/test pull-cloud-provider-azure-e2e`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491426431547215872) | true | `/test pull-cloud-provider-azure-e2e-ccm`
pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb | c9d88133de9a28986b07661b2b399b2a27990b9a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb/1491426431488495616) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb`
pull-cloud-provider-azure-e2e-ccm-capz | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491427063981150208) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-unit | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491427064023093248) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-check | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491427063721103360) | true | `/test pull-cloud-provider-azure-check`
pull-cloud-provider-azure-e2e | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e/1491427063784017920) | true | `/test pull-cloud-provider-azure-e2e`
pull-cloud-provider-azure-e2e-ccm-vmss | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491427063930818560) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-capz | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491427063981150208) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-unit | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491427064023093248) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-check | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491427063721103360) | true | `/test pull-cloud-provider-azure-check`
pull-cloud-provider-azure-e2e | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e/1491427063784017920) | true | `/test pull-cloud-provider-azure-e2e`
pull-cloud-provider-azure-e2e-ccm-vmss | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491427063930818560) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`
pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb/1491427063830155264) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb`
pull-cloud-provider-azure-e2e-ccm | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491427063880486912) | true | `/test pull-cloud-provider-azure-e2e-ccm`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-capz | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491427063981150208) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-unit | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491427064023093248) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-e2e | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e/1491427063784017920) | true | `/test pull-cloud-provider-azure-e2e`
pull-cloud-provider-azure-e2e-ccm-vmss | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491427063930818560) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`
pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb/1491427063830155264) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb`
pull-cloud-provider-azure-e2e-ccm | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491427063880486912) | true | `/test pull-cloud-provider-azure-e2e-ccm`
pull-cloud-provider-azure-check | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491673084447428608) | true | `/test pull-cloud-provider-azure-check`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-capz | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491427063981150208) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-e2e | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e/1491427063784017920) | true | `/test pull-cloud-provider-azure-e2e`
pull-cloud-provider-azure-e2e-ccm-vmss | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491427063930818560) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`
pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb/1491427063830155264) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb`
pull-cloud-provider-azure-e2e-ccm | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491427063880486912) | true | `/test pull-cloud-provider-azure-e2e-ccm`
pull-cloud-provider-azure-check | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491673084447428608) | true | `/test pull-cloud-provider-azure-check`
pull-cloud-provider-azure-unit | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491673093674897408) | true | `/test pull-cloud-provider-azure-unit`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e/1491427063784017920) | true | `/test pull-cloud-provider-azure-e2e`
pull-cloud-provider-azure-e2e-ccm-vmss | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491427063930818560) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`
pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb/1491427063830155264) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb`
pull-cloud-provider-azure-e2e-ccm | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491427063880486912) | true | `/test pull-cloud-provider-azure-e2e-ccm`
pull-cloud-provider-azure-check | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491673084447428608) | true | `/test pull-cloud-provider-azure-check`
pull-cloud-provider-azure-unit | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491673093674897408) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-e2e-ccm-capz | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491673092005564416) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e/1491427063784017920) | true | `/test pull-cloud-provider-azure-e2e`
pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb/1491427063830155264) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb`
pull-cloud-provider-azure-e2e-ccm | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491427063880486912) | true | `/test pull-cloud-provider-azure-e2e-ccm`
pull-cloud-provider-azure-check | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491673084447428608) | true | `/test pull-cloud-provider-azure-check`
pull-cloud-provider-azure-unit | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491673093674897408) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-e2e-ccm-capz | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491673092005564416) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-e2e-ccm-vmss | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491673091158315008) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e/1491427063784017920) | true | `/test pull-cloud-provider-azure-e2e`
pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb/1491427063830155264) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb`
pull-cloud-provider-azure-check | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491673084447428608) | true | `/test pull-cloud-provider-azure-check`
pull-cloud-provider-azure-unit | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491673093674897408) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-e2e-ccm-capz | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491673092005564416) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-e2e-ccm-vmss | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491673091158315008) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`
pull-cloud-provider-azure-e2e-ccm | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491673090311065600) | true | `/test pull-cloud-provider-azure-e2e-ccm`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb/1491427063830155264) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb`
pull-cloud-provider-azure-check | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491673084447428608) | true | `/test pull-cloud-provider-azure-check`
pull-cloud-provider-azure-unit | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491673093674897408) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-e2e-ccm-capz | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491673092005564416) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-e2e-ccm-vmss | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491673091158315008) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`
pull-cloud-provider-azure-e2e-ccm | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491673090311065600) | true | `/test pull-cloud-provider-azure-e2e-ccm`
pull-cloud-provider-azure-e2e | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e/1491673085298872320) | true | `/test pull-cloud-provider-azure-e2e`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @andyzhangx: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-check | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-check/1491673084447428608) | true | `/test pull-cloud-provider-azure-check`
pull-cloud-provider-azure-unit | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-unit/1491673093674897408) | true | `/test pull-cloud-provider-azure-unit`
pull-cloud-provider-azure-e2e-ccm-capz | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-capz/1491673092005564416) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-e2e-ccm-vmss | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss/1491673091158315008) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss`
pull-cloud-provider-azure-e2e-ccm | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm/1491673090311065600) | true | `/test pull-cloud-provider-azure-e2e-ccm`
pull-cloud-provider-azure-e2e | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e/1491673085298872320) | true | `/test pull-cloud-provider-azure-e2e`
pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb | 64081119453ff499b2dff7693d4338ee095ba1b0 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/1120/pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb/1491673086968205312) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-basic-lb`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=1120). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Aandyzhangx). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->

Patch:
diff --git a/pkg/azureclients/diskclient/azure_diskclient.go b/pkg/azureclients/diskclient/azure_diskclient.go
index ac77f2139..e424eebb9 100644
--- a/pkg/azureclients/diskclient/azure_diskclient.go
+++ b/pkg/azureclients/diskclient/azure_diskclient.go
@@ -89,8 +89,11 @@ func New(config *azclients.ClientConfig) *Client {
 }
 
 // Get gets a Disk.
-func (c *Client) Get(ctx context.Context, resourceGroupName string, diskName string) (compute.Disk, *retry.Error) {
-	mc := metrics.NewMetricContext("disks", "get", resourceGroupName, c.subscriptionID, "")
+func (c *Client) Get(ctx context.Context, subsID, resourceGroupName, diskName string) (compute.Disk, *retry.Error) {
+	if subsID == "" {
+		subsID = c.subscriptionID
+	}
+	mc := metrics.NewMetricContext("disks", "get", resourceGroupName, subsID, "")
 
 	// Report errors if the client is rate limited.
 	if !c.rateLimiterReader.TryAccept() {
@@ -105,7 +108,7 @@ func (c *Client) Get(ctx context.Context, resourceGroupName string, diskName str
 		return compute.Disk{}, rerr
 	}
 
-	result, rerr := c.getDisk(ctx, resourceGroupName, diskName)
+	result, rerr := c.getDisk(ctx, subsID, resourceGroupName, diskName)
 	mc.Observe(rerr)
 	if rerr != nil {
 		if rerr.IsThrottled() {
@@ -120,9 +123,9 @@ func (c *Client) Get(ctx context.Context, resourceGroupName string, diskName str
 }
 
 // getDisk gets a Disk.
-func (c *Client) getDisk(ctx context.Context, resourceGroupName string, diskName string) (compute.Disk, *retry.Error) {
+func (c *Client) getDisk(ctx context.Context, subsID, resourceGroupName, diskName string) (compute.Disk, *retry.Error) {
 	resourceID := armclient.GetResourceID(
-		c.subscriptionID,
+		subsID,
 		resourceGroupName,
 		"Microsoft.Compute/disks",
 		diskName,
@@ -150,8 +153,11 @@ func (c *Client) getDisk(ctx context.Context, resourceGroupName string, diskName
 }
 
 // CreateOrUpdate creates or updates a Disk.
-func (c *Client) CreateOrUpdate(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.Disk) *retry.Error {
-	mc := metrics.NewMetricContext("disks", "create_or_update", resourceGroupName, c.subscriptionID, "")
+func (c *Client) CreateOrUpdate(ctx context.Context, subsID, resourceGroupName, diskName string, diskParameter compute.Disk) *retry.Error {
+	if subsID == "" {
+		subsID = c.subscriptionID
+	}
+	mc := metrics.NewMetricContext("disks", "create_or_update", resourceGroupName, subsID, "")
 
 	// Report errors if the client is rate limited.
 	if !c.rateLimiterWriter.TryAccept() {
@@ -166,7 +172,7 @@ func (c *Client) CreateOrUpdate(ctx context.Context, resourceGroupName string, d
 		return rerr
 	}
 
-	rerr := c.createOrUpdateDisk(ctx, resourceGroupName, diskName, diskParameter)
+	rerr := c.createOrUpdateDisk(ctx, subsID, resourceGroupName, diskName, diskParameter)
 	mc.Observe(rerr)
 	if rerr != nil {
 		if rerr.IsThrottled() {
@@ -181,9 +187,9 @@ func (c *Client) CreateOrUpdate(ctx context.Context, resourceGroupName string, d
 }
 
 // createOrUpdateDisk creates or updates a Disk.
-func (c *Client) createOrUpdateDisk(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.Disk) *retry.Error {
+func (c *Client) createOrUpdateDisk(ctx context.Context, subsID, resourceGroupName, diskName string, diskParameter compute.Disk) *retry.Error {
 	resourceID := armclient.GetResourceID(
-		c.subscriptionID,
+		subsID,
 		resourceGroupName,
 		"Microsoft.Compute/disks",
 		diskName,
@@ -218,8 +224,11 @@ func (c *Client) createOrUpdateResponder(resp *http.Response) (*compute.Disk, *r
 }
 
 // Update creates or updates a Disk.
-func (c *Client) Update(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.DiskUpdate) *retry.Error {
-	mc := metrics.NewMetricContext("disks", "update", resourceGroupName, c.subscriptionID, "")
+func (c *Client) Update(ctx context.Context, subsID, resourceGroupName, diskName string, diskParameter compute.DiskUpdate) *retry.Error {
+	if subsID == "" {
+		subsID = c.subscriptionID
+	}
+	mc := metrics.NewMetricContext("disks", "update", resourceGroupName, subsID, "")
 
 	// Report errors if the client is rate limited.
 	if !c.rateLimiterWriter.TryAccept() {
@@ -234,7 +243,7 @@ func (c *Client) Update(ctx context.Context, resourceGroupName string, diskName
 		return rerr
 	}
 
-	rerr := c.updateDisk(ctx, resourceGroupName, diskName, diskParameter)
+	rerr := c.updateDisk(ctx, subsID, resourceGroupName, diskName, diskParameter)
 	mc.Observe(rerr)
 	if rerr != nil {
 		if rerr.IsThrottled() {
@@ -249,9 +258,9 @@ func (c *Client) Update(ctx context.Context, resourceGroupName string, diskName
 }
 
 // updateDisk updates a Disk.
-func (c *Client) updateDisk(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.DiskUpdate) *retry.Error {
+func (c *Client) updateDisk(ctx context.Context, subsID, resourceGroupName, diskName string, diskParameter compute.DiskUpdate) *retry.Error {
 	resourceID := armclient.GetResourceID(
-		c.subscriptionID,
+		subsID,
 		resourceGroupName,
 		"Microsoft.Compute/disks",
 		diskName,
@@ -286,8 +295,11 @@ func (c *Client) updateResponder(resp *http.Response) (*compute.Disk, *retry.Err
 }
 
 // Delete deletes a Disk by name.
-func (c *Client) Delete(ctx context.Context, resourceGroupName string, diskName string) *retry.Error {
-	mc := metrics.NewMetricContext("disks", "delete", resourceGroupName, c.subscriptionID, "")
+func (c *Client) Delete(ctx context.Context, subsID, resourceGroupName, diskName string) *retry.Error {
+	if subsID == "" {
+		subsID = c.subscriptionID
+	}
+	mc := metrics.NewMetricContext("disks", "delete", resourceGroupName, subsID, "")
 
 	// Report errors if the client is rate limited.
 	if !c.rateLimiterWriter.TryAccept() {
@@ -302,7 +314,7 @@ func (c *Client) Delete(ctx context.Context, resourceGroupName string, diskName
 		return rerr
 	}
 
-	rerr := c.deleteDisk(ctx, resourceGroupName, diskName)
+	rerr := c.deleteDisk(ctx, subsID, resourceGroupName, diskName)
 	mc.Observe(rerr)
 	if rerr != nil {
 		if rerr.IsThrottled() {
@@ -317,9 +329,9 @@ func (c *Client) Delete(ctx context.Context, resourceGroupName string, diskName
 }
 
 // deleteDisk deletes a PublicIPAddress by name.
-func (c *Client) deleteDisk(ctx context.Context, resourceGroupName string, diskName string) *retry.Error {
+func (c *Client) deleteDisk(ctx context.Context, subsID, resourceGroupName string, diskName string) *retry.Error {
 	resourceID := armclient.GetResourceID(
-		c.subscriptionID,
+		subsID,
 		resourceGroupName,
 		"Microsoft.Compute/disks",
 		diskName,
@@ -329,9 +341,12 @@ func (c *Client) deleteDisk(ctx context.Context, resourceGroupName string, diskN
 }
 
 // ListByResourceGroup lists all the disks under a resource group.
-func (c *Client) ListByResourceGroup(ctx context.Context, resourceGroupName string) ([]compute.Disk, *retry.Error) {
+func (c *Client) ListByResourceGroup(ctx context.Context, subsID, resourceGroupName string) ([]compute.Disk, *retry.Error) {
+	if subsID == "" {
+		subsID = c.subscriptionID
+	}
 	resourceID := fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Compute/disks",
-		autorest.Encode("path", c.subscriptionID),
+		autorest.Encode("path", subsID),
 		autorest.Encode("path", resourceGroupName))
 
 	result := make([]compute.Disk, 0)
diff --git a/pkg/azureclients/diskclient/interface.go b/pkg/azureclients/diskclient/interface.go
index 6d22cc815..ffcd52096 100644
--- a/pkg/azureclients/diskclient/interface.go
+++ b/pkg/azureclients/diskclient/interface.go
@@ -37,17 +37,17 @@ const (
 // Don't forget to run "hack/update-mock-clients.sh" command to generate the mock client.
 type Interface interface {
 	// Get gets a Disk.
-	Get(ctx context.Context, resourceGroupName string, diskName string) (result compute.Disk, rerr *retry.Error)
+	Get(ctx context.Context, subsID, resourceGroupName, diskName string) (result compute.Disk, rerr *retry.Error)
 
 	// CreateOrUpdate creates or updates a Disk.
-	CreateOrUpdate(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.Disk) *retry.Error
+	CreateOrUpdate(ctx context.Context, subsID, resourceGroupName, diskName string, diskParameter compute.Disk) *retry.Error
 
 	// Update updates a Disk.
-	Update(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.DiskUpdate) *retry.Error
+	Update(ctx context.Context, subsID, resourceGroupName, diskName string, diskParameter compute.DiskUpdate) *retry.Error
 
 	// Delete deletes a Disk by name.
-	Delete(ctx context.Context, resourceGroupName string, diskName string) *retry.Error
+	Delete(ctx context.Context, subsID, resourceGroupName, diskName string) *retry.Error
 
 	// ListByResourceGroup lists all the disks under a resource group.
-	ListByResourceGroup(ctx context.Context, resourceGroupName string) ([]compute.Disk, *retry.Error)
+	ListByResourceGroup(ctx context.Context, subsID, resourceGroupName string) ([]compute.Disk, *retry.Error)
 }
diff --git a/pkg/azureclients/diskclient/mockdiskclient/interface.go b/pkg/azureclients/diskclient/mockdiskclient/interface.go
index 2df9677b9..e3af24459 100644
--- a/pkg/azureclients/diskclient/mockdiskclient/interface.go
+++ b/pkg/azureclients/diskclient/mockdiskclient/interface.go
@@ -54,73 +54,73 @@ func (m *MockInterface) EXPECT() *MockInterfaceMockRecorder {
 }
 
 // CreateOrUpdate mocks base method.
-func (m *MockInterface) CreateOrUpdate(ctx context.Context, resourceGroupName, diskName string, diskParameter compute.Disk) *retry.Error {
+func (m *MockInterface) CreateOrUpdate(ctx context.Context, subsID, resourceGroupName, diskName string, diskParameter compute.Disk) *retry.Error {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "CreateOrUpdate", ctx, resourceGroupName, diskName, diskParameter)
+	ret := m.ctrl.Call(m, "CreateOrUpdate", ctx, subsID, resourceGroupName, diskName, diskParameter)
 	ret0, _ := ret[0].(*retry.Error)
 	return ret0
 }
 
 // CreateOrUpdate indicates an expected call of CreateOrUpdate.
-func (mr *MockInterfaceMockRecorder) CreateOrUpdate(ctx, resourceGroupName, diskName, diskParameter interface{}) *gomock.Call {
+func (mr *MockInterfaceMockRecorder) CreateOrUpdate(ctx, subsID, resourceGroupName, diskName, diskParameter interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrUpdate", reflect.TypeOf((*MockInterface)(nil).CreateOrUpdate), ctx, resourceGroupName, diskName, diskParameter)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrUpdate", reflect.TypeOf((*MockInterface)(nil).CreateOrUpdate), ctx, subsID, resourceGroupName, diskName, diskParameter)
 }
 
 // Delete mocks base method.
-func (m *MockInterface) Delete(ctx context.Context, resourceGroupName, diskName string) *retry.Error {
+func (m *MockInterface) Delete(ctx context.Context, subsID, resourceGroupName, diskName string) *retry.Error {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Delete", ctx, resourceGroupName, diskName)
+	ret := m.ctrl.Call(m, "Delete", ctx, subsID, resourceGroupName, diskName)
 	ret0, _ := ret[0].(*retry.Error)
 	return ret0
 }
 
 // Delete indicates an expected call of Delete.
-func (mr *MockInterfaceMockRecorder) Delete(ctx, resourceGroupName, diskName interface{}) *gomock.Call {
+func (mr *MockInterfaceMockRecorder) Delete(ctx, subsID, resourceGroupName, diskName interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockInterface)(nil).Delete), ctx, resourceGroupName, diskName)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockInterface)(nil).Delete), ctx, subsID, resourceGroupName, diskName)
 }
 
 // Get mocks base method.
-func (m *MockInterface) Get(ctx context.Context, resourceGroupName, diskName string) (compute.Disk, *retry.Error) {
+func (m *MockInterface) Get(ctx context.Context, subsID, resourceGroupName, diskName string) (compute.Disk, *retry.Error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Get", ctx, resourceGroupName, diskName)
+	ret := m.ctrl.Call(m, "Get", ctx, subsID, resourceGroupName, diskName)
 	ret0, _ := ret[0].(compute.Disk)
 	ret1, _ := ret[1].(*retry.Error)
 	return ret0, ret1
 }
 
 // Get indicates an expected call of Get.
-func (mr *MockInterfaceMockRecorder) Get(ctx, resourceGroupName, diskName interface{}) *gomock.Call {
+func (mr *MockInterfaceMockRecorder) Get(ctx, subsID, resourceGroupName, diskName interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockInterface)(nil).Get), ctx, resourceGroupName, diskName)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockInterface)(nil).Get), ctx, subsID, resourceGroupName, diskName)
 }
 
 // ListByResourceGroup mocks base method.
-func (m *MockInterface) ListByResourceGroup(ctx context.Context, resourceGroupName string) ([]compute.Disk, *retry.Error) {
+func (m *MockInterface) ListByResourceGroup(ctx context.Context, subsID, resourceGroupName string) ([]compute.Disk, *retry.Error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ListByResourceGroup", ctx, resourceGroupName)
+	ret := m.ctrl.Call(m, "ListByResourceGroup", ctx, subsID, resourceGroupName)
 	ret0, _ := ret[0].([]compute.Disk)
 	ret1, _ := ret[1].(*retry.Error)
 	return ret0, ret1
 }
 
 // ListByResourceGroup indicates an expected call of ListByResourceGroup.
-func (mr *MockInterfaceMockRecorder) ListByResourceGroup(ctx, resourceGroupName interface{}) *gomock.Call {
+func (mr *MockInterfaceMockRecorder) ListByResourceGroup(ctx, subsID, resourceGroupName interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByResourceGroup", reflect.TypeOf((*MockInterface)(nil).ListByResourceGroup), ctx, resourceGroupName)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByResourceGroup", reflect.TypeOf((*MockInterface)(nil).ListByResourceGroup), ctx, subsID, resourceGroupName)
 }
 
 // Update mocks base method.
-func (m *MockInterface) Update(ctx context.Context, resourceGroupName, diskName string, diskParameter compute.DiskUpdate) *retry.Error {
+func (m *MockInterface) Update(ctx context.Context, subsID, resourceGroupName, diskName string, diskParameter compute.DiskUpdate) *retry.Error {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Update", ctx, resourceGroupName, diskName, diskParameter)
+	ret := m.ctrl.Call(m, "Update", ctx, subsID, resourceGroupName, diskName, diskParameter)
 	ret0, _ := ret[0].(*retry.Error)
 	return ret0
 }
 
 // Update indicates an expected call of Update.
-func (mr *MockInterfaceMockRecorder) Update(ctx, resourceGroupName, diskName, diskParameter interface{}) *gomock.Call {
+func (mr *MockInterfaceMockRecorder) Update(ctx, subsID, resourceGroupName, diskName, diskParameter interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockInterface)(nil).Update), ctx, resourceGroupName, diskName, diskParameter)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockInterface)(nil).Update), ctx, subsID, resourceGroupName, diskName, diskParameter)
 }
diff --git a/pkg/azureclients/snapshotclient/azure_snapshotclient.go b/pkg/azureclients/snapshotclient/azure_snapshotclient.go
index 64b27918f..91608e721 100644
--- a/pkg/azureclients/snapshotclient/azure_snapshotclient.go
+++ b/pkg/azureclients/snapshotclient/azure_snapshotclient.go
@@ -86,8 +86,11 @@ func New(config *azclients.ClientConfig) *Client {
 }
 
 // Get gets a Snapshot.
-func (c *Client) Get(ctx context.Context, resourceGroupName string, snapshotName string) (compute.Snapshot, *retry.Error) {
-	mc := metrics.NewMetricContext("snapshot", "get", resourceGroupName, c.subscriptionID, "")
+func (c *Client) Get(ctx context.Context, subsID, resourceGroupName, snapshotName string) (compute.Snapshot, *retry.Error) {
+	if subsID == "" {
+		subsID = c.subscriptionID
+	}
+	mc := metrics.NewMetricContext("snapshot", "get", resourceGroupName, subsID, "")
 
 	// Report errors if the client is rate limited.
 	if !c.rateLimiterReader.TryAccept() {
@@ -102,7 +105,7 @@ func (c *Client) Get(ctx context.Context, resourceGroupName string, snapshotName
 		return compute.Snapshot{}, rerr
 	}
 
-	result, rerr := c.getSnapshot(ctx, resourceGroupName, snapshotName)
+	result, rerr := c.getSnapshot(ctx, subsID, resourceGroupName, snapshotName)
 	mc.Observe(rerr)
 	if rerr != nil {
 		if rerr.IsThrottled() {
@@ -117,9 +120,9 @@ func (c *Client) Get(ctx context.Context, resourceGroupName string, snapshotName
 }
 
 // getSnapshot gets a Snapshot.
-func (c *Client) getSnapshot(ctx context.Context, resourceGroupName string, snapshotName string) (compute.Snapshot, *retry.Error) {
+func (c *Client) getSnapshot(ctx context.Context, subsID, resourceGroupName, snapshotName string) (compute.Snapshot, *retry.Error) {
 	resourceID := armclient.GetResourceID(
-		c.subscriptionID,
+		subsID,
 		resourceGroupName,
 		"Microsoft.Compute/snapshots",
 		snapshotName,
@@ -147,8 +150,11 @@ func (c *Client) getSnapshot(ctx context.Context, resourceGroupName string, snap
 }
 
 // Delete deletes a Snapshot by name.
-func (c *Client) Delete(ctx context.Context, resourceGroupName string, snapshotName string) *retry.Error {
-	mc := metrics.NewMetricContext("snapshot", "delete", resourceGroupName, c.subscriptionID, "")
+func (c *Client) Delete(ctx context.Context, subsID, resourceGroupName, snapshotName string) *retry.Error {
+	if subsID == "" {
+		subsID = c.subscriptionID
+	}
+	mc := metrics.NewMetricContext("snapshot", "delete", resourceGroupName, subsID, "")
 
 	// Report errors if the client is rate limited.
 	if !c.rateLimiterWriter.TryAccept() {
@@ -163,7 +169,7 @@ func (c *Client) Delete(ctx context.Context, resourceGroupName string, snapshotN
 		return rerr
 	}
 
-	rerr := c.deleteSnapshot(ctx, resourceGroupName, snapshotName)
+	rerr := c.deleteSnapshot(ctx, subsID, resourceGroupName, snapshotName)
 	mc.Observe(rerr)
 	if rerr != nil {
 		if rerr.IsThrottled() {
@@ -178,9 +184,9 @@ func (c *Client) Delete(ctx context.Context, resourceGroupName string, snapshotN
 }
 
 // deleteSnapshot deletes a PublicIPAddress by name.
-func (c *Client) deleteSnapshot(ctx context.Context, resourceGroupName string, snapshotName string) *retry.Error {
+func (c *Client) deleteSnapshot(ctx context.Context, subsID, resourceGroupName, snapshotName string) *retry.Error {
 	resourceID := armclient.GetResourceID(
-		c.subscriptionID,
+		subsID,
 		resourceGroupName,
 		"Microsoft.Compute/snapshots",
 		snapshotName,
@@ -190,8 +196,11 @@ func (c *Client) deleteSnapshot(ctx context.Context, resourceGroupName string, s
 }
 
 // CreateOrUpdate creates or updates a Snapshot.
-func (c *Client) CreateOrUpdate(ctx context.Context, resourceGroupName string, snapshotName string, snapshot compute.Snapshot) *retry.Error {
-	mc := metrics.NewMetricContext("snapshot", "create_or_update", resourceGroupName, c.subscriptionID, "")
+func (c *Client) CreateOrUpdate(ctx context.Context, subsID, resourceGroupName, snapshotName string, snapshot compute.Snapshot) *retry.Error {
+	if subsID == "" {
+		subsID = c.subscriptionID
+	}
+	mc := metrics.NewMetricContext("snapshot", "create_or_update", resourceGroupName, subsID, "")
 
 	// Report errors if the client is rate limited.
 	if !c.rateLimiterWriter.TryAccept() {
@@ -206,7 +215,7 @@ func (c *Client) CreateOrUpdate(ctx context.Context, resourceGroupName string, s
 		return rerr
 	}
 
-	rerr := c.createOrUpdateSnapshot(ctx, resourceGroupName, snapshotName, snapshot)
+	rerr := c.createOrUpdateSnapshot(ctx, subsID, resourceGroupName, snapshotName, snapshot)
 	mc.Observe(rerr)
 	if rerr != nil {
 		if rerr.IsThrottled() {
@@ -221,9 +230,9 @@ func (c *Client) CreateOrUpdate(ctx context.Context, resourceGroupName string, s
 }
 
 // createOrUpdateSnapshot creates or updates a Snapshot.
-func (c *Client) createOrUpdateSnapshot(ctx context.Context, resourceGroupName string, snapshotName string, snapshot compute.Snapshot) *retry.Error {
+func (c *Client) createOrUpdateSnapshot(ctx context.Context, subsID, resourceGroupName, snapshotName string, snapshot compute.Snapshot) *retry.Error {
 	resourceID := armclient.GetResourceID(
-		c.subscriptionID,
+		subsID,
 		resourceGroupName,
 		"Microsoft.Compute/snapshots",
 		snapshotName,
@@ -258,8 +267,11 @@ func (c *Client) createOrUpdateResponder(resp *http.Response) (*compute.Snapshot
 }
 
 // ListByResourceGroup get a list snapshots by resourceGroup.
-func (c *Client) ListByResourceGroup(ctx context.Context, resourceGroupName string) ([]compute.Snapshot, *retry.Error) {
-	mc := metrics.NewMetricContext("snapshot", "list_by_resource_group", resourceGroupName, c.subscriptionID, "")
+func (c *Client) ListByResourceGroup(ctx context.Context, subsID, resourceGroupName string) ([]compute.Snapshot, *retry.Error) {
+	if subsID == "" {
+		subsID = c.subscriptionID
+	}
+	mc := metrics.NewMetricContext("snapshot", "list_by_resource_group", resourceGroupName, subsID, "")
 
 	// Report errors if the client is rate limited.
 	if !c.rateLimiterReader.TryAccept() {
@@ -274,7 +286,7 @@ func (c *Client) ListByResourceGroup(ctx context.Context, resourceGroupName stri
 		return nil, rerr
 	}
 
-	result, rerr := c.listSnapshotsByResourceGroup(ctx, resourceGroupName)
+	result, rerr := c.listSnapshotsByResourceGroup(ctx, subsID, resourceGroupName)
 	mc.Observe(rerr)
 	if rerr != nil {
 		if rerr.IsThrottled() {
@@ -289,9 +301,12 @@ func (c *Client) ListByResourceGroup(ctx context.Context, resourceGroupName stri
 }
 
 // listSnapshotsByResourceGroup gets a list of snapshots in the resource group.
-func (c *Client) listSnapshotsByResourceGroup(ctx context.Context, resourceGroupName string) ([]compute.Snapshot, *retry.Error) {
+func (c *Client) listSnapshotsByResourceGroup(ctx context.Context, subsID, resourceGroupName string) ([]compute.Snapshot, *retry.Error) {
+	if subsID == "" {
+		subsID = c.subscriptionID
+	}
 	resourceID := fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Compute/snapshots",
-		autorest.Encode("path", c.subscriptionID),
+		autorest.Encode("path", subsID),
 		autorest.Encode("path", resourceGroupName))
 	result := make([]compute.Snapshot, 0)
 	page := &SnapshotListPage{}
diff --git a/pkg/azureclients/snapshotclient/interface.go b/pkg/azureclients/snapshotclient/interface.go
index f0f6f285a..731db0d29 100644
--- a/pkg/azureclients/snapshotclient/interface.go
+++ b/pkg/azureclients/snapshotclient/interface.go
@@ -37,14 +37,14 @@ const (
 // Don't forget to run "hack/update-mock-clients.sh" command to generate the mock client.
 type Interface interface {
 	// Get gets a Snapshot.
-	Get(ctx context.Context, resourceGroupName string, snapshotName string) (compute.Snapshot, *retry.Error)
+	Get(ctx context.Context, subsID, resourceGroupName, snapshotName string) (compute.Snapshot, *retry.Error)
 
 	// Delete deletes a Snapshot by name.
-	Delete(ctx context.Context, resourceGroupName string, snapshotName string) *retry.Error
+	Delete(ctx context.Context, subsID, resourceGroupName, snapshotName string) *retry.Error
 
 	// ListByResourceGroup get a list snapshots by resourceGroup.
-	ListByResourceGroup(ctx context.Context, resourceGroupName string) ([]compute.Snapshot, *retry.Error)
+	ListByResourceGroup(ctx context.Context, subsID, resourceGroupName string) ([]compute.Snapshot, *retry.Error)
 
 	// CreateOrUpdate creates or updates a Snapshot.
-	CreateOrUpdate(ctx context.Context, resourceGroupName string, snapshotName string, snapshot compute.Snapshot) *retry.Error
+	CreateOrUpdate(ctx context.Context, subsID, resourceGroupName, snapshotName string, snapshot compute.Snapshot) *retry.Error
 }
diff --git a/pkg/azureclients/snapshotclient/mocksnapshotclient/interface.go b/pkg/azureclients/snapshotclient/mocksnapshotclient/interface.go
index 7936abf3d..6c9809abf 100644
--- a/pkg/azureclients/snapshotclient/mocksnapshotclient/interface.go
+++ b/pkg/azureclients/snapshotclient/mocksnapshotclient/interface.go
@@ -54,59 +54,59 @@ func (m *MockInterface) EXPECT() *MockInterfaceMockRecorder {
 }
 
 // CreateOrUpdate mocks base method.
-func (m *MockInterface) CreateOrUpdate(ctx context.Context, resourceGroupName, snapshotName string, snapshot compute.Snapshot) *retry.Error {
+func (m *MockInterface) CreateOrUpdate(ctx context.Context, subsID, resourceGroupName, snapshotName string, snapshot compute.Snapshot) *retry.Error {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "CreateOrUpdate", ctx, resourceGroupName, snapshotName, snapshot)
+	ret := m.ctrl.Call(m, "CreateOrUpdate", ctx, subsID, resourceGroupName, snapshotName, snapshot)
 	ret0, _ := ret[0].(*retry.Error)
 	return ret0
 }
 
 // CreateOrUpdate indicates an expected call of CreateOrUpdate.
-func (mr *MockInterfaceMockRecorder) CreateOrUpdate(ctx, resourceGroupName, snapshotName, snapshot interface{}) *gomock.Call {
+func (mr *MockInterfaceMockRecorder) CreateOrUpdate(ctx, subsID, resourceGroupName, snapshotName, snapshot interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrUpdate", reflect.TypeOf((*MockInterface)(nil).CreateOrUpdate), ctx, resourceGroupName, snapshotName, snapshot)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrUpdate", reflect.TypeOf((*MockInterface)(nil).CreateOrUpdate), ctx, subsID, resourceGroupName, snapshotName, snapshot)
 }
 
 // Delete mocks base method.
-func (m *MockInterface) Delete(ctx context.Context, resourceGroupName, snapshotName string) *retry.Error {
+func (m *MockInterface) Delete(ctx context.Context, subsID, resourceGroupName, snapshotName string) *retry.Error {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Delete", ctx, resourceGroupName, snapshotName)
+	ret := m.ctrl.Call(m, "Delete", ctx, subsID, resourceGroupName, snapshotName)
 	ret0, _ := ret[0].(*retry.Error)
 	return ret0
 }
 
 // Delete indicates an expected call of Delete.
-func (mr *MockInterfaceMockRecorder) Delete(ctx, resourceGroupName, snapshotName interface{}) *gomock.Call {
+func (mr *MockInterfaceMockRecorder) Delete(ctx, subsID, resourceGroupName, snapshotName interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockInterface)(nil).Delete), ctx, resourceGroupName, snapshotName)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockInterface)(nil).Delete), ctx, subsID, resourceGroupName, snapshotName)
 }
 
 // Get mocks base method.
-func (m *MockInterface) Get(ctx context.Context, resourceGroupName, snapshotName string) (compute.Snapshot, *retry.Error) {
+func (m *MockInterface) Get(ctx context.Context, subsID, resourceGroupName, snapshotName string) (compute.Snapshot, *retry.Error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Get", ctx, resourceGroupName, snapshotName)
+	ret := m.ctrl.Call(m, "Get", ctx, subsID, resourceGroupName, snapshotName)
 	ret0, _ := ret[0].(compute.Snapshot)
 	ret1, _ := ret[1].(*retry.Error)
 	return ret0, ret1
 }
 
 // Get indicates an expected call of Get.
-func (mr *MockInterfaceMockRecorder) Get(ctx, resourceGroupName, snapshotName interface{}) *gomock.Call {
+func (mr *MockInterfaceMockRecorder) Get(ctx, subsID, resourceGroupName, snapshotName interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockInterface)(nil).Get), ctx, resourceGroupName, snapshotName)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockInterface)(nil).Get), ctx, subsID, resourceGroupName, snapshotName)
 }
 
 // ListByResourceGroup mocks base method.
-func (m *MockInterface) ListByResourceGroup(ctx context.Context, resourceGroupName string) ([]compute.Snapshot, *retry.Error) {
+func (m *MockInterface) ListByResourceGroup(ctx context.Context, subsID, resourceGroupName string) ([]compute.Snapshot, *retry.Error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ListByResourceGroup", ctx, resourceGroupName)
+	ret := m.ctrl.Call(m, "ListByResourceGroup", ctx, subsID, resourceGroupName)
 	ret0, _ := ret[0].([]compute.Snapshot)
 	ret1, _ := ret[1].(*retry.Error)
 	return ret0, ret1
 }
 
 // ListByResourceGroup indicates an expected call of ListByResourceGroup.
-func (mr *MockInterfaceMockRecorder) ListByResourceGroup(ctx, resourceGroupName interface{}) *gomock.Call {
+func (mr *MockInterfaceMockRecorder) ListByResourceGroup(ctx, subsID, resourceGroupName interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByResourceGroup", reflect.TypeOf((*MockInterface)(nil).ListByResourceGroup), ctx, resourceGroupName)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByResourceGroup", reflect.TypeOf((*MockInterface)(nil).ListByResourceGroup), ctx, subsID, resourceGroupName)
 }
diff --git a/pkg/provider/azure_controller_common.go b/pkg/provider/azure_controller_common.go
index 01488e1b8..17538238a 100644
--- a/pkg/provider/azure_controller_common.go
+++ b/pkg/provider/azure_controller_common.go
@@ -255,7 +255,7 @@ func (c *controllerCommon) AttachDisk(ctx context.Context, async bool, diskName,
 	} else {
 		klog.Warningf("azureDisk - switch to batch operation due to rate limited(async: %t), QPS: %f", async, c.diskOpRateLimiter.QPS())
 	}
-	resourceGroup, err := getResourceGroupFromDiskURI(diskURI)
+	resourceGroup, _, err := getInfoFromDiskURI(diskURI)
 	if err != nil {
 		return -1, err
 	}
@@ -597,12 +597,12 @@ func (c *controllerCommon) filterNonExistingDisks(ctx context.Context, unfiltere
 
 func (c *controllerCommon) checkDiskExists(ctx context.Context, diskURI string) (bool, error) {
 	diskName := path.Base(diskURI)
-	resourceGroup, err := getResourceGroupFromDiskURI(diskURI)
+	resourceGroup, subsID, err := getInfoFromDiskURI(diskURI)
 	if err != nil {
 		return false, err
 	}
 
-	if _, rerr := c.cloud.DisksClient.Get(ctx, resourceGroup, diskName); rerr != nil {
+	if _, rerr := c.cloud.DisksClient.Get(ctx, subsID, resourceGroup, diskName); rerr != nil {
 		if rerr.HTTPStatusCode == http.StatusNotFound {
 			return false, nil
 		}
diff --git a/pkg/provider/azure_managedDiskController.go b/pkg/provider/azure_managedDiskController.go
index 4ff8bd5ee..0be69a8e4 100644
--- a/pkg/provider/azure_managedDiskController.go
+++ b/pkg/provider/azure_managedDiskController.go
@@ -80,6 +80,8 @@ type ManagedDiskOptions struct {
 	DiskAccessID *string
 	// BurstingEnabled - Set to true to enable bursting beyond the provisioned performance target of the disk.
 	BurstingEnabled *bool
+	// SubscrtionID - specify a different SubscrtionID
+	SubscrtionID string
 }
 
 //CreateManagedDisk : create managed disk
@@ -111,7 +113,19 @@ func (c *ManagedDiskController) CreateManagedDisk(ctx context.Context, options *
 	diskSizeGB := int32(options.SizeGB)
 	diskSku := options.StorageAccountType
 
-	creationData, err := getValidCreationData(c.common.subscriptionID, options.ResourceGroup, options.SourceResourceID, options.SourceType)
+	rg := c.common.resourceGroup
+	if options.ResourceGroup != "" {
+		rg = options.ResourceGroup
+	}
+	subsID := c.common.subscriptionID
+	if options.SubscrtionID != "" {
+		subsID = options.SubscrtionID
+	}
+	if options.SubscrtionID != "" && !strings.EqualFold(options.SubscrtionID, c.common.subscriptionID) && options.ResourceGroup == "" {
+		return "", fmt.Errorf("resourceGroup must be specified when subscriptionID(%s) is not empty", subsID)
+	}
+
+	creationData, err := getValidCreationData(subsID, rg, options.SourceResourceID, options.SourceType)
 	if err != nil {
 		return "", err
 	}
@@ -206,23 +220,17 @@ func (c *ManagedDiskController) CreateManagedDisk(ctx context.Context, options *
 		model.Zones = &createZones
 	}
 
-	if options.ResourceGroup == "" {
-		options.ResourceGroup = c.common.resourceGroup
-	}
-
-	cloud := c.common.cloud
-	rerr := cloud.DisksClient.CreateOrUpdate(ctx, options.ResourceGroup, options.DiskName, model)
-	if rerr != nil {
+	if rerr := c.common.cloud.DisksClient.CreateOrUpdate(ctx, subsID, rg, options.DiskName, model); rerr != nil {
 		return "", rerr.Error()
 	}
 
-	diskID := fmt.Sprintf(managedDiskPath, cloud.subscriptionID, options.ResourceGroup, options.DiskName)
+	diskID := fmt.Sprintf(managedDiskPath, subsID, rg, options.DiskName)
 
 	if options.SkipGetDiskOperation {
 		klog.Warningf("azureDisk - GetDisk(%s, StorageAccountType:%s) is throttled, unable to confirm provisioningState in poll process", options.DiskName, options.StorageAccountType)
 	} else {
 		err = kwait.ExponentialBackoff(defaultBackOff, func() (bool, error) {
-			provisionState, id, err := c.GetDisk(ctx, options.ResourceGroup, options.DiskName)
+			provisionState, id, err := c.GetDisk(ctx, subsID, rg, options.DiskName)
 			if err == nil {
 				if id != "" {
 					diskID = id
@@ -250,7 +258,7 @@ func (c *ManagedDiskController) CreateManagedDisk(ctx context.Context, options *
 
 //DeleteManagedDisk : delete managed disk
 func (c *ManagedDiskController) DeleteManagedDisk(ctx context.Context, diskURI string) error {
-	resourceGroup, err := getResourceGroupFromDiskURI(diskURI)
+	resourceGroup, subsID, err := getInfoFromDiskURI(diskURI)
 	if err != nil {
 		return err
 	}
@@ -260,7 +268,7 @@ func (c *ManagedDiskController) DeleteManagedDisk(ctx context.Context, diskURI s
 	}
 
 	diskName := path.Base(diskURI)
-	disk, rerr := c.common.cloud.DisksClient.Get(ctx, resourceGroup, diskName)
+	disk, rerr := c.common.cloud.DisksClient.Get(ctx, subsID, resourceGroup, diskName)
 	if rerr != nil {
 		if rerr.HTTPStatusCode == http.StatusNotFound {
 			klog.V(2).Infof("azureDisk - disk(%s) is already deleted", diskURI)
@@ -275,7 +283,7 @@ func (c *ManagedDiskController) DeleteManagedDisk(ctx context.Context, diskURI s
 		return fmt.Errorf("disk(%s) already attached to node(%s), could not be deleted", diskURI, *disk.ManagedBy)
 	}
 
-	if rerr := c.common.cloud.DisksClient.Delete(ctx, resourceGroup, diskName); rerr != nil {
+	if rerr := c.common.cloud.DisksClient.Delete(ctx, subsID, resourceGroup, diskName); rerr != nil {
 		return rerr.Error()
 	}
 	// We don't need poll here, k8s will immediately stop referencing the disk
@@ -287,8 +295,8 @@ func (c *ManagedDiskController) DeleteManagedDisk(ctx context.Context, diskURI s
 }
 
 // GetDisk return: disk provisionState, diskID, error
-func (c *ManagedDiskController) GetDisk(ctx context.Context, resourceGroup, diskName string) (string, string, error) {
-	result, rerr := c.common.cloud.DisksClient.Get(ctx, resourceGroup, diskName)
+func (c *ManagedDiskController) GetDisk(ctx context.Context, subsID, resourceGroup, diskName string) (string, string, error) {
+	result, rerr := c.common.cloud.DisksClient.Get(ctx, subsID, resourceGroup, diskName)
 	if rerr != nil {
 		return "", "", rerr.Error()
 	}
@@ -302,12 +310,12 @@ func (c *ManagedDiskController) GetDisk(ctx context.Context, resourceGroup, disk
 // ResizeDisk Expand the disk to new size
 func (c *ManagedDiskController) ResizeDisk(ctx context.Context, diskURI string, oldSize resource.Quantity, newSize resource.Quantity, supportOnlineResize bool) (resource.Quantity, error) {
 	diskName := path.Base(diskURI)
-	resourceGroup, err := getResourceGroupFromDiskURI(diskURI)
+	resourceGroup, subsID, err := getInfoFromDiskURI(diskURI)
 	if err != nil {
 		return oldSize, err
 	}
 
-	result, rerr := c.common.cloud.DisksClient.Get(ctx, resourceGroup, diskName)
+	result, rerr := c.common.cloud.DisksClient.Get(ctx, subsID, resourceGroup, diskName)
 	if rerr != nil {
 		return oldSize, rerr.Error()
 	}
@@ -340,7 +348,7 @@ func (c *ManagedDiskController) ResizeDisk(ctx context.Context, diskURI string,
 		},
 	}
 
-	if rerr := c.common.cloud.DisksClient.Update(ctx, resourceGroup, diskName, diskParameter); rerr != nil {
+	if rerr := c.common.cloud.DisksClient.Update(ctx, subsID, resourceGroup, diskName, diskParameter); rerr != nil {
 		return oldSize, rerr.Error()
 	}
 
@@ -348,15 +356,15 @@ func (c *ManagedDiskController) ResizeDisk(ctx context.Context, diskURI string,
 	return newSizeQuant, nil
 }
 
-// get resource group name from a managed disk URI, e.g. return {group-name} according to
+// get resource group name, subs id from a managed disk URI, e.g. return {group-name}, {sub-id} according to
 // /subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id}
 // according to https://docs.microsoft.com/en-us/rest/api/compute/disks/get
-func getResourceGroupFromDiskURI(diskURI string) (string, error) {
+func getInfoFromDiskURI(diskURI string) (string, string, error) {
 	fields := strings.Split(diskURI, "/")
 	if len(fields) != 9 || strings.ToLower(fields[3]) != "resourcegroups" {
-		return "", fmt.Errorf("invalid disk URI: %s", diskURI)
+		return "", "", fmt.Errorf("invalid disk URI: %s", diskURI)
 	}
-	return fields[4], nil
+	return fields[4], fields[2], nil
 }
 
 // GetLabelsForVolume implements PVLabeler.GetLabelsForVolume
@@ -378,7 +386,7 @@ func (c *Cloud) GetLabelsForVolume(ctx context.Context, pv *v1.PersistentVolume)
 func (c *Cloud) GetAzureDiskLabels(ctx context.Context, diskURI string) (map[string]string, error) {
 	// Get disk's resource group.
 	diskName := path.Base(diskURI)
-	resourceGroup, err := getResourceGroupFromDiskURI(diskURI)
+	resourceGroup, subsID, err := getInfoFromDiskURI(diskURI)
 	if err != nil {
 		klog.Errorf("Failed to get resource group for AzureDisk %q: %v", diskName, err)
 		return nil, err
@@ -391,7 +399,7 @@ func (c *Cloud) GetAzureDiskLabels(ctx context.Context, diskURI string) (map[str
 	if c.DisksClient == nil {
 		return labels, nil
 	}
-	disk, rerr := c.DisksClient.Get(ctx, resourceGroup, diskName)
+	disk, rerr := c.DisksClient.Get(ctx, subsID, resourceGroup, diskName)
 	if rerr != nil {
 		klog.Errorf("Failed to get information for AzureDisk %q: %v", diskName, rerr)
 		return nil, rerr.Error()


Test patch:
diff --git a/pkg/azureclients/diskclient/azure_diskclient_test.go b/pkg/azureclients/diskclient/azure_diskclient_test.go
index 34e98debc..152d85564 100644
--- a/pkg/azureclients/diskclient/azure_diskclient_test.go
+++ b/pkg/azureclients/diskclient/azure_diskclient_test.go
@@ -97,7 +97,7 @@ func TestGetNotFound(t *testing.T) {
 
 	diskClient := getTestDiskClient(armClient)
 	expected := compute.Disk{Response: autorest.Response{}}
-	result, rerr := diskClient.Get(context.TODO(), "rg", "disk1")
+	result, rerr := diskClient.Get(context.TODO(), "", "rg", "disk1")
 	assert.Equal(t, expected, result)
 	assert.NotNil(t, rerr)
 	assert.Equal(t, http.StatusNotFound, rerr.HTTPStatusCode)
@@ -117,7 +117,7 @@ func TestGetInternalError(t *testing.T) {
 
 	diskClient := getTestDiskClient(armClient)
 	expected := compute.Disk{Response: autorest.Response{}}
-	result, rerr := diskClient.Get(context.TODO(), "rg", "disk1")
+	result, rerr := diskClient.Get(context.TODO(), "", "rg", "disk1")
 	assert.Equal(t, expected, result)
 	assert.NotNil(t, rerr)
 	assert.Equal(t, http.StatusInternalServerError, rerr.HTTPStatusCode)
@@ -142,7 +142,7 @@ func TestGetThrottle(t *testing.T) {
 	armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
 
 	diskClient := getTestDiskClient(armClient)
-	result, rerr := diskClient.Get(context.TODO(), "rg", "disk1")
+	result, rerr := diskClient.Get(context.TODO(), "", "rg", "disk1")
 	assert.Empty(t, result)
 	assert.Equal(t, throttleErr, rerr)
 }
@@ -161,7 +161,7 @@ func TestCreateOrUpdate(t *testing.T) {
 	armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
 
 	diskClient := getTestDiskClient(armClient)
-	rerr := diskClient.CreateOrUpdate(context.TODO(), "rg", "disk1", disk)
+	rerr := diskClient.CreateOrUpdate(context.TODO(), "", "rg", "disk1", disk)
 	assert.Nil(t, rerr)
 
 	response = &http.Response{
@@ -177,7 +177,7 @@ func TestCreateOrUpdate(t *testing.T) {
 
 	armClient.EXPECT().PutResource(gomock.Any(), to.String(disk.ID), disk).Return(response, throttleErr).Times(1)
 	armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
-	rerr = diskClient.CreateOrUpdate(context.TODO(), "rg", "disk1", disk)
+	rerr = diskClient.CreateOrUpdate(context.TODO(), "", "rg", "disk1", disk)
 	assert.Equal(t, throttleErr, rerr)
 }
 
@@ -195,7 +195,7 @@ func TestUpdate(t *testing.T) {
 	armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
 
 	diskClient := getTestDiskClient(armClient)
-	rerr := diskClient.Update(context.TODO(), "rg", "disk1", diskUpdate)
+	rerr := diskClient.Update(context.TODO(), "", "rg", "disk1", diskUpdate)
 	assert.Nil(t, rerr)
 
 	response = &http.Response{
@@ -211,7 +211,7 @@ func TestUpdate(t *testing.T) {
 
 	armClient.EXPECT().PatchResource(gomock.Any(), testResourceID, diskUpdate).Return(response, throttleErr).Times(1)
 	armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
-	rerr = diskClient.Update(context.TODO(), "rg", "disk1", diskUpdate)
+	rerr = diskClient.Update(context.TODO(), "", "rg", "disk1", diskUpdate)
 	assert.Equal(t, throttleErr, rerr)
 }
 
@@ -232,7 +232,7 @@ func TestDelete(t *testing.T) {
 	armClient.EXPECT().DeleteResource(gomock.Any(), to.String(r.ID), "").Return(nil).Times(1)
 
 	diskClient := getTestDiskClient(armClient)
-	rerr := diskClient.Delete(context.TODO(), "rg", "disk1")
+	rerr := diskClient.Delete(context.TODO(), "", "rg", "disk1")
 	assert.Nil(t, rerr)
 
 	throttleErr := &retry.Error{
@@ -242,7 +242,7 @@ func TestDelete(t *testing.T) {
 		RetryAfter:     time.Unix(100, 0),
 	}
 	armClient.EXPECT().DeleteResource(gomock.Any(), to.String(r.ID), "").Return(throttleErr).Times(1)
-	rerr = diskClient.Delete(context.TODO(), "rg", "disk1")
+	rerr = diskClient.Delete(context.TODO(), "", "rg", "disk1")
 	assert.Equal(t, throttleErr, rerr)
 }
 
diff --git a/pkg/azureclients/snapshotclient/azure_snapshotclient_test.go b/pkg/azureclients/snapshotclient/azure_snapshotclient_test.go
index 85f2228d9..1b293e928 100644
--- a/pkg/azureclients/snapshotclient/azure_snapshotclient_test.go
+++ b/pkg/azureclients/snapshotclient/azure_snapshotclient_test.go
@@ -101,7 +101,7 @@ func TestGet(t *testing.T) {
 
 	expected := compute.Snapshot{Response: autorest.Response{Response: response}}
 	snClient := getTestSnapshotClient(armClient)
-	result, rerr := snClient.Get(context.TODO(), "rg", "sn1")
+	result, rerr := snClient.Get(context.TODO(), "", "rg", "sn1")
 	assert.Equal(t, expected, result)
 	assert.Nil(t, rerr)
 }
@@ -118,7 +118,7 @@ func TestGetNeverRateLimiter(t *testing.T) {
 	armClient := mockarmclient.NewMockInterface(ctrl)
 	snClient := getTestSnapshotClientWithNeverRateLimiter(armClient)
 	expected := compute.Snapshot{}
-	result, rerr := snClient.Get(context.TODO(), "rg", "sn1")
+	result, rerr := snClient.Get(context.TODO(), "", "rg", "sn1")
 	assert.Equal(t, expected, result)
 	assert.Equal(t, snGetErr, rerr)
 }
@@ -136,7 +136,7 @@ func TestGetRetryAfterReader(t *testing.T) {
 	armClient := mockarmclient.NewMockInterface(ctrl)
 	snClient := getTestSnapshotClientWithRetryAfterReader(armClient)
 	expected := compute.Snapshot{}
-	result, rerr := snClient.Get(context.TODO(), "rg", "sn1")
+	result, rerr := snClient.Get(context.TODO(), "", "rg", "sn1")
 	assert.Equal(t, expected, result)
 	assert.Equal(t, snGetErr, rerr)
 }
@@ -155,7 +155,7 @@ func TestGetNotFound(t *testing.T) {
 
 	snClient := getTestSnapshotClient(armClient)
 	expected := compute.Snapshot{Response: autorest.Response{}}
-	result, rerr := snClient.Get(context.TODO(), "rg", "sn1")
+	result, rerr := snClient.Get(context.TODO(), "", "rg", "sn1")
 	assert.Equal(t, expected, result)
 	assert.NotNil(t, rerr)
 	assert.Equal(t, http.StatusNotFound, rerr.HTTPStatusCode)
@@ -180,7 +180,7 @@ func TestGetThrottle(t *testing.T) {
 	armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
 
 	snClient := getTestSnapshotClient(armClient)
-	result, rerr := snClient.Get(context.TODO(), "rg", "sn1")
+	result, rerr := snClient.Get(context.TODO(), "", "rg", "sn1")
 	assert.Empty(t, result)
 	assert.Equal(t, throttleErr, rerr)
 }
@@ -199,7 +199,7 @@ func TestGetInternalError(t *testing.T) {
 
 	snClient := getTestSnapshotClient(armClient)
 	expected := compute.Snapshot{Response: autorest.Response{}}
-	result, rerr := snClient.Get(context.TODO(), "rg", "sn1")
+	result, rerr := snClient.Get(context.TODO(), "", "rg", "sn1")
 	assert.Equal(t, expected, result)
 	assert.NotNil(t, rerr)
 	assert.Equal(t, http.StatusInternalServerError, rerr.HTTPStatusCode)
@@ -221,7 +221,7 @@ func TestListByResourceGroup(t *testing.T) {
 	armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
 
 	snClient := getTestSnapshotClient(armClient)
-	result, rerr := snClient.ListByResourceGroup(context.TODO(), "rg")
+	result, rerr := snClient.ListByResourceGroup(context.TODO(), "", "rg")
 	assert.Nil(t, rerr)
 	assert.Equal(t, 3, len(result))
 }
@@ -240,7 +240,7 @@ func TestListByResourceGroupNotFound(t *testing.T) {
 
 	snClient := getTestSnapshotClient(armClient)
 	expected := []compute.Snapshot{}
-	result, rerr := snClient.ListByResourceGroup(context.TODO(), "rg")
+	result, rerr := snClient.ListByResourceGroup(context.TODO(), "", "rg")
 	assert.Equal(t, expected, result)
 	assert.NotNil(t, rerr)
 	assert.Equal(t, http.StatusNotFound, rerr.HTTPStatusCode)
@@ -260,7 +260,7 @@ func TestListByResourceGroupInternalError(t *testing.T) {
 
 	snClient := getTestSnapshotClient(armClient)
 	expected := []compute.Snapshot{}
-	result, rerr := snClient.ListByResourceGroup(context.TODO(), "rg")
+	result, rerr := snClient.ListByResourceGroup(context.TODO(), "", "rg")
 	assert.Equal(t, expected, result)
 	assert.NotNil(t, rerr)
 	assert.Equal(t, http.StatusInternalServerError, rerr.HTTPStatusCode)
@@ -284,7 +284,7 @@ func TestListByResourceGroupThrottle(t *testing.T) {
 	armClient.EXPECT().GetResource(gomock.Any(), testResourcePrefix, "").Return(response, throttleErr).Times(1)
 	armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
 	snClient := getTestSnapshotClient(armClient)
-	result, rerr := snClient.ListByResourceGroup(context.TODO(), "rg")
+	result, rerr := snClient.ListByResourceGroup(context.TODO(), "", "rg")
 	assert.Empty(t, result)
 	assert.NotNil(t, rerr)
 	assert.Equal(t, throttleErr, rerr)
@@ -305,7 +305,7 @@ func TestListByResourceGroupWithListResponderError(t *testing.T) {
 		}, nil).Times(1)
 	armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
 	snClient := getTestSnapshotClient(armClient)
-	result, rerr := snClient.ListByResourceGroup(context.TODO(), "rg")
+	result, rerr := snClient.ListByResourceGroup(context.TODO(), "", "rg")
 	assert.NotNil(t, rerr)
 	assert.Equal(t, 0, len(result))
 }
@@ -333,7 +333,7 @@ func TestListWithNextPage(t *testing.T) {
 		}, nil).Times(1)
 	armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(2)
 	snClient := getTestSnapshotClient(armClient)
-	result, rerr := snClient.ListByResourceGroup(context.TODO(), "rg")
+	result, rerr := snClient.ListByResourceGroup(context.TODO(), "", "rg")
 	assert.Nil(t, rerr)
 	assert.Equal(t, 6, len(result))
 }
@@ -349,7 +349,7 @@ func TestListByResourceGroupNeverRateLimiter(t *testing.T) {
 
 	armClient := mockarmclient.NewMockInterface(ctrl)
 	snClient := getTestSnapshotClientWithNeverRateLimiter(armClient)
-	result, rerr := snClient.ListByResourceGroup(context.TODO(), "rg")
+	result, rerr := snClient.ListByResourceGroup(context.TODO(), "", "rg")
 	assert.Equal(t, 0, len(result))
 	assert.NotNil(t, rerr)
 	assert.Equal(t, snListErr, rerr)
@@ -367,7 +367,7 @@ func TestListByResourceGroupRetryAfterReader(t *testing.T) {
 
 	armClient := mockarmclient.NewMockInterface(ctrl)
 	snClient := getTestSnapshotClientWithRetryAfterReader(armClient)
-	result, rerr := snClient.ListByResourceGroup(context.TODO(), "rg")
+	result, rerr := snClient.ListByResourceGroup(context.TODO(), "", "rg")
 	assert.Equal(t, 0, len(result))
 	assert.NotNil(t, rerr)
 	assert.Equal(t, snListErr, rerr)
@@ -481,7 +481,7 @@ func TestCreateOrUpdate(t *testing.T) {
 	armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
 
 	snClient := getTestSnapshotClient(armClient)
-	rerr := snClient.CreateOrUpdate(context.TODO(), "rg", "sn1", sn)
+	rerr := snClient.CreateOrUpdate(context.TODO(), "", "rg", "sn1", sn)
 	assert.Nil(t, rerr)
 }
 
@@ -498,7 +498,7 @@ func TestCreateOrUpdateWithCreateOrUpdateResponderError(t *testing.T) {
 	armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
 
 	snClient := getTestSnapshotClient(armClient)
-	rerr := snClient.CreateOrUpdate(context.TODO(), "rg", "sn1", sn)
+	rerr := snClient.CreateOrUpdate(context.TODO(), "", "rg", "sn1", sn)
 	assert.NotNil(t, rerr)
 }
 
@@ -514,7 +514,7 @@ func TestCreateOrUpdateNeverRateLimiter(t *testing.T) {
 	armClient := mockarmclient.NewMockInterface(ctrl)
 	snClient := getTestSnapshotClientWithNeverRateLimiter(armClient)
 	sn := getTestSnapshot("sn1")
-	rerr := snClient.CreateOrUpdate(context.TODO(), "rg", "sn1", sn)
+	rerr := snClient.CreateOrUpdate(context.TODO(), "", "rg", "sn1", sn)
 	assert.NotNil(t, rerr)
 	assert.Equal(t, snCreateOrUpdateErr, rerr)
 }
@@ -532,7 +532,7 @@ func TestCreateOrUpdateRetryAfterReader(t *testing.T) {
 	sn := getTestSnapshot("sn1")
 	armClient := mockarmclient.NewMockInterface(ctrl)
 	snClient := getTestSnapshotClientWithRetryAfterReader(armClient)
-	rerr := snClient.CreateOrUpdate(context.TODO(), "rg", "sn1", sn)
+	rerr := snClient.CreateOrUpdate(context.TODO(), "", "rg", "sn1", sn)
 	assert.NotNil(t, rerr)
 	assert.Equal(t, snCreateOrUpdateErr, rerr)
 }
@@ -558,7 +558,7 @@ func TestCreateOrUpdateThrottle(t *testing.T) {
 	armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
 
 	snClient := getTestSnapshotClient(armClient)
-	rerr := snClient.CreateOrUpdate(context.TODO(), "rg", "sn1", sn)
+	rerr := snClient.CreateOrUpdate(context.TODO(), "", "rg", "sn1", sn)
 	assert.NotNil(t, rerr)
 	assert.Equal(t, throttleErr, rerr)
 }
@@ -572,7 +572,7 @@ func TestDelete(t *testing.T) {
 	armClient.EXPECT().DeleteResource(gomock.Any(), to.String(r.ID), "").Return(nil).Times(1)
 
 	rtClient := getTestSnapshotClient(armClient)
-	rerr := rtClient.Delete(context.TODO(), "rg", "sn1")
+	rerr := rtClient.Delete(context.TODO(), "", "rg", "sn1")
 	assert.Nil(t, rerr)
 }
 
@@ -587,7 +587,7 @@ func TestDeleteNeverRateLimiter(t *testing.T) {
 
 	armClient := mockarmclient.NewMockInterface(ctrl)
 	snClient := getTestSnapshotClientWithNeverRateLimiter(armClient)
-	rerr := snClient.Delete(context.TODO(), "rg", "sn1")
+	rerr := snClient.Delete(context.TODO(), "", "rg", "sn1")
 	assert.NotNil(t, rerr)
 	assert.Equal(t, snDeleteErr, rerr)
 }
@@ -604,7 +604,7 @@ func TestDeleteRetryAfterReader(t *testing.T) {
 
 	armClient := mockarmclient.NewMockInterface(ctrl)
 	snClient := getTestSnapshotClientWithRetryAfterReader(armClient)
-	rerr := snClient.Delete(context.TODO(), "rg", "sn1")
+	rerr := snClient.Delete(context.TODO(), "", "rg", "sn1")
 	assert.NotNil(t, rerr)
 	assert.Equal(t, snDeleteErr, rerr)
 }
@@ -625,7 +625,7 @@ func TestDeleteThrottle(t *testing.T) {
 	armClient.EXPECT().DeleteResource(gomock.Any(), to.String(sn.ID), "").Return(throttleErr).Times(1)
 
 	snClient := getTestSnapshotClient(armClient)
-	rerr := snClient.Delete(context.TODO(), "rg", "sn1")
+	rerr := snClient.Delete(context.TODO(), "", "rg", "sn1")
 	assert.NotNil(t, rerr)
 	assert.Equal(t, throttleErr, rerr)
 }
diff --git a/pkg/provider/azure_controller_common_test.go b/pkg/provider/azure_controller_common_test.go
index d681f92d9..4af705616 100644
--- a/pkg/provider/azure_controller_common_test.go
+++ b/pkg/provider/azure_controller_common_test.go
@@ -763,8 +763,8 @@ func TestCheckDiskExists(t *testing.T) {
 		testCloud.SubscriptionID, testCloud.ResourceGroup, newDiskName)
 
 	mockDisksClient := testCloud.DisksClient.(*mockdiskclient.MockInterface)
-	mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.ResourceGroup, newDiskName).Return(compute.Disk{}, nil).AnyTimes()
-	mockDisksClient.EXPECT().Get(gomock.Any(), gomock.Not(testCloud.ResourceGroup), gomock.Any()).Return(compute.Disk{}, &retry.Error{HTTPStatusCode: http.StatusNotFound, RawError: cloudprovider.InstanceNotFound}).AnyTimes()
+	mockDisksClient.EXPECT().Get(gomock.Any(), gomock.Any(), testCloud.ResourceGroup, newDiskName).Return(compute.Disk{}, nil).AnyTimes()
+	mockDisksClient.EXPECT().Get(gomock.Any(), gomock.Any(), gomock.Not(testCloud.ResourceGroup), gomock.Any()).Return(compute.Disk{}, &retry.Error{HTTPStatusCode: http.StatusNotFound, RawError: cloudprovider.InstanceNotFound}).AnyTimes()
 
 	testCases := []struct {
 		diskURI        string
@@ -818,8 +818,8 @@ func TestFilterNonExistingDisks(t *testing.T) {
 	newDiskURI := diskURIPrefix + newDiskName
 
 	mockDisksClient := testCloud.DisksClient.(*mockdiskclient.MockInterface)
-	mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.ResourceGroup, newDiskName).Return(compute.Disk{}, nil).AnyTimes()
-	mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.ResourceGroup, gomock.Not(newDiskName)).Return(compute.Disk{}, &retry.Error{HTTPStatusCode: http.StatusNotFound, RawError: cloudprovider.InstanceNotFound}).AnyTimes()
+	mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.SubscriptionID, testCloud.ResourceGroup, newDiskName).Return(compute.Disk{}, nil).AnyTimes()
+	mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.SubscriptionID, testCloud.ResourceGroup, gomock.Not(newDiskName)).Return(compute.Disk{}, &retry.Error{HTTPStatusCode: http.StatusNotFound, RawError: cloudprovider.InstanceNotFound}).AnyTimes()
 
 	disks := []compute.DataDisk{
 		{
@@ -880,7 +880,7 @@ func TestFilterNonExistingDisksWithSpecialHTTPStatusCode(t *testing.T) {
 	newDiskURI := diskURIPrefix + newDiskName
 
 	mockDisksClient := testCloud.DisksClient.(*mockdiskclient.MockInterface)
-	mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.ResourceGroup, gomock.Eq(newDiskName)).Return(compute.Disk{}, &retry.Error{HTTPStatusCode: http.StatusBadRequest, RawError: cloudprovider.InstanceNotFound}).AnyTimes()
+	mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.SubscriptionID, testCloud.ResourceGroup, gomock.Eq(newDiskName)).Return(compute.Disk{}, &retry.Error{HTTPStatusCode: http.StatusBadRequest, RawError: cloudprovider.InstanceNotFound}).AnyTimes()
 
 	disks := []compute.DataDisk{
 		{
diff --git a/pkg/provider/azure_managedDiskController_test.go b/pkg/provider/azure_managedDiskController_test.go
index 932efca86..1eb473dd6 100644
--- a/pkg/provider/azure_managedDiskController_test.go
+++ b/pkg/provider/azure_managedDiskController_test.go
@@ -62,6 +62,8 @@ func TestCreateManagedDisk(t *testing.T) {
 		diskIOPSReadWrite   string
 		diskMBPSReadWrite   string
 		diskEncryptionSetID string
+		subscriptionID      string
+		resouceGroup        string
 		networkAccessPolicy compute.NetworkAccessPolicy
 		diskAccessID        *string
 		expectedDiskID      string
@@ -205,6 +207,17 @@ func TestCreateManagedDisk(t *testing.T) {
 			expectedErr:         true,
 			expectedErrMsg:      fmt.Errorf("DiskAccessID(diskAccessID) must be empty when NetworkAccessPolicy(AllowAll) is not AllowPrivate"),
 		},
+		{
+			desc:           "resourceGroup must be specified when subscriptionID is not empty",
+			diskID:         "",
+			diskName:       disk1Name,
+			subscriptionID: "abc",
+			resouceGroup:   "",
+			expectedDiskID: "",
+			existedDisk:    compute.Disk{ID: to.StringPtr(disk1ID), Name: to.StringPtr(disk1Name), DiskProperties: &compute.DiskProperties{Encryption: &compute.Encryption{DiskEncryptionSetID: &goodDiskEncryptionSetID, Type: compute.EncryptionTypeEncryptionAtRestWithCustomerKey}, ProvisioningState: to.StringPtr("Succeeded")}, Tags: testTags},
+			expectedErr:    true,
+			expectedErrMsg: fmt.Errorf("resourceGroup must be specified when subscriptionID(abc) is not empty"),
+		},
 	}
 
 	for i, test := range testCases {
@@ -213,7 +226,7 @@ func TestCreateManagedDisk(t *testing.T) {
 		volumeOptions := &ManagedDiskOptions{
 			DiskName:            test.diskName,
 			StorageAccountType:  test.storageAccountType,
-			ResourceGroup:       "",
+			ResourceGroup:       test.resouceGroup,
 			SizeGB:              1,
 			Tags:                map[string]string{"tag1": "azure-tag1"},
 			AvailabilityZone:    "westus-testzone",
@@ -223,12 +236,13 @@ func TestCreateManagedDisk(t *testing.T) {
 			MaxShares:           maxShare,
 			NetworkAccessPolicy: test.networkAccessPolicy,
 			DiskAccessID:        test.diskAccessID,
+			SubscrtionID:        test.subscriptionID,
 		}
 
 		mockDisksClient := testCloud.DisksClient.(*mockdiskclient.MockInterface)
 		//disk := getTestDisk(test.diskName)
-		mockDisksClient.EXPECT().CreateOrUpdate(gomock.Any(), testCloud.ResourceGroup, test.diskName, gomock.Any()).Return(nil).AnyTimes()
-		mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, nil).AnyTimes()
+		mockDisksClient.EXPECT().CreateOrUpdate(gomock.Any(), gomock.Any(), gomock.Any(), test.diskName, gomock.Any()).Return(nil).AnyTimes()
+		mockDisksClient.EXPECT().Get(gomock.Any(), gomock.Any(), gomock.Any(), test.diskName).Return(test.existedDisk, nil).AnyTimes()
 
 		actualDiskID, err := managedDiskController.CreateManagedDisk(ctx, volumeOptions)
 		assert.Equal(t, test.expectedDiskID, actualDiskID, "TestCase[%d]: %s", i, test.desc)
@@ -273,13 +287,13 @@ func TestCreateManagedDiskWithExtendedLocation(t *testing.T) {
 	}
 
 	mockDisksClient := testCloud.DisksClient.(*mockdiskclient.MockInterface)
-	mockDisksClient.EXPECT().CreateOrUpdate(gomock.Any(), testCloud.ResourceGroup, diskName, gomock.Any()).
-		Do(func(ctx interface{}, rg string, dn string, disk compute.Disk) {
+	mockDisksClient.EXPECT().CreateOrUpdate(gomock.Any(), testCloud.subscriptionID, testCloud.ResourceGroup, diskName, gomock.Any()).
+		Do(func(ctx interface{}, subsID, rg, dn string, disk compute.Disk) {
 			assert.Equal(t, el.Name, disk.ExtendedLocation.Name, "The extended location name should match.")
 			assert.Equal(t, el.Type, disk.ExtendedLocation.Type, "The extended location type should match.")
 		}).Return(nil)
 
-	mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.ResourceGroup, diskName).Return(diskreturned, nil).AnyTimes()
+	mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.subscriptionID, testCloud.ResourceGroup, diskName).Return(diskreturned, nil).AnyTimes()
 
 	actualDiskID, err := managedDiskController.CreateManagedDisk(ctx, volumeOptions)
 	assert.Equal(t, expectedDiskID, actualDiskID, "Disk ID does not match.")
@@ -334,11 +348,11 @@ func TestDeleteManagedDisk(t *testing.T) {
 
 		mockDisksClient := testCloud.DisksClient.(*mockdiskclient.MockInterface)
 		if test.diskName == fakeGetDiskFailed {
-			mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, &retry.Error{RawError: fmt.Errorf("Get Disk failed")}).AnyTimes()
+			mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.subscriptionID, testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, &retry.Error{RawError: fmt.Errorf("Get Disk failed")}).AnyTimes()
 		} else {
-			mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, nil).AnyTimes()
+			mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.subscriptionID, testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, nil).AnyTimes()
 		}
-		mockDisksClient.EXPECT().Delete(gomock.Any(), testCloud.ResourceGroup, test.diskName).Return(nil).AnyTimes()
+		mockDisksClient.EXPECT().Delete(gomock.Any(), testCloud.subscriptionID, testCloud.ResourceGroup, test.diskName).Return(nil).AnyTimes()
 
 		err := managedDiskController.DeleteManagedDisk(ctx, diskURI)
 		assert.Equal(t, test.expectedErr, err != nil, "TestCase[%d]: %s, return error: %v", i, test.desc, err)
@@ -389,12 +403,12 @@ func TestGetDisk(t *testing.T) {
 
 		mockDisksClient := testCloud.DisksClient.(*mockdiskclient.MockInterface)
 		if test.diskName == fakeGetDiskFailed {
-			mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, &retry.Error{RawError: fmt.Errorf("Get Disk failed")}).AnyTimes()
+			mockDisksClient.EXPECT().Get(gomock.Any(), "", testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, &retry.Error{RawError: fmt.Errorf("Get Disk failed")}).AnyTimes()
 		} else {
-			mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, nil).AnyTimes()
+			mockDisksClient.EXPECT().Get(gomock.Any(), "", testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, nil).AnyTimes()
 		}
 
-		provisioningState, diskid, err := managedDiskController.GetDisk(ctx, testCloud.ResourceGroup, test.diskName)
+		provisioningState, diskid, err := managedDiskController.GetDisk(ctx, "", testCloud.ResourceGroup, test.diskName)
 		assert.Equal(t, test.expectedErr, err != nil, "TestCase[%d]: %s, return error: %v", i, test.desc, err)
 		if test.expectedErr {
 			assert.EqualError(t, test.expectedErrMsg, err.Error(), "TestCase[%d]: %s, expected: %v, return: %v", i, test.desc, test.expectedErrMsg, err)
@@ -492,14 +506,14 @@ func TestResizeDisk(t *testing.T) {
 
 		mockDisksClient := testCloud.DisksClient.(*mockdiskclient.MockInterface)
 		if test.diskName == fakeGetDiskFailed {
-			mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, &retry.Error{RawError: fmt.Errorf("Get Disk failed")}).AnyTimes()
+			mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.SubscriptionID, testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, &retry.Error{RawError: fmt.Errorf("Get Disk failed")}).AnyTimes()
 		} else {
-			mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, nil).AnyTimes()
+			mockDisksClient.EXPECT().Get(gomock.Any(), gomock.Any(), testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, nil).AnyTimes()
 		}
 		if test.diskName == fakeCreateDiskFailed {
-			mockDisksClient.EXPECT().Update(gomock.Any(), testCloud.ResourceGroup, test.diskName, gomock.Any()).Return(&retry.Error{RawError: fmt.Errorf("Create Disk failed")}).AnyTimes()
+			mockDisksClient.EXPECT().Update(gomock.Any(), testCloud.SubscriptionID, testCloud.ResourceGroup, test.diskName, gomock.Any()).Return(&retry.Error{RawError: fmt.Errorf("Create Disk failed")}).AnyTimes()
 		} else {
-			mockDisksClient.EXPECT().Update(gomock.Any(), testCloud.ResourceGroup, test.diskName, gomock.Any()).Return(nil).AnyTimes()
+			mockDisksClient.EXPECT().Update(gomock.Any(), testCloud.SubscriptionID, testCloud.ResourceGroup, test.diskName, gomock.Any()).Return(nil).AnyTimes()
 		}
 
 		result, err := managedDiskController.ResizeDisk(ctx, diskURI, test.oldSize, test.newSize, false)
@@ -657,11 +671,11 @@ func TestGetLabelsForVolume(t *testing.T) {
 		testCloud := GetTestCloud(ctrl)
 		mockDisksClient := testCloud.DisksClient.(*mockdiskclient.MockInterface)
 		if test.diskName == fakeGetDiskFailed {
-			mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, &retry.Error{RawError: fmt.Errorf("Get Disk failed")}).AnyTimes()
+			mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.SubscriptionID, testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, &retry.Error{RawError: fmt.Errorf("Get Disk failed")}).AnyTimes()
 		} else {
-			mockDisksClient.EXPECT().Get(gomock.Any(), testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, nil).AnyTimes()
+			mockDisksClient.EXPECT().Get(gomock.Any(), gomock.Any(), testCloud.ResourceGroup, test.diskName).Return(test.existedDisk, nil).AnyTimes()
 		}
-		mockDisksClient.EXPECT().CreateOrUpdate(gomock.Any(), testCloud.ResourceGroup, test.diskName, gomock.Any()).Return(nil).AnyTimes()
+		mockDisksClient.EXPECT().CreateOrUpdate(gomock.Any(), "", testCloud.ResourceGroup, test.diskName, gomock.Any()).Return(nil).AnyTimes()
 
 		result, err := testCloud.GetLabelsForVolume(context.TODO(), test.pv)
 		assert.Equal(t, test.expected, result, "TestCase[%d]: %s, expected: %v, return: %v", i, test.desc, test.expected, result)
diff --git a/pkg/provider/azure_test.go b/pkg/provider/azure_test.go
index fb2488d11..1936be1eb 100644
--- a/pkg/provider/azure_test.go
+++ b/pkg/provider/azure_test.go
@@ -3161,44 +3161,49 @@ func TestCanCombineSharedAndPrivateRulesInSameGroup(t *testing.T) {
 	}
 }
 
-func TestGetResourceGroupFromDiskURI(t *testing.T) {
+func TestGetInfoFromDiskURI(t *testing.T) {
 	tests := []struct {
 		diskURL        string
-		expectedResult string
+		expectedRG     string
+		expectedSubsID string
 		expectError    bool
 	}{
 		{
 			diskURL:        "/subscriptions/4be8920b-2978-43d7-axyz-04d8549c1d05/resourceGroups/azure-k8s1102/providers/Microsoft.Compute/disks/andy-mghyb1102-dynamic-pvc-f7f014c9-49f4-11e8-ab5c-000d3af7b38e",
-			expectedResult: "azure-k8s1102",
+			expectedRG:     "azure-k8s1102",
+			expectedSubsID: "4be8920b-2978-43d7-axyz-04d8549c1d05",
 			expectError:    false,
 		},
 		{
 			// case insensitive check
 			diskURL:        "/subscriptions/4be8920b-2978-43d7-axyz-04d8549c1d05/resourcegroups/azure-k8s1102/providers/Microsoft.Compute/disks/andy-mghyb1102-dynamic-pvc-f7f014c9-49f4-11e8-ab5c-000d3af7b38e",
-			expectedResult: "azure-k8s1102",
+			expectedRG:     "azure-k8s1102",
+			expectedSubsID: "4be8920b-2978-43d7-axyz-04d8549c1d05",
 			expectError:    false,
 		},
 		{
-			diskURL:        "/4be8920b-2978-43d7-axyz-04d8549c1d05/resourceGroups/azure-k8s1102/providers/Microsoft.Compute/disks/andy-mghyb1102-dynamic-pvc-f7f014c9-49f4-11e8-ab5c-000d3af7b38e",
-			expectedResult: "",
-			expectError:    true,
+			diskURL:     "/4be8920b-2978-43d7-axyz-04d8549c1d05/resourceGroups/azure-k8s1102/providers/Microsoft.Compute/disks/andy-mghyb1102-dynamic-pvc-f7f014c9-49f4-11e8-ab5c-000d3af7b38e",
+			expectedRG:  "",
+			expectError: true,
 		},
 		{
-			diskURL:        "",
-			expectedResult: "",
-			expectError:    true,
+			diskURL:     "",
+			expectedRG:  "",
+			expectError: true,
 		},
 	}
 
 	for _, test := range tests {
-		result, err := getResourceGroupFromDiskURI(test.diskURL)
-		assert.Equal(t, result, test.expectedResult, "Expect result not equal with getResourceGroupFromDiskURI(%s) return: %q, expected: %q",
-			test.diskURL, result, test.expectedResult)
+		rg, subsID, err := getInfoFromDiskURI(test.diskURL)
+		assert.Equal(t, rg, test.expectedRG, "Expect result not equal with getInfoFromDiskURI(%s) return: %q, expected: %q",
+			test.diskURL, rg, test.expectedRG)
+		assert.Equal(t, subsID, test.expectedSubsID, "Expect result not equal with getInfoFromDiskURI(%s) return: %q, expected: %q",
+			test.diskURL, subsID, test.expectedSubsID)
 
 		if test.expectError {
-			assert.NotNil(t, err, "Expect error during getResourceGroupFromDiskURI(%s)", test.diskURL)
+			assert.NotNil(t, err, "Expect error during getInfoFromDiskURI(%s)", test.diskURL)
 		} else {
-			assert.Nil(t, err, "Expect error is nil during getResourceGroupFromDiskURI(%s)", test.diskURL)
+			assert.Nil(t, err, "Expect error is nil during getInfoFromDiskURI(%s)", test.diskURL)
 		}
 	}
 }