diff --git a/bubble-server/src/main/java/bubble/model/cloud/ForkRequest.java b/bubble-server/src/main/java/bubble/model/cloud/ForkRequest.java new file mode 100644 index 00000000..3eda751d --- /dev/null +++ b/bubble-server/src/main/java/bubble/model/cloud/ForkRequest.java @@ -0,0 +1,14 @@ +package bubble.model.cloud; + +import lombok.Getter; +import lombok.Setter; + +public class ForkRequest { + + @Getter @Setter private String fqdn; + @Getter @Setter private String adminEmail; + @Getter @Setter private String cloud; + @Getter @Setter private String region; + @Getter @Setter private Boolean exactRegion; + +} diff --git a/bubble-server/src/main/java/bubble/resources/cloud/NetworkActionsResource.java b/bubble-server/src/main/java/bubble/resources/cloud/NetworkActionsResource.java index f4b09e32..9b0196f5 100644 --- a/bubble-server/src/main/java/bubble/resources/cloud/NetworkActionsResource.java +++ b/bubble-server/src/main/java/bubble/resources/cloud/NetworkActionsResource.java @@ -13,10 +13,7 @@ import bubble.model.account.Account; import bubble.model.account.AccountPolicy; import bubble.model.account.message.ActionTarget; import bubble.model.bill.AccountPlan; -import bubble.model.cloud.BubbleDomain; -import bubble.model.cloud.BubbleNetwork; -import bubble.model.cloud.BubbleNode; -import bubble.model.cloud.NetLocation; +import bubble.model.cloud.*; import bubble.server.BubbleConfiguration; import bubble.service.account.StandardAuthenticatorService; import bubble.service.cloud.NodeLaunchMonitor; @@ -152,18 +149,16 @@ public class NetworkActionsResource { return ok(networkService.restoreNetwork(network, cloud, region, exactRegion, req)); } - @PUT @Path(EP_FORK +"/{fqdn}") + @PUT @Path(EP_FORK) public Response fork(@Context Request req, @Context ContainerRequest ctx, - @PathParam("fqdn") String fqdn, - @QueryParam("cloud") String cloud, - @QueryParam("region") String region, - @QueryParam("exactRegion") Boolean exactRegion) { + ForkRequest forkRequest) { final Account caller = userPrincipal(ctx); if (!caller.admin()) return forbidden(); authenticatorService.ensureAuthenticated(ctx, ActionTarget.network); + final String fqdn = forkRequest.getFqdn(); final BubbleDomain domain = domainDAO.findByFqdn(fqdn); if (domain == null) return invalid("err.fqdn.domain.invalid", "domain not found for "+fqdn, fqdn); @@ -179,20 +174,25 @@ public class NetworkActionsResource { network.setTag(TAG_ALLOW_REGISTRATION, configuration.getThisNetwork().getBooleanTag(TAG_ALLOW_REGISTRATION, false)); networkDAO.update(network); - if (cloud == null) { - cloud = configuration.getThisNode().getCloud(); + if (forkRequest.getCloud() == null) { + forkRequest.setCloud(configuration.getThisNode().getCloud()); } - if (region == null) { + if (forkRequest.getRegion() == null) { // todo: choose region that is closest to the caller's IP, but is not the same region - region = configuration.getThisNode().getRegion(); + forkRequest.setRegion(configuration.getThisNode().getRegion()); } final AccountPlan accountPlan = accountPlanDAO.findByAccountAndId(caller.getUuid(), network.getName()); if (accountPlan == null) return invalid("err.fqdn.plan.invalid", "no plan found for network "+network.getName(), network.getName()); network.setForkHost(network.hostFromFqdn(fqdn)); + network.setAdminEmail(forkRequest.getAdminEmail()); - return _startNetwork(network, cloud, region, exactRegion, req); + return _startNetwork(network, + forkRequest.getCloud(), + forkRequest.getRegion(), + forkRequest.getExactRegion(), + req); } public Response _startNetwork(BubbleNetwork network, diff --git a/bubble-server/src/test/resources/models/include/fork.json b/bubble-server/src/test/resources/models/include/fork.json index cca0a05f..05bcb426 100644 --- a/bubble-server/src/test/resources/models/include/fork.json +++ b/bubble-server/src/test/resources/models/include/fork.json @@ -83,8 +83,14 @@ { "comment": "fork the system; sets up the first node, which does the rest", "request": { - "uri": "me/networks/<>/actions/fork/<>.<>.<>?cloud=<>®ion=<>", - "method": "put" + "uri": "me/networks/<>/actions/fork", + "method": "put", + "entity": { + "fqdn": "<>.<>.<>", + "adminEmail": "<>", + "cloud": "<>", + "region": "<>" + } }, "response": { "store": "<>" diff --git a/bubble-web b/bubble-web index 29001799..7ea124f8 160000 --- a/bubble-web +++ b/bubble-web @@ -1 +1 @@ -Subproject commit 290017992084da8d799aba24409099d54c1a9305 +Subproject commit 7ea124f8b4594e950d09edf3cc08410276ce2a31