package com.sequenceiq.cloudbreak.cloud.openstack.nativ.compute;
import java.util.Collections;
import java.util.List;
import java.util.Map;
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.Port;
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.Group;
import com.sequenceiq.cloudbreak.cloud.model.Image;
import com.sequenceiq.cloudbreak.cloud.openstack.common.OpenStackConstants;
import com.sequenceiq.cloudbreak.cloud.openstack.nativ.OpenStackResourceException;
import com.sequenceiq.cloudbreak.cloud.openstack.nativ.context.OpenStackContext;
import com.sequenceiq.cloudbreak.common.type.ResourceType;
@Service
public class OpenStackPortBuilder extends AbstractOpenStackComputeResourceBuilder {
@Override
public List<CloudResource> build(OpenStackContext context, long privateId, AuthenticatedContext auth, Group group, Image image,
List<CloudResource> buildableResource, Map<String, String> tags) throws Exception {
CloudResource resource = buildableResource.get(0);
try {
OSClient osClient = createOSClient(auth);
Port port = Builders.port()
.tenantId(context.getStringParameter(OpenStackConstants.TENANT_ID))
.networkId(context.getStringParameter(OpenStackConstants.NETWORK_ID))
.fixedIp(null, context.getStringParameter(OpenStackConstants.SUBNET_ID))
.securityGroup(context.getGroupResources(group.getName()).get(0).getReference())
.build();
port = osClient.networking().port().create(port);
return Collections.singletonList(createPersistedResource(resource, group.getName(), port.getId(), Collections.singletonMap(
OpenStackConstants.PORT_ID, port.getId())));
} catch (OS4JException ex) {
throw new OpenStackResourceException("Port creation failed", resourceType(), resource.getName(), ex);
}
}
@Override
public CloudResource delete(OpenStackContext context, AuthenticatedContext auth, CloudResource resource) throws Exception {
try {
OSClient osClient = createOSClient(auth);
ActionResponse response = osClient.networking().port().delete(resource.getReference());
return checkDeleteResponse(response, resourceType(), auth, resource, "Port deletion failed");
} catch (OS4JException ex) {
throw new OpenStackResourceException("Port deletion failed", resourceType(), resource.getName(), ex);
}
}
@Override
public ResourceType resourceType() {
return ResourceType.OPENSTACK_PORT;
}
@Override
protected boolean checkStatus(OpenStackContext context, AuthenticatedContext auth, CloudResource resource) {
return true;
}
}