You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
1.9 KiB

const linelog = require('single-line-log').stdout
const range = require('lodash.range')
const ms = require('ms')
const chalk = require('chalk')
const retry = require('async-retry')
function barify(cur, tot) {
return (
'[' +
range(0, cur).map(() => '=').join('') +
range(cur, tot).map(() => '-').join('') +
']'
)
}
module.exports = async function(now, url) {
const match = await now.findDeployment(url)
const { min, max, current } = match.scale
let targetReplicaCount = min
if (current < min) {
targetReplicaCount = min
} else if (current > max) {
targetReplicaCount = max
} else {
return
}
if (targetReplicaCount === 0) {
console.log(`> Scaled to 0 instances`)
return
}
const startTime = Date.now()
let barcurr = current
const end = Math.max(current, max)
linelog(
`${chalk.gray('>')} Scaling to ${chalk.bold(String(targetReplicaCount) + (targetReplicaCount === 1 ? ' instance' : ' instances'))}: ` +
barify(barcurr, end)
)
const instances = await retry(
async () => {
const res = await now.listInstances(match.uid)
if (barcurr !== res.length) {
barcurr = res.length
linelog(
`${chalk.gray('>')} Scaling to ${chalk.bold(String(targetReplicaCount) + (targetReplicaCount === 1 ? ' instance' : ' instances'))}: ` +
barify(barcurr, end)
)
if (barcurr === targetReplicaCount) {
linelog.clear()
linelog(
`> Scaled to ${chalk.bold(String(targetReplicaCount) + (targetReplicaCount === 1 ? ' instance' : ' instances'))}: ${chalk.gray('[' + ms(Date.now() - startTime) + ']')}\n`
)
return res
}
}
throw new Error('Not ready yet')
},
{ retries: 5000, minTimeout: 10, maxTimeout: 20 }
)
process.nextTick(() => {
instances.forEach(inst => {
console.log(`${chalk.gray('-')} ${chalk.underline(inst.url)}`)
})
})
}