diff --git a/alerting/build.gradle b/alerting/build.gradle index 07f96a7f3..bb44c8e62 100644 --- a/alerting/build.gradle +++ b/alerting/build.gradle @@ -172,6 +172,8 @@ dependencies { implementation "com.github.seancfoley:ipaddress:5.4.1" implementation project(path: ":alerting-spi", configuration: 'shadow') + implementation "org.opensearch:opensearch-remote-metadata-sdk:${opensearch_build}" + testImplementation "org.antlr:antlr4-runtime:${versions.antlr4}" testImplementation "org.jetbrains.kotlin:kotlin-test:${kotlin_version}" testImplementation "org.mockito:mockito-core:${versions.mockito}" diff --git a/alerting/src/main/kotlin/org/opensearch/alerting/AlertingPlugin.kt b/alerting/src/main/kotlin/org/opensearch/alerting/AlertingPlugin.kt index a2a01e645..169e718e5 100644 --- a/alerting/src/main/kotlin/org/opensearch/alerting/AlertingPlugin.kt +++ b/alerting/src/main/kotlin/org/opensearch/alerting/AlertingPlugin.kt @@ -55,6 +55,11 @@ import org.opensearch.alerting.script.TriggerScript import org.opensearch.alerting.service.DeleteMonitorService import org.opensearch.alerting.settings.AlertingSettings import org.opensearch.alerting.settings.AlertingSettings.Companion.DOC_LEVEL_MONITOR_SHARD_FETCH_SIZE +import org.opensearch.alerting.settings.AlertingSettings.Companion.MULTI_TENANCY_ENABLED +import org.opensearch.alerting.settings.AlertingSettings.Companion.REMOTE_METADATA_ENDPOINT +import org.opensearch.alerting.settings.AlertingSettings.Companion.REMOTE_METADATA_REGION +import org.opensearch.alerting.settings.AlertingSettings.Companion.REMOTE_METADATA_SERVICE_NAME +import org.opensearch.alerting.settings.AlertingSettings.Companion.REMOTE_METADATA_STORE_TYPE import org.opensearch.alerting.settings.DestinationSettings import org.opensearch.alerting.settings.LegacyOpenDistroAlertingSettings import org.opensearch.alerting.settings.LegacyOpenDistroDestinationSettings @@ -129,6 +134,13 @@ import org.opensearch.plugins.ReloadablePlugin import org.opensearch.plugins.ScriptPlugin import org.opensearch.plugins.SearchPlugin import org.opensearch.plugins.SystemIndexPlugin +import org.opensearch.remote.metadata.client.SdkClient +import org.opensearch.remote.metadata.client.impl.SdkClientFactory +import org.opensearch.remote.metadata.common.CommonValue.REMOTE_METADATA_ENDPOINT_KEY +import org.opensearch.remote.metadata.common.CommonValue.REMOTE_METADATA_REGION_KEY +import org.opensearch.remote.metadata.common.CommonValue.REMOTE_METADATA_SERVICE_NAME_KEY +import org.opensearch.remote.metadata.common.CommonValue.REMOTE_METADATA_TYPE_KEY +import org.opensearch.remote.metadata.common.CommonValue.TENANT_AWARE_KEY import org.opensearch.repositories.RepositoriesService import org.opensearch.rest.RestController import org.opensearch.rest.RestHandler @@ -325,6 +337,19 @@ internal class AlertingPlugin : PainlessExtension, ActionPlugin, ScriptPlugin, R this.threadPool = threadPool this.clusterService = clusterService + val sdkClient: SdkClient = SdkClientFactory.createSdkClient( + client, + xContentRegistry, + mapOf( + REMOTE_METADATA_TYPE_KEY to REMOTE_METADATA_STORE_TYPE.get(settings), + REMOTE_METADATA_ENDPOINT_KEY to REMOTE_METADATA_ENDPOINT.get(settings), + REMOTE_METADATA_REGION_KEY to REMOTE_METADATA_REGION.get(settings), + REMOTE_METADATA_SERVICE_NAME_KEY to REMOTE_METADATA_SERVICE_NAME.get(settings), + TENANT_AWARE_KEY to MULTI_TENANCY_ENABLED.get(settings).toString() + ), + client.threadPool().executor(ThreadPool.Names.GENERIC) + ) + MonitorMetadataService.initialize( client, clusterService, @@ -351,7 +376,8 @@ internal class AlertingPlugin : PainlessExtension, ActionPlugin, ScriptPlugin, R destinationMigrationCoordinator, lockService, alertService, - triggerService + triggerService, + sdkClient ) } @@ -433,7 +459,12 @@ internal class AlertingPlugin : PainlessExtension, ActionPlugin, ScriptPlugin, R AlertingSettings.COMMENTS_MAX_CONTENT_SIZE, AlertingSettings.MAX_COMMENTS_PER_ALERT, AlertingSettings.MAX_COMMENTS_PER_NOTIFICATION, - AlertingSettings.NOTIFICATION_CONTEXT_RESULTS_ALLOWED_ROLES + AlertingSettings.NOTIFICATION_CONTEXT_RESULTS_ALLOWED_ROLES, + AlertingSettings.MULTI_TENANCY_ENABLED, + AlertingSettings.REMOTE_METADATA_STORE_TYPE, + AlertingSettings.REMOTE_METADATA_ENDPOINT, + AlertingSettings.REMOTE_METADATA_REGION, + AlertingSettings.REMOTE_METADATA_SERVICE_NAME ) } diff --git a/alerting/src/main/kotlin/org/opensearch/alerting/settings/AlertingSettings.kt b/alerting/src/main/kotlin/org/opensearch/alerting/settings/AlertingSettings.kt index 2659ae74c..edaa0d904 100644 --- a/alerting/src/main/kotlin/org/opensearch/alerting/settings/AlertingSettings.kt +++ b/alerting/src/main/kotlin/org/opensearch/alerting/settings/AlertingSettings.kt @@ -8,6 +8,10 @@ package org.opensearch.alerting.settings import org.opensearch.alerting.AlertingPlugin import org.opensearch.common.settings.Setting import org.opensearch.common.unit.TimeValue +import org.opensearch.remote.metadata.common.CommonValue.REMOTE_METADATA_ENDPOINT_KEY +import org.opensearch.remote.metadata.common.CommonValue.REMOTE_METADATA_REGION_KEY +import org.opensearch.remote.metadata.common.CommonValue.REMOTE_METADATA_SERVICE_NAME_KEY +import org.opensearch.remote.metadata.common.CommonValue.REMOTE_METADATA_TYPE_KEY import java.util.concurrent.TimeUnit import java.util.function.Function @@ -19,6 +23,7 @@ class AlertingSettings { companion object { const val DEFAULT_MAX_ACTIONABLE_ALERT_COUNT = 50L const val DEFAULT_FINDINGS_INDEXING_BATCH_SIZE = 1000 + private const val REMOTE_METADATA_KEY_PREFIX = "plugins.alerting" const val DEFAULT_PERCOLATE_QUERY_NUM_DOCS_IN_MEMORY = 50000 const val DEFAULT_PERCOLATE_QUERY_DOCS_SIZE_MEMORY_PERCENTAGE_LIMIT = 10 const val DEFAULT_DOC_LEVEL_MONITOR_SHARD_FETCH_SIZE = 10000 @@ -311,5 +316,36 @@ class AlertingSettings { Setting.Property.NodeScope, Setting.Property.Dynamic ) + + val MULTI_TENANCY_ENABLED: Setting = Setting.boolSetting( + "$REMOTE_METADATA_KEY_PREFIX.multi_tenancy_enabled", + false, + Setting.Property.NodeScope, + Setting.Property.Final + ) + + val REMOTE_METADATA_STORE_TYPE: Setting = Setting.simpleString( + "$REMOTE_METADATA_KEY_PREFIX.$REMOTE_METADATA_TYPE_KEY", + Setting.Property.NodeScope, + Setting.Property.Final + ) + + val REMOTE_METADATA_ENDPOINT: Setting = Setting.simpleString( + "$REMOTE_METADATA_KEY_PREFIX.$REMOTE_METADATA_ENDPOINT_KEY", + Setting.Property.NodeScope, + Setting.Property.Final + ) + + val REMOTE_METADATA_REGION: Setting = Setting.simpleString( + "$REMOTE_METADATA_KEY_PREFIX.$REMOTE_METADATA_REGION_KEY", + Setting.Property.NodeScope, + Setting.Property.Final + ) + + val REMOTE_METADATA_SERVICE_NAME: Setting = Setting.simpleString( + "$REMOTE_METADATA_KEY_PREFIX.$REMOTE_METADATA_SERVICE_NAME_KEY", + Setting.Property.NodeScope, + Setting.Property.Final + ) } } diff --git a/alerting/src/test/kotlin/org/opensearch/alerting/settings/AlertingSettingsTests.kt b/alerting/src/test/kotlin/org/opensearch/alerting/settings/AlertingSettingsTests.kt index 6ee8c4997..20b7ee566 100644 --- a/alerting/src/test/kotlin/org/opensearch/alerting/settings/AlertingSettingsTests.kt +++ b/alerting/src/test/kotlin/org/opensearch/alerting/settings/AlertingSettingsTests.kt @@ -85,7 +85,12 @@ class AlertingSettingsTests : OpenSearchTestCase() { ScheduledJobSettings.SWEEP_BACKOFF_RETRY_COUNT, ScheduledJobSettings.SWEEP_BACKOFF_MILLIS, ScheduledJobSettings.SWEEPER_ENABLED, - ScheduledJobSettings.REQUEST_TIMEOUT + ScheduledJobSettings.REQUEST_TIMEOUT, + AlertingSettings.MULTI_TENANCY_ENABLED, + AlertingSettings.REMOTE_METADATA_STORE_TYPE, + AlertingSettings.REMOTE_METADATA_ENDPOINT, + AlertingSettings.REMOTE_METADATA_REGION, + AlertingSettings.REMOTE_METADATA_SERVICE_NAME ) ) ) @@ -186,4 +191,19 @@ class AlertingSettingsTests : OpenSearchTestCase() { ) ) } + + fun `test remote metadata settings defaults`() { + assertEquals(false, AlertingSettings.MULTI_TENANCY_ENABLED.getDefault(Settings.EMPTY)) + assertEquals("", AlertingSettings.REMOTE_METADATA_STORE_TYPE.getDefault(Settings.EMPTY)) + assertEquals("", AlertingSettings.REMOTE_METADATA_ENDPOINT.getDefault(Settings.EMPTY)) + assertEquals("", AlertingSettings.REMOTE_METADATA_REGION.getDefault(Settings.EMPTY)) + assertEquals("", AlertingSettings.REMOTE_METADATA_SERVICE_NAME.getDefault(Settings.EMPTY)) + } + + fun `test multi_tenancy_enabled setting reads from config`() { + val settings = Settings.builder() + .put("plugins.alerting.multi_tenancy_enabled", true) + .build() + assertEquals(true, AlertingSettings.MULTI_TENANCY_ENABLED.get(settings)) + } }