UNPKG

@dataroadinc/setup-auth

Version:

CLI tool and programmatic API for automated OAuth setup across cloud platforms

89 lines (88 loc) 3.96 kB
import { SetupAuthError } from "../../../utils/error.js"; import { gcpSetOauthProjectId } from "./index.js"; export async function gcpCreateProject(projectManager, projectsClient, organizationId, projectId) { try { await _gcpCreateProject(projectManager, projectsClient, organizationId, projectId); } catch (error) { if (error instanceof SetupAuthError) { throw error; } throw new SetupAuthError(`Failed to create GCP project ${projectId}:`, { cause: error, }); } } async function _gcpCreateProject(projectManager, projectsClient, organizationId, projectId) { const exists = await projectManager.projectExists(projectId); if (exists) { return await _gcpUpdateProject(projectManager, organizationId, projectId); } return await _gcpCreateNewProject(projectsClient, organizationId, projectId); } async function _gcpUpdateProject(projectManager, organizationId, projectId) { const isAttached = await projectManager.isAttachedToOrganization(projectId); if (isAttached) { console.log(`✅ Project ${projectId} already exists in organization ${organizationId}`); await gcpSetOauthProjectId({ gcpOauthProjectId: projectId }); return; } console.log(`Project ${projectId} exists but is not attached to organization ${organizationId}`); const migrationSucceeded = await projectManager.migrateProjectToOrganization(projectId); if (migrationSucceeded) { console.log(`✅ Successfully migrated project ${projectId} to organization ${organizationId}`); await gcpSetOauthProjectId({ gcpOauthProjectId: projectId }); return; } console.log(`Migration failed. Deleting and recreating project ${projectId}`); await projectManager.deleteProject(projectId); await new Promise(resolve => setTimeout(resolve, 3000)); } async function _gcpCreateNewProject(projectsClient, organizationId, projectId) { console.log(`Creating new project ${projectId} in organization ${organizationId}`); try { const [operation] = await projectsClient.createProject({ project: { projectId, parent: `organizations/${organizationId}`, }, }); await operation.promise(); console.log(`Created project ${projectId} in organization ${organizationId}`); await gcpSetOauthProjectId({ gcpOauthProjectId: projectId }); } catch (createError) { console.error("Project creation failed with error:", { projectId, organizationId, errorCode: createError?.code, errorStatus: createError?.status, errorName: createError?.name, errorDetails: createError?.details, errorMessage: createError?.message, metadata: createError?.metadata?.internalRepr ? Object.fromEntries(createError.metadata.internalRepr) : undefined, }); const errorParts = []; if (createError?.code) errorParts.push(`Code: ${createError.code}`); if (createError?.status) errorParts.push(`Status: ${createError.status}`); if (createError?.name) errorParts.push(`Type: ${createError.name}`); const errorContext = errorParts.length > 0 ? ` (${errorParts.join(", ")})` : ""; const errorDetails = [ createError?.details, createError?.message, createError?.metadata?.internalRepr ?.get("google.rpc.errorinfo-bin") ?.toString(), createError?.stack?.split("\n")[0], ] .filter(Boolean) .join(". "); throw new SetupAuthError(`Failed to create project ${projectId} in organization ${organizationId}${errorContext}. ` + `Details: ${errorDetails || "No additional error details available"}`, createError); } }