atlanticwave-sdx / sdx-controller

Central Controller for AtlanticWave SDX.
https://www.atlanticwave-sdx.net
MIT License
1 stars 3 forks source link

GET Connection by ID returns error 500 #260

Closed italovalcy closed 2 months ago

italovalcy commented 2 months ago

Hi,

When getting a connection by ID, the 500 error is returned and logs include the following statement:

sdx-controller    | ERROR:sdx_controller:Exception on /SDX-Controller/1.0.0/connection/3 [GET]
sdx-controller    | Traceback (most recent call last):
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 2529, in wsgi_app
sdx-controller    |     response = self.full_dispatch_request()
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1825, in full_dispatch_request
sdx-controller    |     rv = self.handle_user_exception(e)
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1823, in full_dispatch_request
sdx-controller    |     rv = self.dispatch_request()
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1799, in dispatch_request
sdx-controller    |     return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/connexion/decorators/decorator.py", line 69, in wrapper
sdx-controller    |     return self.api.get_response(response, self.mimetype, request)
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/connexion/apis/flask_api.py", line 150, in get_response
sdx-controller    |     return cls._get_response(response, mimetype=mimetype, extra_context={"url": flask.request.url})
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/connexion/apis/abstract.py", line 290, in _get_response
sdx-controller    |     framework_response = cls._response_from_handler(response, mimetype, extra_context)
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/connexion/apis/abstract.py", line 345, in _response_from_handler
sdx-controller    |     return cls._build_response(mimetype=mimetype, data=response, extra_context=extra_context)
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/connexion/apis/flask_api.py", line 188, in _build_response
sdx-controller    |     data, status_code, serialized_mimetype = cls._prepare_body_and_status_code(data=data, mimetype=mimetype, status_code=status_code, extra_context=extra_context)
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/connexion/apis/abstract.py", line 417, in _prepare_body_and_status_code
sdx-controller    |     body, mimetype = cls._serialize_data(data, mimetype)
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/connexion/apis/flask_api.py", line 205, in _serialize_data
sdx-controller    |     body = cls.jsonifier.dumps(data)
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/connexion/jsonifier.py", line 57, in dumps
sdx-controller    |     return self.json.dumps(data, **kwargs) + '\n'
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/flask/json/__init__.py", line 124, in dumps
sdx-controller    |     return app.json.dumps(obj, **kwargs)
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/flask/json/provider.py", line 230, in dumps
sdx-controller    |     return json.dumps(obj, **kwargs)
sdx-controller    |   File "/usr/local/lib/python3.9/json/__init__.py", line 234, in dumps
sdx-controller    |     return cls(
sdx-controller    |   File "/usr/local/lib/python3.9/json/encoder.py", line 201, in encode
sdx-controller    |     chunks = list(chunks)
sdx-controller    |   File "/usr/local/lib/python3.9/json/encoder.py", line 431, in _iterencode
sdx-controller    |     yield from _iterencode_dict(o, _current_indent_level)
sdx-controller    |   File "/usr/local/lib/python3.9/json/encoder.py", line 405, in _iterencode_dict
sdx-controller    |     yield from chunks
sdx-controller    |   File "/usr/local/lib/python3.9/json/encoder.py", line 438, in _iterencode
sdx-controller    |     o = _default(o)
sdx-controller    |   File "/usr/src/app/sdx_controller/encoder.py", line 20, in default
sdx-controller    |     return FlaskJSONEncoder.default(self, o)
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/connexion/apps/flask_app.py", line 170, in default
sdx-controller    |     return json.JSONEncoder.default(self, o)
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/flask/json/__init__.py", line 55, in default
sdx-controller    |     return _default(o)
sdx-controller    |   File "/usr/local/lib/python3.9/site-packages/flask/json/provider.py", line 122, in _default
sdx-controller    |     raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable")
sdx-controller    | TypeError: Object of type ObjectId is not JSON serializable
sdx-controller    | INFO:     192.168.0.1:45974 - "GET /SDX-Controller/1.0.0/connection/3 HTTP/1.1" 500 Internal Server Error

Not sure if I'm doing something wrong.

Steps to reproduce:

  1. Run sdx-controller integrated with sdx-lc and Kytos for OXPO:
    
    git clone https://github.com/atlanticwave-sdx/sdx-continuous-development
    cd sdx-continuous-development
    for repo in sdx-lc sdx-controller kytos-sdx-topology; do cd data-plane/; git clone https://github.com/atlanticwave-sdx/$repo container-$repo; cd ..; done

Apply some patches that are pending from review

curl -LO https://github.com/atlanticwave-sdx/sdx-continuous-development/pull/108.diff curl -LO https://github.com/atlanticwave-sdx/sdx-continuous-development/pull/109.diff patch -p1 < 108.diff patch -p1 < 109.diff cd data-plane/container-kytos-sdx-topology/ curl -LO https://github.com/atlanticwave-sdx/kytos-sdx-topology/pull/37.diff patch -p1 < 37.diff cd ../

build and run

cp template.env .env ./1_build_kytos.sh ./2_build_oxpos.sh ./3_build_local_controllers.sh ./4_build_mongo.sh cd container-sdx-controller docker build -t sdx-controller . cd .. docker compose up -d

wait until all OXPs and components finishes booting UP

Ampath, 3 switches (see container-mininet/link-hosts.py)

EXP_SW=3; while true; do N_SW=$(curl -s http://0.0.0.0:8181/api/kytos/topology/v3/switches | jq -r '.switches[].id' | wc -l); echo "waiting switches $N_SW / $EXP_SW"; if [ $N_SW -eq $EXP_SW ]; then break; fi; sleep 1; done

SAX, 2 switches (see container-mininet/link-hosts.py)

EXP_SW=2; while true; do N_SW=$(curl -s http://0.0.0.0:8282/api/kytos/topology/v3/switches | jq -r '.switches[].id' | wc -l); echo "waiting switches $N_SW / $EXP_SW"; if [ $N_SW -eq $EXP_SW ]; then break; fi; sleep 1; done

Tenet, 3 switches (see container-mininet/link-hosts.py)

EXP_SW=3; while true; do N_SW=$(curl -s http://0.0.0.0:8383/api/kytos/topology/v3/switches | jq -r '.switches[].id' | wc -l); echo "waiting switches $N_SW / $EXP_SW"; if [ $N_SW -eq $EXP_SW ]; then break; fi; sleep 1; done

configure OXPs

enable switches, ports and links. Furthermore, configure some metadata that will be needed for SDX

./container-kytos-sdx-topology/curl/2.enable_all.sh

this step is needed so that the kytos-sdx-topology Napp starts sending the topology for SDX-LC

./container-kytos-sdx-topology/curl/0a.version_control.sh ./container-kytos-sdx-topology/curl/0b.version_control.sh ./container-kytos-sdx-topology/curl/0c.version_control.sh

check if the topology is correctly identified by SDX-Controller:

curl -s http://0.0.0.0:8080/SDX-Controller/1.0.0/topology | jq -r '.nodes[] | (.ports[] | .id)' curl -s http://0.0.0.0:8080/SDX-Controller/1.0.0/topology | jq -r '.links[] | .id + " " + .ports[0].id + " " + .ports[1].id'

2. Create a connection:

curl -X POST http://0.0.0.0:8080/SDX-Controller/1.0.0/connection -H 'Content-Type: application/json' -d '{"id": "3", "name": "Test connection request 22", "start_time": "2000-01-23T04:56:07.000Z", "end_time": "2000-01-23T04:56:07.000Z", "bandwidth_required": 10, "latency_required": 300, "egress_port": {"id": "urn:sdx:port:tenet.ac.za:Tenet03:50", "name": "Tenet03:50", "node": "urn:sdx:port:tenet.ac.za:Tenet03", "status": "up"}, "ingress_port": {"id": "urn:sdx:port:ampath.net:Ampath3:50", "name": "Ampath3:50", "node": "urn:sdx:port:ampath.net:Ampath3", "status": "up"}}'

3. Get the connection information:

$ curl http://0.0.0.0:8080/SDX-Controller/1.0.0/connection/3 { "detail": "The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.", "status": 500, "title": "Internal Server Error", "type": "about:blank" }

congwang09 commented 2 months ago

I'm trying to reproduce this. I think it's because the previous connection was not placed correctly. @italovalcy What was the response for your create connection POST request?

italovalcy commented 2 months ago

I'm trying to reproduce this. I think it's because the previous connection was not placed correctly. @italovalcy What was the response for your create connection POST request?

The return from creating a connection from the sdx-controller was success, @congwang09 . I also confirmed by looking into the individual components (SDX-LC and OXPOs/Kytos). From the stack trace above it seems one attribute returned from MongoDB called ObjectId is not JSON serializable. I can run new tests if needed.