Repository: kubevirt-ui/kubevirt-plugin
Pull request #2532: Rename interfacesTypes and interfaceLabels
Author: login: pcbailey
Labels: name: lgtm
description: Passed code review, ready for merge
name: approved
description: This issue is something we want to fix
Created: 2025-03-24T15:49:08Z | Merged: 2025-04-08T20:42:57Z

## 📝 Description

Simple refactor PR to rename two variables that touch multiple files.



Diff:
diff --git a/src/utils/components/NetworkInterfaceModal/NetworkInterfaceModal.tsx b/src/utils/components/NetworkInterfaceModal/NetworkInterfaceModal.tsx
index 4db645ccab..2ecd215707 100644
--- a/src/utils/components/NetworkInterfaceModal/NetworkInterfaceModal.tsx
+++ b/src/utils/components/NetworkInterfaceModal/NetworkInterfaceModal.tsx
@@ -8,7 +8,7 @@ import { NetworkInterfaceState } from '@kubevirt-utils/components/NetworkInterfa
 import TabModal from '@kubevirt-utils/components/TabModal/TabModal';
 import { useKubevirtTranslation } from '@kubevirt-utils/hooks/useKubevirtTranslation';
 import {
-  interfacesTypes,
+  interfaceTypesProxy,
   NetworkPresentation,
 } from '@kubevirt-utils/resources/vm/utils/network/constants';
 import { getNetworkInterfaceType } from '@kubevirt-utils/resources/vm/utils/network/selectors';
@@ -71,7 +71,7 @@ const NetworkInterfaceModal: FC<NetworkInterfaceModalProps> = ({
   const [networkName, setNetworkName] = useState(getNetworkName(network));
   const [networkSelectError, setNetworkSelectError] = useState<boolean>(false);
   const [interfaceType, setInterfaceType] = useState(
-    interfacesTypes[getNetworkInterfaceType(iface)],
+    interfaceTypesProxy[getNetworkInterfaceType(iface)],
   );
   const [interfaceMACAddress, setInterfaceMACAddress] = useState(iface?.macAddress);
   const [macError, setMacError] = useState<boolean>(false);
@@ -81,7 +81,7 @@ const NetworkInterfaceModal: FC<NetworkInterfaceModalProps> = ({
   const [isExpanded, setIsExpanded] = useState(false);
 
   useEffect(() => {
-    if (interfaceType === interfacesTypes.sriov) setInterfaceLinkState(undefined);
+    if (interfaceType === interfaceTypesProxy.sriov) setInterfaceLinkState(undefined);
   }, [interfaceType]);
 
   const isValid = nicName && networkName && !networkSelectError && !macError;
@@ -109,7 +109,7 @@ const NetworkInterfaceModal: FC<NetworkInterfaceModalProps> = ({
   ]);
 
   const isHotPlugNIC =
-    interfaceType === interfacesTypes.bridge || interfaceType === interfacesTypes.sriov;
+    interfaceType === interfaceTypesProxy.bridge || interfaceType === interfaceTypesProxy.sriov;
   const vmIsRunning = isRunning(vm);
   const showRestartHeader = !isHotPlugNIC;
   const showRestartOrMigrateHeader = vmIsRunning && isHotPlugNIC;
@@ -153,7 +153,7 @@ const NetworkInterfaceModal: FC<NetworkInterfaceModalProps> = ({
             setIsError={setMacError}
           />
           <NetworkInterfaceLinkState
-            isDisabled={interfaceType === interfacesTypes.sriov}
+            isDisabled={interfaceType === interfaceTypesProxy.sriov}
             linkState={interfaceLinkState}
             setLinkState={setInterfaceLinkState}
           />
diff --git a/src/utils/components/NetworkInterfaceModal/components/NetworkInterfaceNetworkSelect/NetworkInterfaceNetworkSelect.tsx b/src/utils/components/NetworkInterfaceModal/components/NetworkInterfaceNetworkSelect/NetworkInterfaceNetworkSelect.tsx
index 1af62638e4..65d2a46545 100644
--- a/src/utils/components/NetworkInterfaceModal/components/NetworkInterfaceNetworkSelect/NetworkInterfaceNetworkSelect.tsx
+++ b/src/utils/components/NetworkInterfaceModal/components/NetworkInterfaceNetworkSelect/NetworkInterfaceNetworkSelect.tsx
@@ -7,7 +7,7 @@ import SelectTypeahead from '@kubevirt-utils/components/SelectTypeahead/SelectTy
 import { useKubevirtTranslation } from '@kubevirt-utils/hooks/useKubevirtTranslation';
 import { getName, getNamespace } from '@kubevirt-utils/resources/shared';
 import { getNetworks } from '@kubevirt-utils/resources/vm';
-import { interfacesTypes } from '@kubevirt-utils/resources/vm/utils/network/constants';
+import { interfaceTypesProxy } from '@kubevirt-utils/resources/vm/utils/network/constants';
 import { FormGroup, Label, ValidatedOptions } from '@patternfly/react-core';
 
 import { getNadType, networkNameStartWithPod, podNetworkExists } from '../../utils/helpers';
@@ -84,11 +84,11 @@ const NetworkInterfaceNetworkSelect: FC<NetworkInterfaceNetworkSelectProps> = ({
       options.unshift({
         children: (
           <>
-            {podNetworkingText} <Label isCompact>{interfacesTypes.masquerade} Binding</Label>
+            {podNetworkingText} <Label isCompact>{interfaceTypesProxy.masquerade} Binding</Label>
           </>
         ),
         key: 'pod-networking',
-        type: interfacesTypes.masquerade,
+        type: interfaceTypesProxy.masquerade,
         value: podNetworkingText,
       });
     }
@@ -102,7 +102,7 @@ const NetworkInterfaceNetworkSelect: FC<NetworkInterfaceNetworkSelectProps> = ({
     setNetworkName(value);
     setInterfaceType(
       value === podNetworkingText
-        ? interfacesTypes.masquerade
+        ? interfaceTypesProxy.masquerade
         : networkOptions.find((netOption) => value === netOption?.value)?.type,
     );
   };
@@ -153,7 +153,7 @@ const NetworkInterfaceNetworkSelect: FC<NetworkInterfaceNetworkSelectProps> = ({
             getCreateOption={(inputValue) => (
               <>
                 {t(`Use "{{inputValue}}"`, { inputValue })}{' '}
-                <Label isCompact>{interfacesTypes.bridge} Binding</Label>
+                <Label isCompact>{interfaceTypesProxy.bridge} Binding</Label>
               </>
             )}
             dataTestId="select-nad"
diff --git a/src/utils/components/NetworkInterfaceModal/components/NetworkInterfaceTypeSelect.tsx b/src/utils/components/NetworkInterfaceModal/components/NetworkInterfaceTypeSelect.tsx
index 7830cd5c3c..545fb3fea6 100644
--- a/src/utils/components/NetworkInterfaceModal/components/NetworkInterfaceTypeSelect.tsx
+++ b/src/utils/components/NetworkInterfaceModal/components/NetworkInterfaceTypeSelect.tsx
@@ -3,7 +3,7 @@ import React, { Dispatch, FC, MouseEvent, SetStateAction, useMemo } from 'react'
 import FormGroupHelperText from '@kubevirt-utils/components/FormGroupHelperText/FormGroupHelperText';
 import FormPFSelect from '@kubevirt-utils/components/FormPFSelect/FormPFSelect';
 import { useKubevirtTranslation } from '@kubevirt-utils/hooks/useKubevirtTranslation';
-import { interfacesTypes } from '@kubevirt-utils/resources/vm/utils/network/constants';
+import { interfaceTypesProxy } from '@kubevirt-utils/resources/vm/utils/network/constants';
 import { FormGroup, SelectOption } from '@patternfly/react-core';
 
 import { networkNameStartWithPod } from '../utils/helpers';
@@ -29,11 +29,11 @@ const NetworkInterfaceTypeSelect: FC<NetworkInterfaceTypeSelectProps> = ({
       // in case of NAD network, networkName should be a string - enabled if nad type is bridge or undefined or no nad
       allowOption:
         !isPodNetworkName &&
-        (interfaceType === interfacesTypes.bridge || !interfaceType || !networkName),
+        (interfaceType === interfaceTypesProxy.bridge || !interfaceType || !networkName),
       description: t(
         'The VirtualMachine will be bridged to the selected network, ideal for L2 devices',
       ),
-      id: interfacesTypes.bridge,
+      id: interfaceTypesProxy.bridge,
       name: t('Bridge'),
     },
     masquerade: {
@@ -42,18 +42,18 @@ const NetworkInterfaceTypeSelect: FC<NetworkInterfaceTypeSelectProps> = ({
       description: t(
         'Put the VirtualMachine behind a NAT Proxy for high compatibility with different network providers. The VirtualMachines IP will differ from the IP seen on the pod network',
       ),
-      id: interfacesTypes.masquerade,
+      id: interfaceTypesProxy.masquerade,
       name: t('Masquerade'),
     },
     sriov: {
       // in case of NAD network, networkName should be a string - enabled if nad type is sriov or undefined or no nad
       allowOption:
         !isPodNetworkName &&
-        (interfaceType === interfacesTypes.sriov || !interfaceType || !networkName),
+        (interfaceType === interfaceTypesProxy.sriov || !interfaceType || !networkName),
       description: t(
         'Attach a virtual function network device to the VirtualMachine for high performance',
       ),
-      id: interfacesTypes.sriov,
+      id: interfaceTypesProxy.sriov,
       name: t('SR-IOV'),
     },
   };
diff --git a/src/utils/components/NetworkInterfaceModal/utils/helpers.ts b/src/utils/components/NetworkInterfaceModal/utils/helpers.ts
index fccb50e2d8..bd5cd7dc34 100644
--- a/src/utils/components/NetworkInterfaceModal/utils/helpers.ts
+++ b/src/utils/components/NetworkInterfaceModal/utils/helpers.ts
@@ -13,8 +13,8 @@ import {
 } from '@kubevirt-utils/resources/vm';
 import { BRIDGE, UDN_BINDING_NAME } from '@kubevirt-utils/resources/vm/utils/constants';
 import {
-  interfaceLabels,
-  interfacesTypes,
+  interfaceLabelsProxy,
+  interfaceTypesProxy,
   NetworkPresentation,
 } from '@kubevirt-utils/resources/vm/utils/network/constants';
 import { isEmpty, kubevirtConsole } from '@kubevirt-utils/utils/utils';
@@ -136,10 +136,10 @@ export const createInterface = ({
   interfaceLinkState,
   interfaceMACAddress,
   interfaceModel,
-  interfaceType = interfacesTypes.bridge,
+  interfaceType = interfaceTypesProxy.bridge,
   nicName,
 }: CreateInterfaceOptions): V1Interface => {
-  const resolvedInterfaceProp = interfaceLabels[interfaceType];
+  const resolvedInterfaceProp = interfaceLabelsProxy[interfaceType];
   const validInterfaceProp: keyof V1Interface =
     resolvedInterfaceProp === UDN_BINDING_NAME ? BRIDGE : resolvedInterfaceProp;
 
@@ -157,7 +157,7 @@ export const getNadType = (nad: NetworkAttachmentDefinition): string => {
     const config = JSON.parse(nad?.spec?.config);
     //can be config.type or config.plugin first element only!
     const interfaceType = config?.type || config?.plugins?.[0]?.type;
-    return interfacesTypes?.[interfaceType];
+    return interfaceTypesProxy?.[interfaceType];
   } catch (e) {
     kubevirtConsole.log('Cannot convert NAD config: ', e);
   }
diff --git a/src/utils/resources/vm/utils/network/constants.ts b/src/utils/resources/vm/utils/network/constants.ts
index e3f96be34b..19472311ca 100644
--- a/src/utils/resources/vm/utils/network/constants.ts
+++ b/src/utils/resources/vm/utils/network/constants.ts
@@ -41,7 +41,7 @@ const labels2types: LabelMap = Object.fromEntries(
   ),
 );
 
-export const interfacesTypes = new Proxy<TypeMap>(types2labels, typeHandler);
-export const interfaceLabels = new Proxy<LabelMap>(labels2types, labelHandler);
+export const interfaceTypesProxy = new Proxy<TypeMap>(types2labels, typeHandler);
+export const interfaceLabelsProxy = new Proxy<LabelMap>(labels2types, labelHandler);
 
 export const PRIMARY_UDN_BINDING = 'primary-udn-kubevirt-binding';
diff --git a/src/utils/resources/vm/utils/network/selectors.ts b/src/utils/resources/vm/utils/network/selectors.ts
index de024020fe..3a459a6c8a 100644
--- a/src/utils/resources/vm/utils/network/selectors.ts
+++ b/src/utils/resources/vm/utils/network/selectors.ts
@@ -3,7 +3,7 @@ import { getInterfaces } from '@kubevirt-utils/resources/vm';
 
 import { NO_DATA_DASH, UDN_BINDING_NAME } from '../constants';
 
-import { interfacesTypes } from './constants';
+import { interfaceTypesProxy } from './constants';
 
 /**
  * function to get network interface type
@@ -13,7 +13,7 @@ import { interfacesTypes } from './constants';
 export const getNetworkInterfaceType = (iface: V1Interface): string => {
   if (iface?.binding?.name === UDN_BINDING_NAME) return UDN_BINDING_NAME;
 
-  const drive = Object.keys(interfacesTypes)?.find((ifaceType: string) => iface?.[ifaceType]);
+  const drive = Object.keys(interfaceTypesProxy)?.find((ifaceType: string) => iface?.[ifaceType]);
   return drive ?? NO_DATA_DASH;
 };
 
@@ -23,7 +23,7 @@ export const getNetworkInterfaceType = (iface: V1Interface): string => {
  * @returns interface type
  */
 export const getPrintableNetworkInterfaceType = (iface: V1Interface): string =>
-  interfacesTypes[getNetworkInterfaceType(iface)];
+  interfaceTypesProxy[getNetworkInterfaceType(iface)];
 
 /**
  * function to get a specific network interface by name
diff --git a/src/views/catalog/wizard/tabs/network/hooks/useNetworkRowFilters.ts b/src/views/catalog/wizard/tabs/network/hooks/useNetworkRowFilters.ts
index fffa5fc32f..d15aa0d748 100644
--- a/src/views/catalog/wizard/tabs/network/hooks/useNetworkRowFilters.ts
+++ b/src/views/catalog/wizard/tabs/network/hooks/useNetworkRowFilters.ts
@@ -1,7 +1,7 @@
 import { useMemo } from 'react';
 
 import { useKubevirtTranslation } from '@kubevirt-utils/hooks/useKubevirtTranslation';
-import { interfacesTypes } from '@kubevirt-utils/resources/vm/utils/network/constants';
+import { interfaceTypesProxy } from '@kubevirt-utils/resources/vm/utils/network/constants';
 import { getNetworkInterfaceType } from '@kubevirt-utils/resources/vm/utils/network/selectors';
 import { RowFilter } from '@openshift-console/dynamic-plugin-sdk';
 
@@ -19,9 +19,9 @@ const useNetworkRowFilters = (): RowFilter[] => {
           );
         },
         filterGroupName: t('Interface Type'),
-        items: Object.keys(interfacesTypes).map((type) => ({
+        items: Object.keys(interfaceTypesProxy).map((type) => ({
           id: type,
-          title: interfacesTypes[type],
+          title: interfaceTypesProxy[type],
         })),
         reducer: (obj) => getNetworkInterfaceType(obj?.iface),
         type: 'interface-type',
diff --git a/src/views/templates/details/tabs/network/hooks/useNetworkRowFilters.ts b/src/views/templates/details/tabs/network/hooks/useNetworkRowFilters.ts
index fffa5fc32f..d15aa0d748 100644
--- a/src/views/templates/details/tabs/network/hooks/useNetworkRowFilters.ts
+++ b/src/views/templates/details/tabs/network/hooks/useNetworkRowFilters.ts
@@ -1,7 +1,7 @@
 import { useMemo } from 'react';
 
 import { useKubevirtTranslation } from '@kubevirt-utils/hooks/useKubevirtTranslation';
-import { interfacesTypes } from '@kubevirt-utils/resources/vm/utils/network/constants';
+import { interfaceTypesProxy } from '@kubevirt-utils/resources/vm/utils/network/constants';
 import { getNetworkInterfaceType } from '@kubevirt-utils/resources/vm/utils/network/selectors';
 import { RowFilter } from '@openshift-console/dynamic-plugin-sdk';
 
@@ -19,9 +19,9 @@ const useNetworkRowFilters = (): RowFilter[] => {
           );
         },
         filterGroupName: t('Interface Type'),
-        items: Object.keys(interfacesTypes).map((type) => ({
+        items: Object.keys(interfaceTypesProxy).map((type) => ({
           id: type,
-          title: interfacesTypes[type],
+          title: interfaceTypesProxy[type],
         })),
         reducer: (obj) => getNetworkInterfaceType(obj?.iface),
         type: 'interface-type',
diff --git a/src/views/virtualmachines/details/tabs/configuration/network/hooks/useNetworkRowFilters.ts b/src/views/virtualmachines/details/tabs/configuration/network/hooks/useNetworkRowFilters.ts
index fffa5fc32f..d15aa0d748 100644
--- a/src/views/virtualmachines/details/tabs/configuration/network/hooks/useNetworkRowFilters.ts
+++ b/src/views/virtualmachines/details/tabs/configuration/network/hooks/useNetworkRowFilters.ts
@@ -1,7 +1,7 @@
 import { useMemo } from 'react';
 
 import { useKubevirtTranslation } from '@kubevirt-utils/hooks/useKubevirtTranslation';
-import { interfacesTypes } from '@kubevirt-utils/resources/vm/utils/network/constants';
+import { interfaceTypesProxy } from '@kubevirt-utils/resources/vm/utils/network/constants';
 import { getNetworkInterfaceType } from '@kubevirt-utils/resources/vm/utils/network/selectors';
 import { RowFilter } from '@openshift-console/dynamic-plugin-sdk';
 
@@ -19,9 +19,9 @@ const useNetworkRowFilters = (): RowFilter[] => {
           );
         },
         filterGroupName: t('Interface Type'),
-        items: Object.keys(interfacesTypes).map((type) => ({
+        items: Object.keys(interfaceTypesProxy).map((type) => ({
           id: type,
-          title: interfacesTypes[type],
+          title: interfaceTypesProxy[type],
         })),
         reducer: (obj) => getNetworkInterfaceType(obj?.iface),
         type: 'interface-type',
diff --git a/src/views/virtualmachines/details/tabs/configuration/network/utils/utils.ts b/src/views/virtualmachines/details/tabs/configuration/network/utils/utils.ts
index 0ff580c2e2..8cac64fb70 100644
--- a/src/views/virtualmachines/details/tabs/configuration/network/utils/utils.ts
+++ b/src/views/virtualmachines/details/tabs/configuration/network/utils/utils.ts
@@ -19,7 +19,7 @@ import {
   getInterfaces,
 } from '@kubevirt-utils/resources/vm';
 import { DEFAULT_NETWORK_INTERFACE } from '@kubevirt-utils/resources/vm/utils/constants';
-import { interfacesTypes } from '@kubevirt-utils/resources/vm/utils/network/constants';
+import { interfaceTypesProxy } from '@kubevirt-utils/resources/vm/utils/network/constants';
 import {
   getNetworkInterface,
   getNetworkInterfaceState,
@@ -88,7 +88,7 @@ export const isPendingRemoval = (
 
 export const isSRIOVInterface = (vm: V1VirtualMachine, nicName: string) => {
   const iface = getNetworkInterface(vm, nicName);
-  return interfacesTypes[getNetworkInterfaceType(iface)] === interfacesTypes.sriov;
+  return interfaceTypesProxy[getNetworkInterfaceType(iface)] === interfaceTypesProxy.sriov;
 };
 
 export const getInterfaceState = (vm: V1VirtualMachine, nicName: string): NetworkInterfaceState => {


Reviews:
user: login: rszwajko
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-25T15:10:15Z
user: login: adamviktora
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-03T11:04:41Z
user: login: pcbailey
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-04T18:08:16Z
user: login: adamviktora
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-07T08:11:17Z
user: login: rszwajko
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-07T10:38:05Z

Review comments:
diff_hunk: @@ -41,7 +41,7 @@ const labels2types: LabelMap = Object.fromEntries(
   ),
 );
 
-export const interfacesTypes = new Proxy<TypeMap>(types2labels, typeHandler);
-export const interfaceLabels = new Proxy<LabelMap>(labels2types, labelHandler);
+export const interfaceTypesProxy = new Proxy<TypeMap>(types2labels, typeHandler);
+export const interfaceTypesLabels = new Proxy<LabelMap>(labels2types, labelHandler);
path: src/utils/resources/vm/utils/network/constants.ts
user: login: rszwajko
body: sadly it seems this dictionary also should have `proxy` suffix  (to warn users)

created_at: 2025-03-25T15:10:04Z
author_association: MEMBER
diff_hunk: @@ -41,7 +41,7 @@ const labels2types: LabelMap = Object.fromEntries(
   ),
 );
 
-export const interfacesTypes = new Proxy<TypeMap>(types2labels, typeHandler);
-export const interfaceLabels = new Proxy<LabelMap>(labels2types, labelHandler);
+export const interfaceTypesProxy = new Proxy<TypeMap>(types2labels, typeHandler);
+export const interfaceTypesLabels = new Proxy<LabelMap>(labels2types, labelHandler);
path: src/utils/resources/vm/utils/network/constants.ts
user: login: adamviktora
body: @pcbailey Maybe call it just `interfaceLabelsProxy` so it is more consistent? (but I am not very good at naming stuff :D) 

Or possibly `interfacesTypesToLabelsProxy` and `interfacesLabelsToTypesProxy`, but that is too long
created_at: 2025-04-03T11:04:41Z
author_association: MEMBER
diff_hunk: @@ -41,7 +41,7 @@ const labels2types: LabelMap = Object.fromEntries(
   ),
 );
 
-export const interfacesTypes = new Proxy<TypeMap>(types2labels, typeHandler);
-export const interfaceLabels = new Proxy<LabelMap>(labels2types, labelHandler);
+export const interfaceTypesProxy = new Proxy<TypeMap>(types2labels, typeHandler);
+export const interfaceTypesLabels = new Proxy<LabelMap>(labels2types, labelHandler);
path: src/utils/resources/vm/utils/network/constants.ts
user: login: pcbailey
body: @rszwajko @adamviktora Thanks for your comments! Sorry for the delay in updating this.
created_at: 2025-04-04T18:08:15Z
author_association: MEMBER

PR comments:
user: login: pcbailey
created_at: 2025-03-25T12:05:57Z
body: /retest
author_association: MEMBER
user: login: metalice
created_at: 2025-04-07T05:50:41Z
body: /retest

@rszwajko @adamviktora PTAL
author_association: MEMBER
user: login: openshift-ci[bot]
created_at: 2025-04-07T10:38:09Z
body: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubevirt-ui/kubevirt-plugin/pull/2532#pullrequestreview-2745897405" title="Approved">adamviktora</a>*, *<a href="https://github.com/kubevirt-ui/kubevirt-plugin/pull/2532#" title="Author self-approved">pcbailey</a>*, *<a href="https://github.com/kubevirt-ui/kubevirt-plugin/pull/2532#pullrequestreview-2746359357" title="Approved">rszwajko</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubevirt-ui%2Fkubevirt-plugin).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/kubevirt-ui/kubevirt-plugin/blob/main/OWNERS)~~ [adamviktora,pcbailey,rszwajko]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
author_association: CONTRIBUTOR
user: login: upalatucci
created_at: 2025-04-07T13:02:13Z
body: /retest
author_association: MEMBER
user: login: upalatucci
created_at: 2025-04-07T18:35:58Z
body: /retest
author_association: MEMBER
user: login: upalatucci
created_at: 2025-04-08T06:43:53Z
body: /retest
author_association: MEMBER
user: login: pcbailey
created_at: 2025-04-08T11:39:47Z
body: /retest
author_association: MEMBER
user: login: upalatucci
created_at: 2025-04-08T13:25:50Z
body: /retest
author_association: MEMBER
user: login: upalatucci
created_at: 2025-04-08T16:51:55Z
body: /retest
author_association: MEMBER