Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

XS⚠️ ◾ Update Validation YAML File to Comply with Data Model Specification 2.0 #12

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 3 additions & 8 deletions kytos-sdx-topology/app/convert_topology.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,11 +137,6 @@ def get_port(self, sdx_node_name: str, interface: dict) -> dict:
else:
sdx_port["mtu"] = 1500

if "port_name" in interface["metadata"]:
sdx_port["short_name"] = interface["metadata"]["port_name"]
else:
sdx_port["short_name"] = interface["name"]

if "sdx_nni" in interface["metadata"]:
sdx_port["nni"] = "urn:sdx:link:" + interface["metadata"]["sdx_nni"]

Expand Down Expand Up @@ -194,7 +189,7 @@ def get_sdx_node(self, kytos_node: dict) -> dict:

sdx_node["id"] = f"urn:sdx:node:{self.oxp_url}:%s" % sdx_node["name"]

sdx_node["location"] = {"address": "", "latitude": "", "longitude": "", "iso3166_2_lvl4": ""}
sdx_node["location"] = {"address": "", "latitude": "", "longitude": "", "iso3166_2_lvl4": "US-XX"}
if "address" in kytos_node["metadata"]:
sdx_node["location"]["address"] = kytos_node["metadata"]["address"]
if "lat" in kytos_node["metadata"]:
Expand Down Expand Up @@ -273,7 +268,7 @@ def get_sdx_link(self, kytos_link):
"services": services,
"label_range": ["1-100"],
"nni": "sdx_nni:",
"mtu": 0
"mtu": 64
},
{
"id": self.get_sdx_port_urn(switch_b, interface_b),
Expand All @@ -285,7 +280,7 @@ def get_sdx_link(self, kytos_link):
"services": services,
"label_range": ["1-100"],
"nni": "sdx_nni:",
"mtu": 0
"mtu": 64
},
]
sdx_link["type"] = "intra"
Expand Down
131 changes: 31 additions & 100 deletions kytos-sdx-topology/app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
Main module of amlight/sdx Kytos Network Application.
"""
import os
import shelve
import requests
from napps.kytos.sdx_topology.convert_topology import ParseConvertTopology \
# pylint: disable=E0401
Expand Down Expand Up @@ -35,8 +34,7 @@ def setup(self):
"""
self.event_info = {} # pylint: disable=W0201
self.sdx_topology = {} # pylint: disable=W0201
self.shelve_loaded = False # pylint: disable=W0201
self.version_control = False # pylint: disable=W0201
self.version_control = 0 # pylint: disable=W0201
OXPO_ID = int(os.environ.get("OXPO_ID"))
oxpo_names_str = os.environ.get("OXPO_NAMES")
self.oxpo_name = oxpo_names_str.split(",")[OXPO_ID]
Expand All @@ -56,7 +54,7 @@ def execute(self):

self.execute_as_loop(30) # 30-second interval.
"""
self.load_shelve()
self.version_control = 1

def shutdown(self):
"""Run when your NApp is unloaded.
Expand All @@ -66,10 +64,10 @@ def shutdown(self):

@listen_to("kytos/topology.unloaded")
def unload_topology(self): # pylint: disable=W0613
"""Function meant for validation, to make sure that the shelve
"""Function meant for validation, to make sure that the version control
has been loaded before all the other functions that use it begins to
call it."""
self.shelve_loaded = False # pylint: disable=W0201
self.version_control = 0 # pylint: disable=W0201

@staticmethod
def get_kytos_topology():
Expand Down Expand Up @@ -98,30 +96,26 @@ def validate_sdx_topology(self):
return {"result": response.json(), "status_code": response.status_code}

def convert_topology(self, event_type=None, event_timestamp=None):
"""Function that will take care of update the shelve containing
"""Function that will take care of update the self version control containing
the version control that will be updated every time a change is
detected in kytos topology, and return a new sdx topology"""
try:
with shelve.open("topology_shelve") as open_shelve:
version = open_shelve['version']
self.dict_shelve = dict(open_shelve) # pylint: disable=W0201
open_shelve.close()
if version >= 0 and event_type is not None:
if self.version_control > 0 and event_type is not None:
if event_type == "administrative":
timestamp = utils.get_timestamp()
version += 1
self.version_control += 1
elif event_type == "operational":
timestamp = event_timestamp
else:
return {"result": topology_mock.topology_mock(),
"status_code": 401}
topology_converted = ParseConvertTopology(
topology=self.get_kytos_topology(),
version=version,
version=self.version_control,
timestamp=timestamp,
model_version=self.dict_shelve['model_version'],
oxp_name=self.dict_shelve['name'],
oxp_url=self.dict_shelve['url'],
model_version='2.0.0',
oxp_name=self.oxpo_name,
oxp_url=self.oxpo_url,
oxp_urls_list = self.oxpo_urls_list,
).parse_convert_topology()
return {"result": topology_converted, "status_code": 200}
Expand All @@ -138,6 +132,9 @@ def post_sdx_topology(self, event_type=None, event_timestamp=None):
if event_type is not None:
converted_topology = self.convert_topology(
event_type, event_timestamp)
log.info("############# Converted topology ##############:")
log.info(converted_topology["status_code"])
log.info("############# Converted topology ##############:")
if converted_topology["status_code"] == 200:
topology_updated = converted_topology["result"]
self.sdx_topology = {
Expand All @@ -148,8 +145,12 @@ def post_sdx_topology(self, event_type=None, event_timestamp=None):
"timestamp": topology_updated["timestamp"],
"nodes": topology_updated["nodes"],
"links": topology_updated["links"],
"services": topology_updated["services"],
}
else:
log.info("############# Mock topology ##############:")
log.info(event_type)
log.info("############# Converted topology ##############:")
self.sdx_topology = topology_mock.topology_mock()
evaluate_topology = self.validate_sdx_topology()
if evaluate_topology["status_code"] == 200:
Expand All @@ -158,15 +159,6 @@ def post_sdx_topology(self, event_type=None, event_timestamp=None):

return {"result": self.sdx_topology,
"status_code": evaluate_topology["status_code"]}
with shelve.open("events_shelve") as log_events:
shelve_events = log_events['events']
shelve_events.append(
{
"name": "Validation error",
"Error": evaluate_topology["error_message"]
})
log_events['events'] = shelve_events
log_events.close()
return {"result": evaluate_topology['result'],
"status_code": evaluate_topology['status_code']}
except Exception as err: # pylint: disable=W0703
Expand All @@ -179,7 +171,7 @@ def post_sdx_topology(self, event_type=None, event_timestamp=None):
pool="dynamic_single")
def listen_event(self, event=None):
"""Function meant for listen topology"""
if event is not None and self.version_control:
if event is not None:
dpid = ""
if event.name in settings.ADMIN_EVENTS:
switch_event = {
Expand All @@ -199,70 +191,26 @@ def listen_event(self, event=None):
event_type = None
if event_type is None:
return {"event": "not action event"}
# open the event shelve
with shelve.open("events_shelve") as log_events:
shelve_events = log_events['events']
shelve_events.append({"name": event.name, "dpid": dpid})
log_events['events'] = shelve_events
log_events.close()
sdx_lc_response = self.post_sdx_topology(event_type, event.timestamp)
return sdx_lc_response
response = self.post_sdx_topology(event_type, event.timestamp)
return response
return {"event": "not action event"}

def load_shelve(self): # pylint: disable=W0613
"""Function meant for validation, to make sure that the store_shelve
has been loaded before all the other functions that use it begins to
call it."""
if not self.shelve_loaded: # pylint: disable=E0203
with shelve.open("topology_shelve") as open_shelve:
if 'id' not in open_shelve.keys() or \
'name' not in open_shelve.keys() or \
'version' not in open_shelve.keys():
open_shelve['id'] = URN+"topology:"+self.oxpo_url
open_shelve['name'] = self.oxpo_name
open_shelve['url'] = self.oxpo_url
open_shelve['version'] = 0
open_shelve['model_version'] = os.environ.get(
"MODEL_VERSION")
open_shelve['timestamp'] = utils.get_timestamp()
open_shelve['nodes'] = []
open_shelve['links'] = []
self.dict_shelve = dict(open_shelve) # pylint: disable=W0201
self.shelve_loaded = True # pylint: disable=W0201
open_shelve.close()
with shelve.open("events_shelve") as events_shelve:
events_shelve['events'] = []
events_shelve.close()

@rest("v1/version/control", methods=["GET"])
def get_version_control(self, _request: Request) -> JSONResponse:
"""return true if kytos topology is ready"""
dict_shelve = {}
self.load_shelve()
name = "version/control.initialize"
name = "version/control.get"
content = {"dpid": ""}
event = KytosEvent(name=name, content=content)
self.version_control = True # pylint: disable=W0201
event_type = "administrative"
sdx_lc_response = self.post_sdx_topology(event_type, event.timestamp)
if sdx_lc_response["status_code"]:
if sdx_lc_response["status_code"] == 200:
if sdx_lc_response["result"]:
result = sdx_lc_response["result"]
with shelve.open("topology_shelve") as open_shelve:
open_shelve['version'] = 1
self.version_control = True # pylint: disable=W0201
open_shelve['timestamp'] = result["timestamp"]
open_shelve['nodes'] = result["nodes"]
open_shelve['links'] = result["links"]
dict_shelve = dict(open_shelve)
open_shelve.close()
with shelve.open("events_shelve") as log_events:
shelve_events = log_events['events']
shelve_events.append({"name": event.name, "dpid": ""})
log_events['events'] = shelve_events
log_events.close()
return JSONResponse(dict_shelve)
log.info("############# get version control ##############:")
response = self.post_sdx_topology(event_type, event.timestamp)
log.info("############# response version control ##############:")
result = {}
if response["status_code"]:
if response["status_code"] == 200:
if response["result"]:
result = response["result"]
return JSONResponse(result)

# rest api tests
@rest("v1/validate_sdx_topology", methods=["POST"])
Expand Down Expand Up @@ -314,23 +262,6 @@ def get_listen_event(self, request: Request) -> JSONResponse:
raise SystemExit(
http_error, detail="listen topology fails") from http_error

@rest("v1/shelve/topology", methods=["GET"])
def get_shelve_topology(self, _request: Request) -> JSONResponse:
"""return sdx topology shelve"""
open_shelve = shelve.open("topology_shelve")
dict_shelve = dict(open_shelve)
dict_shelve["version_control"] = self.version_control
open_shelve.close()
return JSONResponse(dict_shelve)

@rest("v1/shelve/events", methods=["GET"])
def get_shelve_events(self, _request: Request) -> JSONResponse:
"""return events shelve"""
with shelve.open("events_shelve") as open_shelve:
events = open_shelve['events']
open_shelve.close()
return JSONResponse({"events": events})

@rest("v1/l2vpn_ptp", methods=["POST"])
def create_l2vpn_ptp(self, request: Request) -> JSONResponse:
""" REST to create L2VPN ptp connection."""
Expand Down
1 change: 1 addition & 0 deletions kytos-sdx-topology/app/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
HEADERS = {"Content-type": "application/json"}
ADMIN_EVENTS = [
"version/control.initialize",
"version/control.get",
"kytos/topology.switch.enabled",
"kytos/topology.switch.disabled",
"kytos/topology.switch.metadata.added",
Expand Down
8 changes: 0 additions & 8 deletions os-base/kytos-base/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,6 @@ RUN git config --global url."https://github.com".insteadOf git://github.com

WORKDIR /

RUN wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | apt-key add -
RUN apt update
RUN apt-get install gnupg2
RUN wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | apt-key add -
RUN echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/5.0 main" | tee /etc/apt/sources.list.d/mongodb-org-5.0.list
RUN apt update
RUN apt-get install -y mongodb-org-shell

RUN apt install python3-pip --assume-yes
RUN apt-get purge --assume-yes --auto-remove -o APT::AutoRemove::RecommendsImportant=false && \
rm -rf /var/lib/apt/lists/*
Expand Down
Loading
Loading