Browse code

Use singular tag names in swagger.yaml

This is required to make the type generation put things in the
correct directory, but unfortunately makes the names in the
documentation menu look a bit crap.

I think the best solution would be to add a `x-display-name`
extension to tags to determine how the tags show up in the menu,
rather than it depend on the name of the tag. I shall do this in
a follow-up PR - for now, let's fix the breakage.

Fixes #29045

Signed-off-by: Ben Firshman <ben@firshman.co.uk>
(cherry picked from commit 30a9249e1598ec3aa2ddb5885568f40466fa05e8)
Signed-off-by: Victor Vieux <victorvieux@gmail.com>

Ben Firshman authored on 2016/12/02 23:14:36
Showing 1 changed files
... ...
@@ -89,21 +89,21 @@ info:
89 89
 
90 90
 # The tags on paths define the menu sections in the ReDoc documentation, so
91 91
 # the usage of tags must make sense for that:
92
-# - They should be plural, not singular.
92
+# - They should be singular, not plural.
93 93
 # - There should not be too many tags, or the menu becomes unwieldly. For
94 94
 #   example, it is preferable to add a path to the "System" tag instead of
95 95
 #   creating a tag with a single path in it.
96 96
 # - The order of tags in this list defines the order in the menu.
97 97
 tags:
98 98
   # Primary objects
99
-  - name: "Containers"
99
+  - name: "Container"
100 100
     description: |
101 101
       Create and manage containers.
102
-  - name: "Images"
103
-  - name: "Networks"
102
+  - name: "Image"
103
+  - name: "Network"
104 104
     description: |
105 105
       Networks are user-defined networks that containers can be attached to. See the [networking documentation](https://docs.docker.com/engine/userguide/networking/) for more information.
106
-  - name: "Volumes"
106
+  - name: "Volume"
107 107
     description: |
108 108
       Create and manage persistent storage that can be attached to containers.
109 109
   - name: "Exec"
... ...
@@ -111,22 +111,22 @@ tags:
111 111
       Run new commands inside running containers. See the [command-line reference](https://docs.docker.com/engine/reference/commandline/exec/) for more information.
112 112
 
113 113
       To exec a command in a container, you first need to create an exec instance, then start it. These two API endpoints are wrapped up in a single command-line command, `docker exec`.
114
-  - name: "Secrets"
114
+  - name: "Secret"
115 115
   # Swarm things
116 116
   - name: "Swarm"
117 117
     description: |
118 118
       Engines can be clustered together in a swarm. See [the swarm mode documentation](https://docs.docker.com/engine/swarm/) for more information.
119
-  - name: "Nodes"
119
+  - name: "Node"
120 120
     description: |
121 121
       Nodes are instances of the Engine participating in a swarm. Swarm mode must be enabled for these endpoints to work.
122
-  - name: "Services"
122
+  - name: "Service"
123 123
     description: |
124 124
       Services are the definitions of tasks to run on a swarm. Swarm mode must be enabled for these endpoints to work.
125
-  - name: "Tasks"
125
+  - name: "Task"
126 126
     description: |
127 127
       A task is a container running on a swarm. It is the atomic scheduling unit of swarm. Swarm mode must be enabled for these endpoints to work.
128 128
   # System things
129
-  - name: "Plugins"
129
+  - name: "Plugin"
130 130
   - name: "System"
131 131
 
132 132
 definitions:
... ...
@@ -2618,7 +2618,7 @@ paths:
2618 2618
           description: "server error"
2619 2619
           schema:
2620 2620
             $ref: "#/definitions/ErrorResponse"
2621
-      tags: ["Containers"]
2621
+      tags: ["Container"]
2622 2622
   /containers/create:
2623 2623
     post:
2624 2624
       summary: "Create a container"
... ...
@@ -2817,7 +2817,7 @@ paths:
2817 2817
           description: "server error"
2818 2818
           schema:
2819 2819
             $ref: "#/definitions/ErrorResponse"
2820
-      tags: ["Containers"]
2820
+      tags: ["Container"]
2821 2821
   /containers/{id}/json:
2822 2822
     get:
2823 2823
       summary: "Inspect a container"
... ...
@@ -3093,7 +3093,7 @@ paths:
3093 3093
           type: "boolean"
3094 3094
           default: false
3095 3095
           description: "Return the size of container as fields `SizeRw` and `SizeRootFs`"
3096
-      tags: ["Containers"]
3096
+      tags: ["Container"]
3097 3097
   /containers/{id}/top:
3098 3098
     get:
3099 3099
       summary: "List processes running inside a container"
... ...
@@ -3169,7 +3169,7 @@ paths:
3169 3169
           description: "The arguments to pass to `ps`. For example, `aux`"
3170 3170
           type: "string"
3171 3171
           default: "-ef"
3172
-      tags: ["Containers"]
3172
+      tags: ["Container"]
3173 3173
   /containers/{id}/logs:
3174 3174
     get:
3175 3175
       summary: "Get container logs"
... ...
@@ -3238,7 +3238,7 @@ paths:
3238 3238
           description: "Only return this number of log lines from the end of the logs. Specify as an integer or `all` to output all log lines."
3239 3239
           type: "string"
3240 3240
           default: "all"
3241
-      tags: ["Containers"]
3241
+      tags: ["Container"]
3242 3242
   /containers/{id}/changes:
3243 3243
     get:
3244 3244
       summary: "Get changes on a container’s filesystem"
... ...
@@ -3294,7 +3294,7 @@ paths:
3294 3294
           required: true
3295 3295
           description: "ID or name of the container"
3296 3296
           type: "string"
3297
-      tags: ["Containers"]
3297
+      tags: ["Container"]
3298 3298
   /containers/{id}/export:
3299 3299
     get:
3300 3300
       summary: "Export a container"
... ...
@@ -3322,7 +3322,7 @@ paths:
3322 3322
           required: true
3323 3323
           description: "ID or name of the container"
3324 3324
           type: "string"
3325
-      tags: ["Containers"]
3325
+      tags: ["Container"]
3326 3326
   /containers/{id}/stats:
3327 3327
     get:
3328 3328
       summary: "Get container stats based on resource usage"
... ...
@@ -3450,7 +3450,7 @@ paths:
3450 3450
           description: "Stream the output. If false, the stats will be output once and then it will disconnect."
3451 3451
           type: "boolean"
3452 3452
           default: true
3453
-      tags: ["Containers"]
3453
+      tags: ["Container"]
3454 3454
   /containers/{id}/resize:
3455 3455
     post:
3456 3456
       summary: "Resize a container TTY"
... ...
@@ -3488,7 +3488,7 @@ paths:
3488 3488
           in: "query"
3489 3489
           description: "Width of the tty session in characters"
3490 3490
           type: "integer"
3491
-      tags: ["Containers"]
3491
+      tags: ["Container"]
3492 3492
   /containers/{id}/start:
3493 3493
     post:
3494 3494
       summary: "Start a container"
... ...
@@ -3521,7 +3521,7 @@ paths:
3521 3521
           in: "query"
3522 3522
           description: "Override the key sequence for detaching a container. Format is a single character `[a-Z]` or `ctrl-<value>` where `<value>` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`."
3523 3523
           type: "string"
3524
-      tags: ["Containers"]
3524
+      tags: ["Container"]
3525 3525
   /containers/{id}/stop:
3526 3526
     post:
3527 3527
       summary: "Stop a container"
... ...
@@ -3554,7 +3554,7 @@ paths:
3554 3554
           in: "query"
3555 3555
           description: "Number of seconds to wait before killing the container"
3556 3556
           type: "integer"
3557
-      tags: ["Containers"]
3557
+      tags: ["Container"]
3558 3558
   /containers/{id}/restart:
3559 3559
     post:
3560 3560
       summary: "Restart a container"
... ...
@@ -3583,7 +3583,7 @@ paths:
3583 3583
           in: "query"
3584 3584
           description: "Number of seconds to wait before killing the container"
3585 3585
           type: "integer"
3586
-      tags: ["Containers"]
3586
+      tags: ["Container"]
3587 3587
   /containers/{id}/kill:
3588 3588
     post:
3589 3589
       summary: "Kill a container"
... ...
@@ -3614,7 +3614,7 @@ paths:
3614 3614
           description: "Signal to send to the container as an integer or string (e.g. `SIGINT`)"
3615 3615
           type: "string"
3616 3616
           default: "SIGKILL"
3617
-      tags: ["Containers"]
3617
+      tags: ["Container"]
3618 3618
   /containers/{id}/update:
3619 3619
     post:
3620 3620
       summary: "Update a container"
... ...
@@ -3675,7 +3675,7 @@ paths:
3675 3675
               RestartPolicy:
3676 3676
                 MaximumRetryCount: 4
3677 3677
                 Name: "on-failure"
3678
-      tags: ["Containers"]
3678
+      tags: ["Container"]
3679 3679
   /containers/{id}/rename:
3680 3680
     post:
3681 3681
       summary: "Rename a container"
... ...
@@ -3709,7 +3709,7 @@ paths:
3709 3709
           required: true
3710 3710
           description: "New name for the container"
3711 3711
           type: "string"
3712
-      tags: ["Containers"]
3712
+      tags: ["Container"]
3713 3713
   /containers/{id}/pause:
3714 3714
     post:
3715 3715
       summary: "Pause a container"
... ...
@@ -3738,7 +3738,7 @@ paths:
3738 3738
           required: true
3739 3739
           description: "ID or name of the container"
3740 3740
           type: "string"
3741
-      tags: ["Containers"]
3741
+      tags: ["Container"]
3742 3742
   /containers/{id}/unpause:
3743 3743
     post:
3744 3744
       summary: "Unpause a container"
... ...
@@ -3764,7 +3764,7 @@ paths:
3764 3764
           required: true
3765 3765
           description: "ID or name of the container"
3766 3766
           type: "string"
3767
-      tags: ["Containers"]
3767
+      tags: ["Container"]
3768 3768
   /containers/{id}/attach:
3769 3769
     post:
3770 3770
       summary: "Attach to a container"
... ...
@@ -3908,7 +3908,7 @@ paths:
3908 3908
           description: "Attach to `stderr`"
3909 3909
           type: "boolean"
3910 3910
           default: false
3911
-      tags: ["Containers"]
3911
+      tags: ["Container"]
3912 3912
   /containers/{id}/attach/ws:
3913 3913
     get:
3914 3914
       summary: "Attach to a container via a websocket"
... ...
@@ -3968,7 +3968,7 @@ paths:
3968 3968
           description: "Attach to `stderr`"
3969 3969
           type: "boolean"
3970 3970
           default: false
3971
-      tags: ["Containers"]
3971
+      tags: ["Container"]
3972 3972
   /containers/{id}/wait:
3973 3973
     post:
3974 3974
       summary: "Wait for a container"
... ...
@@ -4003,7 +4003,7 @@ paths:
4003 4003
           required: true
4004 4004
           description: "ID or name of the container"
4005 4005
           type: "string"
4006
-      tags: ["Containers"]
4006
+      tags: ["Container"]
4007 4007
   /containers/{id}:
4008 4008
     delete:
4009 4009
       summary: "Remove a container"
... ...
@@ -4042,7 +4042,7 @@ paths:
4042 4042
           description: "If the container is running, kill it before removing it."
4043 4043
           type: "boolean"
4044 4044
           default: false
4045
-      tags: ["Containers"]
4045
+      tags: ["Container"]
4046 4046
   /containers/{id}/archive:
4047 4047
     head:
4048 4048
       summary: "Get information about files in a container"
... ...
@@ -4088,7 +4088,7 @@ paths:
4088 4088
           required: true
4089 4089
           description: "Resource in the container’s filesystem to archive."
4090 4090
           type: "string"
4091
-      tags: ["Containers"]
4091
+      tags: ["Container"]
4092 4092
     get:
4093 4093
       summary: "Get an archive of a filesystem resource in a container"
4094 4094
       description: "Get an tar archive of a resource in the filesystem of container id."
... ...
@@ -4131,7 +4131,7 @@ paths:
4131 4131
           required: true
4132 4132
           description: "Resource in the container’s filesystem to archive."
4133 4133
           type: "string"
4134
-      tags: ["Containers"]
4134
+      tags: ["Container"]
4135 4135
     put:
4136 4136
       summary: "Extract an archive of files or folders to a directory in a container"
4137 4137
       description: "Upload a tar archive to be extracted to a path in the filesystem of container id."
... ...
@@ -4182,7 +4182,7 @@ paths:
4182 4182
           description: "The input stream must be a tar archive compressed with one of the following algorithms: identity (no compression), gzip, bzip2, xz."
4183 4183
           schema:
4184 4184
             type: "string"
4185
-      tags: ["Containers"]
4185
+      tags: ["Container"]
4186 4186
   /containers/prune:
4187 4187
     post:
4188 4188
       summary: "Delete stopped containers"
... ...
@@ -4210,7 +4210,7 @@ paths:
4210 4210
           description: "Server error"
4211 4211
           schema:
4212 4212
             $ref: "#/definitions/ErrorResponse"
4213
-      tags: ["Containers"]
4213
+      tags: ["Container"]
4214 4214
   /images/json:
4215 4215
     get:
4216 4216
       summary: "List Images"
... ...
@@ -4281,7 +4281,7 @@ paths:
4281 4281
           description: "Show digest information as a `RepoDigests` field on each image."
4282 4282
           type: "boolean"
4283 4283
           default: false
4284
-      tags: ["Images"]
4284
+      tags: ["Image"]
4285 4285
   /build:
4286 4286
     post:
4287 4287
       summary: "Build an image"
... ...
@@ -4428,7 +4428,7 @@ paths:
4428 4428
           description: "server error"
4429 4429
           schema:
4430 4430
             $ref: "#/definitions/ErrorResponse"
4431
-      tags: ["Images"]
4431
+      tags: ["Image"]
4432 4432
   /images/create:
4433 4433
     post:
4434 4434
       summary: "Create an image"
... ...
@@ -4473,7 +4473,7 @@ paths:
4473 4473
           in: "header"
4474 4474
           description: "A base64-encoded auth configuration. [See the authentication section for details.](#section/Authentication)"
4475 4475
           type: "string"
4476
-      tags: ["Images"]
4476
+      tags: ["Image"]
4477 4477
   /images/{name}/json:
4478 4478
     get:
4479 4479
       summary: "Inspect an image"
... ...
@@ -4579,7 +4579,7 @@ paths:
4579 4579
           description: "Image name or id"
4580 4580
           type: "string"
4581 4581
           required: true
4582
-      tags: ["Images"]
4582
+      tags: ["Image"]
4583 4583
   /images/{name}/history:
4584 4584
     get:
4585 4585
       summary: "Get the history of an image"
... ...
@@ -4649,7 +4649,7 @@ paths:
4649 4649
           description: "Image name or ID"
4650 4650
           type: "string"
4651 4651
           required: true
4652
-      tags: ["Images"]
4652
+      tags: ["Image"]
4653 4653
   /images/{name}/push:
4654 4654
     post:
4655 4655
       summary: "Push an image"
... ...
@@ -4688,7 +4688,7 @@ paths:
4688 4688
           description: "A base64-encoded auth configuration. [See the authentication section for details.](#section/Authentication)"
4689 4689
           type: "string"
4690 4690
           required: true
4691
-      tags: ["Images"]
4691
+      tags: ["Image"]
4692 4692
   /images/{name}/tag:
4693 4693
     post:
4694 4694
       summary: "Tag an image"
... ...
@@ -4727,7 +4727,7 @@ paths:
4727 4727
           in: "query"
4728 4728
           description: "The name of the new tag."
4729 4729
           type: "string"
4730
-      tags: ["Images"]
4730
+      tags: ["Image"]
4731 4731
   /images/{name}:
4732 4732
     delete:
4733 4733
       summary: "Remove an image"
... ...
@@ -4778,7 +4778,7 @@ paths:
4778 4778
           description: "Do not delete untagged parent images"
4779 4779
           type: "boolean"
4780 4780
           default: false
4781
-      tags: ["Images"]
4781
+      tags: ["Image"]
4782 4782
   /images/search:
4783 4783
     get:
4784 4784
       summary: "Search images"
... ...
@@ -4844,7 +4844,7 @@ paths:
4844 4844
             - `is-automated=(true|false)`
4845 4845
             - `is-official=(true|false)`
4846 4846
           type: "string"
4847
-      tags: ["Images"]
4847
+      tags: ["Image"]
4848 4848
   /images/prune:
4849 4849
     post:
4850 4850
       summary: "Delete unused images"
... ...
@@ -4882,7 +4882,7 @@ paths:
4882 4882
           description: "Server error"
4883 4883
           schema:
4884 4884
             $ref: "#/definitions/ErrorResponse"
4885
-      tags: ["Images"]
4885
+      tags: ["Image"]
4886 4886
   /auth:
4887 4887
     post:
4888 4888
       summary: "Check auth configuration"
... ...
@@ -5261,7 +5261,7 @@ paths:
5261 5261
           in: "query"
5262 5262
           description: "`Dockerfile` instructions to apply while committing"
5263 5263
           type: "string"
5264
-      tags: ["Images"]
5264
+      tags: ["Image"]
5265 5265
   /events:
5266 5266
     get:
5267 5267
       summary: "Monitor events"
... ...
@@ -5487,7 +5487,7 @@ paths:
5487 5487
           description: "Image name or ID"
5488 5488
           type: "string"
5489 5489
           required: true
5490
-      tags: ["Images"]
5490
+      tags: ["Image"]
5491 5491
   /images/get:
5492 5492
     get:
5493 5493
       summary: "Export several images"
... ...
@@ -5517,7 +5517,7 @@ paths:
5517 5517
           type: "array"
5518 5518
           items:
5519 5519
             type: "string"
5520
-      tags: ["Images"]
5520
+      tags: ["Image"]
5521 5521
   /images/load:
5522 5522
     post:
5523 5523
       summary: "Import images"
... ...
@@ -5549,7 +5549,7 @@ paths:
5549 5549
           description: "Suppress progress details during load."
5550 5550
           type: "boolean"
5551 5551
           default: false
5552
-      tags: ["Images"]
5552
+      tags: ["Image"]
5553 5553
   /containers/{id}/exec:
5554 5554
     post:
5555 5555
       summary: "Create an exec instance"
... ...
@@ -5832,7 +5832,7 @@ paths:
5832 5832
               driver name.
5833 5833
           type: "string"
5834 5834
           format: "json"
5835
-      tags: ["Volumes"]
5835
+      tags: ["Volume"]
5836 5836
 
5837 5837
   /volumes/create:
5838 5838
     post:
... ...
@@ -5882,7 +5882,7 @@ paths:
5882 5882
                 com.example.some-label: "some-value"
5883 5883
                 com.example.some-other-label: "some-other-value"
5884 5884
               Driver: "custom"
5885
-      tags: ["Volumes"]
5885
+      tags: ["Volume"]
5886 5886
 
5887 5887
   /volumes/{name}:
5888 5888
     get:
... ...
@@ -5908,7 +5908,7 @@ paths:
5908 5908
           required: true
5909 5909
           description: "Volume name or ID"
5910 5910
           type: "string"
5911
-      tags: ["Volumes"]
5911
+      tags: ["Volume"]
5912 5912
 
5913 5913
     delete:
5914 5914
       summary: "Remove a volume"
... ...
@@ -5940,7 +5940,7 @@ paths:
5940 5940
           description: "Force the removal of the volume"
5941 5941
           type: "boolean"
5942 5942
           default: false
5943
-      tags: ["Volumes"]
5943
+      tags: ["Volume"]
5944 5944
   /volumes/prune:
5945 5945
     post:
5946 5946
       summary: "Delete unused volumes"
... ...
@@ -5968,7 +5968,7 @@ paths:
5968 5968
           description: "Server error"
5969 5969
           schema:
5970 5970
             $ref: "#/definitions/ErrorResponse"
5971
-      tags: ["Volumes"]
5971
+      tags: ["Volume"]
5972 5972
   /networks:
5973 5973
     get:
5974 5974
       summary: "List networks"
... ...
@@ -6049,7 +6049,7 @@ paths:
6049 6049
             - `name=<network-name>` Matches all or part of a network name.
6050 6050
             - `type=["custom"|"builtin"]` Filters networks by type. The `custom` keyword returns all user-defined networks.
6051 6051
           type: "string"
6052
-      tags: ["Networks"]
6052
+      tags: ["Network"]
6053 6053
 
6054 6054
   /networks/{id}:
6055 6055
     get:
... ...
@@ -6072,7 +6072,7 @@ paths:
6072 6072
           description: "Network ID or name"
6073 6073
           required: true
6074 6074
           type: "string"
6075
-      tags: ["Networks"]
6075
+      tags: ["Network"]
6076 6076
 
6077 6077
     delete:
6078 6078
       summary: "Remove a network"
... ...
@@ -6094,7 +6094,7 @@ paths:
6094 6094
           description: "Network ID or name"
6095 6095
           required: true
6096 6096
           type: "string"
6097
-      tags: ["Networks"]
6097
+      tags: ["Network"]
6098 6098
 
6099 6099
   /networks/create:
6100 6100
     post:
... ...
@@ -6190,7 +6190,7 @@ paths:
6190 6190
               Labels:
6191 6191
                 com.example.some-label: "some-value"
6192 6192
                 com.example.some-other-label: "some-other-value"
6193
-      tags: ["Networks"]
6193
+      tags: ["Network"]
6194 6194
 
6195 6195
   /networks/{id}/connect:
6196 6196
     post:
... ...
@@ -6236,7 +6236,7 @@ paths:
6236 6236
                 IPAMConfig:
6237 6237
                   IPv4Address: "172.24.56.89"
6238 6238
                   IPv6Address: "2001:db8::5689"
6239
-      tags: ["Networks"]
6239
+      tags: ["Network"]
6240 6240
 
6241 6241
   /networks/{id}/disconnect:
6242 6242
     post:
... ...
@@ -6277,7 +6277,7 @@ paths:
6277 6277
               Force:
6278 6278
                 type: "boolean"
6279 6279
                 description: "Force the container to disconnect from the network."
6280
-      tags: ["Networks"]
6280
+      tags: ["Network"]
6281 6281
   /networks/prune:
6282 6282
     post:
6283 6283
       summary: "Delete unused networks"
... ...
@@ -6301,7 +6301,7 @@ paths:
6301 6301
           description: "Server error"
6302 6302
           schema:
6303 6303
             $ref: "#/definitions/ErrorResponse"
6304
-      tags: ["Networks"]
6304
+      tags: ["Network"]
6305 6305
   /plugins:
6306 6306
     get:
6307 6307
       summary: "List plugins"
... ...
@@ -6394,7 +6394,7 @@ paths:
6394 6394
           description: "Server error"
6395 6395
           schema:
6396 6396
             $ref: "#/definitions/ErrorResponse"
6397
-      tags: ["Plugins"]
6397
+      tags: ["Plugin"]
6398 6398
 
6399 6399
   /plugins/pull:
6400 6400
     post:
... ...
@@ -6451,7 +6451,7 @@ paths:
6451 6451
           in: "header"
6452 6452
           description: "A base64-encoded auth configuration to use when pulling a plugin from a registry. [See the authentication section for details.](#section/Authentication)"
6453 6453
           type: "string"
6454
-      tags: ["Plugins"]
6454
+      tags: ["Plugin"]
6455 6455
   /plugins/{name}:
6456 6456
     get:
6457 6457
       summary: "Inspect a plugin"
... ...
@@ -6475,7 +6475,7 @@ paths:
6475 6475
           description: "The name of the plugin. The `:latest` tag is optional, and is the default if omitted."
6476 6476
           required: true
6477 6477
           type: "string"
6478
-      tags: ["Plugins"]
6478
+      tags: ["Plugin"]
6479 6479
     delete:
6480 6480
       summary: "Remove a plugin"
6481 6481
       operationId: "PluginDelete"
... ...
@@ -6503,7 +6503,7 @@ paths:
6503 6503
           description: "Disable the plugin before removing. This may result in issues if the plugin is in use by a container."
6504 6504
           type: "boolean"
6505 6505
           default: false
6506
-      tags: ["Plugins"]
6506
+      tags: ["Plugin"]
6507 6507
   /plugins/{name}/enable:
6508 6508
     post:
6509 6509
       summary: "Enable a plugin"
... ...
@@ -6526,7 +6526,7 @@ paths:
6526 6526
           description: "Set the HTTP client timeout (in seconds)"
6527 6527
           type: "integer"
6528 6528
           default: 0
6529
-      tags: ["Plugins"]
6529
+      tags: ["Plugin"]
6530 6530
   /plugins/{name}/disable:
6531 6531
     post:
6532 6532
       summary: "Disable a plugin"
... ...
@@ -6544,7 +6544,7 @@ paths:
6544 6544
           description: "The name of the plugin. The `:latest` tag is optional, and is the default if omitted."
6545 6545
           required: true
6546 6546
           type: "string"
6547
-      tags: ["Plugins"]
6547
+      tags: ["Plugin"]
6548 6548
   /plugins/create:
6549 6549
     post:
6550 6550
       summary: "Create a plugin"
... ...
@@ -6570,7 +6570,7 @@ paths:
6570 6570
           schema:
6571 6571
             type: "string"
6572 6572
             format: "binary"
6573
-      tags: ["Plugins"]
6573
+      tags: ["Plugin"]
6574 6574
   /plugins/{name}/push:
6575 6575
     post:
6576 6576
       summary: "Push a plugin"
... ...
@@ -6594,7 +6594,7 @@ paths:
6594 6594
           description: "server error"
6595 6595
           schema:
6596 6596
             $ref: "#/definitions/ErrorResponse"
6597
-      tags: ["Plugins"]
6597
+      tags: ["Plugin"]
6598 6598
   /plugins/{name}/set:
6599 6599
     post:
6600 6600
       summary: "Configure a plugin"
... ...
@@ -6625,7 +6625,7 @@ paths:
6625 6625
           description: "Server error"
6626 6626
           schema:
6627 6627
             $ref: "#/definitions/ErrorResponse"
6628
-      tags: ["Plugins"]
6628
+      tags: ["Plugin"]
6629 6629
   /nodes:
6630 6630
     get:
6631 6631
       summary: "List nodes"
... ...
@@ -6654,7 +6654,7 @@ paths:
6654 6654
             - `name=<node name>`
6655 6655
             - `role=`(`manager`|`worker`)`
6656 6656
           type: "string"
6657
-      tags: ["Nodes"]
6657
+      tags: ["Node"]
6658 6658
   /nodes/{id}:
6659 6659
     get:
6660 6660
       summary: "Inspect a node"
... ...
@@ -6678,7 +6678,7 @@ paths:
6678 6678
           description: "The ID or name of the node"
6679 6679
           type: "string"
6680 6680
           required: true
6681
-      tags: ["Nodes"]
6681
+      tags: ["Node"]
6682 6682
     delete:
6683 6683
       summary: "Delete a node"
6684 6684
       operationId: "NodeDelete"
... ...
@@ -6704,7 +6704,7 @@ paths:
6704 6704
           description: "Force remove a node from the swarm"
6705 6705
           default: false
6706 6706
           type: "boolean"
6707
-      tags: ["Nodes"]
6707
+      tags: ["Node"]
6708 6708
   /nodes/{id}/update:
6709 6709
     post:
6710 6710
       summary: "Update a node"
... ...
@@ -6736,7 +6736,7 @@ paths:
6736 6736
           type: "integer"
6737 6737
           format: "int64"
6738 6738
           required: true
6739
-      tags: ["Nodes"]
6739
+      tags: ["Node"]
6740 6740
   /swarm:
6741 6741
     get:
6742 6742
       summary: "Inspect swarm"
... ...
@@ -7034,7 +7034,7 @@ paths:
7034 7034
             - `id=<service id>`
7035 7035
             - `name=<service name>`
7036 7036
             - `label=<service label>`
7037
-      tags: ["Services"]
7037
+      tags: ["Service"]
7038 7038
   /services/create:
7039 7039
     post:
7040 7040
       summary: "Create a service"
... ...
@@ -7131,7 +7131,7 @@ paths:
7131 7131
           in: "header"
7132 7132
           description: "A base64-encoded auth configuration for pulling from private registries. [See the authentication section for details.](#section/Authentication)"
7133 7133
           type: "string"
7134
-      tags: ["Services"]
7134
+      tags: ["Service"]
7135 7135
   /services/{id}:
7136 7136
     get:
7137 7137
       summary: "Inspect a service"
... ...
@@ -7155,7 +7155,7 @@ paths:
7155 7155
           description: "ID or name of service."
7156 7156
           required: true
7157 7157
           type: "string"
7158
-      tags: ["Services"]
7158
+      tags: ["Service"]
7159 7159
     delete:
7160 7160
       summary: "Delete a service"
7161 7161
       operationId: "ServiceDelete"
... ...
@@ -7176,7 +7176,7 @@ paths:
7176 7176
           description: "ID or name of service."
7177 7177
           required: true
7178 7178
           type: "string"
7179
-      tags: ["Services"]
7179
+      tags: ["Service"]
7180 7180
   /services/{id}/update:
7181 7181
     post:
7182 7182
       summary: "Update a service"
... ...
@@ -7251,7 +7251,7 @@ paths:
7251 7251
           description: "A base64-encoded auth configuration for pulling from private registries. [See the authentication section for details.](#section/Authentication)"
7252 7252
           type: "string"
7253 7253
 
7254
-      tags: ["Services"]
7254
+      tags: ["Service"]
7255 7255
   /services/{id}/logs:
7256 7256
     get:
7257 7257
       summary: "Get service logs"
... ...
@@ -7328,7 +7328,7 @@ paths:
7328 7328
           description: "Only return this number of log lines from the end of the logs. Specify as an integer or `all` to output all log lines."
7329 7329
           type: "string"
7330 7330
           default: "all"
7331
-      tags: ["Services"]
7331
+      tags: ["Service"]
7332 7332
   /tasks:
7333 7333
     get:
7334 7334
       summary: "List tasks"
... ...
@@ -7471,7 +7471,7 @@ paths:
7471 7471
             - `node=<node id or name>`
7472 7472
             - `label=key` or `label="key=value"`
7473 7473
             - `desired-state=(running | shutdown | accepted)`
7474
-      tags: ["Tasks"]
7474
+      tags: ["Task"]
7475 7475
   /tasks/{id}:
7476 7476
     get:
7477 7477
       summary: "Inspect a task"
... ...
@@ -7497,7 +7497,7 @@ paths:
7497 7497
           description: "ID of the task"
7498 7498
           required: true
7499 7499
           type: "string"
7500
-      tags: ["Tasks"]
7500
+      tags: ["Task"]
7501 7501
   /secrets:
7502 7502
     get:
7503 7503
       summary: "List secrets"
... ...
@@ -7531,7 +7531,7 @@ paths:
7531 7531
             A JSON encoded value of the filters (a `map[string][]string`) to process on the secrets list. Available filters:
7532 7532
 
7533 7533
             - `names=<secret name>`
7534
-      tags: ["Secrets"]
7534
+      tags: ["Secret"]
7535 7535
   /secrets/create:
7536 7536
     post:
7537 7537
       summary: "Create a secret"
... ...
@@ -7575,7 +7575,7 @@ paths:
7575 7575
                   Labels:
7576 7576
                     foo: "bar"
7577 7577
                   Data: "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg=="
7578
-      tags: ["Secrets"]
7578
+      tags: ["Secret"]
7579 7579
   /secrets/{id}:
7580 7580
     get:
7581 7581
       summary: "Inspect a secret"
... ...
@@ -7613,7 +7613,7 @@ paths:
7613 7613
           required: true
7614 7614
           type: "string"
7615 7615
           description: "ID of the secret"
7616
-      tags: ["Secrets"]
7616
+      tags: ["Secret"]
7617 7617
     delete:
7618 7618
       summary: "Delete a secret"
7619 7619
       operationId: "SecretDelete"
... ...
@@ -7636,4 +7636,4 @@ paths:
7636 7636
           required: true
7637 7637
           type: "string"
7638 7638
           description: "ID of the secret"
7639
-      tags: ["Secrets"]
7639
+      tags: ["Secret"]