[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:
Francisco de Paz Galan
2022-10-31 14:50:18 +01:00
committed by GitHub
parent 0994f8de3a
commit 956b34f463
18 changed files with 300 additions and 16 deletions

View File

@@ -6,6 +6,7 @@ on: # rebuild any PRs and main branch changes
paths:
- 'bitnami/airflow/**'
- 'bitnami/apache/**'
- 'bitnami/argo-cd/**'
- 'bitnami/aspnet-core/**'
- 'bitnami/cassandra/**'
- 'bitnami/cert-manager/**'

View File

@@ -0,0 +1,11 @@
{
"baseUrl": "https://localhost",
"env": {
"username": "admin",
"password": "ComplicatedPassword123!4"
},
"defaultCommandTimeout": 30000,
"pageLoadTimeout": 120000,
"viewportWidth": 1920,
"viewportHeight": 1080
}

View 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"
}
}

View File

@@ -0,0 +1,5 @@
{
"newProject": {
"name": "super-project"
}
}

View 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});
});
});

View 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
});

View 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')

View File

@@ -0,0 +1,3 @@
/// <reference types="cypress" />
export let random = (Math.random() + 1).toString(36).substring(7).toLowerCase();

View 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 }}/

View 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

View File

@@ -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"
}
}
}
]

View File

@@ -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"
}
}
}
]

View File

@@ -30,4 +30,4 @@ sources:
- https://github.com/argoproj/argo-cd/
- https://github.com/bitnami/containers/tree/main/bitnami/dex
- https://github.com/dexidp/dex
version: 4.2.7
version: 4.3.0

View File

@@ -33,6 +33,13 @@ Return the proper service name for Argo CD controller
{{- printf "%s-app-controller" (include "common.names.fullname" .) | trunc 63 | trimSuffix "-" }}
{{- end -}}
{{/*
Return the proper service name for Argo CD controller adding the working namespace
*/}}
{{- define "argocd.namespace.application-controller" -}}
{{- printf "%s-app-controller" (include "common.names.fullname.namespace" .) | trunc 63 | trimSuffix "-" }}
{{- end -}}
{{/*
Return the proper service name for Argo CD server
*/}}
@@ -40,6 +47,13 @@ Return the proper service name for Argo CD server
{{- printf "%s-server" (include "common.names.fullname" .) | trunc 63 | trimSuffix "-" }}
{{- end -}}
{{/*
Return the proper service name for Argo CD server adding the working namespace
*/}}
{{- define "argocd.namespace.server" -}}
{{- printf "%s-server" (include "common.names.fullname.namespace" .) | trunc 63 | trimSuffix "-" }}
{{- end -}}
{{/*
Return the proper service name for Argo CD repo server
*/}}

View File

@@ -2,7 +2,7 @@
apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }}
kind: ClusterRole
metadata:
name: {{ include "argocd.application-controller" . }}
name: {{ include "argocd.namespace.application-controller" . }}
namespace: {{ .Release.Namespace | quote }}
labels: {{- include "common.labels.standard" . | nindent 4 }}
{{- if .Values.commonLabels }}
@@ -26,4 +26,4 @@ rules:
verbs:
- '*'
{{- end }}
{{- end }}
{{- end }}

View File

@@ -2,7 +2,7 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: {{ include "argocd.application-controller" . }}
name: {{ include "argocd.namespace.application-controller" . }}
namespace: {{ .Release.Namespace | quote }}
labels: {{- include "common.labels.standard" . | nindent 4 }}
{{- if .Values.commonLabels }}
@@ -14,7 +14,7 @@ metadata:
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ include "argocd.application-controller" . }}
name: {{ include "argocd.namespace.application-controller" . }}
subjects:
- kind: ServiceAccount
name: {{ include "argocd.application-controller.serviceAccountName" . }}

View File

@@ -2,7 +2,7 @@
apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }}
kind: ClusterRole
metadata:
name: {{ include "argocd.server" . }}
name: {{ include "argocd.namespace.server" . }}
namespace: {{ .Release.Namespace | quote }}
labels: {{- include "common.labels.standard" . | nindent 4 }}
{{- if .Values.commonLabels }}
@@ -33,4 +33,4 @@ rules:
- pods/log
verbs:
- get
{{- end }}
{{- end }}

View File

@@ -2,7 +2,7 @@
kind: ClusterRoleBinding
apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }}
metadata:
name: {{ include "argocd.server" . }}
name: {{ include "argocd.namespace.server" . }}
namespace: {{ .Release.Namespace | quote }}
labels: {{- include "common.labels.standard" . | nindent 4 }}
app.kubernetes.io/component: server
@@ -15,9 +15,9 @@ metadata:
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ include "argocd.server" . }}
name: {{ include "argocd.namespace.server" . }}
subjects:
- kind: ServiceAccount
name: {{ include "argocd.server.serviceAccountName" . }}
namespace: {{ .Release.Namespace }}
{{- end }}
{{- end }}