diff --git a/.zuul.yaml b/.zuul.yaml index e85a198a..7156d30b 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -212,6 +212,7 @@ - openstack/requirements - openstack/skyline-apiserver - openstack/skyline-console + - opendev.org/openstack/diskimage-builder timeout: 10800 vars: devstack_services: diff --git a/src/components/FormItem/PortRange/index.jsx b/src/components/FormItem/PortRange/index.jsx index cb1cd24b..39bf2e03 100644 --- a/src/components/FormItem/PortRange/index.jsx +++ b/src/components/FormItem/PortRange/index.jsx @@ -33,12 +33,12 @@ export default class index extends Component { placeholder, ...componentProps, }; - const { rules, ...rest } = formItemProps; + const { rules, extra, ...rest } = formItemProps; const newRules = this.getRules(rules); const newFormItemProps = { ...rest, rules: newRules, - extra: portRangeMessage, + extra: extra || portRangeMessage, }; return ( diff --git a/src/components/FormItem/index.jsx b/src/components/FormItem/index.jsx index 33bfa1eb..f3ec7ef1 100644 --- a/src/components/FormItem/index.jsx +++ b/src/components/FormItem/index.jsx @@ -157,6 +157,7 @@ export default class FormItem extends React.Component { checkOptions, checkBoxInfo, allowClear, + ...rest } = this.props; return { options, @@ -171,6 +172,7 @@ export default class FormItem extends React.Component { checkOptions, checkBoxInfo, allowClear, + ...rest, }; } default: { diff --git a/src/locales/en.json b/src/locales/en.json index c3d086df..8b7d57d6 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -689,6 +689,7 @@ "Effective mode after configuration changes": "Effective mode after configuration changes", "Egress": "Egress", "Egypt": "Egypt", + "Eject": "Eject", "El Salvador": "El Salvador", "Email": "Email", "Enable": "Enable", @@ -1546,6 +1547,7 @@ "Project User": "Project User", "Project User Group": "Project User Group", "Projects": "Projects", + "Promote": "Promote", "Properties": "Properties", "Protected": "Protected", "Protocol": "Protocol", diff --git a/src/locales/zh.json b/src/locales/zh.json index 79e95cef..687d6115 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -689,6 +689,7 @@ "Effective mode after configuration changes": "配置变更后的生效模式", "Egress": "出口", "Egypt": "埃及", + "Eject": "删除", "El Salvador": "萨尔瓦多", "Email": "邮箱", "Enable": "启用", @@ -1546,6 +1547,7 @@ "Project User": "项目用户", "Project User Group": "项目用户组", "Projects": "项目", + "Promote": "推动", "Properties": "属性", "Protected": "受保护的", "Protocol": "协议", diff --git a/src/pages/identity/containers/Project/actions/UserGroupManager.jsx b/src/pages/identity/containers/Project/actions/UserGroupManager.jsx index b615eb4a..1e4f157b 100644 --- a/src/pages/identity/containers/Project/actions/UserGroupManager.jsx +++ b/src/pages/identity/containers/Project/actions/UserGroupManager.jsx @@ -25,14 +25,14 @@ export class UserGroupManager extends ModalAction { static title = t('Manage User Group'); - init() { + async init() { const roles = JSON.stringify(this.item.groups); this.state.domainDefault = this.item.domain_id; this.state.groupRoles = JSON.parse(roles); this.userGroupStore = new GroupStore(); this.store = globalRoleStore; + await this.getRoleList(); this.getUserGroup(); - this.getRoleList(); } get name() { @@ -48,7 +48,11 @@ export class UserGroupManager extends ModalAction { } getRoleList() { - this.store.fetchList(); + return new Promise((resolve) => { + this.store.fetchList().finally(() => { + resolve(); + }); + }); } static get modalSize() { diff --git a/src/pages/identity/containers/Project/actions/UserManager.jsx b/src/pages/identity/containers/Project/actions/UserManager.jsx index 3785e342..56dbb275 100644 --- a/src/pages/identity/containers/Project/actions/UserManager.jsx +++ b/src/pages/identity/containers/Project/actions/UserManager.jsx @@ -30,20 +30,20 @@ export class UserManager extends ModalAction { return t('Manager user'); } - init() { + async init() { const projectRole = JSON.stringify(this.item.userMapProjectRoles); this.state.domainDefault = this.item.domain_id; this.state.userRoles = JSON.parse(projectRole); this.store = new RoleStore(); this.domainStore = globalDomainStore; this.userStore = new UserStore(); - this.getRoleList(); + await this.getRoleList(); this.getDomains(); this.getUser(); } getRoleList() { - this.store.fetchList(); + return this.store.fetchList(); } getDomains() { diff --git a/src/pages/identity/containers/User/actions/SystemRole.jsx b/src/pages/identity/containers/User/actions/SystemRole.jsx index 6fefb841..55e6a51d 100644 --- a/src/pages/identity/containers/User/actions/SystemRole.jsx +++ b/src/pages/identity/containers/User/actions/SystemRole.jsx @@ -30,20 +30,20 @@ export class SystemRole extends ModalAction { return t('edit system permission'); } - init() { + async init() { const systemRole = JSON.stringify(this.item.projectMapSystemRole); this.state.domainDefault = this.item.domain_id; this.state.projectRoles = JSON.parse(systemRole); this.store = new RoleStore(); this.domainStore = globalDomainStore; this.userStore = globalUserStore; - this.getRoleList(); + await this.getRoleList(); this.getDomains(); this.getUser(); } getRoleList() { - this.store.fetchList(); + return this.store.fetchList(); } getDomains() { diff --git a/src/pages/monitor/containers/Overview/config.jsx b/src/pages/monitor/containers/Overview/config.jsx index 2664a2e6..95efb16c 100644 --- a/src/pages/monitor/containers/Overview/config.jsx +++ b/src/pages/monitor/containers/Overview/config.jsx @@ -169,7 +169,7 @@ export const physicalNodeRightTopCardList = [ ]; const result = get(responses[0], 'data.result', []); result.forEach((r) => { - const idx = r.metric.adminState === 'enabled' ? 0 : 1; + const idx = r.metric.services_state === 'up' ? 0 : 1; status[idx].value += parseInt(r.value[1], 10); }); return status; diff --git a/src/pages/network/containers/SecurityGroup/Detail/Rule/actions/Create.jsx b/src/pages/network/containers/SecurityGroup/Detail/Rule/actions/Create.jsx index 320d67bb..ffbf8989 100644 --- a/src/pages/network/containers/SecurityGroup/Detail/Rule/actions/Create.jsx +++ b/src/pages/network/containers/SecurityGroup/Detail/Rule/actions/Create.jsx @@ -159,8 +159,14 @@ export default class Create extends ModalAction { }); }; + handleDirectionChange = (direction) => { + this.setState({ + direction, + }); + }; + get formItems() { - const { protocol, portOrRange, remoteType } = this.state; + const { protocol, portOrRange, remoteType, direction } = this.state; const isCustomProtocol = protocol === 'custom_protocol'; const isCustomIcmp = protocol === 'custom_icmp'; const showPortType = ['custom_udp', 'custom_tcp'].includes(protocol); @@ -188,6 +194,7 @@ export default class Create extends ModalAction { { value: 'ingress', label: t('Ingress') }, { value: 'egress', label: t('Egress') }, ], + onChange: this.handleDirectionChange, }, { name: 'ethertype', @@ -212,18 +219,16 @@ export default class Create extends ModalAction { }, { name: 'sourcePort', - label: t('Source Port/Port Range'), + label: + direction === 'egress' + ? t('Destination Port/Port Range') + : t('Source Port/Port Range'), type: 'port-range', required: showSourcePort, - hidden: !showSourcePort || this.state.direction === 'egress', - }, - { - name: 'destination_port', - label: t('Destination Port/Port Range'), - type: 'input', - required: showSourcePort, - help: t('Input destination port or port range(example: 80 or 80:160)'), - hidden: !showSourcePort || this.state.direction === 'ingress', + hidden: !showSourcePort, + extra: + direction === 'egress' && + t('Input destination port or port range(example: 80 or 80:160)'), }, { name: 'ipProtocol', @@ -292,8 +297,6 @@ export default class Create extends ModalAction { const { match: { params: { id } = {} } = {} } = containerProps; const { sourcePort, - destination_port, - direction, protocol, ipProtocol, icmpType, @@ -305,10 +308,7 @@ export default class Create extends ModalAction { const range = ['custom_udp', 'custom_tcp'].includes(protocol) && portOrRange === 'range'; - const ports = - values.direction === 'ingress' - ? sourcePort.split(':') - : destination_port.split(':'); + const ports = sourcePort.split(':'); const newProtocol = protocol !== 'custom_protocol' ? this.defaultRules[protocol].ip_protocol @@ -328,7 +328,6 @@ export default class Create extends ModalAction { ? parseInt(ports[1] || ports[0], 10) : null, protocol: newProtocol, - direction, ...rest, }; if (protocol.includes('all')) { diff --git a/test/e2e/config/config-other.yaml b/test/e2e/config/config-other.yaml index df17b908..2d0c528a 100644 --- a/test/e2e/config/config-other.yaml +++ b/test/e2e/config/config-other.yaml @@ -20,8 +20,8 @@ testFiles: # identity - pages/identity/role.spec.js - pages/identity/domain.spec.js - # - pages/identity/user.spec.js - # - pages/identity/project.spec.js + - pages/identity/user.spec.js + - pages/identity/project.spec.js - pages/identity/user-group.spec.js # configuration - pages/configuration/metadata.spec.js