From: Stephen Smith Date: Wed, 26 Jan 2022 23:53:04 +0000 (-0500) Subject: 18284: Fix small bug and add tests for vm login admin X-Git-Tag: 2.4.0~12^2~7 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/39f2ecd2cfa22d7dd6e1dc94f9952bd5c5c13ef2 18284: Fix small bug and add tests for vm login admin Arvados-DCO-1.1-Signed-off-by: Stephen Smith --- diff --git a/cypress/integration/virtual-machine-admin.spec.js b/cypress/integration/virtual-machine-admin.spec.js new file mode 100644 index 00000000..534e7a9e --- /dev/null +++ b/cypress/integration/virtual-machine-admin.spec.js @@ -0,0 +1,181 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + +describe('Virtual machine login manage tests', function() { + let activeUser; + let adminUser; + + const vmHost = `vm-${Math.floor(999999 * Math.random())}.host`; + + before(function() { + // Only set up common users once. These aren't set up as aliases because + // aliases are cleaned up after every test. Also it doesn't make sense + // to set the same users on beforeEach() over and over again, so we + // separate a little from Cypress' 'Best Practices' here. + cy.getUser('admin', 'Admin', 'User', true, true) + .as('adminUser').then(function() { + adminUser = this.adminUser; + } + ); + cy.getUser('user', 'Active', 'User', false, true) + .as('activeUser').then(function() { + activeUser = this.activeUser; + } + ); + }); + + it('adds and removes vm logins', function() { + cy.loginAs(adminUser); + cy.createVirtualMachine(adminUser.token, {hostname: vmHost}); + + // Navigate to VM admin + cy.get('header button[title="Admin Panel"]').click(); + cy.get('#admin-menu').contains('Virtual Machines').click(); + + // Add login permission to admin + cy.get('[data-cy=vm-admin-table]') + .contains(vmHost) + .parents('tr') + .within(() => { + cy.get('button[title="Add Login Permission"]').click(); + }); + cy.get('[data-cy=form-dialog]') + .should('contain', 'Add login permissions') + .within(() => { + cy.get('label') + .contains('Search for users') + .parent() + .within(() => { + cy.get('input').type('admin'); + }) + }); + cy.get('[role=tooltip]').click(); + cy.get('[data-cy=form-dialog]') + .should('contain', 'Add login permissions') + .within(() => { + cy.get('label') + .contains('Add groups') + .parent() + .within(() => { + cy.get('input').type('sudo{enter}'); + }) + }); + cy.get('[data-cy=form-dialog]').within(() => { + cy.get('[data-cy=form-submit-btn]').click(); + }); + cy.get('[data-cy=vm-admin-table]') + .contains(vmHost) + .parents('tr') + .within(() => { + cy.get('td').contains('admin'); + }); + + // Add login permission to activeUser + cy.get('[data-cy=vm-admin-table]') + .contains(vmHost) + .parents('tr') + .within(() => { + cy.get('button[title="Add Login Permission"]').click(); + }); + cy.get('[data-cy=form-dialog]') + .should('contain', 'Add login permissions') + .within(() => { + cy.get('label') + .contains('Search for users') + .parent() + .within(() => { + cy.get('input').type('active user'); + }) + }); + cy.get('[role=tooltip]').click(); + cy.get('[data-cy=form-dialog]').within(() => { + cy.get('[data-cy=form-submit-btn]').click(); + }); + cy.get('[data-cy=vm-admin-table]') + .contains(vmHost) + .parents('tr') + .within(() => { + cy.get('td').contains('user'); + }); + + // Check admin's vm page for login + cy.get('header button[title="Account Management"]').click(); + cy.get('#account-menu').contains('Virtual Machines').click(); + + cy.get('[data-cy=vm-user-table]') + .contains(vmHost) + .parents('tr') + .within(() => { + cy.get('td').contains('admin'); + cy.get('td').contains('docker'); + cy.get('td').contains('sudo'); + cy.get('td').contains('ssh admin@' + vmHost); + }); + + // Check activeUser's vm page for login + cy.loginAs(activeUser); + cy.get('header button[title="Account Management"]').click(); + cy.get('#account-menu').contains('Virtual Machines').click(); + + cy.get('[data-cy=vm-user-table]') + .contains(vmHost) + .parents('tr') + .within(() => { + cy.get('td').contains('user'); + cy.get('td').contains('docker'); + cy.get('td').contains('ssh user@' + vmHost); + }); + + // Remove login permissions + cy.loginAs(adminUser); + cy.get('header button[title="Admin Panel"]').click(); + cy.get('#admin-menu').contains('Virtual Machines').click(); + cy.get('[data-cy=vm-admin-table]') + .contains(vmHost) + .parents('tr') + .within(() => { + // Remove user login + cy.get('div[role=button]').contains('user').parents('[role=button]').within(() => { + cy.get('svg').click(); + }); + }); + cy.get('[data-cy=confirmation-dialog-ok-btn]').click(); + + cy.get('[data-cy=vm-admin-table]') + .contains(vmHost) + .parents('tr') + .within(() => { + cy.get('div[role=button]').should('not.contain', 'user'); + cy.get('div[role=button]').should('have.length', 1) + + // Remove admin login + cy.get('div[role=button]').contains('admin').parents('[role=button]').within(() => { + cy.get('svg').click(); + }); + }); + cy.get('[data-cy=confirmation-dialog-ok-btn]').click(); + + cy.get('[data-cy=vm-admin-table]') + .contains(vmHost) + .parents('tr') + .within(() => { + cy.get('div[role=button]').should('not.contain', 'admin'); + }); + + // Check admin's vm page for login + cy.get('header button[title="Account Management"]').click(); + cy.get('#account-menu').contains('Virtual Machines').click(); + + cy.get('[data-cy=vm-user-table]') + .should('not.contain', vmHost); + + // Check activeUser's vm page for login + cy.loginAs(activeUser); + cy.get('header button[title="Account Management"]').click(); + cy.get('#account-menu').contains('Virtual Machines').click(); + + cy.get('[data-cy=vm-user-table]') + .should('not.contain', vmHost); + }); +}); diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 07290e55..cfdfa9ec 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -150,6 +150,15 @@ Cypress.Commands.add( } ) +Cypress.Commands.add( + "createVirtualMachine", (token, data) => { + return cy.createResource(token, 'virtual_machines', { + virtual_machine: JSON.stringify(data), + ensure_unique_name: true + }) + } +) + Cypress.Commands.add( "createResource", (token, suffix, data) => { return cy.doRequest('POST', '/arvados/v1/' + suffix, data, null, token, true) @@ -318,4 +327,4 @@ function b64toBlob(b64Data, contentType = '', sliceSize = 512) { const blob = new Blob(byteArrays, { type: contentType }); return blob -} \ No newline at end of file +} diff --git a/src/views/virtual-machine-panel/virtual-machine-admin-panel.tsx b/src/views/virtual-machine-panel/virtual-machine-admin-panel.tsx index 0f2c0033..bfa6be26 100644 --- a/src/views/virtual-machine-panel/virtual-machine-admin-panel.tsx +++ b/src/views/virtual-machine-panel/virtual-machine-admin-panel.tsx @@ -98,7 +98,7 @@ const CardContentWithVirtualMachines = (props: VirtualMachineProps) => ; const virtualMachinesTable = (props: VirtualMachineProps) => - +
Uuid @@ -109,7 +109,7 @@ const virtualMachinesTable = (props: VirtualMachineProps) => - {props.logins.items.length > 0 && props.virtualMachines.items.map((machine, index) => + {props.virtualMachines.items.map((machine, index) => diff --git a/src/views/virtual-machine-panel/virtual-machine-user-panel.tsx b/src/views/virtual-machine-panel/virtual-machine-user-panel.tsx index 091a8198..d0ee5634 100644 --- a/src/views/virtual-machine-panel/virtual-machine-user-panel.tsx +++ b/src/views/virtual-machine-panel/virtual-machine-user-panel.tsx @@ -172,7 +172,7 @@ const virtualMachineSendRequest = (props: VirtualMachineProps) => ; const virtualMachinesTable = (props: VirtualMachineProps) => -
+
Host name