Update launch_progress.js
This commit is contained in:
@@ -1970,184 +1970,7 @@ async function downloadDockerCompose(repo, branch) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add new function to deploy stack
|
// deployStack function moved to improved version below
|
||||||
async function deployStack(dockerComposeContent, stackName, port) {
|
|
||||||
const maxRetries = 30; // 30 retries * 10 seconds = 5 minutes
|
|
||||||
const baseDelay = 10000; // 10 seconds base delay
|
|
||||||
|
|
||||||
try {
|
|
||||||
// First, attempt to deploy the stack
|
|
||||||
const controller = new AbortController();
|
|
||||||
const timeoutId = setTimeout(() => controller.abort(), 10 * 60 * 1000); // 10 minutes timeout
|
|
||||||
|
|
||||||
const response = await fetch('/api/admin/deploy-stack', {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content
|
|
||||||
},
|
|
||||||
body: JSON.stringify({
|
|
||||||
name: `docupulse_${port}`,
|
|
||||||
StackFileContent: dockerComposeContent,
|
|
||||||
Env: [
|
|
||||||
{
|
|
||||||
name: 'PORT',
|
|
||||||
value: port.toString()
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'ISMASTER',
|
|
||||||
value: 'false'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}),
|
|
||||||
signal: controller.signal
|
|
||||||
});
|
|
||||||
|
|
||||||
clearTimeout(timeoutId); // Clear the timeout if the request completes
|
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
const error = await response.json();
|
|
||||||
throw new Error(error.error || 'Failed to deploy stack');
|
|
||||||
}
|
|
||||||
|
|
||||||
const result = await response.json();
|
|
||||||
|
|
||||||
// If deployment was successful, wait for stack to come online
|
|
||||||
if (result.success || result.data) {
|
|
||||||
console.log('Stack deployment initiated, waiting for stack to come online...');
|
|
||||||
|
|
||||||
// Update status to show we're waiting for stack to come online
|
|
||||||
const currentStep = document.querySelector('.step-item.active');
|
|
||||||
if (currentStep) {
|
|
||||||
const statusElement = currentStep.querySelector('.step-status');
|
|
||||||
statusElement.textContent = 'Stack deployed, waiting for services to start...';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait and retry to check if stack is online
|
|
||||||
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
||||||
try {
|
|
||||||
// Check stack status via Portainer API
|
|
||||||
const stackCheckResponse = await fetch('/api/admin/check-stack-status', {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content
|
|
||||||
},
|
|
||||||
body: JSON.stringify({
|
|
||||||
stack_name: `docupulse_${port}`
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
if (stackCheckResponse.ok) {
|
|
||||||
const stackStatus = await stackCheckResponse.json();
|
|
||||||
|
|
||||||
if (stackStatus.success && stackStatus.data.status === 'active') {
|
|
||||||
console.log(`Stack came online successfully on attempt ${attempt}`);
|
|
||||||
|
|
||||||
// Update status to show success
|
|
||||||
if (currentStep) {
|
|
||||||
const statusElement = currentStep.querySelector('.step-status');
|
|
||||||
statusElement.textContent = 'Stack deployed and online successfully';
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
success: true,
|
|
||||||
data: {
|
|
||||||
...result.data || result,
|
|
||||||
status: 'active',
|
|
||||||
attempt: attempt
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If not online yet and this isn't the last attempt, wait and retry
|
|
||||||
if (attempt < maxRetries) {
|
|
||||||
const delay = baseDelay * Math.pow(1.2, attempt - 1); // Exponential backoff
|
|
||||||
|
|
||||||
console.log(`Attempt ${attempt}/${maxRetries}: Stack not yet online. Waiting ${Math.round(delay/1000)}s before retry...`);
|
|
||||||
|
|
||||||
// Update the step description to show retry progress
|
|
||||||
if (currentStep) {
|
|
||||||
const statusElement = currentStep.querySelector('.step-status');
|
|
||||||
statusElement.textContent = `Waiting for stack to come online... (Attempt ${attempt}/${maxRetries})`;
|
|
||||||
}
|
|
||||||
|
|
||||||
await new Promise(resolve => setTimeout(resolve, delay));
|
|
||||||
} else {
|
|
||||||
// Last attempt failed - stack might be online but API check failed
|
|
||||||
console.log(`Stack status check failed after ${maxRetries} attempts, but deployment was successful`);
|
|
||||||
|
|
||||||
// Update status to show partial success
|
|
||||||
if (currentStep) {
|
|
||||||
const statusElement = currentStep.querySelector('.step-status');
|
|
||||||
statusElement.textContent = 'Stack deployed (status check timeout)';
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
success: true,
|
|
||||||
data: {
|
|
||||||
...result.data || result,
|
|
||||||
status: 'deployed',
|
|
||||||
note: 'Status check timeout - stack may be online'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
console.error(`Stack status check attempt ${attempt} failed:`, error);
|
|
||||||
|
|
||||||
if (attempt === maxRetries) {
|
|
||||||
// Last attempt failed, but deployment was successful
|
|
||||||
console.log('Stack status check failed after all attempts, but deployment was successful');
|
|
||||||
|
|
||||||
if (currentStep) {
|
|
||||||
const statusElement = currentStep.querySelector('.step-status');
|
|
||||||
statusElement.textContent = 'Stack deployed (status check failed)';
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
success: true,
|
|
||||||
data: {
|
|
||||||
...result.data || result,
|
|
||||||
status: 'deployed',
|
|
||||||
note: 'Status check failed - stack may be online'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait before retrying on error
|
|
||||||
const delay = baseDelay * Math.pow(1.2, attempt - 1);
|
|
||||||
console.log(`Stack check failed, retrying in ${Math.round(delay/1000)}s...`);
|
|
||||||
|
|
||||||
if (currentStep) {
|
|
||||||
const statusElement = currentStep.querySelector('.step-status');
|
|
||||||
statusElement.textContent = `Stack check failed, retrying... (Attempt ${attempt}/${maxRetries})`;
|
|
||||||
}
|
|
||||||
|
|
||||||
await new Promise(resolve => setTimeout(resolve, delay));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we get here, deployment was successful but we couldn't verify status
|
|
||||||
return {
|
|
||||||
success: true,
|
|
||||||
data: {
|
|
||||||
...result.data || result,
|
|
||||||
status: 'deployed',
|
|
||||||
note: 'Deployment successful, status unknown'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error deploying stack:', error);
|
|
||||||
return {
|
|
||||||
success: false,
|
|
||||||
error: error.message
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add new function to save instance data
|
// Add new function to save instance data
|
||||||
async function saveInstanceData(instanceData) {
|
async function saveInstanceData(instanceData) {
|
||||||
@@ -2667,4 +2490,521 @@ async function sendCompletionEmail(instanceUrl, company, credentials) {
|
|||||||
error: error.message
|
error: error.message
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add new function to check if stack exists
|
||||||
|
async function checkStackExists(stackName) {
|
||||||
|
try {
|
||||||
|
const response = await fetch('/api/admin/check-stack-status', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
stack_name: stackName
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.ok) {
|
||||||
|
const result = await response.json();
|
||||||
|
return {
|
||||||
|
exists: true,
|
||||||
|
status: result.data?.status || 'unknown',
|
||||||
|
data: result.data
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
exists: false,
|
||||||
|
status: 'not_found'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error checking stack existence:', error);
|
||||||
|
return {
|
||||||
|
exists: false,
|
||||||
|
status: 'error',
|
||||||
|
error: error.message
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// deployStack function moved to improved version below
|
||||||
|
|
||||||
|
// Add new function to deploy stack
|
||||||
|
async function deployStack(dockerComposeContent, stackName, port) {
|
||||||
|
const maxRetries = 30; // 30 retries * 10 seconds = 5 minutes
|
||||||
|
const baseDelay = 10000; // 10 seconds base delay
|
||||||
|
|
||||||
|
try {
|
||||||
|
// First, attempt to deploy the stack
|
||||||
|
const controller = new AbortController();
|
||||||
|
const timeoutId = setTimeout(() => controller.abort(), 10 * 60 * 1000); // 10 minutes timeout
|
||||||
|
|
||||||
|
const response = await fetch('/api/admin/deploy-stack', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
name: `docupulse_${port}`,
|
||||||
|
StackFileContent: dockerComposeContent,
|
||||||
|
Env: [
|
||||||
|
{
|
||||||
|
name: 'PORT',
|
||||||
|
value: port.toString()
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'ISMASTER',
|
||||||
|
value: 'false'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}),
|
||||||
|
signal: controller.signal
|
||||||
|
});
|
||||||
|
|
||||||
|
clearTimeout(timeoutId); // Clear the timeout if the request completes
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
const error = await response.json();
|
||||||
|
throw new Error(error.error || 'Failed to deploy stack');
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await response.json();
|
||||||
|
|
||||||
|
// Check if deployment was successful or if stack already exists
|
||||||
|
if (result.success || result.data || result.status === 'existing' || result.status === 'created') {
|
||||||
|
console.log('Stack deployment result:', result);
|
||||||
|
|
||||||
|
// Update status to show we're waiting for stack to come online
|
||||||
|
const currentStep = document.querySelector('.step-item.active');
|
||||||
|
if (currentStep) {
|
||||||
|
const statusElement = currentStep.querySelector('.step-status');
|
||||||
|
statusElement.textContent = 'Stack deployed, waiting for services to start...';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait and retry to check if stack is online
|
||||||
|
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
||||||
|
try {
|
||||||
|
// Check stack status via Portainer API
|
||||||
|
const stackCheckResponse = await fetch('/api/admin/check-stack-status', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
stack_name: `docupulse_${port}`
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
if (stackCheckResponse.ok) {
|
||||||
|
const stackStatus = await stackCheckResponse.json();
|
||||||
|
|
||||||
|
if (stackStatus.success && stackStatus.data.status === 'active') {
|
||||||
|
console.log(`Stack came online successfully on attempt ${attempt}`);
|
||||||
|
|
||||||
|
// Update status to show success
|
||||||
|
if (currentStep) {
|
||||||
|
const statusElement = currentStep.querySelector('.step-status');
|
||||||
|
statusElement.textContent = 'Stack deployed and online successfully';
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
data: {
|
||||||
|
...result.data || result,
|
||||||
|
status: 'active',
|
||||||
|
attempt: attempt
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If not online yet and this isn't the last attempt, wait and retry
|
||||||
|
if (attempt < maxRetries) {
|
||||||
|
const delay = baseDelay * Math.pow(1.2, attempt - 1); // Exponential backoff
|
||||||
|
|
||||||
|
console.log(`Attempt ${attempt}/${maxRetries}: Stack not yet online. Waiting ${Math.round(delay/1000)}s before retry...`);
|
||||||
|
|
||||||
|
// Update the step description to show retry progress
|
||||||
|
if (currentStep) {
|
||||||
|
const statusElement = currentStep.querySelector('.step-status');
|
||||||
|
statusElement.textContent = `Waiting for stack to come online... (Attempt ${attempt}/${maxRetries})`;
|
||||||
|
}
|
||||||
|
|
||||||
|
await new Promise(resolve => setTimeout(resolve, delay));
|
||||||
|
} else {
|
||||||
|
// Last attempt failed - stack might be online but API check failed
|
||||||
|
console.log(`Stack status check failed after ${maxRetries} attempts, but deployment was successful`);
|
||||||
|
|
||||||
|
// Update status to show partial success
|
||||||
|
if (currentStep) {
|
||||||
|
const statusElement = currentStep.querySelector('.step-status');
|
||||||
|
statusElement.textContent = 'Stack deployed (status check timeout)';
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
data: {
|
||||||
|
...result.data || result,
|
||||||
|
status: 'deployed',
|
||||||
|
note: 'Status check timeout - stack may be online'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Stack status check attempt ${attempt} failed:`, error);
|
||||||
|
|
||||||
|
if (attempt === maxRetries) {
|
||||||
|
// Last attempt failed, but deployment was successful
|
||||||
|
console.log('Stack status check failed after all attempts, but deployment was successful');
|
||||||
|
|
||||||
|
if (currentStep) {
|
||||||
|
const statusElement = currentStep.querySelector('.step-status');
|
||||||
|
statusElement.textContent = 'Stack deployed (status check failed)';
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
data: {
|
||||||
|
...result.data || result,
|
||||||
|
status: 'deployed',
|
||||||
|
note: 'Status check failed - stack may be online'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait before retrying on error
|
||||||
|
const delay = baseDelay * Math.pow(1.2, attempt - 1);
|
||||||
|
console.log(`Stack check failed, retrying in ${Math.round(delay/1000)}s...`);
|
||||||
|
|
||||||
|
if (currentStep) {
|
||||||
|
const statusElement = currentStep.querySelector('.step-status');
|
||||||
|
statusElement.textContent = `Stack check failed, retrying... (Attempt ${attempt}/${maxRetries})`;
|
||||||
|
}
|
||||||
|
|
||||||
|
await new Promise(resolve => setTimeout(resolve, delay));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we get here, deployment was successful but we couldn't verify status
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
data: {
|
||||||
|
...result.data || result,
|
||||||
|
status: 'deployed',
|
||||||
|
note: 'Deployment successful, status unknown'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error deploying stack:', error);
|
||||||
|
|
||||||
|
// Check if this is a timeout error
|
||||||
|
if (error.name === 'AbortError') {
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
error: 'Stack deployment timed out after 10 minutes. The operation may still be in progress.'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if this is a network error
|
||||||
|
if (error.message && error.message.includes('fetch')) {
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
error: 'Network error during stack deployment. Please check your connection and try again.'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if this is a response error
|
||||||
|
if (error.message && error.message.includes('Failed to deploy stack')) {
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
error: error.message
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
error: error.message || 'Unknown error during stack deployment'
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user