@Override
 public boolean apply(Allocation allocInfo) throws MetadataException {
   if (allocInfo.getRequest().getKeyName() == null
       || "".equals(allocInfo.getRequest().getKeyName())) {
     if (ImageMetadata.Platform.windows.equals(
         allocInfo.getBootSet().getMachine().getPlatform())) {
       throw new InvalidMetadataException(
           "You must specify a keypair when running a windows vm: "
               + allocInfo.getRequest().getImageId());
     } else {
       allocInfo.setSshKeyPair(KeyPairs.noKey());
       return true;
     }
   }
   Context ctx = allocInfo.getContext();
   RunInstancesType request = allocInfo.getRequest();
   String keyName = request.getKeyName();
   SshKeyPair key = KeyPairs.lookup(ctx.getUserFullName().asAccountFullName(), keyName);
   if (!ctx.hasAdministrativePrivileges() && !RestrictedTypes.filterPrivileged().apply(key)) {
     throw new IllegalMetadataAccessException(
         "Not authorized to use keypair " + keyName + " by " + ctx.getUser().getName());
   }
   allocInfo.setSshKeyPair(key);
   return true;
 }
    @Override
    public boolean apply(Allocation allocInfo) throws MetadataException, AuthException {
      RunInstancesType msg = allocInfo.getRequest();
      String imageId = msg.getImageId();
      VmType vmType = allocInfo.getVmType();
      try {
        BootableSet bootSet = Emis.newBootableSet(imageId);
        allocInfo.setBootableSet(bootSet);

        // Add (1024L * 1024L * 10) to handle NTFS min requirements.
        if (bootSet.isBlockStorage()) {
        } else if (Platform.windows.equals(bootSet.getMachine().getPlatform())
            && bootSet.getMachine().getImageSizeBytes()
                > ((1024L * 1024L * 1024L * vmType.getDisk()) + (1024L * 1024L * 10))) {
          throw new VerificationException(
              "Unable to run instance "
                  + bootSet.getMachine().getDisplayName()
                  + " in which the size "
                  + bootSet.getMachine().getImageSizeBytes()
                  + " bytes of the instance is greater than the vmType "
                  + vmType.getDisplayName()
                  + " size "
                  + vmType.getDisk()
                  + " GB.");
        } else if (bootSet.getMachine().getImageSizeBytes()
            >= ((1024L * 1024L * 1024L * vmType.getDisk()))) {
          throw new VerificationException(
              "Unable to run instance "
                  + bootSet.getMachine().getDisplayName()
                  + " in which the size "
                  + bootSet.getMachine().getImageSizeBytes()
                  + " bytes of the instance is greater than the vmType "
                  + vmType.getDisplayName()
                  + " size "
                  + vmType.getDisk()
                  + " GB.");
        }
      } catch (MetadataException ex) {
        LOG.error(ex);
        throw ex;
      } catch (RuntimeException ex) {
        LOG.error(ex);
        throw new VerificationException(
            "Failed to verify references for request: "
                + msg.toSimpleString()
                + " because of: "
                + ex.getMessage(),
            ex);
      }
      return true;
    }
 @Override
 public boolean apply(Allocation allocInfo) throws MetadataException {
   RunInstancesType request = allocInfo.getRequest();
   String zoneName = request.getAvailabilityZone();
   if (Clusters.getInstance().listValues().isEmpty()) {
     LOG.debug("enabled values: " + Joiner.on("\n").join(Clusters.getInstance().listValues()));
     LOG.debug("disabled values: " + Joiner.on("\n").join(Clusters.getInstance().listValues()));
     throw new VerificationException(
         "Not enough resources: no cluster controller is currently available to run instances.");
   } else if (Partitions.exists(zoneName)) {
     Partition partition = Partitions.lookupByName(zoneName);
     allocInfo.setPartition(partition);
   } else if (Partition.DEFAULT_NAME.equals(zoneName)) {
     Partition partition = Partition.DEFAULT;
     allocInfo.setPartition(partition);
   } else {
     throw new VerificationException(
         "Not enough resources: no cluster controller is currently available to run instances.");
   }
   return true;
 }