|
|
@@ -70,6 +70,13 @@ var (
|
|
|
usageTypeRegx = regexp.MustCompile(".*(-|^)(EBS.+)")
|
|
|
versionRx = regexp.MustCompile(`^#Version: (\\d+)\\.\\d+$`)
|
|
|
regionRx = regexp.MustCompile("([a-z]+-[a-z]+-[0-9])")
|
|
|
+
|
|
|
+ // StorageClassProvisionerDefaults specifies the default storage class types depending upon the provisioner
|
|
|
+ StorageClassProvisionerDefaults = map[string]string{
|
|
|
+ "kubernetes.io/aws-ebs": "gp2",
|
|
|
+ "ebs.csi.aws.com": "gp3",
|
|
|
+ // TODO: add efs provisioner
|
|
|
+ }
|
|
|
)
|
|
|
|
|
|
func (aws *AWS) PricingSourceStatus() map[string]*models.PricingSource {
|
|
|
@@ -666,6 +673,9 @@ func (k *awsKey) Features() string {
|
|
|
// If the instance is a spot instance, it will return PreemptibleType
|
|
|
// Otherwise returns an empty string
|
|
|
func (k *awsKey) getUsageType(labels map[string]string) string {
|
|
|
+ if kLabel, ok := labels[k.SpotLabelName]; ok && kLabel == k.SpotLabelValue {
|
|
|
+ return PreemptibleType
|
|
|
+ }
|
|
|
if eksLabel, ok := labels[EKSCapacityTypeLabel]; ok && eksLabel == EKSCapacitySpotTypeValue {
|
|
|
// We currently write out spot instances as "preemptible" in the pricing data, so these need to match
|
|
|
return PreemptibleType
|
|
|
@@ -720,7 +730,12 @@ func (key *awsPVKey) GetStorageClass() string {
|
|
|
}
|
|
|
|
|
|
func (key *awsPVKey) Features() string {
|
|
|
- storageClass := key.StorageClassParameters["type"]
|
|
|
+ storageClass, ok := key.StorageClassParameters["type"]
|
|
|
+ if !ok {
|
|
|
+ log.Debugf("storage class %s doesn't have a 'type' parameter", key.Name)
|
|
|
+ storageClass = getStorageClassTypeFrom(key.StorageClassParameters["provisioner"])
|
|
|
+ }
|
|
|
+
|
|
|
if storageClass == "standard" {
|
|
|
storageClass = "gp2"
|
|
|
}
|
|
|
@@ -738,6 +753,22 @@ func (key *awsPVKey) Features() string {
|
|
|
return region + "," + class
|
|
|
}
|
|
|
|
|
|
+// getStorageClassTypeFrom returns the default ebs volume type for a provider provisioner
|
|
|
+func getStorageClassTypeFrom(provisioner string) string {
|
|
|
+ // if there isn't any provided provisioner, return empty volume type
|
|
|
+ if provisioner == "" {
|
|
|
+ return ""
|
|
|
+ }
|
|
|
+
|
|
|
+ scType, ok := StorageClassProvisionerDefaults[provisioner]
|
|
|
+ if ok {
|
|
|
+ log.Debugf("using default voltype %s for provisioner %s", scType, provisioner)
|
|
|
+ return scType
|
|
|
+ }
|
|
|
+
|
|
|
+ return ""
|
|
|
+}
|
|
|
+
|
|
|
// GetKey maps node labels to information needed to retrieve pricing data
|
|
|
func (aws *AWS) GetKey(labels map[string]string, n *v1.Node) models.Key {
|
|
|
return &awsKey{
|
|
|
@@ -862,6 +893,7 @@ func (aws *AWS) DownloadPricingData() error {
|
|
|
storageClassMap := make(map[string]map[string]string)
|
|
|
for _, storageClass := range storageClasses {
|
|
|
params := storageClass.Parameters
|
|
|
+ params["provisioner"] = storageClass.Provisioner
|
|
|
storageClassMap[storageClass.ObjectMeta.Name] = params
|
|
|
if storageClass.GetAnnotations()["storageclass.kubernetes.io/is-default-class"] == "true" || storageClass.GetAnnotations()["storageclass.beta.kubernetes.io/is-default-class"] == "true" {
|
|
|
storageClassMap["default"] = params
|