From 30790a423ee320258915babf7513f9f55edc7d54 Mon Sep 17 00:00:00 2001 From: Peter Amstutz Date: Wed, 19 Jun 2024 16:52:23 -0400 Subject: [PATCH] 15814: Add e2e test for workflows with secrets Arvados-DCO-1.1-Signed-off-by: Peter Amstutz --- .../cypress/e2e/create-workflow.cy.js | 57 +++++++++++++++++++ services/workbench2/cypress/e2e/process.cy.js | 37 +----------- .../workbench2/cypress/support/commands.js | 52 +++++++++++++++++ 3 files changed, 110 insertions(+), 36 deletions(-) diff --git a/services/workbench2/cypress/e2e/create-workflow.cy.js b/services/workbench2/cypress/e2e/create-workflow.cy.js index c8acc67348..06fdf71b53 100644 --- a/services/workbench2/cypress/e2e/create-workflow.cy.js +++ b/services/workbench2/cypress/e2e/create-workflow.cy.js @@ -276,4 +276,61 @@ describe('Create workflow tests', function () { }); }) + + it.only('handles secret inputs', () => { + cy.createProject({ + owningUser: activeUser, + projectName: 'myProject1', + addToFavorites: true + }); + + cy.setupDockerImage("arvados/jobs").as("dockerImg"); + + cy.getAll('@myProject1').then(function ([myProject1]) { + cy.readFile('cypress/fixtures/workflow_with_secret_input.yaml').then(workflow => { + cy.createWorkflow(adminUser.token, { + name: `TestWorkflow${Math.floor(Math.random() * 999999)}.cwl`, + definition: workflow, + owner_uuid: myProject1.uuid, + }) + .as('testWorkflow'); + }); + + cy.loginAs(activeUser); + + cy.get('main').contains(myProject1.name).click(); + + cy.get('[data-cy=side-panel-button]').click(); + + cy.get('#aside-menu-list').contains('Run a workflow').click(); + + cy.get('@testWorkflow') + .then((testWorkflow) => { + cy.get('main').contains(testWorkflow.name).click(); + cy.get('[data-cy=run-process-next-button]').click(); + + var foo = cy.get('label').contains('foo').parent('div').find('input'); + foo.type("secret_value_xyz"); + foo.should('have.attr', 'type').and('equal', 'password'); + + var bar = cy.get('label').contains('bar').parent('div').find('input'); + bar.type("exposed_value_xyz"); + bar.should('have.attr', 'type').and('equal', 'text'); + }); + cy.get('[data-cy=new-process-panel]').contains('Run workflow').click(); + + cy.get('[data-cy=process-io-card]').should('contain', 'exposed_value_xyz'); + cy.get('[data-cy=process-io-card]').should('contain', 'exposed_value_xyz'); + cy.get('[data-cy=process-io-card]').should('not.contain', 'secret_value_xyz'); + + cy.url().then((url) => { + let uuid = url.split('/').pop(); + cy.getResource(activeUser.token, "container_requests", uuid).then((res) => { + expect(res.mounts["/var/lib/cwl/cwl.input.json"].content.bar).to.equal('exposed_value_xyz'); + expect(res.mounts["/var/lib/cwl/cwl.input.json"].content.foo).to.deep.equal({$include: '/secrets/s0'}); + }); + }); + + }); + }); }) diff --git a/services/workbench2/cypress/e2e/process.cy.js b/services/workbench2/cypress/e2e/process.cy.js index ea4da31b2b..217c02220a 100644 --- a/services/workbench2/cypress/e2e/process.cy.js +++ b/services/workbench2/cypress/e2e/process.cy.js @@ -25,44 +25,9 @@ describe("Process tests", function () { }); }); - function setupDockerImage(image_name) { - // Create a collection that will be used as a docker image for the tests. - cy.createCollection(adminUser.token, { - name: "docker_image", - manifest_text: - ". d21353cfe035e3e384563ee55eadbb2f+67108864 5c77a43e329b9838cbec18ff42790e57+55605760 0:122714624:sha256:d8309758b8fe2c81034ffc8a10c36460b77db7bc5e7b448c4e5b684f9d95a678.tar\n", - }) - .as("dockerImage") - .then(function (dockerImage) { - // Give read permissions to the active user on the docker image. - cy.createLink(adminUser.token, { - link_class: "permission", - name: "can_read", - tail_uuid: activeUser.user.uuid, - head_uuid: dockerImage.uuid, - }) - .as("dockerImagePermission") - .then(function () { - // Set-up docker image collection tags - cy.createLink(activeUser.token, { - link_class: "docker_image_repo+tag", - name: image_name, - head_uuid: dockerImage.uuid, - }).as("dockerImageRepoTag"); - cy.createLink(activeUser.token, { - link_class: "docker_image_hash", - name: "sha256:d8309758b8fe2c81034ffc8a10c36460b77db7bc5e7b448c4e5b684f9d95a678", - head_uuid: dockerImage.uuid, - }).as("dockerImageHash"); - }); - }); - return cy.getAll("@dockerImage", "@dockerImageRepoTag", "@dockerImageHash", "@dockerImagePermission").then(function ([dockerImage]) { - return dockerImage; - }); - } function createContainerRequest(user, name, docker_image, command, reuse = false, state = "Uncommitted") { - return setupDockerImage(docker_image).then(function (dockerImage) { + return cy.setupDockerImage(docker_image).then(function (dockerImage) { return cy.createContainerRequest(user.token, { name: name, command: command, diff --git a/services/workbench2/cypress/support/commands.js b/services/workbench2/cypress/support/commands.js index 05664e6b30..05fc727b1e 100644 --- a/services/workbench2/cypress/support/commands.js +++ b/services/workbench2/cypress/support/commands.js @@ -573,3 +573,55 @@ Cypress.Commands.add("waitForDom", () => { } ); }); + +Cypress.Commands.add("setupDockerImage", (image_name) => { + // Create a collection that will be used as a docker image for the tests. + let activeUser; + let adminUser; + + cy.getUser("admin", "Admin", "User", true, true) + .as("adminUser") + .then(function () { + adminUser = this.adminUser; + }); + + cy.getUser('collectionuser1', 'Collection', 'User', false, true) + .as('activeUser').then(function () { + activeUser = this.activeUser; + }); + + cy.getAll('@activeUser', '@adminUser').then(([activeUser, adminUser]) => { + cy.createCollection(adminUser.token, { + name: "docker_image", + manifest_text: + ". d21353cfe035e3e384563ee55eadbb2f+67108864 5c77a43e329b9838cbec18ff42790e57+55605760 0:122714624:sha256:d8309758b8fe2c81034ffc8a10c36460b77db7bc5e7b448c4e5b684f9d95a678.tar\n", + }) + .as("dockerImage") + .then(function (dockerImage) { + // Give read permissions to the active user on the docker image. + cy.createLink(adminUser.token, { + link_class: "permission", + name: "can_read", + tail_uuid: activeUser.user.uuid, + head_uuid: dockerImage.uuid, + }) + .as("dockerImagePermission") + .then(function () { + // Set-up docker image collection tags + cy.createLink(activeUser.token, { + link_class: "docker_image_repo+tag", + name: image_name, + head_uuid: dockerImage.uuid, + }).as("dockerImageRepoTag"); + cy.createLink(activeUser.token, { + link_class: "docker_image_hash", + name: "sha256:d8309758b8fe2c81034ffc8a10c36460b77db7bc5e7b448c4e5b684f9d95a678", + head_uuid: dockerImage.uuid, + }).as("dockerImageHash"); + }); + }); + return cy.getAll("@dockerImage", "@dockerImageRepoTag", "@dockerImageHash", "@dockerImagePermission").then(function ([dockerImage]) { + return dockerImage; + }); + }); +}); -- 2.30.2