diff --git a/README.md b/README.md index 1619fc3f79eb52..1b81324eea247e 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,7 @@ Here are the companies that have officially adopted DataHub. Please feel free to - [Experius](https://www.experius.nl) - [Geotab](https://www.geotab.com) - [Grofers](https://grofers.com) +- [Haibo Technology](https://www.botech.com.cn) - [hipages](https://hipages.com.au/) - [IOMED](https://iomed.health) - [Klarna](https://www.klarna.com) @@ -128,7 +129,8 @@ Here are the companies that have officially adopted DataHub. Please feel free to - [Uphold](https://uphold.com) - [Viasat](https://viasat.com) - [Wolt](https://wolt.com) -- [Haibo Technology](https://www.botech.com.cn) +- [Zynga](https://www.zynga.com) + ## Select Articles & Talks diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/corpuser/CorpUserType.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/corpuser/CorpUserType.java index 993f2060459c22..ae4fec4aee5769 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/corpuser/CorpUserType.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/corpuser/CorpUserType.java @@ -138,6 +138,9 @@ public CorpUser update(@Nonnull String urn, @Nonnull CorpUserUpdateInput input, private RecordTemplate mapCorpUserEditableInfo(CorpUserUpdateInput input, Optional existing) { CorpUserEditableInfo result = existing.orElseGet(() -> new CorpUserEditableInfo()); + if (input.getDisplayName() != null) { + result.setDisplayName(input.getDisplayName()); + } if (input.getAboutMe() != null) { result.setAboutMe(input.getAboutMe()); } @@ -162,6 +165,9 @@ private RecordTemplate mapCorpUserEditableInfo(CorpUserUpdateInput input, Option if (input.getEmail() != null) { result.setEmail(input.getEmail()); } + if (input.getTitle() != null) { + result.setTitle(input.getTitle()); + } return result; } diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/corpuser/mappers/CorpUserEditableInfoMapper.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/corpuser/mappers/CorpUserEditableInfoMapper.java index 8e6ddfcbaab6bf..2a9f0efd69bcc8 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/corpuser/mappers/CorpUserEditableInfoMapper.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/corpuser/mappers/CorpUserEditableInfoMapper.java @@ -21,6 +21,8 @@ public static CorpUserEditableProperties map(@Nonnull final com.linkedin.identit @Override public CorpUserEditableProperties apply(@Nonnull final com.linkedin.identity.CorpUserEditableInfo info) { final CorpUserEditableProperties result = new CorpUserEditableProperties(); + result.setDisplayName(info.getDisplayName()); + result.setTitle(info.getTitle()); result.setAboutMe(info.getAboutMe()); result.setSkills(info.getSkills()); result.setTeams(info.getTeams()); diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/corpuser/mappers/CorpUserPropertiesMapper.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/corpuser/mappers/CorpUserPropertiesMapper.java index c64406a74733bc..1b42121962e46f 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/corpuser/mappers/CorpUserPropertiesMapper.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/corpuser/mappers/CorpUserPropertiesMapper.java @@ -21,6 +21,8 @@ public static CorpUserProperties map(@Nonnull final com.linkedin.identity.CorpUs @Override public CorpUserProperties apply(@Nonnull final com.linkedin.identity.CorpUserInfo info) { final CorpUserProperties result = new CorpUserProperties(); + result.setDisplayName(info.getDisplayName()); + result.setTitle(info.getTitle()); result.setActive(info.isActive()); result.setCountryCode(info.getCountryCode()); result.setDepartmentId(info.getDepartmentId()); diff --git a/datahub-graphql-core/src/main/resources/entity.graphql b/datahub-graphql-core/src/main/resources/entity.graphql index 8b8ddc5c5516af..a75181c78c4133 100644 --- a/datahub-graphql-core/src/main/resources/entity.graphql +++ b/datahub-graphql-core/src/main/resources/entity.graphql @@ -2217,6 +2217,16 @@ Deprecated, use CorpUserEditableProperties instead Additional read write info about a user """ type CorpUserEditableInfo { + """ + Display name to show on DataHub + """ + displayName: String + + """ + Title to show on DataHub + """ + title: String + """ About me section of the user """ @@ -2242,6 +2252,16 @@ type CorpUserEditableInfo { Additional read write properties about a user """ type CorpUserEditableProperties { + """ + Display name to show on DataHub + """ + displayName: String + + """ + Title to show on DataHub + """ + title: String + """ About me section of the user """ @@ -2283,6 +2303,16 @@ type CorpUserEditableProperties { Arguments provided to update a CorpUser Entity """ input CorpUserUpdateInput { + """ + Display name to show on DataHub + """ + displayName: String + + """ + Title to show on DataHub + """ + title: String + """ About me section of the user """ diff --git a/datahub-web-react/src/app/shared/tags/AddTagTermModal.tsx b/datahub-web-react/src/app/shared/tags/AddTagTermModal.tsx index 3c300f45cdcfb0..66f6d376e4c50d 100644 --- a/datahub-web-react/src/app/shared/tags/AddTagTermModal.tsx +++ b/datahub-web-react/src/app/shared/tags/AddTagTermModal.tsx @@ -3,7 +3,15 @@ import { message, Button, Modal, Select, Typography } from 'antd'; import styled from 'styled-components'; import { useGetSearchResultsLazyQuery } from '../../../graphql/search.generated'; -import { GlobalTags, EntityType, GlossaryTerms, SubResourceType, SearchResult } from '../../../types.generated'; +import { + GlobalTags, + EntityType, + GlossaryTerms, + SubResourceType, + SearchResult, + Tag, + GlossaryTerm, +} from '../../../types.generated'; import CreateTagModal from './CreateTagModal'; import { useEntityRegistry } from '../../useEntityRegistry'; import { IconStyleType } from '../../entity/Entity'; @@ -75,15 +83,15 @@ export default function AddTagTermModal({ const entityRegistry = useEntityRegistry(); const [addTagMutation] = useAddTagMutation(); const [addTermMutation] = useAddTermMutation(); - const [tagSearch, { data: tagSearchData }] = useGetSearchResultsLazyQuery(); - const tagSearchResults = tagSearchData?.search?.searchResults || []; + const [tagTermSearch, { data: tagTermSearchData }] = useGetSearchResultsLazyQuery(); + const tagSearchResults = tagTermSearchData?.search?.searchResults || []; const handleSearch = (text: string) => { if (text.length > 0) { - tagSearch({ + tagTermSearch({ variables: { input: { - type: EntityType.Tag, + type, query: text, start: 0, count: 10, @@ -94,7 +102,10 @@ export default function AddTagTermModal({ }; const renderSearchResult = (result: SearchResult) => { - const displayName = entityRegistry.getDisplayName(result.entity.type, result.entity); + const displayName = + result.entity.type === EntityType.Tag + ? (result.entity as Tag).name + : (result.entity as GlossaryTerm).hierarchicalName; const item = renderItem( displayName, entityRegistry.getIcon(result.entity.type, 14, IconStyleType.ACCENT), @@ -137,7 +148,7 @@ export default function AddTagTermModal({ } if (selectedType === EntityType.GlossaryTerm) { mutation = addTermMutation; - if (glossaryTerms?.terms?.some((term) => term.term.name === selectedName)) { + if (glossaryTerms?.terms?.some((term) => term.term.hierarchicalName === selectedName)) { onClose(); return; } diff --git a/datahub-web-react/src/graphql/search.graphql b/datahub-web-react/src/graphql/search.graphql index 5adb5b14f0fbb6..fd641b4cfaae22 100644 --- a/datahub-web-react/src/graphql/search.graphql +++ b/datahub-web-react/src/graphql/search.graphql @@ -218,6 +218,7 @@ fragment searchResults on SearchResults { } ... on GlossaryTerm { name + hierarchicalName glossaryTermInfo { definition termSource diff --git a/datahub-web-react/src/images/datahub-logo-color-loading_pendulum.svg b/datahub-web-react/src/images/datahub-logo-color-loading_pendulum.svg index 06fe3b28ac70d8..97908866015a3e 100644 --- a/datahub-web-react/src/images/datahub-logo-color-loading_pendulum.svg +++ b/datahub-web-react/src/images/datahub-logo-color-loading_pendulum.svg @@ -1,48 +1,63 @@ - - - - + + + - - - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + - - - + + + + - - - - - + + + + \ No newline at end of file diff --git a/datahub-web-react/src/images/datahub-logo-color-loading_satellite.svg b/datahub-web-react/src/images/datahub-logo-color-loading_satellite.svg new file mode 100644 index 00000000000000..dc14931c5dfba7 --- /dev/null +++ b/datahub-web-react/src/images/datahub-logo-color-loading_satellite.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-website/src/components/Logos.js b/docs-website/src/components/Logos.js index 5cda6fad29c566..0edb0cfa1456c4 100644 --- a/docs-website/src/components/Logos.js +++ b/docs-website/src/components/Logos.js @@ -21,6 +21,11 @@ const companyLogos = [ imageUrl: "/img/logos/companies/saxobank.svg", size: "default", }, + { + name: "Zynga", + imageUrl: "/img/logos/companies/zynga.png", + size: "default", + }, { name: "Grofers", imageUrl: "/img/logos/companies/grofers.png", @@ -181,6 +186,10 @@ const platformLogos = [ name: "Superset", imageUrl: "/img/logos/platforms/superset.svg", }, + { + name: "Tableau", + imageUrl: "/img/logos/platforms/tableau.png", + }, { name: "Teradata", imageUrl: "/img/logos/platforms/teradata.svg", diff --git a/docs-website/static/img/logos/companies/zynga.png b/docs-website/static/img/logos/companies/zynga.png new file mode 100644 index 00000000000000..aaee6f79ff6121 Binary files /dev/null and b/docs-website/static/img/logos/companies/zynga.png differ diff --git a/docs-website/static/img/logos/platforms/tableau.png b/docs-website/static/img/logos/platforms/tableau.png new file mode 100644 index 00000000000000..d13ad82f8eb430 Binary files /dev/null and b/docs-website/static/img/logos/platforms/tableau.png differ diff --git a/metadata-ingestion/setup.py b/metadata-ingestion/setup.py index 063310bd56123b..601bc4d601a02a 100644 --- a/metadata-ingestion/setup.py +++ b/metadata-ingestion/setup.py @@ -127,8 +127,8 @@ def get_long_description(): "lookml": looker_common | {"lkml>=1.1.2", "sql-metadata==2.2.2", "sqllineage==1.3.3"}, "metabase": {"requests", "sqllineage==1.3.3"}, - "mode": {"requests", "sqllineage==1.3.3"}, - "mongodb": {"pymongo>=3.11"}, + "mode": {"requests", "sqllineage==1.3.3", "tenacity>=8.0.1"}, + "mongodb": {"pymongo>=3.11", "packaging"}, "mssql": sql_common | {"sqlalchemy-pytds>=0.3"}, "mssql-odbc": sql_common | {"pyodbc"}, "mysql": sql_common | {"pymysql>=1.0.2"}, @@ -141,16 +141,16 @@ def get_long_description(): "redshift": sql_common | {"sqlalchemy-redshift", "psycopg2-binary", "GeoAlchemy2", "sqllineage==1.3.3"}, "redshift-usage": sql_common - | {"sqlalchemy-redshift", "psycopg2-binary", "GeoAlchemy2"}, + | {"sqlalchemy-redshift", "psycopg2-binary", "GeoAlchemy2", "sqllineage==1.3.3"}, "sagemaker": aws_common, "snowflake": snowflake_common, "snowflake-usage": snowflake_common | {"more-itertools>=8.12.0"}, "sqlalchemy": sql_common, - "superset": {"requests"}, + "superset": {"requests", "sqlalchemy", "great_expectations"}, "tableau": {"tableauserverclient>=0.17.0"}, "trino": sql_common | {"trino"}, "starburst-trino-usage": sql_common | {"trino"}, - "nifi": {"requests"}, + "nifi": {"requests", "packaging"}, } all_exclude_plugins: Set[str] = { diff --git a/metadata-ingestion/source_docs/kafka.md b/metadata-ingestion/source_docs/kafka.md index 1f6b790e3554de..f14ea4b23ee448 100644 --- a/metadata-ingestion/source_docs/kafka.md +++ b/metadata-ingestion/source_docs/kafka.md @@ -69,6 +69,23 @@ sink: # sink configs ``` +If you are trying to add domains to your topics you can use a configuration like below. + +```yml +source: + type: "kafka" + config: + # ...connection block + domain: + "urn:li:domain:13ae4d85-d955-49fc-8474-9004c663a810": + allow: + - ".*" + "urn:li:domain:d6ec9868-6736-4b1f-8aa6-fee4c5948f17": + deny: + - ".*" +``` + +Note that the `domain` in config above can be either an _urn_ or a domain _id_ (i.e. `urn:li:domain:13ae4d85-d955-49fc-8474-9004c663a810` or simply `13ae4d85-d955-49fc-8474-9004c663a810`). The Domain should exist in your DataHub instance before ingesting data into the Domain. To create a Domain on DataHub, check out the [Domains User Guide](https://datahubproject.io/docs/domains/). ## Config details @@ -84,9 +101,9 @@ Note that a `.` is used to denote nested fields in the YAML recipe. | `topic_patterns.allow` | | | List of regex patterns for topics to include in ingestion. | | `topic_patterns.deny` | | | List of regex patterns for topics to exclude from ingestion. | | `topic_patterns.ignoreCase` | | `True` | Whether to ignore case sensitivity during pattern matching. | -| `domain.domain_key.allow` | | | List of regex patterns for topics to set domain_key domain key. There can be multiple domain key specified. | -| `domain.domain_key.deny` | | | List of regex patterns for topics to not assign domain_key. There can be multiple domain key specified. | -| `domain.domain_key.ignoreCase` | | `True` | Whether to ignore case sensitivity during pattern matching.There can be multiple domain key specified. | +| `domain.domain_urn.allow` | | | List of regex patterns for topics to set domain_urn domain key. There can be multiple domain key specified. | +| `domain.domain_urn.deny` | | | List of regex patterns for topics to not assign domain_urn. There can be multiple domain key specified. | +| `domain.domain_urn.ignoreCase` | | `True` | Whether to ignore case sensitivity during pattern matching.There can be multiple domain key specified. | The options in the consumer config and schema registry config are passed to the Kafka DeserializingConsumer and SchemaRegistryClient respectively. diff --git a/metadata-ingestion/source_docs/postgres.md b/metadata-ingestion/source_docs/postgres.md index 32555cfb835649..b67f8da8ff3b29 100644 --- a/metadata-ingestion/source_docs/postgres.md +++ b/metadata-ingestion/source_docs/postgres.md @@ -16,10 +16,10 @@ This plugin extracts the following: - database_alias (optional) can be used to change the name of database to be ingested - Table, row, and column statistics via optional [SQL profiling](./sql_profiles.md) -| Capability | Status | Details | -|-------------------|--------|------------------------------------------| -| Data Containers | ✔️ | | -| Data Domains | ✔️ | [link](../../docs/domains.md) | +| Capability | Status | Details | +| --------------- | ------ | ----------------------------- | +| Data Containers | ✔️ | | +| Data Domains | ✔️ | [link](../../docs/domains.md) | ## Quickstart recipe @@ -53,10 +53,10 @@ Note that a `.` is used to denote nested fields in the YAML recipe. As a SQL-based service, the Athena integration is also supported by our SQL profiler. See [here](./sql_profiles.md) for more details on configuration. | Field | Required | Default | Description | -|--------------------------------|----------|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| ------------------------------ | -------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `username` | | | PostgreSQL username. | | `password` | | | PostgreSQL password. | -| `host_port` | ✅ | | PostgreSQL host URL. | +| `host_port` | ✅ | | PostgreSQL host URL. | | `database` | | | PostgreSQL database. | | `database_alias` | | | Alias to apply to database when ingesting. | | `env` | | `"PROD"` | Environment to use in namespace when constructing URNs. | diff --git a/metadata-ingestion/src/datahub/ingestion/source/sql/bigquery.py b/metadata-ingestion/src/datahub/ingestion/source/sql/bigquery.py index 1cae97f2ad2a9c..e1a6d204edb494 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/sql/bigquery.py +++ b/metadata-ingestion/src/datahub/ingestion/source/sql/bigquery.py @@ -317,6 +317,7 @@ def _compute_big_query_lineage(self) -> None: ) def _compute_bigquery_lineage_via_gcp_logging(self) -> None: + logger.info("Populating lineage info via GCP audit logs") try: _clients: List[GCPLoggingClient] = self._make_bigquery_client() log_entries: Iterable[AuditLogEntry] = self._get_bigquery_log_entries( @@ -333,6 +334,7 @@ def _compute_bigquery_lineage_via_gcp_logging(self) -> None: ) def _compute_bigquery_lineage_via_exported_bigquery_audit_metadata(self) -> None: + logger.info("Populating lineage info via exported GCP audit logs") try: _client: BigQueryClient = BigQueryClient(project=self.config.project_id) exported_bigquery_audit_metadata: Iterable[ @@ -441,11 +443,15 @@ def _get_exported_bigquery_audit_metadata( def _parse_bigquery_log_entries( self, entries: Iterable[AuditLogEntry] ) -> Iterable[QueryEvent]: + num_total_log_entries: int = 0 + num_parsed_log_entires: int = 0 for entry in entries: + num_total_log_entries += 1 event: Optional[QueryEvent] = None try: if QueryEvent.can_parse_entry(entry): event = QueryEvent.from_entry(entry) + num_parsed_log_entires += 1 else: raise RuntimeError("Unable to parse log entry as QueryEvent.") except Exception as e: @@ -456,6 +462,10 @@ def _parse_bigquery_log_entries( logger.error("Unable to parse GCP log entry.", e) if event is not None: yield event + logger.info( + f"Parsing BigQuery log entries: Number of log entries scanned={num_total_log_entries}, " + f"number of log entries successfully parsed={num_parsed_log_entires}" + ) def _parse_exported_bigquery_audit_metadata( self, audit_metadata_rows: Iterable[BigQueryAuditMetadata] @@ -482,18 +492,29 @@ def _parse_exported_bigquery_audit_metadata( def _create_lineage_map(self, entries: Iterable[QueryEvent]) -> Dict[str, Set[str]]: lineage_map: Dict[str, Set[str]] = collections.defaultdict(set) + num_entries: int = 0 + num_skipped_entries: int = 0 for e in entries: + num_entries += 1 if ( e.destinationTable is None or e.destinationTable.is_anonymous() or not e.referencedTables ): + num_skipped_entries += 1 continue + entry_consumed: bool = False for ref_table in e.referencedTables: destination_table_str = str(e.destinationTable.remove_extras()) ref_table_str = str(ref_table.remove_extras()) if ref_table_str != destination_table_str: lineage_map[destination_table_str].add(ref_table_str) + entry_consumed = True + if not entry_consumed: + num_skipped_entries += 1 + logger.info( + f"Creating lineage map: total number of entries={num_entries}, number skipped={num_skipped_entries}." + ) return lineage_map def get_latest_partition( diff --git a/metadata-ingestion/src/datahub/ingestion/source/sql/oracle.py b/metadata-ingestion/src/datahub/ingestion/source/sql/oracle.py index 0a2d18fbe3b4b9..296a46d4c4be8f 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/sql/oracle.py +++ b/metadata-ingestion/src/datahub/ingestion/source/sql/oracle.py @@ -1,10 +1,12 @@ -from typing import Optional +from typing import Iterable, Optional from unittest.mock import patch # This import verifies that the dependencies are available. import cx_Oracle # noqa: F401 import pydantic +from sqlalchemy import event from sqlalchemy.dialects.oracle.base import OracleDialect +from sqlalchemy.engine.reflection import Inspector from datahub.ingestion.source.sql.sql_common import ( BasicSQLAlchemyConfig, @@ -21,6 +23,19 @@ assert OracleDialect.ischema_names +def output_type_handler(cursor, name, defaultType, size, precision, scale): + """Add CLOB and BLOB support to Oracle connection.""" + + if defaultType == cx_Oracle.CLOB: + return cursor.var(cx_Oracle.LONG_STRING, arraysize=cursor.arraysize) + elif defaultType == cx_Oracle.BLOB: + return cursor.var(cx_Oracle.LONG_BINARY, arraysize=cursor.arraysize) + + +def before_cursor_execute(conn, cursor, statement, parameters, context, executemany): + cursor.outputtypehandler = output_type_handler + + class OracleConfig(BasicSQLAlchemyConfig): # defaults scheme = "oracle+cx_oracle" @@ -52,6 +67,13 @@ def create(cls, config_dict, ctx): config = OracleConfig.parse_obj(config_dict) return cls(config, ctx) + def get_inspectors(self) -> Iterable[Inspector]: + for inspector in super().get_inspectors(): + event.listen( + inspector.engine, "before_cursor_execute", before_cursor_execute + ) + yield inspector + def get_workunits(self): with patch.dict( "sqlalchemy.dialects.oracle.base.OracleDialect.ischema_names", diff --git a/metadata-ingestion/src/datahub/ingestion/source/sql/postgres.py b/metadata-ingestion/src/datahub/ingestion/source/sql/postgres.py index dedbb95a859e48..d18a4ce3f7382b 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/sql/postgres.py +++ b/metadata-ingestion/src/datahub/ingestion/source/sql/postgres.py @@ -9,6 +9,7 @@ # https://geoalchemy-2.readthedocs.io/en/latest/core_tutorial.html#reflecting-tables. from geoalchemy2 import Geometry # noqa: F401 +from datahub.configuration.common import AllowDenyPattern from datahub.ingestion.source.sql.sql_common import ( BasicSQLAlchemyConfig, SQLAlchemySource, @@ -29,6 +30,7 @@ class PostgresConfig(BasicSQLAlchemyConfig): # defaults scheme = "postgresql+psycopg2" + schema_pattern = AllowDenyPattern(deny=["information_schema"]) def get_identifier(self: BasicSQLAlchemyConfig, schema: str, table: str) -> str: regular = f"{schema}.{table}" diff --git a/metadata-models/src/main/pegasus/com/linkedin/identity/CorpUserEditableInfo.pdl b/metadata-models/src/main/pegasus/com/linkedin/identity/CorpUserEditableInfo.pdl index 782a2723075a56..c2a2f384c3e986 100644 --- a/metadata-models/src/main/pegasus/com/linkedin/identity/CorpUserEditableInfo.pdl +++ b/metadata-models/src/main/pegasus/com/linkedin/identity/CorpUserEditableInfo.pdl @@ -41,6 +41,16 @@ record CorpUserEditableInfo { */ pictureLink: Url = "https://raw.githubusercontent.com/linkedin/datahub/master/datahub-web-react/src/images/default_avatar.png" + /** + * DataHub-native display name + */ + displayName: optional string + + /** + * DataHub-native Title, e.g. 'Software Engineer' + */ + title: optional string + /** * Slack handle for the user */ diff --git a/metadata-service/restli-api/src/main/snapshot/com.linkedin.entity.aspects.snapshot.json b/metadata-service/restli-api/src/main/snapshot/com.linkedin.entity.aspects.snapshot.json index 2fcd7010882c6e..bb456a342ad140 100644 --- a/metadata-service/restli-api/src/main/snapshot/com.linkedin.entity.aspects.snapshot.json +++ b/metadata-service/restli-api/src/main/snapshot/com.linkedin.entity.aspects.snapshot.json @@ -1674,6 +1674,16 @@ "type" : "com.linkedin.common.Url", "doc" : "A URL which points to a picture which user wants to set as a profile photo", "default" : "https://raw.githubusercontent.com/linkedin/datahub/master/datahub-web-react/src/images/default_avatar.png" + }, { + "name" : "displayName", + "type" : "string", + "doc" : "DataHub-native display name", + "optional" : true + }, { + "name" : "title", + "type" : "string", + "doc" : "DataHub-native Title, e.g. 'Software Engineer'", + "optional" : true }, { "name" : "slack", "type" : "string", diff --git a/metadata-service/restli-api/src/main/snapshot/com.linkedin.entity.entities.snapshot.json b/metadata-service/restli-api/src/main/snapshot/com.linkedin.entity.entities.snapshot.json index fadc939f9efe7f..3cf63c064f0878 100644 --- a/metadata-service/restli-api/src/main/snapshot/com.linkedin.entity.entities.snapshot.json +++ b/metadata-service/restli-api/src/main/snapshot/com.linkedin.entity.entities.snapshot.json @@ -2098,6 +2098,16 @@ "type" : "com.linkedin.common.Url", "doc" : "A URL which points to a picture which user wants to set as a profile photo", "default" : "https://raw.githubusercontent.com/linkedin/datahub/master/datahub-web-react/src/images/default_avatar.png" + }, { + "name" : "displayName", + "type" : "string", + "doc" : "DataHub-native display name", + "optional" : true + }, { + "name" : "title", + "type" : "string", + "doc" : "DataHub-native Title, e.g. 'Software Engineer'", + "optional" : true }, { "name" : "slack", "type" : "string", diff --git a/metadata-service/restli-api/src/main/snapshot/com.linkedin.entity.runs.snapshot.json b/metadata-service/restli-api/src/main/snapshot/com.linkedin.entity.runs.snapshot.json index b8f7949451150b..5194206d2e2f21 100644 --- a/metadata-service/restli-api/src/main/snapshot/com.linkedin.entity.runs.snapshot.json +++ b/metadata-service/restli-api/src/main/snapshot/com.linkedin.entity.runs.snapshot.json @@ -1431,6 +1431,16 @@ "type" : "com.linkedin.common.Url", "doc" : "A URL which points to a picture which user wants to set as a profile photo", "default" : "https://raw.githubusercontent.com/linkedin/datahub/master/datahub-web-react/src/images/default_avatar.png" + }, { + "name" : "displayName", + "type" : "string", + "doc" : "DataHub-native display name", + "optional" : true + }, { + "name" : "title", + "type" : "string", + "doc" : "DataHub-native Title, e.g. 'Software Engineer'", + "optional" : true }, { "name" : "slack", "type" : "string", diff --git a/smoke-test/tests/cypress/cypress/integration/mutations/mutations.js b/smoke-test/tests/cypress/cypress/integration/mutations/mutations.js index a8ba4afc192d45..e2df2710c26c0b 100644 --- a/smoke-test/tests/cypress/cypress/integration/mutations/mutations.js +++ b/smoke-test/tests/cypress/cypress/integration/mutations/mutations.js @@ -15,6 +15,10 @@ describe('mutations', () => { cy.contains(/Create$/).click(); + // wait a breath for elasticsearch to index the tag being applied to the dataset- if we navigate too quick ES + // wont know and we'll see applied to 0 entities + cy.wait(2000); + // go to tag page cy.get('a[href="/tag/urn:li:tag:CypressTestAddTag"]').click();