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()
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()
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()
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()
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()
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
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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)})
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) })
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()
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)})
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}'})
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) })
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)
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()
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}'})
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()
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)
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'], })
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'], })
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))
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
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'])
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'])