Files
play-with-docker/scheduler/task/check_swarm_ports.go
2017-08-11 18:16:14 -03:00

73 lines
1.6 KiB
Go

package task
import (
"context"
"fmt"
"log"
"github.com/play-with-docker/play-with-docker/docker"
"github.com/play-with-docker/play-with-docker/event"
"github.com/play-with-docker/play-with-docker/pwd/types"
)
type DockerSwarmPorts struct {
Manager string `json:"manager"`
Instances []string `json:"instances"`
Ports []int `json:"ports"`
}
type checkSwarmPorts struct {
event event.EventApi
factory docker.FactoryApi
}
var CheckSwarmPortsEvent event.EventType
func init() {
CheckSwarmPortsEvent = event.EventType("instance docker swarm ports")
}
func (t *checkSwarmPorts) Name() string {
return "CheckSwarmPorts"
}
func (t *checkSwarmPorts) Run(ctx context.Context, instance *types.Instance) error {
dockerClient, err := t.factory.GetForInstance(instance)
if err != nil {
log.Println(err)
return err
}
status, err := getDockerSwarmStatus(ctx, dockerClient)
if err != nil {
log.Println(err)
return err
}
if !status.IsManager {
return nil
}
hosts, ps, err := dockerClient.GetSwarmPorts()
if err != nil {
log.Println(err)
return err
}
instances := make([]string, len(hosts))
sessionPrefix := instance.SessionId[:8]
for i, host := range hosts {
instances[i] = fmt.Sprintf("%s_%s", sessionPrefix, host)
}
ports := make([]int, len(ps))
for i, port := range ps {
ports[i] = int(port)
}
t.event.Emit(CheckSwarmPortsEvent, instance.SessionId, DockerSwarmPorts{Manager: instance.Name, Instances: instances, Ports: ports})
return nil
}
func NewCheckSwarmPorts(e event.EventApi, f docker.FactoryApi) *checkSwarmPorts {
return &checkSwarmPorts{event: e, factory: f}
}