mirror of
https://github.com/bytedream/docker4ssh.git
synced 2025-05-09 12:15:11 +02:00
65 lines
2.1 KiB
Go
65 lines
2.1 KiB
Go
package validate
|
|
|
|
import (
|
|
"context"
|
|
"docker4ssh/config"
|
|
"docker4ssh/docker"
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/api/types/filters"
|
|
"github.com/docker/docker/client"
|
|
)
|
|
|
|
func NewProfileValidator(cli *client.Client, strict bool, profile *config.Profile) *ProfileValidator {
|
|
return &ProfileValidator{
|
|
Validator: &Validator{
|
|
Cli: cli,
|
|
Strict: strict,
|
|
},
|
|
Profile: profile,
|
|
}
|
|
}
|
|
|
|
type ProfileValidator struct {
|
|
*Validator
|
|
|
|
Profile *config.Profile
|
|
}
|
|
|
|
func (pv *ProfileValidator) Validate() *ValidatorResult {
|
|
profile := pv.Profile
|
|
errors := make([]*ValidateError, 0)
|
|
|
|
networkMode := docker.NetworkMode(profile.NetworkMode)
|
|
if docker.Off > networkMode || networkMode > docker.None {
|
|
errors = append(errors, newValidateError(profile.Name(), "NetworkMode", profile.NetworkMode, "not a valid network mode", nil))
|
|
}
|
|
runLevel := docker.RunLevel(profile.RunLevel)
|
|
if docker.User > runLevel || runLevel > docker.Forever {
|
|
errors = append(errors, newValidateError(profile.Name(), "RunLevel", profile.RunLevel, "is not a valid run level", nil))
|
|
}
|
|
if profile.Image == "" && profile.ContainerID == "" {
|
|
errors = append(errors, newValidateError(profile.Name(), "image/container", "", "Image OR Container must be specified, neither both nor none", nil))
|
|
} else if pv.Strict {
|
|
if profile.Image != "" {
|
|
list, err := pv.Cli.ImageList(context.Background(), types.ImageListOptions{
|
|
Filters: filters.NewArgs(filters.Arg("reference", profile.Image)),
|
|
})
|
|
if err != nil || len(list) == 0 {
|
|
errors = append(errors, newValidateError(profile.Name(), "Image", profile.Image, "image does not exist", nil))
|
|
}
|
|
} else if profile.ContainerID != "" {
|
|
list, err := pv.Cli.ContainerList(context.Background(), types.ContainerListOptions{
|
|
Filters: filters.NewArgs(filters.Arg("id", profile.ContainerID)),
|
|
})
|
|
if err != nil || len(list) == 0 {
|
|
errors = append(errors, newValidateError(profile.Name(), "Image", profile.Image, "container does not exist", nil))
|
|
}
|
|
}
|
|
}
|
|
|
|
return &ValidatorResult{
|
|
Strict: pv.Strict,
|
|
Errors: errors,
|
|
}
|
|
}
|