const {
SQSClient,
SendMessageCommand,
DeleteMessageCommand,
ReceiveMessageCommand
} = require('@aws-sdk/client-sqs')
const { AwsCredentialsService } = require('../aws-credentials')
const { logInfo, logError, logDebug } = require('../log')
/**
* @class
*/
class DeploymentQueueService {
static sendDeploymentRequest(platformConfig, deploymentRequest) {
logInfo({ message: '[DeploymentQueueService] Starting deployment sequence' })
return DeploymentQueueService.createAwsSqsClient(platformConfig)
.then(sqsClient => {
const sendMessageParams = {
QueueUrl: platformConfig.awsDeploymentSqsArn,
MessageBody: JSON.stringify(deploymentRequest)
}
logDebug({ message: '[DeploymentQueueService] SendMessageCommand params', data: sendMessageParams })
const command = new SendMessageCommand(sendMessageParams)
return sqsClient.send(command)
.then(() => logInfo({ message: '[DeploymentQueueService] Deployment request sent' }))
.catch(error => logError({ message: '[DeploymentQueueService] Could not send deployment request', error }))
})
}
static pollForDeploymentRequests(platformConfig, handleDeploymentRequest) {
logInfo({ message: '[DeploymentQueueService] Starting polling for deployment requests' })
DeploymentQueueService.createAwsSqsClient(platformConfig).then(sqsClient => {
const FIVE_MINUTES = 3000
setInterval(() => {
const receiveMessageCommand = new ReceiveMessageCommand({ QueueUrl: platformConfig.awsDeploymentSqsArn })
sqsClient.send(receiveMessageCommand)
.then(data => data.Messages.map(message => {
logInfo({ message: '[DeploymentQueueService] Received deployment request' })
handleDeploymentRequest(JSON.parse(message.Body))
.then(() => {
const deleteMessageCommand = new DeleteMessageCommand({
QueueUrl: platformConfig.awsDeploymentSqsArn,
ReceiptHandle: message.ReceiptHandle
})
sqsClient.send(deleteMessageCommand)
.then(() => logInfo({ message: '[DeploymentQueueService] Removing deployment request from queue' }))
.catch(error => logError({ message: '[DeploymentQueueService] Could not delete message from queue', error }))
})
}))
.catch(error => logError({ message: '[ContainerManagerServer] Could not handle incoming deployment request', error }))
}, FIVE_MINUTES)
})
}
static createAwsSqsClient(platformConfig) {
return AwsCredentialsService.resolveAwsCredentials(platformConfig)
.then(awsCredentials => new SQSClient({
region: platformConfig.awsRegion,
credentials: awsCredentials
}))
}
}
module.exports = {
DeploymentQueueService
}