Commit a896bf0f authored by Labros Papadopoulos's avatar Labros Papadopoulos
Browse files

feat: user input kube config directly in yaml format

parent 3a7429ad
Loading
Loading
Loading
Loading
Loading
+22 −4
Changes for components/platform/platform-clusters-add-modal.tsx: 22 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ import {
  Modal,
  Button,
  Input,
  Textarea,
  Select,
  SelectItem,
  SharedSelection,
@@ -13,6 +14,7 @@ import { Info } from 'lucide-react';
import { ModalContent, ModalFooter, ModalHeader } from '@nextui-org/react';
import { CalendarDate } from '@internationalized/date';
import { createCluster } from '@/actions/domain-management';
import { load as loadYAML } from 'js-yaml';

interface PlatformClustersAddModalProps {
  isOpen: boolean;
@@ -28,6 +30,17 @@ const initialForm = {
  endDate: '',
};

const isValidYAML = (value: string): boolean => {
  try {
    const parsed = loadYAML(value);
    return parsed !== null && typeof parsed === 'object';
  } catch {
    return false;
  }
};

const encodeToBase64 = (value: string): string => btoa(unescape(encodeURIComponent(value)));

const PlatformClustersAddModal: React.FC<PlatformClustersAddModalProps> = ({
  isOpen,
  onClose,
@@ -72,7 +85,11 @@ const PlatformClustersAddModal: React.FC<PlatformClustersAddModalProps> = ({
    if (organizations && organizations.length > 0 && !selectedOrgId)
      newErrors.organization = 'Required';
    if (!form.name || form.name.trim() === '') newErrors.name = 'Required';
    if (!form.kubeConfig || form.kubeConfig.trim() === '') newErrors.kubeConfig = 'Required';
    if (!form.kubeConfig || form.kubeConfig.trim() === '') {
      newErrors.kubeConfig = 'Required';
    } else if (!isValidYAML(form.kubeConfig)) {
      newErrors.kubeConfig = 'Please enter valid YAML';
    }
    if (!form.endDate || form.endDate.trim() === '') newErrors.endDate = 'Required';
    if (!form.numberOfWorkers || form.numberOfWorkers.trim() === '') {
      newErrors.numberOfWorkers = 'Required';
@@ -102,7 +119,7 @@ const PlatformClustersAddModal: React.FC<PlatformClustersAddModalProps> = ({
        organizationId: selectedOrgId,
        organizationName: org?.name ?? undefined,
        name: form.name,
        kubeConfig: form.kubeConfig,
        kubeConfig: encodeToBase64(form.kubeConfig),
        endDateIso: form.endDate || new Date().toISOString(),
        endHour: endTime.hours,
        endMinute: endTime.minutes,
@@ -213,19 +230,20 @@ const PlatformClustersAddModal: React.FC<PlatformClustersAddModalProps> = ({
                  KubeConfig<sup>*</sup>
                </span>
                <Tooltip
                  content="Paste your kubeconfig file contents here in base64 format"
                  content="Paste your kubeconfig file contents here in valid YAML format"
                  placement="top"
                >
                  <Info size={14} className="cursor-help text-gray-400" />
                </Tooltip>
              </div>
              <div className="w-80">
                <Input
                <Textarea
                  name="kubeConfig"
                  value={form.kubeConfig}
                  onChange={handleChange}
                  fullWidth
                  variant="bordered"
                  minRows={6}
                  classNames={{ inputWrapper: 'rounded-[5px]' }}
                />
                {errors.kubeConfig && (