From 25e81be807767f4226c7037ee441bce011dc0f54 Mon Sep 17 00:00:00 2001 From: Vladimir Sedmik Date: Thu, 28 Nov 2024 19:24:33 +0100 Subject: [PATCH] Add Flatpak CLI support and CRUD case --- robottelo/cli/flatpak_remote.py | 55 ++++++++++++ robottelo/constants/__init__.py | 18 ++++ tests/foreman/cli/test_flatpak.py | 144 ++++++++++++++++++++++++++++++ 3 files changed, 217 insertions(+) create mode 100644 robottelo/cli/flatpak_remote.py create mode 100644 tests/foreman/cli/test_flatpak.py diff --git a/robottelo/cli/flatpak_remote.py b/robottelo/cli/flatpak_remote.py new file mode 100644 index 00000000000..d44b6701664 --- /dev/null +++ b/robottelo/cli/flatpak_remote.py @@ -0,0 +1,55 @@ +""" +Usage:: + + hammer flatpak-remote [OPTIONS] SUBCOMMAND [ARG] ... + +Parameters:: + + SUBCOMMAND Subcommand + [ARG] ... Subcommand arguments + +Subcommands:: + + create Create a flatpak remote + delete Delete a flatpak remote + info Show a flatpak remote + list List flatpak remotes + remote-repository View and manage flatpak remote repositories + scan Scan a flatpak remote + update Update a flatpak remote + +""" + +from robottelo.cli.base import Base + + +class FlatpakRemote(Base): + """ + Manipulates Flatpak remotes and repositories + """ + + command_base = 'flatpak-remote' + + @classmethod + def scan(cls, options=None, output_format=None): + """Scan a flatpak remote""" + cls.command_sub = 'scan' + return cls.execute(cls._construct_command(options), output_format=output_format) + + @classmethod + def repository_info(cls, options=None, output_format='csv'): + """Show a flatpak remote repository""" + cls.command_sub = 'remote-repository info' + return cls.execute(cls._construct_command(options), output_format=output_format) + + @classmethod + def repository_list(cls, options=None, output_format='csv'): + """List flatpak remote repositories""" + cls.command_sub = 'remote-repository list' + return cls.execute(cls._construct_command(options), output_format=output_format) + + @classmethod + def repository_mirror(cls, options=None, output_format=None): + """Mirror a flatpak remote repository""" + cls.command_sub = 'remote-repository mirror' + return cls.execute(cls._construct_command(options), output_format=output_format) diff --git a/robottelo/constants/__init__.py b/robottelo/constants/__init__.py index 8a0637f4c70..bc4bba9c066 100644 --- a/robottelo/constants/__init__.py +++ b/robottelo/constants/__init__.py @@ -746,6 +746,18 @@ } LABELLED_REPOS = [BOOTABLE_REPO, FLATPAK_REPO] CONTAINER_MANIFEST_LABELS = {'annotations', 'labels', 'is_bootable', 'is_flatpak'} + +FLATPAK_REMOTES = { + 'Fedora': { + 'url': 'https://registry.fedoraproject.org', + 'index_url': 'https://flatpaks.redhat.io/rhel/index/static?label:org.flatpak.ref:exists=1&tag=latest', + }, + 'RedHat': { + 'url': 'https://flatpaks.redhat.io', + 'index_url': 'https://registry.fedoraproject.org/index/static?label:org.flatpak.ref:exists=1&tag=latest', + }, +} + CONTAINER_CLIENTS = ['docker', 'podman'] CUSTOM_LOCAL_FOLDER = '/var/lib/pulp/imports/myrepo/' CUSTOM_LOCAL_FILE = '/var/lib/pulp/imports/myrepo/test.txt' @@ -1140,6 +1152,12 @@ 'destroy_alternate_content_sources', 'view_alternate_content_sources', ], + 'Katello::FlatpakRemote': [ + 'view_flatpak_remotes', + 'create_flatpak_remotes', + 'edit_flatpak_remotes', + 'destroy_flatpak_remotes', + ], 'KeyPair': ["view_keypairs", "destroy_keypairs"], 'Location': [ 'view_locations', diff --git a/tests/foreman/cli/test_flatpak.py b/tests/foreman/cli/test_flatpak.py new file mode 100644 index 00000000000..8a4247105bf --- /dev/null +++ b/tests/foreman/cli/test_flatpak.py @@ -0,0 +1,144 @@ +"""Capsule-Content related tests being run through CLI. + +:Requirement: Repository + +:CaseAutomation: Automated + +:CaseComponent: Repositories + +:team: Phoenix-content + +:CaseImportance: High + +""" + +import pytest + +from robottelo.constants import FLATPAK_REMOTES +from robottelo.exceptions import CLIReturnCodeError +from robottelo.utils.datafactory import gen_string + + +@pytest.fixture +def function_role(target_sat): + """An empty Role, no permissions""" + role = target_sat.api.Role().create() + yield role + role.delete() + + +@pytest.fixture +def function_user(target_sat, function_role, function_org): + """Non-admin user with an empty role assigned.""" + password = gen_string('alphanumeric') + user = target_sat.api.User( + login=gen_string('alpha'), + password=password, + role=[function_role], + organization=[function_org], + ).create() + user.password = password + yield user + user.delete() + + +def test_CRUD_and_sync_flatpak_remote_with_permissions( + target_sat, function_user, function_role, function_org +): + """Verify that Flatpak remote can be created, read, updated, scanned and deleted + only with appropriate permissions. + + :id: 3a8df09f-49bf-498f-8d71-7c0c3b4c505d + + :setup: + 1. Non-admin user with an empty role (no permissions yet) assigned. + + :steps: + Ensure that Flatpak remote can be + 1. listed only with proper permissions. + 2. created only with proper permissions. + 3. updated and scanned only with proper permissions. + 4. deleted only with proper permissions. + + :expectedresults: + 1. Every action succeeds only with the proper permission. + 2. The required permission is mentioned in the error message correctly. + + """ + emsg = 'Missing one of the required permissions: {}' + usr, pwd = function_user.login, function_user.password + + # 1. Ensure that remotes can be listed only with proper permissions. + p = 'view_flatpak_remotes' + with pytest.raises(CLIReturnCodeError) as e: + target_sat.cli.FlatpakRemote().with_user(usr, pwd).list() + assert emsg.format(p) in str(e) + + target_sat.api_factory.create_role_permissions(function_role, {'Katello::FlatpakRemote': [p]}) + res = ( + target_sat.cli.FlatpakRemote() + .with_user(usr, pwd) + .list({'organization-id': function_org.id}) + ) + assert len(res) == 0, f'Expected no remotes yet in the {function_org.name} org, but got {res}' + + # 2. Ensure that remotes can be created only with proper permissions. + p = 'create_flatpak_remotes' + with pytest.raises(CLIReturnCodeError) as e: + target_sat.cli.FlatpakRemote().with_user(usr, pwd).create( + { + 'organization-id': function_org.id, + 'url': FLATPAK_REMOTES['Fedora']['url'], + 'name': gen_string('alpha'), + } + ) + assert emsg.format(p) in str(e) + + target_sat.api_factory.create_role_permissions(function_role, {'Katello::FlatpakRemote': [p]}) + remote = ( + target_sat.cli.FlatpakRemote() + .with_user(usr, pwd) + .create( + { + 'organization-id': function_org.id, + 'url': FLATPAK_REMOTES['Fedora']['url'], + 'name': gen_string('alpha'), + } + ) + ) + res = target_sat.cli.FlatpakRemote().with_user(usr, pwd).info({'name': remote['name']}) + assert res == remote, 'Read values differ from the created ones' + + # 3. Ensure that remotes can be updated and scanned only with proper permissions. + p = 'edit_flatpak_remotes' + desc = gen_string('alpha') + with pytest.raises(CLIReturnCodeError) as e: + target_sat.cli.FlatpakRemote().with_user(usr, pwd).update( + {'name': remote['name'], 'description': desc} + ) + assert emsg.format(p) in str(e) + with pytest.raises(CLIReturnCodeError) as e: + target_sat.cli.FlatpakRemote().with_user(usr, pwd).scan({'name': remote['name']}) + assert emsg.format(p) in str(e) + + target_sat.api_factory.create_role_permissions(function_role, {'Katello::FlatpakRemote': [p]}) + target_sat.cli.FlatpakRemote().with_user(usr, pwd).update( + {'name': remote['name'], 'description': desc} + ) + target_sat.cli.FlatpakRemote().with_user(usr, pwd).scan({'name': remote['name']}) + res = target_sat.cli.FlatpakRemote().with_user(usr, pwd).info({'name': remote['name']}) + assert res['description'] == desc, 'Description was not updated' + assert 'http' in res['registry-url'], 'Scan of flatpak remote failed' + + # 4. Ensure that remotes can be deleted only with proper permissions. + p = 'destroy_flatpak_remotes' + with pytest.raises(CLIReturnCodeError) as e: + target_sat.cli.FlatpakRemote().with_user(usr, pwd).delete({'name': remote['name']}) + assert emsg.format(p) in str(e) + + target_sat.api_factory.create_role_permissions(function_role, {'Katello::FlatpakRemote': [p]}) + res = target_sat.cli.FlatpakRemote().with_user(usr, pwd).delete({'name': remote['name']}) + assert 'Flatpak Remote deleted' in res + with pytest.raises(CLIReturnCodeError) as e: + target_sat.cli.FlatpakRemote().with_user(usr, pwd).info({'name': remote['name']}) + assert 'Error: flatpak_remote not found' in str(e)