package com.sequenceiq.cloudbreak.service.recipe;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.inject.Inject;
import javax.transaction.Transactional;
import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Service;
import com.sequenceiq.cloudbreak.common.type.RecipeType;
import com.sequenceiq.cloudbreak.domain.Plugin;
import com.sequenceiq.cloudbreak.domain.Recipe;
import com.sequenceiq.cloudbreak.repository.RecipeRepository;
@Service
public class RecipeMigration {
private static final String PRE_INSTALL_TAG = "recipe-pre-install";
private static final String POST_INSTALL_TAG = "recipe-post-install";
@Inject
private RecipeRepository recipeRepository;
@Transactional
public void migrate() {
Set<Recipe> recipes = recipeRepository.findByType(RecipeType.LEGACY);
for (Recipe legacyRecipe : recipes) {
for (Plugin plugin : legacyRecipe.getPlugins()) {
String decodedRecipe = new String(Base64.decodeBase64(plugin.getContent().replaceFirst("base64://", "")));
Map<String, String> recipeMap = Stream.of(decodedRecipe.split("\n"))
.collect(Collectors.toMap(s -> s.substring(0, s.indexOf(":")), s -> s.substring(s.indexOf(":") + 1)));
if (recipeMap.containsKey(PRE_INSTALL_TAG)) {
create(legacyRecipe, RecipeType.PRE, recipeMap.get(PRE_INSTALL_TAG));
}
if (recipeMap.containsKey(POST_INSTALL_TAG)) {
create(legacyRecipe, RecipeType.POST, recipeMap.get(POST_INSTALL_TAG));
}
}
legacyRecipe.setRecipeType(RecipeType.MIGRATED);
recipeRepository.save(legacyRecipe);
}
}
private void create(Recipe legacyRecipe, RecipeType recipeType, String content) {
Recipe recipe = new Recipe();
recipe.setName(recipeType.name().toLowerCase() + "-" + legacyRecipe.getName());
recipe.setOwner(legacyRecipe.getOwner());
recipe.setAccount(legacyRecipe.getAccount());
recipe.setDescription(legacyRecipe.getDescription());
recipe.setRecipeType(recipeType);
recipe.setContent(content);
recipeRepository.save(recipe);
}
}