blob: adfd5c2f567d2df96b37d2d7126ef01460dc1a14 [file] [log] [blame]
Jongsik Jungb7a44352018-08-21 12:19:48 +09001/*
2 * Copyright 2018-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 */
16package org.onosproject.openstacknetworking.cli;
17
Ray Milkey86ad7bb2018-09-27 12:32:28 -070018import org.apache.karaf.shell.api.action.Argument;
19import org.apache.karaf.shell.api.action.Command;
20import org.apache.karaf.shell.api.action.Option;
Ray Milkey7a2dee52018-09-28 10:58:28 -070021import org.apache.karaf.shell.api.action.lifecycle.Service;
Jongsik Jungb7a44352018-08-21 12:19:48 +090022import org.onosproject.cli.AbstractShellCommand;
23import org.onosproject.openstacknetworking.api.InstancePort;
24import org.onosproject.openstacknetworking.api.InstancePortAdminService;
25
26import static java.lang.Thread.sleep;
27import static org.onosproject.openstacknetworking.api.InstancePort.State.INACTIVE;
28
29/**
30 * Purges existing instance ports.
31 */
Ray Milkey7a2dee52018-09-28 10:58:28 -070032@Service
Jongsik Jungb7a44352018-08-21 12:19:48 +090033@Command(scope = "onos", name = "openstack-reset-ports",
34 description = "Reset existing instance ports created by OpenStack networking app")
35public class OpenstackResetPortsCommand extends AbstractShellCommand {
36
37 @Option(name = "-a", aliases = "--all", description = "All of instance ports",
38 required = false, multiValued = false)
39 private boolean isAll = false;
40
41 @Option(name = "-i", aliases = "--inactive",
42 description = "Instance ports in inactive state",
43 required = false, multiValued = false)
44 private boolean isInactive = false;
45
46 @Argument(index = 0, name = "portIds", description = "Instance Port IDs",
47 required = false, multiValued = true)
48 private String[] portIds = null;
49
50 private static final long SLEEP_MS = 1000; // we wait 1s for reset each port
51
52 @Override
Ray Milkey86ad7bb2018-09-27 12:32:28 -070053 protected void doExecute() {
Jongsik Jungb7a44352018-08-21 12:19:48 +090054 InstancePortAdminService service = get(InstancePortAdminService.class);
55
56 if ((!isAll && !isInactive && portIds == null) ||
57 (isAll && isInactive) ||
58 (isInactive && portIds != null) ||
59 (portIds != null && isAll)) {
60 print("Please specify one of portIds, --all, and --inactive options.");
61 return;
62 }
63
64 if (isAll) {
65 portIds = service.instancePorts().stream()
66 .map(InstancePort::portId).toArray(String[]::new);
67 } else if (isInactive) {
68 portIds = service.instancePorts().stream()
69 .filter(p -> p.state() == INACTIVE)
70 .map(InstancePort::portId).toArray(String[]::new);
71 }
72
73 for (String portId : portIds) {
74 resetPort(service, portId);
75 print("Successfully requested re-installing flow rules for port %s!", portId);
76 }
77 print("Done.");
78 }
79
80 private void resetPort(InstancePortAdminService service, String portId) {
81 InstancePort instancePort = service.instancePort(portId);
82
83 service.removeInstancePort(portId);
84 try {
85 sleep(SLEEP_MS);
86 } catch (InterruptedException e) {
87 log.error("Exception caused during port synchronization...");
88 }
89 service.createInstancePort(instancePort);
90 }
91}