diff --git a/openmetadata-ui/src/main/resources/ui/src/components/AddService/AddService.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/AddService/AddService.component.tsx index b93f17b9e9f..46bfc574944 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/AddService/AddService.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/AddService/AddService.component.tsx @@ -12,33 +12,28 @@ */ import { isUndefined } from 'lodash'; -import { DynamicFormFieldType } from 'Models'; +import { LoadingState } from 'Models'; import React, { useState } from 'react'; import { useHistory } from 'react-router-dom'; -import { - getAddServicePath, - getServiceDetailsPath, - ONLY_NUMBER_REGEX, - ROUTES, -} from '../../constants/constants'; +import { getServiceDetailsPath, ROUTES } from '../../constants/constants'; import { STEPS_FOR_ADD_SERVICE } from '../../constants/services.const'; import { PageLayoutType } from '../../enums/layout.enum'; import { ServiceCategory } from '../../enums/service.enum'; -import { DashboardServiceType } from '../../generated/entity/services/dashboardService'; -import { MessagingServiceType } from '../../generated/entity/services/messagingService'; -import { DataObj } from '../../interface/service.interface'; -import { getCurrentUserId } from '../../utils/CommonUtils'; import { - getKeyValueObject, - isIngestionSupported, -} from '../../utils/ServiceUtils'; + ConfigData, + DataObj, + DataService, +} from '../../interface/service.interface'; +import { getCurrentUserId } from '../../utils/CommonUtils'; +import { getAddServicePath } from '../../utils/RouterUtils'; +import { isIngestionSupported } from '../../utils/ServiceUtils'; import AddIngestion from '../AddIngestion/AddIngestion.component'; import SuccessScreen from '../common/success-screen/SuccessScreen'; import PageLayout from '../containers/PageLayout'; import IngestionStepper from '../IngestionStepper/IngestionStepper.component'; +import ConnectionConfigForm from '../ServiceConfig/ConnectionConfigForm'; import { AddServiceProps } from './AddService.interface'; import ConfigureService from './Steps/ConfigureService'; -import ConnectionDetails from './Steps/ConnectionDetails'; import SelectServiceType from './Steps/SelectServiceType'; const AddService = ({ @@ -58,28 +53,8 @@ const AddService = ({ const [selectServiceType, setSelectServiceType] = useState(''); const [serviceName, setServiceName] = useState(''); const [description, setDescription] = useState(''); - const [url, setUrl] = useState(''); - const [port, setPort] = useState(''); - const [database, setDatabase] = useState(''); - const [username, setUsername] = useState(''); - const [password, setPassword] = useState(''); - const [warehouse, setWarehouse] = useState(''); - const [account, setAccount] = useState(''); - const [connectionOptions, setConnectionOptions] = useState< - DynamicFormFieldType[] - >([]); - const [connectionArguments, setConnectionArguments] = useState< - DynamicFormFieldType[] - >([]); - const [brokers, setBrokers] = useState(''); - const [schemaRegistry, setSchemaRegistry] = useState(''); - const [pipelineUrl, setPipelineUrl] = useState(''); - const [dashboardUrl, setDashboardUrl] = useState(''); - const [env, setEnv] = useState(''); - const [apiVersion, setApiVersion] = useState(''); - const [server, setServer] = useState(''); - const [siteName, setSiteName] = useState(''); - const [apiKey, setApiKey] = useState(''); + const [saveServiceState, setSaveServiceState] = + useState('initial'); const handleServiceTypeClick = (type: string) => { setShowErrorMessage({ ...showErrorMessage, serviceType: false }); @@ -121,173 +96,47 @@ const AddService = ({ setAddIngestion(value); }; - const handleSubmit = () => { - let dataObj: DataObj = { - description: description, + const handleConfigUpdate = ( + oData: ConfigData, + serviceCat: ServiceCategory + ) => { + const data = { name: serviceName, serviceType: selectServiceType, - }; - - switch (serviceCategory) { - case ServiceCategory.DATABASE_SERVICES: - { - dataObj = { - ...dataObj, - databaseConnection: { - hostPort: `${url}:${port}`, - connectionArguments: getKeyValueObject(connectionArguments), - connectionOptions: getKeyValueObject(connectionOptions), - database: database, - password: password, - username: username, - }, - }; - } - - break; - case ServiceCategory.MESSAGING_SERVICES: - { - dataObj = { - ...dataObj, - brokers: - selectServiceType === MessagingServiceType.Pulsar - ? [brokers] - : brokers.split(',').map((broker) => broker.trim()), - schemaRegistry: schemaRegistry, - }; - } - - break; - case ServiceCategory.DASHBOARD_SERVICES: - { - switch (selectServiceType) { - case DashboardServiceType.Redash: - { - dataObj = { - ...dataObj, - dashboardUrl: dashboardUrl, - // eslint-disable-next-line @typescript-eslint/camelcase - api_key: apiKey, - }; - } - - break; - case DashboardServiceType.Tableau: - { - dataObj = { - ...dataObj, - dashboardUrl: dashboardUrl, - // eslint-disable-next-line @typescript-eslint/camelcase - site_name: siteName, - username: username, - password: password, - // eslint-disable-next-line @typescript-eslint/camelcase - api_version: apiVersion, - server: server, - }; - } - - break; - default: - { - dataObj = { - ...dataObj, - dashboardUrl: dashboardUrl, - username: username, - password: password, - }; - } - - break; - } - } - - break; - case ServiceCategory.PIPELINE_SERVICES: - { - dataObj = { - ...dataObj, - pipelineUrl: pipelineUrl, - }; - } - - break; - default: - break; - } - // TODO:- need to replace mockdata with actual data. - // mockdata to create service for mySQL - const mockData = { description: description, - name: serviceName, - connection: { - config: { - type: 'MySQL', - hostPort: 'localhost:3306', - }, - }, owner: { id: getCurrentUserId(), type: 'user', }, - serviceType: 'MySQL', }; + const configData = + serviceCat === ServiceCategory.PIPELINE_SERVICES + ? { ...data, pipelineUrl: oData.pipelineUrl } + : { + ...data, + connection: { + config: oData, + }, + }; - onAddServiceSave(mockData).then(() => { - setActiveStepperStep(4); + return new Promise((resolve, reject) => { + setSaveServiceState('waiting'); + onAddServiceSave(configData) + .then(() => { + setActiveStepperStep(4); + resolve(); + }) + .catch((err) => { + reject(err); + }) + .finally(() => setSaveServiceState('initial')); }); }; - const handleConnectionDetailsSubmitClick = () => { - // validation will go here - - handleSubmit(); - }; - const handleConnectionDetailsBackClick = () => { setActiveStepperStep(2); }; - const addConnectionOptionFields = () => { - setConnectionOptions([...connectionOptions, { key: '', value: '' }]); - }; - - const removeConnectionOptionFields = (i: number) => { - const newFormValues = [...connectionOptions]; - newFormValues.splice(i, 1); - setConnectionOptions(newFormValues); - }; - - const handleConnectionOptionFieldsChange = ( - i: number, - field: keyof DynamicFormFieldType, - value: string - ) => { - const newFormValues = [...connectionOptions]; - newFormValues[i][field] = value; - setConnectionOptions(newFormValues); - }; - - const addConnectionArgumentFields = () => { - setConnectionArguments([...connectionArguments, { key: '', value: '' }]); - }; - - const removeConnectionArgumentFields = (i: number) => { - const newFormValues = [...connectionArguments]; - newFormValues.splice(i, 1); - setConnectionArguments(newFormValues); - }; - - const handleConnectionArgumentFieldsChange = ( - i: number, - field: keyof DynamicFormFieldType, - value: string - ) => { - const newFormValues = [...connectionArguments]; - newFormValues[i][field] = value; - setConnectionArguments(newFormValues); - }; - const handleViewServiceClick = () => { if (!isUndefined(newServiceData)) { history.push(getServiceDetailsPath(newServiceData.name, serviceCategory)); @@ -297,97 +146,10 @@ const AddService = ({ const handleValidation = ( event: React.ChangeEvent ) => { - const value = event.target.value; - const name = event.target.name; - - switch (name) { - case 'serviceName': - setServiceName(value.trim()); - setShowErrorMessage({ ...showErrorMessage, name: false }); - - break; - - case 'url': - setUrl(value); - - break; - - case 'port': - if (ONLY_NUMBER_REGEX.test(value) || value === '') { - setPort(value); - } - - break; - - case 'database': - setDatabase(value); - - break; - - case 'username': - setUsername(value); - - break; - - case 'password': - setPassword(value); - - break; - - case 'warehouse': - setWarehouse(value); - - break; - - case 'account': - setAccount(value); - - break; - - case 'brokers': - setBrokers(value); - - break; - - case 'schemaRegistry': - setSchemaRegistry(value); - - break; - - case 'pipelineUrl': - setPipelineUrl(value); - - break; - - case 'dashboardUrl': - setDashboardUrl(value); - - break; - - case 'env': - setEnv(value); - - break; - - case 'apiVersion': - setApiVersion(value); - - break; - - case 'server': - setServer(value); - - break; - - case 'siteName': - setSiteName(value); - - break; - - case 'apiKey': - setApiKey(value); - - break; + const value = event.target.value.trim(); + setServiceName(value); + if (value) { + setShowErrorMessage({ ...showErrorMessage, name: false }); } }; @@ -430,40 +192,20 @@ const AddService = ({ )} {activeStepperStep === 3 && ( - { + handleConfigUpdate(e.formData, serviceCategory); + }} /> )} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/AddService/AddService.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/AddService/AddService.test.tsx index 1857b9261e6..0993a2e6d3d 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/AddService/AddService.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/AddService/AddService.test.tsx @@ -38,6 +38,10 @@ jest.mock('react-router-dom', () => ({ useHistory: jest.fn(), })); +jest.mock('../ServiceConfig/ConnectionConfigForm', () => () => ( + <>ConnectionConfigForm +)); + describe('Test AddService component', () => { it('AddService component should render', async () => { const { container } = render( diff --git a/openmetadata-ui/src/main/resources/ui/src/components/AddService/Steps/SelectServiceType.tsx b/openmetadata-ui/src/main/resources/ui/src/components/AddService/Steps/SelectServiceType.tsx index 5045826646f..c359c819abb 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/AddService/Steps/SelectServiceType.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/AddService/Steps/SelectServiceType.tsx @@ -101,7 +101,7 @@ const SelectServiceType = ({ theme="primary" variant="text" onClick={onCancel}> - Discard + Back