Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
nacx commented on this pull request. > + vSwitchId = setIfTestSystemPropertyPresent(properties, provider + > ".vSwitchId"); + return properties; + } + + @Override + protected TemplateBuilder templateBuilder() { + return super.templateBuilder() + .options(vpcId(vpcId) + .vSwitchId(vSwitchId)); + } + + @Override + protected Template addRunScriptToTemplate(Template template) { + template.getOptions().runScript(Statements.newStatementList( +new Statement[] { AdminAccess.standard(), Statements.exec("sleep 50"), InstallJDK.fromOpenJDK() })); + return template; Oh, really? I have to give it a try then... -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207274950
Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
nacx commented on this pull request. > + this.instanceSuspendedPredicate = instanceSuspendedPredicate; + this.regionIds = regionIds; + this.cleanupResources = cleanupResources; + } + + @Override + public NodeAndInitialCredentials createNodeWithGroupEncodedIntoName(String group, String name, Template template) { + String instanceType = template.getHardware().getId(); + String regionId = template.getLocation().getId(); + String imageId = template.getImage().getId(); + + ECSServiceTemplateOptions templateOptions = template.getOptions().as(ECSServiceTemplateOptions.class); + + String keyPairName = templateOptions.getKeyPairName(); + String securityGroupId = Iterables.getOnlyElement(templateOptions.getGroups()); + String vSwitchId = templateOptions.getVSwitchId(); We already do that in Azure. See [here](https://github.com/jclouds/jclouds/blob/master/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodes.java#L136). If the network does not exist, we create one with default CIDR values, and we let users override those defaults via properties. If creating a VPC is mostly about configuring the network and address space, I'd suggest following the same approachn here. -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207273170
Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
andreaturli commented on this pull request. > + vSwitchId = setIfTestSystemPropertyPresent(properties, provider + > ".vSwitchId"); + return properties; + } + + @Override + protected TemplateBuilder templateBuilder() { + return super.templateBuilder() + .options(vpcId(vpcId) + .vSwitchId(vSwitchId)); + } + + @Override + protected Template addRunScriptToTemplate(Template template) { + template.getOptions().runScript(Statements.newStatementList( +new Statement[] { AdminAccess.standard(), Statements.exec("sleep 50"), InstallJDK.fromOpenJDK() })); + return template; this was an ugly test, we need to fix `InstallJDK` as it is broken for yum-based OS, IMHO -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207259289
Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
andreaturli commented on this pull request. > @@ -92,4 +94,14 @@ public boolean apply(@Nullable String input) { }), "Cannot starts with " + Iterables.toString(FORBIDDEN_PREFIX)); } + /** +* This is strictly not needed but apparently tags with `-` can create a problem when using API, so I've decided to use +* base64 encoding +* @param value +* @return +*/ + public String encodeTag(String value) { not needed anymore, thx -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207255836
Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
andreaturli commented on this pull request. > + + String securityGroupId = null; + if (!options.getGroups().isEmpty()) { + Iterable securityGroupNames = api.securityGroupApi().list(location.getId()).concat().transform(new Function() { +@Override +public String apply(SecurityGroup input) { + return input.name(); +} + }); + for (String securityGroupName : options.getGroups()) { +checkState(Iterables.contains(securityGroupNames, securityGroupName), "Cannot find security group with name " + securityGroupName + ". \nSecurity groups available are: \n" + Iterables.toString(securityGroupNames)); // { + } + } else if (options.getInboundPorts().length > 0) { + String name = namingConvention.create().sharedNameForGroup(group); + SecurityGroupRequest securityGroupRequest = api.securityGroupApi().create(location.getId(), + CreateSecurityGroupOptions.Builder.securityGroupName(name).vpcId(options.getVpcId())); ok for validating them, not entirely sure about create a vSwitch if not available -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207199172
Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
andreaturli commented on this pull request. > + } else { +logger.warn(">> security group: (%s) has not been deleted.", securityGroupId); + } + } + + return instanceDeleted; + } + + private List getSecurityGroupIdsUsedByNode(RegionAndId regionAndId) { + List securityGroupIds = Lists.newArrayList(); + PaginatedCollection instances = api.instanceApi().list(regionAndId.regionId(), ListInstancesOptions.Builder.instanceIds(regionAndId.id())); + if (instances.isEmpty()) return securityGroupIds; + + Instance instance = Iterables.get(instances, 0); + if (instance != null && !instance.securityGroupIds().isEmpty()) { + securityGroupIds = instance.securityGroupIds().values().iterator().next(); again it's a list ;) -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207136327
Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
andreaturli commented on this pull request. > + if (hardware.isPresent()) { + builder.hardware(hardware.get()); + } else { + logger.info(">> hardware with id %s for instance %s was not found. " + + "This might be because the image that was used to create the instance has a new id.", + from.instanceType(), from.instanceId()); + } + + builder.id(RegionAndId.slashEncodeRegionAndId(from.regionId(), from.instanceId())); + builder.providerId(from.instanceId()); + builder.name(from.instanceName()); + builder.hostname(String.format("%s", from.hostname())); + builder.group(groupNamingConvention.extractGroup(from.instanceName())); + builder.status(toPortableStatus.apply(from.status())); + builder.privateAddresses(from.innerIpAddress().entrySet().iterator().next().getValue()); + builder.publicAddresses(from.publicIpAddress().entrySet().iterator().next().getValue()); it's a weird data structure, getValue returns a List! :D -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207135700
Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
andreaturli commented on this pull request. > + +import com.google.common.base.MoreObjects; +import com.google.common.base.Objects; +import org.jclouds.compute.options.TemplateOptions; + +import static com.google.common.base.Objects.equal; + +/** + * Custom options for the Alibaba Elastic Compute Service API. + */ +public class ECSServiceTemplateOptions extends TemplateOptions implements Cloneable { + + private String keyPairName = ""; + private String vpcId = ""; + private String vSwitchId = ""; + private String userData = ""; possibly, removing -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207135922
Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
andreaturli commented on this pull request. > + private final Supplier> hardwares; + private final Supplier> locations; + private final Function toPortableStatus; + private final GroupNamingConvention groupNamingConvention; + @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) protected Logger logger = Logger.NULL; + + @Inject + public InstanceToNodeMetadata(InstanceTypeToHardware instanceTypeToHardware, + Supplier> images, + Supplier> hardwares, + @Memoized Supplier> locations, + Function toPortableStatus, + GroupNamingConvention.Factory groupNamingConvention) { + this.instanceTypeToHardware = instanceTypeToHardware; + this.images = checkNotNull(images, "images cannot be null"); + this.hardwares = checkNotNull(hardwares, "hardwares cannot be null"); ok -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207135462
Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
andreaturli commented on this pull request. > + @Override + public boolean apply(@Nullable InstanceType input) { +return contains(instanceTypeIds.build(), input.instanceTypeId()); + } + }).toList(); + + return instanceTypes; + } + + private List getInstanceTypeId(String regionId) { + List instanceTypeIds = Lists.newArrayList(); + for (AvailableZone availableZone : api.instanceApi().listInstanceTypesByAvailableZone(regionId)) { + for (AvailableResource availableResource : availableZone.availableResources().get("AvailableResource")) { +for (SupportedResource supportedResource : availableResource.supportedResources() +.get("SupportedResource")) { + if ("Available".equals(supportedResource.status())) { ok -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207133392
Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
andreaturli commented on this pull request. > + transform(listLocations(), new Function() { + @Override + public String apply(Region location) { +return location.id(); + } + })); + + for (String regionId : availableLocationNames) { + instances.addAll(api.instanceApi().list(regionId).concat()); + } + return instances.build(); + } + + @Override + public Iterable listNodesByIds(final Iterable ids) { + return filter(listNodes(), new Predicate() { done -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207133421
Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
andreaturli commented on this pull request. > + for (String regionId : availableLocationNames) { + instanceTypeIds.addAll(getInstanceTypeId(regionId)); + } + + List instanceTypes = FluentIterable.from(api.instanceApi().listTypes()) + .filter(new Predicate() { + @Override + public boolean apply(@Nullable InstanceType input) { +return contains(instanceTypeIds.build(), input.instanceTypeId()); + } + }).toList(); + + return instanceTypes; + } + + private List getInstanceTypeId(String regionId) { ok -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207133364
Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
andreaturli commented on this pull request. > + + for (String regionId : availableLocationNames) { + images.addAll(api.imageApi().list(regionId).concat()); + } + return images.build(); + } + + @Override + public Image getImage(final String id) { + Optional firstInterestingImage = Iterables.tryFind(listImages(), new Predicate() { + public boolean apply(Image input) { +return input.id().equals(id); + } + }); + if (!firstInterestingImage.isPresent()) { + throw new IllegalStateException("Cannot find image with the required slug " + id); ok -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207133407
Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
andreaturli commented on this pull request. > + transform(listLocations(), new Function() { + @Override + public String apply(Region location) { +return location.id(); + } + })); + + for (String regionId : availableLocationNames) { + instanceTypeIds.addAll(getInstanceTypeId(regionId)); + } + + List instanceTypes = FluentIterable.from(api.instanceApi().listTypes()) + .filter(new Predicate() { + @Override + public boolean apply(@Nullable InstanceType input) { +return contains(instanceTypeIds.build(), input.instanceTypeId()); thx -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207133342
Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)
andreaturli commented on this pull request. > +} + } + } + return instanceTypeIds; + } + + @Override + public Iterable listImages() { + final ImmutableList.Builder images = ImmutableList.builder(); + final List availableLocationNames = newArrayList( + transform(listLocations(), new Function() { + @Override + public String apply(Region location) { +return location.id(); + } + })); awesome -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/443#discussion_r207126456