From e83ae75a560d286a282322b457ef2113dd053672 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Thu, 5 Jun 2025 17:24:07 +0530 Subject: [PATCH 01/20] feat(Icon): add speedometer icon and update icon map feat(types): add ResourceRecommender to Nodes enum --- src/Assets/IconV2/ic-speedometer.svg | 3 +++ src/Shared/Components/Icon/Icon.tsx | 2 ++ src/Shared/types.ts | 1 + 3 files changed, 6 insertions(+) create mode 100644 src/Assets/IconV2/ic-speedometer.svg diff --git a/src/Assets/IconV2/ic-speedometer.svg b/src/Assets/IconV2/ic-speedometer.svg new file mode 100644 index 000000000..b93c8c1f5 --- /dev/null +++ b/src/Assets/IconV2/ic-speedometer.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Shared/Components/Icon/Icon.tsx b/src/Shared/Components/Icon/Icon.tsx index 302c24049..ce35e059a 100644 --- a/src/Shared/Components/Icon/Icon.tsx +++ b/src/Shared/Components/Icon/Icon.tsx @@ -148,6 +148,7 @@ import { ReactComponent as ICSortAscending } from '@IconsV2/ic-sort-ascending.sv import { ReactComponent as ICSortDescending } from '@IconsV2/ic-sort-descending.svg' import { ReactComponent as ICSortable } from '@IconsV2/ic-sortable.svg' import { ReactComponent as ICSparkleColor } from '@IconsV2/ic-sparkle-color.svg' +import { ReactComponent as ICSpeedometer } from '@IconsV2/ic-speedometer.svg' import { ReactComponent as ICSpinny } from '@IconsV2/ic-spinny.svg' import { ReactComponent as ICSprayCan } from '@IconsV2/ic-spray-can.svg' import { ReactComponent as ICStack } from '@IconsV2/ic-stack.svg' @@ -334,6 +335,7 @@ export const iconMap = { 'ic-sort-descending': ICSortDescending, 'ic-sortable': ICSortable, 'ic-sparkle-color': ICSparkleColor, + 'ic-speedometer': ICSpeedometer, 'ic-spinny': ICSpinny, 'ic-spray-can': ICSprayCan, 'ic-stack': ICStack, diff --git a/src/Shared/types.ts b/src/Shared/types.ts index bd265c365..4d681f611 100644 --- a/src/Shared/types.ts +++ b/src/Shared/types.ts @@ -138,6 +138,7 @@ export enum Nodes { Overview = 'Overview', MonitoringDashboard = 'MonitoringDashboard', UpgradeCluster = 'UpgradeCluster', + ResourceRecommender = 'ResourceRecommender', } // FIXME: This should be `typeof Nodes[keyof typeof Nodes]` instead since the key and values are not the same. Same to be removed from duplications in dashboard From 5d3455898ac2203e63649999a099b6933d542c40 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Fri, 6 Jun 2025 12:14:48 +0530 Subject: [PATCH 02/20] feat(ResourceBrowser): add ResourceRecommenderHeaderType and related types for resource recommendations --- .../ResourceBrowser/ResourceBrowser.Types.ts | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts index 237bb62a8..4bdadcd08 100644 --- a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts +++ b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts @@ -59,8 +59,50 @@ export interface K8sResourceListPayloadType { k8sRequest: ResourceListPayloadK8sRequestType } +export enum ResourceRecommenderHeaderType { + NAME = 'name', + NAMESPACE = 'namespace', + KIND = 'kind', + API_VERSION = 'apiVersion', + CONTAINER_NAME = 'containerName', + CPU_REQUEST = 'cpuRequest', + CPU_LIMIT = 'cpuLimit', + MEMORY_REQUEST = 'memoryRequest', + MEMORY_LIMIT = 'memoryLimit', +} + +export type ResourceRecommenderHeaderWithStringValue = Extract< + ResourceRecommenderHeaderType, + | ResourceRecommenderHeaderType.NAME + | ResourceRecommenderHeaderType.NAMESPACE + | ResourceRecommenderHeaderType.KIND + | ResourceRecommenderHeaderType.API_VERSION + | ResourceRecommenderHeaderType.CONTAINER_NAME +> + +export type ResourceRecommenderHeaderWithRecommendation = Extract< + ResourceRecommenderHeaderType, + | ResourceRecommenderHeaderType.CPU_REQUEST + | ResourceRecommenderHeaderType.CPU_LIMIT + | ResourceRecommenderHeaderType.MEMORY_REQUEST + | ResourceRecommenderHeaderType.MEMORY_LIMIT +> + export type K8sResourceDetailDataType = { [key: string]: string | number | object | boolean + additionalMetadata?: { + [key in ResourceRecommenderHeaderWithRecommendation]?: { + current: { + value: string + unit: string + } + recommended: { + value: string + unit: string + } + delta: number + } + } } export interface K8sResourceDetailType { From a2cbb095a03798c34ff59b855c97af85c48f626a Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Fri, 6 Jun 2025 13:31:17 +0530 Subject: [PATCH 03/20] fix(ResourceBrowser.Types): update K8sResourceDetailDataType to handle null values for current, recommended, and delta --- src/Pages/ResourceBrowser/ResourceBrowser.Types.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts index 4bdadcd08..83197f20d 100644 --- a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts +++ b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts @@ -92,15 +92,18 @@ export type K8sResourceDetailDataType = { [key: string]: string | number | object | boolean additionalMetadata?: { [key in ResourceRecommenderHeaderWithRecommendation]?: { + // In case there is not limit or request set, it will be null current: { value: string unit: string - } + } | null + // In case cron is yet to run recommended: { value: string unit: string - } - delta: number + } | null + // In case any of current or recommended is null, delta will be null + delta: number | null } } } From 17a32de7fd21ba4f908e855e63b25a38bea285a7 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Fri, 6 Jun 2025 14:34:10 +0530 Subject: [PATCH 04/20] feat(Helpers): add getGroupVersionFromApiVersion function to parse API version strings --- src/Shared/Helpers.tsx | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/Shared/Helpers.tsx b/src/Shared/Helpers.tsx index b11bccb57..bd157d487 100644 --- a/src/Shared/Helpers.tsx +++ b/src/Shared/Helpers.tsx @@ -61,6 +61,7 @@ import { GitTriggers, IntersectionChangeHandler, IntersectionOptions, + Node, Nodes, PreventOutsideFocusProps, TargetPlatformItemDTO, @@ -714,3 +715,22 @@ export const smoothScrollToTop = (scrollContainer: HTMLElement, targetPosition: return controls } + +export const getGroupVersionFromApiVersion = (apiVersion: string): Pick => { + if (!apiVersion || apiVersion === '/') { + return { group: '', version: '' } + } + + const parts = apiVersion.split('/') + + if (parts.length === 1) { + return { group: '', version: parts[0] } + } + + if (parts.length === 2) { + return { group: parts[0], version: parts[1] } + } + + // If the apiVersion has more than two parts, we consider the first part as group and the rest as version + return { group: parts[0], version: parts.slice(1).join('/') } +} From 2f10c26ec5e5321e75850effd880eaa5abfac3f9 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Fri, 6 Jun 2025 16:56:32 +0530 Subject: [PATCH 05/20] feat(Icon): add ic-minus icon and update icon map feat(ResourceBrowser): enhance K8sResourceDetailDataType and add RESOURCE_RECOMMENDER_HEADER_TO_TITLE_MAP --- src/Assets/IconV2/ic-minus.svg | 3 ++ .../ResourceBrowser/ResourceBrowser.Types.ts | 35 ++++++++++--------- src/Pages/ResourceBrowser/constants.tsx | 13 +++++++ src/Shared/Components/Icon/Icon.tsx | 2 ++ 4 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 src/Assets/IconV2/ic-minus.svg diff --git a/src/Assets/IconV2/ic-minus.svg b/src/Assets/IconV2/ic-minus.svg new file mode 100644 index 000000000..3f0a5f895 --- /dev/null +++ b/src/Assets/IconV2/ic-minus.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts index 83197f20d..3714bd557 100644 --- a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts +++ b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts @@ -90,22 +90,25 @@ export type ResourceRecommenderHeaderWithRecommendation = Extract< export type K8sResourceDetailDataType = { [key: string]: string | number | object | boolean - additionalMetadata?: { - [key in ResourceRecommenderHeaderWithRecommendation]?: { - // In case there is not limit or request set, it will be null - current: { - value: string - unit: string - } | null - // In case cron is yet to run - recommended: { - value: string - unit: string - } | null - // In case any of current or recommended is null, delta will be null - delta: number | null - } - } + additionalMetadata?: Partial< + Record< + ResourceRecommenderHeaderWithRecommendation, + { + // In case there is not limit or request set, it will be null + current: { + value: number + unit: string + } | null + // In case cron is yet to run + recommended: { + value: number + unit: string + } | null + // In case any of current or recommended is null, delta will be null + delta: number | null + } + > + > } export interface K8sResourceDetailType { diff --git a/src/Pages/ResourceBrowser/constants.tsx b/src/Pages/ResourceBrowser/constants.tsx index 263605a5d..b1e547020 100644 --- a/src/Pages/ResourceBrowser/constants.tsx +++ b/src/Pages/ResourceBrowser/constants.tsx @@ -19,6 +19,7 @@ import { ReactComponent as ICMediumPause } from '@Icons/ic-medium-pause.svg' import { ReactComponent as ICMediumPlay } from '@Icons/ic-medium-play.svg' import { SelectPickerOptionType } from '@Shared/Components' +import { ResourceRecommenderHeaderType } from './ResourceBrowser.Types' import { NodeDrainRequest } from './types' export const ALL_NAMESPACE_OPTION: Readonly, 'value' | 'label'>> = { @@ -111,3 +112,15 @@ export const NODE_DRAIN_OPTIONS_CHECKBOX_CONFIG: { label: DRAIN_NODE_MODAL_MESSAGING.IgnoreDaemonSets.heading, }, ] as const + +export const RESOURCE_RECOMMENDER_HEADER_TO_TITLE_MAP: Record = { + [ResourceRecommenderHeaderType.API_VERSION]: 'API Version', + [ResourceRecommenderHeaderType.CONTAINER_NAME]: 'Container Name', + [ResourceRecommenderHeaderType.CPU_LIMIT]: 'CPU Limits', + [ResourceRecommenderHeaderType.CPU_REQUEST]: 'CPU Requests', + [ResourceRecommenderHeaderType.KIND]: 'Kind', + [ResourceRecommenderHeaderType.MEMORY_LIMIT]: 'Mem Limits', + [ResourceRecommenderHeaderType.MEMORY_REQUEST]: 'Mem Requests', + [ResourceRecommenderHeaderType.NAME]: 'Workload', + [ResourceRecommenderHeaderType.NAMESPACE]: 'Namespace', +} diff --git a/src/Shared/Components/Icon/Icon.tsx b/src/Shared/Components/Icon/Icon.tsx index ce35e059a..6174f13ce 100644 --- a/src/Shared/Components/Icon/Icon.tsx +++ b/src/Shared/Components/Icon/Icon.tsx @@ -122,6 +122,7 @@ import { ReactComponent as ICMegaphoneRight } from '@IconsV2/ic-megaphone-right. import { ReactComponent as ICMemory } from '@IconsV2/ic-memory.svg' import { ReactComponent as ICMicrosoft } from '@IconsV2/ic-microsoft.svg' import { ReactComponent as ICMinikube } from '@IconsV2/ic-minikube.svg' +import { ReactComponent as ICMinus } from '@IconsV2/ic-minus.svg' import { ReactComponent as ICMissing } from '@IconsV2/ic-missing.svg' import { ReactComponent as ICMobile } from '@IconsV2/ic-mobile.svg' import { ReactComponent as ICMonitoring } from '@IconsV2/ic-monitoring.svg' @@ -309,6 +310,7 @@ export const iconMap = { 'ic-memory': ICMemory, 'ic-microsoft': ICMicrosoft, 'ic-minikube': ICMinikube, + 'ic-minus': ICMinus, 'ic-missing': ICMissing, 'ic-mobile': ICMobile, 'ic-monitoring': ICMonitoring, From fb1d4a2e7ee8d3371e31e6849706c0a063a064db Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Sat, 7 Jun 2025 16:59:53 +0530 Subject: [PATCH 06/20] feat: add GVKOptionValueType --- src/Pages/ResourceBrowser/ResourceBrowser.Types.ts | 5 +++++ src/Pages/ResourceBrowser/constants.tsx | 3 +++ 2 files changed, 8 insertions(+) diff --git a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts index 3714bd557..dcbcd12d9 100644 --- a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts +++ b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts @@ -194,3 +194,8 @@ export interface NodeActionRequest { version: string kind: string } + +export interface GVKOptionValueType { + kind: string + apiVersion: string +} diff --git a/src/Pages/ResourceBrowser/constants.tsx b/src/Pages/ResourceBrowser/constants.tsx index b1e547020..1e719f38c 100644 --- a/src/Pages/ResourceBrowser/constants.tsx +++ b/src/Pages/ResourceBrowser/constants.tsx @@ -124,3 +124,6 @@ export const RESOURCE_RECOMMENDER_HEADER_TO_TITLE_MAP: Record Date: Sat, 7 Jun 2025 17:20:16 +0530 Subject: [PATCH 07/20] feat: add GetResourceRecommenderResourceListPropsType --- .../ResourceBrowser/ResourceBrowser.Types.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts index dcbcd12d9..0d8977211 100644 --- a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts +++ b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts @@ -14,8 +14,11 @@ * limitations under the License. */ -import { RefObject } from 'react' +import { Dispatch, RefObject, SetStateAction } from 'react' +import { GroupBase } from 'react-select' +import { ServerErrors } from '@Common/ServerError' +import { SelectPickerOptionType } from '@Shared/Components' import { Nodes, NodeType } from '@Shared/types' export interface GVKType { @@ -199,3 +202,13 @@ export interface GVKOptionValueType { kind: string apiVersion: string } + +export interface GetResourceRecommenderResourceListPropsType { + resourceList: K8sResourceDetailType + reloadResourceListData: () => void + setShowAbsoluteValuesInResourceRecommender: Dispatch> + showAbsoluteValuesInResourceRecommender: boolean + gvkOptions: GroupBase>[] + isLoading: boolean + resourceListError: ServerErrors +} From 8a75222debfcf37bd53f975e61774618c221ed26 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Sat, 7 Jun 2025 20:52:11 +0530 Subject: [PATCH 08/20] feat(BulkSelectionActionWidget): add resource recommendation view and apply resource recommendation modal --- src/Pages/ResourceBrowser/ResourceBrowser.Types.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts index 0d8977211..522939b95 100644 --- a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts +++ b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts @@ -120,6 +120,7 @@ export interface K8sResourceDetailType { } export interface BulkSelectionActionWidgetProps { + isResourceRecommendationView: boolean count: number handleOpenBulkDeleteModal: () => void handleClearBulkSelection: () => void @@ -127,12 +128,13 @@ export interface BulkSelectionActionWidgetProps { handleOpenUncordonNodeModal: () => void handleOpenDrainNodeModal: () => void handleOpenRestartWorkloadModal: () => void + handleOpenApplyResourceRecommendationModal: () => void parentRef: RefObject showBulkRestartOption: boolean showNodeListingOptions: boolean } -export type RBBulkOperationType = 'restart' | 'delete' | 'cordon' | 'uncordon' | 'drain' +export type RBBulkOperationType = 'restart' | 'delete' | 'cordon' | 'uncordon' | 'drain' | 'applyResourceRecommendation' export interface CreateResourceRequestBodyType { appId: string From 2f995110a40fb4ad7a9cefc9721654f37bb8ca23 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Sun, 8 Jun 2025 14:17:14 +0530 Subject: [PATCH 09/20] feat: add container registry icon and update related components --- src/Assets/IconV2/ic-container-registry.svg | 19 ++++++++++++++++++ src/Assets/IconV2/ic-container.svg | 20 ++----------------- .../ResourceBrowser/ResourceBrowser.Types.ts | 1 + src/Shared/Components/Icon/Icon.tsx | 2 ++ .../Components/RegistryIcon/RegistryIcon.tsx | 4 ++-- 5 files changed, 26 insertions(+), 20 deletions(-) create mode 100644 src/Assets/IconV2/ic-container-registry.svg diff --git a/src/Assets/IconV2/ic-container-registry.svg b/src/Assets/IconV2/ic-container-registry.svg new file mode 100644 index 000000000..95c9543a8 --- /dev/null +++ b/src/Assets/IconV2/ic-container-registry.svg @@ -0,0 +1,19 @@ + + + + + diff --git a/src/Assets/IconV2/ic-container.svg b/src/Assets/IconV2/ic-container.svg index 95c9543a8..1dc10d7df 100644 --- a/src/Assets/IconV2/ic-container.svg +++ b/src/Assets/IconV2/ic-container.svg @@ -1,19 +1,3 @@ - - - - + + diff --git a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts index 522939b95..0f5d678ef 100644 --- a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts +++ b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts @@ -148,6 +148,7 @@ export interface CreateResourceRequestBodyType { export interface ResourceManifestDTO { manifestResponse: { manifest: Record + recommendedManifest?: Record } secretViewAccess: boolean } diff --git a/src/Shared/Components/Icon/Icon.tsx b/src/Shared/Components/Icon/Icon.tsx index 6174f13ce..e13bc3760 100644 --- a/src/Shared/Components/Icon/Icon.tsx +++ b/src/Shared/Components/Icon/Icon.tsx @@ -42,6 +42,7 @@ import { ReactComponent as ICCloudVms } from '@IconsV2/ic-cloud-vms.svg' import { ReactComponent as ICCluster } from '@IconsV2/ic-cluster.svg' import { ReactComponent as ICCode } from '@IconsV2/ic-code.svg' import { ReactComponent as ICContainer } from '@IconsV2/ic-container.svg' +import { ReactComponent as ICContainerRegistry } from '@IconsV2/ic-container-registry.svg' import { ReactComponent as ICCookr } from '@IconsV2/ic-cookr.svg' import { ReactComponent as ICCopy } from '@IconsV2/ic-copy.svg' import { ReactComponent as ICCpu } from '@IconsV2/ic-cpu.svg' @@ -229,6 +230,7 @@ export const iconMap = { 'ic-cloud-vms': ICCloudVms, 'ic-cluster': ICCluster, 'ic-code': ICCode, + 'ic-container-registry': ICContainerRegistry, 'ic-container': ICContainer, 'ic-cookr': ICCookr, 'ic-copy': ICCopy, diff --git a/src/Shared/Components/RegistryIcon/RegistryIcon.tsx b/src/Shared/Components/RegistryIcon/RegistryIcon.tsx index bbc97b195..215ee1e79 100644 --- a/src/Shared/Components/RegistryIcon/RegistryIcon.tsx +++ b/src/Shared/Components/RegistryIcon/RegistryIcon.tsx @@ -31,9 +31,9 @@ const registryIconMap: Record = { [RegistryType.ECR]: 'ic-ecr', [RegistryType.ARTIFACT_REGISTRY]: 'ic-google-artifact-registry', [RegistryType.GCR]: 'ic-google-container-registry', - [RegistryType.OTHER]: 'ic-container', + [RegistryType.OTHER]: 'ic-container-registry', } export const RegistryIcon = ({ registryType, size = 20 }: RegistryIconProps) => ( - + ) From 425615b507ce8059a0ed16d9eb47af051399eaf5 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Sun, 8 Jun 2025 23:31:33 +0530 Subject: [PATCH 10/20] fix: update K8sResourceDetailDataType to use string for value in current and recommended fields --- src/Pages/ResourceBrowser/ResourceBrowser.Types.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts index 0f5d678ef..ce9cf1fb8 100644 --- a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts +++ b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts @@ -99,13 +99,11 @@ export type K8sResourceDetailDataType = { { // In case there is not limit or request set, it will be null current: { - value: number - unit: string + value: string } | null // In case cron is yet to run recommended: { - value: number - unit: string + value: string } | null // In case any of current or recommended is null, delta will be null delta: number | null From 4c275b9d31f5bc39ba38373e05c16d3082bb4f56 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Mon, 9 Jun 2025 11:23:13 +0530 Subject: [PATCH 11/20] feat(GetResourceRecommenderResourceListPropsType): update props to include loading states and error handling --- src/Pages/ResourceBrowser/ResourceBrowser.Types.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts index ce9cf1fb8..403ac485a 100644 --- a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts +++ b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts @@ -210,6 +210,9 @@ export interface GetResourceRecommenderResourceListPropsType { setShowAbsoluteValuesInResourceRecommender: Dispatch> showAbsoluteValuesInResourceRecommender: boolean gvkOptions: GroupBase>[] - isLoading: boolean + areGVKOptionsLoading: boolean + reloadGVKOptions: () => void + gvkOptionsError: ServerErrors + isResourceListLoading: boolean resourceListError: ServerErrors } From 7fcfd77b27118075e41c73ca57e8b736e44b0c70 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Mon, 9 Jun 2025 12:00:32 +0530 Subject: [PATCH 12/20] feat: add width mapping for resource recommender headers --- src/Pages/ResourceBrowser/constants.tsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Pages/ResourceBrowser/constants.tsx b/src/Pages/ResourceBrowser/constants.tsx index 1e719f38c..025e08b92 100644 --- a/src/Pages/ResourceBrowser/constants.tsx +++ b/src/Pages/ResourceBrowser/constants.tsx @@ -125,5 +125,17 @@ export const RESOURCE_RECOMMENDER_HEADER_TO_TITLE_MAP: Record = { + [ResourceRecommenderHeaderType.API_VERSION]: 180, + [ResourceRecommenderHeaderType.CONTAINER_NAME]: 150, + [ResourceRecommenderHeaderType.CPU_LIMIT]: 150, + [ResourceRecommenderHeaderType.CPU_REQUEST]: 150, + [ResourceRecommenderHeaderType.KIND]: 150, + [ResourceRecommenderHeaderType.MEMORY_LIMIT]: 150, + [ResourceRecommenderHeaderType.MEMORY_REQUEST]: 150, + [ResourceRecommenderHeaderType.NAME]: 350, + [ResourceRecommenderHeaderType.NAMESPACE]: 150, +} + export const GVK_FILTER_KIND_QUERY_PARAM_KEY = 'gvkFilterKind' export const GVK_FILTER_API_VERSION_QUERY_PARAM_KEY = 'gvkFilterApiVersion' From b817cf1fd3a16d42e7bb5741cb7d1af19bef890c Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Tue, 10 Jun 2025 12:31:09 +0530 Subject: [PATCH 13/20] fix: update K8sResourceDetailDataType to allow 'none' as a valid value for current and recommended fields --- src/Pages/ResourceBrowser/ResourceBrowser.Types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts index 403ac485a..baad07dc7 100644 --- a/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts +++ b/src/Pages/ResourceBrowser/ResourceBrowser.Types.ts @@ -99,11 +99,11 @@ export type K8sResourceDetailDataType = { { // In case there is not limit or request set, it will be null current: { - value: string + value: string | 'none' } | null // In case cron is yet to run recommended: { - value: string + value: string | 'none' } | null // In case any of current or recommended is null, delta will be null delta: number | null From 206f0f39351f78bd157257e43b4a203951df44c1 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Tue, 10 Jun 2025 16:27:24 +0530 Subject: [PATCH 14/20] feat: add gavel icon and update icon map --- src/Assets/IconV2/ic-gavel.svg | 3 +++ src/Shared/Components/Icon/Icon.tsx | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 src/Assets/IconV2/ic-gavel.svg diff --git a/src/Assets/IconV2/ic-gavel.svg b/src/Assets/IconV2/ic-gavel.svg new file mode 100644 index 000000000..e2f32f692 --- /dev/null +++ b/src/Assets/IconV2/ic-gavel.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Shared/Components/Icon/Icon.tsx b/src/Shared/Components/Icon/Icon.tsx index e13bc3760..2fcc9e526 100644 --- a/src/Shared/Components/Icon/Icon.tsx +++ b/src/Shared/Components/Icon/Icon.tsx @@ -78,6 +78,7 @@ import { ReactComponent as ICFilter } from '@IconsV2/ic-filter.svg' import { ReactComponent as ICFilterApplied } from '@IconsV2/ic-filter-applied.svg' import { ReactComponent as ICFlask } from '@IconsV2/ic-flask.svg' import { ReactComponent as ICFolderUser } from '@IconsV2/ic-folder-user.svg' +import { ReactComponent as ICGavel } from '@IconsV2/ic-gavel.svg' import { ReactComponent as ICGear } from '@IconsV2/ic-gear.svg' import { ReactComponent as ICGift } from '@IconsV2/ic-gift.svg' import { ReactComponent as ICGiftGradient } from '@IconsV2/ic-gift-gradient.svg' @@ -267,6 +268,7 @@ export const iconMap = { 'ic-filter': ICFilter, 'ic-flask': ICFlask, 'ic-folder-user': ICFolderUser, + 'ic-gavel': ICGavel, 'ic-gear': ICGear, 'ic-gift-gradient': ICGiftGradient, 'ic-gift': ICGift, From 42a544190632aa34f4d8df24a38dcf2c6c1f9b23 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Tue, 10 Jun 2025 17:16:20 +0530 Subject: [PATCH 15/20] chore: update version to 1.15.1-beta-1 in package.json and package-lock.json --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e70a93913..36d6b4f58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.15.1", + "version": "1.15.1-beta-1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.15.1", + "version": "1.15.1-beta-1", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index a580e75b3..25ed1c82e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.15.1", + "version": "1.15.1-beta-1", "description": "Supporting common component library", "type": "module", "main": "dist/index.js", From 509f9b37c0efddb91869ec9c13e7b64537830dec Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Thu, 12 Jun 2025 16:55:23 +0530 Subject: [PATCH 16/20] feat: add ic-two-cubes icon and update icon map --- src/Assets/IconV2/ic-two-cubes.svg | 3 +++ src/Shared/Components/Icon/Icon.tsx | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 src/Assets/IconV2/ic-two-cubes.svg diff --git a/src/Assets/IconV2/ic-two-cubes.svg b/src/Assets/IconV2/ic-two-cubes.svg new file mode 100644 index 000000000..15ca41392 --- /dev/null +++ b/src/Assets/IconV2/ic-two-cubes.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Shared/Components/Icon/Icon.tsx b/src/Shared/Components/Icon/Icon.tsx index 2fcc9e526..48d2bc0b8 100644 --- a/src/Shared/Components/Icon/Icon.tsx +++ b/src/Shared/Components/Icon/Icon.tsx @@ -177,6 +177,7 @@ import { ReactComponent as ICTimeoutDash } from '@IconsV2/ic-timeout-dash.svg' import { ReactComponent as ICTimer } from '@IconsV2/ic-timer.svg' import { ReactComponent as ICTrafficSignal } from '@IconsV2/ic-traffic-signal.svg' import { ReactComponent as ICTravclan } from '@IconsV2/ic-travclan.svg' +import { ReactComponent as ICTwoCubes } from '@IconsV2/ic-two-cubes.svg' import { ReactComponent as ICUbuntu } from '@IconsV2/ic-ubuntu.svg' import { ReactComponent as ICUnknown } from '@IconsV2/ic-unknown.svg' import { ReactComponent as ICUserCircle } from '@IconsV2/ic-user-circle.svg' @@ -367,6 +368,7 @@ export const iconMap = { 'ic-timer': ICTimer, 'ic-traffic-signal': ICTrafficSignal, 'ic-travclan': ICTravclan, + 'ic-two-cubes': ICTwoCubes, 'ic-ubuntu': ICUbuntu, 'ic-unknown': ICUnknown, 'ic-user-circle': ICUserCircle, From 1e4ef0e3a338f1d41c344e6542cd67647515c4b8 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Thu, 12 Jun 2025 18:25:47 +0530 Subject: [PATCH 17/20] fix: adjust opacity for readonly input fields in rjsfForm.scss --- src/Common/RJSF/rjsfForm.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Common/RJSF/rjsfForm.scss b/src/Common/RJSF/rjsfForm.scss index 2ada15fe7..3a158ed33 100644 --- a/src/Common/RJSF/rjsfForm.scss +++ b/src/Common/RJSF/rjsfForm.scss @@ -26,6 +26,10 @@ input.form__input { padding: 6px 8px; + + &[readonly] { + opacity: 0.5; + } } } From d433cefed6da64fb3bbd1ae2bb1616e51cf15fad Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Fri, 13 Jun 2025 10:55:29 +0530 Subject: [PATCH 18/20] refactor: remove unused resource recommender header mappings from constants.tsx --- src/Pages/ResourceBrowser/constants.tsx | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/src/Pages/ResourceBrowser/constants.tsx b/src/Pages/ResourceBrowser/constants.tsx index 025e08b92..598939977 100644 --- a/src/Pages/ResourceBrowser/constants.tsx +++ b/src/Pages/ResourceBrowser/constants.tsx @@ -19,7 +19,6 @@ import { ReactComponent as ICMediumPause } from '@Icons/ic-medium-pause.svg' import { ReactComponent as ICMediumPlay } from '@Icons/ic-medium-play.svg' import { SelectPickerOptionType } from '@Shared/Components' -import { ResourceRecommenderHeaderType } from './ResourceBrowser.Types' import { NodeDrainRequest } from './types' export const ALL_NAMESPACE_OPTION: Readonly, 'value' | 'label'>> = { @@ -113,29 +112,5 @@ export const NODE_DRAIN_OPTIONS_CHECKBOX_CONFIG: { }, ] as const -export const RESOURCE_RECOMMENDER_HEADER_TO_TITLE_MAP: Record = { - [ResourceRecommenderHeaderType.API_VERSION]: 'API Version', - [ResourceRecommenderHeaderType.CONTAINER_NAME]: 'Container Name', - [ResourceRecommenderHeaderType.CPU_LIMIT]: 'CPU Limits', - [ResourceRecommenderHeaderType.CPU_REQUEST]: 'CPU Requests', - [ResourceRecommenderHeaderType.KIND]: 'Kind', - [ResourceRecommenderHeaderType.MEMORY_LIMIT]: 'Mem Limits', - [ResourceRecommenderHeaderType.MEMORY_REQUEST]: 'Mem Requests', - [ResourceRecommenderHeaderType.NAME]: 'Workload', - [ResourceRecommenderHeaderType.NAMESPACE]: 'Namespace', -} - -export const RESOURCE_RECOMMENDER_HEADER_TO_WIDTH_MAP: Record = { - [ResourceRecommenderHeaderType.API_VERSION]: 180, - [ResourceRecommenderHeaderType.CONTAINER_NAME]: 150, - [ResourceRecommenderHeaderType.CPU_LIMIT]: 150, - [ResourceRecommenderHeaderType.CPU_REQUEST]: 150, - [ResourceRecommenderHeaderType.KIND]: 150, - [ResourceRecommenderHeaderType.MEMORY_LIMIT]: 150, - [ResourceRecommenderHeaderType.MEMORY_REQUEST]: 150, - [ResourceRecommenderHeaderType.NAME]: 350, - [ResourceRecommenderHeaderType.NAMESPACE]: 150, -} - export const GVK_FILTER_KIND_QUERY_PARAM_KEY = 'gvkFilterKind' export const GVK_FILTER_API_VERSION_QUERY_PARAM_KEY = 'gvkFilterApiVersion' From 9ff305b5f17a73bd8d97712a2cb52d7d619450ed Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Fri, 13 Jun 2025 15:07:20 +0530 Subject: [PATCH 19/20] fix: add abort controller reference to createNewResource function --- src/Pages/ResourceBrowser/service.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Pages/ResourceBrowser/service.ts b/src/Pages/ResourceBrowser/service.ts index 9c2318238..588f5d8a7 100644 --- a/src/Pages/ResourceBrowser/service.ts +++ b/src/Pages/ResourceBrowser/service.ts @@ -39,7 +39,9 @@ export const getK8sResourceList = ( export const createNewResource = ( resourceListPayload: CreateResourcePayload, -): Promise> => post(ROUTES.K8S_RESOURCE_CREATE, resourceListPayload) + abortControllerRef?: APIOptions['abortControllerRef'], +): Promise> => + post(ROUTES.K8S_RESOURCE_CREATE, resourceListPayload, { abortControllerRef }) export const deleteResource = ( resourceListPayload: ResourceListPayloadType, From a20748fd89586d0bac00967eff0d437aae2b234e Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Mon, 16 Jun 2025 13:16:50 +0530 Subject: [PATCH 20/20] chore: update version to 1.15.1-beta-5 in package.json and package-lock.json --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 36d6b4f58..a17850285 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.15.1-beta-1", + "version": "1.15.1-beta-5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.15.1-beta-1", + "version": "1.15.1-beta-5", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 25ed1c82e..a0ddbd81d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.15.1-beta-1", + "version": "1.15.1-beta-5", "description": "Supporting common component library", "type": "module", "main": "dist/index.js",