From bcd93aad0dbf5dee90d8208d30f57e8bc6252095 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Thu, 4 Jun 2020 18:00:30 +0530 Subject: [PATCH 01/24] Enabling Role based Users in Projects --- src/config/section/project.js | 41 +- src/locales/en.json | 16 +- src/views/AutogenView.vue | 14 +- src/views/project/AccountsTab.vue | 48 +- src/views/project/InvitationsTemplate.vue | 11 +- .../project/iam/ProjectRolePermissionTab.vue | 444 ++++++++++++++++++ src/views/project/iam/ProjectRoleTab.vue | 289 ++++++++++++ 7 files changed, 851 insertions(+), 12 deletions(-) create mode 100644 src/views/project/iam/ProjectRolePermissionTab.vue create mode 100644 src/views/project/iam/ProjectRoleTab.vue diff --git a/src/config/section/project.js b/src/config/section/project.js index a0334e7ab..151694c22 100644 --- a/src/config/section/project.js +++ b/src/config/section/project.js @@ -15,6 +15,8 @@ // specific language governing permissions and limitations // under the License. +import store from '@/store' + export default { name: 'project', title: 'label.projects', @@ -23,6 +25,11 @@ export default { resourceType: 'Project', columns: ['name', 'state', 'displaytext', 'account', 'domain'], details: ['name', 'id', 'displaytext', 'projectaccountname', 'vmtotal', 'cputotal', 'memorytotal', 'volumetotal', 'iptotal', 'vpctotal', 'templatetotal', 'primarystoragetotal', 'vmlimit', 'iplimit', 'volumelimit', 'snapshotlimit', 'templatelimit', 'vpclimit', 'cpulimit', 'memorylimit', 'networklimit', 'primarystoragelimit', 'secondarystoragelimit', 'account', 'domain'], + related: [{ + name: 'projectrolepermissions', + title: 'label.project.role.premissions', + param: 'projectid' + }], tabs: [ { name: 'details', @@ -33,6 +40,11 @@ export default { show: (record, route, user) => { return record.account === user.account || ['Admin', 'DomainAdmin'].includes(user.roletype) }, component: () => import('@/views/project/AccountsTab.vue') }, + { + name: 'project.roles', + show: () => { return 'listProjectRoles' in store.getters.apis }, + component: () => import('@/views/project/iam/ProjectRoleTab.vue') + }, { name: 'limits', show: (record, route, user) => { return ['Admin'].includes(user.roletype) }, @@ -91,10 +103,23 @@ export default { }, { api: 'addAccountToProject', - icon: 'user-add', + icon: 'usergroup-add', label: 'Add Account to Project', dataView: true, - args: ['projectid', 'account', 'email'], + args: ['projectid', 'account', 'email', 'projectroleid', 'roletype'], + show: (record, store) => { return record.account === store.userInfo.account || ['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) }, + mapping: { + projectid: { + value: (record) => { return record.id } + } + } + }, + { + api: 'addUserToProject', + icon: 'user-add', + label: 'Add User to Project', + dataView: true, + args: ['projectid', 'userid', 'projectroleid', 'roletype', 'email'], show: (record, store) => { return record.account === store.userInfo.account || ['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) }, mapping: { projectid: { @@ -102,6 +127,18 @@ export default { } } }, + { + api: 'createProjectRole', + icon: 'idcard', + label: 'label.add.project.role', + dataView: true, + args: ['projectid', 'name', 'description'], + mapping: { + projectid: { + value: (record) => { return record.id } + } + } + }, { api: 'deleteProject', icon: 'delete', diff --git a/src/locales/en.json b/src/locales/en.json index 7b039ecdd..36b873d7a 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -320,6 +320,7 @@ "label.add.portable.ip.range": "Add Portable IP Range", "label.add.primary.storage": "Add Primary Storage", "label.add.private.gateway": "Add Private Gateway", +"label.add.project.role": "Add Project Role", "label.add.region": "Add Region", "label.add.resources": "Add Resources", "label.add.role": "Add Role", @@ -563,6 +564,7 @@ "label.create.nfs.secondary.staging.storage": "Create NFS Secondary Staging Store", "label.create.nfs.secondary.staging.store": "Create NFS secondary staging store", "label.create.project": "Create project", +"label.create.project.role": "Create Project Role", "label.create.ssh.key.pair": "Create a SSH Key Pair", "label.create.template": "Create template", "label.create.vpn.connection": "Create VPN Connection", @@ -620,6 +622,7 @@ "label.delete.pa": "Delete Palo Alto", "label.delete.portable.ip.range": "Delete Portable IP Range", "label.delete.project": "Delete project", +"label.delete.project.role": "Delete Project Role", "label.delete.role": "Delete Role", "label.delete.secondary.staging.store": "Delete Secondary Staging Store", "label.delete.srx": "Delete SRX", @@ -634,6 +637,7 @@ "label.deleteprofile": "Delete Profile", "label.deleting.failed": "Deleting Failed", "label.deleting.processing": "Deleting....", +"label.demote.project.owner": "Demote account to Regular role", "label.deny": "Deny", "label.deploymentplanner": "Deployment planner", "label.description": "Description", @@ -728,6 +732,7 @@ "label.edit.lb.rule": "Edit LB rule", "label.edit.network.details": "Edit network details", "label.edit.project.details": "Edit project details", +"label.edit.project.role": "Edit Project Role", "label.edit.region": "Edit Region", "label.edit.role": "Edit Role", "label.edit.rule": "Edit rule", @@ -1216,6 +1221,7 @@ "label.metrics.network.usage": "Network Usage", "label.metrics.network.write": "Write", "label.metrics.num.cpu.cores": "Cores", + "label.migrate.instance.to": "Migrate instance to", "label.migrate.instance.to.host": "Migrate instance to another host", "label.migrate.instance.to.ps": "Migrate instance to another primary storage", @@ -1456,6 +1462,8 @@ "label.project.invitation": "Project Invitations", "label.project.invite": "Invite to project", "label.project.name": "Project name", +"label.project.roles": "Project Roles", +"label.project.role.permissions": "Project Role Permissions", "label.project.view": "Project View", "label.projectid": "Project ID", "label.projects": "Projects", @@ -1559,6 +1567,7 @@ "label.remove.network.offering": "Remove network offering", "label.remove.pf": "Remove port forwarding rule", "label.remove.project.account": "Remove account from project", +"label.remove.project.role": "Remove project role", "label.remove.region": "Remove Region", "label.remove.rule": "Remove rule", "label.remove.ssh.key.pair": "Remove SSH Key Pair", @@ -1898,6 +1907,7 @@ "label.unlimited": "Unlimited", "label.untagged": "Untagged", "label.update.project.resources": "Update project resources", +"label.update.project.role": "Update project role", "label.update.ssl": " SSL Certificate", "label.update.ssl.cert": " SSL Certificate", "label.update.vmware.datacenter": "Update VMware Datacenter", @@ -1921,6 +1931,7 @@ "label.usehttps": "Use HTTPS", "label.usenewdiskoffering": "Replace disk offering?", "label.user": "User", +"label.user.as.admin": "Make User the Project Admin", "label.user.conflict": "Conflict", "label.user.details": "User details", "label.user.source": "source", @@ -2588,6 +2599,9 @@ "message.zone.step.3.desc": "Please enter the following info to add a new pod", "message.zonewizard.enable.local.storage": "WARNING: If you enable local storage for this zone, you must do the following, depending on where you would like your system VMs to launch:

1. If system VMs need to be launched in shared primary storage, shared primary storage needs to be added to the zone after creation. You must also start the zone in a disabled state.

2. If system VMs need to be launched in local primary storage, system.vm.use.local.storage needs to be set to true before you enable the zone.


Would you like to continue?", "messgae.validate.min": "Please enter a value greater than or equal to {0}.", +"migrate.from": "Migrate From", +"migrate.to": "Migrate To", +"migrationPolicy": "Migration Policy", "network.rate": "Network Rate", "side.by.side": "Side by Side", "state.accepted": "Accepted", @@ -2612,4 +2626,4 @@ "state.stopping": "Stopping", "state.suspended": "Suspended", "title.upload.volume": "Upload Volume" -} +} \ No newline at end of file diff --git a/src/views/AutogenView.vue b/src/views/AutogenView.vue index 14d7a3ae4..d37cf8e00 100644 --- a/src/views/AutogenView.vue +++ b/src/views/AutogenView.vue @@ -170,7 +170,7 @@ rules: [{ required: field.required, message: 'Please select option' }] }]" :loading="field.loading" - :placeholder="field.description" + :placeholder="field.descriptions" :filterOption="(input, option) => { return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0 }" @@ -180,6 +180,16 @@ + + + Admin + Regular + + { param.loading = false diff --git a/src/views/project/AccountsTab.vue b/src/views/project/AccountsTab.vue index 8f48f24ce..7eeaa3782 100644 --- a/src/views/project/AccountsTab.vue +++ b/src/views/project/AccountsTab.vue @@ -27,12 +27,30 @@ :pagination="false" :rowKey="record => record.accountid || record.account" > -