def run(self): orgName = self.get_option('org') prodName = self.get_option('name') envName = self.get_option('env') env = get_environment(orgName, envName) prod = get_product(orgName, prodName) returnCode = os.EX_OK cset = self.csapi.create(orgName, env["id"], self.create_cs_name()) try: self.csapi.add_content(cset["id"], "products", {'product_id': prod['id']}) task = self.csapi.promote(cset["id"]) task = AsyncTask(task) run_spinner_in_bg(wait_for_async_task, [task], message=_("Promoting the product, please wait... ")) if task.succeeded(): print _("Product [ %s ] promoted to environment [ %s ] " % (prodName, envName)) returnCode = os.EX_OK else: print _("Product [ %s ] promotion failed: %s" % (prodName, format_task_errors(task.errors())) ) returnCode = os.EX_DATAERR except Exception as e: #exception message is printed from action's main method raise e return returnCode
def run(self): org_name = self.get_option('org') group_name = self.get_option('name') install = self.get_option('install') job = None system_group = get_system_group(org_name, group_name) system_group_id = system_group['id'] if install: job = self.api.install_errata(org_name, system_group_id, install) if job: job_id = job["id"] print (_("Performing remote action [ %s ]... ") % job_id) job = SystemGroupAsyncJob(org_name, system_group_id, job) run_spinner_in_bg(wait_for_async_task, [job]) if job.succeeded(): print _("Remote action finished:") print job.get_status_message() return os.EX_OK else: print _("Remote action failed:") print job.get_status_message() return os.EX_DATAERR return os.EX_OK
def run(self): orgName = self.get_option('org') prodName = self.get_option('name') prodLabel = self.get_option('label') prodId = self.get_option('id') envName = self.get_option('environment') env = get_environment(orgName, envName) prod = get_product(orgName, prodName, prodLabel, prodId) returnCode = os.EX_OK cset = self.csapi.create(orgName, env["id"], self.create_cs_name(), constants.PROMOTION) try: self.csapi.add_content(cset["id"], "products", {'product_id': prod['id']}) task = self.csapi.apply(cset["id"]) task = AsyncTask(task) run_spinner_in_bg(wait_for_async_task, [task], message=_("Promoting the product, please wait... ")) if task.succeeded(): print _("Product [ %(prod_name)s ] promoted to environment [ %(envName)s ] " \ % {'prod_name':prod["name"], 'envName':envName}) returnCode = os.EX_OK else: print _("Product [ %(prod_name)s ] promotion failed: %(task_errors)s" \ % {'prod_name':prod["name"], 'task_errors':format_task_errors(task.errors())} ) returnCode = os.EX_DATAERR except Exception: #exception message is printed from action's main method raise return returnCode
def run(self): tplName = self.get_option('name') orgName = self.get_option('org') newName = self.get_option('new_name') desc = self.get_option('description') parentName = self.get_option('parent') content = self.getContent() env = get_library(orgName) if env == None: return os.EX_DATAERR template = get_template(orgName, env["name"], tplName) if template != None: if parentName != None: parentId = self.get_parent_id(orgName, env["name"], parentName) else: parentId = None run_spinner_in_bg(self.updateTemplate, [template["id"], newName, desc, parentId], _("Updating the template, please wait... ")) run_spinner_in_bg(self.updateContent, [template["id"], content], _("Updating the template, please wait... ")) print _("Successfully updated template [ %s ]") % template['name'] return os.EX_OK else: return os.EX_DATAERR
def discover_repositories(self, provider_id, url): print(_("Discovering repository urls, this could take some time...")) task = self.provider_api.repo_discovery(provider_id, url) run_spinner_in_bg(wait_for_async_task, [task]) repourls = self.provider_api.provider(provider_id)['discovered_repos'] if not len(repourls): system_exit(os.EX_OK, "No repositories discovered @ url location [%s]" % url) return repourls
def run(self): name = self.get_option('name') task = self.api.delete(name) task = AsyncTask(task) run_spinner_in_bg(wait_for_async_task, [task], message=_("Deleting the organization, please wait... ")) if task.succeeded(): print _("Successfully deleted org [ %s ]") % name return os.EX_OK else: print _("Organization [ %s ] deletion failed: %s" % (name, format_task_errors(task.errors())) ) return os.EX_DATAERR
def run(self): org_name = self.get_option('org') group_name = self.get_option('name') install = self.get_option('install') remove = self.get_option('remove') update = self.get_option('update') install_groups = self.get_option('install_groups') remove_groups = self.get_option('remove_groups') update_groups = self.get_option('update_groups') job = None system_group = get_system_group(org_name, group_name) system_group_id = system_group['id'] if install: job = self.api.install_packages(org_name, system_group_id, install) if remove: job = self.api.remove_packages(org_name, system_group_id, remove) if update: if update == '--all': update_packages = [] else: update_packages = update job = self.api.update_packages(org_name, system_group_id, update_packages) if install_groups: job = self.api.install_package_groups(org_name, system_group_id, install_groups) if remove_groups: job = self.api.remove_package_groups(org_name, system_group_id, remove_groups) if update_groups: job = self.api.update_package_groups(org_name, system_group_id, update_groups) if job: job_id = job["id"] print (_("Performing remote action [ %s ]... ") % job_id) job = SystemGroupAsyncJob(org_name, system_group_id, job) run_spinner_in_bg(wait_for_async_task, [job]) if job.succeeded(): print _("Remote action finished:") print job.get_status_message() return os.EX_OK else: print _("Remote action failed:") print job.get_status_message() return os.EX_DATAERR return os.EX_OK
def run(self): provName = self.get_option("name") orgName = self.get_option("org") manifestPath = self.get_option("file") force = self.get_option("force") try: f = open(get_abs_path(manifestPath)) except IOError: system_exit(os.EX_IOERR, _("File %s does not exist" % manifestPath)) prov = get_provider(orgName, provName) try: response = run_spinner_in_bg( self.api.import_manifest, (prov["id"], f, force), message=_("Importing manifest, please wait... ") ) except ServerRequestError, re: if ( re.args[0] == 400 and "displayMessage" in re.args[1] and re.args[1]["displayMessage"] == "Import is older than existing data" ): re.args[1]["displayMessage"] = ( "Import is older then existing data," + " please try with --force option to import manifest." ) raise re, None, sys.exc_info()[2]
def run(self): name = self.get_option('name') task = self.api.delete(name) task = AsyncTask(task) run_spinner_in_bg( wait_for_async_task, [task], message=_("Deleting the organization, please wait... ")) if task.succeeded(): print _("Successfully deleted org [ %s ]") % name return os.EX_OK else: print _("Organization [ %s ] deletion failed: %s" % (name, format_task_errors(task.errors()))) return os.EX_DATAERR
def run(self): csName = self.get_option('name') orgName = self.get_option('org') envName = self.get_option('env') cset = get_changeset(orgName, envName, csName) task = self.api.promote(cset["id"]) task = AsyncTask(task) run_spinner_in_bg(wait_for_async_task, [task], message=_("Promoting the changeset, please wait... ")) if task.succeeded(): print _("Changeset [ %s ] promoted" % csName) return os.EX_OK else: print _("Changeset [ %s ] promotion failed: %s" % (csName, format_task_errors(task.errors()))) return os.EX_DATAERR
def run(self): csName = self.get_option('name') orgName = self.get_option('org') envName = self.get_option('environment') cset = get_changeset(orgName, envName, csName) task = self.api.apply(cset["id"]) task = AsyncTask(task) run_spinner_in_bg(wait_for_async_task, [task], message=_("Applying the changeset, please wait... ")) if task.succeeded(): print _("Changeset [ %s ] applied" % csName) return os.EX_OK else: print _("Changeset [ %(csName)s ] promotion failed: %(task_errors)s" \ % {'csName':csName, 'task_errors':format_task_errors(task.errors())}) return os.EX_DATAERR
def discover_repositories(self, org_name, url): print(_("Discovering repository urls, this could take some time...")) task = self.api.repo_discovery(org_name, url, 'yum') discoveryResult = run_spinner_in_bg(wait_for_async_task, [task]) repourls = discoveryResult[0]['result'] or [] if not len(repourls): system_exit(os.EX_OK, "No repositories discovered @ url location [%s]" % url) return repourls
def run(self): tplName = self.get_option('name') orgName = self.get_option('org') newName = self.get_option('new_name') desc = self.get_option('description') parentName = self.get_option('parent') content = self.getContent() env = get_library(orgName) template = get_template(orgName, env["name"], tplName) if parentName != None: parentId = self.get_parent_id(orgName, env["name"], parentName) else: parentId = None run_spinner_in_bg(self.updateTemplate, [template["id"], newName, desc, parentId], _("Updating the template, please wait... ")) run_spinner_in_bg(self.updateContent, [template["id"], content], _("Updating the template, please wait... ")) print _("Successfully updated template [ %s ]") % template['name'] return os.EX_OK
def run(self): provName = self.get_option('name') orgName = self.get_option('org') prov = get_provider(orgName, provName) try: response = run_spinner_in_bg(self.api.delete_manifest, [prov["id"]], message=_("Deleting manifest, please wait... ")) except ServerRequestError, re: raise re, None, sys.exc_info()[2]
def run(self): csName = self.get_option('name') orgName = self.get_option('org') envName = self.get_option('env') cset = get_changeset(orgName, envName, csName) task = self.api.promote(cset["id"]) task = AsyncTask(task) run_spinner_in_bg( wait_for_async_task, [task], message=_("Promoting the changeset, please wait... ")) if task.succeeded(): print _("Changeset [ %s ] promoted" % csName) return os.EX_OK else: print _("Changeset [ %s ] promotion failed: %s" % (csName, format_task_errors(task.errors()))) return os.EX_DATAERR
def run(self): tplName = self.get_option("name") orgName = self.get_option("org") newName = self.get_option("new_name") desc = self.get_option("description") parentName = self.get_option("parent") content = self.getContent() env = get_library(orgName) template = get_template(orgName, env["name"], tplName) if parentName != None: parentId = self.get_parent_id(orgName, env["name"], parentName) else: parentId = None run_spinner_in_bg( self.updateTemplate, [template["id"], newName, desc, parentId], _("Updating the template, please wait... ") ) run_spinner_in_bg(self.updateContent, [template["id"], content], _("Updating the template, please wait... ")) print _("Successfully updated template [ %s ]") % template["name"] return os.EX_OK
class Discovery(RepoAction): description = _('discovery repositories contained within a URL') def setup_parser(self, parser): parser.add_option('--org', dest='org', help=_("organization name eg: foo.example.com (required)")) parser.add_option('--name', dest='name', help=_("repository name prefix to add to all the discovered repositories (required)")) parser.add_option("--url", dest="url", type="url", help=_("root url to perform discovery of repositories eg: http://porkchop.devel.redhat.com/ (required)")) parser.add_option("--assumeyes", action="store_true", dest="assumeyes", help=_("assume yes; automatically create candidate repositories for discovered urls (optional)")) parser.add_option('--product', dest='prod', help=_("product name (required)")) def check_options(self, validator): validator.require(('name', 'org', 'prod', 'url')) def run(self): name = self.get_option('name') url = self.get_option('url') assumeyes = self.get_option('assumeyes') prodName = self.get_option('prod') orgName = self.get_option('org') repourls = self.discover_repositories(orgName, url) self.printer.set_header(_("Repository Urls discovered @ [%s]" % url)) selectedurls = self.select_repositories(repourls, assumeyes) prod = get_product(orgName, prodName) self.create_repositories(orgName, prod["id"], name, selectedurls) return os.EX_OK def discover_repositories(self, org_name, url): print(_("Discovering repository urls, this could take some time...")) try: task = self.api.repo_discovery(org_name, url, 'yum') except Exception,e: system_exit(os.EX_DATAERR, _("Error: %s" % e)) discoveryResult = run_spinner_in_bg(wait_for_async_task, [task]) repourls = discoveryResult[0]['result'] or [] if not len(repourls): system_exit(os.EX_OK, "No repositories discovered @ url location [%s]" % url) return repourls
def run(self): desc = self.get_option('description') orgName = self.get_option('org') tplPath = self.get_option('file') env = get_library(orgName) try: f = self.open_file(tplPath) except: print _("File %s does not exist" % tplPath) return os.EX_IOERR response = run_spinner_in_bg(self.api.import_tpl, (env["id"], desc, f), message=_("Importing template, please wait... ")) print response f.close() return os.EX_OK
def run(self): tplName = self.get_option('name') orgName = self.get_option('org') envName = self.get_option('env') format = self.get_option('format') or "json" tplPath = self.get_option('file') template = get_template(orgName, envName, tplName) try: f = self.open_file(tplPath) except: print >> sys.stderr, _("Could not create file %s") % tplPath return os.EX_IOERR self.api.validate_tpl(template["id"], format) response = run_spinner_in_bg(self.api.export_tpl, (template["id"], format), message=_("Exporting template, please wait... ")) f.write(response) f.close() print _("Template was exported successfully to file %s") % tplPath return os.EX_OK
def run(self): provName = self.get_option('name') orgName = self.get_option('org') manifestPath = self.get_option('file') force = self.get_option('force') try: f = open(get_abs_path(manifestPath)) except: print _("File %s does not exist" % manifestPath) return os.EX_IOERR prov = get_provider(orgName, provName) if prov != None: try: response = run_spinner_in_bg(self.api.import_manifest, (prov["id"], f, force), message=_("Importing manifest, please wait... ")) except ServerRequestError, re: if re.args[0] == 400 and "displayMessage" in re.args[1] and re.args[1]["displayMessage"] == "Import is older than existing data": re.args[1]["displayMessage"] = "Import is older then existing data, please try with --force option to import manifest." raise re f.close() print response return os.EX_OK
def run(self): tplName = self.get_option("name") orgName = self.get_option("org") envName = self.get_option("environment") format_in = self.get_option("format") or "json" tplPath = self.get_option("file") template = get_template(orgName, envName, tplName) try: f = self.open_file(tplPath) except IOError: print >> sys.stderr, _("Could not create file [ %s ]") % tplPath return os.EX_IOERR self.api.validate_tpl(template["id"], format_in) response = run_spinner_in_bg( self.api.export_tpl, (template["id"], format_in), message=_("Exporting template, please wait... ") ) f.write(response) f.close() print _("Template was exported successfully to file [ %s ]") % tplPath return os.EX_OK
def run(self): provName = self.get_option('name') orgName = self.get_option('org') manifestPath = self.get_option('file') force = self.get_option('force') try: f = open(get_abs_path(manifestPath)) except: system_exit(os.EX_IOERR, _("File %s does not exist" % manifestPath)) prov = get_provider(orgName, provName) try: response = run_spinner_in_bg( self.api.import_manifest, (prov["id"], f, force), message=_("Importing manifest, please wait... ")) except ServerRequestError, re: if re.args[0] == 400 and "displayMessage" in re.args[1] and re.args[ 1]["displayMessage"] == "Import is older than existing data": re.args[1][ "displayMessage"] = "Import is older then existing data, please try with --force option to import manifest." raise re
def run(self): org_name = self.get_option('org') env_name = self.get_option('environment') sys_name = self.get_option('name') verbose = self.get_option('verbose') install = self.get_option('install') remove = self.get_option('remove') update = self.get_option('update') install_groups = self.get_option('install_groups') remove_groups = self.get_option('remove_groups') packages_separator = "," task = None if env_name is None: self.printer.set_header(_("Package Information for System [ %s ] in Org [ %s ]") % (sys_name, org_name)) else: self.printer.set_header(_("Package Information for System [ %s ] in Environment [ %s ] in Org [ %s ]") % (sys_name, env_name, org_name)) system = get_system(org_name, sys_name, env_name) system_id = system['uuid'] if install: task = self.api.install_packages(system_id, install.split(packages_separator)) if remove: task = self.api.remove_packages(system_id, remove.split(packages_separator)) if update: if update == '--all': update_packages = [] else: update_packages = update.split(packages_separator) task = self.api.update_packages(system_id, update_packages) if install_groups: task = self.api.install_package_groups(system_id, install_groups.split(packages_separator)) if remove_groups: task = self.api.remove_package_groups(system_id, remove_groups.split(packages_separator)) if task: uuid = task["uuid"] print (_("Performing remote action [ %s ]... ") % uuid) task = SystemAsyncTask(task) run_spinner_in_bg(wait_for_async_task, [task]) if task.succeeded(): print _("Remote action finished:") print task.get_result_description() return os.EX_OK else: print _("Remote action failed:") print task.get_result_description() return os.EX_DATAERR packages = self.api.packages(system_id) self.printer.add_column('name', show_with=printer.VerboseStrategy) self.printer.add_column('vendor', show_with=printer.VerboseStrategy) self.printer.add_column('version', show_with=printer.VerboseStrategy) self.printer.add_column('release', show_with=printer.VerboseStrategy) self.printer.add_column('arch', show_with=printer.VerboseStrategy) self.printer.add_column('name_version_release_arch', show_with=printer.GrepStrategy, item_formatter=lambda p: "%s-%s-%s.%s" % (p['name'], p['version'], p['release'], p['arch'])) self.printer.print_items(packages) return os.EX_OK
def run(self): org_name = self.get_option('org') env_name = self.get_option('environment') sys_name = self.get_option('name') verbose = self.get_option('verbose') install = self.get_option('install') remove = self.get_option('remove') update = self.get_option('update') install_groups = self.get_option('install_groups') remove_groups = self.get_option('remove_groups') packages_separator = "," task = None if env_name is None: self.printer.setHeader(_("Package Information for System [ %s ] in Org [ %s ]") % (sys_name, org_name)) systems = self.api.systems_by_org(org_name, {'name': sys_name}) else: self.printer.setHeader(_("Package Information for System [ %s ] in Environment [ %s ] in Org [ %s ]") % (sys_name, env_name, org_name)) systems = self.api.systems_by_env(org_name, env_name, {'name': sys_name}) if not systems: return os.EX_DATAERR system_id = systems[0]['uuid'] if install: task = self.api.install_packages(system_id, install.split(packages_separator)) if remove: task = self.api.remove_packages(system_id, remove.split(packages_separator)) if update: if update == '--all': update_packages = [] else: update_packages = update.split(packages_separator) task = self.api.update_packages(system_id, update_packages) if install_groups: task = self.api.install_package_groups(system_id, install_groups.split(packages_separator)) if remove_groups: task = self.api.remove_package_groups(system_id, remove_groups.split(packages_separator)) if task: uuid = task["uuid"] print (_("Performing remote action [ %s ]... ") % uuid) task = SystemAsyncTask(task) run_spinner_in_bg(wait_for_async_task, [task]) if task.succeeded(): print _("Remote action finished:") print task.get_result_description() return os.EX_OK else: print _("Remote action failed:") print task.get_result_description() return os.EX_DATAERR packages = self.api.packages(system_id) for p in packages: p['name_version_release_arch'] = "%s-%s-%s.%s" % \ (p['name'], p['version'], p['release'], p['arch']) if verbose: self.printer.addColumn('name') self.printer.addColumn('vendor') self.printer.addColumn('version') self.printer.addColumn('release') self.printer.addColumn('arch') else: # print compact list of package names only self.printer.addColumn('name_version_release_arch') self.printer._grep = True self.printer.printItems(packages) return os.EX_OK
def run(self): org_name = self.get_option('org') env_name = self.get_option('environment') sys_name = self.get_option('name') verbose = self.get_option('verbose') install = self.get_option('install') remove = self.get_option('remove') update = self.get_option('update') install_groups = self.get_option('install_groups') remove_groups = self.get_option('remove_groups') task = None if env_name is None: self.printer.set_header( _("Package Information for System [ %s ] in Org [ %s ]") % (sys_name, org_name)) else: self.printer.set_header( _("Package Information for System [ %s ] in Environment [ %s ] in Org [ %s ]" ) % (sys_name, env_name, org_name)) system = get_system(org_name, sys_name, env_name) system_id = system['uuid'] if install: task = self.api.install_packages(system_id, install) if remove: task = self.api.remove_packages(system_id, remove) if update: if update == '--all': update_packages = [] else: update_packages = update task = self.api.update_packages(system_id, update_packages) if install_groups: task = self.api.install_package_groups(system_id, install_groups) if remove_groups: task = self.api.remove_package_groups(system_id, remove_groups) if task: uuid = task["uuid"] print(_("Performing remote action [ %s ]... ") % uuid) task = SystemAsyncTask(task) run_spinner_in_bg(wait_for_async_task, [task]) if task.succeeded(): print _("Remote action finished:") print task.get_result_description() return os.EX_OK else: print _("Remote action failed:") print task.get_result_description() return os.EX_DATAERR packages = self.api.packages(system_id) self.printer.add_column('name', show_with=printer.VerboseStrategy) self.printer.add_column('vendor', show_with=printer.VerboseStrategy) self.printer.add_column('version', show_with=printer.VerboseStrategy) self.printer.add_column('release', show_with=printer.VerboseStrategy) self.printer.add_column('arch', show_with=printer.VerboseStrategy) self.printer.add_column( 'name_version_release_arch', show_with=printer.GrepStrategy, item_formatter=lambda p: "%s-%s-%s.%s" % (p['name'], p['version'], p['release'], p['arch'])) self.printer.print_items(packages) return os.EX_OK
def run(self): org_name = self.get_option("org") env_name = self.get_option("environment") sys_name = self.get_option("name") sys_uuid = self.get_option("uuid") install = self.get_option("install") remove = self.get_option("remove") update = self.get_option("update") install_groups = self.get_option("install_groups") remove_groups = self.get_option("remove_groups") task = None if env_name is None: self.printer.set_header(_("Package Information for System [ %s ] in Org [ %s ]") % (sys_name, org_name)) else: self.printer.set_header( _("Package Information for System [ %s ] in Environment [ %s ] in Org [ %s ]") % (sys_name, env_name, org_name) ) system = get_system(org_name, sys_name, env_name, sys_uuid) system_id = system["uuid"] if install: task = self.api.install_packages(system_id, install) if remove: task = self.api.remove_packages(system_id, remove) if update: if update == "--all": update_packages = [] else: update_packages = update task = self.api.update_packages(system_id, update_packages) if install_groups: task = self.api.install_package_groups(system_id, install_groups) if remove_groups: task = self.api.remove_package_groups(system_id, remove_groups) if task: uuid = task["uuid"] print (_("Performing remote action [ %s ]... ") % uuid) task = SystemAsyncTask(task) run_spinner_in_bg(wait_for_async_task, [task]) if task.succeeded(): print _("Remote action finished:") print task.get_result_description() return os.EX_OK else: print _("Remote action failed:") print task.get_result_description() return os.EX_DATAERR packages = self.api.packages(system_id) batch_add_columns( self.printer, "name", "vendor", "version", "release", "arch", show_with=printer.VerboseStrategy ) self.printer.add_column( "name_version_release_arch", show_with=printer.GrepStrategy, item_formatter=lambda p: "%s-%s-%s.%s" % (p["name"], p["version"], p["release"], p["arch"]), ) self.printer.print_items(packages) return os.EX_OK
def run(self): org_name = self.get_option('org') env_name = self.get_option('environment') sys_name = self.get_option('name') sys_uuid = self.get_option('uuid') install = self.get_option('install') remove = self.get_option('remove') update = self.get_option('update') install_groups = self.get_option('install_groups') remove_groups = self.get_option('remove_groups') task = None if env_name is None: self.printer.set_header(_("Package Information for System [ %(sys_name)s ] in Org [ %(org_name)s ]") \ % {'sys_name':sys_name, 'org_name':org_name}) else: self.printer.set_header(_("Package Information for System [ %(sys_name)s ] " \ "in Environment [ %(env_name)s ] in Org [ %(org_name)s ]") % \ {'sys_name':sys_name, 'env_name':env_name, 'org_name':org_name}) system = get_system(org_name, sys_name, env_name, sys_uuid) system_id = system['uuid'] if install: task = self.api.install_packages(system_id, install) if remove: task = self.api.remove_packages(system_id, remove) if update: if update == '--all': update_packages = [] else: update_packages = update task = self.api.update_packages(system_id, update_packages) if install_groups: task = self.api.install_package_groups(system_id, install_groups) if remove_groups: task = self.api.remove_package_groups(system_id, remove_groups) if task: uuid = task["uuid"] print (_("Performing remote action [ %s ]... ") % uuid) task = SystemAsyncTask(task) run_spinner_in_bg(wait_for_async_task, [task]) if task.succeeded(): print _("Remote action finished:") print task.get_result_description() return os.EX_OK else: print _("Remote action failed:") print task.get_result_description() return os.EX_DATAERR packages = self.api.packages(system_id) batch_add_columns(self.printer, {'name': _("Name")}, {'vendor': _("Vendor")}, \ {'version': _("Version")}, {'release': _("Release")}, {'arch': _("Arch")}, \ show_with=printer.VerboseStrategy) self.printer.add_column('name_version_release_arch', _("Name_Version_Release_Arch"), \ show_with=printer.GrepStrategy, \ item_formatter=lambda p: "%s-%s-%s.%s" % (p['name'], p['version'], p['release'], p['arch'])) self.printer.print_items(packages) return os.EX_OK