@@ -5,9 +5,12 @@ import (
5
5
"fmt"
6
6
"github.com/DimensionDataResearch/go-dd-cloud-compute/compute"
7
7
"github.com/docker/machine/libmachine/log"
8
+ "strings"
8
9
"time"
9
10
)
10
11
12
+ var firewallRuleNameSanitizer = strings .NewReplacer ("-" , "." , "_" , "." )
13
+
11
14
// Get the CloudControl API client used by the driver.
12
15
func (driver * Driver ) getCloudControlClient () (client * compute.Client , err error ) {
13
16
client = driver .client
@@ -49,7 +52,7 @@ func (driver *Driver) isServerCreated() bool {
49
52
// Retrieve the target server (must have been created, or an error is returned).
50
53
func (driver * Driver ) getServer () (* compute.Server , error ) {
51
54
if ! driver .isServerCreated () {
52
- return nil , errors . New ("Server has not been created" )
55
+ return nil , fmt . Errorf ("Server '%s' has not been created" , driver . MachineName )
53
56
}
54
57
55
58
client , err := driver .getCloudControlClient ()
@@ -273,7 +276,7 @@ func (driver *Driver) isNATRuleCreated() bool {
273
276
// Create a NAT rule to expose the server.
274
277
func (driver * Driver ) createNATRuleForServer () error {
275
278
if ! driver .isServerCreated () {
276
- return errors . New ("Server has not been created" )
279
+ return fmt . Errorf ("Server '%s' has not been created" , driver . MachineName )
277
280
}
278
281
279
282
if driver .isNATRuleCreated () {
@@ -328,7 +331,7 @@ func (driver *Driver) createNATRuleForServer() error {
328
331
// Delete the the server's NAT rule (if any).
329
332
func (driver * Driver ) deleteNATRuleForServer () error {
330
333
if ! driver .isServerCreated () {
331
- return errors . New ("Server has not been created" )
334
+ return fmt . Errorf ("Server '%s' has not been created" , driver . MachineName )
332
335
}
333
336
334
337
if ! driver .isNATRuleCreated () {
@@ -439,3 +442,78 @@ func (driver *Driver) ensurePublicIPAvailable() error {
439
442
func (driver * Driver ) isSSHFirewallRuleCreated () bool {
440
443
return driver .SSHFirewallRuleID != ""
441
444
}
445
+
446
+ // Create a firewall rule to enable inbound SSH connections to the target server from the client machine's (external) IP address.
447
+ func (driver * Driver ) createSSHFirewallRule (clientPublicIPAddress string ) error {
448
+ if ! driver .isServerCreated () {
449
+ return fmt .Errorf ("Server '%s' has not been created" , driver .MachineName )
450
+ }
451
+
452
+ if driver .isSSHFirewallRuleCreated () {
453
+ return fmt .Errorf ("Firewall rule '%s' has already been created for server '%s'" , driver .SSHFirewallRuleID , driver .MachineName )
454
+ }
455
+
456
+ log .Debugf ("Creating SSH firewall rule for server '%s' (allow inbound traffic on port %d from '%s' to '%s')..." ,
457
+ driver .MachineName ,
458
+ driver .SSHPort ,
459
+ clientPublicIPAddress ,
460
+ driver .IPAddress ,
461
+ )
462
+
463
+ ruleConfiguration := compute.FirewallRuleConfiguration {
464
+ Name : firewallRuleNameSanitizer .Replace (driver .MachineName ),
465
+ }
466
+ ruleConfiguration .Accept ()
467
+ ruleConfiguration .Enable ()
468
+ ruleConfiguration .MatchSourceAddress (clientPublicIPAddress )
469
+ ruleConfiguration .MatchDestinationAddress (driver .IPAddress )
470
+ ruleConfiguration .MatchDestinationPort (driver .SSHPort )
471
+
472
+ client , err := driver .getCloudControlClient ()
473
+ if err != nil {
474
+ return err
475
+ }
476
+
477
+ firewallRuleID , err := client .CreateFirewallRule (ruleConfiguration )
478
+ if err != nil {
479
+ return err
480
+ }
481
+
482
+ driver .SSHFirewallRuleID = firewallRuleID
483
+
484
+ log .Debugf ("Created SSH firewall rule '%s' for server '%s'." , driver .SSHFirewallRuleID , driver .ServerID )
485
+
486
+ return nil
487
+ }
488
+
489
+ // Delete the firewall rule that enables inbound SSH connections to the target server from the client machine's (external) IP address.
490
+ func (driver * Driver ) deleteSSHFirewallRule () error {
491
+ if ! driver .isServerCreated () {
492
+ return fmt .Errorf ("Server '%s' has not been created" , driver .MachineName )
493
+ }
494
+
495
+ if ! driver .isSSHFirewallRuleCreated () {
496
+ return fmt .Errorf ("Firewall rule has not been created for server '%s'" , driver .MachineName )
497
+ }
498
+
499
+ log .Debugf ("Deleting SSH firewall rule '%s' for server '%s'..." ,
500
+ driver .MachineName ,
501
+ driver .SSHFirewallRuleID ,
502
+ )
503
+
504
+ client , err := driver .getCloudControlClient ()
505
+ if err != nil {
506
+ return err
507
+ }
508
+
509
+ err = client .DeleteFirewallRule (driver .SSHFirewallRuleID )
510
+ if err != nil {
511
+ return err
512
+ }
513
+
514
+ log .Debugf ("Deleted firewall rule '%s'." , driver .SSHFirewallRuleID )
515
+
516
+ driver .SSHFirewallRuleID = ""
517
+
518
+ return nil
519
+ }
0 commit comments