Re: [jclouds/jclouds-labs] [JCLOUDS-1430] Aliyun ECS (#443)

2018-08-02 Thread Ignasi Barrera
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)

2018-08-02 Thread Ignasi Barrera
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)

2018-08-02 Thread Andrea Turli
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)

2018-08-02 Thread Andrea Turli
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)

2018-08-02 Thread Andrea Turli
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)

2018-08-02 Thread Andrea Turli
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)

2018-08-02 Thread Andrea Turli
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)

2018-08-02 Thread Andrea Turli
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)

2018-08-02 Thread Andrea Turli
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)

2018-08-02 Thread Andrea Turli
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)

2018-08-02 Thread Andrea Turli
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)

2018-08-02 Thread Andrea Turli
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)

2018-08-02 Thread Andrea Turli
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)

2018-08-02 Thread Andrea Turli
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)

2018-08-02 Thread Andrea Turli
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