Skip to content

Commit b45ffda

Browse files
committed
Add REST API for openstackvtap app
Change-Id: I5d7697069d804eeb88eb57cbd845af90764c7a86
1 parent b3d199b commit b45ffda

File tree

10 files changed

+647
-38
lines changed

10 files changed

+647
-38
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Copyright 2019-present Open Networking Foundation
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.openstackvtap.api;
17+
18+
import java.nio.charset.StandardCharsets;
19+
20+
/**
21+
* Provides constants used in OpenstackVtap.
22+
*/
23+
public final class Constants {
24+
25+
private Constants() {
26+
}
27+
28+
public static final String REST_UTF8 = StandardCharsets.UTF_8.name();
29+
}

apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,13 @@
1919
import org.apache.karaf.shell.api.action.Command;
2020
import org.apache.karaf.shell.api.action.Completion;
2121
import org.apache.karaf.shell.api.action.lifecycle.Service;
22-
import org.onlab.packet.IpPrefix;
23-
import org.onlab.packet.TpPort;
2422
import org.onosproject.cli.AbstractShellCommand;
2523
import org.onosproject.openstackvtap.api.OpenstackVtap;
2624
import org.onosproject.openstackvtap.api.OpenstackVtapAdminService;
27-
import org.onosproject.openstackvtap.impl.DefaultOpenstackVtapCriterion;
25+
import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
2826

29-
import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getProtocolTypeFromString;
3027
import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getVtapTypeFromString;
28+
import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.makeVtapCriterion;
3129

3230
/**
3331
* Adds a openstack vtap rule.
@@ -76,38 +74,19 @@ public class OpenstackVtapAddCommand extends AbstractShellCommand {
7674

7775
@Override
7876
protected void doExecute() {
79-
DefaultOpenstackVtapCriterion.Builder vtapCriterionBuilder = DefaultOpenstackVtapCriterion.builder();
80-
if (makeCriterion(vtapCriterionBuilder)) {
81-
OpenstackVtap.Type type = getVtapTypeFromString(vtapTypeStr);
82-
83-
if (type == null) {
84-
print("Invalid vtap type");
85-
return;
86-
}
87-
88-
OpenstackVtap vtap = vtapService.createVtap(type, vtapCriterionBuilder.build());
89-
if (vtap != null) {
90-
print("Created OpenstackVtap with id { %s }", vtap.id().toString());
91-
} else {
92-
print("Failed to create OpenstackVtap");
93-
}
77+
OpenstackVtapCriterion criterion =
78+
makeVtapCriterion(srcIp, dstIp, ipProto, srcTpPort, dstTpPort);
79+
OpenstackVtap.Type type = getVtapTypeFromString(vtapTypeStr);
80+
if (type == null) {
81+
print("Invalid vtap type");
82+
return;
9483
}
95-
}
9684

97-
private boolean makeCriterion(DefaultOpenstackVtapCriterion.Builder vtapCriterionBuilder) {
98-
try {
99-
vtapCriterionBuilder.srcIpPrefix(IpPrefix.valueOf(srcIp));
100-
vtapCriterionBuilder.dstIpPrefix(IpPrefix.valueOf(dstIp));
101-
} catch (Exception e) {
102-
print("Inputted valid source IP & destination IP in CIDR (e.g., \"10.1.0.4/32\")");
103-
return false;
85+
OpenstackVtap vtap = vtapService.createVtap(type, criterion);
86+
if (vtap != null) {
87+
print("Created OpenstackVtap with id { %s }", vtap.id().toString());
88+
} else {
89+
print("Failed to create OpenstackVtap");
10490
}
105-
106-
vtapCriterionBuilder.ipProtocol(getProtocolTypeFromString(ipProto.toLowerCase()));
107-
108-
vtapCriterionBuilder.srcTpPort(TpPort.tpPort(srcTpPort));
109-
vtapCriterionBuilder.dstTpPort(TpPort.tpPort(dstTpPort));
110-
111-
return true;
11291
}
11392
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
* Copyright 2019-present Open Networking Foundation
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.openstackvtap.codec;
17+
18+
import com.fasterxml.jackson.databind.node.ObjectNode;
19+
import org.onlab.packet.IpAddress;
20+
import org.onlab.packet.IpPrefix;
21+
import org.onlab.packet.TpPort;
22+
import org.onosproject.codec.CodecContext;
23+
import org.onosproject.codec.JsonCodec;
24+
import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
25+
import org.onosproject.openstackvtap.impl.DefaultOpenstackVtapCriterion;
26+
27+
import static org.onlab.util.Tools.nullIsIllegal;
28+
import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getProtocolStringFromType;
29+
import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getProtocolTypeFromString;
30+
31+
/**
32+
* Openstack vTap codec used for serializing and de-serializing JSON string.
33+
*/
34+
public final class OpenstackVtapCriterionCodec extends JsonCodec<OpenstackVtapCriterion> {
35+
36+
private static final String SRC_IP = "srcIp";
37+
private static final String DST_IP = "dstIp";
38+
private static final String IP_PROTOCOL = "ipProto";
39+
private static final String SRC_PORT = "srcPort";
40+
private static final String DST_PORT = "dstPort";
41+
42+
private static final String MISSING_MESSAGE = " is required in OpenstackVtapCriterion";
43+
44+
@Override
45+
public ObjectNode encode(OpenstackVtapCriterion entity, CodecContext context) {
46+
String protoStr = getProtocolStringFromType(entity.ipProtocol());
47+
48+
return context.mapper().createObjectNode()
49+
.put(SRC_IP, entity.srcIpPrefix().address().toString())
50+
.put(DST_IP, entity.dstIpPrefix().address().toString())
51+
.put(IP_PROTOCOL, protoStr)
52+
.put(SRC_PORT, entity.srcTpPort().toString())
53+
.put(DST_PORT, entity.dstTpPort().toString());
54+
}
55+
56+
@Override
57+
public OpenstackVtapCriterion decode(ObjectNode json, CodecContext context) {
58+
if (json == null || !json.isObject()) {
59+
return null;
60+
}
61+
62+
OpenstackVtapCriterion.Builder cBuilder = DefaultOpenstackVtapCriterion.builder();
63+
64+
// parse source IP address
65+
IpPrefix srcIp = IpPrefix.valueOf(IpAddress.valueOf(nullIsIllegal(
66+
json.get(SRC_IP).asText(), SRC_IP + MISSING_MESSAGE)), 32);
67+
// parse destination IP address
68+
IpPrefix dstIp = IpPrefix.valueOf(IpAddress.valueOf(nullIsIllegal(
69+
json.get(DST_IP).asText(), DST_IP + MISSING_MESSAGE)), 32);
70+
71+
cBuilder.srcIpPrefix(srcIp);
72+
cBuilder.dstIpPrefix(dstIp);
73+
74+
// parse IP protocol
75+
String ipProtoStr = json.get(IP_PROTOCOL).asText();
76+
if (ipProtoStr != null) {
77+
cBuilder.ipProtocol(getProtocolTypeFromString(ipProtoStr));
78+
}
79+
80+
// parse source port number
81+
int srcPort = json.get(SRC_PORT).asInt(0);
82+
83+
// parse destination port number
84+
int dstPort = json.get(DST_PORT).asInt(0);
85+
86+
cBuilder.srcTpPort(TpPort.tpPort(srcPort));
87+
cBuilder.dstTpPort(TpPort.tpPort(dstPort));
88+
89+
return cBuilder.build();
90+
}
91+
}

apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/util/OpenstackVtapUtil.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,17 @@
1818
import org.onlab.packet.IPv4;
1919
import org.onlab.packet.IpAddress;
2020
import org.onlab.packet.IpPrefix;
21+
import org.onlab.packet.TpPort;
2122
import org.onosproject.net.Host;
2223
import org.onosproject.net.behaviour.TunnelDescription;
2324
import org.onosproject.net.group.DefaultGroupKey;
2425
import org.onosproject.net.group.GroupKey;
2526
import org.onosproject.openstackvtap.api.OpenstackVtap;
2627
import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
2728
import org.onosproject.openstackvtap.api.OpenstackVtapNetwork;
29+
import org.onosproject.openstackvtap.impl.DefaultOpenstackVtapCriterion;
2830
import org.slf4j.Logger;
31+
import org.slf4j.LoggerFactory;
2932

3033
import java.io.ByteArrayOutputStream;
3134
import java.nio.charset.StandardCharsets;
@@ -38,6 +41,8 @@
3841
*/
3942
public final class OpenstackVtapUtil {
4043

44+
private static final Logger log = LoggerFactory.getLogger(OpenstackVtapUtil.class);
45+
4146
private static final String VTAP_TUNNEL_GRE = "vtap_gre";
4247
private static final String VTAP_TUNNEL_VXLAN = "vtap_vxlan";
4348
private static final String VTAP_GROUP_KEY = "VTAP_GROUP_KEY";
@@ -69,6 +74,27 @@ public static byte getProtocolTypeFromString(String str) {
6974
}
7075
}
7176

77+
/**
78+
* Obtains IP protocol string from the given type.
79+
*
80+
* @param type protocol type
81+
* @return IP protocol string
82+
*/
83+
public static String getProtocolStringFromType(byte type) {
84+
switch (type) {
85+
case IPv4.PROTOCOL_TCP:
86+
return "tcp";
87+
case IPv4.PROTOCOL_UDP:
88+
return "udp";
89+
case IPv4.PROTOCOL_ICMP:
90+
return "icmp";
91+
case 0:
92+
return "any";
93+
default:
94+
throw new IllegalArgumentException("Invalid vtap protocol type");
95+
}
96+
}
97+
7298
/**
7399
* Obtains openstack vtap type from the given string.
74100
*
@@ -178,6 +204,38 @@ public static TunnelDescription.Type getTunnelType(OpenstackVtapNetwork.Mode mod
178204
return TunnelDescription.Type.valueOf(mode.toString());
179205
}
180206

207+
/**
208+
* Makes Openstack vTap criterion from the given src, dst IP and port.
209+
*
210+
* @param srcIp source IP address
211+
* @param dstIp destination IP address
212+
* @param ipProto IP protocol
213+
* @param srcPort source port
214+
* @param dstPort destination port
215+
* @return openstack vTap criterion
216+
*/
217+
public static OpenstackVtapCriterion makeVtapCriterion(String srcIp,
218+
String dstIp,
219+
String ipProto,
220+
int srcPort,
221+
int dstPort) {
222+
OpenstackVtapCriterion.Builder cBuilder = DefaultOpenstackVtapCriterion.builder();
223+
224+
try {
225+
cBuilder.srcIpPrefix(IpPrefix.valueOf(srcIp));
226+
cBuilder.dstIpPrefix(IpPrefix.valueOf(dstIp));
227+
} catch (Exception e) {
228+
log.error("The given IP addresses are invalid");
229+
}
230+
231+
cBuilder.ipProtocol(getProtocolTypeFromString(ipProto.toLowerCase()));
232+
233+
cBuilder.srcTpPort(TpPort.tpPort(srcPort));
234+
cBuilder.dstTpPort(TpPort.tpPort(dstPort));
235+
236+
return cBuilder.build();
237+
}
238+
181239
/**
182240
* Print stack trace of given exception.
183241
*

apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapNetworkCodecRegister.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919

2020
import org.apache.karaf.shell.api.action.lifecycle.Service;
2121
import org.onosproject.codec.CodecService;
22+
import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
2223
import org.onosproject.openstackvtap.api.OpenstackVtapNetwork;
24+
import org.onosproject.openstackvtap.codec.OpenstackVtapCriterionCodec;
2325
import org.onosproject.openstackvtap.codec.OpenstackVtapNetworkCodec;
2426
import org.osgi.service.component.annotations.Activate;
2527
import org.osgi.service.component.annotations.Component;
@@ -44,13 +46,15 @@ public class OpenstackVtapNetworkCodecRegister {
4446
@Activate
4547
protected void activate() {
4648
codecService.registerCodec(OpenstackVtapNetwork.class, new OpenstackVtapNetworkCodec());
49+
codecService.registerCodec(OpenstackVtapCriterion.class, new OpenstackVtapCriterionCodec());
4750

4851
log.info("Started");
4952
}
5053

5154
@Deactivate
5255
protected void deactivate() {
5356
codecService.unregisterCodec(OpenstackVtapNetwork.class);
57+
codecService.unregisterCodec(OpenstackVtapCriterion.class);
5458

5559
log.info("Stopped");
5660
}

0 commit comments

Comments
 (0)