docker/docker

View on GitHub
daemon/cluster/convert/task.go

Summary

Maintainability
A
2 hrs
Test Coverage
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
}