Skip to content

Commit 6af3a6c

Browse files
authored
feat: api versioning (#53)
This commit adds versioning to our API endpoints, with the current version as `v1`. Under this scheme, each API version lives under separate packages and is served under separate top-level prefixes, e.g. `/v1` for the current version. This necessitated a small refactor to make it easier to modularize the initialization logic. PLAT-86
1 parent 04adb18 commit 6af3a6c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+435
-336
lines changed

.gitattributes

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
api/gen/** linguist-generated
1+
api/*/gen/** linguist-generated
22
go.work.sum linguist-generated
33
*/go.sum linguist-generated

api/Makefile

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
include ../tools.mk
22

3+
.PHONY: generate-v1
4+
generate-v1:
5+
goa gen github.com/pgEdge/control-plane/api/v1/design -o v1
6+
37
.PHONY: generate
4-
generate:
5-
goa gen github.com/pgEdge/control-plane/api/design
8+
generate: generate-v1

api/gen/http/openapi.json

Lines changed: 0 additions & 1 deletion
This file was deleted.

api/gen/http/openapi3.json

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@ import (
55
"net/http"
66

77
g "goa.design/goa/v3/dsl"
8-
)
98

10-
//go:embed version.txt
11-
var version string
9+
"github.com/pgEdge/control-plane/api"
10+
)
1211

1312
var _ = g.API("control-plane", func() {
14-
g.Title("pgEdge Control Plane API")
15-
g.Version(version)
13+
g.Title("pgEdge Control Plane v1 API")
14+
g.Version(api.Version)
1615
g.Description("Service for creating, modifying, and operating pgEdge databases.")
1716
g.Server("control-plane", func() {
1817
g.Host("localhost", func() {
@@ -70,7 +69,7 @@ var _ = g.Service("control-plane", func() {
7069
g.Error("cluster_already_initialized")
7170

7271
g.HTTP(func() {
73-
g.GET("/cluster/init")
72+
g.GET("/v1/cluster/init")
7473

7574
g.Meta("openapi:tag:Cluster")
7675
})
@@ -84,7 +83,7 @@ var _ = g.Service("control-plane", func() {
8483
g.Error("invalid_join_token")
8584

8685
g.HTTP(func() {
87-
g.POST("/cluster/join")
86+
g.POST("/v1/cluster/join")
8887

8988
g.Meta("openapi:tag:Cluster")
9089
})
@@ -97,7 +96,7 @@ var _ = g.Service("control-plane", func() {
9796
g.Error("cluster_not_initialized")
9897

9998
g.HTTP(func() {
100-
g.GET("/cluster/join-token")
99+
g.GET("/v1/cluster/join-token")
101100

102101
g.Meta("openapi:tag:Cluster")
103102
})
@@ -112,7 +111,7 @@ var _ = g.Service("control-plane", func() {
112111
g.Error("invalid_join_token")
113112

114113
g.HTTP(func() {
115-
g.POST("/internal/cluster/join-options")
114+
g.POST("/v1/internal/cluster/join-options")
116115
})
117116
})
118117

@@ -123,7 +122,7 @@ var _ = g.Service("control-plane", func() {
123122
g.Error("cluster_not_initialized")
124123

125124
g.HTTP(func() {
126-
g.GET("/cluster")
125+
g.GET("/v1/cluster")
127126

128127
g.Meta("openapi:tag:Cluster")
129128
})
@@ -136,7 +135,7 @@ var _ = g.Service("control-plane", func() {
136135
g.Error("cluster_not_initialized")
137136

138137
g.HTTP(func() {
139-
g.GET("/hosts")
138+
g.GET("/v1/hosts")
140139

141140
g.Meta("openapi:tag:Host")
142141
})
@@ -160,7 +159,7 @@ var _ = g.Service("control-plane", func() {
160159
g.Error("not_found")
161160

162161
g.HTTP(func() {
163-
g.GET("/hosts/{host_id}")
162+
g.GET("/v1/hosts/{host_id}")
164163

165164
g.Meta("openapi:tag:Host")
166165
})
@@ -183,7 +182,7 @@ var _ = g.Service("control-plane", func() {
183182
g.Error("not_found")
184183

185184
g.HTTP(func() {
186-
g.DELETE("/hosts/{host_id}")
185+
g.DELETE("/v1/hosts/{host_id}")
187186

188187
g.Meta("openapi:tag:Host")
189188
})
@@ -198,7 +197,7 @@ var _ = g.Service("control-plane", func() {
198197
g.Error("cluster_not_initialized")
199198

200199
g.HTTP(func() {
201-
g.GET("/databases")
200+
g.GET("/v1/databases")
202201

203202
g.Meta("openapi:tag:Database")
204203
})
@@ -215,7 +214,7 @@ var _ = g.Service("control-plane", func() {
215214
g.Error("operation_already_in_progress")
216215

217216
g.HTTP(func() {
218-
g.POST("/databases")
217+
g.POST("/v1/databases")
219218
g.Response("database_already_exists", http.StatusConflict)
220219

221220
g.Meta("openapi:tag:Database")
@@ -242,7 +241,7 @@ var _ = g.Service("control-plane", func() {
242241
g.Error("not_found")
243242

244243
g.HTTP(func() {
245-
g.GET("/databases/{database_id}")
244+
g.GET("/v1/databases/{database_id}")
246245

247246
g.Meta("openapi:tag:Database")
248247
})
@@ -274,7 +273,7 @@ var _ = g.Service("control-plane", func() {
274273
g.Error("operation_already_in_progress")
275274

276275
g.HTTP(func() {
277-
g.POST("/databases/{database_id}")
276+
g.POST("/v1/databases/{database_id}")
278277
g.Param("force_update")
279278
g.Body("request")
280279

@@ -302,7 +301,7 @@ var _ = g.Service("control-plane", func() {
302301
g.Error("operation_already_in_progress")
303302

304303
g.HTTP(func() {
305-
g.DELETE("/databases/{database_id}")
304+
g.DELETE("/v1/databases/{database_id}")
306305

307306
g.Meta("openapi:tag:Database")
308307
})
@@ -334,7 +333,7 @@ var _ = g.Service("control-plane", func() {
334333
g.Error("operation_already_in_progress")
335334

336335
g.HTTP(func() {
337-
g.POST("/databases/{database_id}/nodes/{node_name}/backups")
336+
g.POST("/v1/databases/{database_id}/nodes/{node_name}/backups")
338337
g.Body("options")
339338

340339
g.Meta("openapi:tag:Database")
@@ -373,7 +372,7 @@ var _ = g.Service("control-plane", func() {
373372
g.Error("not_found")
374373

375374
g.HTTP(func() {
376-
g.GET("/databases/{database_id}/tasks")
375+
g.GET("/v1/databases/{database_id}/tasks")
377376
g.Param("after_task_id")
378377
g.Param("limit")
379378
g.Param("sort_order")
@@ -405,7 +404,7 @@ var _ = g.Service("control-plane", func() {
405404
g.Error("not_found")
406405

407406
g.HTTP(func() {
408-
g.GET("/databases/{database_id}/tasks/{task_id}")
407+
g.GET("/v1/databases/{database_id}/tasks/{task_id}")
409408

410409
g.Meta("openapi:tag:Database")
411410
})
@@ -443,7 +442,7 @@ var _ = g.Service("control-plane", func() {
443442
g.Error("not_found")
444443

445444
g.HTTP(func() {
446-
g.GET("/databases/{database_id}/tasks/{task_id}/log")
445+
g.GET("/v1/databases/{database_id}/tasks/{task_id}/log")
447446
g.Param("after_entry_id")
448447
g.Param("limit")
449448

@@ -472,7 +471,7 @@ var _ = g.Service("control-plane", func() {
472471
g.Error("operation_already_in_progress")
473472

474473
g.HTTP(func() {
475-
g.POST("/databases/{database_id}/restore")
474+
g.POST("/v1/databases/{database_id}/restore")
476475
g.Body("request")
477476

478477
g.Meta("openapi:tag:Database")
@@ -485,14 +484,14 @@ var _ = g.Service("control-plane", func() {
485484
g.Result(VersionInfo)
486485

487486
g.HTTP(func() {
488-
g.GET("/version")
487+
g.GET("/v1/version")
489488

490489
g.Meta("openapi:tag:System")
491490
})
492491
})
493492

494493
// Serves the OpenAPI spec as a static file
495-
g.Files("/openapi.json", "./gen/http/openapi3.json", func() {
494+
g.Files("/v1/openapi.json", "./gen/http/openapi3.json", func() {
496495
g.Meta("openapi:generate", "false")
497496
})
498497
})

0 commit comments

Comments
 (0)