1 |
|
# -*- coding: utf-8 -*- |
2 |
|
|
3 |
|
# Copyright 2021 Whitestack, LLC |
4 |
|
# ************************************************************* |
5 |
|
# |
6 |
|
# This file is part of OSM common repository. |
7 |
|
# All Rights Reserved to Whitestack, LLC |
8 |
|
# |
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 |
12 |
|
# |
13 |
|
# http://www.apache.org/licenses/LICENSE-2.0 |
14 |
|
# |
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 |
19 |
|
# under the License. |
20 |
|
# |
21 |
|
# For those usages not covered by the Apache License, Version 2.0 please |
22 |
|
# contact: agarcia@whitestack.com or fbravo@whitestack.com |
23 |
|
## |
24 |
|
|
25 |
0 |
"""Python module for interacting with ETSI GS NFV-SOL004 compliant packages |
26 |
|
|
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: |
30 |
|
|
31 |
|
SOL004 with metadata directory SOL004 without metadata directory |
32 |
|
|
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 |
39 |
|
├── Files ├── Files |
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 |
48 |
|
└── charms ├── hooks |
49 |
|
└── simple │ ├── install |
50 |
|
├── config.yaml ... |
51 |
|
├── hooks │ |
52 |
|
│ ├── install └── src |
53 |
|
... └── charm.py |
54 |
|
└── src |
55 |
|
└── charm.py |
56 |
|
""" |
57 |
|
|
58 |
0 |
import datetime |
59 |
0 |
import os |
60 |
|
|
61 |
0 |
import yaml |
62 |
|
|
63 |
0 |
from .sol_package import SOLPackage |
64 |
|
|
65 |
|
|
66 |
0 |
class SOL004PackageException(Exception): |
67 |
0 |
pass |
68 |
|
|
69 |
|
|
70 |
0 |
class SOL004Package(SOLPackage): |
71 |
0 |
_MANIFEST_VNFD_ID = "vnfd_id" |
72 |
0 |
_MANIFEST_VNFD_PRODUCT_NAME = "vnfd_product_name" |
73 |
0 |
_MANIFEST_VNFD_PROVIDER_ID = "vnfd_provider_id" |
74 |
0 |
_MANIFEST_VNFD_SOFTWARE_VERSION = "vnfd_software_version" |
75 |
0 |
_MANIFEST_VNFD_PACKAGE_VERSION = "vnfd_package_version" |
76 |
0 |
_MANIFEST_VNFD_RELEASE_DATE_TIME = "vnfd_release_date_time" |
77 |
0 |
_MANIFEST_VNFD_COMPATIBLE_SPECIFICATION_VERSIONS = ( |
78 |
|
"compatible_specification_versions" |
79 |
|
) |
80 |
0 |
_MANIFEST_VNFM_INFO = "vnfm_info" |
81 |
|
|
82 |
0 |
_MANIFEST_ALL_FIELDS = [ |
83 |
|
_MANIFEST_VNFD_ID, |
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, |
90 |
|
_MANIFEST_VNFM_INFO, |
91 |
|
] |
92 |
|
|
93 |
0 |
def __init__(self, package_path=""): |
94 |
0 |
super().__init__(package_path) |
95 |
|
|
96 |
0 |
def generate_manifest_data_from_descriptor(self): |
97 |
0 |
descriptor_path = os.path.join( |
98 |
|
self._package_path, self.get_descriptor_location() |
99 |
|
) |
100 |
0 |
with open(descriptor_path, "r") as descriptor: |
101 |
0 |
try: |
102 |
0 |
vnfd_data = yaml.safe_load(descriptor)["vnfd"] |
103 |
0 |
except yaml.YAMLError as e: |
104 |
0 |
print("Error reading descriptor {}: {}".format(descriptor_path, e)) |
105 |
0 |
return |
106 |
|
|
107 |
0 |
self._manifest_metadata = {} |
108 |
0 |
self._manifest_metadata[self._MANIFEST_VNFD_ID] = vnfd_data.get( |
109 |
|
"id", "default-id" |
110 |
|
) |
111 |
0 |
self._manifest_metadata[self._MANIFEST_VNFD_PRODUCT_NAME] = vnfd_data.get( |
112 |
|
"product-name", "default-product-name" |
113 |
|
) |
114 |
0 |
self._manifest_metadata[self._MANIFEST_VNFD_PROVIDER_ID] = vnfd_data.get( |
115 |
|
"provider", "OSM" |
116 |
|
) |
117 |
0 |
self._manifest_metadata[ |
118 |
|
self._MANIFEST_VNFD_SOFTWARE_VERSION |
119 |
|
] = vnfd_data.get("version", "1.0") |
120 |
0 |
self._manifest_metadata[self._MANIFEST_VNFD_PACKAGE_VERSION] = "1.0.0" |
121 |
0 |
self._manifest_metadata[self._MANIFEST_VNFD_RELEASE_DATE_TIME] = ( |
122 |
|
datetime.datetime.now().astimezone().isoformat() |
123 |
|
) |
124 |
0 |
self._manifest_metadata[ |
125 |
|
self._MANIFEST_VNFD_COMPATIBLE_SPECIFICATION_VERSIONS |
126 |
|
] = "2.7.1" |
127 |
0 |
self._manifest_metadata[self._MANIFEST_VNFM_INFO] = "OSM" |