def test_validate_get_all_project_details(self):
        """ Check if managesf allow us to fetch projects details
        """
        project = 'p_%s' % create_random_str()
        self.create_project(project, config.USER_2)
        admin_cookies = dict(
            auth_pubtkt=config.USERS[config.ADMIN_USER]['auth_cookie'])
        user2_cookies = dict(
            auth_pubtkt=config.USERS[config.USER_2]['auth_cookie'])
        url = "http://%s%s" % (config.GATEWAY_HOST, "/manage/project/")
        resp = requests.get(url, cookies=admin_cookies)
        self.assertEqual(200, resp.status_code)
        self.assertTrue(project in resp.json())
        self.assertTrue('config' in resp.json())
        resp = requests.get(url, cookies=user2_cookies)
        self.assertEqual(200, resp.status_code)
        self.assertTrue(project in resp.json())
        self.assertTrue('config' in resp.json())
        resp = requests.get(url, cookies=user2_cookies)

        # Validate the same behavior with project including a '/'
        project = 'p/%s' % create_random_str()
        self.create_project(project, config.USER_2)
        url = "http://%s%s" % (config.GATEWAY_HOST, "/manage/project/")
        # Wait 15 seconds for managesf cache invalidation
        import time
        time.sleep(15)
        resp = requests.get(url, cookies=user2_cookies)
        self.assertEqual(200, resp.status_code)
        self.assertTrue(project in resp.json())
    def test_gitweb_access(self):
        """ Test if gitweb access works correctly
        """
        pub_pname = 'p_public_%s' % create_random_str()
        self.create_project(pub_pname)

        priv_pname = 'p_private_%s' % create_random_str()
        self.create_project(priv_pname, options={"private": ""})

        # Test access to a public repo first
        url = "%s/r/gitweb?p=%s.git" % (config.GATEWAY_URL, pub_pname)
        expected_title = "%s.git/summary" % pub_pname

        resp = requests.get(url)
        self.assertTrue(resp.url.endswith('/r/gitweb?p=%s.git' % pub_pname))
        self.assertTrue(expected_title in resp.text)

        # Test anonymous access to a private repo
        url = "%s/r/gitweb?p=%s.git" % (config.GATEWAY_URL, priv_pname)
        expected_title = "%s.git/summary" % priv_pname

        resp = requests.get(url)
        self.assertTrue("auth/login" in resp.url)
        self.assertFalse(expected_title in resp.text)

        # Test authenticated access to a private repo
        resp = requests.get(
            url,
            cookies=dict(
                auth_pubtkt=config.USERS[config.USER_1]['auth_cookie']))
        self.assertTrue(resp.url.endswith('/r/gitweb?p=%s.git' % priv_pname))
        self.assertTrue(expected_title in resp.text)
 def test_create_public_project_as_user_clone_as_user(self):
     """ Create public project as user then clone as user
     """
     pname = 'p_%s' % create_random_str()
     # create the project as admin
     self.create_project(pname, config.USER_2)
     # add user2 ssh pubkey to user2
     gu = GerritUtils(
         'https://%s/' % config.GATEWAY_HOST,
         auth_cookie=config.USERS[config.USER_2]['auth_cookie'])
     gu.add_pubkey(config.USER_2_PUB_KEY)
     # prepare to clone
     priv_key_path = set_private_key(config.USER_2_PRIV_KEY)
     self.dirs_to_delete.append(os.path.dirname(priv_key_path))
     ggu = GerritGitUtils(config.USER_2,
                          priv_key_path,
                          config.USERS[config.USER_2]['email'])
     url = "ssh://%s@%s:29418/%s" % (config.USER_2,
                                     config.GATEWAY_HOST, pname)
     # clone
     clone_dir = ggu.clone(url, pname)
     self.dirs_to_delete.append(os.path.dirname(clone_dir))
     # Test that the clone is a success
     self.assertTrue(os.path.isdir(clone_dir))
     # Verify master own the .gitreview file
     self.assertTrue(os.path.isfile(os.path.join(clone_dir,
                                                 '.gitreview')))
 def test_init_user_tests(self):
     """ Check if a test init feature behave as expected
     """
     project = "p_%s" % create_random_str()
     self.create_project(project, config.USER_4)
     self.msu.create_init_tests(project, config.USER_4)
     ggu = GerritGitUtils(config.ADMIN_USER, config.ADMIN_PRIV_KEY_PATH, config.USERS[config.ADMIN_USER]["email"])
     open_reviews = ggu.list_open_reviews("config", config.GATEWAY_HOST)
     match = [
         True
         for review in open_reviews
         if review["commitMessage"].startswith(
             "%s proposes initial test " "definition for project %s" % (config.USER_4, project)
         )
     ]
     self.assertEqual(len(match), 1)
     open_reviews = ggu.list_open_reviews(project, config.GATEWAY_HOST)
     match = [
         True
         for review in open_reviews
         if review["commitMessage"].startswith(
             "%s proposes initial test " "scripts for project %s" % (config.USER_4, project)
         )
     ]
     self.assertEqual(len(match), 1)
 def test_create_private_project_as_admin(self):
     """ Create private project on redmine and gerrit as admin
     """
     pname = 'p_%s' % create_random_str()
     options = {"private": ""}
     self.create_project(pname, config.ADMIN_USER,
                         options=options)
     # Gerrit part
     self.assertTrue(self.gu.project_exists(pname))
     self.assertTrue(self.gu.group_exists('%s-ptl' % pname))
     self.assertTrue(self.gu.group_exists('%s-core' % pname))
     self.assertTrue(self.gu.group_exists('%s-dev' % pname))
     # TODO(Project creator, as project owner, should only be in ptl group)
     self.assertTrue(
         self.gu.member_in_group(config.ADMIN_USER, '%s-ptl' % pname))
     self.assertTrue(
         self.gu.member_in_group(config.ADMIN_USER, '%s-core' % pname))
     self.assertTrue(
         self.gu.member_in_group(config.ADMIN_USER, '%s-dev' % pname))
     # Redmine part
     self.assertTrue(self.rm.project_exists(pname))
     self.assertTrue(
         self.rm.check_user_role(pname, config.ADMIN_USER, 'Manager'))
     self.assertTrue(
         self.rm.check_user_role(pname, config.ADMIN_USER, 'Developer'))
     self.assertFalse(self.project_exists_ex(pname, config.USER_2))
    def test_basic_ops_project_namespace(self):
        """ Check if a project named with a / (namespace) is handled
        correctly on basic ops by managesf
        """
        pname = 'skydive/%s' % create_random_str()
        self.create_project(pname, config.USER_2)
        self.assertTrue(self.gu.project_exists(pname))
        self.assertTrue(self.gu.group_exists('%s-ptl' % pname))
        if is_present("SFRedmine"):
            rname = '_'.join(pname.split('/'))
            self.assertTrue(self.rm.project_exists(rname))
        # Try to clone
        ggu = GerritGitUtils(config.ADMIN_USER,
                             config.ADMIN_PRIV_KEY_PATH,
                             config.USERS[config.ADMIN_USER]['email'])
        url = "ssh://%s@%s:29418/%s" % (config.ADMIN_USER,
                                        config.GATEWAY_HOST, pname)
        clone_dir = ggu.clone(url, pname.split('/')[-1])
        self.dirs_to_delete.append(os.path.dirname(clone_dir))
        # Test that the clone is a success
        self.assertTrue(os.path.isdir(clone_dir))
        # Verify master own the .gitreview file
        self.assertTrue(os.path.isfile(os.path.join(clone_dir,
                                                    '.gitreview')))
        # Delete the project from SF
        self.msu.deleteProject(pname, config.ADMIN_USER)
        self.assertFalse(self.gu.project_exists(pname))
        self.assertFalse(self.gu.group_exists('%s-ptl' % pname))
        if is_present("SFRedmine"):
            rname = '_'.join(pname.split('/'))
            self.assertFalse(self.rm.project_exists(rname))
        self.assertFalse(self.gu.group_exists('%s-core' % pname))

        # Clean local clone directory
        self.projects.remove(pname)
    def test_review_labels(self):
        """ Test if list of review labels are as expected
        """
        pname = 'p_%s' % create_random_str()
        self.create_project(pname)
        un = config.ADMIN_USER
        gu = GerritUtils(
            config.GATEWAY_URL,
            auth_cookie=config.USERS[un]['auth_cookie'])
        k_index = gu.add_pubkey(config.USERS[un]["pubkey"])
        self.assertTrue(gu.project_exists(pname))
        priv_key_path = set_private_key(config.USERS[un]["privkey"])
        gitu = GerritGitUtils(un,
                              priv_key_path,
                              config.USERS[un]['email'])
        url = "ssh://%s@%s:29418/%s" % (un, config.GATEWAY_HOST,
                                        pname)
        clone_dir = gitu.clone(url, pname)
        self.dirs_to_delete.append(os.path.dirname(clone_dir))

        gitu.add_commit_and_publish(clone_dir, "master", "Test commit")

        change_ids = gu.get_my_changes_for_project(pname)
        self.assertEqual(len(change_ids), 1)
        change_id = change_ids[0]

        labels = gu.get_labels_list_for_change(change_id)

        self.assertIn('Workflow', labels)
        self.assertIn('Code-Review', labels)
        self.assertIn('Verified', labels)
        self.assertEqual(len(labels.keys()), 3)

        gu.del_pubkey(k_index)
    def test_admin_manage_project_members(self):
        """ Test admin can add and delete users from all project groups
        """
        pname = "p_%s" % create_random_str()
        self.create_project(pname, config.ADMIN_USER)
        # Gerrit part
        self.assertTrue(self.gu.project_exists(pname))
        self.assertTrue(self.gu.group_exists("%s-ptl" % pname))
        self.assertTrue(self.gu.group_exists("%s-core" % pname))
        groups = "ptl-group core-group"
        # Add user2 to ptl and core groups
        self.msu.addUsertoProjectGroups(config.ADMIN_USER, pname, config.USER_2, groups)
        # Test if user2 exists in ptl and core groups
        self.assertTrue(self.gu.member_in_group(config.USER_2, "%s-ptl" % pname))
        self.assertTrue(self.gu.member_in_group(config.USER_2, "%s-core" % pname))
        # Redmine part
        self.assertTrue(self.rm.check_user_role(pname, config.USER_2, "Manager"))
        self.assertTrue(self.rm.check_user_role(pname, config.USER_2, "Developer"))

        # Delete user2 from project groups
        self.msu.deleteUserFromProjectGroups(config.ADMIN_USER, pname, config.USER_2)
        # Test if user exists in ptl and core groups
        self.assertFalse(self.gu.member_in_group(config.USER_2, "%s-ptl" % pname))
        self.assertFalse(self.gu.member_in_group(config.USER_2, "%s-core" % pname))
        # Redmine part
        self.assertFalse(self.rm.check_user_role(pname, config.USER_2, "Manager"))
        self.assertFalse(self.rm.check_user_role(pname, config.USER_2, "Developer"))
    def _prepare_review_submit_testing(self, project_options=None):
        if project_options is None:
            u2mail = config.USERS[config.USER_2]['email']
            project_options = {'core-group': u2mail}
        pname = 'p_%s' % create_random_str()
        self.create_project(pname, project_options)
        un = config.ADMIN_USER
        gu = GerritUtils(
            config.GATEWAY_URL,
            auth_cookie=config.USERS[un]['auth_cookie'])
        k_index = gu.add_pubkey(config.USERS[un]["pubkey"])
        self.assertTrue(gu.project_exists(pname))
        priv_key_path = set_private_key(config.USERS[un]["privkey"])
        gitu = GerritGitUtils(un,
                              priv_key_path,
                              config.USERS[un]['email'])
        url = "ssh://%s@%s:29418/%s" % (un, config.GATEWAY_HOST,
                                        pname)
        clone_dir = gitu.clone(url, pname)
        self.dirs_to_delete.append(os.path.dirname(clone_dir))

        gitu.add_commit_and_publish(clone_dir, "master", "Test commit")

        change_ids = gu.get_my_changes_for_project(pname)
        self.assertEqual(len(change_ids), 1)
        change_id = change_ids[0]

        return change_id, gu, k_index
    def test_ptl_manage_project_members(self):
        """ Test ptl can add and delete users from all project groups
        """
        # Let user2 create the project, so he will be ptl for this project
        pname = "p_%s" % create_random_str()
        self.create_project(pname, config.USER_2)
        # Gerrit part
        self.assertTrue(self.gu.project_exists(pname))
        self.assertTrue(self.gu.group_exists("%s-ptl" % pname))
        self.assertTrue(self.gu.group_exists("%s-core" % pname))
        groups = "ptl-group core-group"

        # ptl should be ale to add users to all groups
        # so user2 should be able to add user3 to ptl and core groups
        self.msu.addUsertoProjectGroups(config.USER_2, pname, config.USER_3, groups)
        # Test if user3 exists in ptl and core groups
        self.assertTrue(self.gu.member_in_group(config.USER_3, "%s-ptl" % pname))
        self.assertTrue(self.gu.member_in_group(config.USER_3, "%s-core" % pname))
        # Redmine part
        self.assertTrue(self.rm.check_user_role(pname, config.USER_3, "Manager"))
        self.assertTrue(self.rm.check_user_role(pname, config.USER_3, "Developer"))

        # ptl should be able to remove users from all groups
        self.msu.deleteUserFromProjectGroups(config.USER_2, pname, config.USER_3)
        # user3 shouldn't exist in any group
        self.assertFalse(self.gu.member_in_group(config.USER_3, "%s-ptl" % pname))
        self.assertFalse(self.gu.member_in_group(config.USER_3, "%s-core" % pname))
        # Redmine part
        self.assertFalse(self.rm.check_user_role(pname, config.USER_3, "Manager"))
        self.assertFalse(self.rm.check_user_role(pname, config.USER_3, "Developer"))
    def _test_update_issue_hooks(self, comment_template, status):
        """ A referenced issue in commit msg triggers the hook
        """
        pname = 'p_%s' % create_random_str()

        # Be sure the project does not exist
        self.msu.deleteProject(pname, self.u)

        # Create the project
        self.create_project(pname, self.u)
        # Put USER_2 as core for the project
        self.gu.add_group_member(self.u2, "%s-core" % pname)

        # Create an issue on the project
        issue_id = self.rm.create_issue(pname, "There is a problem")

        # Clone and commit something
        url = "ssh://%s@%s:29418/%s" % (self.u, config.GATEWAY_HOST,
                                        pname)
        clone_dir = self.gitu.clone(url, pname)
        cmt_msg = comment_template % issue_id
        self.gitu.add_commit_and_publish(clone_dir, 'master', cmt_msg)

        # Check issue status (Gerrit hook updates the issue to in progress)
        attempt = 0
        while True:
            if self.rm.test_issue_status(issue_id, 'In Progress'):
                break
            if attempt > 10:
                break
            time.sleep(1)
            attempt += 1
        self.assertTrue(self.rm.test_issue_status(issue_id, 'In Progress'))
        self._test_merging(pname, issue_id, status)
 def test_create_private_project_with_users_in_group(self):
     """ Create private project on redmine and gerrit with users in groups
     """
     pname = 'p_%s' % create_random_str()
     u2mail = config.USERS[config.USER_2]['email']
     u3mail = config.USERS[config.USER_3]['email']
     u4mail = config.USERS[config.USER_4]['email']
     options = {"private": "",
                "ptl-group": "",
                "core-group": "%s,%s" % (u2mail, u3mail),
                "dev-group": "%s" % u4mail,
                }
     self.create_project(pname, config.ADMIN_USER,
                         options=options)
     # Gerrit part
     self.assertTrue(self.gu.project_exists(pname))
     # TODO(Project creator, as project owner, should only be in ptl group)
     self.assertTrue(
         self.gu.member_in_group(config.ADMIN_USER, '%s-ptl' % pname))
     for user in (config.ADMIN_USER, config.USER_2, config.USER_3):
         self.assertTrue(self.gu.member_in_group(user, '%s-core' % pname))
     self.assertTrue(
         self.gu.member_in_group(config.USER_4, '%s-dev' % pname))
     # Redmine part
     # it should be visible to admin
     self.assertTrue(self.rm.project_exists(pname))
     self.assertTrue(
         self.rm.check_user_role(pname, config.ADMIN_USER, 'Manager'))
     for user in (config.ADMIN_USER, config.USER_2,
                  config.USER_3, config.USER_4):
         self.assertTrue(self.rm.check_user_role(pname, user, 'Developer'))
 def test_create_private_project_as_admin_clone_as_admin(self):
     """ Clone private project as admin and check content
     """
     pname = 'p_%s' % create_random_str()
     options = {"private": ""}
     self.create_project(pname, config.ADMIN_USER, options=options)
     ggu = GerritGitUtils(config.ADMIN_USER,
                          config.ADMIN_PRIV_KEY_PATH,
                          config.USERS[config.ADMIN_USER]['email'])
     url = "ssh://%s@%s:29418/%s" % (config.ADMIN_USER,
                                     config.GATEWAY_HOST, pname)
     clone_dir = ggu.clone(url, pname)
     self.dirs_to_delete.append(os.path.dirname(clone_dir))
     # Test that the clone is a success
     self.assertTrue(os.path.isdir(clone_dir))
     # Verify master own the .gitreview file
     self.assertTrue(os.path.isfile(os.path.join(clone_dir,
                                                 '.gitreview')))
     # Verify meta/config branch own both group and ACLs config file
     ggu.fetch_meta_config(clone_dir)
     self.assertTrue(os.path.isfile(os.path.join(clone_dir,
                                                 'project.config')))
     self.assertTrue(os.path.isfile(os.path.join(clone_dir,
                                                 'groups')))
     # There is a group dev for a private project
     content = file(os.path.join(clone_dir, 'project.config')).read()
     self.assertTrue('%s-dev' % pname in content)
     content = file(os.path.join(clone_dir, 'groups')).read()
     self.assertTrue('%s-dev' % pname in content)
    def test_non_member_manage_project_members(self):
        """ Test non project members can add and delete users to core group
        """
        # Let admin create the project
        pname = 'p_%s' % create_random_str()
        self.create_project(pname, config.ADMIN_USER)
        # Gerrit part
        self.assertTrue(self.gu.project_exists(pname))
        self.assertTrue(self.gu.group_exists('%s-ptl' % pname))
        self.assertTrue(self.gu.group_exists('%s-core' % pname))

        # non project meber can't add user to core group
        # user2 can't add user3 to core group
        groups = 'core-group'
        self.msu.addUsertoProjectGroups(config.USER_2, pname,
                                        config.USER_3, groups)
        # user3 shouldn't exist in core group
        self.assertFalse(self.gu.member_in_group(config.USER_3,
                                                 '%s-core' % pname))
        # Redmine part
        if is_present("SFRedmine"):
            self.assertFalse(self.rm.check_user_role(pname,
                                                     config.USER_3,
                                                     'Developer'))

        groups = 'ptl-group'
        # non project meber can't add usr to ptl group
        # user2 can't add user3 to ptl group
        self.msu.addUsertoProjectGroups(config.USER_2, pname,
                                        config.USER_3, groups)
        # user3 shouldn't exist in ptl group
        self.assertFalse(self.gu.member_in_group(config.USER_3,
                                                 '%s-ptl' % pname))
        # Redmine part
        self.assertFalse(self.rm.check_user_role(pname,
                                                 config.USER_3, 'Manager'))

        # non project meber can't delete usr from any group.
        # Let admin add user3 to ptl and core groups,
        # then try to remove user3 from ptl and core groups by
        # user2 (i.e non member user)
        groups = 'ptl-group core-group'
        self.msu.addUsertoProjectGroups(config.ADMIN_USER, pname,
                                        config.USER_3, groups)
        # non-admin user(user2) can't remove users from project groups
        self.msu.deleteUserFromProjectGroups(config.USER_2, pname,
                                             config.USER_3)
        # user3 should exist in ptl and core group
        self.assertTrue(self.gu.member_in_group(config.USER_3,
                                                '%s-ptl' % pname))
        self.assertTrue(self.gu.member_in_group(config.USER_3,
                                                '%s-core' % pname))
        # Redmine part
        if is_present("SFRedmine"):
            self.assertTrue(self.rm.check_user_role(pname,
                                                    config.USER_3,
                                                    'Manager'))
            self.assertTrue(self.rm.check_user_role(pname,
                                                    config.USER_3,
                                                    'Developer'))
    def test_core_manage_project_members(self):
        """ Test core can add and delete users to core group
        """
        # let admin create the project
        pname = 'p_%s' % create_random_str()
        self.create_project(pname, config.ADMIN_USER)
        # Gerrit part
        self.assertTrue(self.gu.project_exists(pname))
        self.assertTrue(self.gu.group_exists('%s-ptl' % pname))
        self.assertTrue(self.gu.group_exists('%s-core' % pname))
        groups = 'core-group'

        # Add user2 as core user
        self.msu.addUsertoProjectGroups(config.ADMIN_USER, pname,
                                        config.USER_2, groups)
        # Test if user2 exists in core group
        self.assertTrue(self.gu.member_in_group(config.USER_2,
                                                '%s-core' % pname))
        # Redmine part
        self.assertTrue(self.rm.check_user_role(pname,
                                                config.USER_2, 'Developer'))

        groups = 'core-group'
        # core should be ale to add users to only core group and not ptl group
        # so user2 should be able to add user3 to only core group and not
        # ptl group
        self.msu.addUsertoProjectGroups(config.USER_2, pname,
                                        config.USER_3, groups)
        # user3 should exist in core group
        self.assertTrue(self.gu.member_in_group(config.USER_3,
                                                '%s-core' % pname))
        # Redmine part
        self.assertTrue(self.rm.check_user_role(pname,
                                                config.USER_3, 'Developer'))

        groups = 'ptl-group'
        # core should not be allowed to add users to ptl group
        # so user2 should not be able to add user3 to ptl group
        self.msu.addUsertoProjectGroups(config.USER_2, pname,
                                        config.USER_3, groups)
        # user3 shouldn't exist in ptl group
        self.assertFalse(self.gu.member_in_group(config.USER_3,
                                                 '%s-ptl' % pname))
        # Redmine part
        self.assertFalse(self.rm.check_user_role(pname,
                                                 config.USER_3, 'Manager'))

        # core should be able to remove users from core group
        group = 'core-group'
        self.msu.deleteUserFromProjectGroups(config.USER_2, pname,
                                             config.USER_3, group)
        # user3 shouldn't exist in core group
        self.assertFalse(self.gu.member_in_group(config.USER_3,
                                                 '%s-core' % pname))
        # Redmine part
        self.assertFalse(self.rm.check_user_role(pname,
                                                 config.USER_3, 'Developer'))
 def test_rest_urls_accessible(self):
     """ Check if managesf URLs are all working
     """
     project = "p_%s" % create_random_str()
     self.create_project(project, config.ADMIN_USER)
     cookies = dict(auth_pubtkt=config.USERS[config.ADMIN_USER]["auth_cookie"])
     paths = ["/manage/project/", "/manage/project/%s" % project, "/manage/project/membership/"]
     for path in paths:
         url = "http://%s%s" % (config.GATEWAY_HOST, path)
         resp = requests.get(url, cookies=cookies)
         self.assertEqual(200, resp.status_code)
Example #17
0
    def create_email(self):
        number = random.randint(100, 999)

        names = ("arrow", "williams", "funny", "king")
        new_name = random.choice(names)

        domains = "com", "ua", "ru", "net"
        new_domain = random.choice(domains)

        rand_str = create_random_str(5, 7)
        create_email = f"{new_name}.{number}@{rand_str}.{new_domain}"
        return create_email
 def test_delete_project_as_admin(self):
     """ Checking if admin can delete projects that are not owned by admin
     """
     pname = 'p_%s' % create_random_str()
     self.create_project(pname, config.USER_2)
     self.assertTrue(self.gu.project_exists(pname))
     self.assertTrue(self.rm.project_exists(pname))
     self.msu.deleteProject(pname, config.ADMIN_USER)
     self.assertFalse(self.gu.project_exists(pname))
     self.assertFalse(self.gu.group_exists('%s-ptl' % pname))
     self.assertFalse(self.rm.project_exists(pname))
     self.assertFalse(self.gu.group_exists('%s-core' % pname))
     self.projects.remove(pname)
 def test_delete_project_as_admin(self):
     """ Check if admin can delete projects that are not owned by admin
     """
     pname = 'p_%s' % create_random_str()
     self.create_project(pname, config.USER_2)
     self.assertTrue(self.gu.project_exists(pname))
     self.assertTrue(self.rm.project_exists(pname))
     self.msu.deleteProject(pname, config.ADMIN_USER)
     self.assertFalse(self.gu.project_exists(pname))
     self.assertFalse(self.gu.group_exists('%s-ptl' % pname))
     self.assertFalse(self.rm.project_exists(pname))
     self.assertFalse(self.gu.group_exists('%s-core' % pname))
     self.projects.remove(pname)
 def test_delete_public_project_as_admin(self):
     """ Delete public project on redmine and gerrit as admin
     """
     pname = 'p_%s' % create_random_str()
     self.create_project(pname, config.ADMIN_USER)
     self.assertTrue(self.gu.project_exists(pname))
     self.assertTrue(self.rm.project_exists(pname))
     self.msu.deleteProject(pname, config.ADMIN_USER)
     self.assertFalse(self.gu.project_exists(pname))
     self.assertFalse(self.gu.group_exists('%s-ptl' % pname))
     self.assertFalse(self.rm.project_exists(pname))
     self.assertFalse(self.gu.group_exists('%s-core' % pname))
     self.projects.remove(pname)
 def test_delete_public_project_as_admin(self):
     """ Delete public project on redmine and gerrit as admin
     """
     pname = 'p_%s' % create_random_str()
     self.create_project(pname, config.ADMIN_USER)
     self.assertTrue(self.gu.project_exists(pname))
     self.assertTrue(self.rm.project_exists(pname))
     self.msu.deleteProject(pname, config.ADMIN_USER)
     self.assertFalse(self.gu.project_exists(pname))
     self.assertFalse(self.gu.group_exists('%s-ptl' % pname))
     self.assertFalse(self.rm.project_exists(pname))
     self.assertFalse(self.gu.group_exists('%s-core' % pname))
     self.projects.remove(pname)
Example #22
0
    def test_CD_repo(self):
        """ Check resources - ops on git repositories work as expected """
        fpath = "resources/%s.yaml" % create_random_str()
        name = create_random_str()
        resources = """resources:
  repos:
    %s:
      description: test for functional test
      default-branch: br1
      branches:
        br1: HEAD
        br2: HEAD
        master: '0'
"""
        # Add the resources file w/o review
        resources = resources % name
        self.set_resources_then_direct_push(fpath,
                                            resources=resources,
                                            mode='add')
        # Check the project has been created
        self.assertTrue(self.gu.project_exists(name))
        # Check branches
        branches = self.gu.g.get('/projects/%s/branches/' % name)
        for wref in ("HEAD", "br1", "br2"):
            found = False
            for ref in branches:
                if found:
                    continue
                if ref['ref'].endswith(wref):
                    found = True
                    if ref['ref'] == 'HEAD' and ref['revision'] != "br1":
                        raise Exception("Wrong default branch")
            if not found:
                raise Exception("Requested branch %s not found" % wref)
        # Del the resources file w/o review
        self.set_resources_then_direct_push(fpath, mode='del')
        # Check the project has been deleted
        self.assertFalse(self.gu.project_exists(name))
    def test_upstream(self):
        """ Validate upstream feature of managesf
        """
        # Create a test upstream project
        pname_us = 'p_upstream'
        self.create_project(pname_us, config.ADMIN_USER)

        ggu_us = GerritGitUtils(config.ADMIN_USER,
                                config.ADMIN_PRIV_KEY_PATH,
                                config.USERS[config.ADMIN_USER]['email'])
        url = "ssh://%s@%s:29418/%s" % (config.ADMIN_USER,
                                        config.GATEWAY_HOST, pname_us)
        # clone
        us_clone_dir = ggu_us.clone(url, pname_us)
        self.dirs_to_delete.append(os.path.dirname(us_clone_dir))
        # Test that the clone is a success
        self.assertTrue(os.path.isdir(us_clone_dir))
        # push some test files to the upstream project
        us_files = [str(x) for x in range(1, 10)]
        for f in us_files:
            file(os.path.join(us_clone_dir, f), 'w').write(f)
            os.chmod(os.path.join(us_clone_dir, f), 0755)

        ggu_us.add_commit_in_branch(us_clone_dir, "master",
                                    commit="Adding files 1-10",
                                    files=us_files)
        ggu_us.direct_push_branch(us_clone_dir, "master")

        # No create a test project with upstream pointing to the above
        upstream_url = "ssh://%s@%s:29418/%s" % (
            config.ADMIN_USER, config.GATEWAY_HOST, pname_us)
        pname = 'p_%s' % create_random_str()
        # create the project as admin
        options = {"upstream": upstream_url,
                   "upstream-ssh-key": config.ADMIN_PRIV_KEY_PATH}
        self.create_project(pname, config.ADMIN_USER, options=options)

        ggu = GerritGitUtils(config.ADMIN_USER,
                             config.ADMIN_PRIV_KEY_PATH,
                             config.USERS[config.ADMIN_USER]['email'])
        url = "ssh://%s@%s:29418/%s" % (config.ADMIN_USER,
                                        config.GATEWAY_HOST, pname)
        # clone
        clone_dir = ggu.clone(url, pname)
        self.dirs_to_delete.append(os.path.dirname(clone_dir))

        # Check if the files pushed in upstream project is present
        files = [f for f in os.listdir(clone_dir) if not f.startswith('.')]
        self.assertEqual(set(files), set(us_files))
    def test_upstream(self):
        """ Validate upstream feature of managesf
        """
        # Create a test upstream project
        pname_us = 'p_upstream'
        self.create_project(pname_us, config.ADMIN_USER)

        ggu_us = GerritGitUtils(config.ADMIN_USER,
                                config.ADMIN_PRIV_KEY_PATH,
                                config.USERS[config.ADMIN_USER]['email'])
        url = "ssh://%s@%s:29418/%s" % (config.ADMIN_USER,
                                        config.GATEWAY_HOST, pname_us)
        # clone
        us_clone_dir = ggu_us.clone(url, pname_us)
        self.dirs_to_delete.append(os.path.dirname(us_clone_dir))
        # Test that the clone is a success
        self.assertTrue(os.path.isdir(us_clone_dir))
        # push some test files to the upstream project
        us_files = [str(x) for x in range(1, 10)]
        for f in us_files:
            file(os.path.join(us_clone_dir, f), 'w').write(f)
            os.chmod(os.path.join(us_clone_dir, f), 0755)

        ggu_us.add_commit_in_branch(us_clone_dir, "master",
                                    commit="Adding files 1-10",
                                    files=us_files)
        ggu_us.direct_push_branch(us_clone_dir, "master")

        # No create a test project with upstream pointing to the above
        upstream_url = "ssh://%s@%s:29418/%s" % (
            config.ADMIN_USER, config.GATEWAY_HOST, pname_us)
        pname = 'p_%s' % create_random_str()
        # create the project as admin
        options = {"upstream": upstream_url,
                   "upstream-ssh-key": config.ADMIN_PRIV_KEY_PATH}
        self.create_project(pname, config.ADMIN_USER, options=options)

        ggu = GerritGitUtils(config.ADMIN_USER,
                             config.ADMIN_PRIV_KEY_PATH,
                             config.USERS[config.ADMIN_USER]['email'])
        url = "ssh://%s@%s:29418/%s" % (config.ADMIN_USER,
                                        config.GATEWAY_HOST, pname)
        # clone
        clone_dir = ggu.clone(url, pname)
        self.dirs_to_delete.append(os.path.dirname(clone_dir))

        # Check if the files pushed in upstream project is present
        files = [f for f in os.listdir(clone_dir) if not f.startswith('.')]
        self.assertEqual(set(files), set(us_files))
 def test_rest_urls_accessible(self):
     """ Check if managesf URLs are all working
     """
     project = 'p_%s' % create_random_str()
     self.create_project(project, config.ADMIN_USER)
     cookies = dict(
         auth_pubtkt=config.USERS[config.ADMIN_USER]['auth_cookie'])
     paths = [
         "/manage/project/",
         "/manage/project/%s" % project,
         "/manage/project/membership/"]
     for path in paths:
         url = "http://%s%s" % (config.GATEWAY_HOST, path)
         resp = requests.get(url, cookies=cookies)
         self.assertEqual(200, resp.status_code)
 def test_validate_get_all_project_details(self):
     """ Check if managesf allow us to fetch projects details
     """
     project = "p_%s" % create_random_str()
     self.create_project(project, config.USER_2)
     admin_cookies = dict(auth_pubtkt=config.USERS[config.ADMIN_USER]["auth_cookie"])
     user2_cookies = dict(auth_pubtkt=config.USERS[config.USER_2]["auth_cookie"])
     url = "http://%s%s" % (config.GATEWAY_HOST, "/manage/project/")
     resp = requests.get(url, cookies=admin_cookies)
     self.assertEqual(200, resp.status_code)
     self.assertTrue(project in resp.json())
     self.assertTrue("config" in resp.json())
     resp = requests.get(url, cookies=user2_cookies)
     self.assertEqual(200, resp.status_code)
     self.assertTrue(project in resp.json())
     self.assertTrue("config" in resp.json())
     resp = requests.get(url, cookies=user2_cookies)
 def test_create_public_project_as_admin(self):
     """ Create public project on redmine and gerrit as admin
     """
     pname = "p_%s" % create_random_str()
     self.create_project(pname, config.ADMIN_USER)
     # Gerrit part
     self.assertTrue(self.gu.project_exists(pname))
     self.assertTrue(self.gu.group_exists("%s-ptl" % pname))
     self.assertTrue(self.gu.group_exists("%s-core" % pname))
     # TODO(Project creator, as project owner, should only be in ptl group)
     self.assertTrue(self.gu.member_in_group(config.ADMIN_USER, "%s-ptl" % pname))
     self.assertTrue(self.gu.member_in_group(config.ADMIN_USER, "%s-core" % pname))
     # Redmine part
     self.assertTrue(self.rm.project_exists(pname))
     self.assertTrue(self.rm.check_user_role(pname, config.ADMIN_USER, "Manager"))
     self.assertTrue(self.rm.check_user_role(pname, config.ADMIN_USER, "Developer"))
     self.assertTrue(self.project_exists_ex(pname, config.USER_2))
    def test_check_download_commands(self):
        """ Test if download commands plugin works
        """
        pname = 'p_%s' % create_random_str()
        self.create_project(pname)
        un = config.ADMIN_USER
        gu = GerritUtils(
            config.GATEWAY_URL,
            auth_cookie=config.USERS[un]['auth_cookie'])
        self.assertTrue(gu.project_exists(pname))
        k_index = gu.add_pubkey(config.USERS[un]["pubkey"])
        priv_key_path = set_private_key(config.USERS[un]["privkey"])
        gitu = GerritGitUtils(un,
                              priv_key_path,
                              config.USERS[un]['email'])
        url = "ssh://%s@%s:29418/%s" % (un, config.GATEWAY_HOST,
                                        pname)
        clone_dir = gitu.clone(url, pname)
        self.dirs_to_delete.append(os.path.dirname(clone_dir))

        gitu.add_commit_and_publish(clone_dir, "master", "Test commit")

        change_ids = gu.get_my_changes_for_project(pname)
        self.assertEqual(len(change_ids), 1)
        change_id = change_ids[0]
        resp = gu.get_change_last_patchset(change_id)
        self.assertIn("current_revision", resp)
        self.assertIn("revisions", resp)
        current_rev = resp["current_revision"]
        fetch = resp["revisions"][current_rev]["fetch"]
        self.assertGreater(fetch.keys(), 0)

        # disable and check if the fetch has anything
        gu.e_d_plugin("download-commands", 'disable')
        resp = gu.get_change_last_patchset(change_id)
        fetch = resp["revisions"][current_rev]["fetch"]
        self.assertEqual(len(fetch.keys()), 0)

        # enable the plugin and check if the fetch information is valid
        gu.e_d_plugin("download-commands", 'enable')
        resp = gu.get_change_last_patchset(change_id)
        fetch = resp["revisions"][current_rev]["fetch"]
        self.assertGreater(len(fetch.keys()), 0)

        gu.del_pubkey(k_index)
    def test_admin_manage_project_members(self):
        """ Test admin can add and delete users from all project groups
        """
        pname = 'p/%s' % create_random_str()
        self.create_project(pname, config.ADMIN_USER)
        # Gerrit part
        self.assertTrue(self.gu.project_exists(pname))
        self.assertTrue(self.gu.group_exists('%s-ptl' % pname))
        self.assertTrue(self.gu.group_exists('%s-core' % pname))
        groups = 'ptl-group core-group'
        # Add user2 to ptl and core groups
        self.msu.addUsertoProjectGroups(config.ADMIN_USER, pname,
                                        config.USER_2, groups)
        # Test if user2 exists in ptl and core groups
        self.assertTrue(self.gu.member_in_group(config.USER_2,
                                                '%s-ptl' % pname))
        self.assertTrue(self.gu.member_in_group(config.USER_2,
                                                '%s-core' % pname))
        # tracker part
        if has_issue_tracker():
            rname = pname.replace('/', '_')
            self.assertTrue(self.rm.check_user_role(rname,
                                                    config.USER_2,
                                                    'Manager'))
            self.assertTrue(self.rm.check_user_role(rname,
                                                    config.USER_2,
                                                    'Developer'))

        # Delete user2 from project groups
        self.msu.deleteUserFromProjectGroups(config.ADMIN_USER, pname,
                                             config.USER_2)
        # Test if user exists in ptl and core groups
        self.assertFalse(self.gu.member_in_group(config.USER_2,
                                                 '%s-ptl' % pname))
        self.assertFalse(self.gu.member_in_group(config.USER_2,
                                                 '%s-core' % pname))
        # tracker part
        if has_issue_tracker():
            rname = pname.replace('/', '_')
            self.assertFalse(self.rm.check_user_role(rname,
                                                     config.USER_2,
                                                     'Manager'))
            self.assertFalse(self.rm.check_user_role(rname,
                                                     config.USER_2,
                                                     'Developer'))
 def test_create_public_project_with_users_in_group(self):
     """ Create public project on redmine and gerrit with users in groups
     """
     pname = "p_%s" % create_random_str()
     u2mail = config.USERS[config.USER_2]["email"]
     u3mail = config.USERS[config.USER_3]["email"]
     options = {"ptl-group": "", "core-group": "%s,%s" % (u2mail, u3mail)}
     self.create_project(pname, config.ADMIN_USER, options=options)
     # Gerrit part
     self.assertTrue(self.gu.project_exists(pname))
     # TODO(Project creator, as project owner, should only be in ptl group)
     self.assertTrue(self.gu.member_in_group(config.ADMIN_USER, "%s-ptl" % pname))
     for user in (config.ADMIN_USER, config.USER_2, config.USER_3):
         self.assertTrue(self.gu.member_in_group(user, "%s-core" % pname))
     # Redmine part
     self.assertTrue(self.rm.project_exists(pname))
     self.assertTrue(self.rm.check_user_role(pname, config.ADMIN_USER, "Manager"))
     for user in (config.ADMIN_USER, config.USER_2, config.USER_3):
         self.assertTrue(self.rm.check_user_role(pname, user, "Developer"))
Example #31
0
 def test_project_pages_config(self):
     """ Check if managesf allow us to configure pages for a project
     """
     project = 'p_%s' % create_random_str()
     self.create_project(project, config.USER_2)
     self.assertTrue(self.gu.project_exists(project))
     self.assertTrue(self.rm.project_exists(project))
     self.msu.update_project_page(config.USER_2, project,
                                  "http://tests.com/")
     self.assertEqual(
         self.msu.get_project_page(config.USER_2, project).strip(),
         "\"http://tests.com/\"")
     self.msu.delete_project_page(config.USER_3, project)
     self.assertEqual(
         self.msu.get_project_page(config.USER_2, project).strip(),
         "\"http://tests.com/\"")
     self.msu.delete_project_page(config.USER_2, project)
     self.assertEqual(
         self.msu.get_project_page(config.USER_2, project).strip(), "")
 def test_validate_get_all_project_details(self):
     """ Check if managesf allow us to fetch projects details
     """
     project = 'p_%s' % create_random_str()
     self.create_project(project, config.USER_2)
     admin_cookies = dict(
         auth_pubtkt=config.USERS[config.ADMIN_USER]['auth_cookie'])
     user2_cookies = dict(
         auth_pubtkt=config.USERS[config.USER_2]['auth_cookie'])
     url = "http://%s%s" % (config.GATEWAY_HOST, "/manage/project/")
     resp = requests.get(url, cookies=admin_cookies)
     self.assertEqual(200, resp.status_code)
     self.assertTrue(project in resp.json())
     self.assertTrue('config' in resp.json())
     resp = requests.get(url, cookies=user2_cookies)
     self.assertEqual(200, resp.status_code)
     self.assertTrue(project in resp.json())
     self.assertTrue('config' in resp.json())
     resp = requests.get(url, cookies=user2_cookies)
Example #33
0
    def test_ptl_manage_project_members(self):
        """ Test ptl can add and delete users from all project groups
        """
        # Let user2 create the project, so he will be ptl for this project
        pname = 'p_%s' % create_random_str()
        self.create_project(pname, config.USER_2)
        # Gerrit part
        self.assertTrue(self.gu.project_exists(pname))
        self.assertTrue(self.gu.group_exists('%s-ptl' % pname))
        self.assertTrue(self.gu.group_exists('%s-core' % pname))
        groups = 'ptl-group core-group'

        # ptl should be ale to add users to all groups
        # so user2 should be able to add user3 to ptl and core groups
        self.msu.addUsertoProjectGroups(config.USER_2, pname, config.USER_3,
                                        groups)
        # Test if user3 exists in ptl and core groups
        self.assertTrue(
            self.gu.member_in_group(config.USER_3, '%s-ptl' % pname))
        self.assertTrue(
            self.gu.member_in_group(config.USER_3, '%s-core' % pname))
        # tracker part
        if has_issue_tracker():
            self.assertTrue(
                self.rm.check_user_role(pname, config.USER_3, 'Manager'))
            self.assertTrue(
                self.rm.check_user_role(pname, config.USER_3, 'Developer'))

        # ptl should be able to remove users from all groups
        self.msu.deleteUserFromProjectGroups(config.USER_2, pname,
                                             config.USER_3)
        # user3 shouldn't exist in any group
        self.assertFalse(
            self.gu.member_in_group(config.USER_3, '%s-ptl' % pname))
        self.assertFalse(
            self.gu.member_in_group(config.USER_3, '%s-core' % pname))
        # tracker part
        if has_issue_tracker():
            self.assertFalse(
                self.rm.check_user_role(pname, config.USER_3, 'Manager'))
            self.assertFalse(
                self.rm.check_user_role(pname, config.USER_3, 'Developer'))
 def test_project_pages_config(self):
     """ Check if managesf allow us to configure pages for a project
     """
     project = 'p_%s' % create_random_str()
     self.create_project(project, config.USER_2)
     self.assertTrue(self.gu.project_exists(project))
     self.assertTrue(self.rm.project_exists(project))
     self.msu.update_project_page(config.USER_2, project,
                                  "http://tests.com/")
     self.assertEqual(self.msu.get_project_page(config.USER_2,
                                                project).strip(),
                      "\"http://tests.com/\"")
     self.msu.delete_project_page(config.USER_3, project)
     self.assertEqual(self.msu.get_project_page(config.USER_2,
                                                project).strip(),
                      "\"http://tests.com/\"")
     self.msu.delete_project_page(config.USER_2, project)
     self.assertEqual(self.msu.get_project_page(config.USER_2,
                                                project).strip(),
                      "")
Example #35
0
    def test_admin_manage_project_members(self):
        """ Test admin can add and delete users from all project groups
        """
        pname = 'p/%s' % create_random_str()
        self.create_project(pname, config.ADMIN_USER)
        # Gerrit part
        self.assertTrue(self.gu.project_exists(pname))
        self.assertTrue(self.gu.group_exists('%s-ptl' % pname))
        self.assertTrue(self.gu.group_exists('%s-core' % pname))
        groups = 'ptl-group core-group'
        # Add user2 to ptl and core groups
        self.msu.addUsertoProjectGroups(config.ADMIN_USER, pname,
                                        config.USER_2, groups)
        # Test if user2 exists in ptl and core groups
        self.assertTrue(
            self.gu.member_in_group(config.USER_2, '%s-ptl' % pname))
        self.assertTrue(
            self.gu.member_in_group(config.USER_2, '%s-core' % pname))
        # tracker part
        if has_issue_tracker():
            rname = pname.replace('/', '_')
            self.assertTrue(
                self.rm.check_user_role(rname, config.USER_2, 'Manager'))
            self.assertTrue(
                self.rm.check_user_role(rname, config.USER_2, 'Developer'))

        # Delete user2 from project groups
        self.msu.deleteUserFromProjectGroups(config.ADMIN_USER, pname,
                                             config.USER_2)
        # Test if user exists in ptl and core groups
        self.assertFalse(
            self.gu.member_in_group(config.USER_2, '%s-ptl' % pname))
        self.assertFalse(
            self.gu.member_in_group(config.USER_2, '%s-core' % pname))
        # tracker part
        if has_issue_tracker():
            rname = pname.replace('/', '_')
            self.assertFalse(
                self.rm.check_user_role(rname, config.USER_2, 'Manager'))
            self.assertFalse(
                self.rm.check_user_role(rname, config.USER_2, 'Developer'))
Example #36
0
    def test_check_download_commands(self):
        """ Test if download commands plugin works
        """
        pname = 'p_%s' % create_random_str()
        self.create_project(pname)
        un = config.ADMIN_USER
        gu = GerritUtils(config.GATEWAY_URL,
                         auth_cookie=config.USERS[un]['auth_cookie'])
        self.assertTrue(gu.project_exists(pname))
        k_index = gu.add_pubkey(config.USERS[un]["pubkey"])
        priv_key_path = set_private_key(config.USERS[un]["privkey"])
        gitu = GerritGitUtils(un, priv_key_path, config.USERS[un]['email'])
        url = "ssh://%s@%s:29418/%s" % (un, config.GATEWAY_HOST, pname)
        clone_dir = gitu.clone(url, pname)
        self.dirs_to_delete.append(os.path.dirname(clone_dir))

        gitu.add_commit_and_publish(clone_dir, "master", "Test commit")

        change_ids = gu.get_my_changes_for_project(pname)
        self.assertEqual(len(change_ids), 1)
        change_id = change_ids[0]
        resp = gu.get_change_last_patchset(change_id)
        self.assertIn("current_revision", resp)
        self.assertIn("revisions", resp)
        current_rev = resp["current_revision"]
        fetch = resp["revisions"][current_rev]["fetch"]
        self.assertGreater(fetch.keys(), 0)

        # disable and check if the fetch has anything
        gu.e_d_plugin("download-commands", 'disable')
        resp = gu.get_change_last_patchset(change_id)
        fetch = resp["revisions"][current_rev]["fetch"]
        self.assertEqual(len(fetch.keys()), 0)

        # enable the plugin and check if the fetch information is valid
        gu.e_d_plugin("download-commands", 'enable')
        resp = gu.get_change_last_patchset(change_id)
        fetch = resp["revisions"][current_rev]["fetch"]
        self.assertGreater(len(fetch.keys()), 0)

        gu.del_pubkey(k_index)
 def test_init_user_tests(self):
     """ Check if a test init feature behave as expected
     """
     project = 'p_%s' % create_random_str()
     self.create_project(project, config.USER_4)
     self.msu.create_init_tests(project, config.USER_4)
     ggu = GerritGitUtils(config.ADMIN_USER,
                          config.ADMIN_PRIV_KEY_PATH,
                          config.USERS[config.ADMIN_USER]['email'])
     open_reviews = ggu.list_open_reviews('config', config.GATEWAY_HOST)
     match = [True for review in open_reviews if review['commitMessage'].
              startswith("%s proposes initial test "
                         "definition for project %s" %
                         (config.USER_4, project))]
     self.assertEqual(len(match), 1)
     open_reviews = ggu.list_open_reviews(project, config.GATEWAY_HOST)
     match = [True for review in open_reviews if review['commitMessage'].
              startswith("%s proposes initial test "
                         "scripts for project %s" %
                         (config.USER_4, project))]
     self.assertEqual(len(match), 1)
 def test_create_public_project_as_admin(self):
     """ Create public project on redmine and gerrit as admin
     """
     pname = 'p_%s' % create_random_str()
     self.create_project(pname, config.ADMIN_USER)
     # Gerrit part
     self.assertTrue(self.gu.project_exists(pname))
     self.assertTrue(self.gu.group_exists('%s-ptl' % pname))
     self.assertTrue(self.gu.group_exists('%s-core' % pname))
     # TODO(Project creator, as project owner, should only be in ptl group)
     self.assertTrue(
         self.gu.member_in_group(config.ADMIN_USER, '%s-ptl' % pname))
     self.assertTrue(
         self.gu.member_in_group(config.ADMIN_USER, '%s-core' % pname))
     # Redmine part
     self.assertTrue(self.rm.project_exists(pname))
     self.assertTrue(
         self.rm.check_user_role(pname, config.ADMIN_USER, 'Manager'))
     self.assertTrue(
         self.rm.check_user_role(pname, config.ADMIN_USER, 'Developer'))
     self.assertTrue(self.project_exists_ex(pname, config.USER_2))
 def test_create_private_project_as_user(self):
     """ Create private project on redmine and gerrit as user
     """
     pname = "p_%s" % create_random_str()
     options = {"private": ""}
     self.create_project(pname, config.USER_2, options=options)
     # Gerrit part
     self.assertTrue(self.gu.project_exists(pname))
     self.assertTrue(self.gu.group_exists("%s-ptl" % pname))
     self.assertTrue(self.gu.group_exists("%s-core" % pname))
     self.assertTrue(self.gu.group_exists("%s-dev" % pname))
     # TODO(Project creator, as project owner, should only be in ptl group)
     self.assertTrue(self.gu.member_in_group(config.USER_2, "%s-ptl" % pname))
     self.assertTrue(self.gu.member_in_group(config.USER_2, "%s-core" % pname))
     self.assertTrue(self.gu.member_in_group(config.USER_2, "%s-dev" % pname))
     # Redmine part
     self.assertTrue(self.rm.project_exists(pname))
     self.assertTrue(self.project_exists_ex(pname, config.USER_2))
     self.assertTrue(self.rm.check_user_role(pname, config.USER_2, "Manager"))
     self.assertTrue(self.rm.check_user_role(pname, config.USER_2, "Developer"))
     self.assertFalse(self.project_exists_ex(pname, config.USER_3))
 def test_create_public_project_as_admin_clone_as_admin(self):
     """ Clone public project as admin and check content
     """
     pname = "p_%s" % create_random_str()
     self.create_project(pname, config.ADMIN_USER)
     ggu = GerritGitUtils(config.ADMIN_USER, config.ADMIN_PRIV_KEY_PATH, config.USERS[config.ADMIN_USER]["email"])
     url = "ssh://%s@%s:29418/%s" % (config.ADMIN_USER, config.GATEWAY_HOST, pname)
     clone_dir = ggu.clone(url, pname)
     self.dirs_to_delete.append(os.path.dirname(clone_dir))
     # Test that the clone is a success
     self.assertTrue(os.path.isdir(clone_dir))
     # Verify master own the .gitreview file
     self.assertTrue(os.path.isfile(os.path.join(clone_dir, ".gitreview")))
     # Verify meta/config branch own both group and ACLs config file
     ggu.fetch_meta_config(clone_dir)
     self.assertTrue(os.path.isfile(os.path.join(clone_dir, "project.config")))
     self.assertTrue(os.path.isfile(os.path.join(clone_dir, "groups")))
     # There is no group dev for a public project
     content = file(os.path.join(clone_dir, "project.config")).read()
     self.assertFalse("%s-dev" % pname in content)
     content = file(os.path.join(clone_dir, "groups")).read()
     self.assertFalse("%s-dev" % pname in content)
 def test_create_public_project_as_user(self):
     """ Create public project on redmine and gerrit as user
     """
     pname = 'p_%s' % create_random_str()
     self.create_project(pname, config.USER_2)
     # Gerrit part
     self.assertTrue(self.gu.project_exists(pname))
     self.assertTrue(self.gu.group_exists('%s-ptl' % pname))
     self.assertTrue(self.gu.group_exists('%s-core' % pname))
     # TODO(Project creator, as project owner, should only be in ptl group)
     self.assertTrue(
         self.gu.member_in_group(config.ADMIN_USER, '%s-ptl' % pname))
     self.assertTrue(
         self.gu.member_in_group(config.ADMIN_USER, '%s-core' % pname))
     # Redmine part
     self.assertTrue(self.rm.project_exists(pname))
     self.assertTrue(self.project_exists_ex(pname, config.USER_2))
     self.assertTrue(
         self.rm.check_user_role(pname, config.USER_2, 'Manager'))
     self.assertTrue(
         self.rm.check_user_role(pname, config.USER_2, 'Developer'))
     self.assertTrue(self.project_exists_ex(pname, config.USER_3))
 def test_create_public_project_with_users_in_group(self):
     """ Create public project on redmine and gerrit with users in groups
     """
     pname = 'p_%s' % create_random_str()
     u2mail = config.USERS[config.USER_2]['email']
     u3mail = config.USERS[config.USER_3]['email']
     options = {"ptl-group": "",
                "core-group": "%s,%s" % (u2mail, u3mail),
                }
     self.create_project(pname, config.ADMIN_USER,
                         options=options)
     # Gerrit part
     self.assertTrue(self.gu.project_exists(pname))
     # TODO(Project creator, as project owner, should only be in ptl group)
     self.assertTrue(
         self.gu.member_in_group(config.ADMIN_USER, '%s-ptl' % pname))
     for user in (config.ADMIN_USER, config.USER_2, config.USER_3):
         self.assertTrue(self.gu.member_in_group(user, '%s-core' % pname))
     # Redmine part
     self.assertTrue(self.rm.project_exists(pname))
     self.assertTrue(
         self.rm.check_user_role(pname, config.ADMIN_USER, 'Manager'))
     for user in (config.ADMIN_USER, config.USER_2, config.USER_3):
         self.assertTrue(self.rm.check_user_role(pname, user, 'Developer'))
Example #43
0
    def _prepare_review_submit_testing(self, project_options=None):
        if project_options is None:
            u2mail = config.USERS[config.USER_2]['email']
            project_options = {'core-group': u2mail}
        pname = 'p_%s' % create_random_str()
        self.create_project(pname, project_options)
        un = config.ADMIN_USER
        gu = GerritUtils(config.GATEWAY_URL,
                         auth_cookie=config.USERS[un]['auth_cookie'])
        k_index = gu.add_pubkey(config.USERS[un]["pubkey"])
        self.assertTrue(gu.project_exists(pname))
        priv_key_path = set_private_key(config.USERS[un]["privkey"])
        gitu = GerritGitUtils(un, priv_key_path, config.USERS[un]['email'])
        url = "ssh://%s@%s:29418/%s" % (un, config.GATEWAY_HOST, pname)
        clone_dir = gitu.clone(url, pname)
        self.dirs_to_delete.append(os.path.dirname(clone_dir))

        gitu.add_commit_and_publish(clone_dir, "master", "Test commit")

        change_ids = gu.get_my_changes_for_project(pname)
        self.assertEqual(len(change_ids), 1)
        change_id = change_ids[0]

        return change_id, gu, k_index
Example #44
0
    def test_CUD_project(self):
        """ Check resources - ops on project work as expected """
        sclient = SFStoryboard(config.GATEWAY_URL + "/storyboard_api",
                               config.USERS[config.USER_4]['auth_cookie'])
        fpath = "resources/%s.yaml" % create_random_str()
        name = create_random_str()
        resources = """resources:
  projects:
    %(pname)s:
      description: An awesome project
      issue-tracker: SFStoryboard
      source-repositories:
        - %(pname)s/%(r1name)s
  repos:
    %(pname)s/%(r1name)s:
      description: The server part
      acl: %(pname)s
  acls:
    %(pname)s:
      file: |
        [access "refs/*"]
          read = group Anonymous Users
"""
        tmpl_keys = {
            'pname': create_random_str(),
            'r1name': create_random_str()
        }

        resources = resources % tmpl_keys
        # Add the resources file w/o review
        self.set_resources_then_direct_push(fpath,
                                            resources=resources,
                                            mode='add')

        # Some checks to validate stuff have been created
        projects = [p.name for p in sclient.projects.get_all()]
        self.assertIn("%s/%s" % (tmpl_keys['pname'], tmpl_keys['r1name']),
                      projects)
        project_groups = [p.name for p in sclient.project_groups.get_all()]
        self.assertIn(tmpl_keys['pname'], project_groups)

        # Modify the project resource
        resources = """resources:
  projects:
    %(pname)s:
      description: An awesome project
      issue-tracker: SFStoryboard
      source-repositories:
        - %(pname)s/%(r1name)s
        - %(pname)s/%(r2name)s
  repos:
    %(pname)s/%(r1name)s:
      description: The server part
      acl: %(pname)s
    %(pname)s/%(r2name)s:
      description: The server part
      acl: %(pname)s
  acls:
    %(pname)s:
      file: |
        [access "refs/*"]
          read = group Anonymous Users
"""
        tmpl_keys.update({'r2name': create_random_str()})
        resources = resources % tmpl_keys
        self.set_resources_then_direct_push(fpath,
                                            resources=resources,
                                            mode='add')
        # Some checks to validate stuff have been updated
        projects = [p.name for p in sclient.projects.get_all()]
        for name in (tmpl_keys['r1name'], tmpl_keys['r2name']):
            self.assertIn("%s/%s" % (tmpl_keys['pname'], name), projects)
        project_groups = [p.name for p in sclient.project_groups.get_all()]
        self.assertIn(tmpl_keys['pname'], project_groups)

        # Del the resources file w/o review
        self.set_resources_then_direct_push(fpath, mode='del')

        # Check the project group has been deleted
        # Note the project (in storyboard) is not deleted
        # this is a current limitation of the API (01/13/2017)
        project_groups = [p.name for p in sclient.project_groups.get_all()]
        self.assertFalse(tmpl_keys['pname'] in project_groups)
Example #45
0
    def test_manage_project_members_for_dev_group(self):
        """ Add and Delete users from dev group by admin, ptl, core,
            dev and non members
        """
        pname = 'p_%s' % create_random_str()
        options = {"private": ""}
        self.create_project(pname, config.ADMIN_USER, options=options)
        # Gerrit part
        self.assertTrue(self.gu.project_exists(pname))
        self.assertTrue(self.gu.group_exists('%s-ptl' % pname))
        self.assertTrue(self.gu.group_exists('%s-core' % pname))
        self.assertTrue(self.gu.group_exists('%s-dev' % pname))
        self.assertTrue(
            self.gu.member_in_group(config.ADMIN_USER, '%s-dev' % pname))
        # tracker part
        if has_issue_tracker():
            self.assertTrue(self.rm.project_exists(pname))
            self.assertTrue(
                self.rm.check_user_role(pname, config.ADMIN_USER, 'Developer'))

        # Admin should add user to dev group
        groups = 'dev-group'
        self.msu.addUsertoProjectGroups(config.ADMIN_USER, pname,
                                        config.USER_3, groups)
        # Test if user3 exists in dev group
        self.assertTrue(
            self.gu.member_in_group(config.USER_3, '%s-dev' % pname))
        # tracker part
        if has_issue_tracker():
            self.assertTrue(
                self.rm.check_user_role(pname, config.USER_3, 'Developer'))

        # admin should be able to remove users from dev group
        self.msu.deleteUserFromProjectGroups(config.ADMIN_USER, pname,
                                             config.USER_3)
        # user3 shouldn't exist in dev group
        self.assertFalse(
            self.gu.member_in_group(config.USER_3, '%s-dev' % pname))
        # tracker part
        if has_issue_tracker():
            self.assertFalse(
                self.rm.check_user_role(pname, config.USER_3, 'Developer'))

        # ptl should add user to dev group
        # let admin add user2 as ptl
        groups = 'ptl-group'
        self.msu.addUsertoProjectGroups(config.ADMIN_USER, pname,
                                        config.USER_2, groups)
        groups = 'dev-group'
        self.msu.addUsertoProjectGroups(config.USER_2, pname, config.USER_3,
                                        groups)
        # Test if user3 exists in dev group
        self.assertTrue(
            self.gu.member_in_group(config.USER_3, '%s-dev' % pname))
        # tracker part
        if has_issue_tracker():
            self.assertTrue(
                self.rm.check_user_role(pname, config.USER_3, 'Developer'))

        # ptl should be able to remove users from dev group
        self.msu.deleteUserFromProjectGroups(config.USER_2, pname,
                                             config.USER_3)
        # user3 shouldn't exist in dev group
        self.assertFalse(
            self.gu.member_in_group(config.USER_3, '%s-dev' % pname))
        # tracker part
        if has_issue_tracker():
            self.assertFalse(
                self.rm.check_user_role(pname, config.USER_3, 'Developer'))
        # Remove user2 as ptl
        self.msu.deleteUserFromProjectGroups(config.ADMIN_USER, pname,
                                             config.USER_2)

        # core should add user to dev group
        # let admin add user2 as core
        groups = 'core-group'
        self.msu.addUsertoProjectGroups(config.ADMIN_USER, pname,
                                        config.USER_2, groups)
        groups = 'dev-group'
        self.msu.addUsertoProjectGroups(config.USER_2, pname, config.USER_3,
                                        groups)
        # Test if user3 exists in dev group
        self.assertTrue(
            self.gu.member_in_group(config.USER_3, '%s-dev' % pname))
        # tracker part
        if has_issue_tracker():
            self.assertTrue(
                self.rm.check_user_role(pname, config.USER_3, 'Developer'))

        # core should be able to remove users from dev group
        group = 'dev-group'
        self.msu.deleteUserFromProjectGroups(config.USER_2, pname,
                                             config.USER_3, group)
        # user3 shouldn't exist in dev group
        self.assertFalse(
            self.gu.member_in_group(config.USER_3, '%s-dev' % pname))
        # tracker part
        if has_issue_tracker():
            self.assertFalse(
                self.rm.check_user_role(pname, config.USER_3, 'Developer'))
        # Remove user2 as core
        self.msu.deleteUserFromProjectGroups(config.ADMIN_USER, pname,
                                             config.USER_2)

        # let admin add user2 as developer
        groups = 'dev-group'
        self.msu.addUsertoProjectGroups(config.ADMIN_USER, pname,
                                        config.USER_2, groups)
        # dev user should be able to add a new user to dev group
        groups = 'dev-group'
        self.msu.addUsertoProjectGroups(config.USER_2, pname, config.USER_3,
                                        groups)
        # Test if user3 exists in dev group
        self.assertTrue(
            self.gu.member_in_group(config.USER_3, '%s-dev' % pname))
        # tracker part
        if has_issue_tracker():
            self.assertTrue(
                self.rm.check_user_role(pname, config.USER_3, 'Developer'))

        # developer should be able to remove users from dev group
        group = 'dev-group'
        self.msu.deleteUserFromProjectGroups(config.USER_2, pname,
                                             config.USER_3, group)
        # user3 shouldn't exist in dev group
        self.assertFalse(
            self.gu.member_in_group(config.USER_3, '%s-dev' % pname))
        # Redmine part
        if has_issue_tracker():
            self.assertFalse(
                self.rm.check_user_role(pname, config.USER_3, 'Developer'))
        # Remove user2 ifrom dev group
        self.msu.deleteUserFromProjectGroups(config.ADMIN_USER, pname,
                                             config.USER_2)
    def test_manage_project_members_for_dev_group(self):
        """ Add and Delete users from dev group by admin, ptl, core,
            dev and non members
        """
        pname = "p_%s" % create_random_str()
        options = {"private": ""}
        self.create_project(pname, config.ADMIN_USER, options=options)
        # Gerrit part
        self.assertTrue(self.gu.project_exists(pname))
        self.assertTrue(self.gu.group_exists("%s-ptl" % pname))
        self.assertTrue(self.gu.group_exists("%s-core" % pname))
        self.assertTrue(self.gu.group_exists("%s-dev" % pname))
        self.assertTrue(self.gu.member_in_group(config.ADMIN_USER, "%s-dev" % pname))
        # Redmine part
        self.assertTrue(self.rm.project_exists(pname))
        self.assertTrue(self.rm.check_user_role(pname, config.ADMIN_USER, "Developer"))

        # Admin should add user to dev group
        groups = "dev-group"
        self.msu.addUsertoProjectGroups(config.ADMIN_USER, pname, config.USER_3, groups)
        # Test if user3 exists in dev group
        self.assertTrue(self.gu.member_in_group(config.USER_3, "%s-dev" % pname))
        # Redmine part
        self.assertTrue(self.rm.check_user_role(pname, config.USER_3, "Developer"))

        # admin should be able to remove users from dev group
        self.msu.deleteUserFromProjectGroups(config.ADMIN_USER, pname, config.USER_3)
        # user3 shouldn't exist in dev group
        self.assertFalse(self.gu.member_in_group(config.USER_3, "%s-dev" % pname))
        # Redmine part
        self.assertFalse(self.rm.check_user_role(pname, config.USER_3, "Developer"))

        # ptl should add user to dev group
        # let admin add user2 as ptl
        groups = "ptl-group"
        self.msu.addUsertoProjectGroups(config.ADMIN_USER, pname, config.USER_2, groups)
        groups = "dev-group"
        self.msu.addUsertoProjectGroups(config.USER_2, pname, config.USER_3, groups)
        # Test if user3 exists in dev group
        self.assertTrue(self.gu.member_in_group(config.USER_3, "%s-dev" % pname))
        # Redmine part
        self.assertTrue(self.rm.check_user_role(pname, config.USER_3, "Developer"))

        # ptl should be able to remove users from dev group
        self.msu.deleteUserFromProjectGroups(config.USER_2, pname, config.USER_3)
        # user3 shouldn't exist in dev group
        self.assertFalse(self.gu.member_in_group(config.USER_3, "%s-dev" % pname))
        # Redmine part
        self.assertFalse(self.rm.check_user_role(pname, config.USER_3, "Developer"))
        # Remove user2 as ptl
        self.msu.deleteUserFromProjectGroups(config.ADMIN_USER, pname, config.USER_2)

        # core should add user to dev group
        # let admin add user2 as core
        groups = "core-group"
        self.msu.addUsertoProjectGroups(config.ADMIN_USER, pname, config.USER_2, groups)
        groups = "dev-group"
        self.msu.addUsertoProjectGroups(config.USER_2, pname, config.USER_3, groups)
        # Test if user3 exists in dev group
        self.assertTrue(self.gu.member_in_group(config.USER_3, "%s-dev" % pname))
        # Redmine part
        self.assertTrue(self.rm.check_user_role(pname, config.USER_3, "Developer"))

        # core should be able to remove users from dev group
        group = "dev-group"
        self.msu.deleteUserFromProjectGroups(config.USER_2, pname, config.USER_3, group)
        # user3 shouldn't exist in dev group
        self.assertFalse(self.gu.member_in_group(config.USER_3, "%s-dev" % pname))
        # Redmine part
        self.assertFalse(self.rm.check_user_role(pname, config.USER_3, "Developer"))
        # Remove user2 as core
        self.msu.deleteUserFromProjectGroups(config.ADMIN_USER, pname, config.USER_2)

        # let admin add user2 as developer
        groups = "dev-group"
        self.msu.addUsertoProjectGroups(config.ADMIN_USER, pname, config.USER_2, groups)
        # dev user should be able to add a new user to dev group
        groups = "dev-group"
        self.msu.addUsertoProjectGroups(config.USER_2, pname, config.USER_3, groups)
        # Test if user3 exists in dev group
        self.assertTrue(self.gu.member_in_group(config.USER_3, "%s-dev" % pname))
        # Redmine part
        self.assertTrue(self.rm.check_user_role(pname, config.USER_3, "Developer"))

        # developer should be able to remove users from dev group
        group = "dev-group"
        self.msu.deleteUserFromProjectGroups(config.USER_2, pname, config.USER_3, group)
        # user3 shouldn't exist in dev group
        self.assertFalse(self.gu.member_in_group(config.USER_3, "%s-dev" % pname))
        # Redmine part
        self.assertFalse(self.rm.check_user_role(pname, config.USER_3, "Developer"))
        # Remove user2 ifrom dev group
        self.msu.deleteUserFromProjectGroups(config.ADMIN_USER, pname, config.USER_2)
Example #47
0
    def test_GET_missing_resources(self):
        """ Check resources - GET missing resources works as expected"""
        token = config.USERS[config.ADMIN_USER]['auth_cookie']
        prev = "resources: {}"
        new = """resources:
  groups:
    %(gname)s:
      description: A test group
      members: ['*****@*****.**']
"""
        group_name = create_random_str()
        data = {'prev': prev, 'new': new % {'gname': group_name}}
        # Direct PUT resources bypassing the config repo workflow
        requests.put("%s/manage/resources/" % config.GATEWAY_URL,
                     json=data,
                     cookies={'auth_pubtkt': token})
        # Verify managesf detects diff and propose a re-sync resource struct
        ret = requests.get("%s/manage/resources/?get_missing_"
                           "resources=true" % config.GATEWAY_URL,
                           cookies={'auth_pubtkt': token})
        logs, resources = ret.json()
        self.assertListEqual(logs, [])
        self.assertIn(group_name, resources['resources']['groups'])
        # Call the resources.sh script on managesf node to propose
        # a review on the config repo to re-sync with the reality
        cmd = [
            '/usr/local/bin/resources.sh', 'get_missing_resources', 'submit'
        ]
        self.ssh_run_cmd(config.SERVICE_PRIV_KEY_PATH, 'root',
                         config.GATEWAY_HOST, cmd)
        # Get change id of the submitted review
        search_string = "Propose missing resources to the config repo"
        r = requests.get('%s/r/changes/?q=%s' %
                         (config.GATEWAY_URL, search_string))
        lastid = 0
        for r in json.loads(r.content[4:]):
            if r['_number'] > lastid:
                lastid = r['_number']
        self.assertEqual(self.gu.wait_for_verify(lastid), 1)
        # Check flag "sf-resources: skip-apply" in the commit msg
        change = self.gu.g.get(
            'changes/?q=%s&o=CURRENT_REVISION&o=CURRENT_COMMIT' % lastid)[0]
        revision = change["current_revision"]
        commit = change['revisions'][revision]["commit"]
        self.assertEqual(commit["message"].split('\n')[0],
                         'Propose missing resources to the config repo')
        self.assertTrue(commit["message"].find('sf-resources: skip-apply') > 0)
        # Approve the change and wait for the +2
        self.gu.submit_change_note(change['id'], "current", "Code-Review", "2")
        self.gu.submit_change_note(change['id'], "current", "Workflow", "1")
        # Check config-update return a success
        # The flag sf-resources: skip-apply should be detected
        # by the config update. Then missing resources won't
        # by concidered new and the resources apply will be skipped.
        # This tests (checking config-update succeed) confirm
        # resource apply have been skipped if not managesf resources
        # apply would have return 409 error making config-update failed too.
        # If not True then we cannot concider config-update succeed
        config_update_log = self.ju.wait_for_config_update(revision)
        self.assertIn("Skip resources apply.", config_update_log)
        self.assertIn("SUCCESS", config_update_log)
        # Checking again missing resources  must return nothing
        ret = requests.get("%s/manage/resources/?get_missing_"
                           "resources=true" % config.GATEWAY_URL,
                           cookies={'auth_pubtkt': token})
        logs, resources = ret.json()
        self.assertListEqual(logs, [])
        self.assertEqual(len(resources['resources']), 0)
    def test_check_add_automatic_reviewers(self):
        """ Test if reviewers-by-blame plugin works
        """
        pname = 'p_%s' % create_random_str()
        u2mail = config.USERS[config.USER_2]['email']
        options = {'core-group': u2mail}
        self.create_project(pname, options)
        first_u = config.ADMIN_USER
        gu_first_u = GerritUtils(
            config.GATEWAY_URL,
            auth_cookie=config.USERS[first_u]['auth_cookie'])
        self.assertTrue(gu_first_u.project_exists(pname))
        # Push data in the create project as Admin user
        k1_index = gu_first_u.add_pubkey(config.USERS[first_u]["pubkey"])
        priv_key_path = set_private_key(config.USERS[first_u]["privkey"])
        gitu = GerritGitUtils(first_u,
                              priv_key_path,
                              config.USERS[first_u]['email'])
        url = "ssh://%s@%s:29418/%s" % (first_u, config.GATEWAY_HOST,
                                        pname)
        clone_dir = gitu.clone(url, pname)
        self.dirs_to_delete.append(os.path.dirname(clone_dir))
        data = ['this', 'is', 'a', 'couple', 'of', 'lines']
        clone_dir = gitu.clone(url, pname)
        file(os.path.join(clone_dir, "file"), 'w').write("\n".join(data))
        gitu.add_commit_and_publish(clone_dir, "master", "Test commit",
                                    fnames=["file"])
        # Get the change id
        change_ids = gu_first_u.get_my_changes_for_project(pname)
        self.assertEqual(len(change_ids), 1)
        change_id = change_ids[0]
        # Merge the change
        gu_first_u.submit_change_note(change_id, "current", "Code-Review", "2")
        gu_first_u.submit_change_note(change_id, "current", "Verified", "2")
        gu_first_u.submit_change_note(change_id, "current", "Workflow", "1")
        second_u = config.USER_2
        gu_second_u = GerritUtils(
            config.GATEWAY_URL,
            auth_cookie=config.USERS[second_u]['auth_cookie'])
        self.assertTrue(gu_first_u.submit_patch(change_id, "current"))
        # Change the file we have commited with Admin user
        k2_index = gu_second_u.add_pubkey(config.USERS[second_u]["pubkey"])
        priv_key_path = set_private_key(config.USERS[second_u]["privkey"])
        gitu = GerritGitUtils(second_u,
                              priv_key_path,
                              config.USERS[second_u]['email'])
        url = "ssh://%s@%s:29418/%s" % (second_u, config.GATEWAY_HOST,
                                        pname)
        clone_dir = gitu.clone(url, pname)
        self.dirs_to_delete.append(os.path.dirname(clone_dir))
        data = ['this', 'is', 'some', 'lines']
        file(os.path.join(clone_dir, "file"), 'w').write("\n".join(data))
        gitu.add_commit_and_publish(clone_dir, "master", "Test commit",
                                    fnames=["file"])
        # Get the change id
        change_ids = gu_second_u.get_my_changes_for_project(pname)
        self.assertEqual(len(change_ids), 1)
        change_id = change_ids[0]
        # Verify first_u has been automatically added to reviewers
        attempts = 0
        while True:
            if len(gu_second_u.get_reviewers(change_id)) > 0 or attempts >= 3:
                break
            attempts += 1
            time.sleep(1)
        reviewers = gu_second_u.get_reviewers(change_id)
        self.assertGreaterEqual(len(reviewers), 1)
        self.assertTrue(first_u in reviewers)

        gu_first_u.del_pubkey(k1_index)
        gu_second_u.del_pubkey(k2_index)
Example #49
0
    def test_check_add_automatic_reviewers(self):
        """ Test if reviewers-by-blame plugin works
        """
        pname = 'p_%s' % create_random_str()
        u2mail = config.USERS[config.USER_2]['email']
        options = {'core-group': u2mail}
        self.create_project(pname, options)
        first_u = config.ADMIN_USER
        gu_first_u = GerritUtils(
            config.GATEWAY_URL,
            auth_cookie=config.USERS[first_u]['auth_cookie'])
        self.assertTrue(gu_first_u.project_exists(pname))
        # Push data in the create project as Admin user
        k1_index = gu_first_u.add_pubkey(config.USERS[first_u]["pubkey"])
        priv_key_path = set_private_key(config.USERS[first_u]["privkey"])
        gitu = GerritGitUtils(first_u, priv_key_path,
                              config.USERS[first_u]['email'])
        url = "ssh://%s@%s:29418/%s" % (first_u, config.GATEWAY_HOST, pname)
        clone_dir = gitu.clone(url, pname)
        self.dirs_to_delete.append(os.path.dirname(clone_dir))
        data = ['this', 'is', 'a', 'couple', 'of', 'lines']
        clone_dir = gitu.clone(url, pname)
        file(os.path.join(clone_dir, "file"), 'w').write("\n".join(data))
        gitu.add_commit_and_publish(clone_dir,
                                    "master",
                                    "Test commit",
                                    fnames=["file"])
        # Get the change id
        change_ids = gu_first_u.get_my_changes_for_project(pname)
        self.assertEqual(len(change_ids), 1)
        change_id = change_ids[0]
        # Merge the change
        gu_first_u.submit_change_note(change_id, "current", "Code-Review", "2")
        gu_first_u.submit_change_note(change_id, "current", "Verified", "2")
        gu_first_u.submit_change_note(change_id, "current", "Workflow", "1")
        second_u = config.USER_2
        gu_second_u = GerritUtils(
            config.GATEWAY_URL,
            auth_cookie=config.USERS[second_u]['auth_cookie'])
        self.assertTrue(gu_first_u.submit_patch(change_id, "current"))
        # Change the file we have commited with Admin user
        k2_index = gu_second_u.add_pubkey(config.USERS[second_u]["pubkey"])
        priv_key_path = set_private_key(config.USERS[second_u]["privkey"])
        gitu = GerritGitUtils(second_u, priv_key_path,
                              config.USERS[second_u]['email'])
        url = "ssh://%s@%s:29418/%s" % (second_u, config.GATEWAY_HOST, pname)
        clone_dir = gitu.clone(url, pname)
        self.dirs_to_delete.append(os.path.dirname(clone_dir))
        data = ['this', 'is', 'some', 'lines']
        file(os.path.join(clone_dir, "file"), 'w').write("\n".join(data))
        gitu.add_commit_and_publish(clone_dir,
                                    "master",
                                    "Test commit",
                                    fnames=["file"])
        # Get the change id
        change_ids = gu_second_u.get_my_changes_for_project(pname)
        self.assertEqual(len(change_ids), 1)
        change_id = change_ids[0]
        # Verify first_u has been automatically added to reviewers
        attempts = 0
        while True:
            if len(gu_second_u.get_reviewers(change_id)) > 0 or attempts >= 3:
                break
            attempts += 1
            time.sleep(1)
        reviewers = gu_second_u.get_reviewers(change_id)
        self.assertGreaterEqual(len(reviewers), 1)
        self.assertTrue(first_u in reviewers)

        gu_first_u.del_pubkey(k1_index)
        gu_second_u.del_pubkey(k2_index)
Example #50
0
    def test_core_manage_project_members(self):
        """ Test core can add and delete users to core group
        """
        # let admin create the project
        pname = 'p_%s' % create_random_str()
        self.create_project(pname, config.ADMIN_USER)
        # Gerrit part
        self.assertTrue(self.gu.project_exists(pname))
        self.assertTrue(self.gu.group_exists('%s-ptl' % pname))
        self.assertTrue(self.gu.group_exists('%s-core' % pname))
        groups = 'core-group'

        # Add user2 as core user
        self.msu.addUsertoProjectGroups(config.ADMIN_USER, pname,
                                        config.USER_2, groups)
        # Test if user2 exists in core group
        self.assertTrue(
            self.gu.member_in_group(config.USER_2, '%s-core' % pname))
        # tracker part
        if has_issue_tracker():
            self.assertTrue(
                self.rm.check_user_role(pname, config.USER_2, 'Developer'))

        groups = 'core-group'
        # core should be ale to add users to only core group and not ptl group
        # so user2 should be able to add user3 to only core group and not
        # ptl group
        self.msu.addUsertoProjectGroups(config.USER_2, pname, config.USER_3,
                                        groups)
        # user3 should exist in core group
        self.assertTrue(
            self.gu.member_in_group(config.USER_3, '%s-core' % pname))
        # tracker part
        if has_issue_tracker():
            self.assertTrue(
                self.rm.check_user_role(pname, config.USER_3, 'Developer'))

        groups = 'ptl-group'
        # core should not be allowed to add users to ptl group
        # so user2 should not be able to add user3 to ptl group
        self.msu.addUsertoProjectGroups(config.USER_2, pname, config.USER_3,
                                        groups)
        # user3 shouldn't exist in ptl group
        self.assertFalse(
            self.gu.member_in_group(config.USER_3, '%s-ptl' % pname))
        # tracker part
        if has_issue_tracker():
            self.assertFalse(
                self.rm.check_user_role(pname, config.USER_3, 'Manager'))

        # core should be able to remove users from core group
        group = 'core-group'
        self.msu.deleteUserFromProjectGroups(config.USER_2, pname,
                                             config.USER_3, group)
        # user3 shouldn't exist in core group
        self.assertFalse(
            self.gu.member_in_group(config.USER_3, '%s-core' % pname))
        # tracker part
        if has_issue_tracker():
            self.assertFalse(
                self.rm.check_user_role(pname, config.USER_3, 'Developer'))
Example #51
0
    def test_CRUD_resources(self):
        """ Check resources - bulk ops on resources work as expected """
        fpath = "resources/%s.yaml" % create_random_str()
        tmpl_keys = {
            'pname': create_random_str(),
            'r1name': create_random_str(),
            'r2name': create_random_str(),
            'aname': create_random_str(),
            'g1name': create_random_str(),
            'g2name': create_random_str()
        }
        resources = """resources:
  projects:
    %(pname)s:
      description: An awesome project
      contacts:
        - [email protected]
      source-repositories:
        - %(pname)s/%(r1name)s
        - %(pname)s/%(r2name)s
      website: http://ichiban-cloud.io
      documentation: http://ichiban-cloud.io/docs
      issue-tracker-url: http://ichiban-cloud.bugtrackers.io
  repos:
    %(pname)s/%(r1name)s:
      description: The server part
      acl: %(aname)s
    %(pname)s/%(r2name)s:
      description: The client part
      acl: %(aname)s
  acls:
    %(aname)s:
      file: |
        [access "refs/*"]
          read = group Anonymous Users
          read = group %(pname)s/%(g2name)s
          owner = group %(pname)s/%(g1name)s
        [access "refs/heads/*"]
          label-Code-Review = -2..+2 group %(pname)s/%(g2name)s
          label-Verified = -2..+2 group %(pname)s/%(g1name)s
          label-Workflow = -1..+1 group %(pname)s/%(g2name)s
          submit = group %(pname)s/%(g2name)s
          read = group Anonymous Users
          read = group %(pname)s/%(g2name)s
        [access "refs/meta/config"]
          read = group %(pname)s/%(g2name)s
        [receive]
          requireChangeId = true
        [submit]
          mergeContent = false
          action = fast forward only
      groups:
        - %(pname)s/%(g1name)s
        - %(pname)s/%(g2name)s
  groups:
    %(pname)s/%(g1name)s:
      members:
        - [email protected]
    %(pname)s/%(g2name)s:
      members:
        - [email protected]
        - [email protected]
"""
        # Add the resources file w/o review
        resources = resources % tmpl_keys
        self.set_resources_then_direct_push(fpath,
                                            resources=resources,
                                            mode='add')
        # Check resources have been created
        self.assertTrue(
            self.gu.project_exists(
                os.path.join(tmpl_keys['pname'], tmpl_keys['r1name'])))
        self.assertTrue(
            self.gu.project_exists(
                os.path.join(tmpl_keys['pname'], tmpl_keys['r2name'])))
        gid = self.gu.get_group_id(
            os.path.join(tmpl_keys['pname'], tmpl_keys['g1name']))
        members = [m['email'] for m in self.gu.get_group_members(gid)]
        self.assertEqual(len(members), 1)
        self.assertIn("*****@*****.**", members)
        gid2 = self.gu.get_group_id(
            os.path.join(tmpl_keys['pname'], tmpl_keys['g2name']))
        members = [m['email'] for m in self.gu.get_group_members(gid2)]
        self.assertEqual(len(members), 2)
        self.assertIn("*****@*****.**", members)
        self.assertIn("*****@*****.**", members)
        # Verify ACLs have been written for both repo
        for r in ('r1name', 'r2name'):
            rname = os.path.join(tmpl_keys['pname'], tmpl_keys[r])
            acl = self.gu.g.get('access/?project=%s' % rname)
            self.assertIn(
                gid2, acl[rname]['local']['refs/heads/*']['permissions']
                ['submit']['rules'].keys())
        # Verify the resources endpoint know about what we pushed
        res = self.get_resources()
        self.assertIn(tmpl_keys['pname'], res['resources']['projects'].keys())
        self.assertIn(tmpl_keys['aname'], res['resources']['acls'].keys())
        self.assertIn(os.path.join(tmpl_keys['pname'], tmpl_keys['g1name']),
                      res['resources']['groups'].keys())
        self.assertIn(os.path.join(tmpl_keys['pname'], tmpl_keys['g2name']),
                      res['resources']['groups'].keys())
        self.assertIn(os.path.join(tmpl_keys['pname'], tmpl_keys['r1name']),
                      res['resources']['repos'].keys())
        self.assertIn(os.path.join(tmpl_keys['pname'], tmpl_keys['r2name']),
                      res['resources']['repos'].keys())
        # Modify the ACL to verify repos ACL are updated
        resources = re.sub(
            'submit = group .*', 'submit = group %s' %
            os.path.join(tmpl_keys['pname'], tmpl_keys['g1name']), resources)
        self.set_resources_then_direct_push(fpath,
                                            resources=resources,
                                            mode='add')
        # Verify ACLs have been updated for both repo
        for r in ('r1name', 'r2name'):
            rname = os.path.join(tmpl_keys['pname'], tmpl_keys[r])
            acl = self.gu.g.get('access/?project=%s' % rname)
            self.assertIn(
                gid, acl[rname]['local']['refs/heads/*']['permissions']
                ['submit']['rules'].keys())
        # Now let's remove all that awesome resources
        self.set_resources_then_direct_push(fpath, mode='del')
        # Check resources have been deleted
        self.assertFalse(
            self.gu.project_exists(
                os.path.join(tmpl_keys['pname'], tmpl_keys['r1name'])))
        self.assertFalse(
            self.gu.project_exists(
                os.path.join(tmpl_keys['pname'], tmpl_keys['r2name'])))
        self.assertFalse(
            self.gu.get_group_id(
                os.path.join(tmpl_keys['pname'], tmpl_keys['g1name'])))
        self.assertFalse(
            self.gu.get_group_id(
                os.path.join(tmpl_keys['pname'], tmpl_keys['g2name'])))
        res = self.get_resources()
        projects = res['resources'].get('projects', {})
        acls = res['resources'].get('acls', {})
        groups = res['resources'].get('groups', {})
        repos = res['resources'].get('repos', {})
        self.assertNotIn(tmpl_keys['pname'], projects.keys())
        self.assertNotIn(tmpl_keys['aname'], acls.keys())
        self.assertNotIn(os.path.join(tmpl_keys['pname'], tmpl_keys['g1name']),
                         groups.keys())
        self.assertNotIn(os.path.join(tmpl_keys['pname'], tmpl_keys['g2name']),
                         groups.keys())
        self.assertNotIn(os.path.join(tmpl_keys['pname'], tmpl_keys['r1name']),
                         repos.keys())
        self.assertNotIn(os.path.join(tmpl_keys['pname'], tmpl_keys['r2name']),
                         repos.keys())
Example #52
0
    def test_check_project_test_workflow(self):
        """ Validate new project to test via zuul
        """
        # We want to create a project, provide project source
        # code with tests. We then configure zuul/jjb to handle the
        # run of the test cases. We then validate Gerrit has been
        # updated about the test results
        # We use the sample-project (that already exists)

        pname = 'test_workflow_%s' % create_random_str()
        logger.info("Creating project %s" % pname)

        # Create it
        self.create_project(pname)

        logger.info("Populating the project with %s" %
                    self.sample_project_dir)
        # Add the sample-project to the empty repository
        clone_dir = self.clone_as_admin(pname)
        copytree(self.sample_project_dir, clone_dir)
        self.commit_direct_push_as_admin(clone_dir, "Add the sample project")

        # Change to config/{zuul,jobs}/projects.yaml
        # in order to test the new project
        logger.info("Adding config-repo configuration")
        ycontent = file(os.path.join(
            self.config_clone_dir, "zuul/projects.yaml")).read()
        file(os.path.join(
            self.config_clone_dir, "zuul/projects.yaml"), 'w').write(
            ycontent.replace("zuul-demo", pname),
        )
        ycontent2 = load(file(os.path.join(
            self.config_clone_dir, "jobs/projects.yaml")).read())
        sp2 = copy.deepcopy(
            [p for p in ycontent2 if 'project' in p and
                p['project']['name'] == 'zuul-demo'][0])
        sp2['project']['name'] = pname
        ycontent2.append(sp2)
        file(os.path.join(
            self.config_clone_dir, "jobs/projects.yaml"), 'w').write(
            dump(ycontent2))

        # Send review (config-check) will be triggered
        logger.info("Submitting the config review")
        change_sha = self.push_review_as_admin(
            self.config_clone_dir,
            "Add config definition in Zuul/JJB config for %s" % pname)

        change_nr = self.gu.get_change_number(change_sha)

        logger.info("Waiting for verify +1 on change %d" % change_nr)
        self.assertEquals(self.gu.wait_for_verify(change_nr), 1)

        # review the config change as a member from the config-core group
        logger.info("Approving and waiting for verify +2")
        self.gu2.submit_change_note(change_nr, "current", "Code-Review", "2")
        self.gu2.submit_change_note(change_nr, "current", "Workflow", "1")

        for retry in xrange(60):
            jenkins_vote = self.gu.get_vote(change_nr, "Verified")
            if jenkins_vote == 2:
                break
            time.sleep(1)
        self.assertEquals(jenkins_vote, 2)

        # verify whether zuul merged the patch
        logger.info("Waiting for change to be merged")
        for retry in xrange(60):
            change_status = self.gu.get_info(change_nr)['status']
            if change_status == "MERGED":
                break
            time.sleep(1)
        self.assertEqual(change_status, 'MERGED')
        self.need_restore_config_repo = True

        logger.info("Waiting for config-update")
        config_update_log = self.ju.wait_for_config_update(change_sha)
        self.assertIn("Finished: SUCCESS", config_update_log)

        # Propose a change on a the repo and expect a Verified +1
        logger.info("Submiting a test change to %s" % pname)
        change_sha = self.gitu_admin.add_commit_and_publish(
            clone_dir, 'master', "Add useless file",
            self.un)

        change_nr = self.gu.get_change_number(change_sha)

        logger.info("Waiting for verify +1 on change %d" % change_nr)
        self.assertEquals(self.gu.wait_for_verify(change_nr), 1)

        # Update the change on a the repo and expect a Verified -1
        logger.info("Submiting a test change to %s suppose to fail" % pname)
        data = "#!/bin/bash\nexit 1\n"
        file(os.path.join(clone_dir, "run_tests.sh"), 'w').write(data)
        os.chmod(os.path.join(clone_dir, "run_tests.sh"), 0755)
        self.gitu_admin.add_commit_and_publish(
            clone_dir, "master", None, fnames=["run_tests.sh"])

        logger.info("Waiting for verify -1 on change %d" % change_nr)
        self.assertEquals(self.gu.wait_for_verify(change_nr), -1)

        logger.info("Validate jobs ran via the job api %s" % pname)
        # This piece of code is there by convenience ...
        # TODO: Should be moved in the job api tests file.
        # Test the manageSF jobs API: query per patch & revision
        change_ids = self.gu.get_my_changes_for_project(pname)
        self.assertGreater(len(change_ids), 0)
        change_id = change_ids[0]
        patch = self.gu.get_change_last_patchset(change_id)['_number']
        cookie = get_cookie(config.ADMIN_USER, config.ADMIN_PASSWORD)
        cookies = {"auth_pubtkt": cookie}
        base_url = config.GATEWAY_URL + "/manage/jobs/"
        for j in ["%s-functional-tests" % pname, "%s-unit-tests" % pname]:
            job = requests.get(base_url + '%s/?change=%s' % (j, patch),
                               cookies=cookies).json()
            self.assertTrue("jenkins" in job.keys(),
                            job)
            self.assertTrue(len(job["jenkins"]) > 1,
                            job)
    def test_check_project_test_workflow(self):
        """ Validate new project to test via zuul layout.yaml
        """
        # We want to create a project, provide project source
        # code with tests. We then configure zuul/jjb to handle the
        # run of the test cases. We then validate Gerrit has been
        # updated about the test results
        # We use the sample-project (that already exists)

        pname = 'test_workflow_%s' % create_random_str()
        # Be sure the project does not exist
        self.msu.deleteProject(pname,
                               config.ADMIN_USER)
        # Create it
        self.create_project(pname, config.ADMIN_USER)

        # Add the sample-project to the empty repository
        clone_dir = self.clone_as_admin(pname)
        copytree(self.sample_project_dir, clone_dir)
        self.commit_direct_push_as_admin(clone_dir, "Add the sample project")

        # Change to config/zuul/layout.yaml and jobs/projects.yaml
        # in order to test the new project
        ycontent = file(os.path.join(
            self.config_clone_dir, "zuul/projects.yaml")).read()
        file(os.path.join(
            self.config_clone_dir, "zuul/projects.yaml"), 'w').write(
            ycontent.replace("zuul-demo", pname),
        )
        ycontent2 = load(file(os.path.join(
            self.config_clone_dir, "jobs/projects.yaml")).read())
        sp2 = copy.deepcopy(
            [p for p in ycontent2 if 'project' in p and
                p['project']['name'] == 'zuul-demo'][0])
        sp2['project']['name'] = pname
        ycontent2.append(sp2)
        file(os.path.join(
            self.config_clone_dir, "jobs/projects.yaml"), 'w').write(
            dump(ycontent2))

        # Retrieve the previous build number for config-check
        last_success_build_num_ch = \
            self.ju.get_last_build_number("config-check",
                                          "lastSuccessfulBuild")
        # Retrieve the previous build number for config-update
        last_success_build_num_cu = \
            self.ju.get_last_build_number("config-update",
                                          "lastSuccessfulBuild")

        # Send review (config-check) will be triggered
        self.push_review_as_admin(
            self.config_clone_dir,
            "Add config definition in Zuul/JJB config for %s" % pname)

        # Wait for config-check to finish and verify the success
        self.ju.wait_till_job_completes("config-check",
                                        last_success_build_num_ch,
                                        "lastSuccessfulBuild")

        last_build_num_ch, last_success_build_num_ch = 0, 1
        attempt = 0
        while last_build_num_ch != last_success_build_num_ch:
            if attempt >= 90:
                break
            time.sleep(1)
            last_build_num_ch = \
                self.ju.get_last_build_number("config-check",
                                              "lastBuild")
            last_success_build_num_ch = \
                self.ju.get_last_build_number("config-check",
                                              "lastSuccessfulBuild")
            attempt += 1

        self.assertEqual(last_build_num_ch, last_success_build_num_ch)
        # let some time to Zuul to update the test result to Gerrit.
        time.sleep(2)

        # Get the change id
        change_ids = self.gu.get_my_changes_for_project("config")
        self.assertGreater(len(change_ids), 0)
        change_id = change_ids[0]

        # Check whether zuul sets verified to +1 after running the tests
        # let some time to Zuul to update the test result to Gerrit.
        self.assert_reviewer_approvals(change_id, '+1')

        # review the change
        self.gu2.submit_change_note(change_id, "current", "Code-Review", "2")
        self.gu2.submit_change_note(change_id, "current", "Workflow", "1")

        # now zuul processes gate pipeline and runs config-check job
        # Wait for config-check to finish and verify the success
        self.ju.wait_till_job_completes("config-check",
                                        last_success_build_num_ch,
                                        "lastSuccessfulBuild")

        last_build_num_ch, last_success_build_num_ch = 0, 1
        attempt = 0
        while last_build_num_ch != last_success_build_num_ch:
            if attempt >= 90:
                break
            time.sleep(1)
            last_build_num_ch = \
                self.ju.get_last_build_number("config-check",
                                              "lastBuild")
            last_success_build_num_ch = \
                self.ju.get_last_build_number("config-check",
                                              "lastSuccessfulBuild")
            attempt += 1

        self.assertEqual(last_build_num_ch, last_success_build_num_ch)

        # Check whether zuul sets verified to +2 after running the tests
        # let some time to Zuul to update the test result to Gerrit.
        self.assert_reviewer_approvals(change_id, '+2')

        # verify whether zuul merged the patch
        change = self.gu.get_change('config', 'master', change_id)
        change_status = change['status']
        attempt = 0
        while change_status != 'MERGED':
            if attempt >= 90:
                break
            time.sleep(1)
            change = self.gu.get_change('config', 'master', change_id)
            change_status = change['status']
            attempt += 1
        self.assertEqual(change_status, 'MERGED')

        # Test post pipe line
        # as the patch is merged, post pieline should run config-update job
        # Wait for config-update to finish and verify the success
        self.ju.wait_till_job_completes("config-update",
                                        last_success_build_num_cu,
                                        "lastSuccessfulBuild")
        last_build_num_cu = \
            self.ju.get_last_build_number("config-update",
                                          "lastBuild")
        last_success_build_num_cu = \
            self.ju.get_last_build_number("config-update",
                                          "lastSuccessfulBuild")
        self.assertEqual(last_build_num_cu, last_success_build_num_cu)

        # Retrieve the prev build number for pname-unit-tests
        # Retrieve the prev build number for pname-functional-tests
        last_success_build_num_sp_ut = \
            self.ju.get_last_build_number("%s-unit-tests" % pname,
                                          "lastSuccessfulBuild")
        last_success_build_num_sp_ft = \
            self.ju.get_last_build_number("%s-functional-tests" % pname,
                                          "lastSuccessfulBuild")
        # Test config-update
        # config-update should have created jobs for pname
        # Trigger tests on pname
        # Send a review and check tests has been run
        self.gitu_admin.add_commit_and_publish(
            clone_dir, 'master', "Add useless file",
            self.un)
        # Wait for pname-unit-tests to finish and verify the success
        self.ju.wait_till_job_completes("%s-unit-tests" % pname,
                                        last_success_build_num_sp_ut,
                                        "lastSuccessfulBuild")
        # Wait for pname-functional-tests to end and check the success
        self.ju.wait_till_job_completes("%s-functional-tests" % pname,
                                        last_success_build_num_sp_ft,
                                        "lastSuccessfulBuild")
        # Check the unit tests succeed
        last_build_num_sp_ut = \
            self.ju.get_last_build_number("%s-unit-tests" % pname,
                                          "lastBuild")
        last_success_build_num_sp_ut = \
            self.ju.get_last_build_number("%s-unit-tests" % pname,
                                          "lastSuccessfulBuild")
        self.assertEqual(last_build_num_sp_ut, last_success_build_num_sp_ut)
        # Check the functional tests succeed
        last_build_num_sp_ft = \
            self.ju.get_last_build_number("%s-functional-tests" % pname,
                                          "lastBuild")
        last_success_build_num_sp_ft = \
            self.ju.get_last_build_number("%s-functional-tests" % pname,
                                          "lastSuccessfulBuild")
        self.assertEqual(last_build_num_sp_ft, last_success_build_num_sp_ft)

        # Get the change id
        change_ids = self.gu.get_my_changes_for_project(pname)
        self.assertGreater(len(change_ids), 0)
        change_id = change_ids[0]

        # let some time to Zuul to update the test result to Gerrit.
        for i in range(90):
            if "jenkins" in self.gu.get_reviewers(change_id):
                break
            time.sleep(1)

        self.assert_reviewer_approvals(change_id, '+1')
Example #54
0
 def test_gerrit_hook(self):
     """test various commit messages triggering a hook"""
     for template, final_status in TEST_MSGS:
         pname = 'my_namespace/%s' % create_random_str()
         self._test_update_issue_hooks(template, final_status, pname)