diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java index f62daa5c98..5a5a8587ba 100644 --- a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java +++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java @@ -192,7 +192,7 @@ public interface AzureComputeApi extends Closeable { * */ @Delegate - LoadBalancerApi getLoadBalancerApi(@PathParam("resourcegroup") String resourcegroup); + LoadBalancerApi getLoadBalancerApi(@Nullable @PathParam("resourcegroup") String resourcegroup); /** * The AvailabilitySet API includes operations for managing availability sets diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/LoadBalancerApi.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/LoadBalancerApi.java index f8b65dc1c4..b1673ce299 100644 --- a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/LoadBalancerApi.java +++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/LoadBalancerApi.java @@ -45,34 +45,44 @@ import org.jclouds.rest.annotations.ResponseParser; import org.jclouds.rest.annotations.SelectJson; import org.jclouds.rest.binders.BindToJsonPayload; -@Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/loadBalancers") +/** + * The Load Balancer API includes operations for managing the load balancers in your subscription. + * + * @see docs + */ @RequestFilters({ OAuthFilter.class, ApiVersionFilter.class }) @Consumes(MediaType.APPLICATION_JSON) public interface LoadBalancerApi { @Named("loadbalancer:list") @GET + @Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/loadBalancers") @SelectJson("value") @Fallback(EmptyListOnNotFoundOr404.class) List list(); + @Named("loadbalancer:listall") + @GET + @Path("/providers/Microsoft.Network/loadBalancers") + @SelectJson("value") + @Fallback(EmptyListOnNotFoundOr404.class) + List listAll(); + @Named("loadbalancer:get") - @Path("/{loadbalancername}") + @Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/loadBalancers/{loadbalancername}") @GET @Fallback(NullOnNotFoundOr404.class) LoadBalancer get(@PathParam("loadbalancername") String lbName); @Named("loadbalancer:createOrUpdate") - @Path("/{loadbalancername}") + @Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/loadBalancers/{loadbalancername}") @PUT @MapBinder(BindToJsonPayload.class) - LoadBalancer createOrUpdate(@PathParam("loadbalancername") String lbName, - @PayloadParam("location") String location, @Nullable @PayloadParam("tags") Map tags, - @Nullable @PayloadParam("sku") SKU sku, + LoadBalancer createOrUpdate(@PathParam("loadbalancername") String lbName, @PayloadParam("location") String location, @Nullable @PayloadParam("tags") Map tags, @Nullable @PayloadParam("sku") SKU sku, @PayloadParam("properties") LoadBalancerProperties properties); @Named("loadbalancer:delete") - @Path("/{loadbalancername}") + @Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/loadBalancers/{loadbalancername}") @DELETE @ResponseParser(URIParser.class) @Fallback(NullOnNotFoundOr404.class) diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LoadBalancerApiLiveTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LoadBalancerApiLiveTest.java index 0dde77574b..1e9b660c33 100644 --- a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LoadBalancerApiLiveTest.java +++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LoadBalancerApiLiveTest.java @@ -218,6 +218,23 @@ public class LoadBalancerApiLiveTest extends BaseComputeServiceContextLiveTest { })); } + @Test(dependsOnMethods = "testCreateLoadBalancer") + public void testListAllLoadBalancers() { + List result = lbApi.listAll(); + + // Verify we have something + assertNotNull(result); + assertTrue(result.size() > 0); + + // Check that the load balancer matches the one we originally passed in + assertTrue(any(result, new Predicate() { + @Override + public boolean apply(LoadBalancer input) { + return lb.name().equals(input.name()); + } + })); + } + @Test(dependsOnMethods = "testCreateLoadBalancer") public void testGetLoadBalancer() { lb = lbApi.get(lbName); @@ -324,7 +341,7 @@ public class LoadBalancerApiLiveTest extends BaseComputeServiceContextLiveTest { } - @Test(dependsOnMethods = { "testCreateLoadBalancer", "testListLoadBalancers", "testGetLoadBalancer", "testAddProbe", + @Test(dependsOnMethods = { "testCreateLoadBalancer", "testListLoadBalancers", "testListAllLoadBalancers", "testGetLoadBalancer", "testAddProbe", "testAddLoadBalancingRule", "testAddBackendPool", "testAttachNodesToBackendPool", "testAddInboundNatRule" }, alwaysRun = true) public void deleteLoadBalancer() { URI uri = lbApi.delete(lbName); diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LoadBalancerApiMockTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LoadBalancerApiMockTest.java index a0a5a428e6..581322376d 100644 --- a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LoadBalancerApiMockTest.java +++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LoadBalancerApiMockTest.java @@ -109,6 +109,19 @@ public class LoadBalancerApiMockTest extends BaseAzureComputeApiMockTest { assertTrue(result.size() > 0); } + public void listAllLoadBalancers() throws InterruptedException { + server.enqueue(jsonResponse("/loadbalancerlistall.json").setResponseCode(200)); + + final LoadBalancerApi nsgApi = api.getLoadBalancerApi(resourcegroup); + List result = nsgApi.listAll(); + + String path = String.format("/subscriptions/%s/providers/Microsoft.Network/loadBalancers?%s", subscriptionid, apiVersion); + assertSent(server, "GET", path); + + assertNotNull(result); + assertTrue(result.size() > 0); + } + public void listLoadBalancersReturns404() throws InterruptedException { server.enqueue(response404()); diff --git a/providers/azurecompute-arm/src/test/resources/loadbalancerlistall.json b/providers/azurecompute-arm/src/test/resources/loadbalancerlistall.json new file mode 100644 index 0000000000..9e51f06c47 --- /dev/null +++ b/providers/azurecompute-arm/src/test/resources/loadbalancerlistall.json @@ -0,0 +1,66 @@ +{ + "value": [ + { + "name": "testLoadBalancer", + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-loadbalancerapilivetest-nacx/providers/Microsoft.Network/loadBalancers/testLoadBalancer", + "etag": "W/\"1107154b-8717-486b-80c1-af99ec62897b\"", + "type": "Microsoft.Network/loadBalancers", + "location": "westeurope", + "properties": { + "provisioningState": "Succeeded", + "resourceGuid": "383708b3-8d4e-474c-8908-9c4e311ac0bf", + "frontendIPConfigurations": [ + { + "name": "ipConfigs", + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-loadbalancerapilivetest-nacx/providers/Microsoft.Network/loadBalancers/testLoadBalancer/frontendIPConfigurations/ipConfigs", + "etag": "W/\"1107154b-8717-486b-80c1-af99ec62897b\"", + "properties": { + "provisioningState": "Succeeded", + "privateIPAllocationMethod": "Dynamic", + "publicIPAddress": { + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-loadbalancerapilivetest-nacx/providers/Microsoft.Network/publicIPAddresses/Ip4LoadBalancer" + } + } + } + ], + "backendAddressPools": [], + "loadBalancingRules": [], + "probes": [], + "inboundNatRules": [], + "outboundNatRules": [], + "inboundNatPools": [] + } + }, + { + "name": "testLoadBalancer", + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/other-rg/providers/Microsoft.Network/loadBalancers/testLoadBalancer", + "etag": "W/\"1107154b-8717-486b-80c1-af99ec62897b\"", + "type": "Microsoft.Network/loadBalancers", + "location": "westeurope", + "properties": { + "provisioningState": "Succeeded", + "resourceGuid": "383708b3-8d4e-474c-8908-9c4e311ac0bf", + "frontendIPConfigurations": [ + { + "name": "ipConfigs", + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/other-rg/providers/Microsoft.Network/loadBalancers/testLoadBalancer/frontendIPConfigurations/ipConfigs", + "etag": "W/\"1107154b-8717-486b-80c1-af99ec62897b\"", + "properties": { + "provisioningState": "Succeeded", + "privateIPAllocationMethod": "Dynamic", + "publicIPAddress": { + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/other-rg/providers/Microsoft.Network/publicIPAddresses/Ip4LoadBalancer" + } + } + } + ], + "backendAddressPools": [], + "loadBalancingRules": [], + "probes": [], + "inboundNatRules": [], + "outboundNatRules": [], + "inboundNatPools": [] + } + } + ] +}