Implements listAll operation for VirtualNetworkAPI (#33)

* Implements listAll operation for VirtualNetworkAPI

Fixes test with proper method call

* Fixes resourcegroup param is now nullable
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 5a5a858..08a6769 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
@@ -106,7 +106,7 @@
     * @see <a href="https://msdn.microsoft.com/en-us/library/azure/mt163661.aspx">docs</a>
     */
    @Delegate
-   VirtualNetworkApi getVirtualNetworkApi(@PathParam("resourcegroup") String resourcegroup);
+   VirtualNetworkApi getVirtualNetworkApi(@Nullable @PathParam("resourcegroup") String resourcegroup);
 
 
    /**
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApi.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApi.java
index 5190d42..a569174 100644
--- a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApi.java
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApi.java
@@ -44,40 +44,51 @@
 import org.jclouds.rest.annotations.SelectJson;
 import org.jclouds.rest.binders.BindToJsonPayload;
 
-@Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/virtualNetworks")
+/**
+ * The Virtual Networks API includes operations for managing Azure virtual networks in your subscription.
+ *
+ * @see <a href="https://docs.microsoft.com/en-us/rest/api/virtualnetwork/virtualnetworks">docs</a>
+ */
+@Path("")
 @RequestFilters({ OAuthFilter.class, ApiVersionFilter.class })
 @Consumes(MediaType.APPLICATION_JSON)
 public interface VirtualNetworkApi {
 
    @Named("virtualnetwork:list")
+   @Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/virtualNetworks")
    @SelectJson("value")
    @GET
    @Fallback(EmptyListOnNotFoundOr404.class)
    List<VirtualNetwork> list();
 
+   @Named("loadbalancer:listall")
+   @GET
+   @Path("/providers/Microsoft.Network/virtualNetworks")
+   @SelectJson("value")
+   @Fallback(EmptyListOnNotFoundOr404.class)
+   List<VirtualNetwork> listAll();
+
    @Named("virtualnetwork:create_or_update")
-   @Path("/{virtualnetworkname}")
+   @Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/virtualNetworks/{virtualnetworkname}")
    @MapBinder(BindToJsonPayload.class)
    @PUT
-   VirtualNetwork createOrUpdate(@PathParam("virtualnetworkname") String virtualnetworkname,
-         @PayloadParam("location") String location, @Nullable @PayloadParam("tags") Map<String, String> tags,
+   VirtualNetwork createOrUpdate(@PathParam("virtualnetworkname") String virtualnetworkname, @PayloadParam("location") String location, @Nullable @PayloadParam("tags") Map<String, String> tags,
          @PayloadParam("properties") VirtualNetwork.VirtualNetworkProperties properties);
 
    @Named("virtualnetwork:get")
-   @Path("/{virtualnetworkname}")
+   @Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/virtualNetworks/{virtualnetworkname}")
    @GET
    @Fallback(NullOnNotFoundOr404.class)
    VirtualNetwork get(@PathParam("virtualnetworkname") String virtualnetworkname);
 
    @Named("virtualnetwork:delete")
-   @Path("/{virtualnetworkname}")
+   @Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/virtualNetworks/{virtualnetworkname}")
    @DELETE
    @ResponseParser(FalseOn204.class)
    boolean delete(@PathParam("virtualnetworkname") String virtualnetworkname);
 
    @Named("virtualnetwork:check_ip_address_availability")
-   @Path("/{virtualnetworkname}/CheckIPAddressAvailability")
+   @Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/virtualNetworks/{virtualnetworkname}/CheckIPAddressAvailability")
    @GET
-   IpAddressAvailabilityResult checkIPAddressAvailability(@PathParam("virtualnetworkname") String virtualnetworkname,
-         @QueryParam("ipAddress") String ipAddress);
+   IpAddressAvailabilityResult checkIPAddressAvailability(@PathParam("virtualnetworkname") String virtualnetworkname, @QueryParam("ipAddress") String ipAddress);
 }
diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApiLiveTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApiLiveTest.java
index 6fde059..fe47074 100644
--- a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApiLiveTest.java
+++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApiLiveTest.java
@@ -16,6 +16,7 @@
  */
 package org.jclouds.azurecompute.arm.features;
 
+import static com.google.common.collect.Iterables.any;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
@@ -39,6 +40,7 @@
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 
 @Test(groups = "live", singleThreaded = true)
@@ -49,7 +51,7 @@
    private static final String TEST_IP_ADDRESS_USED_IN_PROVIDER = "10.20.0.7";
 
    private String virtualNetworkName;
-
+   private VirtualNetwork vn;
 
    @BeforeClass
    @Override
@@ -75,7 +77,7 @@
             .builder().subnets(ImmutableList.<Subnet> of(subnet))
             .addressSpace(AddressSpace.create(Arrays.asList(TEST_VIRTUALNETWORK_ADDRESS_PREFIX))).build();
 
-      VirtualNetwork vn = api().createOrUpdate(virtualNetworkName, LOCATION, null, virtualNetworkProperties);
+      vn = api().createOrUpdate(virtualNetworkName, LOCATION, null, virtualNetworkProperties);
 
       networkAvailablePredicate.create(resourceGroupName).apply(virtualNetworkName);
 
@@ -95,7 +97,31 @@
    @Test(dependsOnMethods = "createVirtualNetwork")
    public void listVirtualNetworks() {
       List<VirtualNetwork> vnList = api().list();
+
+      assertNotNull(vnList);
       assertTrue(vnList.size() > 0);
+
+      assertTrue(any(vnList, new Predicate<VirtualNetwork>() {
+         @Override
+         public boolean apply(VirtualNetwork input) {
+            return vn.name().equals(input.name());
+         }
+      }));
+   }
+
+   @Test(dependsOnMethods = "createVirtualNetwork")
+   public void listAllVirtualNetworks() {
+      List<VirtualNetwork> vnList = api.getVirtualNetworkApi(null).listAll();
+
+      assertNotNull(vnList);
+      assertTrue(vnList.size() > 0);
+
+      assertTrue(any(vnList, new Predicate<VirtualNetwork>() {
+         @Override
+         public boolean apply(VirtualNetwork input) {
+            return vn.name().equals(input.name());
+         }
+      }));
    }
 
    @Test(dependsOnMethods = "getVirtualNetwork")
@@ -115,7 +141,7 @@
       deleteLoadBalancer(lbCreated);
    }
 
-   @Test(dependsOnMethods = { "listVirtualNetworks", "getVirtualNetwork", "checkIpAvailability" }, alwaysRun = true)
+   @Test(dependsOnMethods = { "listVirtualNetworks", "listAllVirtualNetworks", "getVirtualNetwork", "checkIpAvailability" }, alwaysRun = true)
    public void deleteVirtualNetwork() {
       boolean status = api().delete(virtualNetworkName);
       assertTrue(status);
diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApiMockTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApiMockTest.java
index 11f7fe3..419f86d 100644
--- a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApiMockTest.java
+++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApiMockTest.java
@@ -94,6 +94,17 @@
       assertEquals(vnList.size(), 3);
    }
 
+   public void listAllVirtualNetworks() throws InterruptedException {
+      server.enqueue(jsonResponse("/listvirtualnetworksall.json"));
+
+      final VirtualNetworkApi vnApi = api.getVirtualNetworkApi(null);
+      List<VirtualNetwork> vnList = vnApi.listAll();
+      String path = String.format("/subscriptions/%s/providers/Microsoft.Network/virtualNetworks?%s", subscriptionid, apiVersion);
+
+      assertSent(server, "GET", path);
+      assertEquals(vnList.size(), 4);
+   }
+
    public void listVirtualNetworkReturns404() throws InterruptedException {
       server.enqueue(response404());
 
diff --git a/providers/azurecompute-arm/src/test/resources/listvirtualnetworksall.json b/providers/azurecompute-arm/src/test/resources/listvirtualnetworksall.json
new file mode 100644
index 0000000..d0deadd
--- /dev/null
+++ b/providers/azurecompute-arm/src/test/resources/listvirtualnetworksall.json
@@ -0,0 +1,99 @@
+{
+  "value": [
+    {
+      "name": "mockvirtualnetwork",
+      "id": "/subscriptions/6b6748c8-3e69-4e27-9b71-df97a81c0bbc/resourceGroups/azurearmtesting/providers/Microsoft.Network/virtualNetworks/mockvirtualnetwork",
+      "etag": "W/\"0dcd223f-670c-49ca-abe7-5978d127c131\"",
+      "type": "Microsoft.Network/virtualNetworks",
+      "location": "westeurope",
+      "tags": {
+        "key": "value"
+      },
+      "properties": {
+        "provisioningState": "Succeeded",
+        "resourceGuid": "1568c76a-73a4-4a60-8dfb-53b823197ccb",
+        "addressSpace": {
+          "addressPrefixes": [
+            "10.2.0.0/16"
+          ]
+        },
+        "subnets": []
+      }
+    },
+    {
+      "name": "anothervirtualnetworks",
+      "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/azurearmtesting/providers/Microsoft.Network/virtualNetworks/anothervirtualnetworks",
+      "etag": "W/\"7604d8fe-f3b8-4fd4-ae52-ab503cc29097\"",
+      "type": "Microsoft.Network/virtualNetworks",
+      "location": "westeurope",
+      "tags": {
+        "key": "value"
+      },
+      "properties": {
+        "provisioningState": "Succeeded",
+        "resourceGuid": "5192bdb3-f6ed-44ad-bf4c-059cff905791",
+        "addressSpace": {
+          "addressPrefixes": [
+            "10.2.0.0/16"
+          ]
+        },
+        "subnets": []
+      }
+    },
+    {
+      "name": "myvirtualnetwork",
+      "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/azurearmtesting/providers/Microsoft.Network/virtualNetworks/myvirtualnetwork",
+      "etag": "W/\"bc7e1d77-eec0-4b91-ae80-afc33cf3c867\"",
+      "type": "Microsoft.Network/virtualNetworks",
+      "location": "westeurope",
+      "tags": {
+        "key": "value"
+      },
+      "properties": {
+        "provisioningState": "Succeeded",
+        "resourceGuid": "8da85637-833c-4445-a681-81ca3fb90044",
+        "addressSpace": {
+          "addressPrefixes": [
+            "10.2.0.0/16"
+          ]
+        },
+        "subnets": [
+          {
+            "name": "mysubnet",
+            "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/azurearmtesting/providers/Microsoft.Network/virtualNetworks/myvirtualnetwork/subnets/mysubnet",
+            "etag": "W/\"bc7e1d77-eec0-4b91-ae80-afc33cf3c867\"",
+            "properties": {
+              "provisioningState": "Succeeded",
+              "addressPrefix": "10.2.0.0/24",
+              "ipConfigurations": [
+                {
+                  "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/azurearmtesting/providers/Microsoft.Network/networkInterfaces/myNic/ipConfigurations/myip1"
+                }
+              ]
+            }
+          }
+        ]
+      }
+    },
+    {
+      "name": "mockvirtualnetworkextra",
+      "id": "/subscriptions/6b6748c8-3e69-4e27-9b71-df97a81c0bbc/resourceGroups/other-rg/providers/Microsoft.Network/virtualNetworks/mockvirtualnetwork",
+      "etag": "W/\"0dcd223f-670c-49ca-abe7-5978d127c131\"",
+      "type": "Microsoft.Network/virtualNetworks",
+      "location": "westeurope",
+      "tags": {
+        "key": "value"
+      },
+      "properties": {
+        "provisioningState": "Succeeded",
+        "resourceGuid": "1568c76a-73a4-4a60-8dfb-53b823197ccb",
+        "addressSpace": {
+          "addressPrefixes": [
+            "10.2.0.0/16"
+          ]
+        },
+        "subnets": []
+      }
+    }
+  ]
+}