X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=zte%2Fvmanager%2Fdriver%2Finterfaces%2Fviews.py;h=3e62b068c0c00a904c6eaf380548de49db39cf31;hb=f424e7777ea76929ed5d8d28ac67d872bf9a08e0;hp=4615df94b2411d82b75e5a6ab5e6d26a9570f5ff;hpb=ab585af4945a830db50282594a756898bf4cddcf;p=vfc%2Fnfvo%2Fdriver%2Fvnfm%2Fsvnfm.git diff --git a/zte/vmanager/driver/interfaces/views.py b/zte/vmanager/driver/interfaces/views.py index 4615df94..3e62b068 100644 --- a/zte/vmanager/driver/interfaces/views.py +++ b/zte/vmanager/driver/interfaces/views.py @@ -23,14 +23,18 @@ from drf_yasg.utils import swagger_auto_schema from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView +from django.http import StreamingHttpResponse from driver.interfaces.serializers import HealReqSerializer, InstScaleHealRespSerializer, ScaleReqSerializer, \ NotifyReqSerializer, GrantRespSerializer, GrantReqSerializer, JobQueryRespSerializer, TerminateVnfRequestSerializer, \ - InstantiateVnfRequestSerializer, QueryVnfResponseSerializer + InstantiateVnfRequestSerializer, QueryVnfResponseSerializer, SubscribesRespSerializer, \ + SubscribeReqSerializer, SubscribeRespSerializer, VnfPkgsSerializer, NfvoInfoReqSerializer from driver.pub.config.config import VNF_FTP from driver.pub.utils import restcall from driver.pub.utils.restcall import req_by_msb +CHUNK_SIZE = 1024 * 8 + logger = logging.getLogger(__name__) @@ -42,6 +46,25 @@ def load_json_file(file_name): return json_data +def read(file_path, start, end): + fp = open(file_path, 'rb') + fp.seek(start) + pos = start + while pos + CHUNK_SIZE < end: + yield fp.read(CHUNK_SIZE) + pos = fp.tell() + yield fp.read(end - pos) + + +def parse_file_range(file_path, file_range): + start, end = 0, os.path.getsize(file_path) + if file_range: + [start, end] = file_range.split('-') + start, end = start.strip(), end.strip() + start, end = int(start), int(end) + return start, end + + def fun_name(): return "=================%s==================" % inspect.stack()[1][3] @@ -113,36 +136,24 @@ class InstantiateVnf(APIView): vnf_package_info = json.JSONDecoder().decode(ret[1]) packageInfo = ignorcase_get(vnf_package_info, "packageInfo") logger.debug("[%s] packageInfo=%s", fun_name(), packageInfo) + logger.debug("VNF_FTP=%s", VNF_FTP) data = { + "vnfinstancename": "default", "NFVOID": 1, "VNFMID": vnfmid, + "vnfd_id": packageInfo.get("vnfdId"), + "deployflavorid": "default", "extension": {}, + "inputs": [] } - vnfdModel = json.loads(ignorcase_get(packageInfo, "vnfdModel")) - metadata = ignorcase_get(vnfdModel, "metadata") - vnfd_name = ignorcase_get(metadata, "name") - # TODO convert sdc vnf package to vnf vender package - inputs = [] - if "SPGW" in vnfd_name.upper(): - data["VNFD"] = VNF_FTP + "SPGW" - inputs = load_json_file("SPGW" + "_inputs.json") - elif "MME" in vnfd_name.upper(): - data["VNFD"] = VNF_FTP + "MME" - inputs = load_json_file("MME" + "_inputs.json") - else: - data["VNFD"] = ignorcase_get(packageInfo, "downloadUri") - - data["VNFURL"] = data["VNFD"] additionalParam = ignorcase_get(instantiateVnfRequestSerializer.data, "additionalParam") for name, value in ignorcase_get(additionalParam, "inputs").items(): - inputs.append({"name": name, "value": value}) + data["inputs"].append({"key_name": name, "value": value, "type": "TODO"}) + + inputs_json = load_json_file("inputs.json") + [data["inputs"].append(item) for item in inputs_json["inputs"]] - data["extension"]["inputs"] = json.dumps(inputs) - data["extension"]["extVirtualLinks"] = ignorcase_get(additionalParam, "extVirtualLinks") - data["extension"]["vnfinstancename"] = ignorcase_get(instantiateVnfRequestSerializer.data, "vnfInstanceName") - data["extension"]["vnfid"] = data["VNFD"] - data["extension"]["multivim"] = 0 logger.debug("[%s] call_req data=%s", fun_name(), data) ret = restcall.call_req( @@ -187,6 +198,7 @@ class TerminateVnf(APIView): def post(self, request, vnfmid, vnfInstanceId): try: logger.debug("[%s] request.data=%s", fun_name(), request.data) + logger.debug("vnfmid=%s, vnfInstanceId=%s", vnfmid, vnfInstanceId) terminate_vnf_request_serializer = TerminateVnfRequestSerializer(data=request.data) if not terminate_vnf_request_serializer.is_valid(): raise Exception(terminate_vnf_request_serializer.errors) @@ -202,15 +214,15 @@ class TerminateVnf(APIView): user=ignorcase_get(vnfm_info, "userName"), passwd=ignorcase_get(vnfm_info, "password"), auth_type=restcall.rest_no_auth, - resource="v1/vnfs/%s" % vnfInstanceId, + resource="v1/vnfs/%s?NFVOID=1&VNFMID=%s" % (vnfInstanceId, vnfmid), method='delete', - content=json.JSONEncoder().encode(terminate_vnf_request_serializer.data)) + content='{}') if ret[0] != 0: raise Exception(ret[1]) resp = json.JSONDecoder().decode(ret[1]) resp_data = { - "vnfInstanceId": ignorcase_get(resp, "VNFInstanceID"), + "vnfInstanceId": vnfInstanceId, "jobId": ignorcase_get(resp, "JobId") } logger.debug("[%s]resp_data=%s", fun_name(), resp_data) @@ -618,3 +630,134 @@ class SampleList(APIView): def get(self, request): logger.debug("get") return Response({"status": "active"}) + + +class Subscribe(APIView): + @swagger_auto_schema( + responses={ + status.HTTP_200_OK: SubscribesRespSerializer(), + status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" + } + ) + def get(self, request): + logger.debug("====Subscribe get====") + resp_data = { + "subscriptions": [{ + "subscribeid": "cdbddb00-452c-11e9-91e8-acc860114657", + "filter": [{ + "vendor": "ZTE", + "type": "vCPE", + }], + "notificationuri": " https://127.0.0.1:80/v2/vnfm/vnfds/notification", + }] + } + return Response(data=resp_data, status=status.HTTP_200_OK) + + @swagger_auto_schema( + request_body=SubscribeReqSerializer(), + responses={ + status.HTTP_201_CREATED: SubscribeRespSerializer(), + status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" + } + ) + def post(self, request): + logger.debug("====Subscribe post====") + resp_data = {"subscribeid": "cdbddb00-452c-11e9-91e8-acc860114657"} + return Response(data=resp_data, status=status.HTTP_201_CREATED) + + +class SubscribeDetail(APIView): + @swagger_auto_schema( + responses={ + status.HTTP_204_NO_CONTENT: "None", + status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" + } + ) + def delete(self, request, subscribeId): + logger.debug("====SubscribeDetail delete %s====", subscribeId) + return Response(status=status.HTTP_204_NO_CONTENT) + + +class VnfPkgs(APIView): + @swagger_auto_schema( + responses={ + status.HTTP_200_OK: VnfPkgsSerializer(), + status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" + } + ) + def get(self, request): + logger.debug("====VnfPkgs get====") + resp_data = { + "data": [{ + "packageid": "924fc980-4530-11e9-ae68-acc860114657", + "vendor": "ZTE", + "type": "vCPE", + "vnfdfile": "MRP6600_FS_SRIOV_4NIC_200W.zip", + "imagefiles": ["MRP6600_FS_SRIOV_MRPISU_IMGV500R008C20SPC030T.tar"], + "swfiles": ["MRP6600_SRV_V500R008C20SPC030T.tar"], + "description": "This is a service for vCPE.", + }] + } + return Response(data=resp_data, status=status.HTTP_200_OK) + + +class VnfPkg(APIView): + @swagger_auto_schema( + responses={ + status.HTTP_200_OK: "File stream for vnf pkg file", + status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" + } + ) + def get(self, request, packageId, fileName): + logger.debug("====VnfPkg get====%s, %s", packageId, fileName) + file_range = request.META.get('RANGE') + logger.debug('file_range: %s' % file_range) + # TODO: get filepath + local_file_path = fileName + start, end = parse_file_range(local_file_path, file_range) + file_iterator = read(local_file_path, start, end) + return StreamingHttpResponse(file_iterator, status=status.HTTP_200_OK) + + +class NfvoInfo(APIView): + @swagger_auto_schema( + request_body=NfvoInfoReqSerializer(), + responses={ + status.HTTP_200_OK: "Update successfully", + status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" + } + ) + def put(self, request, vnfmid): + logger.debug("====NfvoInfo put====%s", vnfmid) + req_data = { + "nfvoid": request.data.get("nfvoid", "1"), + "vnfmid": vnfmid, + "nfvourl": request.data.get("nfvourl", "http://127.0.0.1:80") + } + ret = get_vnfminfo_from_nslcm(vnfmid) + if ret[0] != 0: + return Response(data={'error': ret[1]}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + vnfm_info = json.JSONDecoder().decode(ret[1]) + logger.debug("[%s] vnfm_info=%s", fun_name(), vnfm_info) + ret = restcall.call_req( + base_url=ignorcase_get(vnfm_info, "url"), + user=ignorcase_get(vnfm_info, "userName"), + passwd=ignorcase_get(vnfm_info, "password"), + auth_type=restcall.rest_no_auth, + resource="v1/nfvo/info", + method='put', + content=json.dumps(req_data)) + if ret[0] != 0: + return Response(data={'error': ret[1]}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + logger.debug("update nfvo info successfully.") + return Response(data={}, status=status.HTTP_200_OK) + + +class HealthCheckView(APIView): + @swagger_auto_schema( + responses={ + status.HTTP_200_OK: 'Active'}) + def get(self, request, format=None): + logger.debug("HealthCheck") + return Response({"status": "active"})