specs.proto 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. syntax = "proto3";
  2. package docker.swarmkit.v1;
  3. import "github.com/docker/swarmkit/api/types.proto";
  4. import "gogoproto/gogo.proto";
  5. import "google/protobuf/duration.proto";
  6. import "google/protobuf/any.proto";
  7. // Specs are container objects for user provided input. All creations and
  8. // updates are done through spec types. As a convention, user input from a spec
  9. // is never touched in created objects. This allows one to verify that the
  10. // users intent has not been modified.
  11. //
  12. // Put differently, spec types can be said to represent the desired state of
  13. // the system. In situations where modifications need to be made to a
  14. // particular component, API objects will either contain a copy of the spec
  15. // component or a different representation to reflect allocation or resolution.
  16. message NodeSpec {
  17. Annotations annotations = 1 [(gogoproto.nullable) = false];
  18. enum Membership {
  19. option (gogoproto.goproto_enum_prefix) = false;
  20. PENDING = 0 [(gogoproto.enumvalue_customname) = "NodeMembershipPending"];
  21. ACCEPTED = 1 [(gogoproto.enumvalue_customname) = "NodeMembershipAccepted"];
  22. }
  23. enum Availability {
  24. option (gogoproto.goproto_enum_prefix) = false;
  25. // Active nodes.
  26. ACTIVE = 0 [(gogoproto.enumvalue_customname) = "NodeAvailabilityActive"];
  27. // Paused nodes won't be considered by the scheduler, preventing any
  28. // further task to run on them.
  29. PAUSE = 1 [(gogoproto.enumvalue_customname) = "NodeAvailabilityPause"];
  30. // Drained nodes are paused and any task already running on them will
  31. // be evicted.
  32. DRAIN = 2 [(gogoproto.enumvalue_customname) = "NodeAvailabilityDrain"];
  33. }
  34. // DesiredRole defines the role the node should have.
  35. NodeRole desired_role = 2;
  36. // Membership controls the admission of the node into the cluster.
  37. Membership membership = 3;
  38. // Availability allows a user to control the current scheduling status of a
  39. // node.
  40. Availability availability = 4;
  41. }
  42. // ServiceSpec defines the properties of a service.
  43. //
  44. // A service instructs the cluster in orchestrating repeated instances of a
  45. // template, implemented as tasks. Based on the number of instances, scheduling
  46. // strategy and restart policy, a number of application-level behaviors can be
  47. // defined.
  48. message ServiceSpec {
  49. Annotations annotations = 1 [(gogoproto.nullable) = false];
  50. // Task defines the task template this service will spawn.
  51. TaskSpec task = 2 [(gogoproto.nullable) = false];
  52. oneof mode {
  53. ReplicatedService replicated = 3;
  54. GlobalService global = 4;
  55. }
  56. // Update contains settings which affect updates.
  57. UpdateConfig update = 6;
  58. // Rollback contains settings which affect rollbacks of updates.
  59. UpdateConfig rollback = 9;
  60. // ServiceSpec.Networks has been deprecated and is replaced by
  61. // Networks field in Task (TaskSpec.Networks).
  62. // This field (ServiceSpec.Networks) is kept for compatibility.
  63. // In case TaskSpec.Networks does not exist, ServiceSpec.Networks
  64. // is still honored if it exists.
  65. repeated NetworkAttachmentConfig networks = 7 [deprecated=true];
  66. // Service endpoint specifies the user provided configuration
  67. // to properly discover and load balance a service.
  68. EndpointSpec endpoint = 8;
  69. }
  70. // ReplicatedService sets the reconciliation target to certain number of replicas.
  71. message ReplicatedService {
  72. uint64 replicas = 1;
  73. }
  74. // GlobalService represents global service.
  75. message GlobalService {
  76. // Empty message for now.
  77. }
  78. message TaskSpec {
  79. oneof runtime {
  80. NetworkAttachmentSpec attachment = 8;
  81. ContainerSpec container = 1;
  82. GenericRuntimeSpec generic = 10;
  83. }
  84. // Resource requirements for the container.
  85. ResourceRequirements resources = 2;
  86. // RestartPolicy specifies what to do when a task fails or finishes.
  87. RestartPolicy restart = 4;
  88. // Placement specifies node selection constraints
  89. Placement placement = 5;
  90. // LogDriver specifies the log driver to use for the task. Any runtime will
  91. // direct logs into the specified driver for the duration of the task.
  92. Driver log_driver = 6;
  93. // Networks specifies the list of network attachment
  94. // configurations (which specify the network and per-network
  95. // aliases) that this task spec is bound to.
  96. repeated NetworkAttachmentConfig networks = 7;
  97. // ForceUpdate is a counter that triggers an update even if no relevant
  98. // parameters have been changed. We do this to allow forced restarts
  99. // using the same reconciliation-based mechanism that performs rolling
  100. // updates.
  101. uint64 force_update = 9;
  102. // ResourceReferences provides a generic way to specify resources that
  103. // are used by this task, and should be sent down to agents along with
  104. // the task. Inside the runtime field there may be more specific
  105. // information about how to use the resource, but ResourceReferences
  106. // establishes the relationship at the store level, and instructs the
  107. // dispatcher to send the related objects.
  108. //
  109. // ResourceReferences is a list of ResourceReferences used by the task.
  110. repeated ResourceReference resource_references = 11 [(gogoproto.nullable) = false];
  111. }
  112. message ResourceReference {
  113. string resource_id = 1;
  114. ResourceType resource_type = 2;
  115. }
  116. message GenericRuntimeSpec {
  117. string kind = 1;
  118. google.protobuf.Any payload = 2;
  119. }
  120. // NetworkAttachmentSpec specifies runtime parameters required to attach
  121. // a container to a network.
  122. message NetworkAttachmentSpec {
  123. // ContainerID specifies a unique ID of the container for which
  124. // this attachment is for.
  125. string container_id = 1;
  126. }
  127. // Container specifies runtime parameters for a container.
  128. message ContainerSpec {
  129. // image defines the image reference, as specified in the
  130. // distribution/reference package. This may include a registry host, name,
  131. // tag or digest.
  132. //
  133. // The field will be directly passed to the engine pulling. Well-behaved
  134. // service definitions will used immutable references, either through tags
  135. // that don't change or verifiable digests.
  136. string image = 1;
  137. // Labels defines labels to be added to the container at creation time. If
  138. // collisions with system labels occur, these labels will be overridden.
  139. //
  140. // This field *must* remain compatible with the Labels field of
  141. // Annotations.
  142. map<string, string> labels = 2;
  143. // Command to run the the container. The first element is a path to the
  144. // executable and the following elements are treated as arguments.
  145. //
  146. // If command is empty, execution will fall back to the image's entrypoint.
  147. //
  148. // Command should only be used when overriding entrypoint.
  149. repeated string command = 3;
  150. // Args specifies arguments provided to the image's entrypoint.
  151. //
  152. // If Command and Args are provided, Args will be appended to Command.
  153. repeated string args = 4;
  154. // Hostname specifies the hostname that will be set on containers created by docker swarm.
  155. // All containers for a given service will have the same hostname
  156. string hostname = 14;
  157. // Env specifies the environment variables for the container in NAME=VALUE
  158. // format. These must be compliant with [IEEE Std
  159. // 1003.1-2001](http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html).
  160. repeated string env = 5;
  161. // Dir defines the working directory to set for the container process.
  162. string dir = 6;
  163. // User specifies the user that should be employed to run the container.
  164. //
  165. // Note that the primary group may be specified by appending the group name
  166. // or id to the user name, separated by a `:`. This syntax is
  167. // `<user>:<group>`.
  168. string user = 7;
  169. // Groups specifies supplementary groups available to the user.
  170. repeated string groups = 11;
  171. // Privileges specifies security configuration/permissions.
  172. Privileges privileges = 22;
  173. // TTY declares that a TTY should be attached to the standard streams,
  174. // including stdin if it is still open.
  175. bool tty = 13 [(gogoproto.customname) = "TTY"];
  176. // OpenStdin declares that the standard input (stdin) should be open.
  177. bool open_stdin = 18;
  178. // ReadOnly declares that the container root filesystem is read-only.
  179. // This only impacts the root filesystem, not additional mounts (including
  180. // tmpfs). For additional mounts that are not part of the initial rootfs,
  181. // they will be decided by the modes passed in the mount definition.
  182. bool read_only = 19;
  183. // StopSignal defines the signal to stop the container.
  184. string stop_signal = 20;
  185. repeated Mount mounts = 8 [(gogoproto.nullable) = false];
  186. // StopGracePeriod the grace period for stopping the container before
  187. // forcefully killing the container.
  188. // Note: Can't use stdduration here because this needs to be nullable.
  189. google.protobuf.Duration stop_grace_period = 9;
  190. // PullOptions allows one to parameterize an image pull.
  191. message PullOptions {
  192. // RegistryAuth is the registry auth token obtained from the client, required
  193. // to pull private images. This is the unmodified JSON used as part of
  194. // the `X-Registry-Auth` header.
  195. // TODO(nishanttotla): This field will later be deprecated
  196. string registry_auth = 64;
  197. }
  198. // PullOptions parameterize the behavior of image pulls.
  199. PullOptions pull_options = 10;
  200. // SecretReference contains references to zero or more secrets that
  201. // will be exposed to the container.
  202. repeated SecretReference secrets = 12;
  203. // ConfigReference contains references to zero or more configs that
  204. // will be exposed to the container.
  205. repeated ConfigReference configs = 21;
  206. // Hosts allow additional entries to be specified in /etc/hosts
  207. // that associates IP addresses with hostnames.
  208. // Detailed documentation is available in:
  209. // http://man7.org/linux/man-pages/man5/hosts.5.html
  210. // IP_address canonical_hostname [aliases...]
  211. //
  212. // The format of the Hosts in swarmkit follows the same as
  213. // above.
  214. // This is different from `docker run --add-host <hostname>:<ip>`
  215. // where format is `<hostname>:<ip>`
  216. repeated string hosts = 17;
  217. // DNSConfig specifies DNS related configurations in resolver configuration file (resolv.conf)
  218. // Detailed documentation is available in:
  219. // http://man7.org/linux/man-pages/man5/resolv.conf.5.html
  220. // TODO: domain is not supported yet
  221. message DNSConfig {
  222. // Nameservers specifies the IP addresses of the name servers
  223. repeated string nameservers = 1;
  224. // Search specifies the search list for host-name lookup
  225. repeated string search = 2;
  226. // Options allows certain internal resolver variables to be modified
  227. repeated string options = 3;
  228. }
  229. // DNSConfig allows one to specify DNS related configuration in resolv.conf
  230. DNSConfig dns_config = 15 [(gogoproto.customname) = "DNSConfig"];
  231. // Healthcheck describes how to check the container is healthy. If the
  232. // container is considered unhealthy, it will be destroyed, its creating
  233. // task will exit and a new task will be rescheduled elsewhere. A container
  234. // is considered unhealthy after `Retries` number of consecutive failures.
  235. HealthConfig healthcheck = 16;
  236. // Run a custom init inside the container, if null, use the daemon's configured settings
  237. oneof init {
  238. bool init_value = 23;
  239. }
  240. }
  241. // EndpointSpec defines the properties that can be configured to
  242. // access and loadbalance the service.
  243. message EndpointSpec {
  244. // ResolutionMode specifies the mode of resolution to use for
  245. // internal loadbalancing between tasks which are all within
  246. // the cluster. This is sometimes calls east-west data path.
  247. enum ResolutionMode {
  248. option (gogoproto.goproto_enum_prefix) = false;
  249. // VIP resolution mode specifies that the
  250. // service resolves to a logical IP and the requests
  251. // are sent to that logical IP. Packets hitting that
  252. // logical IP are load balanced to a chosen backend.
  253. VIP = 0 [(gogoproto.enumvalue_customname) = "ResolutionModeVirtualIP"];
  254. // DNSRR resolution mode specifies that the
  255. // service directly gets resolved to one of the
  256. // backend IP and the client directly initiates a
  257. // request towards the actual backend. This requires
  258. // that the client does not cache the DNS responses
  259. // when the DNS response TTL is 0.
  260. DNSRR = 1 [(gogoproto.enumvalue_customname) = "ResolutionModeDNSRoundRobin"];
  261. }
  262. ResolutionMode mode = 1;
  263. // List of exposed ports that this service is accessible from
  264. // external to the cluster.
  265. repeated PortConfig ports = 2;
  266. }
  267. // NetworkSpec specifies user defined network parameters.
  268. message NetworkSpec {
  269. Annotations annotations = 1 [(gogoproto.nullable) = false];
  270. // DriverConfig specific configuration consumed by the network driver.
  271. Driver driver_config = 2;
  272. // IPv6Enabled enables support for IPv6 on the network.
  273. bool ipv6_enabled = 3;
  274. // internal restricts external access to the network. This may be
  275. // accomplished by disabling the default gateway or through other means.
  276. bool internal = 4;
  277. IPAMOptions ipam = 5 [(gogoproto.customname) = "IPAM"];
  278. // Attachable allows external(to swarm) entities to manually
  279. // attach to this network. With this flag enabled, external
  280. // entities such as containers running in an worker node in
  281. // the cluster can manually attach to this network and access
  282. // the services attached to this network. If this flag is not
  283. // enabled(default case) no manual attachment to this network
  284. // can happen.
  285. bool attachable = 6;
  286. // Ingress indicates this network will provide the routing-mesh.
  287. // In older versions, the network providing the routing mesh was
  288. // swarm internally created only and it was identified by the name
  289. // "ingress" and the label "com.docker.swarm.internal": "true".
  290. bool ingress = 7;
  291. // ConfigFrom is the source of the configuration for this network.
  292. oneof config_from {
  293. // Network is the name of a network that provides the network
  294. // specific configuration for this network, locally on the node
  295. // where this network is being plumbed.
  296. string network = 8;
  297. }
  298. }
  299. // ClusterSpec specifies global cluster settings.
  300. message ClusterSpec {
  301. Annotations annotations = 1 [(gogoproto.nullable) = false];
  302. // DEPRECATED: AcceptancePolicy defines the certificate issuance policy.
  303. // Acceptance policy is no longer customizable, and secrets have been
  304. // replaced with join tokens.
  305. AcceptancePolicy acceptance_policy = 2 [deprecated=true, (gogoproto.nullable) = false];
  306. // Orchestration defines cluster-level orchestration settings.
  307. OrchestrationConfig orchestration = 3 [(gogoproto.nullable) = false];
  308. // Raft defines the cluster's raft settings.
  309. RaftConfig raft = 4 [(gogoproto.nullable) = false];
  310. // Dispatcher defines cluster-level dispatcher settings.
  311. DispatcherConfig dispatcher = 5 [(gogoproto.nullable) = false];
  312. // CAConfig defines cluster-level certificate authority settings.
  313. CAConfig ca_config = 6 [(gogoproto.nullable) = false, (gogoproto.customname) = "CAConfig"];
  314. // TaskDefaults specifies the default values to use for task creation.
  315. TaskDefaults task_defaults = 7 [(gogoproto.nullable) = false];
  316. // EncryptionConfig defines the cluster's encryption settings.
  317. EncryptionConfig encryption_config = 8 [(gogoproto.nullable) = false];
  318. }
  319. // SecretSpec specifies a user-provided secret.
  320. message SecretSpec {
  321. Annotations annotations = 1 [(gogoproto.nullable) = false];
  322. // Data is the secret payload - the maximum size is 500KB (that is, 500*1024 bytes)
  323. bytes data = 2;
  324. // Templating controls whether and how to evaluate the secret payload as
  325. // a template. If it is not set, no templating is used.
  326. //
  327. // The currently recognized values are:
  328. // - golang: Go templating
  329. Driver templating = 3;
  330. // Driver is the the secret driver that is used to store the specified secret
  331. Driver driver = 4;
  332. }
  333. // ConfigSpec specifies user-provided configuration files.
  334. message ConfigSpec {
  335. Annotations annotations = 1 [(gogoproto.nullable) = false];
  336. // Data is the config payload - the maximum size is 500KB (that is, 500*1024 bytes)
  337. // TODO(aaronl): Do we want to revise this to include multiple payloads in a single
  338. // ConfigSpec? Define this to be a tar? etc...
  339. bytes data = 2;
  340. // Templating controls whether and how to evaluate the secret payload as
  341. // a template. If it is not set, no templating is used.
  342. //
  343. // The currently recognized values are:
  344. // - golang: Go templating
  345. Driver templating = 3;
  346. }