package com.sequenceiq.cloudbreak.init;
import java.io.FileNotFoundException;
import java.util.List;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.databind.JsonNode;
import com.sequenceiq.cloudbreak.common.type.ResourceStatus;
import com.sequenceiq.cloudbreak.domain.Blueprint;
import com.sequenceiq.cloudbreak.domain.BlueprintInputParameters;
import com.sequenceiq.cloudbreak.domain.json.Json;
import com.sequenceiq.cloudbreak.repository.BlueprintRepository;
import com.sequenceiq.cloudbreak.service.blueprint.BlueprintUtils;
@Component
public class BlueprintUpdateService implements ApplicationListener<ContextRefreshedEvent> {
private static final Logger LOGGER = LoggerFactory.getLogger(BlueprintUpdateService.class);
@Value("#{'${cb.blueprint.defaults:}'.split(';')}")
private List<String> blueprintArray;
@Inject
private BlueprintRepository blueprintRepository;
@Inject
private BlueprintUtils blueprintUtils;
public void onApplicationEvent(ContextRefreshedEvent event) {
Iterable<Blueprint> allBlueprint = blueprintRepository.findAll();
for (String blueprintStrings : blueprintArray) {
String[] split = blueprintStrings.split("=");
if (blueprintUtils.isBlueprintNamePreConfigured(blueprintStrings, split)) {
try {
String bpDefaultText = blueprintUtils.readDefaultBlueprintFromFile(split);
LOGGER.info("Updating default blueprint with name '{}'.", split[0]);
for (Blueprint blueprint : allBlueprint) {
if (blueprint.getName().equals(split[0]) && blueprint.getStatus().equals(ResourceStatus.DEFAULT)) {
readAndUpdateBlueprint(bpDefaultText, blueprint);
}
}
} catch (FileNotFoundException e) {
LOGGER.error("Failed to update blueprint because file not found on path: {}.", split[0]);
} catch (Exception e) {
LOGGER.error("Updating default blueprint with name '{}' wasn't successful because error occurred under the update process: {}.",
split[0], e);
}
}
}
}
private void readAndUpdateBlueprint(String bpDefaultText, Blueprint blueprint) throws Exception {
LOGGER.info("Blueprint {} is a default blueprint with name '{}'. Updating with the new config.", blueprint.getId(), blueprint.getName());
JsonNode jsonNode = blueprintUtils.convertStringToJsonNode(bpDefaultText);
JsonNode blueprintText = jsonNode.get("blueprint");
JsonNode inputs = jsonNode.get("inputs");
BlueprintInputParameters inputParameters = new BlueprintInputParameters(blueprintUtils.prepareInputs(inputs));
blueprint.setInputParameters(new Json(inputParameters));
blueprint.setBlueprintText(blueprintText.toString());
blueprint.setHostGroupCount(blueprintUtils.countHostGroups(blueprintText));
blueprint.setBlueprintName(blueprintUtils.getBlueprintName(blueprintText));
blueprintRepository.save(blueprint);
}
}