remove Hazelcast based Device, Link, .. Store implementation bundle
Change-Id: I352ebaed2d51b51201a8f3abc609be7c793cc3be
Showing
13 changed files
with
0 additions
and
993 deletions
core/store/hz/net/pom.xml
deleted
100644 → 0
1 | -<?xml version="1.0" encoding="UTF-8"?> | ||
2 | -<project xmlns="http://maven.apache.org/POM/4.0.0" | ||
3 | - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
4 | - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> | ||
5 | - <modelVersion>4.0.0</modelVersion> | ||
6 | - | ||
7 | - <parent> | ||
8 | - <groupId>org.onlab.onos</groupId> | ||
9 | - <artifactId>onos-core-hz</artifactId> | ||
10 | - <version>1.0.0-SNAPSHOT</version> | ||
11 | - <relativePath>../pom.xml</relativePath> | ||
12 | - </parent> | ||
13 | - | ||
14 | - <artifactId>onos-core-hz-net</artifactId> | ||
15 | - <packaging>bundle</packaging> | ||
16 | - | ||
17 | - <description>ONOS Hazelcast based distributed store subsystems</description> | ||
18 | - | ||
19 | - <dependencies> | ||
20 | - <dependency> | ||
21 | - <groupId>org.onlab.onos</groupId> | ||
22 | - <artifactId>onos-api</artifactId> | ||
23 | - </dependency> | ||
24 | - <dependency> | ||
25 | - <groupId>org.onlab.onos</groupId> | ||
26 | - <artifactId>onos-core-hz-common</artifactId> | ||
27 | - <version>${project.version}</version> | ||
28 | - </dependency> | ||
29 | - <dependency> | ||
30 | - <groupId>org.onlab.onos</groupId> | ||
31 | - <artifactId>onos-core-hz-common</artifactId> | ||
32 | - <classifier>tests</classifier> | ||
33 | - <scope>test</scope> | ||
34 | - <version>${project.version}</version> | ||
35 | - </dependency> | ||
36 | - <dependency> | ||
37 | - <groupId>org.apache.felix</groupId> | ||
38 | - <artifactId>org.apache.felix.scr.annotations</artifactId> | ||
39 | - </dependency> | ||
40 | - <dependency> | ||
41 | - <groupId>com.hazelcast</groupId> | ||
42 | - <artifactId>hazelcast</artifactId> | ||
43 | - </dependency> | ||
44 | - </dependencies> | ||
45 | - | ||
46 | - <build> | ||
47 | - <plugins> | ||
48 | - <plugin> | ||
49 | - <groupId>org.apache.felix</groupId> | ||
50 | - <artifactId>maven-scr-plugin</artifactId> | ||
51 | - </plugin> | ||
52 | - </plugins> | ||
53 | - </build> | ||
54 | - | ||
55 | -</project> |
core/store/hz/net/src/main/java/org/onlab/onos/store/device/impl/DistributedDeviceStore.java
deleted
100644 → 0
This diff is collapsed. Click to expand it.
1 | -package org.onlab.onos.store.device.impl; | ||
2 | - | ||
3 | -import org.apache.felix.scr.annotations.Component; | ||
4 | -import org.apache.felix.scr.annotations.Service; | ||
5 | -import org.onlab.onos.mastership.MastershipTerm; | ||
6 | -import org.onlab.onos.net.DeviceId; | ||
7 | -import org.onlab.onos.net.device.DeviceClockProviderService; | ||
8 | - | ||
9 | -// FIXME: Code clone in onos-core-trivial, onos-core-hz-net | ||
10 | -/** | ||
11 | - * Dummy implementation of {@link DeviceClockProviderService}. | ||
12 | - */ | ||
13 | -@Component(immediate = true) | ||
14 | -@Service | ||
15 | -public class NoOpClockProviderService implements DeviceClockProviderService { | ||
16 | - | ||
17 | - @Override | ||
18 | - public void setMastershipTerm(DeviceId deviceId, MastershipTerm term) { | ||
19 | - } | ||
20 | -} |
core/store/hz/net/src/main/java/org/onlab/onos/store/flow/impl/DistributedFlowRuleStore.java
deleted
100644 → 0
1 | -package org.onlab.onos.store.flow.impl; | ||
2 | - | ||
3 | -import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_REMOVED; | ||
4 | -import static org.slf4j.LoggerFactory.getLogger; | ||
5 | - | ||
6 | -import java.util.Collection; | ||
7 | -import java.util.Collections; | ||
8 | - | ||
9 | -import org.apache.felix.scr.annotations.Activate; | ||
10 | -import org.apache.felix.scr.annotations.Component; | ||
11 | -import org.apache.felix.scr.annotations.Deactivate; | ||
12 | -import org.apache.felix.scr.annotations.Service; | ||
13 | -import org.onlab.onos.ApplicationId; | ||
14 | -import org.onlab.onos.net.DeviceId; | ||
15 | -import org.onlab.onos.net.flow.DefaultFlowEntry; | ||
16 | -import org.onlab.onos.net.flow.FlowEntry; | ||
17 | -import org.onlab.onos.net.flow.FlowEntry.FlowEntryState; | ||
18 | -import org.onlab.onos.net.flow.FlowRule; | ||
19 | -import org.onlab.onos.net.flow.FlowRuleEvent; | ||
20 | -import org.onlab.onos.net.flow.FlowRuleEvent.Type; | ||
21 | -import org.onlab.onos.net.flow.FlowRuleStore; | ||
22 | -import org.onlab.onos.net.flow.FlowRuleStoreDelegate; | ||
23 | -import org.onlab.onos.store.AbstractStore; | ||
24 | -import org.slf4j.Logger; | ||
25 | - | ||
26 | -import com.google.common.collect.ArrayListMultimap; | ||
27 | -import com.google.common.collect.ImmutableSet; | ||
28 | -import com.google.common.collect.Multimap; | ||
29 | - | ||
30 | -/** | ||
31 | - * Manages inventory of flow rules using trivial in-memory implementation. | ||
32 | - */ | ||
33 | -//FIXME I LIE. I AIN'T DISTRIBUTED | ||
34 | -@Component(immediate = true) | ||
35 | -@Service | ||
36 | -public class DistributedFlowRuleStore | ||
37 | - extends AbstractStore<FlowRuleEvent, FlowRuleStoreDelegate> | ||
38 | - implements FlowRuleStore { | ||
39 | - | ||
40 | - private final Logger log = getLogger(getClass()); | ||
41 | - | ||
42 | - // store entries as a pile of rules, no info about device tables | ||
43 | - private final Multimap<DeviceId, FlowEntry> flowEntries = | ||
44 | - ArrayListMultimap.<DeviceId, FlowEntry>create(); | ||
45 | - | ||
46 | - private final Multimap<Short, FlowRule> flowEntriesById = | ||
47 | - ArrayListMultimap.<Short, FlowRule>create(); | ||
48 | - | ||
49 | - @Activate | ||
50 | - public void activate() { | ||
51 | - log.info("Started"); | ||
52 | - } | ||
53 | - | ||
54 | - @Deactivate | ||
55 | - public void deactivate() { | ||
56 | - log.info("Stopped"); | ||
57 | - } | ||
58 | - | ||
59 | - | ||
60 | - @Override | ||
61 | - public int getFlowRuleCount() { | ||
62 | - return flowEntries.size(); | ||
63 | - } | ||
64 | - | ||
65 | - @Override | ||
66 | - public synchronized FlowEntry getFlowEntry(FlowRule rule) { | ||
67 | - for (FlowEntry f : flowEntries.get(rule.deviceId())) { | ||
68 | - if (f.equals(rule)) { | ||
69 | - return f; | ||
70 | - } | ||
71 | - } | ||
72 | - return null; | ||
73 | - } | ||
74 | - | ||
75 | - @Override | ||
76 | - public synchronized Iterable<FlowEntry> getFlowEntries(DeviceId deviceId) { | ||
77 | - Collection<FlowEntry> rules = flowEntries.get(deviceId); | ||
78 | - if (rules == null) { | ||
79 | - return Collections.emptyList(); | ||
80 | - } | ||
81 | - return ImmutableSet.copyOf(rules); | ||
82 | - } | ||
83 | - | ||
84 | - @Override | ||
85 | - public synchronized Iterable<FlowRule> getFlowRulesByAppId(ApplicationId appId) { | ||
86 | - Collection<FlowRule> rules = flowEntriesById.get(appId.id()); | ||
87 | - if (rules == null) { | ||
88 | - return Collections.emptyList(); | ||
89 | - } | ||
90 | - return ImmutableSet.copyOf(rules); | ||
91 | - } | ||
92 | - | ||
93 | - @Override | ||
94 | - public synchronized void storeFlowRule(FlowRule rule) { | ||
95 | - FlowEntry f = new DefaultFlowEntry(rule); | ||
96 | - DeviceId did = f.deviceId(); | ||
97 | - if (!flowEntries.containsEntry(did, f)) { | ||
98 | - flowEntries.put(did, f); | ||
99 | - flowEntriesById.put(rule.appId(), f); | ||
100 | - } | ||
101 | - } | ||
102 | - | ||
103 | - @Override | ||
104 | - public synchronized void deleteFlowRule(FlowRule rule) { | ||
105 | - FlowEntry entry = getFlowEntry(rule); | ||
106 | - if (entry == null) { | ||
107 | - return; | ||
108 | - } | ||
109 | - entry.setState(FlowEntryState.PENDING_REMOVE); | ||
110 | - } | ||
111 | - | ||
112 | - @Override | ||
113 | - public synchronized FlowRuleEvent addOrUpdateFlowRule(FlowEntry rule) { | ||
114 | - DeviceId did = rule.deviceId(); | ||
115 | - | ||
116 | - // check if this new rule is an update to an existing entry | ||
117 | - FlowEntry stored = getFlowEntry(rule); | ||
118 | - if (stored != null) { | ||
119 | - stored.setBytes(rule.bytes()); | ||
120 | - stored.setLife(rule.life()); | ||
121 | - stored.setPackets(rule.packets()); | ||
122 | - if (stored.state() == FlowEntryState.PENDING_ADD) { | ||
123 | - stored.setState(FlowEntryState.ADDED); | ||
124 | - return new FlowRuleEvent(Type.RULE_ADDED, rule); | ||
125 | - } | ||
126 | - return new FlowRuleEvent(Type.RULE_UPDATED, rule); | ||
127 | - } | ||
128 | - | ||
129 | - flowEntries.put(did, rule); | ||
130 | - return null; | ||
131 | - } | ||
132 | - | ||
133 | - @Override | ||
134 | - public synchronized FlowRuleEvent removeFlowRule(FlowEntry rule) { | ||
135 | - // This is where one could mark a rule as removed and still keep it in the store. | ||
136 | - if (flowEntries.remove(rule.deviceId(), rule)) { | ||
137 | - return new FlowRuleEvent(RULE_REMOVED, rule); | ||
138 | - } else { | ||
139 | - return null; | ||
140 | - } | ||
141 | - } | ||
142 | -} |
core/store/hz/net/src/main/java/org/onlab/onos/store/host/impl/DistributedHostStore.java
deleted
100644 → 0
1 | -package org.onlab.onos.store.host.impl; | ||
2 | - | ||
3 | -import com.google.common.collect.HashMultimap; | ||
4 | -import com.google.common.collect.ImmutableSet; | ||
5 | -import com.google.common.collect.Multimap; | ||
6 | -import com.google.common.collect.Sets; | ||
7 | -import org.apache.felix.scr.annotations.Activate; | ||
8 | -import org.apache.felix.scr.annotations.Component; | ||
9 | -import org.apache.felix.scr.annotations.Deactivate; | ||
10 | -import org.apache.felix.scr.annotations.Service; | ||
11 | -import org.onlab.onos.net.Annotations; | ||
12 | -import org.onlab.onos.net.ConnectPoint; | ||
13 | -import org.onlab.onos.net.DefaultHost; | ||
14 | -import org.onlab.onos.net.DeviceId; | ||
15 | -import org.onlab.onos.net.Host; | ||
16 | -import org.onlab.onos.net.HostId; | ||
17 | -import org.onlab.onos.net.HostLocation; | ||
18 | -import org.onlab.onos.net.host.HostDescription; | ||
19 | -import org.onlab.onos.net.host.HostEvent; | ||
20 | -import org.onlab.onos.net.host.HostStore; | ||
21 | -import org.onlab.onos.net.host.HostStoreDelegate; | ||
22 | -import org.onlab.onos.net.host.PortAddresses; | ||
23 | -import org.onlab.onos.net.provider.ProviderId; | ||
24 | -import org.onlab.onos.store.AbstractStore; | ||
25 | -import org.onlab.packet.IpPrefix; | ||
26 | -import org.onlab.packet.MacAddress; | ||
27 | -import org.onlab.packet.VlanId; | ||
28 | -import org.slf4j.Logger; | ||
29 | - | ||
30 | -import java.util.HashSet; | ||
31 | -import java.util.Map; | ||
32 | -import java.util.Set; | ||
33 | -import java.util.concurrent.ConcurrentHashMap; | ||
34 | - | ||
35 | -import static org.onlab.onos.net.host.HostEvent.Type.*; | ||
36 | -import static org.slf4j.LoggerFactory.getLogger; | ||
37 | - | ||
38 | -/** | ||
39 | - * TEMPORARY: Manages inventory of end-station hosts using distributed | ||
40 | - * structures implementation. | ||
41 | - */ | ||
42 | -//FIXME: I LIE I AM NOT DISTRIBUTED | ||
43 | -@Component(immediate = true) | ||
44 | -@Service | ||
45 | -public class DistributedHostStore | ||
46 | - extends AbstractStore<HostEvent, HostStoreDelegate> | ||
47 | - implements HostStore { | ||
48 | - | ||
49 | - private final Logger log = getLogger(getClass()); | ||
50 | - | ||
51 | - // Host inventory | ||
52 | - private final Map<HostId, StoredHost> hosts = new ConcurrentHashMap<>(2000000, 0.75f, 16); | ||
53 | - | ||
54 | - // Hosts tracked by their location | ||
55 | - private final Multimap<ConnectPoint, Host> locations = HashMultimap.create(); | ||
56 | - | ||
57 | - private final Map<ConnectPoint, PortAddresses> portAddresses = | ||
58 | - new ConcurrentHashMap<>(); | ||
59 | - | ||
60 | - @Activate | ||
61 | - public void activate() { | ||
62 | - log.info("Started"); | ||
63 | - } | ||
64 | - | ||
65 | - @Deactivate | ||
66 | - public void deactivate() { | ||
67 | - log.info("Stopped"); | ||
68 | - } | ||
69 | - | ||
70 | - @Override | ||
71 | - public HostEvent createOrUpdateHost(ProviderId providerId, HostId hostId, | ||
72 | - HostDescription hostDescription) { | ||
73 | - StoredHost host = hosts.get(hostId); | ||
74 | - if (host == null) { | ||
75 | - return createHost(providerId, hostId, hostDescription); | ||
76 | - } | ||
77 | - return updateHost(providerId, host, hostDescription); | ||
78 | - } | ||
79 | - | ||
80 | - // creates a new host and sends HOST_ADDED | ||
81 | - private HostEvent createHost(ProviderId providerId, HostId hostId, | ||
82 | - HostDescription descr) { | ||
83 | - StoredHost newhost = new StoredHost(providerId, hostId, | ||
84 | - descr.hwAddress(), | ||
85 | - descr.vlan(), | ||
86 | - descr.location(), | ||
87 | - ImmutableSet.copyOf(descr.ipAddress())); | ||
88 | - synchronized (this) { | ||
89 | - hosts.put(hostId, newhost); | ||
90 | - locations.put(descr.location(), newhost); | ||
91 | - } | ||
92 | - return new HostEvent(HOST_ADDED, newhost); | ||
93 | - } | ||
94 | - | ||
95 | - // checks for type of update to host, sends appropriate event | ||
96 | - private HostEvent updateHost(ProviderId providerId, StoredHost host, | ||
97 | - HostDescription descr) { | ||
98 | - HostEvent event; | ||
99 | - if (!host.location().equals(descr.location())) { | ||
100 | - host.setLocation(descr.location()); | ||
101 | - return new HostEvent(HOST_MOVED, host); | ||
102 | - } | ||
103 | - | ||
104 | - if (host.ipAddresses().containsAll(descr.ipAddress())) { | ||
105 | - return null; | ||
106 | - } | ||
107 | - | ||
108 | - Set<IpPrefix> addresses = new HashSet<>(host.ipAddresses()); | ||
109 | - addresses.addAll(descr.ipAddress()); | ||
110 | - StoredHost updated = new StoredHost(providerId, host.id(), | ||
111 | - host.mac(), host.vlan(), | ||
112 | - descr.location(), addresses); | ||
113 | - event = new HostEvent(HOST_UPDATED, updated); | ||
114 | - synchronized (this) { | ||
115 | - hosts.put(host.id(), updated); | ||
116 | - locations.remove(host.location(), host); | ||
117 | - locations.put(updated.location(), updated); | ||
118 | - } | ||
119 | - return event; | ||
120 | - } | ||
121 | - | ||
122 | - @Override | ||
123 | - public HostEvent removeHost(HostId hostId) { | ||
124 | - synchronized (this) { | ||
125 | - Host host = hosts.remove(hostId); | ||
126 | - if (host != null) { | ||
127 | - locations.remove((host.location()), host); | ||
128 | - return new HostEvent(HOST_REMOVED, host); | ||
129 | - } | ||
130 | - return null; | ||
131 | - } | ||
132 | - } | ||
133 | - | ||
134 | - @Override | ||
135 | - public int getHostCount() { | ||
136 | - return hosts.size(); | ||
137 | - } | ||
138 | - | ||
139 | - @Override | ||
140 | - public Iterable<Host> getHosts() { | ||
141 | - return ImmutableSet.<Host>copyOf(hosts.values()); | ||
142 | - } | ||
143 | - | ||
144 | - @Override | ||
145 | - public Host getHost(HostId hostId) { | ||
146 | - return hosts.get(hostId); | ||
147 | - } | ||
148 | - | ||
149 | - @Override | ||
150 | - public Set<Host> getHosts(VlanId vlanId) { | ||
151 | - Set<Host> vlanset = new HashSet<>(); | ||
152 | - for (Host h : hosts.values()) { | ||
153 | - if (h.vlan().equals(vlanId)) { | ||
154 | - vlanset.add(h); | ||
155 | - } | ||
156 | - } | ||
157 | - return vlanset; | ||
158 | - } | ||
159 | - | ||
160 | - @Override | ||
161 | - public Set<Host> getHosts(MacAddress mac) { | ||
162 | - Set<Host> macset = new HashSet<>(); | ||
163 | - for (Host h : hosts.values()) { | ||
164 | - if (h.mac().equals(mac)) { | ||
165 | - macset.add(h); | ||
166 | - } | ||
167 | - } | ||
168 | - return macset; | ||
169 | - } | ||
170 | - | ||
171 | - @Override | ||
172 | - public Set<Host> getHosts(IpPrefix ip) { | ||
173 | - Set<Host> ipset = new HashSet<>(); | ||
174 | - for (Host h : hosts.values()) { | ||
175 | - if (h.ipAddresses().contains(ip)) { | ||
176 | - ipset.add(h); | ||
177 | - } | ||
178 | - } | ||
179 | - return ipset; | ||
180 | - } | ||
181 | - | ||
182 | - @Override | ||
183 | - public Set<Host> getConnectedHosts(ConnectPoint connectPoint) { | ||
184 | - return ImmutableSet.copyOf(locations.get(connectPoint)); | ||
185 | - } | ||
186 | - | ||
187 | - @Override | ||
188 | - public Set<Host> getConnectedHosts(DeviceId deviceId) { | ||
189 | - Set<Host> hostset = new HashSet<>(); | ||
190 | - for (ConnectPoint p : locations.keySet()) { | ||
191 | - if (p.deviceId().equals(deviceId)) { | ||
192 | - hostset.addAll(locations.get(p)); | ||
193 | - } | ||
194 | - } | ||
195 | - return hostset; | ||
196 | - } | ||
197 | - | ||
198 | - @Override | ||
199 | - public void updateAddressBindings(PortAddresses addresses) { | ||
200 | - synchronized (portAddresses) { | ||
201 | - PortAddresses existing = portAddresses.get(addresses.connectPoint()); | ||
202 | - if (existing == null) { | ||
203 | - portAddresses.put(addresses.connectPoint(), addresses); | ||
204 | - } else { | ||
205 | - Set<IpPrefix> union = Sets.union(existing.ips(), addresses.ips()) | ||
206 | - .immutableCopy(); | ||
207 | - | ||
208 | - MacAddress newMac = (addresses.mac() == null) ? existing.mac() | ||
209 | - : addresses.mac(); | ||
210 | - | ||
211 | - PortAddresses newAddresses = | ||
212 | - new PortAddresses(addresses.connectPoint(), union, newMac); | ||
213 | - | ||
214 | - portAddresses.put(newAddresses.connectPoint(), newAddresses); | ||
215 | - } | ||
216 | - } | ||
217 | - } | ||
218 | - | ||
219 | - @Override | ||
220 | - public void removeAddressBindings(PortAddresses addresses) { | ||
221 | - synchronized (portAddresses) { | ||
222 | - PortAddresses existing = portAddresses.get(addresses.connectPoint()); | ||
223 | - if (existing != null) { | ||
224 | - Set<IpPrefix> difference = | ||
225 | - Sets.difference(existing.ips(), addresses.ips()).immutableCopy(); | ||
226 | - | ||
227 | - // If they removed the existing mac, set the new mac to null. | ||
228 | - // Otherwise, keep the existing mac. | ||
229 | - MacAddress newMac = existing.mac(); | ||
230 | - if (addresses.mac() != null && addresses.mac().equals(existing.mac())) { | ||
231 | - newMac = null; | ||
232 | - } | ||
233 | - | ||
234 | - PortAddresses newAddresses = | ||
235 | - new PortAddresses(addresses.connectPoint(), difference, newMac); | ||
236 | - | ||
237 | - portAddresses.put(newAddresses.connectPoint(), newAddresses); | ||
238 | - } | ||
239 | - } | ||
240 | - } | ||
241 | - | ||
242 | - @Override | ||
243 | - public void clearAddressBindings(ConnectPoint connectPoint) { | ||
244 | - synchronized (portAddresses) { | ||
245 | - portAddresses.remove(connectPoint); | ||
246 | - } | ||
247 | - } | ||
248 | - | ||
249 | - @Override | ||
250 | - public Set<PortAddresses> getAddressBindings() { | ||
251 | - synchronized (portAddresses) { | ||
252 | - return new HashSet<>(portAddresses.values()); | ||
253 | - } | ||
254 | - } | ||
255 | - | ||
256 | - @Override | ||
257 | - public PortAddresses getAddressBindingsForPort(ConnectPoint connectPoint) { | ||
258 | - PortAddresses addresses; | ||
259 | - | ||
260 | - synchronized (portAddresses) { | ||
261 | - addresses = portAddresses.get(connectPoint); | ||
262 | - } | ||
263 | - | ||
264 | - if (addresses == null) { | ||
265 | - addresses = new PortAddresses(connectPoint, null, null); | ||
266 | - } | ||
267 | - | ||
268 | - return addresses; | ||
269 | - } | ||
270 | - | ||
271 | - // Auxiliary extension to allow location to mutate. | ||
272 | - private class StoredHost extends DefaultHost { | ||
273 | - private HostLocation location; | ||
274 | - | ||
275 | - /** | ||
276 | - * Creates an end-station host using the supplied information. | ||
277 | - * | ||
278 | - * @param providerId provider identity | ||
279 | - * @param id host identifier | ||
280 | - * @param mac host MAC address | ||
281 | - * @param vlan host VLAN identifier | ||
282 | - * @param location host location | ||
283 | - * @param ips host IP addresses | ||
284 | - * @param annotations optional key/value annotations | ||
285 | - */ | ||
286 | - public StoredHost(ProviderId providerId, HostId id, | ||
287 | - MacAddress mac, VlanId vlan, HostLocation location, | ||
288 | - Set<IpPrefix> ips, Annotations... annotations) { | ||
289 | - super(providerId, id, mac, vlan, location, ips, annotations); | ||
290 | - this.location = location; | ||
291 | - } | ||
292 | - | ||
293 | - void setLocation(HostLocation location) { | ||
294 | - this.location = location; | ||
295 | - } | ||
296 | - | ||
297 | - @Override | ||
298 | - public HostLocation location() { | ||
299 | - return location; | ||
300 | - } | ||
301 | - } | ||
302 | -} |
core/store/hz/net/src/main/java/org/onlab/onos/store/link/impl/DistributedLinkStore.java
deleted
100644 → 0
1 | -package org.onlab.onos.store.link.impl; | ||
2 | - | ||
3 | -import static com.google.common.cache.CacheBuilder.newBuilder; | ||
4 | -import static org.onlab.onos.net.Link.Type.DIRECT; | ||
5 | -import static org.onlab.onos.net.Link.Type.INDIRECT; | ||
6 | -import static org.onlab.onos.net.LinkKey.linkKey; | ||
7 | -import static org.onlab.onos.net.link.LinkEvent.Type.LINK_ADDED; | ||
8 | -import static org.onlab.onos.net.link.LinkEvent.Type.LINK_REMOVED; | ||
9 | -import static org.onlab.onos.net.link.LinkEvent.Type.LINK_UPDATED; | ||
10 | -import static org.slf4j.LoggerFactory.getLogger; | ||
11 | - | ||
12 | -import java.util.HashSet; | ||
13 | -import java.util.Set; | ||
14 | - | ||
15 | -import org.apache.felix.scr.annotations.Activate; | ||
16 | -import org.apache.felix.scr.annotations.Component; | ||
17 | -import org.apache.felix.scr.annotations.Deactivate; | ||
18 | -import org.apache.felix.scr.annotations.Service; | ||
19 | -import org.onlab.onos.net.ConnectPoint; | ||
20 | -import org.onlab.onos.net.DefaultLink; | ||
21 | -import org.onlab.onos.net.DeviceId; | ||
22 | -import org.onlab.onos.net.Link; | ||
23 | -import org.onlab.onos.net.LinkKey; | ||
24 | -import org.onlab.onos.net.link.LinkDescription; | ||
25 | -import org.onlab.onos.net.link.LinkEvent; | ||
26 | -import org.onlab.onos.net.link.LinkStore; | ||
27 | -import org.onlab.onos.net.link.LinkStoreDelegate; | ||
28 | -import org.onlab.onos.net.provider.ProviderId; | ||
29 | -import org.onlab.onos.store.common.AbsentInvalidatingLoadingCache; | ||
30 | -import org.onlab.onos.store.common.AbstractHazelcastStore; | ||
31 | -import org.onlab.onos.store.common.OptionalCacheLoader; | ||
32 | -import org.slf4j.Logger; | ||
33 | - | ||
34 | -import com.google.common.base.Optional; | ||
35 | -import com.google.common.cache.LoadingCache; | ||
36 | -import com.google.common.collect.HashMultimap; | ||
37 | -import com.google.common.collect.ImmutableSet; | ||
38 | -import com.google.common.collect.Multimap; | ||
39 | -import com.google.common.collect.ImmutableSet.Builder; | ||
40 | -import com.hazelcast.core.IMap; | ||
41 | - | ||
42 | -//TODO: Add support for multiple provider and annotations | ||
43 | -/** | ||
44 | - * Manages inventory of infrastructure links using Hazelcast-backed map. | ||
45 | - */ | ||
46 | -@Component(immediate = true) | ||
47 | -@Service | ||
48 | -public class DistributedLinkStore | ||
49 | - extends AbstractHazelcastStore<LinkEvent, LinkStoreDelegate> | ||
50 | - implements LinkStore { | ||
51 | - | ||
52 | - private final Logger log = getLogger(getClass()); | ||
53 | - | ||
54 | - // Link inventory | ||
55 | - private IMap<byte[], byte[]> rawLinks; | ||
56 | - private LoadingCache<LinkKey, Optional<DefaultLink>> links; | ||
57 | - | ||
58 | - // TODO synchronize? | ||
59 | - // Egress and ingress link sets | ||
60 | - private final Multimap<DeviceId, Link> srcLinks = HashMultimap.create(); | ||
61 | - private final Multimap<DeviceId, Link> dstLinks = HashMultimap.create(); | ||
62 | - | ||
63 | - private String linksListener; | ||
64 | - | ||
65 | - @Override | ||
66 | - @Activate | ||
67 | - public void activate() { | ||
68 | - super.activate(); | ||
69 | - | ||
70 | - boolean includeValue = true; | ||
71 | - | ||
72 | - // TODO decide on Map name scheme to avoid collision | ||
73 | - rawLinks = theInstance.getMap("links"); | ||
74 | - final OptionalCacheLoader<LinkKey, DefaultLink> linkLoader | ||
75 | - = new OptionalCacheLoader<>(serializer, rawLinks); | ||
76 | - links = new AbsentInvalidatingLoadingCache<>(newBuilder().build(linkLoader)); | ||
77 | - // refresh/populate cache based on notification from other instance | ||
78 | - linksListener = rawLinks.addEntryListener(new RemoteLinkEventHandler(links), includeValue); | ||
79 | - | ||
80 | - loadLinkCache(); | ||
81 | - | ||
82 | - log.info("Started"); | ||
83 | - } | ||
84 | - | ||
85 | - @Deactivate | ||
86 | - public void deactivate() { | ||
87 | - rawLinks.removeEntryListener(linksListener); | ||
88 | - log.info("Stopped"); | ||
89 | - } | ||
90 | - | ||
91 | - private void loadLinkCache() { | ||
92 | - for (byte[] keyBytes : rawLinks.keySet()) { | ||
93 | - final LinkKey id = deserialize(keyBytes); | ||
94 | - links.refresh(id); | ||
95 | - } | ||
96 | - } | ||
97 | - | ||
98 | - @Override | ||
99 | - public int getLinkCount() { | ||
100 | - return links.asMap().size(); | ||
101 | - } | ||
102 | - | ||
103 | - @Override | ||
104 | - public Iterable<Link> getLinks() { | ||
105 | - Builder<Link> builder = ImmutableSet.builder(); | ||
106 | - for (Optional<DefaultLink> e : links.asMap().values()) { | ||
107 | - if (e.isPresent()) { | ||
108 | - builder.add(e.get()); | ||
109 | - } | ||
110 | - } | ||
111 | - return builder.build(); | ||
112 | - } | ||
113 | - | ||
114 | - @Override | ||
115 | - public Set<Link> getDeviceEgressLinks(DeviceId deviceId) { | ||
116 | - return ImmutableSet.copyOf(srcLinks.get(deviceId)); | ||
117 | - } | ||
118 | - | ||
119 | - @Override | ||
120 | - public Set<Link> getDeviceIngressLinks(DeviceId deviceId) { | ||
121 | - return ImmutableSet.copyOf(dstLinks.get(deviceId)); | ||
122 | - } | ||
123 | - | ||
124 | - @Override | ||
125 | - public Link getLink(ConnectPoint src, ConnectPoint dst) { | ||
126 | - return links.getUnchecked(linkKey(src, dst)).orNull(); | ||
127 | - } | ||
128 | - | ||
129 | - @Override | ||
130 | - public Set<Link> getEgressLinks(ConnectPoint src) { | ||
131 | - Set<Link> egress = new HashSet<>(); | ||
132 | - for (Link link : srcLinks.get(src.deviceId())) { | ||
133 | - if (link.src().equals(src)) { | ||
134 | - egress.add(link); | ||
135 | - } | ||
136 | - } | ||
137 | - return egress; | ||
138 | - } | ||
139 | - | ||
140 | - @Override | ||
141 | - public Set<Link> getIngressLinks(ConnectPoint dst) { | ||
142 | - Set<Link> ingress = new HashSet<>(); | ||
143 | - for (Link link : dstLinks.get(dst.deviceId())) { | ||
144 | - if (link.dst().equals(dst)) { | ||
145 | - ingress.add(link); | ||
146 | - } | ||
147 | - } | ||
148 | - return ingress; | ||
149 | - } | ||
150 | - | ||
151 | - @Override | ||
152 | - public LinkEvent createOrUpdateLink(ProviderId providerId, | ||
153 | - LinkDescription linkDescription) { | ||
154 | - LinkKey key = linkKey(linkDescription.src(), linkDescription.dst()); | ||
155 | - Optional<DefaultLink> link = links.getUnchecked(key); | ||
156 | - if (!link.isPresent()) { | ||
157 | - return createLink(providerId, key, linkDescription); | ||
158 | - } | ||
159 | - return updateLink(providerId, link.get(), key, linkDescription); | ||
160 | - } | ||
161 | - | ||
162 | - // Creates and stores the link and returns the appropriate event. | ||
163 | - private LinkEvent createLink(ProviderId providerId, LinkKey key, | ||
164 | - LinkDescription linkDescription) { | ||
165 | - DefaultLink link = new DefaultLink(providerId, key.src(), key.dst(), | ||
166 | - linkDescription.type()); | ||
167 | - synchronized (this) { | ||
168 | - final byte[] keyBytes = serialize(key); | ||
169 | - rawLinks.put(keyBytes, serialize(link)); | ||
170 | - links.asMap().putIfAbsent(key, Optional.of(link)); | ||
171 | - | ||
172 | - addNewLink(link); | ||
173 | - } | ||
174 | - return new LinkEvent(LINK_ADDED, link); | ||
175 | - } | ||
176 | - | ||
177 | - // update Egress and ingress link sets | ||
178 | - private void addNewLink(DefaultLink link) { | ||
179 | - synchronized (this) { | ||
180 | - srcLinks.put(link.src().deviceId(), link); | ||
181 | - dstLinks.put(link.dst().deviceId(), link); | ||
182 | - } | ||
183 | - } | ||
184 | - | ||
185 | - // Updates, if necessary the specified link and returns the appropriate event. | ||
186 | - private LinkEvent updateLink(ProviderId providerId, DefaultLink link, | ||
187 | - LinkKey key, LinkDescription linkDescription) { | ||
188 | - // FIXME confirm Link update condition is OK | ||
189 | - if (link.type() == INDIRECT && linkDescription.type() == DIRECT) { | ||
190 | - synchronized (this) { | ||
191 | - | ||
192 | - DefaultLink updated = | ||
193 | - new DefaultLink(providerId, link.src(), link.dst(), | ||
194 | - linkDescription.type()); | ||
195 | - final byte[] keyBytes = serialize(key); | ||
196 | - rawLinks.put(keyBytes, serialize(updated)); | ||
197 | - links.asMap().replace(key, Optional.of(link), Optional.of(updated)); | ||
198 | - | ||
199 | - replaceLink(link, updated); | ||
200 | - return new LinkEvent(LINK_UPDATED, updated); | ||
201 | - } | ||
202 | - } | ||
203 | - return null; | ||
204 | - } | ||
205 | - | ||
206 | - // update Egress and ingress link sets | ||
207 | - private void replaceLink(DefaultLink link, DefaultLink updated) { | ||
208 | - synchronized (this) { | ||
209 | - srcLinks.remove(link.src().deviceId(), link); | ||
210 | - dstLinks.remove(link.dst().deviceId(), link); | ||
211 | - | ||
212 | - srcLinks.put(link.src().deviceId(), updated); | ||
213 | - dstLinks.put(link.dst().deviceId(), updated); | ||
214 | - } | ||
215 | - } | ||
216 | - | ||
217 | - @Override | ||
218 | - public LinkEvent removeLink(ConnectPoint src, ConnectPoint dst) { | ||
219 | - synchronized (this) { | ||
220 | - LinkKey key = linkKey(src, dst); | ||
221 | - byte[] keyBytes = serialize(key); | ||
222 | - Link link = deserialize(rawLinks.remove(keyBytes)); | ||
223 | - links.invalidate(key); | ||
224 | - if (link != null) { | ||
225 | - removeLink(link); | ||
226 | - return new LinkEvent(LINK_REMOVED, link); | ||
227 | - } | ||
228 | - return null; | ||
229 | - } | ||
230 | - } | ||
231 | - | ||
232 | - // update Egress and ingress link sets | ||
233 | - private void removeLink(Link link) { | ||
234 | - synchronized (this) { | ||
235 | - srcLinks.remove(link.src().deviceId(), link); | ||
236 | - dstLinks.remove(link.dst().deviceId(), link); | ||
237 | - } | ||
238 | - } | ||
239 | - | ||
240 | - private class RemoteLinkEventHandler extends RemoteCacheEventHandler<LinkKey, DefaultLink> { | ||
241 | - public RemoteLinkEventHandler(LoadingCache<LinkKey, Optional<DefaultLink>> cache) { | ||
242 | - super(cache); | ||
243 | - } | ||
244 | - | ||
245 | - @Override | ||
246 | - protected void onAdd(LinkKey key, DefaultLink newVal) { | ||
247 | - addNewLink(newVal); | ||
248 | - notifyDelegate(new LinkEvent(LINK_ADDED, newVal)); | ||
249 | - } | ||
250 | - | ||
251 | - @Override | ||
252 | - protected void onUpdate(LinkKey key, DefaultLink oldVal, DefaultLink newVal) { | ||
253 | - replaceLink(oldVal, newVal); | ||
254 | - notifyDelegate(new LinkEvent(LINK_UPDATED, newVal)); | ||
255 | - } | ||
256 | - | ||
257 | - @Override | ||
258 | - protected void onRemove(LinkKey key, DefaultLink val) { | ||
259 | - removeLink(val); | ||
260 | - notifyDelegate(new LinkEvent(LINK_REMOVED, val)); | ||
261 | - } | ||
262 | - } | ||
263 | -} |
core/store/hz/net/src/main/java/org/onlab/onos/store/topology/impl/DefaultTopology.java
deleted
100644 → 0
This diff is collapsed. Click to expand it.
core/store/hz/net/src/main/java/org/onlab/onos/store/topology/impl/DefaultTopologyGraph.java
deleted
100644 → 0
1 | -package org.onlab.onos.store.topology.impl; | ||
2 | - | ||
3 | -import org.onlab.graph.AdjacencyListsGraph; | ||
4 | -import org.onlab.onos.net.topology.TopologyEdge; | ||
5 | -import org.onlab.onos.net.topology.TopologyGraph; | ||
6 | -import org.onlab.onos.net.topology.TopologyVertex; | ||
7 | - | ||
8 | -import java.util.Set; | ||
9 | - | ||
10 | -/** | ||
11 | - * Default implementation of an immutable topology graph based on a generic | ||
12 | - * implementation of adjacency lists graph. | ||
13 | - */ | ||
14 | -public class DefaultTopologyGraph | ||
15 | - extends AdjacencyListsGraph<TopologyVertex, TopologyEdge> | ||
16 | - implements TopologyGraph { | ||
17 | - | ||
18 | - /** | ||
19 | - * Creates a topology graph comprising of the specified vertexes and edges. | ||
20 | - * | ||
21 | - * @param vertexes set of graph vertexes | ||
22 | - * @param edges set of graph edges | ||
23 | - */ | ||
24 | - public DefaultTopologyGraph(Set<TopologyVertex> vertexes, Set<TopologyEdge> edges) { | ||
25 | - super(vertexes, edges); | ||
26 | - } | ||
27 | - | ||
28 | -} |
1 | -package org.onlab.onos.store.topology.impl; | ||
2 | - | ||
3 | -import static org.slf4j.LoggerFactory.getLogger; | ||
4 | - | ||
5 | -import java.util.List; | ||
6 | -import java.util.Set; | ||
7 | - | ||
8 | -import org.apache.felix.scr.annotations.Activate; | ||
9 | -import org.apache.felix.scr.annotations.Component; | ||
10 | -import org.apache.felix.scr.annotations.Deactivate; | ||
11 | -import org.apache.felix.scr.annotations.Service; | ||
12 | -import org.onlab.onos.event.Event; | ||
13 | -import org.onlab.onos.net.ConnectPoint; | ||
14 | -import org.onlab.onos.net.DeviceId; | ||
15 | -import org.onlab.onos.net.Link; | ||
16 | -import org.onlab.onos.net.Path; | ||
17 | -import org.onlab.onos.net.provider.ProviderId; | ||
18 | -import org.onlab.onos.net.topology.ClusterId; | ||
19 | -import org.onlab.onos.net.topology.GraphDescription; | ||
20 | -import org.onlab.onos.net.topology.LinkWeight; | ||
21 | -import org.onlab.onos.net.topology.Topology; | ||
22 | -import org.onlab.onos.net.topology.TopologyCluster; | ||
23 | -import org.onlab.onos.net.topology.TopologyEvent; | ||
24 | -import org.onlab.onos.net.topology.TopologyGraph; | ||
25 | -import org.onlab.onos.net.topology.TopologyStore; | ||
26 | -import org.onlab.onos.net.topology.TopologyStoreDelegate; | ||
27 | -import org.onlab.onos.store.AbstractStore; | ||
28 | -import org.slf4j.Logger; | ||
29 | - | ||
30 | -/** | ||
31 | - * TEMPORARY: Manages inventory of topology snapshots using distributed | ||
32 | - * structures implementation. | ||
33 | - */ | ||
34 | -//FIXME: I LIE I AM NOT DISTRIBUTED | ||
35 | -@Component(immediate = true) | ||
36 | -@Service | ||
37 | -public class DistributedTopologyStore | ||
38 | -extends AbstractStore<TopologyEvent, TopologyStoreDelegate> | ||
39 | -implements TopologyStore { | ||
40 | - | ||
41 | - private final Logger log = getLogger(getClass()); | ||
42 | - | ||
43 | - private volatile DefaultTopology current; | ||
44 | - | ||
45 | - @Activate | ||
46 | - public void activate() { | ||
47 | - log.info("Started"); | ||
48 | - } | ||
49 | - | ||
50 | - @Deactivate | ||
51 | - public void deactivate() { | ||
52 | - log.info("Stopped"); | ||
53 | - } | ||
54 | - @Override | ||
55 | - public Topology currentTopology() { | ||
56 | - return current; | ||
57 | - } | ||
58 | - | ||
59 | - @Override | ||
60 | - public boolean isLatest(Topology topology) { | ||
61 | - // Topology is current only if it is the same as our current topology | ||
62 | - return topology == current; | ||
63 | - } | ||
64 | - | ||
65 | - @Override | ||
66 | - public TopologyGraph getGraph(Topology topology) { | ||
67 | - return defaultTopology(topology).getGraph(); | ||
68 | - } | ||
69 | - | ||
70 | - @Override | ||
71 | - public Set<TopologyCluster> getClusters(Topology topology) { | ||
72 | - return defaultTopology(topology).getClusters(); | ||
73 | - } | ||
74 | - | ||
75 | - @Override | ||
76 | - public TopologyCluster getCluster(Topology topology, ClusterId clusterId) { | ||
77 | - return defaultTopology(topology).getCluster(clusterId); | ||
78 | - } | ||
79 | - | ||
80 | - @Override | ||
81 | - public Set<DeviceId> getClusterDevices(Topology topology, TopologyCluster cluster) { | ||
82 | - return defaultTopology(topology).getClusterDevices(cluster); | ||
83 | - } | ||
84 | - | ||
85 | - @Override | ||
86 | - public Set<Link> getClusterLinks(Topology topology, TopologyCluster cluster) { | ||
87 | - return defaultTopology(topology).getClusterLinks(cluster); | ||
88 | - } | ||
89 | - | ||
90 | - @Override | ||
91 | - public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) { | ||
92 | - return defaultTopology(topology).getPaths(src, dst); | ||
93 | - } | ||
94 | - | ||
95 | - @Override | ||
96 | - public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, | ||
97 | - LinkWeight weight) { | ||
98 | - return defaultTopology(topology).getPaths(src, dst, weight); | ||
99 | - } | ||
100 | - | ||
101 | - @Override | ||
102 | - public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) { | ||
103 | - return defaultTopology(topology).isInfrastructure(connectPoint); | ||
104 | - } | ||
105 | - | ||
106 | - @Override | ||
107 | - public boolean isBroadcastPoint(Topology topology, ConnectPoint connectPoint) { | ||
108 | - return defaultTopology(topology).isBroadcastPoint(connectPoint); | ||
109 | - } | ||
110 | - | ||
111 | - @Override | ||
112 | - public TopologyEvent updateTopology(ProviderId providerId, | ||
113 | - GraphDescription graphDescription, | ||
114 | - List<Event> reasons) { | ||
115 | - // First off, make sure that what we're given is indeed newer than | ||
116 | - // what we already have. | ||
117 | - if (current != null && graphDescription.timestamp() < current.time()) { | ||
118 | - return null; | ||
119 | - } | ||
120 | - | ||
121 | - // Have the default topology construct self from the description data. | ||
122 | - DefaultTopology newTopology = | ||
123 | - new DefaultTopology(providerId, graphDescription); | ||
124 | - | ||
125 | - // Promote the new topology to current and return a ready-to-send event. | ||
126 | - synchronized (this) { | ||
127 | - current = newTopology; | ||
128 | - return new TopologyEvent(TopologyEvent.Type.TOPOLOGY_CHANGED, | ||
129 | - current, reasons); | ||
130 | - } | ||
131 | - } | ||
132 | - | ||
133 | - // Validates the specified topology and returns it as a default | ||
134 | - private DefaultTopology defaultTopology(Topology topology) { | ||
135 | - if (topology instanceof DefaultTopology) { | ||
136 | - return (DefaultTopology) topology; | ||
137 | - } | ||
138 | - throw new IllegalArgumentException("Topology class " + topology.getClass() + | ||
139 | - " not supported"); | ||
140 | - } | ||
141 | - | ||
142 | -} |
1 | -package org.onlab.onos.store.topology.impl; | ||
2 | - | ||
3 | -import org.onlab.onos.net.DeviceId; | ||
4 | - | ||
5 | -import java.util.Objects; | ||
6 | - | ||
7 | -/** | ||
8 | - * Key for filing pre-computed paths between source and destination devices. | ||
9 | - */ | ||
10 | -class PathKey { | ||
11 | - private final DeviceId src; | ||
12 | - private final DeviceId dst; | ||
13 | - | ||
14 | - /** | ||
15 | - * Creates a path key from the given source/dest pair. | ||
16 | - * @param src source device | ||
17 | - * @param dst destination device | ||
18 | - */ | ||
19 | - PathKey(DeviceId src, DeviceId dst) { | ||
20 | - this.src = src; | ||
21 | - this.dst = dst; | ||
22 | - } | ||
23 | - | ||
24 | - @Override | ||
25 | - public int hashCode() { | ||
26 | - return Objects.hash(src, dst); | ||
27 | - } | ||
28 | - | ||
29 | - @Override | ||
30 | - public boolean equals(Object obj) { | ||
31 | - if (this == obj) { | ||
32 | - return true; | ||
33 | - } | ||
34 | - if (obj instanceof PathKey) { | ||
35 | - final PathKey other = (PathKey) obj; | ||
36 | - return Objects.equals(this.src, other.src) && Objects.equals(this.dst, other.dst); | ||
37 | - } | ||
38 | - return false; | ||
39 | - } | ||
40 | -} |
This diff is collapsed. Click to expand it.
core/store/hz/net/src/test/java/org/onlab/onos/store/link/impl/DistributedLinkStoreTest.java
deleted
100644 → 0
This diff is collapsed. Click to expand it.
-
Please register or login to post a comment