Ray Milkey

Add L2 selector options to connectivity intents

Added --etherType, --etherSrc, and --etherDst to
PointToPointIntent and MultiPontToSinglePointIntent
creation in the ONOS CLI.

Change-Id: Ibccd3c0b331e7f89be6903f264a6889ac1ad5f17
...@@ -2,18 +2,15 @@ package org.onlab.onos.cli.net; ...@@ -2,18 +2,15 @@ package org.onlab.onos.cli.net;
2 2
3 import org.apache.karaf.shell.commands.Argument; 3 import org.apache.karaf.shell.commands.Argument;
4 import org.apache.karaf.shell.commands.Command; 4 import org.apache.karaf.shell.commands.Command;
5 -import org.onlab.onos.cli.AbstractShellCommand;
6 import org.onlab.onos.net.ConnectPoint; 5 import org.onlab.onos.net.ConnectPoint;
7 import org.onlab.onos.net.DeviceId; 6 import org.onlab.onos.net.DeviceId;
8 import org.onlab.onos.net.PortNumber; 7 import org.onlab.onos.net.PortNumber;
9 -import org.onlab.onos.net.flow.DefaultTrafficSelector;
10 import org.onlab.onos.net.flow.DefaultTrafficTreatment; 8 import org.onlab.onos.net.flow.DefaultTrafficTreatment;
11 import org.onlab.onos.net.flow.TrafficSelector; 9 import org.onlab.onos.net.flow.TrafficSelector;
12 import org.onlab.onos.net.flow.TrafficTreatment; 10 import org.onlab.onos.net.flow.TrafficTreatment;
13 import org.onlab.onos.net.intent.Intent; 11 import org.onlab.onos.net.intent.Intent;
14 import org.onlab.onos.net.intent.IntentService; 12 import org.onlab.onos.net.intent.IntentService;
15 import org.onlab.onos.net.intent.MultiPointToSinglePointIntent; 13 import org.onlab.onos.net.intent.MultiPointToSinglePointIntent;
16 -import org.onlab.packet.Ethernet;
17 14
18 import java.util.HashSet; 15 import java.util.HashSet;
19 import java.util.Set; 16 import java.util.Set;
...@@ -26,7 +23,7 @@ import static org.onlab.onos.net.PortNumber.portNumber; ...@@ -26,7 +23,7 @@ import static org.onlab.onos.net.PortNumber.portNumber;
26 */ 23 */
27 @Command(scope = "onos", name = "add-multi-to-single-intent", 24 @Command(scope = "onos", name = "add-multi-to-single-intent",
28 description = "Installs point-to-point connectivity intent") 25 description = "Installs point-to-point connectivity intent")
29 -public class AddMultiPointToSinglePointIntentCommand extends AbstractShellCommand { 26 +public class AddMultiPointToSinglePointIntentCommand extends ConnectivityIntentCommand {
30 27
31 @Argument(index = 0, name = "ingressDevices", 28 @Argument(index = 0, name = "ingressDevices",
32 description = "Ingress Device/Port Description", 29 description = "Ingress Device/Port Description",
...@@ -55,9 +52,7 @@ public class AddMultiPointToSinglePointIntentCommand extends AbstractShellComman ...@@ -55,9 +52,7 @@ public class AddMultiPointToSinglePointIntentCommand extends AbstractShellComman
55 ingressPoints.add(ingress); 52 ingressPoints.add(ingress);
56 } 53 }
57 54
58 - TrafficSelector selector = DefaultTrafficSelector.builder() 55 + TrafficSelector selector = buildTrafficSelector();
59 - .matchEthType(Ethernet.TYPE_IPV4)
60 - .build();
61 TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); 56 TrafficTreatment treatment = DefaultTrafficTreatment.builder().build();
62 57
63 Intent intent = new MultiPointToSinglePointIntent(appId(), selector, treatment, 58 Intent intent = new MultiPointToSinglePointIntent(appId(), selector, treatment,
......
...@@ -2,18 +2,16 @@ package org.onlab.onos.cli.net; ...@@ -2,18 +2,16 @@ package org.onlab.onos.cli.net;
2 2
3 import org.apache.karaf.shell.commands.Argument; 3 import org.apache.karaf.shell.commands.Argument;
4 import org.apache.karaf.shell.commands.Command; 4 import org.apache.karaf.shell.commands.Command;
5 -import org.onlab.onos.cli.AbstractShellCommand;
6 import org.onlab.onos.net.ConnectPoint; 5 import org.onlab.onos.net.ConnectPoint;
7 import org.onlab.onos.net.DeviceId; 6 import org.onlab.onos.net.DeviceId;
8 import org.onlab.onos.net.PortNumber; 7 import org.onlab.onos.net.PortNumber;
9 -import org.onlab.onos.net.flow.DefaultTrafficSelector;
10 -import org.onlab.onos.net.flow.DefaultTrafficTreatment;
11 import org.onlab.onos.net.flow.TrafficSelector; 8 import org.onlab.onos.net.flow.TrafficSelector;
12 import org.onlab.onos.net.flow.TrafficTreatment; 9 import org.onlab.onos.net.flow.TrafficTreatment;
13 import org.onlab.onos.net.intent.Intent; 10 import org.onlab.onos.net.intent.Intent;
14 import org.onlab.onos.net.intent.IntentService; 11 import org.onlab.onos.net.intent.IntentService;
15 import org.onlab.onos.net.intent.PointToPointIntent; 12 import org.onlab.onos.net.intent.PointToPointIntent;
16 -import org.onlab.packet.Ethernet; 13 +
14 +import static org.onlab.onos.net.flow.DefaultTrafficTreatment.builder;
17 15
18 import static org.onlab.onos.net.DeviceId.deviceId; 16 import static org.onlab.onos.net.DeviceId.deviceId;
19 import static org.onlab.onos.net.PortNumber.portNumber; 17 import static org.onlab.onos.net.PortNumber.portNumber;
...@@ -23,7 +21,7 @@ import static org.onlab.onos.net.PortNumber.portNumber; ...@@ -23,7 +21,7 @@ import static org.onlab.onos.net.PortNumber.portNumber;
23 */ 21 */
24 @Command(scope = "onos", name = "add-point-intent", 22 @Command(scope = "onos", name = "add-point-intent",
25 description = "Installs point-to-point connectivity intent") 23 description = "Installs point-to-point connectivity intent")
26 -public class AddPointToPointIntentCommand extends AbstractShellCommand { 24 +public class AddPointToPointIntentCommand extends ConnectivityIntentCommand {
27 25
28 @Argument(index = 0, name = "ingressDevice", 26 @Argument(index = 0, name = "ingressDevice",
29 description = "Ingress Device/Port Description", 27 description = "Ingress Device/Port Description",
...@@ -47,10 +45,8 @@ public class AddPointToPointIntentCommand extends AbstractShellCommand { ...@@ -47,10 +45,8 @@ public class AddPointToPointIntentCommand extends AbstractShellCommand {
47 PortNumber egressPortNumber = portNumber(getPortNumber(egressDeviceString)); 45 PortNumber egressPortNumber = portNumber(getPortNumber(egressDeviceString));
48 ConnectPoint egress = new ConnectPoint(egressDeviceId, egressPortNumber); 46 ConnectPoint egress = new ConnectPoint(egressDeviceId, egressPortNumber);
49 47
50 - TrafficSelector selector = DefaultTrafficSelector.builder() 48 + TrafficSelector selector = buildTrafficSelector();
51 - .matchEthType(Ethernet.TYPE_IPV4) 49 + TrafficTreatment treatment = builder().build();
52 - .build();
53 - TrafficTreatment treatment = DefaultTrafficTreatment.builder().build();
54 50
55 Intent intent = new PointToPointIntent(appId(), selector, treatment, 51 Intent intent = new PointToPointIntent(appId(), selector, treatment,
56 ingress, egress); 52 ingress, egress);
......
1 +package org.onlab.onos.cli.net;
2 +
3 +import org.apache.karaf.shell.commands.Option;
4 +import org.onlab.onos.cli.AbstractShellCommand;
5 +import org.onlab.onos.net.flow.DefaultTrafficSelector;
6 +import org.onlab.onos.net.flow.TrafficSelector;
7 +import org.onlab.packet.Ethernet;
8 +import org.onlab.packet.MacAddress;
9 +
10 +import com.google.common.base.Strings;
11 +
12 +/**
13 + * Base class for command line operations for connectivity based intents.
14 + */
15 +public abstract class ConnectivityIntentCommand extends AbstractShellCommand {
16 +
17 + @Option(name = "-s", aliases = "--ethSrc", description = "Source MAC Address",
18 + required = false, multiValued = false)
19 + private String srcMacString = null;
20 +
21 + @Option(name = "-d", aliases = "--ethDst", description = "Destination MAC Address",
22 + required = false, multiValued = false)
23 + private String dstMacString = null;
24 +
25 + @Option(name = "-t", aliases = "--ethType", description = "Ethernet Type",
26 + required = false, multiValued = false)
27 + private String ethTypeString = "";
28 +
29 + /**
30 + * Constructs a traffic selector based on the command line arguments
31 + * presented to the command.
32 + */
33 + protected TrafficSelector buildTrafficSelector() {
34 + TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder();
35 +
36 + Short ethType = Ethernet.TYPE_IPV4;
37 + if (!Strings.isNullOrEmpty(ethTypeString)) {
38 + EthType ethTypeParameter = EthType.valueOf(ethTypeString);
39 + ethType = ethTypeParameter.value();
40 + }
41 + selectorBuilder.matchEthType(ethType);
42 +
43 + if (!Strings.isNullOrEmpty(srcMacString)) {
44 + selectorBuilder.matchEthSrc(MacAddress.valueOf(srcMacString));
45 + }
46 +
47 + if (!Strings.isNullOrEmpty(dstMacString)) {
48 + selectorBuilder.matchEthDst(MacAddress.valueOf(dstMacString));
49 + }
50 +
51 + return selectorBuilder.build();
52 + }
53 +
54 +}
1 +package org.onlab.onos.cli.net;
2 +
3 +import org.onlab.packet.Ethernet;
4 +
5 +/**
6 + * Allowed values for Ethernet types. Used by the CLI completer for
7 + * connectivity based intent L2 parameters.
8 + */
9 +public enum EthType {
10 + /** ARP. */
11 + ARP(Ethernet.TYPE_ARP),
12 + /** RARP. */
13 + RARP(Ethernet.TYPE_RARP),
14 + /** IPV4. */
15 + IPV4(Ethernet.TYPE_IPV4),
16 + /** LLDP. */
17 + LLDP(Ethernet.TYPE_LLDP),
18 + /** BSN. */
19 + BSN(Ethernet.TYPE_BSN);
20 +
21 + private short value;
22 +
23 + /**
24 + * Constructs an EthType with the given value.
25 + *
26 + * @param value value to use when this EthType is seen.
27 + */
28 + private EthType(short value) {
29 + this.value = value;
30 + }
31 +
32 + /**
33 + * Gets the value to use for this EthType.
34 + *
35 + * @return short value to use for this EthType
36 + */
37 + public short value() {
38 + return this.value;
39 + }
40 +}
1 +package org.onlab.onos.cli.net;
2 +
3 +import java.util.List;
4 +import java.util.SortedSet;
5 +
6 +import org.apache.karaf.shell.console.Completer;
7 +import org.apache.karaf.shell.console.completer.StringsCompleter;
8 +
9 +/**
10 + * Ethernet type completer.
11 + */
12 +public class EthTypeCompleter implements Completer {
13 + @Override
14 + public int complete(String buffer, int cursor, List<String> candidates) {
15 + // Delegate string completer
16 + StringsCompleter delegate = new StringsCompleter();
17 + SortedSet<String> strings = delegate.getStrings();
18 + strings.add(EthType.ARP.toString());
19 + strings.add(EthType.BSN.toString());
20 + strings.add(EthType.IPV4.toString());
21 + strings.add(EthType.LLDP.toString());
22 + strings.add(EthType.RARP.toString());
23 +
24 + // Now let the completer do the work for figuring out what to offer.
25 + return delegate.complete(buffer, cursor, candidates);
26 + }
27 +
28 +}
...@@ -96,12 +96,18 @@ ...@@ -96,12 +96,18 @@
96 <ref component-id="connectPointCompleter"/> 96 <ref component-id="connectPointCompleter"/>
97 <null/> 97 <null/>
98 </completers> 98 </completers>
99 + <optional-completers>
100 + <entry key="-t" value-ref="ethTypeCompleter"/>
101 + </optional-completers>
99 </command> 102 </command>
100 <command> 103 <command>
101 <action class="org.onlab.onos.cli.net.AddMultiPointToSinglePointIntentCommand"/> 104 <action class="org.onlab.onos.cli.net.AddMultiPointToSinglePointIntentCommand"/>
102 <completers> 105 <completers>
103 <ref component-id="connectPointCompleter"/> 106 <ref component-id="connectPointCompleter"/>
104 </completers> 107 </completers>
108 + <optional-completers>
109 + <entry key="-t" value-ref="ethTypeCompleter"/>
110 + </optional-completers>
105 </command> 111 </command>
106 <command> 112 <command>
107 <action class="org.onlab.onos.cli.net.IntentPushTestCommand"/> 113 <action class="org.onlab.onos.cli.net.IntentPushTestCommand"/>
...@@ -158,5 +164,6 @@ ...@@ -158,5 +164,6 @@
158 <bean id="flowRuleStatusCompleter" class="org.onlab.onos.cli.net.FlowRuleStatusCompleter"/> 164 <bean id="flowRuleStatusCompleter" class="org.onlab.onos.cli.net.FlowRuleStatusCompleter"/>
159 <bean id="connectPointCompleter" class="org.onlab.onos.cli.net.ConnectPointCompleter"/> 165 <bean id="connectPointCompleter" class="org.onlab.onos.cli.net.ConnectPointCompleter"/>
160 <bean id="nullCompleter" class="org.apache.karaf.shell.console.completer.NullCompleter"/> 166 <bean id="nullCompleter" class="org.apache.karaf.shell.console.completer.NullCompleter"/>
167 + <bean id="ethTypeCompleter" class="org.onlab.onos.cli.net.EthTypeCompleter"/>
161 168
162 </blueprint> 169 </blueprint>
......