sangho
Committed by Gerrit Code Review

Add CLI commands to create/list/remove tunnels and policies

Change-Id: I8cffb0feceb07e7f090e6a51fa41dde680b4956a
/*
* Copyright 2015 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.segmentrouting.cli;
import org.apache.karaf.shell.commands.Argument;
import org.apache.karaf.shell.commands.Command;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.segmentrouting.Policy;
import org.onosproject.segmentrouting.SegmentRoutingService;
import org.onosproject.segmentrouting.TunnelPolicy;
/**
* Command to add a new policy.
*/
@Command(scope = "onos", name = "srpolicy-add",
description = "Create a new policy")
public class PolicyAddCommand extends AbstractShellCommand {
// TODO: Need to support skipping some parameters
@Argument(index = 0, name = "policy ID",
description = "policy ID",
required = true, multiValued = false)
String policyId;
@Argument(index = 1, name = "priority",
description = "priority",
required = true, multiValued = false)
int priority;
@Argument(index = 2, name = "src IP",
description = "src IP",
required = false, multiValued = false)
String srcIp;
@Argument(index = 3, name = "dst IP",
description = "dst IP",
required = false, multiValued = false)
String dstIp;
@Argument(index = 4, name = "policy type",
description = "policy type",
required = true, multiValued = false)
String policyType;
@Argument(index = 5, name = "tunnel ID",
description = "tunnel ID",
required = false, multiValued = false)
String tunnelId;
@Override
protected void execute() {
SegmentRoutingService srService =
AbstractShellCommand.get(SegmentRoutingService.class);
TunnelPolicy.Builder tpb = TunnelPolicy.builder().setPolicyId(policyId);
tpb.setPriority(priority);
tpb.setType(Policy.Type.valueOf(policyType));
if (srcIp != null) {
tpb.setSrcIp(srcIp);
}
if (dstIp != null) {
tpb.setDstIp(dstIp);
}
if (Policy.Type.valueOf(policyType) == Policy.Type.TUNNEL_FLOW) {
if (tunnelId == null) {
// TODO: handle errors
return;
}
tpb.setTunnelId(tunnelId);
}
srService.createPolicy(tpb.build());
}
}
/*
* Copyright 2015 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.segmentrouting.cli;
import org.apache.karaf.shell.commands.Command;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.segmentrouting.Policy;
import org.onosproject.segmentrouting.SegmentRoutingService;
import org.onosproject.segmentrouting.TunnelPolicy;
/**
* Command to show the list of policies.
*/
@Command(scope = "onos", name = "srpolicy-list",
description = "Lists all policies")
public class PolicyListCommand extends AbstractShellCommand {
private static final String FORMAT_MAPPING_TUNNEL =
" id=%s, type=%s, prio=%d, src=%s, dst=%s, proto=%s, tunnel=%s";
@Override
protected void execute() {
SegmentRoutingService srService =
AbstractShellCommand.get(SegmentRoutingService.class);
srService.getPolicies().forEach(policy -> printPolicy(policy));
}
private void printPolicy(Policy policy) {
if (policy.type() == Policy.Type.TUNNEL_FLOW) {
print(FORMAT_MAPPING_TUNNEL, policy.id(), policy.type(), policy.priority(),
policy.srcIp(), policy.dstIp(), (policy.ipProto() == null) ? "" : policy.ipProto(),
((TunnelPolicy) policy).tunnelId());
}
}
}
\ No newline at end of file
/*
* Copyright 2015 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.segmentrouting.cli;
import org.apache.karaf.shell.commands.Argument;
import org.apache.karaf.shell.commands.Command;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.segmentrouting.SegmentRoutingService;
import org.onosproject.segmentrouting.TunnelPolicy;
/**
* Command to add a new policy.
*/
@Command(scope = "onos", name = "srpolicy-remove",
description = "Remove a policy")
public class PolicyRemoveCommand extends AbstractShellCommand {
@Argument(index = 0, name = "policy ID",
description = "policy ID",
required = true, multiValued = false)
String policyId;
@Override
protected void execute() {
SegmentRoutingService srService =
AbstractShellCommand.get(SegmentRoutingService.class);
TunnelPolicy.Builder tpb = TunnelPolicy.builder().setPolicyId(policyId);
srService.removePolicy(tpb.build());
}
}
\ No newline at end of file
/*
* Copyright 2015 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.segmentrouting.cli;
import org.apache.karaf.shell.commands.Argument;
import org.apache.karaf.shell.commands.Command;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.segmentrouting.DefaultTunnel;
import org.onosproject.segmentrouting.SegmentRoutingService;
import org.onosproject.segmentrouting.Tunnel;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
/**
* Command to add a new tunnel.
*/
@Command(scope = "onos", name = "srtunnel-add",
description = "Create a new tunnel")
public class TunnelAddCommand extends AbstractShellCommand {
@Argument(index = 0, name = "tunnel ID",
description = "tunnel ID",
required = true, multiValued = false)
String tunnelId;
@Argument(index = 1, name = "label path",
description = "label path",
required = true, multiValued = false)
String labels;
@Override
protected void execute() {
SegmentRoutingService srService =
AbstractShellCommand.get(SegmentRoutingService.class);
List<Integer> labelIds = new ArrayList<>();
StringTokenizer strToken = new StringTokenizer(labels, ",");
while (strToken.hasMoreTokens()) {
labelIds.add(Integer.valueOf(strToken.nextToken()));
}
Tunnel tunnel = new DefaultTunnel(tunnelId, labelIds);
srService.createTunnel(tunnel);
}
}
\ No newline at end of file
/*
* Copyright 2015 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.segmentrouting.cli;
import org.apache.karaf.shell.commands.Command;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.segmentrouting.SegmentRoutingService;
import org.onosproject.segmentrouting.Tunnel;
/**
* Command to show the list of tunnels.
*/
@Command(scope = "onos", name = "srtunnel-list",
description = "Lists all tunnels")
public class TunnelListCommand extends AbstractShellCommand {
private static final String FORMAT_MAPPING =
" id=%s, path=%s";
@Override
protected void execute() {
SegmentRoutingService srService =
AbstractShellCommand.get(SegmentRoutingService.class);
srService.getTunnels().forEach(tunnel -> printTunnel(tunnel));
}
private void printTunnel(Tunnel tunnel) {
print(FORMAT_MAPPING, tunnel.id(), tunnel.labelIds());
}
}
<!--
~ Copyright 2015 Open Networking Laboratory
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
<command>
<action class="org.onosproject.segmentrouting.cli.TunnelListCommand"/>
</command>
<command>
<action class="org.onosproject.segmentrouting.cli.PolicyListCommand"/>
</command>
<command>
<action class="org.onosproject.segmentrouting.cli.PolicyAddCommand"/>
</command>
<command>
<action class="org.onosproject.segmentrouting.cli.PolicyRemoveCommand"/>
</command>
<command>
<action class="org.onosproject.segmentrouting.cli.TunnelAddCommand"/>
</command>
</command-bundle>
</blueprint>