| garciaale | 0839503 | 2021-01-15 13:04:05 -0300 | [diff] [blame] | 1 | # -*- coding: utf-8 -*- |
| 2 | |
| bravof | 98fc8f0 | 2021-11-04 21:16:00 -0300 | [diff] [blame] | 3 | # Copyright 2021 Whitestack, LLC |
| garciaale | 0839503 | 2021-01-15 13:04:05 -0300 | [diff] [blame] | 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 |
| bravof | 98fc8f0 | 2021-11-04 21:16:00 -0300 | [diff] [blame] | 22 | # contact: agarcia@whitestack.com or fbravo@whitestack.com |
| garciaale | 0839503 | 2021-01-15 13:04:05 -0300 | [diff] [blame] | 23 | ## |
| 24 | |
| 25 | """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 | |
| bravof | 98fc8f0 | 2021-11-04 21:16:00 -0300 | [diff] [blame] | 58 | import datetime |
| garciaale | 0839503 | 2021-01-15 13:04:05 -0300 | [diff] [blame] | 59 | import os |
| aticig | 3dd0db6 | 2022-03-04 19:35:45 +0300 | [diff] [blame^] | 60 | |
| 61 | import yaml |
| 62 | |
| bravof | 98fc8f0 | 2021-11-04 21:16:00 -0300 | [diff] [blame] | 63 | from .sol_package import SOLPackage |
| garciaale | 0839503 | 2021-01-15 13:04:05 -0300 | [diff] [blame] | 64 | |
| 65 | |
| 66 | class SOL004PackageException(Exception): |
| 67 | pass |
| 68 | |
| 69 | |
| bravof | 98fc8f0 | 2021-11-04 21:16:00 -0300 | [diff] [blame] | 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" |
| 79 | ) |
| 80 | _MANIFEST_VNFM_INFO = "vnfm_info" |
| 81 | |
| 82 | _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 | |
| garciadeblas | 2644b76 | 2021-03-24 09:21:01 +0100 | [diff] [blame] | 93 | def __init__(self, package_path=""): |
| bravof | 98fc8f0 | 2021-11-04 21:16:00 -0300 | [diff] [blame] | 94 | super().__init__(package_path) |
| garciaale | 0839503 | 2021-01-15 13:04:05 -0300 | [diff] [blame] | 95 | |
| bravof | 98fc8f0 | 2021-11-04 21:16:00 -0300 | [diff] [blame] | 96 | def generate_manifest_data_from_descriptor(self): |
| 97 | descriptor_path = os.path.join( |
| 98 | self._package_path, self.get_descriptor_location() |
| garciadeblas | 2644b76 | 2021-03-24 09:21:01 +0100 | [diff] [blame] | 99 | ) |
| bravof | 98fc8f0 | 2021-11-04 21:16:00 -0300 | [diff] [blame] | 100 | with open(descriptor_path, "r") as descriptor: |
| 101 | try: |
| 102 | vnfd_data = yaml.safe_load(descriptor)["vnfd"] |
| 103 | except yaml.YAMLError as e: |
| 104 | print("Error reading descriptor {}: {}".format(descriptor_path, e)) |
| 105 | return |
| garciaale | 0839503 | 2021-01-15 13:04:05 -0300 | [diff] [blame] | 106 | |
| bravof | 98fc8f0 | 2021-11-04 21:16:00 -0300 | [diff] [blame] | 107 | self._manifest_metadata = {} |
| 108 | self._manifest_metadata[self._MANIFEST_VNFD_ID] = vnfd_data.get( |
| 109 | "id", "default-id" |
| garciadeblas | 2644b76 | 2021-03-24 09:21:01 +0100 | [diff] [blame] | 110 | ) |
| bravof | 98fc8f0 | 2021-11-04 21:16:00 -0300 | [diff] [blame] | 111 | self._manifest_metadata[self._MANIFEST_VNFD_PRODUCT_NAME] = vnfd_data.get( |
| 112 | "product-name", "default-product-name" |
| garciadeblas | 2644b76 | 2021-03-24 09:21:01 +0100 | [diff] [blame] | 113 | ) |
| bravof | 98fc8f0 | 2021-11-04 21:16:00 -0300 | [diff] [blame] | 114 | self._manifest_metadata[self._MANIFEST_VNFD_PROVIDER_ID] = vnfd_data.get( |
| 115 | "provider", "OSM" |
| garciadeblas | 2644b76 | 2021-03-24 09:21:01 +0100 | [diff] [blame] | 116 | ) |
| bravof | 98fc8f0 | 2021-11-04 21:16:00 -0300 | [diff] [blame] | 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() |
| garciadeblas | 2644b76 | 2021-03-24 09:21:01 +0100 | [diff] [blame] | 123 | ) |
| bravof | 98fc8f0 | 2021-11-04 21:16:00 -0300 | [diff] [blame] | 124 | self._manifest_metadata[ |
| 125 | self._MANIFEST_VNFD_COMPATIBLE_SPECIFICATION_VERSIONS |
| 126 | ] = "2.7.1" |
| 127 | self._manifest_metadata[self._MANIFEST_VNFM_INFO] = "OSM" |