9824b39ae84d05c7890170eddada21098bf29a7b
[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
18 import traceback
19 import sys
20 import os
21
22 from lcm.pub.database.models import NSDModel, NSInstModel, NfPackageModel
23 from lcm.pub.utils.values import ignore_case_get
24 from lcm.pub.exceptions import NSLCMException
25 from lcm.pub.msapi import sdc
26 from lcm.pub.config.config import CATALOG_ROOT_PATH
27 from lcm.pub.utils import toscaparser
28 from lcm.pub.utils import fileutil
29
30 logger = logging.getLogger(__name__)
31
32 STATUS_SUCCESS, STATUS_FAILED = "success", "failed"
33
34
35 def fmt_ns_pkg_rsp(status, desc, error_code="500"):
36     return [0, {"status": status, "statusDescription": desc, "errorCode": error_code}]
37
38
39 def ns_on_distribute(csar_id):
40     ret = None
41     try:
42         ret = SdcNsPackage().on_distribute(csar_id)
43     except NSLCMException as e:
44         SdcNsPackage().delete_catalog(csar_id)
45         return fmt_ns_pkg_rsp(STATUS_FAILED, e.message)
46     except:
47         logger.error(traceback.format_exc())
48         SdcNsPackage().delete_catalog(csar_id)
49         return fmt_ns_pkg_rsp(STATUS_FAILED, str(sys.exc_info()))
50     return fmt_ns_pkg_rsp(STATUS_SUCCESS, ret[1], "")
51
52
53 def ns_delete_csar(csar_id, force_delete):
54     ret = None
55     try:
56         ret = SdcNsPackage().delete_csar(csar_id, force_delete)
57     except NSLCMException as e:
58         return fmt_ns_pkg_rsp(STATUS_FAILED, e.message)
59     except:
60         logger.error(traceback.format_exc())
61         return fmt_ns_pkg_rsp(STATUS_FAILED, str(sys.exc_info()))
62     return fmt_ns_pkg_rsp(STATUS_SUCCESS, ret[1], "")
63
64 def ns_get_csars():
65     ret = None
66     try:
67         ret = SdcNsPackage().get_csars()
68     except NSLCMException 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 = 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, "%s.csar" % artifact.get("name", csar_id))
105         
106         nsd_json = toscaparser.parse_nsd(local_file_name)
107         nsd = json.JSONDecoder().decode(nsd_json)
108
109         nsd_id = nsd["metadata"]["id"]
110         if NSDModel.objects.filter(nsd_id=nsd_id):
111             raise NSLCMException("NSD(%s) already exists." % nsd_id)
112
113         for vnf in nsd["vnfs"]:
114             vnfd_id = vnf["properties"]["id"]
115             pkg = NfPackageModel.objects.filter(vnfdid=vnfd_id)
116             if not pkg:
117                 raise NSLCMException("VNF package(%s) is not distributed." % vnfd_id)
118
119         NSDModel(
120             id=csar_id,
121             nsd_id=nsd_id,
122             name=nsd["metadata"].get("name", nsd_id),
123             vendor=nsd["metadata"].get("vendor", "undefined"),
124             description=nsd["metadata"].get("description", ""),
125             version=nsd["metadata"].get("version", "undefined"),
126             nsd_path=local_file_name,
127             nsd_model=nsd_json).save()
128
129         return [0, "CSAR(%s) distributed successfully." % csar_id]
130
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
142     def get_csars(self):
143         csars = {"csars": []}
144         nss = NSDModel.objects.filter()
145         for ns in nss:
146             csars["csars"].append({
147                 "csarId": ns.id,
148                 "nsdId": ns.nsd_id
149             })
150         return [0, csars]
151
152     def get_csar(self, csar_id):
153         package_info = {}
154         csars = NSDModel.objects.filter(id=csar_id)
155         if csars:
156             package_info["nsdId"] = csars[0].nsd_id
157             package_info["nsdProvider"] = csars[0].vendor
158             package_info["nsdVersion"] = csars[0].version
159
160         nss = NSInstModel.objects.filter(nspackage_id=csar_id)
161         ns_instance_info = [{
162             "nsInstanceId": ns.id, 
163             "nsInstanceName": ns.name} for ns in nss]
164
165         return [0, {"csarId": csar_id, 
166             "packageInfo": package_info, 
167             "nsInstanceInfo": ns_instance_info}]
168
169     def delete_catalog(self, csar_id):
170         local_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
171         fileutil.delete_dirs(local_path)
172
173
174
175