X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=common%2Fpython%2Frift%2Fmano%2Fyang_translator%2Frwmano%2Fyang_translator.py;h=09194943eab58671b34b9bb99552d5449e0be8c1;hb=93f10aabdba5a1c745d002654c0bb6345a682a47;hp=907a4a0e59f82296969b956dc47fff57091ae4ed;hpb=49868d2c71eb364cee9707515be6841a568dad40;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..09194943 100644 --- a/common/python/rift/mano/yang_translator/rwmano/yang_translator.py +++ b/common/python/rift/mano/yang_translator/rwmano/yang_translator.py @@ -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']) + if 'vnfd' in self.yangs: + for yang_vnfd in self.yangs['vnfd']: + self.output_files['vnfd'].append(yang_vnfd['short_name']) 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,36 +90,70 @@ 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'] + elif 'vnfd' in self.yangs: + sub_folder_name = self.yangs['vnfd'][0]['short_name'] + + + 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") + for tmpl_key in tmpl_out: + tmpl = tmpl_out[tmpl_key] + entry_file = os.path.join(def_dir, tmpl_key+'.yaml') + self.log.debug(_("Writing file {0}"). + format(entry_file)) + with open(entry_file, 'w+') as f: + f.write(tmpl[ToscaTemplate.TOSCA]) # Create the Tosca meta meta_dir = os.path.join(subdir, 'TOSCA-Metadata') @@ -116,7 +162,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, sub_folder_name+'.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 +170,55 @@ 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 + + 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 +226,7 @@ Entry-Definitions: Definitions/''' os.chdir(subdir) try: - zip_file = name + '.zip' + zip_file = key + '.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 +255,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