From cb33f274fce483c14ce23fb2991b765364005666 Mon Sep 17 00:00:00 2001
From: harshsoni2024 <64592571+harshsoni2024@users.noreply.github.com>
Date: Thu, 28 Nov 2024 18:50:42 +0530
Subject: [PATCH] Connector: rename microstrategy connector (#18604)
---
.../native/1.6.0/mysql/schemaChanges.sql | 24 ++++
.../native/1.6.0/postgres/schemaChanges.sql | 24 ++++
.../{mstr.yaml => microstrategy.yaml} | 5 +-
.../{mstr => microstrategy}/__init__.py | 0
.../{mstr => microstrategy}/client.py | 21 ++-
.../{mstr => microstrategy}/connection.py | 17 +--
.../{mstr => microstrategy}/metadata.py | 32 +++--
.../{mstr => microstrategy}/models.py | 2 +-
.../dashboard/microstrategy/service_spec.py | 6 +
.../source/dashboard/mstr/service_spec.py | 4 -
.../topology/dashboard/test_microstrategy.py | 127 ++++++++++++++++++
.../dashboard/microstrategy/index.md | 22 ++-
.../dashboard/microstrategy/yaml.md | 26 ++--
.../dashboard/microstrategy/index.md | 23 +++-
.../dashboard/microstrategy/yaml.md | 26 ++--
.../{mstr.json => microstrategy.json} | 4 +-
.../dashboard/microStrategyConnection.json | 59 ++++++++
.../connections/dashboard/mstrConnection.json | 53 --------
.../entity/services/dashboardService.json | 6 +-
.../locales/en-US/Dashboard/MicroStrategy.md | 32 +++++
.../ui/public/locales/en-US/Dashboard/Mstr.md | 25 ----
.../assets/img/service-icon-microstrategy.svg | 11 ++
.../ui/src/assets/img/service-icon-mstr.png | Bin 23441 -> 0 bytes
.../ui/src/constants/Services.constant.ts | 4 +-
.../ui/src/locale/languages/mr-in.json | 1 -
.../ui/src/utils/DashboardServiceUtils.ts | 6 +-
.../ui/src/utils/ServiceUtilClassBase.ts | 6 +
27 files changed, 409 insertions(+), 157 deletions(-)
rename ingestion/src/metadata/examples/workflows/{mstr.yaml => microstrategy.yaml} (94%)
rename ingestion/src/metadata/ingestion/source/dashboard/{mstr => microstrategy}/__init__.py (100%)
rename ingestion/src/metadata/ingestion/source/dashboard/{mstr => microstrategy}/client.py (93%)
rename ingestion/src/metadata/ingestion/source/dashboard/{mstr => microstrategy}/connection.py (79%)
rename ingestion/src/metadata/ingestion/source/dashboard/{mstr => microstrategy}/metadata.py (90%)
rename ingestion/src/metadata/ingestion/source/dashboard/{mstr => microstrategy}/models.py (99%)
create mode 100644 ingestion/src/metadata/ingestion/source/dashboard/microstrategy/service_spec.py
delete mode 100644 ingestion/src/metadata/ingestion/source/dashboard/mstr/service_spec.py
create mode 100644 ingestion/tests/unit/topology/dashboard/test_microstrategy.py
rename openmetadata-service/src/main/resources/json/data/testConnections/dashboard/{mstr.json => microstrategy.json} (85%)
create mode 100644 openmetadata-spec/src/main/resources/json/schema/entity/services/connections/dashboard/microStrategyConnection.json
delete mode 100644 openmetadata-spec/src/main/resources/json/schema/entity/services/connections/dashboard/mstrConnection.json
create mode 100644 openmetadata-ui/src/main/resources/ui/public/locales/en-US/Dashboard/MicroStrategy.md
delete mode 100644 openmetadata-ui/src/main/resources/ui/public/locales/en-US/Dashboard/Mstr.md
create mode 100644 openmetadata-ui/src/main/resources/ui/src/assets/img/service-icon-microstrategy.svg
delete mode 100644 openmetadata-ui/src/main/resources/ui/src/assets/img/service-icon-mstr.png
diff --git a/bootstrap/sql/migrations/native/1.6.0/mysql/schemaChanges.sql b/bootstrap/sql/migrations/native/1.6.0/mysql/schemaChanges.sql
index 9203128c0b2..aaa61aa8d72 100644
--- a/bootstrap/sql/migrations/native/1.6.0/mysql/schemaChanges.sql
+++ b/bootstrap/sql/migrations/native/1.6.0/mysql/schemaChanges.sql
@@ -1773,3 +1773,27 @@ SET json = JSON_SET(
)
)
WHERE serviceType = 'DBTCloud';
+
+-- Update serviceType in dashboard_entity table
+UPDATE dashboard_entity
+SET json = JSON_SET(json, '$.serviceType', 'MicroStrategy')
+WHERE JSON_UNQUOTE(JSON_EXTRACT(json, '$.serviceType')) = 'Mstr';
+
+-- Update serviceType in dashboard_service_entity table
+UPDATE dashboard_service_entity
+SET json = JSON_SET(json, '$.serviceType', 'MicroStrategy')
+WHERE JSON_UNQUOTE(JSON_EXTRACT(json, '$.serviceType')) = 'Mstr';
+
+UPDATE dashboard_service_entity
+SET json = JSON_SET(json, '$.connection.config.type', 'MicroStrategy')
+WHERE JSON_UNQUOTE(JSON_EXTRACT(json, '$.connection.config.type')) = 'Mstr';
+
+-- Update serviceType in dashboard_data_model_entity table
+UPDATE dashboard_data_model_entity
+SET json = JSON_SET(json, '$.serviceType', 'MicroStrategy')
+WHERE JSON_UNQUOTE(JSON_EXTRACT(json, '$.serviceType')) = 'Mstr';
+
+-- Update serviceType in chart_entity table
+UPDATE chart_entity
+SET json = JSON_SET(json, '$.serviceType', 'MicroStrategy')
+WHERE JSON_UNQUOTE(JSON_EXTRACT(json, '$.serviceType')) = 'Mstr';
\ No newline at end of file
diff --git a/bootstrap/sql/migrations/native/1.6.0/postgres/schemaChanges.sql b/bootstrap/sql/migrations/native/1.6.0/postgres/schemaChanges.sql
index 38fb01676a2..461d746d550 100644
--- a/bootstrap/sql/migrations/native/1.6.0/postgres/schemaChanges.sql
+++ b/bootstrap/sql/migrations/native/1.6.0/postgres/schemaChanges.sql
@@ -1756,3 +1756,27 @@ and servicetype = 'DBTCloud';
UPDATE pipeline_service_entity
SET json = jsonb_set(json, '{connection, config, projectIds}', '[]', true)
WHERE servicetype = 'DBTCloud';
+
+-- Update serviceType in dashboard_entity table
+UPDATE dashboard_entity
+SET json = jsonb_set(json, '{serviceType}', '"MicroStrategy"')
+WHERE jsonb_extract_path_text(json, 'serviceType') = 'Mstr';
+
+-- Update serviceType in dashboard_service_entity table
+UPDATE dashboard_service_entity
+SET json = jsonb_set(json, '{serviceType}', '"MicroStrategy"')
+WHERE jsonb_extract_path_text(json, 'serviceType') = 'Mstr';
+
+UPDATE dashboard_service_entity
+SET json = jsonb_set(json, '{connection,config,type}', '"MicroStrategy"')
+WHERE jsonb_extract_path_text(json, 'connection', 'config', 'type') = 'Mstr';
+
+-- Update serviceType in dashboard_data_model_entity table
+UPDATE dashboard_data_model_entity
+SET json = jsonb_set(json, '{serviceType}', '"MicroStrategy"')
+WHERE jsonb_extract_path_text(json, 'serviceType') = 'Mstr';
+
+-- Update serviceType in chart_entity table
+UPDATE chart_entity
+SET json = jsonb_set(json, '{serviceType}', '"MicroStrategy"')
+WHERE jsonb_extract_path_text(json, 'serviceType') = 'Mstr';
\ No newline at end of file
diff --git a/ingestion/src/metadata/examples/workflows/mstr.yaml b/ingestion/src/metadata/examples/workflows/microstrategy.yaml
similarity index 94%
rename from ingestion/src/metadata/examples/workflows/mstr.yaml
rename to ingestion/src/metadata/examples/workflows/microstrategy.yaml
index 64ad7a44c0e..4989872137e 100644
--- a/ingestion/src/metadata/examples/workflows/mstr.yaml
+++ b/ingestion/src/metadata/examples/workflows/microstrategy.yaml
@@ -1,13 +1,14 @@
source:
- type: mstr
+ type: microstrategy
serviceName: test
serviceConnection:
config:
- type: Mstr
+ type: MicroStrategy
username: username
password: password
hostPort: http://hostPort
projectName: project
+ loginMode: "8"
sourceConfig:
config:
type: DashboardMetadata
diff --git a/ingestion/src/metadata/ingestion/source/dashboard/mstr/__init__.py b/ingestion/src/metadata/ingestion/source/dashboard/microstrategy/__init__.py
similarity index 100%
rename from ingestion/src/metadata/ingestion/source/dashboard/mstr/__init__.py
rename to ingestion/src/metadata/ingestion/source/dashboard/microstrategy/__init__.py
diff --git a/ingestion/src/metadata/ingestion/source/dashboard/mstr/client.py b/ingestion/src/metadata/ingestion/source/dashboard/microstrategy/client.py
similarity index 93%
rename from ingestion/src/metadata/ingestion/source/dashboard/mstr/client.py
rename to ingestion/src/metadata/ingestion/source/dashboard/microstrategy/client.py
index 1388364db11..7c25e8793cd 100644
--- a/ingestion/src/metadata/ingestion/source/dashboard/mstr/client.py
+++ b/ingestion/src/metadata/ingestion/source/dashboard/microstrategy/client.py
@@ -9,19 +9,19 @@
# See the License for the specific language governing permissions and
# limitations under the License.
"""
-REST Auth & Client for Mstr
+REST Auth & Client for MicroStrategy
"""
import traceback
from typing import List, Optional
import requests
-from metadata.generated.schema.entity.services.connections.dashboard.mstrConnection import (
- MstrConnection,
+from metadata.generated.schema.entity.services.connections.dashboard.microStrategyConnection import (
+ MicroStrategyConnection,
)
from metadata.ingestion.connections.test_connections import SourceConnectionException
from metadata.ingestion.ometa.client import REST, ClientConfig
-from metadata.ingestion.source.dashboard.mstr.models import (
+from metadata.ingestion.source.dashboard.microstrategy.models import (
AuthHeaderCookie,
MstrDashboard,
MstrDashboardDetails,
@@ -37,30 +37,29 @@ from metadata.utils.logger import ingestion_logger
logger = ingestion_logger()
API_VERSION = "MicroStrategyLibrary/api"
-LOGIN_MODE_GUEST = 8
APPLICATION_TYPE = 35
-class MSTRClient:
+class MicroStrategyClient:
"""
Client Handling API communication with Metabase
"""
def _get_base_url(self, path=None):
if not path:
- return f"{clean_uri(self.config.hostPort)}/{API_VERSION}"
- return f"{clean_uri(self.config.hostPort)}/{API_VERSION}/{path}"
+ return f"{clean_uri(str(self.config.hostPort))}/{API_VERSION}"
+ return f"{clean_uri(str(self.config.hostPort))}/{API_VERSION}/{path}"
def __init__(
self,
- config: MstrConnection,
+ config: MicroStrategyConnection,
):
self.config = config
self.auth_params: AuthHeaderCookie = self._get_auth_header_and_cookies()
client_config = ClientConfig(
- base_url=clean_uri(config.hostPort),
+ base_url=clean_uri(str(self.config.hostPort)),
api_version=API_VERSION,
extra_headers=self.auth_params.auth_header,
allow_redirects=True,
@@ -81,7 +80,7 @@ class MSTRClient:
data = {
"username": self.config.username,
"password": self.config.password.get_secret_value(),
- "loginMode": LOGIN_MODE_GUEST,
+ "loginMode": self.config.loginMode,
"applicationType": APPLICATION_TYPE,
}
response = requests.post(
diff --git a/ingestion/src/metadata/ingestion/source/dashboard/mstr/connection.py b/ingestion/src/metadata/ingestion/source/dashboard/microstrategy/connection.py
similarity index 79%
rename from ingestion/src/metadata/ingestion/source/dashboard/mstr/connection.py
rename to ingestion/src/metadata/ingestion/source/dashboard/microstrategy/connection.py
index 156022a8aac..ce96e54b3ce 100644
--- a/ingestion/src/metadata/ingestion/source/dashboard/mstr/connection.py
+++ b/ingestion/src/metadata/ingestion/source/dashboard/microstrategy/connection.py
@@ -17,31 +17,29 @@ from typing import Optional
from metadata.generated.schema.entity.automations.workflow import (
Workflow as AutomationWorkflow,
)
-from metadata.generated.schema.entity.services.connections.dashboard.mstrConnection import (
- MstrConnection,
+from metadata.generated.schema.entity.services.connections.dashboard.microStrategyConnection import (
+ MicroStrategyConnection,
)
from metadata.generated.schema.entity.services.connections.testConnectionResult import (
TestConnectionResult,
)
from metadata.ingestion.connections.test_connections import test_connection_steps
from metadata.ingestion.ometa.ometa_api import OpenMetadata
-from metadata.ingestion.source.dashboard.mstr.client import MSTRClient
-from metadata.utils.constants import THREE_MIN
+from metadata.ingestion.source.dashboard.microstrategy.client import MicroStrategyClient
-def get_connection(connection: MstrConnection) -> MSTRClient:
+def get_connection(connection: MicroStrategyConnection) -> MicroStrategyClient:
"""
Create connection
"""
- return MSTRClient(connection)
+ return MicroStrategyClient(connection)
def test_connection(
metadata: OpenMetadata,
- client: MSTRClient,
- service_connection: MstrConnection,
+ client: MicroStrategyClient,
+ service_connection: MicroStrategyConnection,
automation_workflow: Optional[AutomationWorkflow] = None,
- timeout_seconds: Optional[int] = THREE_MIN,
) -> TestConnectionResult:
"""
Test connection. This can be executed either as part
@@ -55,5 +53,4 @@ def test_connection(
test_fn=test_fn,
service_type=service_connection.type.value,
automation_workflow=automation_workflow,
- timeout_seconds=timeout_seconds,
)
diff --git a/ingestion/src/metadata/ingestion/source/dashboard/mstr/metadata.py b/ingestion/src/metadata/ingestion/source/dashboard/microstrategy/metadata.py
similarity index 90%
rename from ingestion/src/metadata/ingestion/source/dashboard/mstr/metadata.py
rename to ingestion/src/metadata/ingestion/source/dashboard/microstrategy/metadata.py
index d26ee0ef0e6..1fcd23c1cca 100644
--- a/ingestion/src/metadata/ingestion/source/dashboard/mstr/metadata.py
+++ b/ingestion/src/metadata/ingestion/source/dashboard/microstrategy/metadata.py
@@ -8,7 +8,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
-"""Mstr source module"""
+"""MicroStrategy source module"""
import traceback
from typing import Iterable, List, Optional
@@ -16,8 +16,8 @@ from metadata.generated.schema.api.data.createChart import CreateChartRequest
from metadata.generated.schema.api.data.createDashboard import CreateDashboardRequest
from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest
from metadata.generated.schema.entity.data.chart import Chart
-from metadata.generated.schema.entity.services.connections.dashboard.mstrConnection import (
- MstrConnection,
+from metadata.generated.schema.entity.services.connections.dashboard.microStrategyConnection import (
+ MicroStrategyConnection,
)
from metadata.generated.schema.entity.services.ingestionPipelines.status import (
StackTraceError,
@@ -34,7 +34,7 @@ from metadata.ingestion.api.models import Either
from metadata.ingestion.api.steps import InvalidSourceException
from metadata.ingestion.ometa.ometa_api import OpenMetadata
from metadata.ingestion.source.dashboard.dashboard_service import DashboardServiceSource
-from metadata.ingestion.source.dashboard.mstr.models import (
+from metadata.ingestion.source.dashboard.microstrategy.models import (
MstrDashboard,
MstrDashboardDetails,
MstrPage,
@@ -47,9 +47,9 @@ from metadata.utils.logger import ingestion_logger
logger = ingestion_logger()
-class MstrSource(DashboardServiceSource):
+class MicrostrategySource(DashboardServiceSource):
"""
- MSTR Source Class
+ Microstrategy Source Class
"""
@classmethod
@@ -60,10 +60,10 @@ class MstrSource(DashboardServiceSource):
pipeline_name: Optional[str] = None,
):
config = WorkflowSource.model_validate(config_dict)
- connection: MstrConnection = config.serviceConnection.root.config
- if not isinstance(connection, MstrConnection):
+ connection: MicroStrategyConnection = config.serviceConnection.root.config
+ if not isinstance(connection, MicroStrategyConnection):
raise InvalidSourceException(
- f"Expected MstrConnection, but got {connection}"
+ f"Expected MicroStrategyConnection, but got {connection}"
)
return cls(config, metadata)
@@ -75,14 +75,18 @@ class MstrSource(DashboardServiceSource):
if self.client.is_project_name():
project = self.client.get_project_by_name()
- dashboards.extend(self.client.get_dashboards_list(project.id, project.name))
-
- if not self.client.is_project_name():
- for project in self.client.get_projects_list():
+ if project:
dashboards.extend(
self.client.get_dashboards_list(project.id, project.name)
)
+ if not self.client.is_project_name():
+ for project in self.client.get_projects_list():
+ if project:
+ dashboards.extend(
+ self.client.get_dashboards_list(project.id, project.name)
+ )
+
return dashboards
def get_dashboard_name(self, dashboard: MstrDashboard) -> str:
@@ -121,7 +125,7 @@ class MstrSource(DashboardServiceSource):
if dashboard_details:
try:
dashboard_url = (
- f"{clean_uri(self.service_connection.hostPort)}/MicroStrategyLibrary/app/"
+ f"{clean_uri(str(self.service_connection.hostPort))}/MicroStrategyLibrary/app/"
f"{dashboard_details.projectId}/{dashboard_details.id}"
)
dashboard_request = CreateDashboardRequest(
diff --git a/ingestion/src/metadata/ingestion/source/dashboard/mstr/models.py b/ingestion/src/metadata/ingestion/source/dashboard/microstrategy/models.py
similarity index 99%
rename from ingestion/src/metadata/ingestion/source/dashboard/mstr/models.py
rename to ingestion/src/metadata/ingestion/source/dashboard/microstrategy/models.py
index 372dfb92d0a..0c550cdfea7 100644
--- a/ingestion/src/metadata/ingestion/source/dashboard/mstr/models.py
+++ b/ingestion/src/metadata/ingestion/source/dashboard/microstrategy/models.py
@@ -9,7 +9,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
"""
-MSTR Models
+MicroStrategy Models
"""
from datetime import datetime
from typing import Any, List, Optional
diff --git a/ingestion/src/metadata/ingestion/source/dashboard/microstrategy/service_spec.py b/ingestion/src/metadata/ingestion/source/dashboard/microstrategy/service_spec.py
new file mode 100644
index 00000000000..d9b6c3a9547
--- /dev/null
+++ b/ingestion/src/metadata/ingestion/source/dashboard/microstrategy/service_spec.py
@@ -0,0 +1,6 @@
+from metadata.ingestion.source.dashboard.microstrategy.metadata import (
+ MicrostrategySource,
+)
+from metadata.utils.service_spec.default import DefaultDatabaseSpec
+
+ServiceSpec = DefaultDatabaseSpec(metadata_source_class=MicrostrategySource)
diff --git a/ingestion/src/metadata/ingestion/source/dashboard/mstr/service_spec.py b/ingestion/src/metadata/ingestion/source/dashboard/mstr/service_spec.py
deleted file mode 100644
index f2ea7e03df8..00000000000
--- a/ingestion/src/metadata/ingestion/source/dashboard/mstr/service_spec.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from metadata.ingestion.source.dashboard.mstr.metadata import MstrSource
-from metadata.utils.service_spec import BaseSpec
-
-ServiceSpec = BaseSpec(metadata_source_class=MstrSource)
diff --git a/ingestion/tests/unit/topology/dashboard/test_microstrategy.py b/ingestion/tests/unit/topology/dashboard/test_microstrategy.py
new file mode 100644
index 00000000000..5af80363c50
--- /dev/null
+++ b/ingestion/tests/unit/topology/dashboard/test_microstrategy.py
@@ -0,0 +1,127 @@
+# Copyright 2021 Collate
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+# http://www.apache.org/licenses/LICENSE-2.0
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+Test Microstrategy using the topology
+"""
+from datetime import datetime
+from types import SimpleNamespace
+from unittest import TestCase
+from unittest.mock import patch
+
+from metadata.generated.schema.metadataIngestion.workflow import (
+ OpenMetadataWorkflowConfig,
+)
+from metadata.ingestion.ometa.ometa_api import OpenMetadata
+from metadata.ingestion.source.dashboard.microstrategy.metadata import (
+ MicrostrategySource,
+)
+from metadata.ingestion.source.dashboard.microstrategy.models import (
+ MstrDashboard,
+ MstrOwner,
+ MstrProject,
+)
+
+mock_micro_config = {
+ "source": {
+ "type": "microstrategy",
+ "serviceName": "local_stitch_test",
+ "serviceConnection": {
+ "config": {
+ "type": "MicroStrategy",
+ "hostPort": "https://demo.microstrategy.com",
+ "username": "username",
+ "password": "password",
+ }
+ },
+ "sourceConfig": {"config": {"type": "DashboardMetadata"}},
+ },
+ "sink": {"type": "metadata-rest", "config": {}},
+ "workflowConfig": {
+ "loggerLevel": "DEBUG",
+ "openMetadataServerConfig": {
+ "hostPort": "http://localhost:8585/api",
+ "authProvider": "openmetadata",
+ "securityConfig": {
+ "jwtToken": "eyJraWQiOiJHYjM4OWEtOWY3Ni1nZGpzLWE5MmotMDI0MmJrOTQzNTYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzQm90IjpmYWxzZSwiaXNzIjoib3Blbi1tZXRhZGF0YS5vcmciLCJpYXQiOjE2NjM5Mzg0NjIsImVtYWlsIjoiYWRtaW5Ab3Blbm1ldGFkYXRhLm9yZyJ9.tS8um_5DKu7HgzGBzS1VTA5uUjKWOCU0B_j08WXBiEC0mr0zNREkqVfwFDD-d24HlNEbrqioLsBuFRiwIWKc1m_ZlVQbG7P36RUxhuv2vbSp80FKyNM-Tj93FDzq91jsyNmsQhyNv_fNr3TXfzzSPjHt8Go0FMMP66weoKMgW2PbXlhVKwEuXUHyakLLzewm9UMeQaEiRzhiTMU3UkLXcKbYEJJvfNFcLwSl9W8JCO_l0Yj3ud-qt_nQYEZwqW6u5nfdQllN133iikV4fM5QZsMCnm8Rq1mvLR0y9bmJiD7fwM1tmJ791TUWqmKaTnP49U493VanKpUAfzIiOiIbhg"
+ },
+ },
+ },
+}
+
+MOCK_PROJECT_LIST = [
+ MstrProject(
+ acg=5,
+ id="B7CA92F04B9FAE8D941C3E9B7E0CD754",
+ name="MicroStrategy Tutorial",
+ status=0,
+ alias="",
+ description="fun",
+ dateCreated=datetime(2015, 6, 30, 21, 55, 35),
+ dateModified=datetime(2024, 10, 1, 21, 42, 50),
+ owner=MstrOwner(name="Administrator", id="54F3D26011D2896560009A8E67019608"),
+ )
+]
+
+MOCK_DASHBORD_LIST = [
+ MstrDashboard(
+ name="Library of Demos",
+ id="925FB4A311EA52FF3EA80080EF059105",
+ type=55,
+ description="abc",
+ subtype=14081,
+ dateCreated="2020-02-19T10:07:01.000+0000",
+ dateModified="2024-11-06T14:14:42.000+0000",
+ version="3E367000E84DD4AA9B501EAD892EB2E1",
+ acg=199,
+ owner=MstrOwner(name="Administrator", id="54F3D26011D2896560009A8E67019608"),
+ extType=0,
+ viewMedia=1879072805,
+ certifiedInfo={"certified": False},
+ templateInfo={"template": False, "lastModifiedBy": {}},
+ projectId="EC70648611E7A2F962E90080EFD58751",
+ projectName="MicroStrategy Tutorial",
+ )
+]
+
+
+class MicroStrategyUnitTest(TestCase):
+ """
+ Implements the necessary methods to extract
+ MicroStrategy Unit Testtest_dbt
+ """
+
+ @patch(
+ "metadata.ingestion.source.dashboard.microstrategy.metadata.MicrostrategySource.test_connection"
+ )
+ @patch(
+ "metadata.ingestion.source.dashboard.microstrategy.connection.get_connection"
+ )
+ def __init__(self, methodName, get_connection, test_connection) -> None:
+ super().__init__(methodName)
+ test_connection.return_value = False
+ get_connection.return_value = False
+ self.config = OpenMetadataWorkflowConfig.model_validate(mock_micro_config)
+ self.microstrategy = MicrostrategySource.create(
+ mock_micro_config["source"],
+ OpenMetadata(self.config.workflowConfig.openMetadataServerConfig),
+ )
+ self.microstrategy.client = SimpleNamespace()
+
+ def test_get_dashboards_list(self):
+ """
+ Get the dashboards
+ """
+ self.microstrategy.client.is_project_name = lambda *_: False
+ self.microstrategy.client.get_projects_list = lambda *_: MOCK_PROJECT_LIST
+ self.microstrategy.client.get_dashboards_list = lambda *_: MOCK_DASHBORD_LIST
+ fetched_dashboards_list = self.microstrategy.get_dashboards_list()
+ self.assertEqual(list(fetched_dashboards_list), MOCK_DASHBORD_LIST)
diff --git a/openmetadata-docs/content/v1.5.x/connectors/dashboard/microstrategy/index.md b/openmetadata-docs/content/v1.5.x/connectors/dashboard/microstrategy/index.md
index dd67e19c9da..dad15758364 100644
--- a/openmetadata-docs/content/v1.5.x/connectors/dashboard/microstrategy/index.md
+++ b/openmetadata-docs/content/v1.5.x/connectors/dashboard/microstrategy/index.md
@@ -24,6 +24,16 @@ Configure and schedule MicroStrategy metadata and profiler workflows from the Op
To integrate MicroStrategy, ensure you are using OpenMetadata version 1.2.x or higher.
+When a service user is created, it is already provisioned with the necessary permissions.
+However, if the user still cannot access the APIs, the following should be checked as part of the troubleshooting process:
+- Required DSS Privileges for MicroStrategy REST/JSON API:
+- Web Services API: Essential for REST API usage.
+- Login to MicroStrategy: User authentication.
+- Use Project Sources: Access to project sources.
+- View Metadata: Metadata browsing and viewing.
+- Access Administration Objects: Global metadata access (connections, DB instances).
+- Browse Repository: Object navigation within projects/folders.
+
## Metadata Ingestion
{% partial
@@ -41,16 +51,18 @@ To integrate MicroStrategy, ensure you are using OpenMetadata version 1.2.x or h
#### Connection Details
-- **Username**: Username to connect to Mstr, e.g., user@organization.com. This user should have access to relevant dashboards and charts in Mstr to fetch the metadata.
+- **Username**: Username to connect to MicroStrategy, e.g., user@organization.com. This user should have access to relevant dashboards and charts in MicroStrategy to fetch the metadata.
-- **Password**: Password of the user account to connect with Mstr.
+- **Password**: Password of the user account to connect with MicroStrategy.
-- **Host Port**: This parameter specifies the host and port of the Mstr instance. This should be specified as a URI string in the format http://hostname:port or https://hostname:port.
+- **Host Port**: This parameter specifies the host of the MicroStrategy instance. This should be specified as a URI string in the format http://hostname or https://hostname.
-For example, you might set it to https://org.mstr.com:3000.
+For example, you might set it to https://demo.microstrategy.com.
-- **Project Name**: The name of the project within Mstr that OpenMetadata will connect to, linking to the relevant dashboards and reports for metadata retrieval.
+- **Project Name**: The name of the project within MicroStrategy that OpenMetadata will connect to, linking to the relevant dashboards and reports for metadata retrieval.
+- **Login Mode**: Login Mode for Microstrategy's REST API connection. You can authenticate with one of the following authentication modes: `Standard (1)`, `Anonymous (8)`. Default will be `Standard (1)`.
+If you're using demo account for Microstrategy, it will be needed to authenticate through loginMode `8`.
{% /extraContent %}
{% partial file="/v1.5/connectors/test-connection.md" /%}
diff --git a/openmetadata-docs/content/v1.5.x/connectors/dashboard/microstrategy/yaml.md b/openmetadata-docs/content/v1.5.x/connectors/dashboard/microstrategy/yaml.md
index 539122b6224..bbbf138c019 100644
--- a/openmetadata-docs/content/v1.5.x/connectors/dashboard/microstrategy/yaml.md
+++ b/openmetadata-docs/content/v1.5.x/connectors/dashboard/microstrategy/yaml.md
@@ -31,7 +31,7 @@ To integrate MicroStrategy, ensure you are using OpenMetadata version 1.2.x or h
To run the MicroStrategy ingestion, you will need to install:
```bash
-pip3 install "openmetadata-ingestion[mstr]"
+pip3 install "openmetadata-ingestion[microstrategy]"
```
## Metadata Ingestion
@@ -59,27 +59,34 @@ This is a sample config for MicroStrategy:
{% codeInfo srNumber=1 %}
-- **Username**: Username to connect to Mstr, e.g., user@organization.com. This user should have access to relevant dashboards and charts in Mstr to fetch the metadata.
+- **Username**: Username to connect to MicroStrategy, e.g., user@organization.com. This user should have access to relevant dashboards and charts in MicroStrategy to fetch the metadata.
{% /codeInfo %}
{% codeInfo srNumber=2 %}
-- **Password**: Password of the user account to connect with Mstr.
+- **Password**: Password of the user account to connect with MicroStrategy.
{% /codeInfo %}
{% codeInfo srNumber=3 %}
-- **Host Port**: This parameter specifies the host and port of the Mstr instance. This should be specified as a URI string in the format http://hostname:port or https://hostname:port.
+- **Host Port**: This parameter specifies the host of the MicroStrategy instance. This should be specified as a URI string in the format http://hostname or https://hostname.
-For example, you might set it to https://org.mstr.com:3000.
+For example, you might set it to https://demo.microstrategy.com.
{% /codeInfo %}
{% codeInfo srNumber=4 %}
-- **Project Name**: The name of the project within Mstr that OpenMetadata will connect to, linking to the relevant dashboards and reports for metadata retrieval.
+- **Project Name**: The name of the project within MicroStrategy that OpenMetadata will connect to, linking to the relevant dashboards and reports for metadata retrieval.
+
+{% /codeInfo %}
+
+{% codeInfo srNumber=5 %}
+
+- **Login Mode**: Login Mode for Microstrategy's REST API connection. You can authenticate with one of the following authentication modes: `Standard (1)`, `Anonymous (8)`. Default will be `Standard (1)`.
+If you're using demo account for Microstrategy, it will be needed to authenticate through loginMode `8`.
{% /codeInfo %}
@@ -95,11 +102,11 @@ For example, you might set it to https://org.mstr.com:3000.
```yaml {% isCodeBlock=true %}
source:
- type: mstr
+ type: microstrategy
serviceName: local_Mstr
serviceConnection:
config:
- type: Mstr
+ type: MicroStrategy
```
```yaml {% srNumber=1 %}
username: username
@@ -113,6 +120,9 @@ source:
```yaml {% srNumber=4 %}
projectName: project
```
+```yaml {% srNumber=5 %}
+ loginMode: "1"
+```
{% partial file="/v1.5/connectors/yaml/dashboard/source-config.md" /%}
diff --git a/openmetadata-docs/content/v1.6.x-SNAPSHOT/connectors/dashboard/microstrategy/index.md b/openmetadata-docs/content/v1.6.x-SNAPSHOT/connectors/dashboard/microstrategy/index.md
index 0700370930c..197dbcabb87 100644
--- a/openmetadata-docs/content/v1.6.x-SNAPSHOT/connectors/dashboard/microstrategy/index.md
+++ b/openmetadata-docs/content/v1.6.x-SNAPSHOT/connectors/dashboard/microstrategy/index.md
@@ -24,6 +24,16 @@ Configure and schedule MicroStrategy metadata and profiler workflows from the Op
To integrate MicroStrategy, ensure you are using OpenMetadata version 1.2.x or higher.
+When a service user is created, it is already provisioned with the necessary permissions.
+However, if the user still cannot access the APIs, the following should be checked as part of the troubleshooting process:
+- Required DSS Privileges for MicroStrategy REST/JSON API:
+- Web Services API: Essential for REST API usage.
+- Login to MicroStrategy: User authentication.
+- Use Project Sources: Access to project sources.
+- View Metadata: Metadata browsing and viewing.
+- Access Administration Objects: Global metadata access (connections, DB instances).
+- Browse Repository: Object navigation within projects/folders.
+
## Metadata Ingestion
{% partial
@@ -41,15 +51,18 @@ To integrate MicroStrategy, ensure you are using OpenMetadata version 1.2.x or h
#### Connection Details
-- **Username**: Username to connect to Mstr, e.g., user@organization.com. This user should have access to relevant dashboards and charts in Mstr to fetch the metadata.
+- **Username**: Username to connect to MicroStrategy, e.g., user@organization.com. This user should have access to relevant dashboards and charts in MicroStrategy to fetch the metadata.
-- **Password**: Password of the user account to connect with Mstr.
+- **Password**: Password of the user account to connect with MicroStrategy.
-- **Host Port**: This parameter specifies the host and port of the Mstr instance. This should be specified as a URI string in the format http://hostname:port or https://hostname:port.
+- **Host Port**: This parameter specifies the host of the MicroStrategy instance. This should be specified as a URI string in the format http://hostname or https://hostname.
-For example, you might set it to https://org.mstr.com:3000.
+For example, you might set it to https://demo.microstrategy.com.
-- **Project Name**: The name of the project within Mstr that OpenMetadata will connect to, linking to the relevant dashboards and reports for metadata retrieval.
+- **Project Name**: The name of the project within MicroStrategy that OpenMetadata will connect to, linking to the relevant dashboards and reports for metadata retrieval.
+
+- **Login Mode**: Login Mode for Microstrategy's REST API connection. You can authenticate with one of the following authentication modes: `Standard (1)`, `Anonymous (8)`. Default will be `Standard (1)`.
+If you're using demo account for Microstrategy, it will be needed to authenticate through loginMode `8`.
{% /extraContent %}
diff --git a/openmetadata-docs/content/v1.6.x-SNAPSHOT/connectors/dashboard/microstrategy/yaml.md b/openmetadata-docs/content/v1.6.x-SNAPSHOT/connectors/dashboard/microstrategy/yaml.md
index bd159630e6e..d01482d5029 100644
--- a/openmetadata-docs/content/v1.6.x-SNAPSHOT/connectors/dashboard/microstrategy/yaml.md
+++ b/openmetadata-docs/content/v1.6.x-SNAPSHOT/connectors/dashboard/microstrategy/yaml.md
@@ -31,7 +31,7 @@ To integrate MicroStrategy, ensure you are using OpenMetadata version 1.2.x or h
To run the MicroStrategy ingestion, you will need to install:
```bash
-pip3 install "openmetadata-ingestion[mstr]"
+pip3 install "openmetadata-ingestion[microstrategy]"
```
## Metadata Ingestion
@@ -59,27 +59,34 @@ This is a sample config for MicroStrategy:
{% codeInfo srNumber=1 %}
-- **Username**: Username to connect to Mstr, e.g., user@organization.com. This user should have access to relevant dashboards and charts in Mstr to fetch the metadata.
+- **Username**: Username to connect to MicroStrategy, e.g., user@organization.com. This user should have access to relevant dashboards and charts in MicroStrategy to fetch the metadata.
{% /codeInfo %}
{% codeInfo srNumber=2 %}
-- **Password**: Password of the user account to connect with Mstr.
+- **Password**: Password of the user account to connect with MicroStrategy.
{% /codeInfo %}
{% codeInfo srNumber=3 %}
-- **Host Port**: This parameter specifies the host and port of the Mstr instance. This should be specified as a URI string in the format http://hostname:port or https://hostname:port.
+- **Host Port**: This parameter specifies the host of the MicroStrategy instance. This should be specified as a URI string in the format http://hostname or https://hostname.
-For example, you might set it to https://org.mstr.com:3000.
+For example, you might set it to https://demo.microstrategy.com.
{% /codeInfo %}
{% codeInfo srNumber=4 %}
-- **Project Name**: The name of the project within Mstr that OpenMetadata will connect to, linking to the relevant dashboards and reports for metadata retrieval.
+- **Project Name**: The name of the project within MicroStrategy that OpenMetadata will connect to, linking to the relevant dashboards and reports for metadata retrieval.
+
+{% /codeInfo %}
+
+{% codeInfo srNumber=5 %}
+
+- **Login Mode**: Login Mode for Microstrategy's REST API connection. You can authenticate with one of the following authentication modes: `Standard (1)`, `Anonymous (8)`. Default will be `Standard (1)`.
+If you're using demo account for Microstrategy, it will be needed to authenticate through loginMode `8`.
{% /codeInfo %}
@@ -95,11 +102,11 @@ For example, you might set it to https://org.mstr.com:3000.
```yaml {% isCodeBlock=true %}
source:
- type: mstr
+ type: microstrategy
serviceName: local_Mstr
serviceConnection:
config:
- type: Mstr
+ type: MicroStrategy
```
```yaml {% srNumber=1 %}
username: username
@@ -113,6 +120,9 @@ source:
```yaml {% srNumber=4 %}
projectName: project
```
+```yaml {% srNumber=5 %}
+ loginMode: "1"
+```
{% partial file="/v1.6/connectors/yaml/dashboard/source-config.md" /%}
diff --git a/openmetadata-service/src/main/resources/json/data/testConnections/dashboard/mstr.json b/openmetadata-service/src/main/resources/json/data/testConnections/dashboard/microstrategy.json
similarity index 85%
rename from openmetadata-service/src/main/resources/json/data/testConnections/dashboard/mstr.json
rename to openmetadata-service/src/main/resources/json/data/testConnections/dashboard/microstrategy.json
index b6e5a2a25e5..203fa19cace 100644
--- a/openmetadata-service/src/main/resources/json/data/testConnections/dashboard/mstr.json
+++ b/openmetadata-service/src/main/resources/json/data/testConnections/dashboard/microstrategy.json
@@ -1,6 +1,6 @@
{
- "name": "Mstr",
- "displayName": "Mstr Test Connection",
+ "name": "MicroStrategy",
+ "displayName": "MicroStrategy Test Connection",
"description": "This Test Connection validates the access against the server and basic metadata extraction of dashboards and charts.",
"steps": [
{
diff --git a/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/dashboard/microStrategyConnection.json b/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/dashboard/microStrategyConnection.json
new file mode 100644
index 00000000000..dd423785f4a
--- /dev/null
+++ b/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/dashboard/microStrategyConnection.json
@@ -0,0 +1,59 @@
+{
+ "$id": "https://open-metadata.org/schema/entity/services/connections/dashboard/microStrategyConnection.json",
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "MicroStrategyConnection",
+ "description": "MicroStrategy Connection Config",
+ "type": "object",
+ "javaType": "org.openmetadata.schema.services.connections.dashboard.MicroStrategyConnection",
+ "definitions": {
+ "microStrategyType": {
+ "description": "MicroStrategy service type",
+ "type": "string",
+ "enum": ["MicroStrategy"],
+ "default": "MicroStrategy"
+ }
+ },
+ "properties": {
+ "type": {
+ "title": "Service Type",
+ "description": "Service Type",
+ "$ref": "#/definitions/microStrategyType",
+ "default": "MicroStrategy"
+ },
+ "username": {
+ "title": "Username",
+ "description": "Username to connect to MicroStrategy. This user should have privileges to read all the metadata in MicroStrategy.",
+ "type": "string"
+ },
+ "password": {
+ "title": "Password",
+ "description": "Password to connect to MicroStrategy.",
+ "type": "string",
+ "format": "password"
+ },
+ "hostPort": {
+ "expose": true,
+ "title": "Host and Port",
+ "description": "Host and Port of the MicroStrategy instance.",
+ "type": "string",
+ "format": "uri"
+ },
+ "projectName": {
+ "title": "Project Name",
+ "description": "MicroStrategy Project Name",
+ "type": "string"
+ },
+ "loginMode": {
+ "title": "Login Mode",
+ "description": "Login Mode for Microstrategy's REST API connection. You can authenticate with one of the following authentication modes: `Standard (1)`, `Anonymous (8)`. Default will be `Standard (1)`. If you're using demo account for Microstrategy, it will be needed to authenticate through loginMode `8`.",
+ "type": "string",
+ "default": "1"
+ },
+ "supportsMetadataExtraction": {
+ "title": "Supports Metadata Extraction",
+ "$ref": "../connectionBasicType.json#/definitions/supportsMetadataExtraction"
+ }
+ },
+ "additionalProperties": false,
+ "required": ["hostPort", "username", "password"]
+}
diff --git a/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/dashboard/mstrConnection.json b/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/dashboard/mstrConnection.json
deleted file mode 100644
index 66355ee7fa0..00000000000
--- a/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/dashboard/mstrConnection.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "$id": "https://open-metadata.org/schema/entity/services/connections/dashboard/mstrConnection.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
- "title": "MstrConnection",
- "description": "Mstr Connection Config",
- "type": "object",
- "javaType": "org.openmetadata.schema.services.connections.dashboard.MstrConnection",
- "definitions": {
- "mstrType": {
- "description": "Mstr service type",
- "type": "string",
- "enum": ["Mstr"],
- "default": "Mstr"
- }
- },
- "properties": {
- "type": {
- "title": "Service Type",
- "description": "Service Type",
- "$ref": "#/definitions/mstrType",
- "default": "Mstr"
- },
- "username": {
- "title": "Username",
- "description": "Username to connect to MSTR. This user should have privileges to read all the metadata in MSTR.",
- "type": "string"
- },
- "password": {
- "title": "Password",
- "description": "Password to connect to MSTR.",
- "type": "string",
- "format": "password"
- },
- "hostPort": {
- "expose": true,
- "title": "Host and Port",
- "description": "Host and Port of the Metabase instance.",
- "type": "string",
- "format": "uri"
- },
- "projectName": {
- "title": "Project Name",
- "description": "MSTR Project Name",
- "type": "string"
- },
- "supportsMetadataExtraction": {
- "title": "Supports Metadata Extraction",
- "$ref": "../connectionBasicType.json#/definitions/supportsMetadataExtraction"
- }
- },
- "additionalProperties": false,
- "required": ["hostPort", "username"]
-}
diff --git a/openmetadata-spec/src/main/resources/json/schema/entity/services/dashboardService.json b/openmetadata-spec/src/main/resources/json/schema/entity/services/dashboardService.json
index 04986503a09..8bb69c03ffd 100644
--- a/openmetadata-spec/src/main/resources/json/schema/entity/services/dashboardService.json
+++ b/openmetadata-spec/src/main/resources/json/schema/entity/services/dashboardService.json
@@ -28,7 +28,7 @@
"QuickSight",
"QlikSense",
"Lightdash",
- "Mstr",
+ "MicroStrategy",
"QlikCloud",
"Sigma"
],
@@ -73,7 +73,7 @@
"name": "Lightdash"
},
{
- "name": "Mstr"
+ "name": "MicroStrategy"
},
{
"name": "QlikCloud"
@@ -134,7 +134,7 @@
"$ref": "./connections/dashboard/lightdashConnection.json"
},
{
- "$ref": "./connections/dashboard/mstrConnection.json"
+ "$ref": "./connections/dashboard/microStrategyConnection.json"
},
{
"$ref": "./connections/dashboard/qlikCloudConnection.json"
diff --git a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Dashboard/MicroStrategy.md b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Dashboard/MicroStrategy.md
new file mode 100644
index 00000000000..f8136e57d86
--- /dev/null
+++ b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Dashboard/MicroStrategy.md
@@ -0,0 +1,32 @@
+# MicroStrategy
+
+In this section, we provide guides and references to use the MicroStrategy connector.
+
+## Connection Details
+
+$$section
+### Username $(id="username")
+
+Username to connect to MicroStrategy, e.g., `user@organization.com`. This user should have access to relevant dashboards and charts in MicroStrategy to fetch the metadata.
+$$
+
+$$section
+### Password $(id="password")
+
+Password of the user account to connect with MicroStrategy.
+$$
+
+$$section
+### Host Port $(id="hostPort")
+
+This parameter specifies the host of the MicroStrategy instance. This should be specified as a URI string in the format http://hostname or https://hostname.
+
+For example, you might set it to https://demo.microstrategy.com.
+$$
+
+$$section
+### Login Mode $(id="loginMode")
+
+Login Mode for Microstrategy's REST API connection. You can authenticate with one of the following authentication modes: `Standard (1)`, `Anonymous (8)`. Default will be `Anonymous (8)`.
+If you're using demo account for Microstrategy, it will be needed to authenticate through loginMode `8`.
+$$
diff --git a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Dashboard/Mstr.md b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Dashboard/Mstr.md
deleted file mode 100644
index 2b04f02f0e7..00000000000
--- a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Dashboard/Mstr.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Mstr
-
-In this section, we provide guides and references to use the Mstr connector.
-
-## Connection Details
-
-$$section
-### Username $(id="username")
-
-Username to connect to Mstr, e.g., `user@organization.com`. This user should have access to relevant dashboards and charts in Mstr to fetch the metadata.
-$$
-
-$$section
-### Password $(id="password")
-
-Password of the user account to connect with Mstr.
-$$
-
-$$section
-### Host Port $(id="hostPort")
-
-This parameter specifies the host and port of the Mstr instance. This should be specified as a URI string in the format `http://hostname:port` or `https://hostname:port`.
-
-For example, you might set it to `https://org.mstr.com:3000`.
-$$
diff --git a/openmetadata-ui/src/main/resources/ui/src/assets/img/service-icon-microstrategy.svg b/openmetadata-ui/src/main/resources/ui/src/assets/img/service-icon-microstrategy.svg
new file mode 100644
index 00000000000..df5d5555e3e
--- /dev/null
+++ b/openmetadata-ui/src/main/resources/ui/src/assets/img/service-icon-microstrategy.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/openmetadata-ui/src/main/resources/ui/src/assets/img/service-icon-mstr.png b/openmetadata-ui/src/main/resources/ui/src/assets/img/service-icon-mstr.png
deleted file mode 100644
index d453270cf371e03c8399f30aadfad07a38bb52dc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 23441
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
diff --git a/openmetadata-ui/src/main/resources/ui/src/constants/Services.constant.ts b/openmetadata-ui/src/main/resources/ui/src/constants/Services.constant.ts
index 7b415b948dc..c3ca33b8874 100644
--- a/openmetadata-ui/src/main/resources/ui/src/constants/Services.constant.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/constants/Services.constant.ts
@@ -52,11 +52,11 @@ import lightDash from '../assets/img/service-icon-lightdash.png';
import looker from '../assets/img/service-icon-looker.png';
import mariadb from '../assets/img/service-icon-mariadb.png';
import metabase from '../assets/img/service-icon-metabase.png';
+import microstrategy from '../assets/img/service-icon-microstrategy.svg';
import mode from '../assets/img/service-icon-mode.png';
import mongodb from '../assets/img/service-icon-mongodb.png';
import msAzure from '../assets/img/service-icon-ms-azure.png';
import mssql from '../assets/img/service-icon-mssql.png';
-import mstr from '../assets/img/service-icon-mstr.png';
import nifi from '../assets/img/service-icon-nifi.png';
import openlineage from '../assets/img/service-icon-openlineage.svg';
import oracle from '../assets/img/service-icon-oracle.png';
@@ -153,7 +153,7 @@ export const REDPANDA = redpanda;
export const SUPERSET = superset;
export const SYNAPSE = synapse;
export const LOOKER = looker;
-export const MSTR = mstr;
+export const MICROSTRATEGY = microstrategy;
export const TABLEAU = tableau;
export const REDASH = redash;
export const METABASE = metabase;
diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json
index a35924c5c41..5748e124c16 100644
--- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json
+++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json
@@ -56,7 +56,6 @@
"aggregate": "एकूण",
"airflow-config-plural": "एअरफ्लो संरचना",
"alert": "सूचना",
- "alert-details": "Alert Details",
"alert-lowercase": "सूचना",
"alert-lowercase-plural": "सूचना",
"alert-plural": "सूचना",
diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/DashboardServiceUtils.ts b/openmetadata-ui/src/main/resources/ui/src/utils/DashboardServiceUtils.ts
index ab71882577b..d0ffe248892 100644
--- a/openmetadata-ui/src/main/resources/ui/src/utils/DashboardServiceUtils.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/utils/DashboardServiceUtils.ts
@@ -22,8 +22,8 @@ import domoDashboardConnection from '../jsons/connectionSchemas/connections/dash
import lightdashConnection from '../jsons/connectionSchemas/connections/dashboard/lightdashConnection.json';
import lookerConnection from '../jsons/connectionSchemas/connections/dashboard/lookerConnection.json';
import metabaseConnection from '../jsons/connectionSchemas/connections/dashboard/metabaseConnection.json';
+import microStrategyConnection from '../jsons/connectionSchemas/connections/dashboard/microStrategyConnection.json';
import modeConnection from '../jsons/connectionSchemas/connections/dashboard/modeConnection.json';
-import mstrConnection from '../jsons/connectionSchemas/connections/dashboard/mstrConnection.json';
import powerBIConnection from '../jsons/connectionSchemas/connections/dashboard/powerBIConnection.json';
import qlikcloudConnection from '../jsons/connectionSchemas/connections/dashboard/qlikCloudConnection.json';
import qliksenseConnection from '../jsons/connectionSchemas/connections/dashboard/qlikSenseConnection.json';
@@ -118,8 +118,8 @@ export const getDashboardConfig = (type: DashboardServiceType) => {
break;
}
- case DashboardServiceType.Mstr: {
- schema = mstrConnection;
+ case DashboardServiceType.MicroStrategy: {
+ schema = microStrategyConnection;
break;
}
diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/ServiceUtilClassBase.ts b/openmetadata-ui/src/main/resources/ui/src/utils/ServiceUtilClassBase.ts
index 6bc96a9852a..e8e8317af66 100644
--- a/openmetadata-ui/src/main/resources/ui/src/utils/ServiceUtilClassBase.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/utils/ServiceUtilClassBase.ts
@@ -58,6 +58,7 @@ import {
LOOKER,
MARIADB,
METABASE,
+ MICROSTRATEGY,
MLFLOW,
ML_MODEL_DEFAULT,
MODE,
@@ -376,6 +377,7 @@ class ServiceUtilClassBase {
case this.DashboardServiceTypeSmallCase.CustomDashboard:
return DASHBOARD_DEFAULT;
+
case this.DashboardServiceTypeSmallCase.Superset:
return SUPERSET;
@@ -468,6 +470,7 @@ class ServiceUtilClassBase {
case this.MlModelServiceTypeSmallCase.Sklearn:
return SCIKIT;
+
case this.MlModelServiceTypeSmallCase.SageMaker:
return SAGEMAKER;
@@ -504,6 +507,9 @@ class ServiceUtilClassBase {
case this.ApiServiceTypeSmallCase.REST:
return REST_SERVICE;
+ case this.DashboardServiceTypeSmallCase.MicroStrategy:
+ return MICROSTRATEGY;
+
default: {
let logo;
if (serviceTypes.messagingServices.includes(type)) {