Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
atlas
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
dataplatform
atlas
Commits
a2397c15
Commit
a2397c15
authored
6 years ago
by
Ashutosh Mestry
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ATLAS-2738: Export Process: Support for incremental export.
parent
b37154f8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
299 additions
and
20 deletions
+299
-20
AtlasExportRequest.java
...ava/org/apache/atlas/model/impexp/AtlasExportRequest.java
+2
-0
AtlasExportResult.java
...java/org/apache/atlas/model/impexp/AtlasExportResult.java
+10
-1
ExportService.java
...ava/org/apache/atlas/repository/impexp/ExportService.java
+84
-12
ExportImportTestBase.java
.../apache/atlas/repository/impexp/ExportImportTestBase.java
+17
-0
ExportIncrementalTest.java
...apache/atlas/repository/impexp/ExportIncrementalTest.java
+174
-0
ExportSkipLineageTest.java
...apache/atlas/repository/impexp/ExportSkipLineageTest.java
+0
-6
ZipFileResourceTestUtils.java
...che/atlas/repository/impexp/ZipFileResourceTestUtils.java
+1
-1
export-incremental.json
.../resources/json/stocksDB-Entities/export-incremental.json
+11
-0
No files found.
intg/src/main/java/org/apache/atlas/model/impexp/AtlasExportRequest.java
View file @
a2397c15
...
@@ -52,6 +52,8 @@ public class AtlasExportRequest implements Serializable {
...
@@ -52,6 +52,8 @@ public class AtlasExportRequest implements Serializable {
public
static
final
String
OPTION_KEY_REPLICATED_TO
=
"replicatedTo"
;
public
static
final
String
OPTION_KEY_REPLICATED_TO
=
"replicatedTo"
;
public
static
final
String
FETCH_TYPE_FULL
=
"full"
;
public
static
final
String
FETCH_TYPE_FULL
=
"full"
;
public
static
final
String
FETCH_TYPE_CONNECTED
=
"connected"
;
public
static
final
String
FETCH_TYPE_CONNECTED
=
"connected"
;
public
static
final
String
FETCH_TYPE_INCREMENTAL
=
"incremental"
;
public
static
final
String
FETCH_TYPE_INCREMENTAL_FROM_TIME
=
"fromTime"
;
public
static
final
String
MATCH_TYPE_STARTS_WITH
=
"startsWith"
;
public
static
final
String
MATCH_TYPE_STARTS_WITH
=
"startsWith"
;
public
static
final
String
MATCH_TYPE_ENDS_WITH
=
"endsWith"
;
public
static
final
String
MATCH_TYPE_ENDS_WITH
=
"endsWith"
;
public
static
final
String
MATCH_TYPE_CONTAINS
=
"contains"
;
public
static
final
String
MATCH_TYPE_CONTAINS
=
"contains"
;
...
...
This diff is collapsed.
Click to expand it.
intg/src/main/java/org/apache/atlas/model/impexp/AtlasExportResult.java
View file @
a2397c15
...
@@ -62,7 +62,7 @@ public class AtlasExportResult implements Serializable {
...
@@ -62,7 +62,7 @@ public class AtlasExportResult implements Serializable {
private
AtlasExportData
data
;
private
AtlasExportData
data
;
private
OperationStatus
operationStatus
;
private
OperationStatus
operationStatus
;
private
String
sourceClusterName
;
private
String
sourceClusterName
;
private
long
lastModifiedTimestamp
;
public
AtlasExportResult
()
{
public
AtlasExportResult
()
{
this
(
null
,
null
,
null
,
null
,
System
.
currentTimeMillis
());
this
(
null
,
null
,
null
,
null
,
System
.
currentTimeMillis
());
...
@@ -136,6 +136,14 @@ public class AtlasExportResult implements Serializable {
...
@@ -136,6 +136,14 @@ public class AtlasExportResult implements Serializable {
this
.
data
=
data
;
this
.
data
=
data
;
}
}
public
void
setLastModifiedTimestamp
(
long
lastModifiedTimestamp
)
{
this
.
lastModifiedTimestamp
=
lastModifiedTimestamp
;
}
public
long
getLastModifiedTimestamp
()
{
return
this
.
lastModifiedTimestamp
;
}
public
OperationStatus
getOperationStatus
()
{
public
OperationStatus
getOperationStatus
()
{
return
operationStatus
;
return
operationStatus
;
}
}
...
@@ -175,6 +183,7 @@ public class AtlasExportResult implements Serializable {
...
@@ -175,6 +183,7 @@ public class AtlasExportResult implements Serializable {
sb
.
append
(
", userName='"
).
append
(
userName
).
append
(
"'"
);
sb
.
append
(
", userName='"
).
append
(
userName
).
append
(
"'"
);
sb
.
append
(
", clientIpAddress='"
).
append
(
clientIpAddress
).
append
(
"'"
);
sb
.
append
(
", clientIpAddress='"
).
append
(
clientIpAddress
).
append
(
"'"
);
sb
.
append
(
", hostName='"
).
append
(
hostName
).
append
(
"'"
);
sb
.
append
(
", hostName='"
).
append
(
hostName
).
append
(
"'"
);
sb
.
append
(
", lastModifiedTimestamp='"
).
append
(
lastModifiedTimestamp
).
append
(
"'"
);
sb
.
append
(
", sourceCluster='"
).
append
(
sourceClusterName
).
append
(
"'"
);
sb
.
append
(
", sourceCluster='"
).
append
(
sourceClusterName
).
append
(
"'"
);
sb
.
append
(
", timeStamp='"
).
append
(
timeStamp
).
append
(
"'"
);
sb
.
append
(
", timeStamp='"
).
append
(
timeStamp
).
append
(
"'"
);
sb
.
append
(
", metrics={"
);
sb
.
append
(
", metrics={"
);
...
...
This diff is collapsed.
Click to expand it.
repository/src/main/java/org/apache/atlas/repository/impexp/ExportService.java
View file @
a2397c15
...
@@ -129,6 +129,7 @@ public class ExportService {
...
@@ -129,6 +129,7 @@ public class ExportService {
clearContextData
(
context
);
clearContextData
(
context
);
context
.
result
.
setOperationStatus
(
getOverallOperationStatus
(
statuses
));
context
.
result
.
setOperationStatus
(
getOverallOperationStatus
(
statuses
));
context
.
result
.
incrementMeticsCounter
(
"duration"
,
duration
);
context
.
result
.
incrementMeticsCounter
(
"duration"
,
duration
);
context
.
result
.
setLastModifiedTimestamp
(
context
.
newestLastModifiedTimestamp
);
context
.
sink
.
setResult
(
context
.
result
);
context
.
sink
.
setResult
(
context
.
result
);
}
}
...
@@ -287,7 +288,8 @@ public class ExportService {
...
@@ -287,7 +288,8 @@ public class ExportService {
}
}
private
void
logInfoStartingEntitiesFound
(
AtlasObjectId
item
,
ExportContext
context
,
List
<
String
>
ret
)
{
private
void
logInfoStartingEntitiesFound
(
AtlasObjectId
item
,
ExportContext
context
,
List
<
String
>
ret
)
{
LOG
.
info
(
"export(item={}; matchType={}, fetchType={}): found {} entities"
,
item
,
context
.
matchType
,
context
.
fetchType
,
ret
.
size
());
LOG
.
info
(
"export(item={}; matchType={}, fetchType={}): found {} entities: options: {}"
,
item
,
context
.
matchType
,
context
.
fetchType
,
ret
.
size
(),
AtlasType
.
toJson
(
context
.
result
.
getRequest
()));
}
}
private
void
setupBindingsForTypeName
(
ExportContext
context
,
String
typeName
)
{
private
void
setupBindingsForTypeName
(
ExportContext
context
,
String
typeName
)
{
...
@@ -336,7 +338,7 @@ public class ExportService {
...
@@ -336,7 +338,7 @@ public class ExportService {
TraversalDirection
direction
=
context
.
guidDirection
.
get
(
guid
);
TraversalDirection
direction
=
context
.
guidDirection
.
get
(
guid
);
AtlasEntityWithExtInfo
entityWithExtInfo
=
entityGraphRetriever
.
toAtlasEntityWithExtInfo
(
guid
);
AtlasEntityWithExtInfo
entityWithExtInfo
=
entityGraphRetriever
.
toAtlasEntityWithExtInfo
(
guid
);
if
(!
context
.
lineageProcessed
.
contains
(
guid
))
{
if
(!
context
.
lineageProcessed
.
contains
(
guid
)
&&
context
.
doesTimestampQualify
(
entityWithExtInfo
.
getEntity
()
))
{
context
.
result
.
getData
().
getEntityCreationOrder
().
add
(
entityWithExtInfo
.
getEntity
().
getGuid
());
context
.
result
.
getData
().
getEntityCreationOrder
().
add
(
entityWithExtInfo
.
getEntity
().
getGuid
());
}
}
...
@@ -367,6 +369,7 @@ public class ExportService {
...
@@ -367,6 +369,7 @@ public class ExportService {
getEntityGuidsForConnectedFetch
(
entity
,
context
,
direction
);
getEntityGuidsForConnectedFetch
(
entity
,
context
,
direction
);
break
;
break
;
case
INCREMENTAL:
case
FULL:
case
FULL:
default
:
default
:
getEntityGuidsForFullFetch
(
entity
,
context
);
getEntityGuidsForFullFetch
(
entity
,
context
);
...
@@ -479,21 +482,31 @@ public class ExportService {
...
@@ -479,21 +482,31 @@ public class ExportService {
}
}
}
}
private
void
addEntity
(
AtlasEntityWithExtInfo
entity
,
ExportContext
context
)
throws
AtlasBaseException
{
private
void
addEntity
(
AtlasEntityWithExtInfo
entity
WithExtInfo
,
ExportContext
context
)
throws
AtlasBaseException
{
if
(
context
.
sink
.
hasEntity
(
entity
.
getEntity
().
getGuid
()))
{
if
(
context
.
sink
.
hasEntity
(
entity
WithExtInfo
.
getEntity
().
getGuid
()))
{
return
;
return
;
}
}
context
.
sink
.
add
(
entity
);
if
(
context
.
doesTimestampQualify
(
entityWithExtInfo
.
getEntity
()))
{
context
.
addToSink
(
entityWithExtInfo
);
context
.
result
.
incrementMeticsCounter
(
String
.
format
(
"entity:%s"
,
entity
.
getEntity
().
getTypeName
()));
context
.
result
.
incrementMeticsCounter
(
String
.
format
(
"entity:%s"
,
entityWithExtInfo
.
getEntity
().
getTypeName
()));
if
(
entity
.
getReferredEntities
()
!=
null
)
{
if
(
entityWithExtInfo
.
getReferredEntities
()
!=
null
)
{
for
(
AtlasEntity
e:
entity
.
getReferredEntities
().
values
())
{
for
(
AtlasEntity
e
:
entityWithExtInfo
.
getReferredEntities
().
values
())
{
context
.
result
.
incrementMeticsCounter
(
String
.
format
(
"entity:%s"
,
e
.
getTypeName
()));
context
.
result
.
incrementMeticsCounter
(
String
.
format
(
"entity:%s"
,
e
.
getTypeName
()));
}
}
}
}
context
.
result
.
incrementMeticsCounter
(
"entity:withExtInfo"
);
context
.
result
.
incrementMeticsCounter
(
"entity:withExtInfo"
);
}
else
{
List
<
AtlasEntity
>
entities
=
context
.
getEntitiesWithModifiedTimestamp
(
entityWithExtInfo
);
for
(
AtlasEntity
e
:
entities
)
{
context
.
result
.
getData
().
getEntityCreationOrder
().
add
(
e
.
getGuid
());
context
.
addToSink
(
new
AtlasEntityWithExtInfo
(
e
));
context
.
result
.
incrementMeticsCounter
(
String
.
format
(
"entity:%s"
,
e
.
getTypeName
()));
}
}
context
.
reportProgress
();
context
.
reportProgress
();
}
}
...
@@ -636,7 +649,8 @@ public class ExportService {
...
@@ -636,7 +649,8 @@ public class ExportService {
public
enum
ExportFetchType
{
public
enum
ExportFetchType
{
FULL
(
FETCH_TYPE_FULL
),
FULL
(
FETCH_TYPE_FULL
),
CONNECTED
(
FETCH_TYPE_CONNECTED
);
CONNECTED
(
FETCH_TYPE_CONNECTED
),
INCREMENTAL
(
FETCH_TYPE_INCREMENTAL
);
final
String
str
;
final
String
str
;
ExportFetchType
(
String
s
)
{
ExportFetchType
(
String
s
)
{
...
@@ -655,6 +669,8 @@ public class ExportService {
...
@@ -655,6 +669,8 @@ public class ExportService {
}
}
static
class
ExportContext
{
static
class
ExportContext
{
private
static
final
int
REPORTING_THREASHOLD
=
1000
;
final
Set
<
String
>
guidsProcessed
=
new
HashSet
<>();
final
Set
<
String
>
guidsProcessed
=
new
HashSet
<>();
final
UniqueList
<
String
>
guidsToProcess
=
new
UniqueList
<>();
final
UniqueList
<
String
>
guidsToProcess
=
new
UniqueList
<>();
final
UniqueList
<
String
>
lineageToProcess
=
new
UniqueList
<>();
final
UniqueList
<
String
>
lineageToProcess
=
new
UniqueList
<>();
...
@@ -665,13 +681,15 @@ public class ExportService {
...
@@ -665,13 +681,15 @@ public class ExportService {
final
Set
<
String
>
structTypes
=
new
HashSet
<>();
final
Set
<
String
>
structTypes
=
new
HashSet
<>();
final
Set
<
String
>
enumTypes
=
new
HashSet
<>();
final
Set
<
String
>
enumTypes
=
new
HashSet
<>();
final
AtlasExportResult
result
;
final
AtlasExportResult
result
;
final
ZipSink
sink
;
private
final
ZipSink
sink
;
private
final
ScriptEngine
scriptEngine
;
private
final
ScriptEngine
scriptEngine
;
private
final
Map
<
String
,
Object
>
bindings
;
private
final
Map
<
String
,
Object
>
bindings
;
private
final
ExportFetchType
fetchType
;
private
final
ExportFetchType
fetchType
;
private
final
String
matchType
;
private
final
String
matchType
;
private
final
boolean
skipLineage
;
private
final
boolean
skipLineage
;
private
final
long
lastModifiedTimestampRequested
;
private
long
newestLastModifiedTimestamp
;
private
int
progressReportCount
=
0
;
private
int
progressReportCount
=
0
;
...
@@ -684,6 +702,8 @@ public class ExportService {
...
@@ -684,6 +702,8 @@ public class ExportService {
fetchType
=
getFetchType
(
result
.
getRequest
());
fetchType
=
getFetchType
(
result
.
getRequest
());
matchType
=
getMatchType
(
result
.
getRequest
());
matchType
=
getMatchType
(
result
.
getRequest
());
skipLineage
=
getOptionSkipLineage
(
result
.
getRequest
());
skipLineage
=
getOptionSkipLineage
(
result
.
getRequest
());
this
.
lastModifiedTimestampRequested
=
getLastModifiedTimestamp
(
fetchType
,
result
.
getRequest
());
this
.
newestLastModifiedTimestamp
=
0
;
}
}
private
ExportFetchType
getFetchType
(
AtlasExportRequest
request
)
{
private
ExportFetchType
getFetchType
(
AtlasExportRequest
request
)
{
...
@@ -715,6 +735,34 @@ public class ExportService {
...
@@ -715,6 +735,34 @@ public class ExportService {
(
boolean
)
request
.
getOptions
().
get
(
AtlasExportRequest
.
OPTION_SKIP_LINEAGE
);
(
boolean
)
request
.
getOptions
().
get
(
AtlasExportRequest
.
OPTION_SKIP_LINEAGE
);
}
}
private
long
getLastModifiedTimestamp
(
ExportFetchType
fetchType
,
AtlasExportRequest
request
)
{
if
(
fetchType
==
ExportFetchType
.
INCREMENTAL
&&
request
.
getOptions
().
containsKey
(
AtlasExportRequest
.
FETCH_TYPE_INCREMENTAL_FROM_TIME
))
{
return
Long
.
parseLong
(
request
.
getOptions
().
get
(
AtlasExportRequest
.
FETCH_TYPE_INCREMENTAL_FROM_TIME
).
toString
());
}
return
0L
;
}
public
List
<
AtlasEntity
>
getEntitiesWithModifiedTimestamp
(
AtlasEntityWithExtInfo
entityWithExtInfo
)
{
if
(
fetchType
!=
ExportFetchType
.
INCREMENTAL
)
{
return
new
ArrayList
<>();
}
List
<
AtlasEntity
>
ret
=
new
ArrayList
<>();
if
(
doesTimestampQualify
(
entityWithExtInfo
.
getEntity
()))
{
ret
.
add
(
entityWithExtInfo
.
getEntity
());
return
ret
;
}
for
(
AtlasEntity
entity
:
entityWithExtInfo
.
getReferredEntities
().
values
())
{
if
((
doesTimestampQualify
(
entity
)))
{
ret
.
add
(
entity
);
}
}
return
ret
;
}
public
void
clear
()
{
public
void
clear
()
{
guidsToProcess
.
clear
();
guidsToProcess
.
clear
();
guidsProcessed
.
clear
();
guidsProcessed
.
clear
();
...
@@ -734,16 +782,40 @@ public class ExportService {
...
@@ -734,16 +782,40 @@ public class ExportService {
}
}
public
void
reportProgress
()
{
public
void
reportProgress
()
{
if
((
guidsProcessed
.
size
()
-
progressReportCount
)
>
REPORTING_THREASHOLD
)
{
if
((
guidsProcessed
.
size
()
-
progressReportCount
)
>
1000
)
{
progressReportCount
=
guidsProcessed
.
size
();
progressReportCount
=
guidsProcessed
.
size
();
LOG
.
info
(
"export(): in progress.. number of entities exported: {}"
,
this
.
guidsProcessed
.
size
());
LOG
.
info
(
"export(): in progress.. number of entities exported: {}"
,
this
.
guidsProcessed
.
size
());
}
}
}
}
public
boolean
doesTimestampQualify
(
AtlasEntity
entity
)
{
if
(
fetchType
!=
ExportFetchType
.
INCREMENTAL
)
{
return
true
;
}
long
entityModificationTimestamp
=
entity
.
getUpdateTime
().
getTime
();
updateNewestLastModifiedTimestamp
(
entityModificationTimestamp
);
return
doesTimestampQualify
(
entityModificationTimestamp
);
}
private
void
updateNewestLastModifiedTimestamp
(
long
entityModificationTimestamp
)
{
if
(
newestLastModifiedTimestamp
<
entityModificationTimestamp
)
{
newestLastModifiedTimestamp
=
entityModificationTimestamp
;
}
}
private
boolean
doesTimestampQualify
(
long
modificationTimestamp
)
{
return
lastModifiedTimestampRequested
<
modificationTimestamp
;
}
public
boolean
getSkipLineage
()
{
public
boolean
getSkipLineage
()
{
return
skipLineage
;
return
skipLineage
;
}
}
public
void
addToSink
(
AtlasEntityWithExtInfo
entityWithExtInfo
)
throws
AtlasBaseException
{
updateNewestLastModifiedTimestamp
(
entityWithExtInfo
.
getEntity
().
getUpdateTime
().
getTime
());
sink
.
add
(
entityWithExtInfo
);
}
}
}
}
}
This diff is collapsed.
Click to expand it.
repository/src/test/java/org/apache/atlas/repository/impexp/ExportImportTestBase.java
View file @
a2397c15
...
@@ -27,12 +27,17 @@ import org.apache.atlas.model.instance.AtlasEntity;
...
@@ -27,12 +27,17 @@ import org.apache.atlas.model.instance.AtlasEntity;
import
org.apache.atlas.repository.store.graph.v1.DeleteHandlerV1
;
import
org.apache.atlas.repository.store.graph.v1.DeleteHandlerV1
;
import
org.apache.atlas.repository.store.graph.v1.SoftDeleteHandlerV1
;
import
org.apache.atlas.repository.store.graph.v1.SoftDeleteHandlerV1
;
import
org.apache.atlas.repository.store.graph.v2.AtlasEntityStoreV2
;
import
org.apache.atlas.repository.store.graph.v2.AtlasEntityStoreV2
;
import
org.apache.atlas.store.AtlasTypeDefStore
;
import
org.apache.atlas.type.AtlasTypeRegistry
;
import
org.testng.SkipException
;
import
org.testng.SkipException
;
import
java.io.IOException
;
import
java.util.Arrays
;
import
java.util.Arrays
;
import
static
org
.
apache
.
atlas
.
repository
.
impexp
.
ZipFileResourceTestUtils
.
createAtlasEntity
;
import
static
org
.
apache
.
atlas
.
repository
.
impexp
.
ZipFileResourceTestUtils
.
createAtlasEntity
;
import
static
org
.
apache
.
atlas
.
repository
.
impexp
.
ZipFileResourceTestUtils
.
loadBaseModel
;
import
static
org
.
apache
.
atlas
.
repository
.
impexp
.
ZipFileResourceTestUtils
.
loadEntity
;
import
static
org
.
apache
.
atlas
.
repository
.
impexp
.
ZipFileResourceTestUtils
.
loadEntity
;
import
static
org
.
apache
.
atlas
.
repository
.
impexp
.
ZipFileResourceTestUtils
.
loadHiveModel
;
import
static
org
.
mockito
.
Mockito
.
mock
;
import
static
org
.
mockito
.
Mockito
.
mock
;
import
static
org
.
testng
.
Assert
.
assertEquals
;
import
static
org
.
testng
.
Assert
.
assertEquals
;
import
static
org
.
testng
.
Assert
.
assertNotNull
;
import
static
org
.
testng
.
Assert
.
assertNotNull
;
...
@@ -40,9 +45,20 @@ import static org.testng.Assert.assertTrue;
...
@@ -40,9 +45,20 @@ import static org.testng.Assert.assertTrue;
import
static
org
.
testng
.
Assert
.
fail
;
import
static
org
.
testng
.
Assert
.
fail
;
public
class
ExportImportTestBase
{
public
class
ExportImportTestBase
{
protected
static
final
String
ENTITIES_SUB_DIR
=
"stocksDB-Entities"
;
protected
static
final
String
DB_GUID
=
"1637a33e-6512-447b-ade7-249c8cb5344b"
;
protected
static
final
String
TABLE_GUID
=
"df122fc3-5555-40f8-a30f-3090b8a622f8"
;
protected
static
final
String
TABLE_TABLE_GUID
=
"6f3b305a-c459-4ae4-b651-aee0deb0685f"
;
protected
static
final
String
TABLE_VIEW_GUID
=
"56415119-7cb0-40dd-ace8-1e50efd54991"
;
protected
static
final
String
COLUMN_GUID_HIGH
=
"f87a5320-1529-4369-8d63-b637ebdf2c1c"
;
protected
DeleteHandlerV1
deleteHandler
=
mock
(
SoftDeleteHandlerV1
.
class
);
protected
DeleteHandlerV1
deleteHandler
=
mock
(
SoftDeleteHandlerV1
.
class
);
protected
void
basicSetup
(
AtlasTypeDefStore
typeDefStore
,
AtlasTypeRegistry
typeRegistry
)
throws
IOException
,
AtlasBaseException
{
loadBaseModel
(
typeDefStore
,
typeRegistry
);
loadHiveModel
(
typeDefStore
,
typeRegistry
);
}
protected
int
createEntities
(
AtlasEntityStoreV2
entityStore
,
String
subDir
,
String
entityFileNames
[])
{
protected
int
createEntities
(
AtlasEntityStoreV2
entityStore
,
String
subDir
,
String
entityFileNames
[])
{
for
(
String
fileName
:
entityFileNames
)
{
for
(
String
fileName
:
entityFileNames
)
{
createAtlasEntity
(
entityStore
,
loadEntity
(
subDir
,
fileName
));
createAtlasEntity
(
entityStore
,
loadEntity
(
subDir
,
fileName
));
...
@@ -70,6 +86,7 @@ public class ExportImportTestBase {
...
@@ -70,6 +86,7 @@ public class ExportImportTestBase {
}
}
assertNotNull
(
result
);
assertNotNull
(
result
);
assertNotNull
(
result
.
getEntities
());
assertTrue
(
result
.
getEntities
().
size
()
>
0
);
assertTrue
(
result
.
getEntities
().
size
()
>
0
);
}
}
...
...
This diff is collapsed.
Click to expand it.
repository/src/test/java/org/apache/atlas/repository/impexp/ExportIncrementalTest.java
0 → 100644
View file @
a2397c15
/**
* 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.
*/
package
org
.
apache
.
atlas
.
repository
.
impexp
;
import
com.google.common.collect.ImmutableList
;
import
org.apache.atlas.RequestContext
;
import
org.apache.atlas.TestModules
;
import
org.apache.atlas.TestUtilsV2
;
import
org.apache.atlas.exception.AtlasBaseException
;
import
org.apache.atlas.model.impexp.AtlasExportRequest
;
import
org.apache.atlas.model.instance.AtlasEntity
;
import
org.apache.atlas.repository.store.graph.v2.AtlasEntityStoreV2
;
import
org.apache.atlas.store.AtlasTypeDefStore
;
import
org.apache.atlas.type.AtlasClassificationType
;
import
org.apache.atlas.type.AtlasTypeRegistry
;
import
org.apache.atlas.utils.TestResourceFileUtils
;
import
org.testng.SkipException
;
import
org.testng.annotations.BeforeClass
;
import
org.testng.annotations.BeforeMethod
;
import
org.testng.annotations.Guice
;
import
org.testng.annotations.Test
;
import
javax.inject.Inject
;
import
java.io.IOException
;
import
java.util.Map
;
import
static
org
.
apache
.
atlas
.
model
.
impexp
.
AtlasExportRequest
.
FETCH_TYPE_INCREMENTAL_FROM_TIME
;
import
static
org
.
apache
.
atlas
.
repository
.
impexp
.
ZipFileResourceTestUtils
.
createTypes
;
import
static
org
.
apache
.
atlas
.
repository
.
impexp
.
ZipFileResourceTestUtils
.
getEntities
;
import
static
org
.
apache
.
atlas
.
repository
.
impexp
.
ZipFileResourceTestUtils
.
runExportWithParameters
;
import
static
org
.
testng
.
Assert
.
assertEquals
;
import
static
org
.
testng
.
Assert
.
assertNotNull
;
@Guice
(
modules
=
TestModules
.
TestOnlyModule
.
class
)
public
class
ExportIncrementalTest
extends
ExportImportTestBase
{
@Inject
AtlasTypeRegistry
typeRegistry
;
@Inject
private
AtlasTypeDefStore
typeDefStore
;
@Inject
ExportService
exportService
;
@Inject
ClusterService
clusterService
;
@Inject
private
AtlasEntityStoreV2
entityStore
;
private
final
String
EXPORT_REQUEST_INCREMENTAL
=
"export-incremental"
;
private
long
nextTimestamp
;
@BeforeClass
public
void
setup
()
throws
IOException
,
AtlasBaseException
{
basicSetup
(
typeDefStore
,
typeRegistry
);
createEntities
(
entityStore
,
ENTITIES_SUB_DIR
,
new
String
[]
{
"db"
,
"table-columns"
});
final
String
[]
entityGuids
=
{
DB_GUID
,
TABLE_GUID
};
verifyCreatedEntities
(
entityStore
,
entityGuids
,
2
);
}
@BeforeMethod
public
void
setupTest
()
{
RequestContext
.
clear
();
RequestContext
.
get
().
setUser
(
TestUtilsV2
.
TEST_USER
,
null
);
}
@Test
public
void
atT0_ReturnsAllEntities
()
throws
AtlasBaseException
{
final
int
expectedEntityCount
=
2
;
AtlasExportRequest
request
=
getIncrementalRequest
(
0
);
ZipSource
source
=
runExportWithParameters
(
exportService
,
request
);
AtlasEntity
.
AtlasEntityWithExtInfo
entities
=
getEntities
(
source
,
expectedEntityCount
);
int
count
=
0
;
for
(
Map
.
Entry
<
String
,
AtlasEntity
>
entry
:
entities
.
getReferredEntities
().
entrySet
())
{
assertNotNull
(
entry
.
getValue
());
count
++;
}
nextTimestamp
=
updateTimesampForNextIncrementalExport
(
source
);
assertEquals
(
count
,
expectedEntityCount
);
}
private
long
updateTimesampForNextIncrementalExport
(
ZipSource
source
)
throws
AtlasBaseException
{
return
source
.
getExportResult
().
getLastModifiedTimestamp
();
}
@Test
(
dependsOnMethods
=
"atT0_ReturnsAllEntities"
)
public
void
atT1_NewClassificationAttachedToTable_ReturnsChangedTable
()
throws
AtlasBaseException
{
final
int
expectedEntityCount
=
1
;
AtlasClassificationType
ct
=
createNewClassification
();
entityStore
.
addClassifications
(
TABLE_GUID
,
ImmutableList
.
of
(
ct
.
createDefaultValue
()));
AtlasExportRequest
request
=
getIncrementalRequest
(
nextTimestamp
);
ZipSource
source
=
runExportWithParameters
(
exportService
,
request
);
AtlasEntity
.
AtlasEntityWithExtInfo
entities
=
getEntities
(
source
,
expectedEntityCount
);
AtlasEntity
entity
=
null
;
for
(
Map
.
Entry
<
String
,
AtlasEntity
>
entry
:
entities
.
getReferredEntities
().
entrySet
())
{
entity
=
entry
.
getValue
();
assertNotNull
(
entity
);
break
;
}
nextTimestamp
=
updateTimesampForNextIncrementalExport
(
source
);
assertEquals
(
entity
.
getGuid
(),
TABLE_GUID
);
}
private
AtlasClassificationType
createNewClassification
()
{
createTypes
(
typeDefStore
,
ENTITIES_SUB_DIR
,
"typesDef-new-classification"
);
return
typeRegistry
.
getClassificationTypeByName
(
"T1"
);
}
@Test
(
dependsOnMethods
=
"atT1_NewClassificationAttachedToTable_ReturnsChangedTable"
)
public
void
atT2_NewClassificationAttachedToColumn_ReturnsChangedColumn
()
throws
AtlasBaseException
{
final
int
expectedEntityCount
=
1
;
AtlasEntity
.
AtlasEntityWithExtInfo
tableEntity
=
entityStore
.
getById
(
TABLE_GUID
);
long
preExportTableEntityTimestamp
=
tableEntity
.
getEntity
().
getUpdateTime
().
getTime
();
entityStore
.
addClassifications
(
COLUMN_GUID_HIGH
,
ImmutableList
.
of
(
typeRegistry
.
getClassificationTypeByName
(
"T1"
).
createDefaultValue
()));
ZipSource
source
=
runExportWithParameters
(
exportService
,
getIncrementalRequest
(
nextTimestamp
));
AtlasEntity
.
AtlasEntityWithExtInfo
entities
=
getEntities
(
source
,
expectedEntityCount
);
for
(
Map
.
Entry
<
String
,
AtlasEntity
>
entry
:
entities
.
getReferredEntities
().
entrySet
())
{
AtlasEntity
entity
=
entry
.
getValue
();
assertNotNull
(
entity
.
getGuid
());
break
;
}
long
postUpdateTableEntityTimestamp
=
tableEntity
.
getEntity
().
getUpdateTime
().
getTime
();
assertEquals
(
preExportTableEntityTimestamp
,
postUpdateTableEntityTimestamp
);
nextTimestamp
=
updateTimesampForNextIncrementalExport
(
source
);
}
@Test
(
dependsOnMethods
=
"atT2_NewClassificationAttachedToColumn_ReturnsChangedColumn"
)
public
void
exportingWithSameParameters_Succeeds
()
{
ZipSource
source
=
runExportWithParameters
(
exportService
,
getIncrementalRequest
(
nextTimestamp
));
assertNotNull
(
source
);
}
private
AtlasExportRequest
getIncrementalRequest
(
long
timestamp
)
{
try
{
AtlasExportRequest
request
=
TestResourceFileUtils
.
readObjectFromJson
(
ENTITIES_SUB_DIR
,
EXPORT_REQUEST_INCREMENTAL
,
AtlasExportRequest
.
class
);
request
.
getOptions
().
put
(
FETCH_TYPE_INCREMENTAL_FROM_TIME
,
timestamp
);
return
request
;
}
catch
(
IOException
e
)
{
throw
new
SkipException
(
String
.
format
(
"getIncrementalRequest: '%s' could not be laoded."
,
EXPORT_REQUEST_INCREMENTAL
));
}
}
}
This diff is collapsed.
Click to expand it.
repository/src/test/java/org/apache/atlas/repository/impexp/ExportSkipLineageTest.java
View file @
a2397c15
...
@@ -53,12 +53,6 @@ import static org.testng.AssertJUnit.fail;
...
@@ -53,12 +53,6 @@ import static org.testng.AssertJUnit.fail;
@Guice
(
modules
=
TestModules
.
TestOnlyModule
.
class
)
@Guice
(
modules
=
TestModules
.
TestOnlyModule
.
class
)
public
class
ExportSkipLineageTest
extends
ExportImportTestBase
{
public
class
ExportSkipLineageTest
extends
ExportImportTestBase
{
private
final
String
ENTITIES_SUB_DIR
=
"stocksDB-Entities"
;
private
final
String
DB_GUID
=
"1637a33e-6512-447b-ade7-249c8cb5344b"
;
private
final
String
TABLE_GUID
=
"df122fc3-5555-40f8-a30f-3090b8a622f8"
;
private
final
String
TABLE_TABLE_GUID
=
"6f3b305a-c459-4ae4-b651-aee0deb0685f"
;
private
final
String
TABLE_VIEW_GUID
=
"56415119-7cb0-40dd-ace8-1e50efd54991"
;
@Inject
@Inject
AtlasTypeRegistry
typeRegistry
;
AtlasTypeRegistry
typeRegistry
;
...
...
This diff is collapsed.
Click to expand it.
repository/src/test/java/org/apache/atlas/repository/impexp/ZipFileResourceTestUtils.java
View file @
a2397c15
...
@@ -257,7 +257,7 @@ public class ZipFileResourceTestUtils {
...
@@ -257,7 +257,7 @@ public class ZipFileResourceTestUtils {
AtlasEntity
.
AtlasEntityWithExtInfo
entityWithExtInfo
=
new
AtlasEntity
.
AtlasEntityWithExtInfo
();
AtlasEntity
.
AtlasEntityWithExtInfo
entityWithExtInfo
=
new
AtlasEntity
.
AtlasEntityWithExtInfo
();
try
{
try
{
int
count
=
0
;
int
count
=
0
;
for
(
String
s
:
source
.
getCreationOrder
())
{
for
(
String
s
:
source
.
getCreationOrder
())
{
AtlasEntity
entity
=
source
.
getByGuid
(
s
);
AtlasEntity
entity
=
source
.
getByGuid
(
s
);
entityWithExtInfo
.
addReferredEntity
(
s
,
entity
);
entityWithExtInfo
.
addReferredEntity
(
s
,
entity
);
count
++;
count
++;
...
...
This diff is collapsed.
Click to expand it.
repository/src/test/resources/json/stocksDB-Entities/export-incremental.json
0 → 100644
View file @
a2397c15
{
"itemsToExport"
:
[
{
"typeName"
:
"hive_db"
,
"uniqueAttributes"
:
{
"qualifiedName"
:
"stocks_base@cl1"
}
}
],
"options"
:
{
"fetchType"
:
"incremental"
,
"fromTime"
:
0
}
}
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment