func compareServices(srv1 *swarm.Service, srv2 *swarm.Service) bool { srv1.CreatedAt = srv2.CreatedAt srv1.UpdatedAt = srv2.UpdatedAt srv1.UpdateStatus.StartedAt = srv2.UpdateStatus.StartedAt srv1.UpdateStatus.CompletedAt = srv2.UpdateStatus.CompletedAt return reflect.DeepEqual(srv1, srv2) }
// ServiceFromGRPC converts a grpc Service to a Service. func ServiceFromGRPC(s swarmapi.Service) types.Service { service := types.Service{ ID: s.ID, Spec: *serviceSpecFromGRPC(&s.Spec), PreviousSpec: serviceSpecFromGRPC(s.PreviousSpec), Endpoint: endpointFromGRPC(s.Endpoint), } // Meta service.Version.Index = s.Meta.Version.Index service.CreatedAt, _ = ptypes.Timestamp(s.Meta.CreatedAt) service.UpdatedAt, _ = ptypes.Timestamp(s.Meta.UpdatedAt) // UpdateStatus service.UpdateStatus = types.UpdateStatus{} if s.UpdateStatus != nil { switch s.UpdateStatus.State { case swarmapi.UpdateStatus_UPDATING: service.UpdateStatus.State = types.UpdateStateUpdating case swarmapi.UpdateStatus_PAUSED: service.UpdateStatus.State = types.UpdateStatePaused case swarmapi.UpdateStatus_COMPLETED: service.UpdateStatus.State = types.UpdateStateCompleted } service.UpdateStatus.StartedAt, _ = ptypes.Timestamp(s.UpdateStatus.StartedAt) service.UpdateStatus.CompletedAt, _ = ptypes.Timestamp(s.UpdateStatus.CompletedAt) service.UpdateStatus.Message = s.UpdateStatus.Message } return service }
func serviceForUpdate(s *swarm.Service) { ureplicas := uint64(1) restartDelay := time.Duration(100 * time.Millisecond) s.Spec = swarm.ServiceSpec{ TaskTemplate: swarm.TaskSpec{ ContainerSpec: swarm.ContainerSpec{ Image: "busybox:latest", Command: []string{"/bin/top"}, }, RestartPolicy: &swarm.RestartPolicy{ Delay: &restartDelay, }, }, Mode: swarm.ServiceMode{ Replicated: &swarm.ReplicatedService{ Replicas: &ureplicas, }, }, UpdateConfig: &swarm.UpdateConfig{ Parallelism: 2, Delay: 4 * time.Second, FailureAction: swarm.UpdateFailureActionContinue, }, } s.Spec.Name = "updatetest" }
func (s *DockerServer) serviceUpdate(w http.ResponseWriter, r *http.Request) { s.swarmMut.Lock() defer s.swarmMut.Unlock() s.cMut.Lock() defer s.cMut.Unlock() if s.swarm == nil { w.WriteHeader(http.StatusNotAcceptable) return } id := mux.Vars(r)["id"] var toUpdate *swarm.Service for i := range s.services { if s.services[i].ID == id || s.services[i].Spec.Name == id { toUpdate = s.services[i] break } } if toUpdate == nil { http.Error(w, "service not found", http.StatusNotFound) return } var newSpec swarm.ServiceSpec err := json.NewDecoder(r.Body).Decode(&newSpec) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } toUpdate.Spec = newSpec s.setServiceEndpoint(toUpdate) for i := 0; i < len(s.tasks); i++ { if s.tasks[i].ServiceID != toUpdate.ID { continue } _, contIdx, _ := s.findContainerWithLock(s.tasks[i].Status.ContainerStatus.ContainerID, false) if contIdx != -1 { s.containers = append(s.containers[:contIdx], s.containers[contIdx+1:]...) } s.tasks = append(s.tasks[:i], s.tasks[i+1:]...) i-- } s.addTasks(toUpdate, true) err = s.runNodeOperation(s.swarmServer.URL(), nodeOperation{}) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } }
func (s *DockerServer) setServiceEndpoint(service *swarm.Service) { if service.Spec.EndpointSpec == nil { return } service.Endpoint = swarm.Endpoint{ Spec: *service.Spec.EndpointSpec, } for _, port := range service.Spec.EndpointSpec.Ports { if port.PublishedPort == 0 { port.PublishedPort = uint32(30000 + s.servicePorts) s.servicePorts++ } service.Endpoint.Ports = append(service.Endpoint.Ports, port) } }
func simpleTestService(s *swarm.Service) { ureplicas := uint64(1) restartDelay := time.Duration(100 * time.Millisecond) s.Spec = swarm.ServiceSpec{ TaskTemplate: swarm.TaskSpec{ ContainerSpec: swarm.ContainerSpec{ Image: "busybox:latest", Command: []string{"/bin/top"}, }, RestartPolicy: &swarm.RestartPolicy{ Delay: &restartDelay, }, }, Mode: swarm.ServiceMode{ Replicated: &swarm.ReplicatedService{ Replicas: &ureplicas, }, }, } s.Spec.Name = "top" }
// ServiceFromGRPC converts a grpc Service to a Service. func ServiceFromGRPC(s swarmapi.Service) types.Service { spec := s.Spec containerConfig := spec.Task.Runtime.(*swarmapi.TaskSpec_Container).Container serviceNetworks := make([]types.NetworkAttachmentConfig, 0, len(spec.Networks)) for _, n := range spec.Networks { serviceNetworks = append(serviceNetworks, types.NetworkAttachmentConfig{Target: n.Target, Aliases: n.Aliases}) } taskNetworks := make([]types.NetworkAttachmentConfig, 0, len(spec.Task.Networks)) for _, n := range spec.Task.Networks { taskNetworks = append(taskNetworks, types.NetworkAttachmentConfig{Target: n.Target, Aliases: n.Aliases}) } service := types.Service{ ID: s.ID, Spec: types.ServiceSpec{ TaskTemplate: types.TaskSpec{ ContainerSpec: containerSpecFromGRPC(containerConfig), Resources: resourcesFromGRPC(s.Spec.Task.Resources), RestartPolicy: restartPolicyFromGRPC(s.Spec.Task.Restart), Placement: placementFromGRPC(s.Spec.Task.Placement), LogDriver: driverFromGRPC(s.Spec.Task.LogDriver), Networks: taskNetworks, }, Networks: serviceNetworks, EndpointSpec: endpointSpecFromGRPC(s.Spec.Endpoint), }, Endpoint: endpointFromGRPC(s.Endpoint), } // Meta service.Version.Index = s.Meta.Version.Index service.CreatedAt, _ = ptypes.Timestamp(s.Meta.CreatedAt) service.UpdatedAt, _ = ptypes.Timestamp(s.Meta.UpdatedAt) // Annotations service.Spec.Name = s.Spec.Annotations.Name service.Spec.Labels = s.Spec.Annotations.Labels // UpdateConfig if s.Spec.Update != nil { service.Spec.UpdateConfig = &types.UpdateConfig{ Parallelism: s.Spec.Update.Parallelism, } service.Spec.UpdateConfig.Delay, _ = ptypes.Duration(&s.Spec.Update.Delay) switch s.Spec.Update.FailureAction { case swarmapi.UpdateConfig_PAUSE: service.Spec.UpdateConfig.FailureAction = types.UpdateFailureActionPause case swarmapi.UpdateConfig_CONTINUE: service.Spec.UpdateConfig.FailureAction = types.UpdateFailureActionContinue } } // Mode switch t := s.Spec.GetMode().(type) { case *swarmapi.ServiceSpec_Global: service.Spec.Mode.Global = &types.GlobalService{} case *swarmapi.ServiceSpec_Replicated: service.Spec.Mode.Replicated = &types.ReplicatedService{ Replicas: &t.Replicated.Replicas, } } // UpdateStatus service.UpdateStatus = types.UpdateStatus{} if s.UpdateStatus != nil { switch s.UpdateStatus.State { case swarmapi.UpdateStatus_UPDATING: service.UpdateStatus.State = types.UpdateStateUpdating case swarmapi.UpdateStatus_PAUSED: service.UpdateStatus.State = types.UpdateStatePaused case swarmapi.UpdateStatus_COMPLETED: service.UpdateStatus.State = types.UpdateStateCompleted } service.UpdateStatus.StartedAt, _ = ptypes.Timestamp(s.UpdateStatus.StartedAt) service.UpdateStatus.CompletedAt, _ = ptypes.Timestamp(s.UpdateStatus.CompletedAt) service.UpdateStatus.Message = s.UpdateStatus.Message } return service }