@Override
 public void destroyNode(String id) {
   ServerInfo server = getNode(id);
   if (server != null) {
     client.stopServer(id);
     client.destroyServer(id);
     for (Device dev : server.getDevices().values()) client.destroyDrive(dev.getDriveUuid());
   }
 }
  /** look up the current standard images and do not error out, if they are not found. */
  @Override
  public Iterable<DriveInfo> listImages() {
    Iterable<? extends DriveInfo> drives =
        transformParallel(
            client.listStandardDrives(),
            new Function<String, Future<? extends DriveInfo>>() {

              @Override
              public Future<DriveInfo> apply(String input) {
                try {
                  return Futures.immediateFuture(cache.getUnchecked(input));
                } catch (CacheLoader.InvalidCacheLoadException e) {
                  logger.debug("drive %s not found", input);
                } catch (UncheckedExecutionException e) {
                  logger.warn(e, "error finding drive %s: %s", input, e.getMessage());
                }
                return Futures.immediateFuture(null);
              }

              @Override
              public String toString() {
                return "seedDriveCache()";
              }
            },
            executor,
            null,
            logger,
            "drives");
    return Iterables2.concreteCopy(filter(drives, PREINSTALLED_DISK));
  }
  @Override
  public NodeAndInitialCredentials<ServerInfo> createNodeWithGroupEncodedIntoName(
      String tag, String name, Template template) {
    long bootSize =
        (long) (template.getHardware().getVolumes().get(0).getSize() * 1024 * 1024 * 1024l);
    AffinityType affinityType = AffinityType.HDD;
    if (template.getOptions() instanceof CloudSigmaTemplateOptions) {
      CloudSigmaTemplateOptions options =
          CloudSigmaTemplateOptions.class.cast(template.getOptions());
      affinityType = options.getDiskDriveAffinity();
    }
    logger.debug(
        ">> imaging boot drive source(%s) bytes(%d) affinityType(%s)",
        template.getImage().getId(), bootSize, affinityType);
    DriveInfo drive =
        client.cloneDrive(
            template.getImage().getId(),
            template.getImage().getId(),
            new CloneDriveOptions().size(bootSize).affinity(affinityType));
    boolean success = driveNotClaimed.apply(drive);
    logger.debug("<< image(%s) complete(%s)", drive.getUuid(), success);
    if (!success) {
      client.destroyDrive(drive.getUuid());
      throw new IllegalStateException("could not image drive in time!");
    }

    Server toCreate =
        Servers.small(name, drive.getUuid(), defaultVncPassword)
            .mem(template.getHardware().getRam())
            .cpu((int) (template.getHardware().getProcessors().get(0).getSpeed()))
            .build();

    logger.debug(">> creating server");
    ServerInfo from = client.createServer(toCreate);
    logger.debug("<< created server(%s)", from.getUuid());
    logger.debug(">> starting server(%s)", from.getUuid());
    client.startServer(from.getUuid());
    return new NodeAndInitialCredentials<ServerInfo>(
        from,
        from.getUuid(),
        LoginCredentials.builder().password(defaultVncPassword).authenticateSudo(true).build());
  }
 @Override
 public void suspendNode(String id) {
   client.stopServer(id);
 }
 @Override
 public void resumeNode(String id) {
   client.startServer(id);
 }
 @Override
 public void rebootNode(String id) {
   client.resetServer(id);
 }
 @Override
 public DriveInfo getImage(String id) {
   return client.getDriveInfo(id);
 }
 @Override
 public ServerInfo getNode(String id) {
   return client.getServerInfo(id);
 }
 @SuppressWarnings("unchecked")
 @Override
 public Iterable<ServerInfo> listNodes() {
   return (Iterable<ServerInfo>) client.listServerInfo();
 }