package com.sequenceiq.cloudbreak.service.eventbus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.sequenceiq.cloudbreak.cloud.model.CloudResource;
import com.sequenceiq.cloudbreak.cloud.notification.model.ResourceNotification;
import com.sequenceiq.cloudbreak.domain.Resource;
import com.sequenceiq.cloudbreak.domain.Stack;
import com.sequenceiq.cloudbreak.repository.ResourceRepository;
import com.sequenceiq.cloudbreak.repository.StackRepository;
@Component
public class CloudResourcePersisterService extends AbstractCloudPersisterService<ResourceNotification> {
private static final Logger LOGGER = LoggerFactory.getLogger(CloudResourcePersisterService.class);
@Override
public ResourceNotification persist(ResourceNotification notification) {
LOGGER.debug("Resource allocation notification received: {}", notification);
Long stackId = notification.getCloudContext().getId();
CloudResource cloudResource = notification.getCloudResource();
Resource resource = getConversionService().convert(cloudResource, Resource.class);
resource.setStack(getStackRepository().findByIdLazy(stackId));
getResourceRepository().save(resource);
return notification;
}
@Override
public ResourceNotification update(ResourceNotification notification) {
LOGGER.debug("Resource update notification received: {}", notification);
Long stackId = notification.getCloudContext().getId();
CloudResource cloudResource = notification.getCloudResource();
ResourceRepository repository = getResourceRepository();
Resource persistedResource = repository.findByStackIdAndNameAndType(stackId, cloudResource.getName(), cloudResource.getType());
Resource resource = getConversionService().convert(cloudResource, Resource.class);
updateWithPersistedFields(resource, persistedResource);
resource.setStack(getStackRepository().findByIdLazy(stackId));
repository.save(resource);
return notification;
}
@Override
public ResourceNotification delete(ResourceNotification notification) {
LOGGER.debug("Resource deletion notification received: {}", notification);
Long stackId = notification.getCloudContext().getId();
CloudResource cloudResource = notification.getCloudResource();
ResourceRepository repository = getResourceRepository();
Resource resource = repository.findByStackIdAndNameAndType(stackId, cloudResource.getName(), cloudResource.getType());
if (resource != null) {
repository.delete(resource);
}
return notification;
}
@Override
public ResourceNotification retrieve(ResourceNotification data) {
return null;
}
private StackRepository getStackRepository() {
return getRepositoryForEntity(Stack.class);
}
private ResourceRepository getResourceRepository() {
return getRepositoryForEntity(Resource.class);
}
private Resource updateWithPersistedFields(Resource resource, Resource persistedResource) {
if (persistedResource != null) {
resource.setId(persistedResource.getId());
resource.setInstanceGroup(persistedResource.getInstanceGroup());
}
return resource;
}
}