public Collection process()

in cloud-vmware-server/src/main/java/jetbrains/buildServer/clouds/vmware/VmwarePropertiesProcessor.java [40:107]


  public Collection<InvalidProperty> process(final Map<String, String> properties) {
    List<InvalidProperty> list = new ArrayList<>();

    // Remove helper properties used in ConfigurationHelperController and GetSnapshotsListController
    try {
      properties.remove("helperFieldValue");
      properties.remove("helperFieldId");
      properties.remove("image");
      properties.remove("force_trust_manager");
    } catch (UnsupportedOperationException ignored) {
      // In case of unmodifiable map passed
    }

    notEmpty(properties, VMWareWebConstants.SECURE_PASSWORD, list);
    notEmpty(properties, VMWareWebConstants.USERNAME, list);
    notEmpty(properties, VMWareWebConstants.SERVER_URL, list);
    final String instancesLimit = properties.get(VMWareWebConstants.PROFILE_INSTANCE_LIMIT);
    if (!StringUtil.isEmpty(instancesLimit)){
      if (!StringUtil.isAPositiveNumber(instancesLimit)){
        list.add(new InvalidProperty(VMWareWebConstants.PROFILE_INSTANCE_LIMIT, "Must be a positive integer or empty"));
      }
    }
    if (!list.isEmpty())
      return list;

    final String serverURL = properties.get(VMWareWebConstants.SERVER_URL);

    final String currentProfileId = properties.get(CloudConstants.PROFILE_ID);
    final Map<String, String> existingImages = new HashMap<>();

    LOG.debug("Processing properties for " + currentProfileId + ", with server URL " + serverURL);

    myCloudManager.listAllProfiles().stream()
            .filter(p -> (VmwareConstants.TYPE.equals(p.getCloudCode())
                    && (currentProfileId == null || !currentProfileId.equals(p.getProfileId()))
                    && (serverURL.equals(p.getProfileProperties().get(VMWareWebConstants.SERVER_URL))))
            )
            .forEach(p -> {
                      LOG.debug("Adding images from " + p.getProfileName() + " [id: " + p.getProfileId() + "]");
                      myCloudManager
                              .getClient(p.getProjectId(), p.getProfileId())
                              .getImages()
                              .forEach(i -> existingImages.put(i.getId().toUpperCase(), p.getProfileName()));
                    }
            );

    final String imagesData = properties.get(CloudImageParameters.SOURCE_IMAGES_JSON);
    if (StringUtil.isEmpty(imagesData))
      return list; // allowing empty profiles
    JsonParser parser = new JsonParser();
    final JsonElement element = parser.parse(imagesData);
    if (element.isJsonArray()){
      StreamSupport.stream(element.getAsJsonArray().spliterator(), false)
        .map(JsonElement::getAsJsonObject)
        .map(obj->obj.getAsJsonPrimitive(CloudImageParameters.SOURCE_ID_FIELD))
        .filter(Objects::nonNull)
        .map(json->json.getAsString().toUpperCase())
        .filter(existingImages::containsKey)
        .map(id->new InvalidProperty(CloudImageParameters.SOURCE_IMAGES_JSON,
          String.format("The cloud profile '%s' already contains an image named '%s'. Select a different VM or change the custom name.", existingImages.get(id), id)
        )).forEachOrdered(list::add);
    } else {
      list.add(new InvalidProperty(CloudImageParameters.SOURCE_IMAGES_JSON, "Unable to parse images data - bad format"));
    }


    return list;
  }