b0e2f38d7909415cfde3accb6894f1b95535f77a
[onosfw.git] /
1 /*
2  * Copyright 2015 Open Networking Laboratory
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.onosproject.vtnweb.resources;
17
18 import static javax.ws.rs.core.Response.Status.NOT_FOUND;
19 import static javax.ws.rs.core.Response.Status.OK;
20 import static org.onlab.util.Tools.nullIsNotFound;
21
22 import java.io.IOException;
23 import java.io.InputStream;
24
25 import javax.ws.rs.Consumes;
26 import javax.ws.rs.DELETE;
27 import javax.ws.rs.GET;
28 import javax.ws.rs.POST;
29 import javax.ws.rs.PUT;
30 import javax.ws.rs.Path;
31 import javax.ws.rs.PathParam;
32 import javax.ws.rs.Produces;
33 import javax.ws.rs.core.MediaType;
34 import javax.ws.rs.core.Response;
35
36 import org.onosproject.rest.AbstractWebResource;
37 import org.onosproject.vtnrsc.FlowClassifier;
38 import org.onosproject.vtnrsc.FlowClassifierId;
39 import org.onosproject.vtnrsc.flowclassifier.FlowClassifierService;
40 import org.onosproject.vtnweb.web.FlowClassifierCodec;
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
43
44 import com.fasterxml.jackson.databind.JsonNode;
45 import com.fasterxml.jackson.databind.ObjectMapper;
46 import com.fasterxml.jackson.databind.node.ArrayNode;
47 import com.fasterxml.jackson.databind.node.ObjectNode;
48
49 /**
50  * Query and program flow classifier.
51  */
52 @Path("flow_classifiers")
53 public class FlowClassifierWebResource extends AbstractWebResource {
54
55     private final Logger log = LoggerFactory.getLogger(FlowClassifierWebResource.class);
56
57     final FlowClassifierService service = get(FlowClassifierService.class);
58     public static final String FLOW_CLASSIFIER_NOT_FOUND = "Flow classifier not found";
59
60     /**
61      * Get all flow classifiers created.
62      *
63      * @return 200 OK
64      */
65     @GET
66     @Produces(MediaType.APPLICATION_JSON)
67     public Response getFlowClassifiers() {
68         final Iterable<FlowClassifier> flowClassifiers = service.getFlowClassifiers();
69         ObjectNode result = new ObjectMapper().createObjectNode();
70         ArrayNode flowClassifierEntry = result.putArray("flow_classifiers");
71         if (flowClassifiers != null) {
72             for (final FlowClassifier flowClassifier : flowClassifiers) {
73                 flowClassifierEntry.add(new FlowClassifierCodec().encode(flowClassifier, this));
74             }
75         }
76         return ok(result.toString()).build();
77     }
78
79     /**
80      * Get details of a flow classifier.
81      *
82      * @param id flow classifier id
83      * @return 200 OK , 404 if given identifier does not exist
84      */
85     @GET
86     @Path("{flow_id}")
87     @Produces(MediaType.APPLICATION_JSON)
88     public Response getFlowClassifier(@PathParam("flow_id") String id) {
89
90         if (!service.hasFlowClassifier(FlowClassifierId.of(id))) {
91             return Response.status(NOT_FOUND).entity(FLOW_CLASSIFIER_NOT_FOUND).build();
92         }
93         FlowClassifier flowClassifier = nullIsNotFound(service.getFlowClassifier(FlowClassifierId.of(id)),
94                 FLOW_CLASSIFIER_NOT_FOUND);
95
96         ObjectNode result = new ObjectMapper().createObjectNode();
97         result.set("flow_classifier", new FlowClassifierCodec().encode(flowClassifier, this));
98
99         return ok(result.toString()).build();
100     }
101
102     /**
103      * Creates and stores a new flow classifier.
104      *
105      * @param stream flow classifier from JSON
106      * @return status of the request - CREATED if the JSON is correct,
107      * BAD_REQUEST if the JSON is invalid
108      */
109     @POST
110     @Consumes(MediaType.APPLICATION_JSON)
111     @Produces(MediaType.APPLICATION_JSON)
112     public Response createFlowClassifier(InputStream stream) {
113         try {
114             ObjectMapper mapper = new ObjectMapper();
115             ObjectNode jsonTree = (ObjectNode) mapper.readTree(stream);
116             JsonNode flow = jsonTree.get("flow_classifier");
117
118             FlowClassifier flowClassifier = new FlowClassifierCodec().decode((ObjectNode) flow, this);
119             Boolean issuccess = nullIsNotFound(service.createFlowClassifier(flowClassifier), FLOW_CLASSIFIER_NOT_FOUND);
120             return Response.status(OK).entity(issuccess.toString()).build();
121         } catch (IOException ex) {
122             log.error("Exception while creating flow classifier {}.", ex.toString());
123             throw new IllegalArgumentException(ex);
124         }
125     }
126
127     /**
128      * Update details of a flow classifier.
129      *
130      * @param id flow classifier id
131      * @param stream InputStream
132      * @return 200 OK, 404 if given identifier does not exist
133      */
134     @PUT
135     @Path("{flow_id}")
136     @Produces(MediaType.APPLICATION_JSON)
137     @Consumes(MediaType.APPLICATION_JSON)
138     public Response updateFlowClassifier(@PathParam("flow_id") String id, final InputStream stream) {
139         try {
140
141             JsonNode jsonTree = mapper().readTree(stream);
142             JsonNode flow = jsonTree.get("flow_classifier");
143             FlowClassifier flowClassifier = new FlowClassifierCodec().decode((ObjectNode) flow, this);
144             Boolean result = nullIsNotFound(service.updateFlowClassifier(flowClassifier), FLOW_CLASSIFIER_NOT_FOUND);
145             return Response.status(OK).entity(result.toString()).build();
146         } catch (IOException e) {
147             log.error("Update flow classifier failed because of exception {}.", e.toString());
148             throw new IllegalArgumentException(e);
149         }
150     }
151
152     /**
153      * Delete details of a flow classifier.
154      *
155      * @param id flow classifier id
156      */
157     @Path("{flow_id}")
158     @DELETE
159     public void deleteFlowClassifier(@PathParam("flow_id") String id) {
160         log.debug("Deletes flow classifier by identifier {}.", id);
161         FlowClassifierId flowClassifierId = FlowClassifierId.of(id);
162         Boolean issuccess = nullIsNotFound(service.removeFlowClassifier(flowClassifierId), FLOW_CLASSIFIER_NOT_FOUND);
163
164     }
165 }