{"action":"created","comment":{"url":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/comments/89177392","pull_request_review_id":9712499,"id":89177392,"diff_hunk":"@@ -1830,115 +1834,406 @@ def test_positive_restart_publish_via_dynflow(self):\n     # ROLES TESTING\n     # All this stuff is speculative at best.\n \n-    @stubbed()\n     @run_only_on('sat')\n     @tier2\n     def test_positive_admin_user_actions(self):\n-        # Note:\n-        # Obviously all of this stuff should work with 'admin' user\n-        # but these tests require creating a user with admin permissions\n-        # for Content Views\n-        # Dev note: none of this stuff is integrated with foreman rbac yet\n-        # As such, all variations in here subject to change.\n-        # Variations:\n-        #  * Read, Modify, Delete, Promote Publish, Subscribe\n-        \"\"\"attempt to view content views\n+        \"\"\"Attempt to manage content views\n \n         @id: c4d270fc-a3e6-4ae2-a338-41d864a5622a\n \n-        @setup: create a user with the Content View admin role\n+        @steps:\n+        with global admin account:\n \n-        @assert: User with admin role for content view can perform all\n-        Variations above\n+        1. create a user with all content views permissions\n+        2. create lifecycle environment\n+        3. create 2 content views (one to delete, the other to manage)\n \n-        @caseautomation: notautomated\n+        @setup: create a user with all content views permissions\n \n+        @assert: The user can Read, Modify, Delete, Publish, Promote the\n+        content views\n \n         @CaseLevel: Integration\n         \"\"\"\n+        # note: the user to create has no permissions to access products\n+        # repositories\n+        repo_name = gen_string('alpha')\n+        cv_name = gen_string('alpha')\n+        cv_new_name = gen_string('alpha')\n+        cv_copy_name = gen_string('alpha')\n+        env_name = gen_string('alpha')\n+        user_login = gen_string('alpha')\n+        user_password = gen_string('alphanumeric')\n+        role_name = gen_string('alpha')\n+        # create a role with all content views permissions\n+        role = entities.Role(name=role_name).create()\n+        entities.Filter(\n+            organization=[self.organization],\n+            permission=entities.Permission(\n+                resource_type='Katello::ContentView').search(),\n+            role=role,\n+            search=None\n+        ).create()\n+        # create environment permissions with read only and promote access\n+        # to content views\n+        env_permissions_entities = entities.Permission(\n+            resource_type='Katello::KTEnvironment').search()\n+        user_env_permissions = [\n+            'promote_or_remove_content_views_to_environments',\n+            'view_lifecycle_environments'\n+        ]\n+        user_env_permissions_entities = [\n+            entity\n+            for entity in env_permissions_entities\n+            if entity.name in user_env_permissions\n+        ]\n+        entities.Filter(\n+            organization=[self.organization],\n+            permission=user_env_permissions_entities,\n+            role=role,\n+            # allow access only to the mentioned here environments\n+            search='name = {0} or name = {1}'.format(ENVIRONMENT, env_name)\n+        ).create()\n+        # create a user and assign the above created role\n+        entities.User(\n+            default_organization=self.organization,\n+            organization=[self.organization],\n+            role=[role],\n+            login=user_login,\n+            password=user_password\n+        ).create()\n+        # create a content views with the main admin account\n+        with Session(self.browser) as session:\n+            # create a lifecycle environment\n+            make_lifecycle_environment(\n+                session, org=self.organization.name, name=env_name)\n+            # create a repository\n+            self.setup_to_create_cv(repo_name=repo_name)\n+            # create the first content view\n+            make_contentview(\n+                session, org=self.organization.name, name=cv_name)\n+            self.assertIsNotNone(self.content_views.search(cv_name))\n+            # add repository to the created content view\n+            self.content_views.add_remove_repos(cv_name, [repo_name])\n+            # create the second content view as a copy of the first\n+            self.content_views.copy_view(cv_name, cv_copy_name)\n+            self.assertIsNotNone(self.content_views.search(cv_copy_name))\n+        # login as the user created above\n+        with Session(self.browser, user_login, user_password) as session:\n+            # go to content views page\n+            session.nav.go_to_content_views()\n+            # assert the user can view the content views\n+            self.assertIsNotNone(self.content_views.search(cv_name))\n+            self.assertIsNotNone(self.content_views.search(cv_copy_name))\n+            # assert that the user can delete a content view\n+            self.content_views.delete(cv_copy_name)\n+            self.assertIsNone(self.content_views.search(cv_copy_name))\n+            # assert the user can edit the content view\n+            self.content_views.update(cv_name, cv_new_name)\n+            self.assertIsNotNone(self.content_views.search(cv_new_name))\n+            # assert that the user can publish and promote the content view\n+            version = self.content_views.publish(cv_new_name)\n+            self.assertIsNotNone(\n+                self.content_views.wait_until_element(\n+                    common_locators['alert.success_sub_form'])\n+            )\n+            self.content_views.promote(cv_new_name, version, env_name)\n+            self.assertIsNotNone(self.content_views.wait_until_element(\n+                common_locators['alert.success_sub_form']))\n \n-    @stubbed()\n     @run_only_on('sat')\n     @tier2\n     def test_positive_readonly_user_actions(self):\n-        # Note:\n-        # Obviously all of this stuff should work with 'admin' user\n-        # but these tests require creating a user with read-only permissions\n-        # for Content Views\n-        # THIS IS EVEN ASSUMING WE HAVE A \"READ-ONLY\" ROLE IN THE FIRST PLACE\n-        # Dev note: none of this stuff is integrated with foreman rbac yet\n-        # As such, all variations in here subject to change.\n-        # Variations:\n-        #  * Read, Modify,  Promote?, Publish?, Subscribe??\n-        \"\"\"attempt to view content views\n+        \"\"\"Attempt to view content views\n \n         @id: ebdc37ed-7887-4f64-944c-f2f92c58a206\n \n-        @setup: create a user with the Content View read-only role\n-\n-        @assert: User with read-only role for content view can perform all\n-        Variations above\n+        @setup:\n \n-        @caseautomation: notautomated\n+        1. create a user with the Content View read-only role\n+        2. create content view\n+        3. add a custom repository to content view\n \n+        @assert: User with read-only role for content view can view the\n+        repository in the content view\n \n         @CaseLevel: Integration\n         \"\"\"\n+        repo_name = gen_string('alpha')\n+        cv_name = gen_string('alpha')\n+        user_login = gen_string('alpha')\n+        user_password = gen_string('alphanumeric')\n+        role_name = gen_string('alpha')\n+        # create a role with content views read only permissions\n+        role = entities.Role(name=role_name).create()\n+        entities.Filter(\n+            organization=[self.organization],\n+            permission=entities.Permission(\n+                resource_type='Katello::ContentView').search(\n+                filters={'name': 'view_content_views'}),\n+            role=role,\n+            search=None\n+        ).create()\n+        # create read only products permissions and assign it to our role\n+        entities.Filter(\n+            organization=[self.organization],\n+            permission=entities.Permission(\n+                resource_type='Katello::Product').search(\n+                filters={'name': 'view_products'}),\n+            role=role,\n+            search=None\n+        ).create()\n+        # create a user and assign the above created role\n+        entities.User(\n+            default_organization=self.organization,\n+            organization=[self.organization],\n+            role=[role],\n+            login=user_login,\n+            password=user_password\n+        ).create()\n+        # create a content view with the main admin account\n+        with Session(self.browser) as session:\n+            # create a repository\n+            # note: the user created above has not access to repositories\n+            self.setup_to_create_cv(repo_name=repo_name)\n+            # create the first content view\n+            make_contentview(\n+                session, org=self.organization.name, name=cv_name)\n+            self.assertIsNotNone(self.content_views.search(cv_name))\n+            # add repository to the created content view\n+            self.content_views.add_remove_repos(cv_name, [repo_name])\n+        # login as the user created above\n+        with Session(self.browser, user_login, user_password) as session:\n+            session.nav.go_to_content_views()\n+            # assert the user can view the content view\n+            cv_element = self.content_views.search(cv_name)\n+            self.assertIsNotNone(cv_element)\n+            # assert that the user can view the repo in content view\n+            self.content_views.click(cv_element)\n+            # cv_element.click()\n+            self.content_views.wait_for_ajax()\n+            self.content_views.click(tab_locators.contentviews.tab_content)\n+            self.content_views.click(locators.contentviews.content_repo)\n+            self.content_views.text_field_update(\n+                locators.contentviews.repo_search, repo_name)\n+            self.assertIsNotNone(self.content_views.wait_until_element(\n+                locators.contentviews.select_repo % repo_name))\n \n-    @stubbed()\n     @run_only_on('sat')\n     @tier2\n     def test_negative_non_admin_user_actions(self):\n-        # Note:\n-        # Obviously all of this stuff should work with 'admin' user\n-        # but these tests require creating a user withOUT admin permissions\n-        # for Content Views\n-        # Dev note: none of this stuff is integrated with foreman rbac yet\n-        # As such, all variations in here subject to change.\n-        # Variations:\n-        #  * Read, Modify, Delete, Promote Publish, Subscribe\n-        \"\"\"attempt to view content views\n+        \"\"\"Attempt to manage content views\n \n         @id: aae6eede-b40e-4e06-a5f7-59d9251aa35d\n \n-        @setup: create a user with the Content View admin role\n+        @setup:\n \n-        @assert: User withOUT admin role for content view canNOT perform any\n-        Variations above\n-\n-        @caseautomation: notautomated\n+        1. create a user with the Content View read-only role\n+        2. create content view\n+        3. add a custom repository to content view\n \n+        @assert: User with read only role for content view cannot Modify,\n+         Delete, Publish, Promote the content views\n \n         @CaseLevel: Integration\n         \"\"\"\n+        # create a content view read only user\n+        # with lifecycle environment permissions view and promote content views\n+        repo_name = gen_string('alpha')\n+        cv_name = gen_string('alpha')\n+        cv_new_name = gen_string('alpha')\n+        env_name = gen_string('alpha')\n+        user_login = gen_string('alpha')\n+        user_password = gen_string('alphanumeric')\n+        role_name = gen_string('alpha')\n+        # create a role with content views read only permissions\n+        role = entities.Role(name=role_name).create()\n+        entities.Filter(\n+            organization=[self.organization],\n+            permission=entities.Permission(\n+                resource_type='Katello::ContentView').search(\n+                filters={'name': 'view_content_views'}),\n+            role=role,\n+            search=None\n+        ).create()\n+        # create environment permissions with read only and promote access\n+        # to content views\n+        env_permissions_entities = entities.Permission(\n+            resource_type='Katello::KTEnvironment').search()\n+        user_env_permissions = [\n+            'promote_or_remove_content_views_to_environments',\n+            'view_lifecycle_environments'\n+        ]\n+        user_env_permissions_entities = [\n+            entity\n+            for entity in env_permissions_entities\n+            if entity.name in user_env_permissions\n+            ]\n+        entities.Filter(\n+            organization=[self.organization],\n+            permission=user_env_permissions_entities,\n+            role=role,\n+            # allow access only to the mentioned here environments\n+            search='name = {0} or name = {1}'.format(ENVIRONMENT, env_name)\n+        ).create()\n+        # create a user and assign the above created role\n+        entities.User(\n+            default_organization=self.organization,\n+            organization=[self.organization],\n+            role=[role],\n+            login=user_login,\n+            password=user_password\n+        ).create()\n+        # create a content views with the main admin account\n+        with Session(self.browser) as session:\n+            # create a lifecycle environment\n+            make_lifecycle_environment(\n+                session, org=self.organization.name, name=env_name)\n+            # create a repository\n+            # note: the user created above has no permissions to access\n+            #       products repositories\n+            self.setup_to_create_cv(repo_name=repo_name)\n+            # create the first content view\n+            make_contentview(\n+                session, org=self.organization.name, name=cv_name)\n+            self.assertIsNotNone(self.content_views.search(cv_name))\n+            # add repository to the created content view\n+            self.content_views.add_remove_repos(cv_name, [repo_name])\n+        # login as the user created above\n+        with Session(self.browser, user_login, user_password) as session:\n+            # go to content views page\n+            session.nav.go_to_content_views()\n+            # assert the user can view the content views\n+            self.assertIsNotNone(self.content_views.search(cv_name))\n+            # assert that the user cannot delete the content view\n+            with self.assertRaises(UINoSuchElementError) as context:\n+                self.content_views.delete(cv_name)\n+            # ensure that the delete location is in the exception message\n+            _, location = locators.contentviews.remove\n+            self.assertIn(location, context.exception.message)\n+            # ensure the user cannot edit the content view\n+            with self.assertRaises(UINoSuchElementError) as context:\n+                self.content_views.update(cv_name, cv_new_name)\n+            # ensure that the edit location is in the exception message\n+            _, location = locators.contentviews.edit_name\n+            self.assertIn(location, context.exception.message)\n+            # ensure that the content view still exist\n+            self.assertIsNotNone(self.content_views.search(cv_name))\n+            # ensure that the user cannot publish the content view\n+            with self.assertRaises(UINoSuchElementError) as context:\n+                self.content_views.publish(cv_new_name)\n+            self.assertIn('element None was not found while trying to click',\n+                          context.exception.message\n+                          )\n+        # publish the content views with the main admin account\n+        with Session(self.browser) as session:\n+            # select the current organisation\n+            session.nav.go_to_select_org(self.organization.name)\n+            # go to content views page\n+            session.nav.go_to_content_views()\n+            version = self.content_views.publish(cv_name)\n+            self.assertIsNotNone(\n+                self.content_views.wait_until_element(\n+                    common_locators['alert.success_sub_form'])\n+            )\n+        # login as the user created above and try to promote the content view\n+        with Session(self.browser, user_login, user_password) as session:\n+            # go to content views page\n+            session.nav.go_to_content_views()\n+            with self.assertRaises(UINoSuchElementError) as context:\n+                self.content_views.promote(\n+                    cv_name, version, env_name)\n+            _, location = locators.contentviews.promote_button % version\n+            self.assertIn(location, context.exception.message)\n \n-    @stubbed()\n     @run_only_on('sat')\n     @tier2\n     def test_negative_non_readonly_user_actions(self):\n-        # Note:\n-        # Obviously all of this stuff should work with 'admin' user\n-        # but these tests require creating a user withOUT read-only permissions\n-        # for Content Views\n-        # THIS IS EVEN ASSUMING WE HAVE A \"READ-ONLY\" ROLE IN THE FIRST PLACE\n-        # Dev note: none of this stuff is integrated with foreman rbac yet\n-        # As such, all variations in here subject to change.\n-        # Variations:\n-        #  * Read, Modify,  Promote?, Publish?, Subscribe??\n-        \"\"\"attempt to view content views\n+        \"\"\"Attempt to view content views\n \n         @id: 9cbc661a-dbe3-4b88-af27-4cf7b9544074\n \n-        @setup: create a user withOUT the Content View read-only role\n-\n-        @assert: User withOUT read-only role for content view can perform all\n-        Variations above\n-\n-        @caseautomation: notautomated\n+        @setup: create a user with the Content View without the content views\n+        read role\n \n+        @assert: the user cannot access content views web resources\n \n         @CaseLevel: Integration\n         \"\"\"\n+        env_name = gen_string('alpha')\n+        user_login = gen_string('alpha')\n+        user_password = gen_string('alphanumeric')\n+        role_name = gen_string('alpha')\n+        # create a role with all content views permissions except\n+        # view_content_views\n+        role = entities.Role(name=role_name).create()\n+        cv_permissions_entities = entities.Permission(\n+            resource_type='Katello::ContentView').search()\n+        user_cv_permissions = list(PERMISSIONS['Katello::ContentView'])\n+        user_cv_permissions.remove('view_content_views')\n+        user_cv_permissions_entities = [\n+            entity\n+            for entity in cv_permissions_entities\n+            if entity.name in user_cv_permissions\n+            ]\n+        # ensure I have some content views permissions\n+        self.assertGreater(len(user_cv_permissions_entities), 0)\n+        self.assertEqual(\n+            len(user_cv_permissions), len(user_cv_permissions_entities))\n+        entities.Filter(\n+            organization=[self.organization],\n+            permission=user_cv_permissions_entities,\n+            role=role,\n+            search=None\n+        ).create()\n+        # create environment permissions with read only and promote access\n+        # to content views\n+        env_permissions_entities = entities.Permission(\n+            resource_type='Katello::KTEnvironment').search()\n+        user_env_permissions = [\n+            'promote_or_remove_content_views_to_environments',\n+            'view_lifecycle_environments'\n+        ]\n+        user_env_permissions_entities = [\n+            entity\n+            for entity in env_permissions_entities\n+            if entity.name in user_env_permissions\n+            ]\n+        entities.Filter(\n+            organization=[self.organization],\n+            permission=user_env_permissions_entities,\n+            role=role,\n+            # allow access only to the mentioned here environments\n+            search='name = {0} or name = {1}'.format(ENVIRONMENT, env_name)\n+        ).create()\n+        # create a user and assign the above created role\n+        entities.User(\n+            default_organization=self.organization,\n+            organization=[self.organization],\n+            role=[role],\n+            login=user_login,\n+            password=user_password\n+        ).create()\n+        # login as the user created above\n+        with Session(self.browser, user_login, user_password) as session:\n+            # ensure cannot go to content views via the application menu\n+            with self.assertRaises(UINoSuchElementError) as context:\n+                session.nav.go_to_content_views()\n+            _, location = menu_locators.menu.content_views","path":"tests/foreman/ui/test_contentview.py","position":489,"original_position":489,"commit_id":"c85e6eb8450a6de7d2b685d87dba494bb69ff0d5","original_commit_id":"c85e6eb8450a6de7d2b685d87dba494bb69ff0d5","user":{"login":"oshtaier","id":10895065,"avatar_url":"https://avatars.githubusercontent.com/u/10895065?v=3","gravatar_id":"","url":"https://api.github.com/users/oshtaier","html_url":"https://github.com/oshtaier","followers_url":"https://api.github.com/users/oshtaier/followers","following_url":"https://api.github.com/users/oshtaier/following{/other_user}","gists_url":"https://api.github.com/users/oshtaier/gists{/gist_id}","starred_url":"https://api.github.com/users/oshtaier/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oshtaier/subscriptions","organizations_url":"https://api.github.com/users/oshtaier/orgs","repos_url":"https://api.github.com/users/oshtaier/repos","events_url":"https://api.github.com/users/oshtaier/events{/privacy}","received_events_url":"https://api.github.com/users/oshtaier/received_events","type":"User","site_admin":false},"body":"same here","created_at":"2016-11-22T18:16:39Z","updated_at":"2016-11-22T18:27:09Z","html_url":"https://github.com/SatelliteQE/robottelo/pull/4015#discussion_r89177392","pull_request_url":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/4015","_links":{"self":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/comments/89177392"},"html":{"href":"https://github.com/SatelliteQE/robottelo/pull/4015#discussion_r89177392"},"pull_request":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/4015"}}},"pull_request":{"url":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/4015","id":94841474,"html_url":"https://github.com/SatelliteQE/robottelo/pull/4015","diff_url":"https://github.com/SatelliteQE/robottelo/pull/4015.diff","patch_url":"https://github.com/SatelliteQE/robottelo/pull/4015.patch","issue_url":"https://api.github.com/repos/SatelliteQE/robottelo/issues/4015","number":4015,"state":"open","locked":false,"title":"#3586-UI-CV-user-role-permissions","user":{"login":"ldjebran","id":131553,"avatar_url":"https://avatars.githubusercontent.com/u/131553?v=3","gravatar_id":"","url":"https://api.github.com/users/ldjebran","html_url":"https://github.com/ldjebran","followers_url":"https://api.github.com/users/ldjebran/followers","following_url":"https://api.github.com/users/ldjebran/following{/other_user}","gists_url":"https://api.github.com/users/ldjebran/gists{/gist_id}","starred_url":"https://api.github.com/users/ldjebran/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ldjebran/subscriptions","organizations_url":"https://api.github.com/users/ldjebran/orgs","repos_url":"https://api.github.com/users/ldjebran/repos","events_url":"https://api.github.com/users/ldjebran/events{/privacy}","received_events_url":"https://api.github.com/users/ldjebran/received_events","type":"User","site_admin":false},"body":"```bash\r\n\"!!! Congratulations your changes are good to fly, make a great PR! dlezz++ !!!\"\r\n```\r\n```bash\r\n(2.7) dlezz@elysion:~/projects/robottelo-fork$ py.test tests/foreman/ui/test_contentview.py -v -k 'test_positive_admin_user_actions'\r\n================================================= test session starts ==================================================\r\nplatform linux2 -- Python 2.7.12, pytest-3.0.3, py-1.4.31, pluggy-0.4.0 -- /home/dlezz/bin/redhat/python/2.7/bin/python\r\ncachedir: .cache\r\nrootdir: /home/dlezz/projects/robottelo-fork, inifile: \r\nplugins: cov-2.4.0, xdist-1.15.0\r\ncollected 63 items \r\n\r\ntests/foreman/ui/test_contentview.py::ContentViewTestCase::test_positive_admin_user_actions <- robottelo/decorators/__init__.py PASSED\r\n\r\n================================================= 62 tests deselected ==================================================\r\n====================================== 1 passed, 62 deselected in 304.43 seconds =======================================\r\n```\r\n```bash\r\n(2.7) dlezz@elysion:~/projects/robottelo-fork$ py.test tests/foreman/ui/test_contentview.py -v -k 'test_positive_readonly_user_actions'\r\n================================================= test session starts ==================================================\r\nplatform linux2 -- Python 2.7.12, pytest-3.0.3, py-1.4.31, pluggy-0.4.0 -- /home/dlezz/bin/redhat/python/2.7/bin/python\r\ncachedir: .cache\r\nrootdir: /home/dlezz/projects/robottelo-fork, inifile: \r\nplugins: cov-2.4.0, xdist-1.15.0\r\ncollected 63 items \r\n\r\ntests/foreman/ui/test_contentview.py::ContentViewTestCase::test_positive_readonly_user_actions <- robottelo/decorators/__init__.py PASSED\r\n\r\n================================================= 62 tests deselected ==================================================\r\n====================================== 1 passed, 62 deselected in 149.75 seconds =======================================\r\n```\r\n```bash\r\n(2.7) dlezz@elysion:~/projects/robottelo-fork$ py.test tests/foreman/ui/test_contentview.py -v -k 'test_negative_non_admin_user_actions'\r\n================================================= test session starts ==================================================\r\nplatform linux2 -- Python 2.7.12, pytest-3.0.3, py-1.4.31, pluggy-0.4.0 -- /home/dlezz/bin/redhat/python/2.7/bin/python\r\ncachedir: .cache\r\nrootdir: /home/dlezz/projects/robottelo-fork, inifile: \r\nplugins: cov-2.4.0, xdist-1.15.0\r\ncollected 63 items \r\n\r\ntests/foreman/ui/test_contentview.py::ContentViewTestCase::test_negative_non_admin_user_actions <- robottelo/decorators/__init__.py PASSED\r\n\r\n================================================= 62 tests deselected ==================================================\r\n====================================== 1 passed, 62 deselected in 350.19 seconds =======================================\r\n```\r\n```bash\r\n(2.7) dlezz@elysion:~/projects/robottelo-fork$ py.test tests/foreman/ui/test_contentview.py -v -k 'test_negative_non_readonly_user_actions'\r\n================================================= test session starts ==================================================\r\nplatform linux2 -- Python 2.7.12, pytest-3.0.3, py-1.4.31, pluggy-0.4.0 -- /home/dlezz/bin/redhat/python/2.7/bin/python\r\ncachedir: .cache\r\nrootdir: /home/dlezz/projects/robottelo-fork, inifile: \r\nplugins: cov-2.4.0, xdist-1.15.0\r\ncollected 63 items \r\n\r\ntests/foreman/ui/test_contentview.py::ContentViewTestCase::test_negative_non_readonly_user_actions <- robottelo/decorators/__init__.py PASSED\r\n\r\n================================================= 62 tests deselected ==================================================\r\n======================================= 1 passed, 62 deselected in 57.61 seconds =======================================\r\n(2.7) dlezz@elysion:~/projects/robottelo-fork$ make can-i-push?\r\n```\r\n## To the reviewer attention:\r\n1- the tests description has been updated as it seems, not accurately written or no more relevant at this stage of the project.\r\n2- The subscribe test has been omitted as I think not adequate for this series of tests and must moved to the negative subscribe test (a new issue should created for this).","created_at":"2016-11-22T15:54:37Z","updated_at":"2016-11-22T18:27:09Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4175cb9527d44f522b4db110e3179cabaa5d6512","assignee":{"login":"ldjebran","id":131553,"avatar_url":"https://avatars.githubusercontent.com/u/131553?v=3","gravatar_id":"","url":"https://api.github.com/users/ldjebran","html_url":"https://github.com/ldjebran","followers_url":"https://api.github.com/users/ldjebran/followers","following_url":"https://api.github.com/users/ldjebran/following{/other_user}","gists_url":"https://api.github.com/users/ldjebran/gists{/gist_id}","starred_url":"https://api.github.com/users/ldjebran/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ldjebran/subscriptions","organizations_url":"https://api.github.com/users/ldjebran/orgs","repos_url":"https://api.github.com/users/ldjebran/repos","events_url":"https://api.github.com/users/ldjebran/events{/privacy}","received_events_url":"https://api.github.com/users/ldjebran/received_events","type":"User","site_admin":false},"assignees":[{"login":"ldjebran","id":131553,"avatar_url":"https://avatars.githubusercontent.com/u/131553?v=3","gravatar_id":"","url":"https://api.github.com/users/ldjebran","html_url":"https://github.com/ldjebran","followers_url":"https://api.github.com/users/ldjebran/followers","following_url":"https://api.github.com/users/ldjebran/following{/other_user}","gists_url":"https://api.github.com/users/ldjebran/gists{/gist_id}","starred_url":"https://api.github.com/users/ldjebran/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ldjebran/subscriptions","organizations_url":"https://api.github.com/users/ldjebran/orgs","repos_url":"https://api.github.com/users/ldjebran/repos","events_url":"https://api.github.com/users/ldjebran/events{/privacy}","received_events_url":"https://api.github.com/users/ldjebran/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/SatelliteQE/robottelo/milestones/93","html_url":"https://github.com/SatelliteQE/robottelo/milestones/Sprint%206.2.17%20Week%20Starting%2021st%20Nov,%202016","labels_url":"https://api.github.com/repos/SatelliteQE/robottelo/milestones/93/labels","id":2141237,"number":93,"title":"Sprint 6.2.17 Week Starting 21st Nov, 2016","description":"","creator":{"login":"sghai","id":620852,"avatar_url":"https://avatars.githubusercontent.com/u/620852?v=3","gravatar_id":"","url":"https://api.github.com/users/sghai","html_url":"https://github.com/sghai","followers_url":"https://api.github.com/users/sghai/followers","following_url":"https://api.github.com/users/sghai/following{/other_user}","gists_url":"https://api.github.com/users/sghai/gists{/gist_id}","starred_url":"https://api.github.com/users/sghai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sghai/subscriptions","organizations_url":"https://api.github.com/users/sghai/orgs","repos_url":"https://api.github.com/users/sghai/repos","events_url":"https://api.github.com/users/sghai/events{/privacy}","received_events_url":"https://api.github.com/users/sghai/received_events","type":"User","site_admin":false},"open_issues":15,"closed_issues":2,"state":"open","created_at":"2016-11-17T08:06:52Z","updated_at":"2016-11-22T15:54:37Z","due_on":"2016-12-02T00:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/4015/commits","review_comments_url":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/4015/comments","review_comment_url":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/SatelliteQE/robottelo/issues/4015/comments","statuses_url":"https://api.github.com/repos/SatelliteQE/robottelo/statuses/c85e6eb8450a6de7d2b685d87dba494bb69ff0d5","head":{"label":"ldjebran:#3586-UI-CV-users-permissions","ref":"#3586-UI-CV-users-permissions","sha":"c85e6eb8450a6de7d2b685d87dba494bb69ff0d5","user":{"login":"ldjebran","id":131553,"avatar_url":"https://avatars.githubusercontent.com/u/131553?v=3","gravatar_id":"","url":"https://api.github.com/users/ldjebran","html_url":"https://github.com/ldjebran","followers_url":"https://api.github.com/users/ldjebran/followers","following_url":"https://api.github.com/users/ldjebran/following{/other_user}","gists_url":"https://api.github.com/users/ldjebran/gists{/gist_id}","starred_url":"https://api.github.com/users/ldjebran/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ldjebran/subscriptions","organizations_url":"https://api.github.com/users/ldjebran/orgs","repos_url":"https://api.github.com/users/ldjebran/repos","events_url":"https://api.github.com/users/ldjebran/events{/privacy}","received_events_url":"https://api.github.com/users/ldjebran/received_events","type":"User","site_admin":false},"repo":{"id":71339453,"name":"robottelo","full_name":"ldjebran/robottelo","owner":{"login":"ldjebran","id":131553,"avatar_url":"https://avatars.githubusercontent.com/u/131553?v=3","gravatar_id":"","url":"https://api.github.com/users/ldjebran","html_url":"https://github.com/ldjebran","followers_url":"https://api.github.com/users/ldjebran/followers","following_url":"https://api.github.com/users/ldjebran/following{/other_user}","gists_url":"https://api.github.com/users/ldjebran/gists{/gist_id}","starred_url":"https://api.github.com/users/ldjebran/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ldjebran/subscriptions","organizations_url":"https://api.github.com/users/ldjebran/orgs","repos_url":"https://api.github.com/users/ldjebran/repos","events_url":"https://api.github.com/users/ldjebran/events{/privacy}","received_events_url":"https://api.github.com/users/ldjebran/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ldjebran/robottelo","description":"Robottelo is a test suite which exercises The Foreman.","fork":true,"url":"https://api.github.com/repos/ldjebran/robottelo","forks_url":"https://api.github.com/repos/ldjebran/robottelo/forks","keys_url":"https://api.github.com/repos/ldjebran/robottelo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ldjebran/robottelo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ldjebran/robottelo/teams","hooks_url":"https://api.github.com/repos/ldjebran/robottelo/hooks","issue_events_url":"https://api.github.com/repos/ldjebran/robottelo/issues/events{/number}","events_url":"https://api.github.com/repos/ldjebran/robottelo/events","assignees_url":"https://api.github.com/repos/ldjebran/robottelo/assignees{/user}","branches_url":"https://api.github.com/repos/ldjebran/robottelo/branches{/branch}","tags_url":"https://api.github.com/repos/ldjebran/robottelo/tags","blobs_url":"https://api.github.com/repos/ldjebran/robottelo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ldjebran/robottelo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ldjebran/robottelo/git/refs{/sha}","trees_url":"https://api.github.com/repos/ldjebran/robottelo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ldjebran/robottelo/statuses/{sha}","languages_url":"https://api.github.com/repos/ldjebran/robottelo/languages","stargazers_url":"https://api.github.com/repos/ldjebran/robottelo/stargazers","contributors_url":"https://api.github.com/repos/ldjebran/robottelo/contributors","subscribers_url":"https://api.github.com/repos/ldjebran/robottelo/subscribers","subscription_url":"https://api.github.com/repos/ldjebran/robottelo/subscription","commits_url":"https://api.github.com/repos/ldjebran/robottelo/commits{/sha}","git_commits_url":"https://api.github.com/repos/ldjebran/robottelo/git/commits{/sha}","comments_url":"https://api.github.com/repos/ldjebran/robottelo/comments{/number}","issue_comment_url":"https://api.github.com/repos/ldjebran/robottelo/issues/comments{/number}","contents_url":"https://api.github.com/repos/ldjebran/robottelo/contents/{+path}","compare_url":"https://api.github.com/repos/ldjebran/robottelo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ldjebran/robottelo/merges","archive_url":"https://api.github.com/repos/ldjebran/robottelo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ldjebran/robottelo/downloads","issues_url":"https://api.github.com/repos/ldjebran/robottelo/issues{/number}","pulls_url":"https://api.github.com/repos/ldjebran/robottelo/pulls{/number}","milestones_url":"https://api.github.com/repos/ldjebran/robottelo/milestones{/number}","notifications_url":"https://api.github.com/repos/ldjebran/robottelo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ldjebran/robottelo/labels{/name}","releases_url":"https://api.github.com/repos/ldjebran/robottelo/releases{/id}","deployments_url":"https://api.github.com/repos/ldjebran/robottelo/deployments","created_at":"2016-10-19T09:11:49Z","updated_at":"2016-10-19T09:11:52Z","pushed_at":"2016-11-22T16:28:52Z","git_url":"git://github.com/ldjebran/robottelo.git","ssh_url":"git@github.com:ldjebran/robottelo.git","clone_url":"https://github.com/ldjebran/robottelo.git","svn_url":"https://github.com/ldjebran/robottelo","homepage":"","size":13885,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"SatelliteQE:master","ref":"master","sha":"16201f4492849fbb00b3ea80495ab546de2f27e2","user":{"login":"SatelliteQE","id":8754276,"avatar_url":"https://avatars.githubusercontent.com/u/8754276?v=3","gravatar_id":"","url":"https://api.github.com/users/SatelliteQE","html_url":"https://github.com/SatelliteQE","followers_url":"https://api.github.com/users/SatelliteQE/followers","following_url":"https://api.github.com/users/SatelliteQE/following{/other_user}","gists_url":"https://api.github.com/users/SatelliteQE/gists{/gist_id}","starred_url":"https://api.github.com/users/SatelliteQE/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SatelliteQE/subscriptions","organizations_url":"https://api.github.com/users/SatelliteQE/orgs","repos_url":"https://api.github.com/users/SatelliteQE/repos","events_url":"https://api.github.com/users/SatelliteQE/events{/privacy}","received_events_url":"https://api.github.com/users/SatelliteQE/received_events","type":"Organization","site_admin":false},"repo":{"id":4000279,"name":"robottelo","full_name":"SatelliteQE/robottelo","owner":{"login":"SatelliteQE","id":8754276,"avatar_url":"https://avatars.githubusercontent.com/u/8754276?v=3","gravatar_id":"","url":"https://api.github.com/users/SatelliteQE","html_url":"https://github.com/SatelliteQE","followers_url":"https://api.github.com/users/SatelliteQE/followers","following_url":"https://api.github.com/users/SatelliteQE/following{/other_user}","gists_url":"https://api.github.com/users/SatelliteQE/gists{/gist_id}","starred_url":"https://api.github.com/users/SatelliteQE/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SatelliteQE/subscriptions","organizations_url":"https://api.github.com/users/SatelliteQE/orgs","repos_url":"https://api.github.com/users/SatelliteQE/repos","events_url":"https://api.github.com/users/SatelliteQE/events{/privacy}","received_events_url":"https://api.github.com/users/SatelliteQE/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/SatelliteQE/robottelo","description":"Robottelo is a test suite which exercises The Foreman.","fork":false,"url":"https://api.github.com/repos/SatelliteQE/robottelo","forks_url":"https://api.github.com/repos/SatelliteQE/robottelo/forks","keys_url":"https://api.github.com/repos/SatelliteQE/robottelo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SatelliteQE/robottelo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SatelliteQE/robottelo/teams","hooks_url":"https://api.github.com/repos/SatelliteQE/robottelo/hooks","issue_events_url":"https://api.github.com/repos/SatelliteQE/robottelo/issues/events{/number}","events_url":"https://api.github.com/repos/SatelliteQE/robottelo/events","assignees_url":"https://api.github.com/repos/SatelliteQE/robottelo/assignees{/user}","branches_url":"https://api.github.com/repos/SatelliteQE/robottelo/branches{/branch}","tags_url":"https://api.github.com/repos/SatelliteQE/robottelo/tags","blobs_url":"https://api.github.com/repos/SatelliteQE/robottelo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SatelliteQE/robottelo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SatelliteQE/robottelo/git/refs{/sha}","trees_url":"https://api.github.com/repos/SatelliteQE/robottelo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SatelliteQE/robottelo/statuses/{sha}","languages_url":"https://api.github.com/repos/SatelliteQE/robottelo/languages","stargazers_url":"https://api.github.com/repos/SatelliteQE/robottelo/stargazers","contributors_url":"https://api.github.com/repos/SatelliteQE/robottelo/contributors","subscribers_url":"https://api.github.com/repos/SatelliteQE/robottelo/subscribers","subscription_url":"https://api.github.com/repos/SatelliteQE/robottelo/subscription","commits_url":"https://api.github.com/repos/SatelliteQE/robottelo/commits{/sha}","git_commits_url":"https://api.github.com/repos/SatelliteQE/robottelo/git/commits{/sha}","comments_url":"https://api.github.com/repos/SatelliteQE/robottelo/comments{/number}","issue_comment_url":"https://api.github.com/repos/SatelliteQE/robottelo/issues/comments{/number}","contents_url":"https://api.github.com/repos/SatelliteQE/robottelo/contents/{+path}","compare_url":"https://api.github.com/repos/SatelliteQE/robottelo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SatelliteQE/robottelo/merges","archive_url":"https://api.github.com/repos/SatelliteQE/robottelo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SatelliteQE/robottelo/downloads","issues_url":"https://api.github.com/repos/SatelliteQE/robottelo/issues{/number}","pulls_url":"https://api.github.com/repos/SatelliteQE/robottelo/pulls{/number}","milestones_url":"https://api.github.com/repos/SatelliteQE/robottelo/milestones{/number}","notifications_url":"https://api.github.com/repos/SatelliteQE/robottelo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SatelliteQE/robottelo/labels{/name}","releases_url":"https://api.github.com/repos/SatelliteQE/robottelo/releases{/id}","deployments_url":"https://api.github.com/repos/SatelliteQE/robottelo/deployments","created_at":"2012-04-12T01:36:39Z","updated_at":"2016-11-05T02:46:41Z","pushed_at":"2016-11-22T16:10:43Z","git_url":"git://github.com/SatelliteQE/robottelo.git","ssh_url":"git@github.com:SatelliteQE/robottelo.git","clone_url":"https://github.com/SatelliteQE/robottelo.git","svn_url":"https://github.com/SatelliteQE/robottelo","homepage":"","size":15302,"stargazers_count":27,"watchers_count":27,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":48,"mirror_url":null,"open_issues_count":153,"forks":48,"open_issues":153,"watchers":27,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/4015"},"html":{"href":"https://github.com/SatelliteQE/robottelo/pull/4015"},"issue":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/issues/4015"},"comments":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/issues/4015/comments"},"review_comments":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/4015/comments"},"review_comment":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/4015/commits"},"statuses":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/statuses/c85e6eb8450a6de7d2b685d87dba494bb69ff0d5"}}}}
{"actor":{"display_login":"oshtaier"}}