示例#1
0
    def _check_license(self, attribute, value):
        # load or return already loaded data
        licenses = spdx_licenses.get_spdx()

        valid = licenses.get(value, None)
        if valid is None:
            self.value_error("Expecting 'license' to be a valid SPDX license ID, instead found '%s'. "
                             "For more info, visit https://spdx.org" % value)

        # license was in list, but is deprecated
        if valid and valid.get('deprecated', None):
            print("Warning: collection metadata 'license' value '%s' is "
                  "deprecated." % value)
示例#2
0
    def _check_licenses(self, attribute, value):
        '''Validate that 'licenses' value is a list of valid license identifiers'''

        # load or return already loaded data
        valid_license_ids = spdx_licenses.get_spdx()

        invalid_licenses = [
            license_id for license_id in value
            if not self._is_valid_license_id(license_id, valid_license_ids)
        ]

        if invalid_licenses:
            self.value_error(
                "Expecting '%s' to be a list of valid SPDX license identifiers, instead found invalid license identifiers: '%s' "
                "in 'license' value %s. "
                "For more info, visit https://spdx.org" %
                (attribute.name, ','.join(
                    [str(license_value)
                     for license_value in invalid_licenses]), value))
示例#3
0
def migrate(migrate_role_context, display_callback):

    log.debug('migrate_role_context: %s', migrate_role_context)

    # validate paths

    # load role from migrate_role_context.role_path
    # though, that may be just loading the role_path/meta/main.yml

    dir_basename = os.path.basename(
        os.path.normpath(migrate_role_context.role_path))
    log.debug('dir_basename: %s', dir_basename)

    name_parts = dir_basename.split('.', 1)

    role_name = name_parts[0]
    role_namespace = None

    if len(name_parts) == 2:
        role_namespace = name_parts[0]
        role_name = name_parts[1]

    role_name = migrate_role_context.role_name or role_name

    collection_name = migrate_role_context.collection_name or role_name
    collection_namespace = migrate_role_context.collection_namespace or role_namespace

    role_md = role_metadata.load_from_dir(
        migrate_role_context.role_path,
        role_name=migrate_role_context.role_name)

    log.debug('role_metadata: %s', role_md)

    valid_licenses = spdx_licenses.get_spdx()

    # Check this here so errors can show more context
    if valid_licenses.get(role_md.license, None) is None:
        display_callback(
            'The value for "license" found in "%s" is "%s" which is not a valid SPDX license'
            % (migrate_role_context.role_path, role_md.license),
            level='warning')

    if valid_licenses.get(migrate_role_context.collection_license,
                          None) is None:
        display_callback(
            'The value provided by --license is "%s" which is not a valid SPDX license'
            % migrate_role_context.collection_license,
            level='warning')

    collection_license = migrate_role_context.collection_license or role_md.license

    #  maybe some file tree walking

    # (or just let CollectionInfo construct fail...)
    # verify/validate namespace and names are valid for collections
    # verify version number is valid for collection

    # create/populate dicts for collection_info
    # fill in namespace, name, version, deps, tags, etc

    # migrate role style dependencies dict to a collections style
    # list of dicts
    # collection_deps = OrderedDict([tuple(key, role_md.dependencies[key]) for key in role_md.dependencies])
    collection_deps = OrderedDict([(req.requirement_spec.label,
                                    str(req.requirement_spec.version_spec))
                                   for req in role_md.dependencies])

    log.debug('collection_deps: %s', collection_deps)

    # FIXME: license format is different, will have to map
    collection_info_dict = OrderedDict([
        # TODO: namespace, name
        ('namespace', collection_namespace),
        ('name', collection_name),
        ('version', migrate_role_context.collection_version),
        ('license', collection_license),
        ('description', role_md.description),
        # FIXME: verify role_md.author is a list or single
        ('authors', [role_md.author]),
        ('tags', role_md.galaxy_tags),
        ('issues', role_md.issue_tracker),
        ('dependencies', collection_deps)
    ])

    log.debug('collection_info_dict: %s', collection_info_dict)

    # create a CollectionInfo
    try:
        col_info = CollectionInfo(**collection_info_dict)
    except ValueError as e:
        raise exceptions.GalaxyClientError(e)

    log.debug('col_info: %s', col_info)

    # write out galaxy.yml
    # persist CollectionInfo to output_path/galaxy.yml
    output_filename = os.path.join(migrate_role_context.output_path,
                                   'galaxy.yml')
    yaml_persist.save(col_info, output_filename)

    # hmmm... should probably have a Collection/Repository save()
    # support, but if not, do the equiv

    # create any needed dirs in output_path/ like roles/
    output_roles_dirpath = os.path.join(migrate_role_context.output_path,
                                        'roles')
    log.debug('creating dir at %s', output_roles_dirpath)

    try:
        os.makedirs(output_roles_dirpath)
    except OSError as e:
        if e.errno != errno.EEXIST:
            raise

    #  the roles/ subdir for this role name
    named_role_subdir_in_output = os.path.join(output_roles_dirpath,
                                               collection_name)

    # If the dest roles/$rolename/ dir exists, and --force was used, then delete roles/$rolename/ so we
    # can recreate it. It that dir exists and --force isn't provided, there will be an exception raised
    if migrate_role_context.output_force:
        log.debug('removing %s', named_role_subdir_in_output)
        shutil.rmtree(named_role_subdir_in_output)

    # TODO: should we migrate plugins and modules to be collection level
    #       or just keep the role level?
    log.debug('copytree %s -> %s', migrate_role_context.role_path,
              named_role_subdir_in_output)

    # cp role_path/role_stuff* dirs to output_path
    # FIXME/NOTE: This does nothing clever, it doesn't ignore anything, it doesn't copy an
    #             explicit list of dirs, doesn't ignore .git, etc.
    shutil.copytree(migrate_role_context.role_path,
                    named_role_subdir_in_output)

    # TODO: if there are modules or plugins using a bundled module_utils
    #       just moving the plugins isnt enough since the source code itself
    #       will need to be updated to use new plugin loader style paths

    # display any collected errors or messages
    # display the output path, maybe some summary of the migration results

    return os.EX_OK  # 0: