Coverage for osmclient/common/sol004_package.py: 53%
36 statements
« prev ^ index » next coverage.py v7.3.1, created at 2024-06-22 09:01 +0000
« prev ^ index » next coverage.py v7.3.1, created at 2024-06-22 09:01 +0000
1# Copyright ETSI Contributors and Others.
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
12# implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
16"""Python module for interacting with ETSI GS NFV-SOL004 compliant packages.
18This module provides a SOL004Package class for validating and interacting with
19ETSI SOL004 packages. A valid SOL004 package may have its files arranged according
20to one of the following two structures:
22SOL004 with metadata directory SOL004 without metadata directory
24native_charm_vnf/ native_charm_vnf/
25├── TOSCA-Metadata ├── native_charm_vnfd.mf
26│ └── TOSCA.meta ├── native_charm_vnfd.yaml
27├── manifest.mf ├── ChangeLog.txt
28├── Definitions ├── Licenses
29│ └── native_charm_vnfd.yaml │ └── license.lic
30├── Files ├── Files
31│ ├── icons │ └── icons
32│ │ └── osm.png │ └── osm.png
33│ ├── Licenses └── Scripts
34│ │ └── license.lic ├── cloud_init
35│ └── changelog.txt │ └── cloud-config.txt
36└── Scripts └── charms
37 ├── cloud_init └── simple
38 │ └── cloud-config.txt ├── config.yaml
39 └── charms ├── hooks
40 └── simple │ ├── install
41 ├── config.yaml ...
42 ├── hooks │
43 │ ├── install └── src
44 ... └── charm.py
45 └── src
46 └── charm.py
47"""
49import yaml
50import datetime
51import os
52from .sol_package import SOLPackage
55class SOL004PackageException(Exception):
56 pass
59class SOL004Package(SOLPackage):
60 _MANIFEST_VNFD_ID = "vnfd_id"
61 _MANIFEST_VNFD_PRODUCT_NAME = "vnfd_product_name"
62 _MANIFEST_VNFD_PROVIDER_ID = "vnfd_provider_id"
63 _MANIFEST_VNFD_SOFTWARE_VERSION = "vnfd_software_version"
64 _MANIFEST_VNFD_PACKAGE_VERSION = "vnfd_package_version"
65 _MANIFEST_VNFD_RELEASE_DATE_TIME = "vnfd_release_date_time"
66 _MANIFEST_VNFD_COMPATIBLE_SPECIFICATION_VERSIONS = (
67 "compatible_specification_versions"
68 )
69 _MANIFEST_VNFM_INFO = "vnfm_info"
71 _MANIFEST_ALL_FIELDS = [
72 _MANIFEST_VNFD_ID,
73 _MANIFEST_VNFD_PRODUCT_NAME,
74 _MANIFEST_VNFD_PROVIDER_ID,
75 _MANIFEST_VNFD_SOFTWARE_VERSION,
76 _MANIFEST_VNFD_PACKAGE_VERSION,
77 _MANIFEST_VNFD_RELEASE_DATE_TIME,
78 _MANIFEST_VNFD_COMPATIBLE_SPECIFICATION_VERSIONS,
79 _MANIFEST_VNFM_INFO,
80 ]
82 def __init__(self, package_path=""):
83 super().__init__(package_path)
85 def generate_manifest_data_from_descriptor(self):
86 descriptor_path = os.path.join(
87 self._package_path, self.get_descriptor_location()
88 )
89 with open(descriptor_path, "r") as descriptor:
90 try:
91 vnfd_data = yaml.safe_load(descriptor)["vnfd"]
92 except yaml.YAMLError as e:
93 print("Error reading descriptor {}: {}".format(descriptor_path, e))
94 return
96 self._manifest_metadata = {}
97 self._manifest_metadata[self._MANIFEST_VNFD_ID] = vnfd_data.get(
98 "id", "default-id"
99 )
100 self._manifest_metadata[self._MANIFEST_VNFD_PRODUCT_NAME] = vnfd_data.get(
101 "product-name", "default-product-name"
102 )
103 self._manifest_metadata[self._MANIFEST_VNFD_PROVIDER_ID] = vnfd_data.get(
104 "provider", "OSM"
105 )
106 self._manifest_metadata[self._MANIFEST_VNFD_SOFTWARE_VERSION] = (
107 vnfd_data.get("version", "1.0")
108 )
109 self._manifest_metadata[self._MANIFEST_VNFD_PACKAGE_VERSION] = "1.0.0"
110 self._manifest_metadata[self._MANIFEST_VNFD_RELEASE_DATE_TIME] = (
111 datetime.datetime.now().astimezone().isoformat()
112 )
113 self._manifest_metadata[
114 self._MANIFEST_VNFD_COMPATIBLE_SPECIFICATION_VERSIONS
115 ] = "2.7.1"
116 self._manifest_metadata[self._MANIFEST_VNFM_INFO] = "OSM"