Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
340 changes: 315 additions & 25 deletions INTEGRATIONS_CREDENTIALS.md

Large diffs are not rendered by default.

9 changes: 8 additions & 1 deletion cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,19 @@
],
"language": "en",
"words": [
"alloydb",
"blockgroup",
"channeldef",
"clickhouse",
"dataframe",
"datascience",
"deepnote",
"deepnoteserver",
"dntk",
"dont",
"DONT",
"dremio",
"Dremio",
"duckdb",
"ename",
"evalue",
Expand All @@ -42,6 +46,7 @@
"jupyterlab",
"JVSC",
"millis",
"mindsdb",
"nbformat",
"nbinsx",
"numpy",
Expand All @@ -53,12 +58,14 @@
"Reselecting",
"taskkill",
"toolsai",
"trino",
"Trino",
"unconfigured",
"Unconfigured",
"unittests",
"vegalite",
"venv",
"venv's",
"venv",
"Venv",
"venvs",
"vscode",
Expand Down
207 changes: 207 additions & 0 deletions src/messageTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,21 @@ export type LocalizedMessages = {
integrationsPostgresTypeLabel: string;
integrationsBigQueryTypeLabel: string;
integrationsSnowflakeTypeLabel: string;
integrationsAlloyDBTypeLabel: string;
integrationsAthenaTypeLabel: string;
integrationsClickHouseTypeLabel: string;
integrationsDatabricksTypeLabel: string;
integrationsDremioTypeLabel: string;
integrationsMariaDBTypeLabel: string;
integrationsMaterializeTypeLabel: string;
integrationsMindsDBTypeLabel: string;
integrationsMongoDBTypeLabel: string;
integrationsMySQLTypeLabel: string;
integrationsDuckDBTypeLabel: string;
integrationsRedshiftTypeLabel: string;
integrationsSpannerTypeLabel: string;
integrationsSQLServerTypeLabel: string;
integrationsTrinoTypeLabel: string;
// PostgreSQL form strings
integrationsPostgresNameLabel: string;
integrationsPostgresNamePlaceholder: string;
Expand Down Expand Up @@ -231,6 +246,198 @@ export type LocalizedMessages = {
integrationsSnowflakeRolePlaceholder: string;
integrationsSnowflakeWarehouseLabel: string;
integrationsSnowflakeWarehousePlaceholder: string;
// MySQL form strings
integrationsMySQLNameLabel: string;
integrationsMySQLNamePlaceholder: string;
integrationsMySQLHostLabel: string;
integrationsMySQLHostPlaceholder: string;
integrationsMySQLPortLabel: string;
integrationsMySQLDatabaseLabel: string;
integrationsMySQLDatabasePlaceholder: string;
integrationsMySQLUsernameLabel: string;
integrationsMySQLUsernamePlaceholder: string;
integrationsMySQLPasswordLabel: string;
integrationsMySQLPasswordPlaceholder: string;
// MariaDB form strings
integrationsMariaDBNameLabel: string;
integrationsMariaDBNamePlaceholder: string;
integrationsMariaDBHostLabel: string;
integrationsMariaDBHostPlaceholder: string;
integrationsMariaDBPortLabel: string;
integrationsMariaDBDatabaseLabel: string;
integrationsMariaDBDatabasePlaceholder: string;
integrationsMariaDBUsernameLabel: string;
integrationsMariaDBUsernamePlaceholder: string;
integrationsMariaDBPasswordLabel: string;
integrationsMariaDBPasswordPlaceholder: string;
// Athena form strings
integrationsAthenaNameLabel: string;
integrationsAthenaNamePlaceholder: string;
integrationsAthenaAccessKeyIdLabel: string;
integrationsAthenaAccessKeyIdPlaceholder: string;
integrationsAthenaSecretAccessKeyLabel: string;
integrationsAthenaSecretAccessKeyPlaceholder: string;
integrationsAthenaRegionLabel: string;
integrationsAthenaRegionPlaceholder: string;
integrationsAthenaS3OutputPathLabel: string;
integrationsAthenaS3OutputPathPlaceholder: string;
integrationsAthenaWorkgroupLabel: string;
integrationsAthenaWorkgroupPlaceholder: string;
// Databricks form strings
integrationsDatabricksNameLabel: string;
integrationsDatabricksNamePlaceholder: string;
integrationsDatabricksHostLabel: string;
integrationsDatabricksHostPlaceholder: string;
integrationsDatabricksHttpPathLabel: string;
integrationsDatabricksHttpPathPlaceholder: string;
integrationsDatabricksTokenLabel: string;
integrationsDatabricksTokenPlaceholder: string;
integrationsDatabricksPortLabel: string;
integrationsDatabricksCatalogLabel: string;
integrationsDatabricksCatalogPlaceholder: string;
integrationsDatabricksSchemaLabel: string;
integrationsDatabricksSchemaPlaceholder: string;
// Dremio form strings
integrationsDremioNameLabel: string;
integrationsDremioNamePlaceholder: string;
integrationsDremioHostLabel: string;
integrationsDremioHostPlaceholder: string;
integrationsDremioPortLabel: string;
integrationsDremioSchemaLabel: string;
integrationsDremioSchemaPlaceholder: string;
integrationsDremioTokenLabel: string;
integrationsDremioTokenPlaceholder: string;
// MongoDB form strings
integrationsMongoDBNameLabel: string;
integrationsMongoDBNamePlaceholder: string;
integrationsMongoDBConnectionStringLabel: string;
integrationsMongoDBConnectionStringPlaceholder: string;
integrationsMongoDBConnectionStringHelp: string;
integrationsMongoDBOptionalFieldsNote: string;
integrationsMongoDBRawConnectionStringLabel: string;
integrationsMongoDBPrefixLabel: string;
integrationsMongoDBHostLabel: string;
integrationsMongoDBPortLabel: string;
integrationsMongoDBUserLabel: string;
integrationsMongoDBPasswordLabel: string;
integrationsMongoDBDatabaseLabel: string;
integrationsMongoDBOptionsLabel: string;
// Redshift form strings
integrationsRedshiftNameLabel: string;
integrationsRedshiftNamePlaceholder: string;
integrationsRedshiftAuthMethodLabel: string;
integrationsRedshiftAuthMethodUsernamePassword: string;
integrationsRedshiftAuthMethodIndividualCredentials: string;
integrationsRedshiftAuthMethodHelp: string;
integrationsRedshiftHostLabel: string;
integrationsRedshiftHostPlaceholder: string;
integrationsRedshiftPortLabel: string;
integrationsRedshiftDatabaseLabel: string;
integrationsRedshiftDatabasePlaceholder: string;
integrationsRedshiftUsernameLabel: string;
integrationsRedshiftUsernamePlaceholder: string;
integrationsRedshiftPasswordLabel: string;
integrationsRedshiftPasswordPlaceholder: string;
// Spanner form strings
integrationsSpannerNameLabel: string;
integrationsSpannerNamePlaceholder: string;
integrationsSpannerInstanceLabel: string;
integrationsSpannerInstancePlaceholder: string;
integrationsSpannerDatabaseLabel: string;
integrationsSpannerDatabasePlaceholder: string;
integrationsSpannerServiceAccountLabel: string;
integrationsSpannerServiceAccountPlaceholder: string;
integrationsSpannerServiceAccountHelp: string;
integrationsSpannerServiceAccountInvalidJson: string;
integrationsSpannerDataBoostLabel: string;
integrationsSpannerDataBoostHelp: string;
// AlloyDB form strings
integrationsAlloyDBNameLabel: string;
integrationsAlloyDBNamePlaceholder: string;
integrationsAlloyDBHostLabel: string;
integrationsAlloyDBHostPlaceholder: string;
integrationsAlloyDBPortLabel: string;
integrationsAlloyDBDatabaseLabel: string;
integrationsAlloyDBDatabasePlaceholder: string;
integrationsAlloyDBUsernameLabel: string;
integrationsAlloyDBUsernamePlaceholder: string;
integrationsAlloyDBPasswordLabel: string;
integrationsAlloyDBPasswordPlaceholder: string;
// ClickHouse form strings
integrationsClickHouseNameLabel: string;
integrationsClickHouseNamePlaceholder: string;
integrationsClickHouseHostLabel: string;
integrationsClickHouseHostPlaceholder: string;
integrationsClickHousePortLabel: string;
integrationsClickHouseDatabaseLabel: string;
integrationsClickHouseDatabasePlaceholder: string;
integrationsClickHouseUsernameLabel: string;
integrationsClickHouseUsernamePlaceholder: string;
integrationsClickHousePasswordLabel: string;
integrationsClickHousePasswordPlaceholder: string;
// Materialize form strings
integrationsMaterializeNameLabel: string;
integrationsMaterializeNamePlaceholder: string;
integrationsMaterializeHostLabel: string;
integrationsMaterializeHostPlaceholder: string;
integrationsMaterializePortLabel: string;
integrationsMaterializeDatabaseLabel: string;
integrationsMaterializeDatabasePlaceholder: string;
integrationsMaterializeClusterLabel: string;
integrationsMaterializeClusterPlaceholder: string;
integrationsMaterializeUsernameLabel: string;
integrationsMaterializeUsernamePlaceholder: string;
integrationsMaterializePasswordLabel: string;
integrationsMaterializePasswordPlaceholder: string;
// MindsDB form strings
integrationsMindsDBNameLabel: string;
integrationsMindsDBNamePlaceholder: string;
integrationsMindsDBHostLabel: string;
integrationsMindsDBHostPlaceholder: string;
integrationsMindsDBPortLabel: string;
integrationsMindsDBDatabaseLabel: string;
integrationsMindsDBDatabasePlaceholder: string;
integrationsMindsDBUsernameLabel: string;
integrationsMindsDBUsernamePlaceholder: string;
integrationsMindsDBPasswordLabel: string;
integrationsMindsDBPasswordPlaceholder: string;
// SQL Server form strings
integrationsSQLServerNameLabel: string;
integrationsSQLServerNamePlaceholder: string;
integrationsSQLServerHostLabel: string;
integrationsSQLServerHostPlaceholder: string;
integrationsSQLServerPortLabel: string;
integrationsSQLServerDatabaseLabel: string;
integrationsSQLServerDatabasePlaceholder: string;
integrationsSQLServerUsernameLabel: string;
integrationsSQLServerUsernamePlaceholder: string;
integrationsSQLServerPasswordLabel: string;
integrationsSQLServerPasswordPlaceholder: string;
// Trino form strings
integrationsTrinoNameLabel: string;
integrationsTrinoNamePlaceholder: string;
integrationsTrinoHostLabel: string;
integrationsTrinoHostPlaceholder: string;
integrationsTrinoPortLabel: string;
integrationsTrinoDatabaseLabel: string;
integrationsTrinoDatabasePlaceholder: string;
integrationsTrinoUsernameLabel: string;
integrationsTrinoUsernamePlaceholder: string;
integrationsTrinoPasswordLabel: string;
integrationsTrinoPasswordPlaceholder: string;
// SSH options strings
integrationsSshEnabled: string;
integrationsSshHost: string;
integrationsSshHostPlaceholder: string;
integrationsSshPort: string;
integrationsSshUser: string;
integrationsSshUserPlaceholder: string;
// SSL/CA certificate strings
integrationsSslEnabled: string;
integrationsCaCertificateName: string;
integrationsCaCertificateNamePlaceholder: string;
integrationsCaCertificateText: string;
integrationsCaCertificateTextPlaceholder: string;
// Common form strings
integrationsRequiredField: string;
integrationsOptionalField: string;
Expand Down
9 changes: 5 additions & 4 deletions src/notebooks/deepnote/deepnoteNotebookManager.unit.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import * as assert from 'assert';

import { DeepnoteNotebookManager } from './deepnoteNotebookManager';
import type { DeepnoteProject } from '../../platform/deepnote/deepnoteTypes';
import { ProjectIntegration } from '../types';

suite('DeepnoteNotebookManager', () => {
let manager: DeepnoteNotebookManager;
Expand Down Expand Up @@ -187,7 +188,7 @@ suite('DeepnoteNotebookManager', () => {
test('should update integrations list for existing project and return true', () => {
manager.storeOriginalProject('project-123', mockProject, 'notebook-456');

const integrations = [
const integrations: ProjectIntegration[] = [
{ id: 'int-1', name: 'PostgreSQL', type: 'pgsql' },
{ id: 'int-2', name: 'BigQuery', type: 'big-query' }
];
Expand All @@ -211,7 +212,7 @@ suite('DeepnoteNotebookManager', () => {

manager.storeOriginalProject('project-123', projectWithIntegrations, 'notebook-456');

const newIntegrations = [
const newIntegrations: ProjectIntegration[] = [
{ id: 'new-int-1', name: 'New Integration 1', type: 'pgsql' },
{ id: 'new-int-2', name: 'New Integration 2', type: 'big-query' }
];
Expand Down Expand Up @@ -257,7 +258,7 @@ suite('DeepnoteNotebookManager', () => {
test('should preserve other project properties and return true', () => {
manager.storeOriginalProject('project-123', mockProject, 'notebook-456');

const integrations = [{ id: 'int-1', name: 'PostgreSQL', type: 'pgsql' }];
const integrations: ProjectIntegration[] = [{ id: 'int-1', name: 'PostgreSQL', type: 'pgsql' }];

const result = manager.updateProjectIntegrations('project-123', integrations);

Expand All @@ -275,7 +276,7 @@ suite('DeepnoteNotebookManager', () => {
manager.storeOriginalProject('project-123', mockProject, 'notebook-456');
manager.updateCurrentNotebookId('project-123', undefined as any);

const integrations = [
const integrations: ProjectIntegration[] = [
{ id: 'int-1', name: 'PostgreSQL', type: 'pgsql' },
{ id: 'int-2', name: 'BigQuery', type: 'big-query' }
];
Expand Down
15 changes: 11 additions & 4 deletions src/notebooks/deepnote/integrations/integrationDetector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@ import { inject, injectable } from 'inversify';

import { logger } from '../../../platform/logging';
import { IDeepnoteNotebookManager } from '../../types';
import { IntegrationStatus, IntegrationWithStatus } from '../../../platform/notebooks/deepnote/integrationTypes';
import {
ConfigurableDatabaseIntegrationType,
IntegrationStatus,
IntegrationWithStatus
} from '../../../platform/notebooks/deepnote/integrationTypes';
import { IIntegrationDetector, IIntegrationStorage } from './types';
import { DatabaseIntegrationType, databaseIntegrationTypes } from '@deepnote/database-integrations';
import { databaseIntegrationTypes } from '@deepnote/database-integrations';

/**
* Service for detecting integrations used in Deepnote notebooks
Expand Down Expand Up @@ -41,7 +45,10 @@ export class IntegrationDetector implements IIntegrationDetector {
for (const projectIntegration of projectIntegrations) {
const integrationId = projectIntegration.id;
const integrationType = projectIntegration.type;
if (!(databaseIntegrationTypes as readonly string[]).includes(integrationType)) {
if (
!(databaseIntegrationTypes as readonly string[]).includes(integrationType) ||
integrationType === 'pandas-dataframe'
) {
logger.debug(`IntegrationDetector: Skipping unsupported integration type: ${integrationType}`);
continue;
}
Expand All @@ -53,7 +60,7 @@ export class IntegrationDetector implements IIntegrationDetector {
status: config ? IntegrationStatus.Connected : IntegrationStatus.Disconnected,
// Include integration metadata from project for prefilling when config is null
integrationName: projectIntegration.name,
integrationType: integrationType as DatabaseIntegrationType
integrationType: integrationType as ConfigurableDatabaseIntegrationType
};

integrations.set(integrationId, status);
Expand Down
16 changes: 10 additions & 6 deletions src/notebooks/deepnote/integrations/integrationManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -161,12 +161,16 @@ export class IntegrationManager implements IIntegrationManager {
integrationType = projectIntegration.type as DatabaseIntegrationType;
}

integrations.set(selectedIntegrationId, {
config: config || null,
status: config ? IntegrationStatus.Connected : IntegrationStatus.Disconnected,
integrationName,
integrationType
});
if (integrationType === 'pandas-dataframe') {
logger.debug(`IntegrationManager: Skipping internal DuckDB integration ${selectedIntegrationId}`);
} else {
integrations.set(selectedIntegrationId, {
config: config || null,
status: config ? IntegrationStatus.Connected : IntegrationStatus.Disconnected,
integrationName,
integrationType
});
}
}

if (integrations.size === 0) {
Expand Down
Loading