public NodeAndInitialCredentials createNodeWithGroupEncodedIntoName()

in cloudsigma2/src/main/java/org/jclouds/cloudsigma2/compute/strategy/CloudSigma2ComputeServiceAdapter.java [124:220]


   public NodeAndInitialCredentials<ServerInfo> createNodeWithGroupEncodedIntoName(String group, String name,
                                                                                   Template template) {
      CloudSigma2TemplateOptions options = template.getOptions().as(CloudSigma2TemplateOptions.class);
      Image image = template.getImage();
      Hardware hardware = template.getHardware();

      DriveInfo drive = api.getLibraryDrive(image.getProviderId());

      if (!drive.getMedia().equals(MediaType.CDROM)) {
         logger.debug(">> cloning library drive %s...", image.getProviderId());

         drive = api.cloneLibraryDrive(image.getProviderId(), null);
         driveCloned.apply(drive);

         // Refresh the drive object and verify the clone operation didn't time out
         drive = api.getDriveInfo(drive.getUuid());
         DriveStatus status = drive.getStatus();

         if (DriveStatus.UNMOUNTED != status) {
            if (destroyDrives) {
               // Rollback the cloned drive, if needed
               logger.error(">> clone operation failed. Rolling back drive (%s)...", drive);
               destroyDrives(ImmutableList.of(drive.getUuid()));
            }
            throw new IllegalStateException("Resource is in invalid status: " + status);
         }

         logger.debug(">> drive cloned (%s)...", drive);
      }

      ImmutableList.Builder<FirewallRule> firewallRulesBuilder = ImmutableList.builder();
      for (int port : options.getInboundPorts()) {
         firewallRulesBuilder.add(new FirewallRule.Builder().action(FirewallAction.ACCEPT)
               .ipProtocol(FirewallIpProtocol.TCP).direction(FirewallDirection.IN).destinationPort("" + port).build());
      }

      List<NIC> nics = null;
      try {
         logger.debug(">> creating firewall policies...");
         FirewallPolicy firewallPolicy = api.createFirewallPolicy(new FirewallPolicy.Builder().rules(
               firewallRulesBuilder.build()).build());
         nics = configureNICs(options, firewallPolicy);
      } catch (Exception ex) {
         if (destroyDrives) {
            logger.debug(">> rolling back the cloned drive...", drive.getUuid());
            destroyDrives(ImmutableList.of(drive.getUuid()));
         }
         throw propagate(ex);
      }

      List<Tag> tagIds = configureTags(options);

      // Cloud init images expect the public key in the server metadata
      Map<String, String> metadata = Maps.newLinkedHashMap();
      metadata.put("image_id", image.getProviderId());
      if (!Strings.isNullOrEmpty(options.getPublicKey())) {
         metadata.put("ssh_public_key", options.getPublicKey());
      }
      metadata.putAll(options.getUserMetadata());

      ServerInfo serverInfo = null;
      try {
         logger.debug(">> creating server...");

         serverInfo = api.createServer(new ServerInfo.Builder()
               .name(name)
               .cpu((int) hardware.getProcessors().get(0).getSpeed())
               .memory(BigInteger.valueOf(hardware.getRam()).multiply(BigInteger.valueOf(1024 * 1024)))
               .drives(ImmutableList.of(drive.toServerDrive(1, "0:1", options.getDeviceEmulationType())))
               .nics(nics)
               .meta(metadata)
               .tags(tagIds)
               .vncPassword(Optional.fromNullable(options.getVncPassword()).or(defaultVncPassword)).build());

         api.startServer(serverInfo.getUuid());

         return new NodeAndInitialCredentials<ServerInfo>(serverInfo, serverInfo.getUuid(), LoginCredentials.builder()
               .build());
      } catch (Exception ex) {
         try {
            if (serverInfo != null) {
               logger.debug(">> rolling back the server...");
               api.deleteServer(serverInfo.getUuid());
            }
         } finally {
            try {
               if (destroyDrives) {
                  logger.debug(">> rolling back the cloned drive...");
                  destroyDrives(ImmutableList.of(drive.getUuid()));
               }
            } finally {
               deleteTags(tagIds);
            }
         }
         throw propagate(ex);
      }
   }