add e2e test for additional teams and members
This commit is contained in:
		
							parent
							
								
									b6763b2275
								
							
						
					
					
						commit
						8bfc0d4d86
					
				| 
						 | 
				
			
			@ -126,6 +126,7 @@ class EndToEndTestCase(unittest.TestCase):
 | 
			
		|||
                         "api-service.yaml",
 | 
			
		||||
                         "infrastructure-roles.yaml",
 | 
			
		||||
                         "infrastructure-roles-new.yaml",
 | 
			
		||||
                         "custom-team-membership.yaml",
 | 
			
		||||
                         "e2e-storage-class.yaml"]:
 | 
			
		||||
            result = k8s.create_with_kubectl("manifests/" + filename)
 | 
			
		||||
            print("stdout: {}, stderr: {}".format(result.stdout, result.stderr))
 | 
			
		||||
| 
						 | 
				
			
			@ -174,6 +175,63 @@ class EndToEndTestCase(unittest.TestCase):
 | 
			
		|||
        self.eventuallyEqual(lambda: self.k8s.count_pods_with_container_capabilities(capabilities, cluster_label),
 | 
			
		||||
                             2, "Container capabilities not updated")
 | 
			
		||||
 | 
			
		||||
    @timeout_decorator.timeout(TEST_TIMEOUT_SEC)
 | 
			
		||||
    def test_additional_teams_and_members(self):
 | 
			
		||||
        '''
 | 
			
		||||
           Test PostgresTeam CRD with extra teams and members
 | 
			
		||||
        '''
 | 
			
		||||
        # enable PostgresTeam CRD and lower resync
 | 
			
		||||
        enable_postgres_team_crd = {
 | 
			
		||||
            "data": {
 | 
			
		||||
                "enable_postgres_team_crd": "true",
 | 
			
		||||
                "resync_period": "15s",
 | 
			
		||||
            },
 | 
			
		||||
        }
 | 
			
		||||
        self.k8s.update_config(enable_postgres_team_crd)
 | 
			
		||||
        self.eventuallyEqual(lambda: self.k8s.get_operator_state(), {"0": "idle"},
 | 
			
		||||
                             "Operator does not get in sync")
 | 
			
		||||
        
 | 
			
		||||
        self.k8s.api.custom_objects_api.patch_namespaced_custom_object(
 | 
			
		||||
        'acid.zalan.do', 'v1', 'default',
 | 
			
		||||
        'postgresteams', 'custom-team-membership',
 | 
			
		||||
        {
 | 
			
		||||
            'spec': {
 | 
			
		||||
                'additionalTeams': {
 | 
			
		||||
                    'acid': [
 | 
			
		||||
                        'e2e'
 | 
			
		||||
                    ]
 | 
			
		||||
                },
 | 
			
		||||
                'additionalMembers': {
 | 
			
		||||
                    'e2e': [
 | 
			
		||||
                        'kind'
 | 
			
		||||
                    ]
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        # make sure we let one sync pass and the new user being added
 | 
			
		||||
        time.sleep(15)
 | 
			
		||||
 | 
			
		||||
        leader = self.k8s.get_cluster_leader_pod('acid-minimal-cluster')
 | 
			
		||||
        user_query = """
 | 
			
		||||
            SELECT usename
 | 
			
		||||
              FROM pg_catalog.pg_user
 | 
			
		||||
             WHERE usename IN ('elephant', 'kind');
 | 
			
		||||
        """
 | 
			
		||||
        users = self.query_database(leader.metadata.name, "postgres", user_query)
 | 
			
		||||
        self.eventuallyEqual(lambda: len(users), 2, 
 | 
			
		||||
            "Not all additional users found in database: {}".format(users))
 | 
			
		||||
 | 
			
		||||
        # revert config change
 | 
			
		||||
        revert_resync = {
 | 
			
		||||
            "data": {
 | 
			
		||||
                "resync_period": "30m",
 | 
			
		||||
            },
 | 
			
		||||
        }
 | 
			
		||||
        self.k8s.update_config(revert_resync)
 | 
			
		||||
        self.eventuallyEqual(lambda: self.k8s.get_operator_state(), {"0": "idle"},
 | 
			
		||||
                             "Operator does not get in sync")
 | 
			
		||||
 | 
			
		||||
    @timeout_decorator.timeout(TEST_TIMEOUT_SEC)
 | 
			
		||||
    def test_overwrite_pooler_deployment(self):
 | 
			
		||||
        self.k8s.create_with_kubectl("manifests/minimal-fake-pooler-deployment.yaml")
 | 
			
		||||
| 
						 | 
				
			
			@ -332,54 +390,19 @@ class EndToEndTestCase(unittest.TestCase):
 | 
			
		|||
        # Verify that all the databases have pooler schema installed.
 | 
			
		||||
        # Do this via psql, since otherwise we need to deal with
 | 
			
		||||
        # credentials.
 | 
			
		||||
        dbList = []
 | 
			
		||||
        db_list = []
 | 
			
		||||
 | 
			
		||||
        leader = k8s.get_cluster_leader_pod('acid-minimal-cluster')
 | 
			
		||||
        dbListQuery = "select datname from pg_database"
 | 
			
		||||
        schemasQuery = """
 | 
			
		||||
        schemas_query = """
 | 
			
		||||
            select schema_name
 | 
			
		||||
            from information_schema.schemata
 | 
			
		||||
            where schema_name = 'pooler'
 | 
			
		||||
        """
 | 
			
		||||
        exec_query = r"psql -tAq -c \"{}\" -d {}"
 | 
			
		||||
 | 
			
		||||
        if leader:
 | 
			
		||||
            try:
 | 
			
		||||
                q = exec_query.format(dbListQuery, "postgres")
 | 
			
		||||
                q = "su postgres -c \"{}\"".format(q)
 | 
			
		||||
                print('Get databases: {}'.format(q))
 | 
			
		||||
                result = k8s.exec_with_kubectl(leader.metadata.name, q)
 | 
			
		||||
                dbList = clean_list(result.stdout.split(b'\n'))
 | 
			
		||||
                print('dbList: {}, stdout: {}, stderr {}'.format(
 | 
			
		||||
                    dbList, result.stdout, result.stderr
 | 
			
		||||
                ))
 | 
			
		||||
            except Exception as ex:
 | 
			
		||||
                print('Could not get databases: {}'.format(ex))
 | 
			
		||||
                print('Stdout: {}'.format(result.stdout))
 | 
			
		||||
                print('Stderr: {}'.format(result.stderr))
 | 
			
		||||
 | 
			
		||||
            for db in dbList:
 | 
			
		||||
                if db in ('template0', 'template1'):
 | 
			
		||||
                    continue
 | 
			
		||||
 | 
			
		||||
                schemas = []
 | 
			
		||||
                try:
 | 
			
		||||
                    q = exec_query.format(schemasQuery, db)
 | 
			
		||||
                    q = "su postgres -c \"{}\"".format(q)
 | 
			
		||||
                    print('Get schemas: {}'.format(q))
 | 
			
		||||
                    result = k8s.exec_with_kubectl(leader.metadata.name, q)
 | 
			
		||||
                    schemas = clean_list(result.stdout.split(b'\n'))
 | 
			
		||||
                    print('schemas: {}, stdout: {}, stderr {}'.format(
 | 
			
		||||
                        schemas, result.stdout, result.stderr
 | 
			
		||||
                    ))
 | 
			
		||||
                except Exception as ex:
 | 
			
		||||
                    print('Could not get databases: {}'.format(ex))
 | 
			
		||||
                    print('Stdout: {}'.format(result.stdout))
 | 
			
		||||
                    print('Stderr: {}'.format(result.stderr))
 | 
			
		||||
 | 
			
		||||
                self.assertNotEqual(len(schemas), 0)
 | 
			
		||||
        else:
 | 
			
		||||
            print('Could not find leader pod')
 | 
			
		||||
        db_list = self.list_databases(leader.metadata.name)
 | 
			
		||||
        for db in db_list:
 | 
			
		||||
            self.eventuallyNotEqual(lambda: len(self.query_database(leader.metadata.name, db, schemas_query)), 0, 
 | 
			
		||||
                "Pooler schema not found in database {}".format(db))
 | 
			
		||||
 | 
			
		||||
        # remove config section to make test work next time
 | 
			
		||||
        k8s.api.custom_objects_api.patch_namespaced_custom_object(
 | 
			
		||||
| 
						 | 
				
			
			@ -1219,6 +1242,60 @@ class EndToEndTestCase(unittest.TestCase):
 | 
			
		|||
        k8s.wait_for_pod_start('spilo-role=replica')
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
    def list_databases(self, pod_name):
 | 
			
		||||
        '''
 | 
			
		||||
           Get list of databases we might want to iterate over
 | 
			
		||||
        '''
 | 
			
		||||
        k8s = self.k8s
 | 
			
		||||
        result_set = []
 | 
			
		||||
        db_list = []
 | 
			
		||||
        db_list_query = "select datname from pg_database"
 | 
			
		||||
        exec_query = r"psql -tAq -c \"{}\" -d {}"
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            q = exec_query.format(db_list_query, "postgres")
 | 
			
		||||
            q = "su postgres -c \"{}\"".format(q)
 | 
			
		||||
            print('Get databases: {}'.format(q))
 | 
			
		||||
            result = k8s.exec_with_kubectl(pod_name, q)
 | 
			
		||||
            db_list = clean_list(result.stdout.split(b'\n'))
 | 
			
		||||
            print('db_list: {}, stdout: {}, stderr {}'.format(
 | 
			
		||||
                db_list, result.stdout, result.stderr
 | 
			
		||||
            ))
 | 
			
		||||
        except Exception as ex:
 | 
			
		||||
            print('Could not get databases: {}'.format(ex))
 | 
			
		||||
            print('Stdout: {}'.format(result.stdout))
 | 
			
		||||
            print('Stderr: {}'.format(result.stderr))
 | 
			
		||||
 | 
			
		||||
        for db in db_list:
 | 
			
		||||
            if db in ('template0', 'template1'):
 | 
			
		||||
                continue
 | 
			
		||||
            result_set.append(db)
 | 
			
		||||
 | 
			
		||||
        return result_set
 | 
			
		||||
 | 
			
		||||
    def query_database(self, pod_name, db_name, query):
 | 
			
		||||
        '''
 | 
			
		||||
           Query database and return result as a list
 | 
			
		||||
        '''
 | 
			
		||||
        k8s = self.k8s
 | 
			
		||||
        result_set = []
 | 
			
		||||
        exec_query = r"psql -tAq -c \"{}\" -d {}"
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            q = exec_query.format(query, db_name)
 | 
			
		||||
            q = "su postgres -c \"{}\"".format(q)
 | 
			
		||||
            print('Send query: {}'.format(q))
 | 
			
		||||
            result = k8s.exec_with_kubectl(pod_name, q)
 | 
			
		||||
            result_set = clean_list(result.stdout.split(b'\n'))
 | 
			
		||||
            print('result: {}, stdout: {}, stderr {}'.format(
 | 
			
		||||
                result_set, result.stdout, result.stderr
 | 
			
		||||
            ))
 | 
			
		||||
        except Exception as ex:
 | 
			
		||||
            print('Error on query execution: {}'.format(ex))
 | 
			
		||||
            print('Stdout: {}'.format(result.stdout))
 | 
			
		||||
            print('Stderr: {}'.format(result.stderr))
 | 
			
		||||
 | 
			
		||||
        return result_set
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    unittest.main()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -240,9 +240,10 @@ func (c *Cluster) getTeamMembers(teamID string) ([]string, error) {
 | 
			
		|||
 | 
			
		||||
	c.logger.Debugf("fetching possible additional team members for team %q", teamID)
 | 
			
		||||
	members := []string{}
 | 
			
		||||
	additionalMembers := []string{}
 | 
			
		||||
 | 
			
		||||
	if c.OpConfig.EnablePostgresTeamCRD && c.Config.PgTeamMap != nil {
 | 
			
		||||
		additionalMembers := []string{}
 | 
			
		||||
 | 
			
		||||
		for team, membership := range *c.Config.PgTeamMap {
 | 
			
		||||
			if team == teamID {
 | 
			
		||||
				additionalMembers = membership.AdditionalMembers
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -400,7 +400,6 @@ func (c *Controller) loadPostgresTeams() {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	c.pgTeamMap.Load(pgTeams)
 | 
			
		||||
	c.logger.Debugf("Internal Postgres Team Cache: %#v", c.pgTeamMap)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Controller) postgresTeamAdd(obj interface{}) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -94,6 +94,7 @@ func (ptm *PostgresTeamMap) GetAdditionalSuperuserTeams(team string, transitive
 | 
			
		|||
 | 
			
		||||
// Load function to import data from PostgresTeam CRD
 | 
			
		||||
func (ptm *PostgresTeamMap) Load(pgTeams *acidv1.PostgresTeamList) {
 | 
			
		||||
	// reset the team map
 | 
			
		||||
	var emptyTeamMap = make(PostgresTeamMap, 0)
 | 
			
		||||
	*ptm = emptyTeamMap
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue