Skip to content

Commit a8cc6c0

Browse files
committed
Merge pull request #24 from bjlee72/rest_exception
In Firewall and StaticFlowEntryManager, some REST APIs are modified.
2 parents 6818991 + e6d89ee commit a8cc6c0

13 files changed

Lines changed: 793 additions & 527 deletions

Torpedo/Torpedo.jar

2.93 KB
Binary file not shown.

Torpedo/src/etri/sdn/controller/module/firewall/FirewallStorage.java

Lines changed: 44 additions & 198 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package etri.sdn.controller.module.firewall;
22

3-
import java.io.IOException;
43
import java.util.ArrayList;
54
import java.util.Collection;
65
import java.util.Collections;
@@ -9,12 +8,6 @@
98
import java.util.List;
109
import java.util.Map;
1110

12-
import org.codehaus.jackson.map.ObjectMapper;
13-
import org.restlet.Request;
14-
import org.restlet.Response;
15-
import org.restlet.Restlet;
16-
import org.restlet.data.MediaType;
17-
import org.restlet.data.Method;
1811
import org.slf4j.Logger;
1912
import org.slf4j.LoggerFactory;
2013

@@ -41,12 +34,56 @@ public class FirewallStorage extends OFModel{
4134

4235
private FirewallEntryTable firewallEntryTable;
4336

37+
private RESTApi[] apis;
38+
4439
FirewallStorage (OFMFirewall manager, String name){
4540
this.manager = manager;
4641
this.name = name;
4742
firewallEntryTable = new FirewallEntryTable();
43+
44+
initRestApis();
4845
}
4946

47+
/**
48+
* Initialize REST API list.
49+
*/
50+
private void initRestApis() {
51+
52+
/**
53+
* Array of RESTApi objects.
54+
* Each objects represent a REST call handler routine bound to a specific URI.
55+
*/
56+
RESTApi[] tmp = {
57+
/**
58+
* This object implements a REST handler routine for operations of firewall.
59+
*/
60+
new RESTApi(
61+
"/wm/firewall/module/{op}/json",
62+
new RESTOperationApi(manager)
63+
),
64+
65+
/**
66+
* This object implements REST handler routines for
67+
* retrieving, inserting and deleting firewall rule(s).
68+
*/
69+
new RESTApi(
70+
"/wm/firewall/rules/json",
71+
new RESTPostDeleteApi(manager)
72+
),
73+
74+
/**
75+
* This object is an additional implements REST handler routines (i.e. RFC2616).
76+
* According to RFC2616, DELETE method cannot have data fields.
77+
*/
78+
new RESTApi(
79+
"/wm/firewall/rules/delete/{ruleid}/json",
80+
new RESTDeleteByIDApi(manager)
81+
)
82+
};
83+
84+
this.apis = tmp;
85+
}
86+
5087
public OFMFirewall getManager() {
5188
return this.manager;
5289
}
@@ -227,197 +264,6 @@ public Collection<Map<String, Object>> getAllDBEntries (IStorageService firewall
227264

228265
return resultList;
229266
}
230-
231-
/**
232-
* Array of RESTApi objects.
233-
* Each objects represent a REST call handler routine bound to a specific URI.
234-
*/
235-
private RESTApi[] apis = {
236-
237-
/**
238-
* This object implements a REST handler routine for operations of firewall.
239-
*/
240-
new RESTApi(
241-
"/wm/firewall/module/{op}/json",
242-
new Restlet() {
243-
@Override
244-
public void handle(Request request, Response response) {
245-
246-
IFirewallService firewall = getManager();
247-
248-
String op = (String) request.getAttributes().get("op");
249-
250-
String result = null;
251-
252-
if (op.toLowerCase().equals("storagerules")){
253-
// create an object mapper.
254-
ObjectMapper om = new ObjectMapper();
255-
om.registerModule( new OFFirewallRuleReplySerializerModule() );
256-
257-
try {
258-
result = om./*writerWithDefaultPrettyPrinter().*/writeValueAsString( firewallEntryTable.values() );
259-
} catch (Exception e) {
260-
e.printStackTrace();
261-
return;
262-
}
263-
}
264-
265-
else if (op.toLowerCase().equals("status")){
266-
if (firewall.isEnabled())
267-
result = "{\"result\" : \"firewall enabled\"}";
268-
else
269-
result = "{\"result\" : \"firewall disabled\"}";
270-
}
271-
272-
else if (op.toLowerCase().equals("enable")){
273-
firewall.enableFirewall(true);
274-
result = "{\"status\" : \"success\", \"details\" : \"firewall running\"}";
275-
}
276-
277-
else if (op.toLowerCase().equals("disable")){
278-
firewall.enableFirewall(false);
279-
result = "{\"status\" : \"success\", \"details\" : \"firewall stopped\"}";
280-
}
281-
282-
else if (op.toLowerCase().equals("get-subnet-mask")){
283-
result = "{\"subnet-mask\" : \"" + firewall.getSubnetMask() + "\"}";
284-
}
285-
286-
else if (op.toLowerCase().equals("set-subnet-mask")){
287-
String entityText = request.getEntityAsText();
288-
entityText = entityText.replaceAll("[\']", "");
289-
290-
try {
291-
firewall.setSubnetMask(FirewallRule.jsonToSubnetMask(entityText));
292-
result = "{\"status\" : \"success\", \"details\" : \"subnet-mask is set\"}";
293-
}
294-
catch (IOException e) {
295-
logger.error("Error parsing subnet-mask: {}, {}", entityText, e);
296-
return;
297-
}
298-
}
299-
300-
else {
301-
result = "{\"status\" : \"failure\", \"details\" : \"invalid operation\"}";
302-
}
303-
304-
response.setEntity(result, MediaType.APPLICATION_JSON);
305-
}
306-
}
307-
),
308-
309-
/**
310-
* This object implements REST handler routines for
311-
* retrieving, inserting and deleting firewall rule(s).
312-
*/
313-
new RESTApi(
314-
"/wm/firewall/rules/json",
315-
new Restlet() {
316-
@Override
317-
public void handle(Request request, Response response) {
318-
IFirewallService firewall = getManager();
319-
320-
Method m = request.getMethod();
321-
String result = null;
322-
String status = null;
323-
boolean exists = false;
324-
FirewallRule inRule;
325-
326-
if (m == Method.GET){
327-
// create an object mapper.
328-
ObjectMapper om = new ObjectMapper();
329-
330-
try {
331-
result = om./*writerWithDefaultPrettyPrinter().*/writeValueAsString( manager.getRules() );
332-
} catch ( IOException e ) {
333-
e.printStackTrace();
334-
return;
335-
}
336-
}
337-
338-
else if (m == Method.POST){
339-
Iterator<FirewallRule> iter = firewall.getRules().iterator();
340-
341-
String entityText = request.getEntityAsText();
342-
entityText = entityText.replaceAll("[\']", "");
343-
344-
try {
345-
inRule = FirewallRule.jsonToFirewallRule(entityText);
346-
} catch (IOException e) {
347-
logger.error("Error parsing firewall rule: {}, {}", entityText, e);
348-
e.printStackTrace();
349-
return;
350-
}
351-
352-
while (iter.hasNext()) {
353-
FirewallRule r = iter.next();
354-
if ( inRule.isSameAs(r) ){
355-
exists = true;
356-
logger.error("Error! A similar firewall rule already exists.");
357-
break;
358-
}
359-
}
360-
361-
if ( exists == false ){
362-
// add rule to firewall
363-
firewall.addRule(inRule);
364-
status = "Rule added";
365-
}
366-
367-
result = "{\"status\" : \"" + status + "\"}";
368-
}
369-
370-
else if (m == Method.DELETE){
371-
Iterator<FirewallRule> iter = firewall.getRules().iterator();
372-
373-
String entityText = request.getEntityAsText();
374-
375-
// Clear all rules.
376-
if (entityText == null) {
377-
firewall.clearRules();
378-
status = "All rules are deleted.";
379-
}
380-
// Delete one rule based on input rule id.
381-
else {
382-
entityText = entityText.replaceAll("[\']", "");
383-
//System.out.println(entityText);
384-
385-
try {
386-
inRule = FirewallRule.jsonToFirewallRule(entityText);
387-
} catch (IOException e) {
388-
logger.error("Error parsing firewall rule: {}, {}", entityText, e);
389-
e.printStackTrace();
390-
return;
391-
}
392-
393-
while (iter.hasNext()) {
394-
FirewallRule r = iter.next();
395-
if ( r.ruleid == inRule.ruleid){
396-
exists = true;
397-
break;
398-
}
399-
}
400-
401-
if ( !exists ){
402-
logger.error("Error! Can't delete, a rule with ID {} doesn't exist.",
403-
inRule.ruleid);
404-
return;
405-
} else {
406-
// delete rule from firewall
407-
firewall.deleteRule( inRule.ruleid );
408-
status = "Rule deleted";
409-
}
410-
}
411-
412-
result = "{\"status\" : \"" + status + "\"}";
413-
}
414-
415-
response.setEntity(result, MediaType.APPLICATION_JSON);
416-
}
417-
}
418-
)
419-
420-
};
421267

422268
/**
423269
* Returns the list of RESTApi objects

Torpedo/src/etri/sdn/controller/module/firewall/OFMFirewall.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ public OFMStorageManager getStorageInstance(){
113113
return storageInstance;
114114
}
115115

116+
public FirewallStorage getFirewallStorage(){
117+
return firewallStorage;
118+
}
119+
116120
public String getDbName(){
117121
return dbName;
118122
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package etri.sdn.controller.module.firewall;
2+
3+
import org.restlet.Request;
4+
import org.restlet.Response;
5+
import org.restlet.Restlet;
6+
import org.restlet.data.MediaType;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
10+
public class RESTDeleteByIDApi extends Restlet {
11+
12+
// create logger
13+
private static final Logger logger = LoggerFactory.getLogger(FirewallStorage.class);
14+
15+
private OFMFirewall manager;
16+
17+
public RESTDeleteByIDApi(OFMFirewall manager) {
18+
this.manager = manager;
19+
}
20+
21+
@Override
22+
public void handle(Request request, Response response) {
23+
24+
String result = null;
25+
String status = null;
26+
27+
String ruleId = (String) request.getAttributes().get("ruleid");
28+
29+
if ( manager.getFirewallStorage().getFirewallEntryTable().getFirewallEntry(ruleId) != null ) {
30+
manager.deleteRule( Integer.parseInt(ruleId) );
31+
status = "Rule deleted";
32+
} else {
33+
logger.error("Error! Can't delete, a rule with ID {} doesn't exist.", ruleId);
34+
status = "Fail to delete rule";
35+
}
36+
37+
result = "{\"status\" : \"" + status + "\"}";
38+
response.setEntity(result, MediaType.APPLICATION_JSON);
39+
}
40+
}

0 commit comments

Comments
 (0)