You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2018/07/03 10:51:59 UTC

[2/3] jclouds git commit: Added Virtual Network Gateway API

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IPSecEncryption.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IPSecEncryption.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IPSecEncryption.java
new file mode 100644
index 0000000..a9405c5
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IPSecEncryption.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import org.jclouds.azurecompute.arm.util.GetEnumValue;
+
+public enum IPSecEncryption {
+
+   AES128, AES192, AES256, DES, DES3, GCMAES128, GCMAES192, GCMAES256, None, Unrecognized;
+
+   public static IPSecEncryption fromValue(final String text) {
+      return (IPSecEncryption) GetEnumValue.fromValueOrDefault(text, IPSecEncryption.Unrecognized);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IPSecIntegrity.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IPSecIntegrity.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IPSecIntegrity.java
new file mode 100644
index 0000000..02dc6ee
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IPSecIntegrity.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import org.jclouds.azurecompute.arm.util.GetEnumValue;
+
+public enum IPSecIntegrity {
+
+   GCMAES128, GCMAES192, GCMAES256, MD5, SHA1, SHA256, Unrecognized;
+
+   public static IPSecIntegrity fromValue(final String text) {
+      return (IPSecIntegrity) GetEnumValue.fromValueOrDefault(text, IPSecIntegrity.Unrecognized);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IPSecPolicy.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IPSecPolicy.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IPSecPolicy.java
new file mode 100644
index 0000000..d744fb0
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IPSecPolicy.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import org.jclouds.azurecompute.arm.domain.AddressSpace;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class IPSecPolicy {
+   @Nullable public abstract String radiusServerAddress();
+   @Nullable public abstract String radiusServerSecret();
+   @Nullable public abstract AddressSpace vpnClientAddressPool();
+   @Nullable public abstract DHGroup dhGroup();
+   @Nullable public abstract IkeEncryption ikeEncryption();
+   @Nullable public abstract IkeIntegrity ikeIntegrity();
+   @Nullable public abstract IPSecEncryption ipsecEncryption();
+   @Nullable public abstract IPSecIntegrity ipsecIntegrity();
+   @Nullable public abstract PFSGroup pfsGroup();
+   @Nullable public abstract Integer saDataSizeKilobytes();
+   @Nullable public abstract Integer saLifeTimeSeconds();
+
+   IPSecPolicy() {
+
+   }
+   
+   @SerializedNames({ "radiusServerAddress", "radiusServerSecret", "vpnClientAddressPool", "dhGroup", "ikeEncryption",
+         "ikeIntegrity", "ipsecEncryption", "ipsecIntegrity", "pfsGroup", "saDataSizeKilobytes", "saLifeTimeSeconds" })
+   public static IPSecPolicy create(String radiusServerAddress, String radiusServerSecret,
+         AddressSpace vpnClientAddressPool, DHGroup dhGroup, IkeEncryption ikeEncryption, IkeIntegrity ikeIntegrity,
+         IPSecEncryption ipsecEncryption, IPSecIntegrity ipsecIntegrity, PFSGroup pfsGroup,
+         Integer saDataSizeKilobytes, Integer saLifeTimeSeconds) {
+      return builder().radiusServerAddress(radiusServerAddress).radiusServerSecret(radiusServerSecret)
+            .vpnClientAddressPool(vpnClientAddressPool).dhGroup(dhGroup).ikeEncryption(ikeEncryption)
+            .ikeIntegrity(ikeIntegrity).ipsecEncryption(ipsecEncryption).ipsecIntegrity(ipsecIntegrity)
+            .pfsGroup(pfsGroup).saDataSizeKilobytes(saDataSizeKilobytes).saLifeTimeSeconds(saLifeTimeSeconds).build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_IPSecPolicy.Builder();
+   }
+
+   public abstract Builder toBuilder();
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder radiusServerAddress(String radiusServerAddress);
+      public abstract Builder radiusServerSecret(String radiusServerSecret);
+      public abstract Builder vpnClientAddressPool(AddressSpace vpnClientAddressPool);
+      public abstract Builder dhGroup(DHGroup dhGroup);
+      public abstract Builder ikeEncryption(IkeEncryption ikeEncryption);
+      public abstract Builder ikeIntegrity(IkeIntegrity ikeIntegrity);
+      public abstract Builder ipsecEncryption(IPSecEncryption ipsecEncryption);
+      public abstract Builder ipsecIntegrity(IPSecIntegrity ipsecIntegrity);
+      public abstract Builder pfsGroup(PFSGroup pfsGroup);
+      public abstract Builder saDataSizeKilobytes(Integer saDataSizeKilobytes);
+      public abstract Builder saLifeTimeSeconds(Integer saLifeTimeSeconds);
+
+      public abstract IPSecPolicy build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IkeEncryption.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IkeEncryption.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IkeEncryption.java
new file mode 100644
index 0000000..0ac8637
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IkeEncryption.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import org.jclouds.azurecompute.arm.util.GetEnumValue;
+
+public enum IkeEncryption {
+
+   AES128, AES192, AES256, DES, DES3, GCMAES128, GCMAES256, Unrecognized;
+
+   public static IkeEncryption fromValue(final String text) {
+      return (IkeEncryption) GetEnumValue.fromValueOrDefault(text, IkeEncryption.Unrecognized);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IkeIntegrity.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IkeIntegrity.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IkeIntegrity.java
new file mode 100644
index 0000000..1697347
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/IkeIntegrity.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import org.jclouds.azurecompute.arm.util.GetEnumValue;
+
+public enum IkeIntegrity {
+
+   GCMAES128, GCMAES256, MD5, SHA1, SHA256, SHA384, Unrecognized;
+
+   public static IkeIntegrity fromValue(final String text) {
+      return (IkeIntegrity) GetEnumValue.fromValueOrDefault(text, IkeIntegrity.Unrecognized);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/LocalNetworkGateway.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/LocalNetworkGateway.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/LocalNetworkGateway.java
new file mode 100644
index 0000000..95d8fcd
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/LocalNetworkGateway.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import java.util.Map;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableMap;
+
+@AutoValue
+public abstract class LocalNetworkGateway {
+
+   @Nullable public abstract String id();
+   public abstract String name();
+   public abstract String location();
+   @Nullable public abstract String type();
+   @Nullable public abstract Map<String, String> tags();
+   @Nullable public abstract String etag();
+   public abstract LocalNetworkGatewayProperties properties();
+
+   LocalNetworkGateway() {
+
+   }
+
+   @SerializedNames({ "id", "name", "location", "type", "tags", "etag", "properties" })
+   public static LocalNetworkGateway create(String id, String name, String location, String type,
+         Map<String, String> tags, String etag, LocalNetworkGatewayProperties properties) {
+      return builder(name, location, properties).id(id).type(type).tags(tags).etag(etag).build();
+   }
+
+   public abstract Builder toBuilder();
+
+   public static Builder builder(String name, String location, LocalNetworkGatewayProperties properties) {
+      return new AutoValue_LocalNetworkGateway.Builder().name(name).location(location).properties(properties);
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder id(String id);
+      public abstract Builder name(String name);
+      public abstract Builder location(String location);
+      public abstract Builder type(String type);
+      public abstract Builder tags(Map<String, String> tags);
+      public abstract Builder etag(String etag);
+      public abstract Builder properties(LocalNetworkGatewayProperties properties);
+
+      abstract Map<String, String> tags();
+      abstract LocalNetworkGateway autoBuild();
+
+      public LocalNetworkGateway build() {
+         tags(tags() != null ? ImmutableMap.copyOf(tags()) : null);
+         return autoBuild();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/LocalNetworkGatewayProperties.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/LocalNetworkGatewayProperties.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/LocalNetworkGatewayProperties.java
new file mode 100644
index 0000000..031dcb9
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/LocalNetworkGatewayProperties.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import org.jclouds.azurecompute.arm.domain.AddressSpace;
+import org.jclouds.azurecompute.arm.domain.Provisionable;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class LocalNetworkGatewayProperties implements Provisionable {
+   
+   @Nullable public abstract BGPSettings bgpSettings();
+   public abstract String gatewayIpAddress();
+   @Nullable public abstract AddressSpace localNetworkAddressSpace();
+   @Nullable public abstract String provisioningState();
+   @Nullable public abstract String resourceGuid();
+
+   @SerializedNames({ "bgpSettings", "gatewayIpAddress", "localNetworkAddressSpace", "provisioningState",
+         "resourceGuid" })
+   public static LocalNetworkGatewayProperties create(BGPSettings bgpSettings, String gatewayIpAddress,
+         AddressSpace localNetworkAddressSpace, String provisioningState, String resourceGuid) {
+      return builder(gatewayIpAddress).bgpSettings(bgpSettings).localNetworkAddressSpace(localNetworkAddressSpace)
+            .provisioningState(provisioningState).resourceGuid(resourceGuid).build();
+   }
+
+   LocalNetworkGatewayProperties() {
+
+   }
+
+   public abstract LocalNetworkGatewayProperties.Builder toBuilder();
+
+   public static LocalNetworkGatewayProperties.Builder builder(String gatewayIpAddress) {
+      return new AutoValue_LocalNetworkGatewayProperties.Builder().gatewayIpAddress(gatewayIpAddress);
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder bgpSettings(BGPSettings bgpSettings);
+      public abstract Builder gatewayIpAddress(String gatewayIpAddress);
+      public abstract Builder localNetworkAddressSpace(AddressSpace localNetworkAddressSpace);
+      public abstract Builder provisioningState(String provisioningState);
+      public abstract Builder resourceGuid(String resourceGuid);
+
+      public abstract LocalNetworkGatewayProperties build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/PFSGroup.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/PFSGroup.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/PFSGroup.java
new file mode 100644
index 0000000..5ff43ae
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/PFSGroup.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import org.jclouds.azurecompute.arm.util.GetEnumValue;
+
+public enum PFSGroup {
+
+   ECP256, ECP384, PFS1, PFS14, PFS2, PFS2048, PFS24, PFSMM, None, Unrecognized;
+
+   public static PFSGroup fromValue(final String text) {
+      return (PFSGroup) GetEnumValue.fromValueOrDefault(text, PFSGroup.Unrecognized);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/SKU.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/SKU.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/SKU.java
new file mode 100644
index 0000000..9ddf18a
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/SKU.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import org.jclouds.azurecompute.arm.util.GetEnumValue;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class SKU {
+
+   public static enum SKUName {
+      Basic, HighPerformance, Standard, UltraPerformance, VpnGw1, VpnGw2, VpnGw3, Unrecognized;
+
+      public static SKUName fromValue(final String text) {
+         return (SKUName) GetEnumValue.fromValueOrDefault(text, SKUName.Unrecognized);
+      }
+   }
+
+   public static enum SKUTier {
+      Basic, HighPerformance, Standard, UltraPerformance, VpnGw1, VpnGw2, VpnGw3, Unrecognized;
+
+      public static SKUTier fromValue(final String text) {
+         return (SKUTier) GetEnumValue.fromValueOrDefault(text, SKUTier.Unrecognized);
+      }
+   }
+
+   public abstract int capacity();
+   public abstract SKUName name();
+   public abstract SKUTier tier();
+
+   SKU() {
+
+   }
+
+   @SerializedNames({ "capacity", "name", "tier" })
+   public static SKU create(int capacity, SKUName name, SKUTier tier) {
+      return new AutoValue_SKU(capacity, name, tier);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNClientConfiguration.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNClientConfiguration.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNClientConfiguration.java
new file mode 100644
index 0000000..14871c0
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNClientConfiguration.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import java.util.List;
+
+import org.jclouds.azurecompute.arm.domain.AddressSpace;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+
+@AutoValue
+public abstract class VPNClientConfiguration {
+   @Nullable public abstract String radiusServerAddress();
+   @Nullable public abstract String radiusServerSecret();
+   @Nullable public abstract AddressSpace vpnClientAddressPool();
+   public abstract List<IPSecPolicy> vpnClientIpsecPolicies();
+   public abstract List<String> vpnClientProtocols();
+   public abstract List<VPNClientRevokedCertificate> vpnClientRevokedCertificates();
+   public abstract List<VPNClientRootCertificate> vpnClientRootCertificates();
+   
+   VPNClientConfiguration() {
+      
+   }
+
+   @SerializedNames({ "radiusServerAddress", "radiusServerSecret", "vpnClientAddressPool", "vpnClientIpsecPolicies",
+         "vpnClientProtocols", "vpnClientRevokedCertificates", "vpnClientRootCertificates" })
+   public static VPNClientConfiguration create(String radiusServerAddress, String radiusServerSecret,
+         AddressSpace vpnClientAddressPool, List<IPSecPolicy> vpnClientIpsecPolicies, List<String> vpnClientProtocols,
+         List<VPNClientRevokedCertificate> vpnClientRevokedCertificates,
+         List<VPNClientRootCertificate> vpnClientRootCertificates) {
+      return builder().radiusServerAddress(radiusServerAddress).radiusServerSecret(radiusServerSecret)
+            .vpnClientAddressPool(vpnClientAddressPool).vpnClientIpsecPolicies(vpnClientIpsecPolicies)
+            .vpnClientProtocols(vpnClientProtocols).vpnClientRevokedCertificates(vpnClientRevokedCertificates)
+            .vpnClientRootCertificates(vpnClientRootCertificates).build();
+   }
+   
+   public static Builder builder() {
+      return new AutoValue_VPNClientConfiguration.Builder();
+   }
+   
+   public abstract Builder toBuilder();
+   
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder radiusServerAddress(String radiusServerAddress);
+      public abstract Builder radiusServerSecret(String radiusServerSecret);
+      public abstract Builder vpnClientAddressPool(AddressSpace vpnClientAddressPool);
+      public abstract Builder vpnClientIpsecPolicies(List<IPSecPolicy> vpnClientIpsecPolicies);
+      public abstract Builder vpnClientProtocols(List<String> vpnClientProtocols);
+      public abstract Builder vpnClientRevokedCertificates(List<VPNClientRevokedCertificate> vpnClientRevokedCertificates);
+      public abstract Builder vpnClientRootCertificates(List<VPNClientRootCertificate> vpnClientRootCertificates);
+      
+      abstract List<IPSecPolicy> vpnClientIpsecPolicies();
+      abstract List<String> vpnClientProtocols();
+      abstract List<VPNClientRevokedCertificate> vpnClientRevokedCertificates();
+      abstract List<VPNClientRootCertificate> vpnClientRootCertificates();
+      abstract VPNClientConfiguration autoBuild();
+      
+      public VPNClientConfiguration build() {
+         vpnClientIpsecPolicies(vpnClientIpsecPolicies() == null ? ImmutableList.<IPSecPolicy> of() : ImmutableList
+               .copyOf(vpnClientIpsecPolicies()));
+         vpnClientProtocols(vpnClientProtocols() == null ? ImmutableList.<String> of() : ImmutableList
+               .copyOf(vpnClientProtocols()));
+         vpnClientRevokedCertificates(vpnClientRevokedCertificates() == null ? ImmutableList
+               .<VPNClientRevokedCertificate> of() : ImmutableList.copyOf(vpnClientRevokedCertificates()));
+         vpnClientRootCertificates(vpnClientRootCertificates() == null ? ImmutableList.<VPNClientRootCertificate> of()
+               : ImmutableList.copyOf(vpnClientRootCertificates()));
+         
+         return autoBuild();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNClientRevokedCertificate.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNClientRevokedCertificate.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNClientRevokedCertificate.java
new file mode 100644
index 0000000..39232cc
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNClientRevokedCertificate.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import org.jclouds.azurecompute.arm.domain.Provisionable;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class VPNClientRevokedCertificate {
+   @Nullable public abstract String id();
+   public abstract String name();
+   @Nullable public abstract String etag();
+   public abstract VPNClientRevokedCertificateProperties properties();
+
+   VPNClientRevokedCertificate() {
+
+   }
+
+   @SerializedNames({ "id", "name", "etag", "properties" })
+   public static VPNClientRevokedCertificate create(String id, String name, String etag,
+         VPNClientRevokedCertificateProperties properties) {
+      return new AutoValue_VPNClientRevokedCertificate(id, name, etag, properties);
+   }
+
+   @AutoValue
+   public abstract static class VPNClientRevokedCertificateProperties implements Provisionable {
+      public abstract String provisioningState();
+      public abstract String thumbprint();
+
+      VPNClientRevokedCertificateProperties() {
+
+      }
+
+      @SerializedNames({ "provisioningState", "thumbprint" })
+      public static VPNClientRevokedCertificateProperties create(String provisioningState, String thumbprint) {
+         return new AutoValue_VPNClientRevokedCertificate_VPNClientRevokedCertificateProperties(provisioningState,
+               thumbprint);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNClientRootCertificate.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNClientRootCertificate.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNClientRootCertificate.java
new file mode 100644
index 0000000..0271c32
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNClientRootCertificate.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import org.jclouds.azurecompute.arm.domain.Provisionable;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class VPNClientRootCertificate {
+   @Nullable public abstract String id();
+   public abstract String name();
+   @Nullable public abstract String etag();
+   public abstract VPNClientRootCertificateProperties properties();
+
+   VPNClientRootCertificate() {
+
+   }
+
+   @SerializedNames({ "id", "name", "etag", "properties" })
+   public static VPNClientRootCertificate create(String id, String name, String etag,
+         VPNClientRootCertificateProperties properties) {
+      return new AutoValue_VPNClientRootCertificate(id, name, etag, properties);
+   }
+
+   @AutoValue
+   public abstract static class VPNClientRootCertificateProperties implements Provisionable {
+      public abstract String provisioningState();
+      public abstract String publicCertData();
+
+      VPNClientRootCertificateProperties() {
+
+      }
+
+      @SerializedNames({ "provisioningState", "publicCertData" })
+      public static VPNClientRootCertificateProperties create(String provisioningState, String publicCertData) {
+         return new AutoValue_VPNClientRootCertificate_VPNClientRootCertificateProperties(provisioningState,
+               publicCertData);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNType.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNType.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNType.java
new file mode 100644
index 0000000..d65cacf
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VPNType.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import org.jclouds.azurecompute.arm.util.GetEnumValue;
+
+public enum VPNType {
+   PolicyBased, RouteBased, Unrecognized;
+
+   public static VPNType fromValue(final String text) {
+      return (VPNType) GetEnumValue.fromValueOrDefault(text, VPNType.Unrecognized);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGateway.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGateway.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGateway.java
new file mode 100644
index 0000000..68f9579
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGateway.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import java.util.Map;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableMap;
+
+@AutoValue
+public abstract class VirtualNetworkGateway {
+
+   @Nullable public abstract String id();
+   public abstract String name();
+   public abstract String location();
+   @Nullable public abstract String type();
+   @Nullable public abstract Map<String, String> tags();
+   @Nullable public abstract String etag();
+   public abstract VirtualNetworkGatewayProperties properties();
+
+   VirtualNetworkGateway() {
+
+   }
+
+   @SerializedNames({ "id", "name", "location", "type", "tags", "etag", "properties" })
+   public static VirtualNetworkGateway create(String id, String name, String location, String type,
+         Map<String, String> tags, String etag, VirtualNetworkGatewayProperties properties) {
+      return builder(name, location, properties).id(id).type(type).tags(tags).etag(etag).build();
+   }
+
+   public abstract Builder toBuilder();
+
+   public static Builder builder(String name, String location, VirtualNetworkGatewayProperties properties) {
+      return new AutoValue_VirtualNetworkGateway.Builder().name(name).location(location).properties(properties);
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder id(String id);
+      public abstract Builder name(String name);
+      public abstract Builder location(String location);
+      public abstract Builder type(String type);
+      public abstract Builder tags(Map<String, String> tags);
+      public abstract Builder etag(String etag);
+      public abstract Builder properties(VirtualNetworkGatewayProperties properties);
+
+      abstract Map<String, String> tags();
+      abstract VirtualNetworkGateway autoBuild();
+
+      public VirtualNetworkGateway build() {
+         tags(tags() != null ? ImmutableMap.copyOf(tags()) : null);
+         return autoBuild();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGatewayProperties.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGatewayProperties.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGatewayProperties.java
new file mode 100644
index 0000000..1d30f5f
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGatewayProperties.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import java.util.List;
+
+import org.jclouds.azurecompute.arm.domain.IdReference;
+import org.jclouds.azurecompute.arm.domain.IpAllocationMethod;
+import org.jclouds.azurecompute.arm.domain.Provisionable;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+
+@AutoValue
+public abstract class VirtualNetworkGatewayProperties implements Provisionable {
+   
+   @Nullable public abstract Boolean activeActive();
+   @Nullable public abstract BGPSettings bgpSettings();
+   public abstract boolean enableBGP();
+   @Nullable public abstract IdReference gatewayDefaultSite();
+   public abstract VirtualNetworkGatewayType gatewayType();
+   public abstract List<IpConfiguration> ipConfigurations();
+   @Nullable public abstract String provisioningState();
+   @Nullable public abstract String resourceGuid();
+   public abstract SKU sku();
+   @Nullable public abstract VPNClientConfiguration vpnClientConfiguration();
+   @Nullable public abstract VPNType vpnType();
+
+   VirtualNetworkGatewayProperties() {
+
+   }
+   
+   @SerializedNames({ "activeActive", "bgpSettings", "enableBgp", "gatewayDefaultSite", "gatewayType",
+         "ipConfigurations", "provisioningState", "resourceGuid", "sku", "vpnClientConfiguration", "vpnType" })
+   public static VirtualNetworkGatewayProperties create(Boolean activeActive, BGPSettings bgpSettings,
+         boolean enableBGP, IdReference gatewayDefaultSite, VirtualNetworkGatewayType gatewayType,
+         List<IpConfiguration> ipConfigurations, String provisioningState, String resourceGuid, SKU sku,
+         VPNClientConfiguration vpnClientConfiguration, VPNType vpnType) {
+      return builder(enableBGP, gatewayType, sku).activeActive(activeActive).bgpSettings(bgpSettings)
+            .gatewayDefaultSite(gatewayDefaultSite).ipConfigurations(ipConfigurations)
+            .provisioningState(provisioningState).resourceGuid(resourceGuid)
+            .vpnClientConfiguration(vpnClientConfiguration).vpnType(vpnType).build();
+   }
+   
+   public static Builder builder(boolean enableBGP, VirtualNetworkGatewayType virtualNetworkGatewayType, SKU sku) {
+      return new AutoValue_VirtualNetworkGatewayProperties.Builder().enableBGP(enableBGP)
+            .gatewayType(virtualNetworkGatewayType).sku(sku);
+   }
+   
+   public abstract Builder toBuilder();
+   
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder activeActive( Boolean activeActive);
+      public abstract Builder bgpSettings(BGPSettings bgpSettings);
+      public abstract Builder enableBGP(boolean enableBG);
+      public abstract Builder gatewayDefaultSite(IdReference gatewayDefaultSite);
+      public abstract Builder gatewayType(VirtualNetworkGatewayType gatewayType);
+      public abstract Builder ipConfigurations(List<IpConfiguration> ipConfigurations);
+      public abstract Builder provisioningState(String provisioningState);
+      public abstract Builder resourceGuid(String resourceGuid);
+      public abstract Builder sku(SKU sku);
+      public abstract Builder vpnClientConfiguration(VPNClientConfiguration vpnClientConfiguration);
+      public abstract Builder vpnType(VPNType vpnType);
+      
+      abstract List<IpConfiguration> ipConfigurations();
+      abstract VirtualNetworkGatewayProperties autoBuild();
+
+      public VirtualNetworkGatewayProperties build() {
+         ipConfigurations(ipConfigurations() == null ? ImmutableList.<IpConfiguration> of() : ImmutableList
+               .copyOf(ipConfigurations()));
+         return autoBuild();
+      }
+   }
+   
+   @AutoValue
+   public abstract static class IpConfiguration {
+      @Nullable public abstract String id();
+      public abstract String name();
+      @Nullable public abstract String etag();
+      public abstract IpConfigurationProperties properties();
+      
+      IpConfiguration() {
+
+      }
+
+      @SerializedNames({ "id", "name", "etag", "properties" })
+      public static IpConfiguration create(String id, String name, String etag, IpConfigurationProperties properties) {
+         return new AutoValue_VirtualNetworkGatewayProperties_IpConfiguration(id, name, etag, properties);
+      }
+      
+      @AutoValue
+      public abstract static class IpConfigurationProperties implements Provisionable {
+         public abstract IpAllocationMethod privateIPAllocationMethod();
+         @Nullable public abstract String provisioningState();
+         @Nullable public abstract IdReference publicIPAddress();
+         @Nullable public abstract IdReference subnet();
+         
+         @SerializedNames({ "privateIPAllocationMethod", "provisioningState", "publicIPAddress", "subnet" })
+         public static IpConfigurationProperties create(IpAllocationMethod privateIPAllocationMethod,
+               String provisioningState, IdReference publicIPAddress, IdReference subnet) {
+            return builder(privateIPAllocationMethod).provisioningState(provisioningState)
+                  .publicIPAddress(publicIPAddress).subnet(subnet).build();
+         }
+
+         IpConfigurationProperties() {
+
+         }
+         
+         public static Builder builder(IpAllocationMethod privateIPAllocationMethod) {
+            return new AutoValue_VirtualNetworkGatewayProperties_IpConfiguration_IpConfigurationProperties.Builder()
+                  .privateIPAllocationMethod(privateIPAllocationMethod);
+         }
+         
+         public abstract Builder toBuilder();
+         
+         @AutoValue.Builder
+         public abstract static class Builder {
+            public abstract Builder privateIPAllocationMethod(IpAllocationMethod privateIPAllocationMethod);
+            public abstract Builder provisioningState(String provisioningState);
+            public abstract Builder publicIPAddress(IdReference publicIPAddress);
+            public abstract Builder subnet(IdReference subnet);
+
+            public abstract IpConfigurationProperties build();
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGatewayType.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGatewayType.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGatewayType.java
new file mode 100644
index 0000000..46ec025
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGatewayType.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain.vpn;
+
+import org.jclouds.azurecompute.arm.util.GetEnumValue;
+
+public enum VirtualNetworkGatewayType {
+   ExpressRoute, Vpn, Unrecognized;
+
+   public static VirtualNetworkGatewayType fromValue(final String text) {
+      return (VirtualNetworkGatewayType) GetEnumValue.fromValueOrDefault(text,
+            VirtualNetworkGatewayType.Unrecognized);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApi.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApi.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApi.java
index a868e40..4d8af39 100644
--- a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApi.java
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApi.java
@@ -32,8 +32,8 @@ import javax.ws.rs.core.MediaType;
 
 import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
-import org.jclouds.azurecompute.arm.domain.LocalNetworkGateway;
-import org.jclouds.azurecompute.arm.domain.LocalNetworkGatewayProperties;
+import org.jclouds.azurecompute.arm.domain.vpn.LocalNetworkGateway;
+import org.jclouds.azurecompute.arm.domain.vpn.LocalNetworkGatewayProperties;
 import org.jclouds.azurecompute.arm.filters.ApiVersionFilter;
 import org.jclouds.azurecompute.arm.functions.URIParser;
 import org.jclouds.javax.annotation.Nullable;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayApi.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayApi.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayApi.java
new file mode 100644
index 0000000..0fb62c3
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayApi.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.features;
+
+import java.io.Closeable;
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGateway;
+import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayProperties;
+import org.jclouds.azurecompute.arm.filters.ApiVersionFilter;
+import org.jclouds.azurecompute.arm.functions.URIParser;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.oauth.v2.filters.OAuthFilter;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+@Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/virtualNetworkGateways")
+@RequestFilters({ OAuthFilter.class, ApiVersionFilter.class })
+@Consumes(MediaType.APPLICATION_JSON)
+public interface VirtualNetworkGatewayApi extends Closeable {
+
+   @Named("virtualnetworkgateway:list")
+   @GET
+   @SelectJson("value")
+   @Fallback(EmptyListOnNotFoundOr404.class)
+   List<VirtualNetworkGateway> list();
+
+   @Named("virtualnetworkgateway:get")
+   @Path("/{name}")
+   @GET
+   @Fallback(NullOnNotFoundOr404.class)
+   VirtualNetworkGateway get(@PathParam("name") String name);
+
+   @Named("virtualnetworkgateway:createOrUpdate")
+   @MapBinder(BindToJsonPayload.class)
+   @Path("/{name}")
+   @PUT
+   VirtualNetworkGateway createOrUpdate(@PathParam("name") String name, @PayloadParam("location") String location,
+         @Nullable @PayloadParam("tags") Map<String, String> tags,
+         @PayloadParam("properties") VirtualNetworkGatewayProperties properties);
+
+   @Named("virtualnetworkgateway:delete")
+   @Path("/{name}")
+   @DELETE
+   @ResponseParser(URIParser.class)
+   @Fallback(NullOnNotFoundOr404.class)
+   URI delete(@PathParam("name") String name);
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApiLiveTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApiLiveTest.java
index 301df03..bdf26ee 100644
--- a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApiLiveTest.java
+++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApiLiveTest.java
@@ -23,10 +23,10 @@ import static org.testng.Assert.assertTrue;
 
 import java.net.URI;
 
-import org.jclouds.azurecompute.arm.domain.LocalNetworkGateway;
-import org.jclouds.azurecompute.arm.domain.LocalNetworkGatewayProperties;
-import org.jclouds.azurecompute.arm.domain.LocalNetworkGatewayProperties.AddressSpace;
+import org.jclouds.azurecompute.arm.domain.AddressSpace;
 import org.jclouds.azurecompute.arm.domain.Provisionable;
+import org.jclouds.azurecompute.arm.domain.vpn.LocalNetworkGateway;
+import org.jclouds.azurecompute.arm.domain.vpn.LocalNetworkGatewayProperties;
 import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiLiveTest;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
@@ -52,7 +52,7 @@ public class LocalNetworkGatewayApiLiveTest extends BaseAzureComputeApiLiveTest
    @Test
    public void createLocalNetworkGateway() {
       AddressSpace localAddresses = AddressSpace.create(ImmutableList.of("192.168.0.0/24"));
-      LocalNetworkGatewayProperties props = LocalNetworkGatewayProperties.builder().gatewayIpAddress("1.2.3.4")
+      LocalNetworkGatewayProperties props = LocalNetworkGatewayProperties.builder("1.2.3.4")
             .localNetworkAddressSpace(localAddresses).build();
 
       LocalNetworkGateway gw = api().createOrUpdate(name, LOCATION, null, props);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApiMockTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApiMockTest.java
index 840c872..e7efa71 100644
--- a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApiMockTest.java
+++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/LocalNetworkGatewayApiMockTest.java
@@ -25,9 +25,9 @@ import static org.testng.Assert.assertTrue;
 import java.net.URI;
 import java.util.List;
 
-import org.jclouds.azurecompute.arm.domain.LocalNetworkGateway;
-import org.jclouds.azurecompute.arm.domain.LocalNetworkGatewayProperties;
-import org.jclouds.azurecompute.arm.domain.LocalNetworkGatewayProperties.AddressSpace;
+import org.jclouds.azurecompute.arm.domain.AddressSpace;
+import org.jclouds.azurecompute.arm.domain.vpn.LocalNetworkGateway;
+import org.jclouds.azurecompute.arm.domain.vpn.LocalNetworkGatewayProperties;
 import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiMockTest;
 import org.testng.annotations.Test;
 
@@ -46,7 +46,7 @@ public class LocalNetworkGatewayApiMockTest extends BaseAzureComputeApiMockTest
       LocalNetworkGatewayApi gwapi = api.getLocalNetworkGatewayApi(resourcegroup);
 
       AddressSpace localAddresses = AddressSpace.create(ImmutableList.of("192.168.0.0/24"));
-      LocalNetworkGatewayProperties props = LocalNetworkGatewayProperties.builder().gatewayIpAddress("1.2.3.4")
+      LocalNetworkGatewayProperties props = LocalNetworkGatewayProperties.builder("1.2.3.4")
             .localNetworkAddressSpace(localAddresses).build();
       LocalNetworkGateway gw = gwapi.createOrUpdate(name, "westeurope", null, props);
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApiLiveTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApiLiveTest.java
index d7caab0..0d1e6ca 100644
--- a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApiLiveTest.java
+++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApiLiveTest.java
@@ -49,7 +49,6 @@ public class NetworkInterfaceCardApiLiveTest extends BaseAzureComputeApiLiveTest
    public void setup() {
       super.setup();
       createTestResourceGroup();
-      assertNotNull(api.getResourceGroupApi().create(resourceGroupName, LOCATION, ImmutableMap.<String, String>of()));
       String virtualNetworkName = String.format("vn-%s-%s", this.getClass().getSimpleName().toLowerCase(), System.getProperty("user.name"));
       nicName = String.format("nic-%s-%s", this.getClass().getSimpleName().toLowerCase(), System.getProperty("user.name"));
       String subnetName = String.format("s-%s-%s", this.getClass().getSimpleName().toLowerCase(), System.getProperty("user.name"));

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApiLiveTest.java
----------------------------------------------------------------------
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 c0271d3..5a89b07 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
@@ -24,6 +24,7 @@ import static org.testng.Assert.assertTrue;
 import java.util.Arrays;
 import java.util.List;
 
+import org.jclouds.azurecompute.arm.domain.AddressSpace;
 import org.jclouds.azurecompute.arm.domain.VirtualNetwork;
 import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiLiveTest;
 import org.testng.annotations.BeforeClass;
@@ -53,7 +54,7 @@ public class VirtualNetworkApiLiveTest extends BaseAzureComputeApiLiveTest {
 
       final VirtualNetwork.VirtualNetworkProperties virtualNetworkProperties =
               VirtualNetwork.VirtualNetworkProperties.builder().addressSpace(
-                      VirtualNetwork.AddressSpace.create(Arrays.asList(DEFAULT_VIRTUALNETWORK_ADDRESS_PREFIX))).build();
+                      AddressSpace.create(Arrays.asList(DEFAULT_VIRTUALNETWORK_ADDRESS_PREFIX))).build();
 
       VirtualNetwork vn = api().createOrUpdate(virtualNetworkName, LOCATION, null, virtualNetworkProperties);
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApiMockTest.java
----------------------------------------------------------------------
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 8ba0406..2cf3a41 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
@@ -16,21 +16,19 @@
  */
 package org.jclouds.azurecompute.arm.features;
 
-import org.jclouds.azurecompute.arm.domain.VirtualNetwork;
-
-import org.testng.annotations.Test;
-
-import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiMockTest;
-
-import java.util.Arrays;
-import java.util.List;
-
 import static com.google.common.collect.Iterables.isEmpty;
-
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.jclouds.azurecompute.arm.domain.AddressSpace;
+import org.jclouds.azurecompute.arm.domain.VirtualNetwork;
+import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiMockTest;
+import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "VirtualNetworkApiMockTest", singleThreaded = true)
 public class VirtualNetworkApiMockTest extends BaseAzureComputeApiMockTest {
@@ -98,7 +96,7 @@ public class VirtualNetworkApiMockTest extends BaseAzureComputeApiMockTest {
 
       final VirtualNetwork.VirtualNetworkProperties virtualNetworkProperties =
               VirtualNetwork.VirtualNetworkProperties.create(null, null,
-                      VirtualNetwork.AddressSpace.create(Arrays.asList("10.2.0.0/16")), null);
+                      AddressSpace.create(Arrays.asList("10.2.0.0/16")), null);
 
 
       vnApi.createOrUpdate(virtualNetwork, location, null, virtualNetworkProperties);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayApiLiveTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayApiLiveTest.java
new file mode 100644
index 0000000..4faaf2d
--- /dev/null
+++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayApiLiveTest.java
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.features;
+
+import static com.google.common.collect.Iterables.any;
+import static java.util.Collections.singletonList;
+import static org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayType.Vpn;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+import java.util.Collections;
+
+import org.jclouds.azurecompute.arm.domain.IdReference;
+import org.jclouds.azurecompute.arm.domain.IpAllocationMethod;
+import org.jclouds.azurecompute.arm.domain.PublicIPAddress;
+import org.jclouds.azurecompute.arm.domain.PublicIPAddressProperties;
+import org.jclouds.azurecompute.arm.domain.Subnet;
+import org.jclouds.azurecompute.arm.domain.VirtualNetwork;
+import org.jclouds.azurecompute.arm.domain.vpn.SKU;
+import org.jclouds.azurecompute.arm.domain.vpn.SKU.SKUName;
+import org.jclouds.azurecompute.arm.domain.vpn.SKU.SKUTier;
+import org.jclouds.azurecompute.arm.domain.vpn.VPNType;
+import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGateway;
+import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayProperties;
+import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayProperties.IpConfiguration;
+import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayProperties.IpConfiguration.IpConfigurationProperties;
+import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiLiveTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableMap;
+
+@Test(groups = "live", testName = "VirtualNetworkGatewayApiLiveTest", singleThreaded = true)
+public class VirtualNetworkGatewayApiLiveTest extends BaseAzureComputeApiLiveTest {
+
+   private String name;
+   private String subnetId;
+   private PublicIPAddress publicIp;
+   private Predicate<String> virtualNetworkGatewayAvailable;
+
+   @BeforeClass
+   @Override
+   public void setup() {
+      super.setup();
+      createTestResourceGroup();
+      name = "jclouds-" + RAND;
+      virtualNetworkGatewayAvailable = virtualNetworkGatewayStatus.create(resourceGroupName);
+
+      VirtualNetwork vnet = createDefaultVirtualNetwork(resourceGroupName, name + "-net", "10.2.0.0/16", LOCATION);
+      Subnet subnet = createDefaultSubnet(resourceGroupName, Subnet.GATEWAY_SUBNET_NAME, vnet.name(), "10.2.0.0/23");
+      subnetId = subnet.id();
+
+      PublicIPAddressProperties props = PublicIPAddressProperties.builder()
+            .publicIPAllocationMethod(IpAllocationMethod.Dynamic.name()).idleTimeoutInMinutes(4).build();
+      publicIp = api.getPublicIPAddressApi(resourceGroupName).createOrUpdate(name + "-publicip", LOCATION,
+            Collections.<String, String> emptyMap(), props);
+   }
+
+   @Test
+   public void createVirtualNetworkGateway() {
+      IpConfigurationProperties ipprops = IpConfigurationProperties.builder(IpAllocationMethod.Dynamic)
+            .subnet(IdReference.create(subnetId)).publicIPAddress(IdReference.create(publicIp.id())).build();
+      IpConfiguration ipconf = IpConfiguration.create(null, name + "-ipconf", null, ipprops);
+
+      VirtualNetworkGatewayProperties props = VirtualNetworkGatewayProperties
+            .builder(false, Vpn, SKU.create(1, SKUName.Basic, SKUTier.Basic)).vpnType(VPNType.PolicyBased)
+            .ipConfigurations(singletonList(ipconf)).build();
+
+      VirtualNetworkGateway gw = api().createOrUpdate(name, LOCATION, null, props);
+
+      assertNotNull(gw);
+      assertEquals(gw.name(), name);
+      assertNotNull(gw.properties());
+   }
+
+   @Test(dependsOnMethods = "createVirtualNetworkGateway")
+   public void getVirtualNetworkGateway() {
+      assertNotNull(api().get(name));
+   }
+
+   @Test(dependsOnMethods = "createVirtualNetworkGateway")
+   public void listVirtualNetworkGateways() {
+      assertTrue(any(api().list(), new Predicate<VirtualNetworkGateway>() {
+         @Override
+         public boolean apply(VirtualNetworkGateway input) {
+            return name.equals(input.name());
+         }
+      }));
+   }
+
+   @Test(dependsOnMethods = "createVirtualNetworkGateway")
+   public void updateVirtualNetworkGateway() {
+      // Make sure the resource is fully provisioned before modifying it
+      assertTrue(virtualNetworkGatewayAvailable.apply(name));
+
+      VirtualNetworkGateway gw = api().get(name);
+      gw = api().createOrUpdate(name, LOCATION, ImmutableMap.of("foo", "bar"), gw.properties());
+
+      assertNotNull(gw);
+      assertTrue(gw.tags().containsKey("foo"));
+      assertEquals(gw.tags().get("foo"), "bar");
+   }
+
+   @Test(dependsOnMethods = { "getVirtualNetworkGateway", "listVirtualNetworkGateways", "updateVirtualNetworkGateway" }, alwaysRun = true)
+   public void deleteVirtualNetworkGateway() {
+      // Make sure the resource is fully provisioned before deleting it
+      assertTrue(virtualNetworkGatewayAvailable.apply(name));
+      URI uri = api().delete(name);
+      assertResourceDeleted(uri);
+   }
+
+   private VirtualNetworkGatewayApi api() {
+      return api.getVirtualNetworkGatewayApi(resourceGroupName);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayApiMockTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayApiMockTest.java
new file mode 100644
index 0000000..1c8096f
--- /dev/null
+++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayApiMockTest.java
@@ -0,0 +1,161 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.features;
+
+import static com.google.common.collect.Iterables.isEmpty;
+import static java.util.Collections.singletonList;
+import static org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayType.Vpn;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+import java.util.List;
+
+import org.jclouds.azurecompute.arm.domain.IdReference;
+import org.jclouds.azurecompute.arm.domain.IpAllocationMethod;
+import org.jclouds.azurecompute.arm.domain.vpn.SKU;
+import org.jclouds.azurecompute.arm.domain.vpn.SKU.SKUName;
+import org.jclouds.azurecompute.arm.domain.vpn.SKU.SKUTier;
+import org.jclouds.azurecompute.arm.domain.vpn.VPNType;
+import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGateway;
+import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayProperties;
+import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayProperties.IpConfiguration;
+import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayProperties.IpConfiguration.IpConfigurationProperties;
+import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayType;
+import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiMockTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "VirtualNetworkGatewayApiMockTest", singleThreaded = true)
+public class VirtualNetworkGatewayApiMockTest extends BaseAzureComputeApiMockTest {
+
+   private final String subscriptionid = "SUBSCRIPTIONID";
+   private final String resourcegroup = "myresourcegroup";
+   private final String name = "myvirtualgw";
+   private final String apiVersion = "api-version=2018-02-01";
+
+   private static final String SUBNET_ID = "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayapilivetest-nacx/providers/Microsoft.Network/virtualNetworks/myvirtualgw-net/subnets/GatewaySubnet";
+   private static final String PUBLIC_IP = "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayapilivetest-nacx/providers/Microsoft.Network/publicIPAddresses/myvirtualgw-publicip";
+
+   public void createOrUpdateVirtualNetworkGateway() throws InterruptedException {
+      server.enqueue(jsonResponse("/virtualnetworkgatewaycreate.json").setResponseCode(200));
+      VirtualNetworkGatewayApi gwapi = api.getVirtualNetworkGatewayApi(resourcegroup);
+
+      IpConfigurationProperties ipprops = IpConfigurationProperties.builder(IpAllocationMethod.Dynamic)
+            .subnet(IdReference.create(SUBNET_ID)).publicIPAddress(IdReference.create(PUBLIC_IP)).build();
+      IpConfiguration ipconf = IpConfiguration.create(null, name + "-ipconf", null, ipprops);
+
+      VirtualNetworkGatewayProperties props = VirtualNetworkGatewayProperties
+            .builder(false, Vpn, SKU.create(1, SKUName.Basic, SKUTier.Basic)).vpnType(VPNType.PolicyBased)
+            .ipConfigurations(singletonList(ipconf)).build();
+
+      VirtualNetworkGateway gw = gwapi.createOrUpdate(name, "westeurope", null, props);
+
+      String path = String.format(
+            "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/virtualNetworkGateways/%s?%s",
+            subscriptionid, resourcegroup, name, apiVersion);
+      String json = "{\"location\":\"westeurope\",\"properties\":{\"enableBgp\":false,\"gatewayType\":\"Vpn\",\"ipConfigurations\":[{\"name\":\"myvirtualgw-ipconf\",\"properties\":{\"privateIPAllocationMethod\":\"Dynamic\",\"publicIPAddress\":{\"id\":\"/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayapilivetest-nacx/providers/Microsoft.Network/publicIPAddresses/myvirtualgw-publicip\"},\"subnet\":{\"id\":\"/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayapilivetest-nacx/providers/Microsoft.Network/virtualNetworks/myvirtualgw-net/subnets/GatewaySubnet\"}}}],\"sku\":{\"capacity\":1,\"name\":\"Basic\",\"tier\":\"Basic\"},\"vpnType\":\"PolicyBased\"}}";
+      assertSent(server, "PUT", path, json);
+
+      assertEquals(gw.name(), name);
+      assertNotNull(gw.properties());
+      assertEquals(gw.properties().gatewayType(), VirtualNetworkGatewayType.Vpn);
+   }
+
+   public void getVirtualNetworkGateway() throws InterruptedException {
+      server.enqueue(jsonResponse("/virtualnetworkgatewayget.json").setResponseCode(200));
+      VirtualNetworkGatewayApi gwapi = api.getVirtualNetworkGatewayApi(resourcegroup);
+
+      VirtualNetworkGateway gw = gwapi.get(name);
+
+      String path = String.format(
+            "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/virtualNetworkGateways/%s?%s",
+            subscriptionid, resourcegroup, name, apiVersion);
+      assertSent(server, "GET", path);
+
+      assertEquals(gw.name(), name);
+   }
+
+   public void getVirtualNetworkGatewayReturns404() throws InterruptedException {
+      server.enqueue(response404());
+      VirtualNetworkGatewayApi gwapi = api.getVirtualNetworkGatewayApi(resourcegroup);
+
+      VirtualNetworkGateway gw = gwapi.get(name);
+
+      String path = String.format(
+            "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/virtualNetworkGateways/%s?%s",
+            subscriptionid, resourcegroup, name, apiVersion);
+      assertSent(server, "GET", path);
+
+      assertNull(gw);
+   }
+
+   public void listVirtualNetworkGateways() throws InterruptedException {
+      server.enqueue(jsonResponse("/virtualnetworkgatewaylist.json").setResponseCode(200));
+      VirtualNetworkGatewayApi gwapi = api.getVirtualNetworkGatewayApi(resourcegroup);
+
+      List<VirtualNetworkGateway> gws = gwapi.list();
+
+      String path = String.format(
+            "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/virtualNetworkGateways?%s",
+            subscriptionid, resourcegroup, apiVersion);
+      assertSent(server, "GET", path);
+
+      assertTrue(gws.size() > 0);
+   }
+
+   public void listVirtualNetworkGatewaysReturns404() throws InterruptedException {
+      server.enqueue(response404());
+      VirtualNetworkGatewayApi gwapi = api.getVirtualNetworkGatewayApi(resourcegroup);
+
+      List<VirtualNetworkGateway> gws = gwapi.list();
+
+      String path = String.format(
+            "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/virtualNetworkGateways?%s",
+            subscriptionid, resourcegroup, apiVersion);
+      assertSent(server, "GET", path);
+
+      assertTrue(isEmpty(gws));
+   }
+
+   public void deleteVirtualNetworkGateway() throws InterruptedException {
+      server.enqueue(response202WithHeader());
+      VirtualNetworkGatewayApi gwapi = api.getVirtualNetworkGatewayApi(resourcegroup);
+
+      URI uri = gwapi.delete(name);
+      assertNotNull(uri);
+
+      String path = String.format(
+            "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/virtualNetworkGateways/%s?%s",
+            subscriptionid, resourcegroup, name, apiVersion);
+      assertSent(server, "DELETE", path);
+   }
+
+   public void deleteVirtualNetworkGatewayDoesNotExist() throws InterruptedException {
+      server.enqueue(response204());
+      VirtualNetworkGatewayApi gwapi = api.getVirtualNetworkGatewayApi(resourcegroup);
+
+      URI uri = gwapi.delete(name);
+      assertNull(uri);
+
+      String path = String.format(
+            "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/virtualNetworkGateways/%s?%s",
+            subscriptionid, resourcegroup, name, apiVersion);
+      assertSent(server, "DELETE", path);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ea5b899d/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiLiveTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiLiveTest.java
index 78d5425..5833834 100644
--- a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiLiveTest.java
+++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiLiveTest.java
@@ -17,19 +17,19 @@
 package org.jclouds.azurecompute.arm.internal;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_IMAGE_AVAILABLE;
-import static org.jclouds.util.Predicates2.retry;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
 import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.TIMEOUT_RESOURCE_DELETED;
+import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_CERTIFICATE_DELETE_STATUS;
+import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_CERTIFICATE_OPERATION_STATUS;
+import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_CERTIFICATE_RECOVERABLE_STATUS;
 import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_DELETE_STATUS;
-import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_SECRET_DELETE_STATUS;
-import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_SECRET_RECOVERABLE_STATUS;
 import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_KEY_DELETED_STATUS;
 import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_KEY_RECOVERABLE_STATUS;
-import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_CERTIFICATE_DELETE_STATUS;
-import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_CERTIFICATE_RECOVERABLE_STATUS;
-import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_CERTIFICATE_OPERATION_STATUS;
+import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_SECRET_DELETE_STATUS;
+import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_SECRET_RECOVERABLE_STATUS;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_IMAGE_AVAILABLE;
+import static org.jclouds.util.Predicates2.retry;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
 
 import java.io.IOException;
 import java.net.URI;
@@ -38,21 +38,20 @@ import java.util.List;
 import java.util.Properties;
 import java.util.Random;
 
-import com.google.common.base.Charsets;
-import com.google.common.base.Throwables;
-import com.google.common.io.Resources;
 import org.jclouds.apis.BaseApiLiveTest;
 import org.jclouds.azurecompute.arm.AzureComputeApi;
-import org.jclouds.azurecompute.arm.config.Tenant;
-import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.VaultPredicates.DeletedVaultStatusPredicateFactory;
+import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.PublicIpAvailablePredicateFactory;
+import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.VaultCertificatePredicates.CertificateOperationStatusPredicateFactory;
+import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.VaultCertificatePredicates.DeletedCertificateStatusPredicateFactory;
+import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.VaultCertificatePredicates.RecoverableCertificateStatusPredicateFactory;
 import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.VaultKeyPredicates.DeletedKeyStatusPredicateFactory;
 import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.VaultKeyPredicates.RecoverableKeyStatusPredicateFactory;
+import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.VaultPredicates.DeletedVaultStatusPredicateFactory;
 import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.VaultSecretPredicates.DeletedSecretStatusPredicateFactory;
 import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.VaultSecretPredicates.RecoverableSecretStatusPredicateFactory;
-import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.VaultCertificatePredicates.CertificateOperationStatusPredicateFactory;
-import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.VaultCertificatePredicates.DeletedCertificateStatusPredicateFactory;
-import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.VaultCertificatePredicates.RecoverableCertificateStatusPredicateFactory;
-import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.PublicIpAvailablePredicateFactory;
+import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.VirtualNetworkGatewayAvailablePredicateFactory;
+import org.jclouds.azurecompute.arm.config.Tenant;
+import org.jclouds.azurecompute.arm.domain.AddressSpace;
 import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroup;
 import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroupProperties;
 import org.jclouds.azurecompute.arm.domain.NetworkSecurityRule;
@@ -64,15 +63,18 @@ import org.jclouds.azurecompute.arm.domain.VirtualNetwork;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 
+import com.google.common.base.Charsets;
 import com.google.common.base.Predicate;
 import com.google.common.base.Supplier;
+import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
-import com.google.inject.name.Names;
+import com.google.common.io.Resources;
 import com.google.inject.Injector;
-import com.google.inject.Module;
 import com.google.inject.Key;
+import com.google.inject.Module;
 import com.google.inject.TypeLiteral;
+import com.google.inject.name.Names;
 
 public class BaseAzureComputeApiLiveTest extends BaseApiLiveTest<AzureComputeApi> {
 
@@ -84,6 +86,7 @@ public class BaseAzureComputeApiLiveTest extends BaseApiLiveTest<AzureComputeApi
    protected Predicate<URI> imageAvailablePredicate;
    protected Predicate<URI> resourceDeleted;
    protected PublicIpAvailablePredicateFactory publicIpAvailable;
+   protected VirtualNetworkGatewayAvailablePredicateFactory virtualNetworkGatewayStatus;
    protected Predicate<Supplier<Provisionable>> resourceAvailable;
    protected DeletedVaultStatusPredicateFactory deletedVaultStatus;
    protected DeletedKeyStatusPredicateFactory deletedKeyStatus;
@@ -94,7 +97,6 @@ public class BaseAzureComputeApiLiveTest extends BaseApiLiveTest<AzureComputeApi
    protected RecoverableCertificateStatusPredicateFactory recoverableCertificateStatus;
    protected CertificateOperationStatusPredicateFactory certificateOperationStatus;
 
-
    protected String resourceGroupName;
    
    protected String vaultResourceGroup;
@@ -139,6 +141,7 @@ public class BaseAzureComputeApiLiveTest extends BaseApiLiveTest<AzureComputeApi
       resourceDeleted = injector.getInstance(Key.get(new TypeLiteral<Predicate<URI>>() {
       }, Names.named(TIMEOUT_RESOURCE_DELETED)));
       publicIpAvailable = injector.getInstance(PublicIpAvailablePredicateFactory.class);
+      virtualNetworkGatewayStatus = injector.getInstance(VirtualNetworkGatewayAvailablePredicateFactory.class);
       resourceAvailable = injector.getInstance(Key.get(new TypeLiteral<Predicate<Supplier<Provisionable>>>() {
       }));
       deletedVaultStatus = injector.getInstance(Key.get(DeletedVaultStatusPredicateFactory.class, Names.named(VAULT_DELETE_STATUS)));
@@ -172,7 +175,7 @@ public class BaseAzureComputeApiLiveTest extends BaseApiLiveTest<AzureComputeApi
    protected VirtualNetwork createDefaultVirtualNetwork(final String resourceGroupName, final String virtualNetworkName, final String virtualnetworkAddressPrefix, final String location) {
       final VirtualNetwork.VirtualNetworkProperties virtualNetworkProperties =
               VirtualNetwork.VirtualNetworkProperties.create(null, null,
-                      VirtualNetwork.AddressSpace.create(Arrays.asList(virtualnetworkAddressPrefix)), null);
+                      AddressSpace.create(Arrays.asList(virtualnetworkAddressPrefix)), null);
       VirtualNetwork virtualNetwork = api.getVirtualNetworkApi(resourceGroupName).createOrUpdate(virtualNetworkName, location, null, virtualNetworkProperties);
       retry(new Predicate<String>() {
          @Override