Committed by
Ray Milkey
ONOS-3795 PATCH method in RestSbController and basic unit tests
Change-Id: I35dc31ab03fc72c11523b2c60f4455d7446a5364
Showing
5 changed files
with
128 additions
and
16 deletions
... | @@ -99,6 +99,17 @@ public interface RestSBController { | ... | @@ -99,6 +99,17 @@ public interface RestSBController { |
99 | InputStream get(DeviceId device, String request, String mediaType); | 99 | InputStream get(DeviceId device, String request, String mediaType); |
100 | 100 | ||
101 | /** | 101 | /** |
102 | + * Does a REST PATCH request with specified parameters to the device. | ||
103 | + * | ||
104 | + * @param device device to make the request to | ||
105 | + * @param request url of the request | ||
106 | + * @param payload payload of the request as an InputStream | ||
107 | + * @param mediaType format to retrieve the content in | ||
108 | + * @return true if operation returned 200, 201, 202, false otherwise | ||
109 | + */ | ||
110 | + boolean patch(DeviceId device, String request, InputStream payload, String mediaType); | ||
111 | + | ||
112 | + /** | ||
102 | * Does a REST DELETE request with specified parameters to the device. | 113 | * Does a REST DELETE request with specified parameters to the device. |
103 | * | 114 | * |
104 | * @param device device to make the request to | 115 | * @param device device to make the request to | ... | ... |
... | @@ -48,6 +48,16 @@ | ... | @@ -48,6 +48,16 @@ |
48 | <artifactId>jersey-client</artifactId> | 48 | <artifactId>jersey-client</artifactId> |
49 | </dependency> | 49 | </dependency> |
50 | <dependency> | 50 | <dependency> |
51 | + <groupId>org.apache.httpcomponents</groupId> | ||
52 | + <artifactId>httpclient-osgi</artifactId> | ||
53 | + <version>4.5.1</version> | ||
54 | + </dependency> | ||
55 | + <dependency> | ||
56 | + <groupId>org.apache.httpcomponents</groupId> | ||
57 | + <artifactId>httpcore-osgi</artifactId> | ||
58 | + <version>4.4.4</version> | ||
59 | + </dependency> | ||
60 | + <dependency> | ||
51 | <groupId>commons-io</groupId> | 61 | <groupId>commons-io</groupId> |
52 | <artifactId>commons-io</artifactId> | 62 | <artifactId>commons-io</artifactId> |
53 | <version>2.4</version> | 63 | <version>2.4</version> | ... | ... |
... | @@ -24,11 +24,13 @@ import org.apache.felix.scr.annotations.Activate; | ... | @@ -24,11 +24,13 @@ import org.apache.felix.scr.annotations.Activate; |
24 | import org.apache.felix.scr.annotations.Component; | 24 | import org.apache.felix.scr.annotations.Component; |
25 | import org.apache.felix.scr.annotations.Deactivate; | 25 | import org.apache.felix.scr.annotations.Deactivate; |
26 | import org.apache.felix.scr.annotations.Service; | 26 | import org.apache.felix.scr.annotations.Service; |
27 | +import org.apache.http.client.methods.HttpPatch; | ||
28 | +import org.apache.http.entity.StringEntity; | ||
29 | +import org.apache.http.impl.client.HttpClients; | ||
27 | import org.onlab.packet.IpAddress; | 30 | import org.onlab.packet.IpAddress; |
28 | import org.onosproject.net.DeviceId; | 31 | import org.onosproject.net.DeviceId; |
29 | import org.onosproject.protocol.rest.RestSBController; | 32 | import org.onosproject.protocol.rest.RestSBController; |
30 | import org.onosproject.protocol.rest.RestSBDevice; | 33 | import org.onosproject.protocol.rest.RestSBDevice; |
31 | -import org.osgi.service.component.ComponentContext; | ||
32 | import org.slf4j.Logger; | 34 | import org.slf4j.Logger; |
33 | import org.slf4j.LoggerFactory; | 35 | import org.slf4j.LoggerFactory; |
34 | 36 | ||
... | @@ -50,7 +52,6 @@ public class RestSBControllerImpl implements RestSBController { | ... | @@ -50,7 +52,6 @@ public class RestSBControllerImpl implements RestSBController { |
50 | 52 | ||
51 | private static final Logger log = | 53 | private static final Logger log = |
52 | LoggerFactory.getLogger(RestSBControllerImpl.class); | 54 | LoggerFactory.getLogger(RestSBControllerImpl.class); |
53 | - private static final String APPLICATION = "application/"; | ||
54 | private static final String XML = "xml"; | 55 | private static final String XML = "xml"; |
55 | private static final String JSON = "json"; | 56 | private static final String JSON = "json"; |
56 | private static final String DOUBLESLASH = "//"; | 57 | private static final String DOUBLESLASH = "//"; |
... | @@ -64,7 +65,7 @@ public class RestSBControllerImpl implements RestSBController { | ... | @@ -64,7 +65,7 @@ public class RestSBControllerImpl implements RestSBController { |
64 | Client client; | 65 | Client client; |
65 | 66 | ||
66 | @Activate | 67 | @Activate |
67 | - public void activate(ComponentContext context) { | 68 | + public void activate() { |
68 | client = Client.create(); | 69 | client = Client.create(); |
69 | log.info("Started"); | 70 | log.info("Started"); |
70 | } | 71 | } |
... | @@ -87,10 +88,10 @@ public class RestSBControllerImpl implements RestSBController { | ... | @@ -87,10 +88,10 @@ public class RestSBControllerImpl implements RestSBController { |
87 | 88 | ||
88 | @Override | 89 | @Override |
89 | public RestSBDevice getDevice(IpAddress ip, int port) { | 90 | public RestSBDevice getDevice(IpAddress ip, int port) { |
90 | - for (DeviceId info : deviceMap.keySet()) { | 91 | + for (RestSBDevice device : deviceMap.values()) { |
91 | - if (IpAddress.valueOf(info.uri().getHost()).equals(ip) && | 92 | + if (device.ip().equals(ip) && |
92 | - info.uri().getPort() == port) { | 93 | + device.port() == port) { |
93 | - return deviceMap.get(info); | 94 | + return device; |
94 | } | 95 | } |
95 | } | 96 | } |
96 | return null; | 97 | return null; |
... | @@ -167,6 +168,31 @@ public class RestSBControllerImpl implements RestSBController { | ... | @@ -167,6 +168,31 @@ public class RestSBControllerImpl implements RestSBController { |
167 | } | 168 | } |
168 | 169 | ||
169 | @Override | 170 | @Override |
171 | + public boolean patch(DeviceId device, String request, InputStream payload, String mediaType) { | ||
172 | + String url = deviceMap.get(device).protocol() + COLON + | ||
173 | + DOUBLESLASH + | ||
174 | + deviceMap.get(device).ip().toString() + | ||
175 | + COLON + deviceMap.get(device).port() + | ||
176 | + SLASH + request; | ||
177 | + try { | ||
178 | + HttpPatch httprequest = new HttpPatch(url); | ||
179 | + if (payload != null) { | ||
180 | + StringEntity input = new StringEntity(IOUtils.toString(payload, StandardCharsets.UTF_8)); | ||
181 | + input.setContentType(mediaType); | ||
182 | + httprequest.setEntity(input); | ||
183 | + } | ||
184 | + int responseStatusCode = HttpClients.createDefault().execute(httprequest) | ||
185 | + .getStatusLine() | ||
186 | + .getStatusCode(); | ||
187 | + return checkStatusCode(responseStatusCode); | ||
188 | + } catch (IOException e) { | ||
189 | + log.error("Cannot do PATCH {} request on device {} because can't read payload", | ||
190 | + request, device); | ||
191 | + } | ||
192 | + return false; | ||
193 | + } | ||
194 | + | ||
195 | + @Override | ||
170 | public boolean delete(DeviceId device, String request, InputStream payload, String mediaType) { | 196 | public boolean delete(DeviceId device, String request, InputStream payload, String mediaType) { |
171 | WebResource webResource = getWebResource(device, request); | 197 | WebResource webResource = getWebResource(device, request); |
172 | ClientResponse response = null; | 198 | ClientResponse response = null; |
... | @@ -195,17 +221,21 @@ public class RestSBControllerImpl implements RestSBController { | ... | @@ -195,17 +221,21 @@ public class RestSBControllerImpl implements RestSBController { |
195 | 221 | ||
196 | private boolean checkReply(ClientResponse response) { | 222 | private boolean checkReply(ClientResponse response) { |
197 | if (response != null) { | 223 | if (response != null) { |
198 | - if (response.getStatus() == STATUS_OK || | 224 | + return checkStatusCode(response.getStatus()); |
199 | - response.getStatus() == STATUS_CREATED || | ||
200 | - response.getStatus() == STATUS_ACCEPTED) { | ||
201 | - return true; | ||
202 | - } else { | ||
203 | - log.error("Failed request: HTTP error code : " | ||
204 | - + response.getStatus()); | ||
205 | - return false; | ||
206 | - } | ||
207 | } | 225 | } |
208 | log.error("Null reply from device"); | 226 | log.error("Null reply from device"); |
209 | return false; | 227 | return false; |
210 | } | 228 | } |
229 | + | ||
230 | + private boolean checkStatusCode(int statusCode) { | ||
231 | + if (statusCode == STATUS_OK || | ||
232 | + statusCode == STATUS_CREATED || | ||
233 | + statusCode == STATUS_ACCEPTED) { | ||
234 | + return true; | ||
235 | + } else { | ||
236 | + log.error("Failed request: HTTP error code : " | ||
237 | + + statusCode); | ||
238 | + return false; | ||
239 | + } | ||
240 | + } | ||
211 | } | 241 | } | ... | ... |
protocols/rest/ctl/src/test/java/org/onosproject/protocol/rest/ctl/RestSBControllerImplTest.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 2016 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 | + | ||
17 | +package org.onosproject.protocol.rest.ctl; | ||
18 | + | ||
19 | +import org.junit.Before; | ||
20 | +import org.junit.Test; | ||
21 | +import org.onlab.packet.IpAddress; | ||
22 | +import org.onosproject.protocol.rest.DefaultRestSBDevice; | ||
23 | +import org.onosproject.protocol.rest.RestSBDevice; | ||
24 | + | ||
25 | +import static org.junit.Assert.*; | ||
26 | + | ||
27 | +/** | ||
28 | + * Basic testing for RestSBController. | ||
29 | + */ | ||
30 | +public class RestSBControllerImplTest { | ||
31 | + | ||
32 | + RestSBControllerImpl controller; | ||
33 | + | ||
34 | + RestSBDevice device1; | ||
35 | + RestSBDevice device2; | ||
36 | + | ||
37 | + | ||
38 | + @Before | ||
39 | + public void setUp() { | ||
40 | + controller = new RestSBControllerImpl(); | ||
41 | + controller.activate(); | ||
42 | + device1 = new DefaultRestSBDevice(IpAddress.valueOf("127.0.0.1"), 8080, "foo", "bar", "http", true); | ||
43 | + device2 = new DefaultRestSBDevice(IpAddress.valueOf("127.0.0.2"), 8080, "foo1", "bar2", "http", true); | ||
44 | + controller.addDevice(device1); | ||
45 | + } | ||
46 | + | ||
47 | + @Test | ||
48 | + public void basics() { | ||
49 | + assertTrue("Device1 non added", controller.getDevices().containsValue(device1)); | ||
50 | + assertEquals("Device1 added but with wrong key", controller.getDevices() | ||
51 | + .get(device1.deviceId()), device1); | ||
52 | + assertEquals("Incorrect Get Device by ID", controller.getDevice(device1.deviceId()), device1); | ||
53 | + assertEquals("Incorrect Get Device by IP, Port", controller.getDevice(device1.ip(), device1.port()), device1); | ||
54 | + controller.addDevice(device2); | ||
55 | + assertTrue("Device2 non added", controller.getDevices().containsValue(device2)); | ||
56 | + controller.removeDevice(device2); | ||
57 | + assertFalse("Device2 not removed", controller.getDevices().containsValue(device2)); | ||
58 | + } | ||
59 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
... | @@ -25,6 +25,8 @@ | ... | @@ -25,6 +25,8 @@ |
25 | 25 | ||
26 | <bundle>mvn:com.sun.jersey/jersey-client/1.19</bundle> | 26 | <bundle>mvn:com.sun.jersey/jersey-client/1.19</bundle> |
27 | <bundle>mvn:commons-io/commons-io/2.4</bundle> | 27 | <bundle>mvn:commons-io/commons-io/2.4</bundle> |
28 | + <bundle>mvn:org.apache.httpcomponents/httpclient-osgi/4.5.1</bundle> | ||
29 | + <bundle>mvn:org.apache.httpcomponents/httpcore-osgi/4.4.4</bundle> | ||
28 | </feature> | 30 | </feature> |
29 | </features> | 31 | </features> |
30 | 32 | ... | ... |
-
Please register or login to post a comment