1 # Copyright 2016 ZTE Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
22 from drf_yasg.utils import swagger_auto_schema
23 from lcm.ns_sfcs.biz.create_flowcla import CreateFlowClassifier
24 from lcm.ns_sfcs.biz.create_port_chain import CreatePortChain
25 from lcm.ns_sfcs.biz.create_portpairgp import CreatePortPairGroup
26 from lcm.ns_sfcs.biz.create_sfc_worker import CreateSfcWorker
27 from lcm.ns_sfcs.serializers.serializers import CreateFlowClaSerializer
28 from lcm.ns_sfcs.serializers.serializers import CreatePortChainSerializer
29 from lcm.ns_sfcs.serializers.serializers import CreatePortPairGpSerializer
30 from lcm.ns_sfcs.serializers.serializers import CreateSfcInstReqSerializer, CreateSfcInstRespSerializer
31 from lcm.ns_sfcs.serializers.serializers import CreateSfcReqSerializer, CreateSfcRespSerializer
32 from lcm.ns_sfcs.biz.sfc_instance import SfcInstance
33 from rest_framework import status
34 from rest_framework.response import Response
35 from rest_framework.views import APIView
37 from lcm.ns_sfcs.biz.utils import get_fp_id, ignorcase_get
39 logger = logging.getLogger(__name__)
42 class SfcInstanceView(APIView):
44 request_body=CreateSfcInstReqSerializer(),
46 status.HTTP_200_OK: CreateSfcInstRespSerializer(),
47 status.HTTP_500_INTERNAL_SERVER_ERROR: "Inner error"
50 def post(self, request):
52 req_serializer = CreateSfcInstReqSerializer(data=request.data)
53 if not req_serializer.is_valid():
54 raise Exception(req_serializer.errors)
57 'nsinstid': request.data['nsInstanceId'],
58 "ns_model_data": json.loads(request.data['context']),
59 'fpindex': request.data['fpindex'],
60 'fpinstid': str(uuid.uuid4()),
61 'sdncontrollerid': request.data["sdnControllerId"]}
62 rsp = SfcInstance(data).do_biz()
64 resp_serializer = CreateSfcInstRespSerializer(data=rsp)
65 if not resp_serializer.is_valid():
66 raise Exception(resp_serializer.errors)
68 return Response(data=rsp, status=status.HTTP_200_OK)
69 except Exception as e:
70 logger.error(traceback.format_exc())
71 return Response(data={'error': e.args[0]}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
74 class PortPairGpView(APIView):
76 request_body=CreatePortPairGpSerializer(),
78 status.HTTP_200_OK: 'successful'
81 def post(self, request):
82 req_serializer = CreatePortPairGpSerializer(data=request.data)
83 if not req_serializer.is_valid():
84 logger.error(req_serializer.errors)
87 'fpinstid': request.data["fpinstid"],
88 "ns_model_data": json.loads(request.data['context']),
89 'nsinstid': request.data["nsinstanceid"]}
90 CreatePortPairGroup(data).do_biz()
91 return Response(status=status.HTTP_200_OK)
94 class FlowClaView(APIView):
96 request_body=CreateFlowClaSerializer(),
98 status.HTTP_200_OK: 'successful'
101 def post(self, request):
102 req_serializer = CreateFlowClaSerializer(data=request.data)
103 if not req_serializer.is_valid():
104 logger.error(req_serializer.errors)
107 'fpinstid': request.data["fpinstid"],
108 "ns_model_data": json.loads(request.data['context'])}
109 CreateFlowClassifier(data).do_biz()
110 return Response(status=status.HTTP_200_OK)
113 class PortChainView(APIView):
114 @swagger_auto_schema(
115 request_body=CreatePortChainSerializer(),
117 status.HTTP_200_OK: 'successful'
120 def post(self, request):
121 req_serializer = CreatePortChainSerializer(data=request.data)
122 if not req_serializer.is_valid():
123 logger.error(req_serializer.errors)
126 'fpinstid': request.data["fpinstid"],
127 "ns_model_data": json.loads(request.data['context'])}
128 CreatePortChain(data).do_biz()
129 return Response(status=status.HTTP_200_OK)
132 class SfcView(APIView):
133 @swagger_auto_schema(
134 request_body=CreateSfcReqSerializer(),
136 status.HTTP_200_OK: CreateSfcRespSerializer()
139 def post(self, request):
141 logger.info("Create Service Function Chain start")
142 logger.info("service_function_chain_request: %s" % json.dumps(request.data))
143 logger.info("service_function_chain_context : %s" % json.dumps(request.data['context']))
144 logger.info("service_function_chain_context : %s" % request.data['context'])
145 logger.info("service_function_chain_instanceid : %s" % ignorcase_get(request.data, 'nsInstanceId'))
146 logger.info("service_function_chain_sdncontrollerid : %s" % ignorcase_get(request.data, 'sdnControllerId'))
147 logger.info("service_function_chain_fpindex : %s" % ignorcase_get(request.data, 'fpindex'))
148 ns_model_data = request.data['context']
150 req_serializer = CreateSfcReqSerializer(data=request.data)
151 if not req_serializer.is_valid():
152 raise Exception(req_serializer.errors)
153 except Exception as e:
154 logger.error("Exception occurs: %s", e.args[0])
155 logger.error(traceback.format_exc())
157 'nsinstid': ignorcase_get(request.data, 'nsInstanceId'),
158 "ns_model_data": ns_model_data,
159 'fpindex': get_fp_id(ignorcase_get(request.data, 'fpindex'), ns_model_data),
160 'fpinstid': str(uuid.uuid4()),
161 'sdncontrollerid': ignorcase_get(request.data, 'sdnControllerId')
163 logger.info("Save FPInstModel start: ")
164 SfcInstance(data).do_biz()
165 logger.info("Save FPInstModel end: ")
166 worker = CreateSfcWorker(data)
167 job_id = worker.init_data()
169 logger.info("Service Function Chain Thread Sleep start : %s" % time.ctime())
171 logger.info("Service Function Chain Thread Sleep end: %s" % time.ctime())
172 logger.info("Create Service Function Chain end")
174 resp_serializer = CreateSfcRespSerializer(data={"jobId": job_id,
175 "sfcInstId": data["fpinstid"]})
176 if not resp_serializer.is_valid():
177 logger.error(resp_serializer.errors)
179 return Response(data={"jobId": job_id,
180 "sfcInstId": data["fpinstid"]},
181 status=status.HTTP_200_OK)