18284: Fix small bug and add tests for vm login admin
authorStephen Smith <stephen@curii.com>
Wed, 26 Jan 2022 23:53:04 +0000 (18:53 -0500)
committerStephen Smith <stephen@curii.com>
Wed, 26 Jan 2022 23:53:04 +0000 (18:53 -0500)
Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen@curii.com>

cypress/integration/virtual-machine-admin.spec.js [new file with mode: 0644]
cypress/support/commands.js
src/views/virtual-machine-panel/virtual-machine-admin-panel.tsx
src/views/virtual-machine-panel/virtual-machine-user-panel.tsx

diff --git a/cypress/integration/virtual-machine-admin.spec.js b/cypress/integration/virtual-machine-admin.spec.js
new file mode 100644 (file)
index 0000000..534e7a9
--- /dev/null
@@ -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);
+    });
+});
index 07290e550aa3b6beceba61559a477216ef220435..cfdfa9ecffb0e94c2262d0f580b8222f3d7b2c72 100644 (file)
@@ -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
+}
index 0f2c00334e69ffccca2e6fe695a6e8a9fd647b8f..bfa6be2657a197a246434525df61d889068ef4f1 100644 (file)
@@ -98,7 +98,7 @@ const CardContentWithVirtualMachines = (props: VirtualMachineProps) =>
     </Grid>;
 
 const virtualMachinesTable = (props: VirtualMachineProps) =>
-    <Table>
+    <Table data-cy="vm-admin-table">
         <TableHead>
             <TableRow>
                 <TableCell>Uuid</TableCell>
@@ -109,7 +109,7 @@ const virtualMachinesTable = (props: VirtualMachineProps) =>
             </TableRow>
         </TableHead>
         <TableBody>
-            {props.logins.items.length > 0 && props.virtualMachines.items.map((machine, index) =>
+            {props.virtualMachines.items.map((machine, index) =>
                 <TableRow key={index}>
                     <TableCell><ResourceUuid uuid={machine.uuid} /></TableCell>
                     <TableCell><VirtualMachineHostname uuid={machine.uuid} /></TableCell>
index 091a81981536cd678885264b9e531645f481c21d..d0ee5634f85a5de77917660410accd8c848787aa 100644 (file)
@@ -172,7 +172,7 @@ const virtualMachineSendRequest = (props: VirtualMachineProps) =>
     </span>;
 
 const virtualMachinesTable = (props: VirtualMachineProps) =>
-    <Table>
+    <Table data-cy="vm-user-table">
         <TableHead>
             <TableRow>
                 <TableCell>Host name</TableCell>