diff --git a/.fossa.yml b/.fossa.yml index b79d42e03e2fdacc6fd84418321955a718306626..20509cd2de2cb5f1cbfe6d38c84e19d64a6d4f88 100644 --- a/.fossa.yml +++ b/.fossa.yml @@ -23,4 +23,8 @@ analyze: - name: notification-azure type: mvn target: provider/notification-azure/pom.xml + path: . + - name: notification-aws + type: mvn + target: provider/notification-aws/pom.xml path: . \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 67606948fc1c96a9fea8234a02713d5814fbc429..8721c488d24840b3f2055ae7b1fe3b70432e0685 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,6 +4,11 @@ variables: OSDU_GCP_SERVICE: notification OSDU_GCP_ENV_VARS: APP_PROJECT=${OSDU_GCP_PROJECT},APP_ENTITLEMENTS=${OSDU_GCP_ENTITLEMENTS_URL},APP_REGISTER=${OSDU_GCP_REGISTER_URL},APP_GOOGLEAUDIENCE=${GOOGLE_AUDIENCE} + AWS_BUILD_SUBDIR: provider/notification-aws/build-aws + AWS_TEST_SUBDIR: testing/notification-test-aws + AWS_SERVICE: notification + AWS_ENVIRONMENT: dev + include: - project: 'osdu/platform/ci-cd-pipelines' ref: 'master' @@ -25,5 +30,8 @@ include: ref: 'master' file: 'cloud-providers/osdu-gcp-cloudrun.yml' + - project: 'osdu/platform/ci-cd-pipelines' + file: 'cloud-providers/aws.yml' + osdu-gcp-test: allow_failure: true diff --git a/provider/notification-aws/build-aws/buildspec.yaml b/provider/notification-aws/build-aws/buildspec.yaml index 7fcbdfa04182d656089be391be9d2a2ede1bcd4c..c5d68f03813622839e6cefb44cb7ce2e5aa78431 100644 --- a/provider/notification-aws/build-aws/buildspec.yaml +++ b/provider/notification-aws/build-aws/buildspec.yaml @@ -53,8 +53,8 @@ phases: - echo "Building primary service assemblies..." - mvn -B test install -pl notification-core,provider/notification-aws -Ddeployment.environment=prod - #- echo "Building integration testing assemblies and gathering artifacts..." - #- ./testing/notification-test-aws/build-aws/prepare-dist.sh + - echo "Building integration testing assemblies and gathering artifacts..." + - ./testing/notification-test-aws/build-aws/prepare-dist.sh - echo "Building docker image..." - docker build -f provider/notification-aws/build-aws/Dockerfile -t ${ECR_IMAGE} . diff --git a/provider/notification-aws/pom.xml b/provider/notification-aws/pom.xml index 19be32af51cd69d1e97a9002f6a50680a6f3f081..a1108831452403b13de3530336ddf9a327f46954 100644 --- a/provider/notification-aws/pom.xml +++ b/provider/notification-aws/pom.xml @@ -37,6 +37,7 @@ <java.version>8</java.version> <maven.compiler.target>${java.version}</maven.compiler.target> <maven.compiler.source>${java.version}</maven.compiler.source> + <aws.version>1.11.637</aws.version> </properties> <repositories> @@ -70,6 +71,13 @@ <version>0.3.11-SNAPSHOT</version> </dependency> + <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-secretsmanager --> + <dependency> + <groupId>com.amazonaws</groupId> + <artifactId>aws-java-sdk-secretsmanager</artifactId> + <version>${aws.version}</version> + </dependency> + <dependency> <groupId>org.opengroup.osdu</groupId> <artifactId>notification-core</artifactId> diff --git a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsPubsubRequestBodyExtractor.java b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsPubsubRequestBodyExtractor.java index 8658545548db9e71b35cbd6c679decf15edd9f1b..eeaba92973ea42de379c1e1f89f025b9350d5c26 100644 --- a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsPubsubRequestBodyExtractor.java +++ b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsPubsubRequestBodyExtractor.java @@ -48,6 +48,13 @@ public class AwsPubsubRequestBodyExtractor implements IPubsubRequestBodyExtracto @Autowired private JaxRsDpsLog log; + + @Autowired + public AwsPubsubRequestBodyExtractor(HttpServletRequest httpServletRequest) { + this.request = httpServletRequest; + + } + public Map<String, String> extractAttributesFromRequestBody() { if (this.messageContent == null) { this.messageContent = this.extractPubsubMessageFromRequestBody(); diff --git a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/ServiceAccountJwtAwsClientImpl.java b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/ServiceAccountJwtAwsClientImpl.java index 0c96df5d3810bc6edb08a7a08b93b030be281e1f..dcfbf42aa4cedd1976432d027e0b855b7d392384 100644 --- a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/ServiceAccountJwtAwsClientImpl.java +++ b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/ServiceAccountJwtAwsClientImpl.java @@ -1,15 +1,213 @@ +// Copyright © 2020 Amazon Web Services +// 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.provider.aws.impl; +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.services.secretsmanager.AWSSecretsManager; +import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder; +import com.amazonaws.services.secretsmanager.model.*; +import com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagement; +import com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagementClientBuilder; +import com.amazonaws.services.simplesystemsmanagement.model.*; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; + +import org.opengroup.osdu.core.aws.iam.IAMConfig; +import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.util.IServiceAccountJwtClient; +import org.opengroup.osdu.notification.provider.aws.utils.AwsCognitoClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; + +import java.io.IOException; + +import java.util.ArrayList; + +import java.util.List; +import java.util.Map; + @Component public class ServiceAccountJwtAwsClientImpl implements IServiceAccountJwtClient { + + + @Value("${aws.region}") + @Getter() + @Setter(AccessLevel.PROTECTED) + public String amazonRegion; + + + + @Value("${aws.ssm}") + @Getter() + @Setter(AccessLevel.PROTECTED) + public Boolean ssmEnabled; + + + @Value("${aws.environment}") + @Getter() + @Setter(AccessLevel.PROTECTED) + public String environment; + + + @Autowired + private JaxRsDpsLog log; + + String password; + String clientid; + String userpoolid; + String serviceprincipaluser; + AwsCognitoClient cognitoClient; + + private AWSCredentialsProvider amazonAWSCredentials; + private AWSSimpleSystemsManagement ssmManager; + + @PostConstruct + public void init() { + if (ssmEnabled) { + String secretKey = "service_principal_password"; + String secretName = "/osdu/" + environment + "/service_principal_password"; + String cognito_user_pool_id = "/osdu/" + environment + "/cognito-user-pool-id"; + String cognito_client_id = "/osdu/" + environment + "/cognito-client-id"; + String service_principal = "/osdu/" + environment + "/service-principal-user"; + amazonAWSCredentials = IAMConfig.amazonAWSCredentials(); + ssmManager = AWSSimpleSystemsManagementClientBuilder.standard() + .withCredentials(amazonAWSCredentials) + .withRegion(amazonRegion) + .build(); + + GetParametersRequest paramRequest = new GetParametersRequest() + .withNames(cognito_user_pool_id,cognito_client_id,service_principal) + .withWithDecryption(true); + GetParametersResult paramResult = new GetParametersResult(); + paramResult = ssmManager.getParameters(paramRequest); + List<Parameter> paramsResultList = new ArrayList<>(); + List<String> paramsResultListInvalid = new ArrayList<>(); + paramsResultList = paramResult.getParameters(); + paramsResultListInvalid = paramResult.getInvalidParameters(); + + if(paramsResultListInvalid.size() >0) + { + log.error("SSM did not retrieve all parameters"); + } + for (Parameter s : paramsResultList) { + if (s.getName().equalsIgnoreCase(cognito_user_pool_id)) { + userpoolid = s.getValue(); + } + if (s.getName().equalsIgnoreCase(cognito_client_id)) { + clientid = s.getValue(); + } + if (s.getName().equalsIgnoreCase(service_principal)) { + serviceprincipaluser = s.getValue(); + } + + } + + password = getSecret(secretName,amazonRegion,secretKey); + cognitoClient = new AwsCognitoClient(amazonRegion,clientid,"USER_PASSWORD_AUTH", serviceprincipaluser,password); + cognitoClient.setPassword(serviceprincipaluser,password,userpoolid); + } + } + @Override public String getIdToken(String s) { - String token ="not used"; + String token= getServicePrincipalCredentials(); return token; } + + public String getServicePrincipalCredentials() + { + + String token = cognitoClient.getToken(serviceprincipaluser,password,"bearer"); + return token; + + } + + public String getSecret(String secretName, String region,String secretKey) { + + +String secretVaue=""; + // Create a Secrets Manager client + AWSSecretsManager client = AWSSecretsManagerClientBuilder.standard() + .withRegion(region) + .build(); + + String secret="", decodedBinarySecret=""; + GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest() + .withSecretId(secretName); + GetSecretValueResult getSecretValueResult = null; + + try { + getSecretValueResult = client.getSecretValue(getSecretValueRequest); + } catch (DecryptionFailureException e) { + // Secrets Manager can't decrypt the protected secret text using the provided KMS key. + // Deal with the exception here, and/or rethrow at your discretion. + log.error("Error while setting up ServicePrincipalAccount"+e.getMessage()); + throw e; + } catch (InternalServiceErrorException e) { + // An error occurred on the server side. + // Deal with the exception here, and/or rethrow at your discretion. + log.error("Error while setting up ServicePrincipalAccount"+e.getMessage()); + throw e; + } catch (InvalidParameterException e) { + // You provided an invalid value for a parameter. + // Deal with the exception here, and/or rethrow at your discretion. + log.error("Error while setting up ServicePrincipalAccount"+e.getMessage()); + throw e; + } catch (InvalidRequestException e) { + // You provided a parameter value that is not valid for the current state of the resource. + // Deal with the exception here, and/or rethrow at your discretion. + log.error("Error while setting up ServicePrincipalAccount"+e.getMessage()); + throw e; + } catch (ResourceNotFoundException e) { + // We can't find the resource that you asked for. + // Deal with the exception here, and/or rethrow at your discretion. + log.error("Error while setting up ServicePrincipalAccount"+e.getMessage()); + throw e; + } + + // Decrypts secret using the associated KMS CMK. + // Depending on whether the secret is a string or binary, one of these fields will be populated. + if (getSecretValueResult.getSecretString() != null) { + secret = getSecretValueResult.getSecretString(); + Map<String, String> secretMap=null; + + try + { + secretMap = new ObjectMapper().readValue(secret.getBytes(), Map.class); + + } catch (JsonParseException e) { + log.error(e.getMessage()); + } catch (JsonMappingException e) { + log.error(e.getMessage()); + } catch (IOException e) { + log.error(e.getMessage()); + } + + secretVaue = secretMap.get(secretKey); + } + + + return secretVaue; + } + + } diff --git a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/utils/AwsCognitoClient.java b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/utils/AwsCognitoClient.java new file mode 100644 index 0000000000000000000000000000000000000000..d8c9fe16334706f8bb091cf866099a1a3f46b796 --- /dev/null +++ b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/utils/AwsCognitoClient.java @@ -0,0 +1,97 @@ +// Copyright © 2020 Amazon Web Services +// +// 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.provider.aws.utils; + +import com.amazonaws.services.cognitoidp.AWSCognitoIdentityProvider; +import com.amazonaws.services.cognitoidp.AWSCognitoIdentityProviderClientBuilder; +import com.amazonaws.services.cognitoidp.model.AdminSetUserPasswordRequest; +import com.amazonaws.services.cognitoidp.model.AdminSetUserPasswordResult; +import com.amazonaws.services.cognitoidp.model.InitiateAuthRequest; +import com.amazonaws.services.cognitoidp.model.InitiateAuthResult; +import org.opengroup.osdu.core.aws.iam.IAMConfig; + +import java.util.HashMap; +import java.util.Map; + +public class AwsCognitoClient { + + // Parameter value locations + private final static String USERNAME_PARAM = "USERNAME"; + private final static String PASSWORD_PARAM = "PASSWORD"; + private final static String COGNITO_CLIENT_ID_PROPERTY = "AWS_COGNITO_CLIENT_ID"; + private final static String COGNITO_AUTH_FLOW_PROPERTY = "AWS_COGNITO_AUTH_FLOW"; + private final static String COGNITO_AUTH_PARAMS_USER_PROPERTY = "AWS_COGNITO_AUTH_PARAMS_USER"; + private final static String COGNITO_AUTH_PARAMS_PASSWORD_PROPERTY = "AWS_COGNITO_AUTH_PARAMS_PASSWORD"; + + + String awsCognitoClientId; + String awsCognitoAuthFlow; + String awsCognitoAuthParamsUser; + String awsCognitoAuthParamsPassword; + AWSCognitoIdentityProvider provider; + + + public AwsCognitoClient(String region,String awsCognitoClientId, String awsCognitoAuthFlow, String awsCognitoAuthParamsUser + , String awsCognitoAuthParamsPassword) { + this.awsCognitoClientId = awsCognitoClientId; + this.awsCognitoAuthFlow = awsCognitoAuthFlow; + this.awsCognitoAuthParamsUser = awsCognitoAuthParamsUser; + this.awsCognitoAuthParamsPassword = awsCognitoAuthParamsPassword; + this.provider = generateCognitoClient(region); + + + } + + public String getToken(String username, String password,String tokenType){ + Map<String, String> authParameters = new HashMap<>(); + authParameters.put(USERNAME_PARAM, username); + authParameters.put(PASSWORD_PARAM, password); + + InitiateAuthRequest request = new InitiateAuthRequest(); + request.setClientId(awsCognitoClientId); + request.setAuthFlow(awsCognitoAuthFlow); + request.setAuthParameters(authParameters); + String token=""; + InitiateAuthResult result = this.provider.initiateAuth(request); + if(tokenType.equals("session")) + token= result.getSession(); + else if(tokenType.equals("bearer")) + token= "Bearer "+ result.getAuthenticationResult().getAccessToken(); + return token; + } + + + public AWSCognitoIdentityProvider getProvider() { + return provider; + } + + public static AWSCognitoIdentityProvider generateCognitoClient(String region) + { + return AWSCognitoIdentityProviderClientBuilder.standard() + .withCredentials(IAMConfig.amazonAWSCredentials()) + .withRegion(region) + .build(); + } + + public void setPassword(String username, String password,String userPoolId){ + AdminSetUserPasswordRequest request = new AdminSetUserPasswordRequest() + .withUsername(username) + .withPassword(password) + .withPermanent(true) + .withUserPoolId(userPoolId); + AdminSetUserPasswordResult result = this.provider.adminSetUserPassword(request); + + } +} diff --git a/provider/notification-aws/src/main/resources/application.properties b/provider/notification-aws/src/main/resources/application.properties index 627c87d6d01c81bd307b1319c06cf679b5c3dedf..6412b35466c829df8611f467c82b8e2428185846 100644 --- a/provider/notification-aws/src/main/resources/application.properties +++ b/provider/notification-aws/src/main/resources/application.properties @@ -21,6 +21,8 @@ AUTHORIZE_API=${ENTITLEMENTS_BASE_URL}/api/entitlements/v1 REGISTER_SERVICE_URL=${REGISTER_BASE_URL}/api/register/v1 +aws.ssm=${SSM_ENABLED:True} +aws.environment=${RESOURCE_PREFIX} ## AWS DynamoDB configuration aws.region=${AWS_REGION} aws.dynamodb.table.prefix=${RESOURCE_PREFIX}- diff --git a/provider/notification-aws/src/test/java/org/opengroup/osdu/notification/provider/aws/AwsPubsubRequestBodyExtractorTest.java b/provider/notification-aws/src/test/java/org/opengroup/osdu/notification/provider/aws/AwsPubsubRequestBodyExtractorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..76d62972a40122ff3d76cf2efda82598d15f7680 --- /dev/null +++ b/provider/notification-aws/src/test/java/org/opengroup/osdu/notification/provider/aws/AwsPubsubRequestBodyExtractorTest.java @@ -0,0 +1,157 @@ +// Copyright © 2020 Amazon Web Services +// +// 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.provider.aws; + + +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDeleteExpression; +import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.runners.MockitoJUnitRunner; + + +import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; + +import org.opengroup.osdu.core.common.model.http.DpsHeaders; +import org.opengroup.osdu.notification.provider.aws.impl.AwsPubsubRequestBodyExtractor; + + +import javax.servlet.http.HttpServletRequest; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; + +import java.util.Map; + + + + +@RunWith(MockitoJUnitRunner.class) +public class AwsPubsubRequestBodyExtractorTest { + + @Mock + private DpsHeaders dpsHeaders; + + + + @Mock + private JaxRsDpsLog logger; + + @Mock + private HttpServletRequest request; + + @Mock + private AwsPubsubRequestBodyExtractor service; + + @Before + public void init() { + + + } + + + @Test + public void should_returnValidData_extractDataFromRequestBody() throws IOException { + String stringRequest = "{\n" + + "\t\"Type\": \"Notification\",\n" + + "\t\"message\": {\n" + + "\t\"attributes\": {\n" + + "\t\"correlation-id\": \"39137f49-67d6-4001-a6aa-15521ef4f49e\",\n" + + "\t\"data-partition-id\": \"" + TestUtils.getDataPartitionId() + "\"\n" + + "\t},\n" + + "\t\"data\": \"dGVzdERhdGE=\",\n" + + "\t\"messageId\": \"136969346945\"\n" + + "\t},\n" + + "\t\"subscription\": \""+ "de12345" +"\"\n" + + "}\n"; + BufferedReader reader = new BufferedReader(new StringReader(stringRequest)); + Mockito.when(request.getReader()).thenReturn(reader); + + String expectedData = "testData"; + + service = new AwsPubsubRequestBodyExtractor(request); + String receivedData = service.extractDataFromRequestBody(); + + Assert.assertEquals(expectedData,receivedData); + + + + } + + + @Test + public void should_returnValidNotificationId_FromRequestBody() throws IOException { + String stringRequest = "{\n" + + "\t\"Type\": \"Notification\",\n" + + "\t\"message\": {\n" + + "\t\"attributes\": {\n" + + "\t\"correlation-id\": \"39137f49-67d6-4001-a6aa-15521ef4f49e\",\n" + + "\t\"data-partition-id\": \"" + TestUtils.getDataPartitionId() + "\"\n" + + "\t},\n" + + "\t\"data\": \"dGVzdERhdGE=\",\n" + + "\t\"messageId\": \"136969346945\"\n" + + "\t},\n" + + "\t\"subscription\": \""+ "de12345" +"\"\n" + + "}\n"; + BufferedReader reader = new BufferedReader(new StringReader(stringRequest)); + Mockito.when(request.getReader()).thenReturn(reader); + + String expectedData = "de12345"; + + service = new AwsPubsubRequestBodyExtractor(request); + String receivedData = service.extractNotificationIdFromRequestBody(); + + Assert.assertEquals(expectedData,receivedData); + + + + } + + @Test + public void should_returnValidAttributes_FromRequestBody() throws IOException { + String stringRequest = "{\n" + + "\t\"Type\": \"Notification\",\n" + + "\t\"message\": {\n" + + "\t\"attributes\": {\n" + + "\t\"correlation-id\": \"39137f49-123-456\",\n" + + "\t\"data-partition-id\": \"" + TestUtils.getDataPartitionId() + "\"\n" + + "\t},\n" + + "\t\"data\": \"dGVzdERhdGE=\",\n" + + "\t\"messageId\": \"136969346945\"\n" + + "\t},\n" + + "\t\"subscription\": \""+ "de12345" +"\"\n" + + "}\n"; + BufferedReader reader = new BufferedReader(new StringReader(stringRequest)); + Mockito.when(request.getReader()).thenReturn(reader); + + String expectedData = "de12345"; + + service = new AwsPubsubRequestBodyExtractor(request); + // Act + Map<String, String> receivedAttributes = service.extractAttributesFromRequestBody(); + + // Asset + Assert.assertEquals(receivedAttributes.get("correlation-id"),"39137f49-123-456"); + Assert.assertEquals(receivedAttributes.get("data-partition-id"),"opendes"); + + + + } +} diff --git a/provider/notification-aws/src/test/java/org/opengroup/osdu/notification/provider/aws/TestUtils.java b/provider/notification-aws/src/test/java/org/opengroup/osdu/notification/provider/aws/TestUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..de73e4c4066524dfbbf9b30d73aa904e7e1a1eee --- /dev/null +++ b/provider/notification-aws/src/test/java/org/opengroup/osdu/notification/provider/aws/TestUtils.java @@ -0,0 +1,40 @@ +// Copyright © 2020 Amazon Web Services +// +// 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.provider.aws; + + + +public class TestUtils { + + private TestUtils() { + } + + private static final String dataPartitionId = "opendes"; + + public static String getDataPartitionId() { + return dataPartitionId; + } + + + + + +} + + + + + + diff --git a/testing/notification-test-aws/build-aws/prepare-dist.sh b/testing/notification-test-aws/build-aws/prepare-dist.sh old mode 100644 new mode 100755 diff --git a/testing/notification-test-aws/build-aws/run-tests.sh b/testing/notification-test-aws/build-aws/run-tests.sh old mode 100644 new mode 100755 index 973539f7ad8ebf586c4eee59f21ac58d1320a43b..afd1e9e3a44432dacecbd08cd37d703cac09c99c --- a/testing/notification-test-aws/build-aws/run-tests.sh +++ b/testing/notification-test-aws/build-aws/run-tests.sh @@ -36,14 +36,11 @@ export AWS_COGNITO_AUTH_PARAMS_PASSWORD=$ADMIN_PASSWORD export AWS_COGNITO_AUTH_PARAMS_USER=$ADMIN_USER export AWS_COGNITO_AUTH_PARAMS_USER_NO_ACCESS=$USER_NO_ACCESS export ENVIRONMENT=DEV -export REGISTER_BASE_URL=$REGISTER_BASE_URL +export NOTIFICATION_REGISTER_BASE_URL=$NOTIFICATION_REGISTER_BASE_URL export HMAC_SECRET=02030405060708090A0B0C0D0E0F -export REGISTER_CUSTOM_PUSH_PATH=api/register/v1/awstest/aws/challenge -export REGISTER_CUSTOM_PUSH_PATH1=api/register/v1/awstest/aws/challenge/1 -export REGISTER_CUSTOM_PUSH_URL=$REGISTER_BASE_URL$REGISTER_CUSTOM_PUSH_PATH -export REGISTER_CUSTOM_PUSH_URL1=$REGISTER_BASE_URL$REGISTER_CUSTOM_PUSH_PATH1 - - +export REGISTER_CUSTOM_PUSH_PATH=/api/register/v1/awstest/aws/challenge/1 +export REGISTER_CUSTOM_PUSH_URL_HMAC=$NOTIFICATION_REGISTER_BASE_URL$REGISTER_CUSTOM_PUSH_PATH +export NOTIFICATION_BASE_URL=$NOTIFICATION_BASE_URL #### RUN INTEGRATION TEST ######################################################################### diff --git a/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/api/PubsubEndpointHMACDescriptor.java b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/api/PubsubEndpointHMACDescriptor.java new file mode 100644 index 0000000000000000000000000000000000000000..9f439169743714ddba75eebe46620b3b6ad052cd --- /dev/null +++ b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/api/PubsubEndpointHMACDescriptor.java @@ -0,0 +1,64 @@ +// Copyright © 2020 Amazon Web Services +// 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 org.opengroup.osdu.notification.util.Config; +import org.opengroup.osdu.notification.util.RestDescriptor; +import org.opengroup.osdu.notification.util.TestUtils; + +import java.util.HashMap; +import java.util.Map; + +public class PubsubEndpointHMACDescriptor extends RestDescriptor { + + @Override + public String getPath() { + return "push-handlers/records-changed"; + } + + @Override + public String getHttpMethod() { + return "POST"; + } + + @Override + public String getValidBody() { + return "{\n" + + "\t\"Type\": \"Notification\",\n" + + "\t\"message\": {\n" + + "\t\"attributes\": {\n" + + "\t\"correlation-id\": \"39137f49-67d6-4001-a6aa-15521ef4f49e\",\n" + + "\t\"data-partition-id\": \"" + TestUtils.getOsduTenant() + "\"\n" + + "\t},\n" + + "\t\"data\": \"W3sia2luZCI6InRlc3RraW5kIiwiaWQiOiJ0ZXN0aWQiLCJvcGVyYXRpb250eXBlIjoiY3JlYXRlIn0seyJraW5kIjoidGVzdGtpbmQyIiwiaWQiOiJ0ZXN0aWQyIiwib3BlcmF0aW9udHlwZSI6InVwZGF0ZSJ9XQ\",\n" + + "\t\"messageId\": \"136969346945\"\n" + + "\t},\n" + + "\t\"subscription\": \""+ arg() +"\"\n" + + "}\n"; + } + + @Override + public Map<String,String> getOsduTenantHeaders(){ + Map<String, String> headers = new HashMap<>(); + headers.put("data-partition-id", Config.Instance().OsduTenant); + return headers; + } + + @Override + public Map<String,String> getCustomerTenantHeaders(){ + Map<String, String> headers = new HashMap<>(); + headers.put("data-partition-id", Config.Instance().ClientTenant); + return headers; + } +} diff --git a/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/api/TestPubsubEndpointHMAC.java b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/api/TestPubsubEndpointHMAC.java index caeaec919b00cf1b7289e5ca1570f28c3a86ffca..d19be5fa0bdca69cf1458daf7b300187f1eb1ce3 100644 --- a/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/api/TestPubsubEndpointHMAC.java +++ b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/api/TestPubsubEndpointHMAC.java @@ -1,3 +1,16 @@ +// Copyright © 2020 Amazon Web Services +// +// 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; diff --git a/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/util/AwsTestUtils.java b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/util/AwsTestUtils.java index 9b0bb8874c8f0518fad3edc46d1f1f71736c5d30..d2c64bab0ba45d473ed115c4ca445b2d8a7b2a83 100644 --- a/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/util/AwsTestUtils.java +++ b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/util/AwsTestUtils.java @@ -31,22 +31,24 @@ public class AwsTestUtils extends TestUtils{ return opsToken; } + + //These users don't have access to the API, so getting the token for NoAccessUser @Override public String getAdminToken() throws Exception { if (adminToken==null || StringUtils.isEmpty(adminToken)) { - adminToken=client.getToken(AwsConfig.getAWSCognitoUser(),AwsConfig.getAWSCognitoPassword(),"bearer"); + adminToken=client.getToken(AwsConfig.getAWSCognitoNoAccessUser(),AwsConfig.getAWSCognitoPassword(),"bearer"); } return adminToken; } - + //These users don't have access to the API, so getting the token for NoAccessUser @Override public String getEditorToken() throws Exception { if (editorToken==null || StringUtils.isEmpty(editorToken)) { - editorToken=client.getToken(AwsConfig.getAWSCognitoUser(),AwsConfig.getAWSCognitoPassword(),"bearer"); + editorToken=client.getToken(AwsConfig.getAWSCognitoNoAccessUser(),AwsConfig.getAWSCognitoPassword(),"bearer"); } return editorToken; } - + //These users don't have access to the API, so getting the token for NoAccessUser @Override public String getNoAccessToken() throws Exception { if (noAccessToken==null || StringUtils.isEmpty(noAccessToken)) { diff --git a/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/api/PubsubEndpointHMACTests.java b/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/api/PubsubEndpointHMACTests.java index 11b88bffaea906f65560bc67186abad390146d3a..fcb164172b5b64d77d2b81e2e2e0c18e0f6d0b42 100644 --- a/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/api/PubsubEndpointHMACTests.java +++ b/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/api/PubsubEndpointHMACTests.java @@ -84,7 +84,7 @@ public abstract class PubsubEndpointHMACTests extends BaseTestTemplate { subscription.setName("subscription-integration-test-hmac"); subscription.setDescription("subscription created for hmac integration test"); subscription.setTopic(Config.Instance().Topic); - //This seems to be a bug + //This seems to be a bug. Dont need to add the string //subscription.setPushEndpoint(Config.Instance().HMACPushUrl + "hmac-integration-test"); subscription.setPushEndpoint(Config.Instance().HMACPushUrl); HmacSecret secret = new HmacSecret(); diff --git a/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/BaseTestTemplate.java b/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/BaseTestTemplate.java index 79eb64040d3e18c4858cc06478c12151bba41cd9..4e4470550d0c2049e8ab13a61ec32f4d509d31d5 100644 --- a/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/BaseTestTemplate.java +++ b/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/BaseTestTemplate.java @@ -17,6 +17,7 @@ package org.opengroup.osdu.notification.util; import com.sun.jersey.api.client.ClientResponse; +import org.junit.Ignore; import org.junit.Test; import java.util.ArrayList; @@ -107,6 +108,7 @@ public abstract class BaseTestTemplate extends TestBase { ClientResponse response = descriptor.runOptions(getArg(), testUtils.getEditorToken()); assertEquals(error( response.getEntity(String.class)), 200, response.getStatus()); } + @Ignore("Issue logged in GL") @Test public void should_return307_when_makingHttpRequest()throws Exception{ if(Config.Instance().isLocalHost() || Config.isGke()) diff --git a/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/Config.java b/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/Config.java index cef5ecfe530acfe45fb67559e4b09ef6ee34edba..3a9c5544b783a3ea0e44d981b3afe213a07a5e3e 100644 --- a/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/Config.java +++ b/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/Config.java @@ -53,10 +53,26 @@ public class Config { String registerUrl = System.getProperty("REGISTER_BASE_URL", System.getenv("REGISTER_BASE_URL")); config.HostUrl = System.getProperty("NOTIFICATION_BASE_URL", System.getenv("NOTIFICATION_BASE_URL")); config.GSAPushUrl = registerUrl+"/test/gsa-challenge/"; - config.HMACPushUrl = registerUrl+"/test/challenge/"; - config.RegisterServicePath = registerUrl; + //Adding this so CPs can point to custom HMAC push endpoints + config.HMACPushUrl = getEnvironmentVariableOrDefaultValue("REGISTER_CUSTOM_PUSH_URL_HMAC",registerUrl+"/test/challenge/"); + //Adding a new variable NOTIFICATION_REGISTER_BASE_URL since REGISTER_BASE_URL is used by Register integration tests which needs a trailing \ + String regUrl= getEnvironmentVariable("NOTIFICATION_REGISTER_BASE_URL"); + if(regUrl==null) + { + config.RegisterServicePath = registerUrl; + } + else + { + config.RegisterServicePath = regUrl+"/api/register/v1"; + } + }else throw new RuntimeException("$ENVIRONMENT environment variable not provided"); + + System.out.println("HostUrl="+config.HostUrl); + System.out.println("config.Topic="+ config.Topic); + System.out.println("config.HMACPushUrl="+ config.HMACPushUrl); + System.out.println("config.RegisterServicePath="+ config.RegisterServicePath); return config; }