コード例 #1
0
ファイル: test_auth.py プロジェクト: ldjebran/robottelo
def test_positive_log_out_from_session(admin_user, target_sat):
    """Check if session is terminated when user logs out

    :id: 0ba05f2d-7b83-4b0c-a04c-80e62b7c4cf2

    :Steps:

        1. Set use_sessions
        2. Authenticate, assert credentials are not demanded
           on next command run
        3. Run `hammer auth logout`

    :expectedresults: The session is terminated

    """
    result = configure_sessions(target_sat)
    assert result == 0, 'Failed to configure hammer sessions'
    AuthLogin.basic({'username': admin_user['login'], 'password': password})
    result = Auth.with_user().status()
    assert LOGEDIN_MSG.format(admin_user['login']) in result[0]['message']
    # list organizations without supplying credentials
    assert Org.with_user().list()
    Auth.logout()
    result = Auth.with_user().status()
    assert LOGEDOFF_MSG.format(admin_user['login']) in result[0]['message']
    with pytest.raises(CLIReturnCodeError):
        Org.with_user().list()
コード例 #2
0
ファイル: test_auth.py プロジェクト: synkd/robottelo
def test_positive_change_session(admin_user, non_admin_user):
    """Change from existing session to a different session

    :id: b6ea6f3c-fcbd-4e7b-97bd-f3e0e6b9da8f

    :Steps:

        1. Set use_sessions
        2. Authenticate, assert credentials are not demanded
           on next command run
        3. Login as a different user

    :expectedresults: The session is altered

    """
    result = configure_sessions()
    assert result == 0, 'Failed to configure hammer sessions'
    AuthLogin.basic({'username': admin_user['login'], 'password': password})
    result = Auth.with_user().status()
    assert LOGEDIN_MSG.format(admin_user['login']) in result[0]['message']
    # list organizations without supplying credentials
    assert Org.with_user().list()
    AuthLogin.basic({
        'username': non_admin_user['login'],
        'password': password
    })
    result = Auth.with_user().status()
    assert LOGEDIN_MSG.format(non_admin_user['login']) in result[0]['message']
    assert Org.with_user().list()
コード例 #3
0
ファイル: test_auth.py プロジェクト: renzon/robottelo
    def test_positive_log_out_from_session(self):
        """Check if session is terminated when user logs out

        :id: 0ba05f2d-7b83-4b0c-a04c-80e62b7c4cf2

        :Steps:

            1. Set use_sessions
            2. Authenticate, assert credentials are not demanded
               on next command run
            3. Run `hammer auth logout`

        :expectedresults: The session is terminated

        """
        result = configure_sessions()
        self.assertEqual(result, 0, 'Failed to configure hammer sessions')
        Auth.login({'username': self.uname_admin, 'password': self.password})
        result = Auth.with_user().status()
        self.assertIn(LOGEDIN_MSG.format(self.uname_admin),
                      result[0][u'message'])
        # list organizations without supplying credentials
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
        Auth.logout()
        result = Auth.with_user().status()
        self.assertIn(LOGEDOFF_MSG.format(self.uname_admin),
                      result[0][u'message'])
        with self.assertRaises(CLIReturnCodeError):
            Org.with_user().list()
コード例 #4
0
ファイル: test_auth.py プロジェクト: vsedmik/robottelo
    def test_positive_session_survives_failed_login(self):
        """Check if session stays up after failed login attempt

        :id: 6c4d5c4c-eff0-411b-829f-0c2f2ec26132

        :BZ: 1465552

        :Steps:

            1. Set use_sessions
            2. Authenticate, assert credentials are not demanded
               on next command run
            3. Run login with invalid credentials

        :expectedresults: The session is unchanged

        """
        result = configure_sessions()
        self.assertEqual(result, 0, 'Failed to configure hammer sessions')
        AuthLogin.basic({'username': self.uname_admin, 'password': self.password})
        result = Auth.with_user().status()
        self.assertIn(LOGEDIN_MSG.format(self.uname_admin), result[0]['message'])
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
        # using invalid password
        with self.assertRaises(CLIReturnCodeError):
            AuthLogin.basic({'username': self.uname_viewer, 'password': gen_string('alpha')})
        # checking the session status again
        result = Auth.with_user().status()
        self.assertIn(LOGEDIN_MSG.format(self.uname_admin), result[0]['message'])
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
コード例 #5
0
ファイル: test_auth.py プロジェクト: renzon/robottelo
    def test_positive_change_session(self):
        """Change from existing session to a different session

        :id: b6ea6f3c-fcbd-4e7b-97bd-f3e0e6b9da8f

        :Steps:

            1. Set use_sessions
            2. Authenticate, assert credentials are not demanded
               on next command run
            3. Login as a different user

        :expectedresults: The session is altered

        """
        result = configure_sessions()
        self.assertEqual(result, 0, 'Failed to configure hammer sessions')
        Auth.login({'username': self.uname_admin, 'password': self.password})
        result = Auth.with_user().status()
        self.assertIn(LOGEDIN_MSG.format(self.uname_admin),
                      result[0][u'message'])
        # list organizations without supplying credentials
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
        Auth.login({'username': self.uname_viewer, 'password': self.password})
        result = Auth.with_user().status()
        self.assertIn(LOGEDIN_MSG.format(self.uname_viewer),
                      result[0][u'message'])
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
コード例 #6
0
    def test_positive_last_login_for_new_user(self):
        """Create new user with admin role and check last login updated for that user

        :id: 967282d3-92d0-42ce-9ef3-e542d2883408

        :customerscenario: true

        :expectedresults: last login should be updated for user after login using hammer

        :BZ: 1763816

        :CaseLevel: Integration
        """
        login = gen_string('alpha')
        password = gen_string('alpha')
        org_name = gen_string('alpha')

        make_user({'login': login, 'password': password})
        User.add_role({'login': login, 'role': 'System admin'})
        result_before_login = User.list({'search': f'login = {login}'})

        # this is because satellite uses the UTC timezone
        before_login_time = datetime.datetime.utcnow()
        assert result_before_login[0]['login'] == login
        assert result_before_login[0]['last-login'] == ""

        Org.with_user(username=login,
                      password=password).create({'name': org_name})
        result_after_login = User.list({'search': f'login = {login}'})

        # checking user last login should not be empty
        assert result_after_login[0]['last-login'] != ""
        after_login_time = datetime.datetime.strptime(
            result_after_login[0]['last-login'], "%Y/%m/%d %H:%M:%S")
        assert after_login_time > before_login_time
コード例 #7
0
ファイル: test_auth.py プロジェクト: ldjebran/robottelo
def test_positive_disable_session(admin_user, target_sat):
    """Check if user logs out when session is disabled

    :id: 38ee0d85-c2fe-4cac-a992-c5dbcec11031

    :Steps:

        1. Set use_sessions
        2. Authenticate, assert credentials are not demanded
           on next command run
        3. Disable use_sessions

    :expectedresults: The session is terminated

    """
    result = configure_sessions(target_sat)
    assert result == 0, 'Failed to configure hammer sessions'
    AuthLogin.basic({'username': admin_user['login'], 'password': password})
    result = Auth.with_user().status()
    assert LOGEDIN_MSG.format(admin_user['login']) in result[0]['message']
    # list organizations without supplying credentials
    assert Org.with_user().list()
    # disabling sessions
    result = configure_sessions(satellite=target_sat, enable=False)
    assert result == 0, 'Failed to configure hammer sessions'
    result = Auth.with_user().status()
    assert NOTCONF_MSG.format(admin_user['login']) in result[0]['message']
    with pytest.raises(CLIReturnCodeError):
        Org.with_user().list()
コード例 #8
0
ファイル: test_auth.py プロジェクト: JacobCallahan/robottelo
    def test_positive_session_survives_unauthenticated_call(self):
        """Check if session stays up after unauthenticated call

        :id: 8bc304a0-70ea-489c-9c3f-ea8343c5284c

        :Steps:

            1. Set use_sessions
            2. Authenticate, assert credentials are not demanded
               on next command run
            3. Run `hammer ping`

        :expectedresults: The session is unchanged

        """
        result = configure_sessions()
        self.assertEqual(result, 0, 'Failed to configure hammer sessions')
        Auth.login({'username': self.uname_admin, 'password': self.password})
        result = Auth.with_user().status()
        self.assertIn(
            LOGEDIN_MSG.format(self.uname_admin),
            result[0][u'message']
        )
        # list organizations without supplying credentials
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
        result = ssh.command('hammer ping')
        self.assertEqual(result.return_code, 0, 'Failed to run hammer ping')
        result = Auth.with_user().status()
        self.assertIn(
            LOGEDIN_MSG.format(self.uname_admin),
            result[0][u'message']
        )
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
コード例 #9
0
ファイル: test_auth.py プロジェクト: renzon/robottelo
    def test_positive_session_survives_unauthenticated_call(self):
        """Check if session stays up after unauthenticated call

        :id: 8bc304a0-70ea-489c-9c3f-ea8343c5284c

        :Steps:

            1. Set use_sessions
            2. Authenticate, assert credentials are not demanded
               on next command run
            3. Run `hammer ping`

        :expectedresults: The session is unchanged

        """
        result = configure_sessions()
        self.assertEqual(result, 0, 'Failed to configure hammer sessions')
        Auth.login({'username': self.uname_admin, 'password': self.password})
        result = Auth.with_user().status()
        self.assertIn(LOGEDIN_MSG.format(self.uname_admin),
                      result[0][u'message'])
        # list organizations without supplying credentials
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
        result = ssh.command('hammer ping')
        self.assertEqual(result.return_code, 0, 'Failed to run hammer ping')
        result = Auth.with_user().status()
        self.assertIn(LOGEDIN_MSG.format(self.uname_admin),
                      result[0][u'message'])
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
コード例 #10
0
ファイル: test_auth.py プロジェクト: JacobCallahan/robottelo
    def test_positive_change_session(self):
        """Change from existing session to a different session

        :id: b6ea6f3c-fcbd-4e7b-97bd-f3e0e6b9da8f

        :Steps:

            1. Set use_sessions
            2. Authenticate, assert credentials are not demanded
               on next command run
            3. Login as a different user

        :expectedresults: The session is altered

        """
        result = configure_sessions()
        self.assertEqual(result, 0, 'Failed to configure hammer sessions')
        Auth.login({'username': self.uname_admin, 'password': self.password})
        result = Auth.with_user().status()
        self.assertIn(
            LOGEDIN_MSG.format(self.uname_admin),
            result[0][u'message']
        )
        # list organizations without supplying credentials
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
        Auth.login({'username': self.uname_viewer, 'password': self.password})
        result = Auth.with_user().status()
        self.assertIn(
            LOGEDIN_MSG.format(self.uname_viewer),
            result[0][u'message']
        )
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
コード例 #11
0
ファイル: test_auth.py プロジェクト: JacobCallahan/robottelo
    def test_positive_log_out_from_session(self):
        """Check if session is terminated when user logs out

        :id: 0ba05f2d-7b83-4b0c-a04c-80e62b7c4cf2

        :Steps:

            1. Set use_sessions
            2. Authenticate, assert credentials are not demanded
               on next command run
            3. Run `hammer auth logout`

        :expectedresults: The session is terminated

        """
        result = configure_sessions()
        self.assertEqual(result, 0, 'Failed to configure hammer sessions')
        Auth.login({'username': self.uname_admin, 'password': self.password})
        result = Auth.with_user().status()
        self.assertIn(
            LOGEDIN_MSG.format(self.uname_admin),
            result[0][u'message']
        )
        # list organizations without supplying credentials
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
        Auth.logout()
        result = Auth.with_user().status()
        self.assertIn(
            LOGEDOFF_MSG.format(self.uname_admin),
            result[0][u'message']
        )
        with self.assertRaises(CLIReturnCodeError):
            Org.with_user().list()
コード例 #12
0
ファイル: test_auth.py プロジェクト: ldjebran/robottelo
def test_positive_session_survives_failed_login(admin_user, non_admin_user,
                                                target_sat):
    """Check if session stays up after failed login attempt

    :id: 6c4d5c4c-eff0-411b-829f-0c2f2ec26132

    :BZ: 1465552

    :Steps:

        1. Set use_sessions
        2. Authenticate, assert credentials are not demanded
           on next command run
        3. Run login with invalid credentials

    :expectedresults: The session is unchanged

    """
    result = configure_sessions(target_sat)
    assert result == 0, 'Failed to configure hammer sessions'
    AuthLogin.basic({'username': admin_user['login'], 'password': password})
    result = Auth.with_user().status()
    assert LOGEDIN_MSG.format(admin_user['login']) in result[0]['message']
    Org.with_user().list()
    # using invalid password
    with pytest.raises(CLIReturnCodeError):
        AuthLogin.basic({
            'username': non_admin_user['login'],
            'password': gen_string('alpha')
        })
    # checking the session status again
    result = Auth.with_user().status()
    assert LOGEDIN_MSG.format(admin_user['login']) in result[0]['message']
    Org.with_user().list()
コード例 #13
0
ファイル: test_auth.py プロジェクト: renzon/robottelo
    def test_positive_disable_session(self):
        """Check if user logs out when session is disabled

        :id: 38ee0d85-c2fe-4cac-a992-c5dbcec11031

        :Steps:

            1. Set use_sessions
            2. Authenticate, assert credentials are not demanded
               on next command run
            3. Disable use_sessions

        :expectedresults: The session is terminated

        """
        result = configure_sessions()
        self.assertEqual(result, 0, 'Failed to configure hammer sessions')
        Auth.login({'username': self.uname_admin, 'password': self.password})
        result = Auth.with_user().status()
        self.assertIn(LOGEDIN_MSG.format(self.uname_admin),
                      result[0][u'message'])
        # list organizations without supplying credentials
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
        # disabling sessions
        result = configure_sessions(False)
        self.assertEqual(result, 0, 'Failed to configure hammer sessions')
        result = Auth.with_user().status()
        self.assertIn(NOTCONF_MSG.format(self.uname_admin),
                      result[0][u'message'])
        with self.assertRaises(CLIReturnCodeError):
            Org.with_user().list()
コード例 #14
0
ファイル: test_auth.py プロジェクト: ldjebran/robottelo
def test_positive_session_survives_unauthenticated_call(
        admin_user, target_sat):
    """Check if session stays up after unauthenticated call

    :id: 8bc304a0-70ea-489c-9c3f-ea8343c5284c

    :Steps:

        1. Set use_sessions
        2. Authenticate, assert credentials are not demanded
           on next command run
        3. Run `hammer ping`

    :CaseImportance: Medium

    :expectedresults: The session is unchanged

    """
    result = configure_sessions(target_sat)
    assert result == 0, 'Failed to configure hammer sessions'
    AuthLogin.basic({'username': admin_user['login'], 'password': password})
    result = Auth.with_user().status()
    assert LOGEDIN_MSG.format(admin_user['login']) in result[0]['message']
    # list organizations without supplying credentials
    Org.with_user().list()
    result = target_sat.execute('hammer ping')
    assert result.status == 0, 'Failed to run hammer ping'
    result = Auth.with_user().status()
    assert LOGEDIN_MSG.format(admin_user['login']) in result[0]['message']
    Org.with_user().list()
コード例 #15
0
ファイル: test_auth.py プロジェクト: vsedmik/robottelo
    def test_negative_no_credentials(self):
        """Attempt to execute command without authentication

        :id: 8a3b5c68-1027-450f-997c-c5630218f49f

        :expectedresults: Command is not executed
        """
        result = configure_sessions(False)
        self.assertEqual(result, 0, 'Failed to configure hammer sessions')
        result = Auth.with_user().status()
        self.assertIn(NOTCONF_MSG.format(self.uname_admin), result[0]['message'])
        with self.assertRaises(CLIReturnCodeError):
            Org.with_user().list()
コード例 #16
0
ファイル: test_auth.py プロジェクト: synkd/robottelo
def test_negative_no_credentials():
    """Attempt to execute command without authentication

    :id: 8a3b5c68-1027-450f-997c-c5630218f49f

    :expectedresults: Command is not executed
    """
    result = configure_sessions(False)
    assert result == 0, 'Failed to configure hammer sessions'
    result = Auth.with_user().status()
    assert NOTCONF_MSG in result[0]['message']
    with pytest.raises(CLIReturnCodeError):
        Org.with_user().list()
コード例 #17
0
ファイル: test_auth.py プロジェクト: JacobCallahan/robottelo
    def test_positive_session_preceeds_saved_credentials(self):
        """Check if enabled session is mutually exclusive with
        saved credentials in hammer config

        :id: e4277298-1c24-494b-84a6-22f45f96e144

        :BZ: 1471099

        :Steps:

            1. Set use_sessions, set usernam and password,
               set short expiration time
            2. Authenticate, assert credentials are not demanded
               on next command run
            3. Wait until session expires

        :expectedresults: Session expires after specified time
            and saved credentials are not applied

        """
        try:
            idle_timeout = Settings.list({
                'search': 'name=idle_timeout'})[0][u'value']
            Settings.set({'name': 'idle_timeout', 'value': 1})
            result = configure_sessions(add_default_creds=True)
            self.assertEqual(result, 0, 'Failed to configure hammer sessions')
            Auth.login({
                'username': self.uname_admin,
                'password': self.password
            })
            result = Auth.with_user().status()
            self.assertIn(
                LOGEDIN_MSG.format(self.uname_admin),
                result[0][u'message']
            )
            # list organizations without supplying credentials
            with self.assertNotRaises(CLIReturnCodeError):
                Org.with_user().list()
            # wait until session expires
            sleep(70)
            with self.assertRaises(CLIReturnCodeError):
                Org.with_user().list()
            result = Auth.with_user().status()
            self.assertIn(
                LOGEDOFF_MSG.format(self.uname_admin),
                result[0][u'message']
            )
        finally:
            # reset timeout to default
            Settings.set({'name': 'idle_timeout', 'value': '{}'.format(
                idle_timeout)})
コード例 #18
0
ファイル: test_auth.py プロジェクト: renzon/robottelo
    def test_positive_session_preceeds_saved_credentials(self):
        """Check if enabled session is mutually exclusive with
        saved credentials in hammer config

        :id: e4277298-1c24-494b-84a6-22f45f96e144

        :BZ: 1471099

        :Steps:

            1. Set use_sessions, set usernam and password,
               set short expiration time
            2. Authenticate, assert credentials are not demanded
               on next command run
            3. Wait until session expires

        :expectedresults: Session expires after specified time
            and saved credentials are not applied

        """
        try:
            idle_timeout = Settings.list({'search':
                                          'name=idle_timeout'})[0][u'value']
            Settings.set({'name': 'idle_timeout', 'value': 1})
            result = configure_sessions(add_default_creds=True)
            self.assertEqual(result, 0, 'Failed to configure hammer sessions')
            Auth.login({
                'username': self.uname_admin,
                'password': self.password
            })
            result = Auth.with_user().status()
            self.assertIn(LOGEDIN_MSG.format(self.uname_admin),
                          result[0][u'message'])
            # list organizations without supplying credentials
            with self.assertNotRaises(CLIReturnCodeError):
                Org.with_user().list()
            # wait until session expires
            sleep(70)
            with self.assertRaises(CLIReturnCodeError):
                Org.with_user().list()
            result = Auth.with_user().status()
            self.assertIn(LOGEDOFF_MSG.format(self.uname_admin),
                          result[0][u'message'])
        finally:
            # reset timeout to default
            Settings.set({
                'name': 'idle_timeout',
                'value': '{}'.format(idle_timeout)
            })
コード例 #19
0
ファイル: test_auth.py プロジェクト: JacobCallahan/robottelo
    def test_negative_no_credentials(self):
        """Attempt to execute command without authentication

        :id: 8a3b5c68-1027-450f-997c-c5630218f49f

        :expectedresults: Command is not executed
        """
        result = configure_sessions(False)
        self.assertEqual(result, 0, 'Failed to configure hammer sessions')
        result = Auth.with_user().status()
        self.assertIn(
            NOTCONF_MSG.format(self.uname_admin),
            result[0][u'message']
        )
        with self.assertRaises(CLIReturnCodeError):
            Org.with_user().list()
コード例 #20
0
ファイル: test_auth.py プロジェクト: JacobCallahan/robottelo
    def test_positive_create_session(self):
        """Check if user stays authenticated with session enabled

        :id: fcee7f5f-1040-41a9-bf17-6d0c24a93e22

        :Steps:

            1. Set use_sessions, set short expiration time
            2. Authenticate, assert credentials are not demanded
               on next command run
            3. Wait until session expires, assert credentials
               are required

        :expectedresults: The session is successfully created and
            expires after specified time
        """
        try:
            idle_timeout = Settings.list({
                'search': 'name=idle_timeout'})[0][u'value']
            Settings.set({'name': 'idle_timeout', 'value': 1})
            result = configure_sessions()
            self.assertEqual(result, 0, 'Failed to configure hammer sessions')
            Auth.login({
                'username': self.uname_admin,
                'password': self.password
            })
            result = Auth.with_user().status()
            self.assertIn(
                LOGEDIN_MSG.format(self.uname_admin),
                result[0][u'message']
            )
            # list organizations without supplying credentials
            with self.assertNotRaises(CLIReturnCodeError):
                Org.with_user().list()
            # wait until session expires
            sleep(70)
            with self.assertRaises(CLIReturnCodeError):
                Org.with_user().list()
            result = Auth.with_user().status()
            self.assertIn(
                LOGEDOFF_MSG.format(self.uname_admin),
                result[0][u'message']
            )
        finally:
            # reset timeout to default
            Settings.set({'name': 'idle_timeout', 'value': '{}'.format(
                idle_timeout)})
コード例 #21
0
ファイル: test_auth.py プロジェクト: ldjebran/robottelo
def test_positive_session_preceeds_saved_credentials(admin_user, target_sat):
    """Check if enabled session is mutually exclusive with
    saved credentials in hammer config

    :id: e4277298-1c24-494b-84a6-22f45f96e144

    :BZ: 1471099, 1903693

    :CaseImportance: High

    :Steps:

        1. Set use_sessions, set username and password,
           set short expiration time
        2. Authenticate, assert credentials are not demanded
           on next command run
        3. Wait until session expires

    :expectedresults: Session expires after specified time
        and saved credentials are not applied

    """
    try:
        idle_timeout = Settings.list({'search':
                                      'name=idle_timeout'})[0]['value']
        Settings.set({'name': 'idle_timeout', 'value': 1})
        result = configure_sessions(satellite=target_sat,
                                    add_default_creds=True)
        assert result == 0, 'Failed to configure hammer sessions'
        AuthLogin.basic({
            'username': admin_user['login'],
            'password': password
        })
        result = Auth.with_user().status()
        assert LOGEDIN_MSG.format(admin_user['login']) in result[0]['message']
        # list organizations without supplying credentials
        sleep(70)
        if not is_open('BZ:1903693'):
            result = Auth.with_user().status()
            assert LOGEDOFF_MSG.format(
                admin_user['login']) in result[0]['message']
        with pytest.raises(CLIReturnCodeError):
            Org.with_user().list()
    finally:
        # reset timeout to default
        Settings.set({'name': 'idle_timeout', 'value': f'{idle_timeout}'})
コード例 #22
0
ファイル: test_auth.py プロジェクト: renzon/robottelo
    def test_positive_create_session(self):
        """Check if user stays authenticated with session enabled

        :id: fcee7f5f-1040-41a9-bf17-6d0c24a93e22

        :Steps:

            1. Set use_sessions, set short expiration time
            2. Authenticate, assert credentials are not demanded
               on next command run
            3. Wait until session expires, assert credentials
               are required

        :expectedresults: The session is successfully created and
            expires after specified time
        """
        try:
            idle_timeout = Settings.list({'search':
                                          'name=idle_timeout'})[0][u'value']
            Settings.set({'name': 'idle_timeout', 'value': 1})
            result = configure_sessions()
            self.assertEqual(result, 0, 'Failed to configure hammer sessions')
            Auth.login({
                'username': self.uname_admin,
                'password': self.password
            })
            result = Auth.with_user().status()
            self.assertIn(LOGEDIN_MSG.format(self.uname_admin),
                          result[0][u'message'])
            # list organizations without supplying credentials
            with self.assertNotRaises(CLIReturnCodeError):
                Org.with_user().list()
            # wait until session expires
            sleep(70)
            with self.assertRaises(CLIReturnCodeError):
                Org.with_user().list()
            result = Auth.with_user().status()
            self.assertIn(LOGEDOFF_MSG.format(self.uname_admin),
                          result[0][u'message'])
        finally:
            # reset timeout to default
            Settings.set({
                'name': 'idle_timeout',
                'value': '{}'.format(idle_timeout)
            })
コード例 #23
0
    def test_positive_create_with_system_admin_user(self):
        """Create organization using user with system admin role

        :id: 1482ab6e-18c7-4a62-81a2-cc969ac373fe

        :expectedresults: organization is created

        :BZ: 1644586
        """
        login = gen_string('alpha')
        password = gen_string('alpha')
        org_name = gen_string('alpha')
        make_user({'login': login, 'password': password})
        User.add_role({'login': login, 'role': 'System admin'})
        Org.with_user(username=login,
                      password=password).create({'name': org_name})
        result = Org.info({'name': org_name})
        self.assertEqual(result['name'], org_name)
コード例 #24
0
ファイル: test_auth.py プロジェクト: JacobCallahan/robottelo
    def test_positive_session_survives_failed_login(self):
        """Check if session stays up after failed login attempt

        :id: 6c4d5c4c-eff0-411b-829f-0c2f2ec26132

        :BZ: 1465552

        :Steps:

            1. Set use_sessions
            2. Authenticate, assert credentials are not demanded
               on next command run
            3. Run login with invalid credentials

        :expectedresults: The session is unchanged

        """
        result = configure_sessions()
        self.assertEqual(result, 0, 'Failed to configure hammer sessions')
        Auth.login({'username': self.uname_admin, 'password': self.password})
        result = Auth.with_user().status()
        self.assertIn(
            LOGEDIN_MSG.format(self.uname_admin),
            result[0][u'message']
        )
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
        # using invalid password
        with self.assertRaises(CLIReturnCodeError):
            Auth.login({
                'username': self.uname_viewer,
                'password': gen_string('alpha')})
        # checking the session status again
        result = Auth.with_user().status()
        self.assertIn(
            LOGEDIN_MSG.format(self.uname_admin),
            result[0][u'message']
        )
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
コード例 #25
0
ファイル: test_auth.py プロジェクト: ldjebran/robottelo
def test_positive_create_session(admin_user, target_sat):
    """Check if user stays authenticated with session enabled

    :id: fcee7f5f-1040-41a9-bf17-6d0c24a93e22

    :Steps:

        1. Set use_sessions, set short expiration time
        2. Authenticate, assert credentials are not demanded
           on next command run
        3. Wait until session expires, assert credentials
           are required

    :expectedresults: The session is successfully created and
        expires after specified time
    """
    try:
        idle_timeout = Settings.list({'search':
                                      'name=idle_timeout'})[0]['value']
        Settings.set({'name': 'idle_timeout', 'value': 1})
        result = configure_sessions(target_sat)
        assert result == 0, 'Failed to configure hammer sessions'
        AuthLogin.basic({
            'username': admin_user['login'],
            'password': password
        })
        result = Auth.with_user().status()
        assert LOGEDIN_MSG.format(admin_user['login']) in result[0]['message']
        # list organizations without supplying credentials
        assert Org.with_user().list()
        # wait until session expires
        sleep(70)
        with pytest.raises(CLIReturnCodeError):
            Org.with_user().list()
        result = Auth.with_user().status()
        assert LOGEDOFF_MSG.format(admin_user['login']) in result[0]['message']
    finally:
        # reset timeout to default
        Settings.set({'name': 'idle_timeout', 'value': f'{idle_timeout}'})
コード例 #26
0
ファイル: test_auth.py プロジェクト: JacobCallahan/robottelo
    def test_positive_disable_session(self):
        """Check if user logs out when session is disabled

        :id: 38ee0d85-c2fe-4cac-a992-c5dbcec11031

        :Steps:

            1. Set use_sessions
            2. Authenticate, assert credentials are not demanded
               on next command run
            3. Disable use_sessions

        :expectedresults: The session is terminated

        """
        result = configure_sessions()
        self.assertEqual(result, 0, 'Failed to configure hammer sessions')
        Auth.login({'username': self.uname_admin, 'password': self.password})
        result = Auth.with_user().status()
        self.assertIn(
            LOGEDIN_MSG.format(self.uname_admin),
            result[0][u'message']
        )
        # list organizations without supplying credentials
        with self.assertNotRaises(CLIReturnCodeError):
            Org.with_user().list()
        # disabling sessions
        result = configure_sessions(False)
        self.assertEqual(result, 0, 'Failed to configure hammer sessions')
        result = Auth.with_user().status()
        self.assertIn(
            NOTCONF_MSG.format(self.uname_admin),
            result[0][u'message']
        )
        with self.assertRaises(CLIReturnCodeError):
            Org.with_user().list()
コード例 #27
0
ファイル: test_cli_smoke.py プロジェクト: ares/robottelo
    def test_smoke(self):
        """@Test: Check that basic content can be created

        * Create a new user with admin permissions
        * Using the new user from above:

            * Create a new organization
            * Create two new lifecycle environments
            * Create a custom product
            * Create a custom YUM repository
            * Create a custom PUPPET repository
            * Synchronize both custom repositories
            * Create a new content view
            * Associate both repositories to new content view
            * Publish content view
            * Promote content view to both lifecycles
            * Create a new libvirt compute resource
            * Create a new subnet
            * Create a new domain
            * Create a new hostgroup and associate previous entities to it

        @Feature: Smoke Test

        @Assert: All entities are created and associated.

        """
        # Create new user
        password = gen_alphanumeric()
        new_user = make_user({u"admin": u"true", u"password": password})

        # Append the password as the info command does not return it
        new_user[u"password"] = password

        # Create new org as new user
        new_org = self._create(new_user, Org, {u"name": gen_alphanumeric()})

        # Create new lifecycle environment 1
        lifecycle1 = self._create(
            new_user,
            LifecycleEnvironment,
            {u"organization-id": new_org["id"], u"name": gen_alphanumeric(), u"prior": u"Library"},
        )

        # Create new lifecycle environment 2
        lifecycle2 = self._create(
            new_user,
            LifecycleEnvironment,
            {u"organization-id": new_org["id"], u"name": gen_alphanumeric(), u"prior": lifecycle1["name"]},
        )

        # Create a new product
        new_product = self._create(new_user, Product, {u"organization-id": new_org["id"], u"name": gen_alphanumeric()})

        # Create a YUM repository
        new_repo1 = self._create(
            new_user,
            Repository,
            {
                u"product-id": new_product["id"],
                u"name": gen_alphanumeric(),
                u"content-type": u"yum",
                u"publish-via-http": u"true",
                u"url": GOOGLE_CHROME_REPO,
            },
        )

        # Create a Puppet repository
        new_repo2 = self._create(
            new_user,
            Repository,
            {
                u"product-id": new_product["id"],
                u"name": gen_alphanumeric(),
                u"content-type": u"puppet",
                u"publish-via-http": u"true",
                u"url": FAKE_0_PUPPET_REPO,
            },
        )

        # Synchronize YUM repository
        result = Repository.with_user(new_user["login"], new_user["password"]).synchronize({u"id": new_repo1["id"]})
        self.assertEqual(result.return_code, 0)
        self.assertEqual(len(result.stderr), 0)

        # Synchronize puppet repository
        result = Repository.with_user(new_user["login"], new_user["password"]).synchronize({u"id": new_repo2["id"]})
        self.assertEqual(result.return_code, 0)
        self.assertEqual(len(result.stderr), 0)

        # Create a Content View
        new_cv = self._create(new_user, ContentView, {u"organization-id": new_org["id"], u"name": gen_alphanumeric()})

        # Associate yum repository to content view
        result = ContentView.with_user(new_user["login"], new_user["password"]).add_repository(
            {u"id": new_cv["id"], u"repository-id": new_repo1["id"]}
        )
        self.assertEqual(result.return_code, 0)
        self.assertEqual(len(result.stderr), 0)

        # Fetch puppet module
        puppet_result = PuppetModule.with_user(new_user["login"], new_user["password"]).list(
            {u"repository-id": new_repo2["id"], u"per-page": False}
        )
        self.assertEqual(puppet_result.return_code, 0)
        self.assertEqual(len(puppet_result.stderr), 0)

        # Associate puppet repository to content view
        result = ContentView.with_user(new_user["login"], new_user["password"]).puppet_module_add(
            {u"content-view-id": new_cv["id"], u"id": puppet_result.stdout[0]["id"]}
        )
        self.assertEqual(result.return_code, 0)
        self.assertEqual(len(result.stderr), 0)

        # Publish content view
        result = ContentView.with_user(new_user["login"], new_user["password"]).publish({u"id": new_cv["id"]})
        self.assertEqual(result.return_code, 0)
        self.assertEqual(len(result.stderr), 0)

        # Only after we publish version1 the info is populated.
        result = ContentView.with_user(new_user["login"], new_user["password"]).info({u"id": new_cv["id"]})
        self.assertEqual(result.return_code, 0)
        self.assertEqual(len(result.stderr), 0)

        # Let us now store the version1 id
        version1_id = result.stdout["versions"][0]["id"]

        # Promote content view to first lifecycle
        result = ContentView.with_user(new_user["login"], new_user["password"]).version_promote(
            {u"id": result.stdout["versions"][0]["id"], u"to-lifecycle-environment-id": lifecycle1["id"]}
        )
        self.assertEqual(result.return_code, 0)
        self.assertEqual(len(result.stderr), 0)

        # Promote content view to second lifecycle
        result = ContentView.with_user(new_user["login"], new_user["password"]).version_promote(
            {u"id": version1_id, u"to-lifecycle-environment-id": lifecycle2["id"]}
        )
        self.assertEqual(result.return_code, 0)
        self.assertEqual(len(result.stderr), 0)

        # Create a new libvirt compute resource
        result = self._create(
            new_user,
            ComputeResource,
            {
                u"name": gen_alphanumeric(),
                u"provider": u"Libvirt",
                u"url": u"qemu+tcp://{0}:16509/system".format(conf.properties["main.server.hostname"]),
            },
        )

        # Create a new subnet
        new_subnet = self._create(
            new_user, Subnet, {u"name": gen_alphanumeric(), u"network": gen_ipaddr(ip3=True), u"mask": u"255.255.255.0"}
        )

        # Create a domain
        new_domain = self._create(new_user, Domain, {u"name": gen_alphanumeric()})

        # Fetch Puppet environment for second lifecycle
        # (unfortunately it is not straight forward to extract this)

        # The puppet environment we want has a name like this...
        env_name = u"KT_{0}_{1}_".format(
            #  Hyphens are replaced by underscores
            new_org["label"].replace("-", "_"),
            lifecycle2["label"].replace("-", "_"),
        )
        # We fetch all the puppet environments for our organization...
        result = Environment.with_user(new_user["login"], new_user["password"]).list(
            {u"search": u'organization="{0}"'.format(new_org["name"])}
        )
        self.assertEqual(result.return_code, 0)
        self.assertEqual(len(result.stderr), 0)
        # Now look for the puppet environment that matches lifecycle2
        puppet_env = [env for env in result.stdout if env["name"].startswith(env_name)]
        self.assertEqual(len(puppet_env), 1)

        # Create a hostgroup...
        new_hg = self._create(
            new_user,
            HostGroup,
            {
                u"name": gen_alphanumeric(),
                u"domain-id": new_domain["id"],
                u"subnet-id": new_subnet["id"],
                u"environment-id": puppet_env[0]["id"],
            },
        )
        # ...and add it to the organization
        result = Org.with_user(new_user["login"], new_user["password"]).add_hostgroup(
            {u"id": new_org["id"], u"hostgroup-id": new_hg["id"]}
        )
        self.assertEqual(result.return_code, 0)
        self.assertEqual(len(result.stderr), 0)
コード例 #28
0
ファイル: test_cli_smoke.py プロジェクト: lpramuk/robottelo
    def test_smoke(self):
        """@Test: Check that basic content can be created

        * Create a new user with admin permissions
        * Using the new user from above:

            * Create a new organization
            * Create two new lifecycle environments
            * Create a custom product
            * Create a custom YUM repository
            * Create a custom PUPPET repository
            * Synchronize both custom repositories
            * Create a new content view
            * Associate both repositories to new content view
            * Publish content view
            * Promote content view to both lifecycles
            * Create a new libvirt compute resource
            * Create a new subnet
            * Create a new domain
            * Create a new hostgroup and associate previous entities to it

        @Feature: Smoke Test

        @Assert: All entities are created and associated.

        """
        # Create new user
        password = gen_alphanumeric()
        new_user = make_user({u'admin': u'true', u'password': password})

        # Append the password as the info command does not return it
        new_user[u'password'] = password

        # Create new org as new user
        new_org = self._create(
            new_user,
            Org,
            {u'name': gen_alphanumeric()}
        )

        # Create new lifecycle environment 1
        lifecycle1 = self._create(
            new_user,
            LifecycleEnvironment,
            {
                u'name': gen_alphanumeric(),
                u'organization-id': new_org['id'],
                u'prior': u'Library',
            }
        )

        # Create new lifecycle environment 2
        lifecycle2 = self._create(
            new_user,
            LifecycleEnvironment,
            {
                u'name': gen_alphanumeric(),
                u'organization-id': new_org['id'],
                u'prior': lifecycle1['name'],
            }
        )

        # Create a new product
        new_product = self._create(
            new_user,
            Product,
            {
                u'name': gen_alphanumeric(),
                u'organization-id': new_org['id'],
            }
        )

        # Create a YUM repository
        new_repo1 = self._create(
            new_user,
            Repository,
            {
                u'content-type': u'yum',
                u'name': gen_alphanumeric(),
                u'product-id': new_product['id'],
                u'publish-via-http': u'true',
                u'url': GOOGLE_CHROME_REPO,
            }
        )

        # Create a Puppet repository
        new_repo2 = self._create(
            new_user,
            Repository,
            {
                u'content-type': u'puppet',
                u'name': gen_alphanumeric(),
                u'product-id': new_product['id'],
                u'publish-via-http': u'true',
                u'url': FAKE_0_PUPPET_REPO,
            }
        )

        # Synchronize YUM repository
        Repository.with_user(
            new_user['login'],
            new_user['password']
        ).synchronize({u'id': new_repo1['id']})

        # Synchronize puppet repository
        Repository.with_user(
            new_user['login'],
            new_user['password']
        ).synchronize({u'id': new_repo2['id']})

        # Create a Content View
        new_cv = self._create(
            new_user,
            ContentView,
            {
                u'name': gen_alphanumeric(),
                u'organization-id': new_org['id'],
            }
        )

        # Associate yum repository to content view
        ContentView.with_user(
            new_user['login'],
            new_user['password']
        ).add_repository({
            u'id': new_cv['id'],
            u'repository-id': new_repo1['id'],
        })

        # Fetch puppet module
        puppet_result = PuppetModule.with_user(
            new_user['login'],
            new_user['password']
        ).list({
            u'repository-id': new_repo2['id'],
            u'per-page': False,
        })

        # Associate puppet repository to content view
        ContentView.with_user(
            new_user['login'],
            new_user['password']
        ).puppet_module_add({
            u'content-view-id': new_cv['id'],
            u'id': puppet_result[0]['id'],
        })

        # Publish content view
        ContentView.with_user(
            new_user['login'],
            new_user['password']
        ).publish({u'id': new_cv['id']})

        # Only after we publish version1 the info is populated.
        result = ContentView.with_user(
            new_user['login'],
            new_user['password']
        ).info({u'id': new_cv['id']})

        # Let us now store the version1 id
        version1_id = result['versions'][0]['id']

        # Promote content view to first lifecycle
        ContentView.with_user(
            new_user['login'],
            new_user['password']
        ).version_promote({
            u'id': version1_id,
            u'to-lifecycle-environment-id': lifecycle1['id'],
        })

        # Promote content view to second lifecycle
        ContentView.with_user(
            new_user['login'],
            new_user['password']
        ).version_promote({
            u'id': version1_id,
            u'to-lifecycle-environment-id': lifecycle2['id'],
        })

        # Create a new libvirt compute resource
        self._create(
            new_user,
            ComputeResource,
            {
                u'name': gen_alphanumeric(),
                u'provider': u'Libvirt',
                u'url': u'qemu+tcp://{0}:16509/system'.format(
                    conf.properties['main.server.hostname']),
            }
        )

        # Create a new subnet
        new_subnet = self._create(
            new_user,
            Subnet,
            {
                u'name': gen_alphanumeric(),
                u'network': gen_ipaddr(ip3=True),
                u'mask': u'255.255.255.0',
            }
        )

        # Create a domain
        new_domain = self._create(
            new_user,
            Domain,
            {
                u'name': gen_alphanumeric(),
            }
        )

        # Fetch Puppet environment for second lifecycle
        # (unfortunately it is not straight forward to extract this)

        # The puppet environment we want has a name like this...
        env_name = u'KT_{0}_{1}_'.format(
            #  Hyphens are replaced by underscores
            new_org['label'].replace('-', '_',),
            lifecycle2['label'].replace('-', '_')
        )
        # We fetch all the puppet environments for our organization...
        result = Environment.with_user(
            new_user['login'],
            new_user['password']
        ).list({
            u'search': u'organization="{0}"'.format(new_org['name']),
        })
        # Now look for the puppet environment that matches lifecycle2
        puppet_env = [
            env for env in result
            if env['name'].startswith(env_name)
        ]
        self.assertEqual(len(puppet_env), 1)

        # Create a hostgroup...
        new_hg = self._create(
            new_user,
            HostGroup,
            {
                u'domain-id': new_domain['id'],
                u'environment-id': puppet_env[0]['id'],
                u'name': gen_alphanumeric(),
                u'subnet-id': new_subnet['id'],
            }
        )
        # ...and add it to the organization
        Org.with_user(
            new_user['login'],
            new_user['password']
        ).add_hostgroup({
            u'hostgroup-id': new_hg['id'],
            u'id': new_org['id'],
        })
コード例 #29
0
    def test_positive_smoke(self):
        """Check that basic content can be created

        * Create a new user with admin permissions
        * Using the new user from above.

            * Create a new organization
            * Create two new lifecycle environments
            * Create a custom product
            * Create a custom YUM repository
            * Create a custom PUPPET repository
            * Synchronize both custom repositories
            * Create a new content view
            * Associate both repositories to new content view
            * Publish content view
            * Promote content view to both lifecycles
            * Create a new libvirt compute resource
            * Create a new subnet
            * Create a new domain
            * Create a new hostgroup and associate previous entities to it

        @Feature: Smoke Test

        @Assert: All entities are created and associated.

        """
        # Create new user
        password = gen_alphanumeric()
        new_user = make_user({u'admin': u'true', u'password': password})

        # Append the password as the info command does not return it
        new_user[u'password'] = password

        # Create new org as new user
        new_org = self._create(new_user, Org, {u'name': gen_alphanumeric()})

        # Create new lifecycle environment 1
        lifecycle1 = self._create(
            new_user, LifecycleEnvironment, {
                u'name': gen_alphanumeric(),
                u'organization-id': new_org['id'],
                u'prior': u'Library',
            })

        # Create new lifecycle environment 2
        lifecycle2 = self._create(
            new_user, LifecycleEnvironment, {
                u'name': gen_alphanumeric(),
                u'organization-id': new_org['id'],
                u'prior': lifecycle1['name'],
            })

        # Create a new product
        new_product = self._create(new_user, Product, {
            u'name': gen_alphanumeric(),
            u'organization-id': new_org['id'],
        })

        # Create a YUM repository
        new_repo1 = self._create(
            new_user, Repository, {
                u'content-type': u'yum',
                u'name': gen_alphanumeric(),
                u'product-id': new_product['id'],
                u'publish-via-http': u'true',
                u'url': GOOGLE_CHROME_REPO,
            })

        # Create a Puppet repository
        new_repo2 = self._create(
            new_user, Repository, {
                u'content-type': u'puppet',
                u'name': gen_alphanumeric(),
                u'product-id': new_product['id'],
                u'publish-via-http': u'true',
                u'url': FAKE_0_PUPPET_REPO,
            })

        # Synchronize YUM repository
        Repository.with_user(new_user['login'],
                             new_user['password']).synchronize(
                                 {u'id': new_repo1['id']})

        # Synchronize puppet repository
        Repository.with_user(new_user['login'],
                             new_user['password']).synchronize(
                                 {u'id': new_repo2['id']})

        # Create a Content View
        new_cv = self._create(new_user, ContentView, {
            u'name': gen_alphanumeric(),
            u'organization-id': new_org['id'],
        })

        # Associate yum repository to content view
        ContentView.with_user(new_user['login'],
                              new_user['password']).add_repository({
                                  u'id':
                                  new_cv['id'],
                                  u'repository-id':
                                  new_repo1['id'],
                              })

        # Fetch puppet module
        puppet_result = PuppetModule.with_user(new_user['login'],
                                               new_user['password']).list({
                                                   u'repository-id':
                                                   new_repo2['id'],
                                                   u'per-page':
                                                   False,
                                               })

        # Associate puppet repository to content view
        ContentView.with_user(new_user['login'],
                              new_user['password']).puppet_module_add({
                                  u'content-view-id':
                                  new_cv['id'],
                                  u'id':
                                  puppet_result[0]['id'],
                              })

        # Publish content view
        ContentView.with_user(new_user['login'], new_user['password']).publish(
            {u'id': new_cv['id']})

        # Only after we publish version1 the info is populated.
        result = ContentView.with_user(new_user['login'],
                                       new_user['password']).info(
                                           {u'id': new_cv['id']})

        # Let us now store the version1 id
        version1_id = result['versions'][0]['id']

        # Promote content view to first lifecycle
        ContentView.with_user(new_user['login'],
                              new_user['password']).version_promote({
                                  u'id':
                                  version1_id,
                                  u'to-lifecycle-environment-id':
                                  lifecycle1['id'],
                              })

        # Promote content view to second lifecycle
        ContentView.with_user(new_user['login'],
                              new_user['password']).version_promote({
                                  u'id':
                                  version1_id,
                                  u'to-lifecycle-environment-id':
                                  lifecycle2['id'],
                              })

        # Create a new libvirt compute resource
        self._create(
            new_user, ComputeResource, {
                u'name':
                gen_alphanumeric(),
                u'provider':
                u'Libvirt',
                u'url':
                u'qemu+tcp://{0}:16509/system'.format(
                    settings.server.hostname),
            })

        # Create a new subnet
        new_subnet = self._create(
            new_user, Subnet, {
                u'name': gen_alphanumeric(),
                u'network': gen_ipaddr(ip3=True),
                u'mask': u'255.255.255.0',
            })

        # Create a domain
        new_domain = self._create(new_user, Domain, {
            u'name': gen_alphanumeric(),
        })

        # Fetch Puppet environment for second lifecycle
        # (unfortunately it is not straight forward to extract this)

        # The puppet environment we want has a name like this...
        env_name = u'KT_{0}_{1}_'.format(
            #  Hyphens are replaced by underscores
            new_org['label'].replace(
                '-',
                '_',
            ),
            lifecycle2['label'].replace('-', '_'))
        # We fetch all the puppet environments for our organization...
        result = Environment.with_user(
            new_user['login'], new_user['password']).list({
                u'search':
                u'organization="{0}"'.format(new_org['name']),
            })
        # Now look for the puppet environment that matches lifecycle2
        puppet_env = [
            env for env in result if env['name'].startswith(env_name)
        ]
        self.assertEqual(len(puppet_env), 1)

        # Create a hostgroup...
        new_hg = self._create(
            new_user, HostGroup, {
                u'domain-id': new_domain['id'],
                u'environment-id': puppet_env[0]['id'],
                u'name': gen_alphanumeric(),
                u'subnet-id': new_subnet['id'],
            })
        # ...and add it to the organization
        Org.with_user(new_user['login'], new_user['password']).add_hostgroup({
            u'hostgroup-id':
            new_hg['id'],
            u'id':
            new_org['id'],
        })
コード例 #30
0
    def test_smoke(self):
        """
        @Test: Check that basic content can be created
        * Create a new user with admin permissions
        * Using the new user from above:

            * Create a new organization
            * Create two new lifecycle environments
            * Create a custom product
            * Create a custom YUM repository
            * Create a custom PUPPET repository
            * Synchronize both custom repositories
            * Create a new content view
            * Associate both repositories to new content view
            * Publish content view
            * Promote content view to both lifecycles
            * Create a new libvirt compute resource
            * Create a new subnet
            * Create a new domain
            * Create a new capsule
            * Create a new hostgroup and associate previous entities to it

        @Feature: Smoke Test
        @Assert: All entities are created and associated.
        """

        # Create new user
        new_user = make_user({'admin': 'true'})

        # Create new org as new user
        new_org = self._create(
            new_user,
            Org,
            {u'name': self._generate_name()}
        )

        # Create new lifecycle environment 1
        lifecycle1 = self._create(
            new_user,
            LifecycleEnvironment,
            {u'organization-id': new_org['id'],
             u'name': self._generate_name(),
             u'prior': u'Library'}
        )

        # Create new lifecycle environment 2
        lifecycle2 = self._create(
            new_user,
            LifecycleEnvironment,
            {u'organization-id': new_org['id'],
             u'name': self._generate_name(),
             u'prior': lifecycle1['name']}
        )

        # Create a new product
        new_product = self._create(
            new_user,
            Product,
            {u'organization-id': new_org['id'],
             u'name': self._generate_name()}
        )

        # Create a YUM repository
        new_repo1 = self._create(
            new_user,
            Repository,
            {u'product-id': new_product['id'],
             u'name': self._generate_name(),
             u'content-type': u'yum',
             u'publish-via-http': u'true',
             u'url': GOOGLE_CHROME_REPO}
        )

        # Create a Puppet repository
        new_repo2 = self._create(
            new_user,
            Repository,
            {u'product-id': new_product['id'],
             u'name': self._generate_name(),
             u'content-type': u'puppet',
             u'publish-via-http': u'true',
             u'url': FAKE_PUPPET_REPO}
        )

        # Synchronize YUM repository
        result = Repository.with_user(
            new_user['login'],
            new_user['password']
        ).synchronize({'id': new_repo1['id']})
        self.assertEqual(
            result.return_code,
            0,
            u"Return code is non-zero: {0}".format(result.return_code))
        self.assertEqual(
            len(result.stderr),
            0,
            u"Failed to synchronize YUM repo: {0}".format(result.stderr))

        # Synchronize puppet repository
        result = Repository.with_user(
            new_user['login'],
            new_user['password']
        ).synchronize({'id': new_repo2['id']})
        self.assertEqual(
            result.return_code,
            0,
            u"Return code is non-zero: {0}".format(result.return_code))
        self.assertEqual(
            len(result.stderr),
            0,
            u"Failed to synchronize Puppet repo: {0}".format(result.stderr))

        # Create a Content View
        new_cv = self._create(
            new_user,
            ContentView,
            {u'organization-id': new_org['id'],
             u'name': self._generate_name()}
        )

        # Associate yum repository to content view
        result = ContentView.with_user(
            new_user['login'],
            new_user['password']
        ).add_repository(
            {u'id': new_cv['id'],
             u'repository-id': new_repo1['id']})
        self.assertEqual(
            result.return_code,
            0,
            u"Return code is non-zero: {0}".format(result.return_code))
        self.assertEqual(
            len(result.stderr),
            0,
            u"Failed to add YUM repo to content view: {0}".format(
                result.stderr))

        # Fetch puppet module
        puppet_result = PuppetModule.with_user(
            new_user['login'],
            new_user['password']
        ).list(
            {u'repository-id': new_repo2['id'],
             u'per-page': False})
        self.assertEqual(
            puppet_result.return_code,
            0,
            u"Return code is non-zero: {0}".format(result.return_code))
        self.assertEqual(
            len(puppet_result.stderr),
            0,
            u"Puppet modules list was not generated: {0}".format(
                result.stderr))

        # Associate puppet repository to content view
        result = ContentView.with_user(
            new_user['login'],
            new_user['password']
        ).puppet_module_add(
            {
                u'content-view-id': new_cv['id'],
                u'name': puppet_result.stdout[0]['name']
            }
        )
        self.assertEqual(
            result.return_code,
            0,
            u"Return code is non-zero: {0}".format(result.return_code))
        self.assertEqual(
            len(result.stderr),
            0,
            u"Failed to add YUM repo to content view: {0}".format(
                result.stderr))

        # Publish content view
        result = ContentView.with_user(
            new_user['login'],
            new_user['password']
        ).publish({u'id': new_cv['id']})
        self.assertEqual(
            result.return_code,
            0,
            u"Return code is non-zero: {0}".format(result.return_code))
        self.assertEqual(
            len(result.stderr),
            0,
            u"Failed to publish content view: {0}".format(result.stderr))

        # Only after we publish version1 the info is populated.
        result = ContentView.with_user(
            new_user['login'],
            new_user['password']
        ).info({u'id': new_cv['id']})
        self.assertEqual(
            result.return_code,
            0,
            u"Return code is non-zero: {0}".format(result.return_code))
        self.assertEqual(
            len(result.stderr),
            0,
            u"Could not fetch content view info: {0}".format(result.stderr))

        # Let us now store the version1 id
        version1_id = result.stdout['versions'][0]['id']

        # Promote content view to first lifecycle
        result = ContentView.with_user(
            new_user['login'],
            new_user['password']
        ).version_promote(
            {u'id': result.stdout['versions'][0]['id'],
             u'lifecycle-environment-id': lifecycle1['id']})
        self.assertEqual(
            result.return_code,
            0,
            u"Return code is non-zero: {0}".format(result.return_code))
        self.assertEqual(
            len(result.stderr),
            0,
            u"Failed to promote content view to lifecycle '{0}': {1}".format(
                lifecycle1['name'], result.stderr))

        # Promote content view to second lifecycle
        result = ContentView.with_user(
            new_user['login'],
            new_user['password']
        ).version_promote(
            {u'id': version1_id,
             u'lifecycle-environment-id': lifecycle2['id']})
        self.assertEqual(
            result.return_code,
            0,
            u"Return code is non-zero: {0}".format(result.return_code))
        self.assertEqual(
            len(result.stderr),
            0,
            u"Failed to promote content view to lifecycle '{0}': {1}".format(
                lifecycle2['name'], result.stderr))

        # Create a new libvirt compute resource
        result = self._create(
            new_user,
            ComputeResource,
            {
                u'name': self._generate_name(),
                u'provider': u'Libvirt',
                u'url': u'qemu+tcp://{0}:16509/system'.format(
                    conf.properties['main.server.hostname'])
            })

        # Create a new subnet
        new_subnet = self._create(
            new_user,
            Subnet,
            {
                u'name': self._generate_name(),
                u'network': FauxFactory.generate_ipaddr(ip3=True),
                u'mask': u'255.255.255.0'
            }
        )

        # Create a domain
        new_domain = self._create(
            new_user,
            Domain,
            {
                u'name': self._generate_name(),
            }
        )

        # Fetch Puppet environment for second lifecycle
        # (unfortunately it is not straight forward to extract this)

        # The puppet environment we want has a name like this...
        env_name = u'KT_{0}_{1}_'.format(
            #  Hyphens are replaced by underscores
            new_org['label'].replace('-', '_',),
            lifecycle2['label'].replace('-', '_')
        )
        # We fetch all the puppet environments for our organization...
        result = Environment.with_user(
            new_user['login'],
            new_user['password']
        ).list(
            {
                u'search': u'organization=\"{0}\"'.format(
                    new_org['name'])
            })
        self.assertEqual(
            result.return_code,
            0,
            u"Return code is non-zero: {0}".format(result.return_code))
        self.assertEqual(
            len(result.stderr),
            0,
            u"Failed to fetch puppet environments: {0}".format(
                result.stderr))
        # Now look for the puppet environment that matches lifecycle2
        puppet_env = [
            env for env in result.stdout if env['name'].startswith(
                env_name)]
        self.assertEqual(
            len(puppet_env),
            1,
            u'Could not find the puppet environment: {0}'.format(env_name))

        # Create new Capsule...
        new_capsule = self._create(
            new_user,
            Proxy,
            {
                u'name': self._generate_name(),
                u'url': u'https://{0}:9090/'.format(
                    conf.properties['main.server.hostname'])
            }
        )
        # ...and add it to the organization
        result = Org.with_user(
            new_user['login'],
            new_user['password']
        ).add_smart_proxy(
            {
                u'id': new_org['id'],
                u'smart-proxy-id': new_capsule['id']
            }
        )
        self.assertEqual(
            result.return_code,
            0,
            u"Return code is non-zero: {0}".format(result.return_code))
        self.assertEqual(
            len(result.stderr),
            0,
            u"Failed to add capsule '{0}' to org '{1}': {2}".format(
                new_capsule['name'], new_org['name'], result.stderr))

        # Create a hostgroup...
        new_hg = self._create(
            new_user,
            HostGroup,
            {
                u'name': self._generate_name(),
                u'domain-id': new_domain['id'],
                u'subnet-id': new_subnet['id'],
                u'environment-id': puppet_env[0]['id'],
                u'puppet-ca-proxy-id': new_capsule['id'],
                u'puppet-proxy-id': new_capsule['id'],
            }
        )
        # ...and add it to the organization
        result = Org.with_user(
            new_user['login'],
            new_user['password']
        ).add_hostgroup(
            {
                u'id': new_org['id'],
                u'hostgroup-id': new_hg['id']
            }
        )
        self.assertEqual(
            result.return_code,
            0,
            u"Return code is non-zero: {0}".format(result.return_code))
        self.assertEqual(
            len(result.stderr),
            0,
            u"Failed to add hostgroup '{0}' to org '{1}': {2}".format(
                new_hg['name'], new_org['name'], result.stderr))
コード例 #31
0
def test_positive_user_permission(products_with_repos):
    """Show errata only if the User has permissions to view them

    :id: f350c13b-8cf9-4aa5-8c3a-1c48397ea514

    :Setup:

        1. Create two products with one repo each. Sync them.
        2. Make sure that they both have errata.
        3. Create a user with view access on one product and not on the
           other.

    :Steps: erratum list --organization-id=<orgid>

    :expectedresults: Check that the new user is able to see errata for one
        product only.

    :BZ: 1403947
    """
    user_password = gen_string('alphanumeric')
    user_name = gen_string('alphanumeric')

    product = products_with_repos[3]
    org = product.organization

    # get the available permissions
    permissions = Filter.available_permissions()
    user_required_permissions_names = ['view_products']
    # get the user required permissions ids
    user_required_permissions_ids = [
        permission['id'] for permission in permissions
        if permission['name'] in user_required_permissions_names
    ]
    assert len(user_required_permissions_ids) > 0

    # create a role
    role = make_role({'organization-ids': org.id})

    # create a filter with the required permissions for role with product
    # one only
    make_filter({
        'permission-ids': user_required_permissions_ids,
        'role-id': role['id'],
        'search': f"name = {product.name}",
    })

    # create a new user and assign him the created role permissions
    user = make_user({
        'admin': False,
        'login': user_name,
        'password': user_password,
        'organization-ids': [org.id],
        'default-organization-id': org.id,
    })
    User.add_role({'id': user['id'], 'role-id': role['id']})

    # make sure the user is not admin and has only the permissions assigned
    user = User.info({'id': user['id']})
    assert user['admin'] == 'no'
    assert set(user['roles']) == {role['name']}

    # try to get organization info
    # get the info as admin user first
    org_info = Org.info({'id': org.id})
    assert str(org.id) == org_info['id']
    assert org.name == org_info['name']

    # get the organization info as the created user
    with pytest.raises(CLIReturnCodeError) as context:
        Org.with_user(user_name, user_password).info({'id': org.id})
    assert 'Missing one of the required permissions: view_organizations' in context.value.stderr

    # try to get the erratum products list by organization id only
    # ensure that all products erratum are accessible by admin user
    admin_org_errata_ids = [
        errata['errata-id']
        for errata in Erratum.list({'organization-id': org.id})
    ]
    assert REPOS_WITH_ERRATA[2]['errata_id'] in admin_org_errata_ids
    assert REPOS_WITH_ERRATA[3]['errata_id'] in admin_org_errata_ids

    assert len(admin_org_errata_ids) == (REPOS_WITH_ERRATA[2]['errata_count'] +
                                         REPOS_WITH_ERRATA[3]['errata_count'])

    # ensure that the created user see only the erratum product that was
    # assigned in permissions
    user_org_errata_ids = [
        errata['errata-id'] for errata in Erratum.with_user(
            user_name, user_password).list({'organization-id': org.id})
    ]
    assert len(user_org_errata_ids) == REPOS_WITH_ERRATA[3]['errata_count']
    assert REPOS_WITH_ERRATA[3]['errata_id'] in user_org_errata_ids
    assert REPOS_WITH_ERRATA[2]['errata_id'] not in user_org_errata_ids
コード例 #32
0
    def test_positive_end_to_end(self):
        """Perform end to end smoke tests using RH and custom repos.

        1. Create a new user with admin permissions
        2. Using the new user from above
            1. Create a new organization
            2. Clone and upload manifest
            3. Create a new lifecycle environment
            4. Create a custom product
            5. Create a custom YUM repository
            6. Create a custom PUPPET repository
            7. Enable a Red Hat repository
            8. Synchronize the three repositories
            9. Create a new content view
            10. Associate the YUM and Red Hat repositories to new content view
            11. Add a PUPPET module to new content view
            12. Publish content view
            13. Promote content view to the lifecycle environment
            14. Create a new activation key
            15. Add the products to the activation key
            16. Create a new libvirt compute resource
            17. Create a new subnet
            18. Create a new domain
            19. Create a new hostgroup and associate previous entities to it
            20. Provision a client

        @id: 8c8b3ffa-0d54-436b-8eeb-1a3542e100a8

        @Assert: All tests should succeed and Content should be successfully
        fetched by client.
        """
        # step 1: Create a new user with admin permissions
        password = gen_alphanumeric()
        user = make_user({u'admin': u'true', u'password': password})
        user['password'] = password

        # step 2.1: Create a new organization
        org = self._create(user, Org, {u'name': gen_alphanumeric()})

        # step 2.2: Clone and upload manifest
        if self.fake_manifest_is_set:
            with manifests.clone() as manifest:
                ssh.upload_file(manifest.content, manifest.filename)
            Subscription.upload({
                u'file': manifest.filename,
                u'organization-id': org['id'],
            })

        # step 2.3: Create a new lifecycle environment
        lifecycle_environment = self._create(
            user, LifecycleEnvironment, {
                u'name': gen_alphanumeric(),
                u'organization-id': org['id'],
                u'prior': u'Library',
            })

        # step 2.4: Create a custom product
        product = self._create(user, Product, {
            u'name': gen_alphanumeric(),
            u'organization-id': org['id'],
        })
        repositories = []

        # step 2.5: Create custom YUM repository
        yum_repo = self._create(
            user, Repository, {
                u'content-type': u'yum',
                u'name': gen_alphanumeric(),
                u'product-id': product['id'],
                u'publish-via-http': u'true',
                u'url': GOOGLE_CHROME_REPO,
            })
        repositories.append(yum_repo)

        # step 2.6: Create custom PUPPET repository
        puppet_repo = self._create(
            user, Repository, {
                u'content-type': u'puppet',
                u'name': gen_alphanumeric(),
                u'product-id': product['id'],
                u'publish-via-http': u'true',
                u'url': FAKE_0_PUPPET_REPO,
            })
        repositories.append(puppet_repo)

        # step 2.7: Enable a Red Hat repository
        if self.fake_manifest_is_set:
            RepositorySet.enable({
                u'basearch': 'x86_64',
                u'name': REPOSET['rhva6'],
                u'organization-id': org['id'],
                u'product': PRDS['rhel'],
                u'releasever': '6Server',
            })
            rhel_repo = Repository.info({
                u'name': REPOS['rhva6']['name'],
                u'organization-id': org['id'],
                u'product': PRDS['rhel'],
            })
            repositories.append(rhel_repo)

        # step 2.8: Synchronize the three repositories
        for repo in repositories:
            Repository.with_user(user['login'], user['password']).synchronize(
                {u'id': repo['id']})

        # step 2.9: Create content view
        content_view = self._create(user, ContentView, {
            u'name': gen_alphanumeric(),
            u'organization-id': org['id'],
        })

        # step 2.10: Associate the YUM and Red Hat repositories to new content
        # view
        repositories.remove(puppet_repo)
        for repo in repositories:
            ContentView.add_repository({
                u'id': content_view['id'],
                u'organization-id': org['id'],
                u'repository-id': repo['id'],
            })

        # step 2.11: Add a PUPPET module to new content view
        result = PuppetModule.with_user(user['login'], user['password']).list({
            u'repository-id':
            puppet_repo['id'],
            u'per-page':
            False,
        })
        ContentView.with_user(user['login'],
                              user['password']).puppet_module_add({
                                  u'content-view-id':
                                  content_view['id'],
                                  u'id':
                                  random.choice(result)['id'],
                              })

        # step 2.12: Publish content view
        ContentView.with_user(user['login'], user['password']).publish(
            {u'id': content_view['id']})

        # step 2.13: Promote content view to the lifecycle environment
        content_view = ContentView.with_user(
            user['login'], user['password']).info({u'id': content_view['id']})
        self.assertEqual(len(content_view['versions']), 1)
        cv_version = ContentView.with_user(
            user['login'], user['password']).version_info({
                'id':
                content_view['versions'][0]['id'],
            })
        self.assertEqual(len(cv_version['lifecycle-environments']), 1)
        ContentView.with_user(user['login'],
                              user['password']).version_promote({
                                  u'id':
                                  cv_version['id'],
                                  u'to-lifecycle-environment-id':
                                  lifecycle_environment['id'],
                              })
        # check that content view exists in lifecycle
        content_view = ContentView.with_user(
            user['login'], user['password']).info({u'id': content_view['id']})
        self.assertEqual(len(content_view['versions']), 1)
        cv_version = ContentView.with_user(
            user['login'], user['password']).version_info({
                'id':
                content_view['versions'][0]['id'],
            })
        self.assertEqual(len(cv_version['lifecycle-environments']), 2)
        self.assertEqual(cv_version['lifecycle-environments'][-1]['id'],
                         lifecycle_environment['id'])

        # step 2.14: Create a new activation key
        activation_key = self._create(
            user, ActivationKey, {
                u'content-view-id': content_view['id'],
                u'lifecycle-environment-id': lifecycle_environment['id'],
                u'name': gen_alphanumeric(),
                u'organization-id': org['id'],
            })

        # step 2.15: Add the products to the activation key
        subscription_list = Subscription.with_user(
            user['login'],
            user['password']).list({u'organization-id': org['id']},
                                   per_page=False)
        for subscription in subscription_list:
            if subscription['name'] == DEFAULT_SUBSCRIPTION_NAME:
                ActivationKey.with_user(user['login'],
                                        user['password']).add_subscription({
                                            u'id':
                                            activation_key['id'],
                                            u'quantity':
                                            1,
                                            u'subscription-id':
                                            subscription['id'],
                                        })

        # step 2.15.1: Enable product content
        if self.fake_manifest_is_set:
            ActivationKey.with_user(user['login'],
                                    user['password']).content_override({
                                        u'content-label':
                                        AK_CONTENT_LABEL,
                                        u'id':
                                        activation_key['id'],
                                        u'organization-id':
                                        org['id'],
                                        u'value':
                                        '1',
                                    })

        # BONUS: Create a content host and associate it with promoted
        # content view and last lifecycle where it exists
        content_host_name = gen_alphanumeric()
        content_host = Host.with_user(user['login'],
                                      user['password']).subscription_register({
                                          u'content-view-id':
                                          content_view['id'],
                                          u'lifecycle-environment-id':
                                          lifecycle_environment['id'],
                                          u'name':
                                          content_host_name,
                                          u'organization-id':
                                          org['id'],
                                      })
        if bz_bug_is_open(1328202):
            results = ContentHost.with_user(user['login'],
                                            user['password']).list(
                                                {'organization-id': org['id']})
            # Content host registration converts the name to lowercase, make
            # sure to use the same format while matching against the result
            content_host_name = content_host_name.lower()
            for result in results:
                if result['name'] == content_host_name:
                    content_host = result
        content_host = ContentHost.with_user(
            user['login'], user['password']).info({'id': content_host['id']})
        # check that content view matches what we passed
        self.assertEqual(content_host['content-view'], content_view['name'])
        # check that lifecycle environment matches
        self.assertEqual(content_host['lifecycle-environment'],
                         lifecycle_environment['name'])

        # step 2.16: Create a new libvirt compute resource
        self._create(
            user, ComputeResource, {
                u'name':
                gen_alphanumeric(),
                u'provider':
                u'Libvirt',
                u'url':
                u'qemu+ssh://root@{0}/system'.format(
                    settings.compute_resources.libvirt_hostname),
            })

        # step 2.17: Create a new subnet
        subnet = self._create(
            user, Subnet, {
                u'name': gen_alphanumeric(),
                u'network': gen_ipaddr(ip3=True),
                u'mask': u'255.255.255.0',
            })

        # step 2.18: Create a new domain
        domain = self._create(user, Domain, {u'name': gen_alphanumeric()})

        # step 2.19: Create a new hostgroup and associate previous entities to
        # it
        host_group = self._create(
            user, HostGroup, {
                u'domain-id': domain['id'],
                u'name': gen_alphanumeric(),
                u'subnet-id': subnet['id'],
            })
        if not bz_bug_is_open('1326101'):
            Org.with_user(user['login'], user['password']).add_hostgroup({
                u'hostgroup-id':
                host_group['id'],
                u'id':
                org['id'],
            })

        # step 2.20: Provision a client
        self.client_provisioning(activation_key['name'], org['label'])
コード例 #33
0
    def test_positive_end_to_end(self):
        """Perform end to end smoke tests using RH and custom repos.

        1. Create a new user with admin permissions
        2. Using the new user from above
            1. Create a new organization
            2. Clone and upload manifest
            3. Create a new lifecycle environment
            4. Create a custom product
            5. Create a custom YUM repository
            6. Create a custom PUPPET repository
            7. Enable a Red Hat repository
            8. Synchronize the three repositories
            9. Create a new content view
            10. Associate the YUM and Red Hat repositories to new content view
            11. Add a PUPPET module to new content view
            12. Publish content view
            13. Promote content view to the lifecycle environment
            14. Create a new activation key
            15. Add the products to the activation key
            16. Create a new libvirt compute resource
            17. Create a new subnet
            18. Create a new domain
            19. Create a new hostgroup and associate previous entities to it
            20. Provision a client

        @id: 8c8b3ffa-0d54-436b-8eeb-1a3542e100a8

        @Assert: All tests should succeed and Content should be successfully
        fetched by client.
        """
        # step 1: Create a new user with admin permissions
        password = gen_alphanumeric()
        user = make_user({u'admin': u'true', u'password': password})
        user['password'] = password

        # step 2.1: Create a new organization
        org = self._create(user, Org, {u'name': gen_alphanumeric()})

        # step 2.2: Clone and upload manifest
        if self.fake_manifest_is_set:
            with manifests.clone() as manifest:
                ssh.upload_file(manifest.content, manifest.filename)
            Subscription.upload({
                u'file': manifest.filename,
                u'organization-id': org['id'],
            })

        # step 2.3: Create a new lifecycle environment
        lifecycle_environment = self._create(
            user,
            LifecycleEnvironment,
            {
                u'name': gen_alphanumeric(),
                u'organization-id': org['id'],
                u'prior': u'Library',
            }
        )

        # step 2.4: Create a custom product
        product = self._create(
            user,
            Product,
            {
                u'name': gen_alphanumeric(),
                u'organization-id': org['id'],
            }
        )
        repositories = []

        # step 2.5: Create custom YUM repository
        yum_repo = self._create(
            user,
            Repository,
            {
                u'content-type': u'yum',
                u'name': gen_alphanumeric(),
                u'product-id': product['id'],
                u'publish-via-http': u'true',
                u'url': GOOGLE_CHROME_REPO,
            }
        )
        repositories.append(yum_repo)

        # step 2.6: Create custom PUPPET repository
        puppet_repo = self._create(
            user,
            Repository,
            {
                u'content-type': u'puppet',
                u'name': gen_alphanumeric(),
                u'product-id': product['id'],
                u'publish-via-http': u'true',
                u'url': FAKE_0_PUPPET_REPO,
            }
        )
        repositories.append(puppet_repo)

        # step 2.7: Enable a Red Hat repository
        if self.fake_manifest_is_set:
            RepositorySet.enable({
                u'basearch': 'x86_64',
                u'name': REPOSET['rhva6'],
                u'organization-id': org['id'],
                u'product': PRDS['rhel'],
                u'releasever': '6Server',
            })
            rhel_repo = Repository.info({
                u'name': REPOS['rhva6']['name'],
                u'organization-id': org['id'],
                u'product': PRDS['rhel'],
            })
            repositories.append(rhel_repo)

        # step 2.8: Synchronize the three repositories
        for repo in repositories:
            Repository.with_user(
                user['login'],
                user['password']
            ).synchronize({u'id': repo['id']})

        # step 2.9: Create content view
        content_view = self._create(
            user,
            ContentView,
            {
                u'name': gen_alphanumeric(),
                u'organization-id': org['id'],
            }
        )

        # step 2.10: Associate the YUM and Red Hat repositories to new content
        # view
        repositories.remove(puppet_repo)
        for repo in repositories:
            ContentView.add_repository({
                u'id': content_view['id'],
                u'organization-id': org['id'],
                u'repository-id': repo['id'],
            })

        # step 2.11: Add a PUPPET module to new content view
        result = PuppetModule.with_user(
            user['login'],
            user['password']
        ).list({
            u'repository-id': puppet_repo['id'],
            u'per-page': False,
        })
        ContentView.with_user(
            user['login'],
            user['password']
        ).puppet_module_add({
            u'content-view-id': content_view['id'],
            u'id': random.choice(result)['id'],
        })

        # step 2.12: Publish content view
        ContentView.with_user(
            user['login'],
            user['password']
        ).publish({u'id': content_view['id']})

        # step 2.13: Promote content view to the lifecycle environment
        content_view = ContentView.with_user(
            user['login'],
            user['password']
        ).info({u'id': content_view['id']})
        self.assertEqual(len(content_view['versions']), 1)
        cv_version = ContentView.with_user(
            user['login'],
            user['password']
        ).version_info({
            'id': content_view['versions'][0]['id'],
        })
        self.assertEqual(len(cv_version['lifecycle-environments']), 1)
        ContentView.with_user(
            user['login'],
            user['password']
        ).version_promote({
            u'id': cv_version['id'],
            u'to-lifecycle-environment-id': lifecycle_environment['id'],
        })
        # check that content view exists in lifecycle
        content_view = ContentView.with_user(
            user['login'],
            user['password']
        ).info({u'id': content_view['id']})
        self.assertEqual(len(content_view['versions']), 1)
        cv_version = ContentView.with_user(
            user['login'],
            user['password']
        ).version_info({
            'id': content_view['versions'][0]['id'],
        })
        self.assertEqual(len(cv_version['lifecycle-environments']), 2)
        self.assertEqual(
            cv_version['lifecycle-environments'][-1]['id'],
            lifecycle_environment['id']
        )

        # step 2.14: Create a new activation key
        activation_key = self._create(
            user,
            ActivationKey,
            {
                u'content-view-id': content_view['id'],
                u'lifecycle-environment-id': lifecycle_environment['id'],
                u'name': gen_alphanumeric(),
                u'organization-id': org['id'],
            }
        )

        # step 2.15: Add the products to the activation key
        subscription_list = Subscription.with_user(
            user['login'],
            user['password']
        ).list(
            {u'organization-id': org['id']},
            per_page=False
        )
        for subscription in subscription_list:
            if subscription['name'] == DEFAULT_SUBSCRIPTION_NAME:
                ActivationKey.with_user(
                    user['login'],
                    user['password']
                ).add_subscription({
                    u'id': activation_key['id'],
                    u'quantity': 1,
                    u'subscription-id': subscription['id'],
                })

        # step 2.15.1: Enable product content
        if self.fake_manifest_is_set:
            ActivationKey.with_user(
                user['login'],
                user['password']
            ).content_override({
                u'content-label': AK_CONTENT_LABEL,
                u'id': activation_key['id'],
                u'organization-id': org['id'],
                u'value': '1',
            })

        # BONUS: Create a content host and associate it with promoted
        # content view and last lifecycle where it exists
        content_host_name = gen_alphanumeric()
        content_host = Host.with_user(
            user['login'],
            user['password']
        ).subscription_register({
            u'content-view-id': content_view['id'],
            u'lifecycle-environment-id': lifecycle_environment['id'],
            u'name': content_host_name,
            u'organization-id': org['id'],
        })
        if bz_bug_is_open(1328202):
            results = ContentHost.with_user(
                user['login'],
                user['password']
            ).list({
                'organization-id': org['id']
            })
            # Content host registration converts the name to lowercase, make
            # sure to use the same format while matching against the result
            content_host_name = content_host_name.lower()
            for result in results:
                if result['name'] == content_host_name:
                    content_host = result
        content_host = ContentHost.with_user(
            user['login'],
            user['password']
        ).info({'id': content_host['id']})
        # check that content view matches what we passed
        self.assertEqual(
            content_host['content-view'],
            content_view['name']
        )
        # check that lifecycle environment matches
        self.assertEqual(
            content_host['lifecycle-environment'],
            lifecycle_environment['name']
        )

        # step 2.16: Create a new libvirt compute resource
        self._create(
            user,
            ComputeResource,
            {
                u'name': gen_alphanumeric(),
                u'provider': u'Libvirt',
                u'url': u'qemu+ssh://root@{0}/system'.format(
                    settings.compute_resources.libvirt_hostname
                ),
            }
        )

        # step 2.17: Create a new subnet
        subnet = self._create(
            user,
            Subnet,
            {
                u'name': gen_alphanumeric(),
                u'network': gen_ipaddr(ip3=True),
                u'mask': u'255.255.255.0',
            }
        )

        # step 2.18: Create a new domain
        domain = self._create(user, Domain, {u'name': gen_alphanumeric()})

        # step 2.19: Create a new hostgroup and associate previous entities to
        # it
        host_group = self._create(
            user,
            HostGroup,
            {
                u'domain-id': domain['id'],
                u'name': gen_alphanumeric(),
                u'subnet-id': subnet['id'],
            }
        )
        if not bz_bug_is_open('1326101'):
            Org.with_user(
                user['login'],
                user['password']
            ).add_hostgroup({
                u'hostgroup-id': host_group['id'],
                u'id': org['id'],
            })

        # step 2.20: Provision a client
        self.client_provisioning(activation_key['name'], org['label'])