X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=common%2Fpython%2Frift%2Fmano%2Fyang_translator%2Frwmano%2Fyang_translator.py;h=a62bff371d73da1b3305e8b59157568119f835a6;hb=f314b4af9744068a7ed7a6a6314220c3aa857523;hp=907a4a0e59f82296969b956dc47fff57091ae4ed;hpb=6f07e6f33f751ab4ffe624f6037f887b243bece2;p=osm%2FSO.git diff --git a/common/python/rift/mano/yang_translator/rwmano/yang_translator.py b/common/python/rift/mano/yang_translator/rwmano/yang_translator.py index 907a4a0e..a62bff37 100644 --- a/common/python/rift/mano/yang_translator/rwmano/yang_translator.py +++ b/common/python/rift/mano/yang_translator/rwmano/yang_translator.py @@ -32,7 +32,7 @@ from rift.package.package import TarPackageArchive import rift.package.cloud_init import rift.package.script import rift.package.store - +import rift.package.icon class YangTranslator(object): '''Invokes translation methods.''' @@ -48,24 +48,36 @@ class YangTranslator(object): self.tosca_template = ToscaTemplate(log) self.node_translator = None self.pkgs = packages + self.output_files = {} + self.output_files['nsd'] = [] + self.output_files['vnfd'] = [] + log.info(_('Initialized parameters for translation.')) def translate(self): if self.files: self.get_yangs() + else: + if 'nsd' in self.yangs: + self.output_files['nsd'].append(self.yangs['nsd'][0]['short_name'].replace(' ','_')) + if 'vnfd' in self.yangs: + for yang_vnfd in self.yangs['vnfd']: + self.output_files['vnfd'].append(yang_vnfd['short_name'].replace(' ','_')) self.node_translator = TranslateDescriptors(self.log, self.yangs, - self.tosca_template) - + self.tosca_template, + self.output_files['vnfd']) self.tosca_template.resources = self.node_translator.translate() + return self.tosca_template.output_to_tosca() def get_yangs(self): '''Get the descriptors and convert to yang instances''' for filename in self.files: self.log.debug(_("Load file {0}").format(filename)) + # Only one descriptor per file if tarfile.is_tarfile(filename): tar = open(filename, "r+b") @@ -78,37 +90,77 @@ class YangTranslator(object): self.yangs[TranslateDescriptors.NSD] = [] self.yangs[TranslateDescriptors.NSD]. \ append(pkg.descriptor_msg.as_dict()) + if 'name' in pkg.descriptor_msg.as_dict() is not None: + self.output_files['nsd'].append(pkg.descriptor_msg.as_dict()['name']) + else: + raise ValidationError(message="NSD Descriptor name attribute is not populated ") elif desc_type == TranslateDescriptors.VNFD: if TranslateDescriptors.VNFD not in self.yangs: self.yangs[TranslateDescriptors.VNFD] = [] self.yangs[TranslateDescriptors.VNFD]. \ append(pkg.descriptor_msg.as_dict()) + if 'name' in pkg.descriptor_msg.as_dict() is not None: + self.output_files['vnfd'].append(pkg.descriptor_msg.as_dict()['name']) + else: + raise ValidationError(message="VNFD Descriptor name attribute is not populated ") else: raise ValidationError("Unknown descriptor type: {}". format(desc_type)) - def _create_csar_files(self, output_dir, name, tmpl, + def _create_csar_files(self, output_dir, tmpl_out, archive=False): - if ToscaTemplate.TOSCA not in tmpl: - self.log.error(_("Did not find TOSCA template for {0}"). - format(name)) - return - + ''' + for tmpl in tmpl_out: + if ToscaTemplate.TOSCA not in tmpl: + self.log.error(_("Did not find TOSCA template for {0}"). + format(tmpl)) + return + ''' # Create sub for each NS template - subdir = os.path.join(output_dir, name) + sub_folder_name = None + if self.files: + if len(self.output_files['nsd']) > 0: + if len(self.output_files['nsd']) == 1: + sub_folder_name = self.output_files['nsd'][0] + else: + raise ValidationError(message="Multiple NSD Descriptor uploaded ") + elif len(self.output_files['vnfd']) > 0: + if len(self.output_files['vnfd']) == 1: + sub_folder_name = self.output_files['vnfd'][0] + else: + raise ValidationError(message="Multiple VNFDs Descriptors uploaded without NSD") + else: + raise ValidationError(message="No NSD or VNFD uploaded") + else: + if 'nsd' in self.yangs: + sub_folder_name = self.yangs['nsd'][0]['short_name'].replace(' ','_') + elif 'vnfd' in self.yangs: + sub_folder_name = self.yangs['vnfd'][0]['short_name'].replace(' ','_') + + + subdir = os.path.join(output_dir, sub_folder_name) if os.path.exists(subdir): shutil.rmtree(subdir) os.makedirs(subdir) - + riftio_src_file = "{0}{1}".format(os.getenv('RIFT_INSTALL'), "/usr/rift/mano/common/riftiotypes.yaml") # Create the definitions dir def_dir = os.path.join(subdir, 'Definitions') os.makedirs(def_dir) - entry_file = os.path.join(def_dir, name+'.yaml') - self.log.debug(_("Writing file {0}"). - format(entry_file)) - with open(entry_file, 'w+') as f: - f.write(tmpl[ToscaTemplate.TOSCA]) + shutil.copy2(riftio_src_file, def_dir + "/riftiotypes.yaml") + tosca_meta_entry_file = None + for tmpl_key in tmpl_out: + tmpl = tmpl_out[tmpl_key] + file_name = tmpl_key.replace(' ','_') + entry_file = os.path.join(def_dir, file_name+'.yaml') + if file_name.endswith('nsd'): + tosca_meta_entry_file = file_name + self.log.debug(_("Writing file {0}"). + format(entry_file)) + with open(entry_file, 'w+') as f: + f.write(tmpl[ToscaTemplate.TOSCA]) + if tosca_meta_entry_file is None: + tosca_meta_entry_file = sub_folder_name # Create the Tosca meta meta_dir = os.path.join(subdir, 'TOSCA-Metadata') os.makedirs(meta_dir) @@ -116,7 +168,7 @@ class YangTranslator(object): CSAR-Version: 1.1 Created-By: RIFT.io Entry-Definitions: Definitions/''' - meta_data = "{}{}".format(meta, name+'.yaml') + meta_data = "{}{}".format(meta, tosca_meta_entry_file+'.yaml') meta_file = os.path.join(meta_dir, 'TOSCA.meta') self.log.debug(_("Writing file {0}:\n{1}"). format(meta_file, meta_data)) @@ -124,53 +176,64 @@ Entry-Definitions: Definitions/''' f.write(meta_data) # Copy other supporting files - if ToscaTemplate.FILES in tmpl: - for f in tmpl[ToscaTemplate.FILES]: - self.log.debug(_("Copy supporting file {0}").format(f)) - - # Search in source packages - if len(self.pkgs): - for pkg in self.pkgs: - # TODO(pjoseph): Need to add support for other file types - fname = f[ToscaResource.NAME] - dest_path = os.path.join(subdir, f[ToscaResource.DEST]) - ftype = f[ToscaResource.TYPE] - - if ftype == 'image': - image_file_map = rift.package.image.get_package_image_files(pkg) - - if fname in image_file_map: - self.log.debug(_("Extracting image {0} to {1}"). - format(fname, dest_path)) - pkg.extract_file(image_file_map[fname], - dest_path) - break - - elif ftype == 'script': - script_file_map = \ - rift.package.script.PackageScriptExtractor.package_script_files(pkg) - if fname in script_file_map: - self.log.debug(_("Extracting script {0} to {1}"). - format(fname, dest_path)) - pkg.extract_file(script_file_map[fname], - dest_path) - break - - elif ftype == 'cloud_init': - script_file_map = \ - rift.package.cloud_init.PackageCloudInitExtractor.package_script_files(pkg) - if fname in script_file_map: - self.log.debug(_("Extracting script {0} to {1}"). - format(fname, dest_path)) - pkg.extract_file(script_file_map[fname], - dest_path) - break - - else: - self.log.warn(_("Unknown file type {0}: {1}"). - format(ftype, f)) - - #TODO(pjoseph): Search in other locations + for key in tmpl_out: + tmpl = tmpl_out[key] + if ToscaTemplate.FILES in tmpl: + for f in tmpl[ToscaTemplate.FILES]: + self.log.debug(_("Copy supporting file {0}").format(f)) + + # Search in source packages + if len(self.pkgs): + for pkg in self.pkgs: + # TODO(pjoseph): Need to add support for other file types + fname = f[ToscaResource.NAME] + dest_path = os.path.join(subdir, f[ToscaResource.DEST]) + ftype = f[ToscaResource.TYPE] + + if ftype == 'image': + image_file_map = rift.package.image.get_package_image_files(pkg) + + if fname in image_file_map: + self.log.debug(_("Extracting image {0} to {1}"). + format(fname, dest_path)) + pkg.extract_file(image_file_map[fname], + dest_path) + break + + elif ftype == 'script': + script_file_map = \ + rift.package.script.PackageScriptExtractor.package_script_files(pkg) + if fname in script_file_map: + self.log.debug(_("Extracting script {0} to {1}"). + format(fname, dest_path)) + pkg.extract_file(script_file_map[fname], + dest_path) + break + + elif ftype == 'cloud_init': + script_file_map = \ + rift.package.cloud_init.PackageCloudInitExtractor.package_script_files(pkg) + if fname in script_file_map: + self.log.debug(_("Extracting script {0} to {1}"). + format(fname, dest_path)) + pkg.extract_file(script_file_map[fname], + dest_path) + break + elif ftype == 'icons': + icon_file_map = \ + rift.package.icon.PackageIconExtractor.package_icon_files(pkg) + if fname in icon_file_map: + self.log.debug(_("Extracting script {0} to {1}"). + format(fname, dest_path)) + pkg.extract_file(icon_file_map[fname], + dest_path) + break + + else: + self.log.warn(_("Unknown file type {0}: {1}"). + format(ftype, f)) + + #TODO(pjoseph): Search in other locations # Create the ZIP archive if archive: @@ -178,7 +241,7 @@ Entry-Definitions: Definitions/''' os.chdir(subdir) try: - zip_file = name + '.zip' + zip_file = sub_folder_name + '.zip' zip_path = os.path.join(output_dir, zip_file) self.log.debug(_("Creating zip file {0}").format(zip_path)) zip_cmd = "zip -r {}.partial ." @@ -207,14 +270,12 @@ Entry-Definitions: Definitions/''' archive=False,): if output: zip_files = [] - for key in output.keys(): - if output_dir: - zf = self._create_csar_files(output_dir, - key, - output[key], - archive=archive,) - zip_files.append(zf) - else: - print(_("TOSCA Template {0}:\n{1}"). - format(key, output[key])) + #for key in output.keys(): + if output_dir: + zf = self._create_csar_files(output_dir, + output, + archive=archive,) + zip_files.append(zf) + else: + print(_("There is an issue with TOSCA Template")) return zip_files