Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ci: trigger im-web-client e2e tests workflow #625

Merged
merged 8 commits into from
Jan 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,5 @@ GROUP_HOSTNAMES=whoami.im.c.127.0.0.1.nip.io
ADMIN_USER_EMAIL=andreas@dhis2.org
ADMIN_USER_PASSWORD=somepassword

S3_BUCKET=test-db-manager-bucket
E2E_TEST_USER_EMAIL=im-e2e-test@dhis2.org
E2E_TEST_USER_PASSWORD=somepassword
68 changes: 45 additions & 23 deletions .github/workflows/e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,39 +3,61 @@ name: e2e tests
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
workflow_dispatch:

env:
DEPLOY_ENVIRONMENT: ${{ (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'deploy')) }}

jobs:
e2e:
if: ${{ github.event_name == 'push' || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'deploy')) }}
runs-on: ubuntu-20.04
timeout-minutes: 20
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- name: Wait for deploy
if: ${{ env.DEPLOY_ENVIRONMENT == 'true' }}
# Using fork of the upstream https://github.com/lewagon/wait-on-check-action,
# see https://github.com/lewagon/wait-on-check-action/issues/85 for more info.
uses: t3chguy/wait-on-check-action@master
with:
ref: ${{ github.head_ref }}
check-name: 'call-workflow / build'
repo-token: ${{ secrets.GITHUB_TOKEN }}
allowed-conclusions: success

- name: Install prerequisites
run: sudo apt install httpie

- name: Pin kubectl to version v1.23.6 (https://github.com/aws/aws-cli/issues/6920)
- name: Construct tests target URL
run: |
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.23.6/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
BASE_HOSTNAME="api.im.dhis2.org"

- name: Configure kubectl
run: |
mkdir $PWD/.kube
echo "${{ secrets.KUBECONFIG }}" > $PWD/.kube/config
echo "KUBECONFIG=$PWD/.kube/config" >> $GITHUB_ENV
if [[ "$DEPLOY_ENVIRONMENT" == 'true' ]]; then
# convert to lower case
HEAD_BRANCH_LOWERCASE=${GITHUB_HEAD_REF,,}

- name: Run e2e
run: cd scripts/instances && ./stack_tests.sh
env:
HTTP: http --check-status
IM_HOST: https://dev.api.im.dhis2.org
USER_EMAIL: ${{ secrets.CI_TEST_USER_USER_EMAIL }}
PASSWORD: ${{ secrets.CI_TEST_USER_PASSWORD }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# substitute all non-alphanumeric chars with hyphens "-"
HEAD_BRANCH_LOWERCASE_NO_NONALPHANUMERIC=${HEAD_BRANCH_LOWERCASE//[^[:alnum:]]/-}

# trim to 25 chars, in order to fit into the 53 char Helm release name limit
# the rest of the chars up to the limit are saved for the static part of the release names
SANITIZED_HEAD_BRANCH=${HEAD_BRANCH_LOWERCASE_NO_NONALPHANUMERIC::25}

echo "TARGET_URL=https://$SANITIZED_HEAD_BRANCH.$BASE_HOSTNAME" >> $GITHUB_ENV
else
echo "TARGET_URL=https://dev.$BASE_HOSTNAME" >> $GITHUB_ENV
fi

# Don't set environment variable "API_URL" in this workflow with the action below.
# See https://github.com/convictional/trigger-workflow-and-wait/issues/62#issuecomment-1843267732
- name: Trigger E2E Playwright tests
uses: convictional/trigger-workflow-and-wait@v1.6.5
with:
owner: dhis2-sre
repo: im-web-client
github_token: ${{ secrets.DHIS2_SRE_BOT_GITHUB_TOKEN }}
workflow_file_name: playwright.yml
ref: DEVOPS-291
client_payload: '{"api_url": "${{ env.TARGET_URL }}"}'

send-slack-message:
runs-on: ubuntu-latest
Expand Down
6 changes: 5 additions & 1 deletion cmd/serve/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,14 +157,18 @@ func run() error {

integrationHandler := integration.NewHandler(dockerHubClient, cfg.InstanceService.Host, cfg.DatabaseManagerService.Host)

err = user.CreateAdminUser(cfg.AdminUser.Email, cfg.AdminUser.Password, userService, groupService)
err = user.CreateUser(cfg.AdminUser.Email, cfg.AdminUser.Password, userService, groupService, model.AdministratorGroupName, "admin")
if err != nil {
return err
}
err = createGroups(cfg, groupService)
if err != nil {
return err
}
err = user.CreateUser(cfg.E2eTestUser.Email, cfg.E2eTestUser.Password, userService, groupService, model.DefaultGroupName, "e2e test")
if err != nil {
return err
}

r := server.GetEngine(cfg.BasePath)

Expand Down
3 changes: 3 additions & 0 deletions helm/chart/templates/secret.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ data:
ADMIN_USER_EMAIL: {{ .Values.adminUser.email | b64enc }}
ADMIN_USER_PASSWORD: {{ .Values.adminUser.password | b64enc }}

E2E_TEST_USER_EMAIL: {{ .Values.e2eTestUser.email | b64enc }}
E2E_TEST_USER_PASSWORD: {{ .Values.e2eTestUser.password | b64enc }}

PRIVATE_KEY: {{ .Values.privateKey | b64enc }}
PUBLIC_KEY: {{ .Values.publicKey | b64enc }}
{{- end }}
7 changes: 5 additions & 2 deletions helm/data/secrets/dev/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ secrets:
adminUser:
email: ENC[AES256_GCM,data:8z9yVdnvtM+bHax+n263mz5K,iv:KeeoPhWFmMCGosoW5rXbLM3rgYIRD1S47BH/JusM6Qc=,tag:PdDcc0ypQ00p/tBVFjtutg==,type:str]
password: ENC[AES256_GCM,data:JGvmU6XgRilMYnm4LobXPUqrHjC2v1K+0eMcRc4nE/I=,iv:+overL7GAUD9CcAgeQu13aBlwSCqXDkaQaegNXzFS3k=,tag:lVXJpJFl+5xZoKYetg4QpA==,type:str]
e2eTestUser:
email: ENC[AES256_GCM,data:7oYnuDQMDwdl46UjqfU2KDe7IYKT,iv:lSwGGwHyMIFKxqiTaJwQ5Nrj/kaKISv3+I35NTrDMcM=,tag:ZIagn0KC0Yz96MLI26Xl2Q==,type:str]
password: ENC[AES256_GCM,data:ostWcAh6SjmkFg5IOq/+9C4YhS9TZiFsbuDB3f6UTuHtf4b5,iv:LG4DxMMy8vF87nDky3Ayn8a6wgEPGY9dCgB5prcsKpU=,tag:myxH2e0Aztqs3AjYTT/aLQ==,type:str]
database:
username: ENC[AES256_GCM,data:iKom4rh9YA==,iv:KLiHM8qBzvgbTILhlFJ9wWO0set3mtTgFUQVg5uj7qE=,tag:qh8x2VKQODDqe07EM2MahQ==,type:str]
password: ENC[AES256_GCM,data:R/jCbig/vA==,iv:ddwuxasUtlVeRavD95LAqtuA6JZ8jvnI4wTzm4S+ekE=,tag:FgmMQl/OuBgrihhGXGx6PQ==,type:str]
Expand All @@ -35,8 +38,8 @@ sops:
azure_kv: []
hc_vault: []
age: []
lastmodified: "2023-08-17T05:06:40Z"
mac: ENC[AES256_GCM,data:r7/oh7OtHz2CONWpm8SvGqur4Rzve6OuTOzbwXAaxHH+quRsAX3ubboAxHOmaW/w1K0WWWQcUhGuWkmewhJvbLc0LQXogKePbg2GqhybD4yTpP3QqxQGzZUuXfNo6OsIlP+aamljkXSY6SG+vhrkZstoUu4i8uZmSvoFoK3s3Uo=,iv:LexKfTFAXUktXeonvi3sIWY6WRX3hs8DY4ttX+oFO8Q=,tag:9xE0L1KHaAbgD5lem4OJJQ==,type:str]
lastmodified: "2023-12-20T12:42:42Z"
mac: ENC[AES256_GCM,data:RggE/PKKTU+STWQvNTU03GhbvqTXAuxQI3XHivw6kNlgmJ/O6Qr8/HYXtCyF43emImLIrj7OS9FI+MxDxR9g/Mxh5qDTCeCKdA3/3D8ANBaa8/2lNZvp9Gbz0E8Zot+IilHUaBIJyXT8u0SfDUHVy7Vw9VGGZJs1EVYYSccUScw=,iv:Q+cwfv73GuRKcC5i6QPEIdtA2y8qyzPbvOKGY6PGYDw=,tag:jS0rmI0kIuPZdPCHy1ezvA==,type:str]
pgp: []
unencrypted_suffix: _unencrypted
version: 3.7.3
7 changes: 5 additions & 2 deletions helm/data/secrets/prod/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ secrets:
adminUser:
email: ENC[AES256_GCM,data:cSZlfydBrNhHL9oG9AkP/xnk,iv:HDV3jlxArtsNVdhZLrjwL8dYBKYQfQRoxIhhsibc2vs=,tag:E/6UU2+BGS4fLZ52AuxX3w==,type:str]
password: ENC[AES256_GCM,data:yhakDKkcqHKNpLK+HCOfR+lz61K1IxRxSCbYVNSnbZY=,iv:zVadRLllf2QBJsjvs/UcWxXI9NkhMs3iaqG87+h68I8=,tag:/Zji0dVoW0M020GEUsWIQg==,type:str]
e2eTestUser:
email: ENC[AES256_GCM,data:RvH8F+WXmefOrIoE0B1GxNZ+d31Z,iv:Q0pmPvgCrD0Q6o9mMnCfOkH/Bpx8/tMqvTQ34Yaz/00=,tag:4cuoTQeRPEeCTpXIiYz2HQ==,type:str]
password: ENC[AES256_GCM,data:ytCwhkInRkiM8ucyYWN73Svam0hqwPiq0FgENQAwcIUiuLvk,iv:f3y3AP+DXOTjafTO9ajxCZtpgnQbm2nuQ05ACHjQs/g=,tag:Dwuj/ddTgiXGxDwCfEgedg==,type:str]
database:
username: ENC[AES256_GCM,data:thhg7NHEsQ==,iv:pG57pEEyVgosnK2TZjIEvJPEyAk0IgkEk5lD7pwSNlQ=,tag:cvVTZUOCOYGW5YdpNMB8Rg==,type:str]
password: ENC[AES256_GCM,data:/nd3K0ib2beMEBUPy6x33NZSAZotufSFnl6rZoUQ81c=,iv:pDP9yXJc5tIHt665WINYO/GXpIyyiAU9Kb/sxcEQaco=,tag:kNFH26L4fGEwZabrEkdx7w==,type:str]
Expand All @@ -35,8 +38,8 @@ sops:
azure_kv: []
hc_vault: []
age: []
lastmodified: "2023-08-17T05:07:29Z"
mac: ENC[AES256_GCM,data:CnuanNmQCj6jaOlm68X+byRDaCOWsMLXGEc4yYMI4WfCJvMXzCD70D83aNtSPwoYS/6JBWrhaTG1Hc3jvsMRDSrI0xJKxgoTUwMjO22aYBQhIyXKnT866xQmSKB9bFmAYNMU25bLWIf82QINBGqZhvCF0ugebYnnQnmrS/VuQEI=,iv:FJ3/+0tqj3IKOORbWqRhZit7qLng78hibfTM7KF7Sv8=,tag:1q7rCQMGzlrtvZeTVpdoxA==,type:str]
lastmodified: "2023-12-20T12:43:01Z"
mac: ENC[AES256_GCM,data:9MpmcF8eX3SRyCBqylrteAlVGeOoZzRL3T8ocwiez+YQuvAF3SRL8IfEszbQkRXlAA6BMcVYkXmYbQEj7pNlNrZa5bEw6RlEPDx3ky+F4wbu5ABBGCSu+1uhYW8OV9OTO34WC9hHoZEVHQqfK27ZFbqn+I0waS3oMqmOfCVZ9jI=,iv:j9o5u9JaR3qLzKaqssYMVmnZItiQfLTJn15LkPz4IB4=,tag:Z3ae23INu9ZOhX9doGP/og==,type:str]
pgp: []
unencrypted_suffix: _unencrypted
version: 3.7.3
14 changes: 12 additions & 2 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ type Config struct {
Authentication authentication
Groups []group
AdminUser user
DefaultUser user
E2eTestUser user
S3Bucket string
S3Region string
S3Endpoint string
Expand Down Expand Up @@ -93,7 +93,7 @@ func New() Config {
},
Groups: newGroups(),
AdminUser: newAdminUser(),
DefaultUser: user{},
E2eTestUser: newE2eTestUser(),
S3Bucket: requireEnv("S3_BUCKET"),
S3Region: requireEnv("S3_REGION"),
S3Endpoint: os.Getenv("S3_ENDPOINT"),
Expand Down Expand Up @@ -231,6 +231,16 @@ func newAdminUser() user {
}
}

func newE2eTestUser() user {
email := requireEnv("E2E_TEST_USER_EMAIL")
pw := requireEnv("E2E_TEST_USER_PASSWORD")

return user{
Email: email,
Password: pw,
}
}

func requireEnv(key string) string {
value, exists := os.LookupEnv(key)
if !exists {
Expand Down
2 changes: 1 addition & 1 deletion pkg/group/group_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ func TestGroupHandler(t *testing.T) {
groupRepository := group.NewRepository(db)
groupService := group.NewService(groupRepository, userService)

err := user.CreateAdminUser("admin", "admin", userService, groupService)
err := user.CreateUser("admin", "admin", userService, groupService, model.AdministratorGroupName, "admin")
require.NoError(t, err, "failed to create admin user and group")

client := inttest.SetupHTTPServer(t, func(engine *gin.Engine) {
Expand Down
1 change: 1 addition & 0 deletions pkg/model/group.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package model
import "time"

const AdministratorGroupName = "administrators"
const DefaultGroupName = "whoami"

// Group domain object defining a group
// swagger:model
Expand Down
2 changes: 1 addition & 1 deletion pkg/user/user_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func TestUserHandler(t *testing.T) {
groupRepository := group.NewRepository(db)
groupService := group.NewService(groupRepository, userService)

err := user.CreateAdminUser("admin", "admin", userService, groupService)
err := user.CreateUser("admin", "admin", userService, groupService, model.AdministratorGroupName, "admin")
require.NoError(t, err, "failed to create admin user and group")

authorization := middleware.NewAuthorization(userService)
Expand Down
12 changes: 6 additions & 6 deletions pkg/user/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,27 +16,27 @@ type userServiceUtil interface {
Save(user *model.User) error
}

func CreateAdminUser(email, password string, userService userServiceUtil, groupService groupService) error {
func CreateUser(email, password string, userService userServiceUtil, groupService groupService, groupName, userType string) error {
u, err := userService.FindOrCreate(email, password)
if err != nil {
return fmt.Errorf("error creating admin user: %v", err)
return fmt.Errorf("error creating %s user: %v", userType, err)
}

u.Validated = true

err = userService.Save(u)
if err != nil {
return fmt.Errorf("error saving admin user: %v", err)
return fmt.Errorf("error saving %s user: %v", userType, err)
}

g, err := groupService.FindOrCreate(model.AdministratorGroupName, "", false)
g, err := groupService.FindOrCreate(groupName, "", false)
if err != nil {
return fmt.Errorf("error creating admin group: %v", err)
return fmt.Errorf("error creating %s group: %v", groupName, err)
}

err = groupService.AddUser(g.Name, u.ID)
if err != nil {
return fmt.Errorf("error adding admin user to admin group: %v", err)
return fmt.Errorf("error adding %s user to %s group: %v", userType, groupName, err)
}

return nil
Expand Down
Loading