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