Skip to content

Commit 250ce7f

Browse files
committed
feat(sap): add installation dashboard page
ref: #MANAGER-17205 Signed-off-by: Thibault Barske <[email protected]>
1 parent 8c949dd commit 250ce7f

File tree

19 files changed

+864
-20
lines changed

19 files changed

+864
-20
lines changed

packages/manager-react-components/src/components/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ export * from './datagrid/useDatagrid';
1616
export * from './datagrid/useDatagridSearchParams';
1717
export * from './datagrid/clipboard-cell.component';
1818

19+
export * from './formatted-date/FormattedDate';
20+
1921
export * from './guides-header';
2022

2123
export * from './notifications/notifications.component';
@@ -25,7 +27,6 @@ export * from './filters';
2527

2628
export * from './ManagerButton/ManagerButton';
2729
export * from './ManagerText/ManagerText';
28-
2930
export * from './pci-maintenance-banner';
3031
export * from './region/region.component';
3132
export * from './order';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"dashboard_installation_title": "Assistant de pré-installation SAP",
3+
"dashboard_installation_description": "Rapport d'installation",
4+
"dashboard_installation_generals_informations": "Informations générales",
5+
"dashboard_installation_item_start_date": "Date de lancement",
6+
"dashboard_installation_item_end_date": "Date de fin",
7+
"dashboard_installation_item_application_version": "Version d'application",
8+
"dashboard_installation_item_application_type": "Type d'application",
9+
"dashboard_installation_item_deploiement_type": "Type de déploiement",
10+
"dashboard_installation_progress_step_initialisation": "Initialisation des ressources temporaires dans votre service VMware on OVHcloud",
11+
"dashboard_installation_progress_step_create_virtuals_machines": "Création des machines virtuelles",
12+
"dashboard_installation_progress_step_sap_hana_install": "Installation de SAP HANA et configuration des options demandées",
13+
"dashboard_installation_progress_step_sap_install": "Installation du système SAP et configuration des options demandées",
14+
"dashboard_installation_progress_step_clean_resources": "Suppression des ressources temporaires dans votre service VMware on OVHcloud",
15+
"dashboard_installation_progress_step_success": "Étape terminée avec succès",
16+
"dashboard_installation_progress_step_failure": "Étape échouée",
17+
"dashboard_installation_progress_step_pending": "Étape en cours d'éxécution",
18+
"dashboard_installation_progress_step_waiting": "Étape en attente",
19+
"dashboard_installation_progress_status_label": "Statut de l'installation",
20+
"dashboard_installation_error_message": "Erreur à l'étape \"{{stepName}}\". Plus de détails ci-dessous."
21+
}

packages/manager/apps/sap-features-hub/public/translations/installation/Messages_fr_FR.json

+6-1
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,10 @@
7474
"summary_title": "Validez la configuration de l'installation",
7575
"summary_subtitle": "Vérifiez les informations saisies avant de lancer l'installation. Vous pouvez également télécharger le fichier de la configuration de votre installation <DownloadLink label=\"ici\">{{label}}</DownloadLink>. Vous pourrez le réutiliser ultérieurement pour initialiser une nouvelle installation.",
7676
"summary_cta_submit": "Lancer l'installation",
77-
"summary_api_error": "Le lancement de l'installation a échoué : {{ error }}"
77+
"summary_api_error": "Le lancement de l'installation a échoué : {{ error }}",
78+
"status_SUCCESS": "Succès",
79+
"status_PENDING": "En attente",
80+
"status_REVOKED": "Révoqué",
81+
"status_FAILURE": "Erreur",
82+
"status_STARTED": "En cours"
7883
}

packages/manager/apps/sap-features-hub/public/translations/listing/Messages_fr_FR.json

-5
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,6 @@
66
"sap_hub_history_application_type": "Type d'application",
77
"sap_hub_history_deployment_type": "Type de déploiement",
88
"sap_hub_history_installation_status": "Statut",
9-
"sap_hub_history_installation_SUCCESS": "Succès",
10-
"sap_hub_history_installation_PENDING": "En attente",
11-
"sap_hub_history_installation_REVOKED": "Révoqué",
12-
"sap_hub_history_installation_FAILURE": "Erreur",
13-
"sap_hub_history_installation_STARTED": "En cours",
149
"sap_hub_history_installation_RETRY": "Nouvelle tentative",
1510
"sap_hub_history_installation_see_detail": "Voir le détail"
1611
}
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import React from 'react';
2-
import { OdsText } from '@ovhcloud/ods-components/react';
2+
import { OdsText, OdsSkeleton } from '@ovhcloud/ods-components/react';
33
import { StepFieldData } from '@/types/formStep.type';
44
import { testIds } from '@/utils/testIds.constants';
55
import { FORM_LABELS } from '@/constants/form.constants';
66

77
type FormFieldSummaryProps = React.HTMLAttributes<HTMLDivElement> & {
88
field: StepFieldData;
9+
isLoading?: boolean;
910
};
1011

1112
export const FormFieldSummary = ({
1213
field,
14+
isLoading,
1315
...props
1416
}: FormFieldSummaryProps) => {
1517
const valueText = field.isSecretValue ? FORM_LABELS.secretText : field.value;
@@ -20,9 +22,12 @@ export const FormFieldSummary = ({
2022
{...props}
2123
>
2224
<OdsText className="max-w-60">{field.label}</OdsText>
23-
<OdsText className="max-w-60" data-testid={testIds.summaryFieldValue}>
24-
{field.value ? valueText : FORM_LABELS.unknownText}
25-
</OdsText>
25+
{isLoading && <OdsSkeleton className="w-20" />}
26+
{!isLoading && (
27+
<OdsText className="max-w-60" data-testid={testIds.summaryFieldValue}>
28+
{field.value ? valueText : FORM_LABELS.unknownText}
29+
</OdsText>
30+
)}
2631
</div>
2732
);
2833
};

packages/manager/apps/sap-features-hub/src/components/InstallationStatus/InstallationStatus.component.spec.tsx

+1-4
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,7 @@ describe('SAPInstallationStatus component tests suite', () => {
4242

4343
const badge = container.querySelector('ods-badge');
4444
expect(badge).toHaveAttribute('color', color);
45-
expect(badge).toHaveAttribute(
46-
'label',
47-
`sap_hub_history_installation_${status}`,
48-
);
45+
expect(badge).toHaveAttribute('label', `status_${status}`);
4946
},
5047
);
5148
});

packages/manager/apps/sap-features-hub/src/components/InstallationStatus/InstallationStatus.component.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ export const InstallationStatus = ({
2222
size = ODS_BADGE_SIZE.md,
2323
...rest
2424
}: InstallationStatusProps) => {
25-
const { t } = useTranslation('listing');
25+
const { t } = useTranslation('installation');
2626
return (
2727
<React.Suspense>
2828
<OdsBadge
29-
label={t(`sap_hub_history_installation_${status}`)}
29+
label={t(`status_${status}`)}
3030
size={size}
3131
color={BADGE_COLOR_STATUS[status] ?? ODS_BADGE_COLOR.neutral}
3232
{...rest}

packages/manager/apps/sap-features-hub/src/data/api/installationDeployment.ts

+19
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ApiResponse, v6 } from '@ovh-ux/manager-core-api';
2+
import { InstallationDetails } from '@/types/installation.type';
23

34
const getApplicationVersionRoute = (serviceName: string) =>
45
`/dedicatedCloud/${serviceName}/sap/capabilities`;
@@ -7,3 +8,21 @@ export const getApplicationVersions = async (
78
serviceName: string,
89
): Promise<ApiResponse<unknown>> =>
910
v6.get(getApplicationVersionRoute(serviceName));
11+
12+
export type GetInstallationTaskDetailsRouteParams = {
13+
serviceName: string;
14+
taskId: string;
15+
};
16+
17+
const getInstallationTaskDetailsRoute = ({
18+
serviceName,
19+
taskId,
20+
}: GetInstallationTaskDetailsRouteParams) =>
21+
`/dedicatedCloud/${serviceName}/sap/${taskId}`;
22+
23+
export const getInstallationTaskDetails = async ({
24+
serviceName,
25+
taskId,
26+
}: GetInstallationTaskDetailsRouteParams): Promise<ApiResponse<
27+
InstallationDetails
28+
>> => v6.get(getInstallationTaskDetailsRoute({ serviceName, taskId }));

packages/manager/apps/sap-features-hub/src/hooks/installationDeployment/useApplicationVersions.ts

+91-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
import { useQuery } from '@tanstack/react-query';
2-
import { getApplicationVersions } from '@/data/api/installationDeployment';
2+
import {
3+
getApplicationVersions,
4+
getInstallationTaskDetails,
5+
GetInstallationTaskDetailsRouteParams,
6+
} from '@/data/api/installationDeployment';
7+
import {
8+
InstallationDetails,
9+
SAPInstallationStatus,
10+
} from '@/types/installation.type';
311

412
// TODO: implement API calls when developed
513
export const useApplicationVersions = (serviceName: string) =>
@@ -9,3 +17,85 @@ export const useApplicationVersions = (serviceName: string) =>
917
select: (res) => res.data,
1018
enabled: !!serviceName,
1119
});
20+
21+
export const installationTaskDetailsQueryKey = ({
22+
serviceName,
23+
taskId,
24+
}: GetInstallationTaskDetailsRouteParams) => [
25+
'sap',
26+
serviceName,
27+
'tasks',
28+
taskId,
29+
];
30+
31+
// TODO: implement API calls when developed
32+
export const useInstallationTaskDetails = ({
33+
serviceName,
34+
taskId,
35+
}: GetInstallationTaskDetailsRouteParams) =>
36+
useQuery({
37+
queryKey: installationTaskDetailsQueryKey({ serviceName, taskId }),
38+
queryFn: () => getInstallationTaskDetails({ serviceName, taskId }),
39+
select: (res) => res.data,
40+
enabled: !!serviceName && !!taskId,
41+
});
42+
43+
export const useMockInstallationTaskDetails = ({
44+
serviceName,
45+
taskId,
46+
}: GetInstallationTaskDetailsRouteParams) => {
47+
return useQuery({
48+
queryKey: installationTaskDetailsQueryKey({ serviceName, taskId }),
49+
queryFn: () => {
50+
return new Promise((resolve) => {
51+
// Generate fake data for InstallationDetails
52+
const mockData: InstallationDetails = {
53+
ansibleSapHanaStatus: SAPInstallationStatus.failure,
54+
ansibleSapSystemStatus: SAPInstallationStatus.failure,
55+
applicationType: 'ABAP',
56+
applicationVersion: '1.0.0',
57+
cleanStatus: SAPInstallationStatus.pending,
58+
deploymentType: 'Standard',
59+
endTime: '2022-01-01T12:00:00',
60+
errorMessage: `1. [ERROR] DependencyError: Failed to install package "libwebsocket-3.2.1"
61+
2. [WARN] VersionMismatch: Requested Node >=16.x, found Node v14.15.0
62+
3. [CRITICAL] SegmentationFault: Installation aborted at step "configure_network_adapter"
63+
4. [ERROR] ChecksumFailed: File integrity compromised on "module-crypto-4.0.2.tar.gz"
64+
5. [FATAL] PermissionDenied: Unable to access "/usr/local/bin/" directory
65+
6. [ERROR] CompilationError: Rust crate "tokio-async-1.6.3" failed to build
66+
7. [WARN] TimeoutWarning: Network timeout while downloading dependency "[email protected]"
67+
8. [ERROR] SyntaxError: Unexpected token 'import' during parsing config.js
68+
9. [CRITICAL] KernelIncompatibility: Module "fs-extended" incompatible with Linux Kernel 5.8.0
69+
10. [ERROR] PortUnavailable: Default port 5432 already in use by another service
70+
11. [WARN] EnvironmentVariableMissing: Variable DATABASE_URL not found
71+
12. [ERROR] ConflictDetected: Conflicting installations detected for package "express-router"
72+
13. [FATAL] DiskSpaceInsufficient: Less than 200MB remaining on partition "/var"
73+
14. [ERROR] AuthenticationFailed: Access denied to private repository "[email protected]:user/private-lib.git"
74+
15. [CRITICAL] DockerDaemonOffline: Docker service unavailable or stopped
75+
16. [ERROR] SSLHandshakeFailed: Unable to verify certificate for domain "api.example.com"
76+
17. [WARN] DeprecationNotice: Package "[email protected]" deprecated, installation skipped
77+
18. [ERROR] DatabaseMigrationFailed: PostgreSQL migration error at script "20240401_init.sql"
78+
19. [CRITICAL] MissingSystemLibrary: Required system library "libssl-dev" not found
79+
20. [ERROR] InvalidConfiguration: Unrecognized parameter "max_memory_allocation" in config.yml`,
80+
gatewayStatus: SAPInstallationStatus.success,
81+
iam: {
82+
displayName: 'John Doe',
83+
id: '123456',
84+
urn: 'urn:iam:123456',
85+
},
86+
sapHanaSid: 'HANA01',
87+
sapSid: 'SAP01',
88+
startTime: '2022-01-01T10:00:00',
89+
status: SAPInstallationStatus.pending,
90+
taskId: '789012',
91+
terraformStatus: SAPInstallationStatus.success,
92+
};
93+
setTimeout(() => {
94+
resolve({ data: mockData });
95+
}, 500);
96+
});
97+
},
98+
select: (res) => (res as any).data,
99+
enabled: () => !!serviceName && !!taskId,
100+
});
101+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { useQueryClient } from '@tanstack/react-query';
2+
import { useEffect } from 'react';
3+
4+
type AutoRefetchProps = {
5+
queryKey: string[];
6+
enabled: boolean;
7+
interval?: number;
8+
};
9+
10+
export const useAutoRefetch = ({
11+
queryKey,
12+
enabled,
13+
interval = 10_000,
14+
}: AutoRefetchProps) => {
15+
const queryClient = useQueryClient();
16+
17+
useEffect(() => {
18+
if (!enabled) return;
19+
20+
const refetchQueries = () => {
21+
queryClient.invalidateQueries({ queryKey });
22+
};
23+
24+
const refetchInterval = setInterval(() => refetchQueries(), interval);
25+
26+
// eslint-disable-next-line consistent-return
27+
return () => clearInterval(refetchInterval);
28+
}, [enabled, interval, queryKey, queryClient]);
29+
};

0 commit comments

Comments
 (0)