package services import ( "fmt" "localenv/utils" "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/client" "golang.org/x/net/context" ) const ( NginxImageName string = "localenv-nginx:latest" NginxServiceName string = "nginx" NginxServicePort uint32 = 4443 ) type Nginx struct { Service } func NewNginx() Nginx { var nx Nginx nx.name = fmt.Sprintf("localenv-%s", NginxServiceName) nx.spec = nx.getServiceSpec( WithMSNetwork(), WithHostEndpoint(NginxServicePort), WithRestartPolicy(), ) return nx } func (n *Nginx) getServiceSpec(opts ...ServiceOption) swarm.ServiceSpec { spec := swarm.ServiceSpec{ Annotations: swarm.Annotations{ Name: n.name, }, TaskTemplate: swarm.TaskSpec{ ContainerSpec: &swarm.ContainerSpec{ Image: NginxImageName, }, }, Mode: swarm.ServiceMode{ Replicated: &swarm.ReplicatedService{ Replicas: &SwarmServiceReplicas, }, }, } for _, opt := range opts { opt(&spec) } return spec } func (n *Nginx) Deploy(ctx context.Context, cli *client.Client) error { if err := utils.CreateService(ctx, cli, &n.spec); err != nil { return err } if err := utils.CheckServiceHealthWithRetry(ctx, cli, n.name); err != nil { return err } return nil }