diff --git a/pwd/check_swarm_status_task.go b/pwd/check_swarm_status_task.go index 297a36b..3019a27 100644 --- a/pwd/check_swarm_status_task.go +++ b/pwd/check_swarm_status_task.go @@ -10,6 +10,9 @@ type checkSwarmStatusTask struct { } func (c checkSwarmStatusTask) Run(i *Instance) error { + if i.docker == nil { + return nil + } if info, err := i.docker.GetDaemonInfo(); err == nil { if info.Swarm.LocalNodeState != swarm.LocalNodeStateInactive && info.Swarm.LocalNodeState != swarm.LocalNodeStateLocked { i.IsManager = &info.Swarm.ControlAvailable diff --git a/pwd/check_swarm_used_ports.go b/pwd/check_swarm_used_ports.go index c01025b..7157240 100644 --- a/pwd/check_swarm_used_ports.go +++ b/pwd/check_swarm_used_ports.go @@ -9,6 +9,9 @@ type checkSwarmUsedPortsTask struct { } func (c checkSwarmUsedPortsTask) Run(i *Instance) error { + if i.docker == nil { + return nil + } if i.IsManager != nil && *i.IsManager { sessionPrefix := i.session.Id[:8] // This is a swarm manager instance, then check for ports diff --git a/pwd/check_used_ports_task.go b/pwd/check_used_ports_task.go index deae46a..74e3f3b 100644 --- a/pwd/check_used_ports_task.go +++ b/pwd/check_used_ports_task.go @@ -6,6 +6,9 @@ type checkUsedPortsTask struct { } func (c checkUsedPortsTask) Run(i *Instance) error { + if i.docker == nil { + return nil + } if ports, err := i.docker.GetPorts(); err == nil { for _, p := range ports { i.setUsedPort(uint16(p)) diff --git a/pwd/instance.go b/pwd/instance.go index 81ac9ca..a9ec36a 100644 --- a/pwd/instance.go +++ b/pwd/instance.go @@ -35,26 +35,27 @@ func (p UInt16Slice) Less(i, j int) bool { return p[i] < p[j] } func (p UInt16Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } type Instance struct { - Image string `json:"image"` - Name string `json:"name"` - Hostname string `json:"hostname"` - IP string `json:"ip"` - IsManager *bool `json:"is_manager"` - Mem string `json:"mem"` - Cpu string `json:"cpu"` - Alias string `json:"alias"` - ServerCert []byte `json:"server_cert"` - ServerKey []byte `json:"server_key"` - CACert []byte `json:"ca_cert"` - Cert []byte `json:"cert"` - Key []byte `json:"key"` - session *Session `json:"-"` - conn net.Conn `json:"-"` - ctx context.Context `json:"-"` - docker docker.DockerApi `json:"-"` - tempPorts []uint16 `json:"-"` - Ports UInt16Slice - rw sync.Mutex + Image string `json:"image"` + Name string `json:"name"` + Hostname string `json:"hostname"` + IP string `json:"ip"` + IsManager *bool `json:"is_manager"` + Mem string `json:"mem"` + Cpu string `json:"cpu"` + Alias string `json:"alias"` + ServerCert []byte `json:"server_cert"` + ServerKey []byte `json:"server_key"` + CACert []byte `json:"ca_cert"` + Cert []byte `json:"cert"` + Key []byte `json:"key"` + IsDockerHost bool `json:"is_docker_host"` + session *Session `json:"-"` + conn net.Conn `json:"-"` + ctx context.Context `json:"-"` + docker docker.DockerApi `json:"-"` + tempPorts []uint16 `json:"-"` + Ports UInt16Slice + rw sync.Mutex } type InstanceConfig struct { ImageName string @@ -236,6 +237,8 @@ func (p *pwd) InstanceNew(session *Session, conf InstanceConfig) (*Instance, err instance.ServerKey = conf.ServerKey instance.CACert = conf.CACert instance.session = session + // For now this condition holds through. In the future we might need a more complex logic. + instance.IsDockerHost = opts.Privileged if session.Instances == nil { session.Instances = make(map[string]*Instance) diff --git a/pwd/instance_test.go b/pwd/instance_test.go index 4ff73ce..15a567a 100644 --- a/pwd/instance_test.go +++ b/pwd/instance_test.go @@ -61,12 +61,13 @@ func TestInstanceNew(t *testing.T) { assert.Nil(t, err) expectedInstance := Instance{ - Name: fmt.Sprintf("%s_node1", session.Id[:8]), - Hostname: "node1", - IP: "10.0.0.1", - Alias: "", - Image: config.GetDindImageName(), - session: session, + Name: fmt.Sprintf("%s_node1", session.Id[:8]), + Hostname: "node1", + IP: "10.0.0.1", + Alias: "", + Image: config.GetDindImageName(), + IsDockerHost: true, + session: session, } assert.Equal(t, expectedInstance, *instance) @@ -108,12 +109,13 @@ func TestInstanceNew_WithNotAllowedImage(t *testing.T) { assert.Nil(t, err) expectedInstance := Instance{ - Name: fmt.Sprintf("%s_node1", session.Id[:8]), - Hostname: "node1", - IP: "10.0.0.1", - Alias: "", - Image: "redis", - session: session, + Name: fmt.Sprintf("%s_node1", session.Id[:8]), + Hostname: "node1", + IP: "10.0.0.1", + Alias: "", + Image: "redis", + IsDockerHost: false, + session: session, } assert.Equal(t, expectedInstance, *instance) diff --git a/pwd/tasks.go b/pwd/tasks.go index 9a6071e..2b8ae57 100644 --- a/pwd/tasks.go +++ b/pwd/tasks.go @@ -45,7 +45,7 @@ func (sch *scheduler) Schedule(s *Session) { wg.Add(len(s.Instances)) for _, ins := range s.Instances { var i *Instance = ins - if i.docker == nil { + if i.docker == nil && i.IsDockerHost { // Need to create client to the DinD docker daemon // We check if the client needs to use TLS