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__)
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]
return ret
-# Query vnfd_info from nslcm
+# Query vnfd_info from catalog
def vnfd_get(vnfpackageid):
- ret = req_by_msb("api/nslcm/v1/vnfpackage/%s" % vnfpackageid, "GET")
+ ret = req_by_msb("api/catalog/v1/vnfpackages/%s" % vnfpackageid, "GET")
return ret
-# Query vnfpackage_info from nslcm
+# Query vnfpackage_info from catalog
def vnfpackage_get(csarid):
- ret = req_by_msb("api/nslcm/v1/vnfpackage/%s" % csarid, "GET")
+ ret = req_by_msb("api/catalog/v1/vnfpackages/%s" % csarid, "GET")
return ret
)
def post(self, request, vnfmid):
try:
- logger.debug("[%s] request.data=%s", fun_name(), request.data)
+ funname = "InstantiateVnf post"
+ logger.debug("[%s] request.data=%s", funname, request.data)
instantiateVnfRequestSerializer = InstantiateVnfRequestSerializer(data=request.data)
if not instantiateVnfRequestSerializer.is_valid():
- raise Exception(instantiateVnfRequestSerializer.errors)
+ logger.warn("request data is not valid")
ret = get_vnfminfo_from_nslcm(vnfmid)
if ret[0] != 0:
raise Exception(ret[1])
vnfm_info = json.JSONDecoder().decode(ret[1])
- logger.debug("[%s] vnfm_info=%s", fun_name(), vnfm_info)
+ logger.debug("[%s] vnfm_info=%s", funname, vnfm_info)
vnf_package_id = ignorcase_get(instantiateVnfRequestSerializer.data, "vnfPackageId")
ret = vnfd_get(vnf_package_id)
if ret[0] != 0:
raise Exception(ret[1])
vnfd_info = json.JSONDecoder().decode(ret[1])
- logger.debug("[%s] vnfd_info=%s", fun_name(), vnfd_info)
+ logger.debug("[%s] vnfd_info=%s", funname, vnfd_info)
csar_id = ignorcase_get(vnfd_info, "csarId")
ret = vnfpackage_get(csar_id)
if ret[0] != 0:
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("[%s] packageInfo=%s", funname, 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)
+ logger.debug("[%s] call_req data=%s", funname, data)
ret = restcall.call_req(
base_url=ignorcase_get(vnfm_info, "url"),
method='post',
content=json.JSONEncoder().encode(data))
- logger.debug("[%s] call_req ret=%s", fun_name(), ret)
+ logger.debug("[%s] call_req ret=%s", funname, ret)
if ret[0] != 0:
raise Exception(ret[1])
"vnfInstanceId": ignorcase_get(resp, "VNFInstanceID"),
"jobId": ignorcase_get(resp, "JobId")
}
- logger.debug("[%s]resp_data=%s", fun_name(), resp_data)
+ logger.debug("[%s]resp_data=%s", funname, resp_data)
instRespSerializer = InstScaleHealRespSerializer(data=resp_data)
if not instRespSerializer.is_valid():
raise Exception(instRespSerializer.errors)
- logger.debug("[%s] instRespSerializer.data=%s", fun_name(), instRespSerializer.data)
+ logger.debug("[%s] instRespSerializer.data=%s", funname, instRespSerializer.data)
return Response(data=instRespSerializer.data, status=status.HTTP_200_OK)
except Exception as e:
logger.error("Error occurred when instantiating VNF,error:%s", e.message)
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)
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)
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 = {
}
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"}
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 = {
}]
}
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"})