sigs.k8s.io/cluster-api-provider-azure@v1.14.3/test/e2e/kubernetes/storageclass/storageclass.go (about)

     1  //go:build e2e
     2  // +build e2e
     3  
     4  /*
     5  Copyright 2022 The Kubernetes Authors.
     6  
     7  Licensed under the Apache License, Version 2.0 (the "License");
     8  you may not use this file except in compliance with the License.
     9  You may obtain a copy of the License at
    10  
    11      http://www.apache.org/licenses/LICENSE-2.0
    12  
    13  Unless required by applicable law or agreed to in writing, software
    14  distributed under the License is distributed on an "AS IS" BASIS,
    15  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    16  See the License for the specific language governing permissions and
    17  limitations under the License.
    18  */
    19  
    20  package storageclass
    21  
    22  import (
    23  	"context"
    24  	"log"
    25  	"time"
    26  
    27  	. "github.com/onsi/gomega"
    28  	storagev1 "k8s.io/api/storage/v1"
    29  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    30  	"k8s.io/client-go/kubernetes"
    31  )
    32  
    33  /*
    34  // In-tree azuredisk csi driver sc example
    35  kind: StorageClass
    36  apiVersion: storage.k8s.io/v1
    37  metadata:
    38    name: managedhdd
    39  provisioner: kubernetes.io/azure-disk
    40  volumeBindingMode: WaitForFirstConsumer
    41  parameters:
    42    storageaccounttype: Standard_LRS
    43    kind: Managed
    44  */
    45  
    46  /*
    47  // External azuredisk csi driver sc example
    48  apiVersion: storage.k8s.io/v1
    49  kind: StorageClass
    50  metadata:
    51    name: managed-csi
    52  provisioner: disk.csi.azure.com
    53  parameters:
    54    skuName: StandardSSD_LRS  # alias: storageaccounttype, available values: Standard_LRS, Premium_LRS, StandardSSD_LRS, UltraSSD_LRS
    55  reclaimPolicy: Delete
    56  volumeBindingMode: WaitForFirstConsumer
    57  allowVolumeExpansion: true
    58  */
    59  
    60  const (
    61  	scOperationTimeout             = 30 * time.Second
    62  	scOperationSleepBetweenRetries = 3 * time.Second
    63  	AzureDiskProvisioner           = "kubernetes.io/azure-disk"
    64  	OotAzureDiskProvisioner        = "disk.csi.azure.com"
    65  )
    66  
    67  // Builder provides a helper interface for building storage class manifest.
    68  type Builder struct {
    69  	sc *storagev1.StorageClass
    70  }
    71  
    72  // Create creates a storage class builder manifest.
    73  func Create(scName string) *Builder {
    74  	scBuilder := &Builder{
    75  		sc: &storagev1.StorageClass{
    76  			ObjectMeta: metav1.ObjectMeta{
    77  				Name: scName,
    78  			},
    79  			Provisioner: AzureDiskProvisioner,
    80  			Parameters: map[string]string{
    81  				"storageaccounttype": "Standard_LRS",
    82  				"kind":               "managed",
    83  			},
    84  		},
    85  	}
    86  	return scBuilder
    87  }
    88  
    89  // WithWaitForFirstConsumer sets volume binding on first consumer.
    90  func (d *Builder) WithWaitForFirstConsumer() *Builder {
    91  	volumeBinding := storagev1.VolumeBindingWaitForFirstConsumer
    92  	d.sc.VolumeBindingMode = &volumeBinding
    93  	return d
    94  }
    95  
    96  // WithOotProvisionerName sets the correct external azure disk csi driver provisioner name.
    97  func (d *Builder) WithOotProvisionerName() *Builder {
    98  	d.sc.Provisioner = OotAzureDiskProvisioner
    99  	return d
   100  }
   101  
   102  // WithOotParameters sets the sc parameters for out of tree csi drivers.
   103  func (d *Builder) WithOotParameters() *Builder {
   104  	d.sc.Parameters = map[string]string{
   105  		"skuName": "StandardSSD_LRS",
   106  	}
   107  	return d
   108  }
   109  
   110  // DeployStorageClass creates a storage class on the k8s cluster.
   111  func (d *Builder) DeployStorageClass(clientset *kubernetes.Clientset) {
   112  	Eventually(func(g Gomega) {
   113  		_, err := clientset.StorageV1().StorageClasses().Create(context.TODO(), d.sc, metav1.CreateOptions{})
   114  		if err != nil {
   115  			log.Printf("Error trying to deploy storage class %s in namespace %s:%s\n", d.sc.Name, d.sc.ObjectMeta.Namespace, err.Error())
   116  		}
   117  		g.Expect(err).To(HaveOccurred())
   118  	}, scOperationTimeout, scOperationSleepBetweenRetries).Should(Succeed())
   119  }