diff --git a/src/dns/digitalocean.js b/src/dns/digitalocean.js index 28393cb77..85b309317 100644 --- a/src/dns/digitalocean.js +++ b/src/dns/digitalocean.js @@ -82,7 +82,7 @@ async function upsert(domainObject, location, type, values) { debug('upsert: %s for zone %s of type %s with values %j', name, zoneName, type, values); - const result = await getZoneRecords(domainConfig, zoneName, name, type); + const records = await getZoneRecords(domainConfig, zoneName, name, type); // used to track available records to update instead of create let i = 0, recordIds = []; @@ -103,7 +103,7 @@ async function upsert(domainObject, location, type, values) { ttl: 30 // Recent DO DNS API break means this value must atleast be 30 }; - if (i >= result.length) { + if (i >= records.length) { const [error, response] = await safe(superagent.post(DIGITALOCEAN_ENDPOINT + '/v2/domains/' + zoneName + '/records') .set('Authorization', 'Bearer ' + domainConfig.token) .send(data) @@ -116,9 +116,9 @@ async function upsert(domainObject, location, type, values) { if (response.statusCode === 422) throw new BoxError(BoxError.BAD_FIELD, response.body.message); if (response.statusCode !== 201) throw new BoxError(BoxError.EXTERNAL_ERROR, formatError(response)); - recordIds.push(safe.query(result.body, 'domain_record.id')); + recordIds.push(safe.query(records.body, 'domain_record.id')); } else { - const [error, response] = await safe(superagent.put(DIGITALOCEAN_ENDPOINT + '/v2/domains/' + zoneName + '/records/' + result[i].id) + const [error, response] = await safe(superagent.put(DIGITALOCEAN_ENDPOINT + '/v2/domains/' + zoneName + '/records/' + records[i].id) .set('Authorization', 'Bearer ' + domainConfig.token) .send(data) .timeout(30 * 1000) @@ -132,10 +132,20 @@ async function upsert(domainObject, location, type, values) { if (response.statusCode === 422) throw new BoxError(BoxError.BAD_FIELD, response.body.message); if (response.statusCode !== 200) throw new BoxError(BoxError.EXTERNAL_ERROR, formatError(response)); - recordIds.push(safe.query(result.body, 'domain_record.id')); + recordIds.push(safe.query(records.body, 'domain_record.id')); } } + for (let j = values.length + 1; j < records.length; j++) { + const [error] = await safe(superagent.del(`${DIGITALOCEAN_ENDPOINT}/v2/domains/${zoneName}/records/${records[j].id}`) + .set('Authorization', 'Bearer ' + domainConfig.token) + .timeout(30 * 1000) + .retry(5) + .ok(() => true)); + + if (error) debug(`upsert: error removing record ${records[j].id}: ${error.message}`); + } + debug('upsert: completed with recordIds:%j', recordIds); } diff --git a/src/dns/vultr.js b/src/dns/vultr.js index bbfe8a930..6411692e4 100644 --- a/src/dns/vultr.js +++ b/src/dns/vultr.js @@ -146,6 +146,15 @@ async function upsert(domainObject, location, type, values) { } } + for (let j = values.length + 1; j < records.length; j++) { + const [error] = await safe(superagent.del(`${VULTR_ENDPOINT}/domains/${zoneName}/records/${records[j].id}`) + .set('Authorization', 'Bearer ' + domainConfig.token) + .timeout(30 * 1000) + .retry(5)); + + if (error) debug(`upsert: error removing record ${records[j].id}: ${error.message}`); + } + debug('upsert: completed with recordIds:%j', recordIds); }