Committed by
Gerrit Code Review
ONOS-4075 - Distributed virtual network store implementation,
and virtual network manager Junit tests. Change-Id: Ic1f82822c894e3c394aa95df1e76ae59fe218120
Showing
13 changed files
with
1093 additions
and
34 deletions
... | @@ -64,7 +64,7 @@ public class DistributedSetTest { | ... | @@ -64,7 +64,7 @@ public class DistributedSetTest { |
64 | public void basicTests() { | 64 | public void basicTests() { |
65 | set1.add("item1"); | 65 | set1.add("item1"); |
66 | assertEquals("The set name should match.", SETNAME, set1.name()); | 66 | assertEquals("The set name should match.", SETNAME, set1.name()); |
67 | - assertEquals("The set name should match.", DistributedPrimitive.Type.SET, set1.primitiveType()); | 67 | + assertEquals("The set primitive type should match.", DistributedPrimitive.Type.SET, set1.primitiveType()); |
68 | 68 | ||
69 | set1.add("item2"); | 69 | set1.add("item2"); |
70 | set1.add("item3"); | 70 | set1.add("item3"); | ... | ... |
... | @@ -27,7 +27,7 @@ import static com.google.common.base.MoreObjects.*; | ... | @@ -27,7 +27,7 @@ import static com.google.common.base.MoreObjects.*; |
27 | /** | 27 | /** |
28 | * Default representation of a virtual device. | 28 | * Default representation of a virtual device. |
29 | */ | 29 | */ |
30 | -public class DefaultVirtualDevice extends DefaultDevice implements VirtualDevice { | 30 | +public final class DefaultVirtualDevice extends DefaultDevice implements VirtualDevice { |
31 | 31 | ||
32 | private static final String VIRTUAL = "virtual"; | 32 | private static final String VIRTUAL = "virtual"; |
33 | private static final ProviderId PID = new ProviderId(VIRTUAL, VIRTUAL); | 33 | private static final ProviderId PID = new ProviderId(VIRTUAL, VIRTUAL); |
... | @@ -53,7 +53,7 @@ public class DefaultVirtualDevice extends DefaultDevice implements VirtualDevice | ... | @@ -53,7 +53,7 @@ public class DefaultVirtualDevice extends DefaultDevice implements VirtualDevice |
53 | 53 | ||
54 | @Override | 54 | @Override |
55 | public int hashCode() { | 55 | public int hashCode() { |
56 | - return 31 * super.hashCode() + networkId.hashCode(); | 56 | + return Objects.hash(networkId); |
57 | } | 57 | } |
58 | 58 | ||
59 | @Override | 59 | @Override | ... | ... |
incubator/api/src/main/java/org/onosproject/incubator/net/virtual/DefaultVirtualLink.java
0 → 100644
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.incubator.net.virtual; | ||
18 | + | ||
19 | +import org.onosproject.incubator.net.tunnel.TunnelId; | ||
20 | +import org.onosproject.net.ConnectPoint; | ||
21 | +import org.onosproject.net.DefaultAnnotations; | ||
22 | +import org.onosproject.net.DefaultLink; | ||
23 | +import org.onosproject.net.provider.ProviderId; | ||
24 | + | ||
25 | +import java.util.Objects; | ||
26 | + | ||
27 | +import static com.google.common.base.MoreObjects.toStringHelper; | ||
28 | + | ||
29 | +/** | ||
30 | + * Default representation of a virtual link. | ||
31 | + */ | ||
32 | +public final class DefaultVirtualLink extends DefaultLink implements VirtualLink { | ||
33 | + | ||
34 | + private static final String VIRTUAL = "virtual"; | ||
35 | + private static final ProviderId PID = new ProviderId(VIRTUAL, VIRTUAL); | ||
36 | + | ||
37 | + private final NetworkId networkId; | ||
38 | + private final TunnelId tunnelId; | ||
39 | + | ||
40 | + /** | ||
41 | + * Constructor for a default virtual link. | ||
42 | + * | ||
43 | + * @param networkId network identifier | ||
44 | + * @param src source connection point | ||
45 | + * @param dst destination connection point | ||
46 | + * @param tunnelId tunnel identifier | ||
47 | + */ | ||
48 | + public DefaultVirtualLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst, TunnelId tunnelId) { | ||
49 | + super(PID, src, dst, Type.VIRTUAL, DefaultAnnotations.builder().build()); | ||
50 | + this.networkId = networkId; | ||
51 | + this.tunnelId = tunnelId; | ||
52 | + } | ||
53 | + | ||
54 | + @Override | ||
55 | + public NetworkId networkId() { | ||
56 | + return networkId; | ||
57 | + } | ||
58 | + | ||
59 | + /** | ||
60 | + * Returns the tunnel identifier. | ||
61 | + * | ||
62 | + * @return tunnel identifier. | ||
63 | + */ | ||
64 | + public TunnelId tunnelId() { | ||
65 | + return tunnelId; | ||
66 | + } | ||
67 | + | ||
68 | + @Override | ||
69 | + public int hashCode() { | ||
70 | + return Objects.hash(networkId, tunnelId); | ||
71 | + } | ||
72 | + | ||
73 | + @Override | ||
74 | + public boolean equals(Object obj) { | ||
75 | + if (this == obj) { | ||
76 | + return true; | ||
77 | + } | ||
78 | + if (obj instanceof DefaultVirtualLink) { | ||
79 | + DefaultVirtualLink that = (DefaultVirtualLink) obj; | ||
80 | + return super.equals(that) && | ||
81 | + Objects.equals(this.networkId, that.networkId) && | ||
82 | + Objects.equals(this.tunnelId, that.tunnelId); | ||
83 | + } | ||
84 | + return false; | ||
85 | + } | ||
86 | + | ||
87 | + @Override | ||
88 | + public String toString() { | ||
89 | + return toStringHelper(this).add("networkId", networkId).add("tunnelId", tunnelId).toString(); | ||
90 | + } | ||
91 | +} |
... | @@ -22,7 +22,7 @@ import static com.google.common.base.MoreObjects.toStringHelper; | ... | @@ -22,7 +22,7 @@ import static com.google.common.base.MoreObjects.toStringHelper; |
22 | /** | 22 | /** |
23 | * Default implementation of the virtual network descriptor. | 23 | * Default implementation of the virtual network descriptor. |
24 | */ | 24 | */ |
25 | -public class DefaultVirtualNetwork implements VirtualNetwork { | 25 | +public final class DefaultVirtualNetwork implements VirtualNetwork { |
26 | 26 | ||
27 | private final NetworkId id; | 27 | private final NetworkId id; |
28 | private final TenantId tenantId; | 28 | private final TenantId tenantId; | ... | ... |
incubator/api/src/main/java/org/onosproject/incubator/net/virtual/DefaultVirtualPort.java
0 → 100644
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.incubator.net.virtual; | ||
18 | + | ||
19 | +import org.onosproject.net.DefaultAnnotations; | ||
20 | +import org.onosproject.net.DefaultPort; | ||
21 | +import org.onosproject.net.Device; | ||
22 | +import org.onosproject.net.Element; | ||
23 | +import org.onosproject.net.Port; | ||
24 | +import org.onosproject.net.PortNumber; | ||
25 | + | ||
26 | +import java.util.Objects; | ||
27 | + | ||
28 | +import static com.google.common.base.MoreObjects.toStringHelper; | ||
29 | + | ||
30 | +/** | ||
31 | + * Default representation of a virtual port. | ||
32 | + */ | ||
33 | +public final class DefaultVirtualPort extends DefaultPort implements VirtualPort { | ||
34 | + | ||
35 | + | ||
36 | + private final NetworkId networkId; | ||
37 | + private final Port realizedBy; | ||
38 | + | ||
39 | + public DefaultVirtualPort(NetworkId networkId, Device device, PortNumber portNumber, Port realizedBy) { | ||
40 | + super((Element) device, portNumber, false, DefaultAnnotations.builder().build()); | ||
41 | + this.networkId = networkId; | ||
42 | + this.realizedBy = realizedBy; | ||
43 | + } | ||
44 | + | ||
45 | + public NetworkId networkId() { | ||
46 | + return networkId; | ||
47 | + } | ||
48 | + | ||
49 | + @Override | ||
50 | + public Port realizedBy() { | ||
51 | + return realizedBy; | ||
52 | + } | ||
53 | + | ||
54 | + @Override | ||
55 | + public int hashCode() { | ||
56 | + return Objects.hash(networkId, realizedBy); | ||
57 | + } | ||
58 | + | ||
59 | + @Override | ||
60 | + public boolean equals(Object obj) { | ||
61 | + if (this == obj) { | ||
62 | + return true; | ||
63 | + } | ||
64 | + if (obj instanceof DefaultVirtualPort) { | ||
65 | + DefaultVirtualPort that = (DefaultVirtualPort) obj; | ||
66 | + return super.equals(that) && | ||
67 | + Objects.equals(this.networkId, that.networkId) && | ||
68 | + Objects.equals(this.realizedBy, that.realizedBy); | ||
69 | + } | ||
70 | + return false; | ||
71 | + } | ||
72 | + | ||
73 | + @Override | ||
74 | + public String toString() { | ||
75 | + return toStringHelper(this).add("networkId", networkId).add("realizedBy", realizedBy).toString(); | ||
76 | + } | ||
77 | + | ||
78 | +} |
... | @@ -27,6 +27,11 @@ import java.util.Set; | ... | @@ -27,6 +27,11 @@ import java.util.Set; |
27 | public interface VirtualNetworkService { | 27 | public interface VirtualNetworkService { |
28 | 28 | ||
29 | /** | 29 | /** |
30 | + * The topic used for obtaining globally unique ids. | ||
31 | + */ | ||
32 | + String VIRTUAL_NETWORK_TOPIC = "virtual-network-ids"; | ||
33 | + | ||
34 | + /** | ||
30 | * Returns a collection of all virtual networks created on behalf of the | 35 | * Returns a collection of all virtual networks created on behalf of the |
31 | * specified tenant. | 36 | * specified tenant. |
32 | * | 37 | * | ... | ... |
incubator/api/src/test/java/org/onosproject/incubator/net/virtual/DefaultVirtualDeviceTest.java
0 → 100644
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.incubator.net.virtual; | ||
18 | + | ||
19 | +import com.google.common.testing.EqualsTester; | ||
20 | +import org.junit.Test; | ||
21 | +import org.onosproject.net.DeviceId; | ||
22 | + | ||
23 | +import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; | ||
24 | + | ||
25 | +/** | ||
26 | + * Test of the default virtual device model entity. | ||
27 | + */ | ||
28 | +public class DefaultVirtualDeviceTest { | ||
29 | + final String deviceIdValue1 = "DEVICE_ID1"; | ||
30 | + final String deviceIdValue2 = "DEVICE_ID2"; | ||
31 | + | ||
32 | + /** | ||
33 | + * Checks that the DefaultVirtualDevice class is immutable. | ||
34 | + */ | ||
35 | + @Test | ||
36 | + public void testImmutability() { | ||
37 | + assertThatClassIsImmutable(DefaultVirtualDevice.class); | ||
38 | + } | ||
39 | + | ||
40 | + @Test | ||
41 | + public void testEquality() { | ||
42 | + DefaultVirtualDevice device1 = | ||
43 | + new DefaultVirtualDevice(NetworkId.networkId(0), DeviceId.deviceId(deviceIdValue1)); | ||
44 | + DefaultVirtualDevice device2 = | ||
45 | + new DefaultVirtualDevice(NetworkId.networkId(0), DeviceId.deviceId(deviceIdValue1)); | ||
46 | + DefaultVirtualDevice device3 = | ||
47 | + new DefaultVirtualDevice(NetworkId.networkId(0), DeviceId.deviceId(deviceIdValue2)); | ||
48 | + DefaultVirtualDevice device4 = | ||
49 | + new DefaultVirtualDevice(NetworkId.networkId(1), DeviceId.deviceId(deviceIdValue1)); | ||
50 | + | ||
51 | + new EqualsTester().addEqualityGroup(device1, device2).addEqualityGroup(device3) | ||
52 | + .addEqualityGroup(device4).testEquals(); | ||
53 | + } | ||
54 | +} |
incubator/api/src/test/java/org/onosproject/incubator/net/virtual/DefaultVirtualLinkTest.java
0 → 100644
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.incubator.net.virtual; | ||
18 | + | ||
19 | +import com.google.common.testing.EqualsTester; | ||
20 | +import org.junit.Test; | ||
21 | +import org.onosproject.incubator.net.tunnel.TunnelId; | ||
22 | +import org.onosproject.net.ConnectPoint; | ||
23 | +import org.onosproject.net.DeviceId; | ||
24 | +import org.onosproject.net.PortNumber; | ||
25 | + | ||
26 | +import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; | ||
27 | + | ||
28 | +/** | ||
29 | + * Test of the default virtual link model entity. | ||
30 | + */ | ||
31 | +public class DefaultVirtualLinkTest { | ||
32 | + final String deviceIdValue1 = "DEVICE_ID1"; | ||
33 | + final String deviceIdValue2 = "DEVICE_ID2"; | ||
34 | + | ||
35 | + /** | ||
36 | + * Checks that the DefaultVirtualLink class is immutable. | ||
37 | + */ | ||
38 | + @Test | ||
39 | + public void testImmutability() { | ||
40 | + assertThatClassIsImmutable(DefaultVirtualLink.class); | ||
41 | + } | ||
42 | + | ||
43 | + @Test | ||
44 | + public void testEquality() { | ||
45 | + DefaultVirtualDevice device1 = | ||
46 | + new DefaultVirtualDevice(NetworkId.networkId(0), DeviceId.deviceId(deviceIdValue1)); | ||
47 | + DefaultVirtualDevice device2 = | ||
48 | + new DefaultVirtualDevice(NetworkId.networkId(0), DeviceId.deviceId(deviceIdValue2)); | ||
49 | + ConnectPoint src = new ConnectPoint(device1.id(), PortNumber.portNumber(1)); | ||
50 | + ConnectPoint dst = new ConnectPoint(device2.id(), PortNumber.portNumber(2)); | ||
51 | + | ||
52 | + DefaultVirtualLink link1 = new DefaultVirtualLink(NetworkId.networkId(0), src, dst, TunnelId.valueOf(0)); | ||
53 | + DefaultVirtualLink link2 = new DefaultVirtualLink(NetworkId.networkId(0), src, dst, TunnelId.valueOf(0)); | ||
54 | + DefaultVirtualLink link3 = new DefaultVirtualLink(NetworkId.networkId(0), src, dst, TunnelId.valueOf(1)); | ||
55 | + DefaultVirtualLink link4 = new DefaultVirtualLink(NetworkId.networkId(1), src, dst, TunnelId.valueOf(0)); | ||
56 | + | ||
57 | + new EqualsTester().addEqualityGroup(link1, link2).addEqualityGroup(link3) | ||
58 | + .addEqualityGroup(link4).testEquals(); | ||
59 | + } | ||
60 | +} |
incubator/api/src/test/java/org/onosproject/incubator/net/virtual/DefaultVirtualNetworkTest.java
0 → 100644
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.incubator.net.virtual; | ||
18 | + | ||
19 | +import com.google.common.testing.EqualsTester; | ||
20 | +import org.junit.Test; | ||
21 | + | ||
22 | +import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; | ||
23 | + | ||
24 | +/** | ||
25 | + * Test of the default virtual network model entity. | ||
26 | + */ | ||
27 | +public class DefaultVirtualNetworkTest { | ||
28 | + final String tenantIdValue1 = "TENANT_ID1"; | ||
29 | + final String tenantIdValue2 = "TENANT_ID2"; | ||
30 | + | ||
31 | + /** | ||
32 | + * Checks that the DefaultVirtualNetwork class is immutable. | ||
33 | + */ | ||
34 | + @Test | ||
35 | + public void testImmutability() { | ||
36 | + assertThatClassIsImmutable(DefaultVirtualNetwork.class); | ||
37 | + } | ||
38 | + | ||
39 | + @Test | ||
40 | + public void testEquality() { | ||
41 | + DefaultVirtualNetwork network1 = | ||
42 | + new DefaultVirtualNetwork(NetworkId.networkId(0), TenantId.tenantId(tenantIdValue1)); | ||
43 | + DefaultVirtualNetwork network2 = | ||
44 | + new DefaultVirtualNetwork(NetworkId.networkId(0), TenantId.tenantId(tenantIdValue1)); | ||
45 | + DefaultVirtualNetwork network3 = | ||
46 | + new DefaultVirtualNetwork(NetworkId.networkId(0), TenantId.tenantId(tenantIdValue2)); | ||
47 | + DefaultVirtualNetwork network4 = | ||
48 | + new DefaultVirtualNetwork(NetworkId.networkId(1), TenantId.tenantId(tenantIdValue2)); | ||
49 | + | ||
50 | + new EqualsTester().addEqualityGroup(network1, network2).addEqualityGroup(network3) | ||
51 | + .addEqualityGroup(network4).testEquals(); | ||
52 | + } | ||
53 | +} |
incubator/api/src/test/java/org/onosproject/incubator/net/virtual/DefaultVirtualPortTest.java
0 → 100644
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.incubator.net.virtual; | ||
18 | + | ||
19 | +import com.google.common.testing.EqualsTester; | ||
20 | +import org.junit.Test; | ||
21 | +import org.onosproject.net.DefaultPort; | ||
22 | +import org.onosproject.net.DeviceId; | ||
23 | +import org.onosproject.net.Port; | ||
24 | +import org.onosproject.net.PortNumber; | ||
25 | + | ||
26 | +import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; | ||
27 | + | ||
28 | +/** | ||
29 | + * Test of the default virtual port model entity. | ||
30 | + */ | ||
31 | +public class DefaultVirtualPortTest { | ||
32 | + final String deviceIdValue1 = "DEVICE_ID1"; | ||
33 | + final String deviceIdValue2 = "DEVICE_ID2"; | ||
34 | + | ||
35 | + /** | ||
36 | + * Checks that the DefaultVirtualPort class is immutable. | ||
37 | + */ | ||
38 | + @Test | ||
39 | + public void testImmutability() { | ||
40 | + assertThatClassIsImmutable(DefaultVirtualPort.class); | ||
41 | + } | ||
42 | + | ||
43 | + @Test | ||
44 | + public void testEquality() { | ||
45 | + DefaultVirtualDevice device1 = | ||
46 | + new DefaultVirtualDevice(NetworkId.networkId(0), DeviceId.deviceId(deviceIdValue1)); | ||
47 | + DefaultVirtualDevice device2 = | ||
48 | + new DefaultVirtualDevice(NetworkId.networkId(0), DeviceId.deviceId(deviceIdValue2)); | ||
49 | + | ||
50 | + Port portA = new DefaultPort(device1, PortNumber.portNumber(1), true); | ||
51 | + Port portB = new DefaultPort(device1, PortNumber.portNumber(2), true); | ||
52 | + Port portC = new DefaultPort(device2, PortNumber.portNumber(2), true); | ||
53 | + | ||
54 | + DefaultVirtualPort port1 = | ||
55 | + new DefaultVirtualPort(NetworkId.networkId(0), device1, PortNumber.portNumber(1), portA); | ||
56 | + DefaultVirtualPort port2 = | ||
57 | + new DefaultVirtualPort(NetworkId.networkId(0), device1, PortNumber.portNumber(1), portA); | ||
58 | + DefaultVirtualPort port3 = | ||
59 | + new DefaultVirtualPort(NetworkId.networkId(0), device1, PortNumber.portNumber(2), portB); | ||
60 | + DefaultVirtualPort port4 = | ||
61 | + new DefaultVirtualPort(NetworkId.networkId(1), device2, PortNumber.portNumber(2), portC); | ||
62 | + | ||
63 | + | ||
64 | + new EqualsTester().addEqualityGroup(port1, port2).addEqualityGroup(port3) | ||
65 | + .addEqualityGroup(port4).testEquals(); | ||
66 | + } | ||
67 | +} |
1 | /* | 1 | /* |
2 | - * Copyright 2015 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. |
... | @@ -57,7 +57,7 @@ import static com.google.common.base.Preconditions.checkNotNull; | ... | @@ -57,7 +57,7 @@ import static com.google.common.base.Preconditions.checkNotNull; |
57 | @Service | 57 | @Service |
58 | public class VirtualNetworkManager | 58 | public class VirtualNetworkManager |
59 | extends AbstractListenerProviderRegistry<VirtualNetworkEvent, VirtualNetworkListener, | 59 | extends AbstractListenerProviderRegistry<VirtualNetworkEvent, VirtualNetworkListener, |
60 | - VirtualNetworkProvider, VirtualNetworkProviderService> | 60 | + VirtualNetworkProvider, VirtualNetworkProviderService> |
61 | implements VirtualNetworkService, VirtualNetworkAdminService, VirtualNetworkProviderRegistry { | 61 | implements VirtualNetworkService, VirtualNetworkAdminService, VirtualNetworkProviderRegistry { |
62 | 62 | ||
63 | private final Logger log = LoggerFactory.getLogger(getClass()); | 63 | private final Logger log = LoggerFactory.getLogger(getClass()); |
... | @@ -70,19 +70,23 @@ public class VirtualNetworkManager | ... | @@ -70,19 +70,23 @@ public class VirtualNetworkManager |
70 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 70 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
71 | protected VirtualNetworkStore store; | 71 | protected VirtualNetworkStore store; |
72 | 72 | ||
73 | - private VirtualNetworkStoreDelegate delegate = new InternalStoreDelegate(); | 73 | + private VirtualNetworkStoreDelegate delegate = this::post; |
74 | 74 | ||
75 | // TODO: figure out how to coordinate "implementation" of a virtual network in a cluster | 75 | // TODO: figure out how to coordinate "implementation" of a virtual network in a cluster |
76 | 76 | ||
77 | @Activate | 77 | @Activate |
78 | protected void activate() { | 78 | protected void activate() { |
79 | store.setDelegate(delegate); | 79 | store.setDelegate(delegate); |
80 | + eventDispatcher.addSink(VirtualNetworkEvent.class, listenerRegistry); | ||
81 | + | ||
80 | log.info("Started"); | 82 | log.info("Started"); |
81 | } | 83 | } |
82 | 84 | ||
83 | @Deactivate | 85 | @Deactivate |
84 | protected void deactivate() { | 86 | protected void deactivate() { |
85 | store.unsetDelegate(delegate); | 87 | store.unsetDelegate(delegate); |
88 | + eventDispatcher.removeSink(VirtualNetworkEvent.class); | ||
89 | + | ||
86 | log.info("Stopped"); | 90 | log.info("Stopped"); |
87 | } | 91 | } |
88 | 92 | ||
... | @@ -211,13 +215,4 @@ public class VirtualNetworkManager | ... | @@ -211,13 +215,4 @@ public class VirtualNetworkManager |
211 | } | 215 | } |
212 | } | 216 | } |
213 | 217 | ||
214 | - // Auxiliary store delegate to receive notification about changes in | ||
215 | - // the virtual network configuration store state - by the store itself. | ||
216 | - private class InternalStoreDelegate implements VirtualNetworkStoreDelegate { | ||
217 | - @Override | ||
218 | - public void notify(VirtualNetworkEvent event) { | ||
219 | - post(event); | ||
220 | - } | ||
221 | - } | ||
222 | - | ||
223 | } | 218 | } | ... | ... |
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.incubator.net.virtual.impl; | ||
18 | + | ||
19 | +import com.google.common.collect.Lists; | ||
20 | +import org.junit.After; | ||
21 | +import org.junit.Before; | ||
22 | +import org.junit.Test; | ||
23 | +import org.onlab.junit.TestTools; | ||
24 | +import org.onlab.junit.TestUtils; | ||
25 | +import org.onosproject.common.event.impl.TestEventDispatcher; | ||
26 | +import org.onosproject.core.CoreService; | ||
27 | +import org.onosproject.core.CoreServiceAdapter; | ||
28 | +import org.onosproject.core.IdGenerator; | ||
29 | +import org.onosproject.event.Event; | ||
30 | +import org.onosproject.incubator.net.tunnel.TunnelId; | ||
31 | +import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork; | ||
32 | +import org.onosproject.incubator.net.virtual.NetworkId; | ||
33 | +import org.onosproject.incubator.net.virtual.TenantId; | ||
34 | +import org.onosproject.incubator.net.virtual.VirtualDevice; | ||
35 | +import org.onosproject.incubator.net.virtual.VirtualLink; | ||
36 | +import org.onosproject.incubator.net.virtual.VirtualNetwork; | ||
37 | +import org.onosproject.incubator.net.virtual.VirtualNetworkEvent; | ||
38 | +import org.onosproject.incubator.net.virtual.VirtualNetworkListener; | ||
39 | +import org.onosproject.incubator.net.virtual.VirtualNetworkService; | ||
40 | +import org.onosproject.incubator.net.virtual.VirtualPort; | ||
41 | +import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore; | ||
42 | +import org.onosproject.net.ConnectPoint; | ||
43 | +import org.onosproject.net.DefaultPort; | ||
44 | +import org.onosproject.net.DeviceId; | ||
45 | +import org.onosproject.net.NetTestTools; | ||
46 | +import org.onosproject.net.Port; | ||
47 | +import org.onosproject.net.PortNumber; | ||
48 | +import org.onosproject.store.service.TestStorageService; | ||
49 | + | ||
50 | +import java.util.Collection; | ||
51 | +import java.util.List; | ||
52 | +import java.util.Set; | ||
53 | +import java.util.concurrent.atomic.AtomicLong; | ||
54 | + | ||
55 | +import static org.junit.Assert.*; | ||
56 | + | ||
57 | +/** | ||
58 | + * Junit tests for VirtualNetworkManager. | ||
59 | + */ | ||
60 | +public class VirtualNetworkManagerTest { | ||
61 | + final String tenantIdValue1 = "TENANT_ID1"; | ||
62 | + final String tenantIdValue2 = "TENANT_ID2"; | ||
63 | + final String deviceIdValue1 = "DEVICE_ID1"; | ||
64 | + final String deviceIdValue2 = "DEVICE_ID2"; | ||
65 | + | ||
66 | + private VirtualNetworkManager manager; | ||
67 | + private VirtualNetworkService virtualNetworkManagerService; | ||
68 | + private DistributedVirtualNetworkStore virtualNetworkManagerStore; | ||
69 | + private CoreService coreService; | ||
70 | + protected TestListener listener = new TestListener(); | ||
71 | + | ||
72 | + @Before | ||
73 | + public void setUp() throws Exception { | ||
74 | + virtualNetworkManagerStore = new DistributedVirtualNetworkStore(); | ||
75 | + | ||
76 | + coreService = new TestCoreService(); | ||
77 | + virtualNetworkManagerStore.setCoreService(coreService); | ||
78 | + TestUtils.setField(coreService, "coreService", new TestCoreService()); | ||
79 | + TestUtils.setField(virtualNetworkManagerStore, "storageService", new TestStorageService()); | ||
80 | + virtualNetworkManagerStore.activate(); | ||
81 | + | ||
82 | + manager = new VirtualNetworkManager(); | ||
83 | + manager.store = virtualNetworkManagerStore; | ||
84 | + manager.addListener(listener); | ||
85 | + NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher()); | ||
86 | + manager.activate(); | ||
87 | + virtualNetworkManagerService = manager; | ||
88 | + | ||
89 | + } | ||
90 | + | ||
91 | + @After | ||
92 | + public void tearDown() { | ||
93 | + virtualNetworkManagerStore.deactivate(); | ||
94 | + manager.removeListener(listener); | ||
95 | + manager.deactivate(); | ||
96 | + NetTestTools.injectEventDispatcher(manager, null); | ||
97 | + } | ||
98 | + | ||
99 | + /** | ||
100 | + * Tests registering a null tenant id. | ||
101 | + */ | ||
102 | + @Test(expected = NullPointerException.class) | ||
103 | + public void testRegisterNullTenantId() { | ||
104 | + manager.registerTenantId(null); | ||
105 | + } | ||
106 | + | ||
107 | + /** | ||
108 | + * Tests registering/unregistering a tenant id. | ||
109 | + */ | ||
110 | + @Test | ||
111 | + public void testRegisterUnregisterTenantId() { | ||
112 | + manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1)); | ||
113 | + manager.registerTenantId(TenantId.tenantId(tenantIdValue1)); | ||
114 | + manager.registerTenantId(TenantId.tenantId(tenantIdValue2)); | ||
115 | + Collection<TenantId> tenantIdCollection = manager.getTenantIds(); | ||
116 | + assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size()); | ||
117 | + | ||
118 | + manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1)); | ||
119 | + manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2)); | ||
120 | + tenantIdCollection = manager.getTenantIds(); | ||
121 | + assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty()); | ||
122 | + | ||
123 | + // Validate that the events were all received in the correct order. | ||
124 | + validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED, VirtualNetworkEvent.Type.TENANT_REGISTERED, | ||
125 | + VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.TENANT_UNREGISTERED, | ||
126 | + VirtualNetworkEvent.Type.TENANT_UNREGISTERED); | ||
127 | + } | ||
128 | + | ||
129 | + /** | ||
130 | + * Tests adding a null virtual network. | ||
131 | + */ | ||
132 | + @Test(expected = NullPointerException.class) | ||
133 | + public void testCreateNullVirtualNetwork() { | ||
134 | + manager.createVirtualNetwork(null); | ||
135 | + } | ||
136 | + | ||
137 | + /** | ||
138 | + * Tests add and remove of virtual networks. | ||
139 | + */ | ||
140 | + @Test | ||
141 | + public void testAddRemoveVirtualNetwork() { | ||
142 | + manager.registerTenantId(TenantId.tenantId(tenantIdValue1)); | ||
143 | + manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1)); | ||
144 | + manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1)); | ||
145 | + Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)); | ||
146 | + assertNotNull("The virtual network set should not be null", virtualNetworks); | ||
147 | + assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size()); | ||
148 | + | ||
149 | + for (VirtualNetwork virtualNetwork : virtualNetworks) { | ||
150 | + manager.removeVirtualNetwork(virtualNetwork.id()); | ||
151 | + // attempt to remove the same virtual network again. | ||
152 | + manager.removeVirtualNetwork(virtualNetwork.id()); | ||
153 | + } | ||
154 | + virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)); | ||
155 | + assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty()); | ||
156 | + | ||
157 | + // Validate that the events were all received in the correct order. | ||
158 | + validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED, | ||
159 | + VirtualNetworkEvent.Type.NETWORK_ADDED, VirtualNetworkEvent.Type.NETWORK_REMOVED, | ||
160 | + VirtualNetworkEvent.Type.NETWORK_REMOVED); | ||
161 | + } | ||
162 | + | ||
163 | + /** | ||
164 | + * Tests adding a null virtual device. | ||
165 | + */ | ||
166 | + @Test(expected = NullPointerException.class) | ||
167 | + public void testCreateNullVirtualDevice() { | ||
168 | + manager.registerTenantId(TenantId.tenantId(tenantIdValue1)); | ||
169 | + VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1)); | ||
170 | + | ||
171 | + manager.createVirtualDevice(virtualNetwork.id(), null); | ||
172 | + } | ||
173 | + | ||
174 | + /** | ||
175 | + * Tests adding a virtual device where no virtual network exists. | ||
176 | + */ | ||
177 | + @Test(expected = IllegalStateException.class) | ||
178 | + public void testCreateVirtualDeviceWithNoNetwork() { | ||
179 | + manager.registerTenantId(TenantId.tenantId(tenantIdValue1)); | ||
180 | + VirtualNetwork virtualNetwork = new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1)); | ||
181 | + | ||
182 | + manager.createVirtualDevice(virtualNetwork.id(), DeviceId.deviceId(deviceIdValue1)); | ||
183 | + } | ||
184 | + | ||
185 | + /** | ||
186 | + * Tests add and remove of virtual devices. | ||
187 | + */ | ||
188 | + @Test | ||
189 | + public void testAddRemoveVirtualDevice() { | ||
190 | + manager.registerTenantId(TenantId.tenantId(tenantIdValue1)); | ||
191 | + VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1)); | ||
192 | + VirtualNetwork virtualNetwork2 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1)); | ||
193 | + manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1)); | ||
194 | + manager.createVirtualDevice(virtualNetwork2.id(), DeviceId.deviceId(deviceIdValue2)); | ||
195 | + | ||
196 | + Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id()); | ||
197 | + assertNotNull("The virtual device set should not be null", virtualDevices1); | ||
198 | + assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size()); | ||
199 | + | ||
200 | + Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id()); | ||
201 | + assertNotNull("The virtual device set should not be null", virtualDevices2); | ||
202 | + assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size()); | ||
203 | + | ||
204 | + for (VirtualDevice virtualDevice : virtualDevices1) { | ||
205 | + manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id()); | ||
206 | + // attempt to remove the same virtual device again. | ||
207 | + manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id()); | ||
208 | + } | ||
209 | + virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id()); | ||
210 | + assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty()); | ||
211 | + | ||
212 | + // Validate that the events were all received in the correct order. | ||
213 | + validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED, | ||
214 | + VirtualNetworkEvent.Type.NETWORK_ADDED); | ||
215 | + } | ||
216 | + | ||
217 | + /** | ||
218 | + * Tests add and remove of virtual links. | ||
219 | + */ | ||
220 | + @Test | ||
221 | + public void testAddRemoveVirtualLink() { | ||
222 | + manager.registerTenantId(TenantId.tenantId(tenantIdValue1)); | ||
223 | + VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1)); | ||
224 | + VirtualDevice srcVirtualDevice = | ||
225 | + manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1)); | ||
226 | + VirtualDevice dstVirtualDevice = | ||
227 | + manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue2)); | ||
228 | + ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1)); | ||
229 | + ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2)); | ||
230 | + manager.createVirtualLink(virtualNetwork1.id(), src, dst, TunnelId.valueOf(0)); | ||
231 | + manager.createVirtualLink(virtualNetwork1.id(), dst, src, TunnelId.valueOf(1)); | ||
232 | + | ||
233 | + Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id()); | ||
234 | + assertNotNull("The virtual link set should not be null", virtualLinks); | ||
235 | + assertEquals("The virtual link set size did not match.", 2, virtualLinks.size()); | ||
236 | + | ||
237 | + for (VirtualLink virtualLink : virtualLinks) { | ||
238 | + manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst()); | ||
239 | + // attempt to remove the same virtual link again. | ||
240 | + manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst()); | ||
241 | + } | ||
242 | + virtualLinks = manager.getVirtualLinks(virtualNetwork1.id()); | ||
243 | + assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty()); | ||
244 | + } | ||
245 | + | ||
246 | + /** | ||
247 | + * Tests add and remove of virtual ports. | ||
248 | + */ | ||
249 | + @Test | ||
250 | + public void testAddRemoveVirtualPort() { | ||
251 | + manager.registerTenantId(TenantId.tenantId(tenantIdValue1)); | ||
252 | + VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1)); | ||
253 | + VirtualDevice srcVirtualDevice = | ||
254 | + manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1)); | ||
255 | + VirtualDevice dstVirtualDevice = | ||
256 | + manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue2)); | ||
257 | + Port port = new DefaultPort(srcVirtualDevice, PortNumber.portNumber(1), true); | ||
258 | + | ||
259 | + manager.createVirtualPort(virtualNetwork1.id(), srcVirtualDevice.id(), PortNumber.portNumber(1), port); | ||
260 | + manager.createVirtualPort(virtualNetwork1.id(), dstVirtualDevice.id(), PortNumber.portNumber(1), port); | ||
261 | + | ||
262 | + Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), srcVirtualDevice.id()); | ||
263 | + assertNotNull("The virtual port set should not be null", virtualPorts); | ||
264 | + assertEquals("The virtual port set size did not match.", 2, virtualPorts.size()); | ||
265 | + | ||
266 | + for (VirtualPort virtualPort : virtualPorts) { | ||
267 | + manager.removeVirtualPort(virtualNetwork1.id(), | ||
268 | + (DeviceId) virtualPort.element().id(), virtualPort.number()); | ||
269 | + // attempt to remove the same virtual port again. | ||
270 | + manager.removeVirtualPort(virtualNetwork1.id(), | ||
271 | + (DeviceId) virtualPort.element().id(), virtualPort.number()); | ||
272 | + } | ||
273 | + virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), srcVirtualDevice.id()); | ||
274 | + assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty()); | ||
275 | + } | ||
276 | + | ||
277 | + /** | ||
278 | + * Method to validate that the actual versus expected virtual network events were | ||
279 | + * received correctly. | ||
280 | + * | ||
281 | + * @param types expected virtual network events. | ||
282 | + */ | ||
283 | + private void validateEvents(Enum... types) { | ||
284 | + TestTools.assertAfter(100, () -> { | ||
285 | + int i = 0; | ||
286 | + assertEquals("wrong events received", types.length, listener.events.size()); | ||
287 | + for (Event event : listener.events) { | ||
288 | + assertEquals("incorrect event type", types[i], event.type()); | ||
289 | + i++; | ||
290 | + } | ||
291 | + listener.events.clear(); | ||
292 | + }); | ||
293 | + } | ||
294 | + | ||
295 | + /** | ||
296 | + * Test listener class to receive virtual network events. | ||
297 | + */ | ||
298 | + private static class TestListener implements VirtualNetworkListener { | ||
299 | + | ||
300 | + protected List<VirtualNetworkEvent> events = Lists.newArrayList(); | ||
301 | + | ||
302 | + @Override | ||
303 | + public void event(VirtualNetworkEvent event) { | ||
304 | + events.add(event); | ||
305 | + } | ||
306 | + | ||
307 | + } | ||
308 | + | ||
309 | + private class TestCoreService extends CoreServiceAdapter { | ||
310 | + | ||
311 | + @Override | ||
312 | + public IdGenerator getIdGenerator(String topic) { | ||
313 | + return new IdGenerator() { | ||
314 | + private AtomicLong counter = new AtomicLong(0); | ||
315 | + | ||
316 | + @Override | ||
317 | + public long getNewId() { | ||
318 | + return counter.getAndIncrement(); | ||
319 | + } | ||
320 | + }; | ||
321 | + } | ||
322 | + } | ||
323 | +} |
1 | /* | 1 | /* |
2 | - * Copyright 2015 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. |
... | @@ -15,35 +15,59 @@ | ... | @@ -15,35 +15,59 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.incubator.store.virtual.impl; | 16 | package org.onosproject.incubator.store.virtual.impl; |
17 | 17 | ||
18 | +import com.google.common.collect.ImmutableSet; | ||
19 | +import com.google.common.collect.Sets; | ||
18 | import org.apache.felix.scr.annotations.Activate; | 20 | import org.apache.felix.scr.annotations.Activate; |
19 | import org.apache.felix.scr.annotations.Component; | 21 | import org.apache.felix.scr.annotations.Component; |
20 | import org.apache.felix.scr.annotations.Deactivate; | 22 | import org.apache.felix.scr.annotations.Deactivate; |
23 | +import org.apache.felix.scr.annotations.Reference; | ||
24 | +import org.apache.felix.scr.annotations.ReferenceCardinality; | ||
21 | import org.apache.felix.scr.annotations.Service; | 25 | import org.apache.felix.scr.annotations.Service; |
26 | +import org.onlab.util.KryoNamespace; | ||
27 | +import org.onosproject.core.CoreService; | ||
28 | +import org.onosproject.core.IdGenerator; | ||
22 | import org.onosproject.incubator.net.tunnel.TunnelId; | 29 | import org.onosproject.incubator.net.tunnel.TunnelId; |
23 | import org.onosproject.incubator.net.virtual.DefaultVirtualDevice; | 30 | import org.onosproject.incubator.net.virtual.DefaultVirtualDevice; |
31 | +import org.onosproject.incubator.net.virtual.DefaultVirtualLink; | ||
24 | import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork; | 32 | import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork; |
33 | +import org.onosproject.incubator.net.virtual.DefaultVirtualPort; | ||
25 | import org.onosproject.incubator.net.virtual.NetworkId; | 34 | import org.onosproject.incubator.net.virtual.NetworkId; |
26 | import org.onosproject.incubator.net.virtual.TenantId; | 35 | import org.onosproject.incubator.net.virtual.TenantId; |
27 | import org.onosproject.incubator.net.virtual.VirtualDevice; | 36 | import org.onosproject.incubator.net.virtual.VirtualDevice; |
28 | import org.onosproject.incubator.net.virtual.VirtualLink; | 37 | import org.onosproject.incubator.net.virtual.VirtualLink; |
29 | import org.onosproject.incubator.net.virtual.VirtualNetwork; | 38 | import org.onosproject.incubator.net.virtual.VirtualNetwork; |
30 | import org.onosproject.incubator.net.virtual.VirtualNetworkEvent; | 39 | import org.onosproject.incubator.net.virtual.VirtualNetworkEvent; |
40 | +import org.onosproject.incubator.net.virtual.VirtualNetworkService; | ||
31 | import org.onosproject.incubator.net.virtual.VirtualNetworkStore; | 41 | import org.onosproject.incubator.net.virtual.VirtualNetworkStore; |
32 | import org.onosproject.incubator.net.virtual.VirtualNetworkStoreDelegate; | 42 | import org.onosproject.incubator.net.virtual.VirtualNetworkStoreDelegate; |
33 | import org.onosproject.incubator.net.virtual.VirtualPort; | 43 | import org.onosproject.incubator.net.virtual.VirtualPort; |
34 | import org.onosproject.net.ConnectPoint; | 44 | import org.onosproject.net.ConnectPoint; |
45 | +import org.onosproject.net.Device; | ||
35 | import org.onosproject.net.DeviceId; | 46 | import org.onosproject.net.DeviceId; |
36 | import org.onosproject.net.Port; | 47 | import org.onosproject.net.Port; |
37 | import org.onosproject.net.PortNumber; | 48 | import org.onosproject.net.PortNumber; |
38 | import org.onosproject.store.AbstractStore; | 49 | import org.onosproject.store.AbstractStore; |
50 | +import org.onosproject.store.serializers.KryoNamespaces; | ||
51 | +import org.onosproject.store.service.ConsistentMap; | ||
52 | +import org.onosproject.store.service.DistributedSet; | ||
53 | +import org.onosproject.store.service.MapEvent; | ||
54 | +import org.onosproject.store.service.MapEventListener; | ||
55 | +import org.onosproject.store.service.Serializer; | ||
56 | +import org.onosproject.store.service.SetEvent; | ||
57 | +import org.onosproject.store.service.SetEventListener; | ||
58 | +import org.onosproject.store.service.StorageService; | ||
39 | import org.slf4j.Logger; | 59 | import org.slf4j.Logger; |
40 | 60 | ||
61 | +import java.util.HashSet; | ||
62 | +import java.util.Map; | ||
41 | import java.util.Set; | 63 | import java.util.Set; |
42 | 64 | ||
65 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
66 | +import static com.google.common.base.Preconditions.checkState; | ||
43 | import static org.slf4j.LoggerFactory.getLogger; | 67 | import static org.slf4j.LoggerFactory.getLogger; |
44 | 68 | ||
45 | /** | 69 | /** |
46 | - * Implementation of the network store. | 70 | + * Implementation of the virtual network store. |
47 | */ | 71 | */ |
48 | @Component(immediate = true) | 72 | @Component(immediate = true) |
49 | @Service | 73 | @Service |
... | @@ -53,95 +77,404 @@ public class DistributedVirtualNetworkStore | ... | @@ -53,95 +77,404 @@ public class DistributedVirtualNetworkStore |
53 | 77 | ||
54 | private final Logger log = getLogger(getClass()); | 78 | private final Logger log = getLogger(getClass()); |
55 | 79 | ||
56 | - // TODO: track tenants by ID | 80 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
57 | - // TODO: track networks by ID and by tenants | 81 | + protected StorageService storageService; |
58 | - // TODO: track devices by network ID and device ID | ||
59 | - // TODO: track devices by network ID | ||
60 | - // TODO: setup block allocator for network IDs | ||
61 | 82 | ||
62 | - // TODO: notify delegate | 83 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
84 | + protected CoreService coreService; | ||
63 | 85 | ||
86 | + private IdGenerator idGenerator; | ||
87 | + | ||
88 | + // Track tenants by ID | ||
89 | + private DistributedSet<TenantId> tenantIdSet; | ||
90 | + | ||
91 | + // Listener for tenant events | ||
92 | + private final SetEventListener<TenantId> setListener = new InternalSetListener(); | ||
93 | + | ||
94 | + // Track virtual networks by network Id | ||
95 | + private ConsistentMap<NetworkId, VirtualNetwork> networkIdVirtualNetworkConsistentMap; | ||
96 | + private Map<NetworkId, VirtualNetwork> networkIdVirtualNetworkMap; | ||
97 | + | ||
98 | + // Listener for virtual network events | ||
99 | + private final MapEventListener<NetworkId, VirtualNetwork> virtualMapListener = new InternalMapListener(); | ||
100 | + | ||
101 | + // Track virtual network IDs by tenant Id | ||
102 | + private ConsistentMap<TenantId, Set<NetworkId>> tenantIdNetworkIdSetConsistentMap; | ||
103 | + private Map<TenantId, Set<NetworkId>> tenantIdNetworkIdSetMap; | ||
104 | + | ||
105 | + // Track virtual devices by device Id | ||
106 | + private ConsistentMap<DeviceId, VirtualDevice> deviceIdVirtualDeviceConsistentMap; | ||
107 | + private Map<DeviceId, VirtualDevice> deviceIdVirtualDeviceMap; | ||
108 | + | ||
109 | + // Track device IDs by network Id | ||
110 | + private ConsistentMap<NetworkId, Set<DeviceId>> networkIdDeviceIdSetConsistentMap; | ||
111 | + private Map<NetworkId, Set<DeviceId>> networkIdDeviceIdSetMap; | ||
112 | + | ||
113 | + // Track virtual links by network Id | ||
114 | + private ConsistentMap<NetworkId, Set<VirtualLink>> networkIdVirtualLinkSetConsistentMap; | ||
115 | + private Map<NetworkId, Set<VirtualLink>> networkIdVirtualLinkSetMap; | ||
116 | + | ||
117 | + // Track virtual ports by network Id | ||
118 | + private ConsistentMap<NetworkId, Set<VirtualPort>> networkIdVirtualPortSetConsistentMap; | ||
119 | + private Map<NetworkId, Set<VirtualPort>> networkIdVirtualPortSetMap; | ||
120 | + | ||
121 | + private static final Serializer SERIALIZER = Serializer | ||
122 | + .using(new KryoNamespace.Builder().register(KryoNamespaces.API) | ||
123 | + .register(TenantId.class) | ||
124 | + .register(NetworkId.class).register(DeviceId.class) | ||
125 | + .register(VirtualNetwork.class) | ||
126 | + .register(VirtualDevice.class) | ||
127 | + .register(VirtualLink.class) | ||
128 | + .register(VirtualPort.class) | ||
129 | + .register(DeviceId.class) | ||
130 | + .register(Device.class) | ||
131 | + .nextId(KryoNamespaces.BEGIN_USER_CUSTOM_ID).build()); | ||
132 | + | ||
133 | + /** | ||
134 | + * Distributed network store service activate method. | ||
135 | + */ | ||
64 | @Activate | 136 | @Activate |
65 | public void activate() { | 137 | public void activate() { |
138 | + idGenerator = coreService.getIdGenerator(VirtualNetworkService.VIRTUAL_NETWORK_TOPIC); | ||
139 | + | ||
140 | + tenantIdSet = storageService.<TenantId>setBuilder() | ||
141 | + .withSerializer(SERIALIZER) | ||
142 | + .withName("onos-tenantId") | ||
143 | + .withRelaxedReadConsistency() | ||
144 | + .build() | ||
145 | + .asDistributedSet(); | ||
146 | + tenantIdSet.addListener(setListener); | ||
147 | + | ||
148 | + networkIdVirtualNetworkConsistentMap = storageService.<NetworkId, VirtualNetwork>consistentMapBuilder() | ||
149 | + .withSerializer(SERIALIZER) | ||
150 | + .withName("onos-networkId-virtualnetwork") | ||
151 | + .withRelaxedReadConsistency() | ||
152 | + .build(); | ||
153 | + networkIdVirtualNetworkConsistentMap.addListener(virtualMapListener); | ||
154 | + networkIdVirtualNetworkMap = networkIdVirtualNetworkConsistentMap.asJavaMap(); | ||
155 | + | ||
156 | + tenantIdNetworkIdSetConsistentMap = storageService.<TenantId, Set<NetworkId>>consistentMapBuilder() | ||
157 | + .withSerializer(SERIALIZER) | ||
158 | + .withName("onos-tenantId-networkIds") | ||
159 | + .withRelaxedReadConsistency() | ||
160 | + .build(); | ||
161 | + tenantIdNetworkIdSetMap = tenantIdNetworkIdSetConsistentMap.asJavaMap(); | ||
162 | + | ||
163 | + deviceIdVirtualDeviceConsistentMap = storageService.<DeviceId, VirtualDevice>consistentMapBuilder() | ||
164 | + .withSerializer(SERIALIZER) | ||
165 | + .withName("onos-deviceId-virtualdevice") | ||
166 | + .withRelaxedReadConsistency() | ||
167 | + .build(); | ||
168 | + deviceIdVirtualDeviceMap = deviceIdVirtualDeviceConsistentMap.asJavaMap(); | ||
169 | + | ||
170 | + networkIdDeviceIdSetConsistentMap = storageService.<NetworkId, Set<DeviceId>>consistentMapBuilder() | ||
171 | + .withSerializer(SERIALIZER) | ||
172 | + .withName("onos-networkId-deviceIds") | ||
173 | + .withRelaxedReadConsistency() | ||
174 | + .build(); | ||
175 | + networkIdDeviceIdSetMap = networkIdDeviceIdSetConsistentMap.asJavaMap(); | ||
176 | + | ||
177 | + networkIdVirtualLinkSetConsistentMap = storageService.<NetworkId, Set<VirtualLink>>consistentMapBuilder() | ||
178 | + .withSerializer(SERIALIZER) | ||
179 | + .withName("onos-networkId-virtuallinks") | ||
180 | + .withRelaxedReadConsistency() | ||
181 | + .build(); | ||
182 | + networkIdVirtualLinkSetMap = networkIdVirtualLinkSetConsistentMap.asJavaMap(); | ||
183 | + | ||
184 | + networkIdVirtualPortSetConsistentMap = storageService.<NetworkId, Set<VirtualPort>>consistentMapBuilder() | ||
185 | + .withSerializer(SERIALIZER) | ||
186 | + .withName("onos-networkId-virtualportss") | ||
187 | + .withRelaxedReadConsistency() | ||
188 | + .build(); | ||
189 | + networkIdVirtualPortSetMap = networkIdVirtualPortSetConsistentMap.asJavaMap(); | ||
190 | + | ||
66 | log.info("Started"); | 191 | log.info("Started"); |
67 | } | 192 | } |
68 | 193 | ||
194 | + /** | ||
195 | + * Distributed network store service deactivate method. | ||
196 | + */ | ||
69 | @Deactivate | 197 | @Deactivate |
70 | public void deactivate() { | 198 | public void deactivate() { |
199 | + tenantIdSet.removeListener(setListener); | ||
200 | + networkIdVirtualNetworkConsistentMap.removeListener(virtualMapListener); | ||
71 | log.info("Stopped"); | 201 | log.info("Stopped"); |
72 | } | 202 | } |
73 | 203 | ||
204 | + /** | ||
205 | + * This method is used for Junit tests to set the CoreService instance, which | ||
206 | + * is required to set the IdGenerator instance. | ||
207 | + * | ||
208 | + * @param coreService core service instance | ||
209 | + */ | ||
210 | + public void setCoreService(CoreService coreService) { | ||
211 | + this.coreService = coreService; | ||
212 | + } | ||
213 | + | ||
74 | @Override | 214 | @Override |
75 | public void addTenantId(TenantId tenantId) { | 215 | public void addTenantId(TenantId tenantId) { |
216 | + tenantIdSet.add(tenantId); | ||
76 | } | 217 | } |
77 | 218 | ||
78 | @Override | 219 | @Override |
79 | public void removeTenantId(TenantId tenantId) { | 220 | public void removeTenantId(TenantId tenantId) { |
221 | + tenantIdSet.remove(tenantId); | ||
80 | } | 222 | } |
81 | 223 | ||
82 | @Override | 224 | @Override |
83 | public Set<TenantId> getTenantIds() { | 225 | public Set<TenantId> getTenantIds() { |
84 | - return null; | 226 | + return ImmutableSet.copyOf(tenantIdSet); |
85 | } | 227 | } |
86 | 228 | ||
87 | @Override | 229 | @Override |
88 | public VirtualNetwork addNetwork(TenantId tenantId) { | 230 | public VirtualNetwork addNetwork(TenantId tenantId) { |
89 | - return new DefaultVirtualNetwork(genNetworkId(), tenantId); | 231 | + |
232 | + checkState(tenantIdSet.contains(tenantId), "The tenant has not been registered. " + tenantId.id()); | ||
233 | + VirtualNetwork virtualNetwork = new DefaultVirtualNetwork(genNetworkId(), tenantId); | ||
234 | + //TODO update both maps in one transaction. | ||
235 | + networkIdVirtualNetworkMap.put(virtualNetwork.id(), virtualNetwork); | ||
236 | + Set<NetworkId> virtualNetworkSet = tenantIdNetworkIdSetMap.get(tenantId); | ||
237 | + if (virtualNetworkSet == null) { | ||
238 | + virtualNetworkSet = new HashSet<>(); | ||
239 | + } | ||
240 | + virtualNetworkSet.add(virtualNetwork.id()); | ||
241 | + tenantIdNetworkIdSetMap.put(tenantId, virtualNetworkSet); | ||
242 | + return virtualNetwork; | ||
90 | } | 243 | } |
91 | 244 | ||
245 | + /** | ||
246 | + * Returns a new network identifier from a virtual network block of identifiers. | ||
247 | + * | ||
248 | + * @return NetworkId network identifier | ||
249 | + */ | ||
92 | private NetworkId genNetworkId() { | 250 | private NetworkId genNetworkId() { |
93 | - return NetworkId.networkId(0); // TODO: use a block allocator | 251 | + return NetworkId.networkId(idGenerator.getNewId()); |
94 | } | 252 | } |
95 | 253 | ||
96 | 254 | ||
97 | @Override | 255 | @Override |
98 | public void removeNetwork(NetworkId networkId) { | 256 | public void removeNetwork(NetworkId networkId) { |
257 | + // Make sure that the virtual network exists before attempting to remove it. | ||
258 | + if (networkExists(networkId)) { | ||
259 | + VirtualNetwork virtualNetwork = networkIdVirtualNetworkMap.get(networkId); | ||
260 | + if (virtualNetwork == null) { | ||
261 | + return; | ||
262 | + } | ||
263 | + //TODO update both maps in one transaction. | ||
264 | + TenantId tenantId = virtualNetwork.tenantId(); | ||
265 | + networkIdVirtualNetworkMap.compute(networkId, (id, existingVirtualNetwork) -> null); | ||
266 | + | ||
267 | + | ||
268 | + Set<NetworkId> virtualNetworkSet = tenantIdNetworkIdSetMap.get(tenantId); | ||
269 | + tenantIdNetworkIdSetMap.compute(virtualNetwork.tenantId(), (id, existingNetworkIds) -> { | ||
270 | + if (existingNetworkIds == null || existingNetworkIds.isEmpty()) { | ||
271 | + return ImmutableSet.of(); | ||
272 | + } else { | ||
273 | + return ImmutableSet.<NetworkId>builder() | ||
274 | + .addAll(Sets.difference(existingNetworkIds, | ||
275 | + ImmutableSet.copyOf(virtualNetworkSet))) | ||
276 | + .build(); | ||
277 | + } | ||
278 | + }); | ||
279 | + } | ||
280 | + } | ||
281 | + | ||
282 | + /** | ||
283 | + * Returns if the network identifier exists. | ||
284 | + * | ||
285 | + * @param networkId network identifier | ||
286 | + * @return true if the network identifier exists, false otherwise. | ||
287 | + */ | ||
288 | + private boolean networkExists(NetworkId networkId) { | ||
289 | + return (networkIdVirtualNetworkMap.containsKey(networkId)); | ||
99 | } | 290 | } |
100 | 291 | ||
101 | @Override | 292 | @Override |
102 | public VirtualDevice addDevice(NetworkId networkId, DeviceId deviceId) { | 293 | public VirtualDevice addDevice(NetworkId networkId, DeviceId deviceId) { |
103 | - return new DefaultVirtualDevice(networkId, deviceId); | 294 | + checkState(networkExists(networkId), "The network has not been added."); |
295 | + Set<DeviceId> deviceIdSet = networkIdDeviceIdSetMap.get(networkId); | ||
296 | + if (deviceIdSet == null) { | ||
297 | + deviceIdSet = new HashSet<>(); | ||
298 | + } | ||
299 | + VirtualDevice virtualDevice = new DefaultVirtualDevice(networkId, deviceId); | ||
300 | + //TODO update both maps in one transaction. | ||
301 | + deviceIdVirtualDeviceMap.put(deviceId, virtualDevice); | ||
302 | + deviceIdSet.add(deviceId); | ||
303 | + networkIdDeviceIdSetMap.put(networkId, deviceIdSet); | ||
304 | + return virtualDevice; | ||
104 | } | 305 | } |
105 | 306 | ||
106 | @Override | 307 | @Override |
107 | public void removeDevice(NetworkId networkId, DeviceId deviceId) { | 308 | public void removeDevice(NetworkId networkId, DeviceId deviceId) { |
309 | + checkState(networkExists(networkId), "The network has not been added."); | ||
310 | + //TODO update both maps in one transaction. | ||
311 | + Set<DeviceId> deviceIdSet = networkIdDeviceIdSetMap.get(networkId); | ||
312 | + if (deviceIdSet != null) { | ||
313 | + networkIdDeviceIdSetMap.compute(networkId, (id, existingDeviceIds) -> { | ||
314 | + if (existingDeviceIds == null || existingDeviceIds.isEmpty()) { | ||
315 | + return ImmutableSet.of(); | ||
316 | + } else { | ||
317 | + return ImmutableSet.<DeviceId>builder() | ||
318 | + .addAll(Sets.difference(existingDeviceIds, | ||
319 | + ImmutableSet.copyOf(deviceIdSet))) | ||
320 | + .build(); | ||
321 | + } | ||
322 | + }); | ||
323 | + | ||
324 | + deviceIdVirtualDeviceMap.compute(deviceId, (id, existingVirtualDevice) -> null); | ||
325 | + | ||
326 | + log.info("The deviceIdVirtualDeviceMap size is: " + getDevices(networkId)); | ||
327 | + } | ||
108 | } | 328 | } |
109 | 329 | ||
110 | @Override | 330 | @Override |
111 | public VirtualLink addLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst, TunnelId realizedBy) { | 331 | public VirtualLink addLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst, TunnelId realizedBy) { |
112 | - return null; | 332 | + checkState(networkExists(networkId), "The network has not been added."); |
333 | + Set<VirtualLink> virtualLinkSet = networkIdVirtualLinkSetMap.get(networkId); | ||
334 | + if (virtualLinkSet == null) { | ||
335 | + virtualLinkSet = new HashSet<>(); | ||
336 | + } | ||
337 | + VirtualLink virtualLink = new DefaultVirtualLink(networkId, src, dst, realizedBy); | ||
338 | + virtualLinkSet.add(virtualLink); | ||
339 | + networkIdVirtualLinkSetMap.put(networkId, virtualLinkSet); | ||
340 | + return virtualLink; | ||
113 | } | 341 | } |
114 | 342 | ||
115 | @Override | 343 | @Override |
116 | public void removeLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst) { | 344 | public void removeLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst) { |
345 | + checkState(networkExists(networkId), "The network has not been added."); | ||
346 | + Set<VirtualLink> virtualLinkSet = networkIdVirtualLinkSetMap.get(networkId); | ||
347 | + if (virtualLinkSet != null) { | ||
348 | + networkIdVirtualLinkSetMap.compute(networkId, (id, existingVirtualLinks) -> { | ||
349 | + if (existingVirtualLinks == null || existingVirtualLinks.isEmpty()) { | ||
350 | + return ImmutableSet.of(); | ||
351 | + } else { | ||
352 | + return ImmutableSet.<VirtualLink>builder() | ||
353 | + .addAll(Sets.difference(existingVirtualLinks, | ||
354 | + ImmutableSet.copyOf(virtualLinkSet))) | ||
355 | + .build(); | ||
356 | + } | ||
357 | + }); | ||
358 | + } | ||
117 | } | 359 | } |
118 | 360 | ||
119 | @Override | 361 | @Override |
120 | public VirtualPort addPort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber, Port realizedBy) { | 362 | public VirtualPort addPort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber, Port realizedBy) { |
121 | - return null; | 363 | + checkState(networkExists(networkId), "The network has not been added."); |
364 | + Set<VirtualPort> virtualPortSet = networkIdVirtualPortSetMap.get(networkId); | ||
365 | + if (virtualPortSet == null) { | ||
366 | + virtualPortSet = new HashSet<>(); | ||
367 | + } | ||
368 | + Device device = deviceIdVirtualDeviceMap.get(deviceId); | ||
369 | + checkNotNull(device, "The device has not been created for deviceId: " + deviceId); | ||
370 | + VirtualPort virtualPort = new DefaultVirtualPort(networkId, device, portNumber, realizedBy); | ||
371 | + virtualPortSet.add(virtualPort); | ||
372 | + networkIdVirtualPortSetMap.put(networkId, virtualPortSet); | ||
373 | + return virtualPort; | ||
122 | } | 374 | } |
123 | 375 | ||
124 | @Override | 376 | @Override |
125 | public void removePort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber) { | 377 | public void removePort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber) { |
378 | + checkState(networkExists(networkId), "The network has not been added."); | ||
379 | + Set<VirtualPort> virtualPortSet = networkIdVirtualPortSetMap.get(networkId); | ||
380 | + if (virtualPortSet != null) { | ||
381 | + networkIdVirtualPortSetMap.compute(networkId, (id, existingVirtualPorts) -> { | ||
382 | + if (existingVirtualPorts == null || existingVirtualPorts.isEmpty()) { | ||
383 | + return ImmutableSet.of(); | ||
384 | + } else { | ||
385 | + return ImmutableSet.<VirtualPort>builder() | ||
386 | + .addAll(Sets.difference(existingVirtualPorts, | ||
387 | + ImmutableSet.copyOf(virtualPortSet))) | ||
388 | + .build(); | ||
389 | + } | ||
390 | + }); | ||
391 | + } | ||
126 | } | 392 | } |
127 | 393 | ||
128 | @Override | 394 | @Override |
129 | public Set<VirtualNetwork> getNetworks(TenantId tenantId) { | 395 | public Set<VirtualNetwork> getNetworks(TenantId tenantId) { |
130 | - return null; | 396 | + Set<NetworkId> networkIdSet = tenantIdNetworkIdSetMap.get(tenantId); |
397 | + Set<VirtualNetwork> virtualNetworkSet = new HashSet<>(); | ||
398 | + if (networkIdSet != null) { | ||
399 | + networkIdSet.forEach(networkId -> virtualNetworkSet.add(networkIdVirtualNetworkMap.get(networkId))); | ||
400 | + } | ||
401 | + return ImmutableSet.copyOf(virtualNetworkSet); | ||
131 | } | 402 | } |
132 | 403 | ||
133 | @Override | 404 | @Override |
134 | public Set<VirtualDevice> getDevices(NetworkId networkId) { | 405 | public Set<VirtualDevice> getDevices(NetworkId networkId) { |
135 | - return null; | 406 | + checkState(networkExists(networkId), "The network has not been added."); |
407 | + Set<DeviceId> deviceIdSet = networkIdDeviceIdSetMap.get(networkId); | ||
408 | + Set<VirtualDevice> virtualDeviceSet = new HashSet<>(); | ||
409 | + if (deviceIdSet != null) { | ||
410 | + deviceIdSet.forEach(deviceId -> virtualDeviceSet.add(deviceIdVirtualDeviceMap.get(deviceId))); | ||
411 | + } | ||
412 | + return ImmutableSet.copyOf(virtualDeviceSet); | ||
136 | } | 413 | } |
137 | 414 | ||
138 | @Override | 415 | @Override |
139 | public Set<VirtualLink> getLinks(NetworkId networkId) { | 416 | public Set<VirtualLink> getLinks(NetworkId networkId) { |
140 | - return null; | 417 | + checkState(networkExists(networkId), "The network has not been added."); |
418 | + Set<VirtualLink> virtualLinkSet = new HashSet<>(); | ||
419 | + virtualLinkSet.addAll(networkIdVirtualLinkSetMap.get(networkId)); | ||
420 | + return ImmutableSet.copyOf(virtualLinkSet); | ||
141 | } | 421 | } |
142 | 422 | ||
143 | @Override | 423 | @Override |
144 | public Set<VirtualPort> getPorts(NetworkId networkId, DeviceId deviceId) { | 424 | public Set<VirtualPort> getPorts(NetworkId networkId, DeviceId deviceId) { |
145 | - return null; | 425 | + checkState(networkExists(networkId), "The network has not been added."); |
426 | + Set<VirtualPort> virtualPortSet = new HashSet<>(); | ||
427 | + virtualPortSet.addAll(networkIdVirtualPortSetMap.get(networkId)); | ||
428 | + return ImmutableSet.copyOf(virtualPortSet); | ||
429 | + } | ||
430 | + | ||
431 | + /** | ||
432 | + * Listener class to map listener set events to the virtual network events. | ||
433 | + */ | ||
434 | + private class InternalSetListener implements SetEventListener<TenantId> { | ||
435 | + @Override | ||
436 | + public void event(SetEvent<TenantId> event) { | ||
437 | + VirtualNetworkEvent.Type type = null; | ||
438 | + switch (event.type()) { | ||
439 | + case ADD: | ||
440 | + type = VirtualNetworkEvent.Type.TENANT_REGISTERED; | ||
441 | + break; | ||
442 | + case REMOVE: | ||
443 | + type = VirtualNetworkEvent.Type.TENANT_UNREGISTERED; | ||
444 | + break; | ||
445 | + default: | ||
446 | + log.error("Unsupported event type: " + event.type()); | ||
447 | + } | ||
448 | + notifyDelegate(new VirtualNetworkEvent(type, null)); | ||
449 | + } | ||
450 | + } | ||
451 | + | ||
452 | + /** | ||
453 | + * Listener class to map listener map events to the virtual network events. | ||
454 | + */ | ||
455 | + private class InternalMapListener implements MapEventListener<NetworkId, VirtualNetwork> { | ||
456 | + @Override | ||
457 | + public void event(MapEvent<NetworkId, VirtualNetwork> event) { | ||
458 | + NetworkId networkId = checkNotNull(event.key()); | ||
459 | + VirtualNetworkEvent.Type type = null; | ||
460 | + switch (event.type()) { | ||
461 | + case INSERT: | ||
462 | + type = VirtualNetworkEvent.Type.NETWORK_ADDED; | ||
463 | + break; | ||
464 | + case UPDATE: | ||
465 | + if ((event.oldValue().value() != null) && (event.newValue().value() == null)) { | ||
466 | + type = VirtualNetworkEvent.Type.NETWORK_REMOVED; | ||
467 | + } else { | ||
468 | + type = VirtualNetworkEvent.Type.NETWORK_UPDATED; | ||
469 | + } | ||
470 | + break; | ||
471 | + case REMOVE: | ||
472 | + type = VirtualNetworkEvent.Type.NETWORK_REMOVED; | ||
473 | + break; | ||
474 | + default: | ||
475 | + log.error("Unsupported event type: " + event.type()); | ||
476 | + } | ||
477 | + notifyDelegate(new VirtualNetworkEvent(type, networkId)); | ||
478 | + } | ||
146 | } | 479 | } |
147 | } | 480 | } | ... | ... |
-
Please register or login to post a comment