From 479a2da405699b639e610270dc230015f13fe752 Mon Sep 17 00:00:00 2001 From: RenkuBot <53332360+RenkuBot@users.noreply.github.com> Date: Tue, 22 Oct 2024 10:48:30 +0200 Subject: [PATCH] release 0.59.0 (#3778) * chore: create release 0.59.0 * feat: bump renku-gateway to 1.2.0 (#3808) Add support for signing cookie in the gateway. * refactor: use cy.session for anonymous user checks (#3802) Remove the `logout()` command and use `cy.session()` instead. This makes the tests less flaky. * feat: update renku-ui to 3.38.0 (#3815) * feat!:add support for data connectors in Renku 2.0 (#3793) Closes #3751. Add support for data connectors in Renku 2.0. * fix: update permission checks in Renku 2.0 (#3819) See: https://github.com/SwissDataScienceCenter/renku-ui/issues/3350. Fixes permission check in the Renku 2.0 UI. Notably, group owners can update projects in the group even if they are not direct project members. * fix: bump renku-ui to 3.40.1 (#3821) Fixes a bug with data connectors where typing a slug would not be taken into account and using uppercase letter in the name would cause issues. * fix changelog versions --------- Co-authored-by: Flora Thiebaut Co-authored-by: Andrea Cordoba <43388408+andre-code@users.noreply.github.com> Co-authored-by: Ralf Grubenmann --- CHANGELOG.rst | 60 +++++++++++++++++++ .../cypress/e2e/privateProject.cy.ts | 17 ++++-- cypress-tests/cypress/e2e/publicProject.cy.ts | 6 +- cypress-tests/cypress/e2e/useSession.cy.ts | 2 +- .../cypress/support/commands/login.ts | 23 +++---- .../gateway/deployment-revproxy.yaml | 10 ++++ helm-chart/renku/values.yaml | 28 ++++----- 7 files changed, 107 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 5e8eac694c..afb87fedf5 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,5 +1,65 @@ .. _changelog: +0.59.0 +------ + +Renku ``0.59.0`` introduces the ability to reuse data connectors in multiple projects! +When you add a data connector (previously called a data source) to your project, you now have the new option to select other data connectors on RenkuLab, +for example those shared in your group, rather than having to re-enter the data connection details. + +User-Facing Changes +~~~~~~~~~~~~~~~~~~~ + +**🌟 New Features** + +- **UI**: Add and re-use data connectors in Renku 2.0 projects (`#3323 `__). + +**✨ Improvements** + +- **UI**: Add a playful design for the 404 and application error pages (`#3248 `__). +- **UI**: Update redirect page styles (`#3257 `__). +- **UI**: Remove Renku 2.0 beta warning alert from dashboard (`#3357 `__). + +**🐞 Bug Fixes** + +- **UI**: Fix how permissions are checked in Renku 2.0, notably group members can perform actions according to their role in projects. (`#3351 `__). +- **UI**: Fix styles for the edit launcher environment list (`#3360 `__). +- **UI**: Allow opening a project from Renku 2.0 search if the namespace is missing in the result (`#3353 `__). +- **UI**: Fix update file and download buttons in Renku 1.0 (`#3363 `__). + +Internal Changes +~~~~~~~~~~~~~~~~ + +**New Features** + +- **Data services**: Add support for data connectors (`#407 `__). +- **Data services**: Do not synchronize blocked users from Keycloak (`#393 `__). +- **Data services**: Support getting permissions (`#454 `__). +- **Notebooks**: Add support for data connectors (`#1991 `__). +- **Notebooks**: Cache Amalthea sessions (`#1983 `__). + +**Improvements** + +- **Data services**: Handle errors in background jobs nicely (`#463 `__). +- **Gateway**: Add support for signing cookies (`#734 `__). + +**Bug Fixes** + +- **Data services**: Treat invalid JWT as 401 HTTP error. +- **Data services**: Change user preferences id sequence to proper value. + +Individual Components +~~~~~~~~~~~~~~~~~~~~~ + +- `renku-data-services 0.23.0 `__ +- `renku-data-services 0.24.0 `__ +- `renku-gateway 1.2.0 `_ +- `renku-notebooks 1.27.0 `_ +- `renku-ui 3.38.0 `_ +- `renku-ui 3.39.0 `_ +- `renku-ui 3.40.0 `_ +- `renku-ui 3.40.1 `_ + 0.58.1 ------ diff --git a/cypress-tests/cypress/e2e/privateProject.cy.ts b/cypress-tests/cypress/e2e/privateProject.cy.ts index 19e5ba1b9b..d62b67468e 100644 --- a/cypress-tests/cypress/e2e/privateProject.cy.ts +++ b/cypress-tests/cypress/e2e/privateProject.cy.ts @@ -38,7 +38,11 @@ describe("Basic public project functionality", () => { }, validateLogin ); - cy.createProjectIfMissing({templateName: "Python", ...projectIdentifier, visibility: "private"}); + cy.createProjectIfMissing({ + templateName: "Python", + ...projectIdentifier, + visibility: "private", + }); cy.visitAndLoadProject(projectIdentifier); }); @@ -50,11 +54,11 @@ describe("Basic public project functionality", () => { .should("be.checked"); cy.searchForProject(projectIdentifier, true); - // logout and search for the project and log back in - cy.logout(); + // Check as an anonymous user + cy.session(["anonymous", getRandomString()], () => {}); + cy.visit("/"); cy.get("#nav-hamburger").should("be.visible").click(); cy.searchForProject(projectIdentifier, false); - cy.robustLogin(); }); it("Can always search for project after changing the visibility", () => { @@ -86,10 +90,11 @@ describe("Basic public project functionality", () => { // Search the project as both logged in and logged out. cy.searchForProject(projectIdentifier, true); - cy.logout(); + // Check as an anonymous user + cy.session(["anonymous", getRandomString()], () => {}); + cy.visit("/"); cy.get("#nav-hamburger").should("be.visible").click(); cy.searchForProject(projectIdentifier, false); - cy.robustLogin(); }); it("Deleting the project removes it from the search page", () => { diff --git a/cypress-tests/cypress/e2e/publicProject.cy.ts b/cypress-tests/cypress/e2e/publicProject.cy.ts index a0a78b206b..e8ad88cd34 100644 --- a/cypress-tests/cypress/e2e/publicProject.cy.ts +++ b/cypress-tests/cypress/e2e/publicProject.cy.ts @@ -48,11 +48,11 @@ describe("Basic public project functionality", () => { cy.waitMetadataIndexing(); cy.searchForProject(projectIdentifier); - // logout and search for the project and log back in - cy.logout(); + // Check as an anonymous user + cy.session(["anonymous", getRandomString()], () => {}); + cy.visit("/"); cy.get("#nav-hamburger").should("be.visible").click(); cy.searchForProject(projectIdentifier); - cy.robustLogin(); }); it("Can see overview content and check the clone URLs", () => { diff --git a/cypress-tests/cypress/e2e/useSession.cy.ts b/cypress-tests/cypress/e2e/useSession.cy.ts index 22b22d712c..30d7662e7d 100644 --- a/cypress-tests/cypress/e2e/useSession.cy.ts +++ b/cypress-tests/cypress/e2e/useSession.cy.ts @@ -167,7 +167,7 @@ describe("Basic public project functionality", () => { it("Start a new session as anonymous user.", () => { // Do not re-use the logged-in session - cy.session("anonymous", () => {}); + cy.session(["anonymous", getRandomString()], () => {}); // Log out and go to the project again cy.visit("/"); diff --git a/cypress-tests/cypress/support/commands/login.ts b/cypress-tests/cypress/support/commands/login.ts index 087d123d55..c31d9e2613 100644 --- a/cypress-tests/cypress/support/commands/login.ts +++ b/cypress-tests/cypress/support/commands/login.ts @@ -1,9 +1,11 @@ const renkuLogin = (credentials: { username: string; password: string }[]) => { - cy.wrap(credentials, { log: false }).each((credential: {password: string, username: string}) => { - cy.get("#username").type(credential.username); - cy.get("#password").type(credential.password, { log: false }); - cy.get("#kc-login").click() - }) + cy.wrap(credentials, { log: false }).each( + (credential: { password: string; username: string }) => { + cy.get("#username").type(credential.username); + cy.get("#password").type(credential.password, { log: false }); + cy.get("#kc-login").click(); + } + ); cy.url().then((url) => { const parsedUrl = new URL(url); if ( @@ -93,7 +95,7 @@ function registerAndVerify(props: RegisterAndVerifyProps) { expect(["/", ""]).to.include(loc.pathname); expect(loc.search).to.eq(""); expect(loc.hostname).to.eq(baseURL.hostname); - }) + }); cy.get("header").should("be.visible"); cy.get("footer").should("be.visible"); // If we send a request to the user endpoint on Gitlab too quickly after we log in then @@ -137,15 +139,7 @@ function robustLogin(props?: RobustLoginProps) { ); } -function logout() { - cy.get("#profile-dropdown").should("be.visible").click(); - cy.get("#logout-link").should("be.visible").click(); - // Make sure we fully log out - cy.wait(15_000); -} - export default function registerLoginCommands() { - Cypress.Commands.add("logout", logout); Cypress.Commands.add("renkuLogin", renkuLogin); Cypress.Commands.add("register", register); Cypress.Commands.add("registerAndVerify", registerAndVerify); @@ -156,7 +150,6 @@ declare global { // eslint-disable-next-line @typescript-eslint/no-namespace namespace Cypress { interface Chainable { - logout(); renkuLogin(credentials: { username: string; password: string }[]); register( email: string, diff --git a/helm-chart/renku/templates/gateway/deployment-revproxy.yaml b/helm-chart/renku/templates/gateway/deployment-revproxy.yaml index 3fc1b30214..a16e20590f 100644 --- a/helm-chart/renku/templates/gateway/deployment-revproxy.yaml +++ b/helm-chart/renku/templates/gateway/deployment-revproxy.yaml @@ -56,6 +56,16 @@ spec: secretKeyRef: name: {{ .Values.global.redis.existingSecret }} key: {{ .Values.global.redis.existingSecretPasswordKey }} + - name: GATEWAY_SESSIONS_COOKIEENCODINGKEY + valueFrom: + secretKeyRef: + name: {{ cat (include "renku.fullname" .) "-gateway" | nospace }} + key: cookieEncodingKey + - name: GATEWAY_SESSIONS_COOKIEHASHKEY + valueFrom: + secretKeyRef: + name: {{ cat (include "renku.fullname" .) "-gateway" | nospace }} + key: cookieHashKey - name: GATEWAY_LOGIN_PROVIDERS_RENKU_CLIENTSECRET valueFrom: secretKeyRef: diff --git a/helm-chart/renku/values.yaml b/helm-chart/renku/values.yaml index 8a75fb54b8..ce5033349d 100644 --- a/helm-chart/renku/values.yaml +++ b/helm-chart/renku/values.yaml @@ -654,7 +654,7 @@ ui: replicaCount: 1 image: repository: renku/renku-ui - tag: "3.37.1" + tag: "3.40.1" pullPolicy: IfNotPresent ## Optionally specify an array of imagePullSecrets. ## Secrets must be manually created in the namespace. @@ -843,7 +843,7 @@ ui: keepCookies: [] image: repository: renku/renku-ui-server - tag: "3.37.1" + tag: "3.40.1" pullPolicy: IfNotPresent imagePullSecrets: [] nameOverride: "" @@ -983,7 +983,7 @@ notebooks: targetCPUUtilizationPercentage: 50 image: repository: renku/renku-notebooks - tag: "1.26.2" + tag: "1.27.0" pullPolicy: IfNotPresent ## Optionally specify an array of imagePullSecrets. ## Secrets must be manually created in the namespace. @@ -1101,15 +1101,15 @@ notebooks: gitRpcServer: image: name: renku/git-rpc-server - tag: "1.26.2" + tag: "1.27.0" gitHttpsProxy: image: name: renku/git-https-proxy - tag: "1.26.2" + tag: "1.27.0" gitClone: image: name: renku/git-clone - tag: "1.26.2" + tag: "1.27.0" service: type: ClusterIP port: 80 @@ -1162,12 +1162,12 @@ notebooks: sessionTypes: ["registered"] image: repository: renku/renku-notebooks-tests - tag: "1.26.2" + tag: "1.27.0" pullPolicy: IfNotPresent k8sWatcher: image: repository: renku/k8s-watcher - tag: "1.26.2" + tag: "1.27.0" pullPolicy: IfNotPresent resources: {} replicaCount: 1 @@ -1179,12 +1179,12 @@ notebooks: secretsMount: image: repository: renku/secrets-mount - tag: "1.26.2" + tag: "1.27.0" ssh: enabled: false image: repository: renku/ssh-jump-host - tag: "1.26.2" + tag: "1.27.0" pullPolicy: IfNotPresent resources: {} replicaCount: 1 @@ -1271,7 +1271,7 @@ gateway: secretKey: image: repository: renku/renku-gateway - tag: "1.1.0" + tag: "1.2.0" pullPolicy: IfNotPresent service: type: ClusterIP @@ -1578,14 +1578,14 @@ dataService: create: true image: repository: renku/renku-data-service - tag: "0.22.0" + tag: "0.24.0" pullPolicy: IfNotPresent backgroundJobs: events: resources: {} image: repository: renku/data-service-background-jobs - tag: "0.22.0" + tag: "0.24.0" pullPolicy: IfNotPresent total: resources: {} @@ -1638,7 +1638,7 @@ authz: secretsStorage: image: repository: renku/secrets-storage - tag: "0.22.0" + tag: "0.24.0" pullPolicy: IfNotPresent service: type: ClusterIP