diff --git a/config/setup/common/data/agent_relay_gateway_config.dat b/config/setup/common/data/agent_relay_gateway_config.dat index b1410bdb..d415e4c6 100644 --- a/config/setup/common/data/agent_relay_gateway_config.dat +++ b/config/setup/common/data/agent_relay_gateway_config.dat @@ -67,8 +67,7 @@ elasticsearch: basic_auth: username: ingest password: password - endpoints: - - $[[SETUP_ENDPOINT]] + endpoints: $[[SETUP_ENDPOINTS]] pipeline: - name: bulk_request_ingest diff --git a/config/setup/common/data/system_ingest_config.dat b/config/setup/common/data/system_ingest_config.dat index 3dbf87b5..f65c78e2 100644 --- a/config/setup/common/data/system_ingest_config.dat +++ b/config/setup/common/data/system_ingest_config.dat @@ -61,6 +61,6 @@ pipeline: # key_file: /xxx/client.key # skip_insecure_verify: false schema: "$[[SETUP_SCHEME]]" - hosts: # receiver endpoint, fallback in order - - "$[[SETUP_ENDPOINT]]" + # receiver endpoint, fallback in order + hosts: $[[SETUP_HOSTS]] valid_status_code: [200,201] #panic on other status code \ No newline at end of file diff --git a/plugin/setup/setup.go b/plugin/setup/setup.go index 05b827bd..17ef33ef 100644 --- a/plugin/setup/setup.go +++ b/plugin/setup/setup.go @@ -136,11 +136,12 @@ func (module *Module) Stop() error { type SetupRequest struct { Cluster struct { - Host string `json:"host"` - Schema string `json:"schema"` - Endpoint string `json:"endpoint"` - Username string `json:"username"` - Password string `json:"password"` + Host string `json:"host"` + Schema string `json:"schema"` + Endpoint string `json:"endpoint"` + Username string `json:"username"` + Password string `json:"password"` + Hosts []string `json:"hosts"` } `json:"cluster"` Skip bool `json:"skip"` @@ -796,8 +797,19 @@ func (module *Module) initializeTemplate(w http.ResponseWriter, r *http.Request, return w.Write([]byte(request.Cluster.Password)) case "SETUP_SCHEME": return w.Write([]byte(strings.Split(request.Cluster.Endpoint, "://")[0])) - case "SETUP_ENDPOINT": - return w.Write([]byte(strings.Split(request.Cluster.Endpoint, "://")[1])) + case "SETUP_ENDPOINTS": + endpoints := []string{request.Cluster.Endpoint} + for _, host := range request.Cluster.Hosts { + endpoint := fmt.Sprintf("%s://%s", request.Cluster.Schema, host) + if !util.StringInArray(endpoints, endpoint) { + endpoints = append(endpoints, endpoint) + } + } + endpointsStr := fmt.Sprintf("[%s]", strings.Join(endpoints, ", ")) + return w.Write([]byte(endpointsStr)) + case "SETUP_HOSTS": + hostsStr := fmt.Sprintf("[%s]", strings.Join(request.Cluster.Hosts, ", ")) + return w.Write([]byte(hostsStr)) case "SETUP_TEMPLATE_NAME": return w.Write([]byte(cfg1.TemplateName)) case "SETUP_INDEX_PREFIX": diff --git a/web/src/pages/Guide/Initialization/components/Configuration/index.js b/web/src/pages/Guide/Initialization/components/Configuration/index.js index eba20d29..75ec2a08 100644 --- a/web/src/pages/Guide/Initialization/components/Configuration/index.js +++ b/web/src/pages/Guide/Initialization/components/Configuration/index.js @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import { Alert, Button, Form, Icon, Input, Switch } from 'antd'; +import { Alert, Button, Form, Icon, Input, Switch, Select } from 'antd'; import request from '@/utils/request'; import { formatMessage } from "umi/locale"; import TrimSpaceInput from '@/components/TrimSpaceInput'; @@ -49,9 +49,9 @@ export default ({ onNext, form, formData, onFormDataChange }) => { setTestLoading(true); setTestStatus(); setTestError(); - const { host, isTLS, isAuth, username, password } = values; + const { hosts, isTLS, isAuth, username, password } = values; const body = { - host: host.trim(), + hosts: (hosts || []).map(host=>host.trim()), schema: isTLS === true ? "https" : "http", } if (isAuth) { @@ -104,32 +104,41 @@ export default ({ onNext, form, formData, onFormDataChange }) => { const onFormDataSave = () => { const values = form.getFieldsValue(); - const { host, isAuth, username, password } = form.getFieldsValue(); + const { hosts, isAuth, username, password } = values; onFormDataChange({ - host: host.trim(), isAuth, username, password + hosts: (hosts || []).map(host=>host.trim()), + isAuth, username, password }) onNext(); } + const validateHostsRule = (rule, value, callback) => { + let vals = value || []; + for(let i = 0; i < vals.length; i++) { + if (!/^[\w\.\-_~%]+(\:\d+)?$/.test(vals[i])) { + return callback(formatMessage({ id: 'guide.cluster.host.validate'})); + } + } + // validation passed + callback(); + }; const { getFieldDecorator } = form; return (