57e7346a09867f0f0e496ff542d9ad921e664615
[vfc/nfvo/lcm.git] / lcm / ns_sfcs / views / views.py
1 # Copyright 2016 ZTE Corporation.
2 #
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
6 #
7 #         http://www.apache.org/licenses/LICENSE-2.0
8 #
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.
14
15 import json
16 import logging
17 import time
18 import traceback
19 import uuid
20
21 from drf_yasg.utils import swagger_auto_schema
22 from lcm.ns_sfcs.biz.create_flowcla import CreateFlowClassifier
23 from lcm.ns_sfcs.biz.create_port_chain import CreatePortChain
24 from lcm.ns_sfcs.biz.create_portpairgp import CreatePortPairGroup
25 from lcm.ns_sfcs.biz.create_sfc_worker import CreateSfcWorker
26 from lcm.ns_sfcs.serializers.serializers import CreateFlowClaSerializer
27 from lcm.ns_sfcs.serializers.serializers import CreatePortChainSerializer
28 from lcm.ns_sfcs.serializers.serializers import CreatePortPairGpSerializer
29 from lcm.ns_sfcs.serializers.serializers import CreateSfcInstReqSerializer, CreateSfcInstRespSerializer
30 from lcm.ns_sfcs.serializers.serializers import CreateSfcReqSerializer, CreateSfcRespSerializer
31 from lcm.ns_sfcs.biz.sfc_instance import SfcInstance
32 from rest_framework import status
33 from rest_framework.response import Response
34 from rest_framework.views import APIView
35
36 from lcm.ns_sfcs.biz.utils import get_fp_id, ignorcase_get
37
38 logger = logging.getLogger(__name__)
39
40
41 class SfcInstanceView(APIView):
42     @swagger_auto_schema(
43         request_body=CreateSfcInstReqSerializer(),
44         responses={
45             status.HTTP_200_OK: CreateSfcInstRespSerializer(),
46             status.HTTP_500_INTERNAL_SERVER_ERROR: "Inner error"
47         }
48     )
49     def post(self, request):
50         try:
51             req_serializer = CreateSfcInstReqSerializer(data=request.data)
52             if not req_serializer.is_valid():
53                 raise Exception(req_serializer.errors)
54
55             data = {
56                 'nsinstid': request.data['nsInstanceId'],
57                 "ns_model_data": json.loads(request.data['context']),
58                 'fpindex': request.data['fpindex'],
59                 'fpinstid': str(uuid.uuid4()),
60                 'sdncontrollerid': request.data["sdnControllerId"]}
61             rsp = SfcInstance(data).do_biz()
62
63             resp_serializer = CreateSfcInstRespSerializer(data=rsp)
64             if not resp_serializer.is_valid():
65                 raise Exception(resp_serializer.errors)
66
67             return Response(data=rsp, status=status.HTTP_200_OK)
68         except Exception as e:
69             logger.error(traceback.format_exc())
70             return Response(data={'error': e.args[0]}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
71
72
73 class PortPairGpView(APIView):
74     @swagger_auto_schema(
75         request_body=CreatePortPairGpSerializer(),
76         responses={
77             status.HTTP_200_OK: 'successful'
78         }
79     )
80     def post(self, request):
81         req_serializer = CreatePortPairGpSerializer(data=request.data)
82         if not req_serializer.is_valid():
83             logger.error(req_serializer.errors)
84
85         data = {
86             'fpinstid': request.data["fpinstid"],
87             "ns_model_data": json.loads(request.data['context']),
88             'nsinstid': request.data["nsinstanceid"]}
89         CreatePortPairGroup(data).do_biz()
90         return Response(status=status.HTTP_200_OK)
91
92
93 class FlowClaView(APIView):
94     @swagger_auto_schema(
95         request_body=CreateFlowClaSerializer(),
96         responses={
97             status.HTTP_200_OK: 'successful'
98         }
99     )
100     def post(self, request):
101         req_serializer = CreateFlowClaSerializer(data=request.data)
102         if not req_serializer.is_valid():
103             logger.error(req_serializer.errors)
104
105         data = {
106             'fpinstid': request.data["fpinstid"],
107             "ns_model_data": json.loads(request.data['context'])}
108         CreateFlowClassifier(data).do_biz()
109         return Response(status=status.HTTP_200_OK)
110
111
112 class PortChainView(APIView):
113     @swagger_auto_schema(
114         request_body=CreatePortChainSerializer(),
115         responses={
116             status.HTTP_200_OK: 'successful'
117         }
118     )
119     def post(self, request):
120         req_serializer = CreatePortChainSerializer(data=request.data)
121         if not req_serializer.is_valid():
122             logger.error(req_serializer.errors)
123
124         data = {
125             'fpinstid': request.data["fpinstid"],
126             "ns_model_data": json.loads(request.data['context'])}
127         CreatePortChain(data).do_biz()
128         return Response(status=status.HTTP_200_OK)
129
130
131 class SfcView(APIView):
132     @swagger_auto_schema(
133         request_body=CreateSfcReqSerializer(),
134         responses={
135             status.HTTP_200_OK: CreateSfcRespSerializer()
136         }
137     )
138     def post(self, request):
139         try:
140             logger.info("Create Service Function Chain start")
141             logger.info("service_function_chain_request: %s" % json.dumps(request.data))
142             logger.info("service_function_chain_context  : %s" % json.dumps(request.data['context']))
143             logger.info("service_function_chain_context  : %s" % request.data['context'])
144             logger.info("service_function_chain_instanceid : %s" % ignorcase_get(request.data, 'nsInstanceId'))
145             logger.info("service_function_chain_sdncontrollerid : %s" % ignorcase_get(request.data, 'sdnControllerId'))
146             logger.info("service_function_chain_fpindex : %s" % ignorcase_get(request.data, 'fpindex'))
147             ns_model_data = json.loads(request.data['context'])
148
149             req_serializer = CreateSfcReqSerializer(data=request.data)
150             if not req_serializer.is_valid():
151                 raise Exception(req_serializer.errors)
152         except Exception as e:
153             logger.error("Exception occurs: %s", e.args[0])
154             logger.error(traceback.format_exc())
155         data = {
156             'nsinstid': ignorcase_get(request.data, 'nsInstanceId'),
157             "ns_model_data": ns_model_data,
158             'fpindex': get_fp_id(ignorcase_get(request.data, 'fpindex'), ns_model_data),
159             'fpinstid': str(uuid.uuid4()),
160             'sdncontrollerid': ignorcase_get(request.data, 'sdnControllerId')
161         }
162         logger.info("Save FPInstModel start: ")
163         SfcInstance(data).do_biz()
164         logger.info("Save FPInstModel end: ")
165         worker = CreateSfcWorker(data)
166         job_id = worker.init_data()
167         worker.start()
168         logger.info("Service Function Chain Thread Sleep start : %s" % time.ctime())
169         time.sleep(2)
170         logger.info("Service Function Chain Thread Sleep end: %s" % time.ctime())
171         logger.info("Create Service Function Chain end")
172
173         resp_serializer = CreateSfcRespSerializer(data={"jobId": job_id, "sfcInstId": data["fpinstid"]})
174         if not resp_serializer.is_valid():
175             logger.error(resp_serializer.errors)
176
177         return Response(data={"jobId": job_id, "sfcInstId": data["fpinstid"]}, status=status.HTTP_200_OK)