mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 12:18:16 +00:00 
			
		
		
		
	Add snapshot clients based on armclient
This commit is contained in:
		@@ -0,0 +1,57 @@
 | 
				
			|||||||
 | 
					load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go_library(
 | 
				
			||||||
 | 
					    name = "go_default_library",
 | 
				
			||||||
 | 
					    srcs = [
 | 
				
			||||||
 | 
					        "azure_snapshotclient.go",
 | 
				
			||||||
 | 
					        "doc.go",
 | 
				
			||||||
 | 
					        "interface.go",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/snapshotclient",
 | 
				
			||||||
 | 
					    importpath = "k8s.io/legacy-cloud-providers/azure/clients/snapshotclient",
 | 
				
			||||||
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
 | 
					    deps = [
 | 
				
			||||||
 | 
					        "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library",
 | 
				
			||||||
 | 
					        "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library",
 | 
				
			||||||
 | 
					        "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library",
 | 
				
			||||||
 | 
					        "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library",
 | 
				
			||||||
 | 
					        "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-06-01/storage:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/Azure/go-autorest/autorest:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go_test(
 | 
				
			||||||
 | 
					    name = "go_default_test",
 | 
				
			||||||
 | 
					    srcs = ["azure_snapshotclient_test.go"],
 | 
				
			||||||
 | 
					    embed = [":go_default_library"],
 | 
				
			||||||
 | 
					    deps = [
 | 
				
			||||||
 | 
					        "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library",
 | 
				
			||||||
 | 
					        "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library",
 | 
				
			||||||
 | 
					        "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-06-01/storage:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/Azure/go-autorest/autorest:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/golang/mock/gomock:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/stretchr/testify/assert:go_default_library",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					filegroup(
 | 
				
			||||||
 | 
					    name = "package-srcs",
 | 
				
			||||||
 | 
					    srcs = glob(["**"]),
 | 
				
			||||||
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
 | 
					    visibility = ["//visibility:private"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					filegroup(
 | 
				
			||||||
 | 
					    name = "all-srcs",
 | 
				
			||||||
 | 
					    srcs = [
 | 
				
			||||||
 | 
					        ":package-srcs",
 | 
				
			||||||
 | 
					        "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/snapshotclient/mocksnapshotclient:all-srcs",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
@@ -0,0 +1,405 @@
 | 
				
			|||||||
 | 
					// +build !providerless
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2020 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package snapshotclient
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
 | 
				
			||||||
 | 
						"github.com/Azure/go-autorest/autorest"
 | 
				
			||||||
 | 
						"github.com/Azure/go-autorest/autorest/azure"
 | 
				
			||||||
 | 
						"github.com/Azure/go-autorest/autorest/to"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"k8s.io/client-go/util/flowcontrol"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
 | 
						azclients "k8s.io/legacy-cloud-providers/azure/clients"
 | 
				
			||||||
 | 
						"k8s.io/legacy-cloud-providers/azure/clients/armclient"
 | 
				
			||||||
 | 
						"k8s.io/legacy-cloud-providers/azure/metrics"
 | 
				
			||||||
 | 
						"k8s.io/legacy-cloud-providers/azure/retry"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ Interface = &Client{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Client implements Snapshot client Interface.
 | 
				
			||||||
 | 
					type Client struct {
 | 
				
			||||||
 | 
						armClient      armclient.Interface
 | 
				
			||||||
 | 
						subscriptionID string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Rate limiting configures.
 | 
				
			||||||
 | 
						rateLimiterReader flowcontrol.RateLimiter
 | 
				
			||||||
 | 
						rateLimiterWriter flowcontrol.RateLimiter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// ARM throttling configures.
 | 
				
			||||||
 | 
						RetryAfterReader time.Time
 | 
				
			||||||
 | 
						RetryAfterWriter time.Time
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// New creates a new Snapshot client with ratelimiting.
 | 
				
			||||||
 | 
					func New(config *azclients.ClientConfig) *Client {
 | 
				
			||||||
 | 
						baseURI := config.ResourceManagerEndpoint
 | 
				
			||||||
 | 
						authorizer := autorest.NewBearerAuthorizer(config.ServicePrincipalToken)
 | 
				
			||||||
 | 
						armClient := armclient.New(authorizer, baseURI, "", APIVersion, config.Location, config.Backoff)
 | 
				
			||||||
 | 
						rateLimiterReader, rateLimiterWriter := azclients.NewRateLimiter(config.RateLimitConfig)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						klog.V(2).Infof("Azure SnapshotClient (read ops) using rate limit config: QPS=%g, bucket=%d",
 | 
				
			||||||
 | 
							config.RateLimitConfig.CloudProviderRateLimitQPS,
 | 
				
			||||||
 | 
							config.RateLimitConfig.CloudProviderRateLimitBucket)
 | 
				
			||||||
 | 
						klog.V(2).Infof("Azure SnapshotClient (write ops) using rate limit config: QPS=%g, bucket=%d",
 | 
				
			||||||
 | 
							config.RateLimitConfig.CloudProviderRateLimitQPSWrite,
 | 
				
			||||||
 | 
							config.RateLimitConfig.CloudProviderRateLimitBucketWrite)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						client := &Client{
 | 
				
			||||||
 | 
							armClient:         armClient,
 | 
				
			||||||
 | 
							rateLimiterReader: rateLimiterReader,
 | 
				
			||||||
 | 
							rateLimiterWriter: rateLimiterWriter,
 | 
				
			||||||
 | 
							subscriptionID:    config.SubscriptionID,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 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, "")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Report errors if the client is rate limited.
 | 
				
			||||||
 | 
						if !c.rateLimiterReader.TryAccept() {
 | 
				
			||||||
 | 
							mc.RateLimitedCount()
 | 
				
			||||||
 | 
							return compute.Snapshot{}, retry.GetRateLimitError(false, "SnapshotGet")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Report errors if the client is throttled.
 | 
				
			||||||
 | 
						if c.RetryAfterReader.After(time.Now()) {
 | 
				
			||||||
 | 
							mc.ThrottledCount()
 | 
				
			||||||
 | 
							rerr := retry.GetThrottlingError("SnapshotGet", "client throttled", c.RetryAfterReader)
 | 
				
			||||||
 | 
							return compute.Snapshot{}, rerr
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result, rerr := c.getSnapshot(ctx, resourceGroupName, snapshotName)
 | 
				
			||||||
 | 
						mc.Observe(rerr.Error())
 | 
				
			||||||
 | 
						if rerr != nil {
 | 
				
			||||||
 | 
							if rerr.IsThrottled() {
 | 
				
			||||||
 | 
								// Update RetryAfterReader so that no more requests would be sent until RetryAfter expires.
 | 
				
			||||||
 | 
								c.RetryAfterReader = rerr.RetryAfter
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return result, rerr
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return result, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// getSnapshot gets a Snapshot.
 | 
				
			||||||
 | 
					func (c *Client) getSnapshot(ctx context.Context, resourceGroupName string, snapshotName string) (compute.Snapshot, *retry.Error) {
 | 
				
			||||||
 | 
						resourceID := armclient.GetResourceID(
 | 
				
			||||||
 | 
							c.subscriptionID,
 | 
				
			||||||
 | 
							resourceGroupName,
 | 
				
			||||||
 | 
							"Microsoft.Compute/snapshots",
 | 
				
			||||||
 | 
							snapshotName,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						result := compute.Snapshot{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						response, rerr := c.armClient.GetResource(ctx, resourceID, "")
 | 
				
			||||||
 | 
						defer c.armClient.CloseResponse(ctx, response)
 | 
				
			||||||
 | 
						if rerr != nil {
 | 
				
			||||||
 | 
							klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "snapshot.get.request", resourceID, rerr.Error())
 | 
				
			||||||
 | 
							return result, rerr
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := autorest.Respond(
 | 
				
			||||||
 | 
							response,
 | 
				
			||||||
 | 
							azure.WithErrorUnlessStatusCode(http.StatusOK),
 | 
				
			||||||
 | 
							autorest.ByUnmarshallingJSON(&result))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "snapshot.get.respond", resourceID, err)
 | 
				
			||||||
 | 
							return result, retry.GetError(response, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result.Response = autorest.Response{Response: response}
 | 
				
			||||||
 | 
						return result, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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, "")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Report errors if the client is rate limited.
 | 
				
			||||||
 | 
						if !c.rateLimiterWriter.TryAccept() {
 | 
				
			||||||
 | 
							mc.RateLimitedCount()
 | 
				
			||||||
 | 
							return retry.GetRateLimitError(true, "SnapshotDelete")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Report errors if the client is throttled.
 | 
				
			||||||
 | 
						if c.RetryAfterWriter.After(time.Now()) {
 | 
				
			||||||
 | 
							mc.ThrottledCount()
 | 
				
			||||||
 | 
							rerr := retry.GetThrottlingError("SnapshotDelete", "client throttled", c.RetryAfterWriter)
 | 
				
			||||||
 | 
							return rerr
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rerr := c.deleteSnapshot(ctx, resourceGroupName, snapshotName)
 | 
				
			||||||
 | 
						mc.Observe(rerr.Error())
 | 
				
			||||||
 | 
						if rerr != nil {
 | 
				
			||||||
 | 
							if rerr.IsThrottled() {
 | 
				
			||||||
 | 
								// Update RetryAfterReader so that no more requests would be sent until RetryAfter expires.
 | 
				
			||||||
 | 
								c.RetryAfterWriter = rerr.RetryAfter
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return rerr
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// deleteSnapshot deletes a PublicIPAddress by name.
 | 
				
			||||||
 | 
					func (c *Client) deleteSnapshot(ctx context.Context, resourceGroupName string, snapshotName string) *retry.Error {
 | 
				
			||||||
 | 
						resourceID := armclient.GetResourceID(
 | 
				
			||||||
 | 
							c.subscriptionID,
 | 
				
			||||||
 | 
							resourceGroupName,
 | 
				
			||||||
 | 
							"Microsoft.Compute/snapshots",
 | 
				
			||||||
 | 
							snapshotName,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return c.armClient.DeleteResource(ctx, resourceID, "")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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, "")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Report errors if the client is rate limited.
 | 
				
			||||||
 | 
						if !c.rateLimiterWriter.TryAccept() {
 | 
				
			||||||
 | 
							mc.RateLimitedCount()
 | 
				
			||||||
 | 
							return retry.GetRateLimitError(true, "SnapshotCreateOrUpdate")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Report errors if the client is throttled.
 | 
				
			||||||
 | 
						if c.RetryAfterWriter.After(time.Now()) {
 | 
				
			||||||
 | 
							mc.ThrottledCount()
 | 
				
			||||||
 | 
							rerr := retry.GetThrottlingError("SnapshotCreateOrUpdate", "client throttled", c.RetryAfterWriter)
 | 
				
			||||||
 | 
							return rerr
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rerr := c.createOrUpdateSnapshot(ctx, resourceGroupName, snapshotName, snapshot)
 | 
				
			||||||
 | 
						mc.Observe(rerr.Error())
 | 
				
			||||||
 | 
						if rerr != nil {
 | 
				
			||||||
 | 
							if rerr.IsThrottled() {
 | 
				
			||||||
 | 
								// Update RetryAfterReader so that no more requests would be sent until RetryAfter expires.
 | 
				
			||||||
 | 
								c.RetryAfterWriter = rerr.RetryAfter
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return rerr
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// createOrUpdateSnapshot creates or updates a Snapshot.
 | 
				
			||||||
 | 
					func (c *Client) createOrUpdateSnapshot(ctx context.Context, resourceGroupName string, snapshotName string, snapshot compute.Snapshot) *retry.Error {
 | 
				
			||||||
 | 
						resourceID := armclient.GetResourceID(
 | 
				
			||||||
 | 
							c.subscriptionID,
 | 
				
			||||||
 | 
							resourceGroupName,
 | 
				
			||||||
 | 
							"Microsoft.Compute/snapshots",
 | 
				
			||||||
 | 
							snapshotName,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						response, rerr := c.armClient.PutResource(ctx, resourceID, snapshot)
 | 
				
			||||||
 | 
						defer c.armClient.CloseResponse(ctx, response)
 | 
				
			||||||
 | 
						if rerr != nil {
 | 
				
			||||||
 | 
							klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "snapshot.put.request", resourceID, rerr.Error())
 | 
				
			||||||
 | 
							return rerr
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if response != nil && response.StatusCode != http.StatusNoContent {
 | 
				
			||||||
 | 
							_, rerr = c.createOrUpdateResponder(response)
 | 
				
			||||||
 | 
							if rerr != nil {
 | 
				
			||||||
 | 
								klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "snapshot.put.respond", resourceID, rerr.Error())
 | 
				
			||||||
 | 
								return rerr
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *Client) createOrUpdateResponder(resp *http.Response) (*compute.Snapshot, *retry.Error) {
 | 
				
			||||||
 | 
						result := &compute.Snapshot{}
 | 
				
			||||||
 | 
						err := autorest.Respond(
 | 
				
			||||||
 | 
							resp,
 | 
				
			||||||
 | 
							azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusCreated),
 | 
				
			||||||
 | 
							autorest.ByUnmarshallingJSON(&result))
 | 
				
			||||||
 | 
						result.Response = autorest.Response{Response: resp}
 | 
				
			||||||
 | 
						return result, retry.GetError(resp, err)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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, "")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Report errors if the client is rate limited.
 | 
				
			||||||
 | 
						if !c.rateLimiterReader.TryAccept() {
 | 
				
			||||||
 | 
							mc.RateLimitedCount()
 | 
				
			||||||
 | 
							return nil, retry.GetRateLimitError(false, "SnapshotListByResourceGroup")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Report errors if the client is throttled.
 | 
				
			||||||
 | 
						if c.RetryAfterReader.After(time.Now()) {
 | 
				
			||||||
 | 
							mc.ThrottledCount()
 | 
				
			||||||
 | 
							rerr := retry.GetThrottlingError("SnapshotListByResourceGroup", "client throttled", c.RetryAfterReader)
 | 
				
			||||||
 | 
							return nil, rerr
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result, rerr := c.listSnapshotsByResourceGroup(ctx, resourceGroupName)
 | 
				
			||||||
 | 
						mc.Observe(rerr.Error())
 | 
				
			||||||
 | 
						if rerr != nil {
 | 
				
			||||||
 | 
							if rerr.IsThrottled() {
 | 
				
			||||||
 | 
								// Update RetryAfterReader so that no more requests would be sent until RetryAfter expires.
 | 
				
			||||||
 | 
								c.RetryAfterReader = rerr.RetryAfter
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return result, rerr
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return result, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// listSnapshotsByResourceGroup gets a list of snapshots in the resource group.
 | 
				
			||||||
 | 
					func (c *Client) listSnapshotsByResourceGroup(ctx context.Context, resourceGroupName string) ([]compute.Snapshot, *retry.Error) {
 | 
				
			||||||
 | 
						resourceID := fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Compute/snapshots",
 | 
				
			||||||
 | 
							autorest.Encode("path", c.subscriptionID),
 | 
				
			||||||
 | 
							autorest.Encode("path", resourceGroupName))
 | 
				
			||||||
 | 
						result := make([]compute.Snapshot, 0)
 | 
				
			||||||
 | 
						page := &SnapshotListPage{}
 | 
				
			||||||
 | 
						page.fn = c.listNextResults
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resp, rerr := c.armClient.GetResource(ctx, resourceID, "")
 | 
				
			||||||
 | 
						defer c.armClient.CloseResponse(ctx, resp)
 | 
				
			||||||
 | 
						if rerr != nil {
 | 
				
			||||||
 | 
							klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "snapshot.list.request", resourceID, rerr.Error())
 | 
				
			||||||
 | 
							return result, rerr
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
						page.sl, err = c.listResponder(resp)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "snapshot.list.respond", resourceID, err)
 | 
				
			||||||
 | 
							return result, retry.GetError(resp, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for page.NotDone() {
 | 
				
			||||||
 | 
							result = append(result, *page.Response().Value...)
 | 
				
			||||||
 | 
							if err = page.NextWithContext(ctx); err != nil {
 | 
				
			||||||
 | 
								klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "snapshot.list.next", resourceID, err)
 | 
				
			||||||
 | 
								return result, retry.GetError(page.Response().Response.Response, err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return result, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *Client) listResponder(resp *http.Response) (result compute.SnapshotList, err error) {
 | 
				
			||||||
 | 
						err = autorest.Respond(
 | 
				
			||||||
 | 
							resp,
 | 
				
			||||||
 | 
							autorest.ByIgnoring(),
 | 
				
			||||||
 | 
							azure.WithErrorUnlessStatusCode(http.StatusOK),
 | 
				
			||||||
 | 
							autorest.ByUnmarshallingJSON(&result))
 | 
				
			||||||
 | 
						result.Response = autorest.Response{Response: resp}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SnapshotListResultPreparer prepares a request to retrieve the next set of results.
 | 
				
			||||||
 | 
					// It returns nil if no more results exist.
 | 
				
			||||||
 | 
					func (c *Client) SnapshotListResultPreparer(ctx context.Context, lr compute.SnapshotList) (*http.Request, error) {
 | 
				
			||||||
 | 
						if lr.NextLink == nil || len(to.String(lr.NextLink)) < 1 {
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						decorators := []autorest.PrepareDecorator{
 | 
				
			||||||
 | 
							autorest.WithBaseURL(to.String(lr.NextLink)),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return c.armClient.PrepareGetRequest(ctx, decorators...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// listNextResults retrieves the next set of results, if any.
 | 
				
			||||||
 | 
					func (c *Client) listNextResults(ctx context.Context, lastResults compute.SnapshotList) (result compute.SnapshotList, err error) {
 | 
				
			||||||
 | 
						req, err := c.SnapshotListResultPreparer(ctx, lastResults)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return result, autorest.NewErrorWithError(err, "snapshotclient", "listNextResults", nil, "Failure preparing next results request")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if req == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resp, rerr := c.armClient.Send(ctx, req)
 | 
				
			||||||
 | 
						defer c.armClient.CloseResponse(ctx, resp)
 | 
				
			||||||
 | 
						if rerr != nil {
 | 
				
			||||||
 | 
							result.Response = autorest.Response{Response: resp}
 | 
				
			||||||
 | 
							return result, autorest.NewErrorWithError(rerr.Error(), "snapshotclient", "listNextResults", resp, "Failure sending next results request")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result, err = c.listResponder(resp)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							err = autorest.NewErrorWithError(err, "snapshotclient", "listNextResults", resp, "Failure responding to next results request")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SnapshotListPage contains a page of Snapshot values.
 | 
				
			||||||
 | 
					type SnapshotListPage struct {
 | 
				
			||||||
 | 
						fn func(context.Context, compute.SnapshotList) (compute.SnapshotList, error)
 | 
				
			||||||
 | 
						sl compute.SnapshotList
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NextWithContext advances to the next page of values.  If there was an error making
 | 
				
			||||||
 | 
					// the request the page does not advance and the error is returned.
 | 
				
			||||||
 | 
					func (page *SnapshotListPage) NextWithContext(ctx context.Context) (err error) {
 | 
				
			||||||
 | 
						next, err := page.fn(ctx, page.sl)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						page.sl = next
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Next advances to the next page of values.  If there was an error making
 | 
				
			||||||
 | 
					// the request the page does not advance and the error is returned.
 | 
				
			||||||
 | 
					// Deprecated: Use NextWithContext() instead.
 | 
				
			||||||
 | 
					func (page *SnapshotListPage) Next() error {
 | 
				
			||||||
 | 
						return page.NextWithContext(context.Background())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NotDone returns true if the page enumeration should be started or is not yet complete.
 | 
				
			||||||
 | 
					func (page SnapshotListPage) NotDone() bool {
 | 
				
			||||||
 | 
						return !page.sl.IsEmpty()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Response returns the raw server response from the last page request.
 | 
				
			||||||
 | 
					func (page SnapshotListPage) Response() compute.SnapshotList {
 | 
				
			||||||
 | 
						return page.sl
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Values returns the slice of values for the current page or nil if there are no values.
 | 
				
			||||||
 | 
					func (page SnapshotListPage) Values() []compute.Snapshot {
 | 
				
			||||||
 | 
						if page.sl.IsEmpty() {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return *page.sl.Value
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,151 @@
 | 
				
			|||||||
 | 
					// +build !providerless
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2020 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package snapshotclient
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
 | 
				
			||||||
 | 
						"github.com/Azure/go-autorest/autorest"
 | 
				
			||||||
 | 
						"github.com/Azure/go-autorest/autorest/to"
 | 
				
			||||||
 | 
						"github.com/golang/mock/gomock"
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
 | 
						azclients "k8s.io/legacy-cloud-providers/azure/clients"
 | 
				
			||||||
 | 
						"k8s.io/legacy-cloud-providers/azure/clients/armclient"
 | 
				
			||||||
 | 
						"k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestGetNotFound(t *testing.T) {
 | 
				
			||||||
 | 
						ctrl := gomock.NewController(t)
 | 
				
			||||||
 | 
						defer ctrl.Finish()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resourceID := "/subscriptions/subscriptionID/resourceGroups/rg/providers/Microsoft.Compute/snapshots/sn1"
 | 
				
			||||||
 | 
						response := &http.Response{
 | 
				
			||||||
 | 
							StatusCode: http.StatusNotFound,
 | 
				
			||||||
 | 
							Body:       ioutil.NopCloser(bytes.NewReader([]byte("{}"))),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						armClient := mockarmclient.NewMockInterface(ctrl)
 | 
				
			||||||
 | 
						armClient.EXPECT().GetResource(gomock.Any(), resourceID, "").Return(response, nil).Times(1)
 | 
				
			||||||
 | 
						armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						snClient := getTestSnapshotClient(armClient)
 | 
				
			||||||
 | 
						expected := compute.Snapshot{Response: autorest.Response{}}
 | 
				
			||||||
 | 
						result, rerr := snClient.Get(context.TODO(), "rg", "sn1")
 | 
				
			||||||
 | 
						assert.Equal(t, expected, result)
 | 
				
			||||||
 | 
						assert.NotNil(t, rerr)
 | 
				
			||||||
 | 
						assert.Equal(t, http.StatusNotFound, rerr.HTTPStatusCode)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestGetInternalError(t *testing.T) {
 | 
				
			||||||
 | 
						ctrl := gomock.NewController(t)
 | 
				
			||||||
 | 
						defer ctrl.Finish()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resourceID := "/subscriptions/subscriptionID/resourceGroups/rg/providers/Microsoft.Compute/snapshots/sn1"
 | 
				
			||||||
 | 
						response := &http.Response{
 | 
				
			||||||
 | 
							StatusCode: http.StatusInternalServerError,
 | 
				
			||||||
 | 
							Body:       ioutil.NopCloser(bytes.NewReader([]byte("{}"))),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						armClient := mockarmclient.NewMockInterface(ctrl)
 | 
				
			||||||
 | 
						armClient.EXPECT().GetResource(gomock.Any(), resourceID, "").Return(response, nil).Times(1)
 | 
				
			||||||
 | 
						armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						snClient := getTestSnapshotClient(armClient)
 | 
				
			||||||
 | 
						expected := compute.Snapshot{Response: autorest.Response{}}
 | 
				
			||||||
 | 
						result, rerr := snClient.Get(context.TODO(), "rg", "sn1")
 | 
				
			||||||
 | 
						assert.Equal(t, expected, result)
 | 
				
			||||||
 | 
						assert.NotNil(t, rerr)
 | 
				
			||||||
 | 
						assert.Equal(t, http.StatusInternalServerError, rerr.HTTPStatusCode)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestListByResourceGroup(t *testing.T) {
 | 
				
			||||||
 | 
						ctrl := gomock.NewController(t)
 | 
				
			||||||
 | 
						defer ctrl.Finish()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resourceID := "/subscriptions/subscriptionID/resourceGroups/rg/providers/Microsoft.Compute/snapshots"
 | 
				
			||||||
 | 
						armClient := mockarmclient.NewMockInterface(ctrl)
 | 
				
			||||||
 | 
						snList := []compute.Snapshot{getTestSnapshot("sn1"), getTestSnapshot("pip2"), getTestSnapshot("pip3")}
 | 
				
			||||||
 | 
						responseBody, err := json.Marshal(compute.SnapshotList{Value: &snList})
 | 
				
			||||||
 | 
						assert.Nil(t, err)
 | 
				
			||||||
 | 
						armClient.EXPECT().GetResource(gomock.Any(), resourceID, "").Return(
 | 
				
			||||||
 | 
							&http.Response{
 | 
				
			||||||
 | 
								StatusCode: http.StatusOK,
 | 
				
			||||||
 | 
								Body:       ioutil.NopCloser(bytes.NewReader(responseBody)),
 | 
				
			||||||
 | 
							}, nil).Times(1)
 | 
				
			||||||
 | 
						armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						snClient := getTestSnapshotClient(armClient)
 | 
				
			||||||
 | 
						result, rerr := snClient.ListByResourceGroup(context.TODO(), "rg")
 | 
				
			||||||
 | 
						assert.Nil(t, rerr)
 | 
				
			||||||
 | 
						assert.Equal(t, 3, len(result))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestCreateOrUpdate(t *testing.T) {
 | 
				
			||||||
 | 
						ctrl := gomock.NewController(t)
 | 
				
			||||||
 | 
						defer ctrl.Finish()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sn := getTestSnapshot("sn1")
 | 
				
			||||||
 | 
						armClient := mockarmclient.NewMockInterface(ctrl)
 | 
				
			||||||
 | 
						response := &http.Response{
 | 
				
			||||||
 | 
							StatusCode: http.StatusOK,
 | 
				
			||||||
 | 
							Body:       ioutil.NopCloser(bytes.NewReader([]byte(""))),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						armClient.EXPECT().PutResource(gomock.Any(), to.String(sn.ID), sn).Return(response, nil).Times(1)
 | 
				
			||||||
 | 
						armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						snClient := getTestSnapshotClient(armClient)
 | 
				
			||||||
 | 
						rerr := snClient.CreateOrUpdate(context.TODO(), "rg", "sn1", sn)
 | 
				
			||||||
 | 
						assert.Nil(t, rerr)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestDelete(t *testing.T) {
 | 
				
			||||||
 | 
						ctrl := gomock.NewController(t)
 | 
				
			||||||
 | 
						defer ctrl.Finish()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r := getTestSnapshot("sn1")
 | 
				
			||||||
 | 
						armClient := mockarmclient.NewMockInterface(ctrl)
 | 
				
			||||||
 | 
						armClient.EXPECT().DeleteResource(gomock.Any(), to.String(r.ID), "").Return(nil).Times(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rtClient := getTestSnapshotClient(armClient)
 | 
				
			||||||
 | 
						rerr := rtClient.Delete(context.TODO(), "rg", "sn1")
 | 
				
			||||||
 | 
						assert.Nil(t, rerr)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getTestSnapshot(name string) compute.Snapshot {
 | 
				
			||||||
 | 
						return compute.Snapshot{
 | 
				
			||||||
 | 
							ID:       to.StringPtr(fmt.Sprintf("/subscriptions/subscriptionID/resourceGroups/rg/providers/Microsoft.Compute/snapshots/%s", name)),
 | 
				
			||||||
 | 
							Name:     to.StringPtr(name),
 | 
				
			||||||
 | 
							Location: to.StringPtr("eastus"),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getTestSnapshotClient(armClient armclient.Interface) *Client {
 | 
				
			||||||
 | 
						rateLimiterReader, rateLimiterWriter := azclients.NewRateLimiter(&azclients.RateLimitConfig{})
 | 
				
			||||||
 | 
						return &Client{
 | 
				
			||||||
 | 
							armClient:         armClient,
 | 
				
			||||||
 | 
							subscriptionID:    "subscriptionID",
 | 
				
			||||||
 | 
							rateLimiterReader: rateLimiterReader,
 | 
				
			||||||
 | 
							rateLimiterWriter: rateLimiterWriter,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					// +build !providerless
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2020 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Package snapshotclient implements the client for Snapshots.
 | 
				
			||||||
 | 
					package snapshotclient // import "k8s.io/legacy-cloud-providers/azure/clients/snapshotclient"
 | 
				
			||||||
@@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					// +build !providerless
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2020 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package snapshotclient
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
 | 
				
			||||||
 | 
						"k8s.io/legacy-cloud-providers/azure/retry"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						// APIVersion is the API version for compute.
 | 
				
			||||||
 | 
						APIVersion = "2019-07-01"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Interface is the client interface for Snapshots.
 | 
				
			||||||
 | 
					// Don't forget to run the following command to generate the mock client:
 | 
				
			||||||
 | 
					// mockgen -source=$GOPATH/src/k8s.io/kubernetes/staging/src/k8s.io/legacy-cloud-providers/azure/clients/snapshotclient/interface.go -package=mocksnapshotclient Interface > $GOPATH/src/k8s.io/kubernetes/staging/src/k8s.io/legacy-cloud-providers/azure/clients/snapshotclient/mocksnapshotclient/interface.go
 | 
				
			||||||
 | 
					type Interface interface {
 | 
				
			||||||
 | 
						// Get gets a Snapshot.
 | 
				
			||||||
 | 
						Get(ctx context.Context, resourceGroupName string, snapshotName string) (compute.Snapshot, *retry.Error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Delete deletes a Snapshot by name.
 | 
				
			||||||
 | 
						Delete(ctx context.Context, resourceGroupName string, snapshotName string) *retry.Error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// ListByResourceGroup get a list snapshots by resourceGroup.
 | 
				
			||||||
 | 
						ListByResourceGroup(ctx context.Context, 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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					load("@io_bazel_rules_go//go:def.bzl", "go_library")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go_library(
 | 
				
			||||||
 | 
					    name = "go_default_library",
 | 
				
			||||||
 | 
					    srcs = [
 | 
				
			||||||
 | 
					        "doc.go",
 | 
				
			||||||
 | 
					        "interface.go",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/snapshotclient/mocksnapshotclient",
 | 
				
			||||||
 | 
					    importpath = "k8s.io/legacy-cloud-providers/azure/clients/snapshotclient/mocksnapshotclient",
 | 
				
			||||||
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
 | 
					    deps = [
 | 
				
			||||||
 | 
					        "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-06-01/storage:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/golang/mock/gomock:go_default_library",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					filegroup(
 | 
				
			||||||
 | 
					    name = "package-srcs",
 | 
				
			||||||
 | 
					    srcs = glob(["**"]),
 | 
				
			||||||
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
 | 
					    visibility = ["//visibility:private"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					filegroup(
 | 
				
			||||||
 | 
					    name = "all-srcs",
 | 
				
			||||||
 | 
					    srcs = [":package-srcs"],
 | 
				
			||||||
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					// +build !providerless
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2020 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Package mocksnapshotclient implements the mock client for Snapshots.
 | 
				
			||||||
 | 
					package mocksnapshotclient // import "k8s.io/legacy-cloud-providers/azure/clients/snapshotclient/mocksnapshotclient"
 | 
				
			||||||
@@ -0,0 +1,108 @@
 | 
				
			|||||||
 | 
					// +build !providerless
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2020 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package mocksnapshotclient
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						context "context"
 | 
				
			||||||
 | 
						compute "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
 | 
				
			||||||
 | 
						gomock "github.com/golang/mock/gomock"
 | 
				
			||||||
 | 
						retry "k8s.io/legacy-cloud-providers/azure/retry"
 | 
				
			||||||
 | 
						reflect "reflect"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MockInterface is a mock of Interface interface
 | 
				
			||||||
 | 
					type MockInterface struct {
 | 
				
			||||||
 | 
						ctrl     *gomock.Controller
 | 
				
			||||||
 | 
						recorder *MockInterfaceMockRecorder
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MockInterfaceMockRecorder is the mock recorder for MockInterface
 | 
				
			||||||
 | 
					type MockInterfaceMockRecorder struct {
 | 
				
			||||||
 | 
						mock *MockInterface
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewMockInterface creates a new mock instance
 | 
				
			||||||
 | 
					func NewMockInterface(ctrl *gomock.Controller) *MockInterface {
 | 
				
			||||||
 | 
						mock := &MockInterface{ctrl: ctrl}
 | 
				
			||||||
 | 
						mock.recorder = &MockInterfaceMockRecorder{mock}
 | 
				
			||||||
 | 
						return mock
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// EXPECT returns an object that allows the caller to indicate expected use
 | 
				
			||||||
 | 
					func (m *MockInterface) EXPECT() *MockInterfaceMockRecorder {
 | 
				
			||||||
 | 
						return m.recorder
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Get mocks base method
 | 
				
			||||||
 | 
					func (m *MockInterface) Get(ctx context.Context, resourceGroupName, snapshotName string) (compute.Snapshot, *retry.Error) {
 | 
				
			||||||
 | 
						m.ctrl.T.Helper()
 | 
				
			||||||
 | 
						ret := m.ctrl.Call(m, "Get", ctx, 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 {
 | 
				
			||||||
 | 
						mr.mock.ctrl.T.Helper()
 | 
				
			||||||
 | 
						return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockInterface)(nil).Get), ctx, resourceGroupName, snapshotName)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Delete mocks base method
 | 
				
			||||||
 | 
					func (m *MockInterface) Delete(ctx context.Context, resourceGroupName, snapshotName string) *retry.Error {
 | 
				
			||||||
 | 
						m.ctrl.T.Helper()
 | 
				
			||||||
 | 
						ret := m.ctrl.Call(m, "Delete", ctx, 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 {
 | 
				
			||||||
 | 
						mr.mock.ctrl.T.Helper()
 | 
				
			||||||
 | 
						return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockInterface)(nil).Delete), ctx, resourceGroupName, snapshotName)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ListByResourceGroup mocks base method
 | 
				
			||||||
 | 
					func (m *MockInterface) ListByResourceGroup(ctx context.Context, resourceGroupName string) ([]compute.Snapshot, *retry.Error) {
 | 
				
			||||||
 | 
						m.ctrl.T.Helper()
 | 
				
			||||||
 | 
						ret := m.ctrl.Call(m, "ListByResourceGroup", ctx, 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 {
 | 
				
			||||||
 | 
						mr.mock.ctrl.T.Helper()
 | 
				
			||||||
 | 
						return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByResourceGroup", reflect.TypeOf((*MockInterface)(nil).ListByResourceGroup), ctx, resourceGroupName)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CreateOrUpdate mocks base method
 | 
				
			||||||
 | 
					func (m *MockInterface) CreateOrUpdate(ctx context.Context, resourceGroupName, snapshotName string, snapshot compute.Snapshot) *retry.Error {
 | 
				
			||||||
 | 
						m.ctrl.T.Helper()
 | 
				
			||||||
 | 
						ret := m.ctrl.Call(m, "CreateOrUpdate", ctx, 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 {
 | 
				
			||||||
 | 
						mr.mock.ctrl.T.Helper()
 | 
				
			||||||
 | 
						return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrUpdate", reflect.TypeOf((*MockInterface)(nil).CreateOrUpdate), ctx, resourceGroupName, snapshotName, snapshot)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user