Skip to content

Commit 175ccdf

Browse files
committed
Tidy up code.
1 parent f91767b commit 175ccdf

File tree

5 files changed

+164
-83
lines changed

5 files changed

+164
-83
lines changed

client.go

Lines changed: 121 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package main
22

3+
/*
4+
* Driver support for the CloudControl API client
5+
* ----------------------------------------------
6+
*/
7+
38
import (
49
"errors"
510
"fmt"
@@ -9,6 +14,33 @@ import (
914
"time"
1015
)
1116

17+
// CloudControl client retry
18+
const (
19+
// The maximum number of times the client will retry in the case of a network error connecting to the CloudContron API.
20+
clientMaxRetry = 5
21+
22+
// The period of time between retries against the CloudControl API.
23+
clientRetryPeriod = 5 * time.Second
24+
)
25+
26+
// Timeouts
27+
const (
28+
// CloudControl server deployment timeout.
29+
serverCreateTimeout = 15 * time.Minute
30+
31+
// CloudControl resource deletion timeout.
32+
serverDeleteTimeout = 10 * time.Minute
33+
34+
// CloudControl server startup timeout.
35+
serverStartTimeout = 3 * time.Minute
36+
37+
// CloudControl server shutdown timeout.
38+
serverStopTimeout = 3 * time.Minute
39+
40+
// CloudControl server power-off timeout.
41+
serverPowerOffTimeout = 2 * time.Minute
42+
)
43+
1244
// Get the CloudControl API client used by the driver.
1345
func (driver *Driver) getCloudControlClient() (client *compute.Client, err error) {
1446
client = driver.client
@@ -35,7 +67,7 @@ func (driver *Driver) getCloudControlClient() (client *compute.Client, err error
3567
}
3668

3769
client = compute.NewClient(driver.CloudControlRegion, driver.CloudControlUser, driver.CloudControlPassword)
38-
client.ConfigureRetry(10, 5*time.Second)
70+
client.ConfigureRetry(clientMaxRetry, clientRetryPeriod)
3971

4072
driver.client = client
4173

@@ -218,7 +250,7 @@ func (driver *Driver) deployServer() (*compute.Server, error) {
218250

219251
log.Debugf("Deploying server '%s' ('%s')...", driver.ServerID, driver.MachineName)
220252

221-
resource, err := client.WaitForDeploy(compute.ResourceTypeServer, driver.ServerID, 15*time.Minute)
253+
resource, err := client.WaitForDeploy(compute.ResourceTypeServer, driver.ServerID, serverCreateTimeout)
222254
if err != nil {
223255
return nil, err
224256
}
@@ -266,6 +298,93 @@ func (driver *Driver) buildDeploymentConfiguration() (deploymentConfiguration co
266298
return
267299
}
268300

301+
// Start the target server.
302+
func (driver *Driver) startServer() error {
303+
server, err := driver.getServer()
304+
if err != nil {
305+
return err
306+
}
307+
if server == nil {
308+
return fmt.Errorf("Server '%s' not found.", driver.ServerID)
309+
}
310+
311+
if !server.Started {
312+
return nil
313+
}
314+
315+
client, err := driver.getCloudControlClient()
316+
if err != nil {
317+
return err
318+
}
319+
320+
err = client.StartServer(driver.ServerID)
321+
if err != nil {
322+
return err
323+
}
324+
325+
_, err = client.WaitForChange(compute.ResourceTypeServer, driver.ServerID, "Start server", serverStartTimeout)
326+
327+
return err
328+
}
329+
330+
// Stop the target server.
331+
func (driver *Driver) stopServer() error {
332+
server, err := driver.getServer()
333+
if err != nil {
334+
return err
335+
}
336+
if server == nil {
337+
return fmt.Errorf("Server '%s' not found.", driver.ServerID)
338+
}
339+
340+
if !server.Started {
341+
return nil
342+
}
343+
344+
client, err := driver.getCloudControlClient()
345+
if err != nil {
346+
return err
347+
}
348+
349+
err = client.ShutdownServer(driver.ServerID)
350+
if err != nil {
351+
return err
352+
}
353+
354+
_, err = client.WaitForChange(compute.ResourceTypeServer, driver.ServerID, "Shut down server", serverStopTimeout)
355+
356+
return err
357+
}
358+
359+
// Stop the target server.
360+
func (driver *Driver) powerOffServer() error {
361+
server, err := driver.getServer()
362+
if err != nil {
363+
return err
364+
}
365+
if server == nil {
366+
return fmt.Errorf("Server '%s' not found.", driver.ServerID)
367+
}
368+
369+
if !server.Started {
370+
return nil
371+
}
372+
373+
client, err := driver.getCloudControlClient()
374+
if err != nil {
375+
return err
376+
}
377+
378+
err = client.PowerOffServer(driver.ServerID)
379+
if err != nil {
380+
return err
381+
}
382+
383+
_, err = client.WaitForChange(compute.ResourceTypeServer, driver.ServerID, "Power off server", serverPowerOffTimeout)
384+
385+
return err
386+
}
387+
269388
// Has a NAT rule been created for the server?
270389
func (driver *Driver) isNATRuleCreated() bool {
271390
return driver.NATRuleID != ""

client_public_ip.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package main
22

3+
/*
4+
* Detect the client machine's external IPv4 address
5+
* -------------------------------------------------
6+
*
7+
* Uses http://ifconfig.co/json
8+
*/
9+
310
import (
411
"encoding/json"
512
"io/ioutil"

driver.go

Lines changed: 22 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package main
22

3+
/*
4+
* Driver implementation
5+
* ---------------------
6+
*/
7+
38
import (
49
"errors"
510
"fmt"
@@ -9,7 +14,7 @@ import (
914
"github.com/docker/machine/libmachine/mcnflag"
1015
"github.com/docker/machine/libmachine/state"
1116
"net"
12-
"time"
17+
"os"
1318
)
1419

1520
// DefaultImageName is the name of the default OS image used to create machines.
@@ -137,7 +142,7 @@ func (driver *Driver) GetCreateFlags() []mcnflag.Flag {
137142
},
138143
mcnflag.BoolFlag{
139144
Name: "ddcloud-create-ssh-firewall-rule",
140-
Usage: "Create a firewall rule to allow SSH access to the taret server? Default: false",
145+
Usage: "Create a firewall rule to allow SSH access to the target server? Default: false",
141146
},
142147
}
143148
}
@@ -225,6 +230,7 @@ func (driver *Driver) Create() error {
225230
return err
226231
}
227232

233+
log.Infof("Exposing server '%s'...", driver.MachineName)
228234
err = driver.createNATRuleForServer()
229235
if err != nil {
230236
return err
@@ -239,15 +245,22 @@ func (driver *Driver) Create() error {
239245
if err != nil {
240246
return err
241247
}
242-
log.Infof("Local machine's public IP address is '%s'.", clientPublicIPAddress)
248+
249+
log.Infof("Creating firewall rule to enable inbound SSH traffic from local machine '%s' ('%s') to '%s' ('%s':%d)...",
250+
os.Getenv("HOST"),
251+
clientPublicIPAddress,
252+
driver.MachineName,
253+
driver.IPAddress,
254+
driver.SSHPort,
255+
)
243256

244257
err = driver.createSSHFirewallRule(clientPublicIPAddress)
245258
if err != nil {
246259
return err
247260
}
248261
}
249262

250-
log.Infof("Configuring SSH key for server '%s' ('%s')...", driver.MachineName, driver.IPAddress)
263+
log.Infof("Installing SSH key for server '%s' ('%s')...", driver.MachineName, driver.IPAddress)
251264
err = driver.installSSHKey()
252265
if err != nil {
253266
return err
@@ -258,7 +271,7 @@ func (driver *Driver) Create() error {
258271
return nil
259272
}
260273

261-
// GetState retrieves the status of a Docker Machine instance in CloudControl.
274+
// GetState retrieves the status of the target Docker Machine instance in CloudControl.
262275
func (driver *Driver) GetState() (state.State, error) {
263276
server, err := driver.getServer()
264277
if err != nil {
@@ -335,7 +348,7 @@ func (driver *Driver) Remove() error {
335348
return err
336349
}
337350

338-
err = client.WaitForDelete(compute.ResourceTypeServer, driver.ServerID, 10*time.Minute)
351+
err = client.WaitForDelete(compute.ResourceTypeServer, driver.ServerID, serverDeleteTimeout)
339352
if err != nil {
340353
return err
341354
}
@@ -347,60 +360,12 @@ func (driver *Driver) Remove() error {
347360

348361
// Start the target machine.
349362
func (driver *Driver) Start() error {
350-
server, err := driver.getServer()
351-
if err != nil {
352-
return err
353-
}
354-
if server == nil {
355-
return fmt.Errorf("Server '%s' not found.", driver.ServerID)
356-
}
357-
358-
if !server.Started {
359-
return nil
360-
}
361-
362-
client, err := driver.getCloudControlClient()
363-
if err != nil {
364-
return err
365-
}
366-
367-
err = client.StartServer(driver.ServerID)
368-
if err != nil {
369-
return err
370-
}
371-
372-
_, err = client.WaitForChange(compute.ResourceTypeServer, driver.ServerID, "Start server", 3*time.Minute)
373-
374-
return err
363+
return driver.startServer()
375364
}
376365

377366
// Stop the target machine (gracefully).
378367
func (driver *Driver) Stop() error {
379-
server, err := driver.getServer()
380-
if err != nil {
381-
return err
382-
}
383-
if server == nil {
384-
return fmt.Errorf("Server '%s' not found.", driver.ServerID)
385-
}
386-
387-
if !server.Started {
388-
return nil
389-
}
390-
391-
client, err := driver.getCloudControlClient()
392-
if err != nil {
393-
return err
394-
}
395-
396-
err = client.ShutdownServer(driver.ServerID)
397-
if err != nil {
398-
return err
399-
}
400-
401-
_, err = client.WaitForChange(compute.ResourceTypeServer, driver.ServerID, "Shut down server", 3*time.Minute)
402-
403-
return err
368+
return driver.stopServer()
404369
}
405370

406371
// Restart the target machine.
@@ -415,31 +380,7 @@ func (driver *Driver) Restart() error {
415380

416381
// Kill the target machine (hard shutdown).
417382
func (driver *Driver) Kill() error {
418-
server, err := driver.getServer()
419-
if err != nil {
420-
return err
421-
}
422-
if server == nil {
423-
return fmt.Errorf("Server '%s' not found.", driver.ServerID)
424-
}
425-
426-
if !server.Started {
427-
return nil
428-
}
429-
430-
client, err := driver.getCloudControlClient()
431-
if err != nil {
432-
return err
433-
}
434-
435-
err = client.PowerOffServer(driver.ServerID)
436-
if err != nil {
437-
return err
438-
}
439-
440-
_, err = client.WaitForChange(compute.ResourceTypeServer, driver.ServerID, "Power off server", 3*time.Minute)
441-
442-
return err
383+
return driver.powerOffServer()
443384
}
444385

445386
// GetSSHHostname returns the hostname for SSH

main.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package main
22

3+
/*
4+
* Main program entry-point
5+
* ------------------------
6+
*/
7+
38
import (
49
"fmt"
510
"github.com/docker/machine/libmachine/drivers"

ssh_bootstrap.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
package main
22

3+
/*
4+
* SSH key bootstrapper
5+
* --------------------
6+
*
7+
* Installs an SSH key onto the target machine so the rest of docker-machine can do its stuff (then disables password authentication).
8+
*
9+
* This is required because CloudControl only supports specifying passwords during server deployment (not SSH keys).
10+
*/
11+
312
import (
413
"errors"
514
"fmt"

0 commit comments

Comments
 (0)