package io.fathom.cloud.network.api.os.resources; import io.fathom.cloud.CloudException; import io.fathom.cloud.network.NetworkService; import io.fathom.cloud.network.api.os.models.Subnet; import io.fathom.cloud.network.api.os.models.Subnets; import io.fathom.cloud.network.api.os.models.WrappedSubnet; import io.fathom.cloud.protobuf.NetworkingModel.SubnetData; import java.util.List; import javax.inject.Inject; 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 org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.Lists; @Path("/openstack/network/{project}/v2.0/subnets") public class SubnetsResource extends NetworkResourceBase { private static final Logger log = LoggerFactory.getLogger(SubnetsResource.class); @Inject NetworkService networkService; @GET @Produces({ JSON }) public Subnets listSubnets() throws CloudException { List<SubnetData> subnets = networkService.listSubnets(getAuth()); Subnets model = new Subnets(); model.subnets = Lists.newArrayList(); for (SubnetData subnet : subnets) { model.subnets.add(toModel(subnet)); } return model; } @GET @Path("{id}") @Produces({ JSON }) public WrappedSubnet getSubnet(@PathParam("id") long id) throws CloudException { SubnetData data = networkService.findSubnet(getAuth(), id); if (data == null) { throw new WebApplicationException(Status.NOT_FOUND); } WrappedSubnet ret = new WrappedSubnet(); ret.subnet = toModel(data); return ret; } // @PUT // @Path("{id}") // @Produces({ JSON }) // @Consumes({ JSON }) // public WrappedNetwork updateNetwork(@PathParam("id") long id, // WrappedNetwork request) throws CloudException { // Network network = request.network; // NetworkData.Builder b = toBuilder(network); // // NetworkData data = networkService.updateNetwork(getAuth(), id, b); // if (data == null) { // throw new WebApplicationException(Status.NOT_FOUND); // } // // WrappedNetwork ret = new WrappedNetwork(); // ret.network = toModel(data); // return ret; // } // // @DELETE // @Path("{id}") // @Produces({ JSON }) // public Response deleteNetwork(@PathParam("id") long id, WrappedNetwork // request) throws CloudException { // Status status = networkService.deleteNetwork(getAuth(), id); // // if (status != null) { // throw new WebApplicationException(status); // } // // ResponseBuilder response = Response.noContent(); // return response.build(); // } @POST @Produces({ JSON }) public WrappedSubnet createSubnet(WrappedSubnet request) throws CloudException { Subnet subnet = request.subnet; SubnetData.Builder b = toBuilder(subnet); SubnetData data = networkService.createSubnet(getAuth(), b); WrappedSubnet ret = new WrappedSubnet(); ret.subnet = toModel(data); return ret; } private SubnetData.Builder toBuilder(Subnet subnet) { if (subnet == null) { throw new IllegalArgumentException(); } SubnetData.Builder b = SubnetData.newBuilder(); if (subnet.name != null) { b.setName(subnet.name); } if (subnet.tenantId != null) { b.setProject(Long.valueOf(subnet.tenantId)); } if (subnet.networkId != null) { b.setNetwork(Long.valueOf(subnet.networkId)); } if (subnet.cidr != null) { b.setCidr(subnet.cidr); } if (subnet.ipVersion != 0) { b.setIpVersion(subnet.ipVersion); } else { b.setIpVersion(4); } return b; } private Subnet toModel(SubnetData data) { Subnet model = new Subnet(); model.id = Long.toString(data.getId()); model.name = data.getName(); model.enableDhcp = false; model.ipVersion = 4; model.networkId = Long.toString(data.getNetwork()); return model; } }