Indexer merge requestshttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests2023-08-18T15:08:19Zhttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/134Missed a SNAPSHOT dependency in the last MR..2023-08-18T15:08:19ZDavid Diederichd.diederich@opengroup.orgMissed a SNAPSHOT dependency in the last MR..Follow on to !129.Follow on to !129.M5 - Release 0.8David Diederichd.diederich@opengroup.orgDavid Diederichd.diederich@opengroup.orghttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/130upgrade core-common version2023-08-18T15:08:21ZAlok Joshiupgrade core-common versionM5 - Release 0.8Alok JoshiAlok Joshihttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/129Switching the dependencies to release versions2023-08-18T15:08:22ZDavid Diederichd.diederich@opengroup.orgSwitching the dependencies to release versionsThis changes the library dependencies to use released versions of the core libraries. They were previously depending on SNAPSHOT versions, which is a less stable version. More importantly, the SNAPSHOT versions are periodically purged fr...This changes the library dependencies to use released versions of the core libraries. They were previously depending on SNAPSHOT versions, which is a less stable version. More importantly, the SNAPSHOT versions are periodically purged from the system to save disk space -- this happened recently. Since these libraries no longer exist on community, building Indexer becomes difficult.
In this case, the fossa-analyze step is unable to run the `mvn dependency:tree` for these two components. Later, it complains about incompatible licenses using Elasticsearch 7.11. However, we're actually using version 7.8, which was still Apache 2.0 licensed. I believe that the inability to run `mvn dependency:tree` led FOSSA to textually scan the `pom.xml` file, where it found elasticsearch dependencies with no version specified and assumed the latest available.
This MR moves those dependencies to a release version, which is better going forward and allows FOSSA to do the build and get good dependency information. I assert that there are no substantial changes between the SNAPSHOT version I moved from and the latest release version that I moved to. It's difficult to know which commit the SNAPSHOT dependency linked to, since it moved many times, but here are the differences from the last time the SNAPSHOT dependency was listed and the one commit that has the release version (0.7.0). All of these changes were from me, updating versions and references as part of the release process.
- [GCP Differences](https://community.opengroup.org/osdu/platform/system/lib/cloud/gcp/os-core-lib-gcp/-/compare/ff52818d929b7a32e491b75743285026c4c0a9b4...v0.7.0)
- [IBM Differences](https://community.opengroup.org/osdu/platform/system/lib/cloud/ibm/os-core-lib-ibm/-/compare/42d057eeee8f0299e7f90f1158c24f7fc0187dbc...v0.7.0)
Separately, since I was working with FOSSA, I updated the configuration file and the corresponding NOTICE changes resulting from the new module.M5 - Release 0.8David Diederichd.diederich@opengroup.orgDavid Diederichd.diederich@opengroup.orghttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/126Azure: Fixing reindex2023-08-18T15:08:24ZJasonAzure: Fixing reindexFixing Azure reindex so that it is able to interact with entitlements service of http within the k8s cluster. Related to #14
From initial investigation, it seems like the issue was in part that the `x-functions-key` header was not bein...Fixing Azure reindex so that it is able to interact with entitlements service of http within the k8s cluster. Related to #14
From initial investigation, it seems like the issue was in part that the `x-functions-key` header was not being set properly, and so the value was coming through as null when indexer-service was checking authorization with entitlements. This is because Istio was preventing the request from even hitting the service container for entitlements. When we turn off Istio, we see some informative error logs from tomcat in the entitlements pod:
```
2021-03-17 13:11:46.830 INFO entitlements-azure-57764d67f8-6jthb --- [p-nio-80-exec-4] o.a.c.h.Http11Processor correlation-id= data-partition-id=: Error parsing HTTP request header
Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: The HTTP header line [x-functions-key0x0d] does not conform to RFC 7230 and has been ignored.
at org.apache.coyote.http11.Http11InputBuffer.skipLine(Http11InputBuffer.java:1041)
at org.apache.coyote.http11.Http11InputBuffer.parseHeader(Http11InputBuffer.java:893)
at org.apache.coyote.http11.Http11InputBuffer.parseHeaders(Http11InputBuffer.java:593)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:284)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:880)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1601)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
```
This is interesting for two reason: (1) it seems that Istio and Tomcat perform some header validation. (2) For whatever reason, the validation is only behaving this way over http and not https. I did a bit of reading on the Tomcat code that is throwing the error. I think the relevant part is [here](https://github.com/apache/tomcat/blob/9.0.x/java/org/apache/coyote/http11/Http11InputBuffer.java#L891). So since there is this illegal character in the header, Tomcat throws a 400 on behalf of entitlements service for the request. It seems Istio must do something similar since the request does not even reach the service container when Istio is on.
Interestingly, both Istio and Tomcat only seem to be doing this for http and not https. We were able to successfully make the call (even with the null header) before when we referred to entitlements service by its DNS name rather than the internal access point within the cluster (`http://entitlements-azure/entitlements/v1`).
This MR resolves this issue by directly hardcoding the value for the `x-functions-key` header. We were already hardcoding the value to be `abcd` in `application.properties`. However, it was not being set properly because the code block the defines what the header value should be set to:
```
@Value("${indexer.queue.key}")
private String queueKey;
```
was running after the variable was used, so it was coming through as null.M5 - Release 0.8JasonJasonhttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/124add support for feature-collection indexing2023-08-18T15:08:26ZNeelesh Thakuradd support for feature-collection indexingData Definition team has harmonized the geo-shape payload on bulk-records. Any records that has geo-shape, must be [GeoJson](https://tools.ietf.org/html/rfc7946) and must conform to the schema mentioned [here](https://community.opengroup...Data Definition team has harmonized the geo-shape payload on bulk-records. Any records that has geo-shape, must be [GeoJson](https://tools.ietf.org/html/rfc7946) and must conform to the schema mentioned [here](https://community.opengroup.org/osdu/data/data-definitions/-/blob/master/E-R/abstract/AbstractFeatureCollection.1.0.0.md). All shapes must be put in [FeatureCollection](https://geojson.org/schema/FeatureCollection.json).
Earlier implementation of indexer service was missing this key shape hence geo-shape indexing and search workflows was broken.
This MR adds support for [FeatureCollection](https://geojson.org/schema/FeatureCollection.json) indexing. It also adds official `opendes:wks:master-data--Wellbore:1.0.0` as integration test to validate index and search workflow.
This MR also fixes few schema parsing errors which we discovered while enabling `opendes:wks:master-data--Wellbore:1.0.0` indexing.M5 - Release 0.8https://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/123#16 - Fix indexing ' array of object' for all CSPs2023-08-18T15:08:28ZDmitriy Rudko#16 - Fix indexing ' array of object' for all CSPsArray of objects feature was implemented as a part of !114 but enabled only for GCP.
This MR fix this and enable this mapping by default for other CSPs as well.Array of objects feature was implemented as a part of !114 but enabled only for GCP.
This MR fix this and enable this mapping by default for other CSPs as well.M5 - Release 0.8ethiraj krishnamanaiduMatt WiseJasonjingdong sunethiraj krishnamanaiduhttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/121Ibm reindex fix2023-08-18T15:08:29ZBhushan RadeIbm reindex fixIBM specific changesIBM specific changesM5 - Release 0.8Anuj GuptaAnuj Guptahttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/119change Tags type to Object instead of Flattened to allow OSS versions of Elas...2023-08-18T15:08:31ZMatt Wisechange Tags type to Object instead of Flattened to allow OSS versions of ElasticSearch to continue workingchange Tags type to Object instead of Flattened to allow OSS versions of ElasticSearch to continue working
Resolves #15change Tags type to Object instead of Flattened to allow OSS versions of ElasticSearch to continue working
Resolves #15M5 - Release 0.8ethiraj krishnamanaiduDmitry KniazevWladmir FrazaoJoeMatt WiseJasonethiraj krishnamanaiduhttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/118Defensive update to resolve tagging Integration tests issue2023-08-18T15:08:33ZAlok JoshiDefensive update to resolve tagging Integration tests issueCSP may encounter error with tagging update if earlier kind/index was not cleaned-up. This update will create new index to test the tagging functionality.CSP may encounter error with tagging update if earlier kind/index was not cleaned-up. This update will create new index to test the tagging functionality.M5 - Release 0.8Alok JoshiAlok Joshihttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/116Aws reindex support2023-08-18T15:08:34ZMatt WiseAws reindex supportM5 - Release 0.8Matt WiseBill WangMatt Wisehttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/115entitlements v2 cutover2023-08-18T15:08:36ZMingyang Zhuentitlements v2 cutoverM5 - Release 0.8Mingyang ZhuMingyang Zhuhttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/114Nested arrays of objects support2023-08-18T15:08:37ZRustam Lotsmanenko (EPAM)rustam_lotsmanenko@epam.comNested arrays of objects supportFirst MR in a series to support `array of objects` in Elastic.
As a part of this MR we are adding default indexing strategy - use Objects type.
This will allow retrieve information but individual objects still will be not searchable.
D...First MR in a series to support `array of objects` in Elastic.
As a part of this MR we are adding default indexing strategy - use Objects type.
This will allow retrieve information but individual objects still will be not searchable.
Details are here:
- https://community.opengroup.org/osdu/platform/system/indexer-service/-/issues/1
- https://community.opengroup.org/osdu/platform/system/schema-service/-/issues/1
- https://community.opengroup.org/osdu/platform/system/search-service/-/issues/1M5 - Release 0.8Dmitriy RudkoDmitriy Rudkohttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/92Add support for indexing tags meta-attribute2023-08-18T15:08:54ZYauheni LesnikauAdd support for indexing tags meta-attributeAdd tags indexing for search
Issue: [39](https://community.opengroup.org/osdu/platform/system/storage/-/issues/39)
Depends on os-core-common MR: [55](https://community.opengroup.org/osdu/platform/system/lib/core/os-core-common/-/merge_...Add tags indexing for search
Issue: [39](https://community.opengroup.org/osdu/platform/system/storage/-/issues/39)
Depends on os-core-common MR: [55](https://community.opengroup.org/osdu/platform/system/lib/core/os-core-common/-/merge_requests/55)M5 - Release 0.8ethiraj krishnamanaiduNitin-slbNeelesh Thakurethiraj krishnamanaiduhttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/159fix multilevel nesting2023-08-18T15:07:56ZRustam Lotsmanenko (EPAM)rustam_lotsmanenko@epam.comfix multilevel nesting# Description:
Fix for correct handling of multilevel nested properties <br/>
~~~
"NestedTest": {
"type": "nested",
"properties": {
...# Description:
Fix for correct handling of multilevel nested properties <br/>
~~~
"NestedTest": {
"type": "nested",
"properties": {
"DateTimeTest": {
"type": "date"
},
"NestedInnerTest": {
"type": "nested",
"properties": {
"DateTimeInnerTest": {
"type": "date"
},
"NumberInnerTest": {
"type": "double"
},
"StringInnerTest": {
"type": "text"
}
}
},
~~~
Also tag test case enabled int int-testing
# Changes include:
- [ ] Refactor (a non-breaking change that improves code maintainability).
- [x] Bugfix (a non-breaking change that solves an issue).
- [ ] New feature (a non-breaking change that adds functionality).
- [ ] Breaking change (a change that is not backward-compatible and/or changes current functionality).
# Changes in:
- [x] Common code
- [x] GCP
# Dev Checklist:
- [ ] Added Unit Tests, wherever applicable.
- [ ] Updated the Readme, if applicable.
- [x] Existing Tests pass
- [x] Verified functionality locally
- [x] Self Reviewed my code for formatting and complex business logic.M6 - Release 0.9Riabokon Stanislav(EPAM)[GCP]Rostislav Dublin (EPAM)Riabokon Stanislav(EPAM)[GCP]https://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/158Added PARTITION_API variable2023-08-18T15:07:58ZOleksii Tsyganov (EPAM)Added PARTITION_API variableM6 - Release 0.9Oleksii Tsyganov (EPAM)Oleksii Tsyganov (EPAM)https://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/157Indexer: Partion service as tenantinfo provider (GONRG-2256)2023-08-18T15:07:59ZAnastasiia GelmutIndexer: Partion service as tenantinfo provider (GONRG-2256)# Description:
Added optional service that replace TenantInfoFactory with implementation that utilize Partition Service<br/>
# How to test:
Functionality was tested with Partition service, Indexer service successfully consume TenantInf...# Description:
Added optional service that replace TenantInfoFactory with implementation that utilize Partition Service<br/>
# How to test:
Functionality was tested with Partition service, Indexer service successfully consume TenantInfo from Partition Service
# Changes include:
- [x] Refactor (a non-breaking change that improves code maintainability).
- [ ] Bugfix (a non-breaking change that solves an issue).
- [x] New feature (a non-breaking change that adds functionality).
- [ ] Breaking change (a change that is not backward-compatible and/or changes current functionality).
# Changes in:
- [x] GCP
- [ ] Azure
- [ ] AWS
- [ ] IBM
# Dev Checklist:
- [ ] Added Unit Tests, wherever applicable.
- [x] Updated the Readme, if applicable.
- [x] Existing Tests pass
- [x] Verified functionality locally
- [x] Self Reviewed my code for formatting and complex business logic.
# Other comments:
Dependencies:<br/>
https://community.opengroup.org/osdu/platform/system/lib/cloud/gcp/os-core-lib-gcp/-/merge_requests/12 <br/>
https://community.opengroup.org/osdu/platform/system/lib/core/os-core-common/-/merge_requests/73 <br/>M6 - Release 0.9Riabokon Stanislav(EPAM)[GCP]Rostislav Dublin (EPAM)Riabokon Stanislav(EPAM)[GCP]https://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/156GCP Change Tags Indexing From Object To Flattened (GONRG-2424)2023-08-18T15:08:01ZAnastasiia GelmutGCP Change Tags Indexing From Object To Flattened (GONRG-2424)# Description:
Changed tags indexing from object to flattened in TypeMapper class.
# How to test:
Indexer service can be tested with the help of business cases.
# Changes include:
- [ ] Refactor (a non-breaking change that improves cod...# Description:
Changed tags indexing from object to flattened in TypeMapper class.
# How to test:
Indexer service can be tested with the help of business cases.
# Changes include:
- [ ] Refactor (a non-breaking change that improves code maintainability).
- [ ] Bugfix (a non-breaking change that solves an issue).
- [x] New feature (a non-breaking change that adds functionality).
- [ ] Breaking change (a change that is not backward-compatible and/or changes current functionality).
# Changes in:
- [x] Core
- [ ] GCP
- [ ] Azure
- [ ] AWS
- [ ] IBM
# Dev Checklist:
* [x] Added Unit Tests, wherever applicable.
* [ ] Updated the Readme, if applicable.
* [x] Existing Tests pass
* [x] Verified functionality locally
* [x] Self Reviewed my code for formatting and complex business logic.M6 - Release 0.9Riabokon Stanislav(EPAM)[GCP]Rostislav Dublin (EPAM)Riabokon Stanislav(EPAM)[GCP]https://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/155Entitlements V22023-08-18T15:08:03ZRucha DeshpandeEntitlements V2commit 934ae6f0
Author: Rucha Deshpande <deshruch@amazon.com>
Date: Wed May 05 2021 17:05:58 GMT-0500 (Central Daylight Time)
update entitlements domain
commit 63173bf4
Author: Rucha Deshpande <deshruch@amazon.com>
Date: Wed ...commit 934ae6f0
Author: Rucha Deshpande <deshruch@amazon.com>
Date: Wed May 05 2021 17:05:58 GMT-0500 (Central Daylight Time)
update entitlements domain
commit 63173bf4
Author: Rucha Deshpande <deshruch@amazon.com>
Date: Wed May 05 2021 11:42:30 GMT-0500 (Central Daylight Time)
use Entitlements V2M6 - Release 0.9Rucha DeshpandeRucha Deshpandehttps://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/154update the version of the tomcat-embed-core & jackson-dataformat-cbor2023-08-18T15:08:05ZMina Otgonboldupdate the version of the tomcat-embed-core & jackson-dataformat-cborupdate the vulnerable versions to the stable versions as following:
- tomcat-embed-core: 9.0.37 to 9.0.45
- jackson-dataformat-cbor: 2.11.2 to 2.11.4 AND 2.11.3 to 2.11.4
in all providersupdate the vulnerable versions to the stable versions as following:
- tomcat-embed-core: 9.0.37 to 9.0.45
- jackson-dataformat-cbor: 2.11.2 to 2.11.4 AND 2.11.3 to 2.11.4
in all providersM6 - Release 0.9https://community.opengroup.org/osdu/platform/system/indexer-service/-/merge_requests/142Array of Objects support by Indexer (GONRG-2028)2023-08-18T15:08:14ZRustam Lotsmanenko (EPAM)rustam_lotsmanenko@epam.comArray of Objects support by Indexer (GONRG-2028)# Description:
## Fix for https://community.opengroup.org/osdu/platform/system/indexer-service/-/issues/16<br/>
Added optional "x-osdu-indexing" property to Schema item ex.:<br/>
~~~
"properties": {
...# Description:
## Fix for https://community.opengroup.org/osdu/platform/system/indexer-service/-/issues/16<br/>
Added optional "x-osdu-indexing" property to Schema item ex.:<br/>
~~~
"properties": {
"Markers": {
"x-osdu-indexing": {
"type": "nested"
},
"type": "array",
"items": {
"type": "object",
~~~
Types behavior:<br/>
# []object <br/>
(will be used by default if property "x-osdu-indexing" not specified) :<br/>
Inner schema items won't be processed with schema converting:<br/>
~~~
{
path = ArrayItem,
kind = []object
}
~~~
Index type will be defined as object, without specifying inner properties:<br/>
~~~
"ArrayItem": {
"type": "object"
},
~~~
Objects array data will be pushed to elastic "as is" without any parsing:<br/>
~~~
"ArrayItem": [{
"InnerProperty": "anyvalue",
}, {
"InnerProperty": "anyvalue"
}]
~~~
Querying by "ArrayItem.InnerProperty" won't be possible but data will return for other requests.<br/>
# flattened :<br/>
Inner schema items won't be processed with schema converting:<br/>
~~~
{
path = ArrayItem,
kind = flattened
}
~~~
Index type will be defined as flattened, without specifying inner properties:<br/>
~~~
"ArrayItem": {
"type": "flattened"
},
~~~
Objects array data will be pushed to elastic "as is" as it treats all values as keywords and does not provide full search functionality:<br/>
~~~
"ArrayItem": [{
"InnerProperty": "anyvalue",
}, {
"InnerProperty": "anyvalue"
}]
~~~
Querying by "ArrayItem.InnerProperty" will be possible but with limitations (https://www.elastic.co/guide/en/elasticsearch/reference/master/flattened.html)<br/>
~~~
{
"query": {
"bool": {
"must": [
{
"match": {
"data.ArrayItem.InnerProperty": "anyvalue"
}
},
{
"match": {
"data.ArrayItem.OtherProperty": "anyvalue"
}
}
]
}
}
}
~~~
# nested :<br/>
Inner schema items will be processed<br/>
~~~
{
path = ArrayItem,
kind = nested,
properties = [{
path = InnerProperty,
kind = double
},{
path = OtherProperty,
kind = string
}]
~~~
Index type will be defined as nested, with inner properties:<br/>
~~~
"ArrayItem": {
"type": "nested",
"properties": {
"InnerProperty": {
"type": "text"
},
"OtherProperty": {
"type": "double"
},
~~~
Objects inner array data will mapped with StorageIndexerPayloadMapper.class according it types:<br/>
~~~
"ArrayItem": [{
"InnerProperty": null,
"OtherProperty": 0.0
},
~~~
Querying by "ArrayItem.InnerProperty" will be possible, every nested object will be treated as separate object.<br/>
~~~
{
"query": {
"nested": {
"path": "data.ArrayItem",
"query": {
"bool": {
"must": [
{
"match": {
"data.ArrayItem.InnerProperty": "any"
}
},
{
"match": {
"data.ArrayItem.OtherProperty": 0.0
}
}
]
}
}
}
}
}
~~~
# How to test:
It can be tested with several requests:<br/>
1. Update schema with array objects type:<br/>
~~~
curl --location --request PUT 'https://os-schema/api/schema-service/v1/schema/' \
--header 'Data-Partition-Id: <data-patition>' \
--header 'Authorization: <token>' \
--header 'Content-Type: application/json' \
--data-raw '{
.....
"schema": {
.....
"ArrayItem": {
"x-osdu-indexing": {
"type": "nested"
},
"type": "array",
"items": {
"type": "object",
~~~
2. Re-index kind for that schema
~~~
curl --location --request POST 'indexer/api/indexer/v2/reindex?force_clean=true' \
--header 'Data-Partition-Id: <data-patition>' \
--header 'Authorization: <token>' \
--header 'Content-Type: application/json' \
--data-raw '{
"kind":"<updated kind>"
}'
~~~
3. Querying with Search service currently not implemented, search request can be performed directly with elasticsearch
~~~
{
"query": {
"nested": {
"path": "data.Markers",
"query": {
"bool": {
"must": [
{
"match": {
"data.Markers.MarkerName": "North Sea Supergroup"
}
},
{
"match": {
"data.Markers.MarkerMeasuredDepth": 0.0
}
}
]
}
}
}
}
}
~~~
# Changes include:
- [x] Breaking change (a change that is not backward-compatible and/or changes current functionality).
# Changes in:
- [x] Common code
# Dev Checklist:
- [x] Added Unit Tests, wherever applicable.
- [x] Updated the Readme, if applicable.
- [x] Existing Tests pass
- [x] Verified functionality locally
- [x] Self Reviewed my code for formatting and complex business logic.
# Other comments:
Consequences:
Common API models must be changed in os-core-common <br/>
https://community.opengroup.org/osdu/platform/system/lib/core/os-core-common/-/merge_requests/67 <br/>
To support nested queries Search service should implement nested query. <br/>
Functionality was not tested with schemas v2 <br/>
v2 schema models must be changed, previous "flat" schemas doesn't fit for this changes:<br/>
Schema model changes example:
~~~
{
path = LineageAssertions,
kind = []object
}, {
path = Tags,
kind = []string
}, {
path = Name,
kind = string
}, {
path = Markers,
kind = nested,
properties = [{
path = NegativeVerticalDelta,
kind = double
}, {
path = SurfaceDipAngle,
kind = double
}, {
path = FeatureTypeID,
kind = string
}, {
path = MarkerInterpreter,
kind = string
}, {
~~~M6 - Release 0.9Dmitriy RudkoRostislav Dublin (EPAM)Dmitriy Rudko