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( WithMSNetwork(), 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 }