nacx requested changes on this pull request.


> @@ -66,6 +69,7 @@ public static Properties defaultProperties() {
       properties.put(POLL_MAX_PERIOD, 2L * 10L);
       properties.put(PROPERTY_SO_TIMEOUT, 60000 * 5);
       properties.put(PROPERTY_CONNECTION_TIMEOUT, 60000 * 5);
+      properties.put(PROPERTY_MAX_RATE_LIMIT_WAIT, 20);

Note that the value is in milliseconds, so under a rate limited environment 
this is likely to have no effect.

>           logger.trace(">> provisioning complete for server. returned 
> id='%s'", server.id());
 
       } catch (Exception ex) {
          logger.error(ex, ">> failed to provision server. rollbacking..");
          throw Throwables.propagate(ex);
       }
 
-      return new NodeAndInitialCredentials<Server>(server, server.id(), null);
+      LoginCredentials serverCredentials = LoginCredentials.builder()
+              .user(loginUser)
+              .password(password)
+              .privateKey(privateKey)
+              .build();

Remove this and don't pass the initial credentials (now it is unused). We can 
discuss the details of the node access once everything else is in place.

>     }
 
    @Override
-   public List<HardwareFlavour> listHardwareProfiles() {
-      return api.serverApi().listHardwareFlavours();
+   public List<Hardware> listHardwareProfiles() {

Why it is now a hardcoded list instead of calling the API?

> -         logger.trace(">> found image [%s].", image.name());
-         return image;
+      GenericQueryOptions options = new GenericQueryOptions();
+      options.options(0, 0, null, id, null);
+      try {
+         List<ServerAppliance> list = api.serverApplianceApi().list(options);
+         if (list.size() > 0) {
+            ServerAppliance appliance = list.get(0);
+            List<SingleServerAppliance.AvailableDataCenters> 
availableDatacenters = new 
ArrayList<SingleServerAppliance.AvailableDataCenters>();
+            for (String dcId : appliance.availableDataCenters()) {
+               
availableDatacenters.add(SingleServerAppliance.AvailableDataCenters.create(dcId,
 ""));
+            }
+            SingleServerAppliance image = 
SingleServerAppliance.create(appliance.id(), appliance.name(), 
availableDatacenters, appliance.osInstallationBase(),
+                    appliance.osFamily(), appliance.os(), 
appliance.osVersion(), appliance.osArchitecture(), appliance.osImageType(), 
appliance.minHddSize(),
+                    appliance.type(), appliance.state(), appliance.version(), 
appliance.categories(), appliance.eulaUrl());
+            if (image != null) {

This check is redundant.

>        logger.debug("Destroying %s ...", id);
+      try {
+         GenericQueryOptions options = new GenericQueryOptions().options(0, 0, 
null, node.name() + " firewall policy", null);
+         List<FirewallPolicy> firewallRules = 
api.firewallPolicyApi().list(options);
+         for (FirewallPolicy firewallRule : firewallRules) {
+            api.firewallPolicyApi().delete(firewallRule.id());
+         }
+      } catch (Exception ex) {
+         logger.debug("no firewall policies found for %s ...", id);
+      }

The logic to delete the firewalls should be better moved to a 
`OneAndOneComputeService` class that implements the 
`cleanUpIncidentalResourcesOfDeadNodes` method. Thake the [azurecompute-arm 
implementation](https://github.com/jclouds/jclouds-labs/blob/master/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeService.java#L103)
 as an example.

> +            return OsFamily.UBUNTU;
+         }
+
+         if (osFamily.toLowerCase().contains("debian")) {
+            return OsFamily.DEBIAN;
+         }
+
+         if (osFamily.toLowerCase().contains("centos")) {
+            return OsFamily.CENTOS;
+         }
+
+         if (osFamily.toLowerCase().contains("ArchLinux")) {
+            return OsFamily.ARCH;
+         }
+      }
+      return OsFamily.UNRECOGNIZED;

Better do something like https://github.com/jclouds/jclouds-labs/pull/353 to 
consider all known OsFamilies.

> +   @Override
+   public Map<?, ListenableFuture<Void>> execute(String group, int count, 
final Template template,
+           Set<NodeMetadata> goodNodes, Map<NodeMetadata, Exception> badNodes,
+           Multimap<NodeMetadata, CustomizationResponse> 
customizationResponses) {
+
+      logger.info(">> looking for a datacenter in %s", 
template.getLocation().getId());
+
+      // Try to find an existing datacenter in the selected location
+      DataCenter dataCenter = find(api.dataCenterApi().list(), new 
Predicate<DataCenter>() {
+         @Override
+         public boolean apply(DataCenter input) {
+            // The location field is not populated when getting the list of 
datacenters
+            DataCenter details = api.dataCenterApi().get(input.id());
+            return details != null && 
template.getLocation().getId().equals((details.countryCode().toLowerCase()));
+         }
+      }, null);

Don't use `null` as a default value and let it fail, since it is mandatory.

> +import com.google.inject.Inject;
+import javax.annotation.Resource;
+import javax.inject.Named;
+import static org.jclouds.Constants.PROPERTY_MAX_RATE_LIMIT_WAIT;
+import static org.jclouds.Constants.PROPERTY_MAX_RETRIES;
+import org.jclouds.http.HttpCommand;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.http.HttpRetryHandler;
+import org.jclouds.logging.Logger;
+
+/**
+ * Retry handler that takes into account the provider rate limit and delays the
+ * requests until they are known to succeed.
+ */
+@Beta
+public abstract class AliRateLimitRetryHandler implements HttpRetryHandler {

Remove this class

-- 
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/338#pullrequestreview-18837311

Reply via email to