Fix #16590: Allow only team groups to be owner (#16995)

This commit is contained in:
Mayur Singal 2024-07-11 14:17:13 +05:30 committed by GitHub
parent 8d739563f2
commit 4eadcfdc5d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 18 additions and 5 deletions

View File

@ -16,7 +16,7 @@ To be used by OpenMetadata class
from functools import lru_cache from functools import lru_cache
from typing import Optional, Type from typing import Optional, Type
from metadata.generated.schema.entity.teams.team import Team from metadata.generated.schema.entity.teams.team import Team, TeamType
from metadata.generated.schema.entity.teams.user import User from metadata.generated.schema.entity.teams.user import User
from metadata.generated.schema.type.entityReference import EntityReference from metadata.generated.schema.type.entityReference import EntityReference
from metadata.ingestion.api.common import T from metadata.ingestion.api.common import T
@ -153,6 +153,7 @@ class OMetaUserMixin:
from_count: int = 0, from_count: int = 0,
size: int = 1, size: int = 1,
fields: Optional[list] = None, fields: Optional[list] = None,
is_owner: bool = False,
) -> Optional[EntityReference]: ) -> Optional[EntityReference]:
""" """
Get a User or Team Entity Reference by searching by its name Get a User or Team Entity Reference by searching by its name
@ -172,6 +173,9 @@ class OMetaUserMixin:
entity=Team, name=name, from_count=from_count, size=size, fields=fields entity=Team, name=name, from_count=from_count, size=size, fields=fields
) )
if maybe_team: if maybe_team:
# if is_owner is True, we only want to return the team if it is a group
if is_owner and maybe_team.teamType != TeamType.Group:
return None
return EntityReference( return EntityReference(
id=maybe_team.id.root, id=maybe_team.id.root,
type=ENTITY_REFERENCE_TYPE_MAP[Team.__name__], type=ENTITY_REFERENCE_TYPE_MAP[Team.__name__],

View File

@ -540,7 +540,9 @@ class DatabaseServiceSource(
table_name=table_name, table_name=table_name,
schema=self.context.get().database_schema, schema=self.context.get().database_schema,
) )
owner_ref = self.metadata.get_reference_by_name(name=owner_name) owner_ref = self.metadata.get_reference_by_name(
name=owner_name, is_owner=True
)
return owner_ref return owner_ref
except Exception as exc: except Exception as exc:
logger.debug(traceback.format_exc()) logger.debug(traceback.format_exc())

View File

@ -151,7 +151,9 @@ class DbtSource(DbtServiceSource):
if manifest_node: if manifest_node:
dbt_owner = manifest_node.meta.get(DbtCommonEnum.OWNER.value) dbt_owner = manifest_node.meta.get(DbtCommonEnum.OWNER.value)
if dbt_owner: if dbt_owner:
owner = self.metadata.get_reference_by_name(name=dbt_owner) owner = self.metadata.get_reference_by_name(
name=dbt_owner, is_owner=True
)
if not owner: if not owner:
logger.warning( logger.warning(
"Unable to ingest owner from DBT since no user or" "Unable to ingest owner from DBT since no user or"

View File

@ -223,7 +223,7 @@ class OracleSource(StoredProcedureMixin, CommonDbSourceService):
code=stored_procedure.definition, code=stored_procedure.definition,
), ),
owner=self.metadata.get_reference_by_name( owner=self.metadata.get_reference_by_name(
name=stored_procedure.owner.lower() name=stored_procedure.owner.lower(), is_owner=True
), ),
databaseSchema=fqn.build( databaseSchema=fqn.build(
metadata=self.metadata, metadata=self.metadata,

View File

@ -411,7 +411,7 @@ class AirflowSource(PipelineServiceSource):
until the next run. until the next run.
""" """
try: try:
return self.metadata.get_reference_by_name(name=owner) return self.metadata.get_reference_by_name(name=owner, is_owner=True)
except Exception as exc: except Exception as exc:
logger.warning(f"Error while getting details of user {owner} - {exc}") logger.warning(f"Error while getting details of user {owner} - {exc}")
return None return None

View File

@ -184,3 +184,8 @@ class OMetaUserTest(TestCase):
self.team.id, self.team.id,
self.metadata.get_reference_by_name(name="OPS Team").id, self.metadata.get_reference_by_name(name="OPS Team").id,
) )
# if team is not group, return none
self.assertIsNone(
self.metadata.get_reference_by_name(name="Organization", is_owner=True)
)