lib/create_addon.js
'use strict'
const cli = require('heroku-cli-util')
function formatConfigVarsMessage (addon) {
let configVars = (addon.config_vars || [])
if (configVars.length > 0) {
configVars = configVars.map(c => cli.color.configVar(c)).join(', ')
return `Created ${cli.color.addon(addon.name)} as ${configVars}`
} else {
return `Created ${cli.color.addon(addon.name)}`
}
}
module.exports = function * (heroku, app, plan, confirm, wait, options) {
const util = require('./util')
const waitForAddonProvisioning = require('./addons_wait')
function createAddonRequest (confirm) {
let body = {
confirm,
name: options.name,
config: options.config,
plan: {name: plan},
attachment: {name: options.as}
}
return cli.action(`Creating ${plan} on ${cli.color.app(app)}`,
heroku.post(`/apps/${app}/addons`, {
body,
headers: {
'accept-expansion': 'plan',
'x-heroku-legacy-provider-messages': 'true'
}
}).then(function (addon) {
cli.action.done(cli.color.green(util.formatPrice(addon.plan.price)))
return addon
})
)
}
let addon = yield util.trapConfirmationRequired(app, confirm, (confirm) => (createAddonRequest(confirm)))
if (addon.provision_message) { cli.log(addon.provision_message) }
if (addon.state === 'provisioning') {
if (wait) {
cli.log(`Waiting for ${cli.color.addon(addon.name)}...`)
addon = yield waitForAddonProvisioning(heroku, addon, 5)
cli.log(formatConfigVarsMessage(addon))
} else {
cli.log(`${cli.color.addon(addon.name)} is being created in the background. The app will restart when complete...`)
cli.log(`Use ${cli.color.cmd('heroku addons:info ' + addon.name)} to check creation progress`)
}
} else if (addon.state === 'deprovisioned') {
throw new Error(`The add-on was unable to be created, with status ${addon.state}`)
} else {
cli.log(formatConfigVarsMessage(addon))
}
return addon
}