@@ -15,6 +15,7 @@ import (
15
15
"regexp"
16
16
"sort"
17
17
"strconv"
18
+ "strings"
18
19
"sync"
19
20
"sync/atomic"
20
21
"time"
@@ -41,6 +42,7 @@ const (
41
42
maxNumberOfPortsToCheck = 5
42
43
portCheckingTimeout = 3 * time .Second
43
44
unknownVersion = "unknown"
45
+ wildcardIP = "0.0.0.0"
44
46
)
45
47
46
48
// PortPool describes an available port range for clones.
@@ -73,11 +75,12 @@ type Provisioner struct {
73
75
pm * pool.Manager
74
76
networkID string
75
77
instanceID string
78
+ gateway string
76
79
}
77
80
78
81
// New creates a new Provisioner instance.
79
82
func New (ctx context.Context , cfg * Config , dbCfg * resources.DB , docker * client.Client , pm * pool.Manager ,
80
- instanceID , networkID string ) (* Provisioner , error ) {
83
+ instanceID , networkID , gateway string ) (* Provisioner , error ) {
81
84
if err := IsValidConfig (* cfg ); err != nil {
82
85
return nil , errors .Wrap (err , "configuration is not valid" )
83
86
}
@@ -93,6 +96,7 @@ func New(ctx context.Context, cfg *Config, dbCfg *resources.DB, docker *client.C
93
96
pm : pm ,
94
97
networkID : networkID ,
95
98
instanceID : instanceID ,
99
+ gateway : gateway ,
96
100
ports : make ([]bool , cfg .PortPool .To - cfg .PortPool .From + 1 ),
97
101
}
98
102
@@ -435,7 +439,7 @@ func getLatestSnapshot(snapshots []resources.Snapshot) (*resources.Snapshot, err
435
439
func (p * Provisioner ) RevisePortPool () error {
436
440
log .Msg (fmt .Sprintf ("Revising availability of the port range [%d - %d]" , p .config .PortPool .From , p .config .PortPool .To ))
437
441
438
- host , err := externalIP ( )
442
+ host , err := hostIP ( p . gateway )
439
443
if err != nil {
440
444
return err
441
445
}
@@ -468,13 +472,21 @@ func (p *Provisioner) RevisePortPool() error {
468
472
return nil
469
473
}
470
474
475
+ func hostIP (gateway string ) (string , error ) {
476
+ if gateway != "" {
477
+ return gateway , nil
478
+ }
479
+
480
+ return externalIP ()
481
+ }
482
+
471
483
// allocatePort tries to find a free port and occupy it.
472
484
func (p * Provisioner ) allocatePort () (uint , error ) {
473
485
portOpts := p .config .PortPool
474
486
475
487
attempts := 0
476
488
477
- host , err := externalIP ( )
489
+ host , err := hostIP ( p . gateway )
478
490
if err != nil {
479
491
return 0 , err
480
492
}
@@ -598,6 +610,8 @@ func (p *Provisioner) stopPoolSessions(fsm pool.FSManager, exceptClones map[stri
598
610
}
599
611
600
612
func (p * Provisioner ) getAppConfig (pool * resources.Pool , name string , port uint ) * resources.AppConfig {
613
+ provisionHosts := p .getProvisionHosts ()
614
+
601
615
appConfig := & resources.AppConfig {
602
616
CloneName : name ,
603
617
DockerImage : p .config .DockerImage ,
@@ -607,12 +621,33 @@ func (p *Provisioner) getAppConfig(pool *resources.Pool, name string, port uint)
607
621
Pool : pool ,
608
622
ContainerConf : p .config .ContainerConfig ,
609
623
NetworkID : p .networkID ,
610
- ProvisionHosts : p . config . CloneAccessAddresses ,
624
+ ProvisionHosts : provisionHosts ,
611
625
}
612
626
613
627
return appConfig
614
628
}
615
629
630
+ // getProvisionHosts adds an internal Docker gateway to the hosts rule if the user restricts access to IP addresses.
631
+ func (p * Provisioner ) getProvisionHosts () string {
632
+ provisionHosts := p .config .CloneAccessAddresses
633
+
634
+ if provisionHosts == "" || provisionHosts == wildcardIP {
635
+ return provisionHosts
636
+ }
637
+
638
+ hostSet := []string {p .gateway }
639
+
640
+ for _ , hostIP := range strings .Split (provisionHosts , "," ) {
641
+ if hostIP != p .gateway {
642
+ hostSet = append (hostSet , hostIP )
643
+ }
644
+ }
645
+
646
+ provisionHosts = strings .Join (hostSet , "," )
647
+
648
+ return provisionHosts
649
+ }
650
+
616
651
// LastSessionActivity returns the time of the last session activity.
617
652
func (p * Provisioner ) LastSessionActivity (session * resources.Session , minimumTime time.Time ) (* time.Time , error ) {
618
653
fsm , err := p .pm .GetFSManager (session .Pool )
0 commit comments