http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java deleted file mode 100644 index b31e2a0..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java +++ /dev/null @@ -1,345 +0,0 @@ -/* - * 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.compute.extensions; - -import static com.google.common.base.Preconditions.checkState; -import static com.google.common.base.Predicates.equalTo; -import static com.google.common.base.Predicates.notNull; -import static com.google.common.collect.Iterables.any; -import static com.google.common.collect.Iterables.filter; -import static com.google.common.collect.Iterables.transform; -import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.TIMEOUT_RESOURCE_DELETED; -import static org.jclouds.azurecompute.arm.domain.IdReference.extractName; -import static org.jclouds.azurecompute.arm.domain.IdReference.extractResourceGroup; - -import java.net.URI; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; - -import org.jclouds.azurecompute.arm.AzureComputeApi; -import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.SecurityGroupAvailablePredicateFactory; -import org.jclouds.azurecompute.arm.compute.domain.ResourceGroupAndName; -import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard; -import org.jclouds.azurecompute.arm.domain.NetworkProfile.NetworkInterface; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroup; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroupProperties; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRule; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRuleProperties; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRuleProperties.Access; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRuleProperties.Direction; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRuleProperties.Protocol; -import org.jclouds.azurecompute.arm.domain.ResourceGroup; -import org.jclouds.azurecompute.arm.domain.VirtualMachine; -import org.jclouds.azurecompute.arm.features.NetworkSecurityGroupApi; -import org.jclouds.azurecompute.arm.features.NetworkSecurityRuleApi; -import org.jclouds.compute.domain.SecurityGroup; -import org.jclouds.compute.domain.SecurityGroupBuilder; -import org.jclouds.compute.extensions.SecurityGroupExtension; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.domain.Location; -import org.jclouds.location.Region; -import org.jclouds.logging.Logger; -import org.jclouds.net.domain.IpPermission; -import org.jclouds.net.domain.IpProtocol; - -import com.google.common.base.Function; -import com.google.common.base.Objects; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import com.google.common.cache.LoadingCache; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Multimap; -import com.google.common.collect.Ordering; - -public class AzureComputeSecurityGroupExtension implements SecurityGroupExtension { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - - private final AzureComputeApi api; - private final Function<NetworkSecurityGroup, SecurityGroup> securityGroupConverter; - private final SecurityGroupAvailablePredicateFactory securityGroupAvailable; - private final Predicate<URI> resourceDeleted; - private final LoadingCache<String, ResourceGroup> defaultResourceGroup; - private final Supplier<Set<String>> regionIds; - - @Inject - AzureComputeSecurityGroupExtension(AzureComputeApi api, - Function<NetworkSecurityGroup, SecurityGroup> groupConverter, - SecurityGroupAvailablePredicateFactory securityRuleAvailable, - @Named(TIMEOUT_RESOURCE_DELETED) Predicate<URI> resourceDeleted, - LoadingCache<String, ResourceGroup> defaultResourceGroup, - @Region Supplier<Set<String>> regionIds) { - this.api = api; - this.securityGroupConverter = groupConverter; - this.securityGroupAvailable = securityRuleAvailable; - this.resourceDeleted = resourceDeleted; - this.defaultResourceGroup = defaultResourceGroup; - this.regionIds = regionIds; - } - - @Override - public Set<SecurityGroup> listSecurityGroupsInLocation(Location location) { - return securityGroupsInLocations(ImmutableSet.of(location.getId())); - } - - @Override - public Set<SecurityGroup> listSecurityGroups() { - return securityGroupsInLocations(regionIds.get()); - } - - private Set<SecurityGroup> securityGroupsInLocations(final Set<String> locations) { - List<SecurityGroup> securityGroups = new ArrayList<SecurityGroup>(); - for (ResourceGroup rg : api.getResourceGroupApi().list()) { - securityGroups.addAll(securityGroupsInResourceGroup(rg.name())); - } - - return ImmutableSet.copyOf(filter(securityGroups, new Predicate<SecurityGroup>() { - @Override - public boolean apply(SecurityGroup input) { - return locations.contains(input.getLocation().getId()); - } - })); - } - - private Set<SecurityGroup> securityGroupsInResourceGroup(String resourceGroup) { - List<NetworkSecurityGroup> networkGroups = api.getNetworkSecurityGroupApi(resourceGroup).list(); - return ImmutableSet.copyOf(transform(filter(networkGroups, notNull()), securityGroupConverter)); - } - - @Override - public Set<SecurityGroup> listSecurityGroupsForNode(String nodeId) { - logger.debug(">> getting security groups for node %s...", nodeId); - - final ResourceGroupAndName resourceGroupAndName = ResourceGroupAndName.fromSlashEncoded(nodeId); - - VirtualMachine vm = api.getVirtualMachineApi(resourceGroupAndName.resourceGroup()).get( - resourceGroupAndName.name()); - if (vm == null) { - throw new IllegalArgumentException("Node " + nodeId + " was not found"); - } - List<NetworkInterface> networkInterfaces = vm.properties().networkProfile().networkInterfaces(); - List<NetworkSecurityGroup> networkGroups = new ArrayList<NetworkSecurityGroup>(); - - for (NetworkInterface networkInterfaceCardIdReference : networkInterfaces) { - String nicName = extractName(networkInterfaceCardIdReference.id()); - String nicResourceGroup = extractResourceGroup(networkInterfaceCardIdReference.id()); - NetworkInterfaceCard card = api.getNetworkInterfaceCardApi(nicResourceGroup).get(nicName); - if (card != null && card.properties().networkSecurityGroup() != null) { - String secGroupName = card.properties().networkSecurityGroup().name(); - String sgResourceGroup = card.properties().networkSecurityGroup().resourceGroup(); - NetworkSecurityGroup group = api.getNetworkSecurityGroupApi(sgResourceGroup).get(secGroupName); - networkGroups.add(group); - } - } - - return ImmutableSet.copyOf(transform(filter(networkGroups, notNull()), securityGroupConverter)); - } - - @Override - public SecurityGroup getSecurityGroupById(String id) { - logger.debug(">> getting security group %s...", id); - final ResourceGroupAndName resourceGroupAndName = ResourceGroupAndName.fromSlashEncoded(id); - NetworkSecurityGroup securityGroup = api.getNetworkSecurityGroupApi(resourceGroupAndName.resourceGroup()).get( - resourceGroupAndName.name()); - return securityGroup == null ? null : securityGroupConverter.apply(securityGroup); - } - - @Override - public SecurityGroup createSecurityGroup(String name, Location location) { - ResourceGroup resourceGroup = defaultResourceGroup.getUnchecked(location.getId()); - - logger.debug(">> creating security group %s in %s...", name, location); - - SecurityGroupBuilder builder = new SecurityGroupBuilder(); - builder.name(name); - builder.location(location); - - NetworkSecurityGroup sg = api.getNetworkSecurityGroupApi(resourceGroup.name()).createOrUpdate(name, - location.getId(), null, NetworkSecurityGroupProperties.builder().build()); - - checkState(securityGroupAvailable.create(resourceGroup.name()).apply(name), - "Security group was not created in the configured timeout"); - - return securityGroupConverter.apply(sg); - } - - @Override - public boolean removeSecurityGroup(String id) { - logger.debug(">> deleting security group %s...", id); - - final ResourceGroupAndName resourceGroupAndName = ResourceGroupAndName.fromSlashEncoded(id); - URI uri = api.getNetworkSecurityGroupApi(resourceGroupAndName.resourceGroup()) - .delete(resourceGroupAndName.name()); - - // https://docs.microsoft.com/en-us/rest/api/network/virtualnetwork/delete-a-network-security-group - if (uri != null) { - // 202-Accepted if resource exists and the request is accepted. - return resourceDeleted.apply(uri); - } else { - // 204-No Content if resource does not exist. - return false; - } - } - - @Override - public SecurityGroup addIpPermission(IpPermission ipPermission, SecurityGroup group) { - return addIpPermission(ipPermission.getIpProtocol(), ipPermission.getFromPort(), ipPermission.getToPort(), - ipPermission.getTenantIdGroupNamePairs(), ipPermission.getCidrBlocks(), ipPermission.getGroupIds(), group); - } - - @Override - public SecurityGroup removeIpPermission(IpPermission ipPermission, SecurityGroup group) { - return removeIpPermission(ipPermission.getIpProtocol(), ipPermission.getFromPort(), ipPermission.getToPort(), - ipPermission.getTenantIdGroupNamePairs(), ipPermission.getCidrBlocks(), ipPermission.getGroupIds(), group); - } - - @Override - public SecurityGroup addIpPermission(IpProtocol protocol, int startPort, int endPort, - Multimap<String, String> tenantIdGroupNamePairs, Iterable<String> ipRanges, Iterable<String> groupIds, - SecurityGroup group) { - String portRange = startPort + "-" + endPort; - String ruleName = "ingress-" + protocol.name().toLowerCase() + "-" + portRange; - - logger.debug(">> adding ip permission [%s] to %s...", ruleName, group.getName()); - - // TODO: Support Azure network tags somehow? - - final ResourceGroupAndName resourceGroupAndName = ResourceGroupAndName.fromSlashEncoded(group.getId()); - - NetworkSecurityGroupApi groupApi = api.getNetworkSecurityGroupApi(resourceGroupAndName.resourceGroup()); - NetworkSecurityGroup networkSecurityGroup = groupApi.get(resourceGroupAndName.name()); - - if (networkSecurityGroup == null) { - throw new IllegalArgumentException("Security group " + group.getName() + " was not found"); - } - - NetworkSecurityRuleApi ruleApi = api.getNetworkSecurityRuleApi(resourceGroupAndName.resourceGroup(), networkSecurityGroup.name()); - int nextPriority = getRuleStartingPriority(networkSecurityGroup); - - for (String ipRange : ipRanges) { - NetworkSecurityRuleProperties properties = NetworkSecurityRuleProperties.builder() - .protocol(Protocol.fromValue(protocol.name())) - .sourceAddressPrefix(ipRange) - .sourcePortRange("*") - .destinationAddressPrefix("*") - .destinationPortRange(portRange) - .direction(Direction.Inbound) - .access(Access.Allow) - .priority(nextPriority++) - .build(); - - logger.debug(">> creating network security rule %s for %s...", ruleName, ipRange); - - ruleApi.createOrUpdate(ruleName, properties); - - checkState( - securityGroupAvailable.create(resourceGroupAndName.resourceGroup()).apply(networkSecurityGroup.name()), - "Security group was not updated in the configured timeout"); - } - - return getSecurityGroupById(group.getId()); - } - - @Override - public SecurityGroup removeIpPermission(final IpProtocol protocol, int startPort, int endPort, - Multimap<String, String> tenantIdGroupNamePairs, final Iterable<String> ipRanges, Iterable<String> groupIds, - SecurityGroup group) { - final String portRange = startPort + "-" + endPort; - String ruleName = "ingress-" + protocol.name().toLowerCase() + "-" + portRange; - - logger.debug(">> deleting ip permissions matching [%s] from %s...", ruleName, group.getName()); - - final ResourceGroupAndName resourceGroupAndName = ResourceGroupAndName.fromSlashEncoded(group.getId()); - - NetworkSecurityGroupApi groupApi = api.getNetworkSecurityGroupApi(resourceGroupAndName.resourceGroup()); - NetworkSecurityGroup networkSecurityGroup = groupApi.get(resourceGroupAndName.name()); - - if (networkSecurityGroup == null) { - throw new IllegalArgumentException("Security group " + group.getName() + " was not found"); - } - - NetworkSecurityRuleApi ruleApi = api.getNetworkSecurityRuleApi(resourceGroupAndName.resourceGroup(), - networkSecurityGroup.name()); - Iterable<NetworkSecurityRule> rules = filter(ruleApi.list(), new Predicate<NetworkSecurityRule>() { - @Override - public boolean apply(NetworkSecurityRule input) { - NetworkSecurityRuleProperties props = input.properties(); - return Objects.equal(portRange, props.destinationPortRange()) - && Objects.equal(Protocol.fromValue(protocol.name()), props.protocol()) - && Objects.equal(Direction.Inbound, props.direction()) // - && Objects.equal(Access.Allow, props.access()) - && any(ipRanges, equalTo(props.sourceAddressPrefix().replace("*", "0.0.0.0/0"))); - } - }); - - for (NetworkSecurityRule matchingRule : rules) { - logger.debug(">> deleting network security rule %s from %s...", matchingRule.name(), group.getName()); - ruleApi.delete(matchingRule.name()); - checkState( - securityGroupAvailable.create(resourceGroupAndName.resourceGroup()).apply(networkSecurityGroup.name()), - "Security group was not updated in the configured timeout"); - } - - return getSecurityGroupById(group.getId()); - } - - @Override - public boolean supportsTenantIdGroupNamePairs() { - return false; - } - - @Override - public boolean supportsTenantIdGroupIdPairs() { - return false; - } - - @Override - public boolean supportsGroupIds() { - return false; - } - - @Override - public boolean supportsPortRangesForGroups() { - return false; - } - - @Override - public boolean supportsExclusionCidrBlocks() { - return false; - } - - private int getRuleStartingPriority(NetworkSecurityGroup securityGroup) { - List<NetworkSecurityRule> existingRules = securityGroup.properties().securityRules(); - return existingRules.isEmpty() ? 100 : rulesByPriority().max(existingRules).properties().priority() + 1; - } - - private static Ordering<NetworkSecurityRule> rulesByPriority() { - return new Ordering<NetworkSecurityRule>() { - @Override - public int compare(NetworkSecurityRule left, NetworkSecurityRule right) { - return left.properties().priority() - right.properties().priority(); - } - }; - } - -}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/CustomImageToVMImage.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/CustomImageToVMImage.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/CustomImageToVMImage.java deleted file mode 100644 index 2220535..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/CustomImageToVMImage.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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.compute.functions; - -import static org.jclouds.azurecompute.arm.domain.IdReference.extractResourceGroup; - -import org.jclouds.azurecompute.arm.domain.Image; -import org.jclouds.azurecompute.arm.domain.VMImage; - -import com.google.common.base.Function; - -public class CustomImageToVMImage implements Function<Image, VMImage> { - - @Override - public VMImage apply(Image input) { - return VMImage.customImage().resourceGroup(extractResourceGroup(input.id())).customImageId(input.id()).location(input.location()).name(input.name()) - .offer(input.properties().storageProfile().osDisk().osType()).build(); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/LocationToLocation.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/LocationToLocation.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/LocationToLocation.java deleted file mode 100644 index 7c60175..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/LocationToLocation.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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.compute.functions; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.azurecompute.arm.domain.Location; -import org.jclouds.azurecompute.arm.domain.Region; -import org.jclouds.domain.LocationBuilder; -import org.jclouds.domain.LocationScope; -import org.jclouds.location.suppliers.all.JustProvider; - -import com.google.common.base.Function; -import com.google.common.collect.ImmutableSet; - -import static com.google.common.collect.Iterables.getOnlyElement; - -/** - * Converts an Location into a Location. - */ -@Singleton -public class LocationToLocation implements Function<Location, org.jclouds.domain.Location> { - - private final JustProvider justProvider; - - // allow us to lazy discover the provider of a resource - @Inject - LocationToLocation(JustProvider justProvider) { - this.justProvider = justProvider; - } - - @Override - public org.jclouds.domain.Location apply(final Location location) { - final LocationBuilder builder = new LocationBuilder(); - builder.id(location.name()); - builder.description(location.displayName()); - builder.parent(getOnlyElement(justProvider.get())); - builder.scope(LocationScope.REGION); - final Region region = Region.byName(location.displayName()); - if (region != null) { - builder.iso3166Codes(ImmutableSet.of(region.iso3166Code())); - } - return builder.build(); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/LocationToResourceGroupName.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/LocationToResourceGroupName.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/LocationToResourceGroupName.java deleted file mode 100644 index c97850a..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/LocationToResourceGroupName.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.compute.functions; - -import static org.jclouds.compute.config.ComputeServiceProperties.RESOURCENAME_DELIMITER; -import static org.jclouds.compute.config.ComputeServiceProperties.RESOURCENAME_PREFIX; - -import javax.inject.Inject; -import javax.inject.Named; - -import com.google.common.base.Function; - -/** - * Returns the name of the resource group for the current location. - */ -public class LocationToResourceGroupName implements Function<String, String> { - - private final String prefix; - private final char delimiter; - - @Inject - LocationToResourceGroupName(@Named(RESOURCENAME_PREFIX) String prefix, @Named(RESOURCENAME_DELIMITER) char delimiter) { - this.prefix = prefix; - this.delimiter = delimiter; - } - - @Override - public String apply(String input) { - return String.format("%s%s%s", prefix, delimiter, input); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/NetworkSecurityGroupToSecurityGroup.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/NetworkSecurityGroupToSecurityGroup.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/NetworkSecurityGroupToSecurityGroup.java deleted file mode 100644 index d38f94c..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/NetworkSecurityGroupToSecurityGroup.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * 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.compute.functions; - -import static com.google.common.collect.Iterables.filter; -import static com.google.common.collect.Iterables.transform; -import static org.jclouds.azurecompute.arm.compute.domain.ResourceGroupAndName.fromResourceGroupAndName; -import static org.jclouds.azurecompute.arm.compute.functions.NetworkSecurityRuleToIpPermission.InboundRule; -import static org.jclouds.azurecompute.arm.compute.functions.VirtualMachineToNodeMetadata.getLocation; -import static org.jclouds.azurecompute.arm.domain.IdReference.extractResourceGroup; - -import java.util.Set; - -import javax.inject.Singleton; - -import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroup; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRule; -import org.jclouds.collect.Memoized; -import org.jclouds.compute.domain.SecurityGroup; -import org.jclouds.compute.domain.SecurityGroupBuilder; -import org.jclouds.domain.Location; -import org.jclouds.net.domain.IpPermission; - -import com.google.common.base.Function; -import com.google.common.base.Supplier; -import com.google.inject.Inject; - -@Singleton -public class NetworkSecurityGroupToSecurityGroup implements Function<NetworkSecurityGroup, SecurityGroup> { - private final Function<NetworkSecurityRule, IpPermission> ruleToPermission; - private final Supplier<Set<? extends Location>> locations; - - @Inject - NetworkSecurityGroupToSecurityGroup(Function<NetworkSecurityRule, IpPermission> ruleToPermission, - @Memoized Supplier<Set<? extends Location>> locations) { - this.ruleToPermission = ruleToPermission; - this.locations = locations; - } - - @Override - public SecurityGroup apply(NetworkSecurityGroup input) { - SecurityGroupBuilder builder = new SecurityGroupBuilder(); - - builder.id(fromResourceGroupAndName(extractResourceGroup(input.id()), input.name()).slashEncode()); - builder.providerId(input.id()); - builder.name(input.name()); - builder.location(getLocation(locations, input.location())); - - if (input.properties().securityRules() != null) { - // We just support security groups that allow traffic to a set of - // targets. We don't support deny rules or origin based rules in the - // security group api. - builder.ipPermissions(transform(filter(input.properties().securityRules(), InboundRule), ruleToPermission)); - } - - return builder.build(); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/NetworkSecurityRuleToIpPermission.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/NetworkSecurityRuleToIpPermission.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/NetworkSecurityRuleToIpPermission.java deleted file mode 100644 index 10b3174..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/NetworkSecurityRuleToIpPermission.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.compute.functions; - -import javax.annotation.Resource; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRule; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRuleProperties.Access; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRuleProperties.Direction; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.logging.Logger; -import org.jclouds.net.domain.IpPermission; -import org.jclouds.net.domain.IpProtocol; -import org.jclouds.net.util.IpPermissions; -import org.jclouds.net.util.IpPermissions.PortSelection; -import org.jclouds.net.util.IpPermissions.ToSourceSelection; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; - -@Singleton -public class NetworkSecurityRuleToIpPermission implements Function<NetworkSecurityRule, IpPermission> { - - public static final Predicate<NetworkSecurityRule> InboundRule = new Predicate<NetworkSecurityRule>() { - @Override - public boolean apply(NetworkSecurityRule input) { - return Direction.Inbound.equals(input.properties().direction()) - && Access.Allow.equals(input.properties().access()); - } - }; - - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - - @Override - public IpPermission apply(final NetworkSecurityRule rule) { - if (!InboundRule.apply(rule)) { - logger.warn(">> ignoring non-inbound network security rule %s...", rule.name()); - return null; - } - - IpPermission permissions = IpPermissions.permit(IpProtocol.fromValue(rule.properties().protocol().name())); - - String portRange = rule.properties().destinationPortRange(); - if (!"*".equals(portRange)) { - String[] range = portRange.split("-"); // One single element if it is a single port - permissions = PortSelection.class.cast(permissions).fromPort(Integer.parseInt(range[0])) - .to(Integer.parseInt(range[range.length - 1])); - } - - if (!"*".equals(rule.properties().sourceAddressPrefix())) { - permissions = ToSourceSelection.class.cast(permissions).originatingFromCidrBlock( - rule.properties().sourceAddressPrefix()); - } - - return permissions; - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/TemplateToAvailabilitySet.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/TemplateToAvailabilitySet.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/TemplateToAvailabilitySet.java deleted file mode 100644 index 7359ace..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/TemplateToAvailabilitySet.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * 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.compute.functions; - -import static com.google.common.base.Preconditions.checkArgument; - -import java.util.HashMap; -import java.util.Map; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.azurecompute.arm.AzureComputeApi; -import org.jclouds.azurecompute.arm.compute.options.AzureTemplateOptions; -import org.jclouds.azurecompute.arm.domain.AvailabilitySet; -import org.jclouds.compute.domain.Template; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.javax.annotation.Nullable; -import org.jclouds.logging.Logger; - -import com.google.common.base.Function; - -@Singleton -public class TemplateToAvailabilitySet implements Function<Template, AvailabilitySet> { - - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - - private final AzureComputeApi api; - - @Inject - TemplateToAvailabilitySet(AzureComputeApi api) { - this.api = api; - } - - @Nullable - @Override - public AvailabilitySet apply(final Template input) { - checkArgument(input.getOptions() instanceof AzureTemplateOptions, "An AzureTemplateOptions object is required"); - AzureTemplateOptions options = input.getOptions().as(AzureTemplateOptions.class); - - AvailabilitySet availabilitySet = null; - String location = input.getLocation().getId(); - String resourceGroup = options.getResourceGroup(); - - if (options.getAvailabilitySetName() != null) { - availabilitySet = api.getAvailabilitySetApi(resourceGroup).get(options.getAvailabilitySetName()); - - checkArgument(availabilitySet != null, "No availability set with name '%s' was found", options.getAvailabilitySetName()); - checkArgument(location.equals(availabilitySet.location()), "The availability set %s does not belong to location %s", - options.getAvailabilitySetName(), location); - - } else if (options.getAvailabilitySet() != null) { - availabilitySet = api.getAvailabilitySetApi(resourceGroup).get(options.getAvailabilitySet().name()); - - if (availabilitySet != null) { - checkArgument(location.equals(availabilitySet.location()), "The availability set %s does not belong to location %s", - options.getAvailabilitySet().name(), location); - } else { - Map<String, String> tags = new HashMap<String, String>(); - if (options.getAvailabilitySet().tags() != null) { - tags.putAll(options.getAvailabilitySet().tags()); - } - tags.put("jclouds", options.getAvailabilitySet().name()); - - logger.debug(">> creating availability set [%s]", options.getAvailabilitySet().name()); - - availabilitySet = api.getAvailabilitySetApi(resourceGroup).createOrUpdate( - options.getAvailabilitySet().name(), options.getAvailabilitySet().sku(), location, tags, - options.getAvailabilitySet().properties()); - } - } - - return availabilitySet; - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VMHardwareToHardware.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VMHardwareToHardware.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VMHardwareToHardware.java deleted file mode 100644 index d877aba..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VMHardwareToHardware.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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.compute.functions; - -import static org.jclouds.azurecompute.arm.compute.domain.LocationAndName.fromLocationAndName; - -import java.util.Set; - -import org.jclouds.azurecompute.arm.domain.VMHardware; -import org.jclouds.collect.Memoized; -import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.HardwareBuilder; -import org.jclouds.compute.domain.Processor; -import org.jclouds.compute.domain.Volume; -import org.jclouds.compute.domain.VolumeBuilder; -import org.jclouds.domain.Location; -import org.jclouds.location.predicates.LocationPredicates; - -import com.google.common.base.Function; -import com.google.common.base.Supplier; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.inject.Inject; - -public class VMHardwareToHardware implements Function<VMHardware, Hardware> { - - private final Supplier<Set<? extends Location>> locations; - - @Inject - VMHardwareToHardware(@Memoized final Supplier<Set<? extends Location>> locations) { - this.locations = locations; - } - - @Override - public Hardware apply(VMHardware from) { - final HardwareBuilder builder = new HardwareBuilder() - .name(from.name()) - .providerId(from.name()) - .id(fromLocationAndName(from.location(), from.name()).slashEncode()) - .processors(ImmutableList.of(new Processor(from.numberOfCores(), 2))) - .ram(from.memoryInMB()) - .location(FluentIterable.from(locations.get()) - .firstMatch(LocationPredicates.idEquals(from.location())) - .get()); - - // No id or providerId from Azure - if (from.resourceDiskSizeInMB() != null) { - builder.volume(new VolumeBuilder() - .size(Float.valueOf(from.resourceDiskSizeInMB())) - .type(Volume.Type.LOCAL) - .build()); - } - if (from.osDiskSizeInMB() != null) { - builder.volume(new VolumeBuilder() - .size(Float.valueOf(from.osDiskSizeInMB())) - .type(Volume.Type.LOCAL) - .build()); - } - - ImmutableMap.Builder<String, String> metadata = ImmutableMap.builder(); - metadata.put("maxDataDiskCount", String.valueOf(from.maxDataDiskCount())); - builder.userMetadata(metadata.build()); - - return builder.build(); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VMImageToImage.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VMImageToImage.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VMImageToImage.java deleted file mode 100644 index 028ad9c..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VMImageToImage.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * 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.compute.functions; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.Iterables.tryFind; -import static java.util.Arrays.asList; -import static org.jclouds.location.predicates.LocationPredicates.idEquals; - -import java.util.Map; -import java.util.Set; - -import org.jclouds.azurecompute.arm.compute.extensions.AzureComputeImageExtension; -import org.jclouds.azurecompute.arm.domain.Plan; -import org.jclouds.azurecompute.arm.domain.VMImage; -import org.jclouds.collect.Memoized; -import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.ImageBuilder; -import org.jclouds.compute.domain.OperatingSystem; -import org.jclouds.compute.domain.OsFamily; -import org.jclouds.domain.Location; -import org.jclouds.javax.annotation.Nullable; - -import com.google.common.base.Function; -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableMap; -import com.google.inject.Inject; - -public class VMImageToImage implements Function<VMImage, Image> { - - private static final Map<String, OsFamily> OTHER_OS_MAP = ImmutableMap.<String, OsFamily> builder() - .put("openlogic", OsFamily.CENTOS) - .put("win", OsFamily.WINDOWS) - .put("sles", OsFamily.SUSE) - .put("oracle-linux", OsFamily.OEL) - .build(); - - private final Supplier<Set<? extends org.jclouds.domain.Location>> locations; - - @Inject - VMImageToImage(@Memoized Supplier<Set<? extends Location>> locations) { - this.locations = locations; - } - - @Override - public Image apply(final VMImage image) { - final ImageBuilder builder = new ImageBuilder(); - addMarketplacePlanToMetadataIfPresent(builder, image); - - Location location = FluentIterable.from(locations.get()).firstMatch(idEquals(image.location())).get(); - - if (image.custom()) { - builder - .id(image.encodeFieldsToUniqueIdCustom()) - .providerId(image.customImageId()) - .name(image.name()) - .location(location) - .description(image.group()) - .status(Image.Status.AVAILABLE) - .version("latest"); - } else { - builder - .id(image.encodeFieldsToUniqueId()) - .providerId(image.publisher()) - .name(image.offer()) - .location(location) - .description(image.sku()) - .status(Image.Status.AVAILABLE) - .version(image.sku()); - } - - final OperatingSystem.Builder osBuilder = osFamily().apply(image); - builder.operatingSystem(osBuilder.build()); - - return builder.build(); - } - - private static void addMarketplacePlanToMetadataIfPresent(ImageBuilder builder, VMImage image) { - if (image.versionProperties() != null && image.versionProperties().plan() != null) { - // Store the plan information in the metadata so the adapter can - // properly configure it when deploying images from the marketplace - Plan plan = image.versionProperties().plan(); - builder.userMetadata(ImmutableMap.of("publisher", plan.publisher(), "name", plan.name(), "product", - plan.product())); - } - } - - @Nullable - public static Plan getMarketplacePlanFromImageMetadata(Image image) { - Map<String, String> imageMetadata = image.getUserMetadata(); - return imageMetadata.containsKey("product") ? Plan.create(imageMetadata.get("publisher"), - imageMetadata.get("name"), imageMetadata.get("product")) : null; - } - - public static Function<VMImage, OperatingSystem.Builder> osFamily() { - return new Function<VMImage, OperatingSystem.Builder>() { - @Override - public OperatingSystem.Builder apply(final VMImage image) { - final String label = checkNotNull(image.offer(), "offer").toLowerCase(); - OsFamily family = findInStandardFamilies(label).or(findInOtherOSMap(label)).or(OsFamily.UNRECOGNIZED); - - // Fallback to generic operating system type - if (OsFamily.UNRECOGNIZED == family && image.versionProperties() != null - && image.versionProperties().osDiskImage() != null - && image.versionProperties().osDiskImage().operatingSystem() != null) { - family = OsFamily.fromValue(image.versionProperties().osDiskImage().operatingSystem().toUpperCase()); - } - - // only 64bit OS images are supported by Azure ARM - return OperatingSystem.builder().family(family).is64Bit(true) - .description(image.custom() ? AzureComputeImageExtension.CUSTOM_IMAGE_OFFER : image.sku()) - .version(image.custom() ? "latest" : image.sku()); - } - }; - } - - private static Optional<OsFamily> findInStandardFamilies(final String label) { - return tryFind(asList(OsFamily.values()), new Predicate<OsFamily>() { - @Override - public boolean apply(OsFamily input) { - return label.contains(input.value()); - } - }); - } - - private static Optional<OsFamily> findInOtherOSMap(final String label) { - return tryFind(OTHER_OS_MAP.keySet(), new Predicate<String>() { - @Override - public boolean apply(String input) { - return label.contains(input); - } - }).transform(new Function<String, OsFamily>() { - @Override - public OsFamily apply(String input) { - return OTHER_OS_MAP.get(input); - } - }); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java deleted file mode 100644 index af43cbb..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * 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.compute.functions; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Strings.nullToEmpty; -import static com.google.common.collect.Iterables.find; -import static org.jclouds.azurecompute.arm.compute.AzureComputeServiceAdapter.GROUP_KEY; -import static org.jclouds.azurecompute.arm.compute.domain.LocationAndName.fromLocationAndName; -import static org.jclouds.azurecompute.arm.compute.domain.ResourceGroupAndName.fromResourceGroupAndName; -import static org.jclouds.azurecompute.arm.domain.IdReference.extractName; -import static org.jclouds.azurecompute.arm.domain.IdReference.extractResourceGroup; -import static org.jclouds.compute.util.ComputeServiceUtils.addMetadataAndParseTagsFromCommaDelimitedValue; -import static org.jclouds.location.predicates.LocationPredicates.idEquals; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; - -import org.jclouds.azurecompute.arm.AzureComputeApi; -import org.jclouds.azurecompute.arm.compute.domain.LocationAndName; -import org.jclouds.azurecompute.arm.compute.functions.VirtualMachineToStatus.StatusAndBackendStatus; -import org.jclouds.azurecompute.arm.domain.IdReference; -import org.jclouds.azurecompute.arm.domain.IpConfiguration; -import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard; -import org.jclouds.azurecompute.arm.domain.NetworkProfile.NetworkInterface; -import org.jclouds.azurecompute.arm.domain.PublicIPAddress; -import org.jclouds.azurecompute.arm.domain.StorageProfile; -import org.jclouds.azurecompute.arm.domain.VirtualMachine; -import org.jclouds.collect.Memoized; -import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeMetadataBuilder; -import org.jclouds.compute.functions.GroupNamingConvention; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.compute.suppliers.ImageCacheSupplier; -import org.jclouds.domain.Credentials; -import org.jclouds.domain.Location; -import org.jclouds.logging.Logger; - -import com.google.common.base.Function; -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import com.google.common.collect.Lists; - -public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, NodeMetadata> { - - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - - private final AzureComputeApi api; - private final GroupNamingConvention nodeNamingConvention; - private final Supplier<Set<? extends Location>> locations; - private final Supplier<Map<String, ? extends Hardware>> hardwares; - private final ImageCacheSupplier imageCache; - private final VirtualMachineToStatus virtualMachineToStatus; - - @Inject - VirtualMachineToNodeMetadata(AzureComputeApi api, GroupNamingConvention.Factory namingConvention, - Supplier<Map<String, ? extends Hardware>> hardwares, @Memoized Supplier<Set<? extends Location>> locations, - Map<String, Credentials> credentialStore, @Memoized Supplier<Set<? extends Image>> imageCache, - VirtualMachineToStatus virtualMachineToStatus) { - this.api = api; - this.nodeNamingConvention = namingConvention.createWithoutPrefix(); - this.locations = locations; - this.hardwares = hardwares; - this.virtualMachineToStatus = virtualMachineToStatus; - checkArgument(imageCache instanceof ImageCacheSupplier, - "This provider needs an instance of the ImageCacheSupplier"); - this.imageCache = (ImageCacheSupplier) imageCache; - } - - @Override - public NodeMetadata apply(VirtualMachine virtualMachine) { - NodeMetadataBuilder builder = new NodeMetadataBuilder(); - builder.id(fromResourceGroupAndName(extractResourceGroup(virtualMachine.id()), virtualMachine.name()) - .slashEncode()); - builder.providerId(virtualMachine.id()); - builder.name(virtualMachine.name()); - builder.hostname(virtualMachine.name()); - - StatusAndBackendStatus status = virtualMachineToStatus.apply(virtualMachine); - builder.status(status.status()); - builder.backendStatus(status.backendStatus()); - - builder.publicAddresses(getPublicIpAddresses(virtualMachine.properties().networkProfile().networkInterfaces())); - builder.privateAddresses(getPrivateIpAddresses(virtualMachine.properties().networkProfile().networkInterfaces())); - - String groupFromMetadata = null; - if (virtualMachine.tags() != null) { - addMetadataAndParseTagsFromCommaDelimitedValue(builder, virtualMachine.tags()); - groupFromMetadata = virtualMachine.tags().get(GROUP_KEY); - } - - // Try to read the group from the virtual machine tags, and parse the name - // if missing - builder.group(groupFromMetadata != null ? groupFromMetadata : nodeNamingConvention.extractGroup(virtualMachine - .name())); - - String locationName = virtualMachine.location(); - builder.location(getLocation(locations, locationName)); - - Optional<? extends Image> image = findImage(virtualMachine.properties().storageProfile(), locationName); - - if (image.isPresent()) { - builder.imageId(image.get().getId()); - builder.operatingSystem(image.get().getOperatingSystem()); - } else { - logger.info(">> image with id %s for virtualmachine %s was not found. " - + "This might be because the image that was used to create the virtualmachine has a new id.", - virtualMachine.id(), virtualMachine.id()); - } - - builder.hardware(getHardware(fromLocationAndName(virtualMachine.location(), virtualMachine.properties() - .hardwareProfile().vmSize()))); - - return builder.build(); - } - - private Iterable<String> getPrivateIpAddresses(List<NetworkInterface> networkInterfaces) { - List<String> privateIpAddresses = Lists.newArrayList(); - for (NetworkInterface networkInterfaceCardIdReference : networkInterfaces) { - NetworkInterfaceCard networkInterfaceCard = getNetworkInterfaceCard(networkInterfaceCardIdReference); - if (networkInterfaceCard != null && networkInterfaceCard.properties() != null - && networkInterfaceCard.properties().ipConfigurations() != null) { - for (IpConfiguration ipConfiguration : networkInterfaceCard.properties().ipConfigurations()) { - if (ipConfiguration.properties().privateIPAddress() != null) { - privateIpAddresses.add(ipConfiguration.properties().privateIPAddress()); - } - } - } - } - return privateIpAddresses; - } - - private NetworkInterfaceCard getNetworkInterfaceCard(NetworkInterface nic) { - return api.getNetworkInterfaceCardApi(extractResourceGroup(nic.id())).get(extractName(nic.id())); - } - - private Iterable<String> getPublicIpAddresses(List<NetworkInterface> networkInterfaces) { - List<String> publicIpAddresses = Lists.newArrayList(); - for (NetworkInterface networkInterfaceCardIdReference : networkInterfaces) { - NetworkInterfaceCard networkInterfaceCard = getNetworkInterfaceCard(networkInterfaceCardIdReference); - if (networkInterfaceCard != null && networkInterfaceCard.properties() != null - && networkInterfaceCard.properties().ipConfigurations() != null) { - for (IpConfiguration ipConfiguration : networkInterfaceCard.properties().ipConfigurations()) { - if (ipConfiguration.properties().publicIPAddress() != null) { - IdReference publicIpId = ipConfiguration.properties().publicIPAddress(); - PublicIPAddress publicIp = api.getPublicIPAddressApi(publicIpId.resourceGroup()).get( - publicIpId.name()); - if (publicIp != null && publicIp.properties().ipAddress() != null) { - publicIpAddresses.add(publicIp.properties().ipAddress()); - } - } - } - } - } - return publicIpAddresses; - } - - protected static Location getLocation(Supplier<Set<? extends Location>> locations, final String locationName) { - return find(locations.get(), idEquals(nullToEmpty(locationName)), null); - } - - protected Optional<? extends Image> findImage(final StorageProfile storageProfile, String locatioName) { - if (storageProfile.imageReference() != null) { - String imageId = storageProfile.imageReference().customImageId() != null ? - storageProfile.imageReference().encodeFieldsToUniqueIdCustom(locatioName) : - storageProfile.imageReference().encodeFieldsToUniqueId(locatioName); - return imageCache.get(imageId); - } else { - logger.warn("could not find image for storage profile %s", storageProfile); - return Optional.absent(); - } - } - - protected Hardware getHardware(final LocationAndName hardwareId) { - final String slashEncoded = hardwareId.slashEncode(); - return find(hardwares.get().values(), new Predicate<Hardware>() { - @Override - public boolean apply(Hardware input) { - return input.getId().equals(slashEncoded); - } - }); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToStatus.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToStatus.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToStatus.java deleted file mode 100644 index 9669f50..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToStatus.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * 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.compute.functions; - -import static com.google.common.collect.Iterables.transform; -import static org.jclouds.azurecompute.arm.domain.IdReference.extractResourceGroup; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.azurecompute.arm.AzureComputeApi; -import org.jclouds.azurecompute.arm.compute.functions.VirtualMachineToStatus.StatusAndBackendStatus; -import org.jclouds.azurecompute.arm.domain.Status; -import org.jclouds.azurecompute.arm.domain.VirtualMachine; -import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance; -import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance.PowerState; -import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties; -import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties.ProvisioningState; -import org.jclouds.compute.domain.NodeMetadata; - -import com.google.auto.value.AutoValue; -import com.google.common.base.Function; -import com.google.common.base.Functions; -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableMap; - -@Singleton -public class VirtualMachineToStatus implements Function<VirtualMachine, StatusAndBackendStatus> { - - @AutoValue - public abstract static class StatusAndBackendStatus { - public abstract NodeMetadata.Status status(); - - public abstract String backendStatus(); - - public static StatusAndBackendStatus create(NodeMetadata.Status status, String backendStatus) { - return new AutoValue_VirtualMachineToStatus_StatusAndBackendStatus(status, backendStatus); - } - } - - // When using the Deployment API to deploy an ARM template, the deployment - // goes through stages: Accepted -> Running -> Succeeded. - // Only when the deployment has SUCCEEDED is the resource deployed using the - // template actually ready. - // To get details about the resource(s) deployed via template, one needs to - // query the various resources after the deployment has SUCCEEDED. - private static final Function<VirtualMachineProperties.ProvisioningState, NodeMetadata.Status> PROVISIONINGSTATE_TO_NODESTATUS = Functions - .forMap( - ImmutableMap.<VirtualMachineProperties.ProvisioningState, NodeMetadata.Status> builder() - .put(VirtualMachineProperties.ProvisioningState.ACCEPTED, NodeMetadata.Status.PENDING) - .put(VirtualMachineProperties.ProvisioningState.READY, NodeMetadata.Status.PENDING) - .put(VirtualMachineProperties.ProvisioningState.CREATING, NodeMetadata.Status.PENDING) - .put(VirtualMachineProperties.ProvisioningState.RUNNING, NodeMetadata.Status.PENDING) - .put(VirtualMachineProperties.ProvisioningState.UPDATING, NodeMetadata.Status.PENDING) - .put(VirtualMachineProperties.ProvisioningState.DELETED, NodeMetadata.Status.TERMINATED) - .put(VirtualMachineProperties.ProvisioningState.CANCELED, NodeMetadata.Status.TERMINATED) - .put(VirtualMachineProperties.ProvisioningState.FAILED, NodeMetadata.Status.ERROR) - .put(VirtualMachineProperties.ProvisioningState.UNRECOGNIZED, NodeMetadata.Status.UNRECOGNIZED) - .build(), NodeMetadata.Status.UNRECOGNIZED); - - private static final Function<PowerState, NodeMetadata.Status> POWERSTATE_TO_NODESTATUS = Functions.forMap( - ImmutableMap.<PowerState, NodeMetadata.Status> builder().put(PowerState.RUNNING, NodeMetadata.Status.RUNNING) - .put(PowerState.STOPPED, NodeMetadata.Status.SUSPENDED) - .put(PowerState.UNRECOGNIZED, NodeMetadata.Status.UNRECOGNIZED).build(), - NodeMetadata.Status.UNRECOGNIZED); - - private final AzureComputeApi api; - - @Inject - VirtualMachineToStatus(AzureComputeApi api) { - this.api = api; - } - - @Override - public StatusAndBackendStatus apply(VirtualMachine virtualMachine) { - String resourceGroup = extractResourceGroup(virtualMachine.id()); - ProvisioningState provisioningState = virtualMachine.properties().provisioningState(); - - NodeMetadata.Status status = PROVISIONINGSTATE_TO_NODESTATUS.apply(provisioningState); - String backendStatus = provisioningState.name(); - - if (ProvisioningState.SUCCEEDED.equals(provisioningState)) { - // If the provisioning succeeded, we need to query the *real* status of - // the VM - VirtualMachineInstance instanceDetails = api.getVirtualMachineApi(resourceGroup).getInstanceDetails( - virtualMachine.name()); - if (instanceDetails != null && instanceDetails.powerState() != null) { - status = POWERSTATE_TO_NODESTATUS.apply(instanceDetails.powerState()); - backendStatus = Joiner.on(',').join(transform(instanceDetails.statuses(), new Function<Status, String>() { - @Override - public String apply(Status input) { - return input.code(); - } - })); - } else { - status = NodeMetadata.Status.PENDING; - } - } - - return StatusAndBackendStatus.create(status, backendStatus); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/loaders/CreateSecurityGroupIfNeeded.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/loaders/CreateSecurityGroupIfNeeded.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/loaders/CreateSecurityGroupIfNeeded.java deleted file mode 100644 index baba6f9..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/loaders/CreateSecurityGroupIfNeeded.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * 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.compute.loaders; - -import static com.google.common.base.Preconditions.checkState; -import static org.jclouds.compute.util.ComputeServiceUtils.getPortRangesFromList; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.azurecompute.arm.AzureComputeApi; -import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.SecurityGroupAvailablePredicateFactory; -import org.jclouds.azurecompute.arm.compute.domain.ResourceGroupAndNameAndIngressRules; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroup; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroupProperties; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRule; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRuleProperties; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRuleProperties.Access; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRuleProperties.Direction; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRuleProperties.Protocol; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.logging.Logger; - -import com.google.common.cache.CacheLoader; - -@Singleton -public class CreateSecurityGroupIfNeeded extends CacheLoader<ResourceGroupAndNameAndIngressRules, String> { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - - private final AzureComputeApi api; - private final SecurityGroupAvailablePredicateFactory securityGroupAvailable; - - @Inject - CreateSecurityGroupIfNeeded(AzureComputeApi api, SecurityGroupAvailablePredicateFactory securityRuleAvailable) { - this.api = api; - this.securityGroupAvailable = securityRuleAvailable; - } - - @Override - public String load(ResourceGroupAndNameAndIngressRules key) throws Exception { - return createSecurityGroup(key.location(), key.resourceGroup(), key.name(), key.inboundPorts()); - } - - private String createSecurityGroup(String location, String resourceGroup, String name, int[] inboundPorts) { - logger.debug(">> creating security group %s in %s...", name, location); - - Map<Integer, Integer> portRanges = getPortRangesFromList(inboundPorts); - - List<NetworkSecurityRule> rules = new ArrayList<NetworkSecurityRule>(); - - int startPriority = 100; - for (Map.Entry<Integer, Integer> portRange : portRanges.entrySet()) { - String range = portRange.getKey() + "-" + portRange.getValue(); - String ruleName = "tcp-" + range; - - NetworkSecurityRuleProperties properties = NetworkSecurityRuleProperties.builder().protocol(Protocol.Tcp) // - .sourceAddressPrefix("*") // - .sourcePortRange("*") // - .destinationAddressPrefix("*") // - .destinationPortRange(range) // - .direction(Direction.Inbound) // - .access(Access.Allow) // - .priority(startPriority++) // - .build(); - - rules.add(NetworkSecurityRule.create(ruleName, null, null, properties)); - } - - NetworkSecurityGroup securityGroup = api.getNetworkSecurityGroupApi(resourceGroup).createOrUpdate(name, location, - null, NetworkSecurityGroupProperties.builder().securityRules(rules).build()); - - checkState(securityGroupAvailable.create(resourceGroup).apply(name), - "Security group was not created in the configured timeout"); - - return securityGroup.id(); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/loaders/DefaultResourceGroup.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/loaders/DefaultResourceGroup.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/loaders/DefaultResourceGroup.java deleted file mode 100644 index 7caec25..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/loaders/DefaultResourceGroup.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.compute.loaders; - -import java.util.Map; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.azurecompute.arm.AzureComputeApi; -import org.jclouds.azurecompute.arm.compute.functions.LocationToResourceGroupName; -import org.jclouds.azurecompute.arm.domain.ResourceGroup; -import org.jclouds.azurecompute.arm.features.ResourceGroupApi; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.logging.Logger; - -import com.google.common.cache.CacheLoader; -import com.google.common.collect.ImmutableMap; - -@Singleton -public class DefaultResourceGroup extends CacheLoader<String, ResourceGroup> { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - - private final ResourceGroupApi api; - private final LocationToResourceGroupName locationToResourceGroupName; - - @Inject - DefaultResourceGroup(AzureComputeApi api, LocationToResourceGroupName locationToResourceGroupName) { - this.api = api.getResourceGroupApi(); - this.locationToResourceGroupName = locationToResourceGroupName; - } - - @Override - public ResourceGroup load(String locationId) throws Exception { - String azureGroupName = locationToResourceGroupName.apply(locationId); - ResourceGroup resourceGroup = api.get(azureGroupName); - if (resourceGroup == null) { - logger.debug(">> creating resource group %s", azureGroupName); - final Map<String, String> tags = ImmutableMap.of("description", "jclouds default resource group"); - resourceGroup = api.create(azureGroupName, locationId, tags); - } - return resourceGroup; - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/options/AzureTemplateOptions.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/options/AzureTemplateOptions.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/options/AzureTemplateOptions.java deleted file mode 100644 index b551811..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/options/AzureTemplateOptions.java +++ /dev/null @@ -1,324 +0,0 @@ -/* - * 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.compute.options; - -import static com.google.common.base.Preconditions.checkNotNull; - -import java.util.List; - -import org.jclouds.azurecompute.arm.domain.AvailabilitySet; -import org.jclouds.azurecompute.arm.domain.DataDisk; -import org.jclouds.azurecompute.arm.domain.OSProfile.WindowsConfiguration; -import org.jclouds.azurecompute.arm.domain.Secrets; -import org.jclouds.compute.options.TemplateOptions; - -import com.google.common.base.MoreObjects; -import com.google.common.base.Objects; -import com.google.common.collect.ImmutableList; - -/** - * Azure ARM custom options - */ -public class AzureTemplateOptions extends TemplateOptions implements Cloneable { - - private AvailabilitySet availabilitySet; - private String availabilitySetName; - private List<DataDisk> dataDisks = ImmutableList.of(); - private String resourceGroup; - private List<IpOptions> ipOptions = ImmutableList.of(); - private WindowsConfiguration windowsConfiguration; - private List<Secrets> secrets = ImmutableList.of(); - private String customData; - - /** - * Sets the availability set where the nodes will be configured. If it does - * not exist jclouds will create a new one with the given configuration. - */ - public AzureTemplateOptions availabilitySet(AvailabilitySet availabilitySet) { - this.availabilitySet = availabilitySet; - return this; - } - - /** - * Sets the availability set where the nodes will be configured. The - * availability set must exist. - */ - public AzureTemplateOptions availabilitySet(String availabilitySetName) { - this.availabilitySetName = availabilitySetName; - return this; - } - - /** - * The resource group where the new resources will be created. - */ - public AzureTemplateOptions resourceGroup(String resourceGroup) { - this.resourceGroup = resourceGroup; - return this; - } - - public AzureTemplateOptions dataDisks(Iterable<DataDisk> dataDisks) { - for (DataDisk dataDisk : checkNotNull(dataDisks, "dataDisks")) - checkNotNull(dataDisk, "all dataDisks must be non-empty"); - this.dataDisks = ImmutableList.copyOf(dataDisks); - return this; - } - - public AzureTemplateOptions dataDisks(DataDisk... dataDisks) { - return dataDisks(ImmutableList.copyOf(checkNotNull(dataDisks, "dataDisks"))); - } - - /** - * Configure the NICs that will be attached to the created nodes. - * <p> - * Note that the number of NICs that can be attached depends on the size of - * the virtual machine, and that the guest operating system needs to be - * prepared to set up all the configured interfaces. - * <p> - * Depending on the image being used, a cloud-init or bootstrap script might - * be needed to make the interface setup. - */ - public AzureTemplateOptions ipOptions(Iterable<IpOptions> ipOptions) { - for (IpOptions ipOption : checkNotNull(ipOptions, "ipOptions")) - checkNotNull(ipOption, "all ipOptions must be non-empty"); - this.ipOptions = ImmutableList.copyOf(ipOptions); - return this; - } - - /** - * @see {@link AzureTemplateOptions#ipOptions(Iterable) - - */ - public AzureTemplateOptions ipOptions(IpOptions... ipOptions) { - return ipOptions(ImmutableList.copyOf(checkNotNull(ipOptions, "ipOptions"))); - } - - /** - * Windows configuration parameters - * - * @see <a - * href="https://docs.microsoft.com/en-us/rest/api/compute/virtualmachines/virtualmachines-create-or-update#bk_windowsconfig5">docs</a> - */ - public AzureTemplateOptions windowsConfiguration(WindowsConfiguration windowsConfiguration) { - this.windowsConfiguration = windowsConfiguration; - return this; - } - - /** - * Import certificates in the Windows Certificate Store - * - * @see <a - * href="https://docs.microsoft.com/en-us/rest/api/compute/virtualmachines/virtualmachines-create-or-update#bk_srcvault">docs</a> - */ - public AzureTemplateOptions secrets(Iterable<? extends Secrets> secrets) { - for (Secrets secret : checkNotNull(secrets, "secrets")) - checkNotNull(secret, "secrets can not be empty"); - this.secrets = ImmutableList.copyOf(secrets); - return this; - } - - /** - * Custom data (for cloud-init) for the Azure ARM API - */ - public AzureTemplateOptions customData(String customData) { - this.customData = customData; - return this; - } - - public AvailabilitySet getAvailabilitySet() { - return availabilitySet; - } - - public String getAvailabilitySetName() { - return availabilitySetName; - } - - public List<DataDisk> getDataDisks() { - return dataDisks; - } - - public String getResourceGroup() { - return resourceGroup; - } - - public List<IpOptions> getIpOptions() { - return ipOptions; - } - - public WindowsConfiguration getWindowsConfiguration() { - return windowsConfiguration; - } - - public List<Secrets> getSecrets() { - return secrets; - } - - public String getCustomData() { - return customData; - } - - @Override - public AzureTemplateOptions clone() { - AzureTemplateOptions options = new AzureTemplateOptions(); - copyTo(options); - return options; - } - - @Override - public void copyTo(TemplateOptions to) { - super.copyTo(to); - if (to instanceof AzureTemplateOptions) { - AzureTemplateOptions eTo = AzureTemplateOptions.class.cast(to); - eTo.availabilitySet(availabilitySet); - eTo.availabilitySet(availabilitySetName); - eTo.dataDisks(dataDisks); - eTo.resourceGroup(resourceGroup); - eTo.ipOptions(ipOptions); - eTo.windowsConfiguration(windowsConfiguration); - eTo.secrets(secrets); - eTo.customData(customData); - } - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (!(o instanceof AzureTemplateOptions)) - return false; - if (!super.equals(o)) - return false; - - AzureTemplateOptions that = (AzureTemplateOptions) o; - - return Objects.equal(availabilitySetName, that.availabilitySetName) - && Objects.equal(resourceGroup, that.resourceGroup) && Objects.equal(availabilitySet, that.availabilitySet) - && Objects.equal(dataDisks, that.dataDisks) && Objects.equal(ipOptions, that.ipOptions) - && Objects.equal(windowsConfiguration, that.windowsConfiguration) && Objects.equal(secrets, that.secrets) - && Objects.equal(this.customData, that.customData); - } - - @Override - public int hashCode() { - return Objects.hashCode(super.hashCode(), availabilitySet, availabilitySetName, dataDisks, resourceGroup, - ipOptions, customData); - } - - @Override - public MoreObjects.ToStringHelper string() { - MoreObjects.ToStringHelper toString = super.string(); - if (availabilitySet != null) - toString.add("availabilitySet", availabilitySet); - if (availabilitySetName != null) - toString.add("availabilitySetName", availabilitySetName); - if (!dataDisks.isEmpty()) - toString.add("dataDisks", dataDisks); - if (resourceGroup != null) - toString.add("resourceGroup", resourceGroup); - if (!ipOptions.isEmpty()) - toString.add("ipOptions", ipOptions); - if (windowsConfiguration != null) - toString.add("windowsConfiguration", windowsConfiguration); - if (!secrets.isEmpty()) - toString.add("secrets", secrets); - if (customData != null) - toString.add("customData", customData); - return toString; - } - - public static class Builder { - - /** - * @see AzureTemplateOptions#availabilitySet(AvailabilitySet) - */ - public static AzureTemplateOptions availabilitySet(AvailabilitySet availabilitySet) { - AzureTemplateOptions options = new AzureTemplateOptions(); - return options.availabilitySet(availabilitySet); - } - - /** - * @see AzureTemplateOptions#availabilitySet(String) - */ - public static AzureTemplateOptions availabilitySet(String availabilitySetName) { - AzureTemplateOptions options = new AzureTemplateOptions(); - return options.availabilitySet(availabilitySetName); - } - - /** - * @see AzureTemplateOptions#dataDisks(DataDisk...) - */ - public static AzureTemplateOptions dataDisks(DataDisk... dataDisks) { - AzureTemplateOptions options = new AzureTemplateOptions(); - return options.dataDisks(dataDisks); - } - - /** - * @see AzureTemplateOptions#dataDisks(Iterable) - */ - public static AzureTemplateOptions dataDisks(Iterable<DataDisk> dataDisks) { - AzureTemplateOptions options = new AzureTemplateOptions(); - return options.dataDisks(dataDisks); - } - - /** - * @see AzureTemplateOptions#resourceGroup(String) - */ - public static AzureTemplateOptions resourceGroup(String resourceGroup) { - AzureTemplateOptions options = new AzureTemplateOptions(); - return options.resourceGroup(resourceGroup); - } - - /** - * @see AzureTemplateOptions#ipOptions(IpOptions...) - */ - public static AzureTemplateOptions ipOptions(IpOptions... ipOptions) { - AzureTemplateOptions options = new AzureTemplateOptions(); - return options.ipOptions(ipOptions); - } - - /** - * @see AzureTemplateOptions#ipOptions(Iterable) - */ - public static AzureTemplateOptions ipOptions(Iterable<IpOptions> ipOptions) { - AzureTemplateOptions options = new AzureTemplateOptions(); - return options.ipOptions(ipOptions); - } - - /** - * @see AzureTemplateOptions#windowsConfiguration(WindowsConfiguration) - */ - public static AzureTemplateOptions windowsConfiguration(WindowsConfiguration windowsConfiguration) { - AzureTemplateOptions options = new AzureTemplateOptions(); - return options.windowsConfiguration(windowsConfiguration); - } - - /** - * @see AzureTemplateOptions#secrets(List) - */ - public static AzureTemplateOptions secrets(Iterable<? extends Secrets> secrets) { - AzureTemplateOptions options = new AzureTemplateOptions(); - return options.secrets(secrets); - } - - /** - * @see AzureTemplateOptions#customData - */ - public static AzureTemplateOptions customData(String customData) { - AzureTemplateOptions options = new AzureTemplateOptions(); - return options.customData(customData); - } - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/ac03bac4/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/options/IpOptions.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/options/IpOptions.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/options/IpOptions.java deleted file mode 100644 index 73c4c6c..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/options/IpOptions.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.compute.options; - -import org.jclouds.javax.annotation.Nullable; - -import com.google.auto.value.AutoValue; -import com.google.common.base.Optional; - -/** - * Configures the ip addresses to be configured for the created nodes. - */ -@AutoValue -public abstract class IpOptions { - - /** - * The subnet where the NIC will be attached. - */ - public abstract String subnet(); - - /** - * The IP address to be configured, in case of static allocation, or absent - * for dynamic assignment. - */ - public abstract Optional<String> address(); - - /** - * Flag to indicate if a public ip address should be allocated and bound to - * this NIC. - */ - public abstract boolean allocateNewPublicIp(); - - /** - * ID of the public IP to associate with the NIC. - */ - @Nullable - public abstract String publicIpId(); - - IpOptions() { - - } - - public abstract Builder toBuilder(); - - public static Builder builder() { - return new AutoValue_IpOptions.Builder().address((String) null).allocateNewPublicIp(false); - } - - @AutoValue.Builder - public abstract static class Builder { - public abstract Builder subnet(String subnet); - public abstract Builder allocateNewPublicIp(boolean allocatePublicIp); - public abstract Builder publicIpId(String publicIpId); - - abstract Builder address(Optional<String> address); - public Builder address(String address) { - return address(Optional.fromNullable(address)); - } - - public abstract IpOptions build(); - } -}
