import stat
import time
import uuid
+import collections
+import json
import tornado.web
def __init__(self, log):
self._log = log
- def _create_archive_from_package(self, archive_hdl, package, open_fn):
+ def _create_archive_from_package(self, archive_hdl, package, open_fn, top_level_dir=None):
orig_open = package.open
try:
package.open = open_fn
archive = rift.package.archive.TarPackageArchive.from_package(
- self._log, package, archive_hdl
+ self._log, package, archive_hdl, top_level_dir
)
return archive
finally:
return open_fn(rel_path)
- archive = self._create_archive_from_package(archive_hdl, package, open_wrapper)
+ archive = self._create_archive_from_package(archive_hdl, package, open_wrapper, new_desc_msg.name)
return archive
class ExportRpcHandler(mano_dts.AbstractRpcHandler):
- def __init__(self, log, dts, loop, application, store_map, exporter, catalog_map):
+ def __init__(self, log, dts, loop, application, store_map, exporter, onboarder, catalog_map):
"""
Args:
application: UploaderApplication
self.application = application
self.store_map = store_map
self.exporter = exporter
+ self.onboarder = onboarder
self.catalog_map = catalog_map
self.log = log
# Get the format for exporting
format_ = msg.export_format.lower()
- filename = None
+ # Initial value of the exported filename
+ self.filename = "{name}_{ver}".format(
+ name=desc_msg.name,
+ ver=desc_msg.version)
if grammar == 'tosca':
- filename = "{}.zip".format(transaction_id)
self.export_tosca(schema, format_, desc_type, desc_id, desc_msg, log, transaction_id)
+ filename = "{}.zip".format(self.filename)
log.message(message.FilenameMessage(filename))
else:
- filename = "{}.tar.gz".format(transaction_id)
self.export_rift(schema, format_, desc_type, desc_id, desc_msg, log, transaction_id)
+ filename = "{}.tar.gz".format(self.filename)
log.message(message.FilenameMessage(filename))
log.message(ExportSuccess())
"nsd": convert.RwNsdSerializer,
},
"mano": {
- "vnfd": convert.VnfdSerializer,
- "nsd": convert.NsdSerializer,
+ "vnfd": convert.RwVnfdSerializer,
+ "nsd": convert.RwNsdSerializer,
}
}
log, hdl
)
+ # Try to get the updated descriptor from the api endpoint so that we have
+ # the updated descriptor file in the exported archive and the name of the archive
+ # tar matches the name in the yaml descriptor file. Proceed with the current
+ # file if there's an error
+ #
+ json_desc_msg = src_serializer.to_json_string(desc_msg)
+ desc_name, desc_version = desc_msg.name, desc_msg.version
+ try:
+ d = collections.defaultdict(dict)
+ sub_dict = self.onboarder.get_updated_descriptor(desc_msg)
+ root_key, sub_key = "{0}:{0}-catalog".format(desc_type), "{0}:{0}".format(desc_type)
+ # root the dict under "vnfd:vnfd-catalog"
+ d[root_key] = sub_dict
+
+ json_desc_msg = json.dumps(d)
+ desc_name, desc_version = sub_dict[sub_key]['name'], sub_dict[sub_key]['version']
+
+ except Exception as e:
+ msg = "Exception {} raised - {}".format(e.__class__.__name__, str(e))
+ self.log.debug(msg)
+
+ # exported filename based on the updated descriptor name
+ self.filename = "{}_{}".format(desc_name, desc_version)
+
self.exporter.export_package(
package=package,
export_dir=self.application.export_dir,
- file_id=transaction_id,
- json_desc_str=src_serializer.to_json_string(desc_msg),
+ file_id = self.filename,
+ json_desc_str=json_desc_msg,
dest_serializer=dest_serializer,
)
if format_ != "yaml":
log.warn("Only yaml format supported for TOSCA export")
- if desc_type != "nsd":
- raise tornado.web.HTTPError(
- 400,
- "NSD need to passed to generate TOSCA: {}".format(desc_type))
-
def get_pkg_from_store(id_, type_):
package = None
# Attempt to get the package from the package store
return package
- pkg = tosca.ExportTosca()
-
- # Add NSD and related descriptors for exporting
- nsd_id = pkg.add_nsd(desc_msg, get_pkg_from_store(desc_id, "nsd"))
-
- catalog = self.catalog_map["vnfd"]
- for const_vnfd in desc_msg.constituent_vnfd:
- vnfd_id = const_vnfd.vnfd_id_ref
- if vnfd_id in catalog:
- pkg.add_vnfd(nsd_id,
- catalog[vnfd_id],
- get_pkg_from_store(vnfd_id, "vnfd"))
- else:
- raise tornado.web.HTTPError(
- 400,
- "Unknown VNFD descriptor {} for NSD {}".
- format(vnfd_id, nsd_id))
-
- # Create the archive.
- pkg.create_archive(transaction_id,
- dest=self.application.export_dir)
+ if desc_type == "nsd":
+ pkg = tosca.ExportTosca()
+
+ # Add NSD and related descriptors for exporting
+ nsd_id = pkg.add_nsd(desc_msg, get_pkg_from_store(desc_id, "nsd"))
+
+ catalog = self.catalog_map["vnfd"]
+ for const_vnfd in desc_msg.constituent_vnfd:
+ vnfd_id = const_vnfd.vnfd_id_ref
+ if vnfd_id in catalog:
+ pkg.add_vnfd(nsd_id,
+ catalog[vnfd_id],
+ get_pkg_from_store(vnfd_id, "vnfd"))
+ else:
+ raise tornado.web.HTTPError(
+ 400,
+ "Unknown VNFD descriptor {} for NSD {}".
+ format(vnfd_id, nsd_id))
+
+ # Create the archive.
+ pkg.create_archive(transaction_id,
+ dest=self.application.export_dir)
+ if desc_type == "vnfd":
+ pkg = tosca.ExportTosca()
+ vnfd_id = desc_msg.id
+ pkg.add_single_vnfd(vnfd_id,
+ desc_msg,
+ get_pkg_from_store(vnfd_id, "vnfd"))
+
+ # Create the archive.
+ pkg.create_archive(transaction_id,
+ dest=self.application.export_dir)
class ExportStateHandler(state.StateHandler):