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

70 lines
1.7 KiB
Go

package task
import (
"context"
"log"
"github.com/docker/docker/api/types/swarm"
"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 DockerSwarmStatus struct {
IsManager bool `json:"is_manager"`
IsWorker bool `json:"is_worker"`
Instance string `json:"instance"`
}
type checkSwarmStatus struct {
event event.EventApi
factory docker.FactoryApi
}
var CheckSwarmStatusEvent event.EventType
func init() {
CheckSwarmStatusEvent = event.EventType("instance docker swarm status")
}
func (t *checkSwarmStatus) Name() string {
return "CheckSwarmStatus"
}
func (t *checkSwarmStatus) 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
}
status.Instance = instance.Name
t.event.Emit(CheckSwarmStatusEvent, instance.SessionId, status)
return nil
}
func NewCheckSwarmStatus(e event.EventApi, f docker.FactoryApi) *checkSwarmStatus {
return &checkSwarmStatus{event: e, factory: f}
}
func getDockerSwarmStatus(ctx context.Context, client docker.DockerApi) (DockerSwarmStatus, error) {
status := DockerSwarmStatus{}
info, err := client.GetDaemonInfo()
if err != nil {
return status, err
}
if info.Swarm.LocalNodeState != swarm.LocalNodeStateInactive && info.Swarm.LocalNodeState != swarm.LocalNodeStateLocked {
status.IsManager = info.Swarm.ControlAvailable
status.IsWorker = !info.Swarm.ControlAvailable
}
return status, nil
}