diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index a0bd4fdc1ae..bf9898130de 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -31,17 +31,27 @@ on:
- tagscanarymerge
- fixlabels
- interceptapis
- - mlh-965
- - mlh-498-use-spec-store-master
+ - tags_intg_test
jobs:
build:
-
runs-on: ubuntu-latest
+
+ # Add permissions for Docker
+ permissions:
+ contents: read
+ packages: write
steps:
- uses: actions/checkout@v3
+
+ # Set up Docker
+ - name: Set up Docker
+ uses: docker/setup-buildx-action@v2
+ with:
+ driver-opts: image=moby/buildkit:master
+ install: true
- name: Set up JDK 17
uses: actions/setup-java@v1
@@ -51,6 +61,12 @@ jobs:
- name: Print JDK version
run: java -version
+ # Verify Docker is available
+ - name: Verify Docker
+ run: |
+ docker --version
+ docker info
+
- name: Cache Maven packages
uses: actions/cache@v3
with:
@@ -78,6 +94,16 @@ jobs:
echo "build without dashboard"
chmod +x ./build.sh && ./build.sh
+ - name: Run Integration Tests
+ env:
+ # Configure Testcontainers for GitHub Actions
+ TESTCONTAINERS_RYUK_DISABLED: true
+ TESTCONTAINERS_CHECKS_DISABLE: true
+ DOCKER_HOST: unix:///var/run/docker.sock
+ run: |
+ echo "Running integration tests..."
+ chmod +x ./run-integration-tests.sh && ./run-integration-tests.sh
+
- name: Get Repository Name
run: echo "REPOSITORY_NAME=`echo "$GITHUB_REPOSITORY" | awk -F / '{print $2}' | sed -e "s/:refs//"`" >> $GITHUB_ENV
shell: bash
diff --git a/build.sh b/build.sh
index 074b7060add..f6fa5acd02d 100755
--- a/build.sh
+++ b/build.sh
@@ -23,7 +23,7 @@ unzip -o keycloak-15.0.2.1.zip -d ~/.m2/repository/org
echo "Maven Building"
-mvn -Dmaven.test.skip -DskipTests -Drat.skip=true -DskipOverlay -DskipEnunciate=true package -Pdist
+mvn -Dmaven.test.skip -DskipTests -Drat.skip=true -DskipOverlay -DskipEnunciate=true install -Pdist
echo "[DEBUG listing distro/target"
ls distro/target
diff --git a/common/src/main/java/org/apache/atlas/service/redis/AbstractRedisService.java b/common/src/main/java/org/apache/atlas/service/redis/AbstractRedisService.java
index 2d7372279c3..491d733edc9 100644
--- a/common/src/main/java/org/apache/atlas/service/redis/AbstractRedisService.java
+++ b/common/src/main/java/org/apache/atlas/service/redis/AbstractRedisService.java
@@ -32,6 +32,7 @@ public abstract class AbstractRedisService implements RedisService {
private static final String ATLAS_REDIS_LOCK_WAIT_TIME_MS = "atlas.redis.lock.wait_time.ms";
private static final String ATLAS_REDIS_LOCK_WATCHDOG_TIMEOUT_MS = "atlas.redis.lock.watchdog_timeout.ms";
private static final String ATLAS_REDIS_LEASE_TIME_MS = "atlas.redis.lease_time.ms";
+ private static final String CHECK_SENTINELS_LIST = "atlas.redis.sentinel.check_list.enabled";
private static final int DEFAULT_REDIS_WAIT_TIME_MS = 15_000;
private static final int DEFAULT_REDIS_LOCK_WATCHDOG_TIMEOUT_MS = 600_000;
private static final int DEFAULT_REDIS_LEASE_TIME_MS = 60_000;
@@ -48,6 +49,7 @@ public abstract class AbstractRedisService implements RedisService {
long waitTimeInMS;
long leaseTimeInMS;
long watchdogTimeoutInMS;
+ boolean checkSentinelsList;
// Inner class to track lock information
private static class LockInfo {
@@ -255,7 +257,7 @@ Config getCacheImplConfig() {
config.useSentinelServers()
.setClientName(ATLAS_METASTORE_SERVICE+"-redisCache")
.setReadMode(ReadMode.MASTER_SLAVE)
- .setCheckSentinelsList(false)
+ .setCheckSentinelsList(checkSentinelsList)
.setKeepAlive(true)
.setMasterConnectionMinimumIdleSize(10)
.setMasterConnectionPoolSize(20)
diff --git a/common/src/main/java/org/apache/atlas/service/redis/RedisServiceImpl.java b/common/src/main/java/org/apache/atlas/service/redis/RedisServiceImpl.java
index 1f1c97c4923..baacba46792 100644
--- a/common/src/main/java/org/apache/atlas/service/redis/RedisServiceImpl.java
+++ b/common/src/main/java/org/apache/atlas/service/redis/RedisServiceImpl.java
@@ -1,22 +1,24 @@
package org.apache.atlas.service.redis;
import org.apache.atlas.AtlasException;
-import org.apache.atlas.annotation.ConditionalOnAtlasProperty;
import org.redisson.Redisson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
-@ConditionalOnAtlasProperty(property = "atlas.redis.service.impl")
+@Profile("!local")
public class RedisServiceImpl extends AbstractRedisService{
private static final Logger LOG = LoggerFactory.getLogger(RedisServiceImpl.class);
@PostConstruct
public void init() throws AtlasException {
+ LOG.info("Initializing RedisServiceImpl");
+
redisClient = Redisson.create(getProdConfig());
redisCacheClient = Redisson.create(getCacheImplConfig());
LOG.debug("Sentinel redis client created successfully.");
diff --git a/common/src/main/java/org/apache/atlas/service/redis/RedisServiceLocalImpl.java b/common/src/main/java/org/apache/atlas/service/redis/RedisServiceLocalImpl.java
index c69a151a7d2..0ca4cf6eb3c 100644
--- a/common/src/main/java/org/apache/atlas/service/redis/RedisServiceLocalImpl.java
+++ b/common/src/main/java/org/apache/atlas/service/redis/RedisServiceLocalImpl.java
@@ -1,22 +1,24 @@
package org.apache.atlas.service.redis;
import org.apache.atlas.AtlasException;
-import org.apache.atlas.annotation.ConditionalOnAtlasProperty;
import org.redisson.Redisson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
-@ConditionalOnAtlasProperty(property = "atlas.redis.service.impl")
+@Profile("local")
public class RedisServiceLocalImpl extends AbstractRedisService {
private static final Logger LOG = LoggerFactory.getLogger(RedisServiceLocalImpl.class);
@PostConstruct
public void init() throws AtlasException {
+ LOG.info("Initializing RedisServiceLocalImpl");
+
redisClient = Redisson.create(getLocalConfig());
redisCacheClient = Redisson.create(getLocalConfig());
LOG.info("Local redis client created successfully.");
diff --git a/pom.xml b/pom.xml
index 3c77a5b947b..ee7970c12fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1813,7 +1813,7 @@
org.apache.maven.surefire
- surefire-testng
+ surefire-junit-platform
${surefire.version}
diff --git a/repository/src/test/java/org/apache/atlas/repository/integration/TestEntityStreamUtil.java b/repository/src/test/java/org/apache/atlas/repository/integration/TestEntityStreamUtil.java
new file mode 100644
index 00000000000..e3b7b301390
--- /dev/null
+++ b/repository/src/test/java/org/apache/atlas/repository/integration/TestEntityStreamUtil.java
@@ -0,0 +1,77 @@
+package org.apache.atlas.repository.integration;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.instance.AtlasEntityHeader;
+import org.apache.atlas.model.instance.AtlasEntityHeaders;
+import org.apache.atlas.model.instance.EntityMutationResponse;
+import org.apache.atlas.repository.store.graph.v2.AtlasEntityStream;
+import org.apache.atlas.repository.store.graph.v2.EntityStream;
+import org.apache.atlas.type.AtlasTypeRegistry;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class TestEntityStreamUtil {
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+ public static class EntityCreationRequest {
+ private final String jsonRequest;
+ private List entities;
+ private Map guidHeaderMap;
+
+ public EntityCreationRequest(String jsonRequest) {
+ this.jsonRequest = jsonRequest;
+ this.entities = new ArrayList<>();
+ this.guidHeaderMap = new HashMap<>();
+ }
+
+ public EntityStream toEntityStream(AtlasTypeRegistry typeRegistry) throws IOException {
+ JsonNode root = OBJECT_MAPPER.readTree(jsonRequest);
+ ArrayNode entitiesNode = (ArrayNode) root.get("entities");
+
+ for (JsonNode entityNode : entitiesNode) {
+ AtlasEntity.AtlasEntityWithExtInfo entityWithExtInfo = new AtlasEntity.AtlasEntityWithExtInfo();
+ AtlasEntity entity = new AtlasEntity();
+
+ entity.setTypeName(entityNode.get("typeName").asText());
+
+ // Handle attributes
+ JsonNode attributesNode = entityNode.get("attributes");
+ Map attributes = new HashMap<>();
+ attributesNode.fields().forEachRemaining(field ->
+ attributes.put(field.getKey(), field.getValue().asText())
+ );
+ entity.setAttributes(attributes);
+
+ entityWithExtInfo.setEntity(entity);
+ entities.add(entity);
+ }
+
+ return new AtlasEntityStream(entities);
+ }
+
+ public void updateWithMutationResponse(EntityMutationResponse response) {
+ // Update entities with assigned GUIDs
+ for (AtlasEntityHeader header : response.getCreatedEntities()) {
+ guidHeaderMap.put(header.getGuid(), header);
+ }
+ }
+
+ public AtlasEntityHeaders toEntityHeaders() {
+ AtlasEntityHeaders headers = new AtlasEntityHeaders();
+ headers.setGuidHeaderMap(guidHeaderMap);
+ return headers;
+ }
+ }
+
+ public static EntityCreationRequest fromJson(String json) {
+ return new EntityCreationRequest(json);
+ }
+
+}
\ No newline at end of file
diff --git a/run-integration-tests.sh b/run-integration-tests.sh
new file mode 100644
index 00000000000..18088693607
--- /dev/null
+++ b/run-integration-tests.sh
@@ -0,0 +1,124 @@
+#!/bin/bash
+# run-integration-tests.sh
+
+set -e
+
+echo "============================================"
+echo "Atlas Integration Tests Runner"
+echo "============================================"
+
+# Colors for output
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+NC='\033[0m' # No Color
+export JAVA_HOME=`/usr/libexec/java_home -v 17` # Set Java 17 as JAVA_HOME
+# Check if Docker is running
+if ! docker info > /dev/null 2>&1; then
+ echo -e "${RED}Docker is not running. Please start Docker first.${NC}"
+ exit 1
+fi
+
+# Parse arguments
+SKIP_BUILD=false
+KEEP_CONTAINERS=false
+DEBUG=false
+
+while [[ "$#" -gt 0 ]]; do
+ case $1 in
+ --skip-build) SKIP_BUILD=true ;;
+ --keep-containers) KEEP_CONTAINERS=true ;;
+ --debug) DEBUG=true ;;
+ -h|--help)
+ echo "Usage: $0 [options]"
+ echo "Options:"
+ echo " --skip-build Skip building Atlas WAR and Docker image"
+ echo " --keep-containers Keep containers running after tests"
+ echo " --debug Enable debug logging"
+ echo " -h, --help Show this help message"
+ exit 0
+ ;;
+ *) echo "Unknown parameter: $1"; exit 1 ;;
+ esac
+ shift
+done
+
+# Step 1: Build Docker image
+echo -e "${YELLOW}Building Atlas Docker image...${NC}"
+docker buildx build --load -t atlanhq/atlas:test .
+
+if [ $? -ne 0 ]; then
+ echo -e "${RED}Failed to build Docker image${NC}"
+ exit 1
+fi
+echo -e "${GREEN}Docker image built successfully${NC}"
+
+# Step 2: Clean up any existing test containers
+echo -e "${YELLOW}Cleaning up existing test containers...${NC}"
+docker rm -f atlas-test-zookeeper atlas-test-kafka atlas-test-cassandra \
+ atlas-test-elasticsearch atlas-test-redis atlas-test-atlas 2>/dev/null || true
+
+# Step 3: Set test properties
+export TESTCONTAINERS_REUSE_ENABLE=true
+export TESTCONTAINERS_RYUK_DISABLED=$KEEP_CONTAINERS
+
+if [ "$DEBUG" = true ]; then
+ export TESTCONTAINERS_DEBUG=true
+ MAVEN_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
+fi
+
+echo "Listing docker images"
+docker image ls
+
+# Step 4: Run integration tests
+echo -e "${YELLOW}Running integration tests...${NC}"
+
+if [ "$DEBUG" = true ]; then
+ mvn test -pl webapp -Dtest=AtlasDockerIntegrationTest \
+ -Dorg.slf4j.simpleLogger.defaultLogLevel=debug \
+ -Dorg.testcontainers.log.level=DEBUG -Dsurefire.useFile=false
+else
+ mvn test -pl webapp -Dtest=AtlasDockerIntegrationTest -Dsurefire.useFile=false
+fi
+
+TEST_RESULT=$?
+
+# Step 5: Collect logs if tests failed
+if [ $TEST_RESULT -ne 0 ]; then
+ echo -e "${RED}Tests failed! Collecting logs...${NC}"
+
+ mkdir -p target/test-logs
+
+ # Get container logs
+ for container in $(docker ps -a --filter "name=atlas-test" --format "{{.Names}}"); do
+ echo "Collecting logs from $container..."
+ docker logs $container > "target/test-logs/${container}.log" 2>&1
+ done
+
+ echo -e "${YELLOW}Logs saved to target/test-logs/${NC}"
+fi
+
+# Step 6: Clean up containers if not keeping them
+if [ "$KEEP_CONTAINERS" = false ]; then
+ echo -e "${YELLOW}Cleaning up test containers...${NC}"
+ docker rm -f $(docker ps -a --filter "name=atlas-test" --format "{{.Names}}") 2>/dev/null || true
+else
+ echo -e "${YELLOW}Keeping containers running (--keep-containers flag set)${NC}"
+ echo "You can connect to Atlas at: http://localhost:21000"
+ echo "To stop containers manually, run:"
+ echo " docker rm -f \$(docker ps -a --filter 'name=atlas-test' --format '{{.Names}}')"
+fi
+
+# Step 7: Report results
+if [ $TEST_RESULT -eq 0 ]; then
+ echo -e "${GREEN}============================================${NC}"
+ echo -e "${GREEN}Integration tests completed successfully!${NC}"
+ echo -e "${GREEN}============================================${NC}"
+ exit 0
+else
+ echo -e "${RED}============================================${NC}"
+ echo -e "${RED}Integration tests failed!${NC}"
+ echo -e "${RED}Check target/test-logs for details${NC}"
+ echo -e "${RED}============================================${NC}"
+ exit 1
+fi
\ No newline at end of file
diff --git a/webapp/pom.xml b/webapp/pom.xml
index cf17b1f9785..5935cfebe4a 100755
--- a/webapp/pom.xml
+++ b/webapp/pom.xml
@@ -140,6 +140,81 @@
+
+
+ org.testcontainers
+ testcontainers
+ 1.21.3
+ test
+
+
+ org.testcontainers
+ junit-jupiter
+ 1.21.3
+ test
+
+
+ org.testcontainers
+ elasticsearch
+ 1.21.3
+ test
+
+
+ org.testcontainers
+ cassandra
+ 1.21.3
+ test
+
+
+ org.testcontainers
+ kafka
+ 1.21.3
+ test
+
+
+ com.redis
+ testcontainers-redis
+ 2.2.2
+ test
+
+
+
+ org.apache.atlas
+ atlas-repository
+ ${project.version}
+ test-jar
+ test
+
+
+
+ org.apache.atlas
+ atlas-intg
+ ${project.version}
+ test-jar
+ test
+
+
+
+ org.apache.atlas
+ atlas-graphdb-common
+ ${project.version}
+ tests
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit.jupiter.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit.jupiter.version}
+ test
+
+
org.apache.atlas
atlas-intg
@@ -305,10 +380,10 @@
mockito-all
-
+
com.google.inject
@@ -898,6 +973,15 @@
+
+
+ src/test/resources
+
+ **/*.properties
+
+ true
+
+
diff --git a/webapp/src/test/java/org/apache/atlas/web/integration/AtlasDockerIntegrationTest.java b/webapp/src/test/java/org/apache/atlas/web/integration/AtlasDockerIntegrationTest.java
new file mode 100644
index 00000000000..b30b466c27f
--- /dev/null
+++ b/webapp/src/test/java/org/apache/atlas/web/integration/AtlasDockerIntegrationTest.java
@@ -0,0 +1,687 @@
+package org.apache.atlas.web.integration;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.kafka.clients.consumer.ConsumerConfig;
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.apache.kafka.clients.consumer.ConsumerRecords;
+import org.apache.kafka.clients.consumer.KafkaConsumer;
+import org.apache.kafka.common.serialization.StringDeserializer;
+import org.junit.jupiter.api.*;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.testcontainers.junit.jupiter.TestcontainersExtension;
+
+import java.time.Duration;
+import java.util.Collections;
+import java.util.Properties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.BindMode;
+import org.testcontainers.containers.CassandraContainer;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.KafkaContainer;
+import org.testcontainers.containers.Network;
+import org.testcontainers.containers.output.Slf4jLogConsumer;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.elasticsearch.ElasticsearchContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+import org.testcontainers.utility.DockerImageName;
+
+import java.io.File;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * Integration test for Apache Atlas using Docker containers with local deploy directory.
+ */
+@Testcontainers
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+@ExtendWith(TestcontainersExtension.class)
+public class AtlasDockerIntegrationTest {
+
+ private static final Logger LOG = LoggerFactory.getLogger(AtlasDockerIntegrationTest.class);
+ private static final Network network = Network.newNetwork();
+ private static final ObjectMapper mapper = new ObjectMapper();
+
+ private HttpClient httpClient;
+ private String atlasBaseUrl;
+
+ // Define containers
+ @Container
+ static GenericContainer> zookeeper = new GenericContainer<>("zookeeper:3.7")
+ .withNetwork(network)
+ .withNetworkAliases("zookeeper")
+ .withExposedPorts(2181)
+ .withEnv("ZOO_MY_ID", "1");
+
+ @Container
+ static KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:7.4.0"))
+ .withNetwork(network)
+ .withNetworkAliases("kafka")
+ .withExternalZookeeper("zookeeper:2181")
+ .dependsOn(zookeeper);
+
+ @Container
+ static CassandraContainer> cassandra = new CassandraContainer<>("cassandra:2.1")
+ .withNetwork(network)
+ .withNetworkAliases("cassandra")
+ .withStartupTimeout(Duration.ofMinutes(3))
+ .withEnv("CASSANDRA_CLUSTER_NAME", "atlas-cluster")
+ .withEnv("CASSANDRA_DC", "datacenter1");
+
+ @Container
+ static ElasticsearchContainer elasticsearch = new ElasticsearchContainer(
+ DockerImageName.parse("elasticsearch:7.16.2"))
+ .withNetwork(network)
+ .withNetworkAliases("elasticsearch")
+ .withEnv("discovery.type", "single-node")
+ .withEnv("xpack.security.enabled", "false")
+ .withEnv("ES_JAVA_OPTS", "-Xms512m -Xmx512m");
+
+ @Container
+ static GenericContainer> redis = new GenericContainer<>("redis:6.2.14")
+ .withNetwork(network)
+ .withNetworkAliases("redis")
+ .withCommand("redis-server", "--requirepass", "", "--protected-mode", "no")
+ .withExposedPorts(6379);
+
+ // Atlas container with volume mount
+ @Container
+ static GenericContainer> atlas = createAtlasContainer();
+
+ private static GenericContainer> createAtlasContainer() {
+ // Get the deploy directory path
+ String deployPath = getDeployDirectoryPath();
+ LOG.info("Using deploy directory: {}", deployPath);
+
+ // Verify deploy directory exists
+ File deployDir = new File(deployPath);
+ if (!deployDir.exists() || !deployDir.isDirectory()) {
+ throw new IllegalStateException("Deploy directory not found: " + deployPath +
+ ". Please ensure the deploy directory exists with conf, data, elasticsearch, etc.");
+ }
+
+ return new GenericContainer<>(DockerImageName.parse("atlanhq/atlas:test"))
+ .withNetwork(network)
+ .withNetworkAliases("atlas")
+ .withExposedPorts(21000)
+ //# Mount the entire deploy directory
+ .withFileSystemBind(deployPath, "/opt/atlas-deploy", BindMode.READ_WRITE)
+ // Mount specific subdirectories to expected locations (READ_WRITE for conf)
+ .withFileSystemBind(deployPath + "/conf", "/opt/apache-atlas/conf-orig", BindMode.READ_ONLY)
+ .withFileSystemBind(deployPath + "/elasticsearch", "/opt/apache-atlas/elasticsearch", BindMode.READ_ONLY)
+ .withFileSystemBind(deployPath + "/models", "/opt/apache-atlas/models", BindMode.READ_ONLY)
+ .withEnv(getAtlasEnvironment())
+ .withCommand("/bin/bash", "-c", createStartupScript())
+ .waitingFor(
+ Wait.forListeningPort()
+ .withStartupTimeout(Duration.ofMinutes(2))
+ )
+ .withLogConsumer(new Slf4jLogConsumer(LOG).withPrefix("ATLAS"))
+ .dependsOn(kafka, cassandra, elasticsearch, redis, zookeeper);
+ }
+
+ private static String getDeployDirectoryPath() {
+ // Try different paths where deploy directory might be
+ String projectRootPath = System.getProperty("user.dir");
+ String[] possiblePaths = {
+ projectRootPath+ "/src/test/resources/deploy"
+ };
+
+ for (String path : possiblePaths) {
+ if (path != null) {
+ File dir = new File(path);
+ if (dir.exists() && dir.isDirectory()) {
+ // Check if it has expected subdirectories
+ if (new File(dir, "conf").exists() &&
+ new File(dir, "elasticsearch").exists()) {
+ return dir.getAbsolutePath();
+ }
+ }
+ }
+ }
+
+ throw new IllegalStateException(
+ "Could not find deploy directory. Please set -Datlas.deploy.dir=/path/to/deploy or ensure deploy directory exists in project root"
+ );
+ }
+
+ private static Map getAtlasEnvironment() {
+ Map env = new HashMap<>();
+
+ // Atlas home and configuration
+ env.put("ATLAS_HOME", "/opt/apache-atlas");
+ env.put("ATLAS_CONF", "/opt/apache-atlas/conf");
+ env.put("ATLAS_DATA", "/opt/atlas-deploy/data");
+ env.put("ATLAS_LOG_DIR", "/opt/atlas-deploy/logs");
+
+ // Tell Atlas we're managing external services
+ env.put("MANAGE_LOCAL_HBASE", "false");
+ env.put("MANAGE_LOCAL_SOLR", "false");
+ env.put("MANAGE_LOCAL_ELASTICSEARCH", "false");
+ env.put("MANAGE_LOCAL_CASSANDRA", "false");
+
+ // JVM options
+ env.put("ATLAS_SERVER_OPTS", "-server -Xms1g -Xmx2g");
+ env.put("ATLAS_SERVER_HEAP", "-Xms1g -Xmx2g");
+
+ // Java 17 options
+ env.put("JAVA_HOME", "/usr/lib/jvm/java-17-openjdk-amd64");
+ env.put("JDK_JAVA_OPTIONS", "--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED");
+
+ env.put("SPRING_PROFILES_ACTIVE", "local");
+
+ // Set atlas.home system property
+ env.put("ATLAS_OPTS", "-Datlas.home=/opt/apache-atlas -Datlas.conf=/opt/apache-atlas/conf -Datlas.data=/opt/atlas-deploy/data -Datlas.log.dir=/opt/atlas-deploy/logs");
+
+ return env;
+ }
+
+ private static String createStartupScript() {
+ return """
+ #!/bin/bash
+ set -e
+
+ # Wait for dependencies
+ echo "Waiting for Cassandra..."
+ while ! nc -z cassandra 9042; do sleep 2; done
+ echo "Cassandra is ready"
+
+ echo "Waiting for Elasticsearch..."
+ while ! curl -s elasticsearch:9200 > /dev/null; do sleep 2; done
+ echo "Elasticsearch is ready"
+
+ echo "Waiting for Kafka..."
+ while ! nc -z kafka 9092; do sleep 2; done
+ echo "Kafka is ready"
+
+ echo "Waiting for Redis..."
+ while ! nc -z redis 6379; do sleep 2; done
+ echo "Redis is ready"
+
+ # Create required directories
+ mkdir -p /opt/atlas-deploy/logs
+ mkdir -p /opt/atlas-deploy/data
+ mkdir -p /opt/apache-atlas/conf
+ mkdir -p /opt/apache-atlas/server/webapp
+
+ # Copy configuration from read-only mount to writable location
+ echo "Copying configuration files..."
+ cp -r /opt/apache-atlas/conf-orig/* /opt/apache-atlas/conf/
+
+ # Fix atlas-env.sh by replacing template variables
+ echo "Fixing atlas-env.sh..."
+ sed -i 's/${hbase.embedded}/false/g' /opt/apache-atlas/conf/atlas-env.sh
+ sed -i 's/${solr.embedded}/false/g' /opt/apache-atlas/conf/atlas-env.sh
+ sed -i 's/${cassandra.embedded}/false/g' /opt/apache-atlas/conf/atlas-env.sh
+ sed -i 's/${elasticsearch.managed}/false/g' /opt/apache-atlas/conf/atlas-env.sh
+
+ # List what we have
+ echo "Configuration directory contents:"
+ ls -la /opt/apache-atlas/conf/
+
+ echo "Elasticsearch directory contents:"
+ ls -la /opt/apache-atlas/elasticsearch/
+
+ # Update atlas-application.properties with container service addresses
+ cat >> /opt/apache-atlas/conf/atlas-application.properties <<'EOF'
+
+ # Container service overrides
+ atlas.graph.storage.backend=cql
+ atlas.graph.storage.hostname=cassandra
+ atlas.graph.storage.cql.port=9042
+ atlas.graph.storage.cql.keyspace=atlas
+
+ atlas.graph.index.search.backend=elasticsearch
+ atlas.graph.index.search.hostname=elasticsearch:9200
+ atlas.graph.index.search.elasticsearch.rest-port=9200
+
+ atlas.kafka.bootstrap.servers=kafka:9092
+ atlas.kafka.zookeeper.connect=zookeeper:2181
+
+ # Redis configuration
+ atlas.redis.service.impl = org.apache.atlas.service.redis.RedisServiceImpl
+ atlas.redis.url = redis://redis:6379
+ atlas.redis.sentinel.enabled = false
+ atlas.redis.sentinel.check_list.enabled = false
+
+ atlas.server.bind.address=0.0.0.0
+ atlas.authentication.method.file=true
+ atlas.authentication.method.kerberos=false
+
+ # Disable HBase transaction logging since we're using Cassandra
+ atlas.graph.tx.log.tx=false
+ atlas.graph.tx.recovery.verbose=false
+
+ # Disable HBase audit
+ atlas.audit.hbase.zookeeper.quorum=
+ atlas.EntityAuditRepository.impl=org.apache.atlas.repository.audit.NoopEntityAuditRepository
+
+ atlas.redis.sentinel.check_list.enabled=false
+ atlas.authorizer.impl=none
+ #atlas.authorizer.simple.authz.policy.file=deploy/conf/atlas-simple-authz-policy.json
+ atlas.authentication.method.file=true
+
+ atlas.enableTLS=false
+ atlas.authentication.method.kerberos=false
+ atlas.redis.service.impl = org.apache.atlas.service.redis.RedisServiceImpl
+
+ atlas.kafka.zookeeper.session.timeout.ms=400
+ atlas.kafka.zookeeper.connection.timeout.ms=200
+ atlas.kafka.zookeeper.sync.time.ms=20
+ atlas.kafka.auto.commit.interval.ms=1000
+ atlas.kafka.hook.group.id=atlas
+ atlas.kafka.enable.auto.commit=false
+ atlas.kafka.auto.offset.reset=earliest
+ atlas.kafka.session.timeout.ms=30000
+ atlas.kafka.offsets.topic.replication.factor=1
+ atlas.kafka.poll.timeout.ms=1000
+ atlas.notification.create.topics=true
+ atlas.notification.replicas=1
+ atlas.notification.topics=ATLAS_ENTITIES
+ atlas.notification.log.failed.messages=true
+ atlas.notification.consumer.retry.interval=500
+ atlas.notification.hook.retry.interval=1000
+
+ atlas.EntityAuditRepository.impl=org.apache.atlas.repository.audit.NoopEntityAuditRepository
+ atlas.EntityAuditRepositorySearch.impl=org.apache.atlas.repository.audit.ESBasedAuditRepository
+ atlas.EntityAuditRepository.keyspace=atlas_audit
+ atlas.EntityAuditRepository.replicationFactor=1
+
+ atlas.authentication.method.ldap.type=none
+ #### user credentials file
+ atlas.authentication.method.file.filename=/opt/apache-atlas/conf/users-credentials.properties
+ atlas.authentication.method.file=true
+ atlas.authentication.method.ldap=false
+ atlas.authentication.method.keycloak=false
+ atlas.authentication.method.pam=false
+ atlas.authentication.method.keycloak=false
+ #atlas.authentication.method.keycloak.file=${sys:atlas.home}/conf/keycloak.json
+ #atlas.authentication.method.keycloak.ugi-groups=false
+ #atlas.authentication.method.keycloak.groups_claim=groups
+ atlas.http.authentication.enabled=false
+ EOF
+
+ # Export required environment variables
+ export ATLAS_HOME=/opt/apache-atlas
+ export ATLAS_CONF=/opt/apache-atlas/conf
+ export ATLAS_DATA=/opt/atlas-deploy/data
+ export ATLAS_LOG_DIR=/opt/atlas-deploy/logs
+ export ATLAS_EXPANDED_WEBAPP_DIR=/opt/apache-atlas/server/webapp
+ export MANAGE_LOCAL_HBASE=false
+ export MANAGE_LOCAL_SOLR=false
+ export MANAGE_LOCAL_ELASTICSEARCH=false
+ export MANAGE_LOCAL_CASSANDRA=false
+ export MANAGE_EMBEDDED_CASSANDRA=false
+
+ # Check Java installation
+ echo "Checking Java..."
+ which java
+ java -version
+
+ # Check Python installation
+ echo "Checking Python..."
+ which python || which python2
+ python --version || python2 --version
+
+ # List Atlas bin directory
+ echo "Atlas bin directory:"
+ ls -la /opt/apache-atlas/bin/
+
+ # Check if webapp exists
+ echo "Checking for webapp..."
+ ls -la /opt/apache-atlas/server/ || echo "Server directory not found"
+ ls -la /opt/apache-atlas/ | grep -E "(war|jar)" || echo "No WAR/JAR files in atlas root"
+
+ if [ -d "/opt/apache-atlas/server/webapp/atlas" ]; then
+ echo "Webapp found at /opt/apache-atlas/server/webapp/atlas"
+ ls -la /opt/apache-atlas/server/webapp/atlas/
+ else
+ echo "Webapp not found, looking for war file..."
+ find /opt/apache-atlas -name "*.war" -type f || echo "No WAR files found"
+ fi
+
+ # Start Atlas
+ cd /opt/apache-atlas
+ echo "Starting Apache Atlas..."
+
+ # Check if Java is available
+ if ! which java > /dev/null 2>&1; then
+ echo "ERROR: Java not found in PATH"
+ exit 1
+ fi
+
+ echo "Java found at: $(which java)"
+ java -version
+
+ # Build classpath
+ echo "Building classpath..."
+ CP="/opt/apache-atlas/conf"
+
+ # Add server webapp JARs
+ if [ -d "/opt/apache-atlas/server/webapp/atlas/WEB-INF/lib" ]; then
+ echo "Adding webapp JARs..."
+ for jar in /opt/apache-atlas/server/webapp/atlas/WEB-INF/lib/*.jar; do
+ CP="$CP:$jar"
+ done
+ elif [ -f "/opt/apache-atlas/server/webapp/atlas.war" ]; then
+ echo "Found WAR file, extracting..."
+ mkdir -p /opt/apache-atlas/server/webapp/atlas
+ cd /opt/apache-atlas/server/webapp/atlas
+ jar xf ../atlas.war
+ cd /opt/apache-atlas
+ for jar in /opt/apache-atlas/server/webapp/atlas/WEB-INF/lib/*.jar; do
+ CP="$CP:$jar"
+ done
+ else
+ echo "WARNING: No webapp found!"
+ # Try to find JARs in other locations
+ find /opt/apache-atlas -name "*.jar" -type f | head -10
+ fi
+
+ # Add lib JARs if they exist
+ if [ -d "/opt/apache-atlas/lib" ]; then
+ echo "Adding lib JARs..."
+ for jar in /opt/apache-atlas/lib/*.jar; do
+ CP="$CP:$jar"
+ done
+ fi
+
+ # Add libext JARs if they exist
+ if [ -d "/opt/apache-atlas/libext" ]; then
+ echo "Adding libext JARs..."
+ for jar in /opt/apache-atlas/libext/*.jar; do
+ CP="$CP:$jar"
+ done
+ fi
+
+ # Add any JARs from the distro directory
+ if [ -d "/opt/apache-atlas/distro" ]; then
+ echo "Checking distro directory..."
+ for jar in /opt/apache-atlas/distro/*.jar; do
+ if [ -f "$jar" ]; then
+ CP="$CP:$jar"
+ fi
+ done
+ fi
+
+ echo "Starting Atlas with Java directly..."
+ echo "Classpath length: $(echo $CP | wc -c) characters"
+
+ /usr/bin/java -Datlas.log.dir=/opt/apache-atlas/logs -Datlas.log.file=atlas_kafka_setup.log -Datlas.home=/opt/apache-atlas -Datlas.conf=/opt/apache-atlas/conf -Datlas.data=/opt/apache-atlas/data -classpath /opt/apache-atlas/conf:/opt/apache-atlas/server/webapp/atlas/WEB-INF/classes:/opt/apache-atlas/server/webapp/atlas/WEB-INF/lib/*:/opt/apache-atlas/libext/* org.apache.atlas.hook.AtlasTopicCreator ATLAS_ENTITIES
+
+ # Start Atlas with exec to replace the shell process
+ exec java \
+ -Datlas.log.dir=/opt/atlas-deploy/logs \
+ -Datlas.log.file=atlas.log \
+ -Datlas.home=/opt/apache-atlas \
+ -Datlas.conf=/opt/apache-atlas/conf \
+ -Datlas.data=/opt/atlas-deploy/data \
+ -Dlog4j.configuration=atlas-log4j.xml \
+ -Djava.net.preferIPv4Stack=true \
+ -server \
+ -Xms1g -Xmx2g \
+ --add-opens java.base/java.lang=ALL-UNNAMED \
+ --add-opens java.base/java.nio=ALL-UNNAMED \
+ --add-opens java.base/sun.nio.ch=ALL-UNNAMED \
+ -cp "$CP" \
+ org.apache.atlas.Atlas \
+ -app /opt/apache-atlas/server/webapp/atlas
+ """;
+ }
+
+ @BeforeAll
+ void setup() {
+ LOG.info("Setting up test environment...");
+ // Setup HTTP client
+ httpClient = HttpClient.newBuilder()
+ .connectTimeout(Duration.ofSeconds(10))
+ .build();
+
+ // Setup base URL
+ int mappedPort = atlas.getMappedPort(21000);
+ atlasBaseUrl = String.format("http://localhost:%d/api/atlas/v2", mappedPort);
+
+ LOG.info("Atlas URL: {}", atlasBaseUrl);
+ LOG.info("Atlas container is running: {}", atlas.isRunning());
+
+ // Wait for Atlas API to be ready
+ waitForAtlasReady();
+ }
+
+ private void waitForAtlasReady() {
+ LOG.info("Waiting for Atlas API to be ready...");
+ int maxRetries = 5;
+
+ for (int i = 0; i < maxRetries; i++) {
+ try {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(atlasBaseUrl + "/types"))
+ .header("Accept", "application/json")
+ .GET()
+ .timeout(Duration.ofSeconds(5))
+ .build();
+
+ HttpResponse response =
+ httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+ LOG.debug("Atlas API check attempt {}: status {}", i, response.statusCode());
+
+ if (response.statusCode() == 200 || response.statusCode() == 401) {
+ LOG.info("Atlas API is ready!");
+ return;
+ }
+ } catch (Exception e) {
+ LOG.debug("Atlas API not ready yet (attempt {}): {}", i, e.getMessage());
+ }
+
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ LOG.error("Atlas failed to become ready. Container logs:");
+ LOG.error(atlas.getLogs());
+
+ throw new RuntimeException("Atlas API failed to become ready after " + maxRetries + " attempts");
+ }
+
+ @Test
+ @Order(1)
+ @DisplayName("Test Atlas Health Check")
+ void testHealthCheck() throws Exception {
+ LOG.info("Testing Atlas health check...");
+
+ // Create basic auth header
+ String auth = "admin:admin";
+ String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes());
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(atlasBaseUrl.replace("/api/atlas/v2", "") + "/api/atlas/admin/version"))
+ .header("Authorization", "Basic "+encodedAuth)
+ .GET()
+ .timeout(Duration.ofSeconds(10))
+ .build();
+
+ HttpResponse response =
+ httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+ LOG.info("Health check response: {} - {}", response.statusCode(), response.body());
+ assertEquals(200, response.statusCode());
+ }
+
+ @Test
+ @Order(2)
+ @DisplayName("Test Get Types")
+ void testGetTypes() throws Exception {
+ LOG.info("Testing get types...");
+ // Create basic auth header
+ String auth = "admin:admin";
+ String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes());
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(atlasBaseUrl + "/types/typedefs"))
+ .header("Accept", "application/json")
+ .header("Authorization", "Basic "+encodedAuth)
+ .GET()
+ .timeout(Duration.ofSeconds(10))
+ .build();
+
+ HttpResponse response =
+ httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+ LOG.info("Get types response: {}", response.statusCode());
+ assertEquals(200, response.statusCode());
+
+ ObjectNode types = mapper.readValue(response.body(), ObjectNode.class);
+ assertNotNull(types.get("entityDefs"));
+ LOG.info("Found {} entity types", types.get("entityDefs").size());
+ }
+
+ @Test
+ @Order(3)
+ @DisplayName("Test Create Table Asset and Verify Kafka Notification")
+ void testCreateTableAssetAndVerifyResponseAndKafkaNotification() throws Exception {
+ LOG.info("Testing create asset...");
+
+ // Create Kafka consumer
+ KafkaConsumer consumer = createKafkaConsumer();
+
+ // Create basic auth header
+ String auth = "admin:admin";
+ String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes());
+
+ // Create the payload
+ String payload = """
+ {
+ "entities": [
+ {
+ "typeName": "Table",
+ "guid": "-1",
+ "attributes": {
+ "qualifiedName": "ANALYTICS_4",
+ "name": "ANALYTICS_4",
+ "description": "test",
+ "connectionQualifiedName": "Connection2",
+ "connectorName": "snowflake",
+ "adminGroups": ["Dev", "admin"]
+ }
+ }
+ ]
+ }""";
+
+ // Create the request
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(atlasBaseUrl + "/entity/bulk"))
+ .header("Content-Type", "application/json")
+ .header("Accept", "application/json")
+ .header("Authorization", "Basic " + encodedAuth)
+ .POST(HttpRequest.BodyPublishers.ofString(payload))
+ .timeout(Duration.ofSeconds(10))
+ .build();
+
+ // Send the request
+ HttpResponse response =
+ httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+ LOG.info("Create asset response: {} - {}", response.statusCode(), response.body());
+ assertEquals(200, response.statusCode());
+
+ // Parse and verify the response
+ ObjectNode result = mapper.readValue(response.body(), ObjectNode.class);
+ assertNotNull(result.get("mutatedEntities"));
+ assertTrue(result.get("mutatedEntities").has("CREATE"));
+ assertEquals(1, result.get("mutatedEntities").get("CREATE").size());
+
+ // Get the created entity's GUID
+ String createdGuid = result.get("mutatedEntities")
+ .get("CREATE")
+ .get(0)
+ .get("guid")
+ .asText();
+
+ // Wait for and verify Kafka message
+ boolean messageFound = false;
+ int maxAttempts = 10;
+ ObjectNode kafkaMessage = null;
+
+ for (int i = 0; i < maxAttempts && !messageFound; i++) {
+ ConsumerRecords records = consumer.poll(Duration.ofSeconds(1));
+ for (ConsumerRecord record : records) {
+ ObjectNode message = mapper.readValue(record.value(), ObjectNode.class);
+
+ // Check if this is our message by matching the GUID
+ if (message.has("message") &&
+ message.get("message").has("entity") &&
+ message.get("message").get("entity").has("guid") &&
+ message.get("message").get("entity").get("guid").asText().equals(createdGuid)) {
+
+ messageFound = true;
+ kafkaMessage = message;
+ break;
+ }
+ }
+ }
+
+ assertTrue(messageFound, "Kafka message for created entity not found");
+ assertNotNull(kafkaMessage, "Kafka message should not be null");
+
+ // Verify message structure and content
+ JsonNode messageNode = kafkaMessage.get("message");
+
+ // Verify operation type
+ assertEquals("ENTITY_NOTIFICATION_V2", messageNode.get("type").asText());
+ assertEquals("ENTITY_CREATE", messageNode.get("operationType").asText());
+
+ // Verify entity section
+ JsonNode entityNode = messageNode.get("entity");
+ assertEquals("Table", entityNode.get("typeName").asText());
+ assertEquals(createdGuid, entityNode.get("guid").asText());
+
+ // Verify attributes
+ JsonNode attributesNode = entityNode.get("attributes");
+ assertEquals("ANALYTICS_4", attributesNode.get("qualifiedName").asText());
+ assertEquals("ANALYTICS_4", attributesNode.get("name").asText());
+ assertEquals("test", attributesNode.get("description").asText());
+ assertEquals("Connection2", attributesNode.get("connectionQualifiedName").asText());
+ assertEquals("snowflake", attributesNode.get("connectorName").asText());
+
+ // Verify admin groups
+ assertTrue(attributesNode.get("adminGroups").isArray());
+ assertEquals(2, attributesNode.get("adminGroups").size());
+ assertEquals("Dev", attributesNode.get("adminGroups").get(0).asText());
+ assertEquals("admin", attributesNode.get("adminGroups").get(1).asText());
+
+ // Clean up
+ consumer.close();
+ }
+
+ @AfterAll
+ void tearDown() {
+ LOG.info("Test completed");
+ }
+
+ private KafkaConsumer createKafkaConsumer() {
+ Properties props = new Properties();
+ props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:" + kafka.getFirstMappedPort());
+ props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group");
+ props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
+ props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
+ props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
+
+ KafkaConsumer consumer = new KafkaConsumer<>(props);
+ consumer.subscribe(Collections.singletonList("ATLAS_ENTITIES"));
+ return consumer;
+ }
+}
\ No newline at end of file
diff --git a/webapp/src/test/resources/deploy/conf/atlas-application.properties b/webapp/src/test/resources/deploy/conf/atlas-application.properties
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/webapp/src/test/resources/deploy/conf/atlas-env.sh b/webapp/src/test/resources/deploy/conf/atlas-env.sh
new file mode 100644
index 00000000000..c4241e6655a
--- /dev/null
+++ b/webapp/src/test/resources/deploy/conf/atlas-env.sh
@@ -0,0 +1,68 @@
+#!/usr/bin/env bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# The java implementation to use. If JAVA_HOME is not found we expect java and jar to be in path
+#export JAVA_HOME=
+
+# any additional java opts you want to set. This will apply to both client and server operations
+#export ATLAS_OPTS=
+
+# any additional java opts that you want to set for client only
+#export ATLAS_CLIENT_OPTS=
+
+# java heap size we want to set for the client. Default is 1024MB
+#export ATLAS_CLIENT_HEAP=
+
+# any additional opts you want to set for atlas service.
+#export ATLAS_SERVER_OPTS=
+
+# indicative values for large number of metadata entities (equal or more than 10,000s)
+#export ATLAS_SERVER_OPTS="-server -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+PrintTenuringDistribution -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dumps/atlas_server.hprof -Xloggc:logs/gc-worker.log -verbose:gc -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1m -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps"
+
+# java heap size we want to set for the atlas server. Default is 1024MB
+#export ATLAS_SERVER_HEAP=
+
+# indicative values for large number of metadata entities (equal or more than 10,000s) for JDK 8
+#export ATLAS_SERVER_HEAP="-Xms15360m -Xmx15360m -XX:MaxNewSize=5120m -XX:MetaspaceSize=100M -XX:MaxMetaspaceSize=512m"
+
+# What is is considered as atlas home dir. Default is the base locaion of the installed software
+#export ATLAS_HOME_DIR=
+
+# Where log files are stored. Defatult is logs directory under the base install location
+#export ATLAS_LOG_DIR=
+
+# Where pid files are stored. Defatult is logs directory under the base install location
+#export ATLAS_PID_DIR=
+
+# where the atlas titan db data is stored. Defatult is logs/data directory under the base install location
+#export ATLAS_DATA_DIR=
+
+# Where do you want to expand the war file. By Default it is in /server/webapp dir under the base install dir.
+#export ATLAS_EXPANDED_WEBAPP_DIR=
+
+# indicates whether or not a local instance of HBase should be started for Atlas
+export MANAGE_LOCAL_HBASE=${hbase.embedded}
+
+# indicates whether or not a local instance of Solr should be started for Atlas
+export MANAGE_LOCAL_SOLR=${solr.embedded}
+
+# indicates whether or not cassandra is the embedded backend for Atlas
+export MANAGE_EMBEDDED_CASSANDRA=${cassandra.embedded}
+
+# indicates whether or not a local instance of Elasticsearch should be started for Atlas
+export MANAGE_LOCAL_ELASTICSEARCH=${elasticsearch.managed}
diff --git a/webapp/src/test/resources/deploy/conf/atlas-simple-authz-policy.json b/webapp/src/test/resources/deploy/conf/atlas-simple-authz-policy.json
new file mode 100644
index 00000000000..8a29b47684b
--- /dev/null
+++ b/webapp/src/test/resources/deploy/conf/atlas-simple-authz-policy.json
@@ -0,0 +1,129 @@
+{
+ "roles": {
+ "ROLE_ADMIN": {
+ "adminPermissions": [
+ {
+ "privileges": [ ".*" ]
+ }
+ ],
+ "typePermissions": [
+ {
+ "privileges": [ ".*" ],
+ "typeCategories": [ ".*" ],
+ "typeNames": [ ".*" ]
+ }
+ ],
+ "entityPermissions": [
+ {
+ "privileges": [ ".*" ],
+ "entityTypes": [ ".*" ],
+ "entityIds": [ ".*" ],
+ "classifications": [ ".*" ],
+ "labels" : [ ".*" ],
+ "businessMetadata" : [ ".*" ],
+ "attributes" :[ ".*" ]
+ }
+ ],
+ "relationshipPermissions": [
+ {
+ "privileges": [ ".*" ],
+ "relationshipTypes": [ ".*" ],
+ "end1EntityType": [ ".*" ],
+ "end1EntityId": [ ".*" ],
+ "end1EntityClassification": [ ".*" ],
+ "end2EntityType": [ ".*" ],
+ "end2EntityId": [ ".*" ],
+ "end2EntityClassification": [ ".*" ]
+ }
+ ]
+ },
+
+ "ROLE_MEMBER": {
+ "adminPermissions": [
+ {
+ "privileges": [ ".*" ]
+ }
+ ],
+ "typePermissions": [
+ {
+ "privileges": [ ".*" ],
+ "typeCategories": [ ".*" ],
+ "typeNames": [ ".*" ]
+ }
+ ],
+ "entityPermissions": [
+ {
+ "privileges": [ ".*" ],
+ "entityTypes": [ ".*" ],
+ "entityIds": [ ".*" ],
+ "classifications": [ ".*" ],
+ "labels" : [ ".*" ],
+ "businessMetadata" : [ ".*" ],
+ "attributes" :[ ".*" ],
+ "attributeValueMap": {
+ "certificateStatus": "VERIFIED"
+ }
+ }
+ ],
+ "relationshipPermissions": [
+ {
+ "privileges": [ ".*" ],
+ "relationshipTypes": [ ".*" ],
+ "end1EntityType": [ ".*" ],
+ "end1EntityId": [ ".*" ],
+ "end1EntityClassification": [ ".*" ],
+ "end2EntityType": [ ".*" ],
+ "end2EntityId": [ ".*" ],
+ "end2EntityClassification": [ ".*" ]
+ }
+ ]
+ },
+
+ "DATA_SCIENTIST": {
+ "entityPermissions": [
+ {
+ "privileges": [ "entity-read", "entity-read-classification" ],
+ "entityTypes": [],
+ "entityIds": [ ".*" ],
+ "classifications": [ ".*" ]
+ }
+ ]
+ },
+
+ "DATA_STEWARD": {
+ "entityPermissions": [
+ {
+ "privileges": [ "entity-read", "entity-create", "entity-update", "entity-read-classification", "entity-add-classification", "entity-update-classification", "entity-remove-classification" ],
+ "entityTypes": [ ".*" ],
+ "entityIds": [ ".*" ],
+ "classifications": [ ".*" ]
+ }
+ ],
+ "relationshipPermissions": [
+ {
+ "privileges": [ "add-relationship", "update-relationship", "remove-relationship" ],
+ "relationshipTypes": [ ".*" ],
+ "end1EntityType": [ ".*" ],
+ "end1EntityId": [ ".*" ],
+ "end1EntityClassification": [ ".*" ],
+ "end2EntityType": [ ".*" ],
+ "end2EntityId": [ ".*" ],
+ "end2EntityClassification": [ ".*" ]
+ }
+ ]
+ }
+ },
+
+ "userRoles": {
+ "admin": [ "ROLE_MEMBER" ],
+ "rangertagsync": [ "DATA_SCIENTIST" ]
+ },
+
+ "groupRoles": {
+ "ROLE_ADMIN": [ "ROLE_ADMIN" ],
+ "ROLE_MEMBER": [ "ROLE_MEMBER" ],
+ "hadoop": [ "DATA_STEWARD" ],
+ "DATA_STEWARD": [ "DATA_STEWARD" ],
+ "RANGER_TAG_SYNC": [ "DATA_SCIENTIST" ]
+ }
+}
diff --git a/webapp/src/test/resources/deploy/conf/es-settings.json b/webapp/src/test/resources/deploy/conf/es-settings.json
new file mode 100644
index 00000000000..f080fd16b6a
--- /dev/null
+++ b/webapp/src/test/resources/deploy/conf/es-settings.json
@@ -0,0 +1,38 @@
+{
+ "analysis": {
+ "analyzer": {
+ "my_custom_analyzer": {
+ "type": "custom",
+ "char_filter": [
+ "emoticons"
+ ],
+ "tokenizer": "punctuation",
+ "filter": [
+ "lowercase",
+ "english_stop"
+ ]
+ }
+ },
+ "tokenizer": {
+ "punctuation": {
+ "type": "pattern",
+ "pattern": "[ .,!?]"
+ }
+ },
+ "char_filter": {
+ "emoticons": {
+ "type": "mapping",
+ "mappings": [
+ ":) => _happy_",
+ ":( => _sad_"
+ ]
+ }
+ },
+ "filter": {
+ "english_stop": {
+ "type": "stop",
+ "stopwords": "_english_"
+ }
+ }
+ }
+}
diff --git a/webapp/src/test/resources/deploy/conf/keycloak-infra.json b/webapp/src/test/resources/deploy/conf/keycloak-infra.json
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/webapp/src/test/resources/deploy/conf/keycloak-multitenant.json b/webapp/src/test/resources/deploy/conf/keycloak-multitenant.json
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/webapp/src/test/resources/deploy/conf/keycloak-poc5.json b/webapp/src/test/resources/deploy/conf/keycloak-poc5.json
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/webapp/src/test/resources/deploy/conf/keycloak.json b/webapp/src/test/resources/deploy/conf/keycloak.json
new file mode 100644
index 00000000000..5d44db237bd
--- /dev/null
+++ b/webapp/src/test/resources/deploy/conf/keycloak.json
@@ -0,0 +1,13 @@
+{
+ "realm": "default",
+ "auth-server-url": "https://experience.atlan.com/auth",
+ "ssl-required": "external",
+ "resource": "atlan-web",
+ "public-client": false,
+ "confidential-port": 443,
+ "principal-attribute": "preferred_username",
+ "autodetect-bearer-only": true,
+ "credentials": {
+ "secret": "fb377fda-f894-4b6d-b3b4-1e0a058a25f6"
+ }
+}
\ No newline at end of file
diff --git a/webapp/src/test/resources/deploy/conf/sentinel.conf b/webapp/src/test/resources/deploy/conf/sentinel.conf
new file mode 100644
index 00000000000..d37f28c2fdf
--- /dev/null
+++ b/webapp/src/test/resources/deploy/conf/sentinel.conf
@@ -0,0 +1,13 @@
+port 26379
+
+dir /tmp
+
+sentinel monitor mymaster redis-master 6379 2
+sentinel down-after-milliseconds mymaster 5000
+sentinel failover-timeout mymaster 500
+sentinel parallel-syncs mymaster 1
+
+sentinel monitor myslave redis-slave 6379 2
+sentinel down-after-milliseconds myslave 5000
+sentinel failover-timeout myslave 500
+sentinel parallel-syncs myslave 1
diff --git a/webapp/src/test/resources/deploy/conf/users-credentials.properties b/webapp/src/test/resources/deploy/conf/users-credentials.properties
new file mode 100644
index 00000000000..1767ffdae68
--- /dev/null
+++ b/webapp/src/test/resources/deploy/conf/users-credentials.properties
@@ -0,0 +1,4 @@
+#username=group::sha256-password
+admin=ADMIN::8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
+nobal=NOBAL::0589b2f8ba54ef1569d351d39fa978ba5918fc3ba0a23e479f3fbcd14d357289
+rangertagsync=RANGER_TAG_SYNC::0afe7a1968b07d4c3ff4ed8c2d809a32ffea706c66cd795ead9048e81cfaf034
\ No newline at end of file
diff --git a/webapp/src/test/resources/deploy/elasticsearch/atlas-auth-es-schema.json b/webapp/src/test/resources/deploy/elasticsearch/atlas-auth-es-schema.json
new file mode 100644
index 00000000000..58e7a9c0f64
--- /dev/null
+++ b/webapp/src/test/resources/deploy/elasticsearch/atlas-auth-es-schema.json
@@ -0,0 +1,128 @@
+{
+ "mappings": {
+ "properties": {
+ "_expire_at_": {
+ "type": "date",
+ "store": true,
+ "doc_values": true
+ },
+ "_ttl_": {
+ "type": "text",
+ "store": true
+ },
+ "_version_": {
+ "type": "long",
+ "store": true,
+ "index": false
+ },
+ "access": {
+ "type": "keyword"
+ },
+ "action": {
+ "type": "keyword"
+ },
+ "agent": {
+ "type": "keyword"
+ },
+ "agentHost": {
+ "type": "keyword"
+ },
+ "cliIP": {
+ "type": "keyword"
+ },
+ "cliType": {
+ "type": "keyword"
+ },
+ "cluster": {
+ "type": "keyword"
+ },
+ "reqContext": {
+ "type": "keyword"
+ },
+ "enforcer": {
+ "type": "keyword"
+ },
+ "event_count": {
+ "type": "long",
+ "doc_values": true
+ },
+ "event_dur_ms": {
+ "type": "long",
+ "doc_values": true
+ },
+ "evtTime": {
+ "type": "date",
+ "doc_values": true
+ },
+ "id": {
+ "type": "keyword",
+ "store": true
+ },
+ "logType": {
+ "type": "keyword"
+ },
+ "policy": {
+ "type": "keyword"
+ },
+ "proxyUsers": {
+ "type": "keyword"
+ },
+ "reason": {
+ "type": "text"
+ },
+ "repo": {
+ "type": "keyword"
+ },
+ "repoType": {
+ "type": "integer",
+ "doc_values": true
+ },
+ "req_caller_id": {
+ "type": "keyword"
+ },
+ "req_self_id": {
+ "type": "keyword"
+ },
+ "reqData": {
+ "type": "text"
+ },
+ "reqUser": {
+ "type": "keyword"
+ },
+ "reqEntityGuid": {
+ "type": "keyword"
+ },
+ "resType": {
+ "type": "keyword"
+ },
+ "resource": {
+ "type": "keyword"
+ },
+ "result": {
+ "type": "integer"
+ },
+ "seq_num": {
+ "type": "long",
+ "doc_values": true
+ },
+ "sess": {
+ "type": "keyword"
+ },
+ "tags": {
+ "type": "keyword"
+ },
+ "tags_str": {
+ "type": "text"
+ },
+ "text": {
+ "type": "text"
+ },
+ "zoneName": {
+ "type": "keyword"
+ },
+ "policyVersion": {
+ "type": "long"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/webapp/src/test/resources/deploy/elasticsearch/es-audit-mappings.json b/webapp/src/test/resources/deploy/elasticsearch/es-audit-mappings.json
new file mode 100644
index 00000000000..19d3506b10f
--- /dev/null
+++ b/webapp/src/test/resources/deploy/elasticsearch/es-audit-mappings.json
@@ -0,0 +1,45 @@
+{
+ "mappings": {
+ "properties": {
+ "entityQualifiedName": {
+ "type": "keyword"
+ },
+ "entityId": {
+ "type": "keyword"
+ },
+ "typeName": {
+ "type": "keyword"
+ },
+ "created": {
+ "type": "date"
+ },
+ "timestamp": {
+ "type": "date"
+ },
+ "action": {
+ "type": "keyword"
+ },
+ "detail": {
+ "type": "nested"
+ },
+ "user": {
+ "type": "keyword"
+ },
+ "eventKey": {
+ "type": "keyword"
+ }
+ },
+ "dynamic_templates": [
+ {
+ "atlan_headers_as_keyword": {
+ "path_match": "headers.x-atlan-*",
+ "mapping": {
+ "type": "keyword"
+ }
+ }
+ }
+ ],
+ "date_detection": false,
+ "numeric_detection": false
+ }
+}
diff --git a/webapp/src/test/resources/deploy/elasticsearch/es-mappings.json b/webapp/src/test/resources/deploy/elasticsearch/es-mappings.json
new file mode 100644
index 00000000000..56d12b2c0d4
--- /dev/null
+++ b/webapp/src/test/resources/deploy/elasticsearch/es-mappings.json
@@ -0,0 +1,54 @@
+{
+ "properties": {
+ "relationshipList": {
+ "type": "nested",
+ "properties": {
+ "typeName": {
+ "type": "keyword"
+ },
+ "guid": {
+ "type": "keyword"
+ },
+ "provenanceType": {
+ "type": "integer"
+ },
+ "endName": {
+ "type": "keyword"
+ },
+ "endGuid": {
+ "type": "keyword"
+ },
+ "endTypeName": {
+ "type": "keyword"
+ },
+ "endQualifiedName": {
+ "type": "keyword"
+ },
+ "label": {
+ "type": "keyword"
+ },
+ "propagateTags": {
+ "type": "keyword"
+ },
+ "status": {
+ "type": "keyword"
+ },
+ "createdBy": {
+ "type": "keyword"
+ },
+ "updatedBy": {
+ "type": "keyword"
+ },
+ "createTime": {
+ "type": "long"
+ },
+ "updateTime": {
+ "type": "long"
+ },
+ "version": {
+ "type": "long"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/webapp/src/test/resources/deploy/elasticsearch/es-search-logs-mappings.json b/webapp/src/test/resources/deploy/elasticsearch/es-search-logs-mappings.json
new file mode 100644
index 00000000000..43b960eb5b0
--- /dev/null
+++ b/webapp/src/test/resources/deploy/elasticsearch/es-search-logs-mappings.json
@@ -0,0 +1,185 @@
+{
+ "mappings": {
+ "properties": {
+ "request.attributes": {
+ "type": "keyword"
+ },
+ "request.relationAttributes": {
+ "type": "keyword"
+ },
+ "request.dsl": {
+ "type": "flattened"
+ },
+ "request.dslText": {
+ "type": "text",
+ "analyzer": "atlan_json_analyzer"
+ },
+
+
+ "persona": {
+ "type": "keyword",
+ "fields": {
+ "text": {
+ "type": "text",
+ "analyzer": "atlan_text_analyzer"
+ }
+ }
+ },
+ "purpose": {
+ "type": "keyword",
+ "fields": {
+ "text": {
+ "type": "text",
+ "analyzer": "atlan_text_analyzer"
+ }
+ }
+ },
+
+ "searchInput": {
+ "type": "text",
+ "analyzer": "atlan_text_analyzer",
+ "fields": {
+ "keyword": {
+ "type": "keyword"
+ },
+ "keyword_lowercase": {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+
+ "userAgent": {
+ "type": "keyword"
+ },
+ "host": {
+ "type": "keyword"
+ },
+ "ipAddress": {
+ "type": "keyword"
+ },
+ "userName": {
+ "type": "keyword"
+ },
+ "entityGuidsAll": {
+ "type": "keyword"
+ },
+ "entityQFNamesAll": {
+ "type": "keyword"
+ },
+ "entityGuidsAllowed": {
+ "type": "keyword"
+ },
+ "entityQFNamesAllowed": {
+ "type": "keyword"
+ },
+ "entityGuidsDenied": {
+ "type": "keyword"
+ },
+ "entityQFNamesDenied": {
+ "type": "keyword"
+ },
+
+ "entityTypeNamesAll": {
+ "type": "keyword"
+ },
+ "entityTypeNamesAllowed": {
+ "type": "keyword"
+ },
+ "entityTypeNamesDenied": {
+ "type": "keyword"
+ },
+
+ "utmTags": {
+ "type": "keyword"
+ },
+ "hasResult": {
+ "type": "boolean"
+ },
+ "isFailed": {
+ "type": "boolean"
+ },
+ "errorDetails": {
+ "type": "text"
+ },
+ "errorCode": {
+ "type": "keyword"
+ },
+ "resultsCount": {
+ "type": "long"
+ },
+ "timestamp": {
+ "type": "long"
+ },
+ "createdAt": {
+ "type": "long"
+ },
+ "responseTime": {
+ "type": "long"
+ }
+ }
+ },
+ "settings": {
+ "analysis": {
+ "analyzer": {
+ "atlan_text_analyzer": {
+ "type": "custom",
+ "tokenizer": "atlan_tokenizer",
+ "filter": [
+ "apostrophe",
+ "lowercase"
+ ],
+ "char_filter": [
+ "number_filter"
+ ]
+ },
+ "atlan_json_analyzer": {
+ "type": "custom",
+ "tokenizer": "atlan_json_tokenizer"
+ },
+ "atlan_text_stemmer": {
+ "type": "custom",
+ "tokenizer": "atlan_tokenizer",
+ "filter": [
+ "snowball_english",
+ "lowercase"
+ ],
+ "char_filter": [
+ "number_filter"
+ ]
+ }
+ },
+ "normalizer": {
+ "atlan_normalizer": {
+ "type": "custom",
+ "filter": [
+ "lowercase"
+ ]
+ }
+ },
+ "filter": {
+ "snowball_english": {
+ "type": "snowball",
+ "language": "English"
+ }
+ },
+ "tokenizer": {
+ "atlan_tokenizer": {
+ "type": "pattern",
+ "pattern": "( |_|-|'|/|@)"
+ },
+ "atlan_json_tokenizer": {
+ "type": "pattern",
+ "pattern": "(\"|\\{|\\}|:|\\[|\\]|\\,)"
+ }
+ },
+ "char_filter": {
+ "number_filter": {
+ "type": "pattern_replace",
+ "pattern": "\\d+",
+ "replacement": " $0"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/webapp/src/test/resources/deploy/elasticsearch/es-settings.json b/webapp/src/test/resources/deploy/elasticsearch/es-settings.json
new file mode 100644
index 00000000000..d4983d00dcd
--- /dev/null
+++ b/webapp/src/test/resources/deploy/elasticsearch/es-settings.json
@@ -0,0 +1,120 @@
+{
+ "mapping" : {
+ "total_fields" : {
+ "limit" : "2000"
+ },
+ "nested_objects" : {
+ "limit" : "100000"
+ }
+ },
+ "similarity": {
+ "default": {
+ "type": "boolean"
+ }
+ },
+ "analysis": {
+ "analyzer": {
+ "atlan_glossary_analyzer": {
+ "type": "custom",
+ "tokenizer": "atlan_glossary_tokenizer",
+ "filter": [
+ "lowercase"
+ ],
+ "char_filter": [
+ "letter_number_filter"
+ ]
+ },
+ "atlan_text_analyzer": {
+ "type": "custom",
+ "tokenizer": "atlan_tokenizer",
+ "filter": [
+ "apostrophe", "lowercase"
+ ],
+ "char_filter":[
+ "number_filter"
+ ]
+ },
+ "atlan_text_comma_analyzer": {
+ "type": "custom",
+ "tokenizer": "atlan_comma_tokenizer",
+ "filter": [
+ "lowercase"
+ ]
+ },
+ "atlan_text_stemmer": {
+ "type": "custom",
+ "tokenizer": "atlan_tokenizer",
+ "filter": [
+ "snowball_english", "lowercase"
+ ],
+ "char_filter":[
+ "number_filter"
+ ]
+ },
+ "search_synonyms": {
+ "type": "custom",
+ "filter": [
+ "graph_synonyms", "lowercase"
+ ],
+ "tokenizer": "atlan_tokenizer"
+ },
+ "truncate_analyzer": {
+ "char_filter": [
+ "truncate_filter"
+ ],
+ "tokenizer": "standard"
+ }
+ },
+ "normalizer": {
+ "atlan_normalizer": {
+ "type": "custom",
+ "filter": ["lowercase"]
+ }
+ },
+ "filter": {
+ "graph_synonyms": {
+ "type": "synonym_graph",
+ "synonyms": [ "foo, bar => baz" ]
+ },
+ "snowball_english": {
+ "type": "snowball",
+ "language": "English"
+ }
+ },
+ "tokenizer": {
+ "atlan_glossary_tokenizer": {
+ "type": "char_group",
+ "tokenize_on_chars": [
+ "whitespace",
+ "punctuation",
+ "symbol"
+ ]
+ },
+ "atlan_tokenizer": {
+ "type": "pattern",
+ "pattern": "( |_|-|'|/|@)"
+ },
+ "atlan_comma_tokenizer": {
+ "type": "pattern",
+ "pattern": ","
+ }
+ },
+ "char_filter":{
+ "letter_number_filter": {
+ "type": "pattern_replace",
+ "pattern": "\\d+",
+ "replacement": " $0 "
+ },
+ "number_filter":{
+ "type":"pattern_replace",
+ "pattern":"\\d+",
+ "replacement":" $0"
+ },
+ "truncate_filter": {
+ "pattern": "(^.{0,100000}).*$",
+ "type": "pattern_replace",
+ "replacement": "$1 "
+ }
+ }
+ }
+}
diff --git a/webapp/src/test/resources/deploy/models/0000-Area0/0010-base_model.json b/webapp/src/test/resources/deploy/models/0000-Area0/0010-base_model.json
new file mode 100644
index 00000000000..90146fd071d
--- /dev/null
+++ b/webapp/src/test/resources/deploy/models/0000-Area0/0010-base_model.json
@@ -0,0 +1,9460 @@
+{
+ "classificationDefs":
+ [],
+ "enumDefs":
+ [
+ {
+ "category": "ENUM",
+ "name": "SourceCostUnitType",
+ "description": "Unit used when calculating cost of source queries.",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.1",
+ "elementDefs":
+ [
+ {
+ "value": "Credits",
+ "ordinal": 0
+ },
+ {
+ "value": "bytes",
+ "ordinal": 1
+ },
+ {
+ "value": "slot-ms",
+ "ordinal": 2
+ }
+ ]
+ },
+ {
+ "name": "AtlasGlossaryTermRelationshipStatus",
+ "description": "How reliable the relationship is between two glossary terms.",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "elementDefs":
+ [
+ {
+ "ordinal": 0,
+ "value": "DRAFT",
+ "description": "DRAFT means the relationship is under development."
+ },
+ {
+ "ordinal": 1,
+ "value": "ACTIVE",
+ "description": "ACTIVE means the relationship is validated and in use."
+ },
+ {
+ "ordinal": 2,
+ "value": "DEPRECATED",
+ "description": "DEPRECATED means the the relationship is being phased out."
+ },
+ {
+ "ordinal": 3,
+ "value": "OBSOLETE",
+ "description": "OBSOLETE means that the relationship should not be used anymore."
+ },
+ {
+ "ordinal": 99,
+ "value": "OTHER",
+ "description": "OTHER means that there is another status."
+ }
+ ]
+ },
+ {
+ "name": "AtlasGlossaryTermAssignmentStatus",
+ "description": "How much the semantic assignment should be trusted.",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "elementDefs":
+ [
+ {
+ "value": "DISCOVERED",
+ "ordinal": 0,
+ "description": "DISCOVERED means that the semantic assignment was added by a discovery engine."
+ },
+ {
+ "value": "PROPOSED",
+ "ordinal": 1,
+ "description": "PROPOSED means that the semantic assignment was proposed by person - they may be a subject matter expert, or consumer of the Referenceable asset"
+ },
+ {
+ "value": "IMPORTED",
+ "ordinal": 2,
+ "description": "IMPORTED means that the semantic assignment has been imported from outside of the open metadata cluster"
+ },
+ {
+ "value": "VALIDATED",
+ "ordinal": 3,
+ "description": "VALIDATED means that the semantic assignment has been reviewed and is highly trusted."
+ },
+ {
+ "value": "DEPRECATED",
+ "ordinal": 4,
+ "description": "DEPRECATED means that the semantic assignment is being phased out. There may be another semantic assignment to the Referenceable that will ultimately replace this one."
+ },
+ {
+ "value": "OBSOLETE",
+ "ordinal": 5,
+ "description": "OBSOLETE means that the semantic assignment is no longer in use,"
+ },
+ {
+ "value": "OTHER",
+ "ordinal": 6,
+ "description": "OTHER means that the semantic assignment value does not match any of the other Term Assignment Status values"
+ }
+ ]
+ },
+ {
+ "name": "AtlasGlossaryType",
+ "description": "Defines type of the Glossary",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "elementDefs":
+ [
+ {
+ "ordinal": 0,
+ "value": "KNOWLEDGE_HUB",
+ "description": "Glossary will be used to store knowledge as documents"
+ }
+ ]
+ },
+ {
+ "name": "AtlasGlossaryCategoryType",
+ "description": "Defines type if the Glossary Category",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "elementDefs":
+ [
+ {
+ "ordinal": 0,
+ "value": "DOCUMENT_FOLDER",
+ "description": "Document Folder will contain Documents"
+ }
+ ]
+ },
+ {
+ "name": "AtlasGlossaryTermType",
+ "description": "Defines type if the Glossary Term",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "elementDefs":
+ [
+ {
+ "ordinal": 0,
+ "value": "DOCUMENT",
+ "description": "Will represent Document as knowledge hub"
+ }
+ ]
+ },
+ {
+ "name": "table_type",
+ "description": "Type of the table.",
+ "typeVersion": "1.0",
+ "serviceType": "atlas_core",
+ "elementDefs":
+ [
+ {
+ "ordinal": 0,
+ "value": "TEMPORARY"
+ },
+ {
+ "ordinal": 1,
+ "value": "ICEBERG"
+ },
+ {
+ "ordinal": 2,
+ "value": "KUDU"
+ }
+ ]
+ },
+ {
+ "category": "ENUM",
+ "name": "SchemaRegistrySchemaType",
+ "description": "The SchemaRegistrySchemaType enum defines the possible values for languages that are supported as schema definition",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "elementDefs":
+ [
+ {
+ "value": "AVRO",
+ "ordinal": 0
+ },
+ {
+ "value": "JSON",
+ "ordinal": 1
+ },
+ {
+ "value": "PROTOBUF",
+ "ordinal": 2
+ }
+ ]
+ },
+ {
+ "category": "ENUM",
+ "name": "query_username_strategy",
+ "description": "Defines username used to override while making queries",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "elementDefs":
+ [
+ {
+ "value": "connectionUsername",
+ "ordinal": 0
+ },
+ {
+ "value": "atlanUsername",
+ "ordinal": 1
+ }
+ ]
+ },
+ {
+ "name": "FormFieldType",
+ "description": "Type of the field in a form.",
+ "typeVersion": "1.0",
+ "serviceType": "atlas_core",
+ "elementDefs":
+ [
+ {
+ "ordinal": 0,
+ "value": "INT"
+ },
+ {
+ "ordinal": 1,
+ "value": "STRING"
+ },
+ {
+ "ordinal": 2,
+ "value": "DATE"
+ },
+ {
+ "ordinal": 3,
+ "value": "BOOLEAN"
+ },
+ {
+ "ordinal": 4,
+ "value": "LONG"
+ },
+ {
+ "ordinal": 5,
+ "value": "JSON"
+ }
+ ]
+ },
+ {
+ "name": "FormFieldDimension",
+ "description": "Type of the field's value in a form.",
+ "typeVersion": "1.0",
+ "serviceType": "atlas_core",
+ "elementDefs":
+ [
+ {
+ "ordinal": 0,
+ "value": "SINGLE"
+ },
+ {
+ "ordinal": 1,
+ "value": "MULTI"
+ }
+ ]
+ },
+ {
+ "category": "ENUM",
+ "name": "AIDatasetType",
+ "description": "Defines the possible types on AI dataset.",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "elementDefs":
+ [
+ {
+ "value": "TRAINING",
+ "ordinal": 0
+ },
+ {
+ "value": "TESTING",
+ "ordinal": 1
+ },
+ {
+ "value": "INFERENCE",
+ "ordinal": 2
+ },
+ {
+ "value": "VALIDATION",
+ "ordinal": 3
+ },
+ {
+ "value": "OUTPUT",
+ "ordinal": 4
+ }
+ ]
+ },
+ {
+ "name": "certificate_status",
+ "description": "Defines possible certificate statuses.",
+ "typeVersion": "1.1",
+ "serviceType": "atlas_core",
+ "elementDefs":
+ [
+ {
+ "ordinal": 0,
+ "value": "DEPRECATED"
+ },
+ {
+ "ordinal": 1,
+ "value": "DRAFT"
+ },
+ {
+ "ordinal": 2,
+ "value": "VERIFIED"
+ }
+ ]
+ },
+ {
+ "name": "google_datastudio_asset_type",
+ "description": "Defines the types of assets available in Google Data Studio.",
+ "typeVersion": "1.0",
+ "serviceType": "atlas_core",
+ "elementDefs":
+ [
+ {
+ "ordinal": 0,
+ "value": "REPORT"
+ },
+ {
+ "ordinal": 1,
+ "value": "DATA_SOURCE"
+ }
+ ]
+ },
+ {
+ "name": "powerbi_endorsement",
+ "description": "Defines available endorsement statuses for Power BI assets.",
+ "typeVersion": "1.0",
+ "serviceType": "atlas_core",
+ "category": "ENUM",
+ "elementDefs":
+ [
+ {
+ "ordinal": 0,
+ "value": "Promoted"
+ },
+ {
+ "ordinal": 1,
+ "value": "Certified"
+ }
+ ]
+ },
+ {
+ "name": "atlas_operation",
+ "description": "Defines audit operations in Atlas",
+ "typeVersion": "1.0",
+ "serviceType": "atlas_core",
+ "elementDefs": [
+ {
+ "ordinal": 0,
+ "value": "OTHERS"
+ },
+ {
+ "ordinal": 1,
+ "value": "PURGE"
+ },
+ {
+ "ordinal": 2,
+ "value": "EXPORT"
+ },
+ {
+ "ordinal": 3,
+ "value": "IMPORT"
+ },
+ {
+ "ordinal": 4,
+ "value": "IMPORT_DELETE_REPL"
+ },
+ {
+ "ordinal": 5,
+ "value": "TYPE_DEF_CREATE"
+ },
+ {
+ "ordinal": 6,
+ "value": "TYPE_DEF_UPDATE"
+ },
+ {
+ "ordinal": 7,
+ "value": "TYPE_DEF_DELETE"
+ },
+ {
+ "ordinal": 8,
+ "value": "SERVER_START"
+ },
+ {
+ "ordinal": 9,
+ "value": "SERVER_STATE_ACTIVE"
+ }
+ ]
+ },
+ {
+ "category": "ENUM",
+ "name": "AuthPolicyType",
+ "description": "Policy Item type",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.1",
+ "elementDefs":
+ [
+ {
+ "value": "allow",
+ "ordinal": 0
+ },
+ {
+ "value": "deny",
+ "ordinal": 1
+ },
+ {
+ "value": "allowExceptions",
+ "ordinal": 2
+ },
+ {
+ "value": "denyExceptions",
+ "ordinal": 3
+ },
+ {
+ "value": "dataMask",
+ "ordinal": 4
+ },
+ {
+ "value": "rowFilter",
+ "ordinal": 5
+ }
+ ]
+ },
+ {
+ "category": "ENUM",
+ "name": "AuthPolicyCategory",
+ "description": "Policy category",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.1",
+ "elementDefs": [
+ {
+ "value": "bootstrap",
+ "ordinal": 0
+ },
+ {
+ "value": "persona",
+ "ordinal": 1
+ },
+ {
+ "value": "purpose",
+ "ordinal": 2
+ }
+ ]
+ },
+ {
+ "category": "ENUM",
+ "name": "AuthPolicyResourceCategory",
+ "description": "Policy resource category",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.1",
+ "elementDefs":
+ [
+ {
+ "value": "ENTITY",
+ "ordinal": 0
+ },
+ {
+ "value": "RELATIONSHIP",
+ "ordinal": 1
+ },
+ {
+ "value": "TAG",
+ "ordinal": 2
+ },
+ {
+ "value": "CUSTOM",
+ "ordinal": 3
+ },
+ {
+ "value": "TYPEDEFS",
+ "ordinal": 4
+ },
+ {
+ "value": "ADMIN",
+ "ordinal": 5
+ }
+ ]
+ }
+ ],
+ "structDefs":
+ [
+ {
+ "name": "PopularityInsights",
+ "description": "Detailed information about an asset's usage or popularity based on aggregated queries.",
+ "serviceType": "atlan",
+ "typeVersion": "1.0",
+ "attributeDefs":
+ [
+ {
+ "name": "recordUser",
+ "description": "Username or email of the user who ran the queries.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true
+ },
+ {
+ "name": "recordQuery",
+ "description": "Query run at source.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": false
+ },
+ {
+ "name": "recordQueryDuration",
+ "description": "Duration for which the query ran at source.",
+ "typeName": "long",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true
+ },
+ {
+ "name": "recordQueryCount",
+ "description": "Number of queries run by the user.",
+ "typeName": "long",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false,
+ "skipScrubbing": true
+ },
+ {
+ "name": "recordTotalUserCount",
+ "description": "Total number of users who ran queries.",
+ "typeName": "long",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false,
+ "skipScrubbing": true
+ },
+ {
+ "name": "recordComputeCost",
+ "description": "Total compute cost for running all queries.",
+ "typeName": "float",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "recordMaxComputeCost",
+ "description": "Maximum compute cost across all query runs.",
+ "typeName": "float",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "recordComputeCostUnit",
+ "description": "Unit of measure for recordComputeCost.",
+ "typeName": "SourceCostUnitType",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": false
+ },
+ {
+ "name": "recordLastTimestamp",
+ "typeName": "date",
+ "description": "Timestamp of last operation or query run by the user.",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false
+ },
+ {
+ "name": "recordWarehouse",
+ "description": "Name of the warehouse on which the queries were run.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": false
+ }
+ ]
+ },
+ {
+ "name": "StarredDetails",
+ "description": "Detailed information about the users who have starred an asset.",
+ "serviceType": "atlan",
+ "typeVersion": "1.0",
+ "attributeDefs":
+ [
+ {
+ "name": "assetStarredBy",
+ "description": "Username of the user who starred the asset.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true
+ },
+ {
+ "name": "assetStarredAt",
+ "typeName": "date",
+ "description": "Time at which the user starred the asset.",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false
+ }
+ ]
+ },
+ {
+ "name": "Histogram",
+ "description": "Detailed information representing a histogram of values.",
+ "typeVersion": "1.0",
+ "attributeDefs":
+ [
+ {
+ "name": "boundaries",
+ "description": "Boundaries of the histogram.",
+ "typeName": "array",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "frequencies",
+ "description": "Frequencies of the histogram.",
+ "typeName": "array",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": false,
+ "isUnique": false
+ }
+ ]
+ },
+ {
+ "name": "ColumnValueFrequencyMap",
+ "description": "Detailed information representing a column value and it's frequency.",
+ "typeVersion": "1.0",
+ "attributeDefs":
+ [
+ {
+ "name": "columnValue",
+ "description": "Sample value for the column.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "columnValueFrequency",
+ "description": "Frequency of the sample value in the column.",
+ "typeName": "long",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ }
+ ]
+ },
+ {
+ "name": "FormField",
+ "description": "Structure of a field in a form.",
+ "serviceType": "atlan",
+ "typeVersion": "1.0",
+ "attributeDefs":
+ [
+ {
+ "name": "formFieldId",
+ "description": "Unique identifier of the field in a form.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "indexType": "STRING",
+ "includeInNotification": true
+ },
+ {
+ "name": "formFieldName",
+ "description": "Name of the field in a form.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "indexType": "STRING",
+ "includeInNotification": true
+ },
+ {
+ "name": "formFieldType",
+ "description": "Type of the field in a form.",
+ "typeName": "FormFieldType",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "indexType": "STRING",
+ "includeInNotification": true
+ },
+ {
+ "name": "formFieldDimension",
+ "description": "Dimension of the field's value in a form.",
+ "typeName": "FormFieldDimension",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "indexType": "STRING",
+ "includeInNotification": true
+ },
+ {
+ "name": "formFieldOptions",
+ "description": "Options of the field in a form.",
+ "typeName": "map",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ }
+ ]
+ },
+ {
+ "name": "AuthPolicyValiditySchedule",
+ "description": "Validity schedule struct for policy",
+ "serviceType": "atlan",
+ "typeVersion": "1.1",
+ "attributeDefs":
+ [
+ {
+ "name": "policyValidityScheduleStartTime",
+ "typeName": "string",
+ "indexType": "STRING",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "policyValidityScheduleEndTime",
+ "typeName": "string",
+ "indexType": "STRING",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "policyValidityScheduleTimezone",
+ "typeName": "string",
+ "indexType": "STRING",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": false,
+ "isUnique": false
+ }
+ ]
+ },
+ {
+ "name": "AuthPolicyCondition",
+ "description": "Policy condition schedule struct",
+ "serviceType": "atlan",
+ "typeVersion": "1.1",
+ "attributeDefs":
+ [
+ {
+ "name": "policyConditionType",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "policyConditionValues",
+ "typeName": "array",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": false,
+ "isUnique": false
+ }
+ ]
+ },
+ {
+ "name": "SourceTagAttachmentValue",
+ "description": "Detailed information about the value of a source tag's attachment to an asset.",
+ "serviceType": "atlan",
+ "typeVersion": "1.0",
+ "attributeDefs": [
+ {
+ "name": "tagAttachmentKey",
+ "description": "Attachment key, for example: 'has_pii' or 'type_pii'.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false
+ },
+ {
+ "name": "tagAttachmentValue",
+ "description": "Attachment value, for example: 'true' or 'email'.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false
+ }
+ ]
+ },
+ {
+ "name": "SourceTagAttribute",
+ "description": "Detailed information about a source tag's attributes.",
+ "serviceType": "atlan",
+ "typeVersion": "1.0",
+ "attributeDefs": [
+ {
+ "name": "tagAttributeKey",
+ "description": "Attribute key, for example: 'allowedValues' or 'enabled'.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false
+ },
+ {
+ "name": "tagAttributeValue",
+ "description": "Attribute value, for example: '[\"Private\", \"PII\"]' for allowedValues key or 'true' for enabled key.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false
+ },
+ {
+ "name": "tagAttributeProperties",
+ "description": "Properties of the attribute.",
+ "typeName": "map",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false
+ }
+ ]
+ },
+ {
+ "name": "SourceTagAttachment",
+ "description": "Detailed information about the attachment of a tag to an Atlan asset, synced from source.",
+ "serviceType": "atlan",
+ "typeVersion": "1.0",
+ "attributeDefs": [
+ {
+ "name": "sourceTagName",
+ "description": "Simple name of the source tag.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "indexTypeESConfig": {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields": {
+ "keyword": {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "sourceTagQualifiedName",
+ "description": "Unique name of the source tag, in Atlan.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false
+ },
+ {
+ "name": "sourceTagGuid",
+ "description": "Unique identifier (GUID) of the source tag, in Atlan.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false
+ },
+ {
+ "name": "sourceTagConnectorName",
+ "description": "Connector that is the source of the tag.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false
+ },
+ {
+ "name": "sourceTagValue",
+ "description": "Value of the tag attachment, from the source.",
+ "typeName": "array",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "isIndexable": false
+ },
+ {
+ "name": "isSourceTagSynced",
+ "description": "Whether the tag attachment has been synced at the source (true) or not (false).",
+ "typeName": "boolean",
+ "isOptional": true,
+ "defaultValue": false,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false
+ },
+ {
+ "name": "sourceTagSyncTimestamp",
+ "description": "Time (epoch) when the tag attachment was synced at the source, in milliseconds.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "indexTypeESFields": {
+ "date": {
+ "type": "date",
+ "format": "epoch_millis"
+ }
+ }
+ },
+ {
+ "name": "sourceTagSyncError",
+ "description": "Error message if the tag attachment sync at the source failed.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false
+ },
+ {
+ "name": "sourceTagType",
+ "description": "Specifies the source tag type.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false
+ }
+ ]
+ }
+ ],
+ "entityDefs":
+ [
+ {
+ "name": "__internal",
+ "superTypes": [],
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "attributeDefs": []
+ },
+ {
+ "name": "AtlasServer",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "superTypes": [
+ ],
+ "attributeDefs": [
+ {
+ "name": "AtlasServer.name",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "AtlasServer.displayName",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "fullName",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": true
+ },
+ {
+ "name": "urls",
+ "typeName": "array",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "additionalInfo",
+ "typeName": "map",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ }
+ ]
+ },
+ {
+ "name": "__AtlasUserProfile",
+ "superTypes": [
+ "__internal"
+ ],
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "attributeDefs": [
+ {
+ "name": "__AtlasUserProfile.name",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": true
+ },
+ {
+ "name": "fullName",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "savedSearches",
+ "typeName": "array<__AtlasUserSavedSearch>",
+ "cardinality": "SET",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false,
+ "constraints": [
+ {
+ "type": "ownedRef"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "__AtlasUserSavedSearch",
+ "superTypes": [
+ "__internal"
+ ],
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "attributeDefs": [
+ {
+ "name": "__AtlasUserSavedSearch.name",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "ownerName",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "searchType",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "uniqueName",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": true
+ },
+ {
+ "name": "searchParameters",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "uiParameters",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ }
+ ]
+ },
+ {
+ "name": "__ExportImportAuditEntry",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "superTypes": [
+ "__internal"
+ ],
+ "attributeDefs": [
+ {
+ "name": "userName",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "operation",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "sourceServerName",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "targetServerName",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "operationParams",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "operationStartTime",
+ "typeName": "long",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "operationEndTime",
+ "typeName": "long",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "resultSummary",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ }
+ ]
+ },
+ {
+ "name": "__AtlasAuditEntry",
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "superTypes": [
+ "__internal"
+ ],
+ "attributeDefs": [
+ {
+ "name": "userName",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "operation",
+ "typeName": "atlas_operation",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "startTime",
+ "typeName": "date",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "endTime",
+ "typeName": "date",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "clientId",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "params",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "result",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "resultCount",
+ "typeName": "long",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": true,
+ "isUnique": false
+ }
+ ]
+ },
+ {
+ "name": "Referenceable",
+ "description": "Base class for everything in Atlan that can be referenced by qualifiedName.",
+ "superTypes":
+ [],
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "attributeDefs":
+ [
+ {
+ "name": "qualifiedName",
+ "description": "Unique name for this asset. This is typically a concatenation of the asset's name onto its parent's qualifiedName. This must be unique across all assets of the same type.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": true,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "type": "text",
+ "analyzer": "atlan_text_analyzer"
+ }
+ }
+ },
+ {
+ "name": "replicatedFrom",
+ "description": "Unused. List of servers where this entity is replicated from.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false,
+ "options":
+ {
+ "isSoftReference": "true"
+ }
+ },
+ {
+ "name": "replicatedTo",
+ "description": "Unused. List of servers where this entity is replicated to.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false,
+ "options":
+ {
+ "isSoftReference": "true"
+ }
+ }
+ ]
+ },
+ {
+ "name": "Asset",
+ "description": "Base class for all assets.",
+ "superTypes":
+ [
+ "Referenceable"
+ ],
+ "serviceType": "atlas_core",
+ "typeVersion": "1.4",
+ "attributeDefs":
+ [
+ {
+ "name": "name",
+ "description": "Name of this asset. Fallback for display purposes, if displayName is empty.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": false,
+ "searchWeight": 10,
+ "skipScrubbing": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ },
+ "stemmed":
+ {
+ "type": "text",
+ "analyzer": "atlan_text_stemmer"
+ }
+ }
+ },
+ {
+ "name": "displayName",
+ "description": "Human-readable name of this asset used for display purposes (in user interface).",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": true,
+ "isUnique": false,
+ "searchWeight": 10,
+ "skipScrubbing": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword"
+ }
+ }
+ },
+ {
+ "name": "description",
+ "description": "Description of this asset, for example as crawled from a source. Fallback for display purposes, if userDescription is empty.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false,
+ "searchWeight": 9,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "userDescription",
+ "description": "Description of this asset, as provided by a user. If present, this will be used for the description in user interface.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": true,
+ "isUnique": false,
+ "searchWeight": 9,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "tenantId",
+ "description": "Name of the Atlan workspace in which this asset exists.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": true,
+ "isUnique": false,
+ "skipScrubbing": true
+ },
+ {
+ "name": "certificateStatus",
+ "description": "Status of this asset's certification.",
+ "typeName": "certificate_status",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "isIndexable": true,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "autoUpdateAttributes":
+ {
+ "user":
+ [
+ "certificateUpdatedBy"
+ ],
+ "timestamp":
+ [
+ "certificateUpdatedAt"
+ ]
+ },
+ "indexTypeESConfig":
+ {
+ "normalizer": "atlan_normalizer"
+ },
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "type": "text"
+ }
+ }
+ },
+ {
+ "name": "certificateStatusMessage",
+ "description": "Human-readable descriptive message used to provide further detail to certificateStatus.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "autoUpdateAttributes":
+ {
+ "user":
+ [
+ "certificateUpdatedBy"
+ ],
+ "timestamp":
+ [
+ "certificateUpdatedAt"
+ ]
+ }
+ },
+ {
+ "name": "certificateUpdatedBy",
+ "description": "Name of the user who last updated the certification of this asset.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "certificateUpdatedAt",
+ "description": "Time (epoch) at which the certification was last updated, in milliseconds.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "indexTypeESFields":
+ {
+ "date":
+ {
+ "type": "date",
+ "format": "epoch_millis"
+ }
+ }
+ },
+ {
+ "name": "announcementTitle",
+ "description": "Brief title for the announcement on this asset. Required when announcementType is specified.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "autoUpdateAttributes":
+ {
+ "user":
+ [
+ "announcementUpdatedBy"
+ ],
+ "timestamp":
+ [
+ "announcementUpdatedAt"
+ ]
+ }
+ },
+ {
+ "name": "announcementMessage",
+ "description": "Detailed message to include in the announcement on this asset.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "autoUpdateAttributes":
+ {
+ "user":
+ [
+ "announcementUpdatedBy"
+ ],
+ "timestamp":
+ [
+ "announcementUpdatedAt"
+ ]
+ }
+ },
+ {
+ "name": "announcementType",
+ "description": "Type of announcement on this asset.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "autoUpdateAttributes":
+ {
+ "user":
+ [
+ "announcementUpdatedBy"
+ ],
+ "timestamp":
+ [
+ "announcementUpdatedAt"
+ ]
+ }
+ },
+ {
+ "name": "announcementUpdatedAt",
+ "description": "Time (epoch) at which the announcement was last updated, in milliseconds.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "indexTypeESFields":
+ {
+ "date":
+ {
+ "type": "date",
+ "format": "epoch_millis"
+ }
+ }
+ },
+ {
+ "name": "announcementUpdatedBy",
+ "description": "Name of the user who last updated the announcement.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "ownerUsers",
+ "description": "List of users who own this asset.",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "ownerGroups",
+ "description": "List of groups who own this asset.",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "adminUsers",
+ "description": "List of users who administer this asset. (This is only used for certain asset types.)",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "adminGroups",
+ "description": "List of groups who administer this asset. (This is only used for certain asset types.)",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "viewerUsers",
+ "description": "List of users who can view assets contained in a collection. (This is only used for certain asset types.)",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "viewerGroups",
+ "description": "List of groups who can view assets contained in a collection. (This is only used for certain asset types.)",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "connectorName",
+ "description": "Type of the connector through which this asset is accessible.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "connectionName",
+ "description": "Simple name of the connection through which this asset is accessible.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "type": "text"
+ }
+ }
+ },
+ {
+ "name": "connectionQualifiedName",
+ "description": "Unique name of the connection through which this asset is accessible.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "type": "text",
+ "analyzer": "atlan_text_analyzer"
+ }
+ }
+ },
+ {
+ "name": "__hasLineage",
+ "description": "Whether this asset has lineage (true) or not (false).",
+ "typeName": "boolean",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "isIndexable": true,
+ "includeInNotification": false,
+ "skipScrubbing": true,
+ "defaultValue": false
+ },
+ {
+ "name": "isDiscoverable",
+ "description": "Whether this asset is discoverable through the UI (true) or not (false).",
+ "typeName": "boolean",
+ "isOptional": true,
+ "defaultValue": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "isEditable",
+ "description": "Whether this asset can be edited in the UI (true) or not (false).",
+ "typeName": "boolean",
+ "isOptional": true,
+ "defaultValue": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "subType",
+ "description": "Subtype of this asset.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "viewScore",
+ "description": "View score for this asset.",
+ "typeName": "float",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "defaultValue": 1.17549435E-38,
+ "includeInNotification": false,
+ "indexTypeESFields":
+ {
+ "rank_feature":
+ {
+ "type": "rank_feature"
+ }
+ }
+ },
+ {
+ "name": "popularityScore",
+ "description": "Popularity score for this asset.",
+ "typeName": "float",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "defaultValue": 1.17549435E-38,
+ "includeInNotification": true,
+ "indexTypeESFields":
+ {
+ "rank_feature":
+ {
+ "type": "rank_feature"
+ }
+ }
+ },
+ {
+ "name": "sourceOwners",
+ "description": "List of owners of this asset, in the source system.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "skipScrubbing": true,
+ "isUnique": false,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "sourceCreatedBy",
+ "description": "Name of the user who created this asset, in the source system.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "skipScrubbing": true,
+ "isUnique": false,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "sourceCreatedAt",
+ "description": "Time (epoch) at which this asset was created in the source system, in milliseconds.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "indexTypeESFields":
+ {
+ "date":
+ {
+ "type": "date",
+ "format": "epoch_millis"
+ }
+ }
+ },
+ {
+ "name": "sourceUpdatedAt",
+ "description": "Time (epoch) at which this asset was last updated in the source system, in milliseconds.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "indexTypeESFields":
+ {
+ "date":
+ {
+ "type": "date",
+ "format": "epoch_millis"
+ }
+ }
+ },
+ {
+ "name": "sourceUpdatedBy",
+ "description": "Name of the user who last updated this asset, in the source system.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "sourceURL",
+ "description": "URL to the resource within the source application, used to create a button to view this asset in the source application.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "sourceEmbedURL",
+ "description": "URL to create an embed for a resource (for example, an image of a dashboard) within Atlan.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "lastSyncWorkflowName",
+ "description": "Name of the crawler that last synchronized this asset.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "lastSyncRunAt",
+ "description": "Time (epoch) at which this asset was last crawled, in milliseconds.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "lastSyncRun",
+ "description": "Name of the last run of the crawler that last synchronized this asset.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "adminRoles",
+ "description": "List of roles who administer this asset. (This is only used for Connection assets.)",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "sourceReadCount",
+ "description": "Total count of all read operations at source.",
+ "typeName": "long",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "sourceReadUserCount",
+ "description": "Total number of unique users that read data from asset.",
+ "typeName": "long",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "sourceLastReadAt",
+ "description": "Timestamp of most recent read operation.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false,
+ "indexTypeESFields":
+ {
+ "date":
+ {
+ "type": "date",
+ "format": "epoch_millis"
+ }
+ }
+ },
+ {
+ "name": "lastRowChangedAt",
+ "description": "Time (epoch) of the last operation that inserted, updated, or deleted rows, in milliseconds.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false,
+ "indexTypeESFields":
+ {
+ "date":
+ {
+ "type": "date",
+ "format": "epoch_millis"
+ }
+ }
+ },
+ {
+ "name": "sourceTotalCost",
+ "description": "Total cost of all operations at source.",
+ "typeName": "float",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "sourceCostUnit",
+ "description": "The unit of measure for sourceTotalCost.",
+ "typeName": "SourceCostUnitType",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": false
+ },
+ {
+ "name": "sourceReadQueryCost",
+ "description": "Total cost of read queries at source.",
+ "typeName": "float",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "sourceReadRecentUserList",
+ "description": "List of usernames of the most recent users who read this asset.",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "sourceReadRecentUserRecordList",
+ "description": "List of usernames with extra insights for the most recent users who read this asset.",
+ "typeName": "array",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "sourceReadTopUserList",
+ "description": "List of usernames of the users who read this asset the most.",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "sourceReadTopUserRecordList",
+ "description": "List of usernames with extra insights for the users who read this asset the most.",
+ "typeName": "array",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "sourceReadPopularQueryRecordList",
+ "description": "List of the most popular queries that accessed this asset.",
+ "typeName": "array",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "sourceReadExpensiveQueryRecordList",
+ "description": "List of the most expensive queries that accessed this asset.",
+ "typeName": "array",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "sourceReadSlowQueryRecordList",
+ "description": "List of the slowest queries that accessed this asset.",
+ "typeName": "array",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "sourceQueryComputeCostList",
+ "description": "List of most expensive warehouse names.",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "sourceQueryComputeCostRecordList",
+ "description": "List of most expensive warehouses with extra insights.",
+ "typeName": "array",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "dbtQualifiedName",
+ "description": "Unique name of this asset in dbt.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": true,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "type": "text",
+ "analyzer": "atlan_text_analyzer"
+ }
+ }
+ },
+ {
+ "name": "assetDbtWorkflowLastUpdated",
+ "description": "Name of the DBT workflow in Atlan that last updated the asset.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetDbtAlias",
+ "description": "Alias of this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "assetDbtMeta",
+ "description": "Metadata for this asset in dbt, specifically everything under the 'meta' key in the dbt object.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "assetDbtUniqueId",
+ "description": "Unique identifier of this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "assetDbtAccountName",
+ "description": "Name of the account in which this asset exists in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "assetDbtProjectName",
+ "description": "Name of the project in which this asset exists in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "assetDbtPackageName",
+ "description": "Name of the package in which this asset exists in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "assetDbtJobName",
+ "description": "Name of the job that materialized this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "assetDbtJobSchedule",
+ "description": "Schedule of the job that materialized this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "indexType": "STRING",
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobStatus",
+ "description": "Status of the job that materialized this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetDbtTestStatus",
+ "description": "All associated dbt test statuses.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetDbtJobScheduleCronHumanized",
+ "description": "Human-readable cron schedule of the job that materialized this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ }
+ },
+ {
+ "name": "assetDbtJobLastRun",
+ "description": "Time (epoch) at which the job that materialized this asset in dbt last ran, in milliseconds.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobLastRunUrl",
+ "description": "URL of the last run of the job that materialized this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetDbtJobLastRunCreatedAt",
+ "description": "Time (epoch) at which the job that materialized this asset in dbt was last created, in milliseconds.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobLastRunUpdatedAt",
+ "description": "Time (epoch) at which the job that materialized this asset in dbt was last updated, in milliseconds.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobLastRunDequedAt",
+ "description": "Time (epoch) at which the job that materialized this asset in dbt was dequeued, in milliseconds.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobLastRunStartedAt",
+ "description": "Time (epoch) at which the job that materialized this asset in dbt was started running, in milliseconds.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobLastRunTotalDuration",
+ "description": "Total duration of the last run of the job that materialized this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "indexType": "STRING",
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobLastRunTotalDurationHumanized",
+ "description": "Human-readable total duration of the last run of the job that materialized this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobLastRunQueuedDuration",
+ "description": "Total duration the job that materialized this asset in dbt spent being queued.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "indexType": "STRING",
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobLastRunQueuedDurationHumanized",
+ "description": "Human-readable total duration of the last run of the job that materialized this asset in dbt spend being queued.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetDbtJobLastRunRunDuration",
+ "description": "Run duration of the last run of the job that materialized this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "indexType": "STRING",
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobLastRunRunDurationHumanized",
+ "description": "Human-readable run duration of the last run of the job that materialized this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetDbtJobLastRunGitBranch",
+ "description": "Branch in git from which the last run of the job that materialized this asset in dbt ran.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexType": "STRING",
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "analyzer": "atlan_text_analyzer",
+ "type": "text"
+ }
+ }
+ },
+ {
+ "name": "assetDbtJobLastRunGitSha",
+ "description": "SHA hash in git for the last run of the job that materialized this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetDbtJobLastRunStatusMessage",
+ "description": "Status message of the last run of the job that materialized this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "assetDbtJobLastRunOwnerThreadId",
+ "description": "Thread ID of the owner of the last run of the job that materialized this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetDbtJobLastRunExecutedByThreadId",
+ "description": "Thread ID of the user who executed the last run of the job that materialized this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetDbtJobLastRunArtifactsSaved",
+ "description": "Whether artifacts were saved from the last run of the job that materialized this asset in dbt (true) or not (false).",
+ "typeName": "boolean",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobLastRunArtifactS3Path",
+ "description": "Path in S3 to the artifacts saved from the last run of the job that materialized this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetDbtJobLastRunHasDocsGenerated",
+ "description": "Whether docs were generated from the last run of the job that materialized this asset in dbt (true) or not (false).",
+ "typeName": "boolean",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobLastRunHasSourcesGenerated",
+ "description": "Whether sources were generated from the last run of the job that materialized this asset in dbt (true) or not (false).",
+ "typeName": "boolean",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobLastRunNotificationsSent",
+ "description": "Whether notifications were sent from the last run of the job that materialized this asset in dbt (true) or not (false).",
+ "typeName": "boolean",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobNextRun",
+ "description": "Time (epoch) when the next run of the job that materializes this asset in dbt is scheduled.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetDbtJobNextRunHumanized",
+ "description": "Human-readable time when the next run of the job that materializes this asset in dbt is scheduled.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "assetDbtEnvironmentName",
+ "description": "Name of the environment in which this asset is materialized in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "assetDbtEnvironmentDbtVersion",
+ "description": "Version of the environment in which this asset is materialized in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetDbtTags",
+ "description": "List of tags attached to this asset in dbt.",
+ "typeName": "array",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexType": "STRING",
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "analyzer": "atlan_text_analyzer",
+ "type": "text"
+ }
+ }
+ },
+ {
+ "name": "assetDbtSemanticLayerProxyUrl",
+ "description": "URL of the semantic layer proxy for this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetDbtSourceFreshnessCriteria",
+ "description": "Freshness criteria for the source of this asset in dbt.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "sampleDataUrl",
+ "description": "URL for sample data for this asset.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "type": "text",
+ "analyzer": "atlan_text_analyzer"
+ }
+ }
+ },
+ {
+ "name": "assetTags",
+ "description": "List of tags attached to this asset.",
+ "typeName": "array",
+ "indexType": "STRING",
+ "cardinality": "SET",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "analyzer": "atlan_text_analyzer",
+ "type": "text"
+ }
+ }
+ },
+ {
+ "name": "assetMcIncidentNames",
+ "description": "List of Monte Carlo incident names attached to this asset.",
+ "typeName": "array",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword"
+ }
+ }
+ },
+ {
+ "name": "assetMcIncidentQualifiedNames",
+ "description": "List of unique Monte Carlo incident names attached to this asset.",
+ "typeName": "array",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING",
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "type": "text",
+ "analyzer": "atlan_text_analyzer"
+ }
+ }
+ },
+ {
+ "name": "assetMcAlertQualifiedNames",
+ "description": "List of unique Monte Carlo alert names attached to this asset.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING",
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "type": "text",
+ "analyzer": "atlan_text_analyzer"
+ }
+ }
+ },
+ {
+ "name": "assetMcMonitorNames",
+ "description": "List of Monte Carlo monitor names attached to this asset.",
+ "typeName": "array",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword"
+ }
+ }
+ },
+ {
+ "name": "assetMcMonitorQualifiedNames",
+ "description": "List of unique Monte Carlo monitor names attached to this asset.",
+ "typeName": "array",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING",
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "type": "text",
+ "analyzer": "atlan_text_analyzer"
+ }
+ }
+ },
+ {
+ "name": "assetMcMonitorStatuses",
+ "description": "Statuses of all associated Monte Carlo monitors.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetMcMonitorTypes",
+ "description": "Types of all associated Monte Carlo monitors.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetMcMonitorScheduleTypes",
+ "description": "Schedules of all associated Monte Carlo monitors.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetMcIncidentTypes",
+ "description": "List of Monte Carlo incident types associated with this asset.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetMcIncidentSubTypes",
+ "description": "List of Monte Carlo incident sub-types associated with this asset.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetMcIncidentSeverities",
+ "description": "List of Monte Carlo incident severities associated with this asset.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetMcIncidentPriorities",
+ "description": "List of Monte Carlo incident priorities associated with this asset.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetMcIncidentStates",
+ "description": "List of Monte Carlo incident states associated with this asset.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetMcIsMonitored",
+ "description": "Tracks whether this asset is monitored by MC or not",
+ "typeName": "boolean",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetMcLastSyncRunAt",
+ "description": "Time (epoch) at which this asset was last synced from Monte Carlo.",
+ "typeName": "date",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "starredBy",
+ "description": "Users who have starred this asset.",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "starredDetailsList",
+ "description": "List of usernames with extra information of the users who have starred an asset.",
+ "typeName": "array",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "starredCount",
+ "description": "Number of users who have starred this asset.",
+ "typeName": "int",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetAnomaloDQStatus",
+ "description": "Status of data quality from Anomalo.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetAnomaloCheckCount",
+ "description": "Total number of checks present in Anomalo for this asset.",
+ "typeName": "long",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetAnomaloFailedCheckCount",
+ "description": "Total number of checks failed in Anomalo for this asset.",
+ "typeName": "long",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetAnomaloCheckStatuses",
+ "description": "Stringified JSON object containing status of all Anomalo checks associated to this asset.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetAnomaloLastCheckRunAt",
+ "description": "Time (epoch) at which the last check was run via Anomalo.",
+ "typeName": "date",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetAnomaloAppliedCheckTypes",
+ "description": "All associated Anomalo check types.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetAnomaloFailedCheckTypes",
+ "description": "All associated Anomalo failed check types.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetAnomaloSourceUrl",
+ "description": "URL of the source in Anomalo.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetSodaDQStatus",
+ "description": "Status of data quality from Soda.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetSodaCheckCount",
+ "description": "Number of checks done via Soda.",
+ "typeName": "long",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetSodaLastSyncRunAt",
+ "description": "",
+ "typeName": "date",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetSodaLastScanAt",
+ "description": "",
+ "typeName": "date",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetSodaCheckStatuses",
+ "description": "All associated Soda check statuses.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetSodaSourceURL",
+ "description": "",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "assetIcon",
+ "description": "Name of the icon to use for this asset. (Only applies to glossaries, currently.)",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": false
+ },
+ {
+ "name": "isPartial",
+ "typeName": "boolean",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "defaultValue": false,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "isAIGenerated",
+ "description": "",
+ "typeName": "boolean",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "defaultValue": false,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "assetCoverImage",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": false
+ },
+ {
+ "name": "assetThemeHex",
+ "description": "Color (in hexadecimal RGB) to use to represent this asset.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "lexicographicalSortOrder",
+ "description": "Custom order for sorting purpose, managed by client",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "indexType": "STRING",
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": false
+ },
+ {
+ "name": "hasContract",
+ "description": "Whether this asset has contract (true) or not (false).",
+ "typeName": "boolean",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true,
+ "defaultValue": false
+ },
+ {
+ "name": "assetRedirectGUIDs",
+ "description": "Array of asset ids that equivalent to this asset.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "indexType": "STRING",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true
+ },
+ {
+ "name": "assetPolicyGUIDs",
+ "description": "Array of policy ids governing this asset",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true
+ },
+ {
+ "name": "assetPoliciesCount",
+ "description": "Count of policies inside the asset",
+ "typeName": "long",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true
+ },
+ {
+ "name": "domainGUIDs",
+ "description": "Array of domain guids linked to this asset",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true
+ },
+ {
+ "name": "nonCompliantAssetPolicyGUIDs",
+ "description": "Array of policy ids non-compliant to this asset",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true
+ },
+ {
+ "name": "productGUIDs",
+ "description": "Array of product guids linked to this asset",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true
+ },
+ {
+ "name": "outputProductGUIDs",
+ "description": "Array of product guids which have this asset as outputPort",
+ "typeName": "array",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SET",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true
+ },
+ {
+ "name": "applicationQualifiedName",
+ "description": "Qualified name of the Application that contains this asset.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "applicationFieldQualifiedName",
+ "description": "Qualified name of the ApplicationField that contains this asset.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true,
+ "indexType": "STRING"
+ }
+ ]
+ },
+ {
+ "name": "AtlasGlossary",
+ "description": "Instance of a glossary in Atlan.",
+ "superTypes":
+ [
+ "Asset"
+ ],
+ "serviceType": "atlas_core",
+ "typeVersion": "1.2",
+ "attributeDefs":
+ [
+ {
+ "name": "shortDescription",
+ "description": "Unused. A short definition of the glossary. See 'description' and 'userDescription' instead.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "longDescription",
+ "description": "Unused. A longer description of the glossary. See 'readme' instead.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "language",
+ "description": "Unused. Language of the glossary's contents.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "usage",
+ "description": "Unused. Inteded usage for the glossary.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "additionalAttributes",
+ "description": "Unused. Arbitrary set of additional attributes associated with this glossary.",
+ "typeName": "map",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "glossaryType",
+ "typeName": "AtlasGlossaryType",
+ "indexType": "STRING",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "isOptional": true,
+ "isUnique": false
+ }
+ ]
+ },
+ {
+ "name": "AtlasGlossaryCategory",
+ "description": "Instance of a category in Atlan, an organizational construct for glossary terms.",
+ "superTypes":
+ [
+ "Asset"
+ ],
+ "serviceType": "atlas_core",
+ "typeVersion": "1.2",
+ "attributeDefs":
+ [
+ {
+ "name": "shortDescription",
+ "description": "Unused. Brief summary of the category. See 'description' and 'userDescription' instead.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "longDescription",
+ "description": "Unused. Detailed description of the category. See 'readme' instead.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "additionalAttributes",
+ "description": "Unused. Arbitrary set of additional attributes associated with the category.",
+ "typeName": "map",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "categoryType",
+ "typeName": "AtlasGlossaryCategoryType",
+ "indexType": "STRING",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "isOptional": true,
+ "isUnique": false
+ }
+ ]
+ },
+ {
+ "name": "AtlasGlossaryTerm",
+ "description": "Instance of a term in Atlan. Terms define concepts in natural language that can be associated with other assets to provide meaning.",
+ "superTypes":
+ [
+ "Asset"
+ ],
+ "serviceType": "atlas_core",
+ "typeVersion": "1.2",
+ "attributeDefs":
+ [
+ {
+ "name": "shortDescription",
+ "description": "Unused. Brief summary of the term. See 'description' and 'userDescription' instead.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "longDescription",
+ "description": "Unused. Detailed definition of the term. See 'readme' instead.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "examples",
+ "description": "Unused. Exmaples of the term.",
+ "typeName": "array",
+ "cardinality": "SET",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "abbreviation",
+ "description": "Unused. Abbreviation of the term.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "usage",
+ "description": "Unused. Intended usage for the term.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "additionalAttributes",
+ "description": "Unused. Arbitrary set of additional attributes for the terrm.",
+ "typeName": "map",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ },
+ {
+ "name": "termType",
+ "typeName": "AtlasGlossaryTermType",
+ "indexType": "STRING",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "isOptional": true,
+ "isUnique": false
+ }
+ ]
+ },
+ {
+ "name": "Catalog",
+ "description": "Base class for catalog assets. Catalog assets include any asset that can participate in lineage.",
+ "superTypes":
+ [
+ "Asset"
+ ],
+ "serviceType": "atlan",
+ "typeVersion": "1.1",
+ "attributeDefs":
+ []
+ },
+ {
+ "superTypes":
+ [
+ "Catalog"
+ ],
+ "name": "EventStore",
+ "description": "Base class for event store assets.",
+ "typeVersion": "1.0",
+ "serviceType": "atlan",
+ "attributeDefs":
+ []
+ },
+ {
+ "superTypes":
+ [
+ "Catalog"
+ ],
+ "name": "Insight",
+ "description": "Base class for Insights assets in Atlan.",
+ "typeVersion": "1.0",
+ "serviceType": "atlan",
+ "attributeDefs":
+ []
+ },
+ {
+ "name": "DataMesh",
+ "description": "Base class for data mesh assets.",
+ "superTypes":
+ [
+ "Catalog"
+ ],
+ "serviceType": "atlan",
+ "typeVersion": "1.0",
+ "attributeDefs":
+ [
+ {
+ "name": "parentDomainQualifiedName",
+ "description": "Unique name of the parent domain in which this asset exists.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "type": "text",
+ "analyzer": "atlan_text_analyzer"
+ }
+ }
+ },
+ {
+ "name": "superDomainQualifiedName",
+ "description": "Unique name of the top-level domain in which this asset exists.",
+ "typeName": "string",
+ "indexType": "STRING",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "type": "text",
+ "analyzer": "atlan_text_analyzer"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "Model",
+ "category": "ENTITY",
+ "description": "Assets used to model data and information.",
+ "serviceType": "atlan",
+ "typeVersion": "1.0",
+ "attributeDefs":
+ [
+ {
+ "name": "modelName",
+ "description": "Simple name of the model in which this asset exists, or empty if it is itself a data model.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true,
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "modelQualifiedName",
+ "description": "Unique name of the model in which this asset exists, or empty if it is itself a data model.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "modelDomain",
+ "description": "Model domain in which this asset exists.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "modelNamespace",
+ "description": "Model namespace in which this asset exists.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "modelVersionName",
+ "description": "Simple name of the version in which this asset exists, or empty if it is itself a data model version.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "modelVersionAgnosticQualifiedName",
+ "description": "Unique name of the parent in which this asset exists, irrespective of the version (always implies the latest version).",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "skipScrubbing": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "modelVersionQualifiedName",
+ "description": "Unique name of the version in which this asset exists, or empty if it is itself a data model version.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "modelEntityName",
+ "description": "Simple name of the entity in which this asset exists, or empty if it is itself a data model entity.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "modelEntityQualifiedName",
+ "description": "Unique name of the entity in which this asset exists, or empty if it is itself a data model entity.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "modelType",
+ "description": "Type of the model asset (conceptual, logical, physical).",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "modelSystemDate",
+ "description": "System date for the asset.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true
+ },
+ {
+ "name": "modelBusinessDate",
+ "description": "Business date for the asset.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true
+ },
+ {
+ "name": "modelExpiredAtSystemDate",
+ "description": "System expiration date for the asset.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true
+ },
+ {
+ "name": "modelExpiredAtBusinessDate",
+ "description": "Business expiration date for the asset.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "skipScrubbing": true
+ }
+ ],
+ "superTypes":
+ [
+ "Catalog"
+ ]
+ },
+ {
+ "superTypes":
+ [
+ "Catalog"
+ ],
+ "name": "Resource",
+ "description": "Base class for resources.",
+ "typeVersion": "1.0",
+ "serviceType": "atlan",
+ "attributeDefs":
+ [
+ {
+ "name": "link",
+ "description": "URL to the resource.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "isGlobal",
+ "description": "Whether the resource is global (true) or not (false).",
+ "typeName": "boolean",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "reference",
+ "description": "Reference to the resource.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "resourceMetadata",
+ "description": "Metadata of the resource.",
+ "typeName": "map",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "includeInNotification": false
+ }
+ ]
+ },
+ {
+ "superTypes":
+ [
+ "Catalog"
+ ],
+ "name": "SQL",
+ "description": "Base class for SQL assets.",
+ "typeVersion": "1.1",
+ "serviceType": "atlan",
+ "attributeDefs":
+ [
+ {
+ "name": "queryCount",
+ "description": "Number of times this asset has been queried.",
+ "typeName": "long",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "queryUserCount",
+ "description": "Number of unique users who have queried this asset.",
+ "typeName": "long",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "queryUserMap",
+ "description": "Map of unique users who have queried this asset to the number of times they have queried it.",
+ "typeName": "map",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "queryCountUpdatedAt",
+ "description": "Time (epoch) at which the query count was last updated, in milliseconds.",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": false
+ },
+ {
+ "name": "databaseName",
+ "description": "Simple name of the database in which this SQL asset exists, or empty if it does not exist within a database.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "databaseQualifiedName",
+ "description": "Unique name of the database in which this SQL asset exists, or empty if it does not exist within a database.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "indexType": "STRING",
+ "includeInNotification": true
+ },
+ {
+ "name": "schemaName",
+ "description": "Simple name of the schema in which this SQL asset exists, or empty if it does not exist within a schema.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "schemaQualifiedName",
+ "description": "Unique name of the schema in which this SQL asset exists, or empty if it does not exist within a schema.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "indexType": "STRING",
+ "includeInNotification": true
+ },
+ {
+ "name": "tableName",
+ "description": "Simple name of the table in which this SQL asset exists, or empty if it does not exist within a table.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "tableQualifiedName",
+ "description": "Unique name of the table in which this SQL asset exists, or empty if it does not exist within a table.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "indexType": "STRING",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "viewName",
+ "description": "Simple name of the view in which this SQL asset exists, or empty if it does not exist within a view.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "viewQualifiedName",
+ "description": "Unique name of the view in which this SQL asset exists, or empty if it does not exist within a view.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "indexType": "STRING",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "calculationViewName",
+ "description": "Simple name of the calculation view in which this SQL asset exists, or empty if it does not exist within a calculation view.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "analyzer": "atlan_text_analyzer"
+ },
+ "indexTypeESFields":
+ {
+ "keyword":
+ {
+ "type": "keyword",
+ "normalizer": "atlan_normalizer"
+ }
+ }
+ },
+ {
+ "name": "calculationViewQualifiedName",
+ "description": "Unique name of the calculation view in which this SQL asset exists, or empty if it does not exist within a calculation view.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "indexType": "STRING",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "isProfiled",
+ "description": "Whether this asset has been profiled (true) or not (false).",
+ "typeName": "boolean",
+ "isOptional": true,
+ "defaultValue": false,
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "lastProfiledAt",
+ "description": "Time (epoch) at which this asset was last profiled, in milliseconds.",
+ "typeName": "date",
+ "isOptional": true,
+ "valuesMinCount": 0,
+ "valuesMaxCount": 1,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true,
+ "indexTypeESFields":
+ {
+ "date":
+ {
+ "type": "date",
+ "format": "epoch_millis"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "superTypes":
+ [
+ "SQL"
+ ],
+ "name": "CalculationView",
+ "description": "Instance of a calculation view in Atlan.",
+ "typeVersion": "1.1",
+ "serviceType": "atlan",
+ "attributeDefs":
+ [
+ {
+ "name": "columnCount",
+ "description": "Number of columns in this calculation view.",
+ "typeName": "long",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "calculationViewVersionId",
+ "description": "The version ID of this calculation view.",
+ "typeName": "long",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "calculationViewActivatedBy",
+ "description": "The owner who activated the calculation view",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ },
+ {
+ "name": "calculationViewActivatedAt",
+ "description": "Time at which this calculation view was activated at",
+ "typeName": "date",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "isUnique": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "calculationViewPackageId",
+ "description": "The full package id path to which a calculation view belongs/resides in the repository.",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isOptional": true,
+ "isUnique": false,
+ "isIndexable": false,
+ "skipScrubbing": true,
+ "includeInNotification": true,
+ "indexType": "STRING"
+ }
+ ]
+ },
+ {
+ "superTypes":
+ [
+ "SQL"
+ ],
+ "name": "Column",
+ "description": "Instance of a column in Atlan.",
+ "typeVersion": "1.4",
+ "serviceType": "atlan",
+ "attributeDefs":
+ [
+ {
+ "name": "dataType",
+ "description": "Data type of values in this column.",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "valuesMinCount": 0,
+ "indexType": "STRING",
+ "valuesMaxCount": 1,
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true,
+ "indexTypeESConfig":
+ {
+ "normalizer": "atlan_normalizer"
+ },
+ "indexTypeESFields":
+ {
+ "text":
+ {
+ "type": "text",
+ "analyzer": "atlan_text_analyzer"
+ }
+ }
+ },
+ {
+ "name": "subDataType",
+ "description": "Sub-data type of this column.",
+ "typeName": "string",
+ "isOptional": true,
+ "indexType": "STRING",
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "columnCompression",
+ "description": "Compression type of this column.",
+ "typeName": "string",
+ "isOptional": true,
+ "indexType": "STRING",
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "columnEncoding",
+ "description": "Encoding type of this column.",
+ "typeName": "string",
+ "isOptional": true,
+ "indexType": "STRING",
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "rawDataTypeDefinition",
+ "description": "",
+ "typeName": "string",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "order",
+ "description": "Order (position) in which this column appears in the table (starting at 1).",
+ "typeName": "int",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": true,
+ "includeInNotification": true
+ },
+ {
+ "name": "nestedColumnOrder",
+ "description": "Order (position) in which this column appears in the nested Column (nest level starts at 1).",
+ "typeName": "string",
+ "isOptional": true,
+ "indexType": "STRING",
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "nestedColumnCount",
+ "description": "Number of columns nested within this (STRUCT or NESTED) column.",
+ "typeName": "int",
+ "isOptional": true,
+ "cardinality": "SINGLE",
+ "isUnique": false,
+ "skipScrubbing": true,
+ "isIndexable": false,
+ "includeInNotification": true
+ },
+ {
+ "name": "columnHierarchy",
+ "description": "List of top-level upstream nested columns.",
+ "typeName": "array