Ejemplo n.º 1
0
 def validate_driver_types_missing_selectors(self, journal, validation_options, errors, warnings, descriptor_path):
     if os.path.exists(descriptor_path):
         descriptor = descriptor_utils.DescriptorParser().read_from_file(descriptor_path)
         driver_entries_needing_fix = self.__gather_driver_types_missing_selector_key(journal, validation_options, errors, warnings, descriptor, 'lifecycle')
         driver_entries_needing_fix.extend(self.__gather_driver_types_missing_selector_key(journal, validation_options, errors, warnings, descriptor, 'operations'))
         if 'default-driver' in descriptor.raw and isinstance(descriptor.default_driver, dict):
             for driver_type, driver_entry in descriptor.default_driver.items():
                 if 'infrastructure-type' in driver_entry:
                     driver_entries_needing_fix.append(driver_entry)
         if len(driver_entries_needing_fix) > 0:
             if validation_options.allow_autocorrect == True:
                 journal.event('Found lifecycle/operation/default-driver entries missing \'selector\' key before \'infrastructure-type\' [{0}], attempting to autocorrect by moving contents under a selector key'.format(descriptor_path))
                 managed_to_autocorrect = False
                 autocorrect_error = None
                 try:
                     for entry_needing_fix in driver_entries_needing_fix:
                         entry_needing_fix['selector'] = {'infrastructure-type': entry_needing_fix['infrastructure-type']}
                         entry_needing_fix.pop('infrastructure-type')
                     descriptor_utils.DescriptorParser().write_to_file(descriptor, descriptor_path)
                     managed_to_autocorrect = True
                 except Exception as e:
                     autocorrect_error = e
                 if not managed_to_autocorrect:
                     msg = 'Found lifecycle/operation/default-driver entries missing \'selector\' key before \'infrastructure-type\' [{0}]: Unable to autocorrect this issue, please add this information to the Resource descriptor manually instead'.format(descriptor_path)
                     if autocorrect_error is not None:
                         msg += ' (autocorrect error={0})'.format(str(autocorrect_error))
                     journal.error_event(msg)
                     errors.append(project_validation.ValidationViolation(msg))
                     return   
             else:
                 msg = 'Found lifecycle/operation/default-driver entries missing \'selector\' key before \'infrastructure-type\' [{0}]: this format is no longer supported by the Brent Resource Manager. Move infrastructure-type information under the selector key or enable the autocorrect option'.format(descriptor_path)
                 journal.error_event(msg)
                 errors.append(project_validation.ValidationViolation(msg))
                 return
Ejemplo n.º 2
0
 def __pull_descriptor(self, journal, backup_tool, backup_tree, lm_session,
                       references):
     journal.stage('Pulling descriptor for {0}'.format(
         self.source_config.name))
     descriptor_name = descriptors.descriptor_named(
         descriptors.TYPE_DESCRIPTOR_TYPE, self.source_config.full_name,
         self.source_config.version)
     descriptor_driver = lm_session.descriptor_driver
     journal.event('Pulling descriptor {0} from LM ({1})'.format(
         descriptor_name, lm_session.env.address))
     try:
         raw_descriptor = descriptor_driver.get_descriptor(descriptor_name)
         descriptor = descriptors.DescriptorParser().read_from_str(
             raw_descriptor)
     except lm_drivers.NotFoundException:
         msg = 'Descriptor {0} not found'.format(descriptor_name)
         journal.error_event(msg)
         return
     descriptor_path = self.tree.descriptor_file_path
     if os.path.exists(descriptor_path):
         self.__backup_descriptor(journal, backup_tool, backup_tree,
                                  descriptor_path)
     journal.event(
         'Saving pulled descriptor to {0}'.format(descriptor_path))
     descriptor = descriptor_mutations.DescriptorPullMutator(
         references, journal).apply(descriptor)
     descriptors.DescriptorParser().write_to_file(descriptor,
                                                  descriptor_path)
Ejemplo n.º 3
0
 def validate_unsupported_infrastructure(self, journal, validation_options, errors, warnings, descriptor_path, inf_path, lifecycle_path):
     if os.path.exists(descriptor_path):
         descriptor = descriptor_utils.DescriptorParser().read_from_file(descriptor_path)
         if 'infrastructure' in descriptor.raw and isinstance(descriptor.infrastructure, dict):
             entry_needing_lifecycle_fix = []
             entry_needing_discover_fix = []
             for inf_type, inf_entry in descriptor.infrastructure.items():
                 if 'template' in inf_entry:
                     entry_needing_lifecycle_fix.append(inf_type)
                 if 'discover' in inf_entry:
                     entry_needing_discover_fix.append(inf_type)
             if (len(entry_needing_lifecycle_fix) + len(entry_needing_discover_fix)) > 0:
                 if validation_options.allow_autocorrect == True:
                     journal.event('Found unsupported infrastructure entries referencing templates [{0}], attempting to autocorrect by moving contents to Create/Delete/queries entries in descriptor'.format(descriptor_path))
                     managed_to_autocorrect = False
                     autocorrect_error = None
                     try:
                         entry_needing_fix = entry_needing_lifecycle_fix + entry_needing_discover_fix
                         for inf_type in entry_needing_fix:
                             driver_type = inf_type
                             if inf_type == 'Openstack':
                                 driver_type = 'openstack'
                             elif inf_type == 'Kubernetes':
                                 driver_type = 'kubernetes'
                             target_lifecycle_path = os.path.join(lifecycle_path, driver_type)
                             if not os.path.exists(target_lifecycle_path):
                                 os.makedirs(target_lifecycle_path)
                             inf_entry = descriptor.infrastructure[inf_type]
                             self.__move_template_files(inf_path, target_lifecycle_path, inf_type, inf_entry)
                             if inf_type in entry_needing_lifecycle_fix:
                                 create_properties = None
                                 if inf_type == 'Openstack' and inf_entry.get('template', {}).get('template-type') == 'TOSCA':
                                     create_properties = {
                                         'template-type': {
                                             'value': inf_entry.get('template', {}).get('template-type')
                                         }
                                     }
                                 self.__add_driver_to_lifecycle(descriptor, driver_type, inf_type, create_properties=create_properties)
                             if inf_type in entry_needing_discover_fix:
                                 self.__add_driver_to_queries(descriptor, driver_type, inf_type)
                             descriptor.infrastructure[inf_type] = {}
                         descriptor_utils.DescriptorParser().write_to_file(descriptor, descriptor_path)
                         self.rename_inf_path = True
                         managed_to_autocorrect = True
                     except Exception as e:
                         autocorrect_error = e
                         raise
                     if not managed_to_autocorrect:
                         msg = 'Found unsupported infrastructure entries referencing templates [{0}]: this format is no longer supported by the Brent Resource Manager. Unable to autocorrect this issue, please add this information to the Create/Delete lifecycle and/or queries manually instead'.format(descriptor_path)
                         if autocorrect_error is not None:
                             msg += ' (autocorrect error={0})'.format(str(autocorrect_error))
                         journal.error_event(msg)
                         errors.append(project_validation.ValidationViolation(msg))
                         return   
                 else:
                     msg = 'Found infrastructure entries referencing templates [{0}]: this format is no longer supported by the Brent Resource Manager. Add this information to the Create/Delete lifecycle and/or queries instead or enable the autocorrect option'.format(descriptor_path)
                     journal.error_event(msg)
                     errors.append(project_validation.ValidationViolation(msg))
                     return
Ejemplo n.º 4
0
Archivo: staging.py Proyecto: IBM/lmctl
 def stage_descriptor(self,
                      orig_path,
                      relative_staging_path,
                      is_template=False):
     staged_path = self.stage_file(orig_path, relative_staging_path)
     descriptor = descriptor_utils.DescriptorParser().read_from_file(
         staged_path)
     descriptor = descriptor_mutations.DescriptorStageMutator(
         self.source_config, self.references,
         self.journal).apply(descriptor, is_template=is_template)
     descriptor_utils.DescriptorParser().write_to_file(
         descriptor, staged_path)
     return staged_path
Ejemplo n.º 5
0
 def __push_descriptor_template(self, journal, env_sessions):
     lm_session = env_sessions.lm
     descriptor_template_path = self.tree.descriptor_template_file_path
     if os.path.exists(descriptor_template_path):
         descriptor, descriptor_yml_str = descriptors.DescriptorParser(
         ).read_from_file_with_raw(descriptor_template_path)
         descriptor_name = descriptor.get_name()
         descriptor_template_driver = lm_session.descriptor_template_driver
         journal.event(
             'Checking for Descriptor Template {0} in LM ({1})'.format(
                 descriptor_name, descriptor_template_driver.lm_base))
         found = True
         try:
             descriptor_template_driver.get_descriptor_template(
                 descriptor_name)
         except lm_drivers.NotFoundException:
             found = False
         if found:
             journal.event(
                 'Descriptor Template {0} already exists, updating'.format(
                     descriptor_name))
             descriptor_template_driver.update_descriptor_template(
                 descriptor_name, descriptor_yml_str)
         else:
             journal.event(
                 'Not found, creating Descriptor Template {0}'.format(
                     descriptor_name))
             descriptor_template_driver.create_descriptor_template(
                 descriptor_yml_str)
Ejemplo n.º 6
0
 def __push_descriptor(self, journal, env_sessions):
     lm_session = env_sessions.lm
     descriptor_path = self.tree.descriptor_file_path
     descriptor, descriptor_yml_str = descriptors.DescriptorParser(
     ).read_from_file_with_raw(descriptor_path)
     descriptor_name = descriptor.get_name()
     descriptor_driver = lm_session.descriptor_driver
     journal.event('Checking for Descriptor {0} in LM ({1})'.format(
         descriptor_name, lm_session.env.address))
     found = True
     try:
         descriptor_driver.get_descriptor(descriptor_name)
     except lm_drivers.NotFoundException:
         found = False
     if found:
         journal.event('Descriptor {0} already exists, updating'.format(
             descriptor_name))
         descriptor_driver.update_descriptor(descriptor_name,
                                             descriptor_yml_str)
     else:
         journal.event(
             'Not found, creating Descriptor {0}'.format(descriptor_name))
         descriptor_driver.create_descriptor(descriptor_yml_str)
     env_sessions.mark_lm_updated()
     return descriptor_name
Ejemplo n.º 7
0
 def validate_descriptor(self, descriptor_path, errors, warnings, allow_autocorrect=False, is_template=False):
     if not os.path.exists(descriptor_path):
         msg = 'No descriptor found at: {0}'.format(descriptor_path)
         self.journal.error_event(msg)
         errors.append(validation.ValidationViolation(msg))
         return
     self.journal.event('Checking descriptor found at: {0}'.format(descriptor_path))
     descriptor = None
     try:
         descriptor = descriptor_utils.DescriptorParser().read_from_file(descriptor_path)
     except descriptor_utils.DescriptorParsingError as e:
         errors.append(validation.ValidationViolation('Descriptor [{0}]: could not be parsed: {1}'.format(descriptor_path, str(e))))
     else:
         if descriptor.has_name() is True:
             type_invalid = False
             name_invalid = False
             version_invalid = False
             descriptor_type, descriptor_name, descriptor_version = descriptor.get_split_name()
             expected_type = descriptor_utils.ASSEMBLY_DESCRIPTOR_TYPE
             if is_template:
                 expected_type = descriptor_utils.ASSEMBLY_TEMPLATE_DESCRIPTOR_TYPE
             if self.source_config.is_resource_project():
                 expected_type = descriptor_utils.RESOURCE_DESCRIPTOR_TYPE
             elif self.source_config.is_type_project():
                 expected_type = descriptor_utils.TYPE_DESCRIPTOR_TYPE
             if descriptor_type != expected_type:
                 errors.append(validation.ValidationViolation('Descriptor [{0}]: name \'{1}\' includes type \'{2}\' but this should be \'{3}\' based on project configuration'.format(descriptor_path, descriptor.get_name(),
                                                                                                                                                                         descriptor_type, expected_type)))
             if descriptor_name != self.source_config.full_name:
                 errors.append(validation.ValidationViolation('Descriptor [{0}]: name \'{1}\' includes \'{2}\' but this should be \'{3}\' based on project configuration'.format(descriptor_path, descriptor.get_name(),
                                                                                                                                                                     descriptor_name, self.source_config.full_name)))
             if descriptor_version != self.source_config.version:
                 errors.append(validation.ValidationViolation('Descriptor [{0}]: name \'{1}\' includes version \'{2}\' but this should be \'{3}\' based on project configuration'.format(descriptor_path, descriptor.get_name(),
                                                                                                                                                                             descriptor_version, self.source_config.version)))
             if type_invalid or name_invalid or version_invalid:
                 self.journal.error_event('Descriptor name validation failed')
         if not isinstance(descriptor.lifecycle, dict) and allow_autocorrect is True:
             self.journal.event('Found lifecycle list structure in Resource descriptor [{0}], attempting to autocorrect to latest structure'.format(descriptor_path))
             new_lifecycle = {}
             for lifecycle in descriptor.lifecycle:
                 new_lifecycle[lifecycle] = {}
             descriptor.lifecycle = new_lifecycle
             try:
                 descriptor_utils.DescriptorParser().write_to_file(descriptor, descriptor_path)
             except Exception as e:
                 self.journal.error_event('Failed to update lifecycle list structure in Resource descriptor [{0}]: {1}'.format(descriptor_path, str(e)))
Ejemplo n.º 8
0
 def __attempt_to_determine_version(self):
     try:
         potential_descriptor = os.path.join(self.root_path, 'Descriptor', 'assembly.yml')
         if os.path.exists(potential_descriptor):
             descriptor = descriptor_utils.DescriptorParser().read_from_file(potential_descriptor)
             return descriptor.get_version()
     except Exception as e:
         return None
Ejemplo n.º 9
0
 def __stage_descriptor(self, journal, source_stager, staging_tree):
     descriptor_path = self.tree.descriptor_file_path
     journal.stage('Staging type descriptor for {0} at {1}'.format(
         self.source_config.name, descriptor_path))
     staged_descriptor_path = source_stager.stage_descriptor(
         descriptor_path, staging_tree.descriptor_file_path)
     descriptor = descriptors.DescriptorParser().read_from_file(
         staged_descriptor_path)
     return descriptor.get_name()
Ejemplo n.º 10
0
 def __validate_unsupported_infrastructure_manifest(self, journal, validation_options, errors, warnings):
     inf_manifest_path = self.tree.infrastructure_manifest_file_path
     if os.path.exists(inf_manifest_path):
         if validation_options.allow_autocorrect == True:
             journal.event('Found unsupported infrastructure manifest [{0}], attempting to autocorrect by moving contents to Resource descriptor'.format(inf_manifest_path))
             managed_to_autocorrect = False
             autocorrect_error = None
             try:
                 with open(inf_manifest_path, 'r') as f:
                     inf_manifest_content = yaml.safe_load(f.read())
                 descriptor = descriptor_utils.DescriptorParser().read_from_file(self.get_main_descriptor())
                 descriptor.is_2_dot_1 = True
                 if 'templates' in inf_manifest_content:
                     for template_entry in inf_manifest_content['templates']:
                         if 'infrastructure_type' in template_entry:
                             infrastructure_type = template_entry['infrastructure_type']
                             template_file = template_entry.get('file', None)
                             template_type = template_entry.get('template_type', None)
                             descriptor.insert_infrastructure_template(infrastructure_type, template_file, template_type=template_type)
                 if 'discover' in inf_manifest_content:
                     for discover_entry in inf_manifest_content['discover']:
                         if 'infrastructure_type' in discover_entry:
                             infrastructure_type = discover_entry['infrastructure_type']
                             template_file = discover_entry.get('file', None)
                             template_type = discover_entry.get('template_type', None)
                             descriptor.insert_infrastructure_discover(infrastructure_type, template_file, template_type=template_type)
                 descriptor_utils.DescriptorParser().write_to_file(descriptor, self.get_main_descriptor())
                 os.rename(inf_manifest_path, inf_manifest_path + '.bak')
                 managed_to_autocorrect = True
             except Exception as e:
                 autocorrect_error = e
             if not managed_to_autocorrect:
                 msg = 'Found infrastructure manifest [{0}]: this file is no longer supported by the Brent Resource Manager. Unable to autocorrect this issue, please add this information to the Resource descriptor manually instead'.format(inf_manifest_path)
                 if autocorrect_error is not None:
                     msg += ' (autocorrect error={0})'.format(str(autocorrect_error))
                 journal.error_event(msg)
                 errors.append(project_validation.ValidationViolation(msg))
                 return    
         else:
             msg = 'Found infrastructure manifest [{0}]: this file is no longer supported by the Brent Resource Manager. Add this information to the Resource descriptor instead or enable the autocorrect option'.format(inf_manifest_path)
             journal.error_event(msg)
             errors.append(project_validation.ValidationViolation(msg))
             return
Ejemplo n.º 11
0
 def __create_descriptor(self, journal, source_request, file_ops,
                         source_tree, descriptor):
     file_ops.append(
         handlers_api.CreateDirectoryOp(source_tree.lm_definitions_path,
                                        handlers_api.EXISTING_IGNORE))
     descriptor_content = descriptor_utils.DescriptorParser().write_to_str(
         descriptor)
     file_ops.append(
         handlers_api.CreateFileOp(source_tree.descriptor_file_path,
                                   descriptor_content,
                                   handlers_api.EXISTING_IGNORE))
Ejemplo n.º 12
0
 def validate_unsupported_lifecycle_manifest(self, journal, validation_options, errors, warnings, lifecycle_manifest_path, descriptor_path):
     if os.path.exists(lifecycle_manifest_path) and os.path.exists(descriptor_path):
         if validation_options.allow_autocorrect == True:
             journal.event('Found unsupported lifecycle manifest [{0}], attempting to autocorrect by moving contents to Resource descriptor'.format(lifecycle_manifest_path))
             managed_to_autocorrect = False
             autocorrect_error = None
             try:
                 with open(lifecycle_manifest_path, 'r') as f:
                     lifecycle_manifest_content = yaml.safe_load(f.read())
                 descriptor = descriptor_utils.DescriptorParser().read_from_file(descriptor_path)
                 if 'types' in lifecycle_manifest_content:
                     for entry in lifecycle_manifest_content['types']:
                         if 'lifecycle_type' in entry and 'infrastructure_type' in entry:
                             lifecycle_type = entry['lifecycle_type']
                             infrastructure_type = entry['infrastructure_type']
                             if lifecycle_type in descriptor.default_driver:
                                 if 'selector' not in descriptor.default_driver[lifecycle_type]:
                                     descriptor.default_driver[lifecycle_type]['selector'] = {}
                                 if 'infrastructure-type' not in descriptor.default_driver[lifecycle_type]['selector']:
                                     descriptor.default_driver[lifecycle_type]['selector']['infrastructure-type'] = []
                                 descriptor.default_driver[lifecycle_type]['selector']['infrastructure-type'].append(infrastructure_type)
                             else:
                                 descriptor.insert_default_driver(lifecycle_type, [infrastructure_type])
                 descriptor_utils.DescriptorParser().write_to_file(descriptor, descriptor_path)
                 os.rename(lifecycle_manifest_path, lifecycle_manifest_path + '.bak')
                 managed_to_autocorrect = True
             except Exception as e:
                 autocorrect_error = e
             if not managed_to_autocorrect:
                 msg = 'Found lifecycle manifest [{0}]: this file is no longer supported by the Brent Resource Manager. Unable to autocorrect this issue, please add this information to the Resource descriptor manually instead'.format(lifecycle_manifest_path)
                 if autocorrect_error is not None:
                     msg += ' (autocorrect error={0})'.format(str(autocorrect_error))
                 journal.error_event(msg)
                 errors.append(project_validation.ValidationViolation(msg))
                 return 
         else:
             msg = 'Found lifecycle manifest [{0}]: this file is no longer supported by the Brent Resource Manager. Add this information to the Resource descriptor instead or enable the autocorrect option'.format(lifecycle_manifest_path)
             journal.error_event(msg)
             errors.append(project_validation.ValidationViolation(msg))
             return
Ejemplo n.º 13
0
 def execute(self):
     self.journal.event('Pushing ETSI Package Content')
     lm_session = self.env_sessions.lm
     pkg_driver = lm_session.pkg_mgmt_driver
     if (self.pkg_meta.is_etsi_ns_content()):
         # Need to get the descriptor to determin the full ID (descriptor_name) as namein the pkg_meta is not full
         descriptor_path = etsi_ns_handler_api.EtsiNsPkgContentTree(
             self.push_workspace).descriptor_definitions_file_path
         descriptor, descriptor_yml_str = descriptors.DescriptorParser(
         ).read_from_file_with_raw(descriptor_path)
         descriptor_name = descriptor.get_name()
         self.journal.event(
             'Removing any existing ETSI_NS assembly package named {0} (version: {1}) from TNC-O: {2} ({3})'
             .format(descriptor_name, self.pkg_meta.version,
                     lm_session.env.name, lm_session.env.address))
         try:
             pkg_driver.delete_nsd_package(descriptor_name)
         except lm_drivers.NotFoundException:
             self.journal.event(
                 'No package named {0} found'.format(descriptor_name))
         pkg_driver.onboard_nsd_package(descriptor_name, self.pkg.path)
     elif (self.pkg_meta.is_etsi_vnf_content()):
         descriptor_path = etsi_vnf_handler_api.EtsiVnfPkgContentTree(
             self.push_workspace).definitions_descriptor_file_path
         descriptor, descriptor_yml_str = descriptors.DescriptorParser(
         ).read_from_file_with_raw(descriptor_path)
         descriptor_name = descriptor.get_name()
         self.journal.event(
             'Removing any existing ETSI_NS assembly package named {0} (version: {1}) from TNC-O: {2} ({3})'
             .format(descriptor_name, self.pkg_meta.version,
                     lm_session.env.name, lm_session.env.address))
         try:
             pkg_driver.delete_package(descriptor_name)
         except lm_drivers.NotFoundException:
             self.journal.event(
                 'No package named {0} found'.format(descriptor_name))
         pkg_driver.onboard_package(descriptor_name, self.pkg.path)
     else:
         raise EtsiPushProcessError('Not an ETSI package, Not pushing.')
Ejemplo n.º 14
0
 def __clear_existing_descriptor(self, journal, env_sessions):
     lm_session = env_sessions.lm
     descriptor_path = self.tree.root_descriptor_file_path
     descriptor = descriptor_utils.DescriptorParser().read_from_file(descriptor_path)
     descriptor_name = descriptor.get_name()
     descriptor_version = descriptor.get_version()
     journal.event('Removing descriptor {0} from LM ({1})'.format(descriptor_name, lm_session.env.address))
     descriptor_driver = lm_session.descriptor_driver
     try:
         descriptor_driver.delete_descriptor(descriptor_name)
         env_sessions.mark_lm_updated()
     except lm_drivers.NotFoundException:
         journal.event('Descriptor {0} not found'.format(descriptor_name))
     return descriptor_name, descriptor_version
Ejemplo n.º 15
0
 def __determine_project_id(self):
     descriptor_path = self.tree.descriptor_file_path
     descriptor = descriptors.DescriptorParser().read_from_file(
         descriptor_path)
     descriptor_name = descriptor.get_name()
     return descriptor_name