localenv/services/rabbitmq.go
2023-08-05 22:10:48 +02:00

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
}