From 5fa1e96b90c7398338d67ef7a7337ee3628591bd Mon Sep 17 00:00:00 2001 From: Christos Arvanitis Date: Tue, 7 May 2024 10:38:02 +0300 Subject: [PATCH] feat(taskView): Implement opt-in paginated request for TaskView (#10093) * feat(tasksview): Allowing opt-in pagination for tasks view loading * feat(taskView): Implement opt-in paginated request for TaskView --- packages/core/src/config/settings.ts | 1 + packages/core/src/task/task.dataSource.js | 20 ++++++++++++++++++-- packages/core/src/task/task.read.service.ts | 13 +++++++++++-- yarn.lock | 8 ++++---- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/packages/core/src/config/settings.ts b/packages/core/src/config/settings.ts index 9691df1ff73..733b8eaf2cf 100644 --- a/packages/core/src/config/settings.ts +++ b/packages/core/src/config/settings.ts @@ -142,6 +142,7 @@ export interface ISpinnakerSettings { }; stashTriggerInfo?: string; pollSchedule: number; + tasksViewLimitPerPage: number; providers?: { [key: string]: IProviderSettings; // allows custom providers not typed in here (good for testing too) }; diff --git a/packages/core/src/task/task.dataSource.js b/packages/core/src/task/task.dataSource.js index 03f9ce7dc54..515e1a9c771 100644 --- a/packages/core/src/task/task.dataSource.js +++ b/packages/core/src/task/task.dataSource.js @@ -2,6 +2,7 @@ import * as angular from 'angular'; import { ApplicationDataSourceRegistry } from '../application/service/ApplicationDataSourceRegistry'; import { CLUSTER_SERVICE } from '../cluster/cluster.service'; +import { SETTINGS } from '../config'; import { TaskReader } from './task.read.service'; export const CORE_TASK_TASK_DATASOURCE = 'spinnaker.core.task.dataSource'; @@ -14,8 +15,23 @@ angular.module(CORE_TASK_TASK_DATASOURCE, [CLUSTER_SERVICE]).run([ return $q.when(angular.isArray(tasks) ? tasks : []); }; - const loadTasks = (application) => { - return TaskReader.getTasks(application.name); + const loadPaginatedTasks = async (application, page = 1) => { + let limitPerPage = SETTINGS.tasksViewLimitPerPage; + const tasks = await TaskReader.getTasks(application.name, [], limitPerPage, page); + if (tasks.length === limitPerPage) { + return tasks.concat(await loadPaginatedTasks(application, page + 1)); + } else { + return tasks; + } + }; + + const loadTasks = (application, page = 1) => { + let limitPerPage = SETTINGS.tasksViewLimitPerPage; + if (limitPerPage === undefined) { + return TaskReader.getTasks(application.name); + } else { + return loadPaginatedTasks(application, page); + } }; const loadRunningTasks = (application) => { diff --git a/packages/core/src/task/task.read.service.ts b/packages/core/src/task/task.read.service.ts index efb273b3edc..14662fc5ac6 100644 --- a/packages/core/src/task/task.read.service.ts +++ b/packages/core/src/task/task.read.service.ts @@ -8,10 +8,19 @@ import { OrchestratedItemTransformer } from '../orchestratedItem/orchestratedIte export class TaskReader { private static activeStatuses: string[] = ['RUNNING', 'SUSPENDED', 'NOT_STARTED']; - public static getTasks(applicationName: string, statuses: string[] = []): PromiseLike { + public static getTasks( + applicationName: string, + statuses: string[] = [], + limitPerPage: number = null, + page: number = null, + ): PromiseLike { return REST('/applications') .path(applicationName, 'tasks') - .query({ statuses: statuses.join(',') }) + .query({ + statuses: statuses.join(','), + limit: limitPerPage, + page: page, + }) .get() .then((tasks: ITask[]) => { tasks.forEach((task) => this.setTaskProperties(task)); diff --git a/yarn.lock b/yarn.lock index 3d40c2754ed..781fcda7b3b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18292,10 +18292,10 @@ vite-plugin-svgr@^0.3.0: dependencies: "@svgr/core" "^5.5.0" -vite@2.9.16: - version "2.9.16" - resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.16.tgz#daf7ba50f5cc37a7bf51b118ba06bc36e97898e9" - integrity sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA== +vite@2.9.18: + version "2.9.18" + resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.18.tgz#74e2a83b29da81e602dac4c293312cc575f091c7" + integrity sha512-sAOqI5wNM9QvSEE70W3UGMdT8cyEn0+PmJMTFvTB8wB0YbYUWw3gUbY62AOyrXosGieF2htmeLATvNxpv/zNyQ== dependencies: esbuild "^0.14.27" postcss "^8.4.13"