github.com/noxiouz/docker@v0.7.3-0.20160629055221-3d231c78e8c5/daemon/cluster/convert/service.go (about) 1 package convert 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/docker/docker/pkg/namesgenerator" 8 types "github.com/docker/engine-api/types/swarm" 9 swarmapi "github.com/docker/swarmkit/api" 10 "github.com/docker/swarmkit/protobuf/ptypes" 11 ) 12 13 // ServiceFromGRPC converts a grpc Service to a Service. 14 func ServiceFromGRPC(s swarmapi.Service) types.Service { 15 spec := s.Spec 16 containerConfig := spec.Task.Runtime.(*swarmapi.TaskSpec_Container).Container 17 18 networks := make([]types.NetworkAttachmentConfig, 0, len(spec.Networks)) 19 for _, n := range spec.Networks { 20 networks = append(networks, types.NetworkAttachmentConfig{Target: n.Target, Aliases: n.Aliases}) 21 } 22 service := types.Service{ 23 ID: s.ID, 24 25 Spec: types.ServiceSpec{ 26 TaskTemplate: types.TaskSpec{ 27 ContainerSpec: containerSpecFromGRPC(containerConfig), 28 Resources: resourcesFromGRPC(s.Spec.Task.Resources), 29 RestartPolicy: restartPolicyFromGRPC(s.Spec.Task.Restart), 30 Placement: placementFromGRPC(s.Spec.Task.Placement), 31 }, 32 33 Networks: networks, 34 EndpointSpec: endpointSpecFromGRPC(s.Spec.Endpoint), 35 }, 36 Endpoint: endpointFromGRPC(s.Endpoint), 37 } 38 39 // Meta 40 service.Version.Index = s.Meta.Version.Index 41 service.CreatedAt, _ = ptypes.Timestamp(s.Meta.CreatedAt) 42 service.UpdatedAt, _ = ptypes.Timestamp(s.Meta.UpdatedAt) 43 44 // Annotations 45 service.Spec.Name = s.Spec.Annotations.Name 46 service.Spec.Labels = s.Spec.Annotations.Labels 47 48 // UpdateConfig 49 if s.Spec.Update != nil { 50 service.Spec.UpdateConfig = &types.UpdateConfig{ 51 Parallelism: s.Spec.Update.Parallelism, 52 } 53 54 service.Spec.UpdateConfig.Delay, _ = ptypes.Duration(&s.Spec.Update.Delay) 55 } 56 57 //Mode 58 switch t := s.Spec.GetMode().(type) { 59 case *swarmapi.ServiceSpec_Global: 60 service.Spec.Mode.Global = &types.GlobalService{} 61 case *swarmapi.ServiceSpec_Replicated: 62 service.Spec.Mode.Replicated = &types.ReplicatedService{ 63 Replicas: &t.Replicated.Replicas, 64 } 65 } 66 67 return service 68 } 69 70 // ServiceSpecToGRPC converts a ServiceSpec to a grpc ServiceSpec. 71 func ServiceSpecToGRPC(s types.ServiceSpec) (swarmapi.ServiceSpec, error) { 72 name := s.Name 73 if name == "" { 74 name = namesgenerator.GetRandomName(0) 75 } 76 77 networks := make([]*swarmapi.ServiceSpec_NetworkAttachmentConfig, 0, len(s.Networks)) 78 for _, n := range s.Networks { 79 networks = append(networks, &swarmapi.ServiceSpec_NetworkAttachmentConfig{Target: n.Target, Aliases: n.Aliases}) 80 } 81 82 spec := swarmapi.ServiceSpec{ 83 Annotations: swarmapi.Annotations{ 84 Name: name, 85 Labels: s.Labels, 86 }, 87 Task: swarmapi.TaskSpec{ 88 Resources: resourcesToGRPC(s.TaskTemplate.Resources), 89 }, 90 Networks: networks, 91 } 92 93 containerSpec, err := containerToGRPC(s.TaskTemplate.ContainerSpec) 94 if err != nil { 95 return swarmapi.ServiceSpec{}, err 96 } 97 spec.Task.Runtime = &swarmapi.TaskSpec_Container{Container: containerSpec} 98 99 restartPolicy, err := restartPolicyToGRPC(s.TaskTemplate.RestartPolicy) 100 if err != nil { 101 return swarmapi.ServiceSpec{}, err 102 } 103 spec.Task.Restart = restartPolicy 104 105 if s.TaskTemplate.Placement != nil { 106 spec.Task.Placement = &swarmapi.Placement{ 107 Constraints: s.TaskTemplate.Placement.Constraints, 108 } 109 } 110 111 if s.UpdateConfig != nil { 112 spec.Update = &swarmapi.UpdateConfig{ 113 Parallelism: s.UpdateConfig.Parallelism, 114 Delay: *ptypes.DurationProto(s.UpdateConfig.Delay), 115 } 116 } 117 118 if s.EndpointSpec != nil { 119 if s.EndpointSpec.Mode != "" && 120 s.EndpointSpec.Mode != types.ResolutionModeVIP && 121 s.EndpointSpec.Mode != types.ResolutionModeDNSRR { 122 return swarmapi.ServiceSpec{}, fmt.Errorf("invalid resolution mode: %q", s.EndpointSpec.Mode) 123 } 124 125 spec.Endpoint = &swarmapi.EndpointSpec{} 126 127 spec.Endpoint.Mode = swarmapi.EndpointSpec_ResolutionMode(swarmapi.EndpointSpec_ResolutionMode_value[strings.ToUpper(string(s.EndpointSpec.Mode))]) 128 129 for _, portConfig := range s.EndpointSpec.Ports { 130 spec.Endpoint.Ports = append(spec.Endpoint.Ports, &swarmapi.PortConfig{ 131 Name: portConfig.Name, 132 Protocol: swarmapi.PortConfig_Protocol(swarmapi.PortConfig_Protocol_value[strings.ToUpper(string(portConfig.Protocol))]), 133 TargetPort: portConfig.TargetPort, 134 PublishedPort: portConfig.PublishedPort, 135 }) 136 } 137 } 138 139 //Mode 140 if s.Mode.Global != nil { 141 spec.Mode = &swarmapi.ServiceSpec_Global{ 142 Global: &swarmapi.GlobalService{}, 143 } 144 } else if s.Mode.Replicated != nil && s.Mode.Replicated.Replicas != nil { 145 spec.Mode = &swarmapi.ServiceSpec_Replicated{ 146 Replicated: &swarmapi.ReplicatedService{Replicas: *s.Mode.Replicated.Replicas}, 147 } 148 } else { 149 spec.Mode = &swarmapi.ServiceSpec_Replicated{ 150 Replicated: &swarmapi.ReplicatedService{Replicas: 1}, 151 } 152 } 153 154 return spec, nil 155 } 156 157 func resourcesFromGRPC(res *swarmapi.ResourceRequirements) *types.ResourceRequirements { 158 var resources *types.ResourceRequirements 159 if res != nil { 160 resources = &types.ResourceRequirements{} 161 if res.Limits != nil { 162 resources.Limits = &types.Resources{ 163 NanoCPUs: res.Limits.NanoCPUs, 164 MemoryBytes: res.Limits.MemoryBytes, 165 } 166 } 167 if res.Reservations != nil { 168 resources.Reservations = &types.Resources{ 169 NanoCPUs: res.Reservations.NanoCPUs, 170 MemoryBytes: res.Reservations.MemoryBytes, 171 } 172 } 173 } 174 175 return resources 176 } 177 178 func resourcesToGRPC(res *types.ResourceRequirements) *swarmapi.ResourceRequirements { 179 var reqs *swarmapi.ResourceRequirements 180 if res != nil { 181 reqs = &swarmapi.ResourceRequirements{} 182 if res.Limits != nil { 183 reqs.Limits = &swarmapi.Resources{ 184 NanoCPUs: res.Limits.NanoCPUs, 185 MemoryBytes: res.Limits.MemoryBytes, 186 } 187 } 188 if res.Reservations != nil { 189 reqs.Reservations = &swarmapi.Resources{ 190 NanoCPUs: res.Reservations.NanoCPUs, 191 MemoryBytes: res.Reservations.MemoryBytes, 192 } 193 194 } 195 } 196 return reqs 197 } 198 199 func restartPolicyFromGRPC(p *swarmapi.RestartPolicy) *types.RestartPolicy { 200 var rp *types.RestartPolicy 201 if p != nil { 202 rp = &types.RestartPolicy{} 203 rp.Condition = types.RestartPolicyCondition(strings.ToLower(p.Condition.String())) 204 if p.Delay != nil { 205 delay, _ := ptypes.Duration(p.Delay) 206 rp.Delay = &delay 207 } 208 if p.Window != nil { 209 window, _ := ptypes.Duration(p.Window) 210 rp.Window = &window 211 } 212 213 rp.MaxAttempts = &p.MaxAttempts 214 } 215 return rp 216 } 217 218 func restartPolicyToGRPC(p *types.RestartPolicy) (*swarmapi.RestartPolicy, error) { 219 var rp *swarmapi.RestartPolicy 220 if p != nil { 221 rp = &swarmapi.RestartPolicy{} 222 if condition, ok := swarmapi.RestartPolicy_RestartCondition_value[strings.ToUpper(string(p.Condition))]; ok { 223 rp.Condition = swarmapi.RestartPolicy_RestartCondition(condition) 224 } else if string(p.Condition) == "" { 225 rp.Condition = swarmapi.RestartOnAny 226 } else { 227 return nil, fmt.Errorf("invalid RestartCondition: %q", p.Condition) 228 } 229 230 if p.Delay != nil { 231 rp.Delay = ptypes.DurationProto(*p.Delay) 232 } 233 if p.Window != nil { 234 rp.Window = ptypes.DurationProto(*p.Window) 235 } 236 if p.MaxAttempts != nil { 237 rp.MaxAttempts = *p.MaxAttempts 238 239 } 240 } 241 return rp, nil 242 } 243 244 func placementFromGRPC(p *swarmapi.Placement) *types.Placement { 245 var r *types.Placement 246 if p != nil { 247 r = &types.Placement{} 248 r.Constraints = p.Constraints 249 } 250 251 return r 252 }