diff --git a/.github/workflows/cd-pipeline.yaml b/.github/workflows/cd-pipeline.yaml index a9ad94ce78..4dcb6ac503 100644 --- a/.github/workflows/cd-pipeline.yaml +++ b/.github/workflows/cd-pipeline.yaml @@ -44,6 +44,7 @@ on: # rebuild any PRs and main branch changes - 'bitnami/odoo/**' - 'bitnami/opencart/**' - 'bitnami/owncloud/**' + - 'bitnami/parse/**' - 'bitnami/phpbb/**' - 'bitnami/phpmyadmin/**' - 'bitnami/pinniped/**' diff --git a/.vib/parse/cypress/cypress.json b/.vib/parse/cypress/cypress.json new file mode 100644 index 0000000000..b42e01729a --- /dev/null +++ b/.vib/parse/cypress/cypress.json @@ -0,0 +1,7 @@ +{ + "baseUrl": "http://localhost", + "env": { + "appId": "testApp", + "masterKey": "M4ster#K3y" + } +} diff --git a/.vib/parse/cypress/cypress/fixtures/high_score_stats.json b/.vib/parse/cypress/cypress/fixtures/high_score_stats.json new file mode 100644 index 0000000000..f064b5b3b5 --- /dev/null +++ b/.vib/parse/cypress/cypress/fixtures/high_score_stats.json @@ -0,0 +1,4 @@ +{ + "playerName": "CharliP", + "score": "1997" +} diff --git a/.vib/parse/cypress/cypress/integration/parse_spec.js b/.vib/parse/cypress/cypress/integration/parse_spec.js new file mode 100644 index 0000000000..dbe142958a --- /dev/null +++ b/.vib/parse/cypress/cypress/integration/parse_spec.js @@ -0,0 +1,30 @@ +/// +import { random } from '../support/utils'; +import highScoreStats from '../fixtures/high_score_stats.json'; + +it('allows store and retrieve a new object', () => { + const NEW_CLASS_NAME = `BitnamiClass${random}`; + const AUTH_HEADERS = { + 'X-Parse-Application-Id': Cypress.env('appId'), + 'X-Parse-Master-Key': Cypress.env('masterKey'), + }; + + cy.request({ + method: 'POST', + url: `/parse/classes/${NEW_CLASS_NAME}`, + headers: AUTH_HEADERS, + body: highScoreStats, + }).then((response) => { + expect(response.status).to.eq(201); + expect(response.body).to.include.keys(['objectId']); + + cy.request({ + method: 'GET', + url: `/parse/classes/${NEW_CLASS_NAME}/${response.body.objectId}`, + headers: AUTH_HEADERS, + }).then((response) => { + expect(response.status).to.eq(200); + expect(response.body).to.contain(highScoreStats); + }); + }); +}); diff --git a/.vib/parse/cypress/cypress/support/utils.js b/.vib/parse/cypress/cypress/support/utils.js new file mode 100644 index 0000000000..f0217c9773 --- /dev/null +++ b/.vib/parse/cypress/cypress/support/utils.js @@ -0,0 +1,3 @@ +/// + +export let random = (Math.random() + 1).toString(36).substring(7); diff --git a/.vib/parse/goss/dashboard/goss.yaml b/.vib/parse/goss/dashboard/goss.yaml new file mode 100644 index 0000000000..d755aa5d8b --- /dev/null +++ b/.vib/parse/goss/dashboard/goss.yaml @@ -0,0 +1,25 @@ +file: + /bitnami/parse-dashboard: + exists: true + filetype: directory + mode: "2777" + owner: root + /opt/bitnami/parse-dashboard/config.json: + exists: true + filetype: file + mode: "0644" + contains: + - /masterKey.*{{ .Vars.server.masterKey }}/ + - /user.*{{ .Vars.dashboard.username }}/ + - /pass.*{{ .Vars.dashboard.password }}/ + /var/run/secrets/kubernetes.io/serviceaccount: + exists: {{ .Vars.serviceAccount.automountServiceAccountToken }} + filetype: directory + mode: "3777" +command: + check-user-info: + exec: id + exit-status: 0 + stdout: + - uid={{ .Vars.dashboard.containerSecurityContext.runAsUser }} + - /groups=.*{{ .Vars.dashboard.podSecurityContext.fsGroup }}/ diff --git a/.vib/parse/goss/dashboard/vars.yaml b/.vib/parse/goss/dashboard/vars.yaml new file mode 100644 index 0000000000..52a469d135 --- /dev/null +++ b/.vib/parse/goss/dashboard/vars.yaml @@ -0,0 +1,11 @@ +server: + masterKey: "M4ster#K3y" +dashboard: + podSecurityContext: + fsGroup: 1002 + containerSecurityContext: + runAsUser: 1002 + username: parseUser + password: "ComplicatedPassword123!4" +serviceAccount: + automountServiceAccountToken: true \ No newline at end of file diff --git a/.vib/parse/goss/server/goss.yaml b/.vib/parse/goss/server/goss.yaml new file mode 100644 index 0000000000..ff504c7860 --- /dev/null +++ b/.vib/parse/goss/server/goss.yaml @@ -0,0 +1,24 @@ +file: + /bitnami/parse: + exists: true + filetype: directory + mode: "2775" + owner: root + /opt/bitnami/parse/config.json: + exists: true + filetype: file + mode: "0644" + contains: + - /port.*{{ .Vars.server.containerPorts.http }}/ + - /database.*{{ .Vars.mongodb.auth.username }}.*{{ .Vars.mongodb.auth.password }}.*{{ .Vars.mongodb.auth.database }}/ + /var/run/secrets/kubernetes.io/serviceaccount: + exists: {{ .Vars.serviceAccount.automountServiceAccountToken }} + filetype: directory + mode: "3777" +command: + check-user-info: + exec: id + exit-status: 0 + stdout: + - uid={{ .Vars.server.containerSecurityContext.runAsUser }} + - /groups=.*{{ .Vars.server.podSecurityContext.fsGroup }}/ \ No newline at end of file diff --git a/.vib/parse/goss/server/vars.yaml b/.vib/parse/goss/server/vars.yaml new file mode 100644 index 0000000000..80684f21ed --- /dev/null +++ b/.vib/parse/goss/server/vars.yaml @@ -0,0 +1,14 @@ +server: + containerPorts: + http: 1338 + podSecurityContext: + fsGroup: 1002 + containerSecurityContext: + runAsUser: 1002 +serviceAccount: + automountServiceAccountToken: true +mongodb: + auth: + username: bn_test_parse + password: "M0ngoP4ss" + database: bitnami_parse diff --git a/.vib/parse/vib-publish.json b/.vib/parse/vib-publish.json index c5099a0e50..c23382176a 100644 --- a/.vib/parse/vib-publish.json +++ b/.vib/parse/vib-publish.json @@ -22,7 +22,7 @@ "url": "{SHA_ARCHIVE}", "path": "/bitnami/parse" }, - "runtime_parameters": "InNlcnZlciI6CiAgInNlcnZpY2UiOgogICAgInBvcnRzIjoKICAgICAgImh0dHAiOiA4MAogICJ0eXBlIjogIkxvYWRCYWxhbmNlciIK", + "runtime_parameters": "c2VydmVyOgogIGhvc3Q6IHBhcnNlLmxvY2FsCiAgYXBwSWQ6IHRlc3RBcHAKICBtYXN0ZXJLZXk6ICJNNHN0ZXIjSzN5IgogIHNlcnZpY2U6CiAgICB0eXBlOiBMb2FkQmFsYW5jZXIKICAgIHBvcnRzOgogICAgICBodHRwOiA4MAogIGNvbnRhaW5lclBvcnRzOgogICAgaHR0cDogMTMzOAogIHBvZFNlY3VyaXR5Q29udGV4dDoKICAgIGVuYWJsZWQ6IHRydWUKICAgIGZzR3JvdXA6IDEwMDIKICBjb250YWluZXJTZWN1cml0eUNvbnRleHQ6CiAgICBlbmFibGVkOiB0cnVlCiAgICBydW5Bc1VzZXI6IDEwMDIKZGFzaGJvYXJkOgogIGVuYWJsZWQ6IHRydWUKICBjb250YWluZXJQb3J0czoKICAgIGh0dHA6IDQwNDAKICBwb2RTZWN1cml0eUNvbnRleHQ6CiAgICBlbmFibGVkOiB0cnVlCiAgICBmc0dyb3VwOiAxMDAyCiAgY29udGFpbmVyU2VjdXJpdHlDb250ZXh0OgogICAgZW5hYmxlZDogdHJ1ZQogICAgcnVuQXNVc2VyOiAxMDAyCiAgdXNlcm5hbWU6IHBhcnNlVXNlcgogIHBhc3N3b3JkOiAiQ29tcGxpY2F0ZWRQYXNzd29yZDEyMyE0IgogIGFwcE5hbWU6IENoaWNrZW5HYW1lCiAgc2VydmljZToKICAgIHR5cGU6IExvYWRCYWxhbmNlcgogICAgcG9ydHM6CiAgICAgIGh0dHA6IDgwCnNlcnZpY2VBY2NvdW50OgogIGNyZWF0ZTogdHJ1ZQogIGF1dG9tb3VudFNlcnZpY2VBY2NvdW50VG9rZW46IHRydWUKbW9uZ29kYjoKICBlbmFibGVkOiB0cnVlCiAgYXV0aDogCiAgICBlbmFibGVkOiB0cnVlCiAgICB1c2VybmFtZTogYm5fdGVzdF9wYXJzZQogICAgcGFzc3dvcmQ6ICJNMG5nb1A0c3MiCiAgICBkYXRhYmFzZTogYml0bmFtaV9wYXJzZQo=", "target_platform": { "target_platform_id": "{VIB_ENV_TARGET_PLATFORM}", "size": { @@ -34,7 +34,45 @@ { "action_id": "health-check", "params": { - "endpoint": "lb-parse-http-server" + "endpoint": "lb-parse-dasboard-http-dashboard" + } + }, + { + "action_id": "goss", + "params": { + "resources": { + "path": "/.vib/parse/goss/server" + }, + "remote": { + "workload": "deploy-parse-server" + }, + "vars_file": "vars.yaml" + } + }, + { + "action_id": "goss", + "params": { + "resources": { + "path": "/.vib/parse/goss/dashboard" + }, + "remote": { + "workload": "deploy-parse-dashboard" + }, + "vars_file": "vars.yaml" + } + }, + { + "action_id": "cypress", + "params": { + "resources": { + "path": "/.vib/parse/cypress" + }, + "endpoint": "lb-parse-http-server", + "app_protocol": "HTTP", + "env": { + "appId": "testApp", + "masterKey": "M4ster#K3y" + } } } ] diff --git a/.vib/parse/vib-verify.json b/.vib/parse/vib-verify.json index 11183f319f..40154a0dc3 100644 --- a/.vib/parse/vib-verify.json +++ b/.vib/parse/vib-verify.json @@ -22,7 +22,7 @@ "url": "{SHA_ARCHIVE}", "path": "/bitnami/parse" }, - "runtime_parameters": "InNlcnZlciI6CiAgInNlcnZpY2UiOgogICAgInBvcnRzIjoKICAgICAgImh0dHAiOiA4MAogICJ0eXBlIjogIkxvYWRCYWxhbmNlciIK", + "runtime_parameters": "c2VydmVyOgogIGhvc3Q6IHBhcnNlLmxvY2FsCiAgYXBwSWQ6IHRlc3RBcHAKICBtYXN0ZXJLZXk6ICJNNHN0ZXIjSzN5IgogIHNlcnZpY2U6CiAgICB0eXBlOiBMb2FkQmFsYW5jZXIKICAgIHBvcnRzOgogICAgICBodHRwOiA4MAogIGNvbnRhaW5lclBvcnRzOgogICAgaHR0cDogMTMzOAogIHBvZFNlY3VyaXR5Q29udGV4dDoKICAgIGVuYWJsZWQ6IHRydWUKICAgIGZzR3JvdXA6IDEwMDIKICBjb250YWluZXJTZWN1cml0eUNvbnRleHQ6CiAgICBlbmFibGVkOiB0cnVlCiAgICBydW5Bc1VzZXI6IDEwMDIKZGFzaGJvYXJkOgogIGVuYWJsZWQ6IHRydWUKICBjb250YWluZXJQb3J0czoKICAgIGh0dHA6IDQwNDAKICBwb2RTZWN1cml0eUNvbnRleHQ6CiAgICBlbmFibGVkOiB0cnVlCiAgICBmc0dyb3VwOiAxMDAyCiAgY29udGFpbmVyU2VjdXJpdHlDb250ZXh0OgogICAgZW5hYmxlZDogdHJ1ZQogICAgcnVuQXNVc2VyOiAxMDAyCiAgdXNlcm5hbWU6IHBhcnNlVXNlcgogIHBhc3N3b3JkOiAiQ29tcGxpY2F0ZWRQYXNzd29yZDEyMyE0IgogIGFwcE5hbWU6IENoaWNrZW5HYW1lCiAgc2VydmljZToKICAgIHR5cGU6IExvYWRCYWxhbmNlcgogICAgcG9ydHM6CiAgICAgIGh0dHA6IDgwCnNlcnZpY2VBY2NvdW50OgogIGNyZWF0ZTogdHJ1ZQogIGF1dG9tb3VudFNlcnZpY2VBY2NvdW50VG9rZW46IHRydWUKbW9uZ29kYjoKICBlbmFibGVkOiB0cnVlCiAgYXV0aDogCiAgICBlbmFibGVkOiB0cnVlCiAgICB1c2VybmFtZTogYm5fdGVzdF9wYXJzZQogICAgcGFzc3dvcmQ6ICJNMG5nb1A0c3MiCiAgICBkYXRhYmFzZTogYml0bmFtaV9wYXJzZQo=", "target_platform": { "target_platform_id": "{VIB_ENV_TARGET_PLATFORM}", "size": { @@ -34,7 +34,45 @@ { "action_id": "health-check", "params": { - "endpoint": "lb-parse-http-server" + "endpoint": "lb-parse-dashboard-http-dashboard" + } + }, + { + "action_id": "goss", + "params": { + "resources": { + "path": "/.vib/parse/goss/server" + }, + "remote": { + "workload": "deploy-parse-server" + }, + "vars_file": "vars.yaml" + } + }, + { + "action_id": "goss", + "params": { + "resources": { + "path": "/.vib/parse/goss/dashboard" + }, + "remote": { + "workload": "deploy-parse-dashboard" + }, + "vars_file": "vars.yaml" + } + }, + { + "action_id": "cypress", + "params": { + "resources": { + "path": "/.vib/parse/cypress" + }, + "endpoint": "lb-parse-http-server", + "app_protocol": "HTTP", + "env": { + "appId": "testApp", + "masterKey": "M4ster#K3y" + } } } ]