use of com.peterphi.servicemanager.service.db.entity.ResourceTemplateEntity in project stdlib by petergeneric.
the class ResourceProvisionService method newInstance.
public ResourceInstanceEntity newInstance(String template, Map<String, String> metadata) {
final ResourceTemplateDefinition def = getTemplateDefinition(template);
final ResourceTemplateEntity dbTemplate = getOrCreateTemplate(template);
return newInstance(dbTemplate, def, metadata);
}
use of com.peterphi.servicemanager.service.db.entity.ResourceTemplateEntity in project stdlib by petergeneric.
the class ServiceManagerResourceUIServiceImpl method getResource.
/**
* N.B. transaction may be read-write because this read operation may result in reading a new template (or discovering an
* update was made to the template)
*
* @param id
*
* @return
*/
@Override
@Transactional
public String getResource(String id) {
final TemplateCall call = templater.template("resource_template");
final ResourceTemplateEntity entity = resourceProvisionService.getOrCreateTemplate(id);
if (entity == null)
throw new RestException(404, "No such resource with id: " + id);
call.set("entity", entity);
call.set("nonce", nonceStore.getValue());
return call.process();
}
use of com.peterphi.servicemanager.service.db.entity.ResourceTemplateEntity in project stdlib by petergeneric.
the class ResourceProvisionService method getOrCreateTemplate.
@Transactional
public ResourceTemplateEntity getOrCreateTemplate(final String name) {
final String revision = templateConfig.config.getLastRevision();
ResourceTemplateEntity entity = templateDao.getById(name);
if (entity != null) {
// Check if the template has been updated
if (!StringUtils.equals(entity.getLatestRevision(), revision)) {
entity.setLatestRevision(revision);
entity.setRevisions(entity.getRevisions() + 1);
templateDao.update(entity);
}
return entity;
} else {
entity = new ResourceTemplateEntity();
entity.setId(name);
entity.setLatestRevision(revision);
entity.setRevisions(1);
templateDao.save(entity);
return templateDao.getById(name);
}
}
use of com.peterphi.servicemanager.service.db.entity.ResourceTemplateEntity in project stdlib by petergeneric.
the class ResourceProvisionService method newInstance.
@Transactional
public ResourceInstanceEntity newInstance(final ResourceTemplateEntity dbTemplate, final ResourceTemplateDefinition definition, Map<String, String> metadata) {
log.info("Provision new instance of template:" + dbTemplate.getId());
final AzureExistingVM azureVM = definition.azureExistingVM;
// TODO when adding a second provider make this generic so providers can be easily plugged in
List<ResourceInstanceEntity> running = getAllRunning(dbTemplate);
if (running.isEmpty()) {
log.info("Provision new instance of template: ");
ResourceInstanceEntity instance = new ResourceInstanceEntity();
instance.setTemplate(dbTemplate);
instance.setTemplateRevision(dbTemplate.getLatestRevision());
instance.setTemplateRevisionCounter(dbTemplate.getRevisions());
instance.setMetadata(metadata);
instance.setProvider(AzureExistingVMProvider.PROVIDER);
instance.setProviderInstanceId(azureVM.id);
// TODO in the future when making generic this should be TO_PROVISION and we should make the provision call asynchronously
instance.setState(ResourceInstanceState.PROVISIONING);
instance.setId(instanceDao.save(instance));
// Create a new instance
azureExistingVMProvider.start(azureVM, metadata);
return instance;
} else {
throw new IllegalArgumentException("Cannot create a new instance: provider is " + AzureExistingVMProvider.PROVIDER + " but an instance already appears to be running: " + running.stream().map(e -> e.getProviderInstanceId()).collect(Collectors.toList()));
}
}
use of com.peterphi.servicemanager.service.db.entity.ResourceTemplateEntity in project stdlib by petergeneric.
the class ServiceManagerResourceUIServiceImpl method doProvision.
@Override
public Response doProvision(final String id, final String nonce) {
nonceStore.validate(nonce);
final ResourceTemplateEntity entity = resourceProvisionService.getOrCreateTemplate(id);
if (entity == null)
throw new RestException(404, "No such resource with id: " + id);
resourceProvisionService.newInstance(id, Collections.emptyMap());
// Redirect to template page
return Response.seeOther(URI.create("/resources/template/" + id)).build();
}
Aggregations