package com.sequenceiq.cloudbreak.cloud.openstack.nativ.network; import static com.sequenceiq.cloudbreak.cloud.openstack.common.OpenStackConstants.SUBNET_ID; import javax.inject.Inject; import org.openstack4j.api.Builders; import org.openstack4j.api.OSClient; import org.openstack4j.api.exceptions.OS4JException; import org.openstack4j.model.compute.ActionResponse; import org.openstack4j.model.network.IPVersionType; import org.openstack4j.model.network.Subnet; import org.springframework.stereotype.Service; import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext; import com.sequenceiq.cloudbreak.cloud.model.CloudResource; import com.sequenceiq.cloudbreak.cloud.model.Network; import com.sequenceiq.cloudbreak.cloud.model.Security; import com.sequenceiq.cloudbreak.cloud.openstack.common.OpenStackConstants; import com.sequenceiq.cloudbreak.cloud.openstack.common.OpenStackUtils; import com.sequenceiq.cloudbreak.cloud.openstack.nativ.OpenStackResourceException; import com.sequenceiq.cloudbreak.cloud.openstack.nativ.context.OpenStackContext; import com.sequenceiq.cloudbreak.cloud.openstack.view.NeutronNetworkView; import com.sequenceiq.cloudbreak.common.type.ResourceType; @Service public class OpenStackSubnetResourceBuilder extends AbstractOpenStackNetworkResourceBuilder { @Inject private OpenStackUtils utils; @Override public CloudResource build(OpenStackContext context, AuthenticatedContext auth, Network network, Security security, CloudResource resource) throws Exception { try { NeutronNetworkView neutronView = new NeutronNetworkView(network); String subnetId = neutronView.isExistingSubnet() ? neutronView.getCustomSubnetId() : context.getParameter(SUBNET_ID, String.class); if (!neutronView.isExistingSubnet()) { OSClient osClient = createOSClient(auth); NeutronNetworkView networkView = new NeutronNetworkView(network); Subnet subnet = Builders.subnet().name(resource.getName()) .networkId(context.getParameter(OpenStackConstants.NETWORK_ID, String.class)) .tenantId(context.getStringParameter(OpenStackConstants.TENANT_ID)) .ipVersion(IPVersionType.V4) .cidr(networkView.getSubnetCIDR()) .enableDHCP(true) .build(); subnetId = osClient.networking().subnet().create(subnet).getId(); } context.putParameter(OpenStackConstants.SUBNET_ID, subnetId); return createPersistedResource(resource, subnetId); } catch (OS4JException ex) { throw new OpenStackResourceException("Subnet creation failed", resourceType(), resource.getName(), ex); } } @Override public CloudResource delete(OpenStackContext context, AuthenticatedContext auth, CloudResource resource, Network network) throws Exception { try { NeutronNetworkView neutronView = new NeutronNetworkView(network); if (!neutronView.isExistingSubnet()) { OSClient osClient = createOSClient(auth); ActionResponse response = osClient.networking().subnet().delete(resource.getReference()); return checkDeleteResponse(response, resourceType(), auth, resource, "Subnet deletion failed"); } return null; } catch (OS4JException ex) { throw new OpenStackResourceException("Subnet deletion failed", resourceType(), resource.getName(), ex); } } @Override public ResourceType resourceType() { return ResourceType.OPENSTACK_SUBNET; } @Override protected boolean checkStatus(OpenStackContext context, AuthenticatedContext auth, CloudResource resource) { return true; } }