package convert // import "github.com/docker/docker/daemon/cluster/convert" import ( "strings" types "github.com/docker/docker/api/types/swarm" gogotypes "github.com/gogo/protobuf/types" swarmapi "github.com/moby/swarmkit/v2/api" ) // TaskFromGRPC converts a grpc Task to a Task. func TaskFromGRPC(t swarmapi.Task) (types.Task, error) { containerStatus := t.Status.GetContainer() taskSpec, err := taskSpecFromGRPC(t.Spec) if err != nil { return types.Task{}, err } task := types.Task{ ID: t.ID, Annotations: annotationsFromGRPC(t.Annotations), ServiceID: t.ServiceID, Slot: int(t.Slot), NodeID: t.NodeID, Spec: taskSpec, Status: types.TaskStatus{ State: types.TaskState(strings.ToLower(t.Status.State.String())), Message: t.Status.Message, Err: t.Status.Err, }, DesiredState: types.TaskState(strings.ToLower(t.DesiredState.String())), GenericResources: GenericResourcesFromGRPC(t.AssignedGenericResources), } // Meta task.Version.Index = t.Meta.Version.Index task.CreatedAt, _ = gogotypes.TimestampFromProto(t.Meta.CreatedAt) task.UpdatedAt, _ = gogotypes.TimestampFromProto(t.Meta.UpdatedAt) task.Status.Timestamp, _ = gogotypes.TimestampFromProto(t.Status.Timestamp) if containerStatus != nil { task.Status.ContainerStatus = &types.ContainerStatus{ ContainerID: containerStatus.ContainerID, PID: int(containerStatus.PID), ExitCode: int(containerStatus.ExitCode), } } // NetworksAttachments for _, na := range t.Networks { task.NetworksAttachments = append(task.NetworksAttachments, networkAttachmentFromGRPC(na)) } if t.JobIteration != nil { task.JobIteration = &types.Version{ Index: t.JobIteration.Index, } } // appending to a nil slice is valid. if there are no items in t.Volumes, // then the task.Volumes will remain nil; otherwise, it will contain // converted entries. for _, v := range t.Volumes { task.Volumes = append(task.Volumes, types.VolumeAttachment{ ID: v.ID, Source: v.Source, Target: v.Target, }) } if t.Status.PortStatus == nil { return task, nil } for _, p := range t.Status.PortStatus.Ports { task.Status.PortStatus.Ports = append(task.Status.PortStatus.Ports, types.PortConfig{ Name: p.Name, Protocol: types.PortConfigProtocol(strings.ToLower(swarmapi.PortConfig_Protocol_name[int32(p.Protocol)])), PublishMode: types.PortConfigPublishMode(strings.ToLower(swarmapi.PortConfig_PublishMode_name[int32(p.PublishMode)])), TargetPort: p.TargetPort, PublishedPort: p.PublishedPort, }) } return task, nil }