public ListBoxModel doFillSizeIdItems(@RelativePath("..") @QueryParameter String authToken)
        throws Exception {

      List<Size> availableSizes = DigitalOcean.getAvailableSizes(authToken);
      ListBoxModel model = new ListBoxModel();

      for (Size size : availableSizes) {
        model.add(DigitalOcean.buildSizeLabel(size), size.getSlug());
      }

      return model;
    }
    public ListBoxModel doFillImageIdItems(@RelativePath("..") @QueryParameter String authToken)
        throws Exception {

      SortedMap<String, Image> availableImages = DigitalOcean.getAvailableImages(authToken);
      ListBoxModel model = new ListBoxModel();

      for (Map.Entry<String, Image> entry : availableImages.entrySet()) {
        final Image image = entry.getValue();

        // For non-snapshots, use the image ID instead of the slug (which isn't available anyway)
        // so that we can build images based upon backups.
        final String value = DigitalOcean.getImageIdentifier(image);

        model.add(entry.getKey(), value);
      }

      return model;
    }
    public ListBoxModel doFillRegionIdItems(@RelativePath("..") @QueryParameter String authToken)
        throws Exception {

      List<Region> availableSizes = DigitalOcean.getAvailableRegions(authToken);
      ListBoxModel model = new ListBoxModel();

      for (Region region : availableSizes) {
        model.add(region.getName(), region.getSlug());
      }

      return model;
    }
  private Connection connectToSsh(Computer computer, PrintStream logger)
      throws RequestUnsuccessfulException, DigitalOceanException {

    final long timeout = TimeUnit2.MINUTES.toMillis(computer.getCloud().getTimeoutMinutes());
    final long startTime = System.currentTimeMillis();
    final int sleepTime = 10;

    long waitTime;

    while ((waitTime = System.currentTimeMillis() - startTime) < timeout) {

      // Hack to fetch this each time through the loop to get the latest information.
      final Droplet droplet =
          DigitalOcean.getDroplet(
              computer.getCloud().getAuthToken(), computer.getNode().getDropletId());

      if (isDropletStarting(droplet)) {
        logger.println(
            "Waiting for droplet to enter ACTIVE state. Sleeping " + sleepTime + " seconds.");
      } else {
        try {
          final String host = getIpAddress(computer);

          if (Strings.isNullOrEmpty(host) || "0.0.0.0".equals(host)) {
            logger.println(
                "No ip address yet, your host is most likely waiting for an ip address.");
          } else {
            int port = computer.getSshPort();

            Connection conn = getDropletConnection(host, port, logger);
            if (conn != null) {
              return conn;
            }
          }
        } catch (IOException e) {
          // Ignore, we'll retry.
        }
        logger.println("Waiting for SSH to come up. Sleeping " + sleepTime + " seconds.");
      }

      sleep(sleepTime);
    }

    throw new RuntimeException(
        format(
            "Timed out after %d seconds of waiting for ssh to become available (max timeout configured is %s)",
            waitTime / 1000, timeout / 1000));
  }
  public Slave provision(
      String dropletName,
      String cloudName,
      String authToken,
      String privateKey,
      Integer sshKeyId,
      List<Droplet> droplets)
      throws IOException, RequestUnsuccessfulException, Descriptor.FormException {

    LOGGER.log(Level.INFO, "Provisioning slave...");

    try {
      LOGGER.log(
          Level.INFO,
          "Starting to provision digital ocean droplet using image: "
              + imageId
              + " region: "
              + regionId
              + ", sizeId: "
              + sizeId);

      if (isInstanceCapReachedLocal(cloudName) || isInstanceCapReachedRemote(droplets, cloudName)) {
        throw new AssertionError();
      }

      // create a new droplet
      Droplet droplet = new Droplet();
      droplet.setName(dropletName);
      droplet.setSize(sizeId);
      droplet.setRegion(new Region(regionId));
      droplet.setImage(DigitalOcean.newImage(imageId));
      droplet.setKeys(newArrayList(new Key(sshKeyId)));

      if (!(userData == null || userData.trim().isEmpty())) {
        droplet.setUserData(userData);
      }

      LOGGER.log(Level.INFO, "Creating slave with new droplet " + dropletName);

      DigitalOceanClient apiClient = new DigitalOceanClient(authToken);
      Droplet createdDroplet = apiClient.createDroplet(droplet);

      return newSlave(cloudName, createdDroplet, privateKey);
    } catch (Exception e) {
      LOGGER.log(Level.WARNING, e.getMessage(), e);
      throw new AssertionError();
    }
  }