package com.sequenceiq.cloudbreak.cloud.openstack.nativ; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.inject.Inject; import org.openstack4j.api.OSClient; import org.openstack4j.api.exceptions.OS4JException; import org.openstack4j.api.exceptions.StatusCode; import org.openstack4j.model.compute.ActionResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.Maps; import com.sequenceiq.cloudbreak.cloud.CloudPlatformAware; import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext; import com.sequenceiq.cloudbreak.cloud.model.CloudResource; import com.sequenceiq.cloudbreak.cloud.model.CloudResourceStatus; import com.sequenceiq.cloudbreak.cloud.model.Platform; import com.sequenceiq.cloudbreak.cloud.model.ResourceStatus; import com.sequenceiq.cloudbreak.cloud.model.Variant; import com.sequenceiq.cloudbreak.cloud.openstack.auth.OpenStackClient; import com.sequenceiq.cloudbreak.cloud.openstack.common.OpenStackConstants; import com.sequenceiq.cloudbreak.cloud.openstack.nativ.context.OpenStackContext; import com.sequenceiq.cloudbreak.common.type.CommonStatus; import com.sequenceiq.cloudbreak.common.type.ResourceType; public abstract class AbstractOpenStackResourceBuilder implements CloudPlatformAware { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractOpenStackResourceBuilder.class); @Inject private OpenStackClient openStackClient; protected OSClient createOSClient(AuthenticatedContext auth) { return openStackClient.createOSClient(auth); } protected CloudResource createNamedResource(ResourceType resourceType, String group, String name) { return new CloudResource.Builder() .name(name) .group(group) .type(resourceType) .status(CommonStatus.REQUESTED) .build(); } protected CloudResource createPersistedResource(CloudResource namedResource, String group, String reference) { return createPersistedResource(namedResource, group, reference, Maps.newHashMap()); } protected CloudResource createPersistedResource(CloudResource namedResource, String reference) { return createPersistedResource(namedResource, null, reference, Maps.newHashMap()); } protected CloudResource createPersistedResource(CloudResource namedResource, String group, String reference, Map<String, Object> params) { return new CloudResource.Builder() .cloudResource(namedResource) .reference(reference) .status(CommonStatus.CREATED) .group(group) .params(params) .build(); } protected List<CloudResourceStatus> checkResources(ResourceType type, OpenStackContext context, AuthenticatedContext auth, List<CloudResource> resources) { List<CloudResourceStatus> result = new ArrayList<>(); for (CloudResource resource : resources) { LOGGER.info("Check {} resource: {}", type, resource); try { boolean finished = checkStatus(context, auth, resource); ResourceStatus successStatus = context.isBuild() ? ResourceStatus.CREATED : ResourceStatus.DELETED; result.add(new CloudResourceStatus(resource, finished ? successStatus : ResourceStatus.IN_PROGRESS)); if (finished) { if (successStatus == ResourceStatus.CREATED) { LOGGER.info("Creation of {} was successful", resource); } else { LOGGER.info("Deletion of {} was successful", resource); } } } catch (OS4JException ex) { throw new OpenStackResourceException("Error during status check", type, resource.getName(), ex); } } return result; } protected CloudResource checkDeleteResponse(ActionResponse response, ResourceType resourceType, AuthenticatedContext auth, CloudResource resource, String faultMsg) { if (!response.isSuccess()) { if (response.getCode() != StatusCode.NOT_FOUND.getCode()) { throw new OpenStackResourceException(faultMsg, resourceType, resource.getName(), auth.getCloudContext().getId(), response.getFault()); } else { return null; } } return resource; } @Override public Platform platform() { return OpenStackConstants.OPENSTACK_PLATFORM; } @Override public Variant variant() { return OpenStackConstants.OpenStackVariant.NATIVE.variant(); } protected abstract boolean checkStatus(OpenStackContext context, AuthenticatedContext auth, CloudResource resource); }