package io.fathom.cloud.compute.api.os.resources;
import io.fathom.cloud.CloudException;
import io.fathom.cloud.compute.api.os.model.SecurityGroup;
import io.fathom.cloud.compute.api.os.model.SecurityGroupList;
import io.fathom.cloud.compute.api.os.model.WrappedSecurityGroup;
import io.fathom.cloud.compute.services.SecurityGroups;
import io.fathom.cloud.protobuf.CloudModel.SecurityGroupData;
import io.fathom.cloud.protobuf.CloudModel.SecurityGroupRuleData;
import io.fathom.cloud.server.model.Project;
import javax.inject.Inject;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response.Status;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
@Path("/openstack/compute/{project}/os-security-groups")
public class SecurityGroupsResource extends ComputeResourceBase {
@Inject
SecurityGroups securityGroups;
@GET
@Produces({ JSON })
public SecurityGroupList list() throws CloudException {
SecurityGroupList response = new SecurityGroupList();
response.securityGroups = Lists.newArrayList();
for (SecurityGroupData data : securityGroups.list(getProject())) {
SecurityGroup model = toModel(data, true);
response.securityGroups.add(model);
}
return response;
}
@GET
@Path("{id}")
@Produces({ JSON })
public WrappedSecurityGroup getSecurityGroupDetails(@PathParam("id") long id) throws CloudException {
SecurityGroupData data = securityGroups.find(getProject(), id);
if (data == null) {
throw new WebApplicationException(Status.NOT_FOUND);
}
WrappedSecurityGroup response = new WrappedSecurityGroup();
response.securityGroup = toModel(data, true);
return response;
}
@DELETE
@Path("{id}")
public void deleteSecurityGroup(@PathParam("id") long id) throws CloudException {
SecurityGroupData data = securityGroups.delete(getProject(), id);
if (data == null) {
throw new WebApplicationException(Status.NOT_FOUND);
}
}
@POST
@Produces({ JSON })
public WrappedSecurityGroup create(WrappedSecurityGroup request) throws CloudException {
WrappedSecurityGroup response = new WrappedSecurityGroup();
String name = request.securityGroup.name;
if (Strings.isNullOrEmpty(name)) {
throw new IllegalArgumentException();
}
// TODO: Technically we should lock during this
for (SecurityGroupData item : securityGroups.list(getProject())) {
if (name.equals(item.getName())) {
throw new WebApplicationException(Status.CONFLICT);
}
}
SecurityGroupData created;
{
SecurityGroup req = request.securityGroup;
SecurityGroupData.Builder b = SecurityGroupData.newBuilder();
b.setName(req.name);
b.setProjectId(getProject().getId());
b.setDescription(req.description);
created = securityGroups.create(getProject(), b);
}
response.securityGroup = toModel(created, true);
return response;
}
protected SecurityGroup toModel(SecurityGroupData data, boolean includeRules) throws CloudException {
Project project = getProject();
return toModel(project, data, includeRules);
}
public static SecurityGroup toModel(Project project, SecurityGroupData data, boolean includeRules)
throws CloudException {
SecurityGroup model = new SecurityGroup();
model.id = data.getId();
model.description = data.getDescription();
model.name = data.getName();
model.tenantId = "" + project.getId();
if (includeRules) {
model.rules = Lists.newArrayList();
for (SecurityGroupRuleData ruleData : data.getRulesList()) {
model.rules.add(SecurityGroupRulesResource.toModel(data, ruleData));
}
}
return model;
}
}