diff --git a/devops/gcp/pipeline/override-stages.yml b/devops/gcp/pipeline/override-stages.yml index 54259e11293937bdec9202ef22cef962919dad9d..ae54fdae554acc02d4262150b94cdf247988eac8 100644 --- a/devops/gcp/pipeline/override-stages.yml +++ b/devops/gcp/pipeline/override-stages.yml @@ -8,10 +8,11 @@ osdu-gcp-test: REGISTER_BASE_URL: $OSDU_GCP_REGISTER_BASE_URL osdu-gcp-dev2-test: - variables: - ENVIRONMENT: $OSDU_GCP_ENVIRONMENT - REGISTER_BASE_URL: $OSDU_GCP_REGISTER_BASE_URL + variables: + ENVIRONMENT: $OSDU_GCP_ENVIRONMENT + REGISTER_BASE_URL: $OSDU_GCP_REGISTER_BASE_URL -# FIXME when it is ready GONRG-5274 osdu-gcp-anthos-test: - allow_failure: true + variables: + REGISTER_BASE_URL: $OSDU_GCP_REGISTER_BASE_URL + OSDU_GCP_VENDOR: anthos diff --git a/pom.xml b/pom.xml index 18f868da74161a77c8a238153e639db6856589c7..3242cd709e6f60548583b957e5ae2618fe1cd9e0 100644 --- a/pom.xml +++ b/pom.xml @@ -148,7 +148,6 @@ <module>provider/notification-azure</module> <module>provider/notification-ibm</module> <module>provider/notification-aws</module> - <module>provider/notification-reference</module> </modules> <repositories> diff --git a/provider/notification-gcp/README.md b/provider/notification-gcp/README.md index ba9b8b9f35ce64f29320ddfcf810a37ec95e0bb6..710b48b07d013376f8a782b1095578e19118d039 100644 --- a/provider/notification-gcp/README.md +++ b/provider/notification-gcp/README.md @@ -115,55 +115,11 @@ cd provider/notification-gcp/ && mvn spring-boot:run -Dspring-boot.run.profiles= ``` ## Testing -Navigate to notification service's root folder and run all the tests: -```bash -# build + test + install core service code -$ (cd notification-core/ && mvn clean install) -``` - -### Test the application - -After the service has started it should be accessible via a web browser by visiting [http://localhost:8080/api/notification/v1/swagger-ui.html](http://localhost:8080/swagger-ui.html). If the request does not fail, you can then run the integration tests. - -### Dependencies needed to run the integration tests -* Java 8 -* Maven -* Values for the following environment variables in Config.java - -| name | value | description | sensitive? | source | -| --- | --- | --- | --- | --- | -| `DE_OPS_TESTER` | `*****` | Service account base64 encoded string for API calls. Note: this user must have entitlements configured already, also **Private key id** of this account must be set in Register service variable SUBSCRIBER_PRIVATE_KEY_ID | yes | https://console.cloud.google.com/iam-admin/serviceaccounts | -| `DE_ADMIN_TESTER` | `*****` | Service account base64 encoded string for API calls. Note: this user must have entitlements configured already | yes | https://console.cloud.google.com/iam-admin/serviceaccounts | -| `DE_EDITOR_TESTER` | `*****` | Service account base64 encoded string for API calls. Note: this user must have entitlements configured already | yes | https://console.cloud.google.com/iam-admin/serviceaccounts | -| `DE_NO_ACCESS_TESTER` | `*****` | Service account base64 encoded string for API calls. Note: this user must have entitlements configured already | yes | https://console.cloud.google.com/iam-admin/serviceaccounts | -| `ENVIRONMENT` | `dev` OR `local` OR `dev_gke`| Local for running locally with services url's predefined as http://localhost , Dev & Dev_Gke is configurable environment | no | - | -| `HMAC_SECRET` | ex`7a786376626e` | String in hex , must match pattern ^[a-zA-Z0-9]{8,30}+$ & be in register variable SUBSCRIBER_SECRET | yes | - | -| `REGISTER_BASE_URL` | `http://localhost:8081/api/register/v1` | Register service url | no | - | -| `NOTIFICATION_BASE_URL` | `http://localhost:8080/api/notification/v1/` | Notification service url | no | - | -| `INTEGRATION_TEST_AUDIENCE` | `********` | Client application ID | yes | https://console.cloud.google.com/apis/credentials | -| `CLIENT_TENANT` | ex `opendes` | Client tenant | no | - | -| `OSDU_TENANT` | ex `osdu` | Osdu tenant | no | - | -| `TOPIC_ID` | ex `records-changed` | PubSub topic id | no | https://console.cloud.google.com/cloudpubsub/topic | -| `REGISTER_CUSTOM_PUSH_URL_HMAC` | ex `http://localhost:8081/api/register/v1/test/challenge/hmac-integration-test` | Register testing push url | no | - | - - **Entitlements configuration for integration accounts** - -| DE_OPS_TESTER | DE_ADMIN_TESTER | DE_EDITOR_TESTER | DE_NO_ACCESS_TESTER | -| --- | --- | --- | --- | -|notification.pubsub<br/>service.entitlements.user<br/>users<br/>users.datalake.ops</br>| service.entitlements.user<br/>users<br/>users.datalake.admins</br> | service.entitlements.user<br/>users<br/>users.datalake.editors</br> | service.entitlements.user<br/>users<br/>| - -Above variables should be configured in the release pipeline to run integration tests. You should also replace them with proper values if you wish to run tests locally. - -### Commands to run tests -* Integration tests are refactored into two pieces: Core and Provider. Core contains business logic for tests and is a dependency for executing the tests from provider module. To build the core module, simply navigate to `notification-test-core` directory and run `mvn clean install`. This will build the core module -* Next, to execute the integration tests, navigate to the provider module and execute `mvn test` -```bash -# (cd testing/notification-test-core/ && mvn clean install) -# Note: this assumes that the environment variables for integration tests as outlined -# above are already exported in your environment. -$ (cd testing/notification-test-gcp/ && mvn clean test) -``` +#### Anthos: +[Anthos Testing](docs/anthos/README.md) +#### GCP: +[Gcp Testing](docs/gcp/README.md) ## Tutorial diff --git a/provider/notification-gcp/docs/anthos/README.md b/provider/notification-gcp/docs/anthos/README.md index 4c4dd42869d7b02f8b67b450571878088c4bcf97..b9c1c9b00a393e115d9c9265c353652ed5489f03 100644 --- a/provider/notification-gcp/docs/anthos/README.md +++ b/provider/notification-gcp/docs/anthos/README.md @@ -43,6 +43,60 @@ | OQMDRIVER | pubsub | to activate **OQM** driver for **Google PubSub** | | OQMDRIVER | rabbitmq | to activate **OQM** driver for **Rabbit MQ** | +## Testing + +After the service has started it should be accessible via a web browser by visiting [http://localhost:8080/api/notification/v1/swagger-ui.html](http://localhost:8080/swagger-ui.html). If the request does not fail, you can then run the integration tests. + +### Dependencies needed to run the integration tests +* Java 8 +* Maven +* Values for the following environment variables in Config.java + +| name | value | description | sensitive? | source | +| --- | --- | --- | --- | --- | +| `TEST_DE_OPS_OPENID_PROVIDER_CLIENT_ID` | `********` | Client Id for `DE_OPS_TESTER` | yes | -- | +| `TEST_DE_OPS_OPENID_PROVIDER_CLIENT_SECRET` | `********` | | Client secret for `DE_OPS_TESTER` | yes | -- | +| `TEST_DE_ADMIN_OPENID_PROVIDER_CLIENT_ID` | `********` | Client Id for `DE_ADMIN_TESTER` | yes | -- | +| `TEST_DE_ADMIN_OPENID_PROVIDER_CLIENT_SECRET` | `********` | | Client secret for `DE_ADMIN_TESTER` | yes | -- | +| `TEST_DE_EDITOR_OPENID_PROVIDER_CLIENT_ID` | `********` | Client Id for `DE_EDITOR_TESTER` | yes | -- | +| `TEST_DE_EDITOR_OPENID_PROVIDER_CLIENT_SECRET` | `********` | | Client secret for `DE_EDITOR_TESTER` | yes | -- | +| `TEST_NO_ACCESS_OPENID_PROVIDER_CLIENT_ID` | `********` | Client Id for `DE_NO_ACCESS_TESTER` | yes | -- | +| `TEST_NO_ACCESS_OPENID_PROVIDER_CLIENT_SECRET` | `********` | | Client secret for `DE_NO_ACCESS_TESTER` | yes | -- | +| `TEST_OPENID_PROVIDER_URL` | `https://keycloak.com/auth/realms/osdu` | OpenID provider url | yes | -- | +| `ENVIRONMENT` | `dev` OR `local` OR `dev_gke`| Local for running locally with services url's predefined as http://localhost , Dev & Dev_Gke is configurable environment | no | - | +| `HMAC_SECRET` | ex`7a786376626e` | String in hex , must match pattern ^[a-zA-Z0-9]{8,30}+$ & be in register variable SUBSCRIBER_SECRET | yes | - | +| `REGISTER_BASE_URL` | `http://localhost:8081/api/register/v1` | Register service url | no | - | +| `NOTIFICATION_BASE_URL` | `http://localhost:8080/api/notification/v1/` | Notification service url | no | - | +| `CLIENT_TENANT` | ex `opendes` | Client tenant | no | - | +| `OSDU_TENANT` | ex `osdu` | osdu tenant | no | - | +| `TOPIC_ID` | ex `records-changed` | PubSub topic id | no | https://console.cloud.google.com/cloudpubsub/topic | +| `REGISTER_CUSTOM_PUSH_URL_HMAC` | ex `http://localhost:8081/api/register/v1/test/challenge/hmac-integration-test` | Register testing push url | no | - | + +**Entitlements configuration for integration accounts** + +| DE_OPS_TESTER | DE_ADMIN_TESTER | DE_EDITOR_TESTER | DE_NO_ACCESS_TESTER | +| --- | --- | --- | --- | +|notification.pubsub<br/>service.entitlements.user<br/>users<br/>users.datalake.ops</br>| service.entitlements.user<br/>users<br/>users.datalake.admins</br> | service.entitlements.user<br/>users<br/>users.datalake.editors</br> | service.entitlements.user<br/>users<br/>| + +Above variables should be configured in the release pipeline to run integration tests. You should also replace them with proper values if you wish to run tests locally. + +### Commands to run tests +* Integration tests are refactored into two pieces: Core and Provider. Core contains business logic for tests and is a dependency for executing the tests from provider module. To build the core module, simply navigate to `notification-test-core` directory and run `mvn clean install`. This will build the core module +* Next, to execute the integration tests, navigate to the provider module and execute `mvn test` +```bash +# (cd testing/notification-test-core/ && mvn clean install) +# Note: this assumes that the environment variables for integration tests as outlined +# above are already exported in your environment. +$ (cd testing/notification-test-gcp/ && mvn clean test) +``` + +Navigate to notification service's root folder and run all the tests: + +```bash +# build + test + install core service code +$ (cd notification-core/ && mvn clean install) +``` + ## Requirements for requests Record identifiers cannot contain a space character. At the same time, they may contain a % character, which, when @@ -54,7 +108,7 @@ work-product-component--WellboreMarkerSet:3D%20Kirchhoff%20DepthMigration" (with you should url-encode it and request "osdu%3Awork-product-component--WellboreMarkerSet%3A3D%2520Kirchhoff%2520DepthMigration" instead. -## Configuring mappers Datasources +## Configuring mappers DataSources When using non-Google-Cloud-native technologies, property sets must be defined on the Partition service as part of PartitionInfo for each Tenant. @@ -67,11 +121,11 @@ It can be overridden by: * through the Spring Boot property `oqm.rabbitmq.partition-properties-prefix` * environment variable `OQM_RABBITMQ_PARTITION_PROPERTIES_PREFIX`` -**Propertyset** (for two types of connection: messaging and admin operations): +**PropertySet** (for two types of connection: messaging and admin operations): | Property | Description | | --- | --- | -| oqm.rabbitmq.amqp.host | messaging hostnameorIP | +| oqm.rabbitmq.amqp.host | messaging hostname orIP | | oqm.rabbitmq.amqp.port | - port | | oqm.rabbitmq.amqp.path | - path | | oqm.rabbitmq.amqp.username | - username | diff --git a/provider/notification-gcp/docs/gcp/README.md b/provider/notification-gcp/docs/gcp/README.md index 0e193136cf2b7175e2de7ad7d94dc1ee61f8bdad..a0151f2ad91f21e687e43461ff5c47c874db401d 100644 --- a/provider/notification-gcp/docs/gcp/README.md +++ b/provider/notification-gcp/docs/gcp/README.md @@ -47,9 +47,61 @@ Also, the following IAM roles should be assigned to the service's Google service | Service Account Token Creator | To write yourself JWT for requesting neighbor microservices | | Pub/Sub Editor | To fetch available PubSub topics and subscriptions and be able to create them | -## Pubsub configuration: -At Pubsub should be created topic with name: +## Testing + +After the service has started it should be accessible via a web browser by visiting [http://localhost:8080/api/notification/v1/swagger-ui.html](http://localhost:8080/swagger-ui.html). If the request does not fail, you can then run the integration tests. + +### Dependencies needed to run the integration tests +* Java 8 +* Maven +* Values for the following environment variables in Config.java + +| name | value | description | sensitive? | source | +| --- | --- | --- | --- | --- | +| `DE_OPS_TESTER` | `*****` | Service account base64 encoded string for API calls. Note: this user must have entitlements configured already, also **Private key id** of this account must be set in Register service variable SUBSCRIBER_PRIVATE_KEY_ID | yes | https://console.cloud.google.com/iam-admin/serviceaccounts | +| `DE_ADMIN_TESTER` | `*****` | Service account base64 encoded string for API calls. Note: this user must have entitlements configured already | yes | https://console.cloud.google.com/iam-admin/serviceaccounts | +| `DE_EDITOR_TESTER` | `*****` | Service account base64 encoded string for API calls. Note: this user must have entitlements configured already | yes | https://console.cloud.google.com/iam-admin/serviceaccounts | +| `DE_NO_ACCESS_TESTER` | `*****` | Service account base64 encoded string for API calls. Note: this user must have entitlements configured already | yes | https://console.cloud.google.com/iam-admin/serviceaccounts | +| `ENVIRONMENT` | `dev` OR `local` OR `dev_gke`| Local for running locally with services url's predefined as http://localhost , Dev & Dev_Gke is configurable environment | no | - | +| `HMAC_SECRET` | ex`7a786376626e` | String in hex , must match pattern ^[a-zA-Z0-9]{8,30}+$ & be in register variable SUBSCRIBER_SECRET | yes | - | +| `REGISTER_BASE_URL` | `http://localhost:8081/api/register/v1` | Register service url | no | - | +| `NOTIFICATION_BASE_URL` | `http://localhost:8080/api/notification/v1/` | Notification service url | no | - | +| `INTEGRATION_TEST_AUDIENCE` | `********` | Client application ID | yes | https://console.cloud.google.com/apis/credentials | +| `CLIENT_TENANT` | ex `opendes` | Client tenant | no | - | +| `OSDU_TENANT` | ex `osdu` | osdu tenant | no | - | +| `TOPIC_ID` | ex `records-changed` | PubSub topic id | no | https://console.cloud.google.com/cloudpubsub/topic | +| `REGISTER_CUSTOM_PUSH_URL_HMAC` | ex `http://localhost:8081/api/register/v1/test/challenge/hmac-integration-test` | Register testing push url | no | - | + +**Entitlements configuration for integration accounts** + +| DE_OPS_TESTER | DE_ADMIN_TESTER | DE_EDITOR_TESTER | DE_NO_ACCESS_TESTER | +| --- | --- | --- | --- | +|notification.pubsub<br/>service.entitlements.user<br/>users<br/>users.datalake.ops</br>| service.entitlements.user<br/>users<br/>users.datalake.admins</br> | service.entitlements.user<br/>users<br/>users.datalake.editors</br> | service.entitlements.user<br/>users<br/>| + +Above variables should be configured in the release pipeline to run integration tests. You should also replace them with proper values if you wish to run tests locally. + +### Commands to run tests +* Integration tests are refactored into two pieces: Core and Provider. Core contains business logic for tests and is a dependency for executing the tests from provider module. To build the core module, simply navigate to `notification-test-core` directory and run `mvn clean install`. This will build the core module +* Next, to execute the integration tests, navigate to the provider module and execute `mvn test` +* +```bash +# (cd testing/notification-test-core/ && mvn clean install) +# Note: this assumes that the environment variables for integration tests as outlined +# above are already exported in your environment. +$ (cd testing/notification-test-gcp/ && mvn clean test) +``` + +Navigate to notification service's root folder and run all the tests: + +```bash +# build + test + install core service code +$ (cd notification-core/ && mvn clean install) +``` + +## PubSub configuration: + +At PubSub should be created topic with name: **name:** `register-subscriber-control` diff --git a/provider/notification-gcp/src/main/java/org/opengroup/osdu/notification/provider/gcp/util/ServiceAccountJwtGcpClientImpl.java b/provider/notification-gcp/src/main/java/org/opengroup/osdu/notification/provider/gcp/util/ServiceAccountJwtGcpClientImpl.java index f05a02653d935c1cfe87885f0f38a6f0083f4ba7..194eee8cf8530970bb77ebbf6f49530f5c59e300 100644 --- a/provider/notification-gcp/src/main/java/org/opengroup/osdu/notification/provider/gcp/util/ServiceAccountJwtGcpClientImpl.java +++ b/provider/notification-gcp/src/main/java/org/opengroup/osdu/notification/provider/gcp/util/ServiceAccountJwtGcpClientImpl.java @@ -32,7 +32,7 @@ public class ServiceAccountJwtGcpClientImpl implements IServiceAccountJwtClient public String getIdToken(String tenantName) { log.info("Tenant name received for auth token is: {}", tenantName); - return tokenProvider.getIdToken(); + return "Bearer " + tokenProvider.getIdToken(); } } diff --git a/provider/notification-gcp/src/main/resources/logback.xml b/provider/notification-gcp/src/main/resources/logback.xml index 8d6d9b1400206861a237843f40787180ea67fdc7..50c1b2b9477e7c44a1d2b4736e76e354651a315f 100644 --- a/provider/notification-gcp/src/main/resources/logback.xml +++ b/provider/notification-gcp/src/main/resources/logback.xml @@ -1,38 +1,38 @@ <?xml version="1.0" encoding="UTF-8"?> <configuration> - <include resource="org/springframework/boot/logging/logback/defaults.xml"/> - <property resource="application.properties" /> - <logger name="org.opengroup.osdu" level="${LOG_LEVEL}"/> - <springProfile name="local"> - <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> - <encoder> - <pattern>%yellow([%thread]) %highlight(| %-5level |) %green(%d) %cyan(| %logger{15} |) %highlight(%msg) %n</pattern> - <charset>utf8</charset> - </encoder> - </appender> - <root level="info"> - <appender-ref ref="CONSOLE"/> - </root> - </springProfile> + <include resource="org/springframework/boot/logging/logback/defaults.xml"/> + <property resource="application.properties" /> + <logger name="org.opengroup.osdu" level="${LOG_LEVEL}"/> + <springProfile name="local"> + <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>%yellow([%thread]) %highlight(| %-5level |) %green(%d) %cyan(| %logger{15} |) %highlight(%msg) %n</pattern> + <charset>utf8</charset> + </encoder> + </appender> + <root level="info"> + <appender-ref ref="CONSOLE"/> + </root> + </springProfile> - <springProfile name="!local"> - <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> - <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> - <layout class="ch.qos.logback.contrib.json.classic.JsonLayout"> - <timestampFormat>yyyy-MM-dd HH:mm:ss.SSS</timestampFormat> - <timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId> - <appendLineSeparator>true</appendLineSeparator> + <springProfile name="!local"> + <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> + <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> + <layout class="ch.qos.logback.contrib.json.classic.JsonLayout"> + <timestampFormat>yyyy-MM-dd HH:mm:ss.SSS</timestampFormat> + <timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId> + <appendLineSeparator>true</appendLineSeparator> - <jsonFormatter class="org.opengroup.osdu.core.gcp.logging.formatter.GoogleJsonFormatter"> - <prettyPrint>false</prettyPrint> - </jsonFormatter> - </layout> - </encoder> - </appender> + <jsonFormatter class="org.opengroup.osdu.core.gcp.logging.formatter.GoogleJsonFormatter"> + <prettyPrint>false</prettyPrint> + </jsonFormatter> + </layout> + </encoder> + </appender> - <root level="info"> - <appender-ref ref="stdout"/> - </root> - </springProfile> + <root level="info"> + <appender-ref ref="stdout"/> + </root> + </springProfile> </configuration> \ No newline at end of file diff --git a/testing/notification-test-anthos/pom.xml b/testing/notification-test-anthos/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..61865ad75e1b8fa5feb24caef20b02c6ad24303f --- /dev/null +++ b/testing/notification-test-anthos/pom.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2002-2022 Google LLC + Copyright 2002-2022 EPAM Systems, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.opengroup.osdu</groupId> + <artifactId>os-notification-testing</artifactId> + <version>0.16.0-SNAPSHOT</version> + <relativePath>../pom.xml</relativePath> + </parent> + + <artifactId>notification-test-anthos</artifactId> + <version>0.16.0-SNAPSHOT</version> + <name>notification-test-anthos</name> + <description>Integration tests Anthos for notification</description> + <packaging>jar</packaging> + + <properties> + <java.version>8</java.version> + <maven.compiler.target>${java.version}</maven.compiler.target> + <maven.compiler.source>${java.version}</maven.compiler.source> + </properties> + + <dependencies> + <dependency> + <groupId>org.opengroup.osdu.notification</groupId> + <artifactId>notification-test-core</artifactId> + <version>0.16.0-SNAPSHOT</version> + </dependency> + <dependency> + <groupId>org.opengroup.osdu</groupId> + <artifactId>os-core-common</artifactId> + <version>0.3.6</version> + </dependency> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>1.18.8</version> + </dependency> + <dependency> + <groupId>org.opengroup.osdu</groupId> + <artifactId>core-test-lib-gcp</artifactId> + <version>0.0.2</version> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.12</version> + </dependency> + <dependency> + <groupId>com.nimbusds</groupId> + <artifactId>oauth2-oidc-sdk</artifactId> + <version>9.15</version> + </dependency> + </dependencies> + +</project> diff --git a/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/api/TestPubSubEndpointGSA.java b/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/api/TestPubSubEndpointGSA.java new file mode 100644 index 0000000000000000000000000000000000000000..da4c56e88bdc7fd1e1c68f38fbe0a21cc3f48202 --- /dev/null +++ b/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/api/TestPubSubEndpointGSA.java @@ -0,0 +1,89 @@ +/* + Copyright 2002-2022 Google LLC + Copyright 2002-2022 EPAM Systems, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +package org.opengroup.osdu.notification.api; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import com.sun.jersey.api.client.ClientResponse; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.opengroup.osdu.notification.util.AnthosTestUtils; + +public class TestPubSubEndpointGSA extends PubsubEndpointGSATests { + + private static final AnthosTestUtils gcpTestUtils = new AnthosTestUtils(); + + + @BeforeClass + public static void classSetup() throws Exception { + PubsubEndpointGSATests.classSetup(gcpTestUtils.getOpsToken()); + } + + @AfterClass + public static void classTearDown() throws Exception { + } + + @Before + @Override + public void setup() throws Exception { + this.testUtils = new AnthosTestUtils(); + } + + @After + @Override + public void tearDown() throws Exception { + this.testUtils = null; + } + + @Override + @Test + public void should_return20X_when_usingCredentialsWithOpsPermission() throws Exception { + createResource(); + + try { + ClientResponse response = descriptor.run(getArg(), testUtils.getOpsToken()); + + assertEquals(error(response.getStatus() == 204 ? "" : response.getEntity(String.class)), + expectedOkResponseCode(), response.getStatus()); + assertEquals("GET, POST, PUT, DELETE, OPTIONS, HEAD, PATCH", + response.getHeaders().getFirst("Access-Control-Allow-Methods")); + assertEquals( + "access-control-allow-origin, origin, content-type, accept, authorization, data-partition-id, correlation-id, appkey", + response.getHeaders().getFirst("Access-Control-Allow-Headers")); + assertEquals("*", response.getHeaders().getFirst("Access-Control-Allow-Origin")); + assertEquals("true", response.getHeaders().getFirst("Access-Control-Allow-Credentials")); + assertEquals("DENY", response.getHeaders().getFirst("X-Frame-Options")); + assertEquals("1; mode=block", response.getHeaders().getFirst("X-XSS-Protection")); + assertEquals("nosniff", response.getHeaders().getFirst("X-Content-Type-Options")); + assertEquals("no-cache, no-store, must-revalidate", + response.getHeaders().getFirst("Cache-Control")); + assertEquals("default-src 'self'", response.getHeaders().getFirst("Content-Security-Policy")); + assertTrue(response.getHeaders().get("Strict-Transport-Security").get(0) + .contains("max-age=31536000")); + assertTrue(response.getHeaders().get("Strict-Transport-Security").get(0) + .contains("includeSubDomains")); + assertEquals("0", response.getHeaders().getFirst("Expires")); + } finally { + deleteResource(); + } + } +} \ No newline at end of file diff --git a/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/api/TestPubSubEndpointHMAC.java b/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/api/TestPubSubEndpointHMAC.java new file mode 100644 index 0000000000000000000000000000000000000000..1f5e091d9acd36c89369b9f8fc9b69d7d1031857 --- /dev/null +++ b/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/api/TestPubSubEndpointHMAC.java @@ -0,0 +1,86 @@ +/* + Copyright 2002-2022 Google LLC + Copyright 2002-2022 EPAM Systems, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +package org.opengroup.osdu.notification.api; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import com.sun.jersey.api.client.ClientResponse; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.opengroup.osdu.notification.util.AnthosTestUtils; + +public class TestPubSubEndpointHMAC extends PubsubEndpointHMACTests { + + @BeforeClass + public static void classSetup() throws Exception { + PubsubEndpointHMACTests.classSetup(); + } + + @AfterClass + public static void classTearDown() throws Exception { + } + + @Before + @Override + public void setup() throws Exception { + this.testUtils = new AnthosTestUtils(); + } + + @After + @Override + public void tearDown() throws Exception { + this.testUtils = null; + } + + @Override + @Test + public void should_return20X_when_usingCredentialsWithOpsPermission() throws Exception { + createResource(); + + try { + ClientResponse response = descriptor.run(getArg(), testUtils.getOpsToken()); + + assertEquals(error(response.getStatus() == 204 ? "" : response.getEntity(String.class)), + expectedOkResponseCode(), response.getStatus()); + assertEquals("GET, POST, PUT, DELETE, OPTIONS, HEAD, PATCH", + response.getHeaders().getFirst("Access-Control-Allow-Methods")); + assertEquals( + "access-control-allow-origin, origin, content-type, accept, authorization, data-partition-id, correlation-id, appkey", + response.getHeaders().getFirst("Access-Control-Allow-Headers")); + assertEquals("*", response.getHeaders().getFirst("Access-Control-Allow-Origin")); + assertEquals("true", response.getHeaders().getFirst("Access-Control-Allow-Credentials")); + assertEquals("DENY", response.getHeaders().getFirst("X-Frame-Options")); + assertEquals("1; mode=block", response.getHeaders().getFirst("X-XSS-Protection")); + assertEquals("nosniff", response.getHeaders().getFirst("X-Content-Type-Options")); + assertEquals("no-cache, no-store, must-revalidate", + response.getHeaders().getFirst("Cache-Control")); + assertEquals("default-src 'self'", response.getHeaders().getFirst("Content-Security-Policy")); + assertTrue(response.getHeaders().get("Strict-Transport-Security").get(0) + .contains("max-age=31536000")); + assertTrue(response.getHeaders().get("Strict-Transport-Security").get(0) + .contains("includeSubDomains")); + assertEquals("0", response.getHeaders().getFirst("Expires")); + } finally { + deleteResource(); + } + } +} \ No newline at end of file diff --git a/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/config/OpenIDProviderConfig.java b/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/config/OpenIDProviderConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..db3b3142a764f08b2dbeaa1402554db540186f78 --- /dev/null +++ b/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/config/OpenIDProviderConfig.java @@ -0,0 +1,137 @@ +/* + Copyright 2002-2022 Google LLC + Copyright 2002-2022 EPAM Systems, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +package org.opengroup.osdu.notification.config; + +import com.nimbusds.oauth2.sdk.http.HTTPRequest; +import com.nimbusds.oauth2.sdk.http.HTTPResponse; +import com.nimbusds.oauth2.sdk.id.Issuer; +import com.nimbusds.openid.connect.sdk.op.OIDCProviderConfigurationRequest; +import com.nimbusds.openid.connect.sdk.op.OIDCProviderMetadata; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class OpenIDProviderConfig { + + private String opsClientId; + private String opsClientSecret; + private String adminClientId; + private String adminClientSecret; + private String editorClientId; + private String editorClientSecret; + private String noAccessClientId; + private String noAccessClientSecret; + private String url; + private final String[] scopes = {"openid"}; + private static final OpenIDProviderConfig openIDProviderConfig = new OpenIDProviderConfig(); + private static OIDCProviderMetadata providerMetadata; + + public static OpenIDProviderConfig Instance() { + try { + openIDProviderConfig.opsClientId = System.getProperty("TEST_DE_OPS_OPENID_PROVIDER_CLIENT_ID", + System.getenv("TEST_DE_OPS_OPENID_PROVIDER_CLIENT_ID")); + openIDProviderConfig.opsClientSecret = System.getProperty( + "TEST_DE_OPS_OPENID_PROVIDER_CLIENT_SECRET", + System.getenv("TEST_DE_OPS_OPENID_PROVIDER_CLIENT_SECRET")); + log.info("ST F1 " +openIDProviderConfig.opsClientId + " " + openIDProviderConfig.opsClientSecret ); + + + openIDProviderConfig.adminClientId = System.getProperty( + "TEST_DE_ADMIN_OPENID_PROVIDER_CLIENT_ID", + System.getenv("TEST_DE_ADMIN_OPENID_PROVIDER_CLIENT_ID")); + openIDProviderConfig.adminClientSecret = System.getProperty( + "TEST_DE_ADMIN_OPENID_PROVIDER_CLIENT_SECRET", + System.getenv("TEST_DE_ADMIN_OPENID_PROVIDER_CLIENT_SECRET")); + + log.info("ST F2 " +openIDProviderConfig.adminClientId + " " + openIDProviderConfig.adminClientSecret ); + + openIDProviderConfig.editorClientId = System.getProperty( + "TEST_DE_EDITOR_OPENID_PROVIDER_CLIENT_ID", + System.getenv("TEST_DE_EDITOR_OPENID_PROVIDER_CLIENT_ID")); + openIDProviderConfig.editorClientSecret = System.getProperty( + "TEST_DE_EDITOR_OPENID_PROVIDER_CLIENT_SECRET", + System.getenv("TEST_DE_EDITOR_OPENID_PROVIDER_CLIENT_SECRET")); + + log.info("ST F3 " +openIDProviderConfig.editorClientId + " " + openIDProviderConfig.editorClientSecret ); + + openIDProviderConfig.noAccessClientId = System.getProperty( + "TEST_NO_ACCESS_OPENID_PROVIDER_CLIENT_ID", + System.getenv("TEST_NO_ACCESS_OPENID_PROVIDER_CLIENT_ID")); + openIDProviderConfig.noAccessClientSecret = System.getProperty( + "TEST_NO_ACCESS_OPENID_PROVIDER_CLIENT_SECRET", + System.getenv("TEST_NO_ACCESS_OPENID_PROVIDER_CLIENT_SECRET")); + + log.info("ST F4 " +openIDProviderConfig.noAccessClientId + " " + openIDProviderConfig.noAccessClientSecret ); + + openIDProviderConfig.url = + System.getProperty("TEST_OPENID_PROVIDER_URL", System.getenv("TEST_OPENID_PROVIDER_URL")); + Issuer issuer = new Issuer(openIDProviderConfig.url); + OIDCProviderConfigurationRequest request = new OIDCProviderConfigurationRequest(issuer); + HTTPRequest httpRequest = request.toHTTPRequest(); + HTTPResponse httpResponse = httpRequest.send(); + providerMetadata = OIDCProviderMetadata.parse(httpResponse.getContentAsJSONObject()); + } catch (Exception e) { + throw new RuntimeException("Malformed token provider configuration", e); + } + return openIDProviderConfig; + } + + public String getOpsClientId() { + return opsClientId; + } + + public String getOpsClientSecret() { + return opsClientSecret; + } + + public String getAdminClientId() { + return adminClientId; + } + + public String getAdminClientSecret() { + return adminClientSecret; + } + + public String getEditorClientId() { + return editorClientId; + } + + public String getEditorClientSecret() { + return editorClientSecret; + } + + public String getNoAccessClientId() { + return noAccessClientId; + } + + public String getNoAccessClientSecret() { + return noAccessClientSecret; + } + + public String getUrl() { + return url; + } + + public String[] getScopes() { + return scopes; + } + + public OIDCProviderMetadata getProviderMetadata() { + return providerMetadata; + } +} + diff --git a/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/util/AnthosTestUtils.java b/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/util/AnthosTestUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..26fea32b42e4949962629bbcf8522d2eb29eb338 --- /dev/null +++ b/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/util/AnthosTestUtils.java @@ -0,0 +1,49 @@ +/* + Copyright 2002-2022 Google LLC + Copyright 2002-2022 EPAM Systems, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +package org.opengroup.osdu.notification.util; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class AnthosTestUtils extends TestUtils { + + private OpenIDTokenProvider tokenProvider = new OpenIDTokenProvider(); + + public AnthosTestUtils() { + } + + @Override + public synchronized String getOpsToken() { + return "Bearer " + tokenProvider.getOpsAccessToken(); + } + + @Override + public synchronized String getAdminToken() { + return "Bearer " + tokenProvider.getAdminAccessToken(); + } + + @Override + public synchronized String getEditorToken() { + return "Bearer " + tokenProvider.getEditorAccessToken(); + } + + @Override + public synchronized String getNoAccessToken() { + return "Bearer " + tokenProvider.getNoAccessToken(); + } +} \ No newline at end of file diff --git a/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/util/OpenIDTokenProvider.java b/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/util/OpenIDTokenProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..0b5d220ae7616453c0033f1c5f3cb8cb2b0a4d59 --- /dev/null +++ b/testing/notification-test-anthos/src/test/java/org/opengroup/osdu/notification/util/OpenIDTokenProvider.java @@ -0,0 +1,138 @@ +/* + Copyright 2002-2022 Google LLC + Copyright 2002-2022 EPAM Systems, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +package org.opengroup.osdu.notification.util; + +import com.nimbusds.oauth2.sdk.AuthorizationGrant; +import com.nimbusds.oauth2.sdk.ClientCredentialsGrant; +import com.nimbusds.oauth2.sdk.ParseException; +import com.nimbusds.oauth2.sdk.Scope; +import com.nimbusds.oauth2.sdk.TokenRequest; +import com.nimbusds.oauth2.sdk.TokenResponse; +import com.nimbusds.oauth2.sdk.auth.ClientAuthentication; +import com.nimbusds.oauth2.sdk.auth.ClientSecretBasic; +import com.nimbusds.oauth2.sdk.auth.Secret; +import com.nimbusds.oauth2.sdk.id.ClientID; +import com.nimbusds.openid.connect.sdk.OIDCTokenResponseParser; +import java.io.IOException; +import java.net.URI; +import java.util.Objects; +import net.minidev.json.JSONObject; +import org.opengroup.osdu.notification.config.OpenIDProviderConfig; + +public class OpenIDTokenProvider { + + private static final OpenIDProviderConfig openIDProviderConfig = OpenIDProviderConfig.Instance(); + private static final String ID_TOKEN = "id_token"; + private final AuthorizationGrant clientGrant = new ClientCredentialsGrant(); + private final URI tokenEndpointURI; + private final Scope scope; + private final ClientAuthentication opsClientAuthentication; + private final ClientAuthentication adminClientAuthentication; + private final ClientAuthentication editorClientAuthentication; + private final ClientAuthentication noAccessClientAuthentication; + + public OpenIDTokenProvider() { + this.tokenEndpointURI = openIDProviderConfig.getProviderMetadata().getTokenEndpointURI(); + this.scope = new Scope(openIDProviderConfig.getScopes()); + this.opsClientAuthentication = + new ClientSecretBasic( + new ClientID(openIDProviderConfig.getOpsClientId()), + new Secret(openIDProviderConfig.getOpsClientSecret()) + ); + this.adminClientAuthentication = + new ClientSecretBasic( + new ClientID(openIDProviderConfig.getAdminClientId()), + new Secret(openIDProviderConfig.getAdminClientSecret()) + ); + this.editorClientAuthentication = + new ClientSecretBasic( + new ClientID(openIDProviderConfig.getEditorClientId()), + new Secret(openIDProviderConfig.getEditorClientSecret()) + ); + this.noAccessClientAuthentication = + new ClientSecretBasic( + new ClientID(openIDProviderConfig.getNoAccessClientId()), + new Secret(openIDProviderConfig.getNoAccessClientSecret()) + ); + } + + public String getOpsAccessToken() { + try { + TokenRequest request = + new TokenRequest(this.tokenEndpointURI, this.opsClientAuthentication, this.clientGrant, + this.scope); + return requestToken(request); + } catch (ParseException | IOException e) { + throw new RuntimeException( + "Unable get credentials from TEST_DE_OPS_OPENID_PROVIDER_CLIENT_ID variables", e); + } + } + + public String getAdminAccessToken() { + try { + TokenRequest request = + new TokenRequest(this.tokenEndpointURI, this.adminClientAuthentication, this.clientGrant, + this.scope); + return requestToken(request); + } catch (ParseException | IOException e) { + throw new RuntimeException( + "Unable get credentials from TEST_DE_ADMIN_OPENID_PROVIDER_CLIENT_ID variables", e); + } + } + + public String getEditorAccessToken() { + try { + TokenRequest request = + new TokenRequest(this.tokenEndpointURI, this.editorClientAuthentication, this.clientGrant, + this.scope); + return requestToken(request); + } catch (ParseException | IOException e) { + throw new RuntimeException( + "Unable get credentials from TEST_DE_EDITOR_OPENID_PROVIDER_CLIENT_ID variables", e); + } + } + + public String getNoAccessToken() { + try { + TokenRequest request = + new TokenRequest(this.tokenEndpointURI, this.noAccessClientAuthentication, + this.clientGrant, this.scope); + return requestToken(request); + } catch (ParseException | IOException e) { + throw new RuntimeException( + "Unable get credentials from TEST_NO_ACCESS_OPENID_PROVIDER_CLIENT_ID variables", e); + } + } + + private String requestToken(TokenRequest tokenRequest) throws ParseException, IOException { + + TokenResponse parse = OIDCTokenResponseParser.parse(tokenRequest.toHTTPRequest().send()); + + if (!parse.indicatesSuccess()) { + throw new RuntimeException("Unable get credentials variables"); + } + + JSONObject jsonObject = parse.toSuccessResponse().toJSONObject(); + String idTokenValue = jsonObject.getAsString(ID_TOKEN); + if (Objects.isNull(idTokenValue) || idTokenValue.isEmpty()) { + throw new RuntimeException("Unable get credentials variables"); + } + return idTokenValue; + } + +} diff --git a/testing/notification-test-anthos/src/test/resources/logback-test.xml b/testing/notification-test-anthos/src/test/resources/logback-test.xml new file mode 100644 index 0000000000000000000000000000000000000000..22c6175d45f368b69c4006deb9ebf3ff5084579a --- /dev/null +++ b/testing/notification-test-anthos/src/test/resources/logback-test.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration> + <include resource="org/springframework/boot/logging/logback/defaults.xml"/> + <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>%yellow([%thread]) %highlight(| %-5level |) %green(%d) %cyan(| %logger{15} |) %highlight(%msg) %n</pattern> + <charset>utf8</charset> + </encoder> + </appender> + <root level="INFO"> + <appender-ref ref="CONSOLE" /> + </root> +</configuration> diff --git a/testing/pom.xml b/testing/pom.xml index 70625614e598621d864b252628ee896340ba37f1..d3a3bdaa79d807f2e6fad852deb27a361bfb958e 100644 --- a/testing/pom.xml +++ b/testing/pom.xml @@ -35,6 +35,7 @@ <module>notification-test-gcp</module> <module>notification-test-aws</module> <module>notification-test-ibm</module> + <module>notification-test-anthos</module> </modules> <repositories>