Newer
Older
# Copyright 2022-2025 ETSI 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.
# This file is an original contribution from Telefonica Innovación Digital S.L.
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
from flask import request
from flask_restx import Namespace, Resource, fields, reqparse
from src.network_slice_controller import NSController
import json
from swagger.models.create_models import create_gpp_nrm_28541_model, create_ietf_network_slice_nbi_yang_model
slice_ns = Namespace(
"slice",
description="Operations related to transport network slices"
)
# 3GPP NRM TS28.541 Data models
gpp_network_slice_request_model = create_gpp_nrm_28541_model(slice_ns)
# IETF draft-ietf-teas-ietf-network-slice-nbi-yang Data models
slice_ddbb_model, slice_response_model = create_ietf_network_slice_nbi_yang_model(slice_ns)
upload_parser = reqparse.RequestParser()
upload_parser.add_argument('file', location='files', type='FileStorage', help="Archivo a subir")
upload_parser.add_argument('json_data', location='form', help="Datos JSON en formato string")
# Namespace Controllers
@slice_ns.route("/")
class SliceList(Resource):
@slice_ns.doc(summary="Return all transport network slices", description="Returns all transport network slices from the slice controller.")
@slice_ns.response(200, "Slices returned", slice_ddbb_model)
@slice_ns.response(404, "Transport network slices not found")
@slice_ns.response(500, "Internal server error")
def get(self):
"""Retrieve all slices"""
controller = NSController()
return controller.get_flows()
@slice_ns.doc(summary="Submit a transport network slice request", description="This endpoint allows clients to submit transport network slice requests using a JSON payload.")
@slice_ns.response(200, "Slice request successfully processed", slice_response_model)
@slice_ns.response(400, "Invalid request format")
@slice_ns.response(500, "Internal server error")
@slice_ns.expect(upload_parser)
def post(self):
"""Submit a new slice request with a file"""
json_data = None
# Try to get the JSON data from the uploaded file
uploaded_file = request.files.get('file')
if uploaded_file:
if not uploaded_file.filename.endswith('.json'):
return {"error": "Only JSON files allowed"}, 400
try:
json_data = json.load(uploaded_file) # Convert file to JSON
except json.JSONDecodeError:
return {"error": "JSON file not valid"}, 400
# If no file was uploaded, try to get the JSON data from the form
if json_data is None:
raw_json = request.form.get('json_data')
if raw_json:
try:
json_data = json.loads(raw_json) # Convert string to JSON
except json.JSONDecodeError:
return {"error": "JSON file not valid"}, 400
# If no JSON data was found, return an error
if json_data is None:
return {"error": "No data sent"}, 400
# Process the JSON data with the NSController
controller = NSController()
return controller.add_flow(json_data)
@slice_ns.doc(summary="Delete all transport network slices", description="Deletes all transport network slices from the slice controller.")
@slice_ns.response(200, "All transport network slices deleted successfully.")
@slice_ns.response(500, "Internal server error")
def delete(self):
"""Delete all slices"""
controller = NSController()
return controller.delete_flows()
@slice_ns.route("/<string:slice_id>")
@slice_ns.doc(params={"slice_id": "The ID of the slice to retrieve or modify"})
class Slice(Resource):
@slice_ns.doc(summary="Return a specific transport network slice", description="Returns specific information related to a slice by providing its id")
@slice_ns.response(200, "Slice returned", slice_ddbb_model)
@slice_ns.response(404, "Transport network slice not found.")
@slice_ns.response(500, "Internal server error")
def get(self, slice_id):
"""Retrieve a specific slice"""
controller = NSController()
return controller.get_flows(slice_id)
@slice_ns.doc(summary="Delete a specific transport network slice", description="Deletes a specific transport network slice from the slice controller based on the provided `slice_id`.")
@slice_ns.response(200, "Transport network slice deleted successfully.")
@slice_ns.response(404, "Transport network slice not found.")
@slice_ns.response(500, "Internal server error")
def delete(self, slice_id):
"""Delete a slice"""
controller = NSController()
return controller.delete_flows(slice_id)
@slice_ns.expect(slice_ddbb_model, validate=True)
@slice_ns.doc(summary="Modify a specific transport network slice", description="Returns a specific slice that has been modified")
@slice_ns.response(200, "Slice modified", slice_ddbb_model)
@slice_ns.response(404, "Transport network slice not found.")
@slice_ns.response(500, "Internal server error")
def put(self, slice_id):
"""Modify a slice"""
json_data = request.get_json()
controller = NSController()
return controller.modify_flow(slice_id, json_data)