// TaskFromGRPC converts a grpc Task to a Task. func TaskFromGRPC(t swarmapi.Task) types.Task { if t.Spec.GetAttachment() != nil { return types.Task{} } containerConfig := t.Spec.Runtime.(*swarmapi.TaskSpec_Container).Container containerStatus := t.Status.GetContainer() networks := make([]types.NetworkAttachmentConfig, 0, len(t.Spec.Networks)) for _, n := range t.Spec.Networks { networks = append(networks, types.NetworkAttachmentConfig{Target: n.Target, Aliases: n.Aliases}) } task := types.Task{ ID: t.ID, Annotations: types.Annotations{ Name: t.Annotations.Name, Labels: t.Annotations.Labels, }, ServiceID: t.ServiceID, Slot: int(t.Slot), NodeID: t.NodeID, Spec: types.TaskSpec{ ContainerSpec: containerSpecFromGRPC(containerConfig), Resources: resourcesFromGRPC(t.Spec.Resources), RestartPolicy: restartPolicyFromGRPC(t.Spec.Restart), Placement: placementFromGRPC(t.Spec.Placement), LogDriver: driverFromGRPC(t.Spec.LogDriver), Networks: networks, }, 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())), } // Meta task.Version.Index = t.Meta.Version.Index task.CreatedAt, _ = ptypes.Timestamp(t.Meta.CreatedAt) task.UpdatedAt, _ = ptypes.Timestamp(t.Meta.UpdatedAt) task.Status.Timestamp, _ = ptypes.Timestamp(t.Status.Timestamp) if containerStatus != nil { task.Status.ContainerStatus.ContainerID = containerStatus.ContainerID task.Status.ContainerStatus.PID = int(containerStatus.PID) task.Status.ContainerStatus.ExitCode = int(containerStatus.ExitCode) } // NetworksAttachments for _, na := range t.Networks { task.NetworksAttachments = append(task.NetworksAttachments, networkAttachementFromGRPC(na)) } return task }
func compareTasks(task1 *swarm.Task, task2 *swarm.Task) bool { task1.CreatedAt = task2.CreatedAt task1.UpdatedAt = task2.UpdatedAt task1.Status.Timestamp = task2.Status.Timestamp return reflect.DeepEqual(task1, task2) }