Ejemplo n.º 1
0
    def audit(self, pdc):
        # Query the data sources
        git_groups = list(self.atomic_component_groups_from_git(pdc))
        pdc_groups = [
            group for group in get_paged(pdc['component-groups']._)
            if group['group_type'] == self.group_type
        ]

        # Invert the lists of dicts into dicts of lists
        invert = lambda collection: dict([(group['release'], [
            component['name'] for component in group['components']
        ]) for group in collection])
        git_groups = invert(git_groups)
        pdc_groups = invert(pdc_groups)

        # Associate the two by release and normalize
        present, absent = {}, {}
        for release in set(git_groups.keys() + pdc_groups.keys()):
            # Convert each group to a set
            left = set(git_groups.get(release, []))
            right = set(pdc_groups.get(release, []))

            # Find and store their difference
            present[release] = right - left
            absent[release] = left - right

            # If the diff is empty, remove the key so we don't trigger an alert
            if not present[release]:
                del present[release]
            if not absent[release]:
                del absent[release]

        return present, absent
Ejemplo n.º 2
0
    def audit(self, pdc):
        # Query the data sources
        git_groups = list(self.atomic_component_groups_from_git(pdc))
        pdc_groups = [
            group for group in get_paged(pdc['component-groups']._)
            if group['group_type'] == self.group_type
        ]

        # Invert the lists of dicts into dicts of lists
        invert = lambda collection: dict([(
            group['release'],
            [component['name'] for component in group['components']]
        ) for group in collection ])
        git_groups = invert(git_groups)
        pdc_groups = invert(pdc_groups)

        # Associate the two by release and normalize
        present, absent = {}, {}
        for release in set(git_groups.keys() + pdc_groups.keys()):
            # Convert each group to a set
            left = set(git_groups.get(release, []))
            right = set(pdc_groups.get(release, []))

            # Find and store their difference
            present[release] = right - left
            absent[release] = left - right

            # If the diff is empty, remove the key so we don't trigger an alert
            if not present[release]:
                del present[release]
            if not absent[release]:
                del absent[release]

        return present, absent
Ejemplo n.º 3
0
    def audit(self, pdc):
        pkgdb_packages = pdcupdater.services.pkgdb_packages(
            self.pkgdb_url, extra=True)
        pdc_packages = get_paged(pdc['release-components']._)

        # normalize the two lists
        pkgdb_packages = set(
            (
                package['name'],
                pdcupdater.utils.pkgdb2release(collection),
                collection['branchname']
            )
            for package in pkgdb_packages
            for collection in package['collections']
        )
        pdc_packages = set(
            (p['name'], p['release']['release_id'], p['dist_git_branch'])
            for p in pdc_packages
        )

        # use set operators to determine the difference
        present = pdc_packages - pkgdb_packages
        absent = pkgdb_packages - pdc_packages

        return present, absent
Ejemplo n.º 4
0
    def global_component_info(self, args, global_component_id=None):
        global_component_id = global_component_id or args.global_component_id
        global_component = self.client['global-components'][global_component_id]._()

        component_contacts = get_paged(self.client['global-component-contacts']._,
                                       component=global_component['name'])
        update_component_contacts(global_component, component_contacts)

        if args.json:
            print json.dumps(global_component)
            return

        fmt = '{:20} {}'
        print fmt.format('ID', global_component['id'])
        print fmt.format('Name', global_component['name'])
        print fmt.format('Dist Git Path', global_component['dist_git_path'] or '')
        print fmt.format('Dist Git URL', global_component['dist_git_web_url'] or '')
        if global_component['labels']:
            print 'Labels:'
            for label in global_component['labels']:
                print ''.join(['\t', label['name']])

        if global_component['upstream']:
            print 'Upstream:'
            for key in ('homepage', 'scm_type', 'scm_url'):
                print ''.join(['\t', key, ':', '\t', global_component['upstream'][key]])

        if global_component['contacts']:
            print 'Contacts:'
            for global_component_contact in global_component['contacts']:
                print ''.join(['\tRole:\t', global_component_contact['role']])
                for name in ('username', 'mail_name'):
                    if name in global_component_contact['contact']:
                        print ''.join(['\t\tName:\t', global_component_contact['contact'][name]])
                print ''.join(['\t\tEmail:\t', global_component_contact['contact']['email']])
Ejemplo n.º 5
0
 def list_build_image(self, args):
     filters = extract_arguments(args)
     build_images = get_paged(self.client['build-images']._, **filters)
     if args.json:
         print json.dumps(list(build_images))
         return
     self._print_build_image_list(build_images, args.show_md5)
Ejemplo n.º 6
0
 def list_build_image(self, args):
     filters = extract_arguments(args)
     build_images = get_paged(self.client['build-images']._, **filters)
     if args.json:
         print json.dumps(list(build_images))
         return
     self._print_build_image_list(build_images, args.show_md5)
Ejemplo n.º 7
0
def _initialize_basics(pdc):
    """ Gotta have these before we can really do anything... """
    arches = [dict(name=name) for name in ["armhfp", "i386", "x86_64"]]
    pdc_arches = list(pdc_client.get_paged(pdc['arches']._))
    for arch in arches:
        if arch not in pdc_arches:
            log.info("Creating arch %r." % arch['name'])
            pdc['arches']._(arch)
Ejemplo n.º 8
0
    def image_list(self, args):
        filters = extract_arguments(args)
        images = get_paged(self.client.images._, **filters)
        if args.json:
            print json.dumps(list(images))
            return

        self._print_image_list(images, args.show_sha256)
Ejemplo n.º 9
0
    def rpm_list(self, args):
        filters = extract_arguments(args, prefix='filter_')
        if not filters:
            self.subparsers.choices.get('list').error('At least some filter must be used.')
        rpms = get_paged(self.client.rpms._, **filters)
        if args.json:
            print json.dumps(list(rpms))
            return

        for rpm in rpms:
            print '{id:10} {name:45} {epoch}:{version}-{release}.{arch}'.format(**rpm)
Ejemplo n.º 10
0
    def list_global_component_contacts(self, args):
        filters = extract_arguments(args, prefix='filter_')
        if not filters:
            self.subparsers.choices.get('list').error('At least some filter must be used.')
        global_component_contacts = get_paged(self.client['global-component-contacts']._, **filters)

        if args.json:
            print json.dumps(list(global_component_contacts))
            return
        if global_component_contacts:
            print_component_contacts(global_component_contacts)
Ejemplo n.º 11
0
    def audit(self, pdc):
        pkgdb_packages = pdcupdater.services.pkgdb_packages(self.pkgdb_url)
        pdc_packages = get_paged(pdc['global-components']._)

        # normalize the two lists
        pkgdb_packages = set([p['name'] for p in pkgdb_packages])
        pdc_packages = set([p['name'] for p in pdc_packages])

        # use set operators to determine the difference
        present = pdc_packages - pkgdb_packages
        absent = pkgdb_packages - pdc_packages

        return present, absent
Ejemplo n.º 12
0
    def audit(self, pdc):
        pkgdb_packages = pdcupdater.services.pkgdb_packages(self.pkgdb_url)
        pdc_packages = get_paged(pdc['global-components']._)

        # normalize the two lists
        pkgdb_packages = set([p['name'] for p in pkgdb_packages])
        pdc_packages = set([p['name'] for p in pdc_packages])

        # use set operators to determine the difference
        present = pdc_packages - pkgdb_packages
        absent = pkgdb_packages - pdc_packages

        return present, absent
Ejemplo n.º 13
0
    def list_global_component_contacts(self, args):
        filters = extract_arguments(args, prefix='filter_')
        if not filters:
            self.subparsers.choices.get('list').error(
                'At least some filter must be used.')
        global_component_contacts = get_paged(
            self.client['global-component-contacts']._, **filters)

        if args.json:
            print json.dumps(list(global_component_contacts))
            return
        if global_component_contacts:
            print_component_contacts(global_component_contacts)
Ejemplo n.º 14
0
    def global_component_info(self, args, global_component_id=None):
        if not global_component_id:
            global_component_id = self._get_component_id(
                args.global_component_name)
            if not global_component_id:
                self.subparsers.choices.get('info').error(
                    "This global component doesn't exist.\n")
        global_component = self.client['global-components'][
            global_component_id]._()

        component_contacts = get_paged(
            self.client['global-component-contacts']._,
            component=global_component['name'])
        update_component_contacts(global_component, component_contacts)

        if args.json:
            print json.dumps(global_component)
            return

        fmt = '{0:20} {1}'
        print fmt.format('ID', global_component['id'])
        print fmt.format('Name', global_component['name'])
        print fmt.format('Dist Git Path', global_component['dist_git_path']
                         or '')
        print fmt.format('Dist Git URL', global_component['dist_git_web_url']
                         or '')
        if global_component['labels']:
            print 'Labels:'
            for label in global_component['labels']:
                print ''.join(['\t', label['name']])

        if global_component['upstream']:
            print 'Upstream:'
            for key in ('homepage', 'scm_type', 'scm_url'):
                print ''.join(
                    ['\t', key, ':', '\t', global_component['upstream'][key]])

        if global_component['contacts']:
            print 'Contacts:'
            for global_component_contact in global_component['contacts']:
                print ''.join(['\tRole:\t', global_component_contact['role']])
                for name in ('username', 'mail_name'):
                    if name in global_component_contact['contact']:
                        print ''.join([
                            '\t\tName:\t',
                            global_component_contact['contact'][name]
                        ])
                print ''.join([
                    '\t\tEmail:\t',
                    global_component_contact['contact']['email']
                ])
Ejemplo n.º 15
0
    def audit(self, pdc):
        # Query the data sources
        old_composes = pdcupdater.services.old_composes(self.old_composes_url)
        pdc_composes = get_paged(pdc['composes']._)

        # normalize the two lists
        old_composes = set([idx for branch, idx, url in old_composes])
        pdc_composes = set([c['compose_id'] for c in pdc_composes])

        # use set operators to determine the difference
        present = pdc_composes - old_composes
        absent = old_composes - pdc_composes

        return present, absent
Ejemplo n.º 16
0
    def list_composes(self, args):
        filters = {}
        if not args.deleted:
            filters['deleted'] = False
        else:
            filters['deleted'] = args.deleted

        composes = get_paged(self.client.composes._, **filters)
        if args.json:
            print json.dumps(list(composes))
            return

        for compose in composes:
            print compose['compose_id']
Ejemplo n.º 17
0
    def list_composes(self, args):
        filters = {}
        if not args.deleted:
            filters['deleted'] = False
        else:
            filters['deleted'] = args.deleted

        composes = get_paged(self.client.composes._, **filters)
        if args.json:
            print json.dumps(list(composes))
            return

        for compose in composes:
            print compose['compose_id']
Ejemplo n.º 18
0
    def audit(self, pdc):
        # Query the data sources
        koji_rpms = sum(self._gather_koji_rpms(), [])
        pdc_rpms = get_paged(pdc['rpms']._)

        # Normalize the lists before comparing them.
        koji_rpms = set([json.dumps(r, sort_keys=True) for r in koji_rpms])
        pdc_rpms = set([json.dumps(r, sort_keys=True) for r in pdc_rpms])

        # use set operators to determine the difference
        present = pdc_rpms - koji_rpms
        absent = koji_rpms - pdc_rpms

        return present, absent
Ejemplo n.º 19
0
    def audit(self, pdc):
        # Query the data sources
        fas_persons = pdcupdater.services.fas_persons(**self.fas_config)
        pdc_persons = get_paged(pdc['persons']._)

        # normalize the two lists
        fas_persons = set([p['username'] for p in fas_persons])
        pdc_persons = set([p['username'] for p in pdc_persons])

        # use set operators to determine the difference
        present = pdc_persons - fas_persons
        absent = fas_persons - pdc_persons

        return present, absent
Ejemplo n.º 20
0
    def audit(self, pdc):
        # Query the data sources
        koji_rpms = sum(self._gather_koji_rpms(), [])
        pdc_rpms = get_paged(pdc['rpms']._)

        # Normalize the lists before comparing them.
        koji_rpms = set([json.dumps(r, sort_keys=True) for r in koji_rpms])
        pdc_rpms = set([json.dumps(r, sort_keys=True) for r in pdc_rpms])

        # use set operators to determine the difference
        present = pdc_rpms - koji_rpms
        absent = koji_rpms - pdc_rpms

        return present, absent
Ejemplo n.º 21
0
    def audit(self, pdc):
        # Query the data sources
        fas_persons = pdcupdater.services.fas_persons(**self.fas_config)
        pdc_persons = get_paged(pdc['persons']._)

        # normalize the two lists
        fas_persons = set([p['username'] for p in fas_persons])
        pdc_persons = set([p['username'] for p in pdc_persons])

        # use set operators to determine the difference
        present = pdc_persons - fas_persons
        absent = fas_persons - pdc_persons

        return present, absent
Ejemplo n.º 22
0
    def audit(self, pdc):
        # Query the data sources
        old_composes = pdcupdater.services.old_composes(self.old_composes_url)
        pdc_composes = get_paged(pdc['composes']._)

        # normalize the two lists
        old_composes = set([idx for branch, idx, url in old_composes])
        pdc_composes = set([c['compose_id'] for c in pdc_composes])

        # use set operators to determine the difference
        present = pdc_composes - old_composes
        absent = old_composes - pdc_composes

        return present, absent
Ejemplo n.º 23
0
def get_group_pk(pdc, target_group):
    """ Return the primary key int identifier for a component group. """
    # List all of our component groups
    groups = pdc_client.get_paged(pdc['component-groups']._)

    ignored_keys = ['components']
    for group in groups:
        # Iterate over them until we find "the one"
        if all([
                group[key] == target_group[key] for key in target_group
                if key not in ignored_keys
        ]):
            return group['id']

    # If we can't find it, then complain.
    raise ValueError("Could not find matching group for %r" % target_group)
Ejemplo n.º 24
0
    def list_releases(self, args):
        filters = {}
        if args.inactive:
            filters['active'] = False
        elif not args.all:
            filters['active'] = True

        releases = get_paged(self.client.releases._, **filters)
        if args.json:
            print json.dumps(list(releases))
            return

        fmt = '{:25} {:35} {}'
        for release in releases:
            print fmt.format(release['release_id'], release['name'],
                             'active' if release['active'] else 'inactive')
Ejemplo n.º 25
0
    def list_releases(self, args):
        filters = {}
        if args.inactive:
            filters['active'] = False
        elif not args.all:
            filters['active'] = True

        releases = get_paged(self.client.releases._, **filters)
        if args.json:
            print json.dumps(list(releases))
            return

        fmt = '{0:25} {1:35} {2}'
        for release in releases:
            print fmt.format(release['release_id'], release['name'],
                             'active' if release['active'] else 'inactive')
Ejemplo n.º 26
0
    def delete_matched_release_component_contact(self, args):
        filters = extract_arguments(args, prefix='filter_')
        if not filters:
            self.subparsers.choices.get('delete-match').error('At least some filter must be used.')
        release_component_contacts = get_paged(self.client['release-component-contacts']._, **filters)

        release_component_contacts = list(release_component_contacts)
        match_count = len(release_component_contacts)
        if match_count == 1:
            self.client['release-component-contacts'
                        ][release_component_contacts[0]['id']]._("DELETE", {})
        elif match_count < 1:
            print "No match, nothing to do."
        else:
            print "Multi matches, please delete via ID or provide more restrictions."
            print_component_contacts(release_component_contacts)
Ejemplo n.º 27
0
def get_group_pk(pdc, target_group):
    """ Return the primary key int identifier for a component group. """
    # List all of our component groups
    groups = pdc_client.get_paged(pdc['component-groups']._)

    ignored_keys = ['components']
    for group in groups:
        # Iterate over them until we find "the one"
        if all([
            group[key] == target_group[key]
            for key in target_group
            if key not in ignored_keys
        ]):
            return group['id']

    # If we can't find it, then complain.
    raise ValueError("Could not find matching group for %r" % target_group)
Ejemplo n.º 28
0
    def release_component_info(self, args, release_component_id=None):
        if not release_component_id:
            release_component_id = self._get_release_component_id(args.release, args.name)
        if not release_component_id:
            self.subparsers.choices.get('info').error("This release component doesn't exist.\n")
        args.release_component_id = release_component_id
        if 'include_inactive_release' in args and args.include_inactive_release:
            release_component = self.client['release-components'][release_component_id]._(
                include_inactive_release=args.include_inactive_release)
        else:
            release_component = self.client['release-components'][release_component_id]._()
        release_id = self._get_release_id(release_component)

        component_contacts = get_paged(self.client['release-component-contacts']._,
                                       component=release_component['name'],
                                       release=release_id)
        update_component_contacts(release_component, component_contacts)

        if args.json:
            print json.dumps(release_component)
            return

        fmt = '{0:20} {1}'
        print fmt.format('ID', release_component['id'])
        print fmt.format('Name', release_component['name'])
        print fmt.format('Release ID', release_id)
        print fmt.format('Global Component', release_component['global_component'])
        print fmt.format('Bugzilla Component',
                         release_component['bugzilla_component']['name']
                         if release_component['bugzilla_component'] else '')
        print fmt.format('Brew Package', release_component['brew_package'] or '')
        print fmt.format('Dist Git Branch', release_component['dist_git_branch'] or '')
        print fmt.format('Dist Git URL', release_component['dist_git_web_url'] or '')
        print fmt.format('Activity', 'active' if release_component['active'] else 'inactive')
        print fmt.format('Type', release_component['type'])
        print fmt.format('Srpm Name', release_component['srpm']['name'] if release_component['srpm'] else 'null')

        if release_component['contacts']:
            print 'Contacts:'
            for release_component_contact in release_component['contacts']:
                print ''.join(['\tRole:\t', release_component_contact['role']])
                for name in ('username', 'mail_name'):
                    if name in release_component_contact['contact']:
                        print ''.join(['\t\tName:\t', release_component_contact['contact'][name]])
                print ''.join(['\t\tEmail:\t', release_component_contact['contact']['email']])
Ejemplo n.º 29
0
    def delete_matched_release_component_contact(self, args):
        filters = extract_arguments(args, prefix='filter_')
        if not filters:
            self.subparsers.choices.get('delete-match').error(
                'At least some filter must be used.')
        release_component_contacts = get_paged(
            self.client['release-component-contacts']._, **filters)

        release_component_contacts = list(release_component_contacts)
        match_count = len(release_component_contacts)
        if match_count == 1:
            self.client['release-component-contacts'][
                release_component_contacts[0]['id']]._("DELETE", {})
        elif match_count < 1:
            print "No match, nothing to do."
        else:
            print "Multi matches, please delete via ID or provide more restrictions."
            print_component_contacts(release_component_contacts)
Ejemplo n.º 30
0
    def audit(self, pdc):
        pkgdb_packages = pdcupdater.services.pkgdb_packages(self.pkgdb_url,
                                                            extra=True)
        pdc_packages = get_paged(pdc['release-components']._)

        # normalize the two lists
        pkgdb_packages = set(
            (package['name'], pdcupdater.utils.pkgdb2release(collection),
             collection['branchname']) for package in pkgdb_packages
            for collection in package['collections'])
        pdc_packages = set(
            (p['name'], p['release']['release_id'], p['dist_git_branch'])
            for p in pdc_packages)

        # use set operators to determine the difference
        present = pdc_packages - pkgdb_packages
        absent = pkgdb_packages - pdc_packages

        return present, absent
Ejemplo n.º 31
0
    def list_release_components(self, args):
        filters = extract_arguments(args, prefix='filter_')
        if not filters:
            self.subparsers.choices.get('list').error('At least some filter must be used.')
        if 'include_inactive_release' in args and args.include_inactive_release:
            filters['include_inactive_release'] = True
        release_components = get_paged(self.client['release-components']._, **filters)

        if args.json:
            print json.dumps(list(release_components))
            return

        if release_components:
            for release_component in release_components:
                release_id = self._get_release_id(release_component)
                print '{:<10} {:25} {}'.format(
                      release_component['id'],
                      release_id,
                      release_component['name'])
Ejemplo n.º 32
0
    def list_release_components(self, args):
        filters = extract_arguments(args, prefix='filter_')
        if not filters:
            self.subparsers.choices.get('list').error(
                'At least some filter must be used.')
        if 'include_inactive_release' in args and args.include_inactive_release:
            filters['include_inactive_release'] = True

        release_components = get_paged(self.client['release-components']._,
                                       **filters)

        if args.json:
            print json.dumps(list(release_components))
            return

        if release_components:
            for release_component in release_components:
                release_id = self._get_release_id(release_component)
                print '{0:<10} {1:25} {2}'.format(release_component['id'],
                                                  release_id,
                                                  release_component['name'])
Ejemplo n.º 33
0
    def release_info(self, args, release_id=None):
        release_id = release_id or args.release_id
        release = self.client.releases[release_id]._()
        variants = get_paged(self.client['release-variants']._,
                             release=release_id)
        if args.json:
            release['variants'] = list(variants)
            print json.dumps(release)
            return

        fmt = '{0:20} {1}'
        print fmt.format('Release ID', release['release_id'])
        print fmt.format('Name', release['name'])
        print fmt.format('Short Name', release['short'])
        print fmt.format('Version', release['version'])
        print fmt.format('Release Type', release['release_type'])
        print fmt.format('Product Version', release['product_version'] or '')
        print fmt.format('Base Product', release['base_product'] or '')
        print fmt.format('Activity',
                         'active' if release['active'] else 'inactive')
        print fmt.format('Integrated With', release['integrated_with'] or '')

        # Call plugins
        self.run_hook('release_info', release)

        if release['bugzilla']:
            print '\nBugzilla'
            print fmt.format('Product', release['bugzilla']['product'])

        if release['dist_git']:
            print '\nDist Git'
            print fmt.format('Branch', release['dist_git']['branch'])

        print '\nVariants'
        fmt = '{0:25} {1:20} {2:20} {3:15} {4}'
        print fmt.format('UID', 'ID', 'Name', 'Type', 'Arches')
        for variant in variants:
            print fmt.format(variant['uid'], variant['id'], variant['name'],
                             variant['type'], ', '.join(variant['arches']))
Ejemplo n.º 34
0
    def release_info(self, args, release_id=None):
        release_id = release_id or args.release_id
        release = self.client.releases[release_id]._()
        variants = get_paged(self.client['release-variants']._, release=release_id)
        if args.json:
            release['variants'] = list(variants)
            print json.dumps(release)
            return

        fmt = '{:20} {}'
        print fmt.format('Release ID', release['release_id'])
        print fmt.format('Name', release['name'])
        print fmt.format('Short Name', release['short'])
        print fmt.format('Version', release['version'])
        print fmt.format('Release Type', release['release_type'])
        print fmt.format('Product Version', release['product_version'] or '')
        print fmt.format('Base Product', release['base_product'] or '')
        print fmt.format('Activity', 'active' if release['active'] else 'inactive')
        print fmt.format('Integrated With', release['integrated_with'] or '')

        # Call plugins
        self.run_hook('release_info', release)

        if release['bugzilla']:
            print '\nBugzilla'
            print fmt.format('Product', release['bugzilla']['product'])

        if release['dist_git']:
            print '\nDist Git'
            print fmt.format('Branch', release['dist_git']['branch'])

        print '\nVariants'
        fmt = '{:25} {:20} {:20} {:15} {}'
        print fmt.format('UID', 'ID', 'Name', 'Type', 'Arches')
        for variant in variants:
            print fmt.format(variant['uid'], variant['id'], variant['name'],
                             variant['type'], ', '.join(variant['arches']))
Ejemplo n.º 35
0
    def release_component_info(self, args, release_component_id=None):
        if not release_component_id:
            release_component_id = self._get_release_component_id(
                args.release, args.name)
        if not release_component_id:
            self.subparsers.choices.get('info').error(
                "This release component doesn't exist.\n")
        args.release_component_id = release_component_id
        if 'include_inactive_release' in args and args.include_inactive_release:
            release_component = self.client['release-components'][
                release_component_id]._(
                    include_inactive_release=args.include_inactive_release)
        else:
            release_component = self.client['release-components'][
                release_component_id]._()
        release_id = self._get_release_id(release_component)

        component_contacts = get_paged(
            self.client['release-component-contacts']._,
            component=release_component['name'],
            release=release_id)
        update_component_contacts(release_component, component_contacts)

        if args.json:
            print json.dumps(release_component)
            return

        fmt = '{0:20} {1}'
        print fmt.format('ID', release_component['id'])
        print fmt.format('Name', release_component['name'])
        print fmt.format('Release ID', release_id)
        print fmt.format('Global Component',
                         release_component['global_component'])
        print fmt.format(
            'Bugzilla Component',
            release_component['bugzilla_component']['name']
            if release_component['bugzilla_component'] else '')
        print fmt.format('Brew Package', release_component['brew_package']
                         or '')
        print fmt.format('Dist Git Branch',
                         release_component['dist_git_branch'] or '')
        print fmt.format('Dist Git URL', release_component['dist_git_web_url']
                         or '')
        print fmt.format(
            'Activity',
            'active' if release_component['active'] else 'inactive')
        print fmt.format('Type', release_component['type'])
        print fmt.format(
            'Srpm Name', release_component['srpm']['name']
            if release_component['srpm'] else 'null')

        if release_component['contacts']:
            print 'Contacts:'
            for release_component_contact in release_component['contacts']:
                print ''.join(['\tRole:\t', release_component_contact['role']])
                for name in ('username', 'mail_name'):
                    if name in release_component_contact['contact']:
                        print ''.join([
                            '\t\tName:\t',
                            release_component_contact['contact'][name]
                        ])
                print ''.join([
                    '\t\tEmail:\t',
                    release_component_contact['contact']['email']
                ])