From febec304e5554943c42df5807a1e4865dc60849d Mon Sep 17 00:00:00 2001 From: Sowmya Nethi Date: Fri, 26 Sep 2025 15:45:17 +0530 Subject: [PATCH] feat: Add enable/disable action for load balancer member and display provisioning/operating status Change-Id: I83b8b531363aec94634254b35b4ac3b87bd2e8e6 Signed-off-by: Sowmya Nethi --- .../Detail/Member/Actions/DisableMember.jsx | 52 +++++++++++++++++++ .../Detail/Member/Actions/EnableMember.jsx | 52 +++++++++++++++++++ .../Listener/Detail/Member/Actions/index.jsx | 14 +++++ .../Listener/Detail/Member/index.jsx | 20 ++++++- 4 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 src/pages/network/containers/LoadBalancers/Listener/Detail/Member/Actions/DisableMember.jsx create mode 100644 src/pages/network/containers/LoadBalancers/Listener/Detail/Member/Actions/EnableMember.jsx diff --git a/src/pages/network/containers/LoadBalancers/Listener/Detail/Member/Actions/DisableMember.jsx b/src/pages/network/containers/LoadBalancers/Listener/Detail/Member/Actions/DisableMember.jsx new file mode 100644 index 00000000..1d8ca4c6 --- /dev/null +++ b/src/pages/network/containers/LoadBalancers/Listener/Detail/Member/Actions/DisableMember.jsx @@ -0,0 +1,52 @@ +import { ConfirmAction } from 'containers/Action'; +import globalPoolMemberStore from 'stores/octavia/pool-member'; + +export default class DisableAction extends ConfirmAction { + get id() { + return 'disable'; + } + + get title() { + return t('Disable Member'); + } + + get isDanger() { + return false; + } + + get buttonText() { + return t('Disable'); + } + + get actionName() { + return t('disable member'); + } + + policy = 'os_load-balancer_api:member:put'; + + allowedCheckFunc = (item) => { + if (!item) return true; + return ( + this.isOwnerOrAdmin(item) && + item.provisioning_status === 'ACTIVE' && + item.admin_state_up + ); + }; + + isOwnerOrAdmin() { + return true; + } + + onSubmit = (values) => { + const { default_pool_id } = this.containerProps.detail; + const { id } = values; + const data = { + admin_state_up: false, + }; + return globalPoolMemberStore.update({ + member_id: id, + default_pool_id, + data, + }); + }; +} diff --git a/src/pages/network/containers/LoadBalancers/Listener/Detail/Member/Actions/EnableMember.jsx b/src/pages/network/containers/LoadBalancers/Listener/Detail/Member/Actions/EnableMember.jsx new file mode 100644 index 00000000..b224907b --- /dev/null +++ b/src/pages/network/containers/LoadBalancers/Listener/Detail/Member/Actions/EnableMember.jsx @@ -0,0 +1,52 @@ +import { ConfirmAction } from 'containers/Action'; +import globalPoolMemberStore from 'stores/octavia/pool-member'; + +export default class EnableAction extends ConfirmAction { + get id() { + return 'enable'; + } + + get title() { + return t('Enable Member'); + } + + get isDanger() { + return false; + } + + get buttonText() { + return t('Enable'); + } + + get actionName() { + return t('enable member'); + } + + policy = 'os_load-balancer_api:member:put'; + + allowedCheckFunc = (item) => { + if (!item) return true; + return ( + this.isOwnerOrAdmin(item) && + item.provisioning_status === 'ACTIVE' && + item.admin_state_up === false + ); + }; + + isOwnerOrAdmin() { + return true; + } + + onSubmit = (values) => { + const { default_pool_id } = this.containerProps.detail; + const { id } = values; + const data = { + admin_state_up: true, + }; + return globalPoolMemberStore.update({ + member_id: id, + default_pool_id, + data, + }); + }; +} diff --git a/src/pages/network/containers/LoadBalancers/Listener/Detail/Member/Actions/index.jsx b/src/pages/network/containers/LoadBalancers/Listener/Detail/Member/Actions/index.jsx index c6d41791..e0577ee4 100644 --- a/src/pages/network/containers/LoadBalancers/Listener/Detail/Member/Actions/index.jsx +++ b/src/pages/network/containers/LoadBalancers/Listener/Detail/Member/Actions/index.jsx @@ -13,6 +13,8 @@ // limitations under the License. import DeleteAction from './DeleteMember'; +import DisableAction from './DisableMember'; +import EnableAction from './EnableMember'; import CreateAction from './CreateMember'; import Edit from './EditMember'; @@ -23,6 +25,12 @@ export const actionConfigs = { { action: DeleteAction, }, + { + action: DisableAction, + }, + { + action: EnableAction, + }, ], }, batchActions: [ @@ -37,6 +45,12 @@ export const adminActions = { { action: DeleteAction, }, + { + action: DisableAction, + }, + { + action: EnableAction, + }, ], }, batchActions: [], diff --git a/src/pages/network/containers/LoadBalancers/Listener/Detail/Member/index.jsx b/src/pages/network/containers/LoadBalancers/Listener/Detail/Member/index.jsx index 0620bf2d..90001079 100644 --- a/src/pages/network/containers/LoadBalancers/Listener/Detail/Member/index.jsx +++ b/src/pages/network/containers/LoadBalancers/Listener/Detail/Member/index.jsx @@ -14,7 +14,10 @@ import { observer, inject } from 'mobx-react'; import Base from 'containers/List'; -import { provisioningStatusCodes } from 'resources/octavia/lb'; +import { + provisioningStatusCodes, + operatingStatusCodes, +} from 'resources/octavia/lb'; import globalPoolMemberStore from 'stores/octavia/pool-member'; import { idNameColumn } from 'utils/table'; import { actionConfigs, adminActions } from './Actions'; @@ -63,11 +66,24 @@ export class Members extends Base { getColumns = () => [ idNameColumn, { - title: t('Status'), + title: t('Provisioning Status'), dataIndex: 'provisioning_status', valueMap: provisioningStatusCodes, isHideable: true, }, + { + title: t('Operating Status'), + dataIndex: 'operating_status', + valueMap: operatingStatusCodes, + isHideable: true, + }, + { + title: t('Admin State Up'), + dataIndex: 'admin_state_up', + render: (value) => (value ? t('On') : t('Off')), + isStatus: false, + isHideable: true, + }, { title: t('Ip Address'), dataIndex: 'address',