diff --git a/build.gradle b/build.gradle index 55373dbce..eb7a13ab1 100644 --- a/build.gradle +++ b/build.gradle @@ -18,6 +18,7 @@ plugins { id 'io.spinnaker.project' version "$spinnakerGradleVersion" apply false id "org.jetbrains.kotlin.jvm" version "$kotlinVersion" apply false id "org.jetbrains.kotlin.plugin.allopen" version "$kotlinVersion" apply false + } allprojects { diff --git a/front50-web/front50-web.gradle b/front50-web/front50-web.gradle index a7f22c1f8..95ac9b175 100644 --- a/front50-web/front50-web.gradle +++ b/front50-web/front50-web.gradle @@ -35,7 +35,7 @@ dependencies { implementation "io.spinnaker.kork:kork-web" implementation "io.spinnaker.kork:kork-exceptions" implementation "com.squareup.retrofit:converter-jackson" - implementation "io.swagger:swagger-annotations" + implementation "io.swagger.core.v3:swagger-annotations" implementation "commons-codec:commons-codec" implementation "javax.validation:validation-api" diff --git a/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/AdminController.java b/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/AdminController.java index 7d29ed7bf..de3b70462 100644 --- a/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/AdminController.java +++ b/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/AdminController.java @@ -18,8 +18,8 @@ import com.netflix.spinnaker.front50.model.AdminOperations; import com.netflix.spinnaker.front50.model.ObjectType; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import java.util.Collection; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; @@ -29,7 +29,7 @@ @RestController @RequestMapping("/admin") -@Api(value = "admin", description = "Various administrative operations") +@Tag(name = "admin", description = "Various administrative operations") public class AdminController { private final Collection adminOperations; @@ -39,7 +39,7 @@ public AdminController(Collection adminOperations) { this.adminOperations = adminOperations; } - @ApiOperation(value = "", notes = "Recover a previously deleted object") + @Operation(summary = "", description = "Recover a previously deleted object") @RequestMapping(value = "/recover", method = RequestMethod.POST) void recover(@RequestBody AdminOperations.Recover operation) { adminOperations.forEach(o -> o.recover(operation)); diff --git a/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/DeliveryController.java b/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/DeliveryController.java index ed04c40e1..efc1c44ae 100644 --- a/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/DeliveryController.java +++ b/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/DeliveryController.java @@ -4,7 +4,7 @@ import com.netflix.spinnaker.front50.model.delivery.Delivery; import com.netflix.spinnaker.front50.model.delivery.DeliveryRepository; import com.netflix.spinnaker.kork.web.exceptions.NotFoundException; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; import java.util.Collection; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; @@ -25,35 +25,35 @@ public DeliveryController(DeliveryRepository deliveryRepository) { } @PostFilter("hasPermission(filterObject.application, 'APPLICATION', 'READ')") - @ApiOperation(value = "", notes = "Get all delivery configs") + @Operation(summary = "", description = "Get all delivery configs") @RequestMapping(method = RequestMethod.GET, value = "/deliveries") Collection getAllConfigs() { return deliveryRepository.getAllConfigs(); } @PreAuthorize("hasPermission(#application, 'APPLICATION', 'READ')") - @ApiOperation(value = "", notes = "Get the delivery configs for an application") + @Operation(summary = "", description = "Get the delivery configs for an application") @RequestMapping(method = RequestMethod.GET, value = "/applications/{application}/deliveries") Collection getConfigByAppName(@PathVariable String application) { return deliveryRepository.getConfigsByApplication(application); } @PostAuthorize("hasPermission(returnObject.application, 'APPLICATION', 'READ')") - @ApiOperation(value = "", notes = "Get a delivery config by id") + @Operation(summary = "", description = "Get a delivery config by id") @RequestMapping(method = RequestMethod.GET, value = "deliveries/{id}") Delivery getConfigById(@PathVariable String id) { return deliveryRepository.findById(id); } @PreAuthorize("hasPermission(#config.application, 'APPLICATION', 'WRITE')") - @ApiOperation(value = "", notes = "Create a delivery config") + @Operation(summary = "", description = "Create a delivery config") @RequestMapping(method = RequestMethod.POST, value = "/deliveries") Delivery createConfig(@RequestBody Delivery config) { return deliveryRepository.upsertConfig(config); } @PreAuthorize("hasPermission(#config.application, 'APPLICATION', 'WRITE')") - @ApiOperation(value = "", notes = "Update a delivery config") + @Operation(summary = "", description = "Update a delivery config") @RequestMapping(method = RequestMethod.PUT, value = "/deliveries/{id}") Delivery upsertConfig(@PathVariable String id, @RequestBody Delivery config) { if (!id.equals(config.getId())) { @@ -71,7 +71,7 @@ Delivery upsertConfig(@PathVariable String id, @RequestBody Delivery config) { } @PreAuthorize("hasPermission(#application, 'APPLICATION', 'WRITE')") - @ApiOperation(value = "", notes = "Delete a delivery config") + @Operation(summary = "", description = "Delete a delivery config") @RequestMapping( method = RequestMethod.DELETE, value = "/applications/{application}/deliveries/{id}") diff --git a/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/PermissionsController.java b/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/PermissionsController.java index a3ae67126..4bf7d004a 100644 --- a/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/PermissionsController.java +++ b/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/PermissionsController.java @@ -2,7 +2,7 @@ import com.netflix.spinnaker.front50.ApplicationPermissionsService; import com.netflix.spinnaker.front50.model.application.Application; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; import java.util.Set; import org.springframework.web.bind.annotation.*; @@ -16,7 +16,7 @@ public PermissionsController(ApplicationPermissionsService permissionsService) { this.permissionsService = permissionsService; } - @ApiOperation(value = "", notes = "Get all application permissions. Internal use only.") + @Operation(summary = "", description = "Get all application permissions. Internal use only.") @RequestMapping(method = RequestMethod.GET, value = "/applications") public Set getAllApplicationPermissions() { return permissionsService.getAllApplicationPermissions(); @@ -27,7 +27,7 @@ public Application.Permission getApplicationPermission(@PathVariable String appN return permissionsService.getApplicationPermission(appName); } - @ApiOperation(value = "", notes = "Create an application permission.") + @Operation(summary = "", description = "Create an application permission.") @RequestMapping(method = RequestMethod.POST, value = "/applications") public Application.Permission createApplicationPermission( @RequestBody Application.Permission newPermission) { diff --git a/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/v2/ApplicationsController.java b/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/v2/ApplicationsController.java index d535c18ff..7c8879b17 100644 --- a/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/v2/ApplicationsController.java +++ b/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/v2/ApplicationsController.java @@ -13,8 +13,8 @@ import com.netflix.spinnaker.front50.model.application.ApplicationPermissionDAO; import com.netflix.spinnaker.front50.model.application.ApplicationService; import com.netflix.spinnaker.kork.web.exceptions.NotFoundException; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import java.util.*; import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; @@ -30,7 +30,7 @@ @RestController @RequestMapping("/v2/applications") -@Api(value = "application", description = "Application API") +@Tag(name = "application", description = "Application API") public class ApplicationsController { private static final Logger log = LoggerFactory.getLogger(ApplicationsController.class); @@ -62,9 +62,9 @@ public ApplicationsController( @PreAuthorize("#restricted ? @fiatPermissionEvaluator.storeWholePermission() : true") @PostFilter("#restricted ? hasPermission(filterObject.name, 'APPLICATION', 'READ') : true") - @ApiOperation( - value = "", - notes = + @Operation( + summary = "", + description = "Fetch all applications.\n\nSupports filtering by one or more attributes:\n- ?email=my@email.com\n- ?email=my@email.com&name=flex") @RequestMapping(method = RequestMethod.GET) public List applications( @@ -113,7 +113,7 @@ public List applications( } @PreAuthorize("@fiatPermissionEvaluator.canCreate('APPLICATION', #app)") - @ApiOperation(value = "", notes = "Create an application") + @Operation(summary = "", description = "Create an application") @RequestMapping(method = RequestMethod.POST) public Application create(@RequestBody final Application app) { if (applicationService.findByName(app.getName()) != null) { @@ -135,7 +135,7 @@ public Application create(@RequestBody final Application app) { } @PreAuthorize("hasPermission(#applicationName, 'APPLICATION', 'WRITE')") - @ApiOperation(value = "", notes = "Delete an application") + @Operation(summary = "", description = "Delete an application") @RequestMapping(method = RequestMethod.DELETE, value = "/{applicationName:.+}") public void delete(@PathVariable String applicationName, HttpServletResponse response) { applicationService.delete(applicationName); @@ -143,7 +143,7 @@ public void delete(@PathVariable String applicationName, HttpServletResponse res } @PreAuthorize("hasPermission(#app.name, 'APPLICATION', 'WRITE')") - @ApiOperation(value = "", notes = "Update an existing application by merging the attributes") + @Operation(summary = "", description = "Update an existing application by merging the attributes") @RequestMapping(method = RequestMethod.PATCH, value = "/{applicationName:.+}") public Application update( @PathVariable final String applicationName, @RequestBody final Application app) { @@ -158,7 +158,9 @@ public Application update( } @PreAuthorize("hasPermission(#app.name, 'APPLICATION', 'WRITE')") - @ApiOperation(value = "", notes = "Update an existing application by replacing all attributes") + @Operation( + summary = "", + description = "Update an existing application by replacing all attributes") @RequestMapping(method = RequestMethod.PUT, value = "/{applicationName:.+}") public Application replace( @PathVariable final String applicationName, @RequestBody final Application app) { @@ -173,7 +175,7 @@ public Application replace( } @PostAuthorize("hasPermission(#applicationName, 'APPLICATION', 'READ')") - @ApiOperation(value = "", notes = "Fetch a single application by name") + @Operation(summary = "", description = "Fetch a single application by name") @RequestMapping(method = RequestMethod.GET, value = "/{applicationName:.+}") public Application get(@PathVariable final String applicationName) { Application app = applicationDAO.findByName(applicationName.toUpperCase()); diff --git a/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/v2/ProjectsController.java b/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/v2/ProjectsController.java index 2f484a662..dfa2c6987 100644 --- a/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/v2/ProjectsController.java +++ b/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/v2/ProjectsController.java @@ -25,8 +25,8 @@ import com.netflix.spinnaker.front50.model.project.Project; import com.netflix.spinnaker.front50.model.project.ProjectDAO; import com.netflix.spinnaker.kork.web.exceptions.NotFoundException; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -38,7 +38,7 @@ @RestController @RequestMapping(value = "/v2/projects", produces = MediaType.APPLICATION_JSON_VALUE) -@Api(value = "projects", description = "Project API") +@Tag(name = "projects", description = "Project API") public class ProjectsController { private static final Splitter COMMA_SPLITTER = Splitter.on(','); @@ -50,9 +50,9 @@ public ProjectsController(ProjectDAO projectDAO) { } @RequestMapping(value = "/search", method = RequestMethod.GET) - @ApiOperation( - value = "", - notes = + @Operation( + summary = "", + description = "Search for projects given one or more attributes.\n\n- /search?q=ProjectName\n- /search?q=ApplicationName\n") public Set search(@RequestParam("q") final String query) { return projectDAO.all().stream() @@ -64,9 +64,9 @@ public Set search(@RequestParam("q") final String query) { .collect(Collectors.toSet()); } - @ApiOperation( - value = "", - notes = + @Operation( + summary = "", + description = "Fetch all projects.\n\n Support filtering by one or more attributes:\n - ?name=projectName\n - ?email=my@email.com") @RequestMapping(method = RequestMethod.GET) public List projects( @@ -78,7 +78,7 @@ public List projects( return (pageSize == null) ? projects : projects.subList(0, Math.min(pageSize, projects.size())); } - @ApiOperation(value = "", notes = "Fetch a single project") + @Operation(summary = "", description = "Fetch a single project") @RequestMapping(method = RequestMethod.GET, value = "/{projectId}") public Project project(@PathVariable String projectId) { try { @@ -88,7 +88,7 @@ public Project project(@PathVariable String projectId) { } } - @ApiOperation(value = "", notes = "Update an existing project") + @Operation(summary = "", description = "Update an existing project") @RequestMapping(method = RequestMethod.PUT, value = "/{projectId}") public Project put(@PathVariable final String projectId, @RequestBody final Project project) { Project existingProject = projectDAO.findById(projectId); @@ -110,7 +110,7 @@ public Project put(@PathVariable final String projectId, @RequestBody final Proj return project; } - @ApiOperation(value = "", notes = "Create a project") + @Operation(summary = "", description = "Create a project") @RequestMapping(method = RequestMethod.POST) public Project create(@RequestBody final Project project) { project.setCreateTs(System.currentTimeMillis()); @@ -202,7 +202,7 @@ private static boolean clusterHasMatchingApplication( .orElse(false); } - @ApiOperation(value = "", notes = "Delete a project") + @Operation(summary = "", description = "Delete a project") @RequestMapping(method = RequestMethod.DELETE, value = "/{projectId}") public void delete(@PathVariable String projectId, HttpServletResponse response) { projectDAO.delete(projectId); diff --git a/gradle.properties b/gradle.properties index 8befd70e6..822dbc940 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ fiatVersion=1.51.0 includeProviders=azure,gcs,oracle,redis,s3,swift,sql -korkVersion=7.245.0 +korkVersion=7.247.0 org.gradle.parallel=true spinnakerGradleVersion=8.32.1 targetJava17=true