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 d14f7e1dde..ba2fdd4f73 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 @@ -47,6 +47,7 @@ import org.jclouds.azurecompute.arm.features.VirtualMachineApi; import org.jclouds.azurecompute.arm.features.VirtualMachineScaleSetApi; import org.jclouds.azurecompute.arm.features.VirtualNetworkApi; import org.jclouds.azurecompute.arm.features.VirtualNetworkGatewayApi; +import org.jclouds.azurecompute.arm.features.VirtualNetworkGatewayConnectionApi; import org.jclouds.rest.annotations.Delegate; import com.google.common.base.Supplier; @@ -280,6 +281,14 @@ public interface AzureComputeApi extends Closeable { @Delegate VirtualNetworkGatewayApi getVirtualNetworkGatewayApi(@PathParam("resourcegroup") String resourcegroup); + /** + * Management features for Virtual Network Gateway Connections. + * + * @see docs + */ + @Delegate + VirtualNetworkGatewayConnectionApi getVirtualNetworkGatewayConnectionApi(@PathParam("resourcegroup") String resourcegroup); + /** * Returns the information about the current service principal. */ diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java index b16557a877..95856e6d67 100644 --- a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java +++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java @@ -64,6 +64,7 @@ import org.jclouds.azurecompute.arm.features.VirtualMachineApi; import org.jclouds.azurecompute.arm.features.VirtualMachineScaleSetApi; import org.jclouds.azurecompute.arm.features.VirtualNetworkApi; import org.jclouds.azurecompute.arm.features.VirtualNetworkGatewayApi; +import org.jclouds.azurecompute.arm.features.VirtualNetworkGatewayConnectionApi; import org.jclouds.providers.ProviderMetadata; import org.jclouds.providers.internal.BaseProviderMetadata; @@ -134,6 +135,7 @@ public class AzureComputeProviderMetadata extends BaseProviderMetadata { properties.put(API_VERSION_PREFIX + VaultApi.class.getSimpleName(), "2016-10-01"); properties.put(API_VERSION_PREFIX + LocalNetworkGatewayApi.class.getSimpleName(), "2018-02-01"); properties.put(API_VERSION_PREFIX + VirtualNetworkGatewayApi.class.getSimpleName(), "2018-02-01"); + properties.put(API_VERSION_PREFIX + VirtualNetworkGatewayConnectionApi.class.getSimpleName(), "2018-02-01"); return properties; } diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/TunnelConnectionHealth.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/TunnelConnectionHealth.java new file mode 100644 index 0000000000..430b50d5a2 --- /dev/null +++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/TunnelConnectionHealth.java @@ -0,0 +1,45 @@ +/* + * 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.vpn.VirtualNetworkGatewayConnection.Status; +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.json.SerializedNames; + +import com.google.auto.value.AutoValue; + +@AutoValue +public abstract class TunnelConnectionHealth { + + public abstract Status connectionStatus(); + public abstract int egressBytesTransferred(); + public abstract int ingressBytesTransferred(); + @Nullable public abstract String lastConnectionEstablishedUtcTime(); + public abstract String tunnel(); + + TunnelConnectionHealth() { + + } + + @SerializedNames({ "connectionStatus", "egressBytesTransferred", "ingressBytesTransferred", + "lastConnectionEstablishedUtcTime", "tunnel" }) + public static TunnelConnectionHealth create(Status connectionStatus, int egressBytesTransferred, + int ingressBytesTransferred, String lastConnectionEstablishedUtcTime, String tunnel) { + return new AutoValue_TunnelConnectionHealth(connectionStatus, egressBytesTransferred, ingressBytesTransferred, + lastConnectionEstablishedUtcTime, tunnel); + } +} diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGatewayConnection.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGatewayConnection.java new file mode 100644 index 0000000000..85dff2afb2 --- /dev/null +++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGatewayConnection.java @@ -0,0 +1,90 @@ +/* + * 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.azurecompute.arm.util.GetEnumValue; +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 VirtualNetworkGatewayConnection { + + public static enum Status { + Connected, Connecting, NotConnected, Unknown; + + public static Status fromValue(final String text) { + return (Status) GetEnumValue.fromValueOrDefault(text, Status.Unknown); + } + } + + public static enum Type { + ExpressRoute, IPsec, VPNClient, Vnet2Vnet, Unrecognized; + + public static Type fromValue(final String text) { + return (Type) GetEnumValue.fromValueOrDefault(text, Type.Unrecognized); + } + } + + @Nullable public abstract String id(); + public abstract String name(); + public abstract String location(); + @Nullable public abstract String type(); + @Nullable public abstract Map tags(); + @Nullable public abstract String etag(); + public abstract VirtualNetworkGatewayConnectionProperties properties(); + + VirtualNetworkGatewayConnection() { + + } + + @SerializedNames({ "id", "name", "location", "type", "tags", "etag", "properties" }) + public static VirtualNetworkGatewayConnection create(String id, String name, String location, String type, + Map tags, String etag, VirtualNetworkGatewayConnectionProperties 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, VirtualNetworkGatewayConnectionProperties properties) { + return new AutoValue_VirtualNetworkGatewayConnection.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 tags); + public abstract Builder etag(String etag); + public abstract Builder properties(VirtualNetworkGatewayConnectionProperties properties); + + abstract Map tags(); + abstract VirtualNetworkGatewayConnection autoBuild(); + + public VirtualNetworkGatewayConnection build() { + tags(tags() != null ? ImmutableMap.copyOf(tags()) : null); + return autoBuild(); + } + } +} diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGatewayConnectionProperties.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGatewayConnectionProperties.java new file mode 100644 index 0000000000..99db04502a --- /dev/null +++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/VirtualNetworkGatewayConnectionProperties.java @@ -0,0 +1,117 @@ +/* + * 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.Provisionable; +import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayConnection.Status; +import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayConnection.Type; +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 VirtualNetworkGatewayConnectionProperties implements Provisionable { + + @Nullable public abstract String authorizationKey(); + @Nullable public abstract Status connectionStatus(); + public abstract Type connectionType(); + @Nullable public abstract Integer egressBytesTransferred(); + @Nullable public abstract Integer ingressBytesTransferred(); + public abstract boolean enableBGP(); + public abstract List ipsecPolicies(); + @Nullable public abstract IdReference peer(); + @Nullable public abstract String provisioningState(); + @Nullable public abstract String resourceGuid(); + @Nullable public abstract Integer routingWeight(); + @Nullable public abstract String sharedKey(); + public abstract List tunnelConnectionStatus(); + public abstract boolean usePolicyBasedTrafficSelectors(); + public abstract IdReference localNetworkGateway2(); + public abstract IdReference virtualNetworkGateway1(); + @Nullable public abstract IdReference virtualNetworkGateway2(); + + VirtualNetworkGatewayConnectionProperties() { + + } + + @SerializedNames({ "authorizationKey", "connectionStatus", "connectionType", "egressBytesTransferred", + "ingressBytesTransferred", "enableBGP", "ipsecPolicies", "peer", "provisioningState", "resourceGuid", + "routingWeight", "sharedKey", "tunnelConnectionStatus", "usePolicyBasedTrafficSelectors", + "localNetworkGateway2", "virtualNetworkGateway1", "virtualNetworkGateway2" }) + public static VirtualNetworkGatewayConnectionProperties create(String authorizationKey, Status connectionStatus, + Type connectionType, Integer egressBytesTransferred, Integer ingressBytesTransferred, boolean enableBGP, + List ipsecPolicies, IdReference peer, String provisioningState, String resourceGuid, + Integer routingWeight, String sharedKey, List tunnelConnectionStatus, + boolean usePolicyBasedTrafficSelectors, IdReference localNetworkGateway2, IdReference virtualNetworkGateway1, + IdReference virtualNetworkGateway2) { + return builder(connectionType, enableBGP, usePolicyBasedTrafficSelectors, localNetworkGateway2, + virtualNetworkGateway1).authorizationKey(authorizationKey).connectionStatus(connectionStatus) + .egressBytesTransferred(egressBytesTransferred).ingressBytesTransferred(ingressBytesTransferred) + .ipsecPolicies(ipsecPolicies).peer(peer).provisioningState(provisioningState).resourceGuid(resourceGuid) + .routingWeight(routingWeight).sharedKey(sharedKey).tunnelConnectionStatus(tunnelConnectionStatus) + .virtualNetworkGateway2(virtualNetworkGateway2).build(); + } + + public static Builder builder(Type connectionType, boolean enableBGP, boolean usePolicyBasedTrafficSelectors, + IdReference localNetworkGateway2, IdReference virtualNetworkGateway1) { + return new AutoValue_VirtualNetworkGatewayConnectionProperties.Builder().connectionType(connectionType) + .enableBGP(enableBGP).usePolicyBasedTrafficSelectors(usePolicyBasedTrafficSelectors) + .localNetworkGateway2(localNetworkGateway2).virtualNetworkGateway1(virtualNetworkGateway1) + .ipsecPolicies(ImmutableList. of()) + .tunnelConnectionStatus(ImmutableList. of()); + } + + public abstract Builder toBuilder(); + + @AutoValue.Builder + public abstract static class Builder { + public abstract Builder authorizationKey(String authorizationKey); + public abstract Builder connectionStatus(Status connectionStatus); + public abstract Builder connectionType(Type connectionType); + public abstract Builder egressBytesTransferred(Integer egressBytesTransferred); + public abstract Builder ingressBytesTransferred(Integer ingressBytesTransferred); + public abstract Builder enableBGP(boolean enableBGP); + public abstract Builder ipsecPolicies(List ipsecPolicies); + public abstract Builder peer(IdReference peer); + public abstract Builder provisioningState(String provisioningState); + public abstract Builder resourceGuid(String resourceGuid); + public abstract Builder routingWeight(Integer routingWeight); + public abstract Builder sharedKey(String sharedKey); + public abstract Builder tunnelConnectionStatus(List tunnelConnectionStatus); + public abstract Builder usePolicyBasedTrafficSelectors(boolean usePolicyBasedTrafficSelectors); + public abstract Builder localNetworkGateway2(IdReference localNetworkGateway2); + public abstract Builder virtualNetworkGateway1(IdReference virtualNetworkGateway1); + public abstract Builder virtualNetworkGateway2(IdReference virtualNetworkGateway2); + + abstract List ipsecPolicies(); + abstract List tunnelConnectionStatus(); + abstract VirtualNetworkGatewayConnectionProperties autoBuild(); + + public VirtualNetworkGatewayConnectionProperties build() { + ipsecPolicies(ipsecPolicies() == null ? ImmutableList. of() : ImmutableList + .copyOf(ipsecPolicies())); + tunnelConnectionStatus(tunnelConnectionStatus() == null ? ImmutableList. of() + : ImmutableList.copyOf(tunnelConnectionStatus())); + return autoBuild(); + } + } +} 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 index 1d30f5f6ae..2905f417a9 100644 --- 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 @@ -60,7 +60,7 @@ public abstract class VirtualNetworkGatewayProperties implements Provisionable { public static Builder builder(boolean enableBGP, VirtualNetworkGatewayType virtualNetworkGatewayType, SKU sku) { return new AutoValue_VirtualNetworkGatewayProperties.Builder().enableBGP(enableBGP) - .gatewayType(virtualNetworkGatewayType).sku(sku); + .gatewayType(virtualNetworkGatewayType).sku(sku).ipConfigurations(ImmutableList. of()); } public abstract Builder toBuilder(); diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayConnectionApi.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayConnectionApi.java new file mode 100644 index 0000000000..3daaa9746e --- /dev/null +++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayConnectionApi.java @@ -0,0 +1,86 @@ +/* + * 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.VirtualNetworkGatewayConnection; +import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayConnectionProperties; +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/connections") +@RequestFilters({ OAuthFilter.class, ApiVersionFilter.class }) +@Consumes(MediaType.APPLICATION_JSON) +public interface VirtualNetworkGatewayConnectionApi extends Closeable { + + @Named("virtualnetworkgatewayconnection:list") + @GET + @SelectJson("value") + @Fallback(EmptyListOnNotFoundOr404.class) + List list(); + + @Named("virtualnetworkgatewayconnection:get") + @Path("/{name}") + @GET + @Fallback(NullOnNotFoundOr404.class) + VirtualNetworkGatewayConnection get(@PathParam("name") String name); + + @Named("virtualnetworkgatewayconnection:getSharedKey") + @Path("/{name}/sharedkey") + @GET + @Fallback(NullOnNotFoundOr404.class) + String getSharedKey(@PathParam("name") String name); + + @Named("virtualnetworkgatewayconnection:createOrUpdate") + @MapBinder(BindToJsonPayload.class) + @Path("/{name}") + @PUT + VirtualNetworkGatewayConnection createOrUpdate(@PathParam("name") String name, + @PayloadParam("location") String location, @Nullable @PayloadParam("tags") Map tags, + @PayloadParam("properties") VirtualNetworkGatewayConnectionProperties properties); + + @Named("virtualnetworkgatewayconnection:delete") + @Path("/{name}") + @DELETE + @ResponseParser(URIParser.class) + @Fallback(NullOnNotFoundOr404.class) + URI delete(@PathParam("name") String name); +} 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 bdf26eeec1..b139369572 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 @@ -98,7 +98,7 @@ public class LocalNetworkGatewayApiLiveTest extends BaseAzureComputeApiLiveTest assertTrue(gw.properties().localNetworkAddressSpace().addressPrefixes().contains("192.168.1.0/24")); } - @Test(dependsOnMethods = { "getLocalNetworkGateway", "listLocalNetworkGateways", "updateLocalNetworkGateway" }, alwaysRun = true) + @Test(dependsOnMethods = { "getLocalNetworkGateway", "listLocalNetworkGateways", "updateLocalNetworkGateway" }) public void deleteLocalNetworkGateway() { // Make sure the resource is fully provisioned before deleting it waitUntilAvailable(name); @@ -110,13 +110,13 @@ public class LocalNetworkGatewayApiLiveTest extends BaseAzureComputeApiLiveTest return api.getLocalNetworkGatewayApi(resourceGroupName); } - private boolean waitUntilAvailable(final String name) { - return resourceAvailable.apply(new Supplier() { + private void waitUntilAvailable(final String name) { + assertTrue(resourceAvailable.apply(new Supplier() { @Override public Provisionable get() { LocalNetworkGateway gw = api().get(name); return gw == null ? null : gw.properties(); } - }); + })); } } 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 index 4faaf2dfd5..e1dfad82c0 100644 --- 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 @@ -18,6 +18,7 @@ package org.jclouds.azurecompute.arm.features; import static com.google.common.collect.Iterables.any; import static java.util.Collections.singletonList; +import static java.util.logging.Logger.getAnonymousLogger; import static org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayType.Vpn; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; @@ -83,6 +84,7 @@ public class VirtualNetworkGatewayApiLiveTest extends BaseAzureComputeApiLiveTes .builder(false, Vpn, SKU.create(1, SKUName.Basic, SKUTier.Basic)).vpnType(VPNType.PolicyBased) .ipConfigurations(singletonList(ipconf)).build(); + getAnonymousLogger().info(String.format("Creating virtual network gateway %s. This may take a while...", name)); VirtualNetworkGateway gw = api().createOrUpdate(name, LOCATION, null, props); assertNotNull(gw); @@ -118,7 +120,7 @@ public class VirtualNetworkGatewayApiLiveTest extends BaseAzureComputeApiLiveTes assertEquals(gw.tags().get("foo"), "bar"); } - @Test(dependsOnMethods = { "getVirtualNetworkGateway", "listVirtualNetworkGateways", "updateVirtualNetworkGateway" }, alwaysRun = true) + @Test(dependsOnMethods = { "getVirtualNetworkGateway", "listVirtualNetworkGateways", "updateVirtualNetworkGateway" }) public void deleteVirtualNetworkGateway() { // Make sure the resource is fully provisioned before deleting it assertTrue(virtualNetworkGatewayAvailable.apply(name)); diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayConnectionApiLiveTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayConnectionApiLiveTest.java new file mode 100644 index 0000000000..b16250a324 --- /dev/null +++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayConnectionApiLiveTest.java @@ -0,0 +1,181 @@ +/* + * 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 java.util.logging.Logger.getAnonymousLogger; +import static org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayConnection.Type.IPsec; +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.AddressSpace; +import org.jclouds.azurecompute.arm.domain.IdReference; +import org.jclouds.azurecompute.arm.domain.IpAllocationMethod; +import org.jclouds.azurecompute.arm.domain.Provisionable; +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.LocalNetworkGateway; +import org.jclouds.azurecompute.arm.domain.vpn.LocalNetworkGatewayProperties; +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.VirtualNetworkGatewayConnection; +import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayConnectionProperties; +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.base.Supplier; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; + +@Test(groups = "live", testName = "VirtualNetworkGatewayConnectionApiLiveTest", singleThreaded = true) +public class VirtualNetworkGatewayConnectionApiLiveTest extends BaseAzureComputeApiLiveTest { + + private String name; + private LocalNetworkGateway localGateway; + private VirtualNetworkGateway virtualGateway; + + @BeforeClass + @Override + public void setup() { + super.setup(); + createTestResourceGroup(); + name = "jclouds-" + RAND; + setupLocalGateway(); + setupVirtualGateway(); + } + + private void setupLocalGateway() { + AddressSpace localAddresses = AddressSpace.create(ImmutableList.of("192.168.0.0/24")); + LocalNetworkGatewayProperties props = LocalNetworkGatewayProperties.builder("1.2.3.4") + .localNetworkAddressSpace(localAddresses).build(); + + final LocalNetworkGatewayApi lgwApi = api.getLocalNetworkGatewayApi(resourceGroupName); + localGateway = lgwApi.createOrUpdate(name + "-lgw", LOCATION, null, props); + + assertTrue(resourceAvailable.apply(new Supplier() { + @Override + public Provisionable get() { + LocalNetworkGateway gw = lgwApi.get(localGateway.name()); + return gw == null ? null : gw.properties(); + } + })); + } + + private void setupVirtualGateway() { + 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"); + + PublicIPAddressProperties props = PublicIPAddressProperties.builder() + .publicIPAllocationMethod(IpAllocationMethod.Dynamic.name()).idleTimeoutInMinutes(4).build(); + PublicIPAddress publicIp = api.getPublicIPAddressApi(resourceGroupName).createOrUpdate(name + "-publicip", + LOCATION, Collections. emptyMap(), props); + + IpConfigurationProperties ipprops = IpConfigurationProperties.builder(IpAllocationMethod.Dynamic) + .subnet(IdReference.create(subnet.id())).publicIPAddress(IdReference.create(publicIp.id())).build(); + IpConfiguration ipconf = IpConfiguration.create(null, name + "-ipconf", null, ipprops); + + VirtualNetworkGatewayProperties gwProps = VirtualNetworkGatewayProperties + .builder(false, Vpn, SKU.create(1, SKUName.Basic, SKUTier.Basic)).vpnType(VPNType.PolicyBased) + .ipConfigurations(singletonList(ipconf)).build(); + + getAnonymousLogger().info( + String.format("Creating virtual network gateway %s-vgw. This may take a while...", name)); + virtualGateway = api.getVirtualNetworkGatewayApi(resourceGroupName).createOrUpdate(name + "-vgw", LOCATION, null, + gwProps); + assertTrue(virtualNetworkGatewayStatus.create(resourceGroupName).apply(virtualGateway.name())); + } + + @Test + public void createVirtualNetworkGatewayConnection() { + VirtualNetworkGatewayConnectionProperties props = VirtualNetworkGatewayConnectionProperties + .builder(IPsec, false, false, IdReference.create(localGateway.id()), + IdReference.create(virtualGateway.id())).sharedKey("jcl0uds").build(); + + VirtualNetworkGatewayConnection conn = api().createOrUpdate(name, LOCATION, null, props); + + assertNotNull(conn); + assertEquals(conn.name(), name); + assertNotNull(conn.properties()); + } + + @Test(dependsOnMethods = "createVirtualNetworkGatewayConnection") + public void getVirtualNetworkGatewayConnection() { + assertNotNull(api().get(name)); + } + + @Test(dependsOnMethods = "createVirtualNetworkGatewayConnection") + public void listVirtualNetworkGatewayConnections() { + assertTrue(any(api().list(), new Predicate() { + @Override + public boolean apply(VirtualNetworkGatewayConnection input) { + return name.equals(input.name()); + } + })); + } + + @Test(dependsOnMethods = "createVirtualNetworkGatewayConnection") + public void updateVirtualNetworkGatewayConnection() { + // Make sure the resource is fully provisioned before modifying it + waitUntilAvailable(name); + + VirtualNetworkGatewayConnection conn = api().get(name); + conn = api().createOrUpdate(name, LOCATION, ImmutableMap.of("foo", "bar"), conn.properties()); + + assertNotNull(conn); + assertTrue(conn.tags().containsKey("foo")); + assertEquals(conn.tags().get("foo"), "bar"); + } + + @Test(dependsOnMethods = { "getVirtualNetworkGatewayConnection", "listVirtualNetworkGatewayConnections", + "updateVirtualNetworkGatewayConnection" }) + public void deleteVirtualNetworkGatewayConnection() { + // Make sure the resource is fully provisioned before deleting it + waitUntilAvailable(name); + URI uri = api().delete(name); + assertResourceDeleted(uri); + } + + private void waitUntilAvailable(final String name) { + assertTrue(resourceAvailable.apply(new Supplier() { + @Override + public Provisionable get() { + VirtualNetworkGatewayConnection gw = api().get(name); + return gw == null ? null : gw.properties(); + } + })); + } + + private VirtualNetworkGatewayConnectionApi api() { + return api.getVirtualNetworkGatewayConnectionApi(resourceGroupName); + } +} diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayConnectionApiMockTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayConnectionApiMockTest.java new file mode 100644 index 0000000000..7c8a230705 --- /dev/null +++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualNetworkGatewayConnectionApiMockTest.java @@ -0,0 +1,149 @@ +/* + * 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 org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayConnection.Type.IPsec; +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.vpn.VirtualNetworkGatewayConnection; +import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayConnection.Type; +import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGatewayConnectionProperties; +import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiMockTest; +import org.testng.annotations.Test; + +@Test(groups = "unit", testName = "VirtualNetworkGatewayConnectionApiMockTest", singleThreaded = true) +public class VirtualNetworkGatewayConnectionApiMockTest extends BaseAzureComputeApiMockTest { + + private final String subscriptionid = "SUBSCRIPTIONID"; + private final String resourcegroup = "myresourcegroup"; + private final String name = "myconn"; + private final String apiVersion = "api-version=2018-02-01"; + + private static final String LG_ID = "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayconnectionapilivetest-nacx/providers/Microsoft.Network/localNetworkGateways/jclouds-827-lgw"; + private static final String VG_ID = "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayconnectionapilivetest-nacx/providers/Microsoft.Network/virtualNetworkGateways/jclouds-827-vgw"; + + public void createOrUpdateVirtualNetworkGateway() throws InterruptedException { + server.enqueue(jsonResponse("/connectioncreate.json").setResponseCode(200)); + VirtualNetworkGatewayConnectionApi connapi = api.getVirtualNetworkGatewayConnectionApi(resourcegroup); + + VirtualNetworkGatewayConnectionProperties props = VirtualNetworkGatewayConnectionProperties + .builder(IPsec, false, false, IdReference.create(LG_ID), IdReference.create(VG_ID)).sharedKey("jcl0uds") + .build(); + + VirtualNetworkGatewayConnection conn = connapi.createOrUpdate(name, "westeurope", null, props); + + String path = String.format( + "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/connections/%s?%s", + subscriptionid, resourcegroup, name, apiVersion); + String json = "{\"location\":\"westeurope\",\"properties\":{\"connectionType\":\"IPsec\",\"enableBGP\":false,\"ipsecPolicies\":[],\"sharedKey\":\"jcl0uds\",\"tunnelConnectionStatus\":[],\"usePolicyBasedTrafficSelectors\":false,\"localNetworkGateway2\":{\"id\":\"/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayconnectionapilivetest-nacx/providers/Microsoft.Network/localNetworkGateways/jclouds-827-lgw\"},\"virtualNetworkGateway1\":{\"id\":\"/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayconnectionapilivetest-nacx/providers/Microsoft.Network/virtualNetworkGateways/jclouds-827-vgw\"}}}"; + assertSent(server, "PUT", path, json); + + assertEquals(conn.name(), name); + assertNotNull(conn.properties()); + assertEquals(conn.properties().connectionType(), Type.IPsec); + } + + public void getVirtualNetworkGateway() throws InterruptedException { + server.enqueue(jsonResponse("/connectionget.json").setResponseCode(200)); + VirtualNetworkGatewayConnectionApi connapi = api.getVirtualNetworkGatewayConnectionApi(resourcegroup); + + VirtualNetworkGatewayConnection conn = connapi.get(name); + + String path = String.format( + "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/connections/%s?%s", + subscriptionid, resourcegroup, name, apiVersion); + assertSent(server, "GET", path); + + assertEquals(conn.name(), name); + } + + public void getVirtualNetworkGatewayReturns404() throws InterruptedException { + server.enqueue(response404()); + VirtualNetworkGatewayConnectionApi connapi = api.getVirtualNetworkGatewayConnectionApi(resourcegroup); + + VirtualNetworkGatewayConnection conn = connapi.get(name); + + String path = String.format( + "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/connections/%s?%s", + subscriptionid, resourcegroup, name, apiVersion); + assertSent(server, "GET", path); + + assertNull(conn); + } + + public void listVirtualNetworkGateways() throws InterruptedException { + server.enqueue(jsonResponse("/connectionlist.json").setResponseCode(200)); + VirtualNetworkGatewayConnectionApi connapi = api.getVirtualNetworkGatewayConnectionApi(resourcegroup); + + List conns = connapi.list(); + + String path = String.format( + "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/connections?%s", + subscriptionid, resourcegroup, apiVersion); + assertSent(server, "GET", path); + + assertTrue(conns.size() > 0); + } + + public void listVirtualNetworkGatewaysReturns404() throws InterruptedException { + server.enqueue(response404()); + VirtualNetworkGatewayConnectionApi connapi = api.getVirtualNetworkGatewayConnectionApi(resourcegroup); + + List conns = connapi.list(); + + String path = String.format( + "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/connections?%s", + subscriptionid, resourcegroup, apiVersion); + assertSent(server, "GET", path); + + assertTrue(isEmpty(conns)); + } + + public void deleteVirtualNetworkGateway() throws InterruptedException { + server.enqueue(response202WithHeader()); + VirtualNetworkGatewayConnectionApi connapi = api.getVirtualNetworkGatewayConnectionApi(resourcegroup); + + URI uri = connapi.delete(name); + assertNotNull(uri); + + String path = String.format( + "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/connections/%s?%s", + subscriptionid, resourcegroup, name, apiVersion); + assertSent(server, "DELETE", path); + } + + public void deleteVirtualNetworkGatewayDoesNotExist() throws InterruptedException { + server.enqueue(response204()); + VirtualNetworkGatewayConnectionApi connapi = api.getVirtualNetworkGatewayConnectionApi(resourcegroup); + + URI uri = connapi.delete(name); + assertNull(uri); + + String path = String.format( + "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/connections/%s?%s", + subscriptionid, resourcegroup, name, apiVersion); + assertSent(server, "DELETE", path); + } +} diff --git a/providers/azurecompute-arm/src/test/resources/connectioncreate.json b/providers/azurecompute-arm/src/test/resources/connectioncreate.json new file mode 100644 index 0000000000..6b859ec29f --- /dev/null +++ b/providers/azurecompute-arm/src/test/resources/connectioncreate.json @@ -0,0 +1,26 @@ +{ + "name": "myconn", + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayconnectionapilivetest-nacx/providers/Microsoft.Network/connections/myconn", + "etag": "W/\"e6f08058-3815-4498-858b-0fe750e086c8\"", + "type": "Microsoft.Network/connections", + "location": "westeurope", + "properties": { + "provisioningState": "Updating", + "resourceGuid": "1c7fc4e8-5d48-476b-b951-38279aec7d63", + "virtualNetworkGateway1": { + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayconnectionapilivetest-nacx/providers/Microsoft.Network/virtualNetworkGateways/jclouds-827-vgw" + }, + "localNetworkGateway2": { + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayconnectionapilivetest-nacx/providers/Microsoft.Network/localNetworkGateways/jclouds-827-lgw" + }, + "connectionType": "IPsec", + "routingWeight": 0, + "sharedKey": "jcl0uds", + "enableBgp": false, + "usePolicyBasedTrafficSelectors": false, + "ipsecPolicies": [], + "ingressBytesTransferred": 0, + "egressBytesTransferred": 0, + "tunnelConnectionStatus": [] + } + } \ No newline at end of file diff --git a/providers/azurecompute-arm/src/test/resources/connectionget.json b/providers/azurecompute-arm/src/test/resources/connectionget.json new file mode 100644 index 0000000000..2dd277e5f2 --- /dev/null +++ b/providers/azurecompute-arm/src/test/resources/connectionget.json @@ -0,0 +1,26 @@ +{ + "name": "myconn", + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayconnectionapilivetest-nacx/providers/Microsoft.Network/connections/myconn", + "etag": "W/\"e6f08058-3815-4498-858b-0fe750e086c8\"", + "type": "Microsoft.Network/connections", + "location": "westeurope", + "properties": { + "provisioningState": "Updating", + "resourceGuid": "1c7fc4e8-5d48-476b-b951-38279aec7d63", + "virtualNetworkGateway1": { + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayconnectionapilivetest-nacx/providers/Microsoft.Network/virtualNetworkGateways/jclouds-827-vgw" + }, + "localNetworkGateway2": { + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayconnectionapilivetest-nacx/providers/Microsoft.Network/localNetworkGateways/jclouds-827-lgw" + }, + "connectionType": "IPsec", + "routingWeight": 0, + "sharedKey": "jcl0uds", + "enableBgp": false, + "usePolicyBasedTrafficSelectors": false, + "ipsecPolicies": [], + "ingressBytesTransferred": 0, + "egressBytesTransferred": 0, + "tunnelConnectionStatus": [] + } + } \ No newline at end of file diff --git a/providers/azurecompute-arm/src/test/resources/connectionlist.json b/providers/azurecompute-arm/src/test/resources/connectionlist.json new file mode 100644 index 0000000000..3f1ff07209 --- /dev/null +++ b/providers/azurecompute-arm/src/test/resources/connectionlist.json @@ -0,0 +1,29 @@ +{ + "value": [ + { + "name": "myconn", + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayconnectionapilivetest-nacx/providers/Microsoft.Network/connections/myconn", + "etag": "W/\"e6f08058-3815-4498-858b-0fe750e086c8\"", + "type": "Microsoft.Network/connections", + "location": "westeurope", + "properties": { + "provisioningState": "Updating", + "resourceGuid": "1c7fc4e8-5d48-476b-b951-38279aec7d63", + "virtualNetworkGateway1": { + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayconnectionapilivetest-nacx/providers/Microsoft.Network/virtualNetworkGateways/jclouds-827-vgw" + }, + "localNetworkGateway2": { + "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/rg-virtualnetworkgatewayconnectionapilivetest-nacx/providers/Microsoft.Network/localNetworkGateways/jclouds-827-lgw" + }, + "connectionType": "IPsec", + "routingWeight": 0, + "enableBgp": false, + "usePolicyBasedTrafficSelectors": false, + "ipsecPolicies": [], + "ingressBytesTransferred": 0, + "egressBytesTransferred": 0, + "tunnelConnectionStatus": [] + } + } + ] + } \ No newline at end of file