Newer
Older
# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from opticalcontroller.dijkstra import Graph, shortest_path
from opticalcontroller.tools import *
from opticalcontroller.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 = {}
if full_links:
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)
if full_links:
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)
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()
path = 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] = []
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
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:
Loading
Loading full blame...