Newer
Older
import dijsktra
from tools import *
from variables import *
class RSA():
def __init__(self, nodes, links):
self.nodes_dict = nodes
self.links_dict = links
self.g = None
self.flow_id = 0
self.opt_band_id = 0
self.db_flows = {}
self.c_slot_number = 0
self.l_slot_number = 0
self.s_slot_number = 0
self.optical_bands = {}
def init_link_slots(self, testing):
if not testing:
for fib in l["optical_link"]["details"]["fibers"]:
#fib = self.links_dict[l]["fibers"][f]
if len(fib["c_slots"]) > 0:
fib["c_slots"] = list(range(0, Nc))
if len(fib["l_slots"]) > 0:
fib["l_slots"] = list(range(0, Nl))
if len(fib["s_slots"]) > 0:
fib["s_slots"] = list(range(0, Ns))
if debug:
print(fib)
for fib1 in l1["optical_link"]["details"]["fibers"]:
#fib1 = self.links_dict[l1]["details"]["fibers"][f1]
self.c_slot_number = len(fib1["c_slots"])
self.l_slot_number = len(fib1["l_slots"])
self.s_slot_number = len(fib1["s_slots"])
break
break
return "{},{},{}".format(self.c_slot_number, self.l_slot_number, self.s_slot_number)
def init_link_slots2(self, testing):
if not testing:
for l in self.links_dict["optical_links"]:
fib = l["optical_details"]
#fib = self.links_dict[l]["fibers"][f]
if len(fib["c_slots"]) > 0:
for c in range(0, Nc):
fib["c_slots"][c] = 1
if len(fib["l_slots"]) > 0:
for c in range(0, Nl):
fib["l_slots"][c] = 1
if len(fib["s_slots"]) > 0:
for c in range(0, Ns):
fib["s_slots"][c] = 1
if debug:
print(fib)
for l1 in self.links_dict["optical_links"]:
fib1 = l1["optical_details"]
self.c_slot_number = len(fib1["c_slots"].keys())
self.l_slot_number = len(fib1["l_slots"].keys())
self.s_slot_number = len(fib1["s_slots"].keys())
break
return "{},{},{}".format(self.c_slot_number, self.l_slot_number, self.s_slot_number)
def initGraph(self):
self.g = dijsktra.Graph()
for n in self.nodes_dict:
self.g.add_vertex(n)
if debug:
print(l)
[s, d] = l["optical_link"]["name"].split('-')
ps = l["optical_link"]["details"]["source"]
pd = l["optical_link"]["details"]["target"]
self.g.add_edge(s, d, ps, pd, 1)
print("INFO: Graph initiated.")
if debug:
self.g.printGraph()
for n in self.nodes_dict:
self.g.add_vertex(n)
for l in self.links_dict["optical_links"]:
if debug:
print(l)
[s, d] = l["name"].split('-')
ps = l["optical_details"]["src_port"]
pd = l["optical_details"]["dst_port"]
self.g.add_edge(s, d, ps, pd, 1)
print("INFO: Graph initiated.2")
if debug:
self.g.printGraph()
def compute_path(self, src, dst):
path = dijsktra.shortest_path(self.g, self.g.get_vertex(src), self.g.get_vertex(dst))
print("INFO: Path from {} to {} with distance: {}".format(src, dst, self.g.get_vertex(dst).get_distance()))
if debug:
print(path)
links = []
for i in range(0, len(path) - 1):
s = path[i]
if debug:
print(s)
if i < len(path) - 1:
d = path[i + 1]
link_id = "{}-{}".format(s, d)
if debug:
#print(link_id, self.links_dict[link_id])
print(link_id, self.get_link_by_name(link_id))
links.append(link_id)
self.g.reset_graph()
return links, path
def get_slots(self, links, slots, optical_band_id=None):
if isinstance(slots, int):
val_c = slots
val_s = slots
val_l = slots
else:
val_c = self.c_slot_number
val_l = self.l_slot_number
val_s = self.s_slot_number
c_sts = []
l_sts = []
s_sts = []
c_slots = {}
l_slots = {}
s_slots = {}
add = ""
drop = ""
src_1, dst_1 = links[0].split('-')
src_2, dst_2 = links[-1].split('-')
if self.nodes_dict[src_1]["type"] == "OC-TP":
add = links[0]
if self.nodes_dict[dst_2]["type"] == "OC-TP":
drop = links[-1]
for l in links:
c_slots[l] = []
l_slots[l] = []
s_slots[l] = []
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
link = self.get_link_by_name(l)
fib = link["optical_details"]
if l == add:
if 'used' in fib:
if fib["used"]:
#if debug:
print("WARNING!!!: link {}, is already in use".format(l))
return [], [], []
if l == drop:
if 'used' in fib:
if fib["used"]:
#if debug:
print("WARNING!!!: link {} is already in use".format(l))
return [], [], []
c_found = l_found = s_found = 0
if len(fib["c_slots"].keys()) > 0:
#c_slots[l] = combine(c_slots[l], consecutives(fib["c_slots"], val_c))
c_slots[l] = combine(c_slots[l], consecutives(fib["c_slots"], val_c))
c_found = 1
if len(fib["l_slots"].keys()) > 0:
l_slots[l] = combine(l_slots[l], consecutives(fib["l_slots"], val_l))
l_found = 1
if len(fib["s_slots"].keys()) > 0:
s_slots[l] = combine(s_slots[l], consecutives(fib["s_slots"], val_s))
s_found = 1
if debug:
print(l, c_slots[l])
if c_found == 0 and l_found == 0 and s_found == 0:
return [], [], []
keys = list(c_slots.keys())
if debug:
print(len(keys))
if debug:
print(keys[0])
# intersection among the slots over all links
if len(keys) == 1:
c_sts = c_slots[keys[0]]
l_sts = l_slots[keys[0]]
s_sts = s_slots[keys[0]]
else:
for i in range(1, len(keys)):
if debug:
Loading
Loading full blame…