From cdf6246b88c7a7ab01d8ce07a56d1eb5410c1537 Mon Sep 17 00:00:00 2001 From: Jonathan Vila Date: Thu, 9 Jan 2020 10:09:47 +0100 Subject: [PATCH 01/19] MIGENG-365 - End2end integration test (#20) * WINDUP-2398 changed mimetype and created sample available json * changed kafka topic * changed kafka topic and category * refactored code * replaced seda by direct as it seemed not to work * Converted calculator into Bean Added Sonar + Jacoco execution * Created first test for a simple route in order to know how to properly test Camel * Created unit test for AnalysticsCalculator Added JUnit 5 and AssertJ to pom Aplied some clean-code suggestions * Removed sonar token from pom * WINDUP-2398 Added support for JUnit 5 on old maven versions Added constructors on model Fixed AnalyticsCalculatorTest test Added Sonar info to README * WINDUP-2398 Added lombok file to add Generated annotation that will be avoided by JaCoCo Added sample file to test multipart Added test for the multipart Removed accessors/modifiers for cloudforms classes Cleaned CustomizedMultipartDataFormat * WINDUP-2398 Renamed test methods * WINDUP-2398 Renamed test methods * WINDUP-2398 Moved back to JUnit 4 as Camel Test support doesnt support JUnit 5 yet * WINDUP-2398 Added very simple test for direct:store * WINDUP-2398 Added test for direct-upload with individual files and zip file * WINDUP-2398 Added test for direct:insights route * WINDUP-2398 minor change on xmlroutestest * WINDUP-2398 Applied changes from travis PR * WNDUP-2398 added test for kafka listener route * WNDUP-2398 added a test for the direct-download route ( not finished ) * WNDUP-2398 fixed test for direct:download route * WNDUP-2398 added test for direct:calculate added cloudforms export file * WNDUP-2398 testing the rest endpoint * WNDUP-2398 testing the rest-upload endpoint * WNDUP-2398 testing the rest report endpoint * WNDUP-2398 switched to regular endpoints for rest, as rest DSL has some "issues" * WNDUP-2398 renamed kie helper methods with no Random, and removed unused code * WNDUP-2404 testing call-kie-extract-reports route removed testing route * WNDUP-2398 testing the direct:decisionserver endpoint * WNDUP-2404 changed kie endpoint from http4 to http as a ClientProtocolException appears * WINDUP-2404 adjusted the tests to consider the new context-path * windup-2398 considering non file params as headers for all messages * windup-2398 testing the param from multi part form * WINDUP-2398 removed customerid from the url on the rest endpoint * WINDUP-2398 removed customerid from the test of rest endpoint * WINDUP-2398 modified tests to work with dynamic metadata properties and filtering for messages having all those properties * MIGENG-23 added new version of Cloudforms file, refactored Calculator * MIGENG-23 replaced the object model to be sent to JMS with the one in xavier-analytics * MIGENG-23 adapted tests to new report model * MIGENG-23 changed cloudforms model types Integer to Long * MIGENG-23 changed the way we obtain RequestId as before it was always the same * MIGENG-23 fixed tests according to the new model * MIGENG-23 replaced cloudforms test files * MIGENG-23 made host.type filter configurable with a property * MIGENG-23 added tar and gz support to the route * MIGENG-23 added TAR.GZ support and added test for that * MIGENG-23 added exception handling when the json crashes on the unmarshal * MIGENG-23 fixed mocking log endpoint in test * MIGENG-23 fixed attributes and filter names * MIGENG-23 fixed tests with the new "MA_metadata" header now we use the RHIdentity object passed as x-rh-identity header if it exists and we populate our params * MIGENG-106 Modified the routes in order to do the unzip after receiving the message from kafka and not in the upload * MIGENG-106 Fixed tests in order to work with the unzipping after the kafka message * MIGENG-106 Removed all structure for CloudForms Modified test and added paths to properties * MIGENG-106 Small refactors * MIGENG-106 Renamed test * end2end added test to allow an End To End test using TestContainers and real layers using WireMock to simulate Rest InsightsUpload service * end2end working on issue with Ryuk and test containers * MIGENG-106 code prepared to use the version on the manifest * MIGENG-106 added test to check versioning fallback * MIGENG-106 fixed tests according the new payload taxonomy * MIGENG-106 added tar.gz file for only 1 json inside * MIGENG-106 modified getRHIdentity to modify only the identity.internal element * MIGENG-106 fixes to issues during deployment and test * MIGENG-106 fixed the calculation method for the number of hypervisors * MIGENG-106 fixing and adding tests to changes on getRHIdentity and extractMAmetadata * MIGENG-106 replaced artemis with activemq Improvements in the E2E test with the containers * end2end added hoverfly to simulate insights upload service, firsts attempts * end2end typo fix * end2end added logging for testing, and changed to mock-server to mock rest API * end2end Fixed the test with correct multipart sending, correct jpa retrieving, and kie sample files as response * end2end Fix the End2End test with correct version of TestContainers Fixed test for Kie Service with proper expectation Fixed test for Direct Download for considering the proper endpoint having query params * end2end Removed analytics dependency * end2end Removed Debug LOG lines * end2end Removed hoverfly logging * MIGENG-150 Creation of initial classes and routes for VMWorkloadInventory * end2end renamed the EndToEnd to a regular Test * end2end fixing the filtering to camel headers , and switching back to previous false state * end2end making the identity of the ..with-targz.json file the full one * end2end making the identity of the platform.upload.xavier.json.gz and .json file the full one * end2end fixing base64 identity to have the same fix the type of the file loaded to be consistent with the one in the base64 identity * end2end fixed test dependencies * end2end removed Spring Boot ActiveMQ dependency * MIGENG-150 Added Test for the VMWorkloadInventoryCalculator Changed Ids for second host in sample file (.json) Added multicast route to send message to both calculators Renamed cost savings route Added paths to obtain workload inventory properties * MIGENG-150 Fixed test * MIGENG-150 removed parallel processing * MIGENG-150 added test for direct:calculate-vmworkloadinventory * MIGENG-150 adapted route using decisionServer to use the right methods * MIGENG-150 set right values for kie command and session for WKI * MIGENG-150 fixed value for test * MIGENG-150 fixed multicast and split issue as seen on CI deployment * MIGENG-150 changed the method call from setWorkload ... to AddWorkLoad * MIGENG-150 changed the test for calculate vmworkload to consider individual elements return instead of a collection * MIGENG-150 added Serializable to the WorkloadInventory Model object * MIGENG-150 moved class VMWorkloadinventory to another package * MIGENG-150 fixed depending classes after moved class VMWorkloadinventory to another package * end2end added info about Ryuk and Testcontainers property * MIGENG-151 adding methods to get the collection fields * MIGENG-151 added methods to set values for the collection fields added info to the test payload * MIGENG-150 working on the Files map retrieval * MIGENG-150 fixed the path for the files map fixed the lambda to get the files map value pairs * MIGENG-151 working on the Files map retrieval * MIGENG-151 fixed the path for the files map fixed the lambda to get the files map value pairs * MIGENG-151 changed expected values considering also the collection fields for the workloadinventory * MIGENG-155 saving and persisting the entity * MIGENG-155 adding methods on the analysisService to get and update the analysismodel * MIGENG-155 modified WLI route to use the new method in analysisService modified test on DirectStore * MIGENG-155 renamed resources for inticial cost savings report * end2end Added S3 client bean to customise its endpoint url Added PostgreSQL testcontainers container Added Localstack testcontainers container Fixed analysisid in json file as response from kafka * end2end Added reports files for demolab payload added tests for the 3 reports added test for S3 added performance test * end2end Added demolab payloads files added report file for demolab * end2end Added Drools and KIE containers Added Ingress image build and container creation * end2end reordered code * end2end Modified KAFKA estrategy to earliest to take all pending messages Added properties for kieserver to connect to local container Added properties for KIE container to connect to DROOLS container Added docker-compose containers for Ingress Removed mocks Added commands to import projecto into drools * end2end added more env vars added bash script file with docker and curl commands to simulate the infrastructure deployment * end2end add env vars * end2end adjusted testcontainers env vars added sleeps in the bash script * end2end using shell commands to execute docker images for drools and kie * end2end added travis stuff for docker changed the way we get test files from FS * end2end fixed ocd analytics-template version * end2end fixed ScanRunModel accessors of Type * end2end fixed date value for summary report scan run model test file * end2end fixed Spring Boot error for Port 8080 already in use modified folder on ignored test for S3 added live replacement on ingress docker-compose to make it work increased performance test timeout to 1 minute * end2end addded changes to run Testcontainers in Travis * end2end added again H2 as test database configured the env properties for End2End Test with postgresql * end2end changes to travis to fix the issue with Testcontainers * end2end setting log level to debug on tests to check on travis * end2end log level back to info * end2end increasing time to wait until initialcostsavings report is generated * end2end increased time for CSR to 3 minutes, and used awaitillity to continue earlier if its finished * end2end added log level to hibernate to check connections to DB * end2end added commands to upgrade docker version at Travis removed testcontainers kafka dependency as it's not used * end2end making kafka to fail in the connection * end2end added print out of docker logs added explicit naming of kafka container * end2end using master branch of ingress at 20191115 * end2end renamed folder of downloaded insights as it causes issues with docker-compose * end2end added docker logs in travis * end2end added logger output to critical containers * end2end added time before the test starts * end2end added logger to activemq switched back to old version of ingress * end2end added more logs to containers and increased times * end2end added advertising for kafka * end2end enabled again ryuk * end2end removed -DtestLogRootLevel=warn -Pcoverage from the test script * end2end adding log and more time to start the test * end2end added zookeeper logs * end2end moved docker compose containers to Testcontainers added temporary hacks in the download-file route to test * end2end enabled the download of ingress-go project from github * end2end printing ScanRunModels and using sameDay as comparison between dates in ScanRunModel * end2end not considering scanrunmodel.date in the test * end2end removing tracing because Travis kills the job if we exceed * end2end removed log of docker containers in travis yaml * end2end fixed unit tests set all tests to be run in travis refactored comparisson of sets * end2end reduced log level to reduce logs in Travis * end2end changed hardcoded values set the logging level in the travis pipeline removed unused files * end2end re-added Profile Coverage to mvn execution * end2end some PR clean tasks - fixed Testcontainers name in Readme - removed unused files - refactored ...DirectCalculateVMWorkloadInventoryModelTest assert on scanRunModel - fixed typo on test properties - removed comments on ScanRunModel * end2end added minio.start * end2end replaced timeouts with something way shorter (in milliseconds) * end2end added Github action to build project and red hat repositories for dependencies * Update maven.yml * MIGENG-365 removed github pipeline * MIGENG-365 cleanup downloaded files * MIGENG-365 added timouts to the test properties and increased the value fixed not available minio.host prop on runtime * MIGENG-365 as we are not specifying profile, moved the regular SpringConfiguration to any profile except test * MIGENG-365 added delay between Minio and MINIOMC containers * MIGENG-365 removed test code from the production route, and moved to the test * MIGENG-365 cleaned the route on the download-file side, and moved parts to the test * change `type` by `smartStateEnabled` * restore `type` by `smartStateEnabled` since it will modify the database * removed unused import * fix test * MIGENG-365 [PR] removed unused jmsTemplate * MIGENG-365 [PR] moved Docker only test files to subfolder * MIGENG-365 [PR] renamed minio shell script * end2end removed minio-mc commands setting policies for the buckets as they are wrong and apparently not needed Co-authored-by: Carlos E. Feria Vila --- .travis.yml | 29 +- README.md | 7 + pom.xml | 60 +- .../output/workload/summary/ScanRunModel.java | 29 +- .../integrations/SpringConfiguration.java | 31 ++ .../integrations/route/MainRouteBuilder.java | 8 +- .../FilePersistedNotification.java | 2 + .../resources/application-test.properties | 12 +- .../resources/okd/analytics_template.json | 2 +- src/main/resources/spring/camel-context.xml | 2 +- .../xavier/integrations/EndToEndTest.java | 523 ++++++++++++++++++ .../integrations/TestConfigurationS3.java | 24 + .../MainRouteBuilder_DirectDownloadTest.java | 5 +- .../MainRouteBuilder_RestUploadTest.java | 2 +- .../route/MainRouteBuilder_S3Test.java | 4 +- ...CalculateVMWorkloadInventoryModelTest.java | 6 +- .../integrations/route/XavierCamelTest.java | 1 - ...b-withssa-initial-cost-savings-report.json | 123 ++++ ...lab-withssa-workload-inventory-report.json | 282 ++++++++++ ...molab-withssa-workload-summary-report.json | 49 ++ ..._inventory-20190912-demolab_withSSA.tar.gz | Bin 0 -> 29893 bytes .../resources/cloudforms-export-v1.json.gz | Bin 0 -> 42125 bytes src/test/resources/cloudforms-export-v1.zip | Bin 0 -> 42404 bytes ...dforms-export-v1_0_0-multiple-files.tar.gz | Bin 49523 -> 49659 bytes .../resources/cloudforms-export-v1_0_0.tar.gz | Bin 14890 -> 24979 bytes .../drools-kie-compose.yml | 38 ++ .../drools-kie-docker-test.sh | 104 ++++ ...erver-response-workloadinventoryreport.xml | 4 + .../minio-bucket-creation-commands.sh | 5 + .../resources/platform.upload.available.json | 35 -- .../resources/platform.upload.xavier.json | 4 +- upload/fichero.txt | 1 - upload/testfilename.txt | 1 - 33 files changed, 1322 insertions(+), 71 deletions(-) create mode 100644 src/main/java/org/jboss/xavier/integrations/SpringConfiguration.java create mode 100644 src/test/java/org/jboss/xavier/integrations/EndToEndTest.java create mode 100644 src/test/java/org/jboss/xavier/integrations/TestConfigurationS3.java create mode 100644 src/test/resources/cfme_inventory-20190912-demolab-withssa-initial-cost-savings-report.json create mode 100644 src/test/resources/cfme_inventory-20190912-demolab-withssa-workload-inventory-report.json create mode 100644 src/test/resources/cfme_inventory-20190912-demolab-withssa-workload-summary-report.json create mode 100644 src/test/resources/cfme_inventory-20190912-demolab_withSSA.tar.gz create mode 100644 src/test/resources/cloudforms-export-v1.json.gz create mode 100644 src/test/resources/cloudforms-export-v1.zip create mode 100644 src/test/resources/docker-only-test-files/drools-kie-compose.yml create mode 100755 src/test/resources/docker-only-test-files/drools-kie-docker-test.sh create mode 100755 src/test/resources/minio-bucket-creation-commands.sh delete mode 100644 src/test/resources/platform.upload.available.json delete mode 100644 upload/fichero.txt delete mode 100644 upload/testfilename.txt diff --git a/.travis.yml b/.travis.yml index f5c05b43..d9bd0c2a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,13 +8,40 @@ addons: organization: project-xavier token: secure: $SONAR_TOKEN + + +sudo: required + +services: + - docker + +# Fix for https://travis-ci.community/t/problematic-docker-compose-version-1-23-1/5362/3 +before_install: + - docker-compose --version + - docker info + - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" + - sudo apt-get update + - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce + - sudo rm /usr/local/bin/docker-compose + - curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-Linux-x86_64 > docker-compose + - chmod +x docker-compose + - sudo mv docker-compose /usr/local/bin + - docker-compose --version + - docker info + install: - cp ./configuration/settings.xml $HOME/.m2/settings.xml - mvn install -P !fuse-fabric8-docker -DskipTests=true -Dmaven.javadoc.skip=true -B -V jobs: include: - stage: Test + env: + - CAMEL_SPRINGBOOT_TRACING=false + - LOGGING_LEVEL_ROOT=warn script: - - mvn test -DtestLogRootLevel=warn -Pcoverage + - mvn test -Pcoverage - 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then sonar-scanner; fi' - bash <(curl -s https://codecov.io/bash) + + diff --git a/README.md b/README.md index 32314104..784af68a 100644 --- a/README.md +++ b/README.md @@ -107,5 +107,12 @@ Snippets of calls : * See status of encription on a bucket : `aws s3api get-bucket-encryption --bucket xavier-dev` * Enable encription on a bucket : `aws s3api put-bucket-encryption --bucket xavier-dev --server-side-encryption-configuration '{"Rules": [{"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "AES256"}}]}' ` + +# Testing +For the End2End test a docker container test framework is used : [Testcontainers](www.testcontainers.org). +If using the Fedora docker package it is needed to set the *ryuk.container.privileged=true* property in the local ~/.testcontainers.properties file in order to allow [Ryuk to be a privileged container](https://www.testcontainers.org/features/configuration/#customizing-ryuk-resource-reaper). + # References + + diff --git a/pom.xml b/pom.xml index 114f1fd2..377025e1 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,7 @@ info + 1.12.2 @@ -41,11 +42,6 @@ - org.springframework.boot spring-boot-starter @@ -198,13 +194,25 @@ 42.2.5 runtime + + org.hsqldb hsqldb - runtime + test + + + org.mockito + mockito-all + 1.10.19 + test + + + org.mock-server + mockserver-netty + 5.6.0 + test - - org.springframework.boot spring-boot-starter-test @@ -232,12 +240,48 @@ test + + org.testcontainers + testcontainers + ${testcontainers.version} + test + + + org.testcontainers + postgresql + ${testcontainers.version} + test + + + org.springframework.boot + spring-boot-starter-hateoas + test + 2.1.8.RELEASE + + + org.awaitility + awaitility + 3.0.0 + test + + + org.testcontainers + localstack + ${testcontainers.version} + test + com.h2database h2 test 1.4.194 + + org.testcontainers + kafka + ${testcontainers.version} + test + diff --git a/src/main/java/org/jboss/xavier/analytics/pojo/output/workload/summary/ScanRunModel.java b/src/main/java/org/jboss/xavier/analytics/pojo/output/workload/summary/ScanRunModel.java index c7123c10..3ab39a45 100644 --- a/src/main/java/org/jboss/xavier/analytics/pojo/output/workload/summary/ScanRunModel.java +++ b/src/main/java/org/jboss/xavier/analytics/pojo/output/workload/summary/ScanRunModel.java @@ -1,9 +1,7 @@ package org.jboss.xavier.analytics.pojo.output.workload.summary; -import java.sql.Timestamp; -import java.util.Date; - import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonProperty; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; @@ -17,6 +15,10 @@ import javax.persistence.ManyToOne; import javax.persistence.NamedNativeQuery; import javax.persistence.SqlResultSetMapping; +import java.sql.Timestamp; +import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; @SqlResultSetMapping( name = "mappingScanRunModels", @@ -58,6 +60,8 @@ public class ScanRunModel { private String target; private Date date; + + @JsonProperty("smartStateEnabled") private Boolean type; public ScanRunModel(){} @@ -100,12 +104,25 @@ public void setDate(Date date) { this.date = date; } - public String getType() { - String typeString = "Virt Platform"; - return typeString + (type?" + SmartState": ""); + public Boolean getType() { + return type; } public void setType(Boolean type) { this.type = type; } + + public void setType(String strType) { + if (isBoolean(strType)) { + setType(Boolean.parseBoolean(strType)); + } else { + setType(strType.toLowerCase().contains("smartstate")); + } + } + + private boolean isBoolean(String value) { + Pattern queryLangPattern = Pattern.compile("true|false", Pattern.CASE_INSENSITIVE); + Matcher matcher = queryLangPattern.matcher(value); + return matcher.matches(); + } } diff --git a/src/main/java/org/jboss/xavier/integrations/SpringConfiguration.java b/src/main/java/org/jboss/xavier/integrations/SpringConfiguration.java new file mode 100644 index 00000000..78b2f4b9 --- /dev/null +++ b/src/main/java/org/jboss/xavier/integrations/SpringConfiguration.java @@ -0,0 +1,31 @@ +package org.jboss.xavier.integrations; + +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration +@Profile("!test") +public class SpringConfiguration { + @Value("${S3_ACCESS_KEY_ID}") + String key; + + @Value("${S3_SECRET_ACCESS_KEY}") + String secret; + + @Value("${S3_REGION}") + String region; + + @Bean(name = "s3client") + public AmazonS3 getAmazonS3client() { + return AmazonS3ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(key,secret))) + .withRegion(region) + .build(); + } +} diff --git a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java index 0e6f1474..3b203288 100644 --- a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java +++ b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java @@ -121,7 +121,7 @@ public void configure() throws Exception { .throwException(org.apache.commons.httpclient.HttpException.class, "Unsuccessful response from Insights Upload Service") .end(); - from("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoOffsetReset=latest&autoCommitEnable=true") + from("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoOffsetReset=earliest&autoCommitEnable=true") .routeId("kafka-upload-message") .unmarshal().json(JsonLibrary.Jackson, FilePersistedNotification.class) .filter(simple("'{{insights.service}}' == ${body.getService}")) @@ -129,12 +129,12 @@ public void configure() throws Exception { from("direct:download-file") .routeId("download-file") - .setHeader("Exchange.HTTP_URI", simple("${body.url}")) + .setHeader("Exchange.HTTP_URI", simple("${body.url}")).id("setHttpUri") .convertBodyTo(FilePersistedNotification.class) .setHeader(MA_METADATA, method(MainRouteBuilder.class, "extractMAmetadataHeaderFromIdentity(${body})")) .setHeader(USERNAME, method(MainRouteBuilder.class, "getUserNameFromRHIdentity(${body.b64_identity})")) .setBody(constant("")) - .to("http4://oldhost") + .to("http4:oldhost").id("toOldHost") .choice() .when(isResponseSuccess()) .removeHeader("Exchange.HTTP_URI") @@ -153,7 +153,7 @@ public void configure() throws Exception { .setHeader(S3Constants.CONTENT_LENGTH, simple("${header.${type:org.apache.camel.Exchange.CONTENT_LENGTH}}")) .process(e-> e.getIn().setHeader(S3Constants.KEY, UUID.randomUUID().toString())).id("set-s3-key") .setHeader(S3Constants.CONTENT_DISPOSITION, simple("attachment;filename=\"${header.MA_metadata[filename]}\"")) - .to("aws-s3:{{S3_BUCKET}}?region={{S3_REGION}}&accessKey={{S3_ACCESS_KEY_ID}}&secretKey=RAW({{S3_SECRET_ACCESS_KEY}})&deleteAfterWrite=false").id("s3-call") + .to("aws-s3:{{S3_BUCKET}}?amazonS3Client=#s3client&deleteAfterWrite=false").id("s3-call") .process(exchange -> analysisService.updatePayloadStorageId(exchange.getIn().getHeader(S3Constants.KEY, String.class), Long.parseLong((String) exchange.getIn().getHeader(MA_METADATA, Map.class).get(ANALYSIS_ID)))); diff --git a/src/main/java/org/jboss/xavier/integrations/route/model/notification/FilePersistedNotification.java b/src/main/java/org/jboss/xavier/integrations/route/model/notification/FilePersistedNotification.java index 10fe75b9..d7292995 100644 --- a/src/main/java/org/jboss/xavier/integrations/route/model/notification/FilePersistedNotification.java +++ b/src/main/java/org/jboss/xavier/integrations/route/model/notification/FilePersistedNotification.java @@ -1,5 +1,6 @@ package org.jboss.xavier.integrations.route.model.notification; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -9,6 +10,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) public class FilePersistedNotification { String account; String rh_account; diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 0183c99f..b3d761a7 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -1,5 +1,6 @@ # Binding health checks to an internal port management.port=8081 +server.port=9080 # disable all management enpoints except health endpoints.enabled = false @@ -8,7 +9,6 @@ endpoints.health.enabled = true # Sample InputDataModel generator sig.autoStartup=true spring.datasource.continue-on-error=true -insights.properties=dummy spring.datasource.url = jdbc:h2:mem:test spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialect @@ -36,3 +36,13 @@ cloudforms.manifest.20.vmworkloadinventory.emsClusterIdPath =emsClusterIdPath_v2 rest.authorization.administration=admin1,admin2@redhat.com +S3_HOST=localhost +kieserver.username=kieserver +kieserver.password=kieserver1! + +logging.level.root=info +insights.properties=dummy +camel.springboot.tracing=false + +test.timetout.ics=20000 +test.timeout.performance=80000 diff --git a/src/main/resources/okd/analytics_template.json b/src/main/resources/okd/analytics_template.json index 813bc93c..db042a84 100644 --- a/src/main/resources/okd/analytics_template.json +++ b/src/main/resources/okd/analytics_template.json @@ -1189,7 +1189,7 @@ }, { "name": "KIESERVER_CONTAINER", - "value": "sample-analytics_1.0.0-SNAPSHOT" + "value": "xavier-analytics_0.0.1-SNAPSHOT" }, { "name": "POSTGRESQL_USER", diff --git a/src/main/resources/spring/camel-context.xml b/src/main/resources/spring/camel-context.xml index 9da2a8ac..eca9820b 100644 --- a/src/main/resources/spring/camel-context.xml +++ b/src/main/resources/spring/camel-context.xml @@ -263,7 +263,7 @@ ${body} != null && ${body.payloadStorageId} != null - aws-s3:xavier-dev?region={{S3_REGION}}&accessKey={{S3_ACCESS_KEY_ID}}&secretKey=RAW({{S3_SECRET_ACCESS_KEY}})&deleteAfterRead=false&fileName=${body.payloadStorageId} + aws-s3:xavier-dev?amazonS3Client=#s3client&deleteAfterRead=false&fileName=${body.payloadStorageId} ${header.CamelAwsS3ContentDisposition} diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java new file mode 100644 index 00000000..8514c787 --- /dev/null +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -0,0 +1,523 @@ +package org.jboss.xavier.integrations; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.AmazonS3Exception; +import com.amazonaws.services.s3.model.S3Object; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.builder.AdviceWithRouteBuilder; +import org.apache.camel.component.aws.s3.S3Constants; +import org.apache.camel.test.spring.CamelSpringBootRunner; +import org.apache.camel.test.spring.UseAdviceWith; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.assertj.core.api.SoftAssertions; +import org.awaitility.Duration; +import org.jboss.xavier.Application; +import org.jboss.xavier.analytics.pojo.output.InitialSavingsEstimationReportModel; +import org.jboss.xavier.analytics.pojo.output.workload.inventory.WorkloadInventoryReportModel; +import org.jboss.xavier.analytics.pojo.output.workload.summary.ScanRunModel; +import org.jboss.xavier.analytics.pojo.output.workload.summary.WorkloadSummaryReportModel; +import org.jboss.xavier.analytics.pojo.output.workload.summary.WorkloadsDetectedOSTypeModel; +import org.jboss.xavier.integrations.jpa.repository.AnalysisRepository; +import org.jboss.xavier.integrations.jpa.repository.InitialSavingsEstimationReportRepository; +import org.jboss.xavier.integrations.jpa.service.InitialSavingsEstimationReportService; +import org.jboss.xavier.integrations.route.model.notification.FilePersistedNotification; +import org.jboss.xavier.integrations.route.model.user.User; +import org.jetbrains.annotations.NotNull; +import org.junit.After; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.util.EnvironmentTestUtils; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Import; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.hateoas.PagedResources; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.KafkaContainer; +import org.testcontainers.containers.Network; +import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.containers.localstack.LocalStackContainer; +import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.images.builder.ImageFromDockerfile; +import org.testcontainers.utility.MountableFile; + +import javax.inject.Inject; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Paths; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; +import java.util.concurrent.TimeUnit; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.awaitility.Awaitility.await; +import static org.testcontainers.containers.localstack.LocalStackContainer.Service.S3; + +@RunWith(CamelSpringBootRunner.class) +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +@UseAdviceWith // Disables automatic start of Camel context +@SpringBootTest(classes = {Application.class}, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) +@ContextConfiguration(initializers = EndToEndTest.Initializer.class) +@Import(TestConfigurationS3.class) +@ActiveProfiles("test") +public class EndToEndTest { + private static Logger logger = LoggerFactory.getLogger(EndToEndTest.class); + + + @ClassRule + public static GenericContainer activemq = new GenericContainer<>("vromero/activemq-artemis") + .withExposedPorts(61616, 8161) + .withLogConsumer(new Slf4jLogConsumer(logger).withPrefix("AMQ-LOG")) + .withEnv("DISABLE_SECURITY", "true") + .withEnv("BROKER_CONFIG_GLOBAL_MAX_SIZE", "50000") + .withEnv("BROKER_CONFIG_MAX_SIZE_BYTES", "50000") + .withEnv("BROKER_CONFIG_MAX_DISK_USAGE", "100"); + + @ClassRule + public static GenericContainer kie_server = new GenericContainer<>("jboss/kie-server-showcase:7.18.0.Final") + .withNetworkAliases("kie-server") + .withExposedPorts(8080) + .withLogConsumer(new Slf4jLogConsumer(logger).withPrefix("KIE-LOG")) + .withEnv("KIE_SERVER_ID", "analytics-kieserver") + .withEnv("KIE_ADMIN_USER", "kieserver") + .withEnv("KIE_ADMIN_PWD", "kieserver1!") + .withEnv("KIE_SERVER_MODE", "DEVELOPMENT") + .withEnv("KIE_MAVEN_REPO", "https://oss.sonatype.org/content/repositories/snapshots") + .withEnv("KIE_REPOSITORY","https://repository.jboss.org/nexus/content/groups/public-jboss") + .withEnv("KIE_SERVER_CONTROLLER_PWD","admin") + .withEnv("KIE_SERVER_CONTROLLER_USER","admin") + .withEnv("KIE_SERVER_LOCATION","http://kie-server:8080/kie-server/services/rest/server") + .withEnv("KIE_SERVER_PWD","kieserver1!") + .withEnv("KIE_SERVER_USER","kieserver"); + + @ClassRule + public static PostgreSQLContainer postgreSQL = new PostgreSQLContainer() + .withDatabaseName("sampledb") + .withUsername("admin") + .withPassword("redhat"); + + @ClassRule + public static LocalStackContainer localstack = new LocalStackContainer() + .withLogConsumer(new Slf4jLogConsumer(logger).withPrefix("AWS-LOG")) + .withServices(S3); + + private static String ingressCommitHash = "3ea33a8d793c2154f7cfa12057ca005c5f6031fa"; // 2019-11-11 + + @Inject + private InitialSavingsEstimationReportService initialSavingsEstimationReportService; + + @Autowired + private InitialSavingsEstimationReportRepository initialSavingsEstimationReportRepository; + + @Inject + private AnalysisRepository analysisRepository; + + @Value("${S3_BUCKET}") + private String bucket; + + @Value("${server.port:8080}") + private String serverPort; + + @Value("${test.timeout.performance:60000}") // 1 minute + private int timeoutMilliseconds_PerformaceTest; + + @Value("${test.timetout.ics:10000}") // 10 seconds + private int timeoutMilliseconds_InitialCostSavingsReport; + + @Value("${minio.host}") // Set in the Initializer + private String minio_host; + + public static class Initializer implements ApplicationContextInitializer { + + @Override + public void initialize(ConfigurableApplicationContext configurableApplicationContext) { + try { + cloneIngressRepoAndUnzip(); + + Network network = Network.newNetwork(); + + GenericContainer minio = new GenericContainer<>("minio/minio") + .withCommand("server /data") + .withExposedPorts(9000) + .withNetworkAliases("minio") + .withNetwork(network) + .withLogConsumer(new Slf4jLogConsumer(logger).withPrefix("MINIO-LOG")) + .withEnv("MINIO_ACCESS_KEY", "BQA2GEXO711FVBVXDWKM") + .withEnv("MINIO_SECRET_KEY", "uvgz3LCwWM3e400cDkQIH/y1Y4xgU4iV91CwFSPC"); + minio.start(); + + Thread.sleep(5000); + GenericContainer createbuckets = new GenericContainer<>("minio/mc") + .dependsOn(minio) + .withNetwork(network) + .withLogConsumer(new Slf4jLogConsumer(logger).withPrefix("MINIO-MC-LOG")) + .withCopyFileToContainer(MountableFile.forClasspathResource("minio-bucket-creation-commands.sh"), "/") + .withCreateContainerCmdModifier(createContainerCmd -> createContainerCmd.withEntrypoint("sh", "/minio-bucket-creation-commands.sh", "minio:9000")); + createbuckets.start(); + + KafkaContainer kafka = new KafkaContainer() + .withLogConsumer(new Slf4jLogConsumer(logger).withPrefix("KAFKA-LOG")) + .withNetworkAliases("kafka") + .withNetwork(network); + kafka.start(); + + GenericContainer ingress = new GenericContainer(new ImageFromDockerfile() + .withDockerfile(Paths.get("src/test/resources/insights-ingress-go/Dockerfile"))) + .withExposedPorts(3000) + .withNetwork(network) + .withLogConsumer(new Slf4jLogConsumer(logger).withPrefix("INGRESS-LOG")) + .withEnv("AWS_ACCESS_KEY_ID","BQA2GEXO711FVBVXDWKM") + .withEnv("AWS_SECRET_ACCESS_KEY","uvgz3LCwWM3e400cDkQIH/y1Y4xgU4iV91CwFSPC") + .withEnv("AWS_REGION","us-east-1") + .withEnv("INGRESS_STAGEBUCKET","insights-upload-perma") + .withEnv("INGRESS_REJECTBUCKET","insights-upload-rejected") + .withEnv("INGRESS_INVENTORYURL","http://inventory:8080/api/inventory/v1/hosts") + .withEnv("INGRESS_VALIDTOPICS","xavier,testareno,advisortestareno,advisor") + .withEnv("OPENSHIFT_BUILD_COMMIT","woopwoop") + .withEnv("INGRESS_MINIODEV","true") + .withEnv("INGRESS_MINIOACCESSKEY","BQA2GEXO711FVBVXDWKM") + .withEnv("INGRESS_MINIOSECRETKEY","uvgz3LCwWM3e400cDkQIH/y1Y4xgU4iV91CwFSPC") + .withEnv("INGRESS_MINIOENDPOINT", "minio:9000") + .withEnv("INGRESS_KAFKABROKERS", "kafka:9092"); + ingress.start(); + + importProjectIntoKIE(); + + EnvironmentTestUtils.addEnvironment("environment", configurableApplicationContext.getEnvironment(), + "amq.server=" + activemq.getContainerIpAddress(), + "amq.port=" + activemq.getMappedPort(61616), + "minio.host=" + getContainerHost(minio, 9000), + "insights.upload.host=" + getContainerHost(ingress), + "insights.properties=yearOverYearGrowthRatePercentage,percentageOfHypervisorsMigratedOnYear1,percentageOfHypervisorsMigratedOnYear2,percentageOfHypervisorsMigratedOnYear3,reportName,reportDescription", + "camel.component.servlet.mapping.context-path=/api/xavier/*", + "insights.kafka.host=" + kafka.getBootstrapServers(), + "postgresql.service.name=" + postgreSQL.getContainerIpAddress(), + "postgresql.service.port=" + postgreSQL.getFirstMappedPort(), + "spring.datasource.username=" + postgreSQL.getUsername(), + "spring.datasource.password=" + postgreSQL.getPassword(), + "S3_HOST=" + localstack.getEndpointConfiguration(S3).getServiceEndpoint(), + "S3_REGION="+ localstack.getEndpointConfiguration(S3).getSigningRegion(), + "kieserver.devel-service=" + getHostForKie() + "/kie-server", + "spring.datasource.url = jdbc:postgresql://" + getContainerHost(postgreSQL) + "/sampledb" , + "spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @NotNull + private String getContainerHost(GenericContainer container, Integer port) { + return container.getContainerIpAddress() + ":" + container.getMappedPort(port); + } + + @NotNull + private static String getContainerHost(GenericContainer container) { + return container.getContainerIpAddress() + ":" + container.getFirstMappedPort(); + } + } + + @Inject + CamelContext camelContext; + + @Inject + AmazonS3 amazonS3; + + private static void cloneIngressRepoAndUnzip() throws IOException { + // downloading, unzipping, renaming + String ingressRepoZipURL = "https://github.com/RedHatInsights/insights-ingress-go/archive/" + ingressCommitHash + ".zip"; + File compressedFile = new File("src/test/resources/ingressRepo.zip"); + FileUtils.copyURLToFile(new URL(ingressRepoZipURL), compressedFile, 1000, 10000); + unzipFile(compressedFile, "src/test/resources"); + + // we rename the directory because we had issues with Docker and the long folder + FileUtils.moveDirectory(new File("src/test/resources/insights-ingress-go-" + ingressCommitHash), new File("src/test/resources/insights-ingress-go")); + } + + private static void unzipFile(File file, String outputDir) throws IOException { + java.util.zip.ZipFile zipFile = new ZipFile(file); + try { + Enumeration entries = zipFile.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + File entryDestination = new File(outputDir, entry.getName()); + if (entry.isDirectory()) { + entryDestination.mkdirs(); + } else { + entryDestination.getParentFile().mkdirs(); + InputStream in = zipFile.getInputStream(entry); + OutputStream out = new FileOutputStream(entryDestination); + IOUtils.copy(in, out); + in.close(); + out.close(); + } + } + } finally { + zipFile.close(); + } + } + + private static String getHostForKie() { + return kie_server.getContainerIpAddress() + ":" + kie_server.getFirstMappedPort(); + } + + private static void importProjectIntoKIE() throws InterruptedException, IOException { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setCacheControl("no-cache"); + headers.set("Authorization", "Basic YWRtaW46YWRtaW4="); // admin:admin + + String kieRestURL = "http://" + getHostForKie() + "/kie-server/services/rest/"; + + // KIE Container Creation + HttpHeaders kieheaders = new HttpHeaders(); + kieheaders.setContentType(MediaType.APPLICATION_JSON); + kieheaders.set("Authorization", "Basic a2llc2VydmVyOmtpZXNlcnZlcjEh"); + kieheaders.setCacheControl("no-cache"); + String kieContainerBody = "{\"container-id\" : \"xavier-analytics_0.0.1-SNAPSHOT\",\"release-id\" : {\"group-id\" : \"org.jboss.xavier\",\"artifact-id\" : \"xavier-analytics\",\"version\" : \"0.0.1-SNAPSHOT\" } }"; + try { + new RestTemplate().exchange(kieRestURL + "server/containers/xavier-analytics_0.0.1-SNAPSHOT", HttpMethod.PUT, new HttpEntity<>(kieContainerBody, kieheaders), String.class); + } catch (RestClientException e) { + e.printStackTrace(); + } + } + + @After + public void cleanUp() throws IOException { + // cleaning downloadable files/directories + FileUtils.deleteDirectory(new File("src/test/resources/insights-ingress-go")); + FileUtils.deleteQuietly(new File("src/test/resources/ingressRepo.zip")); + } + + @Test + public void end2endTest() throws Exception { + Thread.sleep(2000); + + // given + camelContext.getGlobalOptions().put(Exchange.LOG_DEBUG_BODY_MAX_CHARS, "5000"); + camelContext.start(); + + camelContext.getRouteDefinition("store-in-s3").adviceWith(camelContext, new AdviceWithRouteBuilder() { + @Override + public void configure() { + weaveById("set-s3-key") + .replace().process(e -> e.getIn().setHeader(S3Constants.KEY, "S3KEY123")); + } + }); + + camelContext.getRouteDefinition("download-file").adviceWith(camelContext, new AdviceWithRouteBuilder() { + @Override + public void configure() { + weaveById("setHttpUri") + .replace() + .process(e -> { + String url = e.getIn().getBody(FilePersistedNotification.class).getUrl(); + url = url.replace("minio:9000", minio_host); + e.getIn().setHeader("httpUriReplaced", url); + }) + .setHeader("Exchange.HTTP_URI", header("httpUriReplaced")) + .setHeader("Host", constant("minio:9000")); + + weaveById("toOldHost") + .replace() + .to("http4:oldhost?preserveHostHeader=true"); + } + }); + + // 1. Check user has firstTime + ResponseEntity userEntity = new RestTemplate().exchange("http://localhost:" + serverPort + "/api/xavier/user", HttpMethod.GET, getRequestEntity(), new ParameterizedTypeReference() {}); + assertThat(userEntity.getBody().isFirstTimeCreatingReports()).isTrue(); + + // Start the camel route as if the UI was sending the file to the Camel Rest Upload route + new RestTemplate().postForEntity("http://localhost:" + serverPort + "/api/xavier/upload", getRequestEntityForUploadRESTCall("cfme_inventory-20190912-demolab_withSSA.tar.gz"), String.class); + + // then + await() + .atMost(timeoutMilliseconds_InitialCostSavingsReport, TimeUnit.MILLISECONDS) + .with().pollInterval(Duration.ONE_HUNDRED_MILLISECONDS) + .until( () -> { + // Check database for the ICSR to be created + List all = initialSavingsEstimationReportRepository.findAll(); + return all != null && !all.isEmpty(); + }); + + // Check S3 + S3Object s3object = amazonS3.getObject(bucket, "S3KEY123"); + assertThat(s3object.getObjectContent()).isNotNull(); + assertThatExceptionOfType(AmazonS3Exception.class).isThrownBy(() -> amazonS3.getObject(bucket, "NONEXISTINGFILE")); + + // Check DB for initialCostSavingsReport with concrete values + InitialSavingsEstimationReportModel initialCostSavingsReportDB = initialSavingsEstimationReportService.findByAnalysisOwnerAndAnalysisId("dummy@redhat.com", 1L); + assertThat(initialCostSavingsReportDB.getEnvironmentModel().getHypervisors() == 2); + assertThat(initialCostSavingsReportDB.getSourceCostsModel().getYear1Server() == 42); + + // Call initialCostSavingsReport + ResponseEntity initialCostSavingsReport = new RestTemplate().exchange("http://localhost:" + serverPort + "/api/xavier/report/1/initial-saving-estimation", HttpMethod.GET, getRequestEntity(), new ParameterizedTypeReference() {}); + + // Call workloadInventoryReport + ResponseEntity> workloadInventoryReport = new RestTemplate().exchange("http://localhost:" + serverPort + "/api/xavier/report/1/workload-inventory?size=100", HttpMethod.GET, getRequestEntity(), new ParameterizedTypeReference>() {}); + + // Call workloadSummaryReport + ResponseEntity workloadSummaryReport = new RestTemplate().exchange("http://localhost:" + serverPort + "/api/xavier/report/1/workload-summary", HttpMethod.GET, getRequestEntity(), new ParameterizedTypeReference() {}); + + // Checks on Initial Savings Report + InitialSavingsEstimationReportModel initialSavingsEstimationReport_Expected = new ObjectMapper().readValue(IOUtils.resourceToString("cfme_inventory-20190912-demolab-withssa-initial-cost-savings-report.json", StandardCharsets.UTF_8, EndToEndTest.class.getClassLoader()), InitialSavingsEstimationReportModel.class); + SoftAssertions.assertSoftly(softly -> softly.assertThat(initialSavingsEstimationReport_Expected) + .usingRecursiveComparison() + .ignoringFieldsMatchingRegexes(".*id.*", ".*creationDate.*", ".*report.*") + .isEqualTo(initialCostSavingsReport.getBody())); + + // Checks on Workload Inventory Report + SoftAssertions.assertSoftly(softly -> { + softly.assertThat(workloadInventoryReport.getBody().getContent().size()).isEqualTo(14); + softly.assertThat(workloadInventoryReport.getBody().getContent().stream().flatMap(e -> e.getWorkloads().stream()).distinct().count()).isEqualTo(7); + softly.assertThat(workloadInventoryReport.getBody().getContent().stream().filter(e -> e.getWorkloads().contains("Red Hat JBoss EAP")).count()).isEqualTo(2); + softly.assertThat(workloadInventoryReport.getBody().getContent().stream().map(WorkloadInventoryReportModel::getOsName).distinct().count()).isEqualTo(4); + softly.assertThat(workloadInventoryReport.getBody().getContent().stream().filter(e -> e.getOsName().contains("CentOS 7 (64-bit)")).count()).isEqualTo(2); + softly.assertThat(workloadInventoryReport.getBody().getContent().stream().map(WorkloadInventoryReportModel::getComplexity).distinct().count()).isEqualTo(3); + softly.assertThat(workloadInventoryReport.getBody().getContent().stream().filter(e -> e.getComplexity().contains("Unknown")).count()).isEqualTo(1); + softly.assertThat(workloadInventoryReport.getBody().getContent().stream().flatMap(e -> e.getRecommendedTargetsIMS().stream()).distinct().count()).isEqualTo(3); + softly.assertThat(workloadInventoryReport.getBody().getContent().stream().filter(e -> e.getRecommendedTargetsIMS().contains("OSP")).count()).isEqualTo(11); + softly.assertThat(workloadInventoryReport.getBody().getContent().stream().flatMap(e -> e.getFlagsIMS().stream()).distinct().count()).isEqualTo(2); + softly.assertThat(workloadInventoryReport.getBody().getContent().stream().filter(e -> e.getFlagsIMS().contains("Shared Disk")).count()).isEqualTo(2); + softly.assertThat(workloadInventoryReport.getBody().getContent().stream().filter(e -> e.getOsName().contains("ServerNT") && e.getWorkloads().contains("Microsoft SQL Server")).count()).isEqualTo(1); + }); + + // Checks on Workload Summary Report + WorkloadSummaryReportModel workloadSummaryReport_Expected = new ObjectMapper().readValue(IOUtils.resourceToString("cfme_inventory-20190912-demolab-withssa-workload-summary-report.json", StandardCharsets.UTF_8, EndToEndTest.class.getClassLoader()), WorkloadSummaryReportModel.class); + + assertThat(workloadSummaryReport_Expected) + .usingRecursiveComparison() + .ignoringFieldsMatchingRegexes(".*id.*", ".*creationDate.*", ".*report.*", ".*workloadsDetectedOSTypeModels.*", ".*scanRunModels.*") + .isEqualTo(workloadSummaryReport.getBody()); + + // WLSR.ScanRunModels + TreeSet wks_scanrunmodel_expected = getWks_scanrunmodel(workloadSummaryReport_Expected.getScanRunModels()); + TreeSet wks_scanrunmodel_actual = getWks_scanrunmodel(workloadSummaryReport.getBody().getScanRunModels()); + + // WLSR.WorkloadsDetectedOSTypeModel + TreeSet wks_ostypemodel_expected = getWks_ostypemodel(workloadSummaryReport_Expected.getWorkloadsDetectedOSTypeModels()); + TreeSet wks_ostypemodel_actual = getWks_ostypemodel(workloadSummaryReport.getBody().getWorkloadsDetectedOSTypeModels()); + + SoftAssertions.assertSoftly(softly -> { + softly.assertThat(wks_scanrunmodel_expected).isEqualTo(wks_scanrunmodel_actual); + softly.assertThat(wks_ostypemodel_expected).isEqualTo(wks_ostypemodel_actual); + }); + + // Performance test + new RestTemplate().postForEntity("http://localhost:" + serverPort + "/api/xavier/upload", getRequestEntityForUploadRESTCall("cfme_inventory-20190829-16128-uq17dx.tar.gz"), String.class); + await() + .atMost(timeoutMilliseconds_PerformaceTest, TimeUnit.MILLISECONDS) + .with().pollInterval(Duration.FIVE_HUNDRED_MILLISECONDS) + .until(() -> { + ResponseEntity workloadSummaryReport_PerformanceTest = new RestTemplate().exchange("http://localhost:" + serverPort + "/api/xavier/report/2/workload-summary", HttpMethod.GET, getRequestEntity(), new ParameterizedTypeReference() {}); + return (workloadSummaryReport_PerformanceTest != null && + workloadSummaryReport_PerformanceTest.getStatusCodeValue() == 200 && + workloadSummaryReport_PerformanceTest.getBody() != null && + workloadSummaryReport_PerformanceTest.getBody().getSummaryModels() != null); + }); + + camelContext.stop(); + } + + @NotNull + private TreeSet getWks_ostypemodel(Set elements) { + TreeSet treeset = new TreeSet<>(new WorkloadsDetectedOSTypeModelComparator()); + treeset.addAll(elements); + return treeset; + } + + @NotNull + private TreeSet getWks_scanrunmodel(Set elements) { + TreeSet treeset = new TreeSet<>(new ScanRunModelComparator()); + treeset.addAll(elements); + return treeset; + } + + private HttpEntity getRequestEntity() { + return new HttpEntity(getHttpHeaders()); + } + + @NotNull + private HttpEntity> getRequestEntityForUploadRESTCall(String filename) throws IOException { + // Headers + HttpHeaders headers = getHttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + + // Body + MultiValueMap body = new LinkedMultiValueMap<>(); + + // File Body part + LinkedMultiValueMap fileMap = new LinkedMultiValueMap<>(); + fileMap.add(HttpHeaders.CONTENT_DISPOSITION, "form-data; name=filex; filename=" + filename); + fileMap.add("Content-type", "application/zip"); + body.add("file", new HttpEntity<>(IOUtils.resourceToByteArray(filename, EndToEndTest.class.getClassLoader()), fileMap)); + + // params Body parts + body.add("percentageOfHypervisorsMigratedOnYear1", "50"); + body.add("percentageOfHypervisorsMigratedOnYear2", "25"); + body.add("percentageOfHypervisorsMigratedOnYear3", "25"); + body.add("yearOverYearGrowthRatePercentage", "5"); + body.add("sourceproductindicator", "2"); + body.add("reportName", "report name test"); + body.add("reportDescription", "report desc test"); + body.add("payloadName", "payloadname"); + + return new HttpEntity<>(body, headers); + } + + @NotNull + private HttpHeaders getHttpHeaders() { + // Headers + HttpHeaders headers = new HttpHeaders(); + headers.set("x-rh-insights-request-id", "2544925e825b4f3f9418c88556541776"); + headers.set("x-rh-identity", "eyJlbnRpdGxlbWVudHMiOnsiaW5zaWdodHMiOnsiaXNfZW50aXRsZWQiOnRydWV9LCJvcGVuc2hpZnQiOnsiaXNfZW50aXRsZWQiOnRydWV9LCJzbWFydF9tYW5hZ2VtZW50Ijp7ImlzX2VudGl0bGVkIjpmYWxzZX0sImh5YnJpZF9jbG91ZCI6eyJpc19lbnRpdGxlZCI6dHJ1ZX19LCJpZGVudGl0eSI6eyJpbnRlcm5hbCI6eyJhdXRoX3RpbWUiOjAsImF1dGhfdHlwZSI6Imp3dC1hdXRoIiwib3JnX2lkIjoiNjM0MDA1NiIsICJmaWxlbmFtZSI6ImNsb3VkZm9ybXMtZXhwb3J0LXYxXzBfMC1tdWx0aXBsZS1maWxlcy50YXIuZ3oiLCJvcmlnaW4iOiJ4YXZpZXIiLCJjdXN0b21lcmlkIjoiQ0lEODg4IiwgImFuYWx5c2lzSWQiOiIxIn0sImFjY291bnRfbnVtYmVyIjoiMTQ2MDI5MCIsICJ1c2VyIjp7ImZpcnN0X25hbWUiOiJVc2VyIiwiaXNfYWN0aXZlIjp0cnVlLCJpc19pbnRlcm5hbCI6dHJ1ZSwibGFzdF9uYW1lIjoiRHVteSIsImxvY2FsZSI6ImVuX1VTIiwiaXNfb3JnX2FkbWluIjpmYWxzZSwidXNlcm5hbWUiOiJkdW1teUByZWRoYXQuY29tIiwiZW1haWwiOiJkdW1teStxYUByZWRoYXQuY29tIn0sInR5cGUiOiJVc2VyIn19"); + headers.set("username", "dummy@redhat.com"); + return headers; + } + + private static class ScanRunModelComparator implements Comparator { + @Override + public int compare(ScanRunModel o1, ScanRunModel o2) { + return o1.getTarget().equals(o2.getTarget()) && o1.getType().equals(o2.getType()) ? 0 : 1; + } + } + + private static class WorkloadsDetectedOSTypeModelComparator implements Comparator { + @Override + public int compare(WorkloadsDetectedOSTypeModel o1, WorkloadsDetectedOSTypeModel o2) { + return o1.getOsName().equals(o2.getOsName()) && o1.getTotal().equals(o2.getTotal()) ? 0 : 1; + } + } +} diff --git a/src/test/java/org/jboss/xavier/integrations/TestConfigurationS3.java b/src/test/java/org/jboss/xavier/integrations/TestConfigurationS3.java new file mode 100644 index 00000000..875db1a3 --- /dev/null +++ b/src/test/java/org/jboss/xavier/integrations/TestConfigurationS3.java @@ -0,0 +1,24 @@ +package org.jboss.xavier.integrations; + +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.client.builder.AwsClientBuilder; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; + +@TestConfiguration +public class TestConfigurationS3 { + @Value("${S3_HOST}") + private String s3_host; + + @Bean(name = "s3client") + public AmazonS3 getAmazonS3client() { + return AmazonS3ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("dummyKey", "dummySecret"))) + .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(s3_host, "us-east-1")) + .build(); + } +} diff --git a/src/test/java/org/jboss/xavier/integrations/route/MainRouteBuilder_DirectDownloadTest.java b/src/test/java/org/jboss/xavier/integrations/route/MainRouteBuilder_DirectDownloadTest.java index 7be26b92..f535e092 100644 --- a/src/test/java/org/jboss/xavier/integrations/route/MainRouteBuilder_DirectDownloadTest.java +++ b/src/test/java/org/jboss/xavier/integrations/route/MainRouteBuilder_DirectDownloadTest.java @@ -21,7 +21,7 @@ import static org.assertj.core.api.Assertions.assertThat; -@MockEndpointsAndSkip("http4:oldhost|direct:unzip-file") +@MockEndpointsAndSkip("http.*|direct:unzip-file") public class MainRouteBuilder_DirectDownloadTest extends XavierCamelTest { @Autowired MainRouteBuilder mainRouteBuilder; @@ -47,7 +47,7 @@ public void mainRouteBuilder_DirectDownloadFile_PersistedNotificationGiven_Shoul camelContext.getRouteDefinition("download-file").adviceWith(camelContext, new AdviceWithRouteBuilder() { @Override public void configure() { - weaveByToUri("http4:.*").after() + weaveByToUri("http.*").after() .setHeader(Exchange.HTTP_RESPONSE_CODE, simple("200")) .setBody(exchange -> this.getClass().getClassLoader().getResourceAsStream("cloudforms-export-v1_0_0.json")); } @@ -82,6 +82,7 @@ public void configure() { //Then mockOldHost.assertIsSatisfied(); assertThat(mockOldHost.getExchanges().get(0).getIn().getHeader(RouteBuilderExceptionHandler.MA_METADATA, Map.class).get("dummy")).isEqualTo("CID1234"); + assertThat(mockOldHost.getExchanges().get(0).getIn().getHeader(RouteBuilderExceptionHandler.MA_METADATA, Map.class).get("org_id")).isEqualTo("6340056"); assertThat(mockOldHost.getExchanges().get(0).getIn().getHeader(RouteBuilderExceptionHandler.MA_METADATA, Map.class).get("auth_time")).isEqualTo("0"); mockUnzipFile.assertIsSatisfied(); assertThat(analysisService.findByOwnerAndId(analysisModel.getOwner(), analysisModel.getId()).getPayloadStorageId()).isEqualToIgnoringCase("S3KEY123"); diff --git a/src/test/java/org/jboss/xavier/integrations/route/MainRouteBuilder_RestUploadTest.java b/src/test/java/org/jboss/xavier/integrations/route/MainRouteBuilder_RestUploadTest.java index aa2f48d9..bdb7df4c 100644 --- a/src/test/java/org/jboss/xavier/integrations/route/MainRouteBuilder_RestUploadTest.java +++ b/src/test/java/org/jboss/xavier/integrations/route/MainRouteBuilder_RestUploadTest.java @@ -38,7 +38,7 @@ public class MainRouteBuilder_RestUploadTest extends XavierCamelTest { public void setup() { camel_context = camel_context.substring(0, camel_context.indexOf("*")); } - + @Test public void mainRouteBuilder_routeRestUpload_ContentGiven_ShouldUpload() throws Exception { //Given diff --git a/src/test/java/org/jboss/xavier/integrations/route/MainRouteBuilder_S3Test.java b/src/test/java/org/jboss/xavier/integrations/route/MainRouteBuilder_S3Test.java index 4e31edbd..3c722c46 100644 --- a/src/test/java/org/jboss/xavier/integrations/route/MainRouteBuilder_S3Test.java +++ b/src/test/java/org/jboss/xavier/integrations/route/MainRouteBuilder_S3Test.java @@ -28,14 +28,14 @@ public class MainRouteBuilder_S3Test { @Test @Ignore public void s3Test() throws Exception { - camelContext.setTracing(true); camelContext.setAutoStartup(false); camelContext.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { String keyValue = UUID.randomUUID().toString(); System.out.println(String.format("UUID [%s]", keyValue)); - from("file:///home/jonathan/Downloads?fileName=cfme_inventory_0.json&noop=true").routeId("s3route") + // You need to change here the "myfolder" part + from("file:///myfolder?fileName=cfme_inventory_0.json&noop=true").routeId("s3route") .convertBodyTo(byte[].class) .setHeader(S3Constants.CONTENT_LENGTH, simple("${in.header.CamelFileLength}")) .setHeader(S3Constants.KEY, simple(keyValue)) diff --git a/src/test/java/org/jboss/xavier/integrations/route/WorkloadSummaryReportRoutes_DirectCalculateVMWorkloadInventoryModelTest.java b/src/test/java/org/jboss/xavier/integrations/route/WorkloadSummaryReportRoutes_DirectCalculateVMWorkloadInventoryModelTest.java index 5f068369..b537bcfa 100644 --- a/src/test/java/org/jboss/xavier/integrations/route/WorkloadSummaryReportRoutes_DirectCalculateVMWorkloadInventoryModelTest.java +++ b/src/test/java/org/jboss/xavier/integrations/route/WorkloadSummaryReportRoutes_DirectCalculateVMWorkloadInventoryModelTest.java @@ -372,11 +372,9 @@ public void DirectCalculateVMWorkloadInventoryModel_ShouldPersistScanRunModel() Assert.assertNotNull(scanRunModels); Assert.assertEquals(2, scanRunModels.size()); - scanRunModels.stream().filter(model -> model.getId() % 2 == 0).forEach(srm -> - Assert.assertEquals("Virt Platform", srm.getType())); + Assert.assertTrue(scanRunModels.stream().filter(model -> model.getId() % 2 == 0).allMatch(srm -> !srm.getType())); - scanRunModels.stream().filter(model -> model.getId() % 2 != 0).forEach(srm -> - Assert.assertEquals("Virt Platform + SmartState", srm.getType())); + Assert.assertTrue(scanRunModels.stream().filter(model -> model.getId() % 2 != 0).allMatch(srm -> srm.getType())); camelContext.stop(); } diff --git a/src/test/java/org/jboss/xavier/integrations/route/XavierCamelTest.java b/src/test/java/org/jboss/xavier/integrations/route/XavierCamelTest.java index 3af61cb7..67aa5b8c 100644 --- a/src/test/java/org/jboss/xavier/integrations/route/XavierCamelTest.java +++ b/src/test/java/org/jboss/xavier/integrations/route/XavierCamelTest.java @@ -23,7 +23,6 @@ public abstract class XavierCamelTest { @Before public void beforeTest() { //Given - camelContext.setTracing(true); camelContext.setAutoStartup(false); camelContext.addComponent("aws-s3", camelContext.getComponent("stub")); } diff --git a/src/test/resources/cfme_inventory-20190912-demolab-withssa-initial-cost-savings-report.json b/src/test/resources/cfme_inventory-20190912-demolab-withssa-initial-cost-savings-report.json new file mode 100644 index 00000000..3d876899 --- /dev/null +++ b/src/test/resources/cfme_inventory-20190912-demolab-withssa-initial-cost-savings-report.json @@ -0,0 +1,123 @@ + { + "id": 806, + "customerId": "6340056", + "fileName": "cfme_inventory-20190912-demolab_withSSA.tar.gz", + "creationDate": 1571304735301, + "environmentModel": { + "sourceProductIndicator": 1, + "hypervisors": 8, + "year1Hypervisor": 4, + "year2Hypervisor": 2, + "year3Hypervisor": 2, + "growthRatePercentage": 0.05, + "dealIndicator": 1, + "openStackIndicator": true + }, + "sourceCostsModel": { + "sourceLicenseValue": 9000, + "sourceMaintenanceValue": 6750, + "year1Server": 8, + "year1SourceValue": 0, + "year1SourceMaintenanceValue": 60000, + "year2Server": 8, + "year2SourceValue": 0, + "year2SourceMaintenanceValue": 60000, + "year3Server": 8, + "year3SourceValue": 0, + "year3SourceMaintenanceValue": 60000, + "totSourceValue": 0, + "totSourceMaintenanceValue": 180000, + "totalSourceValue": 180000, + "sourceNewELAIndicator": 0, + "sourceNewHighValue": 1458000, + "sourceNewLikelyValue": 1215000, + "sourceNewLowValue": 972000, + "sourceRenewHighValue": 1458000, + "sourceRenewLikelyValue": 1215000, + "sourceRenewLowValue": 972000 + }, + "sourceRampDownCostsModel": { + "year1ServersOffSource": 4, + "year1SourceActiveLicense": 4, + "year1SourcePaidMaintenance": 8, + "year1SourceMaintenancePerServerValue": 13500, + "year1SourceMaintenanceTotalValue": 108000, + "year2ServersOffSource": 6, + "year2SourceActiveLicense": 2, + "year2SourcePaidMaintenance": 8, + "year2SourceMaintenancePerServerValue": 15525, + "year2SourceMaintenanceTotalValue": 124200, + "year3ServersOffSource": 8, + "year3SourceActiveLicense": 0, + "year3SourcePaidMaintenance": 8, + "year3SourceMaintenancePerServerValue": 17854, + "year3SourceMaintenanceTotalValue": 142832 + }, + "rhvRampUpCostsModel": { + "year1RhvServers": 4, + "year1RhvCompSubs": 4, + "year1RhvPaidSubs": 0, + "year1RhvPerServerValue": 0, + "year1RhvTotalValue": 0, + "year1RhvServersGrowth": 0, + "year1RhvCompSubsGrowth": 0, + "year1RhvPaidSubsGrowth": 0, + "year1RhvPerServerGrowthValue": 375, + "year1RhvTotalGrowthValue": 0, + "year1RhvGrandTotalGrowthValue": 0, + "rhvSwitchLearningSubsValue": 30000, + "rhvSwitchConsultValue": 100000, + "rhvSwitchTAndEValue": 30000, + "year2RhvServers": 6, + "year2RhvCompSubs": 0, + "year2RhvPaidSubs": 6, + "year2RhvPerServerValue": 375, + "year2RhvTotalValue": 2250, + "year2RhvServersGrowth": 0, + "year2RhvCompSubsGrowth": 0, + "year2RhvPaidSubsGrowth": 0, + "year2RhvPerServerGrowthValue": 375, + "year2RhvTotalGrowthValue": 0, + "year2RhvGrandTotalGrowthValue": 2250, + "year3RhvServers": 8, + "year3RhvCompSubs": 0, + "year3RhvPaidSubs": 8, + "year3RhvPerServerValue": 375, + "year3RhvTotalValue": 3000, + "year3RhvServersGrowth": 0, + "year3RhvCompSubsGrowth": 0, + "year3RhvPaidSubsGrowth": 0, + "year3RhvPerServerGrowthValue": 375, + "year3RhvTotalGrowthValue": 0, + "year3RhvGrandTotalGrowthValue": 3000 + }, + "rhvYearByYearCostsModel": { + "year1RhvGrandTotalValue": 268000, + "year2RhvGrandTotalValue": 126450, + "year3RhvGrandTotalValue": 145832, + "year1RhvBudgetFreedHighValue": 218000, + "year1RhvBudgetFreedLikelyValue": 137000, + "year1RhvBudgetFreedLowValue": 56000, + "year2RhvBudgetFreedHighValue": 359550, + "year2RhvBudgetFreedLikelyValue": 278550, + "year2RhvBudgetFreedLowValue": 197550, + "year3RhvBudgetFreedHighValue": 340168, + "year3RhvBudgetFreedLikelyValue": 259168, + "year3RhvBudgetFreedLowValue": 178168 + }, + "rhvSavingsModel": { + "rhvSaveHighValue": 917718, + "rhvSaveLikelyValue": 674718, + "rhvSaveLowValue": 431718, + "rhvSaveFromValue": null, + "rhvSaveToValue": null + }, + "rhvAdditionalContainerCapacityModel": { + "rhvContainerHigh": 6118, + "rhvContainerLikely": 4498, + "rhvContainerLow": 2878, + "rhvContainerFrom": null, + "rhvContainerTo": null + }, + "rhvOrderFormModel": null + } diff --git a/src/test/resources/cfme_inventory-20190912-demolab-withssa-workload-inventory-report.json b/src/test/resources/cfme_inventory-20190912-demolab-withssa-workload-inventory-report.json new file mode 100644 index 00000000..59551b78 --- /dev/null +++ b/src/test/resources/cfme_inventory-20190912-demolab-withssa-workload-inventory-report.json @@ -0,0 +1,282 @@ +{ + "content": [ + { + "id": 24768, + "provider": "vSphere", + "datacenter": "Datacenter", + "cluster": "VMCluster", + "vmName": "lb", + "osName": "Linux", + "osDescription": "Red Hat Enterprise Linux Server release 7.6 (Maipo)", + "diskSpace": 2614591488, + "memory": 2147483648, + "cpuCores": 1, + "workloads": [], + "complexity": "Easy", + "recommendedTargetsIMS": [ + "RHV", + "OSP" + ], + "flagsIMS": [], + "product": "VMware vCenter", + "version": "6.7.2", + "host_name": "host-31", + "creationDate": 1568305947979, + "ssaEnabled": true + }, + { + "id": 24767, + "provider": "vSphere", + "datacenter": "Datacenter", + "cluster": "VMCluster", + "vmName": "jboss1", + "osName": "Linux", + "osDescription": "Red Hat Enterprise Linux Server release 7.6 (Maipo)", + "diskSpace": 4745691136, + "memory": 2147483648, + "cpuCores": 1, + "workloads": [ + "Red Hat JBoss EAP" + ], + "complexity": "Medium", + "recommendedTargetsIMS": [ + "RHV" + ], + "flagsIMS": [ + "RDM" + ], + "product": "VMware vCenter", + "version": "6.7.2", + "host_name": "host-47", + "creationDate": 1568305947979, + "ssaEnabled": true + }, + { + "id": 24766, + "provider": "vSphere", + "datacenter": "Datacenter", + "cluster": "VMCluster", + "vmName": "cluster1", + "osName": "CentOS 7 (64-bit)", + "osDescription": "CentOS 7 (64-bit)", + "diskSpace": 0, + "memory": 2147483648, + "cpuCores": 1, + "workloads": [], + "complexity": "Medium", + "recommendedTargetsIMS": [ + "RHV", + "Convert2RHEL", + "OSP" + ], + "flagsIMS": [ + "Shared Disk" + ], + "product": "VMware vCenter", + "version": "6.7.2", + "host_name": "host-31", + "creationDate": 1568305947979, + "ssaEnabled": false + }, + { + "id": 24765, + "provider": "vSphere", + "datacenter": "Datacenter", + "cluster": "VMCluster", + "vmName": "cluster0", + "osName": "CentOS 7 (64-bit)", + "osDescription": "CentOS 7 (64-bit)", + "diskSpace": 0, + "memory": 2147483648, + "cpuCores": 1, + "workloads": [], + "complexity": "Medium", + "recommendedTargetsIMS": [ + "RHV", + "Convert2RHEL", + "OSP" + ], + "flagsIMS": [ + "Shared Disk" + ], + "product": "VMware vCenter", + "version": "6.7.2", + "host_name": "host-47", + "creationDate": 1568305947979, + "ssaEnabled": false + }, + { + "id": 24764, + "provider": "vSphere", + "datacenter": "Datacenter", + "cluster": "VMCluster", + "vmName": "weblogic", + "osName": "Linux", + "osDescription": "Red Hat Enterprise Linux Server release 7.7 (Maipo)", + "diskSpace": 9302904832, + "memory": 4294967296, + "cpuCores": 2, + "workloads": [ + "Oracle Weblogic" + ], + "complexity": "Easy", + "recommendedTargetsIMS": [ + "RHV", + "OSP" + ], + "flagsIMS": [], + "product": "VMware vCenter", + "version": "6.7.2", + "host_name": "host-31", + "creationDate": 1568305947979, + "ssaEnabled": true + }, + { + "id": 24763, + "provider": "vSphere", + "datacenter": "Datacenter", + "cluster": "VMCluster", + "vmName": "oracle_db", + "osName": "Linux", + "osDescription": "CentOS Linux release 7.6.1810 (Core) ", + "diskSpace": 18612346880, + "memory": 8589934592, + "cpuCores": 2, + "workloads": [ + "Oracle Database" + ], + "complexity": "Medium", + "recommendedTargetsIMS": [ + "RHV", + "Convert2RHEL", + "OSP" + ], + "flagsIMS": [], + "product": "VMware vCenter", + "version": "6.7.2", + "host_name": "host-31", + "creationDate": 1568305947979, + "ssaEnabled": true + }, + { + "id": 24762, + "provider": "vSphere", + "datacenter": "Datacenter", + "cluster": "VMCluster", + "vmName": "mssql_db", + "osName": "Linux", + "osDescription": "Red Hat Enterprise Linux Server release 7.6 (Maipo)", + "diskSpace": 3317547008, + "memory": 4294967296, + "cpuCores": 2, + "workloads": [ + "Microsoft SQL Server" + ], + "complexity": "Easy", + "recommendedTargetsIMS": [ + "RHV", + "OSP" + ], + "flagsIMS": [], + "product": "VMware vCenter", + "version": "6.7.2", + "host_name": "host-31", + "creationDate": 1568305947979, + "ssaEnabled": true + }, + { + "id": 24761, + "provider": "vSphere", + "datacenter": "Datacenter", + "cluster": "VMCluster", + "vmName": "db", + "osName": "Linux", + "osDescription": "Red Hat Enterprise Linux Server release 7.6 (Maipo)", + "diskSpace": 2669137920, + "memory": 2147483648, + "cpuCores": 1, + "workloads": [], + "complexity": "Easy", + "recommendedTargetsIMS": [ + "RHV", + "OSP" + ], + "flagsIMS": [], + "product": "VMware vCenter", + "version": "6.7.2", + "host_name": "host-47", + "creationDate": 1568305947979, + "ssaEnabled": true + }, + { + "id": 24760, + "provider": "vSphere", + "datacenter": "Datacenter", + "cluster": "VMCluster", + "vmName": "jboss0", + "osName": "Linux", + "osDescription": "Red Hat Enterprise Linux 7 (64-bit)", + "diskSpace": 4795150336, + "memory": 2147483648, + "cpuCores": 1, + "workloads": [ + "Red Hat JBoss EAP" + ], + "complexity": "Medium", + "recommendedTargetsIMS": [ + "RHV" + ], + "flagsIMS": [ + "RDM" + ], + "product": "VMware vCenter", + "version": "6.7.2", + "host_name": "host-31", + "creationDate": 1568305947979, + "ssaEnabled": true + }, + { + "id": 24759, + "provider": "vSphere", + "datacenter": "Datacenter", + "cluster": "VMCluster", + "vmName": "wmssql_db", + "osName": "ServerNT", + "osDescription": "Windows Server 2016 Standard", + "diskSpace": 15177039872, + "memory": 4294967296, + "cpuCores": 1, + "workloads": [ + "Microsoft SQL Server" + ], + "complexity": "Easy", + "recommendedTargetsIMS": [ + "RHV", + "OSP" + ], + "flagsIMS": [], + "product": "VMware vCenter", + "version": "6.7.2", + "host_name": "host-31", + "creationDate": 1568305947979, + "ssaEnabled": true + } + ], + "last": false, + "totalPages": 2, + "totalElements": 14, + "first": true, + "sort": [ + { + "direction": "DESC", + "property": "id", + "ignoreCase": false, + "nullHandling": "NATIVE", + "ascending": false, + "descending": true + } + ], + "numberOfElements": 10, + "size": 10, + "number": 0 + } diff --git a/src/test/resources/cfme_inventory-20190912-demolab-withssa-workload-summary-report.json b/src/test/resources/cfme_inventory-20190912-demolab-withssa-workload-summary-report.json new file mode 100644 index 00000000..a4dbd063 --- /dev/null +++ b/src/test/resources/cfme_inventory-20190912-demolab-withssa-workload-summary-report.json @@ -0,0 +1,49 @@ +{ + "id": 461, + "summaryModels": [ + { + "id": 486, + "provider": "vSphere", + "clusters": 1, + "sockets": 20, + "vms": 14, + "hosts": 2, + "product": "VMware vCenter", + "version": "6.7.2" + } + ], + "complexityModel": { + "id": 461, + "easy": 7, + "medium": 6, + "hard": 0, + "unknown": 1 + }, + "recommendedTargetsIMSModel": { + "id": 410, + "total": 14, + "rhv": 13, + "rhel": 4, + "osp": 11 + }, + "workloadsDetectedOSTypeModels": [ + { + "id": 470, + "osName": "ServerNT", + "total": 1 + }, + { + "id": 469, + "osName": "Linux", + "total": 8 + } + ], + "scanRunModels": [ + { + "id": 311, + "target": "vSphere", + "date": 1568239200000, + "smartStateEnabled": "Virt Platform + SmartState" + } + ] + } diff --git a/src/test/resources/cfme_inventory-20190912-demolab_withSSA.tar.gz b/src/test/resources/cfme_inventory-20190912-demolab_withSSA.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d2f7dcc0fd5d339d9e87239b44cfbc0edb29c1b7 GIT binary patch literal 29893 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 Qn+M|aOg|PDJJ=8X4~NF7k^lez literal 0 HcmV?d00001 diff --git a/src/test/resources/cloudforms-export-v1.zip b/src/test/resources/cloudforms-export-v1.zip new file mode 100644 index 0000000000000000000000000000000000000000..c94245647d6cd0b48c91a072db039c57100dab9f GIT binary patch literal 42404 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/cloudforms-export-v1_0_0-multiple-files.tar.gz b/src/test/resources/cloudforms-export-v1_0_0-multiple-files.tar.gz index 55e8bf5437d3c07b0ec271dd4f4da2b0ad2c447d..04d0dba58d6cf5ccaf2469b99ad970996ace0e4d 100644 GIT binary patch literal 49659 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 vaQ?PU^YHui5VCi+FaOnEUh4fqLKII4N#2 literal 49523 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

iNEBHoGi*Tobr9G<@p&2fm(U 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 z xavier-analytics_0.0.1-SNAPSHOTxavier-analytics_0.0.1-SNAPSHOTorg.jboss.xavierxavier-analytics0.0.1-SNAPSHOT RULESTARTEDPROCESS SINGLETON MERGE_COLLECTIONS STARTED' -v + +read -n 1 -s -r -p "Press any key to Create the KIE Container " + +# Create the KIE container +curl -X PUT -H "Cache-Control:no-cache" -H "Content-Type:application/json" -H "Authorization:Basic a2llc2VydmVyOmtpZXNlcnZlcjEh" --data '{"container-id" : "xavier-analytics_0.0.1-SNAPSHOT","release-id" : {"group-id" : "org.jboss.xavier","artifact-id" : "xavier-analytics","version" : "0.0.1-SNAPSHOT" } }' http://localhost:$kie_ext_port/kie-server/services/rest/server/containers/xavier-analytics_0.0.1-SNAPSHOT -v + +ECHO "###### Installation Done" + +##### the above line will give us following error , meaning KIE can not find the Drools Maven repository #### +# { +# "type" : "FAILURE", +# "msg" : "Failed to create container xavier-analytics_0.0.1-SNAPSHOT with module org.jboss.xavier:xavier-analytics:0.0.1-SNAPSHOT: java.lang.RuntimeException: Cannot find KieModule: org.jboss.xavier:xavier-analytics:0.0.1-SNAPSHOT", +# "result" : null +#* Connection #0 to host localhost left intact +#}% + +# If we check on business-central with Admin->Artifacts we won't see any artifact deployed + +read -n 1 -s -r -p "Press any key to call KIE to calculate InitialCostSavingsReport " + + +# Call to execute KIE commands +curl -X POST -H "Content-Type:application/xml" -H "X-KIE-ContentType:xstream" -H "Authorization:Basic a2llc2VydmVyOmtpZXNlcnZlcjEh" --data '99vcenter.v2v.bos.redhat.com.json.zip256390212403210.010.010.020.0111' http://localhost:$kie_ext_port/kie-server/services/rest/server/containers/instances/xavier-analytics_0.0.1-SNAPSHOT + +#This command gives us this error in KIE's log +#17:52:59,094 WARN [org.appformer.maven.integration.MavenRepository] (default task-2) Unable to resolve artifact: org.jboss.xavier:xavier-analytics:pom:0.0.1-SNAPSHOT +#17:52:59,094 ERROR [org.kie.server.services.impl.KieServerImpl] (default task-2) Error creating container 'xavier-analytics_0.0.1-SNAPSHOT' for module 'org.jboss.xavier:xavier-analytics:0.0.1-SNAPSHOT': java.lang.RuntimeException: Cannot find KieModule: org.jboss.xavier:xavier-analytics:0.0.1-SNAPSHOT + +echo "-------- The End, adeu siau -------" + +# Useful commands +# To check how a job is going +# curl http://localhost:8080/business-central/rest/jobs/{job_id} -X GET -H "Cache-Control:no-cache" -H "Content-Type:application/json" -H "Authorization:Basic YWRtaW46YWRtaW4=" -v diff --git a/src/test/resources/kie-server-response-workloadinventoryreport.xml b/src/test/resources/kie-server-response-workloadinventoryreport.xml index 1ef0819a..d5d7deeb 100644 --- a/src/test/resources/kie-server-response-workloadinventoryreport.xml +++ b/src/test/resources/kie-server-response-workloadinventoryreport.xml @@ -22,6 +22,10 @@ complexity + VMWare + 3 + myhost + true 2019-08-04 15:35:18.474 EST diff --git a/src/test/resources/minio-bucket-creation-commands.sh b/src/test/resources/minio-bucket-creation-commands.sh new file mode 100755 index 00000000..cdfee035 --- /dev/null +++ b/src/test/resources/minio-bucket-creation-commands.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +/usr/bin/mc config host add myminio http://$1 BQA2GEXO711FVBVXDWKM uvgz3LCwWM3e400cDkQIH/y1Y4xgU4iV91CwFSPC; +/usr/bin/mc mb myminio/insights-upload-perma; +/usr/bin/mc mb myminio/insights-upload-rejected; +exit 0; diff --git a/src/test/resources/platform.upload.available.json b/src/test/resources/platform.upload.available.json deleted file mode 100644 index 9a05ad52..00000000 --- a/src/test/resources/platform.upload.available.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "identity": { - "internal": { - "auth_time": 0, - "auth_type": "basic-auth", - "org_id": "711497" - }, - "account_number": "477931", - "user": { - "first_name": "Quality", - "last_name": "Assurance", - "is_internal": true, - "is_active": true, - "locale": "en_US", - "is_org_admin": true, - "username": "qa@redhat.com", - "email": "qa+qa@redhat.com" - }, - "type": "User" - }, - "entitlements": { - "insights": { - "is_entitled": true - }, - "openshift": { - "is_entitled": true - }, - "smart_management": { - "is_entitled": false - }, - "hybrid_cloud": { - "is_entitled": true - } - } -} \ No newline at end of file diff --git a/src/test/resources/platform.upload.xavier.json b/src/test/resources/platform.upload.xavier.json index 8db72064..212e8000 100644 --- a/src/test/resources/platform.upload.xavier.json +++ b/src/test/resources/platform.upload.xavier.json @@ -7,6 +7,6 @@ "size": 5391, "service": "xavier", "category": "cloudforms", - "b64_identity": "eyJpZGVudGl0eSI6eyJhY2NvdW50X251bWJlciI6IjEyMzQ1NCIsImludGVybmFsIjp7ImZpbGVuYW1lIjoidmNlbnRlci52MnYuYm9zLnJlZGhhdC5jb20uanNvbiIsIm9yaWdpbiI6Im1hLXhhdmllciIsImN1c3RvbWVyaWQiOiJDSUQ4ODgifX19", + "b64_identity": "eyJlbnRpdGxlbWVudHMiOnsiaW5zaWdodHMiOnsiaXNfZW50aXRsZWQiOnRydWV9LCJvcGVuc2hpZnQiOnsiaXNfZW50aXRsZWQiOnRydWV9LCJzbWFydF9tYW5hZ2VtZW50Ijp7ImlzX2VudGl0bGVkIjpmYWxzZX0sImh5YnJpZF9jbG91ZCI6eyJpc19lbnRpdGxlZCI6dHJ1ZX19LCJpZGVudGl0eSI6eyJpbnRlcm5hbCI6eyJhdXRoX3RpbWUiOjAsImF1dGhfdHlwZSI6Imp3dC1hdXRoIiwib3JnX2lkIjoiNjM0MDA1NiJ9LCJhY2NvdW50X251bWJlciI6IjE0NjAyOTAiLCJmaWxlbmFtZSI6InZjZW50ZXIudjJ2LmJvcy5yZWRoYXQuY29tLmpzb24iLCJvcmlnaW4iOiJtYS14YXZpZXIiLCJjdXN0b21lcmlkIjoiQ0lEODg4IiwgInVzZXIiOnsiZmlyc3RfbmFtZSI6Ik1hcmNvIiwiaXNfYWN0aXZlIjp0cnVlLCJpc19pbnRlcm5hbCI6dHJ1ZSwibGFzdF9uYW1lIjoiUml6emkiLCJsb2NhbGUiOiJlbl9VUyIsImlzX29yZ19hZG1pbiI6ZmFsc2UsInVzZXJuYW1lIjoibXJpenppQHJlZGhhdC5jb20iLCJlbWFpbCI6Im1yaXp6aStxYUByZWRoYXQuY29tIn0sInR5cGUiOiJVc2VyIn19", "url": "http://172.17.0.1:9000/insights-upload-perm-test/440c88f9-5930-416e-9799-fa01d156df29?AWSAccessKeyId=BQA2GEXO711FVBVXDWKM&Signature=V2hJED3EgA%2FDmOqcGrzgI5W2GtY%3D&Expires=1559398049 " -} \ No newline at end of file +} diff --git a/upload/fichero.txt b/upload/fichero.txt deleted file mode 100644 index 7bfb3550..00000000 --- a/upload/fichero.txt +++ /dev/null @@ -1 +0,0 @@ -this is a test body \ No newline at end of file diff --git a/upload/testfilename.txt b/upload/testfilename.txt deleted file mode 100644 index 7bfb3550..00000000 --- a/upload/testfilename.txt +++ /dev/null @@ -1 +0,0 @@ -this is a test body \ No newline at end of file From dba6ad4ef151188764c73b1cfd6f5db7f3c2c638 Mon Sep 17 00:00:00 2001 From: jonathan Date: Fri, 17 Jan 2020 16:54:16 +0100 Subject: [PATCH 02/19] MIGENG-371 adding idempotentcomponent and removing kafka offset reset --- .../org/jboss/xavier/integrations/route/MainRouteBuilder.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java index 3b203288..642670ef 100644 --- a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java +++ b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java @@ -121,10 +121,11 @@ public void configure() throws Exception { .throwException(org.apache.commons.httpclient.HttpException.class, "Unsuccessful response from Insights Upload Service") .end(); - from("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoOffsetReset=earliest&autoCommitEnable=true") + from("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoCommitEnable=true") .routeId("kafka-upload-message") .unmarshal().json(JsonLibrary.Jackson, FilePersistedNotification.class) .filter(simple("'{{insights.service}}' == ${body.getService}")) + .idempotentConsumer("body.requestId") // lookup to use .to("direct:download-file"); from("direct:download-file") From e8ac231f42ded8fec2c2dafeb01cae1e5fa3085a Mon Sep 17 00:00:00 2001 From: jonathan Date: Fri, 17 Jan 2020 16:54:16 +0100 Subject: [PATCH 03/19] MIGENG-371 adding idempotentcomponent and removing kafka offset reset --- .../org/jboss/xavier/integrations/route/MainRouteBuilder.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java index 3b203288..642670ef 100644 --- a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java +++ b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java @@ -121,10 +121,11 @@ public void configure() throws Exception { .throwException(org.apache.commons.httpclient.HttpException.class, "Unsuccessful response from Insights Upload Service") .end(); - from("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoOffsetReset=earliest&autoCommitEnable=true") + from("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoCommitEnable=true") .routeId("kafka-upload-message") .unmarshal().json(JsonLibrary.Jackson, FilePersistedNotification.class) .filter(simple("'{{insights.service}}' == ${body.getService}")) + .idempotentConsumer("body.requestId") // lookup to use .to("direct:download-file"); from("direct:download-file") From 06d2f8bcaa3af7db075d4b4a991067633056ef89 Mon Sep 17 00:00:00 2001 From: jonathan Date: Mon, 20 Jan 2020 17:31:02 +0100 Subject: [PATCH 04/19] MIGENG-371 upgraded testcontainers version added test after stoping camel context commented out the idempotentConsumer added debug info on localstack --- pom.xml | 2 +- .../integrations/route/MainRouteBuilder.java | 2 +- .../xavier/integrations/EndToEndTest.java | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 377025e1..3320c345 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ info - 1.12.2 + 1.12.4 diff --git a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java index 642670ef..ad23c7c3 100644 --- a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java +++ b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java @@ -125,7 +125,7 @@ public void configure() throws Exception { .routeId("kafka-upload-message") .unmarshal().json(JsonLibrary.Jackson, FilePersistedNotification.class) .filter(simple("'{{insights.service}}' == ${body.getService}")) - .idempotentConsumer("body.requestId") // lookup to use +// .idempotentConsumer("body.requestId") // lookup to use .to("direct:download-file"); from("direct:download-file") diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java index 8514c787..673803de 100644 --- a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -77,6 +77,7 @@ import java.util.Set; import java.util.TreeSet; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -131,6 +132,7 @@ public class EndToEndTest { @ClassRule public static LocalStackContainer localstack = new LocalStackContainer() .withLogConsumer(new Slf4jLogConsumer(logger).withPrefix("AWS-LOG")) + .withEnv("DEBUG", "1") .withServices(S3); private static String ingressCommitHash = "3ea33a8d793c2154f7cfa12057ca005c5f6031fa"; // 2019-11-11 @@ -159,6 +161,9 @@ public class EndToEndTest { @Value("${minio.host}") // Set in the Initializer private String minio_host; + @Value("${insights.kafka.host}") + private String kafkaHost; + public static class Initializer implements ApplicationContextInitializer { @Override @@ -449,6 +454,19 @@ public void configure() { }); camelContext.stop(); + + camelContext.getRouteDefinition("kafka-upload-message").adviceWith(camelContext, new AdviceWithRouteBuilder() { + @Override + public void configure() throws Exception { + replaceFromWith("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoOffsetReset=earliest&autoCommitEnable=true"); + } + }); + camelContext.start(); + Thread.sleep(10000); + + // checking some Initial Savings Report is duplicated regarding the analysisId + assertThat(initialSavingsEstimationReportRepository.findAll().stream().collect(Collectors.groupingBy(e -> e.getAnalysis().getId())).values().stream().anyMatch(m -> m.size() > 1)).isTrue(); + camelContext.stop(); } @NotNull From 1f0dfc606a5b39065d69b0f67c070e7ff79c448f Mon Sep 17 00:00:00 2001 From: jonathan Date: Mon, 20 Jan 2020 17:31:02 +0100 Subject: [PATCH 05/19] MIGENG-371 upgraded testcontainers version added test after stoping camel context commented out the idempotentConsumer added debug info on localstack --- pom.xml | 2 +- .../integrations/route/MainRouteBuilder.java | 2 +- .../xavier/integrations/EndToEndTest.java | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 377025e1..3320c345 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ info - 1.12.2 + 1.12.4 diff --git a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java index 642670ef..ad23c7c3 100644 --- a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java +++ b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java @@ -125,7 +125,7 @@ public void configure() throws Exception { .routeId("kafka-upload-message") .unmarshal().json(JsonLibrary.Jackson, FilePersistedNotification.class) .filter(simple("'{{insights.service}}' == ${body.getService}")) - .idempotentConsumer("body.requestId") // lookup to use +// .idempotentConsumer("body.requestId") // lookup to use .to("direct:download-file"); from("direct:download-file") diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java index 8514c787..673803de 100644 --- a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -77,6 +77,7 @@ import java.util.Set; import java.util.TreeSet; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -131,6 +132,7 @@ public class EndToEndTest { @ClassRule public static LocalStackContainer localstack = new LocalStackContainer() .withLogConsumer(new Slf4jLogConsumer(logger).withPrefix("AWS-LOG")) + .withEnv("DEBUG", "1") .withServices(S3); private static String ingressCommitHash = "3ea33a8d793c2154f7cfa12057ca005c5f6031fa"; // 2019-11-11 @@ -159,6 +161,9 @@ public class EndToEndTest { @Value("${minio.host}") // Set in the Initializer private String minio_host; + @Value("${insights.kafka.host}") + private String kafkaHost; + public static class Initializer implements ApplicationContextInitializer { @Override @@ -449,6 +454,19 @@ public void configure() { }); camelContext.stop(); + + camelContext.getRouteDefinition("kafka-upload-message").adviceWith(camelContext, new AdviceWithRouteBuilder() { + @Override + public void configure() throws Exception { + replaceFromWith("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoOffsetReset=earliest&autoCommitEnable=true"); + } + }); + camelContext.start(); + Thread.sleep(10000); + + // checking some Initial Savings Report is duplicated regarding the analysisId + assertThat(initialSavingsEstimationReportRepository.findAll().stream().collect(Collectors.groupingBy(e -> e.getAnalysis().getId())).values().stream().anyMatch(m -> m.size() > 1)).isTrue(); + camelContext.stop(); } @NotNull From 745eca0f3fb45faff5cd3c76226339c15b4a0a57 Mon Sep 17 00:00:00 2001 From: jonathan Date: Tue, 21 Jan 2020 10:34:21 +0100 Subject: [PATCH 06/19] MIGENG-371 commented out to test on CI --- .../org/jboss/xavier/integrations/EndToEndTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java index 673803de..a60d9286 100644 --- a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -77,7 +77,6 @@ import java.util.Set; import java.util.TreeSet; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -331,7 +330,6 @@ public void end2endTest() throws Exception { // given camelContext.getGlobalOptions().put(Exchange.LOG_DEBUG_BODY_MAX_CHARS, "5000"); - camelContext.start(); camelContext.getRouteDefinition("store-in-s3").adviceWith(camelContext, new AdviceWithRouteBuilder() { @Override @@ -359,6 +357,7 @@ public void configure() { .to("http4:oldhost?preserveHostHeader=true"); } }); + camelContext.start(); // 1. Check user has firstTime ResponseEntity userEntity = new RestTemplate().exchange("http://localhost:" + serverPort + "/api/xavier/user", HttpMethod.GET, getRequestEntity(), new ParameterizedTypeReference() {}); @@ -452,8 +451,8 @@ public void configure() { workloadSummaryReport_PerformanceTest.getBody() != null && workloadSummaryReport_PerformanceTest.getBody().getSummaryModels() != null); }); - - camelContext.stop(); +/* + camelContext.suspend(); camelContext.getRouteDefinition("kafka-upload-message").adviceWith(camelContext, new AdviceWithRouteBuilder() { @Override @@ -461,11 +460,12 @@ public void configure() throws Exception { replaceFromWith("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoOffsetReset=earliest&autoCommitEnable=true"); } }); - camelContext.start(); + camelContext.resume(); Thread.sleep(10000); // checking some Initial Savings Report is duplicated regarding the analysisId assertThat(initialSavingsEstimationReportRepository.findAll().stream().collect(Collectors.groupingBy(e -> e.getAnalysis().getId())).values().stream().anyMatch(m -> m.size() > 1)).isTrue(); + */ camelContext.stop(); } From b5b5e1855a5945424b6ea995306544611e7f269d Mon Sep 17 00:00:00 2001 From: jonathan Date: Tue, 21 Jan 2020 10:34:21 +0100 Subject: [PATCH 07/19] MIGENG-371 commented out to test on CI --- .../org/jboss/xavier/integrations/EndToEndTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java index 673803de..a60d9286 100644 --- a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -77,7 +77,6 @@ import java.util.Set; import java.util.TreeSet; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -331,7 +330,6 @@ public void end2endTest() throws Exception { // given camelContext.getGlobalOptions().put(Exchange.LOG_DEBUG_BODY_MAX_CHARS, "5000"); - camelContext.start(); camelContext.getRouteDefinition("store-in-s3").adviceWith(camelContext, new AdviceWithRouteBuilder() { @Override @@ -359,6 +357,7 @@ public void configure() { .to("http4:oldhost?preserveHostHeader=true"); } }); + camelContext.start(); // 1. Check user has firstTime ResponseEntity userEntity = new RestTemplate().exchange("http://localhost:" + serverPort + "/api/xavier/user", HttpMethod.GET, getRequestEntity(), new ParameterizedTypeReference() {}); @@ -452,8 +451,8 @@ public void configure() { workloadSummaryReport_PerformanceTest.getBody() != null && workloadSummaryReport_PerformanceTest.getBody().getSummaryModels() != null); }); - - camelContext.stop(); +/* + camelContext.suspend(); camelContext.getRouteDefinition("kafka-upload-message").adviceWith(camelContext, new AdviceWithRouteBuilder() { @Override @@ -461,11 +460,12 @@ public void configure() throws Exception { replaceFromWith("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoOffsetReset=earliest&autoCommitEnable=true"); } }); - camelContext.start(); + camelContext.resume(); Thread.sleep(10000); // checking some Initial Savings Report is duplicated regarding the analysisId assertThat(initialSavingsEstimationReportRepository.findAll().stream().collect(Collectors.groupingBy(e -> e.getAnalysis().getId())).values().stream().anyMatch(m -> m.size() > 1)).isTrue(); + */ camelContext.stop(); } From 0975cb5b8b3eff46579b980d0a6f14a12acd542a Mon Sep 17 00:00:00 2001 From: jonathan Date: Tue, 21 Jan 2020 17:35:11 +0100 Subject: [PATCH 08/19] MIGENG-371 added tests to check duplication of rows with the Kafka consumer --- .../xavier/integrations/EndToEndTest.java | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java index a60d9286..34a500a7 100644 --- a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -77,6 +77,7 @@ import java.util.Set; import java.util.TreeSet; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -451,22 +452,37 @@ public void configure() { workloadSummaryReport_PerformanceTest.getBody() != null && workloadSummaryReport_PerformanceTest.getBody().getSummaryModels() != null); }); -/* - camelContext.suspend(); + // Testing the duplication of Rows depending on the type of the Kafka consumer + assertThat(numberOfDuplicatedRowsInReports("", "fourthconsumer")).isEqualTo(0); + + long duplicatedRows = numberOfDuplicatedRowsInReports("&autoOffsetReset=earliest", "secondconsumer"); + assertThat(duplicatedRows).isGreaterThan(0); + + assertThat(numberOfDuplicatedRowsInReports("&autoOffsetReset=latest", "thirdconsumer")).isEqualTo(duplicatedRows); + + camelContext.stop(); + } + + private long numberOfDuplicatedRowsInReports(String autoOffsetReset, String consumer) throws Exception { + camelContext.stop(); + + // To avoid issues with Localstack + camelContext.addComponent("aws-s3", camelContext.getComponent("stub")); + + // Test to check we will have duplicates if we set autoOffsetReset=earliest camelContext.getRouteDefinition("kafka-upload-message").adviceWith(camelContext, new AdviceWithRouteBuilder() { @Override public void configure() throws Exception { - replaceFromWith("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoOffsetReset=earliest&autoCommitEnable=true"); + replaceFromWith("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + autoOffsetReset + "&autoCommitEnable=true&clientId=" + consumer); } }); - camelContext.resume(); + + camelContext.start(); Thread.sleep(10000); // checking some Initial Savings Report is duplicated regarding the analysisId - assertThat(initialSavingsEstimationReportRepository.findAll().stream().collect(Collectors.groupingBy(e -> e.getAnalysis().getId())).values().stream().anyMatch(m -> m.size() > 1)).isTrue(); - */ - camelContext.stop(); + return initialSavingsEstimationReportRepository.findAll().stream().collect(Collectors.groupingBy(e -> e.getAnalysis().getId())).values().stream().filter(m -> m.size() > 1).count(); } @NotNull From f99745ba5557ed7b90630e11e845c297f64ae37b Mon Sep 17 00:00:00 2001 From: jonathan Date: Tue, 21 Jan 2020 17:35:11 +0100 Subject: [PATCH 09/19] MIGENG-371 added tests to check duplication of rows with the Kafka consumer --- .../xavier/integrations/EndToEndTest.java | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java index a60d9286..34a500a7 100644 --- a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -77,6 +77,7 @@ import java.util.Set; import java.util.TreeSet; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -451,22 +452,37 @@ public void configure() { workloadSummaryReport_PerformanceTest.getBody() != null && workloadSummaryReport_PerformanceTest.getBody().getSummaryModels() != null); }); -/* - camelContext.suspend(); + // Testing the duplication of Rows depending on the type of the Kafka consumer + assertThat(numberOfDuplicatedRowsInReports("", "fourthconsumer")).isEqualTo(0); + + long duplicatedRows = numberOfDuplicatedRowsInReports("&autoOffsetReset=earliest", "secondconsumer"); + assertThat(duplicatedRows).isGreaterThan(0); + + assertThat(numberOfDuplicatedRowsInReports("&autoOffsetReset=latest", "thirdconsumer")).isEqualTo(duplicatedRows); + + camelContext.stop(); + } + + private long numberOfDuplicatedRowsInReports(String autoOffsetReset, String consumer) throws Exception { + camelContext.stop(); + + // To avoid issues with Localstack + camelContext.addComponent("aws-s3", camelContext.getComponent("stub")); + + // Test to check we will have duplicates if we set autoOffsetReset=earliest camelContext.getRouteDefinition("kafka-upload-message").adviceWith(camelContext, new AdviceWithRouteBuilder() { @Override public void configure() throws Exception { - replaceFromWith("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoOffsetReset=earliest&autoCommitEnable=true"); + replaceFromWith("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + autoOffsetReset + "&autoCommitEnable=true&clientId=" + consumer); } }); - camelContext.resume(); + + camelContext.start(); Thread.sleep(10000); // checking some Initial Savings Report is duplicated regarding the analysisId - assertThat(initialSavingsEstimationReportRepository.findAll().stream().collect(Collectors.groupingBy(e -> e.getAnalysis().getId())).values().stream().anyMatch(m -> m.size() > 1)).isTrue(); - */ - camelContext.stop(); + return initialSavingsEstimationReportRepository.findAll().stream().collect(Collectors.groupingBy(e -> e.getAnalysis().getId())).values().stream().filter(m -> m.size() > 1).count(); } @NotNull From 29c113996ed2447e4b60df45a46fa82051e2b316 Mon Sep 17 00:00:00 2001 From: jonathan Date: Tue, 21 Jan 2020 17:43:57 +0100 Subject: [PATCH 10/19] MIGENG-371 removed the comment on the idempotentConsumer, for the moment no need to use it --- .../org/jboss/xavier/integrations/route/MainRouteBuilder.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java index ad23c7c3..766d4309 100644 --- a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java +++ b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java @@ -125,7 +125,6 @@ public void configure() throws Exception { .routeId("kafka-upload-message") .unmarshal().json(JsonLibrary.Jackson, FilePersistedNotification.class) .filter(simple("'{{insights.service}}' == ${body.getService}")) -// .idempotentConsumer("body.requestId") // lookup to use .to("direct:download-file"); from("direct:download-file") From 30095a5bcd41031ce2768b05d8add486a7a970de Mon Sep 17 00:00:00 2001 From: jonathan Date: Tue, 21 Jan 2020 17:43:57 +0100 Subject: [PATCH 11/19] MIGENG-371 removed the comment on the idempotentConsumer, for the moment no need to use it --- .../org/jboss/xavier/integrations/route/MainRouteBuilder.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java index ad23c7c3..766d4309 100644 --- a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java +++ b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java @@ -125,7 +125,6 @@ public void configure() throws Exception { .routeId("kafka-upload-message") .unmarshal().json(JsonLibrary.Jackson, FilePersistedNotification.class) .filter(simple("'{{insights.service}}' == ${body.getService}")) -// .idempotentConsumer("body.requestId") // lookup to use .to("direct:download-file"); from("direct:download-file") From 213070992ffe3612d7367e13be776c1703fc46e7 Mon Sep 17 00:00:00 2001 From: jonathan Date: Wed, 22 Jan 2020 15:46:30 +0100 Subject: [PATCH 12/19] MIGENG-371 refactoring and giving more time as we have discrepancies between local and Travis --- .../jboss/xavier/integrations/EndToEndTest.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java index 34a500a7..6d592a86 100644 --- a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -454,17 +454,17 @@ public void configure() { }); // Testing the duplication of Rows depending on the type of the Kafka consumer - assertThat(numberOfDuplicatedRowsInReports("", "fourthconsumer")).isEqualTo(0); + assertThat(camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("", "noOffsetConsumer")).isEqualTo(0); - long duplicatedRows = numberOfDuplicatedRowsInReports("&autoOffsetReset=earliest", "secondconsumer"); + long duplicatedRows = camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("&autoOffsetReset=earliest", "earliestOffsetConsumer"); assertThat(duplicatedRows).isGreaterThan(0); - assertThat(numberOfDuplicatedRowsInReports("&autoOffsetReset=latest", "thirdconsumer")).isEqualTo(duplicatedRows); + assertThat(camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("&autoOffsetReset=latest", "latestOffsetConsumer")).isEqualTo(duplicatedRows); camelContext.stop(); } - private long numberOfDuplicatedRowsInReports(String autoOffsetReset, String consumer) throws Exception { + private long camelStopKafkaReconnectnumberOfDuplicatedRowsInReports(String autoOffsetReset, String consumer) throws Exception { camelContext.stop(); // To avoid issues with Localstack @@ -479,10 +479,15 @@ public void configure() throws Exception { }); camelContext.start(); - Thread.sleep(10000); + Thread.sleep(20000); // checking some Initial Savings Report is duplicated regarding the analysisId - return initialSavingsEstimationReportRepository.findAll().stream().collect(Collectors.groupingBy(e -> e.getAnalysis().getId())).values().stream().filter(m -> m.size() > 1).count(); + return initialSavingsEstimationReportRepository.findAll() + .stream() + .collect(Collectors.groupingBy(e -> e.getAnalysis().getId())) + .values().stream() + .filter(m -> m.size() > 1) + .count(); } @NotNull From e6a73d607bb9c6442592568e35be25b21aded23f Mon Sep 17 00:00:00 2001 From: jonathan Date: Wed, 22 Jan 2020 15:46:30 +0100 Subject: [PATCH 13/19] MIGENG-371 refactoring and giving more time as we have discrepancies between local and Travis --- .../jboss/xavier/integrations/EndToEndTest.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java index 34a500a7..6d592a86 100644 --- a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -454,17 +454,17 @@ public void configure() { }); // Testing the duplication of Rows depending on the type of the Kafka consumer - assertThat(numberOfDuplicatedRowsInReports("", "fourthconsumer")).isEqualTo(0); + assertThat(camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("", "noOffsetConsumer")).isEqualTo(0); - long duplicatedRows = numberOfDuplicatedRowsInReports("&autoOffsetReset=earliest", "secondconsumer"); + long duplicatedRows = camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("&autoOffsetReset=earliest", "earliestOffsetConsumer"); assertThat(duplicatedRows).isGreaterThan(0); - assertThat(numberOfDuplicatedRowsInReports("&autoOffsetReset=latest", "thirdconsumer")).isEqualTo(duplicatedRows); + assertThat(camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("&autoOffsetReset=latest", "latestOffsetConsumer")).isEqualTo(duplicatedRows); camelContext.stop(); } - private long numberOfDuplicatedRowsInReports(String autoOffsetReset, String consumer) throws Exception { + private long camelStopKafkaReconnectnumberOfDuplicatedRowsInReports(String autoOffsetReset, String consumer) throws Exception { camelContext.stop(); // To avoid issues with Localstack @@ -479,10 +479,15 @@ public void configure() throws Exception { }); camelContext.start(); - Thread.sleep(10000); + Thread.sleep(20000); // checking some Initial Savings Report is duplicated regarding the analysisId - return initialSavingsEstimationReportRepository.findAll().stream().collect(Collectors.groupingBy(e -> e.getAnalysis().getId())).values().stream().filter(m -> m.size() > 1).count(); + return initialSavingsEstimationReportRepository.findAll() + .stream() + .collect(Collectors.groupingBy(e -> e.getAnalysis().getId())) + .values().stream() + .filter(m -> m.size() > 1) + .count(); } @NotNull From e889ada68b4d855adae5e02781ef73866a4fedf8 Mon Sep 17 00:00:00 2001 From: jonathan Date: Wed, 22 Jan 2020 16:44:12 +0100 Subject: [PATCH 14/19] MIGENG-371 reintroduced autoOffsetReset=latest refactored duplication tests --- .../jboss/xavier/integrations/route/MainRouteBuilder.java | 2 +- .../java/org/jboss/xavier/integrations/EndToEndTest.java | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java index 766d4309..4bd40f1f 100644 --- a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java +++ b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java @@ -121,7 +121,7 @@ public void configure() throws Exception { .throwException(org.apache.commons.httpclient.HttpException.class, "Unsuccessful response from Insights Upload Service") .end(); - from("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoCommitEnable=true") + from("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoOffsetReset=latest&autoCommitEnable=true") .routeId("kafka-upload-message") .unmarshal().json(JsonLibrary.Jackson, FilePersistedNotification.class) .filter(simple("'{{insights.service}}' == ${body.getService}")) diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java index 6d592a86..71caf2a9 100644 --- a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -454,12 +454,13 @@ public void configure() { }); // Testing the duplication of Rows depending on the type of the Kafka consumer - assertThat(camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("", "noOffsetConsumer")).isEqualTo(0); + long duplicatedRows = camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("&autoOffsetReset=latest", "latestOffsetConsumer"); + assertThat(duplicatedRows).isEqualTo(0); - long duplicatedRows = camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("&autoOffsetReset=earliest", "earliestOffsetConsumer"); + duplicatedRows = camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("&autoOffsetReset=earliest", "earliestOffsetConsumer"); assertThat(duplicatedRows).isGreaterThan(0); - assertThat(camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("&autoOffsetReset=latest", "latestOffsetConsumer")).isEqualTo(duplicatedRows); + assertThat(camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("&autoOffsetReset=latest", "secondLatestOffsetConsumer")).isEqualTo(duplicatedRows); camelContext.stop(); } From 98d98707daa2402b76ca5365dddd6ab1b5be93fe Mon Sep 17 00:00:00 2001 From: jonathan Date: Wed, 22 Jan 2020 16:44:12 +0100 Subject: [PATCH 15/19] MIGENG-371 reintroduced autoOffsetReset=latest refactored duplication tests --- .../jboss/xavier/integrations/route/MainRouteBuilder.java | 2 +- .../java/org/jboss/xavier/integrations/EndToEndTest.java | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java index 766d4309..4bd40f1f 100644 --- a/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java +++ b/src/main/java/org/jboss/xavier/integrations/route/MainRouteBuilder.java @@ -121,7 +121,7 @@ public void configure() throws Exception { .throwException(org.apache.commons.httpclient.HttpException.class, "Unsuccessful response from Insights Upload Service") .end(); - from("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoCommitEnable=true") + from("kafka:" + kafkaHost + "?topic={{insights.kafka.upload.topic}}&brokers=" + kafkaHost + "&autoOffsetReset=latest&autoCommitEnable=true") .routeId("kafka-upload-message") .unmarshal().json(JsonLibrary.Jackson, FilePersistedNotification.class) .filter(simple("'{{insights.service}}' == ${body.getService}")) diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java index 6d592a86..71caf2a9 100644 --- a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -454,12 +454,13 @@ public void configure() { }); // Testing the duplication of Rows depending on the type of the Kafka consumer - assertThat(camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("", "noOffsetConsumer")).isEqualTo(0); + long duplicatedRows = camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("&autoOffsetReset=latest", "latestOffsetConsumer"); + assertThat(duplicatedRows).isEqualTo(0); - long duplicatedRows = camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("&autoOffsetReset=earliest", "earliestOffsetConsumer"); + duplicatedRows = camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("&autoOffsetReset=earliest", "earliestOffsetConsumer"); assertThat(duplicatedRows).isGreaterThan(0); - assertThat(camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("&autoOffsetReset=latest", "latestOffsetConsumer")).isEqualTo(duplicatedRows); + assertThat(camelStopKafkaReconnectnumberOfDuplicatedRowsInReports("&autoOffsetReset=latest", "secondLatestOffsetConsumer")).isEqualTo(duplicatedRows); camelContext.stop(); } From b5563391f2425aefa43ff6b930991a1dfc83f238 Mon Sep 17 00:00:00 2001 From: jonathan Date: Wed, 22 Jan 2020 18:12:40 +0100 Subject: [PATCH 16/19] MIGENG-371 parametrised sleep between duplication check and start fix typo --- .../java/org/jboss/xavier/integrations/EndToEndTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java index 71caf2a9..48ade6b6 100644 --- a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -155,7 +155,7 @@ public class EndToEndTest { @Value("${test.timeout.performance:60000}") // 1 minute private int timeoutMilliseconds_PerformaceTest; - @Value("${test.timetout.ics:10000}") // 10 seconds + @Value("${test.timeout.ics:10000}") // 10 seconds private int timeoutMilliseconds_InitialCostSavingsReport; @Value("${minio.host}") // Set in the Initializer @@ -164,6 +164,10 @@ public class EndToEndTest { @Value("${insights.kafka.host}") private String kafkaHost; + @Value("${test.sleep.startandcheckduplicated:10000") + private long sleepBetweenStartAndDuplicatedReportCheck_inMillis; + + public static class Initializer implements ApplicationContextInitializer { @Override @@ -480,7 +484,7 @@ public void configure() throws Exception { }); camelContext.start(); - Thread.sleep(20000); + Thread.sleep(sleepBetweenStartAndDuplicatedReportCheck_inMillis); // checking some Initial Savings Report is duplicated regarding the analysisId return initialSavingsEstimationReportRepository.findAll() From 2adbdf5c6ab61b356f861c9e619802ab4df0484d Mon Sep 17 00:00:00 2001 From: jonathan Date: Wed, 22 Jan 2020 18:12:40 +0100 Subject: [PATCH 17/19] MIGENG-371 parametrised sleep between duplication check and start fix typo --- .../java/org/jboss/xavier/integrations/EndToEndTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java index 71caf2a9..48ade6b6 100644 --- a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -155,7 +155,7 @@ public class EndToEndTest { @Value("${test.timeout.performance:60000}") // 1 minute private int timeoutMilliseconds_PerformaceTest; - @Value("${test.timetout.ics:10000}") // 10 seconds + @Value("${test.timeout.ics:10000}") // 10 seconds private int timeoutMilliseconds_InitialCostSavingsReport; @Value("${minio.host}") // Set in the Initializer @@ -164,6 +164,10 @@ public class EndToEndTest { @Value("${insights.kafka.host}") private String kafkaHost; + @Value("${test.sleep.startandcheckduplicated:10000") + private long sleepBetweenStartAndDuplicatedReportCheck_inMillis; + + public static class Initializer implements ApplicationContextInitializer { @Override @@ -480,7 +484,7 @@ public void configure() throws Exception { }); camelContext.start(); - Thread.sleep(20000); + Thread.sleep(sleepBetweenStartAndDuplicatedReportCheck_inMillis); // checking some Initial Savings Report is duplicated regarding the analysisId return initialSavingsEstimationReportRepository.findAll() From 01c8eb4599ae6db63c5cc6e9080443f588e20927 Mon Sep 17 00:00:00 2001 From: jonathan Date: Thu, 23 Jan 2020 09:56:27 +0100 Subject: [PATCH 18/19] MIGENG-371 fixed typo on value injection --- src/test/java/org/jboss/xavier/integrations/EndToEndTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java index 48ade6b6..d67fe058 100644 --- a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -164,7 +164,7 @@ public class EndToEndTest { @Value("${insights.kafka.host}") private String kafkaHost; - @Value("${test.sleep.startandcheckduplicated:10000") + @Value("${test.sleep.startandcheckduplicated:10000}") private long sleepBetweenStartAndDuplicatedReportCheck_inMillis; From fad66929c9da4cdc30ee9d07cdad03b367e25899 Mon Sep 17 00:00:00 2001 From: jonathan Date: Thu, 23 Jan 2020 09:56:27 +0100 Subject: [PATCH 19/19] MIGENG-371 fixed typo on value injection --- src/test/java/org/jboss/xavier/integrations/EndToEndTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java index 48ade6b6..d67fe058 100644 --- a/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java +++ b/src/test/java/org/jboss/xavier/integrations/EndToEndTest.java @@ -164,7 +164,7 @@ public class EndToEndTest { @Value("${insights.kafka.host}") private String kafkaHost; - @Value("${test.sleep.startandcheckduplicated:10000") + @Value("${test.sleep.startandcheckduplicated:10000}") private long sleepBetweenStartAndDuplicatedReportCheck_inMillis;