skyline/src/pages/network/containers/RbacPolicies/actions/Create.jsx
zhangjingwei 3465a2fb2f feat: update neutron rbac policy
1. update rbac policy list
2. update create rbac policy
3. update edit rbac policy
4. update delete rbac policy
5. update rbac policy detail
6. update i18n

Change-Id: Ie0a03cb819d2905a987eb756044881bcab66dc8e
2024-07-11 15:56:37 +08:00

219 lines
5.5 KiB
JavaScript

// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import { inject, observer } from 'mobx-react';
import { ModalAction } from 'containers/Action';
import { RbacPoliciesStore } from 'src/stores/neutron/rbac-policies';
import { ProjectStore } from 'stores/keystone/project';
import { NetworkStore } from 'stores/neutron/network';
import { QoSPolicyStore } from 'stores/neutron/qos-policy';
import { qosEndpoint } from 'client/client/constants';
import { anyProject } from 'resources/neutron/rbac-policy';
export class Create extends ModalAction {
static id = 'create-policy';
static title = t('Create RBAC Policy');
static policy = 'create_rbac_policy';
get name() {
return t('Create');
}
get messageHasItemName() {
return false;
}
init() {
this.state = {
...this.state,
isReady: false,
allNetworks: [],
qosPolices: [],
};
this.store = new RbacPoliciesStore();
this.projectStore = new ProjectStore();
this.qosPolicyStore = new QoSPolicyStore();
this.networkStore = new NetworkStore();
this.getAllData();
}
async getAllData() {
await Promise.all([
this.getProjects(),
this.getQoSPolicy(),
this.getNetworks(),
]);
this.setState({ isReady: true });
}
get enableQosPolicy() {
return qosEndpoint();
}
async getProjects() {
const allProjects = await this.projectStore.pureFetchList();
allProjects.unshift(anyProject);
this.setState({ allProjects });
}
async getQoSPolicy() {
if (!this.enableQosPolicy) {
return;
}
await this.qosPolicyStore.fetchList();
}
async getNetworks() {
const allNetworks = await this.networkStore.pureFetchList();
this.setState({ allNetworks });
}
get projects() {
const { allProjects } = this.state;
return (allProjects || []).map((it) => ({
value: it.id,
label: it.name,
}));
}
get qosPolicy() {
return (this.qosPolicyStore.list.data || []).map((it) => ({
value: it.id,
label: it.name,
}));
}
get sharedNetworks() {
const { allNetworks } = this.state;
return (allNetworks || [])
.filter((it) => it.shared === true)
.map((it) => ({
value: it.id,
label: it.name,
}));
}
get externalNetworks() {
const { allNetworks } = this.state;
return (allNetworks || [])
.filter((it) => it['router:external'] === true)
.map((it) => ({
value: it.id,
label: it.name,
}));
}
onSubmit = async (values) => {
const { object_type, ...rest } = values;
const action =
object_type === 'network' || object_type === 'qos_policy'
? 'access_as_shared'
: 'access_as_external';
const updatedType =
object_type === 'external-network' ? 'network' : object_type;
const body = {
...rest,
object_type: updatedType,
action,
};
return this.store.create(body);
};
static allowed = () => Promise.resolve(true);
get createObjectList() {
const items = [
{ value: 'network', label: t('Shared Network') },
{ value: 'external-network', label: t('External Network') },
];
if (this.enableQosPolicy) {
items.push({ value: 'qos_policy', label: t('Shared QoS Policy') });
}
return items;
}
onChangeHandler = async (value) => {
this.setState(
{
object_type: value,
},
() => {
this.updateFormValue('object_id', undefined);
}
);
};
get formItems() {
const { object_type } = this.state;
const isNetwork = object_type === 'network';
const isExternalNetwork = object_type === 'external-network';
const isQosPolicy = object_type === 'qos_policy';
return [
{
name: 'target_tenant',
label: t('Target Project'),
placeholder: t('Select a project'),
type: 'select',
options: this.projects,
isLoading: !this.state.isReady,
required: true,
},
{
name: 'object_type',
label: t('Object Type'),
placeholder: t('Select an object type'),
type: 'select',
onChange: this.onChangeHandler,
options: this.createObjectList,
required: true,
},
{
name: 'object_id',
label: t('Shared Network'),
placeholder: t('Select a network'),
type: 'select',
options: this.sharedNetworks,
hidden: !isNetwork,
isLoading: !this.state.isReady,
required: true,
},
{
name: 'object_id',
label: t('External Network'),
placeholder: t('Select a network'),
type: 'select',
options: this.externalNetworks,
hidden: !isExternalNetwork,
isLoading: !this.state.isReady,
required: true,
},
{
name: 'object_id',
label: t('QoS Policy'),
placeholder: t('Select a QoS Policy'),
type: 'select',
options: this.qosPolicy,
hidden: !isQosPolicy,
isLoading: !this.state.isReady,
required: true,
},
];
}
}
export default inject('rootStore')(observer(Create));