From 7c9def1ebb430b11cefefb84eefcaf911efb11c9 Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Sun, 7 Jun 2020 20:42:05 -0400 Subject: [PATCH] Use compute driver to get regions --- .../java/bubble/model/cloud/CloudService.java | 2 -- .../model/cloud/RegionalServiceDriver.java | 17 +++++++++++++++-- .../cloud/CloudServiceRegionsResource.java | 6 ++++-- .../resources/cloud/NetworksResource.java | 2 +- .../java/bubble/service/cloud/GeoService.java | 2 +- .../java/bubble/service/packer/PackerJob.java | 2 +- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/bubble-server/src/main/java/bubble/model/cloud/CloudService.java b/bubble-server/src/main/java/bubble/model/cloud/CloudService.java index d128a842..9379ac8f 100644 --- a/bubble-server/src/main/java/bubble/model/cloud/CloudService.java +++ b/bubble-server/src/main/java/bubble/model/cloud/CloudService.java @@ -198,8 +198,6 @@ public class CloudService extends IdentifiableBaseParentEntity implements Accoun return wireAndSetup(configuration); } - @Transient @JsonIgnore public RegionalServiceDriver getRegionalDriver () { return (RegionalServiceDriver) getDriver(); } - @Transient @JsonIgnore public GeoLocateServiceDriver getGeoLocateDriver(BubbleConfiguration configuration) { return (GeoLocateServiceDriver) wireAndSetup(configuration); } diff --git a/bubble-server/src/main/java/bubble/model/cloud/RegionalServiceDriver.java b/bubble-server/src/main/java/bubble/model/cloud/RegionalServiceDriver.java index 17fbb2a1..cb7051e0 100644 --- a/bubble-server/src/main/java/bubble/model/cloud/RegionalServiceDriver.java +++ b/bubble-server/src/main/java/bubble/model/cloud/RegionalServiceDriver.java @@ -6,23 +6,36 @@ package bubble.model.cloud; import bubble.cloud.CloudRegion; import bubble.cloud.CloudRegionRelative; +import bubble.server.BubbleConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import static java.util.Comparator.comparingDouble; +import static org.cobbzilla.util.daemon.ZillaRuntime.shortError; public interface RegionalServiceDriver { - static List findClosestRegions(List clouds, + Logger log = LoggerFactory.getLogger(RegionalServiceDriver.class); + + static List findClosestRegions(BubbleConfiguration configuration, + List clouds, BubbleFootprint footprint, double latitude, double longitude) { final List allRegions = new ArrayList<>(); for (CloudService c : clouds) { - final List regions = c.getRegionalDriver().getRegions(); + final List regions; + try { + regions = c.getComputeDriver(configuration).getRegions(); + } catch (Exception e) { + log.warn("findClosestRegions: error fetching regions from "+c.getName()+"/"+c.getUuid()+": "+shortError(e), e); + continue; + } if (regions != null) { for (CloudRegion region : regions) { if (footprint != null && !footprint.isAllowedCountry(region.getLocation().getCountry())) { diff --git a/bubble-server/src/main/java/bubble/resources/cloud/CloudServiceRegionsResource.java b/bubble-server/src/main/java/bubble/resources/cloud/CloudServiceRegionsResource.java index d4dbcc44..9a3e747d 100644 --- a/bubble-server/src/main/java/bubble/resources/cloud/CloudServiceRegionsResource.java +++ b/bubble-server/src/main/java/bubble/resources/cloud/CloudServiceRegionsResource.java @@ -12,6 +12,7 @@ import bubble.dao.cloud.CloudServiceDAO; import bubble.model.account.Account; import bubble.model.cloud.BubbleFootprint; import bubble.model.cloud.CloudService; +import bubble.server.BubbleConfiguration; import bubble.service.cloud.GeoService; import org.glassfish.grizzly.http.server.Request; import org.glassfish.jersey.server.ContainerRequest; @@ -38,6 +39,7 @@ public class CloudServiceRegionsResource { public CloudServiceRegionsResource(Account account) { this.account = account; } + @Autowired private BubbleConfiguration configuration; @Autowired private CloudServiceDAO cloudDAO; @Autowired private BubbleFootprintDAO footprintDAO; @Autowired private GeoService geoService; @@ -77,13 +79,13 @@ public class CloudServiceRegionsResource { if (footprint == null) return notFound(footprintId); } - return ok(findClosestRegions(computeClouds(), footprint, loc.getLatitude(), loc.getLongitude())); + return ok(findClosestRegions(configuration, computeClouds(), footprint, loc.getLatitude(), loc.getLongitude())); } public List findRegions(List clouds, BubbleFootprint footprint) { final List regions = new ArrayList<>(); for (CloudService cloud : clouds) { - for (CloudRegion region : cloud.getRegionalDriver().getRegions(footprint)) { + for (CloudRegion region : cloud.getComputeDriver(configuration).getRegions(footprint)) { regions.add(region.setCloud(cloud.getUuid())); } } diff --git a/bubble-server/src/main/java/bubble/resources/cloud/NetworksResource.java b/bubble-server/src/main/java/bubble/resources/cloud/NetworksResource.java index f7c7854c..64d31de4 100644 --- a/bubble-server/src/main/java/bubble/resources/cloud/NetworksResource.java +++ b/bubble-server/src/main/java/bubble/resources/cloud/NetworksResource.java @@ -148,7 +148,7 @@ public class NetworksResource extends AccountOwnedResource clouds = cloudDAO.findByAccountAndType(caller.getUuid(), csType); // find closest region - return ok(findClosestRegions(clouds, footprint, latitude, longitude)); + return ok(findClosestRegions(configuration, clouds, footprint, latitude, longitude)); } diff --git a/bubble-server/src/main/java/bubble/service/cloud/GeoService.java b/bubble-server/src/main/java/bubble/service/cloud/GeoService.java index b3da51ee..96b4ce2f 100644 --- a/bubble-server/src/main/java/bubble/service/cloud/GeoService.java +++ b/bubble-server/src/main/java/bubble/service/cloud/GeoService.java @@ -224,7 +224,7 @@ public class GeoService { // find all cloud services available to us final List clouds = cloudDAO.findByAccountAndType(network.getAccount(), CloudServiceType.compute); - final List closestRegions = findClosestRegions(clouds, footprint, latitude, longitude); + final List closestRegions = findClosestRegions(configuration, clouds, footprint, latitude, longitude); if (closestRegions.isEmpty()) throw invalidEx("err.cloudRegions.required"); return closestRegions; } diff --git a/bubble-server/src/main/java/bubble/service/packer/PackerJob.java b/bubble-server/src/main/java/bubble/service/packer/PackerJob.java index 2ee360e1..25e066cb 100644 --- a/bubble-server/src/main/java/bubble/service/packer/PackerJob.java +++ b/bubble-server/src/main/java/bubble/service/packer/PackerJob.java @@ -112,7 +112,7 @@ public class PackerJob implements Callable> { // determine lat/lon to find closest cloud region to perform build in final GeoLocation here = geoService.locate(account.getUuid(), getExternalIp()); - final List closestRegions = findClosestRegions(new SingletonList<>(cloud), null, here.getLatitude(), here.getLongitude()); + final List closestRegions = findClosestRegions(configuration, new SingletonList<>(cloud), null, here.getLatitude(), here.getLongitude()); if (empty(closestRegions)) return die("writePackerImages: no closest region could be determined"); CloudRegionRelative buildRegion = closestRegions.get(0); ctx.put(BUILD_REGION_VAR, buildRegion);