mirror of
https://github.com/bitnami/charts.git
synced 2026-04-02 15:27:08 +08:00
[bitnami/argo-cd] Add tests and publishing using VIB (#13177)
* [bitnami/argo-cd] Add tests and publishing using VIB Signed-off-by: FraPazGal <fdepaz@vmware.com> * Add forced clicks to workaround UI instability Signed-off-by: FraPazGal <fdepaz@vmware.com> * Improve exception handling for app-related errors Signed-off-by: FraPazGal <fdepaz@vmware.com> * Improve cypress testing stability Signed-off-by: FraPazGal <fdepaz@vmware.com> * Add cli test Signed-off-by: FraPazGal <fdepaz@vmware.com> * Add checks to avoid cypress race-condition errors Signed-off-by: FraPazGal <fdepaz@vmware.com> * Apply suggestions Signed-off-by: FraPazGal <fdepaz@vmware.com> Signed-off-by: FraPazGal <fdepaz@vmware.com>
This commit is contained in:
committed by
GitHub
parent
0994f8de3a
commit
956b34f463
11
.vib/argo-cd/cypress/cypress.json
Normal file
11
.vib/argo-cd/cypress/cypress.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"baseUrl": "https://localhost",
|
||||
"env": {
|
||||
"username": "admin",
|
||||
"password": "ComplicatedPassword123!4"
|
||||
},
|
||||
"defaultCommandTimeout": 30000,
|
||||
"pageLoadTimeout": 120000,
|
||||
"viewportWidth": 1920,
|
||||
"viewportHeight": 1080
|
||||
}
|
||||
9
.vib/argo-cd/cypress/cypress/fixtures/applications.json
Normal file
9
.vib/argo-cd/cypress/cypress/fixtures/applications.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"newApplication": {
|
||||
"name": "all-new-app-number",
|
||||
"repoUrl": "https://github.com/helm/charts-repo-actions-demo.git",
|
||||
"repoPath": "charts/example-v2",
|
||||
"clusterUrl": "https://kubernetes.default.svc",
|
||||
"namespace": "default"
|
||||
}
|
||||
}
|
||||
5
.vib/argo-cd/cypress/cypress/fixtures/projects.json
Normal file
5
.vib/argo-cd/cypress/cypress/fixtures/projects.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"newProject": {
|
||||
"name": "super-project"
|
||||
}
|
||||
}
|
||||
62
.vib/argo-cd/cypress/cypress/integration/argo_cd_spec.js
Normal file
62
.vib/argo-cd/cypress/cypress/integration/argo_cd_spec.js
Normal file
@@ -0,0 +1,62 @@
|
||||
/// <reference types="cypress" />
|
||||
import { random } from '../support/utils';
|
||||
|
||||
it('allows deploying a healthy app for a new project', () => {
|
||||
cy.login();
|
||||
|
||||
cy.visit('/settings/projects?add=true');
|
||||
cy.fixture('projects').then((projects) => {
|
||||
cy.contains('Project Name').type(`${projects.newProject.name}-${random}`);
|
||||
});
|
||||
cy.contains('button', 'Create').click();
|
||||
cy.contains('div', 'DESTINATIONS').within(() => {
|
||||
cy.contains('Edit').click();
|
||||
cy.contains('ADD DESTINATION').click();
|
||||
cy.contains('Save').click();
|
||||
// Checking the edit button is visible again ensures the changes are properly saved
|
||||
cy.contains('Edit').should('be.visible');
|
||||
});
|
||||
|
||||
cy.contains('div', 'SOURCE REPOSITORIES').within(() => {
|
||||
cy.contains('Edit').click();
|
||||
cy.contains('ADD SOURCE').click();
|
||||
cy.contains('Save').click();
|
||||
cy.contains('Edit').should('be.visible');
|
||||
});
|
||||
|
||||
cy.visit('/applications');
|
||||
cy.get('[qe-id="applications-list-button-new-app"]').click({ force: true });
|
||||
cy.fixture('applications').then((applications) => {
|
||||
cy.get('[qeid="application-create-field-app-name"]').type(
|
||||
`${applications.newApplication.name}-${random}`
|
||||
);
|
||||
cy.fixture('projects').then((projects) => {
|
||||
cy.get('[qe-id="application-create-field-project"]').type(
|
||||
`${projects.newProject.name}-${random}`
|
||||
);
|
||||
});
|
||||
cy.get('[qe-id="application-create-field-repository-url"]').type(
|
||||
applications.newApplication.repoUrl
|
||||
);
|
||||
cy.get('[qe-id="application-create-field-path"]').type(
|
||||
applications.newApplication.repoPath
|
||||
);
|
||||
cy.get('[qe-id="application-create-field-cluster-url"]').type(
|
||||
applications.newApplication.clusterUrl
|
||||
);
|
||||
cy.get('[qeid="application-create-field-namespace"]').type(
|
||||
applications.newApplication.namespace
|
||||
);
|
||||
cy.get('[qe-id="applications-list-button-create"]').click();
|
||||
|
||||
cy.get('.applications-list').within(() => {
|
||||
cy.contains(`${applications.newApplication.name}-${random}`).click();
|
||||
});
|
||||
});
|
||||
cy.get('i[class*="fa-sync"]').click();
|
||||
cy.get('[qe-id="application-sync-panel-button-synchronize"]').click();
|
||||
cy.contains('Succeeded a few seconds ago');
|
||||
cy.get('[class*="application-details__status-panel"]').within(() => {
|
||||
cy.get('[title="Healthy"]', {timeout: 60000});
|
||||
});
|
||||
});
|
||||
42
.vib/argo-cd/cypress/cypress/support/commands.js
Normal file
42
.vib/argo-cd/cypress/cypress/support/commands.js
Normal file
@@ -0,0 +1,42 @@
|
||||
const COMMAND_DELAY = 2000;
|
||||
|
||||
for (const command of ['click']) {
|
||||
Cypress.Commands.overwrite(command, (originalFn, ...args) => {
|
||||
const origVal = originalFn(...args);
|
||||
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(() => {
|
||||
resolve(origVal);
|
||||
}, COMMAND_DELAY);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Cypress.Commands.add(
|
||||
'login',
|
||||
(username = Cypress.env('username'), password = Cypress.env('password')) => {
|
||||
cy.visit('/login');
|
||||
|
||||
// Checking for UI elements before and after login avoids race-condition errors
|
||||
cy.get('.login__box');
|
||||
|
||||
cy.contains('Username').type(username);
|
||||
cy.contains('Password').type(password);
|
||||
cy.contains('Sign In').click();
|
||||
|
||||
cy.contains('Log out');
|
||||
}
|
||||
);
|
||||
|
||||
Cypress.on('uncaught:exception', (err, runnable) => {
|
||||
// we expect a 3rd party library error with message 'list not defined'
|
||||
// and don't want to fail the test so we return false
|
||||
if (
|
||||
err.message.includes('Cannot set properties of undefined') ||
|
||||
err.message.includes('Cannot read properties of null')
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
// we still want to ensure there are no other unexpected
|
||||
// errors, so we let them fail the test
|
||||
});
|
||||
20
.vib/argo-cd/cypress/cypress/support/index.js
Normal file
20
.vib/argo-cd/cypress/cypress/support/index.js
Normal file
@@ -0,0 +1,20 @@
|
||||
// ***********************************************************
|
||||
// This example support/index.js is processed and
|
||||
// loaded automatically before your test files.
|
||||
//
|
||||
// This is a great place to put global configuration and
|
||||
// behavior that modifies Cypress.
|
||||
//
|
||||
// You can change the location of this file or turn off
|
||||
// automatically serving support files with the
|
||||
// 'supportFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/configuration
|
||||
// ***********************************************************
|
||||
|
||||
// Import commands.js using ES2015 syntax:
|
||||
import './commands';
|
||||
|
||||
// Alternatively you can use CommonJS syntax:
|
||||
// require('./commands')
|
||||
3
.vib/argo-cd/cypress/cypress/support/utils.js
Normal file
3
.vib/argo-cd/cypress/cypress/support/utils.js
Normal file
@@ -0,0 +1,3 @@
|
||||
/// <reference types="cypress" />
|
||||
|
||||
export let random = (Math.random() + 1).toString(36).substring(7).toLowerCase();
|
||||
44
.vib/argo-cd/goss/goss.yaml
Normal file
44
.vib/argo-cd/goss/goss.yaml
Normal file
@@ -0,0 +1,44 @@
|
||||
http:
|
||||
http://argo-cd-server:{{ .Vars.server.service.ports.http }}:
|
||||
status: 307
|
||||
no-follow-redirects: true
|
||||
http://argo-cd-app-controller:{{ .Vars.controller.service.port }}/healthz:
|
||||
status: 200
|
||||
addr:
|
||||
tcp://argo-cd-repo-server:{{ .Vars.repoServer.service.port }}:
|
||||
reachable: true
|
||||
file:
|
||||
/app/config/ssh:
|
||||
exists: true
|
||||
filetype: directory
|
||||
mode: "2777"
|
||||
owner: root
|
||||
/app/config/server/tls:
|
||||
exists: true
|
||||
filetype: directory
|
||||
mode: "3777"
|
||||
owner: root
|
||||
/var/run/secrets/kubernetes.io/serviceaccount:
|
||||
exists: {{ .Vars.server.serviceAccount.automountServiceAccountToken }}
|
||||
filetype: directory
|
||||
mode: "3777"
|
||||
command:
|
||||
{{- $password := .Vars.server.secret.argocdServerAdminPassword }}
|
||||
check-argocd-cli:
|
||||
exec: argocd login argo-cd-server --insecure --username admin --password {{ $password }}
|
||||
exit-status: 0
|
||||
check-no-capabilities:
|
||||
exec: cat /proc/1/status
|
||||
exit-status: 0
|
||||
stdout:
|
||||
- "CapInh: 0000000000000000"
|
||||
- "CapPrm: 0000000000000000"
|
||||
- "CapEff: 0000000000000000"
|
||||
- "CapBnd: 0000000000000000"
|
||||
- "CapAmb: 0000000000000000"
|
||||
check-user-info:
|
||||
exec: id
|
||||
exit-status: 0
|
||||
stdout:
|
||||
- uid={{ .Vars.server.containerSecurityContext.runAsUser }}
|
||||
- /groups=.*{{ .Vars.server.podSecurityContext.fsGroup }}/
|
||||
21
.vib/argo-cd/goss/vars.yaml
Normal file
21
.vib/argo-cd/goss/vars.yaml
Normal file
@@ -0,0 +1,21 @@
|
||||
server:
|
||||
secret:
|
||||
argocdServerAdminPassword: ComplicatedPassword123!4
|
||||
podSecurityContext:
|
||||
fsGroup: 1002
|
||||
containerSecurityContext:
|
||||
runAsUser: 1002
|
||||
capabilities:
|
||||
drop:
|
||||
- all
|
||||
service:
|
||||
ports:
|
||||
http: 81
|
||||
serviceAccount:
|
||||
automountServiceAccountToken: true
|
||||
repoServer:
|
||||
service:
|
||||
port: 8080
|
||||
controller:
|
||||
service:
|
||||
port: 8083
|
||||
@@ -22,7 +22,7 @@
|
||||
"url": "{SHA_ARCHIVE}",
|
||||
"path": "/bitnami/argo-cd"
|
||||
},
|
||||
"runtime_parameters": "ImNvbmZpZyI6CiAgInNlY3JldCI6CiAgICAiYXJnb2NkU2VydmVyQWRtaW5QYXNzd29yZCI6ICJLak1mZHpjamtwM0siCiJyZWRpcyI6CiAgImF1dGgiOgogICAgInBhc3N3b3JkIjogImpuZGZERmYiCiJzZXJ2ZXIiOgogICJzZXJ2aWNlIjoKICAgICJwb3J0cyI6CiAgICAgICJodHRwIjogODAKICAgICJ0eXBlIjogIkxvYWRCYWxhbmNlciI=",
|
||||
"runtime_parameters": "Y29uZmlnOgogIGtub3duSG9zdHM6IHwKICAgIGdpdGh1Yi5jb20gc3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkl3QUFBUUVBcTJBN2hSR21kbm05dFVEYk85SURTd0JLNlRiUWErUFhZUENQeTZyYlRyVHR3N1BIa2NjS3JwcDB5VmhwNUhkRUljS3I2cExsVkRCZk9MWDlRVXN5Q09WMHd6ZmpJSk5sR0VZc2RsTEppekhoYm4ybVVqdlNBSFFxWkVUWVA4MWVGekxRTm5QSHQ0RVZWVWg3VmZERVNVODRLZXptRDVRbFdwWExtdlUzMS95TWYrU2U4eGhIVHZLU0NaSUZJbVd3b0c2bWJVb1dmOW56cElvYVNqQit3ZXFxVVVtcGFhYXNYVmFsNzJKK1VYMkIrMlJQVzNSY1QwZU96UWdxbEpMM1JLclRKdmRzakUzSkVBdkdxM2xHSFNaWHkyOEczc2t1YTJTbVZpL3c0eUNFNmdiT0RxblRXbGc3K3dDNjA0eWRHWEE4VkppUzVhcDQzSlhpVUZGQWFRPT0KICBzZWNyZXQ6CiAgICBjcmVhdGU6IHRydWUKICAgIGFyZ29jZFNlcnZlckFkbWluUGFzc3dvcmQ6IENvbXBsaWNhdGVkUGFzc3dvcmQxMjMhNApjb250cm9sbGVyOgogIGNsdXN0ZXJBZG1pbkFjY2VzczogdHJ1ZQogIHNlcnZpY2U6CiAgICBwb3J0OiA4MDgzCnNlcnZlcjoKICBwb2RTZWN1cml0eUNvbnRleHQ6CiAgICBlbmFibGVkOiB0cnVlCiAgICBmc0dyb3VwOiAxMDAyCiAgY29udGFpbmVyU2VjdXJpdHlDb250ZXh0OgogICAgZW5hYmxlZDogdHJ1ZQogICAgcnVuQXNVc2VyOiAxMDAyCiAgICByZWFkT25seVJvb3RGaWxlc3lzdGVtOiBmYWxzZQogICAgY2FwYWJpbGl0aWVzOgogICAgICBkcm9wOgogICAgICAtIGFsbAogIGluc2VjdXJlOiBmYWxzZQogIGNvbmZpZ0VuYWJsZWQ6IHRydWUKICBjb250YWluZXJQb3J0czoKICAgIGh0dHA6IDgwODAKICAgIGh0dHBzOiA4NDQzCiAgc2VydmljZToKICAgIHBvcnRzOgogICAgICBodHRwOiA4MQogICAgICBodHRwczogNDQzCiAgICB0eXBlOiBMb2FkQmFsYW5jZXIKICBzZXJ2aWNlQWNjb3VudDoKICAgIGNyZWF0ZTogdHJ1ZQogICAgYXV0b21vdW50U2VydmljZUFjY291bnRUb2tlbjogdHJ1ZQpyZXBvU2VydmVyOgogIHNlcnZpY2U6CiAgICBwb3J0OiA4MDgwCnJiYWM6CiAgY3JlYXRlOiB0cnVlCnJlZGlzOgogIGVuYWJsZWQ6IHRydWUKICBhdXRoOgogICAgZW5hYmxlZDogdHJ1ZQogICAgcGFzc3dvcmQ6IHNvbWVDb21wbGljYXRlZFBhc3MxMjM0NSEKICBhcmNoaXRlY3R1cmU6IHN0YW5kYWxvbmU=",
|
||||
"target_platform": {
|
||||
"target_platform_id": "{VIB_ENV_TARGET_PLATFORM}",
|
||||
"size": {
|
||||
@@ -34,8 +34,34 @@
|
||||
{
|
||||
"action_id": "health-check",
|
||||
"params": {
|
||||
"endpoint": "lb-argo-cd-server-http",
|
||||
"app_protocol": "HTTP"
|
||||
"endpoint": "lb-argo-cd-server-https",
|
||||
"app_protocol": "HTTPS"
|
||||
}
|
||||
},
|
||||
{
|
||||
"action_id": "goss",
|
||||
"params": {
|
||||
"resources": {
|
||||
"path": "/.vib/argo-cd/goss"
|
||||
},
|
||||
"remote": {
|
||||
"workload": "deploy-argo-cd-server"
|
||||
},
|
||||
"vars_file": "vars.yaml"
|
||||
}
|
||||
},
|
||||
{
|
||||
"action_id": "cypress",
|
||||
"params": {
|
||||
"resources": {
|
||||
"path": "/.vib/argo-cd/cypress"
|
||||
},
|
||||
"endpoint": "lb-argo-cd-server-https",
|
||||
"app_protocol": "HTTPS",
|
||||
"env": {
|
||||
"username": "admin",
|
||||
"password": "ComplicatedPassword123!4"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
"url": "{SHA_ARCHIVE}",
|
||||
"path": "/bitnami/argo-cd"
|
||||
},
|
||||
"runtime_parameters": "ImNvbmZpZyI6CiAgInNlY3JldCI6CiAgICAiYXJnb2NkU2VydmVyQWRtaW5QYXNzd29yZCI6ICJLak1mZHpjamtwM0siCiJyZWRpcyI6CiAgImF1dGgiOgogICAgInBhc3N3b3JkIjogImpuZGZERmYiCiJzZXJ2ZXIiOgogICJzZXJ2aWNlIjoKICAgICJwb3J0cyI6CiAgICAgICJodHRwIjogODAKICAgICJ0eXBlIjogIkxvYWRCYWxhbmNlciI=",
|
||||
"runtime_parameters": "Y29uZmlnOgogIGtub3duSG9zdHM6IHwKICAgIGdpdGh1Yi5jb20gc3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkl3QUFBUUVBcTJBN2hSR21kbm05dFVEYk85SURTd0JLNlRiUWErUFhZUENQeTZyYlRyVHR3N1BIa2NjS3JwcDB5VmhwNUhkRUljS3I2cExsVkRCZk9MWDlRVXN5Q09WMHd6ZmpJSk5sR0VZc2RsTEppekhoYm4ybVVqdlNBSFFxWkVUWVA4MWVGekxRTm5QSHQ0RVZWVWg3VmZERVNVODRLZXptRDVRbFdwWExtdlUzMS95TWYrU2U4eGhIVHZLU0NaSUZJbVd3b0c2bWJVb1dmOW56cElvYVNqQit3ZXFxVVVtcGFhYXNYVmFsNzJKK1VYMkIrMlJQVzNSY1QwZU96UWdxbEpMM1JLclRKdmRzakUzSkVBdkdxM2xHSFNaWHkyOEczc2t1YTJTbVZpL3c0eUNFNmdiT0RxblRXbGc3K3dDNjA0eWRHWEE4VkppUzVhcDQzSlhpVUZGQWFRPT0KICBzZWNyZXQ6CiAgICBjcmVhdGU6IHRydWUKICAgIGFyZ29jZFNlcnZlckFkbWluUGFzc3dvcmQ6IENvbXBsaWNhdGVkUGFzc3dvcmQxMjMhNApjb250cm9sbGVyOgogIGNsdXN0ZXJBZG1pbkFjY2VzczogdHJ1ZQogIHNlcnZpY2U6CiAgICBwb3J0OiA4MDgzCnNlcnZlcjoKICBwb2RTZWN1cml0eUNvbnRleHQ6CiAgICBlbmFibGVkOiB0cnVlCiAgICBmc0dyb3VwOiAxMDAyCiAgY29udGFpbmVyU2VjdXJpdHlDb250ZXh0OgogICAgZW5hYmxlZDogdHJ1ZQogICAgcnVuQXNVc2VyOiAxMDAyCiAgICByZWFkT25seVJvb3RGaWxlc3lzdGVtOiBmYWxzZQogICAgY2FwYWJpbGl0aWVzOgogICAgICBkcm9wOgogICAgICAtIGFsbAogIGluc2VjdXJlOiBmYWxzZQogIGNvbmZpZ0VuYWJsZWQ6IHRydWUKICBjb250YWluZXJQb3J0czoKICAgIGh0dHA6IDgwODAKICAgIGh0dHBzOiA4NDQzCiAgc2VydmljZToKICAgIHBvcnRzOgogICAgICBodHRwOiA4MQogICAgICBodHRwczogNDQzCiAgICB0eXBlOiBMb2FkQmFsYW5jZXIKICBzZXJ2aWNlQWNjb3VudDoKICAgIGNyZWF0ZTogdHJ1ZQogICAgYXV0b21vdW50U2VydmljZUFjY291bnRUb2tlbjogdHJ1ZQpyZXBvU2VydmVyOgogIHNlcnZpY2U6CiAgICBwb3J0OiA4MDgwCnJiYWM6CiAgY3JlYXRlOiB0cnVlCnJlZGlzOgogIGVuYWJsZWQ6IHRydWUKICBhdXRoOgogICAgZW5hYmxlZDogdHJ1ZQogICAgcGFzc3dvcmQ6IHNvbWVDb21wbGljYXRlZFBhc3MxMjM0NSEKICBhcmNoaXRlY3R1cmU6IHN0YW5kYWxvbmU=",
|
||||
"target_platform": {
|
||||
"target_platform_id": "{VIB_ENV_TARGET_PLATFORM}",
|
||||
"size": {
|
||||
@@ -34,8 +34,34 @@
|
||||
{
|
||||
"action_id": "health-check",
|
||||
"params": {
|
||||
"endpoint": "lb-argo-cd-server-http",
|
||||
"app_protocol": "HTTP"
|
||||
"endpoint": "lb-argo-cd-server-https",
|
||||
"app_protocol": "HTTPS"
|
||||
}
|
||||
},
|
||||
{
|
||||
"action_id": "goss",
|
||||
"params": {
|
||||
"resources": {
|
||||
"path": "/.vib/argo-cd/goss"
|
||||
},
|
||||
"remote": {
|
||||
"workload": "deploy-argo-cd-server"
|
||||
},
|
||||
"vars_file": "vars.yaml"
|
||||
}
|
||||
},
|
||||
{
|
||||
"action_id": "cypress",
|
||||
"params": {
|
||||
"resources": {
|
||||
"path": "/.vib/argo-cd/cypress"
|
||||
},
|
||||
"endpoint": "lb-argo-cd-server-https",
|
||||
"app_protocol": "HTTPS",
|
||||
"env": {
|
||||
"username": "admin",
|
||||
"password": "ComplicatedPassword123!4"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user