blob: 1a8deab2d77dd826b72a925909d4a003ba7baca6 [file] [log] [blame]
Toshio Koide5526c4f2014-02-11 12:39:03 -08001package net.onrc.onos.intent;
2
3import java.util.Collection;
4import java.util.Collections;
5import java.util.HashMap;
6import java.util.HashSet;
7import java.util.LinkedList;
8
9import net.onrc.onos.ofcontroller.networkgraph.Link;
10
11/**
12 * @author Toshio Koide (t-koide@onlab.us)
13 */
14public class PathIntents {
15 protected LinkedList<PathIntent> intents = new LinkedList<PathIntent>();
16 protected HashMap<Link, HashSet<PathIntent>> linkToIntents = new HashMap<Link, HashSet<PathIntent>>();
17
18 public void addIntent(PathIntent intent) {
19 intents.add(intent);
20 for (Link link: intent.getPath()) {
21 HashSet<PathIntent> value = linkToIntents.get(link);
22 if (value == null) {
23 value = new HashSet<PathIntent>();
24 linkToIntents.put(link, value);
25 }
26 value.add(intent);
27 }
28 }
29
30 public void addIntents(PathIntents intents) {
31 for(PathIntent intent: intents.getIntents()) {
32 addIntent(intent);
33 }
34 }
35
36 public Collection<PathIntent> getIntentByLink(Link link) {
37 return Collections.unmodifiableCollection(linkToIntents.get(link));
38 }
39
40 public Collection<PathIntent> getIntents() {
41 return Collections.unmodifiableCollection(intents);
42 }
43
44 /**
45 * calculate available bandwidth of specified link
46 * @param link
47 * @return
48 */
49 public Double getAvailableBandwidth(Link link) {
50 Double bandwidth = link.getCapacity();
51 if (!bandwidth.isInfinite() && linkToIntents.containsKey(link)) {
52 for (PathIntent intent: getIntentByLink(link)) {
53 Double intentBandwidth = intent.getBandwidth();
54 if (intentBandwidth == null || intentBandwidth.isInfinite() || intentBandwidth.isNaN())
55 continue;
56 bandwidth -= intentBandwidth;
57 }
58 }
59 return bandwidth;
60 }
61}