From 7b3fd02fb12ec0da3c7e2d0f116184a072035ccc Mon Sep 17 00:00:00 2001 From: Trevor Johnston Date: Thu, 12 May 2016 13:04:48 -0400 Subject: [PATCH 1/2] fix issue where start will never resolve if droplet has been deleted --- src/cloud/digitalocean/provisioner.ts | 49 ++++++++++++--------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/src/cloud/digitalocean/provisioner.ts b/src/cloud/digitalocean/provisioner.ts index f009749..e0d6534 100644 --- a/src/cloud/digitalocean/provisioner.ts +++ b/src/cloud/digitalocean/provisioner.ts @@ -72,7 +72,8 @@ class Provisioner { }).then((keys: KeyPair) => { // Get SSH keys this.state_.ssh = keys; - return this.getDroplet_(name).then((unused :any) => { + + return this.getDropletByName_(name).then((unused :any) => { // Droplet exists so raise error return Promise.reject({ 'errcode': 'VM_AE', @@ -85,23 +86,23 @@ class Provisioner { }); }).then(() => { // Get the droplet's configuration - return this.doRequest_('GET', 'droplets/' + this.state_.cloud.vm.id); - }).then((resp: any) => { + return this.getDropletByName_(name); + }).then((droplet:any) => { this.sendStatus_('CLOUD_DONE_VM'); - this.state_.cloud.vm = resp.droplet; + this.state_.cloud.vm = droplet; this.state_.network = { 'ssh_port': 22 }; // Retrieve public IPv4 address - for (var i = 0; i < resp.droplet.networks.v4.length; i++) { - if (resp.droplet.networks.v4[i].type === 'public') { - this.state_.network['ipv4'] = resp.droplet.networks.v4[i].ip_address; + for (var i = 0; i < droplet.networks.v4.length; i++) { + if (droplet.networks.v4[i].type === 'public') { + this.state_.network['ipv4'] = droplet.networks.v4[i].ip_address; } } // Retrieve public IPv6 address - for (var i = 0; i < resp.droplet.networks.v6.length; i++) { - if (resp.droplet.networks.v6[i].type === 'public') { - this.state_.network['ipv6'] = resp.droplet.networks.v6[i].ip_address; + for (var i = 0; i < droplet.networks.v6.length; i++) { + if (droplet.networks.v6[i].type === 'public') { + this.state_.network['ipv6'] = droplet.networks.v6[i].ip_address; } } console.log(this.state_); @@ -132,10 +133,10 @@ class Provisioner { private destroyServer_ = (name: string): Promise => { return this.doRequest_('GET', 'droplets').then((resp: any) => { // Find and delete the server with the same name - return this.getDroplet_(name); - }).then((resp: any) => { + return this.getDropletByName_(name); + }).then((droplet: any) => { this.state_.cloud = this.state_.cloud || {}; - this.state_.cloud.vm = this.state_.cloud.vm || resp.droplet; + this.state_.cloud.vm = this.state_.cloud.vm || droplet; // Make sure there are no actions in progress before deleting this.sendStatus_('CLOUD_WAITING_VM'); return this.waitDigitalOceanActions_(); @@ -169,10 +170,10 @@ class Provisioner { return this.doOAuth_().then((oauthObj: any) => { this.state_.oauth = oauthObj; }).then(() => { - return this.getDroplet_(name); - }).then((resp: any) => { + return this.getDropletByName_(name); + }).then((droplet: any) => { this.state_.cloud = this.state_.cloud || {}; - this.state_.cloud.vm = this.state_.cloud.vm || resp.droplet; + this.state_.cloud.vm = this.state_.cloud.vm || droplet; // Make sure there are no actions in progress before rebooting this.sendStatus_('CLOUD_WAITING_VM'); return this.waitDigitalOceanActions_(); @@ -188,20 +189,12 @@ class Provisioner { }); } - /** - * Finds a droplet with this name - * @param {String} droplet name, as a string - * @return {Promise.}, resolves with {droplet: droplet_with_name} - * or rejects if droplet doesn't exist - */ - private getDroplet_ = (name: string) : Promise => { + // Resolves with the (de-serialised) droplet, rejecting if not found. + private getDropletByName_ = (name: string) : Promise => { return this.doRequest_('GET', 'droplets').then((resp: any) => { - // Find and delete the server with the same name - for (var i = 0; i < resp.droplets.length; i++) { + for (let i = 0; i < resp.droplets.length; i++) { if (resp.droplets[i].name === name) { - return Promise.resolve({ - droplet: resp.droplets[i] - }); + return Promise.resolve(resp.droplets[i]); } } return Promise.reject({ From 5ca62dd3dab146fc6cfcbad32c20098b00e6e3de Mon Sep 17 00:00:00 2001 From: Trevor Johnston Date: Fri, 13 May 2016 15:56:15 -0400 Subject: [PATCH 2/2] break ip address searching loops --- src/cloud/digitalocean/provisioner.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cloud/digitalocean/provisioner.ts b/src/cloud/digitalocean/provisioner.ts index e0d6534..b5ede35 100644 --- a/src/cloud/digitalocean/provisioner.ts +++ b/src/cloud/digitalocean/provisioner.ts @@ -97,12 +97,14 @@ class Provisioner { for (var i = 0; i < droplet.networks.v4.length; i++) { if (droplet.networks.v4[i].type === 'public') { this.state_.network['ipv4'] = droplet.networks.v4[i].ip_address; + break; } } // Retrieve public IPv6 address for (var i = 0; i < droplet.networks.v6.length; i++) { if (droplet.networks.v6[i].type === 'public') { this.state_.network['ipv6'] = droplet.networks.v6[i].ip_address; + break; } } console.log(this.state_);