Add vfc-vnfres getVms auto-swagger
[vfc/gvnfm/vnfres.git] / res / res / resources / views.py
index cfbe8c5..d7275dd 100644 (file)
 # 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.
-import json
+
 import logging
-import os
 import traceback
 
+from drf_yasg.utils import swagger_auto_schema
 from rest_framework import status
 from rest_framework.decorators import api_view
 from rest_framework.response import Response
 from rest_framework.views import APIView
 
+from res.pub.database.models import NfInstModel, StorageInstModel, NetworkInstModel, VLInstModel, \
+    VNFCInstModel, VmInstModel, FlavourInstModel, SubNetworkInstModel, CPInstModel
 from res.pub.exceptions import VNFRESException
-from res.pub.utils.values import ignore_case_get
 from res.pub.utils.syscomm import fun_name
-from res.pub.database.models import NfInstModel, StorageInstModel, NetworkInstModel, VLInstModel, \
-    VNFCInstModel, VmInstModel, VimModel, VimUserModel, FlavourInstModel, SubNetworkInstModel, CPInstModel
+from res.pub.utils.values import ignore_case_get
+from res.resources.serializers import VolumeInfoSerializer, CpsInfoSerializer, SubnetInfoSerializer, \
+    NetworkInfoSerializer, FlavorInfoSerializer, VmInfoSerializer
 
 logger = logging.getLogger(__name__)
 
@@ -40,7 +42,8 @@ def get_vnf(request, *args, **kwargs):
             return Response(data={'error': 'Vnf(%s) does not exist' % vnf_inst_id}, status=status.HTTP_404_NOT_FOUND)
         resp_data = fill_resp_data(vnf_inst[0])
         return Response(data=resp_data, status=status.HTTP_200_OK)
-    except:
+    except Exception as e:
+        logger.error(e.message)
         logger.error(traceback.format_exc())
         return Response(data={'error': 'Failed to get Vnf(%s)' % vnf_inst_id}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
 
@@ -52,7 +55,7 @@ def fill_resp_data(vnf):
     for s in storage_inst:
         storage = {
             "virtualStorageInstanceId": s.storageid,
-            "virtualStorageDescId": s.storageDesc,
+            "virtualStorageDescId": s.storagetype,
             "storageResource": {
                 "vimId": s.vimid,
                 "resourceId": s.resouceid
@@ -67,16 +70,16 @@ def fill_resp_data(vnf):
         if not net:
             raise VNFRESException('NetworkInst(%s) does not exist.' % v.relatednetworkid)
         v_dic = {
-                    "virtualLinkInstanceId": v.vlinstanceid,
-                    "virtualLinkDescId": v.vldid,
-                    "networkResource": {
-                        "vimId": net[0].vimid,
-                        "resourceId": net[0].resouceid
-                    }
-                }
+            "virtualLinkInstanceId": v.vlinstanceid,
+            "virtualLinkDescId": v.vldid,
+            "networkResource": {
+                "vimId": net[0].vimid,
+                "resourceId": net[0].resouceid
+            }
+        }
         vl_arr.append(v_dic)
     logger.info('Get VNFCInstModel of list.')
-    vnfc_insts = VNFCInstModel.objects.filter(nfinstid=vnf.nfinstid)
+    vnfc_insts = VNFCInstModel.objects.filter(instid=vnf.nfinstid)
     vnfc_arr = []
     for vnfc in vnfc_insts:
         vm = VmInstModel.objects.filter(vmid=vnfc.vmid)
@@ -86,39 +89,41 @@ def fill_resp_data(vnf):
         if not storage:
             raise VNFRESException('StorageInst(%s) does not exist.' % vm[0].vmid)
         vnfc_dic = {
-                    "vnfcInstanceId": vnfc.vnfcinstanceid,
-                    "vduId": vnfc.vduid,
-                    "computeResource": {
-                        "vimId": vm[0].vimid,
-                        "resourceId": vm[0].resouceid
-                    },
-                    "storageResourceIds": [s.storageid for s in storage]
+            "vnfcInstanceId": vnfc.vnfcinstanceid,
+            "vduId": vnfc.vduid,
+            "computeResource": {
+                "vimId": vm[0].vimid,
+                "resourceId": vm[0].resouceid
+            },
+            "storageResourceIds": [s.storageid for s in storage]
         }
         vnfc_arr.append(vnfc_dic)
     logger.info('Get the VimInstModel of list.')
     vms = VmInstModel.objects.filter(instid=vnf.nfinstid)
-    vim_arr = []
+    vm_arr = []
     # The 'vimInfoId' and 'vimId' each value are same
     for vm in vms:
-        vims = VimModel.objects.filter(vimid=vm.vimid)
-        for vim in vims:
-            vim_users = VimUserModel.objects.filter(vimid=vim.vimid)
-            vim_dic = {
-                    "vimInfoId": vim.vimid,
-                    "vimId": vim.vimid,
-                    "interfaceInfo": {
-                        "vimType": vim.type,
-                        "apiVersion": vim.version,
-                        "protocolType": (vim.apiurl.split(':')[0] if vim.apiurl and vim.apiurl.index(':') else 'http')
-                    },
-                    "accessInfo": {
-                        "tenant": (vim_users[0].defaulttenant if vim_users and vim_users[0].defaulttenant else ''),
-                        "username": (vim_users[0].username if vim_users and vim_users[0].username else ''),
-                        "password": (vim_users[0].password if vim_users and vim_users[0].password else '')
-                    },
-                    "interfaceEndpoint": vim.apiurl
-            }
-            vim_arr.append(vim_dic)
+        vm_dic = {
+            "vmid": vm.vmid,
+            "vimid": vm.vimid,
+            "tenant": vm.tenant,
+            "resouceid": vm.resouceid,
+            "vmname": vm.vmname,
+            "nic_array": vm.nic_array,
+            "metadata": vm.metadata,
+            "volume_array": vm.volume_array,
+            "server_group": vm.server_group,
+            "availability_zone": vm.availability_zone,
+            "flavor_id": vm.flavor_id,
+            "security_groups": vm.security_groups,
+            "operationalstate": vm.operationalstate,
+            "insttype": vm.insttype,
+            "is_predefined": vm.is_predefined,
+            "create_time": vm.create_time,
+            "instid": vm.instid,
+            "nodeId": vm.nodeId
+        }
+        vm_arr.append(vm_dic)
 
     resp_data = {
         "vnfInstanceId": vnf.nfinstid,
@@ -129,9 +134,9 @@ def fill_resp_data(vnf):
         "vnfdVersion": vnf.version,
         "vnfSoftwareVersion": vnf.vnfSoftwareVersion,
         "vnfProvider": vnf.vendor,
-        "vnfProductName": vnf.producttype,
+        "vnfProductName": vnf.netype,
         "vnfConfigurableProperties": {vnf.vnfConfigurableProperties},
-        "instantiationState": vnf.instantiationState,
+        "instantiationState": vnf.status,
         "instantiatedVnfInfo": {
             "flavourId": vnf.flavour_id,
             "vnfState": vnf.status,
@@ -140,13 +145,13 @@ def fill_resp_data(vnf):
             "extVirtualLink": [],
             "monitoringParameters": {},
             "localizationLanguage": vnf.localizationLanguage,
-            "vimInfo": vim_arr,
+            "vmInfo": vm_arr,
             "vnfcResourceInfo": vnfc_arr,
             "virtualLinkResourceInfo": vl_arr,
             "virtualStorageResourceInfo": arr
         },
         "metadata": vnf.input_params,
-        "extensions": vnf.extension
+        "extensions": vnf.vnfd_model
     }
     return resp_data
 
@@ -162,26 +167,38 @@ def get_vnfs(request):
         for vnf_inst in vnf_insts:
             arr.append(fill_resp_data(vnf_inst))
         return Response(data={'resp_data': arr}, status=status.HTTP_200_OK)
-    except:
+    except Exception as e:
+        logger.error(e.message)
         logger.error(traceback.format_exc())
         return Response(data={'error': 'Failed to get Vnfs'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
 
 
-@api_view(http_method_names=['GET'])
-def get_vms(request, *args, **kwargs):
-    logger.debug("Query all the vms by vnfInstanceId[%s]", fun_name())
-    try:
-        vnf_inst_id = ignore_case_get(kwargs, "vnfInstanceId")
-        vms = VmInstModel.objects.filter(instid=vnf_inst_id)
-        if not vms:
-            return Response(data={'error': 'Vms does not exist'}, status=status.HTTP_404_NOT_FOUND)
-        arr = []
-        for vm in vms:
-            arr.append(fill_vms_data(vm))
-        return Response(data={'resp_data': arr}, status=status.HTTP_200_OK)
-    except:
-        logger.error(traceback.format_exc())
-        return Response(data={'error': 'Failed to get Vms'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+class getVms(APIView):
+    @swagger_auto_schema(
+        responses={
+            status.HTTP_200_OK: VmInfoSerializer(),
+            status.HTTP_404_NOT_FOUND: 'Vms does not exist',
+            status.HTTP_500_INTERNAL_SERVER_ERROR: 'internal error'})
+    def get(self, request, vnfInstanceId):
+        logger.debug("Query all the vms by vnfInstanceId[%s]", fun_name())
+        try:
+            vms = VmInstModel.objects.filter(instid=vnfInstanceId)
+            if not vms:
+                return Response(data={'error': 'Vms does not exist'}, status=status.HTTP_404_NOT_FOUND)
+            arr = []
+            for vm in vms:
+                arr.append(fill_vms_data(vm))
+
+            vmInfoSerializer = VmInfoSerializer(data={'resp_data': arr})
+            isValid = vmInfoSerializer.is_valid()
+            if not isValid:
+                raise Exception(vmInfoSerializer.errors)
+
+            return Response(data=vmInfoSerializer.data, status=status.HTTP_200_OK)
+        except Exception as e:
+            logger.error(e.message)
+            logger.error(traceback.format_exc())
+            return Response(data={'error': 'Failed to get Vms'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
 
 
 def fill_vms_data(vm):
@@ -193,30 +210,45 @@ def fill_vms_data(vm):
         "instid": vm.instid,
         "vmname": vm.vmname,
         "operationalstate": vm.operationalstate,
-        "zoneid": vm.zoneid,
         "tenant": vm.tenant,
-        "hostid": vm.hostid,
-        "detailinfo": vm.detailinfo,
-        "is_predefined": vm.is_predefined
+        "is_predefined": vm.is_predefined,
+        "security_groups": vm.security_groups,
+        "flavor_id": vm.flavor_id,
+        "availability_zone": vm.availability_zone,
+        "server_group": vm.server_group,
+        "volume_array": vm.volume_array,
+        "metadata": vm.metadata,
+        "nic_array": vm.nic_array
     }
     return vms_data
 
 
-@api_view(http_method_names=['GET'])
-def get_flavors(request, *args, **kwargs):
-    logger.debug("Query all the flavors by vnfInstanceId[%s]", fun_name())
-    try:
-        vnf_inst_id = ignore_case_get(kwargs, "vnfInstanceId")
-        flavours = FlavourInstModel.objects.filter(instid=vnf_inst_id)
-        if not flavours:
-            return Response(data={'error': 'Flavours does not exist'}, status=status.HTTP_404_NOT_FOUND)
-        arr = []
-        for flavour in flavours:
-            arr.append(fill_flavours_data(flavour))
-        return Response(data={'resp_data': arr}, status=status.HTTP_200_OK)
-    except:
-        logger.error(traceback.format_exc())
-        return Response(data={'error': 'Failed to get flavours'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+class getFlavors(APIView):
+    @swagger_auto_schema(
+        responses={
+            status.HTTP_200_OK: FlavorInfoSerializer(),
+            status.HTTP_404_NOT_FOUND: 'Flavours does not exist',
+            status.HTTP_500_INTERNAL_SERVER_ERROR: 'internal error'})
+    def get(self, request, vnfInstanceId):
+        logger.debug("Query all the flavors by vnfInstanceId[%s]", fun_name())
+        try:
+            flavours = FlavourInstModel.objects.filter(instid=vnfInstanceId)
+            if not flavours:
+                return Response(data={'error': 'Flavours does not exist'}, status=status.HTTP_404_NOT_FOUND)
+            arr = []
+            for flavour in flavours:
+                arr.append(fill_flavours_data(flavour))
+
+            flavorInfoSerializer = FlavorInfoSerializer(data={'resp_data': arr})
+            isValid = flavorInfoSerializer.is_valid()
+            if not isValid:
+                raise Exception(flavorInfoSerializer.errors)
+
+            return Response(data=flavorInfoSerializer.data, status=status.HTTP_200_OK)
+        except Exception as e:
+            logger.error(e.message)
+            logger.error(traceback.format_exc())
+            return Response(data={'error': 'Failed to get flavours'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
 
 
 def fill_flavours_data(f):
@@ -228,27 +260,39 @@ def fill_flavours_data(f):
         "extraspecs": f.extraspecs,
         "instid": f.instid,
         "tenant": f.tenant,
-        "vmid": f.vmid,
+        "vimid": f.vimid,
+        "resouceid": f.resouceid,
         "create_time": f.create_time
     }
     return flavours_data
 
 
-@api_view(http_method_names=['GET'])
-def get_networks(request, *args, **kwargs):
-    logger.debug("Query all the networks by vnfInstanceId[%s]", fun_name())
-    try:
-        vnf_inst_id = ignore_case_get(kwargs, "vnfInstanceId")
-        networks = NetworkInstModel.objects.filter(instid=vnf_inst_id)
-        if not networks:
-            return Response(data={'error': 'Networks does not exist'}, status=status.HTTP_404_NOT_FOUND)
-        arr = []
-        for network in networks:
-            arr.append(fill_networks_data(network))
-        return Response(data={'resp_data': arr}, status=status.HTTP_200_OK)
-    except:
-        logger.error(traceback.format_exc())
-        return Response(data={'error': 'Failed to get networks'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+class getNetworks(APIView):
+    @swagger_auto_schema(
+        responses={
+            status.HTTP_200_OK: NetworkInfoSerializer(),
+            status.HTTP_404_NOT_FOUND: 'Networks does not exist',
+            status.HTTP_500_INTERNAL_SERVER_ERROR: 'internal error'})
+    def get(self, request, vnfInstanceId):
+        logger.debug("Query all the networks by vnfInstanceId[%s]", fun_name())
+        try:
+            networks = NetworkInstModel.objects.filter(instid=vnfInstanceId)
+            if not networks:
+                return Response(data={'error': 'Networks does not exist'}, status=status.HTTP_404_NOT_FOUND)
+            arr = []
+            for network in networks:
+                arr.append(fill_networks_data(network))
+
+            networkInfoSerializer = NetworkInfoSerializer(data={'resp_data': arr})
+            isValid = networkInfoSerializer.is_valid()
+            if not isValid:
+                raise Exception(networkInfoSerializer.errors)
+
+            return Response(data=networkInfoSerializer.data, status=status.HTTP_200_OK)
+        except Exception as e:
+            logger.error(e.message)
+            logger.error(traceback.format_exc())
+            return Response(data={'error': 'Failed to get networks'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
 
 
 def fill_networks_data(network):
@@ -259,36 +303,35 @@ def fill_networks_data(network):
         "insttype": network.insttype,
         "instid": network.instid,
         "name": network.name
-        # "tenant": network.tenant,
-        # "is_shared": network.is_shared,
-        # "is_predefined": network.is_predefined,
-        # "desc": network.desc,
-        # "vendor": network.vendor,
-        # "bandwidth": network.bandwidth,
-        # "mtu": network.mtu,
-        # "network_type": network.network_type,
-        # "segmentid": network.segmentid,
-        # "vlantrans": network.vlantrans,
-        # "networkqos": network.networkqos
     }
     return networks_data
 
 
-@api_view(http_method_names=['GET'])
-def get_subnets(request, *args, **kwargs):
-    logger.debug("Query all the subnets by vnfInstanceId[%s]", fun_name())
-    try:
-        vnf_inst_id = ignore_case_get(kwargs, "vnfInstanceId")
-        subnets = SubNetworkInstModel.objects.filter(instid=vnf_inst_id)
-        if not subnets:
-            return Response(data={'error': 'Subnets does not exist'}, status=status.HTTP_404_NOT_FOUND)
-        arr = []
-        for subnet in subnets:
-            arr.append(fill_subnets_data(subnet))
-        return Response(data={'resp_data': arr}, status=status.HTTP_200_OK)
-    except:
-        logger.error(traceback.format_exc())
-        return Response(data={'error': 'Failed to get subnets'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+class getSubnets(APIView):
+    @swagger_auto_schema(
+        responses={
+            status.HTTP_200_OK: SubnetInfoSerializer(),
+            status.HTTP_404_NOT_FOUND: 'Subnets does not exist',
+            status.HTTP_500_INTERNAL_SERVER_ERROR: 'internal error'})
+    def get(self, request, vnfInstanceId):
+        logger.debug("Query all the subnets by vnfInstanceId[%s]", fun_name())
+        try:
+            subnets = SubNetworkInstModel.objects.filter(instid=vnfInstanceId)
+            if not subnets:
+                return Response(data={'error': 'Subnets does not exist'}, status=status.HTTP_404_NOT_FOUND)
+            arr = []
+            for subnet in subnets:
+                arr.append(fill_subnets_data(subnet))
+            subnetInfoSerializer = SubnetInfoSerializer(data={'resp_data': arr})
+            isValid = subnetInfoSerializer.is_valid()
+            if not isValid:
+                raise Exception(subnetInfoSerializer.errors)
+
+            return Response(data=subnetInfoSerializer.data, status=status.HTTP_200_OK)
+        except Exception as e:
+            logger.error(e.message)
+            logger.error(traceback.format_exc())
+            return Response(data={'error': 'Failed to get subnets'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
 
 
 def fill_subnets_data(subnet):
@@ -305,21 +348,31 @@ def fill_subnets_data(subnet):
     return subnets_data
 
 
-@api_view(http_method_names=['GET'])
-def get_cps(request, *args, **kwargs):
-    logger.debug("Query all the cps by vnfInstanceId[%s]", fun_name())
-    try:
-        vnf_inst_id = ignore_case_get(kwargs, "vnfInstanceId")
-        cps = CPInstModel.objects.filter(ownerid=vnf_inst_id)
-        if not cps:
-            return Response(data={'error': 'Cps does not exist'}, status=status.HTTP_404_NOT_FOUND)
-        arr = []
-        for cp in cps:
-            arr.append(fill_cps_data(cp))
-        return Response(data={'resp_data': arr}, status=status.HTTP_200_OK)
-    except:
-        logger.error(traceback.format_exc())
-        return Response(data={'error': 'Failed to get cps'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+class getCps(APIView):
+    @swagger_auto_schema(
+        responses={
+            status.HTTP_200_OK: CpsInfoSerializer(),
+            status.HTTP_404_NOT_FOUND: 'Cps does not exist',
+            status.HTTP_500_INTERNAL_SERVER_ERROR: 'internal error'})
+    def get(self, request, vnfInstanceId):
+        logger.debug("Query all the cps by vnfInstanceId[%s]", fun_name())
+        try:
+            cps = CPInstModel.objects.filter(ownerid=vnfInstanceId)
+            if not cps:
+                return Response(data={'error': 'Cps does not exist'}, status=status.HTTP_404_NOT_FOUND)
+            arr = []
+            for cp in cps:
+                arr.append(fill_cps_data(cp))
+            cpInfoSerializer = CpsInfoSerializer(data={'resp_data': arr})
+            isValid = cpInfoSerializer.is_valid()
+            if not isValid:
+                raise Exception(cpInfoSerializer.errors)
+
+            return Response(data=cpInfoSerializer.data, status=status.HTTP_200_OK)
+        except Exception as e:
+            logger.error(e.message)
+            logger.error(traceback.format_exc())
+            return Response(data={'error': 'Failed to get cps'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
 
 
 def fill_cps_data(cp):
@@ -335,21 +388,31 @@ def fill_cps_data(cp):
     return cps_data
 
 
-@api_view(http_method_names=['GET'])
-def get_volumes(request, *args, **kwargs):
-    logger.debug("Query all the volumes by vnfInstanceId[%s]", fun_name())
-    try:
-        vnf_inst_id = ignore_case_get(kwargs, "vnfInstanceId")
-        volumes = StorageInstModel.objects.filter(instid=vnf_inst_id)
-        if not volumes:
-            return Response(data={'error': 'Volumes does not exist'}, status=status.HTTP_404_NOT_FOUND)
-        arr = []
-        for v in volumes:
-            arr.append(fill_volumes_data(v))
-        return Response(data={'resp_data': arr}, status=status.HTTP_200_OK)
-    except:
-        logger.error(traceback.format_exc())
-        return Response(data={'error': 'Failed to get volumes'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+class getVolumes(APIView):
+    @swagger_auto_schema(
+        responses={
+            status.HTTP_200_OK: VolumeInfoSerializer(),
+            status.HTTP_404_NOT_FOUND: 'Volumes does not exist',
+            status.HTTP_500_INTERNAL_SERVER_ERROR: 'internal error'})
+    def get(self, request, vnfInstanceId):
+        logger.debug("Query all the volumes by vnfInstanceId[%s]", fun_name())
+        try:
+            volumes = StorageInstModel.objects.filter(instid=vnfInstanceId)
+            if not volumes:
+                return Response(data={'error': 'Volumes does not exist'}, status=status.HTTP_404_NOT_FOUND)
+            arr = []
+            for v in volumes:
+                arr.append(fill_volumes_data(v))
+            volumeSerializer = VolumeInfoSerializer(data={'resp_data': arr})
+            isValid = volumeSerializer.is_valid()
+            if not isValid:
+                raise Exception(volumeSerializer.errors)
+
+            return Response(data=volumeSerializer.data, status=status.HTTP_200_OK)
+        except Exception as e:
+            logger.error(e.message)
+            logger.error(traceback.format_exc())
+            return Response(data={'error': 'Failed to get volumes'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
 
 
 def fill_volumes_data(v):
@@ -360,16 +423,6 @@ def fill_volumes_data(v):
         "insttype": v.insttype,
         "instid": v.instid,
         "storagetype": v.storagetype,
-        "size": v.size,
-        "disktype": v.disktype
+        "size": v.size
     }
     return volumes_data
-
-
-class SwaggerJsonView(APIView):
-    def get(self, request):
-        json_file = os.path.join(os.path.dirname(__file__), 'swagger.json')
-        f = open(json_file)
-        json_data = json.JSONDecoder().decode(f.read())
-        f.close()
-        return Response(json_data)