blob: 550710eeaa826203eda1d462ff6b3f8be20c9c05 [file] [log] [blame]
/*
* Copyright 2014-present 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.cli.net;
import org.apache.karaf.shell.commands.Argument;
import org.apache.karaf.shell.commands.Command;
import org.onosproject.net.Device;
import org.onosproject.net.Host;
import org.onosproject.net.Link;
import org.onosproject.net.device.DeviceAdminService;
import org.onosproject.net.flow.FlowRuleService;
import org.onosproject.net.group.GroupService;
import org.onosproject.net.host.HostAdminService;
import org.onosproject.net.intent.Intent;
import org.onosproject.net.intent.IntentService;
import org.onosproject.net.intent.IntentState;
import org.onosproject.net.link.LinkAdminService;
import org.onosproject.net.region.RegionAdminService;
import org.onosproject.ui.UiTopoLayoutService;
import java.util.EnumSet;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static org.onosproject.net.intent.IntentState.FAILED;
import static org.onosproject.net.intent.IntentState.WITHDRAWN;
/**
* Wipes-out the entire network information base, i.e. devices, links, hosts, intents.
*/
@Command(scope = "onos", name = "wipe-out",
description = "Wipes-out the entire network information base, i.e. devices, links, hosts")
public class WipeOutCommand extends ClustersListCommand {
private static final String PLEASE = "please";
private static final EnumSet<IntentState> CAN_PURGE = EnumSet.of(WITHDRAWN, FAILED);
@Argument(index = 0, name = "please", description = "Confirmation phrase",
required = false, multiValued = false)
String please = null;
@Override
protected void execute() {
if (please == null || !please.equals(PLEASE)) {
print("I'm afraid I can't do that!\nSay: %s", PLEASE);
return;
}
wipeOutIntents();
wipeOutHosts();
wipeOutFlows();
wipeOutGroups();
wipeOutDevices();
wipeOutLinks();
wipeOutLayouts();
wipeOutRegions();
}
private void wipeOutIntents() {
print("Wiping intents");
IntentService intentService = get(IntentService.class);
final CountDownLatch withdrawLatch;
withdrawLatch = new CountDownLatch(1);
for (Intent intent : intentService.getIntents()) {
if (intentService.getIntentState(intent.key()) != IntentState.WITHDRAWN) {
intentService.withdraw(intent);
try { // wait for withdraw event
withdrawLatch.await(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
print("Timed out waiting for intent {} withdraw");
}
}
if (CAN_PURGE.contains(intentService.getIntentState(intent.key()))) {
intentService.purge(intent);
}
}
}
private void wipeOutFlows() {
print("Wiping Flows");
FlowRuleService flowRuleService = get(FlowRuleService.class);
DeviceAdminService deviceAdminService = get(DeviceAdminService.class);
for (Device device : deviceAdminService.getDevices()) {
flowRuleService.purgeFlowRules(device.id());
}
}
private void wipeOutGroups() {
print("Wiping groups");
GroupService groupService = get(GroupService.class);
DeviceAdminService deviceAdminService = get(DeviceAdminService.class);
for (Device device : deviceAdminService.getDevices()) {
groupService.purgeGroupEntries(device.id());
}
}
private void wipeOutHosts() {
print("Wiping hosts");
HostAdminService hostAdminService = get(HostAdminService.class);
while (hostAdminService.getHostCount() > 0) {
try {
for (Host host : hostAdminService.getHosts()) {
hostAdminService.removeHost(host.id());
}
} catch (Exception e) {
log.info("Unable to wipe-out hosts", e);
}
}
}
private void wipeOutDevices() {
print("Wiping devices");
DeviceAdminService deviceAdminService = get(DeviceAdminService.class);
while (deviceAdminService.getDeviceCount() > 0) {
try {
for (Device device : deviceAdminService.getDevices()) {
deviceAdminService.removeDevice(device.id());
}
} catch (Exception e) {
log.info("Unable to wipe-out devices", e);
}
}
}
private void wipeOutLinks() {
print("Wiping links");
LinkAdminService linkAdminService = get(LinkAdminService.class);
while (linkAdminService.getLinkCount() > 0) {
try {
for (Link link : linkAdminService.getLinks()) {
linkAdminService.removeLinks(link.src());
linkAdminService.removeLinks(link.dst());
}
} catch (Exception e) {
log.info("Unable to wipe-out links", e);
}
}
}
private void wipeOutLayouts() {
print("Wiping UI layouts");
UiTopoLayoutService service = get(UiTopoLayoutService.class);
// wipe out all layouts except the default, which should always be there
service.getLayouts().forEach(l -> {
if (!l.id().isDefault()) {
service.removeLayout(l);
}
});
}
private void wipeOutRegions() {
print("Wiping regions");
RegionAdminService service = get(RegionAdminService.class);
service.getRegions().forEach(r -> service.removeRegion(r.id()));
}
}