github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/cli/internal/test/builders/service.go (about) 1 package builders 2 3 import ( 4 "github.com/docker/docker/api/types/swarm" 5 ) 6 7 // Service creates a service with default values. 8 // Any number of service builder functions can be passed to augment it. 9 func Service(builders ...func(*swarm.Service)) *swarm.Service { 10 service := &swarm.Service{} 11 defaults := []func(*swarm.Service){ServiceID("serviceID"), ServiceName("defaultServiceName")} 12 13 for _, opt := range append(defaults, builders...) { 14 opt(service) 15 } 16 17 return service 18 } 19 20 // ServiceID sets the service ID 21 func ServiceID(ID string) func(*swarm.Service) { 22 return func(service *swarm.Service) { 23 service.ID = ID 24 } 25 } 26 27 // ServiceName sets the service name 28 func ServiceName(name string) func(*swarm.Service) { 29 return func(service *swarm.Service) { 30 service.Spec.Annotations.Name = name 31 } 32 } 33 34 // ServiceLabels sets the service's labels 35 func ServiceLabels(labels map[string]string) func(*swarm.Service) { 36 return func(service *swarm.Service) { 37 service.Spec.Annotations.Labels = labels 38 } 39 } 40 41 // GlobalService sets the service to use "global" mode 42 func GlobalService() func(*swarm.Service) { 43 return func(service *swarm.Service) { 44 service.Spec.Mode = swarm.ServiceMode{Global: &swarm.GlobalService{}} 45 } 46 } 47 48 // ReplicatedService sets the service to use "replicated" mode with the specified number of replicas 49 func ReplicatedService(replicas uint64) func(*swarm.Service) { 50 return func(service *swarm.Service) { 51 service.Spec.Mode = swarm.ServiceMode{Replicated: &swarm.ReplicatedService{Replicas: &replicas}} 52 if service.ServiceStatus == nil { 53 service.ServiceStatus = &swarm.ServiceStatus{} 54 } 55 service.ServiceStatus.DesiredTasks = replicas 56 } 57 } 58 59 // ServiceStatus sets the services' ServiceStatus (API v1.41 and above) 60 func ServiceStatus(desired, running uint64) func(*swarm.Service) { 61 return func(service *swarm.Service) { 62 service.ServiceStatus = &swarm.ServiceStatus{ 63 RunningTasks: running, 64 DesiredTasks: desired, 65 } 66 } 67 } 68 69 // ServiceImage sets the service's image 70 func ServiceImage(image string) func(*swarm.Service) { 71 return func(service *swarm.Service) { 72 if service.Spec.TaskTemplate.ContainerSpec == nil { 73 service.Spec.TaskTemplate.ContainerSpec = &swarm.ContainerSpec{} 74 } 75 service.Spec.TaskTemplate.ContainerSpec.Image = image 76 } 77 } 78 79 // ServicePort sets the service's port 80 func ServicePort(port swarm.PortConfig) func(*swarm.Service) { 81 return func(service *swarm.Service) { 82 if service.Spec.EndpointSpec == nil { 83 service.Spec.EndpointSpec = &swarm.EndpointSpec{} 84 } 85 service.Spec.EndpointSpec.Ports = append(service.Spec.EndpointSpec.Ports, port) 86 87 assignedPort := port 88 if assignedPort.PublishedPort == 0 { 89 assignedPort.PublishedPort = 30000 90 } 91 service.Endpoint.Ports = append(service.Endpoint.Ports, assignedPort) 92 } 93 }