diff --git a/.github/workflows/on-pull-request-run-tests.yml b/.github/workflows/on-pull-request-run-tests.yml index fd601f55aa..3c536a0f82 100644 --- a/.github/workflows/on-pull-request-run-tests.yml +++ b/.github/workflows/on-pull-request-run-tests.yml @@ -376,17 +376,15 @@ jobs: with: install: false start: npm run docker:run:awx - wait-on: 'http://localhost:4101' + wait-on: 'https://localhost:4101' record: true parallel: true auto-cancel-after-failures: 1 config-file: cypress.awx.config.ts env: - AWX_PROTOCOL: ${{ secrets.AWX_PROTOCOL }} - AWX_HOST: ${{ secrets.AWX_HOST }} - AWX_SERVER: ${{ secrets.CYPRESS_AWX_SERVER }} - AWX_USERNAME: ${{ secrets.CYPRESS_AWX_USERNAME }} - AWX_PASSWORD: ${{ secrets.CYPRESS_AWX_PASSWORD }} + AWX_SERVER: ${{ vars.AWX_SERVER }} + AWX_USERNAME: ${{ vars.AWX_USERNAME }} + AWX_PASSWORD: ${{ secrets.AWX_PASSWORD }} CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_AUI_AWX_E2E_PROJECT_ID }} CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_AUI_AWX_E2E_RECORD_KEY }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -490,11 +488,9 @@ jobs: # auto-cancel-after-failures: 1 # config-file: cypress.hub.config.ts # env: - # HUB_HOST: ${{ secrets.HUB_HOST }} - # HUB_PROTOCOL: ${{ secrets.HUB_PROTOCOL }} - # CYPRESS_HUB_SERVER: http://localhost:5001 - # CYPRESS_HUB_USERNAME: admin - # CYPRESS_HUB_PASSWORD: password + # HUB_SERVER: ${{ vars.HUB_SERVER }} + # HUB_USERNAME: ${{ vars.HUB_USERNAME }} + # HUB_PASSWORD: ${{ secrets.HUB_PASSWORD }} # CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_AUI_HUB_E2E_PROJECT_ID }} # CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_AUI_HUB_E2E_RECORD_KEY }} # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -592,20 +588,18 @@ jobs: with: install: false start: npm run docker:run:eda - wait-on: 'http://localhost:4103' + wait-on: 'https://localhost:4103' record: true parallel: true auto-cancel-after-failures: 1 config-file: cypress.eda.config.ts env: - EDA_PROTOCOL: ${{ secrets.EDA_PROTOCOL }} - EDA_HOST: ${{ secrets.EDA_HOST }} - AWX_SERVER: ${{ secrets.CYPRESS_AWX_SERVER }} - AWX_USERNAME: ${{ secrets.CYPRESS_AWX_USERNAME }} - AWX_PASSWORD: ${{ secrets.CYPRESS_AWX_PASSWORD }} - EDA_SERVER: ${{ secrets.CYPRESS_EDA_SERVER }} - EDA_USERNAME: ${{ secrets.CYPRESS_EDA_USERNAME }} - EDA_PASSWORD: ${{ secrets.CYPRESS_EDA_PASSWORD }} + AWX_SERVER: ${{ vars.AWX_SERVER }} + AWX_USERNAME: ${{ vars.AWX_USERNAME }} + AWX_PASSWORD: ${{ secrets.AWX_PASSWORD }} + EDA_SERVER: ${{ vars.EDA_SERVER }} + EDA_USERNAME: ${{ vars.EDA_USERNAME }} + EDA_PASSWORD: ${{ secrets.EDA_PASSWORD }} CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_AUI_EDA_E2E_PROJECT_ID }} CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_AUI_EDA_E2E_RECORD_KEY }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/Dockerfile b/Dockerfile index dba3cbcc2f..4912e954ce 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,7 @@ +FROM nginx:alpine as certificate +RUN apk add --no-cache openssl +RUN openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/nginx-selfsigned.key -out /etc/ssl/nginx-selfsigned.crt -subj "/C=US/ST=State/L=City/O=Organization/CN=localhost" + # base - nginx + openshift # # https://docs.openshift.com/container-platform/4.13/openshift_images/create-images.html#use-uid_create-images @@ -11,8 +15,11 @@ # and be read/writable by that group. Files to be executed must also have group execute permissions. # FROM --platform=${TARGETPLATFORM:-linux/amd64} nginx:alpine as base -RUN chmod g+rwx /etc/nginx/nginx.conf /etc/nginx/conf.d /etc/nginx/conf.d/default.conf /var/cache/nginx /var/run /var/log/nginx +COPY --from=certificate /etc/ssl/nginx-selfsigned.crt /etc/ssl/nginx-selfsigned.crt +COPY --from=certificate /etc/ssl/nginx-selfsigned.key /etc/ssl/nginx-selfsigned.key +RUN chmod g+rwx /etc/nginx/nginx.conf /etc/nginx/conf.d /etc/nginx/conf.d/default.conf /var/cache/nginx /var/run /var/log/nginx /etc/ssl COPY /nginx/nginx.conf /etc/nginx/nginx.conf +EXPOSE 443 # awx-ui FROM base as awx-ui diff --git a/cypress.awx.config.ts b/cypress.awx.config.ts index a088c497b0..95e69d0818 100644 --- a/cypress.awx.config.ts +++ b/cypress.awx.config.ts @@ -4,7 +4,7 @@ import setValue from 'set-value'; import { baseConfig } from './cypress.base.config'; baseConfig.e2e!.specPattern = 'cypress/e2e/awx/**/*.cy.ts'; -baseConfig.e2e!.baseUrl = 'http://localhost:4101'; +baseConfig.e2e!.baseUrl = 'https://localhost:4101'; baseConfig.component!.specPattern = 'frontend/awx/**/*.cy.{js,jsx,ts,tsx}'; setValue(baseConfig, 'component.devServer.webpackConfig.devServer.port', 4201); diff --git a/cypress.eda.config.ts b/cypress.eda.config.ts index fa979bc9a9..eaeb78bc19 100644 --- a/cypress.eda.config.ts +++ b/cypress.eda.config.ts @@ -4,7 +4,7 @@ import { baseConfig } from './cypress.base.config'; import setValue from 'set-value'; baseConfig.e2e!.specPattern = 'cypress/e2e/eda/**/*.cy.ts'; -baseConfig.e2e!.baseUrl = 'http://localhost:4103'; +baseConfig.e2e!.baseUrl = 'https://localhost:4103'; baseConfig.component!.specPattern = 'frontend/eda/**/*.cy.{js,jsx,ts,tsx}'; setValue(baseConfig, 'component.devServer.webpackConfig.devServer.port', 4203); diff --git a/cypress.hub.config.ts b/cypress.hub.config.ts index 334d82125e..9a8a953e3b 100644 --- a/cypress.hub.config.ts +++ b/cypress.hub.config.ts @@ -4,7 +4,7 @@ import setValue from 'set-value'; import { baseConfig } from './cypress.base.config'; baseConfig.e2e!.specPattern = 'cypress/e2e/hub/**/*.cy.ts'; -baseConfig.e2e!.baseUrl = 'http://localhost:4102'; +baseConfig.e2e!.baseUrl = 'https://localhost:4102'; baseConfig.component!.specPattern = 'frontend/hub/**/*.cy.{js,jsx,ts,tsx}'; setValue(baseConfig, 'component.devServer.webpackConfig.devServer.port', 4202); diff --git a/cypress/e2e/eda/Projects/project-sync.cy.ts b/cypress/e2e/eda/Projects/project-sync.cy.ts index 0ae8d4fa11..bedd8d6bfa 100644 --- a/cypress/e2e/eda/Projects/project-sync.cy.ts +++ b/cypress/e2e/eda/Projects/project-sync.cy.ts @@ -5,7 +5,10 @@ describe('EDA Projects Syncing', () => { cy.createEdaProject().then((edaProject) => { cy.navigateTo('eda', 'projects'); cy.clickTableRowActionIcon(edaProject?.name, 'Sync project'); - cy.contains('h4.pf-c-alert__title', `Syncing ${edaProject.name}`).should('be.visible'); + + // Cannot test the alert title because it showing is based on timing. + // cy.contains('h4.pf-c-alert__title', `Syncing ${edaProject.name}`).should('be.visible'); + cy.get('td[data-label="Status"]').should('contain', 'Completed').should('be.visible'); cy.deleteEdaProject(edaProject); }); diff --git a/framework/README.md b/framework/README.md index 8d2b841817..ace3e16c96 100644 --- a/framework/README.md +++ b/framework/README.md @@ -2,4 +2,4 @@ A framework for building applications using [PatternFly](https://www.patternfly.org), developed by the Ansible UI developers. -[Documentation](https://github.com/ansible/ansible-ui/wiki/Ansible-UI-Framework) +[Documentation](https://github.com/ansible/ansible-ui/wiki/Ansible-UI-Framework). diff --git a/nginx/awx.conf b/nginx/awx.conf index 9ad24df3ee..66ce51734e 100644 --- a/nginx/awx.conf +++ b/nginx/awx.conf @@ -1,10 +1,20 @@ server { - listen 8080 default_server; - listen [::]:8080; + listen 80; + listen [::]:80; + server_name _ + server_tokens off; + return 301 https://$host$request_uri; +} +server { + listen 443 ssl; + listen [::]:443 ssl; server_name _; server_tokens off; + ssl_certificate /etc/ssl/nginx-selfsigned.crt; + ssl_certificate_key /etc/ssl/nginx-selfsigned.key; + access_log off; # error_log off; @@ -20,18 +30,13 @@ server { root /usr/share/nginx/html; location /api { - proxy_pass $AWX_PROTOCOL://$AWX_HOST; - proxy_set_header Host $AWX_HOST; - proxy_set_header Origin $AWX_PROTOCOL://$AWX_HOST; - proxy_set_header Referer $AWX_PROTOCOL://$AWX_HOST; + proxy_pass $AWX_SERVER; + proxy_set_header Origin $AWX_SERVER; } location /websocket { - proxy_pass $AWX_PROTOCOL://$AWX_HOST; - proxy_set_header Host $AWX_HOST; - proxy_set_header Origin $AWX_PROTOCOL://$AWX_HOST; - proxy_set_header Referer $AWX_PROTOCOL://$AWX_HOST; - + proxy_pass $AWX_SERVER; + proxy_set_header Origin $AWX_SERVER; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; diff --git a/nginx/eda.conf b/nginx/eda.conf index 86f5ece7a2..99663a17c0 100644 --- a/nginx/eda.conf +++ b/nginx/eda.conf @@ -1,10 +1,20 @@ server { - listen 8080 default_server; - listen [::]:8080; + listen 80; + listen [::]:80; + server_name _ + server_tokens off; + return 301 https://$host$request_uri; +} +server { + listen 443 ssl; + listen [::]:443 ssl; server_name _; server_tokens off; + ssl_certificate /etc/ssl/nginx-selfsigned.crt; + ssl_certificate_key /etc/ssl/nginx-selfsigned.key; + access_log off; # error_log off; @@ -19,24 +29,19 @@ server { root /usr/share/nginx/html; - location ~ ^/api/eda/ws/[0-9a-z-]+ { - proxy_pass $EDA_PROTOCOL://$EDA_HOST; - proxy_set_header Host $EDA_HOST; - proxy_set_header Origin $EDA_PROTOCOL://$EDA_HOST; - proxy_set_header Referer $EDA_PROTOCOL://$EDA_HOST; + location ~ ^/api/eda/v[0-9]+/ { + proxy_pass $EDA_SERVER; + proxy_set_header Origin $EDA_SERVER; + } + location ~ ^/api/eda/ws/[0-9a-z-]+ { + proxy_pass $EDA_SERVER; + proxy_set_header Origin $EDA_SERVER; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } - location ~ ^/api/eda/v[0-9]+/ { - proxy_pass $EDA_PROTOCOL://$EDA_HOST; - proxy_set_header Host $EDA_HOST; - proxy_set_header Origin $EDA_PROTOCOL://$EDA_HOST; - proxy_set_header Referer $EDA_PROTOCOL://$EDA_HOST; - } - location ~* \.(json|woff|woff2|jpe?g|png|gif|ico|svg|css|js)$ { add_header Cache-Control "public, max-age=31536000, s-maxage=31536000, immutable"; try_files $uri =404; diff --git a/nginx/hub.conf b/nginx/hub.conf index dd2b4335cf..0d219ff8f8 100644 --- a/nginx/hub.conf +++ b/nginx/hub.conf @@ -1,10 +1,20 @@ server { - listen 8080 default_server; - listen [::]:8080; + listen 80; + listen [::]:80; + server_name _ + server_tokens off; + return 301 https://$host$request_uri; +} +server { + listen 443 ssl; + listen [::]:443 ssl; server_name _; server_tokens off; + ssl_certificate /etc/ssl/nginx-selfsigned.crt; + ssl_certificate_key /etc/ssl/nginx-selfsigned.key; + access_log off; # error_log off; @@ -20,10 +30,8 @@ server { root /usr/share/nginx/html; location /api { - proxy_pass $HUB_PROTOCOL://$HUB_HOST; - proxy_set_header Host $HUB_HOST; - proxy_set_header Origin $HUB_PROTOCOL://$HUB_HOST; - proxy_set_header Referer $HUB_PROTOCOL://$HUB_HOST; + proxy_pass $HUB_SERVER; + proxy_set_header Origin $HUB_SERVER; } location ~* \.(json|woff|woff2|jpe?g|png|gif|ico|svg|css|js)$ { diff --git a/package.json b/package.json index 087c76c9e1..00aa23dd9f 100644 --- a/package.json +++ b/package.json @@ -56,9 +56,9 @@ "docker:build:hub": "docker build --target hub-ui --tag hub-ui .", "docker:build:eda": "docker build --target eda-ui --tag eda-ui .", "docker:run": "concurrently npm:docker:run:awx npm:docker:run:hub npm:docker:run:eda -c cyan,green,blue", - "docker:run:awx": "echo http://localhost:4101 && docker run --name awx-ui --rm -e LOG_LEVEL=debug -p 4101:8080 -e AWX_HOST=$AWX_HOST -e AWX_PROTOCOL=$AWX_PROTOCOL awx-ui", - "docker:run:hub": "echo http://localhost:4102 && docker run --name hub-ui --rm -e LOG_LEVEL=debug -p 4102:8080 -e HUB_HOST=$HUB_HOST -e HUB_PROTOCOL=$HUB_PROTOCOL hub-ui", - "docker:run:eda": "echo http://localhost:4103 && docker run --name eda-ui --rm -e LOG_LEVEL=debug -p 4103:8080 -e EDA_HOST=$EDA_HOST -e EDA_PROTOCOL=$EDA_PROTOCOL eda-ui" + "docker:run:awx": "echo https://localhost:4101 && docker run --name awx-ui --rm -e LOG_LEVEL=debug -p 4101:443 -e AWX_SERVER=$AWX_SERVER awx-ui", + "docker:run:hub": "echo https://localhost:4102 && docker run --name hub-ui --rm -e LOG_LEVEL=debug -p 4102:443 -e HUB_SERVER=$HUB_SERVER hub-ui", + "docker:run:eda": "echo https://localhost:4103 && docker run --name eda-ui --rm -e LOG_LEVEL=debug -p 4103:443 -e EDA_SERVER=$EDA_SERVER eda-ui" }, "dependencies": { "@ansible/react-json-chart-builder": "^1.15.2", diff --git a/webpack/webpack.config.cjs b/webpack/webpack.config.cjs index e1e54e402f..be8cd307d4 100644 --- a/webpack/webpack.config.cjs +++ b/webpack/webpack.config.cjs @@ -168,6 +168,7 @@ module.exports = function (env, argv) { ], }, devServer: { + https: true, // Enable for using oAuth in dev environment historyApiFallback: true, compress: true, hot: true,