1 # -*- coding: utf-8 -*-
3 # Copyright 2021 Whitestack, LLC
4 # *************************************************************
6 # This file is part of OSM common repository.
7 # All Rights Reserved to Whitestack, LLC
9 # Licensed under the Apache License, Version 2.0 (the "License"); you may
10 # not use this file except in compliance with the License. You may obtain
11 # a copy of the License at
13 # http://www.apache.org/licenses/LICENSE-2.0
15 # Unless required by applicable law or agreed to in writing, software
16 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
18 # License for the specific language governing permissions and limitations
21 # For those usages not covered by the Apache License, Version 2.0 please
22 # contact: agarcia@whitestack.com or fbravo@whitestack.com
25 """Python module for interacting with ETSI GS NFV-SOL004 compliant packages
27 This module provides a SOL004Package class for validating and interacting with
28 ETSI SOL004 packages. A valid SOL004 package may have its files arranged according
29 to one of the following two structures:
31 SOL004 with metadata directory SOL004 without metadata directory
33 native_charm_vnf/ native_charm_vnf/
34 ├── TOSCA-Metadata ├── native_charm_vnfd.mf
35 │ └── TOSCA.meta ├── native_charm_vnfd.yaml
36 ├── manifest.mf ├── ChangeLog.txt
37 ├── Definitions ├── Licenses
38 │ └── native_charm_vnfd.yaml │ └── license.lic
40 │ ├── icons │ └── icons
41 │ │ └── osm.png │ └── osm.png
42 │ ├── Licenses └── Scripts
43 │ │ └── license.lic ├── cloud_init
44 │ └── changelog.txt │ └── cloud-config.txt
45 └── Scripts └── charms
46 ├── cloud_init └── simple
47 │ └── cloud-config.txt ├── config.yaml
49 └── simple │ ├── install
63 from .sol_package
import SOLPackage
66 class SOL004PackageException(Exception):
70 class SOL004Package(SOLPackage
):
71 _MANIFEST_VNFD_ID
= "vnfd_id"
72 _MANIFEST_VNFD_PRODUCT_NAME
= "vnfd_product_name"
73 _MANIFEST_VNFD_PROVIDER_ID
= "vnfd_provider_id"
74 _MANIFEST_VNFD_SOFTWARE_VERSION
= "vnfd_software_version"
75 _MANIFEST_VNFD_PACKAGE_VERSION
= "vnfd_package_version"
76 _MANIFEST_VNFD_RELEASE_DATE_TIME
= "vnfd_release_date_time"
77 _MANIFEST_VNFD_COMPATIBLE_SPECIFICATION_VERSIONS
= (
78 "compatible_specification_versions"
80 _MANIFEST_VNFM_INFO
= "vnfm_info"
82 _MANIFEST_ALL_FIELDS
= [
84 _MANIFEST_VNFD_PRODUCT_NAME
,
85 _MANIFEST_VNFD_PROVIDER_ID
,
86 _MANIFEST_VNFD_SOFTWARE_VERSION
,
87 _MANIFEST_VNFD_PACKAGE_VERSION
,
88 _MANIFEST_VNFD_RELEASE_DATE_TIME
,
89 _MANIFEST_VNFD_COMPATIBLE_SPECIFICATION_VERSIONS
,
93 def __init__(self
, package_path
=""):
94 super().__init
__(package_path
)
96 def generate_manifest_data_from_descriptor(self
):
97 descriptor_path
= os
.path
.join(
98 self
._package
_path
, self
.get_descriptor_location()
100 with
open(descriptor_path
, "r") as descriptor
:
102 vnfd_data
= yaml
.safe_load(descriptor
)["vnfd"]
103 except yaml
.YAMLError
as e
:
104 print("Error reading descriptor {}: {}".format(descriptor_path
, e
))
107 self
._manifest
_metadata
= {}
108 self
._manifest
_metadata
[self
._MANIFEST
_VNFD
_ID
] = vnfd_data
.get(
111 self
._manifest
_metadata
[self
._MANIFEST
_VNFD
_PRODUCT
_NAME
] = vnfd_data
.get(
112 "product-name", "default-product-name"
114 self
._manifest
_metadata
[self
._MANIFEST
_VNFD
_PROVIDER
_ID
] = vnfd_data
.get(
117 self
._manifest
_metadata
[
118 self
._MANIFEST
_VNFD
_SOFTWARE
_VERSION
119 ] = vnfd_data
.get("version", "1.0")
120 self
._manifest
_metadata
[self
._MANIFEST
_VNFD
_PACKAGE
_VERSION
] = "1.0.0"
121 self
._manifest
_metadata
[self
._MANIFEST
_VNFD
_RELEASE
_DATE
_TIME
] = (
122 datetime
.datetime
.now().astimezone().isoformat()
124 self
._manifest
_metadata
[
125 self
._MANIFEST
_VNFD
_COMPATIBLE
_SPECIFICATION
_VERSIONS
127 self
._manifest
_metadata
[self
._MANIFEST
_VNFM
_INFO
] = "OSM"