Connector: rename microstrategy connector (#18604)

This commit is contained in:
harshsoni2024 2024-11-28 18:50:42 +05:30 committed by GitHub
parent f99ed517bc
commit cb33f274fc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
27 changed files with 409 additions and 157 deletions

View File

@ -1773,3 +1773,27 @@ SET json = JSON_SET(
) )
) )
WHERE serviceType = 'DBTCloud'; 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';

View File

@ -1756,3 +1756,27 @@ and servicetype = 'DBTCloud';
UPDATE pipeline_service_entity UPDATE pipeline_service_entity
SET json = jsonb_set(json, '{connection, config, projectIds}', '[]', true) SET json = jsonb_set(json, '{connection, config, projectIds}', '[]', true)
WHERE servicetype = 'DBTCloud'; 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';

View File

@ -1,13 +1,14 @@
source: source:
type: mstr type: microstrategy
serviceName: test serviceName: test
serviceConnection: serviceConnection:
config: config:
type: Mstr type: MicroStrategy
username: username username: username
password: password password: password
hostPort: http://hostPort hostPort: http://hostPort
projectName: project projectName: project
loginMode: "8"
sourceConfig: sourceConfig:
config: config:
type: DashboardMetadata type: DashboardMetadata

View File

@ -9,19 +9,19 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
""" """
REST Auth & Client for Mstr REST Auth & Client for MicroStrategy
""" """
import traceback import traceback
from typing import List, Optional from typing import List, Optional
import requests import requests
from metadata.generated.schema.entity.services.connections.dashboard.mstrConnection import ( from metadata.generated.schema.entity.services.connections.dashboard.microStrategyConnection import (
MstrConnection, MicroStrategyConnection,
) )
from metadata.ingestion.connections.test_connections import SourceConnectionException from metadata.ingestion.connections.test_connections import SourceConnectionException
from metadata.ingestion.ometa.client import REST, ClientConfig 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, AuthHeaderCookie,
MstrDashboard, MstrDashboard,
MstrDashboardDetails, MstrDashboardDetails,
@ -37,30 +37,29 @@ from metadata.utils.logger import ingestion_logger
logger = ingestion_logger() logger = ingestion_logger()
API_VERSION = "MicroStrategyLibrary/api" API_VERSION = "MicroStrategyLibrary/api"
LOGIN_MODE_GUEST = 8
APPLICATION_TYPE = 35 APPLICATION_TYPE = 35
class MSTRClient: class MicroStrategyClient:
""" """
Client Handling API communication with Metabase Client Handling API communication with Metabase
""" """
def _get_base_url(self, path=None): def _get_base_url(self, path=None):
if not path: if not path:
return f"{clean_uri(self.config.hostPort)}/{API_VERSION}" return f"{clean_uri(str(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}/{path}"
def __init__( def __init__(
self, self,
config: MstrConnection, config: MicroStrategyConnection,
): ):
self.config = config self.config = config
self.auth_params: AuthHeaderCookie = self._get_auth_header_and_cookies() self.auth_params: AuthHeaderCookie = self._get_auth_header_and_cookies()
client_config = ClientConfig( client_config = ClientConfig(
base_url=clean_uri(config.hostPort), base_url=clean_uri(str(self.config.hostPort)),
api_version=API_VERSION, api_version=API_VERSION,
extra_headers=self.auth_params.auth_header, extra_headers=self.auth_params.auth_header,
allow_redirects=True, allow_redirects=True,
@ -81,7 +80,7 @@ class MSTRClient:
data = { data = {
"username": self.config.username, "username": self.config.username,
"password": self.config.password.get_secret_value(), "password": self.config.password.get_secret_value(),
"loginMode": LOGIN_MODE_GUEST, "loginMode": self.config.loginMode,
"applicationType": APPLICATION_TYPE, "applicationType": APPLICATION_TYPE,
} }
response = requests.post( response = requests.post(

View File

@ -17,31 +17,29 @@ from typing import Optional
from metadata.generated.schema.entity.automations.workflow import ( from metadata.generated.schema.entity.automations.workflow import (
Workflow as AutomationWorkflow, Workflow as AutomationWorkflow,
) )
from metadata.generated.schema.entity.services.connections.dashboard.mstrConnection import ( from metadata.generated.schema.entity.services.connections.dashboard.microStrategyConnection import (
MstrConnection, MicroStrategyConnection,
) )
from metadata.generated.schema.entity.services.connections.testConnectionResult import ( from metadata.generated.schema.entity.services.connections.testConnectionResult import (
TestConnectionResult, TestConnectionResult,
) )
from metadata.ingestion.connections.test_connections import test_connection_steps from metadata.ingestion.connections.test_connections import test_connection_steps
from metadata.ingestion.ometa.ometa_api import OpenMetadata from metadata.ingestion.ometa.ometa_api import OpenMetadata
from metadata.ingestion.source.dashboard.mstr.client import MSTRClient from metadata.ingestion.source.dashboard.microstrategy.client import MicroStrategyClient
from metadata.utils.constants import THREE_MIN
def get_connection(connection: MstrConnection) -> MSTRClient: def get_connection(connection: MicroStrategyConnection) -> MicroStrategyClient:
""" """
Create connection Create connection
""" """
return MSTRClient(connection) return MicroStrategyClient(connection)
def test_connection( def test_connection(
metadata: OpenMetadata, metadata: OpenMetadata,
client: MSTRClient, client: MicroStrategyClient,
service_connection: MstrConnection, service_connection: MicroStrategyConnection,
automation_workflow: Optional[AutomationWorkflow] = None, automation_workflow: Optional[AutomationWorkflow] = None,
timeout_seconds: Optional[int] = THREE_MIN,
) -> TestConnectionResult: ) -> TestConnectionResult:
""" """
Test connection. This can be executed either as part Test connection. This can be executed either as part
@ -55,5 +53,4 @@ def test_connection(
test_fn=test_fn, test_fn=test_fn,
service_type=service_connection.type.value, service_type=service_connection.type.value,
automation_workflow=automation_workflow, automation_workflow=automation_workflow,
timeout_seconds=timeout_seconds,
) )

View File

@ -8,7 +8,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
"""Mstr source module""" """MicroStrategy source module"""
import traceback import traceback
from typing import Iterable, List, Optional 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.data.createDashboard import CreateDashboardRequest
from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest
from metadata.generated.schema.entity.data.chart import Chart from metadata.generated.schema.entity.data.chart import Chart
from metadata.generated.schema.entity.services.connections.dashboard.mstrConnection import ( from metadata.generated.schema.entity.services.connections.dashboard.microStrategyConnection import (
MstrConnection, MicroStrategyConnection,
) )
from metadata.generated.schema.entity.services.ingestionPipelines.status import ( from metadata.generated.schema.entity.services.ingestionPipelines.status import (
StackTraceError, StackTraceError,
@ -34,7 +34,7 @@ from metadata.ingestion.api.models import Either
from metadata.ingestion.api.steps import InvalidSourceException from metadata.ingestion.api.steps import InvalidSourceException
from metadata.ingestion.ometa.ometa_api import OpenMetadata from metadata.ingestion.ometa.ometa_api import OpenMetadata
from metadata.ingestion.source.dashboard.dashboard_service import DashboardServiceSource 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, MstrDashboard,
MstrDashboardDetails, MstrDashboardDetails,
MstrPage, MstrPage,
@ -47,9 +47,9 @@ from metadata.utils.logger import ingestion_logger
logger = ingestion_logger() logger = ingestion_logger()
class MstrSource(DashboardServiceSource): class MicrostrategySource(DashboardServiceSource):
""" """
MSTR Source Class Microstrategy Source Class
""" """
@classmethod @classmethod
@ -60,10 +60,10 @@ class MstrSource(DashboardServiceSource):
pipeline_name: Optional[str] = None, pipeline_name: Optional[str] = None,
): ):
config = WorkflowSource.model_validate(config_dict) config = WorkflowSource.model_validate(config_dict)
connection: MstrConnection = config.serviceConnection.root.config connection: MicroStrategyConnection = config.serviceConnection.root.config
if not isinstance(connection, MstrConnection): if not isinstance(connection, MicroStrategyConnection):
raise InvalidSourceException( raise InvalidSourceException(
f"Expected MstrConnection, but got {connection}" f"Expected MicroStrategyConnection, but got {connection}"
) )
return cls(config, metadata) return cls(config, metadata)
@ -75,14 +75,18 @@ class MstrSource(DashboardServiceSource):
if self.client.is_project_name(): if self.client.is_project_name():
project = self.client.get_project_by_name() project = self.client.get_project_by_name()
dashboards.extend(self.client.get_dashboards_list(project.id, project.name)) if project:
if not self.client.is_project_name():
for project in self.client.get_projects_list():
dashboards.extend( dashboards.extend(
self.client.get_dashboards_list(project.id, project.name) 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 return dashboards
def get_dashboard_name(self, dashboard: MstrDashboard) -> str: def get_dashboard_name(self, dashboard: MstrDashboard) -> str:
@ -121,7 +125,7 @@ class MstrSource(DashboardServiceSource):
if dashboard_details: if dashboard_details:
try: try:
dashboard_url = ( 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}" f"{dashboard_details.projectId}/{dashboard_details.id}"
) )
dashboard_request = CreateDashboardRequest( dashboard_request = CreateDashboardRequest(

View File

@ -9,7 +9,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
""" """
MSTR Models MicroStrategy Models
""" """
from datetime import datetime from datetime import datetime
from typing import Any, List, Optional from typing import Any, List, Optional

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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. 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 ## Metadata Ingestion
{% partial {% partial
@ -41,16 +51,18 @@ To integrate MicroStrategy, ensure you are using OpenMetadata version 1.2.x or h
#### Connection Details #### 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 %} {% /extraContent %}
{% partial file="/v1.5/connectors/test-connection.md" /%} {% partial file="/v1.5/connectors/test-connection.md" /%}

View File

@ -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: To run the MicroStrategy ingestion, you will need to install:
```bash ```bash
pip3 install "openmetadata-ingestion[mstr]" pip3 install "openmetadata-ingestion[microstrategy]"
``` ```
## Metadata Ingestion ## Metadata Ingestion
@ -59,27 +59,34 @@ This is a sample config for MicroStrategy:
{% codeInfo srNumber=1 %} {% 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 %}
{% codeInfo srNumber=2 %} {% 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 %}
{% codeInfo srNumber=3 %} {% 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 %}
{% codeInfo srNumber=4 %} {% 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 %} {% /codeInfo %}
@ -95,11 +102,11 @@ For example, you might set it to https://org.mstr.com:3000.
```yaml {% isCodeBlock=true %} ```yaml {% isCodeBlock=true %}
source: source:
type: mstr type: microstrategy
serviceName: local_Mstr serviceName: local_Mstr
serviceConnection: serviceConnection:
config: config:
type: Mstr type: MicroStrategy
``` ```
```yaml {% srNumber=1 %} ```yaml {% srNumber=1 %}
username: username username: username
@ -113,6 +120,9 @@ source:
```yaml {% srNumber=4 %} ```yaml {% srNumber=4 %}
projectName: project projectName: project
``` ```
```yaml {% srNumber=5 %}
loginMode: "1"
```
{% partial file="/v1.5/connectors/yaml/dashboard/source-config.md" /%} {% partial file="/v1.5/connectors/yaml/dashboard/source-config.md" /%}

View File

@ -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. 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 ## Metadata Ingestion
{% partial {% partial
@ -41,15 +51,18 @@ To integrate MicroStrategy, ensure you are using OpenMetadata version 1.2.x or h
#### Connection Details #### 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 %} {% /extraContent %}

View File

@ -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: To run the MicroStrategy ingestion, you will need to install:
```bash ```bash
pip3 install "openmetadata-ingestion[mstr]" pip3 install "openmetadata-ingestion[microstrategy]"
``` ```
## Metadata Ingestion ## Metadata Ingestion
@ -59,27 +59,34 @@ This is a sample config for MicroStrategy:
{% codeInfo srNumber=1 %} {% 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 %}
{% codeInfo srNumber=2 %} {% 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 %}
{% codeInfo srNumber=3 %} {% 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 %}
{% codeInfo srNumber=4 %} {% 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 %} {% /codeInfo %}
@ -95,11 +102,11 @@ For example, you might set it to https://org.mstr.com:3000.
```yaml {% isCodeBlock=true %} ```yaml {% isCodeBlock=true %}
source: source:
type: mstr type: microstrategy
serviceName: local_Mstr serviceName: local_Mstr
serviceConnection: serviceConnection:
config: config:
type: Mstr type: MicroStrategy
``` ```
```yaml {% srNumber=1 %} ```yaml {% srNumber=1 %}
username: username username: username
@ -113,6 +120,9 @@ source:
```yaml {% srNumber=4 %} ```yaml {% srNumber=4 %}
projectName: project projectName: project
``` ```
```yaml {% srNumber=5 %}
loginMode: "1"
```
{% partial file="/v1.6/connectors/yaml/dashboard/source-config.md" /%} {% partial file="/v1.6/connectors/yaml/dashboard/source-config.md" /%}

View File

@ -1,6 +1,6 @@
{ {
"name": "Mstr", "name": "MicroStrategy",
"displayName": "Mstr Test Connection", "displayName": "MicroStrategy Test Connection",
"description": "This Test Connection validates the access against the server and basic metadata extraction of dashboards and charts.", "description": "This Test Connection validates the access against the server and basic metadata extraction of dashboards and charts.",
"steps": [ "steps": [
{ {

View File

@ -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"]
}

View File

@ -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"]
}

View File

@ -28,7 +28,7 @@
"QuickSight", "QuickSight",
"QlikSense", "QlikSense",
"Lightdash", "Lightdash",
"Mstr", "MicroStrategy",
"QlikCloud", "QlikCloud",
"Sigma" "Sigma"
], ],
@ -73,7 +73,7 @@
"name": "Lightdash" "name": "Lightdash"
}, },
{ {
"name": "Mstr" "name": "MicroStrategy"
}, },
{ {
"name": "QlikCloud" "name": "QlikCloud"
@ -134,7 +134,7 @@
"$ref": "./connections/dashboard/lightdashConnection.json" "$ref": "./connections/dashboard/lightdashConnection.json"
}, },
{ {
"$ref": "./connections/dashboard/mstrConnection.json" "$ref": "./connections/dashboard/microStrategyConnection.json"
}, },
{ {
"$ref": "./connections/dashboard/qlikCloudConnection.json" "$ref": "./connections/dashboard/qlikCloudConnection.json"

View File

@ -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`.
$$

View File

@ -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`.
$$

View File

@ -0,0 +1,11 @@
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1556 1556" width="1556" height="1556">
<title>microstrategy-m-icon-circle-svg</title>
<style>
.s0 { fill: #d9232e }
.s1 { fill: #ffffff }
</style>
<path id="Layer" class="s0" d="m777.6 1555.9c-430 0-777.5-347.5-777.5-777.5 0-429.9 347.5-777.5 777.5-777.5 429.9 0 777.5 347.6 777.5 777.5 0 430-347.6 777.5-777.5 777.5z"/>
<path id="Layer" fill-rule="evenodd" class="s1" d="m971.2 473.7l195.3 193.9v415.5h-195.3z"/>
<path id="Layer" fill-rule="evenodd" class="s1" d="m679.9 473.7h195.3v609.4h-195.3z"/>
<path id="Layer" fill-rule="evenodd" class="s1" d="m388.7 473.7h195.3v609.4h-195.3z"/>
</svg>

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

View File

@ -52,11 +52,11 @@ import lightDash from '../assets/img/service-icon-lightdash.png';
import looker from '../assets/img/service-icon-looker.png'; import looker from '../assets/img/service-icon-looker.png';
import mariadb from '../assets/img/service-icon-mariadb.png'; import mariadb from '../assets/img/service-icon-mariadb.png';
import metabase from '../assets/img/service-icon-metabase.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 mode from '../assets/img/service-icon-mode.png';
import mongodb from '../assets/img/service-icon-mongodb.png'; import mongodb from '../assets/img/service-icon-mongodb.png';
import msAzure from '../assets/img/service-icon-ms-azure.png'; import msAzure from '../assets/img/service-icon-ms-azure.png';
import mssql from '../assets/img/service-icon-mssql.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 nifi from '../assets/img/service-icon-nifi.png';
import openlineage from '../assets/img/service-icon-openlineage.svg'; import openlineage from '../assets/img/service-icon-openlineage.svg';
import oracle from '../assets/img/service-icon-oracle.png'; import oracle from '../assets/img/service-icon-oracle.png';
@ -153,7 +153,7 @@ export const REDPANDA = redpanda;
export const SUPERSET = superset; export const SUPERSET = superset;
export const SYNAPSE = synapse; export const SYNAPSE = synapse;
export const LOOKER = looker; export const LOOKER = looker;
export const MSTR = mstr; export const MICROSTRATEGY = microstrategy;
export const TABLEAU = tableau; export const TABLEAU = tableau;
export const REDASH = redash; export const REDASH = redash;
export const METABASE = metabase; export const METABASE = metabase;

View File

@ -56,7 +56,6 @@
"aggregate": "एकूण", "aggregate": "एकूण",
"airflow-config-plural": "एअरफ्लो संरचना", "airflow-config-plural": "एअरफ्लो संरचना",
"alert": "सूचना", "alert": "सूचना",
"alert-details": "Alert Details",
"alert-lowercase": "सूचना", "alert-lowercase": "सूचना",
"alert-lowercase-plural": "सूचना", "alert-lowercase-plural": "सूचना",
"alert-plural": "सूचना", "alert-plural": "सूचना",

View File

@ -22,8 +22,8 @@ import domoDashboardConnection from '../jsons/connectionSchemas/connections/dash
import lightdashConnection from '../jsons/connectionSchemas/connections/dashboard/lightdashConnection.json'; import lightdashConnection from '../jsons/connectionSchemas/connections/dashboard/lightdashConnection.json';
import lookerConnection from '../jsons/connectionSchemas/connections/dashboard/lookerConnection.json'; import lookerConnection from '../jsons/connectionSchemas/connections/dashboard/lookerConnection.json';
import metabaseConnection from '../jsons/connectionSchemas/connections/dashboard/metabaseConnection.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 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 powerBIConnection from '../jsons/connectionSchemas/connections/dashboard/powerBIConnection.json';
import qlikcloudConnection from '../jsons/connectionSchemas/connections/dashboard/qlikCloudConnection.json'; import qlikcloudConnection from '../jsons/connectionSchemas/connections/dashboard/qlikCloudConnection.json';
import qliksenseConnection from '../jsons/connectionSchemas/connections/dashboard/qlikSenseConnection.json'; import qliksenseConnection from '../jsons/connectionSchemas/connections/dashboard/qlikSenseConnection.json';
@ -118,8 +118,8 @@ export const getDashboardConfig = (type: DashboardServiceType) => {
break; break;
} }
case DashboardServiceType.Mstr: { case DashboardServiceType.MicroStrategy: {
schema = mstrConnection; schema = microStrategyConnection;
break; break;
} }

View File

@ -58,6 +58,7 @@ import {
LOOKER, LOOKER,
MARIADB, MARIADB,
METABASE, METABASE,
MICROSTRATEGY,
MLFLOW, MLFLOW,
ML_MODEL_DEFAULT, ML_MODEL_DEFAULT,
MODE, MODE,
@ -376,6 +377,7 @@ class ServiceUtilClassBase {
case this.DashboardServiceTypeSmallCase.CustomDashboard: case this.DashboardServiceTypeSmallCase.CustomDashboard:
return DASHBOARD_DEFAULT; return DASHBOARD_DEFAULT;
case this.DashboardServiceTypeSmallCase.Superset: case this.DashboardServiceTypeSmallCase.Superset:
return SUPERSET; return SUPERSET;
@ -468,6 +470,7 @@ class ServiceUtilClassBase {
case this.MlModelServiceTypeSmallCase.Sklearn: case this.MlModelServiceTypeSmallCase.Sklearn:
return SCIKIT; return SCIKIT;
case this.MlModelServiceTypeSmallCase.SageMaker: case this.MlModelServiceTypeSmallCase.SageMaker:
return SAGEMAKER; return SAGEMAKER;
@ -504,6 +507,9 @@ class ServiceUtilClassBase {
case this.ApiServiceTypeSmallCase.REST: case this.ApiServiceTypeSmallCase.REST:
return REST_SERVICE; return REST_SERVICE;
case this.DashboardServiceTypeSmallCase.MicroStrategy:
return MICROSTRATEGY;
default: { default: {
let logo; let logo;
if (serviceTypes.messagingServices.includes(type)) { if (serviceTypes.messagingServices.includes(type)) {