blob: 66f5749cd185784b7f43fdd75dfd427a4f27b3ea [file] [log] [blame]
/*
* Copyright 2018-present Open Networking Foundation
*
* 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.t3.cli;
import org.apache.karaf.shell.api.action.Argument;
import org.apache.karaf.shell.api.action.Command;
import org.apache.karaf.shell.api.action.Completion;
import org.apache.karaf.shell.api.action.Option;
import org.apache.karaf.shell.api.action.lifecycle.Service;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.cli.PlaceholderCompleter;
import org.onosproject.cli.net.EthTypeCompleter;
import org.onosproject.cli.net.HostIdCompleter;
import org.onosproject.net.HostId;
import org.onosproject.t3.api.StaticPacketTrace;
import org.onosproject.t3.api.TroubleshootService;
import java.util.Set;
import static org.onlab.packet.EthType.EtherType;
/**
* Starts a Static Packet Trace for a given input and prints the result.
*/
@Service
@Command(scope = "onos", name = "t3-troubleshoot-simple",
description = "Given two hosts troubleshoots flows and groups between them, in case of segment routing")
public class TroubleshootSimpleTraceCommand extends AbstractShellCommand {
// OSGi workaround to introduce package dependency
HostIdCompleter completer;
@Argument(index = 0, name = "one", description = "One host ID",
required = true, multiValued = false)
@Completion(HostIdCompleter.class)
String srcHost = null;
@Argument(index = 1, name = "two", description = "Another host ID",
required = true, multiValued = false)
@Completion(HostIdCompleter.class)
String dstHost = null;
@Option(name = "-v", aliases = "--verbose", description = "Outputs complete path")
@Completion(PlaceholderCompleter.class)
private boolean verbosity1 = false;
@Option(name = "-vv", aliases = "--veryverbose", description = "Outputs flows and groups for every device")
@Completion(PlaceholderCompleter.class)
private boolean verbosity2 = false;
@Option(name = "-et", aliases = "--ethType", description = "ETH Type", valueToShowInHelp = "ipv4")
@Completion(EthTypeCompleter.class)
String ethType = "ipv4";
@Override
protected void doExecute() {
TroubleshootService service = get(TroubleshootService.class);
if (!service.checkNibValidity()) {
// if the NIB is found invalid, fill it with the current network states so that this command can proceed
print(T3CliUtils.NIB_AUTOFILLED);
TroubleshootLoadSnapshotCommand cmd = new TroubleshootLoadSnapshotCommand();
cmd.doExecute();
if (!service.checkNibValidity()) {
// if the NIB is still invalid even after auto-filled snapshots, stop and warn
print(T3CliUtils.NIB_TERMINATE);
return;
}
} else {
print(service.printNibSummary());
}
if (srcHost.equals(dstHost)) {
print("Source and destination are same. Use different hosts");
return;
}
EtherType type = EtherType.valueOf(ethType.toUpperCase());
//Printing the traced hosts
print("Tracing between: %s and %s", srcHost, dstHost);
//Build the traces
Set<StaticPacketTrace> traces = service.trace(HostId.hostId(srcHost), HostId.hostId(dstHost), type);
traces.forEach(trace -> {
if (trace.getInitialPacket() != null) {
print("Tracing Packet: %s", trace.getInitialPacket());
print("%s", T3CliUtils.printTrace(trace, verbosity1, verbosity2));
} else {
print("Cannot obtain trace between %s and %s", srcHost, dstHost);
print("Reason: %s", trace.resultMessage());
}
});
}
}