Skip to content

Commit bd505f0

Browse files
authored
Add HTTP API versioning for DataStore and TracingStore (#8705)
Introducing versioning for the HTTP APIs of datastore and tracingstore, analogous to the existing one on the wk side. That means that e.g. http://localhost:9000/data/v9/health should now reply the same as http://localhost:9000/data/health – and we now have the option to support legacy variants of datastore and tracingstore routes (for a limited time). As discussed in [slack](https://scm.slack.com/archives/C5AKLAV0B/p1750402140167989) this is now designed such that the versions of wk, datastore and tracingstore have to be identical. That means than when we introduce a new version in one of them, we have to create version redirects for the other two as well. I tried to unify the formatting of the routes files a little and moved the collections package in util to unify package structure there. ### URL of deployed dev instance (used for testing): - https://dstsversioning.webknossos.xyz ### Steps to test: - Trace some, should work normally - Try some routes with explicit version. Should work as expected (5 to 9 should be equal to latest, newer and older than that should be rejected) ### Issues: - fixes #8235 - Corresponding libs issue (blocked by this PR): scalableminds/webknossos-libs#1327 ------ - [x] Added changelog entry (create a `$PR_NUMBER.md` file in `unreleased_changes` or use `./tools/create-changelog-entry.py`) - [x] Considered [common edge cases](../blob/master/.github/common_edge_cases.md) - [x] Needs datastore update after deployment
1 parent c92b579 commit bd505f0

32 files changed

+111
-86
lines changed

app/RequestHandler.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import com.scalableminds.util.mvc.{CspHeaders, ExtendedController}
1+
import com.scalableminds.util.mvc.{ApiVersioning, CspHeaders, ExtendedController}
22
import com.typesafe.scalalogging.LazyLogging
33
import controllers.{Assets, SitemapController, AboutPageRedirectController}
44

@@ -9,7 +9,7 @@ import play.api.mvc.{Handler, InjectedController, RequestHeader}
99
import play.api.routing.Router
1010
import play.core.WebCommands
1111
import play.filters.csp.CSPConfig
12-
import utils.{ApiVersioning, WkConf}
12+
import utils.WkConf
1313

1414
import scala.concurrent.ExecutionContext
1515

app/controllers/AnalyticsController.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,15 @@ import play.api.libs.json.JsObject
66
import play.api.mvc.{Action, PlayBodyParsers}
77
import play.silhouette.api.Silhouette
88
import security.WkEnv
9-
import utils.{ApiVersioning, WkConf}
9+
import utils.WkConf
1010

1111
import javax.inject.Inject
1212
import scala.concurrent.ExecutionContext
1313

1414
class AnalyticsController @Inject()(analyticsService: AnalyticsService, conf: WkConf, sil: Silhouette[WkEnv])(
1515
implicit ec: ExecutionContext,
1616
bodyParsers: PlayBodyParsers)
17-
extends Controller
18-
with ApiVersioning {
17+
extends Controller {
1918

2019
def ingestAnalyticsEvents: Action[AnalyticsEventsIngestJson] = Action.async(validateJson[AnalyticsEventsIngestJson]) {
2120
implicit request =>

app/controllers/AnnotationIOController.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package controllers
22

3-
import collections.SequenceUtils
43
import com.scalableminds.util.accesscontext.{DBAccessContext, GlobalAccessContext}
4+
import com.scalableminds.util.collections.SequenceUtils
55
import com.scalableminds.util.io.ZipIO
66
import com.scalableminds.util.objectid.ObjectId
77
import com.scalableminds.util.tools.{Fox, FoxImplicits, TextUtils}

app/controllers/Application.scala

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package controllers
22

3+
import com.scalableminds.util.mvc.ApiVersioning
34
import com.scalableminds.util.tools.{Fox, FoxImplicits}
45
import com.typesafe.config.ConfigRenderOptions
56
import mail.{DefaultMails, Send}
@@ -11,7 +12,7 @@ import play.api.mvc.{Action, AnyContent, Result}
1112
import play.silhouette.api.Silhouette
1213
import security.{CertificateValidationService, WkEnv}
1314
import utils.sql.{SimpleSQLDAO, SqlClient}
14-
import utils.{ApiVersioning, StoreModules, WkConf}
15+
import utils.{StoreModules, WkConf}
1516

1617
import javax.inject.Inject
1718
import scala.concurrent.ExecutionContext
@@ -42,10 +43,7 @@ class Application @Inject()(actorSystem: ActorSystem,
4243
"webknossos" -> Json.toJson(
4344
webknossos.BuildInfo.toMap.view.mapValues(_.toString).filterKeys(_ != "certificatePublicKey").toMap),
4445
"schemaVersion" -> schemaVersion.toOption,
45-
"httpApiVersioning" -> Json.obj(
46-
"currentApiVersion" -> CURRENT_API_VERSION,
47-
"oldestSupportedApiVersion" -> OLDEST_SUPPORTED_API_VERSION
48-
),
46+
"httpApiVersioning" -> apiVersioningInfo,
4947
"localDataStoreEnabled" -> storeModules.localDataStoreEnabled,
5048
"localTracingStoreEnabled" -> storeModules.localTracingStoreEnabled
5149
))

app/controllers/TaskController.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package controllers
22

3-
import collections.SequenceUtils
4-
53
import java.io.File
64
import play.silhouette.api.Silhouette
75
import com.scalableminds.util.accesscontext.GlobalAccessContext
6+
import com.scalableminds.util.collections.SequenceUtils
87
import com.scalableminds.util.tools.{Fox, FoxImplicits, JsonHelper}
98
import com.scalableminds.webknossos.datastore.SkeletonTracing.SkeletonTracing
109
import com.scalableminds.webknossos.datastore.VolumeTracing.VolumeTracing

app/models/dataset/explore/WKExploreRemoteLayerService.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package models.dataset.explore
22

3-
import collections.SequenceUtils
43
import com.scalableminds.util.accesscontext.{DBAccessContext, GlobalAccessContext}
4+
import com.scalableminds.util.collections.SequenceUtils
55
import com.scalableminds.util.tools.{Fox, FoxImplicits}
66
import com.scalableminds.webknossos.datastore.explore.{
77
ExploreLayerUtils,

app/models/task/TaskCreationService.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package models.task
22

3-
import collections.SequenceUtils
4-
53
import java.io.File
64
import com.scalableminds.util.accesscontext.{DBAccessContext, GlobalAccessContext}
5+
import com.scalableminds.util.collections.SequenceUtils
76
import com.scalableminds.util.geometry.{BoundingBox, Vec3Double, Vec3Int}
87
import com.scalableminds.util.tools.{Fox, FoxImplicits}
98
import com.scalableminds.webknossos.datastore.SkeletonTracing.{

conf/noDS.routes

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
-> /api/ webknossos.versioned.Routes
2-
-> /tracings/ com.scalableminds.webknossos.tracingstore.Routes
1+
-> /api/ webknossos.versioned.Routes
2+
-> /tracings/ tracingstore.versioned.Routes
33

4-
GET /.well-known/security.txt controllers.Application.getSecurityTxt
4+
GET /.well-known/security.txt controllers.Application.getSecurityTxt

conf/noTS.routes

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
-> /api/ webknossos.versioned.Routes
2-
-> /data/ com.scalableminds.webknossos.datastore.Routes
1+
-> /api/ webknossos.versioned.Routes
2+
-> /data/ datastore.versioned.Routes
33

4-
GET /.well-known/security.txt controllers.Application.getSecurityTxt
4+
GET /.well-known/security.txt controllers.Application.getSecurityTxt

conf/routes

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
-> /api/ webknossos.versioned.Routes
2-
-> /data/ com.scalableminds.webknossos.datastore.Routes
3-
-> /tracings/ com.scalableminds.webknossos.tracingstore.Routes
1+
-> /api/ webknossos.versioned.Routes
2+
-> /data/ datastore.versioned.Routes
3+
-> /tracings/ tracingstore.versioned.Routes
44

5-
GET /.well-known/security.txt controllers.Application.getSecurityTxt
5+
GET /.well-known/security.txt controllers.Application.getSecurityTxt

0 commit comments

Comments
 (0)