@dataroadinc/setup-auth
Version:
CLI tool and programmatic API for automated OAuth setup across cloud platforms
89 lines (88 loc) • 3.96 kB
JavaScript
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);
}
}