86 lines
1.7 KiB
Go
86 lines
1.7 KiB
Go
package services
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"localenv/utils"
|
|
|
|
"github.com/docker/docker/api/types/mount"
|
|
"github.com/docker/docker/api/types/swarm"
|
|
"github.com/docker/docker/client"
|
|
"golang.org/x/net/context"
|
|
)
|
|
|
|
const (
|
|
RabbitMQImageName string = "rabbitmq:3-management-alpine"
|
|
RabbitMQServiceName string = "rabbitmq"
|
|
|
|
RabbitMQServicePort uint32 = 5672
|
|
RabbitMQServiceManagementPort uint32 = 15672
|
|
)
|
|
|
|
type RabbitMQ struct {
|
|
Service
|
|
}
|
|
|
|
func NewRabbitMQ() RabbitMQ {
|
|
var rq RabbitMQ
|
|
|
|
rq.name = fmt.Sprintf("localenv-%s", RabbitMQServiceName)
|
|
rq.spec = rq.getServiceSpec(
|
|
WithIONetwork(),
|
|
WithHostEndpoint(RabbitMQServiceManagementPort),
|
|
WithRestartPolicy(),
|
|
)
|
|
|
|
return rq
|
|
}
|
|
|
|
func (r *RabbitMQ) getServiceSpec(opts ...ServiceOption) swarm.ServiceSpec {
|
|
spec := swarm.ServiceSpec{
|
|
Annotations: swarm.Annotations{
|
|
Name: r.name,
|
|
},
|
|
TaskTemplate: swarm.TaskSpec{
|
|
ContainerSpec: &swarm.ContainerSpec{
|
|
Image: RabbitMQImageName,
|
|
Hostname: RabbitMQServiceName,
|
|
Env: []string{
|
|
"RABBITMQ_DEFAULT_USER=intercloud",
|
|
"RABBITMQ_DEFAULT_PASS=intercloud",
|
|
},
|
|
Mounts: []mount.Mount{
|
|
{
|
|
Type: mount.TypeVolume,
|
|
Source: "mqdata",
|
|
Target: "/var/lib/rabbitmq",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
Mode: swarm.ServiceMode{
|
|
Replicated: &swarm.ReplicatedService{
|
|
Replicas: &SwarmServiceReplicas,
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, opt := range opts {
|
|
opt(&spec)
|
|
}
|
|
|
|
return spec
|
|
}
|
|
|
|
func (r *RabbitMQ) Deploy(ctx context.Context, cli *client.Client) error {
|
|
if err := utils.CreateService(ctx, cli, &r.spec); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := utils.CheckServiceHealthWithRetry(ctx, cli, r.name); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|