2156e7b41c51b455ed1770d7e6e21765df97eeb0
[modeling/etsicatalog.git] / catalog / packages / views / vnf_package_views.py
1 # Copyright 2018 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 logging
16
17 from django.http import StreamingHttpResponse
18 from drf_yasg.utils import swagger_auto_schema, no_body
19 from drf_yasg import openapi
20 from rest_framework import status
21 from rest_framework.decorators import api_view
22 from rest_framework.response import Response
23
24 from catalog.packages.biz.vnf_package import VnfPackage
25 from catalog.packages.biz.vnf_package import VnfPkgUploadThread
26 from catalog.packages.biz.vnf_package import handle_upload_failed
27 from catalog.packages.biz.vnf_package import parse_vnfd_and_save
28 from catalog.packages.const import TAG_VNF_PACKAGE_API
29 from catalog.packages.serializers.create_vnf_pkg_info_req import CreateVnfPkgInfoRequestSerializer
30 from catalog.packages.serializers.upload_vnf_pkg_from_uri_req import UploadVnfPackageFromUriRequestSerializer
31 from catalog.packages.serializers.vnf_pkg_info import VnfPkgInfoSerializer
32 from catalog.packages.serializers.vnf_pkg_infos import VnfPkgInfosSerializer
33 from .common import validate_data, validate_req_data
34 from .common import view_safe_call_with_log
35
36 logger = logging.getLogger(__name__)
37
38
39 @swagger_auto_schema(
40     method="GET",
41     operation_description="Query multiple VNF package resource",
42     tags=[TAG_VNF_PACKAGE_API],
43     request_body=no_body,
44     responses={
45         status.HTTP_200_OK: VnfPkgInfosSerializer(),
46         status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error",
47                                                                 openapi.Schema(type=openapi.TYPE_STRING))
48     }
49 )
50 @swagger_auto_schema(
51     method="POST",
52     operation_description="Create an individual VNF package resource",
53     tags=[TAG_VNF_PACKAGE_API],
54     request_body=CreateVnfPkgInfoRequestSerializer,
55     responses={
56         status.HTTP_201_CREATED: VnfPkgInfoSerializer(),
57         status.HTTP_400_BAD_REQUEST: openapi.Response("Bad Request", schema=openapi.Schema(type=openapi.TYPE_STRING)),
58         status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error",
59                                                                 schema=openapi.Schema(type=openapi.TYPE_STRING))
60     }
61 )
62 @api_view(http_method_names=["GET", "POST"])
63 @view_safe_call_with_log(logger=logger)
64 def vnf_packages_rc(request):
65     if request.method == 'GET':
66         logger.debug("Query VNF packages> %s" % request.data)
67         data = VnfPackage().query_multiple()
68         validate_data(data, VnfPkgInfosSerializer)
69         return Response(data=data, status=status.HTTP_200_OK)
70
71     if request.method == 'POST':
72         logger.debug("Create VNF package> %s" % request.data)
73         create_vnf_pkg_info_request = validate_req_data(request.data, CreateVnfPkgInfoRequestSerializer)
74         data = VnfPackage().create_vnf_pkg(create_vnf_pkg_info_request.data)
75         validate_data(data, VnfPkgInfoSerializer)
76         return Response(data=data, status=status.HTTP_201_CREATED)
77
78
79 @swagger_auto_schema(
80     method="GET",
81     operation_description="Read VNFD of an on-boarded VNF package",
82     tags=[TAG_VNF_PACKAGE_API],
83     request_body=no_body,
84     responses={
85         status.HTTP_200_OK: openapi.Response('VNFD of an on-boarded VNF package',
86                                              schema=openapi.Schema(format=openapi.FORMAT_BINARY,
87                                                                    type=openapi.TYPE_STRING)),
88         status.HTTP_404_NOT_FOUND: openapi.Response("VNF package does not exist",
89                                                     schema=openapi.Schema(type=openapi.TYPE_STRING)),
90         status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error",
91                                                                 schema=openapi.Schema(type=openapi.TYPE_STRING))
92     },
93     produces='application/octet-stream',
94     operation_id='VNFD of an on-boarded VNF package'
95 )
96 @api_view(http_method_names=["GET"])
97 @view_safe_call_with_log(logger=logger)
98 def vnfd_rd(request, **kwargs):
99     vnf_pkg_id = kwargs.get("vnfPkgId")
100     logger.debug("Read VNFD for  VNF package %s" % vnf_pkg_id)
101     try:
102         file_iterator = VnfPackage().download_vnfd(vnf_pkg_id)
103         return StreamingHttpResponse(file_iterator, status=status.HTTP_200_OK)
104     except Exception as e:
105         logger.error(e)
106         raise e
107
108
109 @swagger_auto_schema(
110     method='PUT',
111     operation_description="Upload VNF package content",
112     tags=[TAG_VNF_PACKAGE_API],
113     request_body=no_body,
114     responses={
115         status.HTTP_202_ACCEPTED: "Successfully",
116         status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error",
117                                                                 schema=openapi.Schema(type=openapi.TYPE_STRING))
118     }
119 )
120 @swagger_auto_schema(
121     method="GET",
122     operation_description="Fetch VNF package content",
123     tags=[TAG_VNF_PACKAGE_API],
124     request_body=no_body,
125     responses={
126         status.HTTP_200_OK: openapi.Response('VNF package file',
127                                              schema=openapi.Schema(format=openapi.FORMAT_BINARY,
128                                                                    type=openapi.TYPE_STRING)),
129         status.HTTP_404_NOT_FOUND: openapi.Response("VNF package does not exist",
130                                                     schema=openapi.Schema(type=openapi.TYPE_STRING)),
131         status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error",
132                                                                 schema=openapi.Schema(type=openapi.TYPE_STRING))
133     }
134 )
135 @api_view(http_method_names=["PUT", "GET"])
136 @view_safe_call_with_log(logger=logger)
137 def package_content_ru(request, **kwargs):
138     vnf_pkg_id = kwargs.get("vnfPkgId")
139     if request.method == "PUT":
140         logger.debug("Upload VNF package %s" % vnf_pkg_id)
141         files = request.FILES.getlist('file')
142         try:
143             local_file_name = VnfPackage().upload(vnf_pkg_id, files[0])
144             parse_vnfd_and_save(vnf_pkg_id, local_file_name)
145             return Response(None, status=status.HTTP_202_ACCEPTED)
146         except Exception as e:
147             handle_upload_failed(vnf_pkg_id)
148             raise e
149
150     if request.method == "GET":
151         file_range = request.META.get('HTTP_RANGE')
152         file_iterator = VnfPackage().download(vnf_pkg_id, file_range)
153         return StreamingHttpResponse(file_iterator, status=status.HTTP_200_OK)
154
155
156 @swagger_auto_schema(
157     method='POST',
158     operation_description="Upload VNF package content from uri",
159     tags=[TAG_VNF_PACKAGE_API],
160     request_body=UploadVnfPackageFromUriRequestSerializer,
161     responses={
162         status.HTTP_202_ACCEPTED: "Successfully",
163         status.HTTP_400_BAD_REQUEST: openapi.Response("Bad Request", schema=openapi.Schema(type=openapi.TYPE_STRING)),
164         status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error",
165                                                                 schema=openapi.Schema(type=openapi.TYPE_STRING))
166     }
167 )
168 @api_view(http_method_names=['POST'])
169 @view_safe_call_with_log(logger=logger)
170 def upload_from_uri_c(request, **kwargs):
171     vnf_pkg_id = kwargs.get("vnfPkgId")
172     try:
173         upload_vnf_from_uri_request = validate_req_data(request.data,
174                                                         UploadVnfPackageFromUriRequestSerializer)
175         VnfPkgUploadThread(upload_vnf_from_uri_request.data, vnf_pkg_id).start()
176         return Response(None, status=status.HTTP_202_ACCEPTED)
177     except Exception as e:
178         handle_upload_failed(vnf_pkg_id)
179         raise e
180
181
182 @swagger_auto_schema(
183     method='GET',
184     operation_description="Query an individual VNF package resource",
185     tags=[TAG_VNF_PACKAGE_API],
186     request_body=no_body,
187     responses={
188         status.HTTP_200_OK: VnfPkgInfoSerializer(),
189         status.HTTP_404_NOT_FOUND: openapi.Response("VNF package does not exist",
190                                                     schema=openapi.Schema(type=openapi.TYPE_STRING)),
191         status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error",
192                                                                 schema=openapi.Schema(type=openapi.TYPE_STRING))
193     }
194 )
195 @swagger_auto_schema(
196     method='DELETE',
197     operation_description="Delete an individual VNF package resource",
198     tags=[TAG_VNF_PACKAGE_API],
199     request_body=no_body,
200     responses={
201         status.HTTP_204_NO_CONTENT: "No content",
202         status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error",
203                                                                 schema=openapi.Schema(type=openapi.TYPE_STRING))
204     }
205 )
206 @api_view(http_method_names=['GET', 'DELETE'])
207 @view_safe_call_with_log(logger=logger)
208 def vnf_package_rd(request, **kwargs):
209     vnf_pkg_id = kwargs.get("vnfPkgId")
210     if request.method == 'GET':
211         logger.debug("Query an individual VNF package> %s" % request.data)
212         data = VnfPackage().query_single(vnf_pkg_id)
213         validate_data(data, VnfPkgInfoSerializer)
214         return Response(data=data, status=status.HTTP_200_OK)
215
216     if request.method == 'DELETE':
217         logger.debug("Delete an individual VNF package> %s" % request.data)
218         VnfPackage().delete_vnf_pkg(vnf_pkg_id)
219         return Response(data=None, status=status.HTTP_204_NO_CONTENT)