From a7225a833727bfe98d61c3adc72d587120e77eb8 Mon Sep 17 00:00:00 2001 From: Kaituo Li Date: Wed, 27 Mar 2024 11:41:54 -0700 Subject: [PATCH] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 30347847cb4ec87f7318587d97054d91c341a312 Author: Kaituo Li Date: Tue Mar 26 13:40:53 2024 -0700 Upgrade rcf to 4.0 (#1173) This PR upgrades rcf to 4.0 as it has bug fixes and support for streaming imputation mode. Testing done: 1. gradle build Signed-off-by: Kaituo Li commit 8ca1d0d837dd28b6e0820756136eafb8c3ce03ad Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Mar 25 13:44:45 2024 -0700 dependabot: bump actions/checkout from 3 to 4 (#1098) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit d0a2a8ff9fd9640000763c433e05577eea292c48 Author: Darshit Chanpura <35282393+DarshitChanpura@users.noreply.github.com> Date: Mon Mar 25 16:44:36 2024 -0400 Updates sample cert and admin keystore (#1163) Signed-off-by: Darshit Chanpura commit 1921e12b30ac442cd731a5d7a3bdfd3bc31be82b Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Mar 25 13:14:52 2024 -0700 Bump urllib3 from 1.26.17 to 1.26.18 in /dataGeneration (#1090) Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.17 to 1.26.18. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/1.26.17...1.26.18) --- updated-dependencies: - dependency-name: urllib3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 8521a76533b533d6887321505c7b5e3d473b02ae Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Mar 25 13:14:18 2024 -0700 dependabot: bump org.apache.commons:commons-pool2 from 2.11.1 to 2.12.0 (#1088) Bumps org.apache.commons:commons-pool2 from 2.11.1 to 2.12.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-pool2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 303ceb5b320f148dcd015ab6a11f870ae3e23125 Author: Joshua Palis Date: Mon Mar 18 16:49:59 2024 -0700 Adding 2.13 release notes (#1170) Signed-off-by: Joshua Palis commit 1507dd4b4045bd8e8cdf505d07041ce304788ca0 Author: Tyler Ohlsen Date: Wed Feb 21 15:59:34 2024 -0800 Inject NamedWriteableRegistry in AD node client (#1164) Signed-off-by: Tyler Ohlsen commit 5b85720d442d1b43001dde0c20248fd4a20a64b0 Author: Owais Kazi Date: Tue Feb 13 10:20:20 2024 -0800 Fixed lucene url (#1158) Signed-off-by: owaiskazi19 commit 290bdcd832a0cae6d039787d9f0af73ea6be2ec2 Author: Kaituo Li Date: Tue Feb 6 16:14:49 2024 -0800 add 2.12 release notes (#1152) Signed-off-by: Kaituo Li commit 6a6eec347379c997f0f7acc88b027bc1ffdd8f54 Author: Tyler Ohlsen Date: Tue Jan 30 18:20:36 2024 -0800 Add ser/deser to get AD transport action request (#1150) Signed-off-by: Tyler Ohlsen commit 475f0c36e5b6267aaeb101627b9c3ae1fcca3a88 Author: Owais Kazi Date: Thu Jan 25 14:37:12 2024 -0800 Updated lucene snapshot url (#1146) Signed-off-by: owaiskazi19 commit 7192d848d2923566a409901909f342a63695e1c2 Author: Jackie Han Date: Thu Jan 25 09:48:37 2024 -0800 Remove default admin credentials (#1134) * Remove default admin credentials Signed-off-by: Jackie Han * Replace default password with a placeholder in README files Signed-off-by: Jackie Han --------- Signed-off-by: Jackie Han commit 97482c19b0eded34a7f435e589303a834c258aa3 Author: Jackie Han Date: Wed Jan 24 09:39:55 2024 -0800 Require JDK version for java spotless check (#1129) Signed-off-by: Jackie Han commit 708e0462189677a217b35905c2feba5486c77cdc Author: Andriy Redko Date: Tue Jan 23 15:11:39 2024 -0500 Update to Jackson 2.16.1 (#1135) Signed-off-by: Andriy Redko commit 7c0ce4cb554a05230ecf5365b903219f357997bf Author: Andriy Redko Date: Tue Jan 16 17:51:37 2024 -0500 Update to Gradle 8.5 (#1131) Signed-off-by: Andriy Redko commit e5cbe93c0e9cadebe2a30cba83f99ae8a3f8fe57 Author: zane-neo Date: Thu Jan 4 16:50:47 2024 +0800 add publishToMavenLocal task to fix zip plugin not pulished to maven local issue when running this script (#1121) Signed-off-by: zane-neo commit 106dc25b3ef36beae329dc7882bcdf9c23347fb5 Author: Tyler Ohlsen Date: Wed Dec 27 16:33:25 2023 -0800 Refactor client's getDetectorProfile to use GetAnomalyDetectorTransportAction (#1124) Signed-off-by: Tyler Ohlsen commit 59b4ebecfa11cac977f49c999ce85637fb6fac58 Author: Tyler Ohlsen Date: Wed Dec 27 11:56:00 2023 -0800 Add profile transport action to AD client (#1119) Signed-off-by: Tyler Ohlsen commit 29711f96dbb2c9abc1181b933a8b334eed63ca66 Author: Tyler Ohlsen Date: Tue Dec 12 08:32:53 2023 -0800 Add an AD transport client (#1110) Signed-off-by: Tyler Ohlsen commit 353dcaeb05f8b75fa74d92e2ae8415ab018bc68e Author: Daniel Widdis Date: Wed Nov 22 13:59:53 2023 -0800 Fix build, update CVE-affected versions (#1102) * Fix build, update CVE-affected versions Signed-off-by: Daniel Widdis * Spotless depends on CVE-impacted eclipse dependency, now needs JDK17+ Signed-off-by: Daniel Widdis --------- Signed-off-by: Daniel Widdis commit 4c6ba48bf9fb9234ad8bc0b9193f3c68409acfb9 Author: Peter Zhu Date: Mon Oct 30 19:35:01 2023 -0400 Fix the bwc test version retrieval (#1093) * Onboarding jenkins prod docker images to github actions Signed-off-by: Peter Zhu * Add temurin Signed-off-by: Peter Zhu * Add temurin Signed-off-by: Peter Zhu * Add more Signed-off-by: Peter Zhu * Add more Signed-off-by: Peter Zhu * Add more Signed-off-by: Peter Zhu --------- Signed-off-by: Peter Zhu commit a1da3aa0eefc6671446d2eb3bc670bad6449d2f0 Author: Peter Zhu Date: Mon Oct 30 19:14:31 2023 -0400 Onboarding jenkins prod docker images to github actions (#1092) * Onboarding jenkins prod docker images to github actions Signed-off-by: Peter Zhu * Add temurin Signed-off-by: Peter Zhu * Add temurin Signed-off-by: Peter Zhu * Add more Signed-off-by: Peter Zhu --------- Signed-off-by: Peter Zhu commit 040cd7e33f8e696ffe7748140c9b0ecc7475d513 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Oct 10 12:43:02 2023 -0700 dependabot: bump net.bytebuddy:byte-buddy from 1.14.6 to 1.14.9 (#1081) Bumps [net.bytebuddy:byte-buddy](https://github.com/raphw/byte-buddy) from 1.14.6 to 1.14.9. - [Release notes](https://github.com/raphw/byte-buddy/releases) - [Changelog](https://github.com/raphw/byte-buddy/blob/master/release-notes.md) - [Commits](https://github.com/raphw/byte-buddy/compare/byte-buddy-1.14.6...byte-buddy-1.14.9) --- updated-dependencies: - dependency-name: net.bytebuddy:byte-buddy dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit dd9c1521bc1946027245d65e39a7844cdf04a8b7 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Oct 10 12:42:15 2023 -0700 dependabot: bump aws-actions/configure-aws-credentials (#1076) Bumps [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials) from 1.7.0 to 4.0.1. - [Release notes](https://github.com/aws-actions/configure-aws-credentials/releases) - [Changelog](https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws-actions/configure-aws-credentials/compare/v1.7.0...v4.0.1) --- updated-dependencies: - dependency-name: aws-actions/configure-aws-credentials dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit d6e3fd7a69b1daea45d7a455335e55b6de118033 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Oct 10 12:05:00 2023 -0700 dependabot: bump com.netflix.nebula.ospackage from 11.0.0 to 11.5.0 (#1066) Bumps com.netflix.nebula.ospackage from 11.0.0 to 11.5.0. --- updated-dependencies: - dependency-name: com.netflix.nebula.ospackage dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 57eacf611ce44559e14aa37f2e51dfbb82d53cc2 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Oct 10 12:04:19 2023 -0700 dependabot: bump org.apiguardian:apiguardian-api from 1.1.0 to 1.1.2 (#1058) Bumps [org.apiguardian:apiguardian-api](https://github.com/apiguardian-team/apiguardian) from 1.1.0 to 1.1.2. - [Release notes](https://github.com/apiguardian-team/apiguardian/releases) - [Commits](https://github.com/apiguardian-team/apiguardian/compare/r1.1.0...r1.1.2) --- updated-dependencies: - dependency-name: org.apiguardian:apiguardian-api dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 6b9faf2b71e5481be366b12bd6f16440c6c8ef89 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Oct 10 12:04:01 2023 -0700 dependabot: bump org.junit.platform:junit-platform-launcher (#1056) Bumps [org.junit.platform:junit-platform-launcher](https://github.com/junit-team/junit5) from 1.9.2 to 1.10.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-launcher dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 2a957f2086688b5ee76703406105797d31207cc5 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Oct 10 12:03:11 2023 -0700 Bump urllib3 from 1.26.9 to 1.26.17 in /dataGeneration (#1068) Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.9 to 1.26.17. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/1.26.9...1.26.17) --- updated-dependencies: - dependency-name: urllib3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit a12e33214f9c138946975801cefa2bd39c7978a9 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Oct 10 11:29:37 2023 -0700 dependabot: bump org.objenesis:objenesis from 3.0.1 to 3.3 (#1040) Bumps [org.objenesis:objenesis](https://github.com/easymock/objenesis) from 3.0.1 to 3.3. - [Release notes](https://github.com/easymock/objenesis/releases) - [Commits](https://github.com/easymock/objenesis/compare/3.0.1...3.3) --- updated-dependencies: - dependency-name: org.objenesis:objenesis dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 5a4ba14a431fbc53f757416542cda25ef2fae58c Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Oct 10 11:28:46 2023 -0700 dependabot: bump tibdex/github-app-token from 2.0.0 to 2.1.0 (#1065) Bumps [tibdex/github-app-token](https://github.com/tibdex/github-app-token) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/tibdex/github-app-token/releases) - [Commits](https://github.com/tibdex/github-app-token/compare/v2.0.0...v2.1.0) --- updated-dependencies: - dependency-name: tibdex/github-app-token dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 713d556d980ccb144eb6ae952cebc7b3963ed28c Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed Sep 13 15:05:44 2023 -0700 dependabot: bump actions/setup-java from 1 to 3 (#1035) Bumps [actions/setup-java](https://github.com/actions/setup-java) from 1 to 3. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v1...v3) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 574ac521653ede84e7b821bc3c06049f1054a6ad Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed Sep 13 10:53:02 2023 -0700 dependabot: bump tibdex/github-app-token from 1.5.0 to 2.0.0 (#1042) Bumps [tibdex/github-app-token](https://github.com/tibdex/github-app-token) from 1.5.0 to 2.0.0. - [Release notes](https://github.com/tibdex/github-app-token/releases) - [Commits](https://github.com/tibdex/github-app-token/compare/v1.5.0...v2.0.0) --- updated-dependencies: - dependency-name: tibdex/github-app-token dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 65e207aef49a6872408ae02e4f49cdd9060c1ef0 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed Sep 13 10:52:40 2023 -0700 dependabot: bump org.apache.commons:commons-pool2 from 2.10.0 to 2.11.1 (#1045) Bumps org.apache.commons:commons-pool2 from 2.10.0 to 2.11.1. --- updated-dependencies: - dependency-name: org.apache.commons:commons-pool2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit a4ff71926af39726d9b4584102706e3ea7f4fa05 Author: Craig Perkins Date: Mon Sep 11 14:16:31 2023 -0400 React to Tracer changes in TransportService (#1034) Signed-off-by: Craig Perkins commit 05d0a3b905cae9d25f6d5d91f30f1b842b9a792f Author: Craig Perkins Date: Mon Sep 11 14:14:20 2023 -0400 Ensure integ tests run with security after plugin rename (#1023) * Ensure integ tests run with security after plugin rename Signed-off-by: Craig Perkins * Rename to time-series-analytics Signed-off-by: Craig Perkins * Switch folder back Signed-off-by: Craig Perkins * Run integTest with -i Signed-off-by: Craig Perkins * Remove opensearch-anomaly-detection if installed Signed-off-by: Craig Perkins * Update password rules and change expected error msg Signed-off-by: Craig Perkins * Update password generation Signed-off-by: Craig Perkins * Fix indexOf condition Signed-off-by: Craig Perkins --------- Signed-off-by: Craig Perkins commit 72210f014ab54bf4a5b567ebe9dabe13b66c6cbb Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Sep 11 11:13:39 2023 -0700 dependabot: bump codecov/codecov-action from 1 to 3 (#1038) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 1 to 3. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v1...v3) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit b77c3a7406e94424550ec1f22f084bc20533994f Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Sep 11 11:13:14 2023 -0700 dependabot: bump com.google.guava:guava from 32.0.1-jre to 32.1.2-jre (#1037) Bumps [com.google.guava:guava](https://github.com/google/guava) from 32.0.1-jre to 32.1.2-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 18defcc16e81abe590e8f109d6df3c4a060f74ce Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Sep 11 11:13:03 2023 -0700 dependabot: bump VachaShah/backport from 1.1.4 to 2.2.0 (#1039) Bumps [VachaShah/backport](https://github.com/vachashah/backport) from 1.1.4 to 2.2.0. - [Release notes](https://github.com/vachashah/backport/releases) - [Changelog](https://github.com/VachaShah/backport/blob/main/CHANGELOG.md) - [Commits](https://github.com/vachashah/backport/compare/v1.1.4...v2.2.0) --- updated-dependencies: - dependency-name: VachaShah/backport dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 726759f104117e1a28648a1524cdface49168b79 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Sep 11 11:12:53 2023 -0700 dependabot: bump actions/checkout from 2 to 4 (#1041) Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit f6ac01886a662264323d1e11a2199fb190148c80 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Sep 11 11:12:38 2023 -0700 dependabot: bump org.jacoco:org.jacoco.ant from 0.8.5 to 0.8.10 (#1044) Bumps [org.jacoco:org.jacoco.ant](https://github.com/jacoco/jacoco) from 0.8.5 to 0.8.10. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.5...v0.8.10) --- updated-dependencies: - dependency-name: org.jacoco:org.jacoco.ant dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit d30bcc394e6f281b6de504f102a0085ae56e78e4 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Sep 11 11:12:22 2023 -0700 dependabot: bump org.junit.jupiter:junit-jupiter-api (#1043) Bumps [org.junit.jupiter:junit-jupiter-api](https://github.com/junit-team/junit5) from 5.9.2 to 5.10.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.9.2...r5.10.0) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 92256db92f9ed78cb1de9925297c9ff5cce6da74 Author: Craig Perkins Date: Mon Sep 11 14:04:23 2023 -0400 Add dependabot.yml (#1026) Signed-off-by: Craig Perkins commit 23611f6d8ccdc9a4c41469ec0a4746290f976b4f Author: Jackie Han Date: Fri Sep 8 11:19:31 2023 -0700 Add 2.10 release notes (#1031) Signed-off-by: Jackie Han commit ee1db57058e08c36e4820637973f18016cf45015 Author: Owais Kazi Date: Wed Sep 6 16:55:00 2023 -0700 Updates demo certs for integ tests (#1018) Signed-off-by: Owais Kazi commit 338d72eb692c81802a70fe42556cde70c01cad6a Author: Kaituo Li Date: Wed Sep 6 16:08:01 2023 -0700 refactor job response (#1017) Signed-off-by: Kaituo Li commit db456c2543a6f1ff6b77db10bd19952768d16182 Author: Jackie Han Date: Tue Sep 5 15:47:50 2023 -0700 upgrading commons-lang3 version to fix conflict issue (#1012) * force commons-lang3 version to fix conflict issue Signed-off-by: Jackie Han * getting commons-lang3 version from upstream version properties file Signed-off-by: Jackie Han * getting commons-lang3 version from core Signed-off-by: Jackie Han * getting commons-lang3 version from core Signed-off-by: Jackie Han * upgrading commons-lang3 version to align with core Signed-off-by: Jackie Han --------- Signed-off-by: Jackie Han commit db788f4714233121eba4238869b8db89ae0037d4 Author: Owais Kazi Date: Tue Sep 5 13:58:31 2023 -0700 Adds auto release workflow (#1003) Signed-off-by: owaiskazi19 commit 327c141e9b70465b1760f9ebf8c001a2e439b01f Author: Jackie Han Date: Fri Sep 1 13:00:23 2023 -0700 Revert "Enforce DOCUMENT Replication for AD Indices and Adjust Primary Shards (#948)" (#999) This reverts commit bc1649922ef39619424fc16c64af5836e48a4a12. commit 4a09b741e1c127a92775cb55f4c56aa5c4f3f6a3 Author: Kaituo Li Date: Mon Aug 21 11:21:36 2023 -0700 Update Gradle Wrapper to 8.2.1 for Enhanced JDK20 Compatibility (#985) - **Reason for Upgrade**: The migration to JDK20 ([reference](https://github.com/opensearch-project/opensearch-build/blob/aa65a8ecd69f77c3d3104043dd1c48dff708bffa/manifests/3.0.0/opensearch-3.0.0.yml#L9)) rendered the current Gradle version (7.6.1) incompatible. - **Actions Taken**: - **Gradle Wrapper Update**: Upgraded the Gradle wrapper to version 8.2.1 to maintain compatibility with JDK20. The gradle wrapper files are generated using the `./gradlew wrapper` command. - Applied `spotless` due to new formatting requirements in Gradle 8. - Resolved test "jar hell" issues. Gradle 8 introduced internal JARs to the test classpath that conflicted with dependencies from `org.junit.vintage:junit-vintage-engine`. As a remedy, these conflicting JARs have been excluded. - **Relevant Pull Requests**: - [Alerting#893](https://github.com/opensearch-project/alerting/pull/893/files) - [ML-Commons#892](https://github.com/opensearch-project/ml-commons/pull/892) - [Security PR](https://github.com/opensearch-project/security/pull/2978) - **Verification**: Successfully verified the changes using `gradle build`. Signed-off-by: Kaituo Li commit 5ac6390e7de643d8177f0a5833995032f3a279ad Author: Kaituo Li Date: Thu Aug 17 11:08:36 2023 -0700 Refactoring task cache manager for forecasting (#982) * Refactoring Shared Functionality for Broader Task Compatibility This PR extracts shared components from `ADTaskCacheManager` into `TaskCacheManager` to support the requirements of the forecasting feature. **Renamings**: - **Method-level in `ADTaskCacheManager`**: - `addDeletedDetector` to `addDeletedConfig` - `addDeletedDetectorTask` to `addDeletedTask` - `hasDeletedDetectorTask` to `hasDeletedTask` - `pollDeletedDetector` to `pollDeletedConfig` - `pollDeletedDetectorTask` to `pollDeletedTask` - **Variable-level in `AnomalyDetectorSettings`**: - `CHECKPOINT_MAINTAIN_QUEUE_MAX_HEAP_PERCENT` to `AD_CHECKPOINT_MAINTAIN_QUEUE_MAX_HEAP_PERCENT` - `CHECKPOINT_READ_QUEUE_MAX_HEAP_PERCENT` to `AD_CHECKPOINT_READ_QUEUE_MAX_HEAP_PERCENT` - `CHECKPOINT_SAVING_FREQ` to `AD_CHECKPOINT_SAVING_FREQ` - `CHECKPOINT_TTL` to `AD_CHECKPOINT_TTL` - `CHECKPOINT_WRITE_QUEUE_MAX_HEAP_PERCENT` to `AD_CHECKPOINT_WRITE_QUEUE_MAX_HEAP_PERCENT` - `COLD_ENTITY_QUEUE_MAX_HEAP_PERCENT` to `AD_COLD_ENTITY_QUEUE_MAX_HEAP_PERCENT` - `DEDICATED_CACHE_SIZE` to `AD_DEDICATED_CACHE_SIZE` - `ENTITY_COLD_START_QUEUE_CONCURRENCY` to `AD_ENTITY_COLD_START_QUEUE_CONCURRENCY` - `ENTITY_COLD_START_QUEUE_MAX_HEAP_PERCENT` to `AD_ENTITY_COLD_START_QUEUE_MAX_HEAP_PERCENT` - `EXPECTED_COLD_ENTITY_EXECUTION_TIME_IN_MILLISECS` to `AD_EXPECTED_COLD_ENTITY_EXECUTION_TIME_IN_MILLISECS` - `FILTER_BY_BACKEND_ROLES` to `AD_FILTER_BY_BACKEND_ROLES` - `MAX_ENTITIES_PER_QUERY` to `AD_MAX_ENTITIES_PER_QUERY` - `MAX_MODEL_SIZE_PER_NODE` to `AD_MAX_MODEL_SIZE_PER_NODE` - `MAX_MULTI_ENTITY_ANOMALY_DETECTORS` to `AD_MAX_HC_ANOMALY_DETECTORS` - `MAX_RETRY_FOR_END_RUN_EXCEPTION` to `AD_MAX_RETRY_FOR_END_RUN_EXCEPTION` - `MAX_SINGLE_ENTITY_ANOMALY_DETECTORS` to `AD_MAX_SINGLE_ENTITY_ANOMALY_DETECTORS` - `MODEL_MAX_SIZE_PERCENTAGE` to `AD_MODEL_MAX_SIZE_PERCENTAGE` - `PAGE_SIZE` to `AD_PAGE_SIZE` - `RESULT_WRITE_QUEUE_MAX_HEAP_PERCENT` to `AD_RESULT_WRITE_QUEUE_MAX_HEAP_PERCENT` - **Class-level**: - `ADRealtimeTaskCache` renamed to `RealtimeTaskCache` - **Package-level**: - Shifted from `org.opensearch.ad.breaker` to `org.opensearch.timeseries.breaker` **Migrations**: - Variables transferred from `AnomalyDetectorSettings` to `TimeSeriesSettings`: - `BATCH_BOUNDING_BOX_CACHE_RATIO` - `CHECKPOINT_MAINTAIN_REQUEST_SIZE_IN_BYTES` - `CHECKPOINT_WRITE_QUEUE_SIZE_IN_BYTES` - `DEFAULT_AD_JOB_LOC_DURATION_SECONDS` (renamed to `DEFAULT_JOB_LOC_DURATION_SECONDS`) - `ENTITY_REQUEST_SIZE_IN_BYTES` - `HOURLY_MAINTENANCE` - `INTERVAL_RATIO_FOR_REQUESTS` - `LOW_SEGMENT_PRUNE_RATIO` - `MAINTENANCE_FREQ_CONSTANT` - `MAX_COLD_START_ROUNDS` - `MAX_QUEUED_TASKS_RATIO` - `MAX_TOTAL_RCF_SERIALIZATION_BUFFERS` - `MAX_CHECKPOINT_BYTES` - `MEDIUM_SEGMENT_PRUNE_RATIO` - `NUM_MIN_SAMPLES` - `NUM_SAMPLES_PER_TREE` - `NUM_TREES` - `QUEUE_MAINTENANCE` - `RESULT_WRITE_QUEUE_SIZE_IN_BYTES` - `SERIALIZATION_BUFFER_BYTES` - `THRESHOLD_MIN_PVALUE` - `TIME_DECAY` **Deletions**: - Obsolete settings and methods: - `DESIRED_MODEL_SIZE_PERCENTAGE` in `AnomalyDetectorSettings` - `getDesiredModelSize` in `MemoryTracker` **Modifications**: - `MemoryTracker` enums renamed for clear differentiation between real-time and historical memory usage, adding `REAL_TIME_FORECASTER` for a harmonized single-stream and HC analysis approach. **Tests**: - Changes validated with a successful Gradle build. Signed-off-by: Kaituo Li * improve comments Signed-off-by: Kaituo Li * improve comments Signed-off-by: Kaituo Li --------- Signed-off-by: Kaituo Li commit 0c5b4b94cb5b192160463fa8a5f58eac587fe95d Author: Kaituo Li Date: Tue Aug 15 13:09:17 2023 -0700 Update RCF to v3.8 and Enable Auto AD with 'Alert Once' Option (#979) * Update RCF to v3.8 and Enable Auto AD with 'Alert Once' Option This PR added support for automatic Anomaly Detection (AD) and the 'Alert Once' option introduced in RCF 3.8. Testing done: 1. Deserialization Test: * Verified model deserialization from 3.0-rc3. * Ensured consistent scoring using the rc3 checkpoint and rc3 dependency on identical data. 2. Backward Compatibility Test: * Executed a mixed cluster with versions 2.10 and 3.0. * Validated that older detectors still produce results without throwing any exceptions in a blue-green simulation scenario. Signed-off-by: Kaituo Li * reduce recall since alertOnce reduced recall Signed-off-by: Kaituo Li * remove commented out code Signed-off-by: Kaituo Li --------- Signed-off-by: Kaituo Li commit cadc9bbd949daf4f2669335bfb8629e2137c108d Author: Joshua Palis Date: Fri Aug 11 16:02:38 2023 -0700 Fixing imports, adding TermsAggregator BucketCountThresholds for StringTerms, setting AnomalyResult grade to 0 if negative value (#976) Signed-off-by: Joshua Palis commit 3985cd2f82f2cfa57604ecf5a512bb042e632cae Author: Romain Tartière Date: Wed Aug 9 08:59:30 2023 -1000 Fix build with latest OpenSearch (for real this time) (#972) This is a follow-up to #971, where commit 2839bc2c6f470639b68901086c80cb2152d96558 only fixed _some_ but not _all_ of the build errors (it allowed `./gradlew run` to pass but `./gradlew build` was failing). Fix the build errors when we run `./gradlew build`. Signed-off-by: Romain Tartière commit 2839bc2c6f470639b68901086c80cb2152d96558 Author: Romain Tartière Date: Tue Aug 8 13:15:04 2023 -1000 Fix build with latest OpenSearch (#971) OpenSearch recently merged some code that cause buid failure for this module, as spotted in #585. This change the import to match the new one after https://github.com/opensearch-project/OpenSearch/pull/9103 Signed-off-by: Romain Tartière commit d4946f04e7ad44f0bc79215962c6678786c592ff Author: Kaituo Li Date: Mon Aug 7 14:21:56 2023 -0700 Refactor ADTask and Related Components (#969) * Refactor ADTask and Related Components This PR includes several key refactoring changes: - Extracts common code from ADTask into TimeSeriesTask, creating ForecastTask for forecasting-specific logic. - Consolidates common code from ADTaskType into TaskType and introduces ForecastTaskType for forecasting-related purposes. - Renames ADTaskState to TaskState for consistent code reuse. - Renames the method getId in ADTask to getConfigId to differentiate it from other IDs like task id. Testing done: 1. Added unit tests for the new code to ensure functionality. 2. Executed a successful Gradle build. Signed-off-by: Kaituo Li * add comments and address compiler errors Signed-off-by: Kaituo Li * address Amit's comments and address compiler failure Signed-off-by: Kaituo Li --------- Signed-off-by: Kaituo Li commit 1130a1ba6fc3c08f375dd99f98e93e4ee36331fb Author: Kaituo Li Date: Thu Jul 27 10:39:39 2023 -0700 Refactoring NodeStateManager etc. to support forecasting functionality (#965) * Refactoring NodeStateManager etc. to support forecasting functionality This commit extends the codebase to support both Anomaly Detection (AD) and forecasting. It contains a mixture of refactoring, renaming, removal of unused code, and package moving tasks. Here are the details: Refactoring: - `NodeStateManager.getAnomalyDetector` is now `getConfig`, with added functionality to fetch a Forecaster. The method comments are updated for clarity. - Existing methods (`getFeatureSamplesForPeriods`, `getColdStartSamplesForPeriods`, `createPreviewSearchRequest`, `getMinDataTime`) have been added in `SearchFeatureDao` to handle forecasting logic. - Adjusted `SecurityClientUtil` and `ParseUtils` to handle forecasting logic. - Cleaned up `NodeState` to differentiate state for AD and forecasting. Renaming: - `AnomalyDetectorJob` is renamed to `Job` to facilitate reuse for forecasting. - `NodeStateManager.getAnomalyDetectorJob` is renamed to `getJob`. - Certain settings in `AnomalyDetectorSettings` are renamed to reflect they are meant for the AD setting. They have been marked as deprecated and new settings are used in `TimeSeriesSettings` instead. - `IndexAnomalyDetectorJobActionHandler.getAnomalyDetectorJobForWrite` is renamed to `getJobForWrite`. - `ADSafeSecurityInjector` is renamed to `TimeSeriesSafeSecurityInjector`. Removing unused code: - Synchronous code in `ClientUtil`, `IndexUtils`, and `CheckpointDao` is removed. - The unused class `Throttler` is deleted. - Mapping file names are changed, and the code referencing these files is adjusted. Package moving: - Several classes (`ClientUtil`, `MultiResponsesDelegateActionListener`, `SafeSecurityInjector`, `SecurityUtil`, `ExceptionUtil`, `SearchFeatureDao`, `CleanState`, `ExpiringState`, `MaintenanceState`, `NodeState`, `SingleStreamModelIdMapper`, `BackPressureRouting`) are moved to the respective `org.opensearch.timeseries` packages. Miscellaneous: - Fixed compiler failures caused by changes in https://github.com/opensearch-project/OpenSearch/pull/8730 by replacing `DoubleArrayList` with `java.util.ArrayList`. - Updates the Backwards Compatibility (bwc) version to align with the core's incremented bwc version as per [OpenSearch PR #8670](https://github.com/opensearch-project/OpenSearch/pull/8670). This change prevents the issue described in [OpenSearch Issue #5076](https://github.com/opensearch-project/OpenSearch/issues/5076). Testing: - Executed a `gradle build`. - Added new tests for `ClientUtil` and `NodeStateManager`. Signed-off-by: Kaituo Li * improve comment Signed-off-by: Kaituo Li * fix compiler error and comments Signed-off-by: Kaituo Li --------- Signed-off-by: Kaituo Li commit f0ed43b1aa3c5d80dc6f23a5dd4465bb03ef1739 Author: Kaituo Li Date: Mon Jul 17 15:18:03 2023 -0700 Rename AD to time series analytics & Resolve Compiler Errors (#951) This commit focuses on renaming the AnomalyDetectorPlugin to TimeSeriesAnalyticsPlugin as well as addressing compiler errors due to package import changes. The primary transformations are: * Renamed AnomalyDetectorPlugin to TimeSeriesAnalyticsPlugin. * Updated all references from AnomalyDetectorPlugin to TimeSeriesAnalyticsPlugin. * Amended plugin information in build.gradle and src/main/resources/es-plugin.properties. * Switched job type in TimeSeriesAnalyticsPlugin from opendistro_anomaly_detector to opensearch_time_series_analytics. These changes led to the modification of our plugin binary from opensearch-anomaly-detection-3.0.0.0-SNAPSHOT.jar to opensearch-time-series-analytics-3.0.0.0-SNAPSHOT.jar. Moreover, following changes from OpenSearch Pull Request #8157, compiler errors were encountered, which were resolved by updating the import packages * org.opensearch.common.io.stream.NamedWriteableRegistry => org.opensearch.core.common.io.stream.NamedWriteableRegistry * org.opensearch.common.xcontent.XContentParserUtils => * org.opensearch.core.xcontent.XContentParserUtils * org.opensearch.common.bytes.BytesArray => org.opensearch.core.common.bytes.BytesArray * org.opensearch.common.io.stream.StreamInput => * org.opensearch.core.common.io.stream.StreamInput ** org.opensearch.common.io.stream.StreamOutput => org.opensearch.core.common.io.stream.StreamOutput * org.opensearch.common.io.stream.Writeable => org.opensearch.core.common.io.stream.Writeable * org.opensearch.common.io.stream.NotSerializableExceptionWrapper => org.opensearch.core.common.io.stream.NotSerializableExceptionWrapper * org.opensearch.rest.RestStatus => org.opensearch.core.rest.RestStatus * org.opensearch.common.ParsingException => org.opensearch.core.common.ParsingException * org.opensearch.common.bytes.BytesReference => org.opensearch.core.common.bytes.BytesReference * org.opensearch.common.io.stream.InputStreamStreamInput => org.opensearch.core.common.io.stream.InputStreamStreamInput * org.opensearch.common.io.stream.OutputStreamStreamOutput => org.opensearch.core.common.io.stream.OutputStreamStreamOutput * org.opensearch.index.shard.ShardId => org.opensearch.core.index.shard.ShardId* org.opensearch.index.Index => org.opensearch.core.index.Index * org.opensearch.core.index.IndexNotFoundException => org.opensearch.index.IndexNotFoundException Validation steps were executed to ensure these changes did not break functionality: * gradle build was successful. A local build was required due to outdated OpenSearch and job scheduler nightly builds. * Backward compatibility tests were performed on a two-node 2.9 cluster running some detectors. These detectors continued to produce results on a 3.0 cluster with these updates. * I can start new detectors on the 3.0 node. * After shutting down a 2.9 node, the job transfer to the 3.0 node was successful and the job continued to perform as expected. Signed-off-by: Kaituo Li commit c7c6a46e88e15f615fc9dae0499cf0d674662057 Author: Tyler Ohlsen Date: Thu Jul 13 15:42:46 2023 -0700 Add 2.9 release notes (#952) Signed-off-by: Tyler Ohlsen commit bc1649922ef39619424fc16c64af5836e48a4a12 Author: Kaituo Li Date: Tue Jul 11 13:34:09 2023 -0700 Enforce DOCUMENT Replication for AD Indices and Adjust Primary Shards (#948) * Enforce DOCUMENT Replication for AD Indices and Adjust Primary Shards In this PR, we temporarily enforce DOCUMENT replication for AD indices. This change is necessary due to the current limitation of SegRep, which doesn't support Get/MultiGet by ID. This measure will be in place until SegRep adds support for these operations. This adjustment aligns with the modification made in the referenced PR: job-scheduler PR #417 Additionally, this PR increases the number of primary shards for forecasting indices from 10 to 20, recognizing the higher write intensity of these indices. For instance, when the horizon is 24, we are expected to save 25 documents: 24 for each forecast and 1 for the actual value. In contrast, for AD, we save one document per actual value. Testing done: 1. gradle build passed Signed-off-by: Kaituo Li * Fix comments Signed-off-by: Kaituo Li --------- Signed-off-by: Kaituo Li commit a1203827617ee42b35d41cb8b010719f334f73b7 Author: Kaituo Li Date: Mon Jul 10 10:53:17 2023 -0700 Add ForecastResult and Refactor Shared Code (#941) This commit adds the functionality of ForecastResult, while also performing several necessary refactorings. Firstly, we introduce ForecastResult, which closely mirrors the functionality of AnomalyResult. Any shared code between these two classes has been abstracted out into a new parent class, IndexableResult. This refactoring was undertaken to facilitate code reuse and improve maintainability, as both classes deal with storing fields that need to be saved in result indices. Secondly, we've also extracted common code from ThresholdingResult into another new class, IntermediateResult. This work is in preparation for a forthcoming PR which will introduce RCFCasterResult. In this change, we moved the 'toAnomalyResult' method to IndexableResult, and renamed it to 'toIndexableResults'. This renaming allows for reuse in the upcoming RCFCasterResult. The updated method now returns a list of results instead of a single result. The shift caters for the RCFCasterResult use case where one RCFCasterResult is stored across multiple ForecastResult documents. Furthermore, this commit modifies the 'entity' field in several methods to be of the Optional type, indicating that it can be empty. This change provides a clear signal to other developers about the optional nature of these fields. In addition, this commit updates the mapping for the forecast result index. The prior mapping was a placeholder and this change brings it up to date. We've also moved to using httpcore5 and httpclient5 versions from OpenSearch core, as necessitated by recent changes in [OpenSearch PR #8434](https://github.com/opensearch-project/OpenSearch/pull/8434/files). This shift resolves potential jar hell issues with httpcore5 and httpclient5. Lastly, we've made name and package changes: 1. Renamed 'initDetectionStateIndex' in ADIndexManagement to 'initStateIndex' to align with ForecastIndexManagement naming. 2. Moved the 'DataByFeatureId' class to the 'timeseries' package for better organization. This commit also completes the 'createDummyIndexRequest' method in ForecastIndexManagement by invoking 'ForecastResult.getDummyResult()', which is now possible due to the introduction of the ForecastResult implementation. Testing done: 1. added tests for new code 2. gralde build passes 3. e2e tests Signed-off-by: Kaituo Li commit f24d9e32ff739abf29cac3da15fd00f74219e213 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Jul 6 17:28:09 2023 -0700 Bump scipy from 1.8.0 to 1.10.0 in /dataGeneration (#943) Bumps [scipy](https://github.com/scipy/scipy) from 1.8.0 to 1.10.0. - [Release notes](https://github.com/scipy/scipy/releases) - [Commits](https://github.com/scipy/scipy/compare/v1.8.0...v1.10.0) --- updated-dependencies: - dependency-name: scipy dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 9b9fd2ba3f3e678d717c0a45af8069bb67828808 Author: Amit Galitzky Date: Tue Jun 27 16:08:55 2023 -0700 bump guava version to 32.0.1 (#933) Signed-off-by: Amit Galitzky commit 99749dfa6bfc8a2f2c4660ca01d75d1ad57124a5 Author: Kaituo Li Date: Mon Jun 26 16:46:24 2023 -0700 Refactoring Index Creation for Improved Code Reuse and Consistency (#932) This Pull Request significantly refactors the index creation module to promote greater code reusability and consistency. The primary changes are outlined as follows: 1. Code Migration: Common code segments have been moved from AnomalyDetectionIndices to IndexManagement. In addition, component-specific code has been established in ADIndexManagement and ForecastIndexManagement. The bulk of changes are concentrated in these three classes, with the remainder of the modifications relating to reference/test changes. 2. Function Renaming: Several functions have been renamed for broader applicability and consistency: * AnomalyDetectorFunction has been renamed to ExecutorFunction for potential use in Forecasting. * AnomalyDetectorSettings.MAX_PRIMARY_SHARDS has been renamed to AnomalyDetectorSettings.AD_MAX_PRIMARY_SHARDS in light of the new ForecastSettings.FORECAST_MAX_PRIMARY_SHARDS. * doesAnomalyDetectorJobIndexExist() has been renamed to doesJobIndexExist() to allow for job index reusability across Anomaly Detection (AD) and forecasting. Analogous changes have been made to other job index-related functions. * doesAnomalyDetectorIndexExist() has been renamed to doesConfigIndexExist() to allow for config index reusability across AD and forecasting. Analogous changes have been made to other config index-related functions. * detectionIndices.doesDetectorStateIndexExist() has been renamed to detectionIndices.doesStateIndexExist(), as the former name was unnecessarily redundant. Similar modifications have been made to the result and checkpoint index. 3. Class Migration: The classes ThrowingSupplierWrapper, ThrowingConsumer, and ThrowingSupplier have been moved from org.opensearch.ad.util to org.opensearch.timeseries.function to promote code reuse. 4. Initial Forecast Indices' Mapping: An initial version of forecast indices' mapping has been added, which can be adjusted as required in the future. 5. In terms of version updates, 2.x has been bumped to 2.9, prompting an increment of the Backward Compatibility (BWC) test version to 2.9. 6. Update dependency com.google.guava:guava to v32 for cve fix. Testing done: Testing has been performed with new tests added for forecast index creation, and the grade build passes successfully. Signed-off-by: Kaituo Li commit aedb781a6b1df984636d72d50b65d41138539918 Author: Craig Perkins Date: Tue Jun 20 16:55:19 2023 -0400 Fix main build - update import of Releasable and remove reference to BaseExceptionsHelper (#930) * Fix main build - update import of Releasable and remove reference to BaseExceptionsHelper Signed-off-by: Craig Perkins * Update imports in test classes Signed-off-by: Craig Perkins --------- Signed-off-by: Craig Perkins commit fce78c29c0375ae06f56e16c85fb98933401e28f Author: Kaituo Li Date: Wed Jun 14 10:36:40 2023 -0700 Refactor: Reorganize code for Forecasting and AnomalyDetector packages (#925) * Refactor: Reorganize code for Forecasting and AnomalyDetector packages This PR includes several refactorings to increase code reuse and improve readability: 1. Entity, FeatureData, and RestHandlerUtils have been moved from the 'ad' package to the 'timeseries' package, enabling their use within the Forecasting code. 2. A new class, DataByFeatureId, has been created to hold shared code previously located in FeatureData. FeatureData now inherits from DataByFeatureId. The standalone usage of DataByFeatureId will be detailed in subsequent PRs. 3. Renamed checkAnomalyDetectorFeaturesSyntax to checkFeaturesSyntax in RestHandlerUtils to make it more generic and usable for Forecasting. 4. Constants AGG_NAME_MAX_TIME, AGG_NAME_MIN_TIME, DATE_HISTOGRAM, and FEATURE_AGGS have been moved from ADCommonName to CommonName to make them accessible for Forecasting. 5. A new method, parseConfig, has been added to the Config class. This method can parse configuration for either AnomalyDetector or Forecaster based on input. Testing: The changes have been validated with a successful gradle build. Signed-off-by: Kaituo Li * address Amit and Owais's comments Signed-off-by: Kaituo Li --------- Signed-off-by: Kaituo Li commit 02c120f025f73f3d45a8477c7ef8b4873befebfa Author: Kaituo Li Date: Mon Jun 12 11:54:39 2023 -0700 Updated Maintainers and CODE_OWNERS list (#926) Signed-off-by: Kaituo Li commit 2ea4dcf430b40a710a0babb04881eeff9fb2d689 Author: Kaituo Li Date: Thu Jun 8 15:11:44 2023 -0700 Add Forecaster class (#920) * Add Forecaster class This PR adds class Forecaster that serves as the configuration POJO for forecasting. Shared code between AnomalyDetector and Forecaster is extracted and moved to the Config class to reduce duplication and promote reusability. References to the common code in related classes have also been adjusted. Testing done: 1. gradle build. Signed-off-by: Kaituo Li * fix compiler error due to a recent core change Signed-off-by: Kaituo Li * address Sudipto and Amit's comments Signed-off-by: Kaituo Li --------- Signed-off-by: Kaituo Li commit ee04225349a5f0f003d56e77a3243386f4a9673d Author: Kaituo Li Date: Fri Jun 2 15:42:19 2023 -0700 Refactor: Migrate files from 'ad' to 'timeseries' package (#918) * Refactor: Migrate files from 'ad' to 'timeseries' package This commit involves moving various files from the 'ad' package to the 'timeseries' package. All changes to dependent imports were handled automatically through the IDE, and no changes to file contents were made in the process. Testing done: - gradle build Signed-off-by: Kaituo Li * move ParseUtils to util package Signed-off-by: Kaituo Li --------- Signed-off-by: Kaituo Li commit 472868d165c2234eece8827584f64086aaf7ae92 Author: Kaituo Li Date: Thu Jun 1 11:17:16 2023 -0700 Refactor Shared Settings, Introduce Dynamic Forecast Settings, Rename (#912) * Refactor Shared Settings, Introduce Dynamic Forecast Settings, and Rename Checkpoint mapping File This commit has undertaken three changes: * Refactoring of Shared Settings: I've performed a refactoring to unify the settings that are shared between the AD and forecasting modules. * Introduction of Dynamic Forecast Settings: To increase the adaptability of our system, I've implemented dynamic forecast settings. These settings mirror the existing structure of the AD dynamic settings and will enable us to adjust forecast settings on-the-fly. * Renaming of Checkpoint File: To enhance the consistency across our AD mapping files, I've renamed checkpoint.json to anomaly-checkpoint.java. Testing done: 1. added tests for new settings. Signed-off-by: Kaituo Li * name change and delete files Signed-off-by: Kaituo Li --------- Signed-off-by: Kaituo Li commit 04ab91e60e9d71765a7b9df10b86e0e53ba4d715 Author: Kaituo Li Date: Wed May 31 12:18:54 2023 -0700 add 2.8 release notes (#915) Signed-off-by: Kaituo Li commit 98da8dffe8d336793ae35658015650b0f83aeef1 Author: Kaituo Li Date: Wed May 24 14:37:38 2023 -0700 Implementing Multiple Imputation Methods for Missing Values (#907) * Implementing Multiple Imputation Methods for Missing Values This Pull Request introduces multiple imputation methods to handle missing data in Anomaly Detection (AD) and forecasting. The ability to handle missing data is crucial to improve the robustness and accuracy of our models. The following imputation methods have been implemented: * Zero Imputation (ZERO): This method replaces all missing values with 0's. It's a simple approach, but it may introduce bias if the data is not centered around zero. * Fixed Values Imputation (FIXED_VALUES): This method replaces missing values with a predefined set of values. The values are the same for each input dimension, and they need to be specified by the user. * Previous Value Imputation (PREVIOUS): This method replaces missing values with the last known value in the respective input dimension. It's a commonly used method for time series data, where temporal continuity is expected. * Linear Interpolation (LINEAR): This method estimates missing values by interpolating linearly between known values in the respective input dimension. This method assumes that the data follows a linear trend. These methods are designed to provide a set of options for users to handle missing data based on their specific needs and the nature of their data. Testing Done: The code changes in this pull request have been validated through a gradle build to ensure that all new and existing tests pass successfully. Signed-off-by: Kaituo Li * Various changes The commit makes all new files use the shortened header text and addresses compiler/test issues due to core refactoring Signed-off-by: Kaituo Li --------- Signed-off-by: Kaituo Li commit da608aaa3d3f955efe32b0cb33b3c8cfdd7a7718 Author: Kaituo Li Date: Tue May 16 11:37:34 2023 -0700 Code Refactoring for CommonMessages (#902) * Code Refactoring for CommonMessages In this pull request, I have refactored the code related to shared log or error messages in both AD and forecasting modules to CommonMessages. Additionally, the previously used CommonErrorMessages has been renamed to ADCommonMessages. For the Forecasting module, I have introduced new names in ForecastCommonMessages. Testing done: * gradle build Signed-off-by: Kaituo Li * Update string constants wording Signed-off-by: Kaituo Li * improve wording and remove redundant variables Signed-off-by: Kaituo Li --------- Signed-off-by: Kaituo Li commit 041d6ce73d37f1697013b2d2f0683fbfe012247c Author: Kaituo Li Date: Fri May 12 13:05:56 2023 -0700 Code Refactoring for CommonName (#901) In this pull request, I have refactored the code related to shared names in both AD and forecasting modules to CommonNames. Additionally, the previously used CommonName has been renamed to ADCommonName. For the Forecasting module, I have introduced new names in ForecastCommonNames. Testing done: * gradle build Signed-off-by: Kaituo Li commit e2fee9d6ba59cc2a23eadbb50a80414fcc7dbf8f Author: Kaituo Li Date: Wed May 10 17:26:31 2023 -0700 Update outdated MAINTAINERS and OWNERS list (#898) Signed-off-by: Kaituo Li commit 98b566d1ec57ffd8970b5180c54b493deb1a24ac Author: Daniel (dB.) Doubrovkine Date: Wed May 10 18:03:04 2023 -0400 Sync up CODEOWNERS with MAINTAINERS.md. (#897) Signed-off-by: dblock commit 1f8415aa39fa4ec3ba016214255aa0e79b7c7d63 Author: Kaituo Li Date: Tue May 9 12:55:35 2023 -0700 Various fixes (#886) * Various fixes This pull request addresses several issues related to the compiler and tests in the current main branch. The first major change involves replacing ImmutableOpenMap with java.util.Map in the core. This modification is implemented in the following pull requests: https://github.com/opensearch-project/OpenSearch/pull/7165 https://github.com/opensearch-project/OpenSearch/pull/7301 To accommodate this change, the codebase of the AD (Anomaly Detection) module has been refactored to utilize JDK maps. As a consequence of this change, passing null to the custom parameters of ClusterState is no longer permissible, as it leads to a NullPointerException. The error stack trace is as follows: java.lang.NullPointerException: Cannot invoke "Object.getClass()" because "m" is null at __randomizedtesting.SeedInfo.seed([60CDDB34427ACD0C:6E72DB4ED18E018D]:0) at java.base/java.util.Collections.unmodifiableMap(Collections.java:1476) at org.opensearch.cluster.ClusterState.(ClusterState.java:219) at org.opensearch.ad.transport.DeleteAnomalyDetectorTests.createClusterState(DeleteAnomalyDetectorTests.java:216) at org.opensearch.ad.transport.DeleteAnomalyDetectorTests.testDeleteADTransportAction_LatestDetectorLevelTask(DeleteAnomalyDetectorTests.java:160) To address this issue, we have replaced the usage of null with new HashMap<>(). The second change in this pull request aligns with the modifications introduced in PR https://github.com/opensearch-project/anomaly-detection/pull/878. The third issue is related to the incompatibility between tests that utilize the @Parameters annotation and those that do not, as explained in https://tinyurl.com/2y265s2w. Specifically, the SearchFeatureDaoTests class runes tests with the @Parameters annotation, whereas SearchFeatureDao tests do not. Testing done: 1. gradle build. Signed-off-by: Kaituo Li commit 0a48da9e1a0cd70c64cc2da228674baaf377c89e Author: Jackie Han Date: Mon Apr 17 12:44:06 2023 -0700 Add 2.7 release notes (#871) Signed-off-by: Jackie Han commit 1edc2ef1ccfe20938711984744b20d1f2ec96a3c Author: Jackie Han Date: Tue Apr 11 17:53:57 2023 -0700 Update OpenSearchRejectedExecutionException import (#861) * Update OpenSearchRejectedExecutionException import Signed-off-by: Jackie Han * Update OpenSearchRejectedExecutionException import Signed-off-by: Jackie Han * Update OpenSearchRejectedExecutionException import Signed-off-by: Jackie Han * Update NodeInfo constructor and javadoc for isAdmin method Signed-off-by: Jackie Han --------- Signed-off-by: Jackie Han commit b8df172c2364997c446096e960068d6fc5d2e6f6 Author: Amit Galitzky Date: Tue Apr 11 10:55:28 2023 -0700 Giving admin priority over backendrole filtering (#850) * giving admin priority over backend role filtering Signed-off-by: Amit Galitzky * fix security tests Signed-off-by: Amit Galitzky * remove redundent line in test case Signed-off-by: Amit Galitzky --------- Signed-off-by: Amit Galitzky commit fd2fd5d5f63c9004b9f265e3c1e4475282447da8 Author: Daniel (dB.) Doubrovkine Date: Thu Mar 16 14:30:32 2023 -0400 Created untriaged issue workflow. (#809) Signed-off-by: dblock commit fd547014fdde5114bbc9c8e49fe7aaa37eb6e793 Author: Kaituo Li Date: Wed Mar 1 16:41:05 2023 -0800 Publish snapshots to maven via GHA, fix spotless errors, and bump bwc version (#827) We are de-coupling the task of publishing the maven snapshots from centralized build workflow to individual repositories. This PR publishes maven snapshots using GitHub Actions. Testing done: 1. ran ./gradlew publishPluginZipPublicationToSnapshotsRepository according to https://github.com/opensearch-project/anomaly-detection/issues/813 Signed-off-by: Kaituo Li commit b6be5960fb8cff41f0e9d13d5f5a971c289b80ed Author: Jackie Han Date: Thu Feb 23 12:23:01 2023 -0800 Update xcontent imports (#822) Signed-off-by: Jackie Han commit 1dcb78a6c4d1331133aefe5af7adf137daa8846f Author: Jackie Han Date: Wed Feb 22 11:17:21 2023 -0800 Add 2.6 release note (#818) Signed-off-by: Jackie Han commit 553688aae45590c37cc4d86102642d0b3a6ebb33 Author: Kaituo Li Date: Thu Feb 9 13:38:14 2023 -0800 Revert changes to exception message (#803) * Revert changes to exception message We used to log "No RCF models are available either because RCF models are not ready..." and now we log "resource_not_found_exception: No checkpoints found for model id...". This change caused an integration test failure. This PR reverts it back. Testing done: 1. verified that the original log is back. Signed-off-by: Kaituo Li * check NO_MODEL_ERR_MSG instead of NO_CHECKPOINT_ERR_MSG Signed-off-by: Kaituo Li --------- Signed-off-by: Kaituo Li commit c9bdc628a03c4ced3cd1ebeec44ebff792d7ff98 Author: Kaituo Li Date: Fri Feb 3 11:15:37 2023 -0800 fixing dls/fls logic around numeric aggregations (#801) Signed-off-by: Kaituo Li commit 9cebc5bc97a84dd78ac8892863ff7d674428bced Author: Amit Galitzky Date: Tue Jan 10 02:17:04 2023 +0000 adding 2.5 release notes Signed-off-by: Amit Galitzky commit 2ace84643fd199a5e5179e6d21ab76ae212cb7d8 Author: Ryan Bogan <10944539+ryanbogan@users.noreply.github.com> Date: Tue Jan 10 13:31:49 2023 -0800 Add jackson back to build.gradle (#780) Signed-off-by: Ryan Bogan commit a5d60eefab5ac30ef5243da8e7a88b7a2189cd5c Author: Kaituo Li Date: Mon Jan 9 15:49:35 2023 -0800 bump bwc to 2.6.0 (#775) We need to bump the version because only the latest 2.x will be upgradable to 3.0 when that ship. Since OpenSearch core bumped to 2.6, we need to do that as well. Note after bumping version, bwc still fails to find 2.6.0 core zip. Signed-off-by: Kaituo Li commit 27ed49863bfbef90551cdfacc6b51703bf622e25 Author: Kaituo Li Date: Mon Jan 9 12:17:57 2023 -0800 Fix the discrepancy between Profile API and real time tasks API (#770) * Fix the discrepancy between Profile API and real time tasks API This PR fixes the discrepancy by querying the result index when the total updates is less than 32. We have done similar things in profile API so I refactored reusable code to ProfileUtil. We also cached whether we have queried the result index and won't repeatedly issue the extra query. Testing done: 1. repeated repro steps in https://github.com/opensearch-project/anomaly-detection/issues/502 and verified the issue has been resolved. Signed-off-by: Kaituo Li commit b49a36b3e7962a205695d451e0497ee4f57fb2cb Author: Daniel (dB.) Doubrovkine Date: Thu Jan 5 10:19:51 2023 -0800 Updated MAINTAINERS.md to match recommended opensearch-project format. (#771) Signed-off-by: dblock commit 20d2c5f94811f62a7077142ba505bed272a83549 Author: Amit Galitzky Date: Tue Dec 20 13:16:21 2022 -0800 update bwc to 2.5 (#765) Signed-off-by: Amit Galitzky commit e08314f43a22d2692e8467efae3699fce0440611 Author: Amit Galitzky Date: Tue Dec 20 11:00:45 2022 -0800 [Forward-Port to main] Fix _source bug (#749) (#764) * Fix _source bug (#749) Signed-off-by: Amit Galitzky * fixed strings method Signed-off-by: Amit Galitzky commit 134942ed61b984e57b1f9c6bc7d416232d8f59d2 Author: Kaituo Li Date: Fri Dec 16 09:38:46 2022 -0800 Speed up cold start (#753) * Speed up cold start If historical data is enough, a single stream detector takes 1 interval for cold start to be triggered + 1 interval for the state document to be updated. Similar to single stream detectors, HCAD cold start needs 2 intervals and one more interval to make sure an entity appears more than once. So HCAD needs three intervals to complete cold starts. Long initialization is the single most complained problem of AD. This PR reduces both single stream and HCAD detectors' initialization time to 1 minute by * delaying real time cache update by one minute when we receive ResourceNotFoundException in single stream detectors or when the init progress of HCAD real time cache is 0. Thus, we can finish the cold start and writing checkpoint one minute later and update the state document accordingly. This optimization saves one interval to wait for the state document update. * disable the door keeper by default so that we won't have to wait an extra interval in HCAD. * trigger cold start when starting a real time detector. This optimization saves one interval to wait for the cold start to be triggered. Testing done: * verified the cold start time is reduced to 1 minute. * added tests for new code. Signed-off-by: Kaituo Li commit 609abe42df8af450e48bfa122746361f7a8201c7 Author: Daniel (dB.) Doubrovkine Date: Thu Dec 15 17:11:10 2022 -0500 Fix: typo in ohltyler. (#760) Signed-off-by: dblock commit ce3d747317aec5ccef080c767d4ba8e7015c5a2a Author: Varun Jain Date: Tue Dec 6 15:44:33 2022 -0800 Model Profile Test (#748) commit 09b4cc1ac3ab9fb4e589754acba619d265603580 Author: Amit Galitzky Date: Mon Dec 5 12:06:16 2022 -0800 Use sonatype to fetch JS instead of ci.opensearch.org (#740) Signed-off-by: Amit Galitzky commit a3e2b994ed347263a8dbaf5beed6bd5ddd6931a4 Author: Kaituo Li Date: Wed Nov 30 16:49:23 2022 -0800 AD model performance benchmark (#728) * AD model performance benchmark This PR adds an AD model performance benchmark so that we can compare model performance across versions. For the single stream detector, we refactored tests in DetectionResultEvalutationIT and moved it to SingleStreamModelPerfIT. For the HCAD detector, we randomly generated synthetic data with known anomalies inserted throughout the signal. In particular, these are one/two/four dimensional data where each dimension is a noisy cosine wave. Anomalies are inserted into one dimension with 0.003 probability. Anomalies across each dimension can be independent or dependent. We have approximately 5000 observations per data set. The data set is generated using the same random seed so the result is comparable across versions. We also backported #600 so that we can capture the performance data in CI output. We also fixed #712 by revising the client setup code. Testing done: * added unit tests to run the benchmark. Signed-off-by: Kaituo Li commit d8f0c355c026bd60b991a055f5d35dc0c8f654bd Author: Owais Kazi Date: Wed Nov 30 09:53:05 2022 -0800 Added coalesceToEmpty method (#736) Signed-off-by: Owais Kazi commit 7cefb143d61178223eec0dc1aa5aa2a16534316e Author: Kaituo Li Date: Tue Nov 8 10:19:50 2022 -0800 remove bwc code related to 1.0 and earlier version (#714) This PR addresses AD compile failure because the core removed 1x Version constants. (check https://github.com/opensearch-project/OpenSearch/pull/5021) OpenSearch does not support N-2 version compatibility. This is inherited from Elasticsearch and Lucene. So version 1x is not compatible with 3.0. Thus removal of deprecated 1x code. This PR follows suite and removes backward compatibility code on OpenSearch 1.0 and older versions. So we won't support direct upgrade from 1.x domains to 3.x. Testing done: 1. gradle build. Note that CI workflow will fail due to missing job scheduler. We are using a job scheduler from distribution. But due to a circular dependency on -SNAPSHOT builds being published to maven that require the distribution build to be successful (check https://github.com/opensearch-project/opensearch-build/issues/1463), AD compilation failure caused the job scheduler to be taken out. Not including the latest job scheduler will cause AD build to fail. So we have a chicken and egg problem: this PR fixes AD build failure and the PR itself cannot build due to missing job scheduler. To run gradle build, I changed to use local job scheduler and verified gradle build succeeded. Once I merge this PR. job scheduler should be able to build and be published to maven. Future AD CI should be unblocked after that. Signed-off-by: Kaituo Li commit bcfe952f0bfced908ce1c5b9547d23bd77cbb9f4 Author: Amit Galitzky Date: Mon Nov 7 09:00:56 2022 -0800 Fixing Docker CI for security enabled tests (#710) Signed-off-by: Amit Galitzky commit 06e5edb68686bb8ca9dfb63f7a9c92b0b44bc295 Author: Amit Galitzky Date: Fri Oct 28 11:44:40 2022 -0700 windows CI for AD (#703) Signed-off-by: Amit Galitzky commit c43ddbfce5ba5ee179b082fbeacd0c12422a71cb Author: Jackie Han Date: Thu Oct 27 10:55:41 2022 -0700 Add 2.4 release notes (#699) Signed-off-by: Jackie Han Signed-off-by: Jackie Han commit 7a05826a9f26ebd1e7c9bc8c821e7034e453562d Author: Jackie Han Date: Fri Oct 21 15:04:02 2022 -0700 Fixing issues caused by 3.0 version bumping (#696) * Update BaseNodeRequest dependency Signed-off-by: Jackie Han * Migrate client transports to Apache HttpClient / Core 5.x Signed-off-by: Jackie Han * Address spotlessCheck failures Signed-off-by: Jackie Han * Upgrade bwc version because 1.1.0 cannot be upgraded directly to version 3.0.0 Signed-off-by: Jackie Han * update bwc version to 2.4 Signed-off-by: Jackie Han * Update bwc version Signed-off-by: Jackie Han * update bwc download link Signed-off-by: Jackie Han * use latest 2.4 build for bwc test Signed-off-by: Jackie Han * move bwc constants to build script block Signed-off-by: Jackie Han Signed-off-by: Jackie Han commit 24232aea08cf9217600b4ec7c00742b078c99a47 Author: Tyler Ohlsen Date: Fri Oct 21 13:32:02 2022 -0700 Bump jackson-databind to 2.13.4.2 (#697) Signed-off-by: Tyler Ohlsen commit e5e15a6f9acfa9588abeefc8a6666bbb5f602488 Author: Jackie Han Date: Mon Oct 17 15:46:55 2022 -0700 bump version to 3.0.0 (#693) Signed-off-by: Jackie Han Signed-off-by: Jackie Han commit 16cee09f557b4c65edfd8961b25f200e466a01de Author: Prudhvi Godithi Date: Thu Oct 13 09:26:16 2022 -0700 add group = org.opensearch.plugin (#690) Signed-off-by: prudhvigodithi commit 27942cb37a73cd5f48764f14a72670bdda1c30a3 Author: Amit Galitzky Date: Mon Oct 3 15:16:38 2022 -0700 update jackson dependency version (#678) Signed-off-by: Amit Galitzky commit fd718445fc65934c8e2ff074194ff1f000cae952 Author: Amit Galitzky Date: Sun Sep 25 11:25:04 2022 -0700 Fix window delay test (#674) Signed-off-by: Amit Galitzky commit 426f713b8043c93494189271138e4c5b1ce4593f Author: Leonidas Spyropoulos Date: Thu Sep 22 19:48:35 2022 +0100 Add support for reproducible builds (#579) As per gradle [docs] add support to remove timestamps and package with same order which is required from [reproducible] builds [docs]: https://docs.gradle.org/current/userguide/working_with_files.html#sec:archives [reproducible]: https://reproducible-builds.org/ Signed-off-by: Leonidas Spyropoulos commit 397ebcc052110f9d3db1d312fc28b38c8530377e Author: Owais Kazi Date: Wed Sep 14 10:31:23 2022 -0700 Removed Github DCO action since DCO runs via Github App now (#664) Signed-off-by: Owais Kazi commit 19a6c84ad1b8048a571b7a1a1345e646f587508d Author: Tyler Ohlsen Date: Wed Sep 7 12:01:25 2022 -0700 Add 2.3 release notes (#660) * Add 2.3 release notes Signed-off-by: Tyler Ohlsen * Add other documentation PR Signed-off-by: Tyler Ohlsen Signed-off-by: Tyler Ohlsen commit 06d53fb28c12366ea29d88d2186d55c7295544c2 Author: Tyler Ohlsen Date: Wed Sep 7 12:01:12 2022 -0700 Bump to version 2.3 (#658) Signed-off-by: Tyler Ohlsen Signed-off-by: Tyler Ohlsen commit d9d956dc138d66981a94765ad8229a9eab6b8c35 Author: Chris Moore <107723039+cwillum@users.noreply.github.com> Date: Wed Sep 7 11:41:03 2022 -0700 “fix#921-README-forum-link-AD” (#659) Signed-off-by: cwillum Signed-off-by: cwillum commit 884573fc4d7343ddea6c7b8d638234a2805b87c2 Author: Amit Galitzky Date: Wed Sep 7 10:56:07 2022 +0300 Removed additional non-inclusive terms (#644) Signed-off-by: Amit Galitzky commit bd063bd0778400161ed1e75e3314ec7bb67e31af Author: Rishikesh Pasham <62345295+Rishikesh1159@users.noreply.github.com> Date: Fri Sep 2 20:12:25 2022 +0000 Adding external property customDistributionUrl to let developer override default distribution Download url (#380) * Adding uasage and external property customDistributionUrl to let developer override default distribution Download url Signed-off-by: Rishikesh1159 * Adding doc and removing system property from build.gradle Signed-off-by: Rishikesh1159 Signed-off-by: Rishikesh1159 commit c92cdc82fb2aef58b3c0b95fafa90da81bfc24cf Author: Kaituo Li Date: Tue Aug 9 09:36:08 2022 -0700 Fix PowerMock related tests due to version bump (#637) 2.2 added a new dependency of ClusterSettings like TaskResourceTrackingService. It is possible that the classloader that loadsTaskResourceTrackingService is different from the classloader that loads PowerMock and related dependencies. PowerMock reports java.lang.NoClassDefFoundError when initializing ClusterSettings. Since we are not actually using the value of ClusterSettings in the tests, we make it null to avoid initializing it. The change fixed failed tests. This PR also fixed spotless errors in FakeNode due to recent changes. Testing done: * gradle build Signed-off-by: Kaituo Li commit 103f03492681ce999fb87d13ed0218461b084c96 Author: Tyler Ohlsen Date: Mon Aug 8 17:14:30 2022 -0400 Fix taskmanager compilation error in FakeNode (#634) Signed-off-by: Tyler Ohlsen commit 01bbfc525b93068145f09e3e468dec23d1bbea26 Author: Amit Galitzky Date: Fri Aug 5 16:30:29 2022 -0700 2.2 release notes (#631) Signed-off-by: Amit Galitzky commit 12f9f2e337ee81c4882bc02fb68f631ea9ab1430 Author: Tyler Ohlsen Date: Thu Aug 4 20:25:45 2022 -0400 Bump version to 2.2 (#627) Signed-off-by: Tyler Ohlsen commit 7f846016c92800383ed848936ed82251108c8947 Author: Tyler Ohlsen Date: Thu Aug 4 19:46:25 2022 -0400 Update BWC zip links (#625) Signed-off-by: Tyler Ohlsen commit 08fdbdde4c2f97c27f63d3a4ba31f8acd6dbf570 Author: Kaituo Li Date: Wed Aug 3 16:40:17 2022 -0700 make 1M1min possible (#620) * make 1M1min possible This PR improves performance to make the 1M1min experiment possible. First, I changed coordinating node pagination from sync to async mode in AnomalyResultTransportAction so that the coordinating node does not have to wait for model nodes' responses before fetching the next page. Second, during the million-entity evaluation, CPU is mostly around 1% with hourly spikes up to 65%. An internal hourly maintenance job can account for the spike due to saving hundreds of thousands of model checkpoints, clearing unused models, and performing bookkeeping for internal states. This PR evens out the resource usage more fairly across a large maintenance window by introducing CheckpointMaintainWorker. Third, during a model corruption, I retrigger cold start for mitigation. Check ModelManager.score, EntityResultTransportAction, and CheckpointReadWorker. Testing done: 1. Added unit tests. 2. Manually confirmed 1M1min is possible after the above changes. Signed-off-by: Kaituo Li commit eb7bd07774658c7e0216e5436cfc613b15547d3d Author: Prudhvi Godithi Date: Mon Aug 1 15:35:09 2022 -0400 Staging for version increment automation (#608) Signed-off-by: pgodithi commit 9f6a5abb9652fb010decde8778c56c292eac90e2 Author: Amit Galitzky Date: Wed Jul 13 10:07:23 2022 -0700 fix zip fetching issue on version increment (#611) Signed-off-by: Amit Galitzky commit f630c8f97070e35a50fca8a7725767286c548a47 Author: Kaituo Li Date: Wed Jun 29 10:41:57 2022 -0700 Expose model accuracy metrics in tests (#600) * Expose model accuracy metrics in tests This PR adds an option flag to print logs during tests and turn on the flag in CI workflow. The flag is disabled by default. By doing this, we can record model accuracy metrics in git workflows and later retrieve it for analysis. Testing done: 1. We can turn on/off logs during tests. 2. The accuracy logs are recorded. Signed-off-by: Kaituo Li commit d484f9baa9aedf0a48215a82043107cd23c50c0b Author: Tyler Ohlsen Date: Tue Jun 28 16:00:56 2022 -0400 Add 2.1.0 release notes (#597) Signed-off-by: Tyler Ohlsen commit 6e373a7452f2d38795c5b73d77282a5239382915 Author: Amit Galitzky Date: Mon Jun 27 16:01:32 2022 -0700 adding custom plugin to upload ad zip to maven (#594) Signed-off-by: Amit Galitzky commit 0bd6e0e6aa933e6cd6ada8dfe88762b6e0db441a Author: Amit Galitzky Date: Mon Jun 27 13:59:36 2022 -0700 Update ingestion (#592) Signed-off-by: Amit Galitzky commit 4d7a8a452524e47b10fdba24f60c83f3103571ae Author: Amit Galitzky Date: Fri Jun 24 16:46:04 2022 -0700 Adding HCAD data ingestion script to AD (#585) Signed-off-by: Amit Galitzky commit c6f9b20334a4d280defe7f4bd680a69437358ba1 Author: Amit Galitzky Date: Fri Jun 24 13:06:29 2022 -0700 Cluster manager revert fix (#584) Signed-off-by: Amit Galitzky commit 0e7079e31ffab5439ff386fbd1a52e734a5d6500 Author: Amit Galitzky Date: Thu Jun 23 15:38:22 2022 -0700 2.1 version bump and Gradle bump (#582) Signed-off-by: Amit Galitzky commit 03e04d70556a2785782bbfd1603f3c19fbd8c895 Author: Kaituo Li Date: Wed Jun 22 11:55:00 2022 -0700 Disable interpolation in HCAD cold start (#575) * Disable interpolation in HCAD cold start Previously, we used interpolation in HCAD cold start for the purpose of efficiency. This caused problems for model accuracy. This PR removes interpolation in the cold start step. Testing done: 1. added unit tests to verify precision boosted. Signed-off-by: Kaituo Li commit 7f3820a9bca636b76f6f85601ad8439e1b55a0d2 Author: Tyler Ohlsen Date: Tue Jun 14 11:11:57 2022 -0700 Add 2.0.1 release notes (#572) Signed-off-by: Tyler Ohlsen commit 5f4f9cd9957e72f7844ad8dd66dd6ee2ad8615e0 Author: Amit Galitzky Date: Thu Jun 9 18:13:11 2022 +0000 bump rcf to 3.0-rc3 Signed-off-by: Amit Galitzky commit 17bf3f83e37735f9f9562ae51530123cfb7bb252 Author: Kaituo Li Date: Mon May 23 14:24:19 2022 -0700 Use current time as training data end time (#547) (#557) * Use current time as training data end time The bug happens because we use job enabled time as training data end time. But if the historical data before that time is deleted or does not exist at all, cold start might never finish. This PR uses current time as the training data end time so that cold start has a chance to succeed later. This PR also removes the code that combines cold start data and existing samples in EntityColdStartWorker because we don't add samples until cold start succeeds. Combining cold start data and existing samples is thus unnecessary. Testing done: 1. manually verified the bug is fixed. 2. fixed all related unit tests. Signed-off-by: Kaituo Li commit 1ada5d73d0e96a58cc8c461cf8b4d757b762f348 Author: aksingh-es Date: Mon May 16 16:13:31 2022 -0700 GA release notes (#550) Signed-off-by: aksingh-es commit dbd311a9ed6022b6d42db8ea432cc478d29a0947 Author: Amit Galitzky Date: Thu May 12 10:03:33 2022 -0700 remove rc1 qualifier and _type from test (#543) Signed-off-by: Amit Galitzky commit 42b7f50890ad0e60e93ef6aa5c5389621edcf7ef Author: Xun Zhang Date: Tue May 3 13:45:21 2022 -0700 Increase more coverage and reduce jacocoExclusions (#533) Signed-off-by: Xun Zhang commit 8227e32b692dc137112f6cc42b475a465aeec347 Author: Amit Galitzky Date: Tue May 3 10:31:16 2022 -0700 bump rcf to 3.0-rc2.1 (#519) Signed-off-by: Amit Galitzky commit b17d483610826fa283639b2218050c05cef3d257 Author: Xun Zhang Date: Wed Apr 27 14:57:21 2022 -0700 refactor SearchADResultTransportAction to be more testable (#517) Signed-off-by: Xun Zhang commit be319d1a7712b9d6634b6bba06dbff399cd44c98 Author: AMIT KUMAR SINGH Date: Thu Apr 21 10:57:45 2022 -0700 Fix OS version in notes (#512) Signed-off-by: aksingh-es commit a44ffec2b3cd6de3f92ec2c1f7994b1cbbf31485 Author: AMIT KUMAR SINGH <98787372+aksingh-es@users.noreply.github.com> Date: Wed Apr 20 17:28:15 2022 -0700 Re-enable Tests for CI workflows (#509) * Re enable tests for CI Signed-off-by: aksingh-es * reenable CI tests Signed-off-by: aksingh-es * fixing minor issue Signed-off-by: aksingh-es * fixing minor issue for CI Signed-off-by: aksingh-es commit d874960d7afe77bb48796ced2c5b214ca5303d8c Author: Tyler Ohlsen Date: Wed Apr 20 12:39:57 2022 -0700 Update labeler to default backport to 2.x (#507) Signed-off-by: Tyler Ohlsen Signed-off-by: Kaituo Li --- .github/labeler.yml | 2 +- .github/workflows/backport.yml | 4 +- .../workflows/test_build_multi_platform.yml | 6 +- build.gradle | 25 ++--- .../org/opensearch/ad/ml/CheckpointDao.java | 3 +- .../org/opensearch/ad/task/ADTaskManager.java | 26 +++--- .../ad/util/SafeSecurityInjector.java | 87 ------------------ .../org/opensearch/ad/ODFERestTestCase.java | 6 +- .../ad/bwc/ADBackwardsCompatibilityIT.java | 8 +- .../opensearch/ad/ml/CheckpointDaoTests.java | 59 ++++++------ .../ad/ml/EntityColdStarterTests.java | 2 +- .../ad/ml/ThresholdingResultTests.java | 3 - .../opensearch/ad/rest/SecureADRestIT.java | 3 +- .../org/opensearch/ad/stats/ADStatsTests.java | 2 - .../ad/task/ADTaskManagerTests.java | 25 +++-- ...nomalyDetectorJobTransportActionTests.java | 4 +- .../timeseries/AbstractTimeSeriesTest.java | 58 ++++++++++++ .../opensearch/timeseries/TestHelpers.java | 9 +- src/test/resources/security/sample.pem | 16 ++-- src/test/resources/security/test-kirk.jks | Bin 4504 -> 3766 bytes 20 files changed, 162 insertions(+), 186 deletions(-) delete mode 100644 src/main/java/org/opensearch/ad/util/SafeSecurityInjector.java diff --git a/.github/labeler.yml b/.github/labeler.yml index 9f6f50c54..53dc0443c 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,4 +1,4 @@ -backport 2.x: +backport 1.x: - "*" - "*/*" - "*/**/*" diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml index 5ed1dcdce..374d4d986 100644 --- a/.github/workflows/backport.yml +++ b/.github/workflows/backport.yml @@ -7,6 +7,7 @@ on: jobs: backport: + if: github.event.pull_request.merged == true runs-on: ubuntu-latest permissions: contents: write @@ -25,4 +26,5 @@ jobs: uses: VachaShah/backport@v2.2.0 with: github_token: ${{ steps.github_app_token.outputs.token }} - branch_name: backport/backport-${{ github.event.number }} + head_template: backport/backport-<%= number %>-to-<%= base %> + failure_labels: backport-failed diff --git a/.github/workflows/test_build_multi_platform.yml b/.github/workflows/test_build_multi_platform.yml index 7456e70a6..915ea6734 100644 --- a/.github/workflows/test_build_multi_platform.yml +++ b/.github/workflows/test_build_multi_platform.yml @@ -46,7 +46,7 @@ jobs: - name: Build and Run Tests run: | - ./gradlew build + ./gradlew build -x spotlessJava - name: Publish to Maven Local run: | ./gradlew publishToMavenLocal @@ -91,7 +91,7 @@ jobs: run: | chown -R 1000:1000 `pwd` su `id -un 1000` -c "./gradlew assemble && - ./gradlew build && + ./gradlew build -x spotlessJava && ./gradlew publishToMavenLocal && ./gradlew integTest -PnumNodes=3" - name: Upload Coverage Report @@ -127,7 +127,7 @@ jobs: ./gradlew assemble - name: Build and Run Tests run: | - ./gradlew build + ./gradlew build -x spotlessJava - name: Publish to Maven Local run: | ./gradlew publishToMavenLocal diff --git a/build.gradle b/build.gradle index 33ddf7e14..ad21b8b5f 100644 --- a/build.gradle +++ b/build.gradle @@ -35,7 +35,7 @@ buildscript { js_resource_folder = "src/test/resources/job-scheduler" common_utils_version = System.getProperty("common_utils.version", opensearch_build) job_scheduler_version = System.getProperty("job_scheduler.version", opensearch_build) - bwcVersionShort = "2.10.0" + bwcVersionShort = "1.3.2" bwcVersion = bwcVersionShort + ".0" bwcOpenSearchADDownload = 'https://ci.opensearch.org/ci/dbc/distribution-build-opensearch/' + bwcVersionShort + '/latest/linux/x64/tar/builds/' + 'opensearch/plugins/opensearch-anomaly-detection-' + bwcVersion + '.zip' @@ -125,10 +125,10 @@ dependencies { implementation group: 'com.yahoo.datasketches', name: 'sketches-core', version: '0.13.4' implementation group: 'com.yahoo.datasketches', name: 'memory', version: '0.12.2' implementation group: 'commons-lang', name: 'commons-lang', version: '2.6' - implementation group: 'org.apache.commons', name: 'commons-pool2', version: '2.11.1' - implementation 'software.amazon.randomcutforest:randomcutforest-serialization:3.8.0' - implementation 'software.amazon.randomcutforest:randomcutforest-parkservices:3.8.0' - implementation 'software.amazon.randomcutforest:randomcutforest-core:3.8.0' + implementation group: 'org.apache.commons', name: 'commons-pool2', version: '2.12.0' + implementation 'software.amazon.randomcutforest:randomcutforest-serialization:4.0.0' + implementation 'software.amazon.randomcutforest:randomcutforest-parkservices:4.0.0' + implementation 'software.amazon.randomcutforest:randomcutforest-core:4.0.0' // we inherit jackson-core from opensearch core implementation "com.fasterxml.jackson.core:jackson-databind:2.16.1" @@ -149,6 +149,9 @@ dependencies { exclude group: 'org.ow2.asm', module: 'asm-tree' } + // used for output encoding of config descriptions + implementation group: 'org.owasp.encoder' , name: 'encoder', version: '1.2.3' + testImplementation group: 'pl.pragmatists', name: 'JUnitParams', version: '1.1.1' testImplementation group: 'org.mockito', name: 'mockito-core', version: '5.9.0' testImplementation group: 'org.objenesis', name: 'objenesis', version: '3.3' @@ -538,7 +541,7 @@ List> plugins = [ // Creates 2 test clusters with 3 nodes of the old version. 2.times {i -> - task "${baseName}#oldVersionClusterTask$i"(type: StandaloneRestIntegTestTask) { + task "${baseName}#oldVersionClusterTask$i"(type: RestIntegTestTask) { useCluster testClusters."${baseName}$i" filter { includeTestsMatching "org.opensearch.ad.bwc.*IT" @@ -554,7 +557,7 @@ List> plugins = [ // Upgrades one node of the old cluster to new OpenSearch version with upgraded plugin version // This results in a mixed cluster with 2 nodes on the old version and 1 upgraded node. // This is also used as a one third upgraded cluster for a rolling upgrade. -task "${baseName}#mixedClusterTask"(type: StandaloneRestIntegTestTask) { +task "${baseName}#mixedClusterTask"(type: RestIntegTestTask) { useCluster testClusters."${baseName}0" dependsOn "${baseName}#oldVersionClusterTask0" doFirst { @@ -573,7 +576,7 @@ task "${baseName}#mixedClusterTask"(type: StandaloneRestIntegTestTask) { // Upgrades the second node to new OpenSearch version with upgraded plugin version after the first node is upgraded. // This results in a mixed cluster with 1 node on the old version and 2 upgraded nodes. // This is used for rolling upgrade. -task "${baseName}#twoThirdsUpgradedClusterTask"(type: StandaloneRestIntegTestTask) { +task "${baseName}#twoThirdsUpgradedClusterTask"(type: RestIntegTestTask) { dependsOn "${baseName}#mixedClusterTask" useCluster testClusters."${baseName}0" doFirst { @@ -592,7 +595,7 @@ task "${baseName}#twoThirdsUpgradedClusterTask"(type: StandaloneRestIntegTestTas // Upgrades the third node to new OpenSearch version with upgraded plugin version after the second node is upgraded. // This results in a fully upgraded cluster. // This is used for rolling upgrade. -task "${baseName}#rollingUpgradeClusterTask"(type: StandaloneRestIntegTestTask) { +task "${baseName}#rollingUpgradeClusterTask"(type: RestIntegTestTask) { dependsOn "${baseName}#twoThirdsUpgradedClusterTask" useCluster testClusters."${baseName}0" doFirst { @@ -611,7 +614,7 @@ task "${baseName}#rollingUpgradeClusterTask"(type: StandaloneRestIntegTestTask) // Upgrades all the nodes of the old cluster to new OpenSearch version with upgraded plugin version // at the same time resulting in a fully upgraded cluster. -task "${baseName}#fullRestartClusterTask"(type: StandaloneRestIntegTestTask) { +task "${baseName}#fullRestartClusterTask"(type: RestIntegTestTask) { dependsOn "${baseName}#oldVersionClusterTask1" useCluster testClusters."${baseName}1" doFirst { @@ -627,7 +630,7 @@ task "${baseName}#fullRestartClusterTask"(type: StandaloneRestIntegTestTask) { } // A bwc test suite which runs all the bwc tasks combined. -task bwcTestSuite(type: StandaloneRestIntegTestTask) { +task bwcTestSuite(type: RestIntegTestTask) { exclude '**/*Test*' exclude '**/*IT*' dependsOn tasks.named("${baseName}#mixedClusterTask") diff --git a/src/main/java/org/opensearch/ad/ml/CheckpointDao.java b/src/main/java/org/opensearch/ad/ml/CheckpointDao.java index adb097cb6..fd5fd50c5 100644 --- a/src/main/java/org/opensearch/ad/ml/CheckpointDao.java +++ b/src/main/java/org/opensearch/ad/ml/CheckpointDao.java @@ -744,7 +744,8 @@ private Optional convertToTRCF(Optional roles) { - if (roles == null) { - LOG.warn("Cannot inject empty roles in thread context"); - return; - } - if (rolesInjectorHelper == null) { - // lazy init - rolesInjectorHelper = new InjectSecurity(id, settings, tc); - } - rolesInjectorHelper.inject(user, roles); - } - - @Override - public void close() { - if (rolesInjectorHelper != null) { - rolesInjectorHelper.close(); - } - } -} diff --git a/src/test/java/org/opensearch/ad/ODFERestTestCase.java b/src/test/java/org/opensearch/ad/ODFERestTestCase.java index f57c64930..52be8a214 100644 --- a/src/test/java/org/opensearch/ad/ODFERestTestCase.java +++ b/src/test/java/org/opensearch/ad/ODFERestTestCase.java @@ -35,6 +35,7 @@ import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.message.BasicHeader; @@ -187,9 +188,8 @@ protected static void configureHttpsClient(RestClientBuilder builder, Settings s String password = Optional .ofNullable(System.getProperty("password")) .orElseThrow(() -> new RuntimeException("password is missing")); - BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider(); - final AuthScope anyScope = new AuthScope(null, -1); - credentialsProvider.setCredentials(anyScope, new UsernamePasswordCredentials(userName, password)); + CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password)); try { return httpClientBuilder .setDefaultCredentialsProvider(credentialsProvider) diff --git a/src/test/java/org/opensearch/ad/bwc/ADBackwardsCompatibilityIT.java b/src/test/java/org/opensearch/ad/bwc/ADBackwardsCompatibilityIT.java index c60118b88..89488f1da 100644 --- a/src/test/java/org/opensearch/ad/bwc/ADBackwardsCompatibilityIT.java +++ b/src/test/java/org/opensearch/ad/bwc/ADBackwardsCompatibilityIT.java @@ -8,6 +8,9 @@ package org.opensearch.ad.bwc; +import static org.opensearch.ad.rest.ADRestTestUtils.DetectorType.MULTI_CATEGORY_HC_DETECTOR; +import static org.opensearch.ad.rest.ADRestTestUtils.DetectorType.SINGLE_CATEGORY_HC_DETECTOR; +import static org.opensearch.ad.rest.ADRestTestUtils.DetectorType.SINGLE_ENTITY_DETECTOR; import static org.opensearch.ad.rest.ADRestTestUtils.countADResultOfDetector; import static org.opensearch.ad.rest.ADRestTestUtils.countDetectors; import static org.opensearch.ad.rest.ADRestTestUtils.createAnomalyDetector; @@ -21,9 +24,6 @@ import static org.opensearch.ad.rest.ADRestTestUtils.stopHistoricalAnalysis; import static org.opensearch.ad.rest.ADRestTestUtils.stopRealtimeJob; import static org.opensearch.ad.rest.ADRestTestUtils.waitUntilTaskDone; -import static org.opensearch.ad.rest.ADRestTestUtils.DetectorType.MULTI_CATEGORY_HC_DETECTOR; -import static org.opensearch.ad.rest.ADRestTestUtils.DetectorType.SINGLE_CATEGORY_HC_DETECTOR; -import static org.opensearch.ad.rest.ADRestTestUtils.DetectorType.SINGLE_ENTITY_DETECTOR; import static org.opensearch.timeseries.util.RestHandlerUtils.ANOMALY_DETECTOR_JOB; import static org.opensearch.timeseries.util.RestHandlerUtils.HISTORICAL_ANALYSIS_TASK; import static org.opensearch.timeseries.util.RestHandlerUtils.REALTIME_TASK; @@ -167,7 +167,7 @@ public void testBackwardsCompatibility() throws Exception { case MIXED: // TODO: We have no way to specify whether send request to old node or new node now. // Add more test later when it's possible to specify request node. - Assert.assertTrue(pluginNames.contains("opensearch-anomaly-detection")); + Assert.assertTrue(pluginNames.contains("opensearch-time-series-analytics")); Assert.assertTrue(pluginNames.contains("opensearch-job-scheduler")); // Create single entity detector and start realtime job diff --git a/src/test/java/org/opensearch/ad/ml/CheckpointDaoTests.java b/src/test/java/org/opensearch/ad/ml/CheckpointDaoTests.java index 72358af10..e0fa115a7 100644 --- a/src/test/java/org/opensearch/ad/ml/CheckpointDaoTests.java +++ b/src/test/java/org/opensearch/ad/ml/CheckpointDaoTests.java @@ -1067,27 +1067,22 @@ public void testDeserializeTRCFModel() throws Exception { coldStartData.add(sample4); coldStartData.add(sample5); - // This scores were generated with the sample data but on RCF3.0-rc1 and we are comparing them - // to the scores generated by the imported RCF3.0-rc2.1 + // This scores were generated with the sample data on RCF4.0. RCF4.0 changed implementation + // and we are seeing different rcf scores between 4.0 and 3.8. This is verified by switching + // rcf version between 3.8 and 4.0 while other code in AD unchanged. But we get different scores. List scores = new ArrayList<>(); - scores.add(4.814651669367903); - scores.add(5.566968073093689); - scores.add(5.919907610660049); - scores.add(5.770278090352401); - scores.add(5.319779117320102); - - List grade = new ArrayList<>(); - grade.add(1.0); - grade.add(0.0); - grade.add(0.0); - grade.add(0.0); - grade.add(0.0); + scores.add(5.052069275347555); + scores.add(6.117465704461799); + scores.add(6.6401649744661055); + scores.add(6.918514609476484); + scores.add(6.928318158276434); + // rcf 3.8 has a number of improvements on thresholder and predictor corrector. // We don't expect the results have the same anomaly grade. for (int i = 0; i < coldStartData.size(); i++) { forest.process(coldStartData.get(i), 0); AnomalyDescriptor descriptor = forest.process(coldStartData.get(i), 0); - assertEquals(descriptor.getRCFScore(), scores.get(i), 1e-9); + assertEquals(scores.get(i), descriptor.getRCFScore(), 1e-9); } } @@ -1133,21 +1128,22 @@ public void testDeserialize_rcf3_rc3_single_stream_model() throws Exception { coldStartData.add(sample4); coldStartData.add(sample5); - // This scores were generated with the sample data but on RCF3.0-rc1 and we are comparing them - // to the scores generated by the imported RCF3.0-rc2.1 + // This scores were generated with the sample data on RCF4.0. RCF4.0 changed implementation + // and we are seeing different rcf scores between 4.0 and 3.8. This is verified by switching + // rcf version between 3.8 and 4.0 while other code in AD unchanged. But we get different scores. List scores = new ArrayList<>(); - scores.add(3.3830441158587066); - scores.add(2.825961659490065); - scores.add(2.4685871670647384); - scores.add(2.3123460886413647); - scores.add(2.1401987653477135); + scores.add(3.678754481587072); + scores.add(3.6809634269790252); + scores.add(3.683659822587799); + scores.add(3.6852688612219646); + scores.add(3.6859330728661064); // rcf 3.8 has a number of improvements on thresholder and predictor corrector. // We don't expect the results have the same anomaly grade. for (int i = 0; i < coldStartData.size(); i++) { forest.process(coldStartData.get(i), 0); AnomalyDescriptor descriptor = forest.process(coldStartData.get(i), 0); - assertEquals(descriptor.getRCFScore(), scores.get(i), 1e-9); + assertEquals(scores.get(i), descriptor.getRCFScore(), 1e-9); } } @@ -1190,21 +1186,22 @@ public void testDeserialize_rcf3_rc3_hc_model() throws Exception { coldStartData.add(sample4); coldStartData.add(sample5); - // This scores were generated with the sample data but on RCF3.0-rc1 and we are comparing them - // to the scores generated by the imported RCF3.0-rc2.1 + // This scores were generated with the sample data but on RCF4.0 that changed implementation + // and we are seeing different rcf scores between 4.0 and 3.8. This is verified by switching + // rcf version between 3.8 and 4.0 while other code in AD unchanged. But we get different scores. List scores = new ArrayList<>(); - scores.add(1.86645896573027); - scores.add(1.8760247712797833); - scores.add(1.6809181763279901); - scores.add(1.7126716645678555); - scores.add(1.323776514074674); + scores.add(2.119532552959117); + scores.add(2.7347456872746325); + scores.add(3.066704948143919); + scores.add(3.2965580521876725); + scores.add(3.1888920146607047); // rcf 3.8 has a number of improvements on thresholder and predictor corrector. // We don't expect the results have the same anomaly grade. for (int i = 0; i < coldStartData.size(); i++) { forest.process(coldStartData.get(i), 0); AnomalyDescriptor descriptor = forest.process(coldStartData.get(i), 0); - assertEquals(descriptor.getRCFScore(), scores.get(i), 1e-9); + assertEquals(scores.get(i), descriptor.getRCFScore(), 1e-9); } } diff --git a/src/test/java/org/opensearch/ad/ml/EntityColdStarterTests.java b/src/test/java/org/opensearch/ad/ml/EntityColdStarterTests.java index 188146f69..aea14a245 100644 --- a/src/test/java/org/opensearch/ad/ml/EntityColdStarterTests.java +++ b/src/test/java/org/opensearch/ad/ml/EntityColdStarterTests.java @@ -740,7 +740,7 @@ public void testAccuracyOneMinuteIntervalNoInterpolation() throws Exception { clusterService ); - accuracyTemplate(1, 0.6f, 0.6f); + accuracyTemplate(1, 0.5f, 0.5f); } private ModelState createStateForCacheRelease() { diff --git a/src/test/java/org/opensearch/ad/ml/ThresholdingResultTests.java b/src/test/java/org/opensearch/ad/ml/ThresholdingResultTests.java index cd63f60d1..111041858 100644 --- a/src/test/java/org/opensearch/ad/ml/ThresholdingResultTests.java +++ b/src/test/java/org/opensearch/ad/ml/ThresholdingResultTests.java @@ -20,9 +20,6 @@ import junitparams.JUnitParamsRunner; import junitparams.Parameters; -import junitparams.JUnitParamsRunner; -import junitparams.Parameters; - @RunWith(JUnitParamsRunner.class) public class ThresholdingResultTests { diff --git a/src/test/java/org/opensearch/ad/rest/SecureADRestIT.java b/src/test/java/org/opensearch/ad/rest/SecureADRestIT.java index 9017ec898..5d73a89fc 100644 --- a/src/test/java/org/opensearch/ad/rest/SecureADRestIT.java +++ b/src/test/java/org/opensearch/ad/rest/SecureADRestIT.java @@ -84,8 +84,9 @@ public static String generatePassword(String username) { @Before public void setupSecureTests() throws IOException { - if (!isHttps()) + if (!isHttps()) { throw new IllegalArgumentException("Secure Tests are running but HTTPS is not set"); + } createIndexRole(indexAllAccessRole, "*"); createSearchRole(indexSearchAccessRole, "*"); String alicePassword = generatePassword(aliceUser); diff --git a/src/test/java/org/opensearch/ad/stats/ADStatsTests.java b/src/test/java/org/opensearch/ad/stats/ADStatsTests.java index 02be33aab..6db1ac5cc 100644 --- a/src/test/java/org/opensearch/ad/stats/ADStatsTests.java +++ b/src/test/java/org/opensearch/ad/stats/ADStatsTests.java @@ -48,8 +48,6 @@ import com.amazon.randomcutforest.RandomCutForest; -import com.amazon.randomcutforest.RandomCutForest; - import test.org.opensearch.ad.util.MLUtil; import test.org.opensearch.ad.util.RandomModelStateConfig; diff --git a/src/test/java/org/opensearch/ad/task/ADTaskManagerTests.java b/src/test/java/org/opensearch/ad/task/ADTaskManagerTests.java index f9df58903..c8cebcb1f 100644 --- a/src/test/java/org/opensearch/ad/task/ADTaskManagerTests.java +++ b/src/test/java/org/opensearch/ad/task/ADTaskManagerTests.java @@ -79,7 +79,6 @@ import org.opensearch.action.search.SearchResponse; import org.opensearch.action.search.ShardSearchFailure; import org.opensearch.action.update.UpdateResponse; -import org.opensearch.ad.ADUnitTestCase; import org.opensearch.ad.cluster.HashRing; import org.opensearch.ad.indices.ADIndexManagement; import org.opensearch.ad.mock.model.MockSimpleLog; @@ -89,6 +88,7 @@ import org.opensearch.ad.model.ADTaskType; import org.opensearch.ad.model.AnomalyDetector; import org.opensearch.ad.rest.handler.IndexAnomalyDetectorJobActionHandler; +import org.opensearch.ad.settings.AnomalyDetectorSettings; import org.opensearch.ad.stats.InternalStatNames; import org.opensearch.ad.transport.ADStatsNodeResponse; import org.opensearch.ad.transport.ADStatsNodesResponse; @@ -120,6 +120,7 @@ import org.opensearch.search.aggregations.InternalAggregations; import org.opensearch.search.internal.InternalSearchResponse; import org.opensearch.threadpool.ThreadPool; +import org.opensearch.timeseries.AbstractTimeSeriesTest; import org.opensearch.timeseries.TestHelpers; import org.opensearch.timeseries.common.exception.DuplicateTaskException; import org.opensearch.timeseries.constant.CommonName; @@ -139,7 +140,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -public class ADTaskManagerTests extends ADUnitTestCase { +public class ADTaskManagerTests extends AbstractTimeSeriesTest { private Settings settings; private Client client; @@ -1447,10 +1448,22 @@ public void testForwardRequestToLeadNodeWithNotExistingNode() throws IOException @SuppressWarnings("unchecked") public void testScaleTaskLaneOnCoordinatingNode() { ADTask adTask = mock(ADTask.class); - when(adTask.getCoordinatingNode()).thenReturn(node1.getId()); - when(nodeFilter.getEligibleDataNodes()).thenReturn(new DiscoveryNode[] { node1, node2 }); - ActionListener listener = mock(ActionListener.class); - adTaskManager.scaleTaskLaneOnCoordinatingNode(adTask, 2, transportService, listener); + try { + // bring up real transport service as mockito cannot mock final method + // and transportService.sendRequest is called. A lot of null pointer + // exception will be thrown if we use mocked transport service. + setUpThreadPool(ADTaskManagerTests.class.getSimpleName()); + setupTestNodes(AnomalyDetectorSettings.AD_MAX_ENTITIES_PER_QUERY, AnomalyDetectorSettings.AD_PAGE_SIZE); + when(adTask.getCoordinatingNode()).thenReturn(testNodes[1].getNodeId()); + when(nodeFilter.getEligibleDataNodes()) + .thenReturn(new DiscoveryNode[] { testNodes[0].discoveryNode(), testNodes[1].discoveryNode() }); + ActionListener listener = mock(ActionListener.class); + + adTaskManager.scaleTaskLaneOnCoordinatingNode(adTask, 2, testNodes[1].transportService, listener); + } finally { + tearDownTestNodes(); + tearDownThreadPool(); + } } @SuppressWarnings("unchecked") diff --git a/src/test/java/org/opensearch/ad/transport/AnomalyDetectorJobTransportActionTests.java b/src/test/java/org/opensearch/ad/transport/AnomalyDetectorJobTransportActionTests.java index 6f7629039..75d76841b 100644 --- a/src/test/java/org/opensearch/ad/transport/AnomalyDetectorJobTransportActionTests.java +++ b/src/test/java/org/opensearch/ad/transport/AnomalyDetectorJobTransportActionTests.java @@ -171,11 +171,11 @@ public void testStartHistoricalAnalysisForSingleCategoryHCWithUser() throws IOEx waitUntil(() -> { try { ADTask task = getADTask(response.getId()); - return !TestHelpers.HISTORICAL_ANALYSIS_RUNNING_STATS.contains(task.getState()); + return HISTORICAL_ANALYSIS_FINISHED_FAILED_STATS.contains(task.getState()); } catch (IOException e) { return false; } - }, 20, TimeUnit.SECONDS); + }, 60, TimeUnit.SECONDS); ADTask adTask = getADTask(response.getId()); assertEquals(ADTaskType.HISTORICAL_HC_DETECTOR.toString(), adTask.getTaskType()); assertTrue(HISTORICAL_ANALYSIS_FINISHED_FAILED_STATS.contains(adTask.getState())); diff --git a/src/test/java/org/opensearch/timeseries/AbstractTimeSeriesTest.java b/src/test/java/org/opensearch/timeseries/AbstractTimeSeriesTest.java index d625971bf..dcc80b282 100644 --- a/src/test/java/org/opensearch/timeseries/AbstractTimeSeriesTest.java +++ b/src/test/java/org/opensearch/timeseries/AbstractTimeSeriesTest.java @@ -16,7 +16,10 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.opensearch.cluster.node.DiscoveryNodeRole.BUILT_IN_ROLES; +import java.net.InetAddress; +import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -30,6 +33,8 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.logging.log4j.Level; @@ -40,6 +45,9 @@ import org.apache.logging.log4j.core.config.Property; import org.apache.logging.log4j.core.layout.PatternLayout; import org.apache.logging.log4j.util.StackLocatorUtil; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.MockitoAnnotations; import org.opensearch.Version; import org.opensearch.action.support.PlainActionFuture; import org.opensearch.ad.model.AnomalyDetector; @@ -47,11 +55,14 @@ import org.opensearch.ad.model.DetectorInternalState; import org.opensearch.cluster.metadata.AliasMetadata; import org.opensearch.cluster.metadata.IndexMetadata; +import org.opensearch.cluster.node.DiscoveryNode; import org.opensearch.common.logging.Loggers; +import org.opensearch.common.settings.ClusterSettings; import org.opensearch.common.settings.Setting; import org.opensearch.common.settings.Settings; import org.opensearch.core.action.ActionResponse; import org.opensearch.core.common.bytes.BytesReference; +import org.opensearch.core.common.transport.TransportAddress; import org.opensearch.core.rest.RestStatus; import org.opensearch.core.xcontent.NamedXContentRegistry; import org.opensearch.http.HttpRequest; @@ -67,10 +78,22 @@ import org.opensearch.transport.TransportInterceptor; import org.opensearch.transport.TransportService; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Sets; + import test.org.opensearch.ad.util.FakeNode; public class AbstractTimeSeriesTest extends OpenSearchTestCase { + @Captor + protected ArgumentCaptor exceptionCaptor; + + @Override + public void setUp() throws Exception { + super.setUp(); + MockitoAnnotations.initMocks(this); + } + protected static final Logger LOG = (Logger) LogManager.getLogger(AbstractTimeSeriesTest.class); // transport test node @@ -452,4 +475,39 @@ protected void setUpADThreadPool(ThreadPool mockThreadPool) { return null; }).when(executorService).execute(any(Runnable.class)); } + + /** + * Create cluster setting. + * + * @param settings cluster settings + * @param setting add setting if the code to be tested contains setting update consumer + * @return instance of ClusterSettings + */ + public ClusterSettings clusterSetting(Settings settings, Setting... setting) { + final Set> settingsSet = Stream + .concat(ClusterSettings.BUILT_IN_CLUSTER_SETTINGS.stream(), Sets.newHashSet(setting).stream()) + .collect(Collectors.toSet()); + ClusterSettings clusterSettings = new ClusterSettings(settings, settingsSet); + return clusterSettings; + } + + protected DiscoveryNode createNode(String nodeId) { + return new DiscoveryNode( + nodeId, + new TransportAddress(TransportAddress.META_ADDRESS, 9300), + ImmutableMap.of(), + BUILT_IN_ROLES, + Version.CURRENT + ); + } + + protected DiscoveryNode createNode(String nodeId, String ip, int port, Map attributes) throws UnknownHostException { + return new DiscoveryNode( + nodeId, + new TransportAddress(InetAddress.getByName(ip), port), + attributes, + BUILT_IN_ROLES, + Version.CURRENT + ); + } } diff --git a/src/test/java/org/opensearch/timeseries/TestHelpers.java b/src/test/java/org/opensearch/timeseries/TestHelpers.java index 65b6898e0..b3ba38389 100644 --- a/src/test/java/org/opensearch/timeseries/TestHelpers.java +++ b/src/test/java/org/opensearch/timeseries/TestHelpers.java @@ -18,14 +18,7 @@ import static org.opensearch.core.xcontent.XContentParserUtils.ensureExpectedToken; import static org.opensearch.index.query.AbstractQueryBuilder.parseInnerQueryBuilder; import static org.opensearch.index.seqno.SequenceNumbers.UNASSIGNED_SEQ_NO; -import static org.opensearch.test.OpenSearchTestCase.buildNewFakeTransportAddress; -import static org.opensearch.test.OpenSearchTestCase.randomAlphaOfLength; -import static org.opensearch.test.OpenSearchTestCase.randomBoolean; -import static org.opensearch.test.OpenSearchTestCase.randomDouble; -import static org.opensearch.test.OpenSearchTestCase.randomDoubleBetween; -import static org.opensearch.test.OpenSearchTestCase.randomInt; -import static org.opensearch.test.OpenSearchTestCase.randomIntBetween; -import static org.opensearch.test.OpenSearchTestCase.randomLong; +import static org.opensearch.test.OpenSearchTestCase.*; import java.io.IOException; import java.nio.ByteBuffer; diff --git a/src/test/resources/security/sample.pem b/src/test/resources/security/sample.pem index a1fc20a77..b690a603d 100644 --- a/src/test/resources/security/sample.pem +++ b/src/test/resources/security/sample.pem @@ -1,9 +1,9 @@ -----BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIUZjrlDPP8azRDPZchA/XEsx0X2iIwDQYJKoZIhvcNAQEL +MIIEPDCCAySgAwIBAgIUaYSlET3nzsotWTrWueVPPh10yLYwDQYJKoZIhvcNAQEL BQAwgY8xEzARBgoJkiaJk/IsZAEZFgNjb20xFzAVBgoJkiaJk/IsZAEZFgdleGFt cGxlMRkwFwYDVQQKDBBFeGFtcGxlIENvbSBJbmMuMSEwHwYDVQQLDBhFeGFtcGxl IENvbSBJbmMuIFJvb3QgQ0ExITAfBgNVBAMMGEV4YW1wbGUgQ29tIEluYy4gUm9v -dCBDQTAeFw0yMzA4MjkwNDIzMTJaFw0zMzA4MjYwNDIzMTJaMFcxCzAJBgNVBAYT +dCBDQTAeFw0yNDAyMjAxNzAzMjVaFw0zNDAyMTcxNzAzMjVaMFcxCzAJBgNVBAYT AmRlMQ0wCwYDVQQHDAR0ZXN0MQ0wCwYDVQQKDARub2RlMQ0wCwYDVQQLDARub2Rl MRswGQYDVQQDDBJub2RlLTAuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQCm93kXteDQHMAvbUPNPW5pyRHKDD42XGWSgq0k1D29C/Ud @@ -16,10 +16,10 @@ BEAwPogFKgMEBQWCEm5vZGUtMC5leGFtcGxlLmNvbYIJbG9jYWxob3N0hxAAAAAA AAAAAAAAAAAAAAABhwR/AAABMAsGA1UdDwQEAwIF4DAdBgNVHSUEFjAUBggrBgEF BQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU0/qDQaY10jIo wCjLUpz/HfQXyt8wHwYDVR0jBBgwFoAUF4ffoFrrZhKn1dD4uhJFPLcrAJwwDQYJ -KoZIhvcNAQELBQADggEBAD2hkndVih6TWxoe/oOW0i2Bq7ScNO/n7/yHWL04HJmR -MaHv/Xjc8zLFLgHuHaRvC02ikWIJyQf5xJt0Oqu2GVbqXH9PBGKuEP2kCsRRyU27 -zTclAzfQhqmKBTYQ/3lJ3GhRQvXIdYTe+t4aq78TCawp1nSN+vdH/1geG6QjMn5N -1FU8tovDd4x8Ib/0dv8RJx+n9gytI8n/giIaDCEbfLLpe4EkV5e5UNpOnRgJjjuy -vtZutc81TQnzBtkS9XuulovDE0qI+jQrKkKu8xgGLhgH0zxnPkKtUg2I3Aq6zl1L -zYkEOUF8Y25J6WeY88Yfnc0iigI+Pnz5NK8R9GL7TYo= +KoZIhvcNAQELBQADggEBAGbij5WyF0dKhQodQfTiFDb73ygU6IyeJkFSnxF67gDz +pQJZKFvXuVBa3cGP5e7Qp3TK50N+blXGH0xXeIV9lXeYUk4hVfBlp9LclZGX8tGi +7Xa2enMvIt5q/Yg3Hh755ZxnDYxCoGkNOXUmnMusKstE0YzvZ5Gv6fcRKFBUgZLh +hUBqIEAYly1EqH/y45APiRt3Nor1yF6zEI4TnL0yNrHw6LyQkUNCHIGMJLfnJQ9L +camMGIXOx60kXNMTigF9oXXwixWAnDM9y3QT8QXA7hej/4zkbO+vIeV/7lGUdkyg +PAi92EvyxmsliEMyMR0VINl8emyobvfwa7oMeWMR+hg= -----END CERTIFICATE----- diff --git a/src/test/resources/security/test-kirk.jks b/src/test/resources/security/test-kirk.jks index 6dbc51e714784fa58a4209c75deab8b9ed1698ff..6c8c5ef77e20980f8c78295b159256b805da6a28 100644 GIT binary patch literal 3766 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 ROz*Khv5A{`^It3We*oUlR=)rM