package io.fathom.cloud.network.api.os.resources; import io.fathom.cloud.CloudException; import io.fathom.cloud.network.NetworkService; import io.fathom.cloud.network.ProtobufFilter; import io.fathom.cloud.network.api.os.models.Network; import io.fathom.cloud.network.api.os.models.Networks; import io.fathom.cloud.network.api.os.models.WrappedNetwork; import io.fathom.cloud.protobuf.NetworkingModel.NetworkData; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; 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; import javax.ws.rs.core.Response.ResponseBuilder; 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/networks") public class NetworkResource extends NetworkResourceBase { private static final Logger log = LoggerFactory.getLogger(NetworkResource.class); @Inject NetworkService networkService; @Inject HttpServletRequest request; @GET @Produces({ JSON }) public Networks listNetworks() throws CloudException { List<NetworkData> networks = networkService.listNetworks(getAuth()); List<ProtobufFilter> filters = Lists.newArrayList(); Map<String, String[]> parameterMap = request.getParameterMap(); for (Entry<String, String[]> entry : parameterMap.entrySet()) { String key = entry.getKey(); String[] values = entry.getValue(); for (String value : values) { if (key.equals("name")) { filters.add(new ProtobufFilter(NetworkData.getDescriptor().findFieldByName("name"), value)); } else if (key.equals("shared")) { filters.add(new ProtobufFilter(NetworkData.getDescriptor().findFieldByName("shared"), Boolean .valueOf(value))); } else if (key.equals("tenant_id")) { filters.add(new ProtobufFilter(NetworkData.getDescriptor().findFieldByName("project"), Long .valueOf(value))); } else { log.warn("Unknown key: {}", key); } } } Networks model = new Networks(); model.networks = Lists.newArrayList(); for (NetworkData network : networks) { boolean match = true; for (ProtobufFilter filter : filters) { if (!filter.matches(network)) { match = false; break; } } if (match) { model.networks.add(toModel(network)); } } return model; } @GET @Path("{id}") @Produces({ JSON }) public WrappedNetwork getNetwork(@PathParam("id") long id) throws CloudException { NetworkData data = networkService.findNetwork(getAuth(), id); if (data == null) { throw new WebApplicationException(Status.NOT_FOUND); } WrappedNetwork ret = new WrappedNetwork(); ret.network = toModel(data); return ret; } @PUT @Path("{id}") @Produces({ 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 WrappedNetwork createNetwork(WrappedNetwork request) throws CloudException { Network network = request.network; NetworkData.Builder b = toBuilder(network); NetworkData data = networkService.createNetwork(getAuth(), b); WrappedNetwork ret = new WrappedNetwork(); ret.network = toModel(data); return ret; } private NetworkData.Builder toBuilder(Network network) { if (network == null) { throw new IllegalArgumentException(); } NetworkData.Builder b = NetworkData.newBuilder(); if (network.name != null) { b.setName(network.name); } if (network.adminStateUp != null) { b.setAdminStateUp(network.adminStateUp); } if (network.shared != null) { b.setShared(network.shared); } if (network.routerExternal != null) { b.setRouterExternal(network.routerExternal); } return b; } private Network toModel(NetworkData data) { Network model = new Network(); model.status = data.getStatus(); model.subnets = Lists.newArrayList(); model.name = data.getName(); model.adminStateUp = data.getAdminStateUp(); model.routerExternal = data.getRouterExternal(); model.tenantId = Long.toString(data.getProject()); model.id = Long.toString(data.getId()); model.shared = data.getShared(); return model; } }