Skip to content

Commit

Permalink
feat(pci.kubernetes): fix PR return
Browse files Browse the repository at this point in the history
ref: TAPC-34
Signed-off-by: Eric Ciccotti <[email protected]>
  • Loading branch information
Eric Ciccotti committed Dec 16, 2024
1 parent e6de385 commit c5b2e5d
Show file tree
Hide file tree
Showing 25 changed files with 1,144 additions and 686 deletions.
1 change: 0 additions & 1 deletion packages/manager/apps/pci-kubernetes/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
"dependencies": {
"@hookform/resolvers": "^3.3.4",
"@ovh-ux/manager-config": "^8.0.1",
"@hookform/resolvers": "^3.3.4",
"@ovh-ux/manager-core-api": "^0.9.0",
"@ovh-ux/manager-core-utils": "^0.3.0",
"@ovh-ux/manager-pci-common": "^0.11.2",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,26 @@
"pci_projects_project_kubernetes_details_service_add_oidc_provider_description": "Vous pouvez utiliser la plupart des fournisseurs OIDC comme Dex, Keycloak ou un fournisseur SaaS, à la condition qu'ils exposent la fonctionnalité \"OpenID Connect discovery\". Le fournisseur OIDC doit être accessible depuis une URL en HTTPS et un certificat CA signé est obligatoire.",
"pci_projects_project_kubernetes_details_service_add_oidc_provider_action_add": "Ajouter",
"pci_projects_project_kubernetes_details_service_add_oidc_provider_action_cancel": "Annuler",
"pci_projects_project_kubernetes_details_service_add_oidc_provider_field_url": "URL du fournisseur (Obligatoire)",
"pci_projects_project_kubernetes_details_service_add_oidc_provider_field_url_extra": "Saisissez ici l'URL de discovery de votre fournisseur, sans path. L'URL doit pointer vers le niveau précédent .well-known/openid-configuration . Vous devez utiliser une URL débutant par https://",
"pci_projects_project_kubernetes_details_service_add_oidc_provider_field_client_id": "ID du client (Obligatoire)",
"pci_projects_project_kubernetes_details_service_add_oidc_provider_field_issuer_url": "Provider URL (Obligatoire)",
"pci_projects_project_kubernetes_details_service_add_oidc_provider_field_issuer_url_extra": "Saisissez ici l'URL de discovery de votre fournisseur, sans path. L'URL doit pointer vers le niveau précédent .well-known/openid-configuration . Vous devez utiliser une URL commençant par https://",
"pci_projects_project_kubernetes_details_service_add_oidc_provider_field_client_id": "Client ID (Obligatoire)",
"pci_projects_project_kubernetes_details_service_add_oidc_provider_field_client_id_extra": "Saisissez ici l'identifiant du cluster Kubernetes auprès de votre fournisseur OIDC, par exemple \"cluster-kubernetes-production\". Il s'agit de la chaine de caractère de votre choix (attention certains fournisseurs OIDC peuvent être plus restrictifs)",
"pci_projects_project_kubernetes_details_service_add_oidc_provider_request_success": "Les paramètres OIDC ont été pris en compte. Ils seront effectifs dès redéploiement de votre APIserver, généralement dans les 30 secondes.",
"pci_projects_project_kubernetes_details_service_add_oidc_provider_request_error": "Une erreur est survenue lors de la création du fournisseur OIDC : {{ message }}",
"pci_projects_project_kubernetes_details_service_update_oidc_provider_title": "Modifier le fournisseur OIDC",
"pci_projects_project_kubernetes_details_service_update_oidc_provider_description": "Vous pouvez utiliser la plupart des fournisseurs OIDC comme Dex, Keycloak ou un fournisseur SaaS, à la condition qu'ils exposent la fonctionnalité \"OpenID Connect discovery\". Le fournisseur OIDC doit être accessible depuis une URL en HTTPS et un certificat CA signé est obligatoire.",
"pci_projects_project_kubernetes_details_service_update_oidc_provider_action_update": "Modifier",
"pci_projects_project_kubernetes_details_service_update_oidc_provider_action_cancel": "Annuler",
"pci_projects_project_kubernetes_details_service_update_oidc_provider_field_url": "URL du fournisseur (Obligatoire)",
"pci_projects_project_kubernetes_details_service_update_oidc_provider_field_url_extra": "Saisissez ici l'URL de discovery de votre fournisseur, sans path. L'URL doit pointer vers le niveau précédent .well-known/openid-configuration . Vous devez utiliser une URL débutant par https://",
"pci_projects_project_kubernetes_details_service_update_oidc_provider_field_client_id": "ID du client (Obligatoire)",
"pci_projects_project_kubernetes_details_service_update_oidc_provider_field_issuer_url": "Provider URL (Obligatoire)",
"pci_projects_project_kubernetes_details_service_update_oidc_provider_field_issuer_url_extra": "Saisissez ici l'URL de discovery de votre fournisseur, sans path. L'URL doit pointer vers le niveau précédent .well-known/openid-configuration . Vous devez utiliser une URL commençant par https://",
"pci_projects_project_kubernetes_details_service_update_oidc_provider_field_client_id": "Client ID (Obligatoire)",
"pci_projects_project_kubernetes_details_service_update_oidc_provider_field_client_id_extra": "Saisissez ici l'identifiant du cluster Kubernetes auprès de votre fournisseur OIDC, par exemple \"cluster-kubernetes-production\". Il s'agit de la chaine de caractère de votre choix (attention certains fournisseurs OIDC peuvent être plus restrictifs)",
"pci_projects_project_kubernetes_details_service_update_oidc_provider_request_success": "Les paramètres OIDC ont été pris en compte. Ils seront effectifs dès redéploiement de votre APIserver, généralement dans les 30 secondes.",
"pci_projects_project_kubernetes_details_service_update_oidc_provider_request_error": "Une erreur est survenue lors de la mise à jour du fournisseur OIDC : {{ message }}",
"pci_projects_project_kubernetes_details_service_upsert_oidc_provider_issue_url_error": "L'URL de l'émetteur doit être une URL valide.",
"pci_projects_project_kubernetes_details_service_upsert_oidc_provider_issue_https_error": "L'URL de l'émetteur doit utiliser le protocole HTTPS.",
"pci_projects_project_kubernetes_details_service_upsert_oidc_provider_description": "Vous pouvez utiliser la plupart des fournisseurs OIDC comme Dex, Keycloak ou un fournisseur SaaS, à la condition qu'ils exposent la fonctionnalité \"OpenID Connect discovery\". Le fournisseur OIDC doit être accessible depuis une URL en HTTPS et un certificat CA signé est obligatoire.",
"pci_projects_project_kubernetes_details_service_upsert_oidc_provider_field_url_extra": "Saisissez ici l'URL de discovery de votre fournisseur, sans path. L'URL doit pointer vers le niveau précédent .well-known/openid-configuration . Vous devez utiliser une URL débutant par https://",
"pci_projects_project_kubernetes_details_service_upsert_oidc_provider_field_issuer_url_extra": "Saisissez ici l'URL de discovery de votre fournisseur, sans path. L'URL doit pointer vers le niveau précédent .well-known/openid-configuration . Vous devez utiliser une URL commençant par https://",
"pci_projects_project_kubernetes_details_service_upsert_oidc_provider_field_client_id_extra": "Saisissez ici l'identifiant du cluster Kubernetes auprès de votre fournisseur OIDC, par exemple \"cluster-kubernetes-production\". Il s'agit de la chaine de caractère de votre choix (attention certains fournisseurs OIDC peuvent être plus restrictifs)",
"pci_projects_project_kubernetes_details_service_oidc_provider_field_username_claim_title": "usernameClaim (Optionnel)",
"pci_projects_project_kubernetes_details_service_oidc_provider_field_username_claim_description": "Claim WT à utiliser comme nom d’utilisateur. Par défaut, il s’agit de « sub », qui est censé être un identifiant unique de l’utilisateur final. Les administrateurs peuvent choisir d’autres claims, tels que l’email ou le nom, en fonction de leur fournisseur. Cependant, les claims autres que l’email seront préfixés par l’URL de l’émetteur pour éviter les conflits de noms avec d’autres plugins.",
Expand All @@ -45,5 +45,11 @@
"pci_projects_project_kubernetes_details_service_remove_oidc_provider_request_success": "Le fournisseur OIDC a été supprimé avec succès",
"pci_projects_project_kubernetes_details_service_remove_oidc_provider_request_error": "Une erreur est survenue lors de la suppression du fournisseur OIDC : {{ message }}",
"pci_projects_project_kubernetes_details_service_show_optional": "Configuration optionnelle",
"pci_projects_project_kubernetes_details_service_hide_optional": "Voir moins d’options"
"pci_projects_project_kubernetes_details_service_hide_optional": "Voir moins d’options",
"pci_projects_project_kubernetes_details_service_oidc_provider_field_ca_content_error": "Le champ caContent doit être une chaîne valide en Base64.",
"pci_projects_project_kubernetes_details_service_oidc_provider_field_required_claim_error": "Le champ requiredClaim doit être au format 'clé=valeur'.",
"pci_projects_project_kubernetes_details_service_oidc_provider_field_groups_claim_caption": "Ajoutez plusieurs valeurs en les séparant par des virgules, par exemple : group1, group2",
"pci_projects_project_kubernetes_details_service_oidc_provider_field_required_claim_caption": "Ajoutez plusieurs valeurs en les séparant par des virgules, par exemple : role=admin, environment=production",
"pci_projects_project_kubernetes_details_service_oidc_provider_field_groups_claim_error": "Le champ groupsClaim doit contenir une liste de valeurs séparées par des virgules, par exemple : group1, group2",
"pci_projects_project_kubernetes_details_service_oidc_provider_field_required_claim_comma_error": "Le champ requiredClaim doit contenir une liste de valeurs séparées par des virgules, par exemple :role=admin, environment=production"
}
18 changes: 3 additions & 15 deletions packages/manager/apps/pci-kubernetes/src/api/data/kubernetes.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { fetchIcebergV6, v6 } from '@ovh-ux/manager-core-api';
import { TOidcFormValues, TKube, TNetworkConfiguration } from '@/types';
import { TKube, TNetworkConfiguration, TOidcProvider } from '@/types';

export const getKubernetesCluster = async (
projectId: string,
Expand Down Expand Up @@ -79,18 +79,6 @@ export const getClusterRestrictions = async (
return data;
};

export type TOidcProvider = {
issuerUrl: string;
clientId: string;
usernameClaim?: string;
usernamePrefix?: string;
groupsClaim?: string | null;
groupsPrefix?: string;
signingAlgorithms?: string | null;
caContent?: string;
requiredClaim?: string | null;
};

export const getOidcProvider = async (
projectId: string,
kubeId: string,
Expand Down Expand Up @@ -171,7 +159,7 @@ export const resetCluster = async (
export const addOidcProvider = async (
projectId: string,
kubeId: string,
params: TOidcFormValues,
params: TOidcProvider,
) => {
const { data } = await v6.post(
`/cloud/project/${projectId}/kube/${kubeId}/openIdConnect`,
Expand All @@ -183,7 +171,7 @@ export const addOidcProvider = async (
export const updateOidcProvider = async (
projectId: string,
kubeId: string,
params: TOidcFormValues,
params: TOidcProvider,
) => {
const { data } = await v6.put(
`/cloud/project/${projectId}/kube/${kubeId}/openIdConnect`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
} from '@tanstack/react-query';
import { useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { TOidcFormValues, TKube } from '@/types';
import { TKube, TOidcProvider } from '@/types';
import queryClient from '@/queryClient';
import { paginateResults, REFETCH_INTERVAL_DURATION } from '@/helpers';
import { STATUS } from '@/constants';
Expand Down Expand Up @@ -436,7 +436,7 @@ export const useUpsertOidcProvider = ({
isUpdate,
}: UpsertOidcProviderProps) => {
const mutation = useMutation({
mutationFn: async (params: TOidcFormValues) =>
mutationFn: async (params: TOidcProvider) =>
isUpdate
? updateOidcProvider(projectId, kubeId, params)
: addOidcProvider(projectId, kubeId, params),
Expand All @@ -449,7 +449,7 @@ export const useUpsertOidcProvider = ({
},
});
return {
upsertOidcProvider: (params: TOidcFormValues) => mutation.mutate(params),
upsertOidcProvider: (params: TOidcProvider) => mutation.mutate(params),
...mutation,
};
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import {
OsdsCheckbox,
OsdsCheckboxButton,
OsdsText,
} from '@ovhcloud/ods-components/react';
import { useState, useEffect, useCallback } from 'react';
import { ODS_THEME_COLOR_INTENT } from '@ovhcloud/ods-common-theming';
import { SigningAlgorithms } from '@/types';

type TCheckboxFormFieldProps = {
value: string[];
onChange: (updatedOperations: string[]) => void;
};

export const CheckBoxFormField = ({
value = [],
onChange,
}: TCheckboxFormFieldProps) => {
const [keyOperations, setKeyOperations] = useState<string[]>(value);

useEffect(() => {
setKeyOperations(value);
}, [value]);

const handleCheckboxChange = useCallback(
(signingAlgorithm: string, isChecked: boolean) => {
const updatedOperations = isChecked
? [...keyOperations, signingAlgorithm]
: keyOperations.filter((op) => op !== signingAlgorithm);

setKeyOperations(updatedOperations);
onChange(updatedOperations);
},
[keyOperations, onChange],
);

return (
<div className="grid grid-cols-1 gap-4 sm:grid-cols-3">
{Object.values(SigningAlgorithms).map((signingAlgorithm) => (
<OsdsCheckbox
key={signingAlgorithm}
checked={keyOperations?.includes(signingAlgorithm)}
onOdsCheckedChange={(event) => {
handleCheckboxChange(signingAlgorithm, event.detail.checked);
}}
>
<OsdsCheckboxButton color={ODS_THEME_COLOR_INTENT.primary}>
<span slot="end">
<OsdsText color={ODS_THEME_COLOR_INTENT.primary}>
{signingAlgorithm}
</OsdsText>
</span>
</OsdsCheckboxButton>
</OsdsCheckbox>
))}
</div>
);
};

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import { render, screen, fireEvent } from '@testing-library/react';
import { describe, it, vi, expect } from 'vitest';
import {
InputFormField,
TinputFormFieldProps,
} from './InputFormField.component';

vi.mock('@ovhcloud/ods-components/react', () => ({
OsdsInput: vi.fn(
({ className, onOdsValueChange, onOdsInputBlur, ...props }) => (
<input
data-testid={props['data-testid']}
className={className}
onChange={(e) => onOdsValueChange && onOdsValueChange(e.target.value)}
onBlur={() => onOdsInputBlur && onOdsInputBlur()}
{...props}
/>
),
),
OsdsText: vi.fn(({ children, ...props }) => (
<span data-testid={props['data-testid']} {...props}>
{children}
</span>
)),
}));

describe('InputFormField', () => {
const defaultProps: TinputFormFieldProps = {
name: 'testField',
value: 'Initial value',
placeholder: 'Enter text',
onOdsInputBlur: vi.fn(),
onOdsValueChange: vi.fn(),
error: false,
onChange: vi.fn(),
onBlur: vi.fn(),
};

it('renders correctly with default props', () => {
render(<InputFormField {...defaultProps} />);

const input = screen.getByTestId('testField-input');
expect(input).toBeInTheDocument();
expect(input).toHaveValue('Initial value');
expect(input).toHaveAttribute('placeholder', 'Enter text');
expect(input).not.toHaveClass('bg-red-100');
});

it('applies error styles when error is true', () => {
render(<InputFormField {...defaultProps} error />);

const input = screen.getByTestId('testField-input');
expect(input).toHaveClass('bg-red-100');
});

it('calls onChange when value changes', () => {
render(<InputFormField {...defaultProps} />);

const input = screen.getByTestId('testField-input');
fireEvent.change(input, { target: { value: 'New value' } });

expect(defaultProps.onOdsValueChange).toHaveBeenCalledWith('New value');
});

it('calls onBlur when focus is lost', () => {
render(<InputFormField {...defaultProps} />);

const input = screen.getByTestId('testField-input');
fireEvent.blur(input);

expect(defaultProps.onOdsInputBlur).toHaveBeenCalled();
});

it('renders caption text when provided', () => {
render(<InputFormField {...defaultProps} caption="This is a caption" />);

const caption = screen.getByText('This is a caption');
expect(caption).toBeInTheDocument();
expect(caption).toHaveClass('mt-3');
});

it('passes additional props to OsdsInput', () => {
render(<InputFormField {...defaultProps} data-custom="customValue" />);

const input = screen.getByTestId('testField-input');
expect(input).toHaveAttribute('data-custom', 'customValue');
});
});
Loading

0 comments on commit c5b2e5d

Please sign in to comment.