@@ -88,6 +88,11 @@ func (c *ComputeUtil) disk() (*raw.Disk, error) {
8888
8989// deleteDisk deletes the persistent disk.
9090func (c * ComputeUtil ) deleteDisk () error {
91+ disk , _ := c .disk ()
92+ if disk == nil {
93+ return nil
94+ }
95+
9196 log .Infof ("Deleting disk." )
9297 op , err := c .service .Disks .Delete (c .project , c .zone , c .diskName ()).Do ()
9398 if err != nil {
@@ -162,8 +167,9 @@ func (c *ComputeUtil) portsUsed() ([]string, error) {
162167 return ports , nil
163168}
164169
165- func (c * ComputeUtil ) createFirewallRule () error {
166- log .Infof ("Opening firewall ports." )
170+ // openFirewallPorts configures the firewall to open docker and swarm ports.
171+ func (c * ComputeUtil ) openFirewallPorts () error {
172+ log .Infof ("Opening firewall ports" )
167173
168174 create := false
169175 rule , _ := c .firewallRule ()
@@ -213,11 +219,7 @@ func (c *ComputeUtil) instance() (*raw.Instance, error) {
213219
214220// createInstance creates a GCE VM instance.
215221func (c * ComputeUtil ) createInstance (d * Driver ) error {
216- log .Infof ("Creating instance." )
217-
218- if err := c .createFirewallRule (); err != nil {
219- return err
220- }
222+ log .Infof ("Creating instance" )
221223
222224 instance := & raw.Instance {
223225 Name : c .instanceName ,
@@ -280,7 +282,7 @@ func (c *ComputeUtil) createInstance(d *Driver) error {
280282 return err
281283 }
282284
283- log .Infof ("Waiting for Instance... " )
285+ log .Infof ("Waiting for Instance" )
284286 if err = c .waitForRegionalOp (op .Name ); err != nil {
285287 return err
286288 }
@@ -290,15 +292,58 @@ func (c *ComputeUtil) createInstance(d *Driver) error {
290292 return err
291293 }
292294
293- // Update the SSH Key
294- sshKey , err := ioutil .ReadFile (d .GetSSHKeyPath () + ".pub" )
295+ return c .uploadSSHKey (instance , d .GetSSHKeyPath ())
296+ }
297+
298+ // configureInstance configures an existing instance for use with Docker Machine.
299+ func (c * ComputeUtil ) configureInstance (d * Driver ) error {
300+ log .Infof ("Configuring instance" )
301+
302+ instance , err := c .instance ()
295303 if err != nil {
296304 return err
297305 }
298306
307+ if err := c .addFirewallTag (instance ); err != nil {
308+ return err
309+ }
310+
311+ return c .uploadSSHKey (instance , d .GetSSHKeyPath ())
312+ }
313+
314+ // addFirewallTag adds a tag to the instance to match the firewall rule.
315+ func (c * ComputeUtil ) addFirewallTag (instance * raw.Instance ) error {
316+ log .Infof ("Adding tag for the firewall rule" )
317+
318+ tags := instance .Tags
319+ for _ , tag := range tags .Items {
320+ if tag == firewallTargetTag {
321+ return nil
322+ }
323+ }
324+
325+ tags .Items = append (tags .Items , firewallTargetTag )
326+
327+ op , err := c .service .Instances .SetTags (c .project , c .zone , instance .Name , tags ).Do ()
328+ if err != nil {
329+ return err
330+ }
331+
332+ return c .waitForRegionalOp (op .Name )
333+ }
334+
335+ // uploadSSHKey updates the instance metadata with the given ssh key.
336+ func (c * ComputeUtil ) uploadSSHKey (instance * raw.Instance , sshKeyPath string ) error {
299337 log .Infof ("Uploading SSH Key" )
338+
339+ sshKey , err := ioutil .ReadFile (sshKeyPath + ".pub" )
340+ if err != nil {
341+ return err
342+ }
343+
300344 metaDataValue := fmt .Sprintf ("%s:%s %s\n " , c .userName , strings .TrimSpace (string (sshKey )), c .userName )
301- op , err = c .service .Instances .SetMetadata (c .project , c .zone , c .instanceName , & raw.Metadata {
345+
346+ op , err := c .service .Instances .SetMetadata (c .project , c .zone , c .instanceName , & raw.Metadata {
302347 Fingerprint : instance .Metadata .Fingerprint ,
303348 Items : []* raw.MetadataItems {
304349 {
@@ -307,10 +352,6 @@ func (c *ComputeUtil) createInstance(d *Driver) error {
307352 },
308353 },
309354 }).Do ()
310- if err != nil {
311- return err
312- }
313- log .Infof ("Waiting for SSH Key" )
314355
315356 return c .waitForRegionalOp (op .Name )
316357}
@@ -360,14 +401,15 @@ func (c *ComputeUtil) startInstance() error {
360401 return c .waitForRegionalOp (op .Name )
361402}
362403
404+ // waitForOp waits for the operation to finish.
363405func (c * ComputeUtil ) waitForOp (opGetter func () (* raw.Operation , error )) error {
364406 for {
365407 op , err := opGetter ()
366408 if err != nil {
367409 return err
368410 }
369411
370- log .Debugf ("operation %q status: %s" , op .Name , op .Status )
412+ log .Debugf ("Operation %q status: %s" , op .Name , op .Status )
371413 if op .Status == "DONE" {
372414 if op .Error != nil {
373415 return fmt .Errorf ("Operation error: %v" , * op .Error .Errors [0 ])
@@ -379,7 +421,7 @@ func (c *ComputeUtil) waitForOp(opGetter func() (*raw.Operation, error)) error {
379421 return nil
380422}
381423
382- // waitForOp waits for the operation to finish.
424+ // waitForRegionalOp waits for the regional operation to finish.
383425func (c * ComputeUtil ) waitForRegionalOp (name string ) error {
384426 return c .waitForOp (func () (* raw.Operation , error ) {
385427 return c .service .ZoneOperations .Get (c .project , c .zone , name ).Do ()
0 commit comments