protected NodeAndInitialCredentials createNodeWithGroupEncodedIntoName()

in providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java [114:243]


   protected NodeAndInitialCredentials<Server> createNodeWithGroupEncodedIntoName(String group, String name, TemplateWithDataCenter template) {
      checkArgument(template.getLocation().getScope() == LocationScope.ZONE, "Template must use a ZONE-scoped location");
      final String dataCenterId = template.getDataCenter().id();

      Hardware hardware = template.getHardware();

      TemplateOptions options = template.getOptions();
      final String loginUser = isNullOrEmpty(options.getLoginUser()) ? "root" : options.getLoginUser();
      final String password = options.hasLoginPassword() ? options.getLoginPassword() : passwordGenerator.generate();

      final org.jclouds.compute.domain.Image image = template.getImage();

      // provision all storages based on hardware
      List<? extends Volume> volumes = hardware.getVolumes();
      List<String> storageIds = Lists.newArrayListWithExpectedSize(volumes.size());

      int i = 1;
      for (final Volume volume : volumes)
         try {
            logger.trace("<< provisioning storage '%s'", volume);
            final Storage.Request.CreatePayload.Builder storageBuilder = Storage.Request.creatingBuilder();
            if (i == 1) {
               storageBuilder.mountImageId(image.getId());
               // we don't need to pass password to the API if we're using a snapshot
               Provisionable.Type provisionableType = Provisionable.Type.fromValue(
                       image.getUserMetadata().get(ProvisionableToImage.KEY_PROVISIONABLE_TYPE));
               if (provisionableType == Provisionable.Type.IMAGE)
                  storageBuilder.imagePassword(password);
            }
            storageBuilder.dataCenterId(dataCenterId)
                    .name(format("%s-disk-%d", name, i++))
                    .size(volume.getSize());

            String storageId = (String) provisioningManager.provision(jobFactory.create(dataCenterId, new Supplier<Object>() {

               @Override
               public Object get() {
                  return api.storageApi().createStorage(storageBuilder.build());
               }
            }));

            storageIds.add(storageId);
            logger.trace(">> provisioning complete for storage. returned id='%s'", storageId);
         } catch (Exception ex) {
            if (i - 1 == 1) // if first storage (one with image) provisioning fails; stop method
               throw Throwables.propagate(ex);
            logger.warn(ex, ">> failed to provision storage. skipping..");
         }

      int lanId = DEFAULT_LAN_ID;
      if (options.getNetworks() != null)
         try {
            String networkId = Iterables.get(options.getNetworks(), 0);
            lanId = Integer.parseInt(networkId);
         } catch (Exception ex) {
            logger.warn("no valid network id found from options. using default id='%d'", DEFAULT_LAN_ID);
         }

      Double cores = ComputeServiceUtils.getCores(hardware);

      // provision server and connect boot storage (first provisioned)
      String serverId = null;
      try {
         String storageBootDeviceId = Iterables.get(storageIds, 0); // must have atleast 1
         final Server.Request.CreatePayload serverRequest = Server.Request.creatingBuilder()
                 .dataCenterId(dataCenterId)
                 .name(name)
                 .bootFromStorageId(storageBootDeviceId)
                 .cores(cores.intValue())
                 .ram(hardware.getRam())
                 .availabilityZone(AvailabilityZone.AUTO)
                 .hasInternetAccess(true)
                 .lanId(lanId)
                 .build();
         logger.trace("<< provisioning server '%s'", serverRequest);

         serverId = (String) provisioningManager.provision(jobFactory.create(dataCenterId, new Supplier<Object>() {

            @Override
            public Object get() {
               return api.serverApi().createServer(serverRequest);
            }
         }));
         logger.trace(">> provisioning complete for server. returned id='%s'", serverId);

      } catch (Exception ex) {
         logger.error(ex, ">> failed to provision server. rollbacking..");
         destroyStorages(storageIds, dataCenterId);
         throw Throwables.propagate(ex);
      }

      // connect the rest of storages to server; delete if fails
      final int storageCount = storageIds.size();
      for (int j = 1; j < storageCount; j++) { // skip first; already connected
         String storageId = storageIds.get(j);
         try {
            logger.trace("<< connecting storage '%s' to server '%s'", storageId, serverId);
            final Storage.Request.ConnectPayload request = Storage.Request.connectingBuilder()
                    .storageId(storageId)
                    .serverId(serverId)
                    .build();

            provisioningManager.provision(jobFactory.create(group, new Supplier<Object>() {

               @Override
               public Object get() {
                  return api.storageApi().connectStorageToServer(request);
               }
            }));

            logger.trace(">> storage connected.");
         } catch (Exception ex) {
            // delete unconnected storage
            logger.warn(ex, ">> failed to connect storage '%s'. deleting..", storageId);
            destroyStorage(storageId, dataCenterId);
         }
      }

      // Last paranoid check
      waitDcUntilAvailable.apply(dataCenterId);

      LoginCredentials serverCredentials = LoginCredentials.builder()
              .user(loginUser)
              .password(password)
              .build();

      Server server = getNode(serverId);

      return new NodeAndInitialCredentials<Server>(server, serverId, serverCredentials);
   }