diff --git a/src/dns/gcdns.js b/src/dns/gcdns.js index 1100bf6ed..d3d680683 100644 --- a/src/dns/gcdns.js +++ b/src/dns/gcdns.js @@ -43,7 +43,7 @@ function getZoneByName(dnsConfig, zoneName, callback) { var gcdns = GCDNS(getDnsCredentials(dnsConfig)); - gcdns.getZones(function (error, zones, apiResponse) { + gcdns.getZones(function (error, zones) { if (error && error.message === 'invalid_grant') return callback(new SubdomainError(SubdomainError.ACCESS_DENIED, 'The key was probably revoked')); if (error && error.reason === 'No such domain') return callback(new SubdomainError(SubdomainError.NOT_FOUND, error.message)); if (error && error.code === 403) return callback(new SubdomainError(SubdomainError.ACCESS_DENIED, error.message)); @@ -78,24 +78,20 @@ function upsert(dnsConfig, zoneName, subdomain, type, values, callback) { var domain = (subdomain ? subdomain + '.' : '') + zoneName + '.'; - zone.getRecords({type: type, name: domain}, function (error, oldRecords, apiResponse) { + zone.getRecords({ type: type, name: domain }, function (error, oldRecords) { if (error && error.code === 403) return callback(new SubdomainError(SubdomainError.ACCESS_DENIED, error.message)); if (error) { debug('upsert->zone.getRecords', error); return callback(new SubdomainError(SubdomainError.EXTERNAL_ERROR, error.message)); } - assert(oldRecords.length <= 1); - - var oldData = oldRecords.length > 0 ? oldRecords[0].metadata.rrdatas : []; - var newData = oldData.concat(values).sort().filter(function (el, i, a) { return (i === a.indexOf(el)) ? 1 : 0; }); var newRecord = zone.record(type, { name: domain, - data: newData, + data: values, ttl: 1 }); - zone.createChange({delete: oldRecords, add: newRecord}, function(error, change, apiResponse) { + zone.createChange({ delete: oldRecords, add: newRecord }, function(error, change) { if (error && error.code === 403) return callback(new SubdomainError(SubdomainError.ACCESS_DENIED, error.message)); if (error && error.code === 412) return callback(new SubdomainError(SubdomainError.STILL_BUSY, error.message)); if (error) { @@ -124,20 +120,13 @@ function get(dnsConfig, zoneName, subdomain, type, callback) { type: type }; - var allValues = []; - var recursiveRetriever = function (error, records, nextQuery, apiResponse) { + zone.getRecords(params, function (error, records) { if (error && error.code === 403) return callback(new SubdomainError(SubdomainError.ACCESS_DENIED, error.message)); if (error) return callback(new SubdomainError(SubdomainError.EXTERNAL_ERROR, error)); - if (records.length > 0) { - allValues = allValues.concat(records[0].data); - } - if (nextQuery) { - return zone.getRecords(nextQuery, recursiveRetriever); - } - - callback(null, allValues); - }; - zone.getRecords(params, recursiveRetriever); + if (records.length === 0) return callback(null, [ ]); + + return callback(null, records[0].data); + }); }); } @@ -154,25 +143,14 @@ function del(dnsConfig, zoneName, subdomain, type, values, callback) { var domain = (subdomain ? subdomain + '.' : '') + zoneName + '.'; - zone.getRecords({ type: type, name: domain }, function(error, oldRecords, apiResponse) { + zone.getRecords({ type: type, name: domain }, function(error, oldRecords) { if (error && error.code === 403) return callback(new SubdomainError(SubdomainError.ACCESS_DENIED, error.message)); if (error) { debug('del->zone.getRecords', error); return callback(new SubdomainError(SubdomainError.EXTERNAL_ERROR, error.message)); } - assert(oldRecords.length <= 1); - - var oldData = oldRecords.length > 0 ? oldRecords[0].metadata.rrdatas : []; - var newData = oldData.filter(function(e) { return values.indexOf(e) == -1; }); //element is not in the list of values to delete - - var newRecord = newData.length === 0 ? null : zone.record(type, { - name: domain, - data: newData, - ttl: 1 - }); - - zone.createChange({delete: oldRecords, add: newRecord}, function (error, change, apiResponse) { + zone.deleteRecords(oldRecords, function (error, change) { if (error && error.code === 403) return callback(new SubdomainError(SubdomainError.ACCESS_DENIED, error.message)); if (error && error.code === 412) return callback(new SubdomainError(SubdomainError.STILL_BUSY, error.message)); if (error) { diff --git a/src/test/dns-test.js b/src/test/dns-test.js index 1ac1e6319..d098c3d83 100644 --- a/src/test/dns-test.js +++ b/src/test/dns-test.js @@ -531,7 +531,7 @@ describe('dns provider', function () { var dnsConfig = { provider: 'gcdns', projectId: 'my-dns-proj', - keyFilename: 'syn-im-1ec6f9f870bf.json' + keyFilename: __dirname + '/syn-im-1ec6f9f870bf.json' }; function mockery (queue) { @@ -561,6 +561,7 @@ describe('dns provider', function () { zone.metadata.dnsName = name + '.'; zone.metadata.nameServers = ns || ['8.8.8.8', '8.8.4.4']; zone.getRecords = mockery(recordQueue || zoneQueue); + zone.createChange = mockery(recordQueue || zoneQueue); zone.replaceRecords = mockery(recordQueue || zoneQueue); zone.deleteRecords = mockery(recordQueue || zoneQueue); return zone; @@ -579,7 +580,8 @@ describe('dns provider', function () { }); it('upsert non-existing record succeeds', function (done) { - zoneQueue.push([null, HOSTED_ZONES]); + zoneQueue.push([null, HOSTED_ZONES]); // getZone + zoneQueue.push([null, [ ]]); // getRecords zoneQueue.push([null, {id: '1'}]); subdomains.upsert('test', 'A', [ '1.2.3.4' ], function (error, result) { expect(error).to.eql(null); @@ -592,6 +594,7 @@ describe('dns provider', function () { it('upsert existing record succeeds', function (done) { zoneQueue.push([null, HOSTED_ZONES]); + zoneQueue.push([null, [GCDNS().zone('test').record('A', {'name': 'test', data:['5.6.7.8'], ttl: 1})]]); zoneQueue.push([null, {id: '2'}]); subdomains.upsert('test', 'A', [ '1.2.3.4' ], function (error, result) { @@ -605,6 +608,7 @@ describe('dns provider', function () { it('upsert multiple record succeeds', function (done) { zoneQueue.push([null, HOSTED_ZONES]); + zoneQueue.push([null, [ ]]); // getRecords zoneQueue.push([null, {id: '3'}]); subdomains.upsert('', 'TXT', [ 'first', 'second', 'third' ], function (error, result) { @@ -618,14 +622,13 @@ describe('dns provider', function () { it('get succeeds', function (done) { zoneQueue.push([null, HOSTED_ZONES]); - zoneQueue.push([null, [], true]); - zoneQueue.push([null, [GCDNS().zone('test').record('A', {'name': 'test', data:['1.2.3.4'], ttl: 1})]]); + zoneQueue.push([null, [GCDNS().zone('test').record('A', {'name': 'test', data:['1.2.3.4', '5.6.7.8'], ttl: 1})]]); subdomains.get('test', 'A', function (error, result) { expect(error).to.eql(null); expect(result).to.be.an(Array); - expect(result.length).to.eql(1); - expect(result[0]).to.eql('1.2.3.4'); + expect(result.length).to.eql(2); + expect(result).to.eql(['1.2.3.4', '5.6.7.8']); expect(zoneQueue.length).to.eql(0); done(); @@ -634,6 +637,7 @@ describe('dns provider', function () { it('del succeeds', function (done) { zoneQueue.push([null, HOSTED_ZONES]); + zoneQueue.push([null, [GCDNS().zone('test').record('A', {'name': 'test', data:['5.6.7.8'], ttl: 1})]]); zoneQueue.push([null, {id: '5'}]); subdomains.remove('test', 'A', ['1.2.3.4'], function (error) { diff --git a/src/test/syn-im-1ec6f9f870bf.json b/src/test/syn-im-1ec6f9f870bf.json new file mode 100644 index 000000000..022779e1f --- /dev/null +++ b/src/test/syn-im-1ec6f9f870bf.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "second-metrics-123822", + "private_key_id": "12345678912345678659bacc6a9ba2bd495304e8", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAA123456789lAgEAAoIBAQDbogLCpOPRIgFD\nQGMB1A3RO234567898+gQIEzr3wM+kgDuh5lsm5C5YBGHppC5dD2GdWDGFxBhSGP\nYWW4F8593TDsSoeg3tsffIHQ4gTA3q/V4q5M4fEi+XWL123450KUjLYVs6DgZk28\nF5TbHFHxQjRvbQTj1245lQXsqR/WEBIShA0HwrF6ayz2n123456FuR7kCQ6Srxv6\n4d3i2S3KrkabcEzCHoo3NKeXj3f/cbWapoJaaaaaaaNfK3dEyuicoJaoFYspK194\n9qStl9opEwWzeiW95Ps5P4WFdQq5bSWw4LatEcdxnre7IR11ZVjktZwg6bU19Aes\ntfvSOiMhAgMBAAECggEAUm5y5MToMDS4DpqazjPdX7pFdSDnZgzxfy7WjyR8xY4l\n+ygegoK+eWMTir2vng4NKGC3zvUUow6pctvWRorA2GJtGzI5xzn9OcsMGe7KY+zw\nR7FFQ9vFGiBQasOdNfh8/630JR7+8VnUMRUUrEvrwUXc0jkzjYYaZuCtkY5EQZ2i\nfGm4I25uNckd2BNCvyc+bMT/zXD33vaMUe9B/Dy8lnKHstKds6C9lweocu/7XpMd\nRhzOeIxLYoPpdNveVNsfztj5y3bKaopxaEQoGIdXrNrBANiHumbEjF6VcOmQ6xnp\n5L+5ht1c4hLeydn/O7/xQeuik72+aD9PQE3Xz1aOlQKBgQDuGf/PURwVC/h2Jiz6\nSdZNAeCpeE/7S4iumksjXdp1gT+6rLv4UumpDX7DXNbRELwFBJMOZu9tM6DrHnMZ\nt+5U9qkS4r5tKoOBHv3YvabH5hkj5oeSFQfi2CDHS9hURuQUwvTYfZluJXDseswX\nAHF3NJzsnGxYqPQ+t3SMLvCi7wKBgQDsJJoMzkfsxExlhGH3zwmhcp5t7DBAYCKC\nz/IpZhY48iFdEAS1NA35F8EofN5d3TWPzVW2oT4f4Qz7VtKp9OHwtFpHnsSpBLGX\nB66gh5wO+yscvnRTFIGPNBg9fHNn70OQJaixelhDp7/BBfpcusF6ByND4F29vRiv\ng9n99lZa7wKBgQCsjpseHKJFfo9q0O/31FtDJAE10MPmUy+Tmq6pyvLwBeOx3k28\nAhrlMaqU20uz6HTbDh2lamRKuAf/Xen80Zgga0LNNRbc9tqnUVaXJZshdFjz87Z8\n4FD+zbOzu/vj2BykD0ZzP1NayDe2qqgOY3vX8IFp2VOMTaX1be9BSSOMcQKBgQCw\nObBtFhQ+8U9CA0VJNcyuG2d4COcJY7Tdgmnp0zGKVcfoN2gMAkjbN4sCuA0KZ2bt\nZgMtQ6+lAsI5X1XfV8y1YSJuiGGi8MnHOAht7EXeODq4PLl6trbpM6tTV2iYi8oT\n7Mazi+YKt0k2t0tboFN6yZDburi6PEAL2433JLrVKQKBgQDZOwr1XOEuOos1LeQC\nMqO6c4bHo615jtX0NcWLhpN/Z8oHEgIbz0/O0KpcuLrxaCquxpDX9n0pALzg3AoX\nXnvuuq4r9pjoD5LN2qD4+SCIwUhB8ubGnlc97vWtkWnK7Wn49QMnqo2OfeCctk6S\nF36saiVnMV5alSVlU+ThqI8aLw==\n-----END PRIVATE KEY-----\n", + "client_email": "123456789349-compute@developer.gserviceaccount.com", + "client_id": "123456789012345506547", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://accounts.google.com/o/oauth2/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/735900230349-compute%40developer.gserviceaccount.com" +}