1package swarm
2
3import (
4	"time"
5
6	"github.com/docker/docker/api/types/swarm/runtime"
7)
8
9// TaskState represents the state of a task.
10type TaskState string
11
12const (
13	// TaskStateNew NEW
14	TaskStateNew TaskState = "new"
15	// TaskStateAllocated ALLOCATED
16	TaskStateAllocated TaskState = "allocated"
17	// TaskStatePending PENDING
18	TaskStatePending TaskState = "pending"
19	// TaskStateAssigned ASSIGNED
20	TaskStateAssigned TaskState = "assigned"
21	// TaskStateAccepted ACCEPTED
22	TaskStateAccepted TaskState = "accepted"
23	// TaskStatePreparing PREPARING
24	TaskStatePreparing TaskState = "preparing"
25	// TaskStateReady READY
26	TaskStateReady TaskState = "ready"
27	// TaskStateStarting STARTING
28	TaskStateStarting TaskState = "starting"
29	// TaskStateRunning RUNNING
30	TaskStateRunning TaskState = "running"
31	// TaskStateComplete COMPLETE
32	TaskStateComplete TaskState = "complete"
33	// TaskStateShutdown SHUTDOWN
34	TaskStateShutdown TaskState = "shutdown"
35	// TaskStateFailed FAILED
36	TaskStateFailed TaskState = "failed"
37	// TaskStateRejected REJECTED
38	TaskStateRejected TaskState = "rejected"
39)
40
41// Task represents a task.
42type Task struct {
43	ID string
44	Meta
45	Annotations
46
47	Spec                TaskSpec            `json:",omitempty"`
48	ServiceID           string              `json:",omitempty"`
49	Slot                int                 `json:",omitempty"`
50	NodeID              string              `json:",omitempty"`
51	Status              TaskStatus          `json:",omitempty"`
52	DesiredState        TaskState           `json:",omitempty"`
53	NetworksAttachments []NetworkAttachment `json:",omitempty"`
54	GenericResources    []GenericResource   `json:",omitempty"`
55}
56
57// TaskSpec represents the spec of a task.
58type TaskSpec struct {
59	// ContainerSpec and PluginSpec are mutually exclusive.
60	// PluginSpec will only be used when the `Runtime` field is set to `plugin`
61	ContainerSpec *ContainerSpec      `json:",omitempty"`
62	PluginSpec    *runtime.PluginSpec `json:",omitempty"`
63
64	Resources     *ResourceRequirements     `json:",omitempty"`
65	RestartPolicy *RestartPolicy            `json:",omitempty"`
66	Placement     *Placement                `json:",omitempty"`
67	Networks      []NetworkAttachmentConfig `json:",omitempty"`
68
69	// LogDriver specifies the LogDriver to use for tasks created from this
70	// spec. If not present, the one on cluster default on swarm.Spec will be
71	// used, finally falling back to the engine default if not specified.
72	LogDriver *Driver `json:",omitempty"`
73
74	// ForceUpdate is a counter that triggers an update even if no relevant
75	// parameters have been changed.
76	ForceUpdate uint64
77
78	Runtime RuntimeType `json:",omitempty"`
79}
80
81// Resources represents resources (CPU/Memory).
82type Resources struct {
83	NanoCPUs         int64             `json:",omitempty"`
84	MemoryBytes      int64             `json:",omitempty"`
85	GenericResources []GenericResource `json:",omitempty"`
86}
87
88// GenericResource represents a "user defined" resource which can
89// be either an integer (e.g: SSD=3) or a string (e.g: SSD=sda1)
90type GenericResource struct {
91	NamedResourceSpec    *NamedGenericResource    `json:",omitempty"`
92	DiscreteResourceSpec *DiscreteGenericResource `json:",omitempty"`
93}
94
95// NamedGenericResource represents a "user defined" resource which is defined
96// as a string.
97// "Kind" is used to describe the Kind of a resource (e.g: "GPU", "FPGA", "SSD", ...)
98// Value is used to identify the resource (GPU="UUID-1", FPGA="/dev/sdb5", ...)
99type NamedGenericResource struct {
100	Kind  string `json:",omitempty"`
101	Value string `json:",omitempty"`
102}
103
104// DiscreteGenericResource represents a "user defined" resource which is defined
105// as an integer
106// "Kind" is used to describe the Kind of a resource (e.g: "GPU", "FPGA", "SSD", ...)
107// Value is used to count the resource (SSD=5, HDD=3, ...)
108type DiscreteGenericResource struct {
109	Kind  string `json:",omitempty"`
110	Value int64  `json:",omitempty"`
111}
112
113// ResourceRequirements represents resources requirements.
114type ResourceRequirements struct {
115	Limits       *Resources `json:",omitempty"`
116	Reservations *Resources `json:",omitempty"`
117}
118
119// Placement represents orchestration parameters.
120type Placement struct {
121	Constraints []string              `json:",omitempty"`
122	Preferences []PlacementPreference `json:",omitempty"`
123
124	// Platforms stores all the platforms that the image can run on.
125	// This field is used in the platform filter for scheduling. If empty,
126	// then the platform filter is off, meaning there are no scheduling restrictions.
127	Platforms []Platform `json:",omitempty"`
128}
129
130// PlacementPreference provides a way to make the scheduler aware of factors
131// such as topology.
132type PlacementPreference struct {
133	Spread *SpreadOver
134}
135
136// SpreadOver is a scheduling preference that instructs the scheduler to spread
137// tasks evenly over groups of nodes identified by labels.
138type SpreadOver struct {
139	// label descriptor, such as engine.labels.az
140	SpreadDescriptor string
141}
142
143// RestartPolicy represents the restart policy.
144type RestartPolicy struct {
145	Condition   RestartPolicyCondition `json:",omitempty"`
146	Delay       *time.Duration         `json:",omitempty"`
147	MaxAttempts *uint64                `json:",omitempty"`
148	Window      *time.Duration         `json:",omitempty"`
149}
150
151// RestartPolicyCondition represents when to restart.
152type RestartPolicyCondition string
153
154const (
155	// RestartPolicyConditionNone NONE
156	RestartPolicyConditionNone RestartPolicyCondition = "none"
157	// RestartPolicyConditionOnFailure ON_FAILURE
158	RestartPolicyConditionOnFailure RestartPolicyCondition = "on-failure"
159	// RestartPolicyConditionAny ANY
160	RestartPolicyConditionAny RestartPolicyCondition = "any"
161)
162
163// TaskStatus represents the status of a task.
164type TaskStatus struct {
165	Timestamp       time.Time       `json:",omitempty"`
166	State           TaskState       `json:",omitempty"`
167	Message         string          `json:",omitempty"`
168	Err             string          `json:",omitempty"`
169	ContainerStatus ContainerStatus `json:",omitempty"`
170	PortStatus      PortStatus      `json:",omitempty"`
171}
172
173// ContainerStatus represents the status of a container.
174type ContainerStatus struct {
175	ContainerID string `json:",omitempty"`
176	PID         int    `json:",omitempty"`
177	ExitCode    int    `json:",omitempty"`
178}
179
180// PortStatus represents the port status of a task's host ports whose
181// service has published host ports
182type PortStatus struct {
183	Ports []PortConfig `json:",omitempty"`
184}
185