func validateMode(s *api.ServiceSpec) error { m := s.GetMode() switch m.(type) { case *api.ServiceSpec_Replicated: if int64(m.(*api.ServiceSpec_Replicated).Replicated.Replicas) < 0 { return grpc.Errorf(codes.InvalidArgument, "Number of replicas must be non-negative") } case *api.ServiceSpec_Global: default: return grpc.Errorf(codes.InvalidArgument, "Unrecognized service mode") } return nil }
func serviceSpecFromGRPC(spec *swarmapi.ServiceSpec) *types.ServiceSpec { if spec == nil { return nil } 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}) } containerConfig := spec.Task.Runtime.(*swarmapi.TaskSpec_Container).Container convertedSpec := &types.ServiceSpec{ Annotations: types.Annotations{ Name: spec.Annotations.Name, Labels: spec.Annotations.Labels, }, TaskTemplate: types.TaskSpec{ ContainerSpec: containerSpecFromGRPC(containerConfig), Resources: resourcesFromGRPC(spec.Task.Resources), RestartPolicy: restartPolicyFromGRPC(spec.Task.Restart), Placement: placementFromGRPC(spec.Task.Placement), LogDriver: driverFromGRPC(spec.Task.LogDriver), Networks: taskNetworks, ForceUpdate: spec.Task.ForceUpdate, }, Networks: serviceNetworks, EndpointSpec: endpointSpecFromGRPC(spec.Endpoint), } // UpdateConfig if spec.Update != nil { convertedSpec.UpdateConfig = &types.UpdateConfig{ Parallelism: spec.Update.Parallelism, MaxFailureRatio: spec.Update.MaxFailureRatio, } convertedSpec.UpdateConfig.Delay, _ = ptypes.Duration(&spec.Update.Delay) if spec.Update.Monitor != nil { convertedSpec.UpdateConfig.Monitor, _ = ptypes.Duration(spec.Update.Monitor) } switch spec.Update.FailureAction { case swarmapi.UpdateConfig_PAUSE: convertedSpec.UpdateConfig.FailureAction = types.UpdateFailureActionPause case swarmapi.UpdateConfig_CONTINUE: convertedSpec.UpdateConfig.FailureAction = types.UpdateFailureActionContinue } } // Mode switch t := spec.GetMode().(type) { case *swarmapi.ServiceSpec_Global: convertedSpec.Mode.Global = &types.GlobalService{} case *swarmapi.ServiceSpec_Replicated: convertedSpec.Mode.Replicated = &types.ReplicatedService{ Replicas: &t.Replicated.Replicas, } } return convertedSpec }