From 2ca34099ed5a021c334e7f3ed8aaaea09837e661 Mon Sep 17 00:00:00 2001 From: Vladyslav Matsiiako Date: Thu, 3 Oct 2024 16:21:47 -0700 Subject: [PATCH] added custom instance URLs to databricks --- .../integration-auth/integration-list.ts | 11 ++++++++++ .../integration-sync-secret.ts | 11 +++++++--- docs/integrations/cloud/databricks.mdx | 2 +- .../integrations/databricks/authorize.tsx | 20 +++++++++++++++++-- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/backend/src/services/integration-auth/integration-list.ts b/backend/src/services/integration-auth/integration-list.ts index b91654474..6c276efcd 100644 --- a/backend/src/services/integration-auth/integration-list.ts +++ b/backend/src/services/integration-auth/integration-list.ts @@ -15,6 +15,7 @@ export enum Integrations { FLYIO = "flyio", LARAVELFORGE = "laravel-forge", CIRCLECI = "circleci", + DATABRICKS = "databricks", TRAVISCI = "travisci", TEAMCITY = "teamcity", SUPABASE = "supabase", @@ -73,6 +74,7 @@ export enum IntegrationUrls { RAILWAY_API_URL = "https://backboard.railway.app/graphql/v2", FLYIO_API_URL = "https://api.fly.io/graphql", CIRCLECI_API_URL = "https://circleci.com/api", + DATABRICKS_API_URL = "https:/dbc-5e0185c0-20ac.cloud.databricks.com/api", TRAVISCI_API_URL = "https://api.travis-ci.com", SUPABASE_API_URL = "https://api.supabase.com", LARAVELFORGE_API_URL = "https://forge.laravel.com", @@ -210,6 +212,15 @@ export const getIntegrationOptions = async () => { clientId: "", docsLink: "" }, + { + name: "Databricks", + slug: "databricks", + image: "Databricks.png", + isAvailable: true, + type: "pat", + clientId: "", + docsLink: "" + }, { name: "GitLab", slug: "gitlab", diff --git a/backend/src/services/integration-auth/integration-sync-secret.ts b/backend/src/services/integration-auth/integration-sync-secret.ts index a335bce4e..c9711c7df 100644 --- a/backend/src/services/integration-auth/integration-sync-secret.ts +++ b/backend/src/services/integration-auth/integration-sync-secret.ts @@ -2090,18 +2090,22 @@ const syncSecretsCircleCI = async ({ */ const syncSecretsDatabricks = async ({ integration, + integrationAuth, secrets, accessToken }: { integration: TIntegrations; + integrationAuth: TIntegrationAuths; secrets: Record; accessToken: string; }) => { + const databricksApiUrl = `${integrationAuth.url}/api`; + // sync secrets to Databricks await Promise.all( Object.keys(secrets).map(async (key) => request.post( - `${IntegrationUrls.DATABRICKS_API_URL}/2.0/secrets/put`, + `${databricksApiUrl}/2.0/secrets/put`, { scope: integration.app, key, @@ -2120,7 +2124,7 @@ const syncSecretsDatabricks = async ({ // get secrets from Databricks const getSecretsRes = ( await request.get<{ secrets: { key: string; last_updated_timestamp: number }[] }>( - `${IntegrationUrls.DATABRICKS_API_URL}/2.0/secrets/list`, + `${databricksApiUrl}/2.0/secrets/list`, { headers: { Authorization: `Bearer ${accessToken}`, @@ -2138,7 +2142,7 @@ const syncSecretsDatabricks = async ({ getSecretsRes.map(async (sec) => { if (!(sec.key in secrets)) { return request.post( - `${IntegrationUrls.DATABRICKS_API_URL}/2.0/secrets/delete`, + `${databricksApiUrl}/2.0/secrets/delete`, { scope: integration.app, key: sec.key @@ -4094,6 +4098,7 @@ export const syncIntegrationSecrets = async ({ case Integrations.DATABRICKS: await syncSecretsDatabricks({ integration, + integrationAuth, secrets, accessToken }); diff --git a/docs/integrations/cloud/databricks.mdx b/docs/integrations/cloud/databricks.mdx index f4597f272..cd9120131 100644 --- a/docs/integrations/cloud/databricks.mdx +++ b/docs/integrations/cloud/databricks.mdx @@ -17,7 +17,7 @@ Prerequisites: ![integrations](../../images/integrations.png) - Press on the Databricks tile and input your Databricks Access Token to grant Infisical the necessary permissions in your Databricks account. + Press on the Databricks tile and enter your Databricks instance URL in the followung format: `https://xxx.cloud.databricks.com`. Then, input your Databricks Access Token to grant Infisical the necessary permissions in your Databricks account. ![integrations databricks authorization](../../images/integrations/databricks/integrations-databricks-auth.png) diff --git a/frontend/src/pages/integrations/databricks/authorize.tsx b/frontend/src/pages/integrations/databricks/authorize.tsx index 1c0e1c7f5..a2b179f9a 100644 --- a/frontend/src/pages/integrations/databricks/authorize.tsx +++ b/frontend/src/pages/integrations/databricks/authorize.tsx @@ -15,22 +15,30 @@ export default function DatabricksCreateIntegrationPage() { const { mutateAsync } = useSaveIntegrationAccessToken(); const [apiKey, setApiKey] = useState(""); + const [instanceURL, setInstanceURL] = useState(""); const [apiKeyErrorText, setApiKeyErrorText] = useState(""); + const [instanceURLErrorText, setInstanceURLErrorText] = useState(""); const [isLoading, setIsLoading] = useState(false); const handleButtonClick = async () => { try { setApiKeyErrorText(""); + setInstanceURLErrorText(""); if (apiKey.length === 0) { setApiKeyErrorText("API Key cannot be blank"); return; } + if (instanceURL.length === 0) { + setInstanceURLErrorText("Instance URL cannot be blank"); + return; + } setIsLoading(true); const integrationAuth = await mutateAsync({ workspaceId: localStorage.getItem("projectData.id"), integration: "databricks", + url: instanceURL, accessToken: apiKey }); @@ -78,12 +86,20 @@ export default function DatabricksCreateIntegrationPage() { + setInstanceURL(e.target.value)} placeholder="https://xxxx.cloud.databricks.com" /> + + - setApiKey(e.target.value)} /> + setApiKey(e.target.value)} type="password" />