From 2718e4343fcc4dcf4375e89f8848fc6546905463 Mon Sep 17 00:00:00 2001 From: Fabrice Daugan Date: Sat, 20 Nov 2021 19:20:34 +0100 Subject: [PATCH] Add support of referenced RDS volume name --- .../aws/catalog/vm/rds/AwsPriceImportRds.java | 38 ++++++++++++++----- .../prov/aws/catalog/vm/rds/AwsRdsPrice.java | 7 +++- .../aws/catalog/vm/rds/CsvForBeanRds.java | 6 +-- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/ligoj/app/plugin/prov/aws/catalog/vm/rds/AwsPriceImportRds.java b/src/main/java/org/ligoj/app/plugin/prov/aws/catalog/vm/rds/AwsPriceImportRds.java index 9b6ac63..c73f390 100644 --- a/src/main/java/org/ligoj/app/plugin/prov/aws/catalog/vm/rds/AwsPriceImportRds.java +++ b/src/main/java/org/ligoj/app/plugin/prov/aws/catalog/vm/rds/AwsPriceImportRds.java @@ -29,10 +29,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import lombok.extern.slf4j.Slf4j; + /** * The provisioning price service for RDS AWS. Manage install or update of prices. */ @Component +@Slf4j public class AwsPriceImportRds extends AbstractAwsPriceImportVm { @@ -96,16 +99,23 @@ protected void installPrice(final LocalRdsContext context, final AwsRdsPrice csv } else { // Database storage final var type = installStorageType(context, csv); - final var price = context.getPreviousStorage().computeIfAbsent(csv.getSku(), c -> { + if (type == null) { + // Ignore this type + return; + } + + log.info("Add Database storage sku={}, type={}, location={}", csv.getSku(), type.getName(), + context.getRegion().getName()); + syncAdd(context.getPreviousStorage(), csv.getSku(), c -> { final var p = new ProvStoragePrice(); p.setCode(c); p.setType(type); p.setLocation(context.getRegion()); return p; - }); + }, p -> // Update the price as needed - saveAsNeeded(context, price, csv.getPricePerUnit(), spRepository); + saveAsNeeded(context, p, csv.getPricePerUnit(), spRepository)); } } @@ -120,19 +130,28 @@ private ProvStorageType installStorageType(final LocalRdsContext context, final if ("Aurora PostgreSQL".equals(csv.getEngine())) { name = "rds-gp-aurora-postgresql"; engine = "Aurora PostgreSQL"; - } else { + } else { /* Any */ name = "rds-gp-aurora-mysql"; engine = "Aurora MySQL"; } - } else { + } else if ("Oracle".equals(csv.getEngine()) && StringUtils.startsWith(csv.getVolume(), "General Purpose")) { + name = "rds-gp-oracle"; + engine = "Oracle"; + } else if ("Any".equals(csv.getEngine())) { engine = null; if ("General Purpose".equals(csv.getVolume())) { name = "rds-gp"; } else if ("Provisioned IOPS".equals(csv.getVolume())) { name = "rds-io"; - } else { + } else if ("Magnetic".equals(csv.getVolume())) { name = "rds-magnetic"; + } else { + log.error("Unknwown RDS storage type {}/{}/{}", csv.getVolume(), csv.getEngine(), csv.getSku()); + return null; } + } else { + log.error("Unknwown RDS storage type {}/{}/{}", csv.getVolume(), csv.getEngine(), csv.getSku()); + return null; } // Create as needed @@ -145,11 +164,12 @@ private ProvStorageType installStorageType(final LocalRdsContext context, final // Merge the updated statistics return copyAsNeeded(context, type, t -> { - final var ssd = "SSD".equals(csv.getStorage()); + final var ssd = StringUtils.contains(csv.getStorage(), "SSD"); t.setName(type.getCode()); t.setDescription(csv.getVolume()); - t.setMinimal(toInteger(csv.getSizeMin())); - t.setMaximal(toInteger(csv.getSizeMax())); + final var ref = context.getStorageTypes().get(csv.getVolumeName()); + t.setMinimal(ref == null ? toInteger(csv.getSizeMin()) : ref.getMinimal()); + t.setMaximal(ref == null ? toInteger(csv.getSizeMax()) : ref.getMaximal()); t.setEngine(engine == null ? null : engine.toUpperCase(Locale.ENGLISH)); t.setDatabaseType("%"); t.setOptimized(ssd ? ProvStorageOptimized.IOPS : null); diff --git a/src/main/java/org/ligoj/app/plugin/prov/aws/catalog/vm/rds/AwsRdsPrice.java b/src/main/java/org/ligoj/app/plugin/prov/aws/catalog/vm/rds/AwsRdsPrice.java index 132aa1a..3a3f8ce 100644 --- a/src/main/java/org/ligoj/app/plugin/prov/aws/catalog/vm/rds/AwsRdsPrice.java +++ b/src/main/java/org/ligoj/app/plugin/prov/aws/catalog/vm/rds/AwsRdsPrice.java @@ -9,7 +9,7 @@ import lombok.Setter; /** - * AWS EC2 price configuration + * AWS RDS price configuration */ @Getter @Setter @@ -21,5 +21,10 @@ public class AwsRdsPrice extends AbstractAwsVmPrice { private String sizeMin; private String sizeMax; private String volume; + + /** + * Optional volume name reference. + */ + private String volumeName; } diff --git a/src/main/java/org/ligoj/app/plugin/prov/aws/catalog/vm/rds/CsvForBeanRds.java b/src/main/java/org/ligoj/app/plugin/prov/aws/catalog/vm/rds/CsvForBeanRds.java index c9d25e9..0059884 100644 --- a/src/main/java/org/ligoj/app/plugin/prov/aws/catalog/vm/rds/CsvForBeanRds.java +++ b/src/main/java/org/ligoj/app/plugin/prov/aws/catalog/vm/rds/CsvForBeanRds.java @@ -17,7 +17,7 @@ public class CsvForBeanRds extends AbstractCsvForBeanEc2 { /** - * EC2 CSV Mapping to Java bean property + * RDS CSV Mapping to Java bean property */ private static final Map HEADERS_MAPPING = new HashMap<>(); static { @@ -26,6 +26,7 @@ public class CsvForBeanRds extends AbstractCsvForBeanEc2 { HEADERS_MAPPING.put("Min Volume Size", "sizeMin"); HEADERS_MAPPING.put("Max Volume Size", "sizeMax"); HEADERS_MAPPING.put("Volume Type", "volume"); + HEADERS_MAPPING.put("Volume Name", "volumeName"); HEADERS_MAPPING.put("Storage Media", "storage"); } @@ -45,8 +46,7 @@ public boolean isValidRaw(List rawValues) { // Only Single-AZ // Only "Database Instance" and "Database Storage" products // No outpost - return rawValues.size() > 37 && "Single-AZ".equals(rawValues.get(37)) - && "AWS Region".equals(rawValues.get(18)) + return rawValues.size() > 37 && "Single-AZ".equals(rawValues.get(37)) && "AWS Region".equals(rawValues.get(18)) && ("Database Instance".equals(rawValues.get(15)) || "Database Storage".equals(rawValues.get(15))); }