コード例 #1
0
def test_save(tmpdir):
    temp_dir = tmpdir.mkdir('mazer_collectio_info_unit_test')

    file_name = "example_collection_info1.yml"

    temp_file = temp_dir.join(file_name)

    test_data_path = os.path.join(os.path.dirname(__file__), '%s' % file_name)
    with open(test_data_path, 'r') as data_fd:
        res = collection_info.load(data_fd)

        log.debug('temp_file.strpath: %s', temp_file.strpath)
        yaml_persist.save(res, temp_file.strpath)

        # open the save()'ed file and load a new collection_artifact_manifest from it
        with open(temp_file.strpath, 'r') as read_fd:
            reloaded = collection_info.load(read_fd)

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

            # verify the object loaded from known example matches the example after
            # a save()/load() cycle
            assert reloaded == res

            # read the file again and log the file contents
            read_fd.seek(0)
            buf = read_fd.read()
            log.debug('buf: %s', buf)
コード例 #2
0
ファイル: migrate_role.py プロジェクト: devopsmike/mazer
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: