Build out the docker environment a bit more
This commit is contained in:
parent
447dafc76d
commit
3b4555344c
|
@ -2,6 +2,7 @@ package server
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/docker/docker/api/types"
|
||||
"github.com/docker/docker/api/types/container"
|
||||
"github.com/docker/docker/api/types/mount"
|
||||
"github.com/docker/docker/client"
|
||||
|
@ -11,6 +12,7 @@ import (
|
|||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Defines the docker configuration used by the daemon when interacting with
|
||||
|
@ -46,32 +48,83 @@ type DockerConfiguration struct {
|
|||
TimezonePath string `yaml:"timezone_path"`
|
||||
}
|
||||
|
||||
// Defines the base environment for Docker instances running through Wings.
|
||||
type DockerEnvironment struct {
|
||||
Server *Server
|
||||
|
||||
// Defines the configuration for the Docker instance that will allow us to connect
|
||||
// and create and modify containers.
|
||||
Configuration DockerConfiguration
|
||||
|
||||
// The Docker client being used for this instance.
|
||||
Client *client.Client
|
||||
}
|
||||
|
||||
// Creates a new base Docker environment. A server must still be attached to it.
|
||||
func NewDockerEnvironment(cfg DockerConfiguration) (*DockerEnvironment, error) {
|
||||
cli, err := client.NewClientWithOpts(client.FromEnv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &DockerEnvironment{
|
||||
Configuration: cfg,
|
||||
Client: cli,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Ensure that the Docker environment is always implementing all of the methods
|
||||
// from the base environment interface.
|
||||
var _ Environment = (*DockerEnvironment)(nil)
|
||||
|
||||
// Determines if the container exists in this environment.
|
||||
func (d *DockerEnvironment) Exists() bool {
|
||||
return true
|
||||
_, err := d.Client.ContainerInspect(context.Background(), d.Server.Uuid)
|
||||
|
||||
return err == nil
|
||||
}
|
||||
|
||||
// Checks if there is a container that already exists for the server. If so that
|
||||
// container is started. If there is no container, one is created and then started.
|
||||
func (d *DockerEnvironment) Start() error {
|
||||
c, err := d.Client.ContainerInspect(context.Background(), d.Server.Uuid)
|
||||
if err != nil {
|
||||
// @todo what?
|
||||
return err
|
||||
}
|
||||
|
||||
// No reason to try starting a container that is already running.
|
||||
if c.State.Running {
|
||||
return nil
|
||||
}
|
||||
|
||||
opts := types.ContainerStartOptions{}
|
||||
|
||||
return d.Client.ContainerStart(context.Background(), d.Server.Uuid, opts)
|
||||
}
|
||||
|
||||
// Stops the container that the server is running in. This will allow up to 10
|
||||
// seconds to pass before a failure occurs.
|
||||
func (d *DockerEnvironment) Stop() error {
|
||||
return nil
|
||||
t := time.Second * 10
|
||||
|
||||
return d.Client.ContainerStop(context.Background(), d.Server.Uuid, &t)
|
||||
}
|
||||
|
||||
// Forcefully terminates the container using the signal passed through.
|
||||
func (d *DockerEnvironment) Terminate(signal os.Signal) error {
|
||||
ctx := context.Background()
|
||||
|
||||
c, err := d.Client.ContainerInspect(ctx, d.Server.Uuid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !c.State.Running {
|
||||
return nil
|
||||
}
|
||||
|
||||
return d.Client.ContainerKill(ctx, d.Server.Uuid, signal.String())
|
||||
}
|
||||
|
||||
// Creates a new container for the server using all of the data that is currently
|
||||
|
|
|
@ -173,9 +173,11 @@ func FromConfiguration(data []byte, cfg DockerConfiguration) (*Server, error) {
|
|||
// this logic in. When we're ready to support other environment we'll need to make
|
||||
// some modifications here obviously.
|
||||
var env Environment
|
||||
env = &DockerEnvironment{
|
||||
Server: s,
|
||||
Configuration: cfg,
|
||||
if t, err := NewDockerEnvironment(cfg); err != nil {
|
||||
t.Server = s
|
||||
env = t
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
s.environment = env
|
||||
|
|
Loading…
Reference in New Issue
Block a user