Merge branch 'main' of git.arvados.org:arvados-workbench2 into 18979-vm-login-ui
[arvados-workbench2.git] / cypress / integration / virtual-machine-admin.spec.js
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 describe('Virtual machine login manage tests', function() {
6     let activeUser;
7     let adminUser;
8
9     const vmHost = `vm-${Math.floor(999999 * Math.random())}.host`;
10
11     before(function() {
12         // Only set up common users once. These aren't set up as aliases because
13         // aliases are cleaned up after every test. Also it doesn't make sense
14         // to set the same users on beforeEach() over and over again, so we
15         // separate a little from Cypress' 'Best Practices' here.
16         cy.getUser('admin', 'VMAdmin', 'User', true, true)
17             .as('adminUser').then(function() {
18                 adminUser = this.adminUser;
19             }
20         );
21         cy.getUser('user', 'VMActive', 'User', false, true)
22             .as('activeUser').then(function() {
23                 activeUser = this.activeUser;
24             }
25         );
26     });
27
28     it('adds and removes vm logins', function() {
29         cy.loginAs(adminUser);
30         cy.createVirtualMachine(adminUser.token, {hostname: vmHost});
31
32         // Navigate to VM admin
33         cy.get('header button[title="Admin Panel"]').click();
34         cy.get('#admin-menu').contains('Virtual Machines').click();
35
36         // Add login permission to admin
37         cy.get('[data-cy=vm-admin-table]')
38             .contains(vmHost)
39             .parents('tr')
40             .within(() => {
41                 cy.get('button[title="Add Login Permission"]').click();
42             });
43         cy.get('[data-cy=form-dialog]')
44             .should('contain', 'Add login permission')
45             .within(() => {
46                 cy.get('label')
47                   .contains('Search for user')
48                   .parent()
49                   .within(() => {
50                     cy.get('input').type('VMAdmin');
51                   })
52             });
53         cy.get('[role=tooltip]').click();
54         cy.get('[data-cy=form-dialog]').as('add-login-dialog')
55             .should('contain', 'Add login permission')
56             .within(() => {
57                 cy.get('label')
58                   .contains('Add groups')
59                   .parent()
60                   .within(() => {
61                     cy.get('input').type('docker ');
62                     // Veryfy submit enabled (form has changed)
63                     cy.get('@add-login-dialog').within(() => {
64                         cy.get('[data-cy=form-submit-btn]').should('be.enabled');
65                     });
66                     cy.get('input').type('sudo');
67                     // Veryfy submit disabled (partial input in chips)
68                     cy.get('@add-login-dialog').within(() => {
69                         cy.get('[data-cy=form-submit-btn]').should('be.disabled');
70                     });
71                     cy.get('input').type('{enter}');
72                   })
73             });
74         cy.get('[data-cy=form-dialog]').within(() => {
75             cy.get('[data-cy=form-submit-btn]').click();
76         });
77         cy.get('[data-cy=snackbar]').contains('Permission updated');
78         cy.get('[data-cy=vm-admin-table]')
79             .contains(vmHost)
80             .parents('tr')
81             .within(() => {
82                 cy.get('td').contains('admin');
83         });
84
85         // Add login permission to activeUser
86         cy.get('[data-cy=vm-admin-table]')
87             .contains(vmHost)
88             .parents('tr')
89             .within(() => {
90                 cy.get('button[title="Add Login Permission"]').click();
91             });
92         cy.get('[data-cy=form-dialog]')
93             .should('contain', 'Add login permission')
94             .within(() => {
95                 cy.get('label')
96                   .contains('Search for user')
97                   .parent()
98                   .within(() => {
99                     cy.get('input').type('VMActive user');
100                   })
101             });
102         cy.get('[role=tooltip]').click();
103         cy.get('[data-cy=form-dialog]').within(() => {
104             cy.get('[data-cy=form-submit-btn]').click();
105         });
106         cy.get('[data-cy=snackbar]').contains('Permission updated');
107         cy.get('[data-cy=vm-admin-table]')
108             .contains(vmHost)
109             .parents('tr')
110             .within(() => {
111                 cy.get('td').contains('user');
112         });
113
114         // Check admin's vm page for login
115         cy.get('header button[title="Account Management"]').click();
116         cy.get('#account-menu').contains('Virtual Machines').click();
117
118         cy.get('[data-cy=vm-user-table]')
119             .contains(vmHost)
120             .parents('tr')
121             .within(() => {
122                 cy.get('td').contains('admin');
123                 cy.get('td').contains('docker');
124                 cy.get('td').contains('sudo');
125                 cy.get('td').contains('ssh admin@' + vmHost);
126         });
127
128         // Check activeUser's vm page for login
129         cy.loginAs(activeUser);
130         cy.get('header button[title="Account Management"]').click();
131         cy.get('#account-menu').contains('Virtual Machines').click();
132
133         cy.get('[data-cy=vm-user-table]')
134             .contains(vmHost)
135             .parents('tr')
136             .within(() => {
137                 cy.get('td').contains('user');
138                 cy.get('td').should('not.contain', 'docker');
139                 cy.get('td').should('not.contain', 'sudo');
140                 cy.get('td').contains('ssh user@' + vmHost);
141         });
142
143         // Edit login permissions
144         cy.loginAs(adminUser);
145         cy.get('header button[title="Admin Panel"]').click();
146         cy.get('#admin-menu').contains('Virtual Machines').click();
147
148         cy.get('[data-cy=vm-admin-table]')
149             .contains('admin'); // Wait for page to finish
150
151         cy.get('[data-cy=vm-admin-table]')
152             .contains(vmHost)
153             .parents('tr')
154             .contains('admin')
155             .click();
156
157         cy.get('[data-cy=form-dialog]')
158             .should('contain', 'Update login permission')
159             .within(() => {
160                 cy.get('label')
161                     .contains('Add groups')
162                     .parent()
163                     .as('groupInput');
164             });
165
166         cy.get('@groupInput').within(() => {
167             cy.get('div[role=button]').contains('sudo').parent().find('svg').click();
168             cy.get('div[role=button]').contains('docker').parent().find('svg').click();
169         });
170
171         cy.get('[data-cy=form-dialog]').within(() => {
172             cy.get('[data-cy=form-submit-btn]').click();
173         });
174
175         // Wait for page to finish loading
176         cy.get('[data-cy=snackbar]').contains('Permission updated');
177         cy.get('[data-cy=vm-admin-table]')
178             .contains(vmHost)
179             .parents('tr')
180             .within(() => {
181                 cy.get('div[role=button]')
182                     .parent()
183                     .first()
184                     .contains('admin')
185             });
186
187         cy.get('[data-cy=vm-admin-table]')
188             .contains(vmHost)
189             .parents('tr')
190             .contains('user')
191             .click();
192
193         cy.get('[data-cy=form-dialog]')
194             .should('contain', 'Update login permission')
195             .within(() => {
196                 cy.get('label')
197                     .contains('Add groups')
198                     .parent()
199                     .within(() => {
200                         cy.get('input').type('docker{enter}');
201                     })
202             });
203
204         cy.get('[data-cy=form-dialog]').within(() => {
205             cy.get('[data-cy=form-submit-btn]').click();
206         });
207         cy.get('[data-cy=snackbar]').contains('Permission updated');
208
209         // Verify new login permissions
210         // Check admin's vm page for login
211         cy.get('header button[title="Account Management"]').click();
212         cy.get('#account-menu').contains('Virtual Machines').click();
213
214         cy.get('[data-cy=vm-user-table]')
215             .contains(vmHost)
216             .parents('tr')
217             .within(() => {
218                 cy.get('td').contains('admin');
219                 cy.get('td').should('not.contain', 'docker');
220                 cy.get('td').should('not.contain', 'sudo');
221                 cy.get('td').contains('ssh admin@' + vmHost);
222         });
223
224         // Verify new login permissions
225         // Check activeUser's vm page for login
226         cy.loginAs(activeUser);
227         cy.get('header button[title="Account Management"]').click();
228         cy.get('#account-menu').contains('Virtual Machines').click();
229
230         cy.get('[data-cy=vm-user-table]')
231             .contains(vmHost)
232             .parents('tr')
233             .within(() => {
234                 cy.get('td').contains('user');
235                 cy.get('td').contains('docker');
236                 cy.get('td').should('not.contain', 'sudo');
237                 cy.get('td').contains('ssh user@' + vmHost);
238         });
239
240         // Remove login permissions
241         cy.loginAs(adminUser);
242         cy.get('header button[title="Admin Panel"]').click();
243         cy.get('#admin-menu').contains('Virtual Machines').click();
244
245         cy.get('[data-cy=vm-admin-table]')
246             .contains('user'); // Wait for page to finish
247
248         cy.get('[data-cy=vm-admin-table]')
249             .contains(vmHost)
250             .parents('tr')
251             .as('vmRow')
252             .contains('user')
253             .parents('[role=button]')
254             .find('svg')
255             .as('removeButton');
256         cy.get('@removeButton').click();
257         cy.get('[data-cy=confirmation-dialog-ok-btn]').click();
258
259         cy.get('@vmRow')
260             .within(() => {
261                 cy.get('div[role=button]').should('not.contain', 'user');
262                 cy.get('div[role=button]').should('have.length', 1)
263             });
264
265         cy.get('@vmRow')
266             .find('div[role=button]')
267             .contains('admin')
268             .parents('[role=button]')
269             .find('svg')
270             .as('removeButton');
271         cy.get('@removeButton').click();
272         cy.get('[data-cy=confirmation-dialog-ok-btn]').click();
273
274         cy.get('[data-cy=vm-admin-table]')
275             .contains(vmHost)
276             .parents('tr')
277             .within(() => {
278                 cy.get('div[role=button]').should('not.contain', 'admin');
279             });
280
281         // Check admin's vm page for login
282         cy.get('header button[title="Account Management"]').click();
283         cy.get('#account-menu').contains('Virtual Machines').click();
284
285         cy.get('[data-cy=vm-user-panel]')
286             .should('not.contain', vmHost);
287
288         // Check activeUser's vm page for login
289         cy.loginAs(activeUser);
290         cy.get('header button[title="Account Management"]').click();
291         cy.get('#account-menu').contains('Virtual Machines').click();
292
293         cy.get('[data-cy=vm-user-panel]')
294             .should('not.contain', vmHost);
295     });
296 });