Ns descriptor related stuffs.
[vfc/nfvo/catalog.git] / catalog / packages / biz / ns_descriptor.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 uuid
19
20 from catalog.pub.config.config import CATALOG_ROOT_PATH
21 from catalog.pub.utils import fileutil
22 from catalog.pub.utils.values import ignore_case_get
23 from catalog.pub.database.models import NSPackageModel, VnfPackageModel
24 from catalog.pub.exceptions import CatalogException
25
26 logger = logging.getLogger(__name__)
27
28
29 def create(data):
30     user_defined_data = ignore_case_get(data, 'userDefinedData')
31     data = {
32         'id': str(uuid.uuid4()),
33         'nsdOnboardingState': 'CREATED',
34         'nsdOperationalState': 'DISABLED',
35         'nsdUsageState': 'NOT_IN_USE',
36         'userDefinedData': user_defined_data,
37         '_links': None  # TODO
38     }
39     NSPackageModel(
40         nsPackageId=data['id'],
41         operationalState=data['nsdOperationalState'],
42         usageState=data['nsdUsageState'],
43         userDefinedData=data['userDefinedData']
44     ).save()
45     return data
46
47
48 def query_multiple():
49     ns_pkgs = NSPackageModel.objects.all()
50     if not ns_pkgs:
51         raise CatalogException('NS descriptors do not exist.')
52     response_data = []
53     for ns_pkg in ns_pkgs:
54         data = {
55             'id': ns_pkg.nsPackageId,
56             'nsdId': ns_pkg.nsdId,
57             'nsdName': ns_pkg.nsdName,
58             'nsdVersion': ns_pkg.nsdVersion,
59             'nsdDesigner': ns_pkg.nsdDesginer,
60             'nsdInvariantId': None,  # TODO
61             'vnfPkgIds': [],
62             'pnfdInfoIds': [],  # TODO
63             'nestedNsdInfoIds': [],  # TODO
64             'nsdOnboardingState': 'CREATED',
65             'onboardingFailureDetails': None,  # TODO
66             'nsdOperationalState': ns_pkg.operationalState,
67             'nsdUsageState': ns_pkg.usageState,
68             'userDefinedData': {},
69             '_links': None  # TODO
70         }
71
72         if ns_pkg.nsdModel:
73             data['nsdOnboardingState'] = 'ONBOARDED'
74         elif ns_pkg.localFilePath:  # TODO: strip()
75             data['nsdOnboardingState'] = 'PROCESSING'
76         elif ns_pkg.nsdId:
77             data['nsdOnboardingState'] = 'UPLOADING'
78             data['nsdOnboardingState'] = 'CREATED'
79
80         if ns_pkg.nsdModel:
81             nsd_model = json.JSONDecoder().decode(ns_pkg.nsdModel)
82             vnf_pkg_ids = []
83             for vnf in nsd_model['vnfs']:
84                 vnfd_id = vnf["properties"]["id"]
85                 pkgs = VnfPackageModel.objects.filter(vnfdId=vnfd_id)
86                 for pkg in pkgs:
87                     vnf_pkg_ids.append(pkg.vnfPackageId)
88             data['vnfPkgIds'] = vnf_pkg_ids
89
90         if ns_pkg.userDefinedData:
91             user_defined_data = json.JSONDecoder().decode(ns_pkg.userDefinedData)
92             data['userDefinedData'] = user_defined_data
93
94         response_data.append(data)
95     return response_data
96
97
98 def query_single(nsd_info_id):
99     ns_pkgs = NSPackageModel.objects.filter(nsPackageId=nsd_info_id)
100     if not ns_pkgs.exists():
101         raise CatalogException('NS descriptors(%s) does not exist.' % nsd_info_id)
102     data = {
103         'id': ns_pkgs[0].nsPackageId,
104         'nsdId': ns_pkgs[0].nsdId,
105         'nsdName': ns_pkgs[0].nsdName,
106         'nsdVersion': ns_pkgs[0].nsdVersion,
107         'nsdDesigner': ns_pkgs[0].nsdDesginer,
108         'nsdInvariantId': None,  # TODO
109         'vnfPkgIds': [],
110         'pnfdInfoIds': [],  # TODO
111         'nestedNsdInfoIds': [],  # TODO
112         'nsdOnboardingState': 'CREATED',
113         'onboardingFailureDetails': None,  # TODO
114         'nsdOperationalState': ns_pkgs[0].operationalState,
115         'nsdUsageState': ns_pkgs[0].usageState,
116         'userDefinedData': {},
117         '_links': None  # TODO
118     }
119
120     if ns_pkgs[0].nsdModel:
121         ns_pkgs[0]['nsdOnboardingState'] = 'ONBOARDED'
122     elif ns_pkgs[0].localFilePath:  # TODO: strip()
123         ns_pkgs[0]['nsdOnboardingState'] = 'PROCESSING'
124     elif ns_pkgs[0].nsdId:
125         ns_pkgs[0]['nsdOnboardingState'] = 'UPLOADING'
126         ns_pkgs[0]['nsdOnboardingState'] = 'CREATED'
127
128     if ns_pkgs[0].nsdModel:
129         nsd_model = json.JSONDecoder().decode(ns_pkgs[0].nsdModel)
130         vnf_pkg_ids = []
131         for vnf in nsd_model['vnfs']:
132             vnfd_id = vnf["properties"]["id"]
133             pkgs = VnfPackageModel.objects.filter(vnfdId=vnfd_id)
134             for pkg in pkgs:
135                 vnf_pkg_ids.append(pkg.vnfPackageId)
136         data['vnfPkgIds'] = vnf_pkg_ids
137
138     if ns_pkgs[0].userDefinedData:
139         user_defined_data = json.JSONDecoder().decode(ns_pkgs[0].userDefinedData)
140         data['userDefinedData'] = user_defined_data
141
142     return data
143
144
145 def upload(files, nsd_info_id):
146     remote_files = files
147     for remote_file in remote_files:
148         local_file_name = remote_file.name
149         local_file_dir = os.path.join(CATALOG_ROOT_PATH, nsd_info_id)
150         local_file_name = os.path.join(local_file_dir, local_file_name)
151         if not os.path.exists(local_file_dir):
152             fileutil.make_dirs(local_file_dir)
153         with open(local_file_name, 'wb') as local_file:
154             if remote_file.multiple_chunks(chunk_size=None):
155                 for chunk in remote_file.chunks():
156                     local_file.write(chunk)
157             else:
158                 data = remote_file.read()
159                 local_file.write(data)
160
161
162 def fill_resp_data(ns_pkg):
163     pass