ONOS-7096 vCore suport VirtualPort enable/disable
Change-Id: Ifa004d47ecc66700f6e401f0c6a8ad242ca3f77a
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortListCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortListCommand.java
index 0524e31..7a0f2f0 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortListCommand.java
@@ -37,7 +37,7 @@
public class VirtualPortListCommand extends AbstractShellCommand {
private static final String FMT_VIRTUAL_PORT =
- "virtual portNumber=%s, physical deviceId=%s, portNumber=%s";
+ "virtual portNumber=%s, physical deviceId=%s, portNumber=%s, isEnabled=%s";
@Argument(index = 0, name = "networkId", description = "Network ID",
required = true, multiValued = false)
@@ -75,11 +75,12 @@
*/
private void printVirtualPort(VirtualPort virtualPort) {
if (virtualPort.realizedBy() == null) {
- print(FMT_VIRTUAL_PORT, virtualPort.number(), "None", "None");
+ print(FMT_VIRTUAL_PORT, virtualPort.number(), "None", "None", virtualPort.isEnabled());
} else {
print(FMT_VIRTUAL_PORT, virtualPort.number(),
virtualPort.realizedBy().deviceId(),
- virtualPort.realizedBy().port());
+ virtualPort.realizedBy().port(),
+ virtualPort.isEnabled());
}
}
}
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortStateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortStateCommand.java
new file mode 100644
index 0000000..d11e249
--- /dev/null
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortStateCommand.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2017-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.cli.net.vnet;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.incubator.net.virtual.NetworkId;
+import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
+import org.onosproject.incubator.net.virtual.VirtualNetworkService;
+import org.onosproject.incubator.net.virtual.VirtualPort;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Administratively enables or disables state of an existing virtual port.
+ */
+@Command(scope = "onos", name = "vnet-port-state",
+ description = "Administratively enables or disables state of an existing virtual port.")
+public class VirtualPortStateCommand extends AbstractShellCommand {
+ @Argument(index = 0, name = "networkId", description = "Network ID",
+ required = true, multiValued = false)
+ Long networkId = null;
+
+ @Argument(index = 1, name = "deviceId", description = "Virtual Device ID",
+ required = true, multiValued = false)
+ String deviceId = null;
+
+ @Argument(index = 2, name = "portNum", description = "Virtual device port number",
+ required = true, multiValued = false)
+ Integer portNum = null;
+
+ @Argument(index = 3, name = "portState",
+ description = "Desired State. Either \"enable\" or \"disable\".",
+ required = true, multiValued = false)
+ String portState = null;
+
+ @Override
+ protected void execute() {
+ VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
+
+ VirtualPort vPort = getVirtualPort(PortNumber.portNumber(portNum));
+ checkNotNull(vPort, "The virtual Port does not exist");
+
+ boolean isEnabled;
+ if ("enable".equals(portState)) {
+ isEnabled = true;
+ } else if ("disable".equals(portState)) {
+ isEnabled = false;
+ } else {
+ print("State must be enable or disable");
+ return;
+ }
+
+ service.updatePortState(NetworkId.networkId(networkId),
+ DeviceId.deviceId(deviceId), vPort.number(), isEnabled);
+ print("Virtual port state updated.");
+ }
+
+ /**
+ * Returns the virtual port matching the device and port identifier.
+ *
+ * @param aPortNumber port identifier
+ * @return matching virtual port, or null.
+ */
+ private VirtualPort getVirtualPort(PortNumber aPortNumber) {
+ VirtualNetworkService service = get(VirtualNetworkService.class);
+ Set<VirtualPort> ports = service.getVirtualPorts(NetworkId.networkId(networkId),
+ DeviceId.deviceId(deviceId));
+ return ports.stream().filter(p -> p.number().equals(aPortNumber))
+ .findFirst().get();
+ }
+}
diff --git a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index 9e176b6..a401a1f 100644
--- a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -816,6 +816,15 @@
</completers>
</command>
<command>
+ <action class="org.onosproject.cli.net.vnet.VirtualPortStateCommand"/>
+ <completers>
+ <ref component-id="virtualNetworkCompleter"/>
+ <ref component-id="virtualDeviceCompleter"/>
+ <ref component-id="virtualPortCompleter"/>
+ <null/>
+ </completers>
+ </command>
+ <command>
<action class="org.onosproject.cli.net.vnet.VirtualPortRemoveCommand"/>
<completers>
<ref component-id="virtualNetworkCompleter"/>
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/virtual/DefaultVirtualPort.java b/incubator/api/src/main/java/org/onosproject/incubator/net/virtual/DefaultVirtualPort.java
index 54f3d84..d5f3efb 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/virtual/DefaultVirtualPort.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/virtual/DefaultVirtualPort.java
@@ -35,13 +35,40 @@
private final NetworkId networkId;
private final ConnectPoint realizedBy;
- public DefaultVirtualPort(NetworkId networkId, Device device,
- PortNumber portNumber, ConnectPoint realizedBy) {
- super((Element) device, portNumber, false, DefaultAnnotations.builder().build());
+ /**
+ * Creates a virtual port.
+ *
+ * @param networkId network identifier
+ * @param device parent network element
+ * @param portNumber port number
+ * @param realizedBy underling port which realizes this virtual port
+ */
+ public DefaultVirtualPort(NetworkId networkId, Device device, PortNumber portNumber,
+ ConnectPoint realizedBy) {
+ this(networkId, device, portNumber, false, realizedBy);
+ }
+
+ /**
+ * Creates a virtual port.
+ *
+ * @param networkId network identifier
+ * @param device parent network element
+ * @param portNumber port number
+ * @param isEnabled indicator whether the port is up and active
+ * @param realizedBy underling port which realizes this virtual port
+ */
+ public DefaultVirtualPort(NetworkId networkId, Device device, PortNumber portNumber,
+ boolean isEnabled, ConnectPoint realizedBy) {
+ super((Element) device, portNumber, isEnabled, DefaultAnnotations.builder().build());
this.networkId = networkId;
this.realizedBy = realizedBy;
}
+ /**
+ * Returns network identifier.
+ *
+ * @return network identifier
+ */
public NetworkId networkId() {
return networkId;
}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/virtual/VirtualNetworkAdminService.java b/incubator/api/src/main/java/org/onosproject/incubator/net/virtual/VirtualNetworkAdminService.java
index 3e476ee..6d8e887 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/virtual/VirtualNetworkAdminService.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/virtual/VirtualNetworkAdminService.java
@@ -166,6 +166,18 @@
PortNumber portNumber, ConnectPoint realizedBy);
/**
+ * Updates port state of an existing virtual port on the specified device.
+ *
+ * @param networkId network identifier
+ * @param deviceId virtual device identifier
+ * @param portNumber virtual port number
+ * @param isEnabled indicator whether the port is up and active
+ * @throws org.onlab.util.ItemNotFoundException if no such network or device is found
+ */
+ void updatePortState(NetworkId networkId, DeviceId deviceId,
+ PortNumber portNumber, boolean isEnabled);
+
+ /**
* Removes the specified virtual port.
*
* @param networkId network identifier
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/virtual/VirtualNetworkStore.java b/incubator/api/src/main/java/org/onosproject/incubator/net/virtual/VirtualNetworkStore.java
index a86817d..b38412e 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/virtual/VirtualNetworkStore.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/virtual/VirtualNetworkStore.java
@@ -166,6 +166,17 @@
PortNumber portNumber, ConnectPoint realizedBy);
/**
+ * Updates port state of an existing virtual port.
+ *
+ * @param networkId network identifier
+ * @param deviceId device identifier
+ * @param portNumber port number
+ * @param isEnabled indicator whether the port is up and active
+ */
+ void updatePortState(NetworkId networkId, DeviceId deviceId,
+ PortNumber portNumber, boolean isEnabled);
+
+ /**
* Removes the specified port from the given device and network.
*
* @param networkId network identifier
diff --git a/incubator/api/src/test/java/org/onosproject/incubator/net/virtual/VirtualNetworkAdminServiceAdapter.java b/incubator/api/src/test/java/org/onosproject/incubator/net/virtual/VirtualNetworkAdminServiceAdapter.java
index b615b7d..26145cc 100644
--- a/incubator/api/src/test/java/org/onosproject/incubator/net/virtual/VirtualNetworkAdminServiceAdapter.java
+++ b/incubator/api/src/test/java/org/onosproject/incubator/net/virtual/VirtualNetworkAdminServiceAdapter.java
@@ -104,6 +104,11 @@
}
@Override
+ public void updatePortState(NetworkId networkId, DeviceId deviceId, PortNumber portNumber, boolean isEnabled) {
+
+ }
+
+ @Override
public void removeVirtualPort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber) {
}
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManager.java
index 20b6ceb..a5bd412 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManager.java
@@ -291,6 +291,16 @@
}
@Override
+ public void updatePortState(NetworkId networkId, DeviceId deviceId,
+ PortNumber portNumber, boolean isEnabled) {
+ checkNotNull(networkId, NETWORK_NULL);
+ checkNotNull(deviceId, DEVICE_NULL);
+ checkNotNull(portNumber, "Port description cannot be null");
+
+ store.updatePortState(networkId, deviceId, portNumber, isEnabled);
+ }
+
+ @Override
public void removeVirtualPort(NetworkId networkId, DeviceId deviceId,
PortNumber portNumber) {
checkNotNull(networkId, NETWORK_NULL);
diff --git a/incubator/net/src/test/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkDeviceManagerTest.java b/incubator/net/src/test/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkDeviceManagerTest.java
index 5de6190..ff53d2e 100644
--- a/incubator/net/src/test/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkDeviceManagerTest.java
+++ b/incubator/net/src/test/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkDeviceManagerTest.java
@@ -40,6 +40,7 @@
import org.onosproject.net.DeviceId;
import org.onosproject.net.MastershipRole;
import org.onosproject.net.NetTestTools;
+import org.onosproject.net.Port;
import org.onosproject.net.PortNumber;
import org.onosproject.net.device.DeviceEvent;
import org.onosproject.net.device.DeviceListener;
@@ -380,6 +381,21 @@
Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork.id(), device2.id());
assertNotNull("The virtual port set should not be null", virtualPorts);
assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
+ virtualPorts.forEach(vp -> assertFalse("Initial virtual port state should be disabled", vp.isEnabled()));
+
+ // verify change state of virtual port (disabled -> enabled)
+ manager.updatePortState(virtualNetwork.id(), device2.id(), PortNumber.portNumber(1), true);
+ Port changedPort = deviceService.getPort(device2.id(), PortNumber.portNumber(1));
+ assertNotNull("The changed virtual port should not be null", changedPort);
+ assertEquals("Virtual port state should be enabled", true, changedPort.isEnabled());
+ expectedEventTypes.add(DeviceEvent.Type.PORT_UPDATED);
+
+ // verify change state of virtual port (disabled -> disabled)
+ manager.updatePortState(virtualNetwork.id(), device2.id(), PortNumber.portNumber(2), false);
+ changedPort = deviceService.getPort(device2.id(), PortNumber.portNumber(2));
+ assertNotNull("The changed virtual port should not be null", changedPort);
+ assertEquals("Virtual port state should be disabled", false, changedPort.isEnabled());
+ // no VIRTUAL_PORT_UPDATED event is expected - the requested state (disabled) is same as previous state.
// remove 2 virtual ports
for (VirtualPort virtualPort : virtualPorts) {
diff --git a/incubator/net/src/test/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManagerTest.java b/incubator/net/src/test/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManagerTest.java
index 7f5a5fe..9ea8916 100644
--- a/incubator/net/src/test/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManagerTest.java
+++ b/incubator/net/src/test/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManagerTest.java
@@ -553,6 +553,12 @@
manager.createVirtualLink(virtualNetwork1.id(), src, dst);
}
+ private VirtualPort getPort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber) {
+ Set<VirtualPort> virtualPorts = manager.getVirtualPorts(networkId, deviceId);
+ return virtualPorts.stream().filter(virtualPort -> virtualPort.number().equals(portNumber))
+ .findFirst().orElse(null);
+ }
+
/**
* Tests add, bind and remove of virtual ports.
*/
@@ -580,6 +586,21 @@
Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
assertNotNull("The virtual port set should not be null", virtualPorts);
assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
+ virtualPorts.forEach(vp -> assertFalse("Initial virtual port state should be disabled", vp.isEnabled()));
+
+ // verify change state of virtual port (disabled -> enabled)
+ manager.updatePortState(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(1), true);
+ VirtualPort changedPort = getPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(1));
+ assertNotNull("The changed virtual port should not be null", changedPort);
+ assertEquals("Virtual port state should be enabled", true, changedPort.isEnabled());
+ expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
+
+ // verify change state of virtual port (disabled -> disabled)
+ manager.updatePortState(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(2), false);
+ changedPort = getPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(2));
+ assertNotNull("The changed virtual port should not be null", changedPort);
+ assertEquals("Virtual port state should be disabled", false, changedPort.isEnabled());
+ // no VIRTUAL_PORT_UPDATED event is expected - the requested state (disabled) is same as previous state.
for (VirtualPort virtualPort : virtualPorts) {
manager.removeVirtualPort(virtualNetwork1.id(),
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java
index e5d19a3..1eaf196 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java
@@ -630,6 +630,37 @@
}
@Override
+ public void updatePortState(NetworkId networkId, DeviceId deviceId,
+ PortNumber portNumber, boolean isEnabled) {
+ checkState(networkExists(networkId), "No network with NetworkId %s exists.", networkId);
+
+ VirtualDevice device = deviceIdVirtualDeviceMap.get(new VirtualDeviceId(networkId, deviceId));
+ checkNotNull(device, "No device %s exists in NetworkId: %s", deviceId, networkId);
+
+ Set<VirtualPort> virtualPortSet = networkIdVirtualPortSetMap.get(networkId);
+ checkNotNull(virtualPortSet, "No port has been created for NetworkId: %s", networkId);
+
+ Optional<VirtualPort> virtualPortOptional = virtualPortSet.stream().filter(
+ p -> p.element().id().equals(deviceId) &&
+ p.number().equals(portNumber)).findFirst();
+ checkState(virtualPortOptional.isPresent(), "The virtual port has not been added.");
+
+ VirtualPort oldPort = virtualPortOptional.get();
+ if (oldPort.isEnabled() == isEnabled) {
+ log.debug("No change in port state - port not updated");
+ return;
+ }
+ VirtualPort newPort = new DefaultVirtualPort(networkId, device, portNumber, isEnabled,
+ oldPort.realizedBy());
+ virtualPortSet.remove(oldPort);
+ virtualPortSet.add(newPort);
+ networkIdVirtualPortSetMap.put(networkId, virtualPortSet);
+ notifyDelegate(new VirtualNetworkEvent(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED,
+ networkId, device, newPort));
+ log.debug("port state changed from {} to {}", oldPort.isEnabled(), isEnabled);
+ }
+
+ @Override
public void removePort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber) {
checkState(networkExists(networkId), "The network has not been added.");
VirtualDevice device = deviceIdVirtualDeviceMap.get(new VirtualDeviceId(networkId, deviceId));