Committed by
Gerrit Code Review
ONOS-4076 - Virtual Network CLI commands and bug fixes in
DistributedVirtualNetworkStore. Change-Id: I7bf67527bccb598385f15ad70091e3f8458d35d3
Showing
20 changed files
with
1133 additions
and
49 deletions
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Argument; | ||
20 | +import org.apache.karaf.shell.commands.Command; | ||
21 | +import org.onosproject.cli.AbstractShellCommand; | ||
22 | +import org.onosproject.incubator.net.virtual.TenantId; | ||
23 | +import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService; | ||
24 | + | ||
25 | +/** | ||
26 | + * Creates a new virtual network tenant. | ||
27 | + */ | ||
28 | +@Command(scope = "onos", name = "vnet-add-tenant", | ||
29 | + description = "Creates a new virtual network tenant.") | ||
30 | + | ||
31 | +public class TenantAddCommand extends AbstractShellCommand { | ||
32 | + | ||
33 | + @Argument(index = 0, name = "id", description = "Tenant ID", | ||
34 | + required = true, multiValued = false) | ||
35 | + String id = null; | ||
36 | + | ||
37 | + @Override | ||
38 | + protected void execute() { | ||
39 | + VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class); | ||
40 | + service.registerTenantId(TenantId.tenantId(id)); | ||
41 | + print("Tenant successfully added."); | ||
42 | + } | ||
43 | +} |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Command; | ||
20 | +import org.onosproject.cli.AbstractShellCommand; | ||
21 | +import org.onosproject.incubator.net.virtual.TenantId; | ||
22 | +import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService; | ||
23 | +import org.onosproject.utils.Comparators; | ||
24 | + | ||
25 | +import java.util.ArrayList; | ||
26 | +import java.util.Collections; | ||
27 | +import java.util.List; | ||
28 | + | ||
29 | +/** | ||
30 | + * Lists all tenants. | ||
31 | + */ | ||
32 | +@Command(scope = "onos", name = "vnet-tenants", | ||
33 | + description = "Lists all virtual network tenants.") | ||
34 | +public class TenantListCommand extends AbstractShellCommand { | ||
35 | + | ||
36 | + private static final String FMT_TENANT = "tenantId=%s"; | ||
37 | + | ||
38 | + @Override | ||
39 | + protected void execute() { | ||
40 | + VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class); | ||
41 | + List<TenantId> tenants = new ArrayList<>(); | ||
42 | + tenants.addAll(service.getTenantIds()); | ||
43 | + Collections.sort(tenants, Comparators.TENANT_ID_COMPARATOR); | ||
44 | + | ||
45 | + tenants.forEach(this::printTenant); | ||
46 | + } | ||
47 | + | ||
48 | + private void printTenant(TenantId tenantId) { | ||
49 | + print(FMT_TENANT, tenantId.id()); | ||
50 | + } | ||
51 | +} |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Argument; | ||
20 | +import org.apache.karaf.shell.commands.Command; | ||
21 | +import org.onosproject.cli.AbstractShellCommand; | ||
22 | +import org.onosproject.incubator.net.virtual.TenantId; | ||
23 | +import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService; | ||
24 | + | ||
25 | +/** | ||
26 | + * Creates a new virtual network tenant. | ||
27 | + */ | ||
28 | +@Command(scope = "onos", name = "vnet-remove-tenant", | ||
29 | + description = "Removes a virtual network tenant.") | ||
30 | + | ||
31 | +public class TenantRemoveCommand extends AbstractShellCommand { | ||
32 | + | ||
33 | + @Argument(index = 0, name = "id", description = "Tenant ID", | ||
34 | + required = true, multiValued = false) | ||
35 | + String id = null; | ||
36 | + | ||
37 | + @Override | ||
38 | + protected void execute() { | ||
39 | + VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class); | ||
40 | + service.unregisterTenantId(TenantId.tenantId(id)); | ||
41 | + print("Tenant successfully removed."); | ||
42 | + } | ||
43 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Argument; | ||
20 | +import org.apache.karaf.shell.commands.Command; | ||
21 | +import org.onosproject.cli.AbstractShellCommand; | ||
22 | +import org.onosproject.incubator.net.virtual.NetworkId; | ||
23 | +import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService; | ||
24 | +import org.onosproject.net.DeviceId; | ||
25 | + | ||
26 | +/** | ||
27 | + * Creates a new virtual device. | ||
28 | + */ | ||
29 | +@Command(scope = "onos", name = "vnet-create-device", | ||
30 | + description = "Creates a new virtual device in a network.") | ||
31 | +public class VirtualDeviceCreateCommand extends AbstractShellCommand { | ||
32 | + | ||
33 | + @Argument(index = 0, name = "networkId", description = "Network ID", | ||
34 | + required = true, multiValued = false) | ||
35 | + Long networkId = null; | ||
36 | + | ||
37 | + @Argument(index = 1, name = "deviceId", description = "Device ID", | ||
38 | + required = true, multiValued = false) | ||
39 | + String deviceId = null; | ||
40 | + | ||
41 | + @Override | ||
42 | + protected void execute() { | ||
43 | + VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class); | ||
44 | + service.createVirtualDevice(NetworkId.networkId(networkId), DeviceId.deviceId(deviceId)); | ||
45 | + print("Virtual device successfully created."); | ||
46 | + } | ||
47 | +} |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Argument; | ||
20 | +import org.apache.karaf.shell.commands.Command; | ||
21 | +import org.onosproject.cli.AbstractShellCommand; | ||
22 | +import org.onosproject.incubator.net.virtual.NetworkId; | ||
23 | +import org.onosproject.incubator.net.virtual.VirtualDevice; | ||
24 | +import org.onosproject.incubator.net.virtual.VirtualNetworkService; | ||
25 | +import org.onosproject.utils.Comparators; | ||
26 | + | ||
27 | +import java.util.ArrayList; | ||
28 | +import java.util.Collections; | ||
29 | +import java.util.List; | ||
30 | + | ||
31 | +/** | ||
32 | + * Lists all virtual devices for the network ID. | ||
33 | + */ | ||
34 | +@Command(scope = "onos", name = "vnet-devices", | ||
35 | + description = "Lists all virtual devices in a virtual network.") | ||
36 | +public class VirtualDeviceListCommand extends AbstractShellCommand { | ||
37 | + | ||
38 | + private static final String FMT_VIRTUAL_DEVICE = | ||
39 | + "deviceId=%s"; | ||
40 | + | ||
41 | + @Argument(index = 0, name = "networkId", description = "Network ID", | ||
42 | + required = true, multiValued = false) | ||
43 | + Long networkId = null; | ||
44 | + | ||
45 | + @Override | ||
46 | + protected void execute() { | ||
47 | + | ||
48 | + getSortedVirtualDevices().forEach(this::printVirtualDevice); | ||
49 | + } | ||
50 | + | ||
51 | + /** | ||
52 | + * Returns the list of virtual devices sorted using the device identifier. | ||
53 | + * | ||
54 | + * @return sorted virtual device list | ||
55 | + */ | ||
56 | + private List<VirtualDevice> getSortedVirtualDevices() { | ||
57 | + VirtualNetworkService service = get(VirtualNetworkService.class); | ||
58 | + | ||
59 | + List<VirtualDevice> virtualDevices = new ArrayList<>(); | ||
60 | + virtualDevices.addAll(service.getVirtualDevices(NetworkId.networkId(networkId))); | ||
61 | + Collections.sort(virtualDevices, Comparators.VIRTUAL_DEVICE_COMPARATOR); | ||
62 | + return virtualDevices; | ||
63 | + } | ||
64 | + | ||
65 | + /** | ||
66 | + * Prints out each virtual device. | ||
67 | + * | ||
68 | + * @param virtualDevice virtual device | ||
69 | + */ | ||
70 | + private void printVirtualDevice(VirtualDevice virtualDevice) { | ||
71 | + print(FMT_VIRTUAL_DEVICE, virtualDevice.id()); | ||
72 | + } | ||
73 | +} |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Argument; | ||
20 | +import org.apache.karaf.shell.commands.Command; | ||
21 | +import org.onosproject.cli.AbstractShellCommand; | ||
22 | +import org.onosproject.incubator.net.virtual.NetworkId; | ||
23 | +import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService; | ||
24 | +import org.onosproject.net.DeviceId; | ||
25 | + | ||
26 | +/** | ||
27 | + * Removes a virtual device. | ||
28 | + */ | ||
29 | +@Command(scope = "onos", name = "vnet-remove-device", | ||
30 | + description = "Removes a virtual device.") | ||
31 | +public class VirtualDeviceRemoveCommand extends AbstractShellCommand { | ||
32 | + | ||
33 | + @Argument(index = 0, name = "networkId", description = "Network ID", | ||
34 | + required = true, multiValued = false) | ||
35 | + Long networkId = null; | ||
36 | + | ||
37 | + @Argument(index = 1, name = "deviceId", description = "Device ID", | ||
38 | + required = true, multiValued = false) | ||
39 | + String deviceId = null; | ||
40 | + | ||
41 | + @Override | ||
42 | + protected void execute() { | ||
43 | + VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class); | ||
44 | + service.removeVirtualDevice(NetworkId.networkId(networkId), DeviceId.deviceId(deviceId)); | ||
45 | + print("Virtual device successfully removed."); | ||
46 | + } | ||
47 | +} |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Argument; | ||
20 | +import org.apache.karaf.shell.commands.Command; | ||
21 | +import org.apache.karaf.shell.commands.Option; | ||
22 | +import org.onosproject.cli.AbstractShellCommand; | ||
23 | +import org.onosproject.incubator.net.tunnel.TunnelId; | ||
24 | +import org.onosproject.incubator.net.virtual.NetworkId; | ||
25 | +import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService; | ||
26 | +import org.onosproject.net.ConnectPoint; | ||
27 | +import org.onosproject.net.DeviceId; | ||
28 | +import org.onosproject.net.PortNumber; | ||
29 | + | ||
30 | +/** | ||
31 | + * Creates a new virtual link. | ||
32 | + */ | ||
33 | +@Command(scope = "onos", name = "vnet-create-link", | ||
34 | + description = "Creates a new virtual link in a network.") | ||
35 | +public class VirtualLinkCreateCommand extends AbstractShellCommand { | ||
36 | + | ||
37 | + @Argument(index = 0, name = "networkId", description = "Network ID", | ||
38 | + required = true, multiValued = false) | ||
39 | + Long networkId = null; | ||
40 | + | ||
41 | + @Argument(index = 1, name = "srcDeviceId", description = "Source device ID", | ||
42 | + required = true, multiValued = false) | ||
43 | + String srcDeviceId = null; | ||
44 | + | ||
45 | + @Argument(index = 2, name = "srcPortNum", description = "Source port number", | ||
46 | + required = true, multiValued = false) | ||
47 | + Integer srcPortNum = null; | ||
48 | + | ||
49 | + @Argument(index = 3, name = "dstDeviceId", description = "Destination device ID", | ||
50 | + required = true, multiValued = false) | ||
51 | + String dstDeviceId = null; | ||
52 | + | ||
53 | + @Argument(index = 4, name = "dstPortNum", description = "Destination port number", | ||
54 | + required = true, multiValued = false) | ||
55 | + Integer dstPortNum = null; | ||
56 | + | ||
57 | + @Option(name = "-b", aliases = "--bidirectional", | ||
58 | + description = "If this argument is passed in then the virtual link created will be bidirectional, " + | ||
59 | + "otherwise the link will be unidirectional.", | ||
60 | + required = false, multiValued = false) | ||
61 | + boolean bidirectional = false; | ||
62 | + | ||
63 | + @Override | ||
64 | + protected void execute() { | ||
65 | + VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class); | ||
66 | + ConnectPoint src = new ConnectPoint(DeviceId.deviceId(srcDeviceId), PortNumber.portNumber(srcPortNum)); | ||
67 | + ConnectPoint dst = new ConnectPoint(DeviceId.deviceId(dstDeviceId), PortNumber.portNumber(dstPortNum)); | ||
68 | + //TODO use a real/valid tunnel ID | ||
69 | + TunnelId tunnelId = TunnelId.valueOf(0); | ||
70 | + | ||
71 | + service.createVirtualLink(NetworkId.networkId(networkId), src, dst, tunnelId); | ||
72 | + if (bidirectional) { | ||
73 | + service.createVirtualLink(NetworkId.networkId(networkId), dst, src, tunnelId); | ||
74 | + } | ||
75 | + print("Virtual link successfully created."); | ||
76 | + } | ||
77 | +} |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Argument; | ||
20 | +import org.apache.karaf.shell.commands.Command; | ||
21 | +import org.onosproject.cli.AbstractShellCommand; | ||
22 | +import org.onosproject.incubator.net.virtual.NetworkId; | ||
23 | +import org.onosproject.incubator.net.virtual.VirtualLink; | ||
24 | +import org.onosproject.incubator.net.virtual.VirtualNetworkService; | ||
25 | + | ||
26 | +import java.util.ArrayList; | ||
27 | +import java.util.List; | ||
28 | + | ||
29 | +/** | ||
30 | + * Lists all virtual links for the network ID. | ||
31 | + */ | ||
32 | +@Command(scope = "onos", name = "vnet-links", | ||
33 | + description = "Lists all virtual links in a virtual network.") | ||
34 | +public class VirtualLinkListCommand extends AbstractShellCommand { | ||
35 | + | ||
36 | + private static final String FMT_VIRTUAL_LINK = | ||
37 | + "src=%s, dst=%s"; | ||
38 | + | ||
39 | + @Argument(index = 0, name = "networkId", description = "Network ID", | ||
40 | + required = true, multiValued = false) | ||
41 | + Long networkId = null; | ||
42 | + | ||
43 | + @Override | ||
44 | + protected void execute() { | ||
45 | + | ||
46 | + getSortedVirtualLinks().forEach(this::printVirtualLink); | ||
47 | + } | ||
48 | + | ||
49 | + /** | ||
50 | + * Returns the list of virtual links sorted using the device identifier. | ||
51 | + * | ||
52 | + * @return virtual link list | ||
53 | + */ | ||
54 | + private List<VirtualLink> getSortedVirtualLinks() { | ||
55 | + VirtualNetworkService service = get(VirtualNetworkService.class); | ||
56 | + | ||
57 | + List<VirtualLink> virtualLinks = new ArrayList<>(); | ||
58 | + virtualLinks.addAll(service.getVirtualLinks(NetworkId.networkId(networkId))); | ||
59 | + return virtualLinks; | ||
60 | + } | ||
61 | + | ||
62 | + /** | ||
63 | + * Prints out each virtual link. | ||
64 | + * | ||
65 | + * @param virtualLink virtual link | ||
66 | + */ | ||
67 | + private void printVirtualLink(VirtualLink virtualLink) { | ||
68 | + print(FMT_VIRTUAL_LINK, virtualLink.src().toString(), virtualLink.dst().toString()); | ||
69 | + } | ||
70 | +} |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Argument; | ||
20 | +import org.apache.karaf.shell.commands.Command; | ||
21 | +import org.apache.karaf.shell.commands.Option; | ||
22 | +import org.onosproject.cli.AbstractShellCommand; | ||
23 | +import org.onosproject.incubator.net.virtual.NetworkId; | ||
24 | +import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService; | ||
25 | +import org.onosproject.net.ConnectPoint; | ||
26 | +import org.onosproject.net.DeviceId; | ||
27 | +import org.onosproject.net.PortNumber; | ||
28 | + | ||
29 | +/** | ||
30 | + * Removes a virtual link. | ||
31 | + */ | ||
32 | +@Command(scope = "onos", name = "vnet-remove-link", | ||
33 | + description = "Removes a virtual link.") | ||
34 | +public class VirtualLinkRemoveCommand extends AbstractShellCommand { | ||
35 | + | ||
36 | + @Argument(index = 0, name = "networkId", description = "Network ID", | ||
37 | + required = true, multiValued = false) | ||
38 | + Long networkId = null; | ||
39 | + | ||
40 | + @Argument(index = 1, name = "srcDeviceId", description = "Source device ID", | ||
41 | + required = true, multiValued = false) | ||
42 | + String srcDeviceId = null; | ||
43 | + | ||
44 | + @Argument(index = 2, name = "srcPortNum", description = "Source port number", | ||
45 | + required = true, multiValued = false) | ||
46 | + Integer srcPortNum = null; | ||
47 | + | ||
48 | + @Argument(index = 3, name = "dstDeviceId", description = "Destination device ID", | ||
49 | + required = true, multiValued = false) | ||
50 | + String dstDeviceId = null; | ||
51 | + | ||
52 | + @Argument(index = 4, name = "dstPortNum", description = "Destination port number", | ||
53 | + required = true, multiValued = false) | ||
54 | + Integer dstPortNum = null; | ||
55 | + | ||
56 | + @Option(name = "-b", aliases = "--bidirectional", | ||
57 | + description = "If this argument is passed in then then bidirectional virtual link will be removed, " + | ||
58 | + "otherwise the unidirectional link will be removed.", | ||
59 | + required = false, multiValued = false) | ||
60 | + boolean bidirectional = false; | ||
61 | + | ||
62 | + @Override | ||
63 | + protected void execute() { | ||
64 | + VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class); | ||
65 | + ConnectPoint src = new ConnectPoint(DeviceId.deviceId(srcDeviceId), PortNumber.portNumber(srcPortNum)); | ||
66 | + ConnectPoint dst = new ConnectPoint(DeviceId.deviceId(dstDeviceId), PortNumber.portNumber(dstPortNum)); | ||
67 | + | ||
68 | + service.removeVirtualLink(NetworkId.networkId(networkId), src, dst); | ||
69 | + if (bidirectional) { | ||
70 | + service.removeVirtualLink(NetworkId.networkId(networkId), dst, src); | ||
71 | + } | ||
72 | + print("Virtual link successfully removed."); | ||
73 | + } | ||
74 | +} |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Argument; | ||
20 | +import org.apache.karaf.shell.commands.Command; | ||
21 | +import org.onosproject.cli.AbstractShellCommand; | ||
22 | +import org.onosproject.incubator.net.virtual.TenantId; | ||
23 | +import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService; | ||
24 | + | ||
25 | +/** | ||
26 | + * Creates a new virtual network. | ||
27 | + */ | ||
28 | +@Command(scope = "onos", name = "vnet-create", | ||
29 | + description = "Creates a new virtual network.") | ||
30 | +public class VirtualNetworkCreateCommand extends AbstractShellCommand { | ||
31 | + | ||
32 | + @Argument(index = 0, name = "id", description = "Tenant ID", | ||
33 | + required = true, multiValued = false) | ||
34 | + String id = null; | ||
35 | + | ||
36 | + @Override | ||
37 | + protected void execute() { | ||
38 | + VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class); | ||
39 | + service.createVirtualNetwork(TenantId.tenantId(id)); | ||
40 | + print("Virtual network successfully created."); | ||
41 | + } | ||
42 | +} |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Command; | ||
20 | +import org.onosproject.cli.AbstractShellCommand; | ||
21 | +import org.onosproject.incubator.net.virtual.TenantId; | ||
22 | +import org.onosproject.incubator.net.virtual.VirtualNetwork; | ||
23 | +import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService; | ||
24 | +import org.onosproject.incubator.net.virtual.VirtualNetworkService; | ||
25 | +import org.onosproject.utils.Comparators; | ||
26 | + | ||
27 | +import java.util.ArrayList; | ||
28 | +import java.util.Collections; | ||
29 | +import java.util.List; | ||
30 | +import java.util.Set; | ||
31 | + | ||
32 | +/** | ||
33 | + * Lists all virtual networks for the tenant ID. | ||
34 | + */ | ||
35 | +@Command(scope = "onos", name = "vnets", | ||
36 | + description = "Lists all virtual networks.") | ||
37 | +public class VirtualNetworkListCommand extends AbstractShellCommand { | ||
38 | + | ||
39 | + private static final String FMT_VIRTUAL_NETWORK = | ||
40 | + "tenantId=%s, networkId=%s"; | ||
41 | + | ||
42 | + @Override | ||
43 | + protected void execute() { | ||
44 | + | ||
45 | + getSortedVirtualNetworks().forEach(this::printVirtualNetwork); | ||
46 | + } | ||
47 | + | ||
48 | + /** | ||
49 | + * Returns the list of virtual networks sorted using the tenant identifier. | ||
50 | + * | ||
51 | + * @return sorted virtual network list | ||
52 | + */ | ||
53 | + private List<VirtualNetwork> getSortedVirtualNetworks() { | ||
54 | + VirtualNetworkService service = get(VirtualNetworkService.class); | ||
55 | + VirtualNetworkAdminService adminService = get(VirtualNetworkAdminService.class); | ||
56 | + | ||
57 | + List<VirtualNetwork> virtualNetworks = new ArrayList<>(); | ||
58 | + | ||
59 | + Set<TenantId> tenantSet = adminService.getTenantIds(); | ||
60 | + tenantSet.forEach(tenantId -> virtualNetworks.addAll(service.getVirtualNetworks(tenantId))); | ||
61 | + | ||
62 | + Collections.sort(virtualNetworks, Comparators.VIRTUAL_NETWORK_COMPARATOR); | ||
63 | + return virtualNetworks; | ||
64 | + } | ||
65 | + | ||
66 | + /** | ||
67 | + * Prints out each virtual network. | ||
68 | + * | ||
69 | + * @param virtualNetwork virtual network | ||
70 | + */ | ||
71 | + private void printVirtualNetwork(VirtualNetwork virtualNetwork) { | ||
72 | + print(FMT_VIRTUAL_NETWORK, virtualNetwork.tenantId(), virtualNetwork.id()); | ||
73 | + } | ||
74 | +} | ||
75 | + |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Argument; | ||
20 | +import org.apache.karaf.shell.commands.Command; | ||
21 | +import org.onosproject.cli.AbstractShellCommand; | ||
22 | +import org.onosproject.incubator.net.virtual.NetworkId; | ||
23 | +import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService; | ||
24 | + | ||
25 | +/** | ||
26 | + * Removes a virtual network. | ||
27 | + */ | ||
28 | +@Command(scope = "onos", name = "vnet-remove", | ||
29 | + description = "Removes a virtual network.") | ||
30 | +public class VirtualNetworkRemoveCommand extends AbstractShellCommand { | ||
31 | + | ||
32 | + @Argument(index = 0, name = "id", description = "Network ID", | ||
33 | + required = true, multiValued = false) | ||
34 | + Long id; | ||
35 | + | ||
36 | + @Override | ||
37 | + protected void execute() { | ||
38 | + VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class); | ||
39 | + service.removeVirtualNetwork(NetworkId.networkId(id)); | ||
40 | + print("Virtual network successfully removed."); | ||
41 | + } | ||
42 | +} |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Argument; | ||
20 | +import org.apache.karaf.shell.commands.Command; | ||
21 | +import org.onosproject.cli.AbstractShellCommand; | ||
22 | +import org.onosproject.incubator.net.virtual.NetworkId; | ||
23 | +import org.onosproject.incubator.net.virtual.VirtualDevice; | ||
24 | +import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService; | ||
25 | +import org.onosproject.incubator.net.virtual.VirtualNetworkService; | ||
26 | +import org.onosproject.net.DefaultAnnotations; | ||
27 | +import org.onosproject.net.DefaultDevice; | ||
28 | +import org.onosproject.net.DefaultPort; | ||
29 | +import org.onosproject.net.Device; | ||
30 | +import org.onosproject.net.DeviceId; | ||
31 | +import org.onosproject.net.Port; | ||
32 | +import org.onosproject.net.PortNumber; | ||
33 | +import org.onosproject.net.device.DeviceService; | ||
34 | + | ||
35 | +import java.util.Set; | ||
36 | + | ||
37 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
38 | + | ||
39 | +/** | ||
40 | + * Creates a new virtual port. | ||
41 | + */ | ||
42 | +@Command(scope = "onos", name = "vnet-create-port", | ||
43 | + description = "Creates a new virtual port in a network.") | ||
44 | +public class VirtualPortCreateCommand extends AbstractShellCommand { | ||
45 | + | ||
46 | + @Argument(index = 0, name = "networkId", description = "Network ID", | ||
47 | + required = true, multiValued = false) | ||
48 | + Long networkId = null; | ||
49 | + | ||
50 | + @Argument(index = 1, name = "deviceId", description = "Virtual Device ID", | ||
51 | + required = true, multiValued = false) | ||
52 | + String deviceId = null; | ||
53 | + | ||
54 | + @Argument(index = 2, name = "portNum", description = "Virtual device port number", | ||
55 | + required = true, multiValued = false) | ||
56 | + Integer portNum = null; | ||
57 | + | ||
58 | + @Argument(index = 3, name = "physDeviceId", description = "Physical Device ID", | ||
59 | + required = true, multiValued = false) | ||
60 | + String physDeviceId = null; | ||
61 | + | ||
62 | + @Argument(index = 4, name = "physPortNum", description = "Physical device port number", | ||
63 | + required = true, multiValued = false) | ||
64 | + Integer physPortNum = null; | ||
65 | + | ||
66 | + @Override | ||
67 | + protected void execute() { | ||
68 | + VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class); | ||
69 | + DeviceService deviceService = get(DeviceService.class); | ||
70 | + VirtualDevice virtualDevice = getVirtualDevice(DeviceId.deviceId(deviceId)); | ||
71 | + checkNotNull(virtualDevice, "The virtual device does not exist."); | ||
72 | + | ||
73 | + DefaultAnnotations annotations = DefaultAnnotations.builder().build(); | ||
74 | + Device physDevice = new DefaultDevice(null, DeviceId.deviceId(physDeviceId), | ||
75 | + null, null, null, null, null, null, annotations); | ||
76 | + Port realizedBy = new DefaultPort(physDevice, PortNumber.portNumber(physPortNum), true); | ||
77 | + service.createVirtualPort(NetworkId.networkId(networkId), DeviceId.deviceId(deviceId), | ||
78 | + PortNumber.portNumber(portNum), realizedBy); | ||
79 | + print("Virtual port successfully created."); | ||
80 | + } | ||
81 | + | ||
82 | + /** | ||
83 | + * Returns the virtual device matching the device identifier. | ||
84 | + * | ||
85 | + * @param aDeviceId device identifier | ||
86 | + * @return matching virtual device, or null. | ||
87 | + */ | ||
88 | + private VirtualDevice getVirtualDevice(DeviceId aDeviceId) { | ||
89 | + VirtualNetworkService service = get(VirtualNetworkService.class); | ||
90 | + | ||
91 | + Set<VirtualDevice> virtualDevices = service.getVirtualDevices(NetworkId.networkId(networkId)); | ||
92 | + | ||
93 | + for (VirtualDevice virtualDevice : virtualDevices) { | ||
94 | + if (virtualDevice.id().equals(aDeviceId)) { | ||
95 | + return virtualDevice; | ||
96 | + } | ||
97 | + } | ||
98 | + return null; | ||
99 | + } | ||
100 | +} |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Argument; | ||
20 | +import org.apache.karaf.shell.commands.Command; | ||
21 | +import org.onosproject.cli.AbstractShellCommand; | ||
22 | +import org.onosproject.incubator.net.virtual.NetworkId; | ||
23 | +import org.onosproject.incubator.net.virtual.VirtualNetworkService; | ||
24 | +import org.onosproject.incubator.net.virtual.VirtualPort; | ||
25 | +import org.onosproject.net.DeviceId; | ||
26 | +import org.onosproject.utils.Comparators; | ||
27 | + | ||
28 | +import java.util.ArrayList; | ||
29 | +import java.util.Collections; | ||
30 | +import java.util.List; | ||
31 | + | ||
32 | +/** | ||
33 | + * Lists all virtual ports for the network ID. | ||
34 | + */ | ||
35 | +@Command(scope = "onos", name = "vnet-ports", | ||
36 | + description = "Lists all virtual ports in a virtual network.") | ||
37 | +public class VirtualPortListCommand extends AbstractShellCommand { | ||
38 | + | ||
39 | + private static final String FMT_VIRTUAL_PORT = | ||
40 | + "virtual portNumber=%s, physical deviceId=%s, portNumber=%s"; | ||
41 | + | ||
42 | + @Argument(index = 0, name = "networkId", description = "Network ID", | ||
43 | + required = true, multiValued = false) | ||
44 | + Long networkId = null; | ||
45 | + | ||
46 | + @Argument(index = 1, name = "deviceId", description = "Virtual Device ID", | ||
47 | + required = true, multiValued = false) | ||
48 | + String deviceId = null; | ||
49 | + | ||
50 | + @Override | ||
51 | + protected void execute() { | ||
52 | + | ||
53 | + getSortedVirtualPorts().forEach(this::printVirtualPort); | ||
54 | + } | ||
55 | + | ||
56 | + /** | ||
57 | + * Returns the list of virtual ports sorted using the network identifier. | ||
58 | + * | ||
59 | + * @return sorted virtual port list | ||
60 | + */ | ||
61 | + private List<VirtualPort> getSortedVirtualPorts() { | ||
62 | + VirtualNetworkService service = get(VirtualNetworkService.class); | ||
63 | + | ||
64 | + List<VirtualPort> virtualPorts = new ArrayList<>(); | ||
65 | + virtualPorts.addAll(service.getVirtualPorts(NetworkId.networkId(networkId), DeviceId.deviceId(deviceId))); | ||
66 | + Collections.sort(virtualPorts, Comparators.VIRTUAL_PORT_COMPARATOR); | ||
67 | + return virtualPorts; | ||
68 | + } | ||
69 | + | ||
70 | + /** | ||
71 | + * Prints out each virtual port. | ||
72 | + * | ||
73 | + * @param virtualPort virtual port | ||
74 | + */ | ||
75 | + private void printVirtualPort(VirtualPort virtualPort) { | ||
76 | + print(FMT_VIRTUAL_PORT, virtualPort.number(), | ||
77 | + virtualPort.realizedBy().element().id(), virtualPort.realizedBy().number()); | ||
78 | + } | ||
79 | +} |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +package org.onosproject.cli.net.vnet; | ||
18 | + | ||
19 | +import org.apache.karaf.shell.commands.Argument; | ||
20 | +import org.apache.karaf.shell.commands.Command; | ||
21 | +import org.onosproject.cli.AbstractShellCommand; | ||
22 | +import org.onosproject.incubator.net.virtual.NetworkId; | ||
23 | +import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService; | ||
24 | +import org.onosproject.net.DeviceId; | ||
25 | +import org.onosproject.net.PortNumber; | ||
26 | + | ||
27 | +/** | ||
28 | + * Removes a virtual port. | ||
29 | + */ | ||
30 | +@Command(scope = "onos", name = "vnet-remove-port", | ||
31 | + description = "Removes a virtual port.") | ||
32 | +public class VirtualPortRemoveCommand extends AbstractShellCommand { | ||
33 | + | ||
34 | + @Argument(index = 0, name = "networkId", description = "Network ID", | ||
35 | + required = true, multiValued = false) | ||
36 | + Long networkId = null; | ||
37 | + | ||
38 | + @Argument(index = 1, name = "deviceId", description = "Device ID", | ||
39 | + required = true, multiValued = false) | ||
40 | + String deviceId = null; | ||
41 | + | ||
42 | + @Argument(index = 2, name = "portNum", description = "Device port number", | ||
43 | + required = true, multiValued = false) | ||
44 | + Integer portNum = null; | ||
45 | + | ||
46 | + @Override | ||
47 | + protected void execute() { | ||
48 | + VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class); | ||
49 | + service.removeVirtualPort(NetworkId.networkId(networkId), DeviceId.deviceId(deviceId), | ||
50 | + PortNumber.portNumber(portNum)); | ||
51 | + print("Virtual port successfully removed."); | ||
52 | + } | ||
53 | +} |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
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 | + */ | ||
16 | + | ||
17 | +/** | ||
18 | + * CLI commands for querying and administering virtual networks. | ||
19 | + */ | ||
20 | +package org.onosproject.cli.net.vnet; | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | <!-- | 1 | <!-- |
2 | - ~ Copyright 2014 Open Networking Laboratory | 2 | + ~ Copyright 2016 Open Networking Laboratory |
3 | ~ | 3 | ~ |
4 | ~ Licensed under the Apache License, Version 2.0 (the "License"); | 4 | ~ Licensed under the Apache License, Version 2.0 (the "License"); |
5 | ~ you may not use this file except in compliance with the License. | 5 | ~ you may not use this file except in compliance with the License. |
... | @@ -613,6 +613,53 @@ | ... | @@ -613,6 +613,53 @@ |
613 | <ref component-id="deviceIdCompleter"/> | 613 | <ref component-id="deviceIdCompleter"/> |
614 | </completers> | 614 | </completers> |
615 | </command> | 615 | </command> |
616 | + | ||
617 | + <!--virtual network commands --> | ||
618 | + <command> | ||
619 | + <action class="org.onosproject.cli.net.vnet.TenantListCommand"/> | ||
620 | + </command> | ||
621 | + <command> | ||
622 | + <action class="org.onosproject.cli.net.vnet.TenantAddCommand"/> | ||
623 | + </command> | ||
624 | + <command> | ||
625 | + <action class="org.onosproject.cli.net.vnet.TenantRemoveCommand"/> | ||
626 | + </command> | ||
627 | + <command> | ||
628 | + <action class="org.onosproject.cli.net.vnet.VirtualNetworkListCommand"/> | ||
629 | + </command> | ||
630 | + <command> | ||
631 | + <action class="org.onosproject.cli.net.vnet.VirtualNetworkCreateCommand"/> | ||
632 | + </command> | ||
633 | + <command> | ||
634 | + <action class="org.onosproject.cli.net.vnet.VirtualNetworkRemoveCommand"/> | ||
635 | + </command> | ||
636 | + <command> | ||
637 | + <action class="org.onosproject.cli.net.vnet.VirtualDeviceListCommand"/> | ||
638 | + </command> | ||
639 | + <command> | ||
640 | + <action class="org.onosproject.cli.net.vnet.VirtualDeviceCreateCommand"/> | ||
641 | + </command> | ||
642 | + <command> | ||
643 | + <action class="org.onosproject.cli.net.vnet.VirtualDeviceRemoveCommand"/> | ||
644 | + </command> | ||
645 | + <command> | ||
646 | + <action class="org.onosproject.cli.net.vnet.VirtualLinkListCommand"/> | ||
647 | + </command> | ||
648 | + <command> | ||
649 | + <action class="org.onosproject.cli.net.vnet.VirtualLinkCreateCommand"/> | ||
650 | + </command> | ||
651 | + <command> | ||
652 | + <action class="org.onosproject.cli.net.vnet.VirtualLinkRemoveCommand"/> | ||
653 | + </command> | ||
654 | + <command> | ||
655 | + <action class="org.onosproject.cli.net.vnet.VirtualPortListCommand"/> | ||
656 | + </command> | ||
657 | + <command> | ||
658 | + <action class="org.onosproject.cli.net.vnet.VirtualPortCreateCommand"/> | ||
659 | + </command> | ||
660 | + <command> | ||
661 | + <action class="org.onosproject.cli.net.vnet.VirtualPortRemoveCommand"/> | ||
662 | + </command> | ||
616 | </command-bundle> | 663 | </command-bundle> |
617 | 664 | ||
618 | <bean id="reviewAppNameCompleter" class="org.onosproject.cli.security.ReviewApplicationNameCompleter"/> | 665 | <bean id="reviewAppNameCompleter" class="org.onosproject.cli.security.ReviewApplicationNameCompleter"/> | ... | ... |
... | @@ -19,6 +19,10 @@ import org.onosproject.cluster.ControllerNode; | ... | @@ -19,6 +19,10 @@ import org.onosproject.cluster.ControllerNode; |
19 | import org.onosproject.core.Application; | 19 | import org.onosproject.core.Application; |
20 | import org.onosproject.core.ApplicationId; | 20 | import org.onosproject.core.ApplicationId; |
21 | import org.onosproject.incubator.net.intf.Interface; | 21 | import org.onosproject.incubator.net.intf.Interface; |
22 | +import org.onosproject.incubator.net.virtual.TenantId; | ||
23 | +import org.onosproject.incubator.net.virtual.VirtualDevice; | ||
24 | +import org.onosproject.incubator.net.virtual.VirtualNetwork; | ||
25 | +import org.onosproject.incubator.net.virtual.VirtualPort; | ||
22 | import org.onosproject.net.key.DeviceKey; | 26 | import org.onosproject.net.key.DeviceKey; |
23 | import org.onosproject.net.ConnectPoint; | 27 | import org.onosproject.net.ConnectPoint; |
24 | import org.onosproject.net.Element; | 28 | import org.onosproject.net.Element; |
... | @@ -149,4 +153,32 @@ public final class Comparators { | ... | @@ -149,4 +153,32 @@ public final class Comparators { |
149 | return region1.id().toString().compareTo(region2.id().toString()); | 153 | return region1.id().toString().compareTo(region2.id().toString()); |
150 | } | 154 | } |
151 | }; | 155 | }; |
156 | + | ||
157 | + public static final Comparator<TenantId> TENANT_ID_COMPARATOR = new Comparator<TenantId>() { | ||
158 | + @Override | ||
159 | + public int compare(TenantId tenant1, TenantId tenant2) { | ||
160 | + return tenant1.id().toString().compareTo(tenant2.id().toString()); | ||
161 | + } | ||
162 | + }; | ||
163 | + | ||
164 | + public static final Comparator<VirtualNetwork> VIRTUAL_NETWORK_COMPARATOR = new Comparator<VirtualNetwork>() { | ||
165 | + @Override | ||
166 | + public int compare(VirtualNetwork virtualNetwork1, VirtualNetwork virtualNetwork2) { | ||
167 | + return virtualNetwork1.tenantId().toString().compareTo(virtualNetwork2.tenantId().toString()); | ||
168 | + } | ||
169 | + }; | ||
170 | + | ||
171 | + public static final Comparator<VirtualDevice> VIRTUAL_DEVICE_COMPARATOR = new Comparator<VirtualDevice>() { | ||
172 | + @Override | ||
173 | + public int compare(VirtualDevice virtualDevice1, VirtualDevice virtualDevice2) { | ||
174 | + return virtualDevice1.id().toString().compareTo(virtualDevice2.id().toString()); | ||
175 | + } | ||
176 | + }; | ||
177 | + | ||
178 | + public static final Comparator<VirtualPort> VIRTUAL_PORT_COMPARATOR = new Comparator<VirtualPort>() { | ||
179 | + @Override | ||
180 | + public int compare(VirtualPort virtualPort1, VirtualPort virtualPort2) { | ||
181 | + return virtualPort1.number().toString().compareTo(virtualPort2.number().toString()); | ||
182 | + } | ||
183 | + }; | ||
152 | } | 184 | } | ... | ... |
... | @@ -146,17 +146,30 @@ public class VirtualNetworkManagerTest { | ... | @@ -146,17 +146,30 @@ public class VirtualNetworkManagerTest { |
146 | assertNotNull("The virtual network set should not be null", virtualNetworks); | 146 | assertNotNull("The virtual network set should not be null", virtualNetworks); |
147 | assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size()); | 147 | assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size()); |
148 | 148 | ||
149 | + int remaining = virtualNetworks.size(); | ||
149 | for (VirtualNetwork virtualNetwork : virtualNetworks) { | 150 | for (VirtualNetwork virtualNetwork : virtualNetworks) { |
150 | manager.removeVirtualNetwork(virtualNetwork.id()); | 151 | manager.removeVirtualNetwork(virtualNetwork.id()); |
152 | + assertEquals("The expected virtual network size does not match", | ||
153 | + --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size()); | ||
151 | // attempt to remove the same virtual network again. | 154 | // attempt to remove the same virtual network again. |
152 | manager.removeVirtualNetwork(virtualNetwork.id()); | 155 | manager.removeVirtualNetwork(virtualNetwork.id()); |
156 | + assertEquals("The expected virtual network size does not match", | ||
157 | + remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size()); | ||
153 | } | 158 | } |
154 | virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)); | 159 | virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)); |
155 | assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty()); | 160 | assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty()); |
156 | 161 | ||
162 | + // Create/remove a virtual network. | ||
163 | + VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1)); | ||
164 | + manager.removeVirtualNetwork(virtualNetwork.id()); | ||
165 | + | ||
166 | + virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)); | ||
167 | + assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty()); | ||
168 | + | ||
157 | // Validate that the events were all received in the correct order. | 169 | // Validate that the events were all received in the correct order. |
158 | validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED, | 170 | validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED, |
159 | VirtualNetworkEvent.Type.NETWORK_ADDED, VirtualNetworkEvent.Type.NETWORK_REMOVED, | 171 | VirtualNetworkEvent.Type.NETWORK_ADDED, VirtualNetworkEvent.Type.NETWORK_REMOVED, |
172 | + VirtualNetworkEvent.Type.NETWORK_REMOVED, VirtualNetworkEvent.Type.NETWORK_ADDED, | ||
160 | VirtualNetworkEvent.Type.NETWORK_REMOVED); | 173 | VirtualNetworkEvent.Type.NETWORK_REMOVED); |
161 | } | 174 | } |
162 | 175 | ||
... | @@ -209,6 +222,13 @@ public class VirtualNetworkManagerTest { | ... | @@ -209,6 +222,13 @@ public class VirtualNetworkManagerTest { |
209 | virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id()); | 222 | virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id()); |
210 | assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty()); | 223 | assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty()); |
211 | 224 | ||
225 | + // Add/remove the virtual device again. | ||
226 | + VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), | ||
227 | + DeviceId.deviceId(deviceIdValue1)); | ||
228 | + manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id()); | ||
229 | + virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id()); | ||
230 | + assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty()); | ||
231 | + | ||
212 | // Validate that the events were all received in the correct order. | 232 | // Validate that the events were all received in the correct order. |
213 | validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED, | 233 | validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED, |
214 | VirtualNetworkEvent.Type.NETWORK_ADDED); | 234 | VirtualNetworkEvent.Type.NETWORK_ADDED); |
... | @@ -241,6 +261,12 @@ public class VirtualNetworkManagerTest { | ... | @@ -241,6 +261,12 @@ public class VirtualNetworkManagerTest { |
241 | } | 261 | } |
242 | virtualLinks = manager.getVirtualLinks(virtualNetwork1.id()); | 262 | virtualLinks = manager.getVirtualLinks(virtualNetwork1.id()); |
243 | assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty()); | 263 | assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty()); |
264 | + | ||
265 | + // Add/remove the virtual link again. | ||
266 | + VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst, TunnelId.valueOf(0)); | ||
267 | + manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst()); | ||
268 | + virtualLinks = manager.getVirtualLinks(virtualNetwork1.id()); | ||
269 | + assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty()); | ||
244 | } | 270 | } |
245 | 271 | ||
246 | /** | 272 | /** |
... | @@ -250,19 +276,18 @@ public class VirtualNetworkManagerTest { | ... | @@ -250,19 +276,18 @@ public class VirtualNetworkManagerTest { |
250 | public void testAddRemoveVirtualPort() { | 276 | public void testAddRemoveVirtualPort() { |
251 | manager.registerTenantId(TenantId.tenantId(tenantIdValue1)); | 277 | manager.registerTenantId(TenantId.tenantId(tenantIdValue1)); |
252 | VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1)); | 278 | VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1)); |
253 | - VirtualDevice srcVirtualDevice = | 279 | + VirtualDevice virtualDevice = |
254 | manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1)); | 280 | manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1)); |
255 | - VirtualDevice dstVirtualDevice = | 281 | + Port port = new DefaultPort(virtualDevice, PortNumber.portNumber(1), true); |
256 | - manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue2)); | ||
257 | - Port port = new DefaultPort(srcVirtualDevice, PortNumber.portNumber(1), true); | ||
258 | 282 | ||
259 | - manager.createVirtualPort(virtualNetwork1.id(), srcVirtualDevice.id(), PortNumber.portNumber(1), port); | 283 | + manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(1), port); |
260 | - manager.createVirtualPort(virtualNetwork1.id(), dstVirtualDevice.id(), PortNumber.portNumber(1), port); | 284 | + manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(2), port); |
261 | 285 | ||
262 | - Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), srcVirtualDevice.id()); | 286 | + Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id()); |
263 | assertNotNull("The virtual port set should not be null", virtualPorts); | 287 | assertNotNull("The virtual port set should not be null", virtualPorts); |
264 | assertEquals("The virtual port set size did not match.", 2, virtualPorts.size()); | 288 | assertEquals("The virtual port set size did not match.", 2, virtualPorts.size()); |
265 | 289 | ||
290 | + | ||
266 | for (VirtualPort virtualPort : virtualPorts) { | 291 | for (VirtualPort virtualPort : virtualPorts) { |
267 | manager.removeVirtualPort(virtualNetwork1.id(), | 292 | manager.removeVirtualPort(virtualNetwork1.id(), |
268 | (DeviceId) virtualPort.element().id(), virtualPort.number()); | 293 | (DeviceId) virtualPort.element().id(), virtualPort.number()); |
... | @@ -270,7 +295,14 @@ public class VirtualNetworkManagerTest { | ... | @@ -270,7 +295,14 @@ public class VirtualNetworkManagerTest { |
270 | manager.removeVirtualPort(virtualNetwork1.id(), | 295 | manager.removeVirtualPort(virtualNetwork1.id(), |
271 | (DeviceId) virtualPort.element().id(), virtualPort.number()); | 296 | (DeviceId) virtualPort.element().id(), virtualPort.number()); |
272 | } | 297 | } |
273 | - virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), srcVirtualDevice.id()); | 298 | + virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id()); |
299 | + assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty()); | ||
300 | + | ||
301 | + // Add/remove the virtual port again. | ||
302 | + VirtualPort virtualPort = manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(), | ||
303 | + PortNumber.portNumber(1), port); | ||
304 | + manager.removeVirtualPort(virtualNetwork1.id(), (DeviceId) virtualPort.element().id(), virtualPort.number()); | ||
305 | + virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id()); | ||
274 | assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty()); | 306 | assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty()); |
275 | } | 307 | } |
276 | 308 | ||
... | @@ -306,6 +338,9 @@ public class VirtualNetworkManagerTest { | ... | @@ -306,6 +338,9 @@ public class VirtualNetworkManagerTest { |
306 | 338 | ||
307 | } | 339 | } |
308 | 340 | ||
341 | + /** | ||
342 | + * Core service test class. | ||
343 | + */ | ||
309 | private class TestCoreService extends CoreServiceAdapter { | 344 | private class TestCoreService extends CoreServiceAdapter { |
310 | 345 | ||
311 | @Override | 346 | @Override | ... | ... |
... | @@ -42,6 +42,8 @@ import org.onosproject.incubator.net.virtual.VirtualNetworkStore; | ... | @@ -42,6 +42,8 @@ import org.onosproject.incubator.net.virtual.VirtualNetworkStore; |
42 | import org.onosproject.incubator.net.virtual.VirtualNetworkStoreDelegate; | 42 | import org.onosproject.incubator.net.virtual.VirtualNetworkStoreDelegate; |
43 | import org.onosproject.incubator.net.virtual.VirtualPort; | 43 | import org.onosproject.incubator.net.virtual.VirtualPort; |
44 | import org.onosproject.net.ConnectPoint; | 44 | import org.onosproject.net.ConnectPoint; |
45 | +import org.onosproject.net.DefaultDevice; | ||
46 | +import org.onosproject.net.DefaultPort; | ||
45 | import org.onosproject.net.Device; | 47 | import org.onosproject.net.Device; |
46 | import org.onosproject.net.DeviceId; | 48 | import org.onosproject.net.DeviceId; |
47 | import org.onosproject.net.Port; | 49 | import org.onosproject.net.Port; |
... | @@ -123,11 +125,18 @@ public class DistributedVirtualNetworkStore | ... | @@ -123,11 +125,18 @@ public class DistributedVirtualNetworkStore |
123 | .register(TenantId.class) | 125 | .register(TenantId.class) |
124 | .register(NetworkId.class).register(DeviceId.class) | 126 | .register(NetworkId.class).register(DeviceId.class) |
125 | .register(VirtualNetwork.class) | 127 | .register(VirtualNetwork.class) |
128 | + .register(DefaultVirtualNetwork.class) | ||
126 | .register(VirtualDevice.class) | 129 | .register(VirtualDevice.class) |
130 | + .register(DefaultVirtualDevice.class) | ||
127 | .register(VirtualLink.class) | 131 | .register(VirtualLink.class) |
132 | + .register(DefaultVirtualLink.class) | ||
128 | .register(VirtualPort.class) | 133 | .register(VirtualPort.class) |
134 | + .register(DefaultVirtualPort.class) | ||
129 | .register(DeviceId.class) | 135 | .register(DeviceId.class) |
130 | .register(Device.class) | 136 | .register(Device.class) |
137 | + .register(TunnelId.class) | ||
138 | + .register(DefaultDevice.class) | ||
139 | + .register(DefaultPort.class) | ||
131 | .nextId(KryoNamespaces.BEGIN_USER_CUSTOM_ID).build()); | 140 | .nextId(KryoNamespaces.BEGIN_USER_CUSTOM_ID).build()); |
132 | 141 | ||
133 | /** | 142 | /** |
... | @@ -233,12 +242,14 @@ public class DistributedVirtualNetworkStore | ... | @@ -233,12 +242,14 @@ public class DistributedVirtualNetworkStore |
233 | VirtualNetwork virtualNetwork = new DefaultVirtualNetwork(genNetworkId(), tenantId); | 242 | VirtualNetwork virtualNetwork = new DefaultVirtualNetwork(genNetworkId(), tenantId); |
234 | //TODO update both maps in one transaction. | 243 | //TODO update both maps in one transaction. |
235 | networkIdVirtualNetworkMap.put(virtualNetwork.id(), virtualNetwork); | 244 | networkIdVirtualNetworkMap.put(virtualNetwork.id(), virtualNetwork); |
236 | - Set<NetworkId> virtualNetworkSet = tenantIdNetworkIdSetMap.get(tenantId); | 245 | + |
237 | - if (virtualNetworkSet == null) { | 246 | + Set<NetworkId> networkIdSet = tenantIdNetworkIdSetMap.get(tenantId); |
238 | - virtualNetworkSet = new HashSet<>(); | 247 | + if (networkIdSet == null) { |
248 | + networkIdSet = new HashSet<>(); | ||
239 | } | 249 | } |
240 | - virtualNetworkSet.add(virtualNetwork.id()); | 250 | + networkIdSet.add(virtualNetwork.id()); |
241 | - tenantIdNetworkIdSetMap.put(tenantId, virtualNetworkSet); | 251 | + tenantIdNetworkIdSetMap.put(tenantId, networkIdSet); |
252 | + | ||
242 | return virtualNetwork; | 253 | return virtualNetwork; |
243 | } | 254 | } |
244 | 255 | ||
... | @@ -256,24 +267,26 @@ public class DistributedVirtualNetworkStore | ... | @@ -256,24 +267,26 @@ public class DistributedVirtualNetworkStore |
256 | public void removeNetwork(NetworkId networkId) { | 267 | public void removeNetwork(NetworkId networkId) { |
257 | // Make sure that the virtual network exists before attempting to remove it. | 268 | // Make sure that the virtual network exists before attempting to remove it. |
258 | if (networkExists(networkId)) { | 269 | if (networkExists(networkId)) { |
259 | - VirtualNetwork virtualNetwork = networkIdVirtualNetworkMap.get(networkId); | 270 | + //TODO update both maps in one transaction. |
271 | + | ||
272 | + VirtualNetwork virtualNetwork = networkIdVirtualNetworkMap.remove(networkId); | ||
260 | if (virtualNetwork == null) { | 273 | if (virtualNetwork == null) { |
261 | return; | 274 | return; |
262 | } | 275 | } |
263 | - //TODO update both maps in one transaction. | ||
264 | TenantId tenantId = virtualNetwork.tenantId(); | 276 | TenantId tenantId = virtualNetwork.tenantId(); |
265 | - networkIdVirtualNetworkMap.compute(networkId, (id, existingVirtualNetwork) -> null); | ||
266 | 277 | ||
278 | + Set<NetworkId> networkIdSet = new HashSet<>(); | ||
279 | + tenantIdNetworkIdSetMap.get(tenantId).forEach(networkId1 -> { | ||
280 | + if (networkId1.id().equals(networkId.id())) { | ||
281 | + networkIdSet.add(networkId1); | ||
282 | + } | ||
283 | + }); | ||
267 | 284 | ||
268 | - Set<NetworkId> virtualNetworkSet = tenantIdNetworkIdSetMap.get(tenantId); | ||
269 | tenantIdNetworkIdSetMap.compute(virtualNetwork.tenantId(), (id, existingNetworkIds) -> { | 285 | tenantIdNetworkIdSetMap.compute(virtualNetwork.tenantId(), (id, existingNetworkIds) -> { |
270 | if (existingNetworkIds == null || existingNetworkIds.isEmpty()) { | 286 | if (existingNetworkIds == null || existingNetworkIds.isEmpty()) { |
271 | - return ImmutableSet.of(); | 287 | + return new HashSet<NetworkId>(); |
272 | } else { | 288 | } else { |
273 | - return ImmutableSet.<NetworkId>builder() | 289 | + return new HashSet<NetworkId>(Sets.difference(existingNetworkIds, networkIdSet)); |
274 | - .addAll(Sets.difference(existingNetworkIds, | ||
275 | - ImmutableSet.copyOf(virtualNetworkSet))) | ||
276 | - .build(); | ||
277 | } | 290 | } |
278 | }); | 291 | }); |
279 | } | 292 | } |
... | @@ -308,22 +321,24 @@ public class DistributedVirtualNetworkStore | ... | @@ -308,22 +321,24 @@ public class DistributedVirtualNetworkStore |
308 | public void removeDevice(NetworkId networkId, DeviceId deviceId) { | 321 | public void removeDevice(NetworkId networkId, DeviceId deviceId) { |
309 | checkState(networkExists(networkId), "The network has not been added."); | 322 | checkState(networkExists(networkId), "The network has not been added."); |
310 | //TODO update both maps in one transaction. | 323 | //TODO update both maps in one transaction. |
311 | - Set<DeviceId> deviceIdSet = networkIdDeviceIdSetMap.get(networkId); | 324 | + |
325 | + Set<DeviceId> deviceIdSet = new HashSet<>(); | ||
326 | + networkIdDeviceIdSetMap.get(networkId).forEach(deviceId1 -> { | ||
327 | + if (deviceId1.equals(deviceId)) { | ||
328 | + deviceIdSet.add(deviceId1); | ||
329 | + } | ||
330 | + }); | ||
331 | + | ||
312 | if (deviceIdSet != null) { | 332 | if (deviceIdSet != null) { |
313 | networkIdDeviceIdSetMap.compute(networkId, (id, existingDeviceIds) -> { | 333 | networkIdDeviceIdSetMap.compute(networkId, (id, existingDeviceIds) -> { |
314 | if (existingDeviceIds == null || existingDeviceIds.isEmpty()) { | 334 | if (existingDeviceIds == null || existingDeviceIds.isEmpty()) { |
315 | - return ImmutableSet.of(); | 335 | + return new HashSet<DeviceId>(); |
316 | } else { | 336 | } else { |
317 | - return ImmutableSet.<DeviceId>builder() | 337 | + return new HashSet<DeviceId>(Sets.difference(existingDeviceIds, deviceIdSet)); |
318 | - .addAll(Sets.difference(existingDeviceIds, | ||
319 | - ImmutableSet.copyOf(deviceIdSet))) | ||
320 | - .build(); | ||
321 | } | 338 | } |
322 | }); | 339 | }); |
323 | 340 | ||
324 | - deviceIdVirtualDeviceMap.compute(deviceId, (id, existingVirtualDevice) -> null); | 341 | + deviceIdVirtualDeviceMap.remove(deviceId); |
325 | - | ||
326 | - log.info("The deviceIdVirtualDeviceMap size is: " + getDevices(networkId)); | ||
327 | } | 342 | } |
328 | } | 343 | } |
329 | 344 | ||
... | @@ -343,16 +358,20 @@ public class DistributedVirtualNetworkStore | ... | @@ -343,16 +358,20 @@ public class DistributedVirtualNetworkStore |
343 | @Override | 358 | @Override |
344 | public void removeLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst) { | 359 | public void removeLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst) { |
345 | checkState(networkExists(networkId), "The network has not been added."); | 360 | checkState(networkExists(networkId), "The network has not been added."); |
346 | - Set<VirtualLink> virtualLinkSet = networkIdVirtualLinkSetMap.get(networkId); | 361 | + |
362 | + Set<VirtualLink> virtualLinkSet = new HashSet<>(); | ||
363 | + networkIdVirtualLinkSetMap.get(networkId).forEach(link -> { | ||
364 | + if (link.src().equals(src) && link.dst().equals(dst)) { | ||
365 | + virtualLinkSet.add(link); | ||
366 | + } | ||
367 | + }); | ||
368 | + | ||
347 | if (virtualLinkSet != null) { | 369 | if (virtualLinkSet != null) { |
348 | networkIdVirtualLinkSetMap.compute(networkId, (id, existingVirtualLinks) -> { | 370 | networkIdVirtualLinkSetMap.compute(networkId, (id, existingVirtualLinks) -> { |
349 | if (existingVirtualLinks == null || existingVirtualLinks.isEmpty()) { | 371 | if (existingVirtualLinks == null || existingVirtualLinks.isEmpty()) { |
350 | - return ImmutableSet.of(); | 372 | + return new HashSet<VirtualLink>(); |
351 | } else { | 373 | } else { |
352 | - return ImmutableSet.<VirtualLink>builder() | 374 | + return new HashSet<VirtualLink>(Sets.difference(existingVirtualLinks, virtualLinkSet)); |
353 | - .addAll(Sets.difference(existingVirtualLinks, | ||
354 | - ImmutableSet.copyOf(virtualLinkSet))) | ||
355 | - .build(); | ||
356 | } | 375 | } |
357 | }); | 376 | }); |
358 | } | 377 | } |
... | @@ -376,16 +395,20 @@ public class DistributedVirtualNetworkStore | ... | @@ -376,16 +395,20 @@ public class DistributedVirtualNetworkStore |
376 | @Override | 395 | @Override |
377 | public void removePort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber) { | 396 | public void removePort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber) { |
378 | checkState(networkExists(networkId), "The network has not been added."); | 397 | checkState(networkExists(networkId), "The network has not been added."); |
379 | - Set<VirtualPort> virtualPortSet = networkIdVirtualPortSetMap.get(networkId); | 398 | + |
399 | + Set<VirtualPort> virtualPortSet = new HashSet<>(); | ||
400 | + networkIdVirtualPortSetMap.get(networkId).forEach(port -> { | ||
401 | + if (port.element().id().equals(deviceId) && port.number().equals(portNumber)) { | ||
402 | + virtualPortSet.add(port); | ||
403 | + } | ||
404 | + }); | ||
405 | + | ||
380 | if (virtualPortSet != null) { | 406 | if (virtualPortSet != null) { |
381 | networkIdVirtualPortSetMap.compute(networkId, (id, existingVirtualPorts) -> { | 407 | networkIdVirtualPortSetMap.compute(networkId, (id, existingVirtualPorts) -> { |
382 | if (existingVirtualPorts == null || existingVirtualPorts.isEmpty()) { | 408 | if (existingVirtualPorts == null || existingVirtualPorts.isEmpty()) { |
383 | - return ImmutableSet.of(); | 409 | + return new HashSet<VirtualPort>(); |
384 | } else { | 410 | } else { |
385 | - return ImmutableSet.<VirtualPort>builder() | 411 | + return new HashSet<VirtualPort>(Sets.difference(existingVirtualPorts, virtualPortSet)); |
386 | - .addAll(Sets.difference(existingVirtualPorts, | ||
387 | - ImmutableSet.copyOf(virtualPortSet))) | ||
388 | - .build(); | ||
389 | } | 412 | } |
390 | }); | 413 | }); |
391 | } | 414 | } |
... | @@ -415,17 +438,28 @@ public class DistributedVirtualNetworkStore | ... | @@ -415,17 +438,28 @@ public class DistributedVirtualNetworkStore |
415 | @Override | 438 | @Override |
416 | public Set<VirtualLink> getLinks(NetworkId networkId) { | 439 | public Set<VirtualLink> getLinks(NetworkId networkId) { |
417 | checkState(networkExists(networkId), "The network has not been added."); | 440 | checkState(networkExists(networkId), "The network has not been added."); |
418 | - Set<VirtualLink> virtualLinkSet = new HashSet<>(); | 441 | + Set<VirtualLink> virtualLinkSet = networkIdVirtualLinkSetMap.get(networkId); |
419 | - virtualLinkSet.addAll(networkIdVirtualLinkSetMap.get(networkId)); | 442 | + if (virtualLinkSet == null) { |
443 | + virtualLinkSet = new HashSet<>(); | ||
444 | + } | ||
420 | return ImmutableSet.copyOf(virtualLinkSet); | 445 | return ImmutableSet.copyOf(virtualLinkSet); |
421 | } | 446 | } |
422 | 447 | ||
423 | @Override | 448 | @Override |
424 | public Set<VirtualPort> getPorts(NetworkId networkId, DeviceId deviceId) { | 449 | public Set<VirtualPort> getPorts(NetworkId networkId, DeviceId deviceId) { |
425 | checkState(networkExists(networkId), "The network has not been added."); | 450 | checkState(networkExists(networkId), "The network has not been added."); |
426 | - Set<VirtualPort> virtualPortSet = new HashSet<>(); | 451 | + Set<VirtualPort> virtualPortSet = networkIdVirtualPortSetMap.get(networkId); |
427 | - virtualPortSet.addAll(networkIdVirtualPortSetMap.get(networkId)); | 452 | + if (virtualPortSet == null) { |
428 | - return ImmutableSet.copyOf(virtualPortSet); | 453 | + virtualPortSet = new HashSet<>(); |
454 | + } | ||
455 | + | ||
456 | + Set<VirtualPort> portSet = new HashSet<>(); | ||
457 | + virtualPortSet.forEach(virtualPort -> { | ||
458 | + if (virtualPort.element().id().equals(deviceId)) { | ||
459 | + portSet.add(virtualPort); | ||
460 | + } | ||
461 | + }); | ||
462 | + return ImmutableSet.copyOf(portSet); | ||
429 | } | 463 | } |
430 | 464 | ||
431 | /** | 465 | /** | ... | ... |
-
Please register or login to post a comment