package com.sequenceiq.cloudbreak.service.template;
import static com.sequenceiq.cloudbreak.common.type.ResourceStatus.DEFAULT_DELETED;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.transaction.Transactional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.convert.ConversionService;
import org.springframework.stereotype.Service;
import com.fasterxml.jackson.databind.JsonNode;
import com.sequenceiq.cloudbreak.api.model.TemplateRequest;
import com.sequenceiq.cloudbreak.common.type.ResourceStatus;
import com.sequenceiq.cloudbreak.controller.json.JsonHelper;
import com.sequenceiq.cloudbreak.domain.CbUser;
import com.sequenceiq.cloudbreak.domain.Template;
import com.sequenceiq.cloudbreak.repository.TemplateRepository;
import com.sequenceiq.cloudbreak.util.FileReaderUtils;
import com.sequenceiq.cloudbreak.util.JsonUtil;
import com.sequenceiq.cloudbreak.util.NameUtil;
@Service
@Transactional
public class DefaultTemplateLoaderService {
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultTemplateLoaderService.class);
@Value("#{'${cb.template.defaults:}'.split(',')}")
private List<String> templateArray;
@Inject
@Qualifier("conversionService")
private ConversionService conversionService;
@Inject
private TemplateRepository templateRepository;
@Inject
private JsonHelper jsonHelper;
public void createDefaultTemplates(CbUser user) {
Set<Template> defaultTemplates = templateRepository.findAllDefaultInAccount(user.getAccount());
List<String> defaultNetworkNames = defaultTemplates.stream()
.map(t -> t.getStatus() == DEFAULT_DELETED ? NameUtil.cutTimestampPostfix(t.getName()) : t.getName())
.collect(Collectors.toList());
createDefaultTemplateInstances(user, defaultNetworkNames);
}
private void createDefaultTemplateInstances(CbUser user, List<String> defaultNetworkNames) {
for (String templateName : templateArray) {
if (!templateName.isEmpty() && !defaultNetworkNames.contains(templateName)) {
try {
JsonNode jsonNode = jsonHelper.createJsonFromString(
FileReaderUtils.readFileFromClasspath(String.format("defaults/templates/%s.tmpl", templateName)));
TemplateRequest templateRequest = JsonUtil.treeToValue(jsonNode, TemplateRequest.class);
Template converted = conversionService.convert(templateRequest, Template.class);
converted.setAccount(user.getAccount());
converted.setOwner(user.getUserId());
converted.setPublicInAccount(true);
converted.setStatus(ResourceStatus.DEFAULT);
templateRepository.save(converted);
} catch (Exception e) {
LOGGER.error("Template is not available for '{}' user.", e, user);
}
}
}
}
}