package com.sequenceiq.cloudbreak.cloud.openstack.nativ.context; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.inject.Inject; import org.openstack4j.api.OSClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext; import com.sequenceiq.cloudbreak.cloud.context.CloudContext; import com.sequenceiq.cloudbreak.cloud.model.CloudResource; import com.sequenceiq.cloudbreak.cloud.model.Network; import com.sequenceiq.cloudbreak.cloud.model.Platform; 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.common.OpenStackUtils; import com.sequenceiq.cloudbreak.cloud.openstack.view.KeystoneCredentialView; import com.sequenceiq.cloudbreak.cloud.template.ResourceContextBuilder; @Service public class OpenStackContextBuilder implements ResourceContextBuilder<OpenStackContext> { private static final int PARALLEL_RESOURCE_REQUEST = 30; private static final Logger LOGGER = LoggerFactory.getLogger(OpenStackContextBuilder.class); @Inject private OpenStackClient openStackClient; @Inject private OpenStackUtils utils; @Override public OpenStackContext contextInit(CloudContext cloudContext, AuthenticatedContext auth, Network network, List<CloudResource> resources, boolean build) { OSClient osClient = openStackClient.createOSClient(auth); KeystoneCredentialView credentialView = new KeystoneCredentialView(auth); OpenStackContext openStackContext = new OpenStackContext(utils.getStackName(auth), cloudContext.getLocation(), PARALLEL_RESOURCE_REQUEST, build); openStackContext.putParameter(OpenStackConstants.TENANT_ID, osClient.identity().tenants().getByName(credentialView.getTenantName()).getId()); if (resources != null) { for (CloudResource resource : resources) { switch (resource.getType()) { case OPENSTACK_SUBNET: openStackContext.putParameter(OpenStackConstants.SUBNET_ID, resource.getReference()); break; case OPENSTACK_NETWORK: openStackContext.putParameter(OpenStackConstants.NETWORK_ID, resource.getReference()); break; case OPENSTACK_SECURITY_GROUP: openStackContext.addGroupResources(resource.getGroup(), Arrays.asList(resource)); break; default: LOGGER.debug("Resource is not used during context build: {}", resource); } } } openStackContext.putParameter(OpenStackConstants.FLOATING_IP_IDS, Collections.synchronizedList(new ArrayList<String>())); if (network != null) { openStackContext.putParameter(OpenStackConstants.PUBLIC_NET_ID, network.getStringParameter(OpenStackConstants.PUBLIC_NET_ID)); } return openStackContext; } @Override public Platform platform() { return OpenStackConstants.OPENSTACK_PLATFORM; } @Override public Variant variant() { return OpenStackConstants.OpenStackVariant.NATIVE.variant(); } }