Projects
Eulaceura:Factory
aops-hermes
_service:obs_scm:012-file-conf-sync-property-op...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:obs_scm:012-file-conf-sync-property-optimize.patch of Package aops-hermes
From 9f948901dcd91cea1d3c1a0137f2149cf47779c7 Mon Sep 17 00:00:00 2001 From: chonglim <chonglim@isoftstone.com> Date: Mon, 19 Feb 2024 14:22:50 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96=E9=9C=80=E6=B1=82=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E6=94=B9=E9=80=A0=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/configuration.js | 35 ++- src/views/assests/HostGroupManagement.vue | 16 +- .../TranscationDomainConfigurations.vue | 28 +- .../configuration/TranscationDomainDetail.vue | 252 +++++------------- .../TranscationDomainManagement.vue | 6 +- .../components/AddHostDrawer.vue | 68 ++--- .../components/AddTranscationDomainModal.vue | 15 +- .../components/GetDomainStatusDrawer.vue | 56 ++-- .../components/QueryRealConfsDrawer.vue | 4 +- 9 files changed, 194 insertions(+), 286 deletions(-) diff --git a/src/api/configuration.js b/src/api/configuration.js index d8f8b73..0f9c5ef 100644 --- a/src/api/configuration.js +++ b/src/api/configuration.js @@ -10,8 +10,10 @@ const api = { addHost: '/host/addHost', // 添加业务域主机 domainStatus: '/confs/getDomainStatus', // 获取业务域主机同步状态 syncConf: '/confs/syncConf', // 获取业务域主机同步状态 + batchSyncConf: '/confs/batch/syncConf', // 将当前业务域的配置批量同步到各主机 queryRealConfs: '/confs/queryRealConfs', // 获取主机当前配置 - queryExpectedConfs: '/confs/queryExpectedConfs' // 获取主机配置日志 + queryExpectedConfs: '/confs/queryExpectedConfs', // 获取主机配置日志 + queryHostAndStatus: '/manage/host/sync/status/get' // 获取业务域下的主机及其同步状态 }; export default api; @@ -48,12 +50,13 @@ export function addHost(domainName, hostInfos, ...parameter) { }); } // 获取业务域主机同步状态 -export function domainStatus({domainName, ...parameter}) { +export function domainStatus(domainName, hostIp) { return request({ url: api.domainStatus, method: 'post', data: { - domainName + domainName: domainName, + ip: hostIp } }); } @@ -100,7 +103,8 @@ export function syncConf(parameter) { data: { domainName: parameter.domainName, syncList: parameter.syncList - } + }, + timeout: 900000 }); } // 获取主机当前配置 @@ -126,3 +130,26 @@ export function queryExpectedConfs(domainName, hostIds, ...parameter) { } }); } + +// 获取业务域下的主机及其同步状态 +export function queryHostAndStatus(domainName) { + return request({ + url: api.queryHostAndStatus, + method: 'post', + data: { + domain_name: domainName + } + }); +} + +// 将当前业务域的配置批量同步到各主机 +export function batchSyncConf(domainName, hostIds) { + return request({ + url: api.batchSyncConf, + method: 'put', + data: { + domainName: domainName, + hostIds: hostIds + } + }); +} diff --git a/src/views/assests/HostGroupManagement.vue b/src/views/assests/HostGroupManagement.vue index 64d622f..e2c40c1 100644 --- a/src/views/assests/HostGroupManagement.vue +++ b/src/views/assests/HostGroupManagement.vue @@ -48,8 +48,7 @@ @change="handleTableChange" :loading="tableIsLoading" :expandIconColumnIndex="0" - @expend="aleret(1)" - > + @expend="aleret(1)"> <span slot="action" slot-scope="record"> <!------后续增加----- <span>编辑</span> @@ -66,15 +65,13 @@ placement="right" :visible="hostListVisible" :body-style="{paddingBottom: '80px'}" - @close="closeHostList" - > + @close="closeHostList"> <a-table :rowKey="hostRowKey" :columns="hostListColumns" :data-source="this.hostListDataStore[this.hostGroupName] || []" :loading="hostListIsLoading ? true : false" - :pagination="false" - > + :pagination="false"> <span slot="isManagement" slot-scope="isMana">{{ isMana ? '是' : '否' }}</span> </a-table> </a-drawer> @@ -112,7 +109,7 @@ const hostListColumns = [ { dataIndex: 'ssh_port', key: 'ssh_port', - title: 'SSH登录接口' + title: 'SSH登录端口' }, { dataIndex: 'management', @@ -404,6 +401,11 @@ export default { </script> <style lang="less" scoped> +.aops-theme { + .hostgroupbox { + overflow: auto; + } +} .ant-lert { line-height: 14px; } diff --git a/src/views/configuration/TranscationDomainConfigurations.vue b/src/views/configuration/TranscationDomainConfigurations.vue index 68a3a48..b5a8469 100644 --- a/src/views/configuration/TranscationDomainConfigurations.vue +++ b/src/views/configuration/TranscationDomainConfigurations.vue @@ -37,27 +37,25 @@ :pagination="pagination" :row-selection="rowSelection" @change="handleTableChange" - :loading="tableIsLoading" - > + :loading="tableIsLoading"> <span slot="contents" slot-scope="record"> <div class="oneRow">{{ record.contents }}</div> </span> <span slot="action" slot-scope="record"> - <a @click="showConfigContent(record)">查看配置文件</a> + <a @click="showConfigContent(record)">查看详情</a> <a-divider type="vertical" /> - <a @click="showConfigChange(record)">配置变更日志</a> - <a-divider type="vertical" /> - <a @click="showEditDrawer(record)">编辑配置</a> + <a @click="showEditDrawer(record)">编辑</a> <a-divider type="vertical" /> <a-popconfirm - title="你确定删除这行配置吗?" + title="您确定删除该行配置吗?" ok-text="确认" cancel-text="取消" - @confirm="deleteConfig(record)" - > + @confirm="deleteConfig(record)"> <a-icon slot="icon" type="close-circle" style="color: red" /> <a>删除</a> </a-popconfirm> + <a-divider type="vertical" /> + <a @click="showConfigChange(record)">变更日志</a> </span> </a-table> <a-drawer @@ -66,8 +64,7 @@ placement="right" :visible="configContentVisible" :body-style="{paddingBottom: '80px'}" - @close="closeConfigContent" - > + @close="closeConfigContent"> <a-descriptions :column="1" layout="horizontal"> <a-descriptions-item label="配置文件"> {{ configContent.filePath }} @@ -87,8 +84,7 @@ placement="right" :visible="configChangeVisible" :body-style="{paddingBottom: '80px'}" - @close="closeConfigChange" - > + @close="closeConfigChange"> <a-spin :spinning="logIsLoading"> <a-descriptions :column="1" layout="horizontal"> <a-descriptions-item label="所属业务域"> @@ -112,8 +108,7 @@ :expandIconColumnIndex="4" :expandIcon="(props) => this.customExpandIcon(props)" :pagination="false" - bordered - > + bordered> <div slot="expandedRowRender" slot-scope="record" style="margin: 0"> <p>preValue:</p> {{ record.preValue }} @@ -134,8 +129,7 @@ :domainName="domainName" :editFilePath="editFilePath" @ok="onEditConfsOk" - @cancel="onEditConfsCancel" - /> + @cancel="onEditConfsCancel" /> </page-header-wrapper> </template> diff --git a/src/views/configuration/TranscationDomainDetail.vue b/src/views/configuration/TranscationDomainDetail.vue index 1136c08..e460ad2 100644 --- a/src/views/configuration/TranscationDomainDetail.vue +++ b/src/views/configuration/TranscationDomainDetail.vue @@ -28,25 +28,6 @@ <a-col> <a-button @click="handleRefresh"> <a-icon type="redo" />刷新 </a-button> </a-col> - <!--------暂时没有其他功能-------- - <a-col> - <a-button> - <a-dropdown> - <a class="ant-dropdown-link" @click="e => e.preventDefault()"> - 更多操作 <a-icon type="down" /> - </a> - <a-menu slot="overlay"> - <a-menu-item> - <a>查看主机</a> - </a-menu-item> - <a-menu-item> - <a>添加主机</a> - </a-menu-item> - </a-menu> - </a-dropdown> - </a-button> - </a-col> - --------------------------------> </a-row> </a-col> </a-row> @@ -56,68 +37,18 @@ :data-source="tableData" :row-selection="rowSelection" :loading="tableIsLoading" - :pagination="false" - > - <!------------暂不做同步--------------- - <span slot="filterIcon"> - 同步状态 - <a-icon type="reload" @click="refreshDomainStatus()"/> - </span> - -------------------------------------> - <template slot="syncStatus" slot-scope="statusInfo"> - <div v-if="domainStatusIsLoading"> - <a-icon type="loading" /> - </div> - <div v-else> - <a-icon - v-if="statusInfo.syncStatus === statusEnum.sync" - type="check-circle" - theme="twoTone" - two-tone-color="#52c41a" - /> - <a-icon - v-if="statusInfo.syncStatus === statusEnum.notSync" - type="close-circle" - theme="twoTone" - two-tone-color="#f00" - /> - <a-icon - v-if="statusInfo.syncStatus === statusEnum.notFound" - type="question-circle" - theme="twoTone" - two-tone-color="#ccc" - /> - {{ statusTitleEnum[statusInfo.syncStatus] }} - <span v-if="statusInfo.syncStatus === statusEnum.notSync">{{ `${statusInfo.count}条` }}</span> - </div> - </template> + :pagination="false"> <span slot="action" slot-scope="record"> <a @click="showQueryRealConfsDrawer(record)">当前配置</a> <a-divider type="vertical" /> - <!---- 只是没有这个功能--------- - <a @click="showQueryExpectConfsDrawer(record)">配置日志</a> - <a-divider type="vertical" /> - -----------------------------> <a @click="showDomainStatusDrawer(record)">状态详情</a> <a-divider type="vertical" /> - <!-----------暂时不做同步功能---------- - <a-popconfirm - title="你确定要将当前业务域的配置同步到这台主机吗?" - ok-text="确认" - cancel-text="取消" - @confirm="handleOneHostSyncConf(record)" - > - <a href="#">同步</a> - </a-popconfirm> - <a-divider type="vertical" /> - -------------------------------------> <a-popconfirm - title="你确定要从当前业务域中删除这台主机吗?" + title="您确定要从当前业务域中删除这台主机吗?" ok-text="确认" cancel-text="取消" - @confirm="deleteDomainHost(record)" - > - <a>删除</a> + @confirm="deleteDomainHost(record)"> + <a>删除</a> </a-popconfirm> </span> </a-table> @@ -140,15 +71,11 @@ title="状态详情" ref="domainStatusDrawer" :hasButtonOnBottom="false" - :bodyStyle="{paddingBottom: '80px'}" - > + :bodyStyle="{paddingBottom: '80px'}"> <template slot="drawerView"> <get-domain-status-drawer - :tableData="tableData" :domainStatusIsLoading="domainStatusIsLoading" - :domainName="domainName" - @getDomainStatus="getDomainStatus" - /> + :domainName="domainName"/> </template> </drawer-view> </my-page-header-wrapper> @@ -157,7 +84,7 @@ <script> import MyPageHeaderWrapper from '@/views/utils/MyPageHeaderWrapper'; -import {domainHostList, deleteHost, domainStatus, syncConf} from '@/api/configuration'; +import {deleteHost, queryHostAndStatus, batchSyncConf} from '@/api/configuration'; import {getManagementConf} from '@/api/management'; import DrawerView from '@/views/utils/DrawerView'; @@ -167,12 +94,11 @@ import GetDomainStatusDrawer from '@/views/configuration/components/GetDomainSta import AddHostDrawer from '@/views/configuration/components/AddHostDrawer'; import defaultSettings from '@/config/defaultSettings'; -import {STATUS_ENUM, getStatusInfoFromAllConfs} from './utils/statusCheckTools'; const STATUS_TITLE_ENUM = {}; -STATUS_TITLE_ENUM[STATUS_ENUM.sync] = '已同步'; -STATUS_TITLE_ENUM[STATUS_ENUM.notSync] = '未同步'; -STATUS_TITLE_ENUM[STATUS_ENUM.notFound] = '未知状态'; +STATUS_TITLE_ENUM[0] = '未同步'; +STATUS_TITLE_ENUM[1] = '已同步'; +STATUS_TITLE_ENUM[2] = '未知状态'; export default { name: 'TranscationDomainDetail', @@ -186,17 +112,13 @@ export default { }, data() { return { - rowKey: 'hostId', + rowKey: 'host_id', hostList: [], - statusData: [], selectedRowKeys: [], selectedRows: [], tableIsLoading: false, domainName: this.$route.params.domainName, - statusEnum: STATUS_ENUM, - statusTitleEnum: STATUS_TITLE_ENUM, domainStatusIsLoading: false, - hostStatusData: {a: 1}, confsOfDomain: [], confsOfDomainLoading: false, setTimeoutKey_statusInterval: undefined @@ -206,24 +128,19 @@ export default { columns() { return [ { - dataIndex: 'ip', - key: 'ip', + dataIndex: 'host_ip', + key: 'host_ip', title: 'IP地址' }, { - dataIndex: 'ipv6', - key: 'ipv6', + dataIndex: 'ipv4', + key: 'ipv4', title: 'IP协议' }, { - dataIndex: 'syncStatusInfo', - key: 'syncStatusInfo', - title: '同步状态', - filterMultiple: false, - slots: { - // title: 'filterIcon' 暂不做同步 - }, - scopedSlots: {customRender: 'syncStatus'} + dataIndex: 'sync_status', + key: 'sync_status', + title: '同步状态' }, { key: 'operation', @@ -240,11 +157,9 @@ export default { }, tableData() { return this.hostList.map((host) => { - const hostTemp = host; - const matchedStatusHost = this.statusData.filter((item) => item.hostId === hostTemp.hostId)[0] || {}; - hostTemp.syncStatusList = matchedStatusHost.syncStatus || []; - hostTemp.syncStatusInfo = getStatusInfoFromAllConfs(hostTemp.syncStatusList); - return hostTemp; + host.ipv4 = 'ipv4' + host.sync_status = STATUS_TITLE_ENUM[host.sync_status] + return host; }); } }, @@ -253,46 +168,22 @@ export default { this.selectedRowKeys = selectedRowKeys; this.selectedRows = selectedRows; }, - // 获取业务域列表数据 - getHostList(domainName) { + queryHostAndStatus(domainName) { const _this = this; - return new Promise(function (resolve, reject) { - _this.tableIsLoading = true; - domainHostList(domainName) - .then(function (res) { - _this.hostList = res; - resolve(res); - }) - .catch(function (err) { - if (err.response.data.code !== 400) { - _this.$message.error(err.response.message || err.response.data.detail); - } else { - _this.hostList = []; - } - reject(err); - }) - .finally(function () { - _this.tableIsLoading = false; - }); - }); - }, - // 获取业务域主机同步状态 - getDomainStatus() { - const _this = this; - this.domainStatusIsLoading = true; - domainStatus({ - domainName: _this.domainName - }) + _this.tableIsLoading = true; + queryHostAndStatus(domainName) .then(function (res) { - _this.statusData = res.hostStatus || []; + _this.hostList = res.data || []; }) .catch(function (err) { - if (err.response.code !== '404') { + if (err.response.data.code !== 400) { _this.$message.error(err.response.message || err.response.data.detail); + } else { + _this.hostList = []; } }) .finally(function () { - _this.domainStatusIsLoading = false; + _this.tableIsLoading = false; }); }, handleRefresh() { @@ -314,36 +205,38 @@ export default { content: () => selectedRows.map((row) => ( <p> - <span>{row.ip}</span> + <span>{row.host_ip}</span> </p> )), icon: () => <a-icon type="exclamation-circle" />, okType: 'danger', okText: '删除', onOk: function () { - return _this.handleDelete(selectedRows, true); + return _this.handleDelete(selectedRows); }, onCancel() {} }); }, - handleDelete(hostInfos, isBash) { + handleDelete(hostInfos) { const _this = this; return new Promise((resolve, reject) => { + hostInfos.map((hostInfo) => { + hostInfo.hostId = hostInfo.host_id; + return hostInfo; + }); deleteHost({ domainName: _this.domainName, hostInfos: hostInfos }) .then((res) => { - _this.$message.success(res.message); + _this.$message.success(res.msg); _this.getHostAndStatus(); - if (isBash) { - _this.selectedRowKeys = []; - _this.selectedRows = []; - } + _this.selectedRowKeys = []; + _this.selectedRows = []; resolve(); }) .catch((err) => { - _this.$message.error(err.response.nsg); + _this.$message.error(err.response.message || err.response.data.detail || err.message); reject(err); }); }); @@ -353,49 +246,31 @@ export default { this.$confirm({ title: ( <div> - <p>你确定要将当前业务域的配置同步到已选主机吗?</p> + <p>您确定要将当前业务域的配置同步到已选主机吗?</p> </div> ), - content: <span>同步后将配置无法恢复,但可从配置日志中查看记录,你还要继续吗?</span>, + content: <span>同步后将配置无法恢复,但可从配置日志中查看记录,您还要继续吗?</span>, icon: () => <a-icon type="exclamation-circle" />, okType: 'danger', okText: '继续同步', onOk: function () { - return _this.handleSyncConf(selectedRows, true); + return _this.handleSyncConf(selectedRows); }, onCancel() {} }); }, - handleOneHostSyncConf(record) { - const rows = []; - rows.push(record); - this.handleSyncConf(rows, true); - }, - handleSyncConf(selectedRows, isBash) { - const syncList = []; + handleSyncConf(selectedRows) { + const hostIds = []; selectedRows.forEach(function (item) { - const syncConfigs = []; - item.syncStatusList.forEach((val) => { - if (val.isSynced === 'NOT SYNCHRONIZE') { - syncConfigs.push(val.file_path); - } - }); - const host = { - hostId: item.hostId, - syncConfigs: syncConfigs - }; - syncList.push(host); + hostIds.push(item.host_id); }); const _this = this; return new Promise((resolve, reject) => { - syncConf({ - domainName: _this.domainName, - syncList: syncList - }) + batchSyncConf(_this.domainName, hostIds) .then((res) => { let msg = ''; for (const item of res) { - const hostId = item.hostId; + const hostId = item.host_id; let success = ''; let fail = ''; const syncResult = item.syncResult; @@ -422,10 +297,8 @@ export default { _this.$message.success(msg); } _this.getHostAndStatus(); - if (isBash) { - _this.selectedRowKeys = []; - _this.selectedRows = []; - } + _this.selectedRowKeys = []; + _this.selectedRows = []; resolve(); }) .catch((err) => { @@ -438,14 +311,13 @@ export default { this.$refs.addHostDrawer.open(this.domainName); }, showQueryRealConfsDrawer(host) { + host.hostId = host.host_id + host.ip = host.host_ip this.$refs.queryRealConfsDrawer.open({ host, domainName: this.domainName }); }, - showQueryExpectConfsDrawer(record) { - this.$refs.queryExpectConfsDrawer.open(record); - }, showDomainStatusDrawer(record) { this.$refs.domainStatusDrawer.open(record); }, @@ -470,18 +342,28 @@ export default { }, getHostAndStatus() { const _this = this; - this.getHostList(this.domainName) - .then(function () { - _this.getDomainStatus(); + const domainName = this.domainName; + _this.tableIsLoading = true; + queryHostAndStatus(domainName) + .then(function (res) { + _this.hostList = res.data || []; // 启动循环更新Status clearInterval(_this.setTimeoutKey_statusInterval); _this.setTimeoutKey_statusInterval = setInterval(function () { - _this.getDomainStatus(); + _this.queryHostAndStatus(domainName); }, defaultSettings.domainStatusRefreshInterval); }) - .catch(function () { + .catch(function (err) { + if (err.response.data.code !== 400) { + _this.$message.error(err.response.message || err.response.data.detail); + } else { + _this.hostList = []; + } // 获取host出错(为空或报错,则清除轮训) clearInterval(_this.setTimeoutKey_statusInterval); + }) + .finally(function () { + _this.tableIsLoading = false; }); } }, diff --git a/src/views/configuration/TranscationDomainManagement.vue b/src/views/configuration/TranscationDomainManagement.vue index a3eb997..db51c0c 100644 --- a/src/views/configuration/TranscationDomainManagement.vue +++ b/src/views/configuration/TranscationDomainManagement.vue @@ -150,7 +150,7 @@ export default { this.$confirm({ title: ( <div> - <p>你确定要删除这个业务域吗?</p> + <p>您确定要删除这个业务域吗?</p> </div> ), content: <span>删除后业务域无法恢复</span>, @@ -172,12 +172,12 @@ export default { domainNameArray }) .then((res) => { - _this.$message.success(res.message); + _this.$message.success(res.msg); _this.getDomainList(); resolve(); }) .catch((err) => { - _this.$message.error(err.response.message); + _this.$message.error(err.response.message || err.message); reject(err); }); }); diff --git a/src/views/configuration/components/AddHostDrawer.vue b/src/views/configuration/components/AddHostDrawer.vue index f702809..9981acc 100644 --- a/src/views/configuration/components/AddHostDrawer.vue +++ b/src/views/configuration/components/AddHostDrawer.vue @@ -1,45 +1,27 @@ <!-- eslint-disable vue/max-attributes-per-line --> <template> - <a-form - :form="form" - :label-col="{span: 5}" - :wrapper-col="{span: 12}" - :confirm-loading="isLoading" - @submit="handleSubmit" - > - <a-form-item label="归属业务域"> - <a-input - :disabled="true" - v-decorator="['domainName', {rules: [{required: true, message: '请填写归属业务域!'}]}]" - /> + <a-form :form="form" :confirm-loading="isLoading" @submit="handleSubmit"> + <a-form-item label="归属业务域" :label-col="{span: 4}" :wrapper-col="{span: 12}"> + <a-input :disabled="true" v-decorator="['domainName', {rules: [{required: true, message: '请填写归属业务域!'}]}]" /> </a-form-item> - <a-form-item label="选择要添加的主机"> </a-form-item> + <a-form-item label="选择要添加的主机:"> </a-form-item> <div> - <a-transfer - :rowKey="(host) => host.host_id" - :data-source="hostListTransfer" - :target-keys="targetKeys" - :show-search="showSearch" - :filter-option="(inputValue, item) => item.host_name.indexOf(inputValue) !== -1" - :show-select-all="false" - @change="onChange" - > - <template - slot="children" - slot-scope="{ + <a-transfer :rowKey="(host) => host.host_id" + :data-source="hostListTransfer" + :target-keys="targetKeys" + :show-search="showSearch" + :filter-option="(inputValue, item) => item.host_name.indexOf(inputValue) !== -1 || item.host_ip.indexOf(inputValue) !== -1" + :show-select-all="false" @change="onChange"> + <template slot="children" slot-scope="{ props: {direction, filteredItems, selectedKeys, disabled: listDisabled}, on: {itemSelectAll, itemSelect} - }" - > - <a-table - :row-key="rowKey" - :row-selection="getRowSelection({disabled: listDisabled, selectedKeys, itemSelectAll, itemSelect})" - :columns="direction === 'left' ? leftColumns : rightColumns" - :data-source="filteredItems" - size="small" - :style="{pointerEvents: listDisabled ? 'none' : null}" - :custom-row=" - ({key, disabled: itemDisabled}) => ({ + }"> + <a-table :row-key="rowKey" + :row-selection="getRowSelection({disabled: listDisabled, selectedKeys, itemSelectAll, itemSelect})" + :columns="direction === 'left' ? leftColumns : rightColumns" + :data-source="filteredItems" size="small" + :style="{pointerEvents: listDisabled ? 'none' : null}" + :custom-row="({key, disabled: itemDisabled}) => ({ on: { click: () => { if (itemDisabled || listDisabled) return; @@ -47,8 +29,7 @@ } } }) - " - /> + " /> </template> </a-transfer> </div> @@ -144,7 +125,7 @@ export default { }) .catch(function (err) { // code == 400时,为域内未添加主机,不报错 - if (err.response.code !== '400') { + if (err.response.code !== '400' && err.response.code !== undefined) { _this.$message.error(err.response.message || err.response.data.detail); } }) @@ -178,13 +159,13 @@ export default { }); addHost(values.domainName, hostInfos) .then(function (res) { - _this.$message.success(res.message); + _this.$message.success(res.msg); _this.form.resetFields(); _this.close(); _this.$emit('addHostSuccess'); }) .catch(function (err) { - _this.$message.error(err.response.message); + _this.$message.error(err.response.message || err.message); }) .finally(function () { _this.isLoading = false; @@ -229,3 +210,8 @@ export default { } }; </script> +<style> +.ant-form-item-label { + text-align: left; +} +</style> diff --git a/src/views/configuration/components/AddTranscationDomainModal.vue b/src/views/configuration/components/AddTranscationDomainModal.vue index f19557c..2f29133 100644 --- a/src/views/configuration/components/AddTranscationDomainModal.vue +++ b/src/views/configuration/components/AddTranscationDomainModal.vue @@ -1,7 +1,12 @@ <template> <div class="aops-add-domain" @click="showModal"> <a-icon type="plus" /> - <a-modal title="创建业务域" :visible="visible" :confirm-loading="isLoading" @ok="handleOk" @cancel="handleCancel"> + <a-modal + title="创建业务域" + :visible="visible" + :confirm-loading="isLoading" + @ok="handleOk" + @cancel="handleCancel"> <a-form :form="form" :label-col="{span: 5}" :wrapper-col="{span: 16}"> <a-form-item label="业务域名称"> <a-input @@ -10,16 +15,14 @@ v-decorator="[ 'domainName', {rules: [{required: true, message: '请输入业务域名称'}, {validator: checkDomainName}]} - ]" - > + ]"> </a-input> </a-form-item> <a-form-item label="优先级"> <a-input :disabled="true" placeholder="未开放设置" - v-decorator="['priority', {rules: [{required: false, message: '请输入优先级'}]}]" - > + v-decorator="['priority', {rules: [{required: false, message: '请输入优先级'}]}]"> </a-input> </a-form-item> </a-form> @@ -63,7 +66,7 @@ export default { domainInfo.push(values); createDomain(domainInfo) .then(function (res) { - _this.$message.success(res.message); + _this.$message.success(res.msg); _this.onSuccess && _this.onSuccess(); _this.visible = false; _this.form.resetFields(); diff --git a/src/views/configuration/components/GetDomainStatusDrawer.vue b/src/views/configuration/components/GetDomainStatusDrawer.vue index 39383e8..88a5aa3 100644 --- a/src/views/configuration/components/GetDomainStatusDrawer.vue +++ b/src/views/configuration/components/GetDomainStatusDrawer.vue @@ -3,12 +3,12 @@ <a-row type="flex" justify="space-between"> <a-col :span="22"> <div style="float: left; margin-bottom: 10px"> - <span>主机:{{ host.hostId }}</span> - <span class="ip-left">{{ host.ip }}</span> + <span>主机:{{ host.host_id }}</span> + <span class="ip-left">{{ host.host_ip }}</span> </div> <div style="float: right; margin-bottom: 10px"> <a-popconfirm - title="你确定要将当前业务域的配置同步到这台主机吗?" + title="您确定要将当前业务域的配置同步到这台主机吗?" ok-text="确认" cancel-text="取消" @confirm="confirm" @@ -54,12 +54,11 @@ </span> <span slot="action" slot-scope="record"> <a-popconfirm - title="你确定要同步该配置到这台主机吗?" + title="您确定要同步该配置到这台主机吗?" ok-text="确认" cancel-text="取消" @confirm="syncConfigConfirm(record)" - :disabled="record.isSynced !== 'NOT SYNCHRONIZE'" - > + :disabled="record.isSynced !== 'NOT SYNCHRONIZE'"> <a-button type="link" :disabled="record.isSynced !== 'NOT SYNCHRONIZE'">同步</a-button> </a-popconfirm> </span> @@ -71,7 +70,7 @@ <script> import {STATUS_ENUM} from '../utils/statusCheckTools'; -import {syncConf} from '@/api/configuration'; +import {domainStatus, syncConf} from '@/api/configuration'; const STATUS_TITLE_ENUM = {}; STATUS_TITLE_ENUM[STATUS_ENUM.sync] = '已同步'; @@ -102,16 +101,11 @@ export default { } ], statusEnum: STATUS_ENUM, - statusTitleEnum: STATUS_TITLE_ENUM + statusTitleEnum: STATUS_TITLE_ENUM, + statusData: [] }; }, props: { - tableData: { - type: Array, - default: () => { - return []; - } - }, domainStatusIsLoading: { type: Boolean, default: false @@ -123,8 +117,7 @@ export default { }, computed: { syncStatusList() { - const matchedHost = this.tableData.filter((hostInfo) => hostInfo.hostId === this.host.hostId)[0] || {}; - return matchedHost.syncStatusList || []; + return this.statusData; } }, methods: { @@ -141,11 +134,15 @@ export default { cancel(e) {}, syncConf(syncConfigs) { const _this = this; + if (syncConfigs.length === 0) { + _this.$message.error('没有需要同步的配置文件,无需同步!'); + return; + } syncConf({ domainName: this.domainName, syncList: [ { - hostId: this.host.hostId, + hostId: this.host.host_id, syncConfigs: syncConfigs } ] @@ -153,7 +150,7 @@ export default { .then((res) => { let message = ''; for (const item of res) { - const hostId = item.hostId; + const hostId = item.host_id; let success = ''; let fail = ''; const syncResult = item.syncResult; @@ -169,8 +166,7 @@ export default { } else if (success.length !== 0 && fail.length === 0) { message += '主机' + hostId + '\xa0\xa0\xa0' + '同步成功:' + success; } else if (success.length !== 0 && fail.length !== 0) { - message += - '主机' + hostId + '\xa0\xa0\xa0' + '同步成功:' + success + '\xa0\xa0\xa0' + '同步失败:' + fail; + message += '主机' + hostId + '\xa0\xa0\xa0' + '同步成功:' + success + '\xa0\xa0\xa0' + '同步失败:' + fail; } } if (message.includes('同步失败') && message.includes('同步成功')) { @@ -180,7 +176,7 @@ export default { } else { _this.$message.success(message); } - _this.$emit('getDomainStatus'); + _this.getDomainStatus(this.host.host_ip); }) .catch((err) => { _this.$message.error(err.response.message || err.response.data.detail || err.response.data.msg); @@ -190,6 +186,23 @@ export default { const syncConfigs = []; syncConfigs.push(record.file_path); this.syncConf(syncConfigs); + }, + // 获取业务域主机同步状态 + getDomainStatus(hostIp) { + const _this = this; + this.domainStatusIsLoading = true; + domainStatus(_this.domainName, hostIp) + .then(function (res) { + _this.statusData = res.hostStatus[0].syncStatus || []; + }) + .catch(function (err) { + if (err.response.code !== '404' && err.code !== 'ERR_BAD_REQUEST') { + _this.$message.error(err.response.message || err.response.data.detail || err.message); + } + }) + .finally(function () { + _this.domainStatusIsLoading = false; + }); } }, mounted: function () { @@ -197,6 +210,7 @@ export default { this.onload(function (host) { _this.host = host; }); + this.getDomainStatus(_this.host.host_ip); } }; </script> diff --git a/src/views/configuration/components/QueryRealConfsDrawer.vue b/src/views/configuration/components/QueryRealConfsDrawer.vue index 61a91f8..9f9bea2 100644 --- a/src/views/configuration/components/QueryRealConfsDrawer.vue +++ b/src/views/configuration/components/QueryRealConfsDrawer.vue @@ -139,8 +139,8 @@ export default { _this.confsOfHost = (res && res[0] && res[0].confBaseInfos) || []; }) .catch((err) => { - if (err.response.code !== '400') { - _this.$message.error(err.response.message); + if (err.response.code !== '400' && err.code !== 'ERR_BAD_REQUEST') { + _this.$message.error(err.response.message || err.response.data.detail || err.message); } }) .finally(() => { -- 2.38.1.windows.1
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2