task.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package convert
  2. import (
  3. "strings"
  4. types "github.com/docker/docker/api/types/swarm"
  5. swarmapi "github.com/docker/swarmkit/api"
  6. gogotypes "github.com/gogo/protobuf/types"
  7. )
  8. // TaskFromGRPC converts a grpc Task to a Task.
  9. func TaskFromGRPC(t swarmapi.Task) types.Task {
  10. if t.Spec.GetAttachment() != nil {
  11. return types.Task{}
  12. }
  13. containerConfig := t.Spec.Runtime.(*swarmapi.TaskSpec_Container).Container
  14. containerStatus := t.Status.GetContainer()
  15. networks := make([]types.NetworkAttachmentConfig, 0, len(t.Spec.Networks))
  16. for _, n := range t.Spec.Networks {
  17. networks = append(networks, types.NetworkAttachmentConfig{Target: n.Target, Aliases: n.Aliases})
  18. }
  19. task := types.Task{
  20. ID: t.ID,
  21. Annotations: types.Annotations{
  22. Name: t.Annotations.Name,
  23. Labels: t.Annotations.Labels,
  24. },
  25. ServiceID: t.ServiceID,
  26. Slot: int(t.Slot),
  27. NodeID: t.NodeID,
  28. Spec: types.TaskSpec{
  29. ContainerSpec: containerSpecFromGRPC(containerConfig),
  30. Resources: resourcesFromGRPC(t.Spec.Resources),
  31. RestartPolicy: restartPolicyFromGRPC(t.Spec.Restart),
  32. Placement: placementFromGRPC(t.Spec.Placement),
  33. LogDriver: driverFromGRPC(t.Spec.LogDriver),
  34. Networks: networks,
  35. },
  36. Status: types.TaskStatus{
  37. State: types.TaskState(strings.ToLower(t.Status.State.String())),
  38. Message: t.Status.Message,
  39. Err: t.Status.Err,
  40. },
  41. DesiredState: types.TaskState(strings.ToLower(t.DesiredState.String())),
  42. }
  43. // Meta
  44. task.Version.Index = t.Meta.Version.Index
  45. task.CreatedAt, _ = gogotypes.TimestampFromProto(t.Meta.CreatedAt)
  46. task.UpdatedAt, _ = gogotypes.TimestampFromProto(t.Meta.UpdatedAt)
  47. task.Status.Timestamp, _ = gogotypes.TimestampFromProto(t.Status.Timestamp)
  48. if containerStatus != nil {
  49. task.Status.ContainerStatus.ContainerID = containerStatus.ContainerID
  50. task.Status.ContainerStatus.PID = int(containerStatus.PID)
  51. task.Status.ContainerStatus.ExitCode = int(containerStatus.ExitCode)
  52. }
  53. // NetworksAttachments
  54. for _, na := range t.Networks {
  55. task.NetworksAttachments = append(task.NetworksAttachments, networkAttachementFromGRPC(na))
  56. }
  57. if t.Status.PortStatus == nil {
  58. return task
  59. }
  60. for _, p := range t.Status.PortStatus.Ports {
  61. task.Status.PortStatus.Ports = append(task.Status.PortStatus.Ports, types.PortConfig{
  62. Name: p.Name,
  63. Protocol: types.PortConfigProtocol(strings.ToLower(swarmapi.PortConfig_Protocol_name[int32(p.Protocol)])),
  64. PublishMode: types.PortConfigPublishMode(strings.ToLower(swarmapi.PortConfig_PublishMode_name[int32(p.PublishMode)])),
  65. TargetPort: p.TargetPort,
  66. PublishedPort: p.PublishedPort,
  67. })
  68. }
  69. return task
  70. }