diff --git a/lib/compute/autoscaler.js b/lib/compute/autoscaler.js index 6286da24955..e6c8b236c7a 100644 --- a/lib/compute/autoscaler.js +++ b/lib/compute/autoscaler.js @@ -168,7 +168,7 @@ nodeutil.inherits(Autoscaler, ServiceObject); Autoscaler.prototype.delete = function(callback) { callback = callback || util.noop; - var compute = this.zone.compute; + var zone = this.zone; ServiceObject.prototype.delete.call(this, function(err, resp) { if (err) { @@ -176,7 +176,7 @@ Autoscaler.prototype.delete = function(callback) { return; } - var operation = compute.operation(resp.name); + var operation = zone.operation(resp.name); operation.metadata = resp; callback(null, operation, resp); @@ -228,7 +228,7 @@ Autoscaler.prototype.setMetadata = function(metadata, callback) { return; } - var operation = zone.compute.operation(resp.name); + var operation = zone.operation(resp.name); operation.metadata = resp; callback(null, operation, resp); diff --git a/scripts/build.sh b/scripts/build.sh index 4a09e522de2..d9bde937207 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -42,7 +42,7 @@ if [ "${TRAVIS_BRANCH}" == "master" ] && [ "${TRAVIS_PULL_REQUEST}" == "false" ] # commit to gh-pages branch to apply changes git config user.name "travis-ci" git config user.email "travis@travis-ci.org" - git commit -m "Update docs after merge to master" + git commit -m "Update docs after merge to master [ci skip]" git status git push https://${GH_OAUTH_TOKEN}@github.com/${GH_OWNER}/${GH_PROJECT_NAME} HEAD:gh-pages else diff --git a/scripts/release.sh b/scripts/release.sh index be18b98ccb6..9d7aa3e5cce 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -21,17 +21,21 @@ openssl aes-256-cbc -K $encrypted_b8aa0887832a_key -iv $encrypted_b8aa0887832a_i npm run docs npm run system-test -git config user.name "travis-ci" -git config user.email "travis@travis-ci.org" +git config --global user.name "travis-ci" +git config --global user.email "travis@travis-ci.org" ## Attempt to update docs/manifest.json with the new version. +git checkout master node -e " file = require('./docs/manifest.json') if (file.versions.indexOf('${TRAVIS_TAG}') === -1) file.versions.unshift('${TRAVIS_TAG}') require('fs').writeFileSync('docs/manifest.json', JSON.stringify(file, null, 2) + '\n') " +# allow "git add" to fail if there aren't new files. +set +e git add docs/manifest.json -git commit -m "Update docs/manifest.json for ${TRAVIS_TAG}" +set -e +git commit -m "Update docs/manifest.json for ${TRAVIS_TAG} [ci skip]" git status if [[ -n "$(git status --porcelain)" ]]; then git push https://${GH_OAUTH_TOKEN}@github.com/${GH_OWNER}/${GH_PROJECT_NAME} HEAD:master diff --git a/system-test/compute.js b/system-test/compute.js index 79947494590..b46426f9f29 100644 --- a/system-test/compute.js +++ b/system-test/compute.js @@ -18,8 +18,8 @@ var assert = require('assert'); var async = require('async'); -var exec = require('methmeth'); var is = require('is'); +var prop = require('propprop'); var env = require('./env.js'); var Compute = require('../lib/compute/index.js'); @@ -36,11 +36,8 @@ describe('Compute', function() { // tests in that `describe` block. // // After all describe blocks have run, all of the created objects are - // deleted.* This will also pick up any previously-created objects that were + // deleted. This will also pick up any previously-created objects that were // unable to be removed if a prior test run had unexpectedly quit. - // - // * What we really send are delete requests. If we were to wait on all of the - // delete operations to complete, it could be several minutes. var TESTS_PREFIX = 'gcloud-tests-'; var REGION_NAME = 'us-central1'; @@ -50,6 +47,10 @@ describe('Compute', function() { var region = compute.region(REGION_NAME); var zone = compute.zone(ZONE_NAME); + before(function(done) { + deleteAllTestObjects(done); + }); + after(function(done) { deleteAllTestObjects(done); }); @@ -110,7 +111,7 @@ describe('Compute', function() { var autoscaler = zone.autoscaler(AUTOSCALER_NAME); // Some of the services we support require an instance group to be created. - // Util `instanceGroups` are officially supported by gcloud-node, we make + // Until `instanceGroups` are officially supported by gcloud-node, we make // manual requests to create and delete them. var INSTANCE_GROUP_NAME = generateName('instance-group'); @@ -133,10 +134,6 @@ describe('Compute', function() { ], done); }); - after(function(done) { - deleteInstanceGroup(INSTANCE_GROUP_NAME, done); - }); - it('should have created the autoscaler', function(done) { autoscaler.getMetadata(function(err, metadata) { assert.ifError(err); @@ -186,7 +183,7 @@ describe('Compute', function() { autoscaler.setMetadata({ description: description - }, function(err) { + }, execAfterOperationComplete(function(err) { assert.ifError(err); autoscaler.getMetadata(function(err, metadata) { @@ -194,7 +191,7 @@ describe('Compute', function() { assert.strictEqual(metadata.description, description); done(); }); - }); + })); }); }); @@ -530,31 +527,6 @@ describe('Compute', function() { ], done); }); - after(function(done) { - async.series([ - function(callback) { - rule.delete(execAfterOperationComplete(callback)); - }, - - function(callback) { - deleteTargetProxy(TARGET_PROXY_NAME, callback); - }, - - function(callback) { - deleteUrlMap(URL_MAP_NAME, callback); - }, - - function(callback) { - deleteService( - service.name, - INSTANCE_GROUP_NAME, - HEALTH_CHECK_NAME, - callback - ); - } - ], done); - }); - it('should get a list of rules', function(done) { compute.getRules(function(err, rules) { assert.ifError(err); @@ -630,18 +602,6 @@ describe('Compute', function() { ], done); }); - after(function(done) { - async.series([ - function(callback) { - rule.delete(execAfterOperationComplete(callback)); - }, - - function(callback) { - vm.delete(execAfterOperationComplete(callback)); - } - ], done); - }); - it('should get a list of rules', function(done) { region.getRules(function(err, rules) { assert.ifError(err); @@ -677,10 +637,6 @@ describe('Compute', function() { createService(service.name, INSTANCE_GROUP_NAME, HEALTH_CHECK_NAME, done); }); - after(function(done) { - deleteService(service.name, INSTANCE_GROUP_NAME, HEALTH_CHECK_NAME, done); - }); - it('should get a list of services', function(done) { compute.getServices(function(err, services) { assert.ifError(err); @@ -784,21 +740,6 @@ describe('Compute', function() { }); }); - after(function(done) { - vm.delete(function(err, operation) { - if (err) { - done(err); - return; - } - - operation - .on('error', done) - .on('complete', function() { - done(); - }); - }); - }); - it('should have enabled HTTP connections', function(done) { vm.getTags(function(err, tags) { assert.ifError(err); @@ -834,21 +775,13 @@ describe('Compute', function() { }); it('should attach and detach a disk', function(done) { - var name = generateName('disk'); - var disk = zone.disk(name); + var disk = zone.disk(generateName('disk')); async.series([ createDisk, attachDisk, detachDisk - ], function(err) { - if (err) { - done(err); - return; - } - - disk.delete(execAfterOperationComplete(done)); - }); + ], done); function createDisk(callback) { var config = { @@ -1002,20 +935,33 @@ describe('Compute', function() { } function deleteAllTestObjects(callback) { - async.each([ + async.series([ + deleteGlobalRules, + deleteRegionalRules, + deleteTargetProxies, + deleteUrlMaps, + deleteServices, + deleteHttpHealthChecks, + deleteInstanceGroups, + deleteTargetInstances, + deleteAllGcloudTestObjects + ], callback); + } + + function deleteAllGcloudTestObjects(callback) { + async.eachSeries([ + 'getVMs', 'getAddresses', 'getAutoscalers', 'getDisks', 'getFirewalls', 'getNetworks', 'getRules', - 'getServices', 'getSnapshots', - 'getVMs' - ], callAndDelete, callback); + ], callAndDeleteGcloudTestObject, callback); } - function callAndDelete(methodName, callback) { + function callAndDeleteGcloudTestObject(methodName, callback) { compute[methodName]({ filter: 'name eq ' + TESTS_PREFIX + '.*' }, function(err, objects) { @@ -1024,7 +970,9 @@ describe('Compute', function() { return; } - async.each(objects, exec('delete'), callback); + async.each(objects, function(object, callback) { + object.delete(execAfterOperationComplete(callback)); + }, callback); }); } @@ -1045,6 +993,51 @@ describe('Compute', function() { }; } + function deleteGlobalRules(callback) { + compute.getRules({ + filter: 'name eq ' + TESTS_PREFIX + '.*' + }, function(err, rules) { + if (err) { + callback(err); + return; + } + + async.each(rules, function(rule, callback) { + rule.delete(execAfterOperationComplete(callback)); + }, callback); + }); + } + + function deleteRegionalRules(callback) { + region.getRules({ + filter: 'name eq ' + TESTS_PREFIX + '.*' + }, function(err, rules) { + if (err) { + callback(err); + return; + } + + async.each(rules, function(rule, callback) { + rule.delete(execAfterOperationComplete(callback)); + }, callback); + }); + } + + function deleteServices(callback) { + compute.getServices({ + filter: 'name eq ' + TESTS_PREFIX + '.*' + }, function(err, services) { + if (err) { + callback(err); + return; + } + + async.each(services, function(service, callback) { + service.delete(execAfterOperationComplete(callback)); + }, callback); + }); + } + function createService(name, instanceGroupName, healthCheckName, callback) { var service = compute.service(name); var groupUrl; @@ -1092,22 +1085,29 @@ describe('Compute', function() { ], callback); } - function deleteService(name, instanceGroupName, healthCheckName, callback) { - var service = compute.service(name); - - async.series([ - function(callback) { - service.delete(execAfterOperationComplete(callback)); - }, + function getInstanceGroups(callback) { + zone.request({ + uri: '/instanceGroups', + qs: { + filter: 'name eq ' + TESTS_PREFIX + '.*' + } + }, callback); + } - function(callback) { - deleteHttpHealthCheck(healthCheckName, callback); - }, + function deleteInstanceGroups(callback) { + getInstanceGroups(function(err, resp) { + if (err) { + callback(err); + return; + } - function(callback) { - deleteInstanceGroup(instanceGroupName, callback); + if (!resp.items) { + callback(); + return; } - ], callback); + + async.each(resp.items.map(prop('name')), deleteInstanceGroup, callback); + }); } function createInstanceGroup(name, callback) { @@ -1155,6 +1155,31 @@ describe('Compute', function() { }); } + function getHttpHealthChecks(callback) { + compute.request({ + uri: '/global/httpHealthChecks', + qs: { + filter: 'name eq ' + TESTS_PREFIX + '.*' + } + }, callback); + } + + function deleteHttpHealthChecks(callback) { + getHttpHealthChecks(function(err, resp) { + if (err) { + callback(err); + return; + } + + if (!resp.items) { + callback(); + return; + } + + async.each(resp.items.map(prop('name')), deleteHttpHealthCheck, callback); + }); + } + function createHttpHealthCheck(name, callback) { compute.request({ method: 'POST', @@ -1200,6 +1225,31 @@ describe('Compute', function() { }); } + function getUrlMaps(callback) { + compute.request({ + uri: '/global/urlMaps', + qs: { + filter: 'name eq ' + TESTS_PREFIX + '.*' + } + }, callback); + } + + function deleteUrlMaps(callback) { + getUrlMaps(function(err, resp) { + if (err) { + callback(err); + return; + } + + if (!resp.items) { + callback(); + return; + } + + async.each(resp.items.map(prop('name')), deleteUrlMap, callback); + }); + } + function createUrlMap(config, callback) { compute.request({ method: 'POST', @@ -1239,6 +1289,31 @@ describe('Compute', function() { }); } + function getTargetProxies(callback) { + compute.request({ + uri: '/global/targetHttpProxies', + qs: { + filter: 'name eq ' + TESTS_PREFIX + '.*' + } + }, callback); + } + + function deleteTargetProxies(callback) { + getTargetProxies(function(err, resp) { + if (err) { + callback(err); + return; + } + + if (!resp.items) { + callback(); + return; + } + + async.each(resp.items.map(prop('name')), deleteTargetProxy, callback); + }); + } + function createTargetProxy(config, callback) { compute.request({ method: 'POST', @@ -1278,6 +1353,31 @@ describe('Compute', function() { }); } + function getTargetInstances(callback) { + zone.request({ + uri: '/targetInstances', + qs: { + filter: 'name eq ' + TESTS_PREFIX + '.*' + } + }, callback); + } + + function deleteTargetInstances(callback) { + getTargetInstances(function(err, resp) { + if (err) { + callback(err); + return; + } + + if (!resp.items) { + callback(); + return; + } + + async.each(resp.items.map(prop('name')), deleteTargetInstance, callback); + }); + } + function createTargetInstance(name, instanceName, callback) { zone.request({ method: 'POST', @@ -1300,4 +1400,23 @@ describe('Compute', function() { }); }); } + + function deleteTargetInstance(name, callback) { + zone.request({ + method: 'DELETE', + uri: '/targetInstances/' + name + }, function(err, resp) { + if (err) { + callback(err); + return; + } + + var operation = zone.operation(resp.name); + operation + .on('error', callback) + .on('complete', function() { + callback(); + }); + }); + } }); diff --git a/test/compute/autoscaler.js b/test/compute/autoscaler.js index e637ecc2fc5..e1471cc9730 100644 --- a/test/compute/autoscaler.js +++ b/test/compute/autoscaler.js @@ -155,7 +155,7 @@ describe('Autoscaler', function() { it('should execute callback with Operation & Response', function(done) { var operation = {}; - autoscaler.zone.compute.operation = function(name) { + autoscaler.zone.operation = function(name) { assert.strictEqual(name, apiResponse.name); return operation; }; @@ -231,7 +231,7 @@ describe('Autoscaler', function() { var operation = {}; var metadata = { a: 'b' }; - autoscaler.zone.compute.operation = function(name) { + autoscaler.zone.operation = function(name) { assert.strictEqual(name, apiResponse.name); return operation; };