Open Kilda Java Documentation
FlowCacheTest.java
Go to the documentation of this file.
1 /* Copyright 2017 Telstra Open Source
2  *
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 package org.openkilda.pce.cache;
17 
18 import static org.junit.Assert.assertEquals;
19 
32 
33 import org.junit.After;
34 import org.junit.Assert;
35 import org.junit.Before;
36 import org.junit.Test;
37 
38 import java.util.ArrayList;
39 import java.util.Arrays;
40 import java.util.Collections;
41 import java.util.HashSet;
42 import java.util.List;
43 import java.util.Map;
44 import java.util.Set;
45 
46 public class FlowCacheTest {
47  private final NetworkCache networkCache = new NetworkCache();
48  private final PathComputer computer = new PathComputerMock().withNetwork(networkCache.getNetwork());
49  private final FlowCache flowCache = new FlowCache();
50  private final PathComputer.Strategy defaultStrategy = PathComputer.Strategy.COST;
51 
52  private final Flow firstFlow = new Flow("first-flow", 1, false, "first-flow",
53  new SwitchId("ff:01"), 11, 100,
54  new SwitchId("ff:03"), 11, 200);
55  private final Flow secondFlow = new Flow("second-flow", 1, false, "second-flow",
56  new SwitchId("ff:05"), 12, 100,
57  new SwitchId("ff:03"), 12, 200);
58  private final Flow thirdFlow = new Flow("third-flow", 1, false, "third-flow",
59  new SwitchId("ff:03"), 21, 100,
60  new SwitchId("ff:03"), 22, 200);
61  private final Flow fourthFlow = new Flow("fourth-flow", 1, false, "fourth-flow",
62  new SwitchId("ff:04"), 21, 100,
63  new SwitchId("ff:04"), 22, 200);
64  private final Flow fifthFlow = new Flow("fifth-flow", 1, false, "fifth-flow",
65  new SwitchId("ff:05"), 21, 100,
66  new SwitchId("ff:05"), 22, 200);
67 
68  private final Flow noBandwidthFlow = new Flow("no-bandwidth-flow", 0, true, "no-bandwidth-flow",
69  new SwitchId("ff:01"), 11, 100,
70  new SwitchId("ff:03"), 11, 200);
71 
72  @Before
73  public void setUp() {
74  buildNetworkTopology(networkCache);
75  }
76 
77  @After
78  public void tearDown() {
79  networkCache.clear();
80  flowCache.clear();
81  }
82 
83  @Test(expected = CacheException.class)
84  public void getNotExistentFlow() throws Exception {
85  flowCache.getFlow(firstFlow.getFlowId());
86  }
87 
88  @Test
89  public void getFlow() throws Exception {
91  flowCache.createFlow(firstFlow, computer.getPath(firstFlow, defaultStrategy));
92  ImmutablePair<Flow, Flow> storedFlow = flowCache.getFlow(firstFlow.getFlowId());
93  assertEquals(newFlow, storedFlow);
94  }
95 
96  @Test
97  public void createFlow() throws Exception {
98  ImmutablePair<PathInfoData, PathInfoData> path = computer.getPath(firstFlow, defaultStrategy);
99  ImmutablePair<Flow, Flow> newFlow = flowCache.createFlow(firstFlow, path);
100 
101  Flow forward = newFlow.left;
102  assertEquals(1 | ResourceCache.FORWARD_FLOW_COOKIE_MASK, forward.getCookie());
103  assertEquals(2, forward.getTransitVlan());
104  assertEquals(ResourceCache.MIN_METER_ID, forward.getMeterId());
105  assertEquals(path.getLeft(), forward.getFlowPath());
106 
107  Flow reverse = newFlow.right;
108  assertEquals(1 | ResourceCache.REVERSE_FLOW_COOKIE_MASK, reverse.getCookie());
109  assertEquals(3, reverse.getTransitVlan());
110  assertEquals(ResourceCache.MIN_METER_ID, reverse.getMeterId());
111  assertEquals(path.getRight(), reverse.getFlowPath());
112 
113  assertEquals(1, flowCache.dumpFlows().size());
114  }
115 
116  @Test
117  public void createNoBandwidthFlow() throws Exception {
118  ImmutablePair<PathInfoData, PathInfoData> path = computer.getPath(noBandwidthFlow, defaultStrategy);
119  ImmutablePair<Flow, Flow> newFlow = flowCache.createFlow(noBandwidthFlow, path);
120 
121  Flow forward = newFlow.left;
122  assertEquals(1 | ResourceCache.FORWARD_FLOW_COOKIE_MASK, forward.getCookie());
123  assertEquals(2, forward.getTransitVlan());
124  assertEquals(0, forward.getMeterId());
125  assertEquals(path.getLeft(), forward.getFlowPath());
126 
127  Flow reverse = newFlow.right;
128  assertEquals(1 | ResourceCache.REVERSE_FLOW_COOKIE_MASK, reverse.getCookie());
129  assertEquals(3, reverse.getTransitVlan());
130  assertEquals(0, reverse.getMeterId());
131  assertEquals(path.getRight(), reverse.getFlowPath());
132 
133  assertEquals(1, flowCache.dumpFlows().size());
134  }
135 
136  @Test
137  public void createSingleSwitchFlows() throws Exception {
138  /*
139  * This is to validate that single switch flows don't consume transit vlans.
140  */
141  ImmutablePair<PathInfoData, PathInfoData> path1 = computer.getPath(thirdFlow, defaultStrategy);
142  ImmutablePair<PathInfoData, PathInfoData> path2 = computer.getPath(fourthFlow, defaultStrategy);
143  ImmutablePair<PathInfoData, PathInfoData> path3 = computer.getPath(fifthFlow, defaultStrategy);
144 
145  for (int i = 0; i < 1000; i++) {
146  thirdFlow.setFlowId(thirdFlow.getFlowId() + i);
147  fourthFlow.setFlowId(fourthFlow.getFlowId() + i);
148  fifthFlow.setFlowId(fifthFlow.getFlowId() + i);
149  flowCache.createFlow(thirdFlow, path1);
150  flowCache.createFlow(fourthFlow, path2);
151  flowCache.createFlow(fifthFlow, path3);
152  }
153 
154  }
155 
156  @Test
157  public void createAlreadyExistentFlow() throws Exception {
158  ImmutablePair<PathInfoData, PathInfoData> path = computer.getPath(firstFlow, defaultStrategy);
159  flowCache.createFlow(firstFlow, path);
160 
161  final Set<Integer> allocatedVlans = flowCache.getAllocatedVlans();
162  final Set<Integer> allocatedCookies = flowCache.getAllocatedCookies();
163  final Map<SwitchId, Set<Integer>> allocatedMeters = flowCache.getAllocatedMeters();
164  try {
165  flowCache.createFlow(firstFlow, path);
166  throw new AssertionError(String.format(
167  "Expected exception %s is not raised", CacheException.class.getName()));
168  } catch (CacheException e) {
169  // all good till now
170  }
171 
172  String callName = String.format("%s.createFlow(...) call", flowCache.getClass().getCanonicalName());
173  Assert.assertEquals(
174  String.format("Detect VlanId leak in %s", callName),
175  allocatedVlans, flowCache.getAllocatedVlans());
176  Assert.assertEquals(
177  String.format("Detect cookies leak in %s", callName),
178  allocatedCookies, flowCache.getAllocatedCookies());
179  Assert.assertEquals(
180  String.format("Detect meterId leak in %s", callName),
181  allocatedMeters, flowCache.getAllocatedMeters());
182  }
183 
184  @Test
185  public void deleteFlow() throws Exception {
186  ImmutablePair<PathInfoData, PathInfoData> path = computer.getPath(firstFlow, defaultStrategy);
187  ImmutablePair<Flow, Flow> newFlow = flowCache.createFlow(firstFlow, path);
188  ImmutablePair<Flow, Flow> oldFlow = flowCache.deleteFlow(firstFlow.getFlowId());
189  assertEquals(newFlow, oldFlow);
190  assertEquals(0, flowCache.dumpFlows().size());
191  }
192 
193  @Test
194  public void updateFlow() throws Exception {
195  ImmutablePair<PathInfoData, PathInfoData> path = computer.getPath(firstFlow, defaultStrategy);
196 
197  final ImmutablePair<Flow, Flow> oldFlow = flowCache.createFlow(firstFlow, path);
198  assertEquals(1, flowCache.resourceCache.getAllMeterIds(new SwitchId("ff:01")).size());
199  assertEquals(0, flowCache.resourceCache.getAllMeterIds(new SwitchId("ff:02")).size());
200  assertEquals(1, flowCache.resourceCache.getAllMeterIds(new SwitchId("ff:03")).size());
201  assertEquals(0, flowCache.resourceCache.getAllMeterIds(new SwitchId("ff:04")).size());
202  assertEquals(0, flowCache.resourceCache.getAllMeterIds(new SwitchId("ff:05")).size());
203  assertEquals(2, flowCache.resourceCache.getAllVlanIds().size());
204  assertEquals(1, flowCache.resourceCache.getAllCookies().size());
205 
206  final ImmutablePair<Flow, Flow> newFlow = flowCache.updateFlow(firstFlow, path);
207  assertEquals(1, flowCache.resourceCache.getAllMeterIds(new SwitchId("ff:01")).size());
208  assertEquals(0, flowCache.resourceCache.getAllMeterIds(new SwitchId("ff:02")).size());
209  assertEquals(1, flowCache.resourceCache.getAllMeterIds(new SwitchId("ff:03")).size());
210  assertEquals(0, flowCache.resourceCache.getAllMeterIds(new SwitchId("ff:04")).size());
211  assertEquals(0, flowCache.resourceCache.getAllMeterIds(new SwitchId("ff:05")).size());
212  assertEquals(2, flowCache.resourceCache.getAllVlanIds().size());
213  assertEquals(1, flowCache.resourceCache.getAllCookies().size());
214 
215  assertEquals(1, flowCache.dumpFlows().size());
216 
217  // If two objects are equal according to the equals(Object) method, then calling the
218  // hashCode method on each of the two objects must produce the same integer result.
219  // from https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()
220  // assertNotEquals(newFlow.hashCode(), oldFlow.hashCode());
221  assertEquals(newFlow.hashCode(), oldFlow.hashCode());
222  assertEquals(oldFlow, newFlow);
223  }
224 
225  @Test
226  public void updateNoBandwidthFlow() throws Exception {
227  ImmutablePair<PathInfoData, PathInfoData> path = computer.getPath(firstFlow, defaultStrategy);
228 
229  ImmutablePair<Flow, Flow> oldFlow = flowCache.createFlow(firstFlow, path);
230 
231  assertEquals(ResourceCache.MIN_METER_ID, oldFlow.left.getMeterId());
232  assertEquals(ResourceCache.MIN_METER_ID, oldFlow.right.getMeterId());
233 
234  firstFlow.setBandwidth(0);
235  fifthFlow.setIgnoreBandwidth(true);
236 
237  ImmutablePair<Flow, Flow> newFlow = flowCache.updateFlow(firstFlow, path);
238 
239  assertEquals(0, newFlow.left.getMeterId());
240  assertEquals(0, newFlow.right.getMeterId());
241  }
242 
243  @Test
244  public void updateMissingFlow() throws Exception {
245  ImmutablePair<PathInfoData, PathInfoData> path = computer.getPath(firstFlow, defaultStrategy);
246 
247  final Set<Integer> allocatedVlans = flowCache.getAllocatedVlans();
248  final Set<Integer> allocatedCookies = flowCache.getAllocatedCookies();
249  final Map<SwitchId, Set<Integer>> allocatedMeters = flowCache.getAllocatedMeters();
250 
251  try {
252  flowCache.updateFlow(firstFlow, path);
253  throw new AssertionError(String.format(
254  "Expected exception %s is not raised", CacheException.class.getName()));
255  } catch (CacheException e) {
256  // all good till now
257  }
258 
259  String callName = String.format("%s.createFlow(...) call", flowCache.getClass().getCanonicalName());
260  Assert.assertEquals(
261  String.format("Detect VlanId leak in %s", callName),
262  allocatedVlans, flowCache.getAllocatedVlans());
263  Assert.assertEquals(
264  String.format("Detect cookies leak in %s", callName),
265  allocatedCookies, flowCache.getAllocatedCookies());
266  Assert.assertEquals(
267  String.format("Detect meterId leak in %s", callName),
268  allocatedMeters, flowCache.getAllocatedMeters());
269  }
270 
271  @Test
272  public void dumpFlows() throws Exception {
273  ImmutablePair<Flow, Flow> first = flowCache.createFlow(firstFlow, computer.getPath(firstFlow, defaultStrategy));
275  flowCache.createFlow(secondFlow, computer.getPath(secondFlow, defaultStrategy));
276  ImmutablePair<Flow, Flow> third = flowCache.createFlow(thirdFlow, computer.getPath(thirdFlow, defaultStrategy));
277  assertEquals(new HashSet<>(Arrays.asList(first, second, third)), flowCache.dumpFlows());
278  }
279 
280  @Test
281  public void getFlowPath() throws Exception {
282  flowCache.createFlow(firstFlow, computer.getPath(firstFlow, defaultStrategy));
283  ImmutablePair<PathInfoData, PathInfoData> path = computer.getPath(firstFlow, defaultStrategy);
284  assertEquals(path, flowCache.getFlowPath(firstFlow.getFlowId()));
285  }
286 
287  @Test
288  public void getFlowsWithAffectedPathBySwitch() throws Exception {
289  Set<ImmutablePair<Flow, Flow>> affected;
290  final ImmutablePair<Flow, Flow> first =
291  flowCache.createFlow(firstFlow, computer.getPath(firstFlow, defaultStrategy));
292  final ImmutablePair<Flow, Flow> second =
293  flowCache.createFlow(secondFlow, computer.getPath(secondFlow, defaultStrategy));
294  final ImmutablePair<Flow, Flow> third =
295  flowCache.createFlow(thirdFlow, computer.getPath(thirdFlow, defaultStrategy));
296 
298  assertEquals(new HashSet<>(Arrays.asList(first, second)), affected);
299 
301  assertEquals(new HashSet<>(Arrays.asList(first, second, third)), affected);
302 
304  assertEquals(Collections.singleton(first), affected);
305  }
306 
307  @Test
308  public void getFlowsWithAffectedPathByIsl() throws Exception {
309  Set<ImmutablePair<Flow, Flow>> affected;
310  final ImmutablePair<Flow, Flow> first =
311  flowCache.createFlow(firstFlow, computer.getPath(firstFlow, defaultStrategy));
312  final ImmutablePair<Flow, Flow> second =
313  flowCache.createFlow(secondFlow, computer.getPath(secondFlow, defaultStrategy));
314  flowCache.createFlow(thirdFlow, computer.getPath(thirdFlow, defaultStrategy));
315 
317  assertEquals(Collections.singleton(first), affected);
318 
320  assertEquals(Collections.singleton(first), affected);
321 
323  assertEquals(new HashSet<>(Arrays.asList(first, second)), affected);
324 
326  assertEquals(new HashSet<>(Arrays.asList(first, second)), affected);
327  }
328 
329  @Test
330  public void getFlowsWithAffectedPathByPort() throws Exception {
331  Set<ImmutablePair<Flow, Flow>> affected;
332  final ImmutablePair<Flow, Flow> first =
333  flowCache.createFlow(firstFlow, computer.getPath(firstFlow, defaultStrategy));
334  final ImmutablePair<Flow, Flow> second =
335  flowCache.createFlow(secondFlow, computer.getPath(secondFlow, defaultStrategy));
336  flowCache.createFlow(thirdFlow, computer.getPath(thirdFlow, defaultStrategy));
337 
338  affected = flowCache.getFlowsWithAffectedPath(new PortInfoData(
340  assertEquals(Collections.singleton(first), affected);
341 
342  affected = flowCache.getFlowsWithAffectedPath(new PortInfoData(
344  assertEquals(Collections.singleton(first), affected);
345 
346  affected = flowCache.getFlowsWithAffectedPath(new PortInfoData(
348  assertEquals(new HashSet<>(Arrays.asList(first, second)), affected);
349 
350  affected = flowCache.getFlowsWithAffectedPath(new PortInfoData(
352  assertEquals(new HashSet<>(Arrays.asList(first, second)), affected);
353  }
354 
355  @Test
356  public void getFlowsForUpState() throws Exception {
357  Map<String, String> affected;
358  final ImmutablePair<Flow, Flow> first =
359  flowCache.createFlow(firstFlow, computer.getPath(firstFlow, defaultStrategy));
360  final ImmutablePair<Flow, Flow> second =
361  flowCache.createFlow(secondFlow, computer.getPath(secondFlow, defaultStrategy));
362  final ImmutablePair<Flow, Flow> third =
363  flowCache.createFlow(thirdFlow, computer.getPath(thirdFlow, defaultStrategy));
364 
366  assertEquals(Collections.singleton(second.getLeft().getFlowId()), affected.keySet());
367 
369  assertEquals(new HashSet<>(Arrays.asList(first.getLeft().getFlowId(),
370  second.getLeft().getFlowId(), third.getLeft().getFlowId())), affected.keySet());
371 
373  assertEquals(Collections.singleton(first.getLeft().getFlowId()), affected.keySet());
374  }
375 
376  @Test
377  public void getPath() throws Exception {
379  makeFlow("generic", NetworkTopologyConstants.sw1, NetworkTopologyConstants.sw3, 0), defaultStrategy);
380  System.out.println(path.toString());
381 
382  PathNode node;
383 
384  List<PathNode> direct = new ArrayList<>();
385 
387  node.setSeqId(0);
388  direct.add(node);
389 
391  node.setSeqId(1);
392  direct.add(node);
393 
395  node.setSeqId(2);
396  direct.add(node);
397 
399  node.setSeqId(3);
400  direct.add(node);
401 
403  node.setSeqId(4);
404  direct.add(node);
405 
407  node.setSeqId(5);
408  direct.add(node);
409 
410  PathInfoData expectedDirect = new PathInfoData(
414  direct);
415 
416  assertEquals(expectedDirect, path.getLeft());
417 
418  List<PathNode> reverse = new ArrayList<>();
419 
421  node.setSeqId(0);
422  reverse.add(node);
423 
425  node.setSeqId(1);
426  reverse.add(node);
427 
429  node.setSeqId(2);
430  reverse.add(node);
431 
433  node.setSeqId(3);
434  reverse.add(node);
435 
437  node.setSeqId(4);
438  reverse.add(node);
439 
441  node.setSeqId(5);
442  reverse.add(node);
443 
444  PathInfoData expectedReverse = new PathInfoData(
448  reverse);
449 
450  assertEquals(expectedReverse, path.getRight());
451  }
452 
453  @Test
454  public void getPathIntersection() throws Exception {
457 
458  PathNode node;
459 
461  makeFlow("collide-flow-one", NetworkTopologyConstants.sw4, NetworkTopologyConstants.sw3, 5),
462  defaultStrategy);
463  System.out.println(path43);
464 
465  List<PathNode> nodesForward43 = new ArrayList<>();
466 
468  node.setSeqId(0);
469  nodesForward43.add(node);
470 
472  node.setSeqId(1);
473  nodesForward43.add(node);
474 
476  node.setSeqId(2);
477  nodesForward43.add(node);
478 
480  node.setSeqId(3);
481  nodesForward43.add(node);
482 
483  final PathInfoData islForwardPath43 = new PathInfoData(
485  nodesForward43);
486 
487  List<PathNode> nodesReverse43 = new ArrayList<>();
488 
490  node.setSeqId(0);
491  nodesReverse43.add(node);
492 
494  node.setSeqId(1);
495  nodesReverse43.add(node);
496 
498  node.setSeqId(2);
499  nodesReverse43.add(node);
500 
502  node.setSeqId(3);
503  nodesReverse43.add(node);
504 
505  PathInfoData islReversePath43 = new PathInfoData(
507  nodesReverse43);
508 
509  assertEquals(islForwardPath43, path43.left);
510  assertEquals(islReversePath43, path43.right);
511 
513  makeFlow("collide-flow-two", NetworkTopologyConstants.sw2, NetworkTopologyConstants.sw3, 5),
514  defaultStrategy);
515  System.out.println(path23);
516 
517  List<PathNode> nodesForward23 = new ArrayList<>();
518 
520  node.setSeqId(0);
521  nodesForward23.add(node);
522 
524  node.setSeqId(1);
525  nodesForward23.add(node);
526 
528  node1.setSeqId(2);
529  nodesForward23.add(node1);
530 
532  node2.setSeqId(3);
533  nodesForward23.add(node2);
534 
535  final PathInfoData islForwardPath23 = new PathInfoData(
537  nodesForward23);
538 
539  List<PathNode> nodesReverse23 = new ArrayList<>();
540 
542  node3.setSeqId(0);
543  nodesReverse23.add(node3);
544 
546  node4.setSeqId(1);
547  nodesReverse23.add(node4);
548 
550  node.setSeqId(2);
551  nodesReverse23.add(node);
552 
554  node.setSeqId(3);
555  nodesReverse23.add(node);
556 
557  PathInfoData islReversePath23 = new PathInfoData(
559  nodesReverse23);
560 
561  assertEquals(islForwardPath23, path23.left);
562  assertEquals(islReversePath23, path23.right);
563 
564  ImmutablePair<Set<PathNode>, Set<PathNode>> expected = new ImmutablePair<>(
565  new HashSet<>(Arrays.asList(node1, node2)),
566  new HashSet<>(Arrays.asList(node3, node4)));
567 
568  assertEquals(expected, flowCache.getPathIntersection(path43, path23));
569  assertEquals(expected, flowCache.getPathIntersection(path23, path43));
570  }
571 
572  @Test(expected = CacheException.class)
573  public void getPathWithNoEnoughAvailableBandwidth() throws Exception {
575  System.out.println(networkCache.dumpIsls());
576  computer.getPath(
577  makeFlow("bandwidth-overflow", NetworkTopologyConstants.sw5, NetworkTopologyConstants.sw3, 1),
578  defaultStrategy);
579  }
580 
581  private void buildNetworkTopology(NetworkCache networkCache) {
597  }
598 
599  private Flow makeFlow(String id, SwitchInfoData source, SwitchInfoData dest, int bandwidth) {
600  Flow flow = new Flow();
601 
602  flow.setFlowId(id);
603  flow.setSourceSwitch(source.getSwitchId());
604  flow.setDestinationSwitch(dest.getSwitchId());
605  flow.setBandwidth(bandwidth);
606 
607  return flow;
608  }
609 }
void setIgnoreBandwidth(Boolean ignoreBandwidth)
Definition: Flow.java:267
ImmutablePair< PathInfoData, PathInfoData > getFlowPath(String flowId)
Definition: FlowCache.java:237
PathComputer withNetwork(MutableNetwork< SwitchInfoData, IslInfoData > network)
Map< String, String > getFlowsWithAffectedEndpoint(SwitchId switchId)
Definition: FlowCache.java:218
IslInfoData createOrUpdateIsl(IslInfoData isl)
IslInfoData createIsl(IslInfoData isl)
ImmutablePair< Flow, Flow > getFlow(String flowId)
Definition: FlowCache.java:247
ImmutablePair< PathInfoData, PathInfoData > getPath(Flow flow, AvailableNetwork network, Strategy strategy)
SwitchInfoData createSwitch(SwitchInfoData newSwitch)
Set< PathNode > getPathIntersection(PathInfoData firstPath, PathInfoData secondPath)
Definition: FlowCache.java:354
Map< SwitchId, Set< Integer > > getAllocatedMeters()
Definition: FlowCache.java:549
Set< Integer > getAllocatedVlans()
Definition: FlowCache.java:541
Set< ImmutablePair< Flow, Flow > > dumpFlows()
Definition: FlowCache.java:342
ImmutablePair< Flow, Flow > updateFlow(Flow flow, ImmutablePair< PathInfoData, PathInfoData > path)
Definition: FlowCache.java:312
source
Definition: nodes.py:53
Set< Integer > getAllMeterIds(SwitchId switchId)
ImmutablePair< Flow, Flow > deleteFlow(String flowId)
Definition: FlowCache.java:291
Set< ImmutablePair< Flow, Flow > > getFlowsWithAffectedPath(SwitchId switchId)
Definition: FlowCache.java:175
ImmutablePair< Flow, Flow > createFlow(Flow flow, ImmutablePair< PathInfoData, PathInfoData > path)
Definition: FlowCache.java:268
Set< Integer > getAllocatedCookies()
Definition: FlowCache.java:545