Remove call nslcm logic for ns pkg api
[vfc/nfvo/catalog.git] / catalog / packages / ns_package.py
1 # Copyright 2017 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 os
18 import sys
19 import traceback
20
21 from catalog.pub.config.config import CATALOG_ROOT_PATH
22 from catalog.pub.database.models import NSPackageModel
23 from catalog.pub.exceptions import CatalogException
24 from catalog.pub.msapi import sdc
25 from catalog.pub.utils import fileutil
26 from catalog.pub.utils import toscaparser
27 from rest_framework import status
28
29 logger = logging.getLogger(__name__)
30
31 STATUS_SUCCESS, STATUS_FAILED = "success", "failed"
32
33
34 def fmt_ns_pkg_rsp(status, desc, error_code="500"):
35     return [0, {"status": status, "statusDescription": desc, "errorCode": error_code}]
36
37
38 def ns_on_distribute(csar_id):
39     ret = None
40     try:
41         ret = NsPackage().on_distribute(csar_id)
42     except CatalogException as e:
43         NsPackage().delete_catalog(csar_id)
44         return fmt_ns_pkg_rsp(STATUS_FAILED, e.message)
45     except:
46         logger.error(traceback.format_exc())
47         NsPackage().delete_catalog(csar_id)
48         return fmt_ns_pkg_rsp(STATUS_FAILED, str(sys.exc_info()))
49     return fmt_ns_pkg_rsp(STATUS_SUCCESS, ret[1], "")
50
51
52 def ns_delete_csar(csar_id, force_delete):
53     ret = None
54     try:
55         ret = NsPackage().delete_csar(csar_id)
56     except NSLCMException as e:
57         return fmt_ns_pkg_rsp(STATUS_FAILED, e.message)
58     except:
59         logger.error(traceback.format_exc())
60         return fmt_ns_pkg_rsp(STATUS_FAILED, str(sys.exc_info()))
61     return fmt_ns_pkg_rsp(STATUS_SUCCESS, ret[1], "")
62
63
64 def ns_get_csars():
65     ret = None
66     try:
67         ret = NsPackage().get_csars()
68     except CatalogException as e:
69         return [1, e.message]
70     except:
71         logger.error(traceback.format_exc())
72         return [1, str(sys.exc_info())]
73     return ret
74
75 def ns_get_csar(csar_id):
76     ret = None
77     try:
78         ret = NsPackage().get_csar(csar_id)
79     except CatalogException as e:
80         return [1, e.message]
81     except:
82         logger.error(traceback.format_exc())
83         return [1, str(sys.exc_info())]
84     return ret
85
86 def parse_nsd(csar_id, inputs):
87     ret= None
88     try:
89         ns_pkg = NSPackageModel.objects.filter(nsPackageId=csar_id)
90         if ns_pkg:
91             csar_path = ns_pkg[0].localFilePath
92             ret = {"model": toscaparser.parse_nsd(csar_path, inputs)}
93     except CatalogException as e:
94         return [1, e.message]
95     except:
96         logger.error(traceback.format_exc())
97         return [1, str(sys.exc_info())]
98     return [0, ret]
99
100
101 class NsPackage(object):
102     """
103     Actions for sdc ns package.
104     """
105
106     def __init__(self):
107         pass
108
109     def on_distribute(self, csar_id):
110         if NSDModel.objects.filter(id=csar_id):
111             raise NSLCMException("NS CSAR(%s) already exists." % csar_id)
112
113         artifact = sdc.get_artifact(sdc.ASSETTYPE_SERVICES, csar_id)
114         local_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
115         local_file_name = sdc.download_artifacts(artifact["toscaModelURL"], 
116             local_path, "%s.csar" % artifact.get("name", csar_id))
117         
118         nsd_json = toscaparser.parse_nsd(local_file_name)
119         nsd = json.JSONDecoder().decode(nsd_json)
120
121         nsd_id = nsd["metadata"]["id"]
122         if NSDModel.objects.filter(nsd_id=nsd_id):
123             raise NSLCMException("NSD(%s) already exists." % nsd_id)
124
125         for vnf in nsd["vnfs"]:
126             vnfd_id = vnf["properties"]["id"]
127             pkg = NfPackageModel.objects.filter(vnfdid=vnfd_id)
128             if not pkg:
129                 raise NSLCMException("VNF package(%s) is not distributed." % vnfd_id)
130
131         NSPackageModel(
132             nsPackageId=csar_id,
133             nsdId=nsd_id,
134             nsdName=nsd["metadata"].get("name", nsd_id),
135             nsdDesginer=nsd["metadata"].get("vendor", "undefined"),
136             nsdDescription=nsd["metadata"].get("description", ""),
137             nsdVersion=nsd["metadata"].get("version", "undefined"),
138             nsPackageUri=local_file_name,
139             sdcCsarId=csar_id,
140             localFilePath=local_file_name,
141             nsdModel=nsd_json
142             ).save()
143
144         return [0, "CSAR(%s) distributed successfully." % csar_id]
145
146     def delete_csar(self, csar_id):
147         NSDModel.objects.filter(id=csar_id).delete()
148         return [0, "Delete CSAR(%s) successfully." % csar_id]
149
150     def get_csars(self):
151         csars = []
152         nss = NSPackageModel.objects.filter()
153         for ns in nss:
154             csars.append({
155                 "csarId": ns.nsPackageId,
156                 "nsdId": ns.nsdId
157             })
158         return [0, csars]
159
160     def get_csar(self, csar_id):
161         package_info = {}
162         csars = NSPackageModel.objects.filter(nsPackageId=csar_id)
163         if csars:
164             package_info["nsdId"] = csars[0].nsdId
165             package_info["nsdProvider"] = csars[0].nsdDesginer
166             package_info["nsdVersion"] = csars[0].nsdVersion
167
168         return [0, {"csarId": csar_id, 
169             "packageInfo": package_info}]
170
171     def delete_catalog(self, csar_id):
172         local_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
173         fileutil.delete_dirs(local_path)