Repository: kubernetes-sigs/cloud-provider-azure
Pull request #4595 (2023-09-11 05:58:58)

[CI] Cut cache TTL to half for VM
<!--  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 testing
<!--
Add one of the following kinds:
/kind bug
/kind cleanup
/kind documentation
/kind feature
/kind design

Optionally add one or more of the following kinds if applicable:
/kind api-change
/kind deprecation
/kind failing-test
/kind flake
/kind regression
-->

#### What this PR does / why we need it:
[CI] Cut cache TTL to half for VM
* cloud-config-vmss-default.json
* cloud-config-vmss-multi-slb.json
#### 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 #
Related: https://github.com/kubernetes-sigs/cloud-provider-azure/issues/4594

#### 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
NONE
```

#### 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

```


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/4595#" title="Author self-approved">lzhecheng</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)~~ [lzhecheng]

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":[]} -->
lzhecheng: /hold
k8s-ci-robot: @lzhecheng: 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 | a165b31c6ffef6415ee1b2aea66bd32a6e93f743 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/4595/pull-cloud-provider-azure-unit/1701139307844079616) | 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=4595). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Alzhecheng). 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 -->
lzhecheng: /unhold

Patch:
diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml
index ad6027665..fa7da1756 100644
--- a/.github/workflows/dependency-review.yml
+++ b/.github/workflows/dependency-review.yml
@@ -24,4 +24,4 @@ jobs:
       - name: 'Checkout Repository'
         uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0
       - name: 'Dependency Review'
-        uses: actions/dependency-review-action@6c5ccdad469c9f8a2996bfecaec55a631a347034 # v3.1.0
+        uses: actions/dependency-review-action@f6fff72a3217f580d5afd49a46826795305b63c7 # v3.0.8
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index fc44be437..ab01a6a94 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -38,7 +38,7 @@ jobs:
           rm -rf ./bin
           ARCH=${{ matrix.arch }} make bin/azure-cloud-controller-manager
           mv bin/azure-cloud-controller-manager bin/azure-cloud-controller-manager-${{ matrix.os }}-${{ matrix.arch }}
-      - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
+      - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
         with:
           name: cloud-controller-manager-${{ matrix.os }}-${{ matrix.arch }}
           path: bin/azure-cloud-controller-manager-${{ matrix.os }}-${{ matrix.arch }}
@@ -84,13 +84,13 @@ jobs:
           mv bin/azure-cloud-node-manager-${{ matrix.arch }}.exe bin/azure-cloud-node-manager-${{ matrix.os }}-${{ matrix.arch }}.exe
       - name: Upload artifact for linux
         if: matrix.os == 'linux'
-        uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
+        uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
         with:
           name: cloud-node-manager-${{ matrix.os }}-${{ matrix.arch }}
           path: bin/azure-cloud-node-manager-${{ matrix.os }}-${{ matrix.arch }}
       - name: Upload artifact for windows
         if: matrix.os == 'windows'
-        uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
+        uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
         with:
           name: cloud-node-manager-${{ matrix.os }}-${{ matrix.arch }}
           path: bin/azure-cloud-node-manager-${{ matrix.os }}-${{ matrix.arch }}.exe
@@ -135,13 +135,13 @@ jobs:
           mv bin/azure-acr-credential-provider.exe bin/azure-acr-credential-provider-${{ matrix.os }}-${{ matrix.arch }}.exe
       - name: Upload artifact for linux
         if: matrix.os == 'linux'
-        uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
+        uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
         with:
           name: acr-credential-provider-${{ matrix.os }}-${{ matrix.arch }}
           path: bin/azure-acr-credential-provider-${{ matrix.os }}-${{ matrix.arch }}
       - name: Upload artifact for windows
         if: matrix.os == 'windows'
-        uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
+        uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
         with:
           name: acr-credential-provider-${{ matrix.os }}-${{ matrix.arch }}
           path: bin/azure-acr-credential-provider-${{ matrix.os }}-${{ matrix.arch }}.exe
diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml
index ed11f4253..37f974bf3 100644
--- a/.github/workflows/scorecards.yml
+++ b/.github/workflows/scorecards.yml
@@ -64,7 +64,7 @@ jobs:
       # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
       # format to the repository Actions tab.
       - name: "Upload artifact"
-        uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
+        uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
         with:
           name: SARIF file
           path: results.sarif
diff --git a/Dockerfile b/Dockerfile
index 61ee02567..0b2c578eb 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -14,7 +14,7 @@
 
 # syntax=docker/dockerfile:1
 
-FROM --platform=linux/amd64 golang:1.21-bullseye@sha256:436969571fa091f02d34bf2b9bc8850af7de0527e5bc53c39eeda88bc01c38d3 AS builder
+FROM --platform=linux/amd64 golang:1.21-bullseye@sha256:02f350d8452d3f9693a450586659ecdc6e40e9be8f8dfc6d402300d87223fdfa AS builder
 
 ARG ENABLE_GIT_COMMAND=true
 ARG ARCH=amd64
diff --git a/cloud-node-manager.Dockerfile b/cloud-node-manager.Dockerfile
index be917fd94..055b5003e 100644
--- a/cloud-node-manager.Dockerfile
+++ b/cloud-node-manager.Dockerfile
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-FROM --platform=linux/amd64 golang:1.21-bullseye@sha256:436969571fa091f02d34bf2b9bc8850af7de0527e5bc53c39eeda88bc01c38d3 AS builder
+FROM --platform=linux/amd64 golang:1.21-bullseye@sha256:02f350d8452d3f9693a450586659ecdc6e40e9be8f8dfc6d402300d87223fdfa AS builder
 
 ARG ENABLE_GIT_COMMAND=true
 ARG ARCH=amd64
diff --git a/pkg/azclient/auth.go b/pkg/azclient/auth.go
index 67f12af48..59a7236a6 100644
--- a/pkg/azclient/auth.go
+++ b/pkg/azclient/auth.go
@@ -166,8 +166,7 @@ func NewAuthProvider(config AzureAuthConfig, clientOption *policy.ClientOptions)
 	var clientCertificateCredential azcore.TokenCredential
 	if len(config.AADClientCertPath) > 0 && len(config.AADClientCertPassword) > 0 {
 		credOptions := &azidentity.ClientCertificateCredentialOptions{
-			ClientOptions:        clientOption.ClientOptions,
-			SendCertificateChain: true,
+			ClientOptions: clientOption.ClientOptions,
 		}
 		certData, err := os.ReadFile(config.AADClientCertPath)
 		if err != nil {
diff --git a/pkg/azclient/go.mod b/pkg/azclient/go.mod
index ee16bf48d..048d74c1d 100644
--- a/pkg/azclient/go.mod
+++ b/pkg/azclient/go.mod
@@ -3,7 +3,7 @@ module sigs.k8s.io/cloud-provider-azure/pkg/azclient
 go 1.20
 
 require (
-	github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2
+	github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1
 	github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1
 	github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.1.0
 	github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v4 v4.3.0
diff --git a/pkg/azclient/go.sum b/pkg/azclient/go.sum
index 43bc58211..c532f5ac6 100644
--- a/pkg/azclient/go.sum
+++ b/pkg/azclient/go.sum
@@ -1,5 +1,5 @@
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 h1:t5+QXLCK9SVi0PPdaY0PrFvYUo24KwA0QwxnaHRSVd4=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1 h1:/iHxaJhsFr0+xVFfbMr5vxz848jyiWuIEDhYq3y5odY=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 h1:LNHhpdK7hzUcx/k1LIcuh5k7k1LGIWLQfCjaneSj7Fc=
 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M=
 github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY=
diff --git a/pkg/consts/consts.go b/pkg/consts/consts.go
index d9ddea625..8319c8bdc 100644
--- a/pkg/consts/consts.go
+++ b/pkg/consts/consts.go
@@ -156,8 +156,6 @@ const (
 
 	// NonVmssUniformNodesCacheTTLDefaultInSeconds is the TTL of the non vmss uniform node cache
 	NonVmssUniformNodesCacheTTLDefaultInSeconds = 900
-	// AvailabilitySetNodesCacheTTLDefaultInSeconds is the TTL of the availabilitySet node cache
-	AvailabilitySetNodesCacheTTLDefaultInSeconds = 900
 	// VMSSCacheTTLDefaultInSeconds is the TTL of the vmss cache
 	VMSSCacheTTLDefaultInSeconds = 600
 	// VMSSVirtualMachinesCacheTTLDefaultInSeconds is the TTL of the vmss vm cache
diff --git a/pkg/nodeipam/ipam/range_allocator.go b/pkg/nodeipam/ipam/range_allocator.go
index 4cfa92fc9..009392ad3 100644
--- a/pkg/nodeipam/ipam/range_allocator.go
+++ b/pkg/nodeipam/ipam/range_allocator.go
@@ -191,7 +191,7 @@ func (r *rangeAllocator) worker(stopChan <-chan struct{}) {
 				klog.Warning("Channel nodeCIDRUpdateChannel was unexpectedly closed")
 				return
 			}
-			if workItem, err := r.updateCIDRsAllocation(workItem); err != nil {
+			if err := r.updateCIDRsAllocation(workItem); err != nil {
 				// Requeue the failed node for update again.
 				r.nodeCIDRUpdateChannel <- workItem
 			}
@@ -257,20 +257,23 @@ func (r *rangeAllocator) AllocateOrOccupyCIDR(node *v1.Node) error {
 	if len(node.Spec.PodCIDRs) > 0 {
 		return r.occupyCIDRs(node)
 	}
-
-	// allocate pod cidrs
-	allocatedCIDRs, err := r.allocatePodCIDRs()
-	if err != nil {
-		r.removeNodeFromProcessing(node.Name)
-		nodeutil.RecordNodeStatusChange(r.recorder, node, "CIDRNotAvailable")
-		return fmt.Errorf("failed to allocate cidr for node %s: %w", node.Name, err)
-	}
+	// allocate and queue the assignment
 	allocated := nodeReservedCIDRs{
 		nodeName:       node.Name,
-		allocatedCIDRs: allocatedCIDRs,
+		allocatedCIDRs: make([]*net.IPNet, len(r.cidrSets)),
+	}
+
+	for idx := range r.cidrSets {
+		podCIDR, err := r.cidrSets[idx].AllocateNext()
+		if err != nil {
+			r.removeNodeFromProcessing(node.Name)
+			nodeutil.RecordNodeStatusChange(r.recorder, node, "CIDRNotAvailable")
+			return fmt.Errorf("failed to allocate cidr from cluster cidr at idx:%v: %w", idx, err)
+		}
+		allocated.allocatedCIDRs[idx] = podCIDR
 	}
 
-	// queue the assignment
+	//queue the assignment
 	klog.V(4).Infof("Putting node %s with CIDR %v into the work queue", node.Name, allocated.allocatedCIDRs)
 	r.nodeCIDRUpdateChannel <- allocated
 	return nil
@@ -324,55 +327,21 @@ func filterOutServiceRange(clusterCIDRs []*net.IPNet, cidrSets []*cidrset.CidrSe
 	}
 }
 
-func (r *rangeAllocator) allocatePodCIDRs() ([]*net.IPNet, error) {
-	allocatedCIDRs := make([]*net.IPNet, len(r.cidrSets))
-	for idx := range r.cidrSets {
-		podCIDR, err := r.cidrSets[idx].AllocateNext()
-		if err != nil {
-			for i := 0; i < idx; i++ {
-				if releaseErr := r.cidrSets[idx].Release(allocatedCIDRs[i]); releaseErr != nil {
-					// continue releasing the rest
-					klog.Errorf("Error releasing allocated CIDR at index %d for node: %v", i, releaseErr)
-				}
-			}
-			return nil, fmt.Errorf("failed to allocate cidr from cluster cidr at idx:%v: %w", idx, err)
-		}
-		allocatedCIDRs[idx] = podCIDR
-	}
-	return allocatedCIDRs, nil
-}
-
 // updateCIDRsAllocation assigns CIDR to Node and sends an update to the API server.
-func (r *rangeAllocator) updateCIDRsAllocation(data nodeReservedCIDRs) (dataToRetry nodeReservedCIDRs, err error) {
+func (r *rangeAllocator) updateCIDRsAllocation(data nodeReservedCIDRs) error {
+	var err error
 	var node *v1.Node
-
-	defer func() {
-		if err == nil {
-			// only remove node when node patch succeeds
-			r.removeNodeFromProcessing(data.nodeName)
-		}
-	}()
-
+	defer r.removeNodeFromProcessing(data.nodeName)
+	cidrsString := cidrsAsString(data.allocatedCIDRs)
 	node, err = r.nodeLister.Get(data.nodeName)
 	if err != nil {
 		if apierrors.IsNotFound(err) {
 			klog.Warningf("Failed to get node %s: not found", data.nodeName)
-			return data, nil
+			return nil
 		}
 		klog.Errorf("Failed while getting node %v for updating Node.Spec.PodCIDRs: %v", data.nodeName, err)
-		return data, err
-	}
-
-	// this happens when node patch fails, we release the CIDRs allocated and retry
-	if data.allocatedCIDRs == nil {
-		allocatedCIDRs, err := r.allocatePodCIDRs()
-		if err != nil {
-			nodeutil.RecordNodeStatusChange(r.recorder, node, "CIDRNotAvailable")
-			return data, fmt.Errorf("failed to allocate cidr for node %s: %w", data.nodeName, err)
-		}
-		data.allocatedCIDRs = allocatedCIDRs
+		return err
 	}
-	cidrsString := cidrsAsString(data.allocatedCIDRs)
 
 	// if cidr list matches the proposed.
 	// then we possibly updated this node
@@ -387,7 +356,7 @@ func (r *rangeAllocator) updateCIDRsAllocation(data nodeReservedCIDRs) (dataToRe
 		}
 		if match {
 			klog.V(4).Infof("Node %v already has allocated CIDR %v. It matches the proposed one.", node.Name, data.allocatedCIDRs)
-			return data, nil
+			return nil
 		}
 	}
 
@@ -399,13 +368,13 @@ func (r *rangeAllocator) updateCIDRsAllocation(data nodeReservedCIDRs) (dataToRe
 				klog.Errorf("Error when releasing CIDR idx:%v value: %v err:%v", idx, cidr, releaseErr)
 			}
 		}
-		return data, nil
+		return nil
 	}
 
 	// If we reached here, it means that the node has no CIDR currently assigned. So we set it.
 	for i := 0; i < cidrUpdateRetries; i++ {
 		if err = utilnode.PatchNodeCIDRs(r.client, types.NodeName(node.Name), cidrsString); err == nil {
-			return data, nil
+			return nil
 		}
 	}
 	// failed release back to the pool
@@ -421,9 +390,8 @@ func (r *rangeAllocator) updateCIDRsAllocation(data nodeReservedCIDRs) (dataToRe
 				klog.Errorf("Error releasing allocated CIDR for node %v: %v", node.Name, releaseErr)
 			}
 		}
-		data.allocatedCIDRs = nil
 	}
-	return data, err
+	return err
 }
 
 // converts a slice of cidrs into <c-1>,<c-2>,<c-n>
diff --git a/pkg/provider/azure.go b/pkg/provider/azure.go
index dec5be640..ee3882643 100644
--- a/pkg/provider/azure.go
+++ b/pkg/provider/azure.go
@@ -218,9 +218,6 @@ type Config struct {
 	// NonVmssUniformNodesCacheTTLInSeconds sets the Cache TTL for NonVmssUniformNodesCacheTTLInSeconds
 	// if not set, will use default value
 	NonVmssUniformNodesCacheTTLInSeconds int `json:"nonVmssUniformNodesCacheTTLInSeconds,omitempty" yaml:"nonVmssUniformNodesCacheTTLInSeconds,omitempty"`
-	// AvailabilitySetNodesCacheTTLInSeconds sets the Cache TTL for availabilitySetNodesCache
-	// if not set, will use default value
-	AvailabilitySetNodesCacheTTLInSeconds int `json:"availabilitySetNodesCacheTTLInSeconds,omitempty" yaml:"availabilitySetNodesCacheTTLInSeconds,omitempty"`
 	// VmssCacheTTLInSeconds sets the cache TTL for VMSS
 	VmssCacheTTLInSeconds int `json:"vmssCacheTTLInSeconds,omitempty" yaml:"vmssCacheTTLInSeconds,omitempty"`
 	// VmssVirtualMachinesCacheTTLInSeconds sets the cache TTL for vmssVirtualMachines
diff --git a/pkg/provider/azure_storageaccount.go b/pkg/provider/azure_storageaccount.go
index 7e50bb2dd..ee0fe7db9 100644
--- a/pkg/provider/azure_storageaccount.go
+++ b/pkg/provider/azure_storageaccount.go
@@ -56,7 +56,7 @@ type AccountOptions struct {
 	EnableHTTPSTrafficOnly                    bool
 	// indicate whether create new account when Name is empty or when account does not exists
 	CreateAccount                           bool
-	CreatePrivateEndpoint                   *bool
+	CreatePrivateEndpoint                   bool
 	StorageType                             StorageType
 	StorageEndpointSuffix                   string
 	DisableFileServiceDeleteRetentionPolicy *bool
@@ -216,7 +216,7 @@ func (az *Cloud) EnsureStorageAccount(ctx context.Context, accountOptions *Accou
 	}
 
 	var privateDNSZoneName string
-	if pointer.BoolDeref(accountOptions.CreatePrivateEndpoint, false) {
+	if accountOptions.CreatePrivateEndpoint {
 		if accountOptions.StorageType == "" {
 			klog.V(2).Info("set StorageType as file when not specified")
 			accountOptions.StorageType = StorageTypeFile
@@ -282,7 +282,7 @@ func (az *Cloud) EnsureStorageAccount(ctx context.Context, accountOptions *Accou
 		}
 	}
 
-	if pointer.BoolDeref(accountOptions.CreatePrivateEndpoint, false) {
+	if accountOptions.CreatePrivateEndpoint {
 		if _, err := az.privatednsclient.Get(ctx, vnetResourceGroup, privateDNSZoneName); err != nil {
 			klog.V(2).Infof("get private dns zone %s returned with %v", privateDNSZoneName, err.Error())
 			// Create DNS zone first, this could make sure driver has write permission on vnetResourceGroup
@@ -320,7 +320,7 @@ func (az *Cloud) EnsureStorageAccount(ctx context.Context, accountOptions *Accou
 			}
 		}
 
-		if pointer.BoolDeref(accountOptions.CreatePrivateEndpoint, false) {
+		if accountOptions.CreatePrivateEndpoint {
 			networkRuleSet = &storage.NetworkRuleSet{
 				DefaultAction: storage.DefaultActionDeny,
 			}
@@ -471,7 +471,7 @@ func (az *Cloud) EnsureStorageAccount(ctx context.Context, accountOptions *Accou
 		}
 	}
 
-	if pointer.BoolDeref(accountOptions.CreatePrivateEndpoint, false) {
+	if accountOptions.CreatePrivateEndpoint {
 		// Get properties of the storageAccount
 		storageAccount, err := az.StorageAccountClient.GetProperties(ctx, subsID, resourceGroup, accountName)
 		if err != nil {
@@ -770,15 +770,10 @@ func isEnableNfsV3PropertyEqual(account storage.Account, accountOptions *Account
 }
 
 func isPrivateEndpointAsExpected(account storage.Account, accountOptions *AccountOptions) bool {
-	if accountOptions.CreatePrivateEndpoint == nil {
-		// CreatePrivateEndpoint is not set, match current account
+	if accountOptions.CreatePrivateEndpoint && account.PrivateEndpointConnections != nil && len(*account.PrivateEndpointConnections) > 0 {
 		return true
 	}
-
-	if pointer.BoolDeref(accountOptions.CreatePrivateEndpoint, false) && account.PrivateEndpointConnections != nil && len(*account.PrivateEndpointConnections) > 0 {
-		return true
-	}
-	if !pointer.BoolDeref(accountOptions.CreatePrivateEndpoint, false) && (account.PrivateEndpointConnections == nil || len(*account.PrivateEndpointConnections) == 0) {
+	if !accountOptions.CreatePrivateEndpoint && (account.PrivateEndpointConnections == nil || len(*account.PrivateEndpointConnections) == 0) {
 		return true
 	}
 	return false
diff --git a/pkg/provider/azure_utils.go b/pkg/provider/azure_utils.go
index e8724ef6a..87fa76d5c 100644
--- a/pkg/provider/azure_utils.go
+++ b/pkg/provider/azure_utils.go
@@ -404,7 +404,7 @@ func setServiceLoadBalancerIP(service *v1.Service, ip string) {
 	}
 	parsedIP := net.ParseIP(ip)
 	if parsedIP == nil {
-		klog.Warning("setServiceLoadBalancerIP: IP %q is not valid for Service", ip, service.Name)
+		klog.Warningf("setServiceLoadBalancerIP: IP %q is not valid for Service %q", ip, service.Name)
 		return
 	}
 
diff --git a/pkg/util/node/node.go b/pkg/util/node/node.go
index 714f1eb12..9e82db100 100644
--- a/pkg/util/node/node.go
+++ b/pkg/util/node/node.go
@@ -78,7 +78,7 @@ func PatchNodeCIDRs(c clientset.Interface, node types.NodeName, cidrs []string)
 	if err != nil {
 		return fmt.Errorf("failed to json.Marshal CIDR: %w", err)
 	}
-	klog.V(4).Infof("cidrs patch bytes for node %s are:%s", string(node), string(patchBytes))
+	klog.V(4).Infof("cidrs patch bytes are:%s", string(patchBytes))
 	if _, err := c.CoreV1().Nodes().Patch(context.TODO(), string(node), types.StrategicMergePatchType, patchBytes, metav1.PatchOptions{}); err != nil {
 		return fmt.Errorf("failed to patch node CIDR: %w", err)
 	}


Test patch:
diff --git a/e2e.Dockerfile b/e2e.Dockerfile
index 0d728b542..958190c2e 100644
--- a/e2e.Dockerfile
+++ b/e2e.Dockerfile
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-FROM golang:1.21-bullseye@sha256:436969571fa091f02d34bf2b9bc8850af7de0527e5bc53c39eeda88bc01c38d3
+FROM golang:1.21-bullseye@sha256:02f350d8452d3f9693a450586659ecdc6e40e9be8f8dfc6d402300d87223fdfa
 
 WORKDIR /go/src/sigs.k8s.io/cloud-provider-azure
 
diff --git a/kubetest2-aks/go.mod b/kubetest2-aks/go.mod
index 7be11ee38..20640fe85 100644
--- a/kubetest2-aks/go.mod
+++ b/kubetest2-aks/go.mod
@@ -3,7 +3,7 @@ module sigs.k8s.io/cloud-provider-azure/kubetest2-aks
 go 1.18
 
 require (
-	github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2
+	github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1
 	github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1
 	github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v2 v2.4.0
 	github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1
diff --git a/kubetest2-aks/go.sum b/kubetest2-aks/go.sum
index 5dfa9cf7c..9df4aab08 100644
--- a/kubetest2-aks/go.sum
+++ b/kubetest2-aks/go.sum
@@ -1,7 +1,7 @@
 dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
 dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 h1:t5+QXLCK9SVi0PPdaY0PrFvYUo24KwA0QwxnaHRSVd4=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1 h1:/iHxaJhsFr0+xVFfbMr5vxz848jyiWuIEDhYq3y5odY=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 h1:LNHhpdK7hzUcx/k1LIcuh5k7k1LGIWLQfCjaneSj7Fc=
 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M=
 github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY=
diff --git a/pkg/nodeipam/ipam/range_allocator_test.go b/pkg/nodeipam/ipam/range_allocator_test.go
index c08d334bd..69371fd6f 100644
--- a/pkg/nodeipam/ipam/range_allocator_test.go
+++ b/pkg/nodeipam/ipam/range_allocator_test.go
@@ -854,91 +854,3 @@ func TestReleaseCIDRSuccess(t *testing.T) {
 		testFunc(tc)
 	}
 }
-
-func TestRetryAllocatingPodCidr(t *testing.T) {
-	testCases := []testCase{
-		{
-			description: "It should release allocated CIDR and retry with new CIDR when node patch fails",
-			fakeNodeHandler: &testutil.FakeNodeHandler{
-				Existing: []*v1.Node{
-					{
-						ObjectMeta: metav1.ObjectMeta{
-							Name: "node0",
-						},
-					},
-				},
-				Clientset:       fake.NewSimpleClientset(),
-				PatchErrorCount: 9, // need 9 because we want first 3 ranges to fail, and each range is retried for 3 times
-			},
-			allocatorParams: CIDRAllocatorParams{
-				ClusterCIDRs: func() []*net.IPNet {
-					_, clusterCIDR, _ := net.ParseCIDR("127.123.234.0/28")
-					return []*net.IPNet{clusterCIDR}
-				}(),
-				ServiceCIDR:          nil,
-				SecondaryServiceCIDR: nil,
-				NodeCIDRMaskSizes:    []int{30},
-			},
-			allocatedCIDRs: map[int][]string{
-				0: {"127.123.234.0/30", "127.123.234.4/30", "127.123.234.8/30"},
-			},
-			expectedAllocatedCIDR: map[int]string{
-				0: "127.123.234.12/30",
-			},
-		},
-	}
-
-	testFunc := func(tc testCase) {
-		// Initialize the range allocator.
-		allocator, err := NewCIDRRangeAllocator(tc.fakeNodeHandler, getFakeNodeInformer(tc.fakeNodeHandler), tc.allocatorParams, nil)
-		if err != nil {
-			t.Logf("%v: failed to create CIDRRangeAllocator with error %v", tc.description, err)
-		}
-		rangeAllocator, ok := allocator.(*rangeAllocator)
-		if !ok {
-			t.Logf("%v: found non-default implementation of CIDRAllocator, skipping white-box test...", tc.description)
-			return
-		}
-		rangeAllocator.nodesSynced = alwaysReady
-		rangeAllocator.recorder = testutil.NewFakeRecorder()
-		go allocator.Run(wait.NeverStop)
-
-		if err := allocator.AllocateOrOccupyCIDR(tc.fakeNodeHandler.Existing[0]); err != nil {
-			t.Errorf("%v: unexpected error in AllocateOrOccupyCIDR: %v", tc.description, err)
-		}
-
-		if err := waitForUpdatedNodeWithTimeout(tc.fakeNodeHandler, 1, wait.ForeverTestTimeout); err != nil {
-			t.Fatalf("%v: timeout while waiting for Node update: %v", tc.description, err)
-		}
-
-		for _, updatedNode := range tc.fakeNodeHandler.GetUpdatedNodesCopy() {
-			if len(updatedNode.Spec.PodCIDRs) == 0 {
-				continue // not assigned yet
-			}
-			//match
-			for podCIDRIdx, expectedPodCIDR := range tc.expectedAllocatedCIDR {
-				if updatedNode.Spec.PodCIDRs[podCIDRIdx] != expectedPodCIDR {
-					t.Errorf("%v: Unable to find allocated CIDR %v, found updated Nodes with CIDRs: %v", tc.description, expectedPodCIDR, updatedNode.Spec.PodCIDRs)
-					break
-				}
-			}
-		}
-
-		// Make sure previously tried CIDRs are all released
-		for idx, allocatedList := range tc.allocatedCIDRs {
-			for _, allocated := range allocatedList {
-				_, cidr, err := net.ParseCIDR(allocated)
-				if err != nil {
-					t.Fatalf("%v: unexpected error when parsing CIDR %v: %v", tc.description, allocated, err)
-				}
-				if err = rangeAllocator.cidrSets[idx].Occupy(cidr); err != nil {
-					t.Fatalf("%v: unexpected error when occupying CIDR %v: %v", tc.description, allocated, err)
-				}
-			}
-		}
-	}
-
-	for _, tc := range testCases {
-		testFunc(tc)
-	}
-}
diff --git a/pkg/provider/azure_storageaccount_test.go b/pkg/provider/azure_storageaccount_test.go
index 9ad2cd007..0c7a3adb2 100644
--- a/pkg/provider/azure_storageaccount_test.go
+++ b/pkg/provider/azure_storageaccount_test.go
@@ -343,7 +343,7 @@ func TestGetStorageAccountEdgeCases(t *testing.T) {
 			testCase: "account options CreatePrivateEndpoint is true and no private endpoint exists",
 			testAccountOptions: &AccountOptions{
 				ResourceGroup:         "rg",
-				CreatePrivateEndpoint: pointer.BoolPtr(true),
+				CreatePrivateEndpoint: true,
 			},
 			testResourceGroups: []storage.Account{{Name: &name, Kind: "kind", Location: &location, Sku: sku, AccountProperties: &storage.AccountProperties{}}},
 			expectedResult:     []accountWithLocation{},
@@ -409,7 +409,7 @@ func TestEnsureStorageAccount(t *testing.T) {
 	tests := []struct {
 		name                            string
 		createAccount                   bool
-		createPrivateEndpoint           *bool
+		createPrivateEndpoint           bool
 		SubnetPropertiesFormatNil       bool
 		mockStorageAccountsClient       bool
 		setAccountOptions               bool
@@ -426,7 +426,7 @@ func TestEnsureStorageAccount(t *testing.T) {
 		{
 			name:                            "[Success] EnsureStorageAccount with createPrivateEndpoint and storagetype blob",
 			createAccount:                   true,
-			createPrivateEndpoint:           pointer.BoolPtr(true),
+			createPrivateEndpoint:           true,
 			mockStorageAccountsClient:       true,
 			setAccountOptions:               true,
 			pickRandomMatchingAccount:       true,
@@ -441,7 +441,7 @@ func TestEnsureStorageAccount(t *testing.T) {
 		{
 			name:                            "[Success] EnsureStorageAccount with createPrivateEndpoint",
 			createAccount:                   true,
-			createPrivateEndpoint:           pointer.BoolPtr(true),
+			createPrivateEndpoint:           true,
 			mockStorageAccountsClient:       true,
 			setAccountOptions:               true,
 			requireInfrastructureEncryption: pointer.Bool(true),
@@ -454,7 +454,7 @@ func TestEnsureStorageAccount(t *testing.T) {
 		{
 			name:                      "[Failed] EnsureStorageAccount with createPrivateEndpoint: get storage key failed",
 			createAccount:             true,
-			createPrivateEndpoint:     pointer.BoolPtr(true),
+			createPrivateEndpoint:     true,
 			SubnetPropertiesFormatNil: true,
 			mockStorageAccountsClient: true,
 			setAccountOptions:         true,
@@ -496,7 +496,7 @@ func TestEnsureStorageAccount(t *testing.T) {
 			cloud.StorageAccountClient = mockStorageAccountsClient
 		}
 
-		if pointer.BoolDeref(test.createPrivateEndpoint, false) {
+		if test.createPrivateEndpoint {
 			mockStorageAccountsClient.EXPECT().ListByResourceGroup(gomock.Any(), gomock.Any(), gomock.Any()).Return(testStorageAccounts, nil).AnyTimes()
 			mockStorageAccountsClient.EXPECT().Create(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
 			mockStorageAccountsClient.EXPECT().GetProperties(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(testStorageAccounts[0], nil).AnyTimes()
@@ -629,7 +629,7 @@ func TestIsPrivateEndpointAsExpected(t *testing.T) {
 				},
 			},
 			accountOptions: &AccountOptions{
-				CreatePrivateEndpoint: pointer.BoolPtr(true),
+				CreatePrivateEndpoint: true,
 			},
 			expectedResult: true,
 		},
@@ -640,7 +640,7 @@ func TestIsPrivateEndpointAsExpected(t *testing.T) {
 				},
 			},
 			accountOptions: &AccountOptions{
-				CreatePrivateEndpoint: pointer.BoolPtr(false),
+				CreatePrivateEndpoint: false,
 			},
 			expectedResult: true,
 		},
@@ -651,21 +651,10 @@ func TestIsPrivateEndpointAsExpected(t *testing.T) {
 				},
 			},
 			accountOptions: &AccountOptions{
-				CreatePrivateEndpoint: pointer.BoolPtr(false),
+				CreatePrivateEndpoint: false,
 			},
 			expectedResult: false,
 		},
-		{
-			account: storage.Account{
-				AccountProperties: &storage.AccountProperties{
-					PrivateEndpointConnections: &[]storage.PrivateEndpointConnection{{}},
-				},
-			},
-			accountOptions: &AccountOptions{
-				CreatePrivateEndpoint: nil,
-			},
-			expectedResult: true,
-		},
 		{
 			account: storage.Account{
 				AccountProperties: &storage.AccountProperties{
@@ -673,7 +662,7 @@ func TestIsPrivateEndpointAsExpected(t *testing.T) {
 				},
 			},
 			accountOptions: &AccountOptions{
-				CreatePrivateEndpoint: pointer.BoolPtr(true),
+				CreatePrivateEndpoint: true,
 			},
 			expectedResult: false,
 		},
diff --git a/pkg/provider/azure_test.go b/pkg/provider/azure_test.go
index ed6eff762..fdd8b8a35 100644
--- a/pkg/provider/azure_test.go
+++ b/pkg/provider/azure_test.go
@@ -2382,7 +2382,7 @@ func TestNewCloudFromJSON(t *testing.T) {
 		"cloudProviderRatelimit": true,
 		"cloudProviderRateLimitQPS": 0.5,
 		"cloudProviderRateLimitBucket": 5,
-		"availabilitySetNodesCacheTTLInSeconds": 100,
+		"availabilitySetsCacheTTLInSeconds": 100,
 		"nonVmssUniformNodesCacheTTLInSeconds": 100,
 		"vmssCacheTTLInSeconds": 100,
 		"vmssVirtualMachinesCacheTTLInSeconds": 100,
@@ -2449,7 +2449,7 @@ cloudProviderBackoffJitter: 1.0
 cloudProviderRatelimit: true
 cloudProviderRateLimitQPS: 0.5
 cloudProviderRateLimitBucket: 5
-availabilitySetNodesCacheTTLInSeconds: 100
+availabilitySetsCacheTTLInSeconds: 100
 nonVmssUniformNodesCacheTTLInSeconds: 100
 vmssCacheTTLInSeconds: 100
 vmssVirtualMachinesCacheTTLInSeconds: 100
@@ -2544,8 +2544,8 @@ func validateConfig(t *testing.T, config string) { //nolint
 	if azureCloud.CloudProviderRateLimitBucket != 5 {
 		t.Errorf("got incorrect value for CloudProviderRateLimitBucket")
 	}
-	if azureCloud.AvailabilitySetNodesCacheTTLInSeconds != 100 {
-		t.Errorf("got incorrect value for availabilitySetNodesCacheTTLInSeconds")
+	if azureCloud.AvailabilitySetsCacheTTLInSeconds != 100 {
+		t.Errorf("got incorrect value for AvailabilitySetsCacheTTLInSeconds")
 	}
 	if azureCloud.NonVmssUniformNodesCacheTTLInSeconds != 100 {
 		t.Errorf("got incorrect value for nonVmssUniformNodesCacheTTLInSeconds")
diff --git a/pkg/util/controller/testutil/test_utils.go b/pkg/util/controller/testutil/test_utils.go
index 11acd15ee..e7234db74 100644
--- a/pkg/util/controller/testutil/test_utils.go
+++ b/pkg/util/controller/testutil/test_utils.go
@@ -53,9 +53,8 @@ type FakeNodeHandler struct {
 	*fake.Clientset
 
 	// Input: Hooks determine if request is valid or not
-	CreateHook      func(*FakeNodeHandler, *v1.Node) bool
-	Existing        []*v1.Node
-	PatchErrorCount int
+	CreateHook func(*FakeNodeHandler, *v1.Node) bool
+	Existing   []*v1.Node
 
 	// Output
 	CreatedNodes        []*v1.Node
@@ -275,11 +274,6 @@ func (m *FakeNodeHandler) Patch(_ context.Context, name string, pt types.PatchTy
 		}
 		m.lock.Unlock()
 	}()
-
-	if m.RequestCount < m.PatchErrorCount {
-		return nil, fmt.Errorf("patch failed count is %d, which is smaller than %d", m.RequestCount, m.PatchErrorCount)
-	}
-
 	var nodeCopy v1.Node
 	for i := range m.Existing {
 		if m.Existing[i].Name == name {
diff --git a/tests/k8s-azure/manifest/cluster-api/cloud-config-vmss-default.json b/tests/k8s-azure/manifest/cluster-api/cloud-config-vmss-default.json
index d92278783..333c7b729 100644
--- a/tests/k8s-azure/manifest/cluster-api/cloud-config-vmss-default.json
+++ b/tests/k8s-azure/manifest/cluster-api/cloud-config-vmss-default.json
@@ -19,6 +19,12 @@
   "useInstanceMetadata": true,
   "primaryScaleSetName": "${CLUSTER_NAME}-vmss-0",
   "loadBalancerBackendPoolConfigurationType": "${LB_BACKEND_POOL_CONFIG_TYPE}",
+  "nonVmssUniformNodesCacheTTLInSeconds": 450,
+  "vmssCacheTTLInSeconds": 300,
+  "vmssVirtualMachinesCacheTTLInSeconds": 300,
+  "availabilitySetsCacheTTLInSeconds": 300,
+  "vmssFlexCacheTTLInSeconds": 300,
+  "vmssFlexVMCacheTTLInSeconds": 300,
   "putVMSSVMBatchSize": ${PUT_VMSS_VM_BATCH_SIZE},
   "enableVmssFlexNodes": ${ENABLE_VMSS_FLEX}
 }
diff --git a/tests/k8s-azure/manifest/cluster-api/cloud-config-vmss-multi-slb.json b/tests/k8s-azure/manifest/cluster-api/cloud-config-vmss-multi-slb.json
index 5f9dbcdea..189d0f30c 100644
--- a/tests/k8s-azure/manifest/cluster-api/cloud-config-vmss-multi-slb.json
+++ b/tests/k8s-azure/manifest/cluster-api/cloud-config-vmss-multi-slb.json
@@ -37,5 +37,11 @@
         }
       }
     }
-  ]
+  ],
+  "nonVmssUniformNodesCacheTTLInSeconds": 450,
+  "vmssCacheTTLInSeconds": 300,
+  "vmssVirtualMachinesCacheTTLInSeconds": 300,
+  "availabilitySetsCacheTTLInSeconds": 300,
+  "vmssFlexCacheTTLInSeconds": 300,
+  "vmssFlexVMCacheTTLInSeconds": 300
 }
diff --git a/tests/k8s-azure/manifest/cluster-api/cloud-config-vmss-short-cache-ttl.json b/tests/k8s-azure/manifest/cluster-api/cloud-config-vmss-short-cache-ttl.json
new file mode 100644
index 000000000..fbf5019e9
--- /dev/null
+++ b/tests/k8s-azure/manifest/cluster-api/cloud-config-vmss-short-cache-ttl.json
@@ -0,0 +1,27 @@
+{
+  "cloud": "AzurePublicCloud",
+  "tenantId": "${AZURE_TENANT_ID}",
+  "subscriptionId": "${AZURE_SUBSCRIPTION_ID}",
+  "aadClientId": "${AZURE_CLIENT_ID}",
+  "aadClientSecret": "${AZURE_CLIENT_SECRET}",
+  "resourceGroup": "${AZURE_RESOURCE_GROUP}",
+  "securityGroupName": "${CLUSTER_NAME}-node-nsg",
+  "securityGroupResourceGroup": "${AZURE_RESOURCE_GROUP}",
+  "location": "${AZURE_LOCATION}",
+  "vmType": "vmss",
+  "vnetName": "${CLUSTER_NAME}-vnet",
+  "vnetResourceGroup": "${AZURE_RESOURCE_GROUP}",
+  "subnetName": "node-subnet",
+  "routeTableName": "${CLUSTER_NAME}-node-routetable",
+  "loadBalancerSku": "${AZURE_LOADBALANCER_SKU}",
+  "maximumLoadBalancerRuleCount": 250,
+  "useManagedIdentityExtension": false,
+  "useInstanceMetadata": true,
+  "enableVmssFlexNodes": true,
+  "nonVmssUniformNodesCacheTTLInSeconds": 450,
+  "vmssCacheTTLInSeconds": 300,
+  "vmssVirtualMachinesCacheTTLInSeconds": 300,
+  "availabilitySetsCacheTTLInSeconds": 300,
+  "vmssFlexCacheTTLInSeconds": 300,
+  "vmssFlexVMCacheTTLInSeconds": 300
+}