@Override
 public void rebootNode(String id) {
   NodeMetadata node = nodes.get(id);
   if (node == null) throw new ResourceNotFoundException("node not found: " + id);
   StubComputeServiceDependenciesModule.setState(node, NodeState.PENDING, 0);
   StubComputeServiceDependenciesModule.setState(node, NodeState.RUNNING, 50);
 }
 @Override
 public Iterable<Hardware> listHardwareProfiles() {
   return ImmutableSet.<Hardware>of(
       StubComputeServiceDependenciesModule.stub("small", 1, 1740, 160),
       StubComputeServiceDependenciesModule.stub("medium", 4, 7680, 850),
       StubComputeServiceDependenciesModule.stub("large", 8, 15360, 1690));
 }
 @Override
 public void suspendNode(String id) {
   NodeMetadata node = nodes.get(id);
   if (node == null) throw new ResourceNotFoundException("node not found: " + id);
   if (node.getState() == NodeState.SUSPENDED) return;
   if (node.getState() != NodeState.RUNNING)
     throw new IllegalStateException(
         "to suspend a node, it must be in running state, not: " + node.getState());
   StubComputeServiceDependenciesModule.setState(node, NodeState.PENDING, 0);
   StubComputeServiceDependenciesModule.setState(node, NodeState.SUSPENDED, 50);
 }
 @Override
 public NodeMetadata createNodeWithGroupEncodedIntoNameThenStoreCredentials(
     String group, String name, Template template, Map<String, Credentials> credentialStore) {
   NodeMetadataBuilder builder = new NodeMetadataBuilder();
   String id = idProvider.get() + "";
   builder.ids(id);
   builder.name(name);
   // using a predictable name so tests will pass
   builder.hostname(group);
   builder.tags(template.getOptions().getTags());
   builder.group(group);
   builder.location(location.get());
   builder.imageId(template.getImage().getId());
   builder.operatingSystem(template.getImage().getOperatingSystem());
   builder.state(NodeState.PENDING);
   builder.publicAddresses(ImmutableSet.<String>of(publicIpPrefix + id));
   builder.privateAddresses(ImmutableSet.<String>of(privateIpPrefix + id));
   Credentials creds = template.getOptions().getOverridingCredentials();
   if (creds == null) creds = new Credentials(null, null);
   if (creds.identity == null) creds = creds.toBuilder().identity("root").build();
   if (creds.credential == null) creds = creds.toBuilder().credential(passwordPrefix + id).build();
   builder.credentials(creds);
   NodeMetadata node = builder.build();
   credentialStore.put("node#" + node.getId(), node.getCredentials());
   nodes.put(node.getId(), node);
   StubComputeServiceDependenciesModule.setState(node, NodeState.RUNNING, 100);
   return node;
 }
  @Override
  public void destroyNode(final String id) {
    NodeMetadata node = nodes.get(id);
    if (node == null) return;
    StubComputeServiceDependenciesModule.setState(node, NodeState.PENDING, 0);
    StubComputeServiceDependenciesModule.setState(node, NodeState.TERMINATED, 50);
    StubComputeServiceDependenciesModule.service.execute(
        new Runnable() {

          @Override
          public void run() {
            try {
              Thread.sleep(200);
            } catch (InterruptedException e) {
              Throwables.propagate(e);
            } finally {
              nodes.remove(id);
            }
          }
        });
  }