From 2ad75b9856b97e813b5fdc14f38b4464020cbf38 Mon Sep 17 00:00:00 2001 From: nchandrappa Date: Wed, 18 Sep 2019 11:04:40 -0400 Subject: [PATCH 01/11] Updating the projects to use spring-cloud-kubernetes and made compatible with Pivotal Container Service --- .gitignore | 2 + api-gateway-microservice/Dockerfile | 5 + api-gateway-microservice/application.yml | 3 - api-gateway-microservice/deployment.yml | 33 + api-gateway-microservice/pom.xml | 54 +- api-gateway-microservice/pom.xml.bkup | 182 ++ api-gateway-microservice/services.yml | 12 + .../yugastore/YugabyteClientApplication.java | 2 + .../config/CustomRestMvcConfiguration.java | 2 + .../yugastore/config/FeignConfiguration.java | 11 + .../rest/clients/CheckoutRestClient.java | 2 +- .../clients/ProductCatalogRestClient.java | 2 +- .../rest/clients/ShoppingCartRestClient.java | 2 +- .../service/impl/CheckoutServiceRestImpl.java | 25 +- .../impl/ProductCatalogServiceRestImpl.java | 21 +- .../impl/ShoppingCartServiceRestImpl.java | 24 +- .../resources/application-kubernetes.yml\n" | 15 + .../src/main/resources/application.properties | 3 +- .../src/main/resources/application.yml | 21 + .../src/main/resources/bootstrap.yml | 9 - .../src/main/resources/bootstrap.yml.bkup | 17 + cart-microservice/Dockerfile | 5 + cart-microservice/deployment.yml | 33 + cart-microservice/pom.xml | 28 +- cart-microservice/pom.xml.bckp | 94 + cart-microservice/service.yml | 11 + .../cart/config/YugabyteDataSourceConfig.java | 21 + .../src/main/resources/application.properties | 10 +- checkout-microservice/Dockerfile | 5 + checkout-microservice/application.yml | 3 - checkout-microservice/deployment.yml | 33 + checkout-microservice/logs.txt | 1527 +++++++++++++++++ checkout-microservice/pom.xml | 44 +- checkout-microservice/pom.xml.bckp | 159 ++ checkout-microservice/services.yml | 12 + .../config/FeignConfiguration.java | 11 + .../clients/ProductCatalogRestClient.java | 2 +- .../rest/clients/ShoppingCartRestClient.java | 2 +- .../service/CheckoutServiceImpl.java | 41 +- .../src/main/resources/application.properties | 8 +- .../src/main/resources/application.yml | 21 + .../src/main/resources/bootstrap.yaml | 9 - .../src/main/resources/bootstrap.yaml.bkup | 9 + k8s-deployments/cart-ms-deployment.yml | 33 + k8s-deployments/checkout-ms-deployment.yml | 33 + k8s-deployments/default-rbac.yml | 15 + k8s-deployments/products-ms-deployment.yml | 33 + products-microservice/Dockerfile | 5 + products-microservice/deployment.yml | 33 + products-microservice/pom.xml | 57 +- products-microservice/pom.xml.bkup | 212 +++ .../yugastore/YugabyteClientApplication.java | 3 +- .../src/main/resources/application.properties | 2 +- .../src/main/resources/bootstrap.yml | 12 +- react-ui/Dockerfile | 5 + react-ui/deployment.yml | 34 + .../src/main/resources/application.properties | 3 +- resources/dataload.sh | 6 +- 58 files changed, 2869 insertions(+), 152 deletions(-) create mode 100644 api-gateway-microservice/Dockerfile delete mode 100644 api-gateway-microservice/application.yml create mode 100644 api-gateway-microservice/deployment.yml create mode 100644 api-gateway-microservice/pom.xml.bkup create mode 100644 api-gateway-microservice/services.yml create mode 100644 api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/config/FeignConfiguration.java create mode 100644 "api-gateway-microservice/src/main/resources/application-kubernetes.yml\n" create mode 100644 api-gateway-microservice/src/main/resources/application.yml delete mode 100644 api-gateway-microservice/src/main/resources/bootstrap.yml create mode 100644 api-gateway-microservice/src/main/resources/bootstrap.yml.bkup create mode 100644 cart-microservice/Dockerfile create mode 100644 cart-microservice/deployment.yml create mode 100644 cart-microservice/pom.xml.bckp create mode 100644 cart-microservice/service.yml create mode 100644 cart-microservice/src/main/java/com/yugabyte/app/yugastore/cart/config/YugabyteDataSourceConfig.java create mode 100644 checkout-microservice/Dockerfile delete mode 100644 checkout-microservice/application.yml create mode 100644 checkout-microservice/deployment.yml create mode 100644 checkout-microservice/logs.txt create mode 100644 checkout-microservice/pom.xml.bckp create mode 100644 checkout-microservice/services.yml create mode 100644 checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/config/FeignConfiguration.java create mode 100644 checkout-microservice/src/main/resources/application.yml delete mode 100644 checkout-microservice/src/main/resources/bootstrap.yaml create mode 100644 checkout-microservice/src/main/resources/bootstrap.yaml.bkup create mode 100644 k8s-deployments/cart-ms-deployment.yml create mode 100644 k8s-deployments/checkout-ms-deployment.yml create mode 100644 k8s-deployments/default-rbac.yml create mode 100644 k8s-deployments/products-ms-deployment.yml create mode 100644 products-microservice/Dockerfile create mode 100644 products-microservice/deployment.yml create mode 100644 products-microservice/pom.xml.bkup create mode 100644 react-ui/Dockerfile create mode 100644 react-ui/deployment.yml diff --git a/.gitignore b/.gitignore index 42c540f..cb61f84 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +.DS_Store +.settings/ # Compiled class file *.class diff --git a/api-gateway-microservice/Dockerfile b/api-gateway-microservice/Dockerfile new file mode 100644 index 0000000..b16e9a4 --- /dev/null +++ b/api-gateway-microservice/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:8-jdk-alpine +VOLUME /tmp +ARG JAR_FILE +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] diff --git a/api-gateway-microservice/application.yml b/api-gateway-microservice/application.yml deleted file mode 100644 index dde0567..0000000 --- a/api-gateway-microservice/application.yml +++ /dev/null @@ -1,3 +0,0 @@ -spring: - application: - name: api-gateway-microservice \ No newline at end of file diff --git a/api-gateway-microservice/deployment.yml b/api-gateway-microservice/deployment.yml new file mode 100644 index 0000000..99a39fb --- /dev/null +++ b/api-gateway-microservice/deployment.yml @@ -0,0 +1,33 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: api-gateway + labels: + app: gateway +spec: + replicas: 1 + selector: + matchLabels: + app: gateway + template: + metadata: + labels: + app: gateway + spec: + containers: + - name: gateway + image: nchandrappa/api-gateway:latest + ports: + - containerPort: 8080 +--- +apiVersion: v1 +kind: Service +metadata: + name: api-gateway +spec: + selector: + app: gateway + ports: + - protocol: TCP + port: 8080 + targetPort: 8080 diff --git a/api-gateway-microservice/pom.xml b/api-gateway-microservice/pom.xml index 78518f2..a44e744 100644 --- a/api-gateway-microservice/pom.xml +++ b/api-gateway-microservice/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.4.RELEASE + 2.1.5.RELEASE @@ -22,7 +22,7 @@ UTF-8 UTF-8 1.8 - Finchley.RELEASE + Greenwich.SR2 2.0.0.RELEASE @@ -64,11 +64,6 @@ org.springframework.boot spring-boot-devtools - - - io.pivotal.spring.cloud - spring-cloud-services-starter-config-client - org.springframework.boot @@ -100,13 +95,13 @@ - + org.springframework.cloud spring-cloud-dependencies @@ -114,16 +109,51 @@ pom import - + + + + + + org.springframework.cloud + spring-cloud-starter-kubernetes + + + + org.springframework.cloud + spring-cloud-starter-netflix-ribbon + + + org.springframework.cloud + spring-cloud-starter-kubernetes-ribbon + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + org.springframework.cloud + spring-cloud-openfeign-core + + + io.dekorate + kubernetes-spring-starter + 0.7.2 + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + org.springframework.boot spring-boot-starter-actuator diff --git a/api-gateway-microservice/pom.xml.bkup b/api-gateway-microservice/pom.xml.bkup new file mode 100644 index 0000000..78518f2 --- /dev/null +++ b/api-gateway-microservice/pom.xml.bkup @@ -0,0 +1,182 @@ + + + 4.0.0 + + com.yugabyte.app.yugastore + api-gateway-microservice + 0.0.1-SNAPSHOT + jar + + api-gateway-microservice + Gateway for all REST APIs for the retail marketplace app. + + + org.springframework.boot + spring-boot-starter-parent + 2.0.4.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + Finchley.RELEASE + 2.0.0.RELEASE + + + + + + io.pivotal.spring.cloud + spring-cloud-services-dependencies + ${spring-cloud-services.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-rest + + + com.google.code.gson + gson + + + org.springframework.boot + spring-boot-devtools + + + + io.pivotal.spring.cloud + spring-cloud-services-starter-config-client + + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + com.fasterxml.jackson.core + jackson-core + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.fasterxml.jackson.core + jackson-annotations + + + + + io.pivotal.spring.cloud + spring-cloud-services-dependencies + 2.1.2.RELEASE + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + Greenwich.RELEASE + pom + import + + + io.pivotal.spring.cloud + spring-cloud-services-starter-service-registry + 2.1.2.RELEASE + + + org.springframework.cloud + spring-cloud-starter-feign + 1.4.6.RELEASE + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + diff --git a/api-gateway-microservice/services.yml b/api-gateway-microservice/services.yml new file mode 100644 index 0000000..651be6b --- /dev/null +++ b/api-gateway-microservice/services.yml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: products-lb +spec: + type: LoadBalancer + selector: + app: products + ports: + - protocol: TCP + port: 8080 + targetPort: 8080 diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/YugabyteClientApplication.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/YugabyteClientApplication.java index 47f7b3e..81d8e77 100644 --- a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/YugabyteClientApplication.java +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/YugabyteClientApplication.java @@ -2,9 +2,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication +@EnableDiscoveryClient @EnableFeignClients public class YugabyteClientApplication { diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/config/CustomRestMvcConfiguration.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/config/CustomRestMvcConfiguration.java index ee8fa56..9474e4f 100644 --- a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/config/CustomRestMvcConfiguration.java +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/config/CustomRestMvcConfiguration.java @@ -1,7 +1,9 @@ package com.yugabyte.app.yugastore.config; +import org.springframework.cloud.openfeign.FeignClientProperties.FeignClientConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.data.rest.core.config.RepositoryRestConfiguration; import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer; import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter; diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/config/FeignConfiguration.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/config/FeignConfiguration.java new file mode 100644 index 0000000..5249c8e --- /dev/null +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/config/FeignConfiguration.java @@ -0,0 +1,11 @@ +package com.yugabyte.app.yugastore.config; + +import org.springframework.cloud.openfeign.FeignClientsConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Import(FeignClientsConfiguration.class) +@Configuration +public class FeignConfiguration { + +} diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/CheckoutRestClient.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/CheckoutRestClient.java index 89348df..3e894fa 100644 --- a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/CheckoutRestClient.java +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/CheckoutRestClient.java @@ -6,7 +6,7 @@ import com.yugabyte.app.yugastore.domain.CheckoutStatus; -@FeignClient("checkout-microservice") +//@FeignClient("checkout-microservice") @RequestMapping("/checkout-microservice") public interface CheckoutRestClient { diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ProductCatalogRestClient.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ProductCatalogRestClient.java index a93fabc..9b87231 100644 --- a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ProductCatalogRestClient.java +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ProductCatalogRestClient.java @@ -10,7 +10,7 @@ import com.yugabyte.app.yugastore.domain.ProductMetadata; import com.yugabyte.app.yugastore.domain.ProductRanking; -@FeignClient("products-microservice") +//@FeignClient("products-microservice") @RequestMapping("/products-microservice") public interface ProductCatalogRestClient { diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ShoppingCartRestClient.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ShoppingCartRestClient.java index fac5a3a..47ca4a8 100644 --- a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ShoppingCartRestClient.java +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ShoppingCartRestClient.java @@ -6,7 +6,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -@FeignClient("cart-microservice") +//@FeignClient("cart-microservice") @RequestMapping("/cart-microservice") public interface ShoppingCartRestClient { diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/CheckoutServiceRestImpl.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/CheckoutServiceRestImpl.java index 7595e44..d25876c 100644 --- a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/CheckoutServiceRestImpl.java +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/CheckoutServiceRestImpl.java @@ -1,5 +1,6 @@ package com.yugabyte.app.yugastore.service.impl; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.ScopedProxyMode; import org.springframework.stereotype.Service; @@ -7,17 +8,35 @@ import com.yugabyte.app.yugastore.domain.CheckoutStatus; import com.yugabyte.app.yugastore.rest.clients.CheckoutRestClient; +import com.yugabyte.app.yugastore.rest.clients.ProductCatalogRestClient; import com.yugabyte.app.yugastore.service.CheckoutServiceRest; +import feign.Client; +import feign.Contract; +import feign.Feign; +import feign.codec.Decoder; +import feign.codec.Encoder; + @Service @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) public class CheckoutServiceRestImpl implements CheckoutServiceRest { private final CheckoutRestClient checkoutRestClient; - public CheckoutServiceRestImpl(CheckoutRestClient checkoutRestClient) { - this.checkoutRestClient = checkoutRestClient; - } +// public CheckoutServiceRestImpl(CheckoutRestClient checkoutRestClient) { +// this.checkoutRestClient = checkoutRestClient; +// } + + @Autowired + public CheckoutServiceRestImpl(Decoder decoder, Encoder encoder, Client client, + Contract contract) { + this.checkoutRestClient = Feign.builder().client(client) + .encoder(encoder) + .decoder(decoder) + .contract(contract) + .target(CheckoutRestClient.class, + "http://checkout-microservice"); + } @Override public CheckoutStatus checkout() { diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ProductCatalogServiceRestImpl.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ProductCatalogServiceRestImpl.java index b7477f1..2dba5e5 100644 --- a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ProductCatalogServiceRestImpl.java +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ProductCatalogServiceRestImpl.java @@ -13,15 +13,32 @@ import com.yugabyte.app.yugastore.rest.clients.ProductCatalogRestClient; import com.yugabyte.app.yugastore.service.ProductCatalogServiceRest; +import feign.Client; +import feign.Contract; +import feign.Feign; +import feign.codec.Decoder; +import feign.codec.Encoder; + @Service @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) public class ProductCatalogServiceRestImpl implements ProductCatalogServiceRest { private final ProductCatalogRestClient productCatalogRestClient; +// @Autowired +// public ProductCatalogServiceRestImpl(ProductCatalogRestClient productCatalogRestClient) { +// this.productCatalogRestClient = productCatalogRestClient; +// } + @Autowired - public ProductCatalogServiceRestImpl(ProductCatalogRestClient productCatalogRestClient) { - this.productCatalogRestClient = productCatalogRestClient; + public ProductCatalogServiceRestImpl(Decoder decoder, Encoder encoder, Client client, + Contract contract) { + this.productCatalogRestClient = Feign.builder().client(client) + .encoder(encoder) + .decoder(decoder) + .contract(contract) + .target(ProductCatalogRestClient.class, + "http://products-microservice"); } @Override diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ShoppingCartServiceRestImpl.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ShoppingCartServiceRestImpl.java index 7019d72..c988746 100644 --- a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ShoppingCartServiceRestImpl.java +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ShoppingCartServiceRestImpl.java @@ -8,19 +8,37 @@ import org.springframework.stereotype.Service; import org.springframework.web.context.WebApplicationContext; +import com.yugabyte.app.yugastore.rest.clients.ProductCatalogRestClient; import com.yugabyte.app.yugastore.rest.clients.ShoppingCartRestClient; import com.yugabyte.app.yugastore.service.ShoppingCartServiceRest; +import feign.Client; +import feign.Contract; +import feign.Feign; +import feign.codec.Decoder; +import feign.codec.Encoder; + @Service @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) public class ShoppingCartServiceRestImpl implements ShoppingCartServiceRest { private final ShoppingCartRestClient shoppingCartRestClient; +// @Autowired +// public ShoppingCartServiceRestImpl(ShoppingCartRestClient shoppingCartRestClient) { +// this.shoppingCartRestClient = shoppingCartRestClient; +// } + @Autowired - public ShoppingCartServiceRestImpl(ShoppingCartRestClient shoppingCartRestClient) { - this.shoppingCartRestClient = shoppingCartRestClient; - } + public ShoppingCartServiceRestImpl(Decoder decoder, Encoder encoder, Client client, + Contract contract) { + this.shoppingCartRestClient = Feign.builder().client(client) + .encoder(encoder) + .decoder(decoder) + .contract(contract) + .target(ShoppingCartRestClient.class, + "http://cart-microservice"); + } @Override public String addProduct(String userId, String asin) { diff --git "a/api-gateway-microservice/src/main/resources/application-kubernetes.yml\n" "b/api-gateway-microservice/src/main/resources/application-kubernetes.yml\n" new file mode 100644 index 0000000..4d86454 --- /dev/null +++ "b/api-gateway-microservice/src/main/resources/application-kubernetes.yml\n" @@ -0,0 +1,15 @@ +spring: + cloud: + kubernetes: + enabled: true + reload: + enabled: true +eureka: + client: + enabled: false + +dekorate: + kubernetes: + serviceType: NodePort + imagePullPolicy: Always + group: nchandrappa \ No newline at end of file diff --git a/api-gateway-microservice/src/main/resources/application.properties b/api-gateway-microservice/src/main/resources/application.properties index 8b13789..8fadace 100644 --- a/api-gateway-microservice/src/main/resources/application.properties +++ b/api-gateway-microservice/src/main/resources/application.properties @@ -1 +1,2 @@ - +logging.level.=INFO +logging.level.project.user.UserClient: DEBUG \ No newline at end of file diff --git a/api-gateway-microservice/src/main/resources/application.yml b/api-gateway-microservice/src/main/resources/application.yml new file mode 100644 index 0000000..69f5536 --- /dev/null +++ b/api-gateway-microservice/src/main/resources/application.yml @@ -0,0 +1,21 @@ +spring: + application: + name: api-gateway-microservice + cloud: + kubernetes: + enabled: true + reload: + enabled: true + gateway: + discovery: + locator: + lowerCaseServiceId: true + enabled: true +eureka: + client: + enabled: false +dekorate: + kubernetes: + serviceType: NodePort + imagePullPolicy: Always + group: nchandrappa \ No newline at end of file diff --git a/api-gateway-microservice/src/main/resources/bootstrap.yml b/api-gateway-microservice/src/main/resources/bootstrap.yml deleted file mode 100644 index 084dfb9..0000000 --- a/api-gateway-microservice/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,9 +0,0 @@ -spring: - application: - name: api-gateway-microservice -server: - port: 8081 -eureka: - client: - serviceUrl: - defaultZone: ${EUREKA_URI:http://localhost:8761/eureka} \ No newline at end of file diff --git a/api-gateway-microservice/src/main/resources/bootstrap.yml.bkup b/api-gateway-microservice/src/main/resources/bootstrap.yml.bkup new file mode 100644 index 0000000..2d120bf --- /dev/null +++ b/api-gateway-microservice/src/main/resources/bootstrap.yml.bkup @@ -0,0 +1,17 @@ +spring: + application: + name: api-gateway-microservice + cloud: + kubernetes: + enabled: false + gateway: + discovery: + locator: + lowerCaseServiceId: true + enabled: true +#server: +# port: 8081 +#eureka: +# client: +# serviceUrl: +# defaultZone: ${EUREKA_URI:http://localhost:8761/eureka} \ No newline at end of file diff --git a/cart-microservice/Dockerfile b/cart-microservice/Dockerfile new file mode 100644 index 0000000..b16e9a4 --- /dev/null +++ b/cart-microservice/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:8-jdk-alpine +VOLUME /tmp +ARG JAR_FILE +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] diff --git a/cart-microservice/deployment.yml b/cart-microservice/deployment.yml new file mode 100644 index 0000000..db54bc9 --- /dev/null +++ b/cart-microservice/deployment.yml @@ -0,0 +1,33 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: cart-microservice + labels: + app: cart +spec: + replicas: 1 + selector: + matchLabels: + app: cart + template: + metadata: + labels: + app: cart + spec: + containers: + - name: cart + image: nchandrappa/cart-microservice:latest + ports: + - containerPort: 8083 +--- +apiVersion: v1 +kind: Service +metadata: + name: cart-service +spec: + selector: + app: cart + ports: + - protocol: TCP + port: 8080 + targetPort: 8083 \ No newline at end of file diff --git a/cart-microservice/pom.xml b/cart-microservice/pom.xml index 87a1fe4..acfb660 100644 --- a/cart-microservice/pom.xml +++ b/cart-microservice/pom.xml @@ -32,35 +32,21 @@ spring-boot-starter-web - + + 9.4-1206-jdbc42 + --> + + com.yugabyte + ysql + 42.2.7-yb-1-SNAPSHOT org.springframework.boot spring-boot-starter-test test - - io.pivotal.spring.cloud - spring-cloud-services-dependencies - 2.1.2.RELEASE - pom - import - - - org.springframework.cloud - spring-cloud-dependencies - Greenwich.RELEASE - pom - import - - - io.pivotal.spring.cloud - spring-cloud-services-starter-service-registry - 2.1.2.RELEASE - org.springframework.boot spring-boot-starter-actuator diff --git a/cart-microservice/pom.xml.bckp b/cart-microservice/pom.xml.bckp new file mode 100644 index 0000000..1e8468d --- /dev/null +++ b/cart-microservice/pom.xml.bckp @@ -0,0 +1,94 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.4.RELEASE + + + com.yugabyte.app.yugastore + cart-microservice + 0.0.1-SNAPSHOT + cart-microservice + shopping cart microservice + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-data-rest + + + org.springframework.boot + spring-boot-starter-web + + + + + com.yugabyte + ysql + 42.2.7-yb-1-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-test + test + + + io.pivotal.spring.cloud + spring-cloud-services-dependencies + 2.1.2.RELEASE + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + Greenwich.RELEASE + pom + import + + + io.pivotal.spring.cloud + spring-cloud-services-starter-service-registry + 2.1.2.RELEASE + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/cart-microservice/service.yml b/cart-microservice/service.yml new file mode 100644 index 0000000..de8e9f3 --- /dev/null +++ b/cart-microservice/service.yml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: cart-service +spec: + selector: + app: cart + ports: + - protocol: TCP + port: 8083 + targetPort: 8083 diff --git a/cart-microservice/src/main/java/com/yugabyte/app/yugastore/cart/config/YugabyteDataSourceConfig.java b/cart-microservice/src/main/java/com/yugabyte/app/yugastore/cart/config/YugabyteDataSourceConfig.java new file mode 100644 index 0000000..0e63476 --- /dev/null +++ b/cart-microservice/src/main/java/com/yugabyte/app/yugastore/cart/config/YugabyteDataSourceConfig.java @@ -0,0 +1,21 @@ +package com.yugabyte.app.yugastore.cart.config; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.yugabyte.YBClusterAwareDataSource; + +@Configuration +public class YugabyteDataSourceConfig { + + @Value("${yugabyte.sql.datasource.url}") + String jdbcUrl; + + @Bean + public DataSource getDataSource() { + return new YBClusterAwareDataSource(jdbcUrl); + } +} diff --git a/cart-microservice/src/main/resources/application.properties b/cart-microservice/src/main/resources/application.properties index fec4ed9..89a2a24 100644 --- a/cart-microservice/src/main/resources/application.properties +++ b/cart-microservice/src/main/resources/application.properties @@ -1,10 +1,12 @@ spring.jpa.database=POSTGRESQL spring.data.jpa.repositories.enabled=true -spring.datasource.url=jdbc:postgresql://127.0.0.1:5433/postgres +yugabyte.sql.datasource.url=jdbc:postgresql://10.100.200.225:5433/postgres spring.datasource.username=postgres spring.datasource.password= spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect -logging.level.org.hibernate.SQL=DEBUG -logging.level.org.hibernate.type=trace -logging.level.org.hibernate.type.descriptor.BasicBinder=TRACE +spring.jpa.hibernate.ddl-auto = update logging.level.=DEBUG +#logging.level.org.hibernate.SQL=DEBUG +#logging.level.org.hibernate.type=trace +#logging.level.org.hibernate.type.descriptor.BasicBinder=TRACE +#logging.level.=DEBUG diff --git a/checkout-microservice/Dockerfile b/checkout-microservice/Dockerfile new file mode 100644 index 0000000..b16e9a4 --- /dev/null +++ b/checkout-microservice/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:8-jdk-alpine +VOLUME /tmp +ARG JAR_FILE +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] diff --git a/checkout-microservice/application.yml b/checkout-microservice/application.yml deleted file mode 100644 index 2747771..0000000 --- a/checkout-microservice/application.yml +++ /dev/null @@ -1,3 +0,0 @@ -spring: - application: - name: checkout-microservice \ No newline at end of file diff --git a/checkout-microservice/deployment.yml b/checkout-microservice/deployment.yml new file mode 100644 index 0000000..b0a28a1 --- /dev/null +++ b/checkout-microservice/deployment.yml @@ -0,0 +1,33 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: checkout-microservice + labels: + app: checkout +spec: + replicas: 1 + selector: + matchLabels: + app: checkout + template: + metadata: + labels: + app: checkout + spec: + containers: + - name: checkout + image: nchandrappa/checkout-microservice:latest + ports: + - containerPort: 8080 +--- +apiVersion: v1 +kind: Service +metadata: + name: checkout-microservice +spec: + selector: + app: checkout + ports: + - protocol: TCP + port: 8080 + targetPort: 8080 diff --git a/checkout-microservice/logs.txt b/checkout-microservice/logs.txt new file mode 100644 index 0000000..7694b41 --- /dev/null +++ b/checkout-microservice/logs.txt @@ -0,0 +1,1527 @@ +[INFO] Scanning for projects... +[WARNING] +[WARNING] Some problems were encountered while building the effective model for com.yugabyte.app.yugastore:checkout-microservice:jar:0.0.1-SNAPSHOT +[WARNING] 'dependencies.dependency.scope' for org.springframework.cloud:spring-cloud-dependencies:pom must be one of [provided, compile, runtime, test, system] but is 'import'. @ line 85, column 20 +[WARNING] +[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build. +[WARNING] +[WARNING] For this reason, future Maven versions might no longer support building such malformed projects. +[WARNING] +[INFO] +[INFO] ----------< com.yugabyte.app.yugastore:checkout-microservice >---------- +[INFO] Building checkout-microservice 0.0.1-SNAPSHOT +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot-maven-plugin:2.1.4.RELEASE:run (default-cli) > test-compile @ checkout-microservice >>> +[INFO] +[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ checkout-microservice --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Copying 1 resource +[INFO] Copying 1 resource +[INFO] +[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ checkout-microservice --- +[INFO] Changes detected - recompiling the module! +[INFO] Compiling 18 source files to /Users/nchandrappa/Documents/2019/yb/yugastore-java/checkout-microservice/target/classes +[INFO] +[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ checkout-microservice --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] skip non existing resourceDirectory /Users/nchandrappa/Documents/2019/yb/yugastore-java/checkout-microservice/src/test/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ checkout-microservice --- +[INFO] Nothing to compile - all classes are up to date +[INFO] +[INFO] <<< spring-boot-maven-plugin:2.1.4.RELEASE:run (default-cli) < test-compile @ checkout-microservice <<< +[INFO] +[INFO] +[INFO] --- spring-boot-maven-plugin:2.1.4.RELEASE:run (default-cli) @ checkout-microservice --- +2019-09-16 11:59:07.834 INFO 28340 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$833b521d] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v2.1.4.RELEASE) + +2019-09-16 11:59:07.933 INFO 28340 --- [ main] c.y.a.y.c.CheckoutService : The following profiles are active: local +2019-09-16 11:59:08.230 INFO 28340 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode. +2019-09-16 11:59:08.238 INFO 28340 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 5ms. Found 0 repository interfaces. +2019-09-16 11:59:08.336 INFO 28340 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode. +2019-09-16 11:59:08.373 INFO 28340 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 37ms. Found 0 repository interfaces. +2019-09-16 11:59:08.375 INFO 28340 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode. +2019-09-16 11:59:08.393 INFO 28340 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 17ms. Found 2 repository interfaces. +2019-09-16 11:59:08.652 INFO 28340 --- [ main] o.s.cloud.context.scope.GenericScope : BeanFactory id=f9d3ee05-724f-3913-8a55-2e18ac6bbef3 +2019-09-16 11:59:08.671 INFO 28340 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'com.yugabyte.app.yugastore.cronoscheckoutapi.rest.clients.ProductCatalogRestClient' of type [org.springframework.cloud.openfeign.FeignClientFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2019-09-16 11:59:08.672 INFO 28340 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'com.yugabyte.app.yugastore.cronoscheckoutapi.rest.clients.ShoppingCartRestClient' of type [org.springframework.cloud.openfeign.FeignClientFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2019-09-16 11:59:08.737 INFO 28340 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.hateoas.config.HateoasConfiguration' of type [org.springframework.hateoas.config.HateoasConfiguration$$EnhancerBySpringCGLIB$$e6a19c52] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2019-09-16 11:59:08.746 INFO 28340 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$833b521d] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2019-09-16 11:59:09.031 INFO 28340 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8086 (http) +2019-09-16 11:59:09.055 INFO 28340 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2019-09-16 11:59:09.055 INFO 28340 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.17] +2019-09-16 11:59:09.338 INFO 28340 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2019-09-16 11:59:09.338 INFO 28340 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1392 ms +2019-09-16 11:59:09.675 INFO 28340 --- [ main] c.d.driver.core.GuavaCompatibility : Detected Guava >= 19 in the classpath, using modern compatibility layer +2019-09-16 11:59:09.831 INFO 28340 --- [ main] com.datastax.driver.core.ClockFactory : Using native clock to generate timestamps. +2019-09-16 11:59:09.997 INFO 28340 --- [ main] com.datastax.driver.core.NettyUtil : Did not find Netty's native epoll transport in the classpath, defaulting to NIO. +2019-09-16 11:59:10.072 WARN 28340 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'profileController' defined in URL [jar:file:/Users/nchandrappa/.m2/repository/org/springframework/data/spring-data-rest-webmvc/3.1.6.RELEASE/spring-data-rest-webmvc-3.1.6.RELEASE.jar!/org/springframework/data/rest/webmvc/ProfileController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositoryRestConfiguration' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.rest.core.config.RepositoryRestConfiguration]: Factory method 'repositoryRestConfiguration' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositories' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.repository.support.Repositories]: Factory method 'repositories' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productInventoryRepository': Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown +2019-09-16 11:59:10.073 INFO 28340 --- [ main] o.s.b.f.support.DisposableBeanAdapter : Invocation of destroy method failed on bean with name 'cluster': java.lang.NullPointerException +2019-09-16 11:59:10.074 INFO 28340 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat] +2019-09-16 11:59:10.083 INFO 28340 --- [ main] ConditionEvaluationReportLoggingListener : + +Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. +2019-09-16 11:59:10.090 ERROR 28340 --- [ main] o.s.boot.SpringApplication : Application run failed + +org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'profileController' defined in URL [jar:file:/Users/nchandrappa/.m2/repository/org/springframework/data/spring-data-rest-webmvc/3.1.6.RELEASE/spring-data-rest-webmvc-3.1.6.RELEASE.jar!/org/springframework/data/rest/webmvc/ProfileController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositoryRestConfiguration' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.rest.core.config.RepositoryRestConfiguration]: Factory method 'repositoryRestConfiguration' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositories' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.repository.support.Repositories]: Factory method 'repositories' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productInventoryRepository': Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:769) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:218) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1341) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1187) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:849) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE] + at com.yugabyte.app.yugastore.cronoscheckoutapi.CheckoutService.main(CheckoutService.java:14) [classes/:na] + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181] + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181] + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181] + at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181] + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:558) [spring-boot-maven-plugin-2.1.4.RELEASE.jar:2.1.4.RELEASE] + at java.lang.Thread.run(Thread.java:748) [na:1.8.0_181] +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositoryRestConfiguration' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.rest.core.config.RepositoryRestConfiguration]: Factory method 'repositoryRestConfiguration' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositories' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.repository.support.Repositories]: Factory method 'repositories' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productInventoryRepository': Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:627) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:456) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1321) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1160) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1247) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1167) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:857) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:760) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + ... 25 common frames omitted +Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.rest.core.config.RepositoryRestConfiguration]: Factory method 'repositoryRestConfiguration' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositories' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.repository.support.Repositories]: Factory method 'repositories' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productInventoryRepository': Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + ... 39 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositories' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.repository.support.Repositories]: Factory method 'repositories' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productInventoryRepository': Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:627) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:456) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1321) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1160) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference(ConfigurationClassEnhancer.java:394) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:366) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories() ~[spring-data-rest-webmvc-3.1.6.RELEASE.jar:3.1.6.RELEASE] + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositoryRestConfiguration(RepositoryRestMvcConfiguration.java:310) ~[spring-data-rest-webmvc-3.1.6.RELEASE.jar:3.1.6.RELEASE] + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositoryRestConfiguration$11() ~[spring-data-rest-webmvc-3.1.6.RELEASE.jar:3.1.6.RELEASE] + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke() ~[spring-data-rest-webmvc-3.1.6.RELEASE.jar:3.1.6.RELEASE] + at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositoryRestConfiguration() ~[spring-data-rest-webmvc-3.1.6.RELEASE.jar:3.1.6.RELEASE] + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181] + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181] + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181] + at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181] + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + ... 40 common frames omitted +Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.repository.support.Repositories]: Factory method 'repositories' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productInventoryRepository': Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + ... 63 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productInventoryRepository': Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:378) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:110) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1681) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1433) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1111) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.data.repository.support.Repositories.cacheRepositoryFactory(Repositories.java:97) ~[spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE] + at org.springframework.data.repository.support.Repositories.populateRepositoryFactoryInformation(Repositories.java:90) ~[spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE] + at org.springframework.data.repository.support.Repositories.(Repositories.java:83) ~[spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE] + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositories(RepositoryRestMvcConfiguration.java:242) ~[spring-data-rest-webmvc-3.1.6.RELEASE.jar:3.1.6.RELEASE] + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositories$0() ~[spring-data-rest-webmvc-3.1.6.RELEASE.jar:3.1.6.RELEASE] + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke() ~[spring-data-rest-webmvc-3.1.6.RELEASE.jar:3.1.6.RELEASE] + at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories() ~[spring-data-rest-webmvc-3.1.6.RELEASE.jar:3.1.6.RELEASE] + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181] + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181] + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181] + at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181] + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + ... 64 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:627) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:607) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1321) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1160) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:367) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + ... 88 common frames omitted +Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + ... 98 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:627) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:456) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1321) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1160) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference(ConfigurationClassEnhancer.java:394) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:366) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.sessionFactory() ~[classes/:na] + at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.cassandraTemplate(AbstractCassandraConfiguration.java:199) ~[spring-data-cassandra-2.1.6.RELEASE.jar:2.1.6.RELEASE] + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.CGLIB$cassandraTemplate$14() ~[classes/:na] + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d$$FastClassBySpringCGLIB$$448d3b42.invoke() ~[classes/:na] + at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.cassandraTemplate() ~[classes/:na] + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181] + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181] + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181] + at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181] + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + ... 99 common frames omitted +Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + ... 122 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1778) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:339) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.session() ~[classes/:na] + at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.getRequiredSession(AbstractCassandraConfiguration.java:66) ~[spring-data-cassandra-2.1.6.RELEASE.jar:2.1.6.RELEASE] + at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.sessionFactory(AbstractCassandraConfiguration.java:112) ~[spring-data-cassandra-2.1.6.RELEASE.jar:2.1.6.RELEASE] + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.CGLIB$sessionFactory$7() ~[classes/:na] + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d$$FastClassBySpringCGLIB$$448d3b42.invoke() ~[classes/:na] + at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.sessionFactory() ~[classes/:na] + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181] + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181] + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181] + at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181] + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + ... 123 common frames omitted +Caused by: com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at com.datastax.driver.core.DriverThrowables.propagateCause(DriverThrowables.java:39) ~[cassandra-driver-core-3.2.0-yb-18.jar:na] + at com.datastax.driver.core.Cluster.connect(Cluster.java:283) ~[cassandra-driver-core-3.2.0-yb-18.jar:na] + at org.springframework.data.cassandra.config.CassandraCqlSessionFactoryBean.connect(CassandraCqlSessionFactoryBean.java:89) ~[spring-data-cassandra-2.1.6.RELEASE.jar:2.1.6.RELEASE] + at org.springframework.data.cassandra.config.CassandraCqlSessionFactoryBean.afterPropertiesSet(CassandraCqlSessionFactoryBean.java:82) ~[spring-data-cassandra-2.1.6.RELEASE.jar:2.1.6.RELEASE] + at org.springframework.data.cassandra.config.CassandraSessionFactoryBean.afterPropertiesSet(CassandraSessionFactoryBean.java:59) ~[spring-data-cassandra-2.1.6.RELEASE.jar:2.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] + ... 143 common frames omitted +Caused by: java.lang.NullPointerException: null + at com.datastax.driver.core.RequestHandler.(RequestHandler.java:91) ~[cassandra-driver-core-3.2.0-yb-18.jar:na] + at com.datastax.driver.core.SessionManager.executeAsync(SessionManager.java:132) ~[cassandra-driver-core-3.2.0-yb-18.jar:na] + at com.datastax.driver.core.AbstractSession.executeAsync(AbstractSession.java:76) ~[cassandra-driver-core-3.2.0-yb-18.jar:na] + at com.datastax.driver.core.Cluster$1.apply(Cluster.java:341) ~[cassandra-driver-core-3.2.0-yb-18.jar:na] + at com.datastax.driver.core.Cluster$1.apply(Cluster.java:338) ~[cassandra-driver-core-3.2.0-yb-18.jar:na] + at com.google.common.util.concurrent.Futures$AsyncChainingFuture.doTransform(Futures.java:1442) ~[guava-19.0.jar:na] + at com.google.common.util.concurrent.Futures$AsyncChainingFuture.doTransform(Futures.java:1433) ~[guava-19.0.jar:na] + at com.google.common.util.concurrent.Futures$AbstractChainingFuture.run(Futures.java:1408) ~[guava-19.0.jar:na] + at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:456) ~[guava-19.0.jar:na] + at com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:817) ~[guava-19.0.jar:na] + at com.google.common.util.concurrent.AbstractFuture.addListener(AbstractFuture.java:595) ~[guava-19.0.jar:na] + at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.addListener(AbstractFuture.java:96) ~[guava-19.0.jar:na] + at com.google.common.util.concurrent.Futures.transformAsync(Futures.java:1108) ~[guava-19.0.jar:na] + at com.datastax.driver.core.GuavaCompatibility$Version19OrHigher.transformAsync(GuavaCompatibility.java:205) ~[cassandra-driver-core-3.2.0-yb-18.jar:na] + at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:338) ~[cassandra-driver-core-3.2.0-yb-18.jar:na] + at com.datastax.driver.core.Cluster.connect(Cluster.java:281) ~[cassandra-driver-core-3.2.0-yb-18.jar:na] + ... 148 common frames omitted + +[WARNING] +java.lang.reflect.InvocationTargetException + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558) + at java.lang.Thread.run (Thread.java:748) +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'profileController' defined in URL [jar:file:/Users/nchandrappa/.m2/repository/org/springframework/data/spring-data-rest-webmvc/3.1.6.RELEASE/spring-data-rest-webmvc-3.1.6.RELEASE.jar!/org/springframework/data/rest/webmvc/ProfileController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositoryRestConfiguration' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.rest.core.config.RepositoryRestConfiguration]: Factory method 'repositoryRestConfiguration' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositories' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.repository.support.Repositories]: Factory method 'repositories' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productInventoryRepository': Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:769) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:218) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1341) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1187) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:849) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:877) + at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142) + at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) + at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:316) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248) + at com.yugabyte.app.yugastore.cronoscheckoutapi.CheckoutService.main (CheckoutService.java:14) + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558) + at java.lang.Thread.run (Thread.java:748) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositoryRestConfiguration' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.rest.core.config.RepositoryRestConfiguration]: Factory method 'repositoryRestConfiguration' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositories' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.repository.support.Repositories]: Factory method 'repositories' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productInventoryRepository': Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:627) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate (DependencyDescriptor.java:277) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:1247) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1167) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument (ConstructorResolver.java:857) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:760) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:218) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1341) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1187) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:849) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:877) + at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142) + at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) + at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:316) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248) + at com.yugabyte.app.yugastore.cronoscheckoutapi.CheckoutService.main (CheckoutService.java:14) + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558) + at java.lang.Thread.run (Thread.java:748) +Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.rest.core.config.RepositoryRestConfiguration]: Factory method 'repositoryRestConfiguration' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositories' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.repository.support.Repositories]: Factory method 'repositories' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productInventoryRepository': Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:185) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate (DependencyDescriptor.java:277) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:1247) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1167) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument (ConstructorResolver.java:857) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:760) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:218) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1341) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1187) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:849) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:877) + at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142) + at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) + at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:316) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248) + at com.yugabyte.app.yugastore.cronoscheckoutapi.CheckoutService.main (CheckoutService.java:14) + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558) + at java.lang.Thread.run (Thread.java:748) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositories' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.repository.support.Repositories]: Factory method 'repositories' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productInventoryRepository': Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:627) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositoryRestConfiguration (RepositoryRestMvcConfiguration.java:310) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositoryRestConfiguration$11 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositoryRestConfiguration () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate (DependencyDescriptor.java:277) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:1247) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1167) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument (ConstructorResolver.java:857) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:760) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:218) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1341) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1187) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:849) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:877) + at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142) + at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) + at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:316) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248) + at com.yugabyte.app.yugastore.cronoscheckoutapi.CheckoutService.main (CheckoutService.java:14) + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558) + at java.lang.Thread.run (Thread.java:748) +Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.repository.support.Repositories]: Factory method 'repositories' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productInventoryRepository': Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:185) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositoryRestConfiguration (RepositoryRestMvcConfiguration.java:310) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositoryRestConfiguration$11 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositoryRestConfiguration () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate (DependencyDescriptor.java:277) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:1247) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1167) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument (ConstructorResolver.java:857) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:760) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:218) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1341) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1187) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:849) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:877) + at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142) + at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) + at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:316) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248) + at com.yugabyte.app.yugastore.cronoscheckoutapi.CheckoutService.main (CheckoutService.java:14) + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558) + at java.lang.Thread.run (Thread.java:748) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productInventoryRepository': Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference (BeanDefinitionValueResolver.java:378) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary (BeanDefinitionValueResolver.java:110) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues (AbstractAutowireCapableBeanFactory.java:1681) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1433) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:592) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:204) + at org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1111) + at org.springframework.data.repository.support.Repositories.cacheRepositoryFactory (Repositories.java:97) + at org.springframework.data.repository.support.Repositories.populateRepositoryFactoryInformation (Repositories.java:90) + at org.springframework.data.repository.support.Repositories. (Repositories.java:83) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositories (RepositoryRestMvcConfiguration.java:242) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositories$0 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositoryRestConfiguration (RepositoryRestMvcConfiguration.java:310) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositoryRestConfiguration$11 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositoryRestConfiguration () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate (DependencyDescriptor.java:277) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:1247) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1167) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument (ConstructorResolver.java:857) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:760) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:218) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1341) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1187) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:849) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:877) + at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142) + at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) + at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:316) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248) + at com.yugabyte.app.yugastore.cronoscheckoutapi.CheckoutService.main (CheckoutService.java:14) + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558) + at java.lang.Thread.run (Thread.java:748) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraTemplate' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:627) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:607) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference (BeanDefinitionValueResolver.java:367) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary (BeanDefinitionValueResolver.java:110) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues (AbstractAutowireCapableBeanFactory.java:1681) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1433) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:592) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:204) + at org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1111) + at org.springframework.data.repository.support.Repositories.cacheRepositoryFactory (Repositories.java:97) + at org.springframework.data.repository.support.Repositories.populateRepositoryFactoryInformation (Repositories.java:90) + at org.springframework.data.repository.support.Repositories. (Repositories.java:83) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositories (RepositoryRestMvcConfiguration.java:242) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositories$0 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositoryRestConfiguration (RepositoryRestMvcConfiguration.java:310) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositoryRestConfiguration$11 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositoryRestConfiguration () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate (DependencyDescriptor.java:277) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:1247) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1167) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument (ConstructorResolver.java:857) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:760) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:218) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1341) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1187) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:849) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:877) + at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142) + at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) + at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:316) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248) + at com.yugabyte.app.yugastore.cronoscheckoutapi.CheckoutService.main (CheckoutService.java:14) + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558) + at java.lang.Thread.run (Thread.java:748) +Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.core.CassandraAdminTemplate]: Factory method 'cassandraTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:185) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:607) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference (BeanDefinitionValueResolver.java:367) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary (BeanDefinitionValueResolver.java:110) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues (AbstractAutowireCapableBeanFactory.java:1681) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1433) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:592) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:204) + at org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1111) + at org.springframework.data.repository.support.Repositories.cacheRepositoryFactory (Repositories.java:97) + at org.springframework.data.repository.support.Repositories.populateRepositoryFactoryInformation (Repositories.java:90) + at org.springframework.data.repository.support.Repositories. (Repositories.java:83) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositories (RepositoryRestMvcConfiguration.java:242) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositories$0 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositoryRestConfiguration (RepositoryRestMvcConfiguration.java:310) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositoryRestConfiguration$11 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositoryRestConfiguration () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate (DependencyDescriptor.java:277) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:1247) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1167) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument (ConstructorResolver.java:857) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:760) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:218) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1341) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1187) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:849) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:877) + at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142) + at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) + at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:316) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248) + at com.yugabyte.app.yugastore.cronoscheckoutapi.CheckoutService.main (CheckoutService.java:14) + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558) + at java.lang.Thread.run (Thread.java:748) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:627) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.sessionFactory () + at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.cassandraTemplate (AbstractCassandraConfiguration.java:199) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.CGLIB$cassandraTemplate$14 () + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d$$FastClassBySpringCGLIB$$448d3b42.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.cassandraTemplate () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:607) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference (BeanDefinitionValueResolver.java:367) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary (BeanDefinitionValueResolver.java:110) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues (AbstractAutowireCapableBeanFactory.java:1681) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1433) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:592) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:204) + at org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1111) + at org.springframework.data.repository.support.Repositories.cacheRepositoryFactory (Repositories.java:97) + at org.springframework.data.repository.support.Repositories.populateRepositoryFactoryInformation (Repositories.java:90) + at org.springframework.data.repository.support.Repositories. (Repositories.java:83) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositories (RepositoryRestMvcConfiguration.java:242) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositories$0 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositoryRestConfiguration (RepositoryRestMvcConfiguration.java:310) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositoryRestConfiguration$11 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositoryRestConfiguration () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate (DependencyDescriptor.java:277) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:1247) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1167) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument (ConstructorResolver.java:857) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:760) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:218) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1341) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1187) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:849) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:877) + at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142) + at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) + at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:316) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248) + at com.yugabyte.app.yugastore.cronoscheckoutapi.CheckoutService.main (CheckoutService.java:14) + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558) + at java.lang.Thread.run (Thread.java:748) +Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:185) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.sessionFactory () + at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.cassandraTemplate (AbstractCassandraConfiguration.java:199) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.CGLIB$cassandraTemplate$14 () + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d$$FastClassBySpringCGLIB$$448d3b42.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.cassandraTemplate () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:607) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference (BeanDefinitionValueResolver.java:367) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary (BeanDefinitionValueResolver.java:110) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues (AbstractAutowireCapableBeanFactory.java:1681) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1433) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:592) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:204) + at org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1111) + at org.springframework.data.repository.support.Repositories.cacheRepositoryFactory (Repositories.java:97) + at org.springframework.data.repository.support.Repositories.populateRepositoryFactoryInformation (Repositories.java:90) + at org.springframework.data.repository.support.Repositories. (Repositories.java:83) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositories (RepositoryRestMvcConfiguration.java:242) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositories$0 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositoryRestConfiguration (RepositoryRestMvcConfiguration.java:310) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositoryRestConfiguration$11 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositoryRestConfiguration () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate (DependencyDescriptor.java:277) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:1247) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1167) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument (ConstructorResolver.java:857) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:760) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:218) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1341) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1187) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:849) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:877) + at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142) + at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) + at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:316) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248) + at com.yugabyte.app.yugastore.cronoscheckoutapi.CheckoutService.main (CheckoutService.java:14) + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558) + at java.lang.Thread.run (Thread.java:748) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig$CassandraConfig.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1778) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:593) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:339) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.session () + at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.getRequiredSession (AbstractCassandraConfiguration.java:66) + at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.sessionFactory (AbstractCassandraConfiguration.java:112) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.CGLIB$sessionFactory$7 () + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d$$FastClassBySpringCGLIB$$448d3b42.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.sessionFactory () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.sessionFactory () + at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.cassandraTemplate (AbstractCassandraConfiguration.java:199) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.CGLIB$cassandraTemplate$14 () + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d$$FastClassBySpringCGLIB$$448d3b42.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.cassandraTemplate () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:607) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference (BeanDefinitionValueResolver.java:367) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary (BeanDefinitionValueResolver.java:110) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues (AbstractAutowireCapableBeanFactory.java:1681) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1433) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:592) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:204) + at org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1111) + at org.springframework.data.repository.support.Repositories.cacheRepositoryFactory (Repositories.java:97) + at org.springframework.data.repository.support.Repositories.populateRepositoryFactoryInformation (Repositories.java:90) + at org.springframework.data.repository.support.Repositories. (Repositories.java:83) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositories (RepositoryRestMvcConfiguration.java:242) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositories$0 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositoryRestConfiguration (RepositoryRestMvcConfiguration.java:310) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositoryRestConfiguration$11 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositoryRestConfiguration () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate (DependencyDescriptor.java:277) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:1247) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1167) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument (ConstructorResolver.java:857) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:760) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:218) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1341) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1187) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:849) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:877) + at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142) + at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) + at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:316) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248) + at com.yugabyte.app.yugastore.cronoscheckoutapi.CheckoutService.main (CheckoutService.java:14) + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558) + at java.lang.Thread.run (Thread.java:748) +Caused by: com.datastax.driver.core.exceptions.DriverInternalError: Unexpected exception thrown + at com.datastax.driver.core.DriverThrowables.propagateCause (DriverThrowables.java:39) + at com.datastax.driver.core.Cluster.connect (Cluster.java:283) + at org.springframework.data.cassandra.config.CassandraCqlSessionFactoryBean.connect (CassandraCqlSessionFactoryBean.java:89) + at org.springframework.data.cassandra.config.CassandraCqlSessionFactoryBean.afterPropertiesSet (CassandraCqlSessionFactoryBean.java:82) + at org.springframework.data.cassandra.config.CassandraSessionFactoryBean.afterPropertiesSet (CassandraSessionFactoryBean.java:59) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java:1837) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1774) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:593) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:339) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.session () + at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.getRequiredSession (AbstractCassandraConfiguration.java:66) + at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.sessionFactory (AbstractCassandraConfiguration.java:112) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.CGLIB$sessionFactory$7 () + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d$$FastClassBySpringCGLIB$$448d3b42.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.sessionFactory () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.sessionFactory () + at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.cassandraTemplate (AbstractCassandraConfiguration.java:199) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.CGLIB$cassandraTemplate$14 () + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d$$FastClassBySpringCGLIB$$448d3b42.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.cassandraTemplate () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:607) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference (BeanDefinitionValueResolver.java:367) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary (BeanDefinitionValueResolver.java:110) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues (AbstractAutowireCapableBeanFactory.java:1681) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1433) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:592) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:204) + at org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1111) + at org.springframework.data.repository.support.Repositories.cacheRepositoryFactory (Repositories.java:97) + at org.springframework.data.repository.support.Repositories.populateRepositoryFactoryInformation (Repositories.java:90) + at org.springframework.data.repository.support.Repositories. (Repositories.java:83) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositories (RepositoryRestMvcConfiguration.java:242) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositories$0 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositoryRestConfiguration (RepositoryRestMvcConfiguration.java:310) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositoryRestConfiguration$11 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositoryRestConfiguration () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate (DependencyDescriptor.java:277) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:1247) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1167) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument (ConstructorResolver.java:857) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:760) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:218) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1341) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1187) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:849) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:877) + at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142) + at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) + at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:316) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248) + at com.yugabyte.app.yugastore.cronoscheckoutapi.CheckoutService.main (CheckoutService.java:14) + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558) + at java.lang.Thread.run (Thread.java:748) +Caused by: java.lang.NullPointerException + at com.datastax.driver.core.RequestHandler. (RequestHandler.java:91) + at com.datastax.driver.core.SessionManager.executeAsync (SessionManager.java:132) + at com.datastax.driver.core.AbstractSession.executeAsync (AbstractSession.java:76) + at com.datastax.driver.core.Cluster$1.apply (Cluster.java:341) + at com.datastax.driver.core.Cluster$1.apply (Cluster.java:338) + at com.google.common.util.concurrent.Futures$AsyncChainingFuture.doTransform (Futures.java:1442) + at com.google.common.util.concurrent.Futures$AsyncChainingFuture.doTransform (Futures.java:1433) + at com.google.common.util.concurrent.Futures$AbstractChainingFuture.run (Futures.java:1408) + at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute (MoreExecutors.java:456) + at com.google.common.util.concurrent.AbstractFuture.executeListener (AbstractFuture.java:817) + at com.google.common.util.concurrent.AbstractFuture.addListener (AbstractFuture.java:595) + at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.addListener (AbstractFuture.java:96) + at com.google.common.util.concurrent.Futures.transformAsync (Futures.java:1108) + at com.datastax.driver.core.GuavaCompatibility$Version19OrHigher.transformAsync (GuavaCompatibility.java:205) + at com.datastax.driver.core.Cluster.connectAsync (Cluster.java:338) + at com.datastax.driver.core.Cluster.connect (Cluster.java:281) + at org.springframework.data.cassandra.config.CassandraCqlSessionFactoryBean.connect (CassandraCqlSessionFactoryBean.java:89) + at org.springframework.data.cassandra.config.CassandraCqlSessionFactoryBean.afterPropertiesSet (CassandraCqlSessionFactoryBean.java:82) + at org.springframework.data.cassandra.config.CassandraSessionFactoryBean.afterPropertiesSet (CassandraSessionFactoryBean.java:59) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java:1837) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1774) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:593) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:339) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.session () + at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.getRequiredSession (AbstractCassandraConfiguration.java:66) + at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.sessionFactory (AbstractCassandraConfiguration.java:112) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.CGLIB$sessionFactory$7 () + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d$$FastClassBySpringCGLIB$$448d3b42.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.sessionFactory () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.sessionFactory () + at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.cassandraTemplate (AbstractCassandraConfiguration.java:199) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.CGLIB$cassandraTemplate$14 () + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d$$FastClassBySpringCGLIB$$448d3b42.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at com.yugabyte.app.yugastore.cronoscheckoutapi.config.YugabyteLocalConfig$CassandraConfig$$EnhancerBySpringCGLIB$$3663ed2d.cassandraTemplate () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:607) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference (BeanDefinitionValueResolver.java:367) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary (BeanDefinitionValueResolver.java:110) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues (AbstractAutowireCapableBeanFactory.java:1681) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1433) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:592) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:204) + at org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1111) + at org.springframework.data.repository.support.Repositories.cacheRepositoryFactory (Repositories.java:97) + at org.springframework.data.repository.support.Repositories.populateRepositoryFactoryInformation (Repositories.java:90) + at org.springframework.data.repository.support.Repositories. (Repositories.java:83) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositories (RepositoryRestMvcConfiguration.java:242) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositories$0 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference (ConfigurationClassEnhancer.java:394) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:366) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositories () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.repositoryRestConfiguration (RepositoryRestMvcConfiguration.java:310) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.CGLIB$repositoryRestConfiguration$11 () + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0$$FastClassBySpringCGLIB$$575e409b.invoke () + at org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) + at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:363) + at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$$EnhancerBySpringCGLIB$$88246dc0.repositoryRestConfiguration () + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:154) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:622) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:456) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:1321) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1160) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate (DependencyDescriptor.java:277) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:1247) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1167) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument (ConstructorResolver.java:857) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:760) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:218) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1341) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1187) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:515) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:320) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:849) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:877) + at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142) + at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) + at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:316) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260) + at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248) + at com.yugabyte.app.yugastore.cronoscheckoutapi.CheckoutService.main (CheckoutService.java:14) + at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke (Method.java:498) + at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558) + at java.lang.Thread.run (Thread.java:748) diff --git a/checkout-microservice/pom.xml b/checkout-microservice/pom.xml index c48b386..e65213d 100644 --- a/checkout-microservice/pom.xml +++ b/checkout-microservice/pom.xml @@ -70,13 +70,13 @@ spring-boot-starter-test test - + org.springframework.cloud spring-cloud-dependencies @@ -84,16 +84,46 @@ pom import - + + + + + + org.springframework.cloud + spring-cloud-starter-kubernetes + 0.3.0.BUILD-SNAPSHOT + + + org.springframework.cloud + spring-cloud-starter-netflix-ribbon + + + org.springframework.cloud + spring-cloud-starter-kubernetes-ribbon + 0.3.0.BUILD-SNAPSHOT + + org.springframework.cloud - spring-cloud-starter-feign - 1.4.6.RELEASE + spring-cloud-starter-openfeign + + + org.springframework.cloud + spring-cloud-openfeign-core + + io.dekorate + kubernetes-spring-starter + 0.7.2 + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + org.springframework.boot spring-boot-starter-actuator diff --git a/checkout-microservice/pom.xml.bckp b/checkout-microservice/pom.xml.bckp new file mode 100644 index 0000000..c48b386 --- /dev/null +++ b/checkout-microservice/pom.xml.bckp @@ -0,0 +1,159 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.0.4.RELEASE + + + com.yugabyte.app.yugastore + checkout-microservice + 0.0.1-SNAPSHOT + checkout-microservice + The microservice that powers checkout of products by users in YugaStore + + + UTF-8 + UTF-8 + 1.8 + Finchley.RELEASE + 2.0.0.RELEASE + + + + + + io.pivotal.spring.cloud + spring-cloud-services-dependencies + ${spring-cloud-services.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + org.springframework.boot + spring-boot-starter-data-cassandra + + + com.datastax.cassandra + cassandra-driver-core + + + + + com.yugabyte + cassandra-driver-core + 3.2.0-yb-18 + + + org.springframework.boot + spring-boot-starter-data-rest + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + io.pivotal.spring.cloud + spring-cloud-services-dependencies + 2.1.2.RELEASE + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + Greenwich.RELEASE + pom + import + + + io.pivotal.spring.cloud + spring-cloud-services-starter-service-registry + 2.1.2.RELEASE + + + org.springframework.cloud + spring-cloud-starter-feign + 1.4.6.RELEASE + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-security + + + + + + repository.spring.release + Spring GA Repository + http://repo.spring.io/release + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/checkout-microservice/services.yml b/checkout-microservice/services.yml new file mode 100644 index 0000000..77e6a37 --- /dev/null +++ b/checkout-microservice/services.yml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: checkout-microservice-lb +spec: + type: LoadBalancer + selector: + app: checkout + ports: + - protocol: TCP + port: 8080 + targetPort: 8080 \ No newline at end of file diff --git a/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/config/FeignConfiguration.java b/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/config/FeignConfiguration.java new file mode 100644 index 0000000..2883784 --- /dev/null +++ b/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/config/FeignConfiguration.java @@ -0,0 +1,11 @@ +package com.yugabyte.app.yugastore.cronoscheckoutapi.config; + +import org.springframework.cloud.openfeign.FeignClientsConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Import(FeignClientsConfiguration.class) +@Configuration +public class FeignConfiguration { + +} diff --git a/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/rest/clients/ProductCatalogRestClient.java b/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/rest/clients/ProductCatalogRestClient.java index d87bdbd..4552e41 100644 --- a/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/rest/clients/ProductCatalogRestClient.java +++ b/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/rest/clients/ProductCatalogRestClient.java @@ -10,7 +10,7 @@ import com.yugabyte.app.yugastore.cronoscheckoutapi.domain.ProductMetadata; import com.yugabyte.app.yugastore.cronoscheckoutapi.domain.ProductRanking; -@FeignClient("products-microservice") +//@FeignClient("products-microservice") @RequestMapping("/products-microservice") public interface ProductCatalogRestClient { diff --git a/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/rest/clients/ShoppingCartRestClient.java b/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/rest/clients/ShoppingCartRestClient.java index 047801d..b290fd5 100644 --- a/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/rest/clients/ShoppingCartRestClient.java +++ b/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/rest/clients/ShoppingCartRestClient.java @@ -6,7 +6,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -@FeignClient("cart-microservice") +//@FeignClient("cart-microservice") @RequestMapping("/cart-microservice") public interface ShoppingCartRestClient { diff --git a/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/service/CheckoutServiceImpl.java b/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/service/CheckoutServiceImpl.java index b03e962..0bdcdc3 100644 --- a/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/service/CheckoutServiceImpl.java +++ b/checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/service/CheckoutServiceImpl.java @@ -20,6 +20,12 @@ import com.yugabyte.app.yugastore.cronoscheckoutapi.rest.clients.ProductCatalogRestClient; import com.yugabyte.app.yugastore.cronoscheckoutapi.rest.clients.ShoppingCartRestClient; +import feign.Client; +import feign.Contract; +import feign.Feign; +import feign.codec.Decoder; +import feign.codec.Encoder; + @Service @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) @@ -32,14 +38,33 @@ public class CheckoutServiceImpl { ProductInventory productInventory; ProductMetadata productDetails; - - @Autowired - public CheckoutServiceImpl(ProductInventoryRepository productInventoryRepository, - ShoppingCartRestClient shoppingCartRestClient, ProductCatalogRestClient productCatalogRestClient) { - this.productInventoryRepository = productInventoryRepository; - this.shoppingCartRestClient = shoppingCartRestClient; - this.productCatalogRestClient = productCatalogRestClient; - } + + @Autowired + public CheckoutServiceImpl (ProductInventoryRepository productInventoryRepository, + Decoder decoder, Encoder encoder, Client client, + Contract contract) { + this.productInventoryRepository = productInventoryRepository; + this.shoppingCartRestClient = Feign.builder().client(client) + .encoder(encoder) + .decoder(decoder) + .contract(contract) + .target(ShoppingCartRestClient.class, + "http://cart-microservice"); + this.productCatalogRestClient = Feign.builder().client(client) + .encoder(encoder) + .decoder(decoder) + .contract(contract) + .target(ProductCatalogRestClient.class, + "http://products-microservice"); + } + +// @Autowired +// public CheckoutServiceImpl(ProductInventoryRepository productInventoryRepository, +// ShoppingCartRestClient shoppingCartRestClient, ProductCatalogRestClient productCatalogRestClient) { +// this.productInventoryRepository = productInventoryRepository; +// this.shoppingCartRestClient = shoppingCartRestClient; +// this.productCatalogRestClient = productCatalogRestClient; +// } @Autowired private CassandraOperations cassandraTemplate; diff --git a/checkout-microservice/src/main/resources/application.properties b/checkout-microservice/src/main/resources/application.properties index b1cb85d..f2b9ed4 100644 --- a/checkout-microservice/src/main/resources/application.properties +++ b/checkout-microservice/src/main/resources/application.properties @@ -1,5 +1,7 @@ cronos.yugabyte.keyspace=cronos -cronos.yugabyte.hostname=127.0.0.1 +cronos.yugabyte.hostname=10.100.200.225 +#cronos.yugabyte.hostname=127.0.0.1 cronos.yugabyte.port=9042 -spring.profiles.active=local -server.port=8086 +spring.profiles.active=cloud +#spring.profiles.active=local +#server.port=8086 diff --git a/checkout-microservice/src/main/resources/application.yml b/checkout-microservice/src/main/resources/application.yml new file mode 100644 index 0000000..25f44cc --- /dev/null +++ b/checkout-microservice/src/main/resources/application.yml @@ -0,0 +1,21 @@ +spring: + application: + name: checkout-microservice + cloud: + kubernetes: + enabled: true + reload: + enabled: true + gateway: + discovery: + locator: + lowerCaseServiceId: true + enabled: true +eureka: + client: + enabled: false +dekorate: + kubernetes: + serviceType: NodePort + imagePullPolicy: Always + group: nchandrappa \ No newline at end of file diff --git a/checkout-microservice/src/main/resources/bootstrap.yaml b/checkout-microservice/src/main/resources/bootstrap.yaml deleted file mode 100644 index 1c0bd93..0000000 --- a/checkout-microservice/src/main/resources/bootstrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -spring: - application: - name: checkout-microservice -server: - port: 8083 -eureka: - client: - serviceUrl: - defaultZone: ${EUREKA_URI:http://localhost:8761/eureka} \ No newline at end of file diff --git a/checkout-microservice/src/main/resources/bootstrap.yaml.bkup b/checkout-microservice/src/main/resources/bootstrap.yaml.bkup new file mode 100644 index 0000000..49ac4f2 --- /dev/null +++ b/checkout-microservice/src/main/resources/bootstrap.yaml.bkup @@ -0,0 +1,9 @@ +spring: + application: + name: checkout-microservice +#server: +# port: 8083 +#eureka: +# client: +# serviceUrl: +# defaultZone: ${EUREKA_URI:http://localhost:8761/eureka} \ No newline at end of file diff --git a/k8s-deployments/cart-ms-deployment.yml b/k8s-deployments/cart-ms-deployment.yml new file mode 100644 index 0000000..8254a66 --- /dev/null +++ b/k8s-deployments/cart-ms-deployment.yml @@ -0,0 +1,33 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: cart-microservice + labels: + app: cart +spec: + replicas: 1 + selector: + matchLabels: + app: cart + template: + metadata: + labels: + app: cart + spec: + containers: + - name: cart + image: nchandrappa/cart-microservice:latest + ports: + - containerPort: 8080 +--- +apiVersion: v1 +kind: Service +metadata: + name: cart-microservice +spec: + selector: + app: cart + ports: + - protocol: TCP + port: 8080 + targetPort: 8080 \ No newline at end of file diff --git a/k8s-deployments/checkout-ms-deployment.yml b/k8s-deployments/checkout-ms-deployment.yml new file mode 100644 index 0000000..b0a28a1 --- /dev/null +++ b/k8s-deployments/checkout-ms-deployment.yml @@ -0,0 +1,33 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: checkout-microservice + labels: + app: checkout +spec: + replicas: 1 + selector: + matchLabels: + app: checkout + template: + metadata: + labels: + app: checkout + spec: + containers: + - name: checkout + image: nchandrappa/checkout-microservice:latest + ports: + - containerPort: 8080 +--- +apiVersion: v1 +kind: Service +metadata: + name: checkout-microservice +spec: + selector: + app: checkout + ports: + - protocol: TCP + port: 8080 + targetPort: 8080 diff --git a/k8s-deployments/default-rbac.yml b/k8s-deployments/default-rbac.yml new file mode 100644 index 0000000..748ec2d --- /dev/null +++ b/k8s-deployments/default-rbac.yml @@ -0,0 +1,15 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRoleBinding +metadata: + name: default-rbac +subjects: + - kind: ServiceAccount + # Reference to upper's `metadata.name` + name: default + # Reference to upper's `metadata.namespace` + namespace: yb-dev-yugastore-yb-cluster +roleRef: + kind: ClusterRole + name: cluster-admin + apiGroup: rbac.authorization.k8s.io diff --git a/k8s-deployments/products-ms-deployment.yml b/k8s-deployments/products-ms-deployment.yml new file mode 100644 index 0000000..f50533c --- /dev/null +++ b/k8s-deployments/products-ms-deployment.yml @@ -0,0 +1,33 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: products-microservice + labels: + app: products +spec: + replicas: 1 + selector: + matchLabels: + app: products + template: + metadata: + labels: + app: products + spec: + containers: + - name: products + image: nchandrappa/products-microservice:latest + ports: + - containerPort: 8080 +--- +apiVersion: v1 +kind: Service +metadata: + name: products-microservice +spec: + selector: + app: products + ports: + - protocol: TCP + port: 8080 + targetPort: 8080 diff --git a/products-microservice/Dockerfile b/products-microservice/Dockerfile new file mode 100644 index 0000000..b16e9a4 --- /dev/null +++ b/products-microservice/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:8-jdk-alpine +VOLUME /tmp +ARG JAR_FILE +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] diff --git a/products-microservice/deployment.yml b/products-microservice/deployment.yml new file mode 100644 index 0000000..0f494df --- /dev/null +++ b/products-microservice/deployment.yml @@ -0,0 +1,33 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: products-microservice + labels: + app: products +spec: + replicas: 1 + selector: + matchLabels: + app: products + template: + metadata: + labels: + app: products + spec: + containers: + - name: products + image: nchandrappa/products-microservice:latest + ports: + - containerPort: 8082 +--- +apiVersion: v1 +kind: Service +metadata: + name: products-service +spec: + selector: + app: products + ports: + - protocol: TCP + port: 8080 + targetPort: 8082 \ No newline at end of file diff --git a/products-microservice/pom.xml b/products-microservice/pom.xml index 7e30f39..97199dc 100644 --- a/products-microservice/pom.xml +++ b/products-microservice/pom.xml @@ -73,11 +73,6 @@ org.springframework.boot spring-boot-devtools - - - io.pivotal.spring.cloud - spring-cloud-services-starter-config-client - org.springframework.boot @@ -112,52 +107,22 @@ - - com.fasterxml.jackson.core - jackson-core - + + com.fasterxml.jackson.core + jackson-core + - - com.fasterxml.jackson.core - jackson-databind - + + com.fasterxml.jackson.core + jackson-databind + - - com.fasterxml.jackson.core - jackson-annotations - - - - - io.pivotal.spring.cloud - spring-cloud-services-dependencies - 2.1.2.RELEASE - pom - import - - - org.springframework.cloud - spring-cloud-dependencies - Greenwich.RELEASE - pom - import + + com.fasterxml.jackson.core + jackson-annotations - - io.pivotal.spring.cloud - spring-cloud-services-starter-service-registry - 2.1.2.RELEASE - - - org.springframework.cloud - spring-cloud-starter-feign - 1.4.6.RELEASE - - - org.springframework.boot - spring-boot-starter-actuator - diff --git a/products-microservice/pom.xml.bkup b/products-microservice/pom.xml.bkup new file mode 100644 index 0000000..7e30f39 --- /dev/null +++ b/products-microservice/pom.xml.bkup @@ -0,0 +1,212 @@ + + + 4.0.0 + + com.yugabyte.app.yugastore + products-microservice + 0.0.1-SNAPSHOT + jar + + products-microservice + Microservice that powers the product listings and details. + + + org.springframework.boot + spring-boot-starter-parent + 2.0.4.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + Finchley.RELEASE + 2.0.0.RELEASE + + + + + + io.pivotal.spring.cloud + spring-cloud-services-dependencies + ${spring-cloud-services.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + org.springframework.boot + spring-boot-starter-data-cassandra + + + com.datastax.cassandra + cassandra-driver-core + + + + + com.yugabyte + cassandra-driver-core + 3.2.0-yb-18 + + + org.springframework.boot + spring-boot-starter-data-rest + + + com.google.code.gson + gson + + + org.springframework.boot + spring-boot-devtools + + + + io.pivotal.spring.cloud + spring-cloud-services-starter-config-client + + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + com.fasterxml.jackson.core + jackson-core + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.fasterxml.jackson.core + jackson-annotations + + + + + io.pivotal.spring.cloud + spring-cloud-services-dependencies + 2.1.2.RELEASE + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + Greenwich.RELEASE + pom + import + + + io.pivotal.spring.cloud + spring-cloud-services-starter-service-registry + 2.1.2.RELEASE + + + org.springframework.cloud + spring-cloud-starter-feign + 1.4.6.RELEASE + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + diff --git a/products-microservice/src/main/java/com/yugabyte/app/yugastore/YugabyteClientApplication.java b/products-microservice/src/main/java/com/yugabyte/app/yugastore/YugabyteClientApplication.java index 47f7b3e..6d558ed 100644 --- a/products-microservice/src/main/java/com/yugabyte/app/yugastore/YugabyteClientApplication.java +++ b/products-microservice/src/main/java/com/yugabyte/app/yugastore/YugabyteClientApplication.java @@ -2,10 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication -@EnableFeignClients +//@EnableFeignClients public class YugabyteClientApplication { public static void main(String[] args) { diff --git a/products-microservice/src/main/resources/application.properties b/products-microservice/src/main/resources/application.properties index 54a5c76..044ada5 100644 --- a/products-microservice/src/main/resources/application.properties +++ b/products-microservice/src/main/resources/application.properties @@ -1,5 +1,5 @@ logging.level.org.springframework.web=INFO cronos.yugabyte.keyspace=cronos -cronos.yugabyte.hostname=127.0.0.1 +cronos.yugabyte.hostname=10.100.200.225 cronos.yugabyte.port=9042 spring.profiles.active=local diff --git a/products-microservice/src/main/resources/bootstrap.yml b/products-microservice/src/main/resources/bootstrap.yml index a9684ee..592a444 100644 --- a/products-microservice/src/main/resources/bootstrap.yml +++ b/products-microservice/src/main/resources/bootstrap.yml @@ -1,9 +1,9 @@ spring: application: name: products-microservice -server: - port: 8082 -eureka: - client: - serviceUrl: - defaultZone: ${EUREKA_URI:http://localhost:8761/eureka} \ No newline at end of file +#server: +# port: 8082 +#eureka: +# client: +# serviceUrl: +# defaultZone: ${EUREKA_URI:http://localhost:8761/eureka} \ No newline at end of file diff --git a/react-ui/Dockerfile b/react-ui/Dockerfile new file mode 100644 index 0000000..b16e9a4 --- /dev/null +++ b/react-ui/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:8-jdk-alpine +VOLUME /tmp +ARG JAR_FILE +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] diff --git a/react-ui/deployment.yml b/react-ui/deployment.yml new file mode 100644 index 0000000..a1a9cfe --- /dev/null +++ b/react-ui/deployment.yml @@ -0,0 +1,34 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: sappho-retailapp-ui + labels: + app: ui +spec: + replicas: 1 + selector: + matchLabels: + app: ui + template: + metadata: + labels: + app: ui + spec: + containers: + - name: sappho-retailapp-ui + image: nchandrappa/sappho-retailapp-ui + ports: + - containerPort: 8080 +--- +apiVersion: v1 +kind: Service +metadata: + name: sappho-retailapp-ui-lb +spec: + type: LoadBalancer + selector: + app: ui + ports: + - protocol: TCP + port: 8080 + targetPort: 8080 diff --git a/react-ui/src/main/resources/application.properties b/react-ui/src/main/resources/application.properties index ae1a48a..b3057dd 100644 --- a/react-ui/src/main/resources/application.properties +++ b/react-ui/src/main/resources/application.properties @@ -1,3 +1,4 @@ -cronos.yugabyte.api=http://localhost:8081/api/v1/ +//cronos.yugabyte.api=http://localhost:8081/api/v1/ +cronos.yugabyte.api=http://35.184.32.206:8080/api/v1/ server.port=8080 logging.level.org.springframework.web=INFO diff --git a/resources/dataload.sh b/resources/dataload.sh index c6168c1..4514d8a 100755 --- a/resources/dataload.sh +++ b/resources/dataload.sh @@ -1,8 +1,8 @@ for i in products.json; do python parse_metadata_json.py $i; - ./cassandra-loader -f cronos_products.csv -host localhost -schema "cronos.products(asin, title, description, price, imUrl, also_bought, also_viewed, bought_together, buy_after_viewing, brand, categories,num_reviews,num_stars,avg_stars)" -maxInsertErrors 10000 -maxErrors 10000 -charsPerColumn 256000; - ./cassandra-loader -f cronos_product_rankings.csv -host localhost -schema "cronos.product_rankings(asin, category, sales_rank, title, price, imurl, num_reviews, num_stars, avg_stars)" -maxInsertErrors 10000 -maxErrors 10000 -charsPerColumn 256000; - ./cassandra-loader -f cronos_product_inventory.csv -host localhost -schema "cronos.product_inventory(asin, quantity)"; + ./cassandra-loader -f cronos_products.csv -host 127.0.0.1 -port 9042 -schema "cronos.products(asin, title, description, price, imUrl, also_bought, also_viewed, bought_together, buy_after_viewing, brand, categories,num_reviews,num_stars,avg_stars)" -maxInsertErrors 10000 -maxErrors 10000 -charsPerColumn 256000; + ./cassandra-loader -f cronos_product_rankings.csv -host 127.0.0.1 -port 9042 -schema "cronos.product_rankings(asin, category, sales_rank, title, price, imurl, num_reviews, num_stars, avg_stars)" -maxInsertErrors 10000 -maxErrors 10000 -charsPerColumn 256000; + ./cassandra-loader -f cronos_product_inventory.csv -host 127.0.0.1 -port 9042 -schema "cronos.product_inventory(asin, quantity)"; rm *.csv* done From ef156738ea909f97e2d8e80c59d8d0d4840f22b0 Mon Sep 17 00:00:00 2001 From: Nikhil Malladihalli chandrappa Date: Mon, 13 Jan 2020 12:02:50 -0800 Subject: [PATCH 02/11] changes to yugastore-java to deploy on Kubernetes cluster and added support for istio on kubernetes --- .../.mvn/wrapper/MavenWrapperDownloader.java | 114 +++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 48337 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 + api-gateway-microservice/Dockerfile | 2 +- api-gateway-microservice/deployment.yml | 4 + api-gateway-microservice/mvnw | 286 +++++++ api-gateway-microservice/mvnw.cmd | 161 ++++ api-gateway-microservice/pom.xml | 8 +- api-gateway-microservice/services.yml | 4 +- .../yugastore/YugabyteClientApplication.java | 34 + .../config/CustomRestMvcConfiguration.java | 4 +- .../clients/ShoppingCartK8sRestClient.java | 76 ++ .../rest/clients/ShoppingCartRestClient.java | 115 ++- .../impl/ShoppingCartServiceK8sImpl.java | 57 ++ .../impl/ShoppingCartServiceRestImpl.java | 114 ++- api-gateway-microservice/yugastore-rbac.yml | 15 + cart-microservice-v1/.gitignore | 31 + .../.mvn/wrapper/MavenWrapperDownloader.java | 117 +++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + cart-microservice-v1/Dockerfile | 5 + cart-microservice-v1/config-map.yml | 6 + .../deployment.yml | 39 +- cart-microservice-v1/mvnw | 310 ++++++++ cart-microservice-v1/mvnw.cmd | 182 +++++ cart-microservice-v1/pom.xml | 71 ++ .../cart/CartMicroserviceApplication.java | 13 + .../controller/ShoppingCartController.java | 45 ++ .../yugastore/cart/domain/ShoppingCart.java | 71 ++ .../cart/domain/ShoppingCartKey.java | 77 ++ .../repositories/ShoppingCartRepository.java | 39 + .../cart/security/SecurityConfiguration.java | 18 + .../cart/service/ShoppingCartImpl.java | 100 +++ .../src/main/resources/application.properties | 11 + cart-microservice/Dockerfile | 2 +- cart-microservice/config-map.yml | 6 + cart-microservice/deployment.yml | 14 +- cart-microservice/pom.xml | 2 +- cart-microservice/service.yml | 7 +- .../cart/config/YugabyteDataSourceConfig.java | 2 +- .../src/main/resources/application.properties | 13 +- checkout-microservice/Dockerfile | 2 +- checkout-microservice/config-map.yml | 8 + checkout-microservice/deployment.yml | 6 + checkout-microservice/pom.xml | 12 +- .../config/YugabyteAppProperties.java | 18 - .../config/YugabyteCloudConfig.java | 98 --- .../config/YugabyteLocalConfig.java | 59 -- .../config/YugabyteYCQLConfig.java | 5 + .../clients/ProductCatalogRestClient.java | 3 +- .../rest/clients/ShoppingCartRestClient.java | 2 - .../src/main/resources/application.properties | 14 +- .../Yugabyte/yugabyte-statefulset-rf-1.yaml | 292 +++++++ k8s-deployments/checkout-ms-deployment.yml | 33 - .../istio/destination-rule-all-mtls.yaml | 0 .../istio/destination-rule-all.yaml | 46 ++ .../istio/istio-stackdriver-metrics.yaml | 751 ++++++++++++++++++ .../istio/virtual-service-all.yaml | 52 ++ .../istio/virtual-service-cart-test-v2.yaml | 17 + ...rtual-service-fault-injection-test-v2.yaml | 16 + k8s-deployments/istio/yugastore-gateway.yaml | 39 + .../microservices/yugastore-deployment.yaml | 316 ++++++++ k8s-deployments/products-ms-deployment.yml | 33 - k8s-deployments/util/cleanEnvironment.sh | 60 ++ k8s-deployments/{ => util}/default-rbac.yml | 2 +- .../.mvn/wrapper/MavenWrapperDownloader.java | 114 +++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 48337 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 + products-microservice/Dockerfile | 2 +- products-microservice/config-map.yml | 8 + products-microservice/deployment.yml | 12 +- products-microservice/mvnw | 286 +++++++ products-microservice/mvnw.cmd | 161 ++++ products-microservice/pom.xml | 6 +- products-microservice/pom.xml.bkup | 212 ----- .../yugastore/config/YugabyteYCQLConfig.java | 94 ++- .../controller/ProductCatalogController.java | 3 +- .../app/yugastore/domain/ImageInfo.java | 4 +- .../app/yugastore/domain/ProductMetadata.java | 3 +- .../NotEnoughProductsInStockException.java | 8 +- .../repo/rest/ProductMetadataRestRepo.java | 4 +- .../src/main/resources/application.properties | 12 +- react-ui/.classpath | 17 + react-ui/.project | 6 +- .../org.eclipse.core.resources.prefs | 3 + react-ui/.settings/org.eclipse.jdt.core.prefs | 3 + react-ui/Dockerfile | 2 +- react-ui/config-map.yml | 6 + react-ui/deployment.yml | 9 +- react-ui/frontend/package-lock.json | 10 +- react-ui/service.yaml | 12 + .../src/main/resources/application.properties | 4 +- .../kubernetes/yugabyte-statefulset-rf-1.yaml | 292 +++++++ 93 files changed, 4722 insertions(+), 634 deletions(-) create mode 100644 api-gateway-microservice/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 api-gateway-microservice/.mvn/wrapper/maven-wrapper.jar create mode 100644 api-gateway-microservice/.mvn/wrapper/maven-wrapper.properties create mode 100755 api-gateway-microservice/mvnw create mode 100644 api-gateway-microservice/mvnw.cmd create mode 100644 api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ShoppingCartK8sRestClient.java create mode 100644 api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ShoppingCartServiceK8sImpl.java create mode 100644 api-gateway-microservice/yugastore-rbac.yml create mode 100644 cart-microservice-v1/.gitignore create mode 100644 cart-microservice-v1/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 cart-microservice-v1/.mvn/wrapper/maven-wrapper.jar create mode 100644 cart-microservice-v1/.mvn/wrapper/maven-wrapper.properties create mode 100644 cart-microservice-v1/Dockerfile create mode 100644 cart-microservice-v1/config-map.yml rename k8s-deployments/cart-ms-deployment.yml => cart-microservice-v1/deployment.yml (54%) create mode 100755 cart-microservice-v1/mvnw create mode 100644 cart-microservice-v1/mvnw.cmd create mode 100644 cart-microservice-v1/pom.xml create mode 100644 cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/CartMicroserviceApplication.java create mode 100644 cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/controller/ShoppingCartController.java create mode 100644 cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/domain/ShoppingCart.java create mode 100644 cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/domain/ShoppingCartKey.java create mode 100644 cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/repositories/ShoppingCartRepository.java create mode 100644 cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/security/SecurityConfiguration.java create mode 100644 cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/service/ShoppingCartImpl.java create mode 100644 cart-microservice-v1/src/main/resources/application.properties create mode 100644 cart-microservice/config-map.yml create mode 100644 checkout-microservice/config-map.yml delete mode 100644 checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteAppProperties.java delete mode 100644 checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteCloudConfig.java delete mode 100644 checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteLocalConfig.java create mode 100644 checkout-microservice/src/main/java/com/yugabyte/app/yugastore/cronoscheckoutapi/config/YugabyteYCQLConfig.java create mode 100644 k8s-deployments/Yugabyte/yugabyte-statefulset-rf-1.yaml delete mode 100644 k8s-deployments/checkout-ms-deployment.yml create mode 100644 k8s-deployments/istio/destination-rule-all-mtls.yaml create mode 100644 k8s-deployments/istio/destination-rule-all.yaml create mode 100644 k8s-deployments/istio/istio-stackdriver-metrics.yaml create mode 100644 k8s-deployments/istio/virtual-service-all.yaml create mode 100644 k8s-deployments/istio/virtual-service-cart-test-v2.yaml create mode 100644 k8s-deployments/istio/virtual-service-fault-injection-test-v2.yaml create mode 100644 k8s-deployments/istio/yugastore-gateway.yaml create mode 100644 k8s-deployments/microservices/yugastore-deployment.yaml delete mode 100644 k8s-deployments/products-ms-deployment.yml create mode 100644 k8s-deployments/util/cleanEnvironment.sh rename k8s-deployments/{ => util}/default-rbac.yml (88%) create mode 100644 products-microservice/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 products-microservice/.mvn/wrapper/maven-wrapper.jar create mode 100644 products-microservice/.mvn/wrapper/maven-wrapper.properties create mode 100644 products-microservice/config-map.yml create mode 100755 products-microservice/mvnw create mode 100644 products-microservice/mvnw.cmd delete mode 100644 products-microservice/pom.xml.bkup create mode 100644 react-ui/config-map.yml create mode 100644 react-ui/service.yaml create mode 100644 resources/kubernetes/yugabyte-statefulset-rf-1.yaml diff --git a/api-gateway-microservice/.mvn/wrapper/MavenWrapperDownloader.java b/api-gateway-microservice/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..72308aa --- /dev/null +++ b/api-gateway-microservice/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,114 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +*/ + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.util.Properties; + +public class MavenWrapperDownloader { + + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = + "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: : " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/api-gateway-microservice/.mvn/wrapper/maven-wrapper.jar b/api-gateway-microservice/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..01e67997377a393fd672c7dcde9dccbedf0cb1e9 GIT binary patch literal 48337 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + wget "$jarUrl" -O "$wrapperJarPath" + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + curl -o "$wrapperJarPath" "$jarUrl" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/api-gateway-microservice/mvnw.cmd b/api-gateway-microservice/mvnw.cmd new file mode 100644 index 0000000..fef5a8f --- /dev/null +++ b/api-gateway-microservice/mvnw.cmd @@ -0,0 +1,161 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" +FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + echo Found %WRAPPER_JAR% +) else ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" + echo Finished downloading %WRAPPER_JAR% +) +@REM End of extension + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/api-gateway-microservice/pom.xml b/api-gateway-microservice/pom.xml index a44e744..fad16f5 100644 --- a/api-gateway-microservice/pom.xml +++ b/api-gateway-microservice/pom.xml @@ -148,10 +148,14 @@ kubernetes-spring-starter 0.7.2 - + + org.springframework.cloud + spring-cloud-kubernetes-istio + + diff --git a/api-gateway-microservice/services.yml b/api-gateway-microservice/services.yml index 651be6b..bbfc65f 100644 --- a/api-gateway-microservice/services.yml +++ b/api-gateway-microservice/services.yml @@ -1,11 +1,11 @@ apiVersion: v1 kind: Service metadata: - name: products-lb + name: gateway-lb spec: type: LoadBalancer selector: - app: products + app: gateway ports: - protocol: TCP port: 8080 diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/YugabyteClientApplication.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/YugabyteClientApplication.java index 81d8e77..dbc3708 100644 --- a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/YugabyteClientApplication.java +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/YugabyteClientApplication.java @@ -1,16 +1,50 @@ package com.yugabyte.app.yugastore; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Bean; +import org.springframework.web.client.RestTemplate; + +import com.netflix.client.config.IClientConfig; +import com.netflix.loadbalancer.AvailabilityFilteringRule; +import com.netflix.loadbalancer.IPing; +import com.netflix.loadbalancer.IRule; +import com.netflix.loadbalancer.PingUrl; @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients +@RibbonClient(name = "cart-microservice", configuration = ShoppingCartServiceConfiguration.class) public class YugabyteClientApplication { public static void main(String[] args) { SpringApplication.run(YugabyteClientApplication.class, args); } + + @LoadBalanced + @Bean + RestTemplate restTemplate() { + return new RestTemplate(); + } } + +class ShoppingCartServiceConfiguration { + + @Autowired + IClientConfig ribbonClientConfig; + + @Bean + public IPing ribbonPing(IClientConfig config) { + return new PingUrl(); + } + + @Bean + public IRule ribbonRule(IClientConfig config) { + return new AvailabilityFilteringRule(); + } +} \ No newline at end of file diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/config/CustomRestMvcConfiguration.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/config/CustomRestMvcConfiguration.java index 9474e4f..66debea 100644 --- a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/config/CustomRestMvcConfiguration.java +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/config/CustomRestMvcConfiguration.java @@ -1,15 +1,15 @@ package com.yugabyte.app.yugastore.config; -import org.springframework.cloud.openfeign.FeignClientProperties.FeignClientConfiguration; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; import org.springframework.data.rest.core.config.RepositoryRestConfiguration; import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer; import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter; import com.yugabyte.app.yugastore.domain.ProductMetadata; import com.yugabyte.app.yugastore.domain.ProductRanking; +import com.yugabyte.app.yugastore.rest.clients.ShoppingCartRestClient; @Configuration public class CustomRestMvcConfiguration { diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ShoppingCartK8sRestClient.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ShoppingCartK8sRestClient.java new file mode 100644 index 0000000..16f4436 --- /dev/null +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ShoppingCartK8sRestClient.java @@ -0,0 +1,76 @@ +//package com.yugabyte.app.yugastore.rest.clients; +// +//import java.util.Map; +// +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.cloud.client.loadbalancer.LoadBalanced; +//import org.springframework.cloud.netflix.ribbon.RibbonClient; +//import org.springframework.context.annotation.Bean; +//import org.springframework.stereotype.Component; +//import org.springframework.web.client.RestTemplate; +// +//import com.netflix.client.config.IClientConfig; +//import com.netflix.loadbalancer.AvailabilityFilteringRule; +//import com.netflix.loadbalancer.IPing; +//import com.netflix.loadbalancer.IRule; +//import com.netflix.loadbalancer.PingUrl; +// +//@RibbonClient(name = "cart-microservice", configuration = ShoppingCartServiceConfiguration.class) +//@Component +//public class ShoppingCartK8sRestClient { +// +// +// @Autowired +// RestTemplate restTemplate; +// +// @LoadBalanced +// @Bean +// RestTemplate restTemplate() { +// return new RestTemplate(); +// } +// +// public String addProductToCart(String userId, String asin) { +// +// String result = this.restTemplate.getForObject("http://cart-microservice/shoppingCart/addProduct", String.class); +// return result; +// +// } +// +// @SuppressWarnings("unchecked") +// public Map getProductsInCart(String userId) { +// +// Map productsInCart = this.restTemplate.getForObject("http://cart-microservice/shoppingCart/productsInCart", Map.class); +// return productsInCart; +// +// } +// +// public String removeProductFromCart(String userId, String asin) { +// +// String result = this.restTemplate.getForObject("http://cart-microservice/shoppingCart/removeProduct", String.class); +// return result; +// +// } +// +// public String clearCart(String userId) { +// +// String result = this.restTemplate.getForObject("http://cart-microservice/shoppingCart/clearCart", String.class); +// return result; +// } +// +//} +// +//class ShoppingCartServiceConfiguration { +// +// @Autowired +// IClientConfig ribbonClientConfig; +// +// @Bean +// public IPing ribbonPing(IClientConfig config) { +// return new PingUrl(); +// } +// +// @Bean +// public IRule ribbonRule(IClientConfig config) { +// return new AvailabilityFilteringRule(); +// } +//} \ No newline at end of file diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ShoppingCartRestClient.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ShoppingCartRestClient.java index 47ca4a8..a2304a9 100644 --- a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ShoppingCartRestClient.java +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/rest/clients/ShoppingCartRestClient.java @@ -1,26 +1,109 @@ +//package com.yugabyte.app.yugastore.rest.clients; +// +//import java.util.Map; +// +//import org.springframework.cloud.openfeign.FeignClient; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RequestParam; +// +////@FeignClient("cart-microservice") +//@RequestMapping("/cart-microservice") +//public interface ShoppingCartRestClient { +// +// @RequestMapping("/shoppingCart/addProduct") +// String addProductToCart(@RequestParam("userid") String userId, +// @RequestParam("asin") String asin); +// +// @RequestMapping("/shoppingCart/productsInCart") +// Map getProductsInCart(@RequestParam("userid") String userId); +// +// @RequestMapping("/shoppingCart/removeProduct") +// String removeProductFromCart(@RequestParam("userid") String userId, +// @RequestParam("asin") String asin); +// +// @RequestMapping("/shoppingCart/clearCart") +// String clearCart(@RequestParam("userid") String userId); +//} + package com.yugabyte.app.yugastore.rest.clients; import java.util.Map; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.cloud.netflix.ribbon.RibbonClient; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.netflix.client.config.IClientConfig; +import com.netflix.loadbalancer.AvailabilityFilteringRule; +import com.netflix.loadbalancer.IPing; +import com.netflix.loadbalancer.IRule; +import com.netflix.loadbalancer.PingUrl; -//@FeignClient("cart-microservice") -@RequestMapping("/cart-microservice") -public interface ShoppingCartRestClient { +//@RibbonClient(name = "cart-microservice", configuration = ShoppingCartServiceConfiguration.class) +@Component +public class ShoppingCartRestClient { + + private final RestTemplate restTemplate; + + public ShoppingCartRestClient (RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } - @RequestMapping("/shoppingCart/addProduct") - String addProductToCart(@RequestParam("userid") String userId, - @RequestParam("asin") String asin); +// @Autowired +// RestTemplate restTemplate; +// +// @LoadBalanced +// @Bean +// RestTemplate restTemplate() { +// return new RestTemplate(); +// } - @RequestMapping("/shoppingCart/productsInCart") - Map getProductsInCart(@RequestParam("userid") String userId); + public String addProductToCart(String userId, String asin) { + + String result = this.restTemplate.getForObject(String.format( + "http://cart-microservice/shoppingCart/addProduct?userId=%s&asin=%s", userId, asin), String.class); + return result; + + } - @RequestMapping("/shoppingCart/removeProduct") - String removeProductFromCart(@RequestParam("userid") String userId, - @RequestParam("asin") String asin); + @SuppressWarnings("unchecked") + public Map getProductsInCart(String userId) { + + Map productsInCart = this.restTemplate.getForObject(String.format( + "http://cart-microservice/shoppingCart/productsInCart?userId=%s", userId), Map.class); + return productsInCart; + } - @RequestMapping("/shoppingCart/clearCart") - String clearCart(@RequestParam("userid") String userId); + public String removeProductFromCart(String userId, String asin) { + + String result = this.restTemplate.getForObject("http://cart-microservice/shoppingCart/removeProduct", String.class); + return result; + + } + + public String clearCart(String userId) { + + String result = this.restTemplate.getForObject("http://cart-microservice/shoppingCart/clearCart", String.class); + return result; + } + } + +//class ShoppingCartServiceConfiguration { +// +// @Autowired +// IClientConfig ribbonClientConfig; +// +// @Bean +// public IPing ribbonPing(IClientConfig config) { +// return new PingUrl(); +// } +// +// @Bean +// public IRule ribbonRule(IClientConfig config) { +// return new AvailabilityFilteringRule(); +// } +//} \ No newline at end of file diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ShoppingCartServiceK8sImpl.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ShoppingCartServiceK8sImpl.java new file mode 100644 index 0000000..f45323e --- /dev/null +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ShoppingCartServiceK8sImpl.java @@ -0,0 +1,57 @@ +//package com.yugabyte.app.yugastore.service.impl; +// +//import java.util.Map; +// +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.context.annotation.Scope; +//import org.springframework.context.annotation.ScopedProxyMode; +//import org.springframework.stereotype.Service; +//import org.springframework.web.context.WebApplicationContext; +// +//import com.yugabyte.app.yugastore.rest.clients.ShoppingCartK8sRestClient; +// +//@Service +//@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) +//public class ShoppingCartServiceK8sImpl { +// +// private final ShoppingCartK8sRestClient shoppingCartRestClient; +// +// @Autowired +// public ShoppingCartServiceK8sImpl(ShoppingCartK8sRestClient shoppingCartRestClient) { +// this.shoppingCartRestClient = shoppingCartRestClient; +// } +// +//// @Autowired +//// public ShoppingCartServiceRestImpl(Decoder decoder, Encoder encoder, Client client, +//// Contract contract) { +//// this.shoppingCartRestClient = Feign.builder().client(client) +//// .encoder(encoder) +//// .decoder(decoder) +//// .contract(contract) +//// .target(ShoppingCartRestClient.class, +//// "http://cart-microservice"); +//// } +// +// public String addProduct(String userId, String asin) { +// +// String result = shoppingCartRestClient.addProductToCart(userId, asin); +// return result; +// } +// +// public Map getProductsInCart(String userId) { +// +// Map productsInCart = shoppingCartRestClient.getProductsInCart(userId); +// return productsInCart; +// } +// +// public String removeProduct(String userId, String asin) { +// String result = shoppingCartRestClient.removeProductFromCart(userId, asin); +// return result; +// } +// +// public String clearCart(String userId) { +// String result = shoppingCartRestClient.clearCart(userId); +// return result; +// } +// +//} diff --git a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ShoppingCartServiceRestImpl.java b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ShoppingCartServiceRestImpl.java index c988746..a35521f 100644 --- a/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ShoppingCartServiceRestImpl.java +++ b/api-gateway-microservice/src/main/java/com/yugabyte/app/yugastore/service/impl/ShoppingCartServiceRestImpl.java @@ -1,22 +1,88 @@ +//package com.yugabyte.app.yugastore.service.impl; +// +//import java.util.Map; +// +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.context.annotation.Scope; +//import org.springframework.context.annotation.ScopedProxyMode; +//import org.springframework.stereotype.Service; +//import org.springframework.web.context.WebApplicationContext; +// +//import com.yugabyte.app.yugastore.rest.clients.ProductCatalogRestClient; +//import com.yugabyte.app.yugastore.rest.clients.ShoppingCartRestClient; +//import com.yugabyte.app.yugastore.service.ShoppingCartServiceRest; +// +//import feign.Client; +//import feign.Contract; +//import feign.Feign; +//import feign.codec.Decoder; +//import feign.codec.Encoder; +// +//@Service +//@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) +//public class ShoppingCartServiceRestImpl implements ShoppingCartServiceRest { +// +// private final ShoppingCartRestClient shoppingCartRestClient; +// +//// @Autowired +//// public ShoppingCartServiceRestImpl(ShoppingCartRestClient shoppingCartRestClient) { +//// this.shoppingCartRestClient = shoppingCartRestClient; +//// } +// +// @Autowired +// public ShoppingCartServiceRestImpl(Decoder decoder, Encoder encoder, Client client, +// Contract contract) { +// this.shoppingCartRestClient = Feign.builder().client(client) +// .encoder(encoder) +// .decoder(decoder) +// .contract(contract) +// .target(ShoppingCartRestClient.class, +// "http://cart-microservice"); +// } +// +// @Override +// public String addProduct(String userId, String asin) { +// +// String result = shoppingCartRestClient.addProductToCart(userId, asin); +// return result; +// } +// +// @Override +// public Map getProductsInCart(String userId) { +// +// Map productsInCart = shoppingCartRestClient.getProductsInCart(userId); +// return productsInCart; +// } +// +// @Override +// public String removeProduct(String userId, String asin) { +// String result = shoppingCartRestClient.removeProductFromCart(userId, asin); +// return result; +// } +// +// @Override +// public String clearCart(String userId) { +// String result = shoppingCartRestClient.clearCart(userId); +// return result; +// } +// +//} + package com.yugabyte.app.yugastore.service.impl; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.DependsOn; import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.ScopedProxyMode; import org.springframework.stereotype.Service; import org.springframework.web.context.WebApplicationContext; -import com.yugabyte.app.yugastore.rest.clients.ProductCatalogRestClient; import com.yugabyte.app.yugastore.rest.clients.ShoppingCartRestClient; import com.yugabyte.app.yugastore.service.ShoppingCartServiceRest; -import feign.Client; -import feign.Contract; -import feign.Feign; -import feign.codec.Decoder; -import feign.codec.Encoder; + @Service @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) @@ -24,46 +90,42 @@ public class ShoppingCartServiceRestImpl implements ShoppingCartServiceRest { private final ShoppingCartRestClient shoppingCartRestClient; -// @Autowired -// public ShoppingCartServiceRestImpl(ShoppingCartRestClient shoppingCartRestClient) { -// this.shoppingCartRestClient = shoppingCartRestClient; -// } - @Autowired - public ShoppingCartServiceRestImpl(Decoder decoder, Encoder encoder, Client client, - Contract contract) { - this.shoppingCartRestClient = Feign.builder().client(client) - .encoder(encoder) - .decoder(decoder) - .contract(contract) - .target(ShoppingCartRestClient.class, - "http://cart-microservice"); - } - - @Override + public ShoppingCartServiceRestImpl (ShoppingCartRestClient shoppingCartRestClient) { + this.shoppingCartRestClient = shoppingCartRestClient; + } + +// @Autowired +// public ShoppingCartServiceRestImpl(Decoder decoder, Encoder encoder, Client client, +// Contract contract) { +// this.shoppingCartRestClient = Feign.builder().client(client) +// .encoder(encoder) +// .decoder(decoder) +// .contract(contract) +// .target(ShoppingCartRestClient.class, +// "http://cart-microservice"); +// } + public String addProduct(String userId, String asin) { String result = shoppingCartRestClient.addProductToCart(userId, asin); return result; } - @Override public Map getProductsInCart(String userId) { Map productsInCart = shoppingCartRestClient.getProductsInCart(userId); return productsInCart; } - @Override public String removeProduct(String userId, String asin) { String result = shoppingCartRestClient.removeProductFromCart(userId, asin); return result; } - @Override public String clearCart(String userId) { String result = shoppingCartRestClient.clearCart(userId); return result; } -} \ No newline at end of file +} diff --git a/api-gateway-microservice/yugastore-rbac.yml b/api-gateway-microservice/yugastore-rbac.yml new file mode 100644 index 0000000..5314f01 --- /dev/null +++ b/api-gateway-microservice/yugastore-rbac.yml @@ -0,0 +1,15 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRoleBinding +metadata: + name: yugastore-rbac +subjects: + - kind: ServiceAccount + # Reference to upper's `metadata.name` + name: default + # Reference to upper's `metadata.namespace` + namespace: default +roleRef: + kind: ClusterRole + name: cluster-admin + apiGroup: rbac.authorization.k8s.io diff --git a/cart-microservice-v1/.gitignore b/cart-microservice-v1/.gitignore new file mode 100644 index 0000000..a2a3040 --- /dev/null +++ b/cart-microservice-v1/.gitignore @@ -0,0 +1,31 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ diff --git a/cart-microservice-v1/.mvn/wrapper/MavenWrapperDownloader.java b/cart-microservice-v1/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..e76d1f3 --- /dev/null +++ b/cart-microservice-v1/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/cart-microservice-v1/.mvn/wrapper/maven-wrapper.jar b/cart-microservice-v1/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 GIT binary patch literal 50710 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 EfAhh=DF6Tf literal 0 HcmV?d00001 diff --git a/cart-microservice-v1/.mvn/wrapper/maven-wrapper.properties b/cart-microservice-v1/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..642d572 --- /dev/null +++ b/cart-microservice-v1/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/cart-microservice-v1/Dockerfile b/cart-microservice-v1/Dockerfile new file mode 100644 index 0000000..4359da5 --- /dev/null +++ b/cart-microservice-v1/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:8-jdk-alpine +VOLUME /tmp +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] \ No newline at end of file diff --git a/cart-microservice-v1/config-map.yml b/cart-microservice-v1/config-map.yml new file mode 100644 index 0000000..c1aca0a --- /dev/null +++ b/cart-microservice-v1/config-map.yml @@ -0,0 +1,6 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: cart-microservice-v1-properties +data: + spring.datasource.url: jdbc:postgresql://yb-tservers.yb-demo.svc.cluster.local:5433/postgres diff --git a/k8s-deployments/cart-ms-deployment.yml b/cart-microservice-v1/deployment.yml similarity index 54% rename from k8s-deployments/cart-ms-deployment.yml rename to cart-microservice-v1/deployment.yml index 8254a66..6395cdc 100644 --- a/k8s-deployments/cart-ms-deployment.yml +++ b/cart-microservice-v1/deployment.yml @@ -1,33 +1,42 @@ +apiVersion: v1 +kind: Service +metadata: + name: cart-microservice + labels: + app: gateway + service: cart-microservice +spec: + selector: + app: cart + ports: + - protocol: TCP + port: 8080 + targetPort: 8080 +--- apiVersion: apps/v1 kind: Deployment metadata: - name: cart-microservice + name: cart-microservice-v1 labels: app: cart + version: v1 spec: replicas: 1 selector: matchLabels: app: cart + version: v1 template: metadata: labels: app: cart + version: v1 spec: containers: - name: cart - image: nchandrappa/cart-microservice:latest + image: nchandrappa/cart-microservice-v1:latest + envFrom: + - configMapRef: + name: cart-microservice-v1-properties ports: - - containerPort: 8080 ---- -apiVersion: v1 -kind: Service -metadata: - name: cart-microservice -spec: - selector: - app: cart - ports: - - protocol: TCP - port: 8080 - targetPort: 8080 \ No newline at end of file + - containerPort: 8080 \ No newline at end of file diff --git a/cart-microservice-v1/mvnw b/cart-microservice-v1/mvnw new file mode 100755 index 0000000..a16b543 --- /dev/null +++ b/cart-microservice-v1/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/cart-microservice-v1/mvnw.cmd b/cart-microservice-v1/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/cart-microservice-v1/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/cart-microservice-v1/pom.xml b/cart-microservice-v1/pom.xml new file mode 100644 index 0000000..74f7d60 --- /dev/null +++ b/cart-microservice-v1/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.4.RELEASE + + + com.yugabyte.app.yugastore + cart-microservice-v1 + 0.0.1-SNAPSHOT + cart-microservice-v1 + shopping cart microservice + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-data-rest + + + org.springframework.boot + spring-boot-starter-web + + + + org.postgresql + postgresql + 9.4-1206-jdbc42 + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/CartMicroserviceApplication.java b/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/CartMicroserviceApplication.java new file mode 100644 index 0000000..11a6fd0 --- /dev/null +++ b/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/CartMicroserviceApplication.java @@ -0,0 +1,13 @@ +package com.yugabyte.app.yugastore.cart; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CartMicroserviceApplication { + + public static void main(String[] args) { + SpringApplication.run(CartMicroserviceApplication.class, args); + } + +} diff --git a/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/controller/ShoppingCartController.java b/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/controller/ShoppingCartController.java new file mode 100644 index 0000000..a39985a --- /dev/null +++ b/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/controller/ShoppingCartController.java @@ -0,0 +1,45 @@ +package com.yugabyte.app.yugastore.cart.controller; + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.yugabyte.app.yugastore.cart.service.ShoppingCartImpl; + +@RestController +@RequestMapping(value = "/cart-microservice") +public class ShoppingCartController { + + @Autowired + ShoppingCartImpl shoppingCart; + + @RequestMapping(method = RequestMethod.GET, value = "/shoppingCart/addProduct", produces = "application/json") + public String addProductToCart(@RequestParam("userid") String userId, + @RequestParam("asin") String asin) { + shoppingCart.addProductToShoppingCart(userId, asin); + return String.format("Added to Cart"); + } + + @RequestMapping(method = RequestMethod.GET, value = "/shoppingCart/productsInCart", produces = "application/json") + public Map getProductsInCart(@RequestParam("userid") String userId) { + return shoppingCart.getProductsInCart(userId); + } + + @RequestMapping(method = RequestMethod.GET, value = "/shoppingCart/removeProduct", produces = "application/json") + public String removeProductFromCart(@RequestParam("userid") String userId, + @RequestParam("asin") String asin) { + shoppingCart.removeProductFromCart(userId, asin); + return String.format("Removing from Cart"); + } + + @RequestMapping(method = RequestMethod.GET, value = "/shoppingCart/clearCart", produces = "application/json") + public String clearCart(@RequestParam("userid") String userId) { + shoppingCart.clearCart(userId); + return String.format("Clearing Cart, Checkout successful"); + } + +} diff --git a/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/domain/ShoppingCart.java b/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/domain/ShoppingCart.java new file mode 100644 index 0000000..a49c8d3 --- /dev/null +++ b/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/domain/ShoppingCart.java @@ -0,0 +1,71 @@ +package com.yugabyte.app.yugastore.cart.domain; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity(name = "shopping_cart") +@Table(name = "shopping_cart") +public class ShoppingCart { + +// @EmbeddedId +// private ShoppingCartKey shoppingCartKey; + + @Id + @Column(name = "cart_key") + private String cartKey; + + @Column(name = "user_id") + private String userId; + + @Column(name = "asin") + private String asin; + + @Column(name = "time_added") + private String time_added; + + @Column(name = "quantity") + private int quantity; + + public String getCartKey() { + return cartKey; + } + + public void setCartKey(String cartKey) { + this.cartKey = cartKey; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getAsin() { + return asin; + } + + public void setAsin(String asin) { + this.asin = asin; + } + + public String getTime_added() { + return time_added; + } + + public int getQuantity() { + return quantity; + } + + public void setTime_added(String time_added) { + this.time_added = time_added; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + +} diff --git a/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/domain/ShoppingCartKey.java b/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/domain/ShoppingCartKey.java new file mode 100644 index 0000000..45865fc --- /dev/null +++ b/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/domain/ShoppingCartKey.java @@ -0,0 +1,77 @@ +package com.yugabyte.app.yugastore.cart.domain; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Embeddable; + +@Embeddable +public class ShoppingCartKey implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 343234890377423559L; + + @Column(name = "user_id") + private String id; + + @Column(name = "asin") + private String asin; + + public ShoppingCartKey() { + + } + + public ShoppingCartKey(String id, String asin) { + this.id = id; + this.asin = asin; + } + + public String getAsin() { + return asin; + } + + public void setAsin(String asin) { + this.asin = asin; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : asin.hashCode()); + result = prime * result + ((asin == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ShoppingCartKey other = (ShoppingCartKey) obj; + if (id == null) { + if (other.id != null) + return false; + else { + if (!id.equals(other.id)) { + return false; + } + } + } + return true; + } +} diff --git a/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/repositories/ShoppingCartRepository.java b/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/repositories/ShoppingCartRepository.java new file mode 100644 index 0000000..c99039c --- /dev/null +++ b/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/repositories/ShoppingCartRepository.java @@ -0,0 +1,39 @@ +package com.yugabyte.app.yugastore.cart.repositories; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.rest.core.annotation.RepositoryRestResource; +import org.springframework.transaction.annotation.Transactional; + +import com.yugabyte.app.yugastore.cart.domain.ShoppingCart; + + +@RepositoryRestResource +public interface ShoppingCartRepository extends CrudRepository { + + @Modifying + @Transactional + @Query("UPDATE shopping_cart SET quantity = quantity + 1 WHERE user_id = ?1 AND asin =?2") + int updateQuantityForShoppingCart(String userId, String asin); + + @Query("SELECT quantity FROM shopping_cart WHERE user_id = ?1 AND asin = ?2") + Optional findByUserIdAndAsin(String userId, String asin); + + @Query("SELECT sc FROM shopping_cart sc WHERE sc.userId = ?1") + Optional> findProductsInCartByUserId(String userId); + + @Modifying + @Transactional + @Query("UPDATE shopping_cart SET quantity = quantity - 1 WHERE user_id = ?1 AND asin =?2") + int decrementQuantityForShoppingCart(String userId, String asin); + + @Modifying + @Transactional + @Query("DELETE FROM shopping_cart WHERE user_id = ?1") + int deleteProductsInCartByUserId(String userId); + +} diff --git a/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/security/SecurityConfiguration.java b/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/security/SecurityConfiguration.java new file mode 100644 index 0000000..0dca43f --- /dev/null +++ b/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/security/SecurityConfiguration.java @@ -0,0 +1,18 @@ +package com.yugabyte.app.yugastore.cart.security; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +public class SecurityConfiguration extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests().anyRequest().permitAll() + .and() + .httpBasic().disable() + .csrf().disable(); + } +} diff --git a/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/service/ShoppingCartImpl.java b/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/service/ShoppingCartImpl.java new file mode 100644 index 0000000..6a4df50 --- /dev/null +++ b/cart-microservice-v1/src/main/java/com/yugabyte/app/yugastore/cart/service/ShoppingCartImpl.java @@ -0,0 +1,100 @@ +package com.yugabyte.app.yugastore.cart.service; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.context.WebApplicationContext; + +import com.yugabyte.app.yugastore.cart.domain.ShoppingCart; +import com.yugabyte.app.yugastore.cart.domain.ShoppingCartKey; +import com.yugabyte.app.yugastore.cart.repositories.ShoppingCartRepository; + +@Service +@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) +@Transactional +public class ShoppingCartImpl { + + private static final int DEFAULT_QUANTITY = 1; + private final ShoppingCartRepository shoppingCartRepository; + + @Autowired + public ShoppingCartImpl(ShoppingCartRepository shoppingCartRepository) { + this.shoppingCartRepository = shoppingCartRepository; + } + + /** + * If product is in the map just increment quantity by 1. If product is not in + * the map with, add it with quantity 1 + * + * @param product + */ + public void addProductToShoppingCart(String userId, String asin) { + + ShoppingCartKey currentKey = new ShoppingCartKey(userId, asin); + String shoppingCartKeyStr = userId + "-" + asin; + if (shoppingCartRepository.findById(shoppingCartKeyStr).isPresent()) { + shoppingCartRepository.updateQuantityForShoppingCart(userId, asin); + System.out.println("Adding product: " + asin); + } else { + ShoppingCart currentShoppingCart = createCartObject(currentKey); + shoppingCartRepository.save(currentShoppingCart); + System.out.println("Adding product: " + asin); + } + } + + public Map getProductsInCart(String userId) { + + Map productsInCartAsin = new HashMap(); + + if (shoppingCartRepository.findProductsInCartByUserId(userId).isPresent()) { + + List productsInCart = shoppingCartRepository.findProductsInCartByUserId(userId).get(); + for (ShoppingCart item : productsInCart) { + productsInCartAsin.put(item.getAsin(), item.getQuantity()); + } + + } + return productsInCartAsin; + } + + public void removeProductFromCart(String userId, String asin) { + String shoppingCartKeyStr = userId + "-" + asin; + if (shoppingCartRepository.findById(shoppingCartKeyStr).isPresent()) { + if (shoppingCartRepository.findById(shoppingCartKeyStr).get().getQuantity() > 1) { + shoppingCartRepository.decrementQuantityForShoppingCart(userId, asin); + System.out.println("Decrementing product: " + asin + " quantity"); + } else if (shoppingCartRepository.findById(shoppingCartKeyStr).get().getQuantity() == 1) { + shoppingCartRepository.deleteById(shoppingCartKeyStr); + System.out.println("Removing product: " + asin + " since it was qty 1"); + } + } + } + + private ShoppingCart createCartObject(ShoppingCartKey currentKey) { + ShoppingCart currentShoppingCart = new ShoppingCart(); + currentShoppingCart.setCartKey(currentKey.getId() + "-" + currentKey.getAsin()); + currentShoppingCart.setUserId(currentKey.getId()); + currentShoppingCart.setAsin(currentKey.getAsin()); + LocalDateTime currentTime = LocalDateTime.now(); + currentShoppingCart.setTime_added(currentTime.toString()); + currentShoppingCart.setQuantity(DEFAULT_QUANTITY); + + return currentShoppingCart; + } + + public void clearCart(String userId) { + + if (shoppingCartRepository.findProductsInCartByUserId(userId).isPresent()) { + shoppingCartRepository.deleteProductsInCartByUserId(userId); + System.out.println("Deleteing all products for user: " + userId + " since checkout was successful"); + } + } + +} diff --git a/cart-microservice-v1/src/main/resources/application.properties b/cart-microservice-v1/src/main/resources/application.properties new file mode 100644 index 0000000..814b24f --- /dev/null +++ b/cart-microservice-v1/src/main/resources/application.properties @@ -0,0 +1,11 @@ +spring.jpa.database=POSTGRESQL +spring.data.jpa.repositories.enabled=true +spring.datasource.url=jdbc:postgresql://35.245.245.126:5433/postgres +spring.datasource.username=postgres +spring.datasource.password= +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect +#logging.level.org.hibernate.SQL=DEBUG +#logging.level.org.hibernate.type=trace +#logging.level.org.hibernate.type.descriptor.BasicBinder=TRACE +#logging.level.=DEBUG + diff --git a/cart-microservice/Dockerfile b/cart-microservice/Dockerfile index b16e9a4..e08873e 100644 --- a/cart-microservice/Dockerfile +++ b/cart-microservice/Dockerfile @@ -1,5 +1,5 @@ FROM openjdk:8-jdk-alpine VOLUME /tmp -ARG JAR_FILE +ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] diff --git a/cart-microservice/config-map.yml b/cart-microservice/config-map.yml new file mode 100644 index 0000000..3ba62eb --- /dev/null +++ b/cart-microservice/config-map.yml @@ -0,0 +1,6 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: cart-microservice-properties +data: + yugabyte.sql.datasource.url: jdbc:postgresql://yb-tservers.yb-demo.svc.cluster.local:5433/postgres diff --git a/cart-microservice/deployment.yml b/cart-microservice/deployment.yml index db54bc9..281eab3 100644 --- a/cart-microservice/deployment.yml +++ b/cart-microservice/deployment.yml @@ -1,33 +1,39 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: cart-microservice + name: cart-microservice-v2 labels: app: cart + version: v2 spec: replicas: 1 selector: matchLabels: app: cart + version: v2 template: metadata: labels: app: cart + version: v2 spec: containers: - name: cart image: nchandrappa/cart-microservice:latest + envFrom: + - configMapRef: + name: cart-microservice-properties ports: - - containerPort: 8083 + - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: - name: cart-service + name: cart-microservice spec: selector: app: cart ports: - protocol: TCP port: 8080 - targetPort: 8083 \ No newline at end of file + targetPort: 8080 \ No newline at end of file diff --git a/cart-microservice/pom.xml b/cart-microservice/pom.xml index acfb660..aa4bdd7 100644 --- a/cart-microservice/pom.xml +++ b/cart-microservice/pom.xml @@ -40,7 +40,7 @@ com.yugabyte ysql - 42.2.7-yb-1-SNAPSHOT + 42.2.7-yb-2 org.springframework.boot diff --git a/cart-microservice/service.yml b/cart-microservice/service.yml index de8e9f3..13164dc 100644 --- a/cart-microservice/service.yml +++ b/cart-microservice/service.yml @@ -1,11 +1,12 @@ apiVersion: v1 kind: Service metadata: - name: cart-service + name: cart-service-lb spec: selector: app: cart ports: - protocol: TCP - port: 8083 - targetPort: 8083 + port: 8080 + targetPort: 8080 + type: LoadBalancer diff --git a/cart-microservice/src/main/java/com/yugabyte/app/yugastore/cart/config/YugabyteDataSourceConfig.java b/cart-microservice/src/main/java/com/yugabyte/app/yugastore/cart/config/YugabyteDataSourceConfig.java index 0e63476..655c92b 100644 --- a/cart-microservice/src/main/java/com/yugabyte/app/yugastore/cart/config/YugabyteDataSourceConfig.java +++ b/cart-microservice/src/main/java/com/yugabyte/app/yugastore/cart/config/YugabyteDataSourceConfig.java @@ -6,7 +6,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.yugabyte.YBClusterAwareDataSource; +import com.yugabyte.ysql.YBClusterAwareDataSource; @Configuration public class YugabyteDataSourceConfig { diff --git a/cart-microservice/src/main/resources/application.properties b/cart-microservice/src/main/resources/application.properties index 89a2a24..37d06ca 100644 --- a/cart-microservice/src/main/resources/application.properties +++ b/cart-microservice/src/main/resources/application.properties @@ -1,12 +1,13 @@ spring.jpa.database=POSTGRESQL spring.data.jpa.repositories.enabled=true -yugabyte.sql.datasource.url=jdbc:postgresql://10.100.200.225:5433/postgres +#yugabyte.sql.datasource.url=jdbc:postgresql://127.0.0.1:5433/postgres +yugabyte.sql.datasource.url=jdbc:postgresql://35.245.245.126:5433/postgres spring.datasource.username=postgres spring.datasource.password= spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect spring.jpa.hibernate.ddl-auto = update -logging.level.=DEBUG -#logging.level.org.hibernate.SQL=DEBUG -#logging.level.org.hibernate.type=trace -#logging.level.org.hibernate.type.descriptor.BasicBinder=TRACE -#logging.level.=DEBUG +# logging.level.=DEBUG +# logging.level.org.hibernate.SQL=DEBUG +# logging.level.org.hibernate.type=trace +# logging.level.org.hibernate.type.descriptor.BasicBinder=TRACE +# logging.level.=DEBUG diff --git a/checkout-microservice/Dockerfile b/checkout-microservice/Dockerfile index b16e9a4..e08873e 100644 --- a/checkout-microservice/Dockerfile +++ b/checkout-microservice/Dockerfile @@ -1,5 +1,5 @@ FROM openjdk:8-jdk-alpine VOLUME /tmp -ARG JAR_FILE +ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] diff --git a/checkout-microservice/config-map.yml b/checkout-microservice/config-map.yml new file mode 100644 index 0000000..45e14ff --- /dev/null +++ b/checkout-microservice/config-map.yml @@ -0,0 +1,8 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: checkout-microservice-properties +data: + spring.data.cassandra.keyspace-name: cronos + spring.data.cassandra.contact-points: yb-tservers.yb-demo.svc.cluster.local + spring.data.cassandra.port: "9042" diff --git a/checkout-microservice/deployment.yml b/checkout-microservice/deployment.yml index b0a28a1..4482882 100644 --- a/checkout-microservice/deployment.yml +++ b/checkout-microservice/deployment.yml @@ -4,19 +4,25 @@ metadata: name: checkout-microservice labels: app: checkout + version: v1 spec: replicas: 1 selector: matchLabels: app: checkout + version: v1 template: metadata: labels: app: checkout + version: v1 spec: containers: - name: checkout image: nchandrappa/checkout-microservice:latest + envFrom: + - configMapRef: + name: checkout-microservice-properties ports: - containerPort: 8080 --- diff --git a/checkout-microservice/pom.xml b/checkout-microservice/pom.xml index e65213d..43a8781 100644 --- a/checkout-microservice/pom.xml +++ b/checkout-microservice/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.4.RELEASE + 2.2.2.RELEASE com.yugabyte.app.yugastore @@ -18,8 +18,8 @@ UTF-8 UTF-8 1.8 - Finchley.RELEASE - 2.0.0.RELEASE + Hoxton.RELEASE + 3.1.0.RELEASE @@ -77,13 +77,13 @@ pom import --> - + @@ -22,8 +22,8 @@ UTF-8 UTF-8 1.8 - Finchley.RELEASE - 2.0.0.RELEASE + Hoxton.RELEASE + 3.1.0.RELEASE diff --git a/products-microservice/pom.xml.bkup b/products-microservice/pom.xml.bkup deleted file mode 100644 index 7e30f39..0000000 --- a/products-microservice/pom.xml.bkup +++ /dev/null @@ -1,212 +0,0 @@ - - - 4.0.0 - - com.yugabyte.app.yugastore - products-microservice - 0.0.1-SNAPSHOT - jar - - products-microservice - Microservice that powers the product listings and details. - - - org.springframework.boot - spring-boot-starter-parent - 2.0.4.RELEASE - - - - - UTF-8 - UTF-8 - 1.8 - Finchley.RELEASE - 2.0.0.RELEASE - - - - - - io.pivotal.spring.cloud - spring-cloud-services-dependencies - ${spring-cloud-services.version} - pom - import - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - - - - - org.springframework.boot - spring-boot-starter-data-cassandra - - - com.datastax.cassandra - cassandra-driver-core - - - - - com.yugabyte - cassandra-driver-core - 3.2.0-yb-18 - - - org.springframework.boot - spring-boot-starter-data-rest - - - com.google.code.gson - gson - - - org.springframework.boot - spring-boot-devtools - - - - io.pivotal.spring.cloud - spring-cloud-services-starter-config-client - - - - org.springframework.boot - spring-boot-starter-security - - - - org.springframework.boot - spring-boot-starter-actuator - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - com.fasterxml.jackson.core - jackson-core - - - - - com.fasterxml.jackson.core - jackson-databind - - - - - com.fasterxml.jackson.core - jackson-annotations - - - - - io.pivotal.spring.cloud - spring-cloud-services-dependencies - 2.1.2.RELEASE - pom - import - - - org.springframework.cloud - spring-cloud-dependencies - Greenwich.RELEASE - pom - import - - - io.pivotal.spring.cloud - spring-cloud-services-starter-service-registry - 2.1.2.RELEASE - - - org.springframework.cloud - spring-cloud-starter-feign - 1.4.6.RELEASE - - - org.springframework.boot - spring-boot-starter-actuator - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - - - diff --git a/products-microservice/src/main/java/com/yugabyte/app/yugastore/config/YugabyteYCQLConfig.java b/products-microservice/src/main/java/com/yugabyte/app/yugastore/config/YugabyteYCQLConfig.java index 9e85cf0..0f44f49 100644 --- a/products-microservice/src/main/java/com/yugabyte/app/yugastore/config/YugabyteYCQLConfig.java +++ b/products-microservice/src/main/java/com/yugabyte/app/yugastore/config/YugabyteYCQLConfig.java @@ -1,59 +1,57 @@ package com.yugabyte.app.yugastore.config; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.data.cassandra.config.AbstractCassandraConfiguration; -import org.springframework.data.cassandra.config.SchemaAction; -import org.springframework.data.cassandra.core.CassandraTemplate; import org.springframework.data.cassandra.repository.config.EnableCassandraRepositories; -import com.datastax.driver.core.Session; +//@Configuration +//@EnableAutoConfiguration +//@Profile(value = "local") +//class YugabyteYCQLConfig { +// +// @Configuration +// @EnableCassandraRepositories(basePackages = { "com.yugabyte.app.yugastore.repo" }) +// class CassandraConfig extends AbstractCassandraConfiguration { +// +// @Value("${cronos.yugabyte.hostname:localhost}") +// private String cassandraHost; +// +// @Value("${cronos.yugabyte.port:9042}") +// private int cassandraPort; +// +// @Value("${cronos.yugabyte.keyspace:cronos}") +// private String keyspace; +// +// @Override +// public String getKeyspaceName() { +// return keyspace; +// } +// +// @Override +// public String getContactPoints() { +// return cassandraHost; +// } +// +// @Override +// public int getPort() { +// return cassandraPort; +// } +// +// @Override +// public SchemaAction getSchemaAction() { +// return SchemaAction.CREATE_IF_NOT_EXISTS; +// } +// +// @Bean +// public CassandraTemplate cassandraTemplate(Session session) { +// return new CassandraTemplate(session); +// } +// +// } +//} @Configuration @EnableAutoConfiguration -@Profile(value = "local") +@EnableCassandraRepositories(basePackages = { "com.yugabyte.app.yugastore.repo" }) class YugabyteYCQLConfig { - - @Configuration - @EnableCassandraRepositories(basePackages = { "com.yugabyte.app.yugastore.repo" }) - class CassandraConfig extends AbstractCassandraConfiguration { - - @Value("${cronos.yugabyte.hostname:localhost}") - private String cassandraHost; - - @Value("${cronos.yugabyte.port:9042}") - private int cassandraPort; - - @Value("${cronos.yugabyte.keyspace:cronos}") - private String keyspace; - - @Override - public String getKeyspaceName() { - return keyspace; - } - - @Override - public String getContactPoints() { - return cassandraHost; - } - - @Override - public int getPort() { - return cassandraPort; - } - - @Override - public SchemaAction getSchemaAction() { - return SchemaAction.CREATE_IF_NOT_EXISTS; - } - - @Bean - public CassandraTemplate cassandraTemplate(Session session) { - return new CassandraTemplate(session); - } - - } } diff --git a/products-microservice/src/main/java/com/yugabyte/app/yugastore/controller/ProductCatalogController.java b/products-microservice/src/main/java/com/yugabyte/app/yugastore/controller/ProductCatalogController.java index 77de4b2..6cbfa96 100644 --- a/products-microservice/src/main/java/com/yugabyte/app/yugastore/controller/ProductCatalogController.java +++ b/products-microservice/src/main/java/com/yugabyte/app/yugastore/controller/ProductCatalogController.java @@ -7,13 +7,12 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.yugabyte.app.yugastore.domain.ProductMetadata; import com.yugabyte.app.yugastore.domain.ProductRanking; -import com.yugabyte.app.yugastore.service.ProductService; import com.yugabyte.app.yugastore.service.ProductRankingService; +import com.yugabyte.app.yugastore.service.ProductService; @RestController @RequestMapping(value = "/products-microservice") diff --git a/products-microservice/src/main/java/com/yugabyte/app/yugastore/domain/ImageInfo.java b/products-microservice/src/main/java/com/yugabyte/app/yugastore/domain/ImageInfo.java index de25cbd..0609c82 100644 --- a/products-microservice/src/main/java/com/yugabyte/app/yugastore/domain/ImageInfo.java +++ b/products-microservice/src/main/java/com/yugabyte/app/yugastore/domain/ImageInfo.java @@ -3,9 +3,9 @@ import java.util.ArrayList; import java.util.List; -import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.RepresentationModel; -public class ImageInfo extends ResourceSupport { +public class ImageInfo extends RepresentationModel { List alsoBought; List alsoViewed; diff --git a/products-microservice/src/main/java/com/yugabyte/app/yugastore/domain/ProductMetadata.java b/products-microservice/src/main/java/com/yugabyte/app/yugastore/domain/ProductMetadata.java index 1c4632e..deffbba 100644 --- a/products-microservice/src/main/java/com/yugabyte/app/yugastore/domain/ProductMetadata.java +++ b/products-microservice/src/main/java/com/yugabyte/app/yugastore/domain/ProductMetadata.java @@ -2,11 +2,11 @@ import java.util.List; import java.util.Set; + import org.springframework.data.cassandra.core.mapping.CassandraType; import org.springframework.data.cassandra.core.mapping.Column; import org.springframework.data.cassandra.core.mapping.PrimaryKey; import org.springframework.data.cassandra.core.mapping.Table; -import org.springframework.hateoas.ResourceSupport; import com.datastax.driver.core.DataType.Name; @@ -17,7 +17,6 @@ public class ProductMetadata{ @PrimaryKey(value="asin") private String id; - //String asin; String brand; diff --git a/products-microservice/src/main/java/com/yugabyte/app/yugastore/exception/NotEnoughProductsInStockException.java b/products-microservice/src/main/java/com/yugabyte/app/yugastore/exception/NotEnoughProductsInStockException.java index e851a95..3eebc10 100644 --- a/products-microservice/src/main/java/com/yugabyte/app/yugastore/exception/NotEnoughProductsInStockException.java +++ b/products-microservice/src/main/java/com/yugabyte/app/yugastore/exception/NotEnoughProductsInStockException.java @@ -1,11 +1,15 @@ package com.yugabyte.app.yugastore.exception; -import com.yugabyte.app.yugastore.domain.ProductMetadata; import com.yugabyte.app.yugastore.domain.ProductInventory; +import com.yugabyte.app.yugastore.domain.ProductMetadata; public class NotEnoughProductsInStockException extends Exception { - private static final String DEFAULT_MESSAGE = "Not enough products in stock"; + /** + * + */ + private static final long serialVersionUID = 1L; + private static final String DEFAULT_MESSAGE = "Not enough products in stock"; public NotEnoughProductsInStockException() { super(DEFAULT_MESSAGE); diff --git a/products-microservice/src/main/java/com/yugabyte/app/yugastore/repo/rest/ProductMetadataRestRepo.java b/products-microservice/src/main/java/com/yugabyte/app/yugastore/repo/rest/ProductMetadataRestRepo.java index 17d16d9..d31d056 100644 --- a/products-microservice/src/main/java/com/yugabyte/app/yugastore/repo/rest/ProductMetadataRestRepo.java +++ b/products-microservice/src/main/java/com/yugabyte/app/yugastore/repo/rest/ProductMetadataRestRepo.java @@ -1,7 +1,7 @@ package com.yugabyte.app.yugastore.repo.rest; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; import java.util.ArrayList; import java.util.List; diff --git a/products-microservice/src/main/resources/application.properties b/products-microservice/src/main/resources/application.properties index 044ada5..25a449d 100644 --- a/products-microservice/src/main/resources/application.properties +++ b/products-microservice/src/main/resources/application.properties @@ -1,5 +1,9 @@ logging.level.org.springframework.web=INFO -cronos.yugabyte.keyspace=cronos -cronos.yugabyte.hostname=10.100.200.225 -cronos.yugabyte.port=9042 -spring.profiles.active=local +#cronos.yugabyte.keyspace=cronos +#cronos.yugabyte.hostname=10.100.200.225 +#cronos.yugabyte.port=9042 + +spring.data.cassandra.keyspace-name=cronos +spring.data.cassandra.contact-points=35.245.245.126 +spring.data.cassandra.port=9042 +#spring.profiles.active=local diff --git a/react-ui/.classpath b/react-ui/.classpath index a5d9509..39abf1c 100644 --- a/react-ui/.classpath +++ b/react-ui/.classpath @@ -28,5 +28,22 @@ + + + + + + + + + + + + + + + + + diff --git a/react-ui/.project b/react-ui/.project index afcc2f4..7108e2d 100644 --- a/react-ui/.project +++ b/react-ui/.project @@ -16,17 +16,17 @@ - org.eclipse.m2e.core.maven2Builder + org.springframework.ide.eclipse.core.springbuilder - org.springframework.ide.eclipse.core.springbuilder + org.springframework.ide.eclipse.boot.validation.springbootbuilder - org.springframework.ide.eclipse.boot.validation.springbootbuilder + org.eclipse.m2e.core.maven2Builder diff --git a/react-ui/.settings/org.eclipse.core.resources.prefs b/react-ui/.settings/org.eclipse.core.resources.prefs index 99f26c0..839d647 100644 --- a/react-ui/.settings/org.eclipse.core.resources.prefs +++ b/react-ui/.settings/org.eclipse.core.resources.prefs @@ -1,2 +1,5 @@ eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 encoding/=UTF-8 diff --git a/react-ui/.settings/org.eclipse.jdt.core.prefs b/react-ui/.settings/org.eclipse.jdt.core.prefs index 9c81ef9..951833c 100644 --- a/react-ui/.settings/org.eclipse.jdt.core.prefs +++ b/react-ui/.settings/org.eclipse.jdt.core.prefs @@ -2,6 +2,9 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.methodParameters=generate org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.processAnnotations=disabled org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8 diff --git a/react-ui/Dockerfile b/react-ui/Dockerfile index b16e9a4..e08873e 100644 --- a/react-ui/Dockerfile +++ b/react-ui/Dockerfile @@ -1,5 +1,5 @@ FROM openjdk:8-jdk-alpine VOLUME /tmp -ARG JAR_FILE +ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] diff --git a/react-ui/config-map.yml b/react-ui/config-map.yml new file mode 100644 index 0000000..e8c026b --- /dev/null +++ b/react-ui/config-map.yml @@ -0,0 +1,6 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: yugastore-ui-properties +data: + cronos.yugabyte.api: http://api-gateway.default.svc.cluster.local:8080/api/v1/ diff --git a/react-ui/deployment.yml b/react-ui/deployment.yml index a1a9cfe..1e9fbdb 100644 --- a/react-ui/deployment.yml +++ b/react-ui/deployment.yml @@ -4,28 +4,33 @@ metadata: name: sappho-retailapp-ui labels: app: ui + version: v1 spec: replicas: 1 selector: matchLabels: app: ui + version: v1 template: metadata: labels: app: ui + version: v1 spec: containers: - name: sappho-retailapp-ui image: nchandrappa/sappho-retailapp-ui + envFrom: + - configMapRef: + name: yugastore-ui-properties ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: - name: sappho-retailapp-ui-lb + name: yugastore-ui spec: - type: LoadBalancer selector: app: ui ports: diff --git a/react-ui/frontend/package-lock.json b/react-ui/frontend/package-lock.json index 2acfb3a..d07be3e 100644 --- a/react-ui/frontend/package-lock.json +++ b/react-ui/frontend/package-lock.json @@ -4297,7 +4297,7 @@ "requires": { "assert-plus": "0.2.0", "jsprim": "1.4.0", - "sshpk": "1.13.2" + "sshpk": "1.13.0" } }, "inflight": { @@ -4348,7 +4348,8 @@ }, "jsbn": { "version": "0.1.1", - "bundled": true + "bundled": true, + "optional": true }, "json-schema": { "version": "0.2.3", @@ -4620,7 +4621,7 @@ } }, "sshpk": { - "version": "1.13.2", + "version": "1.13.0", "bundled": true, "optional": true, "requires": { @@ -4717,7 +4718,8 @@ }, "tweetnacl": { "version": "0.14.5", - "bundled": true + "bundled": true, + "optional": true }, "uid-number": { "version": "0.0.6", diff --git a/react-ui/service.yaml b/react-ui/service.yaml new file mode 100644 index 0000000..7dda38f --- /dev/null +++ b/react-ui/service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: sappho-retailapp-ui-lb +spec: + type: LoadBalancer + selector: + app: ui + ports: + - protocol: TCP + port: 8080 + targetPort: 8080 \ No newline at end of file diff --git a/react-ui/src/main/resources/application.properties b/react-ui/src/main/resources/application.properties index b3057dd..6e02c94 100644 --- a/react-ui/src/main/resources/application.properties +++ b/react-ui/src/main/resources/application.properties @@ -1,4 +1,2 @@ -//cronos.yugabyte.api=http://localhost:8081/api/v1/ -cronos.yugabyte.api=http://35.184.32.206:8080/api/v1/ -server.port=8080 +#cronos.yugabyte.api=http://localhost:8081/api/v1/ logging.level.org.springframework.web=INFO diff --git a/resources/kubernetes/yugabyte-statefulset-rf-1.yaml b/resources/kubernetes/yugabyte-statefulset-rf-1.yaml new file mode 100644 index 0000000..541f391 --- /dev/null +++ b/resources/kubernetes/yugabyte-statefulset-rf-1.yaml @@ -0,0 +1,292 @@ +# +# Overall Design: +# There are two Kubernetes StatefulSets in this yaml file - yb-master and yb-tserver. Each of +# these has the following: +# - a headless service to expose a DNS entry for discovery +# - a service to expose end-points to the outside world +# - the stateful set itself +# - a load-balancer service to view the universe dashboard UI +# +# Using YB with k8s +# - Create cluster : kubectl apply -f yugabyte-statefulset.yaml +# - List the pods : kubectl get pods +# - Run cqlsh : kubectl exec -it yb-tserver-0 /home/yugabyte/bin/cqlsh +# - Run Redis cli : kubectl exec -it yb-tserver-0 /home/yugabyte/bin/redis-cli +# - Run psql : kubectl exec -it yb-tserver-0 /home/yugabyte/bin/ysqlsh -- +# -U postgres -d postgres -h yb-tserver-0 -p 5433 +# - Connect to the ui : kubectl port-forward yb-master-0 7000 +# You can now view the UI at http://localhost:7000 +# - Destroy cluster : kubectl delete -f yugabyte-statefulset.yaml +# - Delete PVCs : kubectl delete pvc -l app=yb-tserver && kubectl delete pvc -l app=yb-master + +apiVersion: v1 +kind: Service +metadata: + # This is a "headless" service for the yb-master which exists to allow discovery of the set of + # member pods (masters). The CNAME of this service points to SRV records - one for each Pod that + # is Running and Ready). Read more in the Kubernetes docs: + # https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/ + name: yb-masters + labels: + app: yb-master +spec: + clusterIP: None + ports: + - name: ui + port: 7000 + - name: rpc-port + port: 7100 + selector: + app: yb-master +--- +apiVersion: v1 +kind: Service +metadata: + name: yb-master-ui + labels: + app: yb-master +spec: + ports: + - name: ui + port: 7000 + selector: + app: yb-master + type: LoadBalancer +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: yb-master + labels: + app: yb-master +spec: + serviceName: yb-masters + podManagementPolicy: "Parallel" + replicas: 1 + selector: + matchLabels: + app: yb-master + template: + metadata: + labels: + app: yb-master + spec: + affinity: + # Set the anti-affinity selector scope to YB masters. + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: app + operator: In + values: + - yb-master + topologyKey: kubernetes.io/hostname + containers: + - name: yb-master + image: yugabytedb/yugabyte:latest + imagePullPolicy: Always + env: + - name: GET_HOSTS_FROM + value: dns + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + command: + - "/home/yugabyte/bin/yb-master" + - "--fs_data_dirs=/mnt/data0" + - "--rpc_bind_addresses=$(POD_NAME).yb-masters.$(NAMESPACE).svc.cluster.local:7100" + - "--server_broadcast_addresses=$(POD_NAME).yb-masters.$(NAMESPACE).svc.cluster.local:7100" + - "--use_private_ip=never" + - "--master_addresses=yb-master-0.yb-masters.$(NAMESPACE).svc.cluster.local:7100" + # To disable YugaByte SQL API functionality, set the + # "enable_ysql" flag to false. Flag supported after 2.0. + - "--enable_ysql=true" + - "--replication_factor=1" + - "--logtostderr" + ports: + - containerPort: 7000 + name: master-ui + - containerPort: 7100 + name: master-rpc +# readinessProbe: +# tcpSocket: +# port: 7100 +# initialDelaySeconds: 5 +# periodSeconds: 10 +# livenessProbe: +# tcpSocket: +# port: 7100 +# initialDelaySeconds: 15 +# periodSeconds: 10 + + # These volume mounts are persistent. They are like inline claims, + # but not exactly because the names need to match exactly one of + # the stateful pod volumes. + volumeMounts: + - name: datadir + mountPath: /mnt/data0 + updateStrategy: + type: RollingUpdate + # These are converted to volume claims by the controller + # and mounted at the paths mentioned above. + # do not use these in production until ssd GCEPersistentDisk or other ssd pd + volumeClaimTemplates: + - metadata: + name: datadir + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 10Gi + storageClassName: standard + +--- +apiVersion: v1 +kind: Service +metadata: + # This is a "headless" service for the yb-tserver which exists to allow discovery of the set of + # member pods (tservers). + name: yb-tservers + labels: + app: yb-tserver +spec: + clusterIP: None + ports: + - name: ui + port: 9000 + - name: rpc-port + port: 9100 + - name: cassandra + port: 9042 + - name: redis + port: 6379 + - name: postgres + port: 5433 + selector: + app: yb-tserver +--- +apiVersion: v1 +kind: Service +metadata: + name: yb-db-service + labels: + app: yb-tserver +spec: + ports: + - name: ui + port: 9000 + - name: cassandra + port: 9042 + - name: redis + port: 6379 + - name: postgres + port: 5433 + selector: + app: yb-tserver + type: LoadBalancer +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: yb-tserver + labels: + app: yb-tserver +spec: + serviceName: yb-tservers + podManagementPolicy: "Parallel" + replicas: 1 + selector: + matchLabels: + app: yb-tserver + template: + metadata: + labels: + app: yb-tserver + spec: + affinity: + # Set the anti-affinity selector scope to YB tservers here. + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: app + operator: In + values: + - yb-tserver + topologyKey: kubernetes.io/hostname + containers: + - name: yb-tserver + image: yugabytedb/yugabyte:latest + imagePullPolicy: Always + env: + - name: GET_HOSTS_FROM + value: dns + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + command: + - "/home/yugabyte/bin/yb-tserver" + - "--fs_data_dirs=/mnt/data0" + - "--rpc_bind_addresses=$(POD_NAME).yb-tservers.$(NAMESPACE).svc.cluster.local:9100" + - "--server_broadcast_addresses=$(POD_NAME).yb-tservers.$(NAMESPACE).svc.cluster.local:9100" + # To disable YugaByte SQL API functionality, set the enable_ysql flag to false + # and comment out the pgsql_proxy_bind_address flag + - "--enable_ysql=true" + - "--pgsql_proxy_bind_address=$(POD_IP):5433" + - "--use_private_ip=never" + - "--tserver_master_addrs=yb-master-0.yb-masters.$(NAMESPACE).svc.cluster.local:7100" + - "--logtostderr" + ports: + - containerPort: 9000 + name: tserver-ui + - containerPort: 9100 + name: tserver-rpc + - containerPort: 9042 + name: cassandra + - containerPort: 6379 + name: redis + - containerPort: 5433 + name: postgres + # These volume mounts are persistent. They are like inline claims, + # but not exactly because the names need to match exactly one of + # the stateful pod volumes. + volumeMounts: + - name: datadir + mountPath: /mnt/data0 + updateStrategy: + type: RollingUpdate + # These are converted to volume claims by the controller + # and mounted at the paths mentioned above. + # do not use these in production until ssd GCEPersistentDisk or other ssd pd + volumeClaimTemplates: + - metadata: + name: datadir + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 10Gi + storageClassName: standard From cf06bc848b131176022bed2b6f740f7420e031bc Mon Sep 17 00:00:00 2001 From: Nikhil Malladihalli chandrappa Date: Mon, 13 Jan 2020 14:44:34 -0800 Subject: [PATCH 03/11] removing old content --- .../kubernetes/yugabyte-statefulset-rf-1.yaml | 292 ------------------ 1 file changed, 292 deletions(-) delete mode 100644 resources/kubernetes/yugabyte-statefulset-rf-1.yaml diff --git a/resources/kubernetes/yugabyte-statefulset-rf-1.yaml b/resources/kubernetes/yugabyte-statefulset-rf-1.yaml deleted file mode 100644 index 541f391..0000000 --- a/resources/kubernetes/yugabyte-statefulset-rf-1.yaml +++ /dev/null @@ -1,292 +0,0 @@ -# -# Overall Design: -# There are two Kubernetes StatefulSets in this yaml file - yb-master and yb-tserver. Each of -# these has the following: -# - a headless service to expose a DNS entry for discovery -# - a service to expose end-points to the outside world -# - the stateful set itself -# - a load-balancer service to view the universe dashboard UI -# -# Using YB with k8s -# - Create cluster : kubectl apply -f yugabyte-statefulset.yaml -# - List the pods : kubectl get pods -# - Run cqlsh : kubectl exec -it yb-tserver-0 /home/yugabyte/bin/cqlsh -# - Run Redis cli : kubectl exec -it yb-tserver-0 /home/yugabyte/bin/redis-cli -# - Run psql : kubectl exec -it yb-tserver-0 /home/yugabyte/bin/ysqlsh -- -# -U postgres -d postgres -h yb-tserver-0 -p 5433 -# - Connect to the ui : kubectl port-forward yb-master-0 7000 -# You can now view the UI at http://localhost:7000 -# - Destroy cluster : kubectl delete -f yugabyte-statefulset.yaml -# - Delete PVCs : kubectl delete pvc -l app=yb-tserver && kubectl delete pvc -l app=yb-master - -apiVersion: v1 -kind: Service -metadata: - # This is a "headless" service for the yb-master which exists to allow discovery of the set of - # member pods (masters). The CNAME of this service points to SRV records - one for each Pod that - # is Running and Ready). Read more in the Kubernetes docs: - # https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/ - name: yb-masters - labels: - app: yb-master -spec: - clusterIP: None - ports: - - name: ui - port: 7000 - - name: rpc-port - port: 7100 - selector: - app: yb-master ---- -apiVersion: v1 -kind: Service -metadata: - name: yb-master-ui - labels: - app: yb-master -spec: - ports: - - name: ui - port: 7000 - selector: - app: yb-master - type: LoadBalancer ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: yb-master - labels: - app: yb-master -spec: - serviceName: yb-masters - podManagementPolicy: "Parallel" - replicas: 1 - selector: - matchLabels: - app: yb-master - template: - metadata: - labels: - app: yb-master - spec: - affinity: - # Set the anti-affinity selector scope to YB masters. - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 100 - podAffinityTerm: - labelSelector: - matchExpressions: - - key: app - operator: In - values: - - yb-master - topologyKey: kubernetes.io/hostname - containers: - - name: yb-master - image: yugabytedb/yugabyte:latest - imagePullPolicy: Always - env: - - name: GET_HOSTS_FROM - value: dns - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - command: - - "/home/yugabyte/bin/yb-master" - - "--fs_data_dirs=/mnt/data0" - - "--rpc_bind_addresses=$(POD_NAME).yb-masters.$(NAMESPACE).svc.cluster.local:7100" - - "--server_broadcast_addresses=$(POD_NAME).yb-masters.$(NAMESPACE).svc.cluster.local:7100" - - "--use_private_ip=never" - - "--master_addresses=yb-master-0.yb-masters.$(NAMESPACE).svc.cluster.local:7100" - # To disable YugaByte SQL API functionality, set the - # "enable_ysql" flag to false. Flag supported after 2.0. - - "--enable_ysql=true" - - "--replication_factor=1" - - "--logtostderr" - ports: - - containerPort: 7000 - name: master-ui - - containerPort: 7100 - name: master-rpc -# readinessProbe: -# tcpSocket: -# port: 7100 -# initialDelaySeconds: 5 -# periodSeconds: 10 -# livenessProbe: -# tcpSocket: -# port: 7100 -# initialDelaySeconds: 15 -# periodSeconds: 10 - - # These volume mounts are persistent. They are like inline claims, - # but not exactly because the names need to match exactly one of - # the stateful pod volumes. - volumeMounts: - - name: datadir - mountPath: /mnt/data0 - updateStrategy: - type: RollingUpdate - # These are converted to volume claims by the controller - # and mounted at the paths mentioned above. - # do not use these in production until ssd GCEPersistentDisk or other ssd pd - volumeClaimTemplates: - - metadata: - name: datadir - spec: - accessModes: [ "ReadWriteOnce" ] - resources: - requests: - storage: 10Gi - storageClassName: standard - ---- -apiVersion: v1 -kind: Service -metadata: - # This is a "headless" service for the yb-tserver which exists to allow discovery of the set of - # member pods (tservers). - name: yb-tservers - labels: - app: yb-tserver -spec: - clusterIP: None - ports: - - name: ui - port: 9000 - - name: rpc-port - port: 9100 - - name: cassandra - port: 9042 - - name: redis - port: 6379 - - name: postgres - port: 5433 - selector: - app: yb-tserver ---- -apiVersion: v1 -kind: Service -metadata: - name: yb-db-service - labels: - app: yb-tserver -spec: - ports: - - name: ui - port: 9000 - - name: cassandra - port: 9042 - - name: redis - port: 6379 - - name: postgres - port: 5433 - selector: - app: yb-tserver - type: LoadBalancer ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: yb-tserver - labels: - app: yb-tserver -spec: - serviceName: yb-tservers - podManagementPolicy: "Parallel" - replicas: 1 - selector: - matchLabels: - app: yb-tserver - template: - metadata: - labels: - app: yb-tserver - spec: - affinity: - # Set the anti-affinity selector scope to YB tservers here. - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 100 - podAffinityTerm: - labelSelector: - matchExpressions: - - key: app - operator: In - values: - - yb-tserver - topologyKey: kubernetes.io/hostname - containers: - - name: yb-tserver - image: yugabytedb/yugabyte:latest - imagePullPolicy: Always - env: - - name: GET_HOSTS_FROM - value: dns - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - command: - - "/home/yugabyte/bin/yb-tserver" - - "--fs_data_dirs=/mnt/data0" - - "--rpc_bind_addresses=$(POD_NAME).yb-tservers.$(NAMESPACE).svc.cluster.local:9100" - - "--server_broadcast_addresses=$(POD_NAME).yb-tservers.$(NAMESPACE).svc.cluster.local:9100" - # To disable YugaByte SQL API functionality, set the enable_ysql flag to false - # and comment out the pgsql_proxy_bind_address flag - - "--enable_ysql=true" - - "--pgsql_proxy_bind_address=$(POD_IP):5433" - - "--use_private_ip=never" - - "--tserver_master_addrs=yb-master-0.yb-masters.$(NAMESPACE).svc.cluster.local:7100" - - "--logtostderr" - ports: - - containerPort: 9000 - name: tserver-ui - - containerPort: 9100 - name: tserver-rpc - - containerPort: 9042 - name: cassandra - - containerPort: 6379 - name: redis - - containerPort: 5433 - name: postgres - # These volume mounts are persistent. They are like inline claims, - # but not exactly because the names need to match exactly one of - # the stateful pod volumes. - volumeMounts: - - name: datadir - mountPath: /mnt/data0 - updateStrategy: - type: RollingUpdate - # These are converted to volume claims by the controller - # and mounted at the paths mentioned above. - # do not use these in production until ssd GCEPersistentDisk or other ssd pd - volumeClaimTemplates: - - metadata: - name: datadir - spec: - accessModes: [ "ReadWriteOnce" ] - resources: - requests: - storage: 10Gi - storageClassName: standard From 71ccb8f9d1f88c8aebf9b632ed3811496f24ed32 Mon Sep 17 00:00:00 2001 From: Nikhil Malladihalli chandrappa Date: Tue, 14 Jan 2020 12:21:30 -0800 Subject: [PATCH 04/11] updating readme for k8s native --- .mvn/wrapper/MavenWrapperDownloader.java | 114 +++++++++ .mvn/wrapper/maven-wrapper.properties | 1 + README.md | 99 ++++---- mvnw | 310 +++++++++++++++++++++++ mvnw.cmd | 182 +++++++++++++ pom.xml | 2 +- yugastore-java-architecture.png | Bin 89966 -> 0 bytes yugastore-java-k8s-architecture.png | Bin 0 -> 45538 bytes 8 files changed, 655 insertions(+), 53 deletions(-) create mode 100644 .mvn/wrapper/MavenWrapperDownloader.java create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100755 mvnw create mode 100644 mvnw.cmd delete mode 100644 yugastore-java-architecture.png create mode 100644 yugastore-java-k8s-architecture.png diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..72308aa --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,114 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +*/ + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.util.Properties; + +public class MavenWrapperDownloader { + + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = + "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: : " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..cd0d451 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip diff --git a/README.md b/README.md index 4cf8cd7..63d675d 100644 --- a/README.md +++ b/README.md @@ -22,108 +22,103 @@ You can also [try the app out](https://yugastore-ui.cfapps.io/) online, it is ho The architecture diagram of YugaStore is shown below. -![Architecture of microservices based retail marketplace app](yugastore-java-architecture.png) +![Architecture of microservices based retail marketplace app](yugastore-java-k8s-architecture.png) -| Microservice | YugaByte DB API | Default host:port | Description | -| -------------------- | ---------------- | ---------------- | --------------------- | -| [service discovery](https://github.com/YugaByte/yugastore-java/tree/master/eureka-server-local) | - | [localhost:8761](http://localhost:8761) | Uses **Eureka** for localhost. All microservices register with the Eureka service. This registration information is used to discover dynamic properties of any microservice. Examples of discovery include finding the hostnames or ip addresses, the load balancer and the port on which the microservice is currently running. -| [react-ui](https://github.com/YugaByte/yugastore-java/tree/master/react-ui) | - | [localhost:8080](http://localhost:8080) | A react-based UI for the eCommerce online marketplace app. -| [api-gateway](https://github.com/YugaByte/yugastore-java/tree/master/api-gateway-microservice) | - | [localhost:8081](http://localhost:8081) | This microservice handles all the external API requests. The UI only communicates with this microservice. -| [products](https://github.com/YugaByte/yugastore-java/tree/master/products-microservice) | YCQL | [localhost:8082](http://localhost:8082) | This microservice contains the entire product catalog. It can list products by categories, return the most popular products as measured by sales rank, etc. -| [cart](https://github.com/YugaByte/yugastore-java/tree/master/cart-microservice) | YCQL | [localhost:8083](http://localhost:8083) | This microservice deals with users adding items to the shopping cart. It has to be necessarily highly available, low latency and often multi-region. -| [checkout](https://github.com/YugaByte/yugastore-java/tree/master/checkout-microservice) | YSQL | [localhost:8086](http://localhost:8086) | This deals with the checkout process and the placed order. It also manages the inventory of all the products because it needs to ensure the product the user is about to order is still in stock. -| [login](https://github.com/YugaByte/yugastore-java/tree/master/login-microservice) | YSQL | [localhost:8085](http://localhost:8085) | Handles login and authentication of the users. *Note that this is still a work in progress.* +| Microservice | YugaByte DB API | Description | +| -------------------- | --------------- | --------------------- | +| [react-ui](https://github.com/YugaByte/yugastore-java/tree/master/react-ui) | - | A react-based UI for the eCommerce online marketplace app. +| [api-gateway](https://github.com/YugaByte/yugastore-java/tree/master/api-gateway-microservice) | - | This microservice handles all the external API requests. The UI only communicates with this microservice. +| [products](https://github.com/YugaByte/yugastore-java/tree/master/products-microservice) | YCQL | This microservice contains the entire product catalog. It can list products by categories, return the most popular products as measured by sales rank, etc. +| [cart](https://github.com/YugaByte/yugastore-java/tree/master/cart-microservice) | YCQL | This microservice deals with users adding items to the shopping cart. It has to be necessarily highly available, low latency and often multi-region. +| [checkout](https://github.com/YugaByte/yugastore-java/tree/master/checkout-microservice) | YSQL | This deals with the checkout process and the placed order. It also manages the inventory of all the products because it needs to ensure the product the user is about to order is still in stock. +| [login](https://github.com/YugaByte/yugastore-java/tree/master/login-microservice) | YSQL | Handles login and authentication of the users. *Note that this is still a work in progress.* # Build and run +## Build Jars with Maven To build, simply run the following from the base directory: ``` $ mvn -DskipTests package ``` -To run the app, you need to first install YugaByte DB, create the necessary tables, start each of the microservices and finally the React UI. -## Running the app +## Build a Docker Image with Maven -Make sure you have built the app as described above. Now do the following steps. - -## Step 1: Install and initialize YugaByte DB - -You can [install YugaByte DB by following these instructions](https://docs.yugabyte.com/latest/quick-start/). - -Now create the necessary tables as shown below. Note that these steps would take a few seconds. +To get started quickly, you can run Jib without even changing your pom.xml: ``` -$ cd resources -$ cqlsh -f schema.cql +$ ./mvnw com.google.cloud.tools:jib-maven-plugin:dockerBuild -Dimage=nchandrappa/cart-microservice ``` -Next, load some sample data. + +To push to a Docker registry you use the build goal, instead of dockerBuild, i.e. ``` -$ cd resources -$ ./dataload.sh +$ ./mvnw com.google.cloud.tools:jib-maven-plugin:build -Dimage=nchandrappa/cart-microservice ``` -Create the postgres tables in `resources/schema.sql` for the YSQL tables. +To run the app on your local Minikube, you need to first install YugaByte DB, create the necessary tables, start each of the microservices and finally the React UI. + +## Running the app on Minikube + +Make sure you have built the docker images as described above and you're in the yugastore-java base directory. Now do the following steps. -## Step 2: Start the Eureka service discovery (local) -You can do this as follows: +## verify if minikube in running ``` -$ cd eureka-server-local/ -$ mvn spring-boot:run +$ minikube status ``` -Verify this is running by browsing to the [Spring Eureka Service Discovery dashboard](http://localhost:8761/). +## Step 1: Install and initialize YugaByte DB -## Step 2: Start the api gateway microservice +You can [install YugaByte DB by following these instructions](https://docs.yugabyte.com/latest/quick-start/). -To run the products microservice, do the following in a separate shell: +=> Install YugabyteDB in minikube ``` -$ cd api-gateway-microservice/ -$ mvn spring-boot:run -``` - +$ kubectl create -f k8s-deployments/util/default-rbac.yml +$ kubectl create namespace yb-demo +$ kubectl create -f k8s-deployments/Yugabyte/yugabyte-statefulset-rf-1.yaml -n yb-demo -## Step 3: Start the products microservice +``` -To run the products microservice, do the following in a separate shell: +==> Verify YugabyteDB installation by connecting to postgres terminal using the following command ``` -$ cd products-microservice/ -$ mvn spring-boot:run +$ kubectl -n yb-demo exec -it yb-tserver-0 /home/yugabyte/bin/ysqlsh -- -h yb-tserver-0 --echo-queries ``` -## Step 4: Start the checkout microservice +Now create the necessary tables as shown below. Load sample dataset by following the steps here: (resources/README.md) -To run the products microservice, do the following in a separate shell: +``` +$ cd resources +$ cqlsh -f schema.cql +``` +Next, load some sample data. Follow the data load steps in ``` -$ cd checkout-microservice/ -$ mvn spring-boot:run +$ cd resources +$ ./dataload.sh ``` -## Step 5: Start the checkout microservice +Create the postgres tables in `resources/schema.sql` for the YSQL tables. -To run the cart microservice, do the following in a separate shell: +## Step 2: Deploy yugastore-java microservices ``` -$ cd cart-microservice/ -$ mvn spring-boot:run +$ kubectl create -f k8s-deployments/microservices/yugastore-deployment.yaml ``` -## Step 6: Start the UI + +## Step 3: browse to the marketplace app To do this, simply run `npm start` from the `frontend` directory in a separate shell: ``` -$ cd react-ui -$ mvn spring-boot:run +$ minikube service yugastore-ui ``` -Now browse to the marketplace app at [http://localhost:8080/](http://localhost:8080/). +this command will open up Yugastore Dashboard. diff --git a/mvnw b/mvnw new file mode 100755 index 0000000..a16b543 --- /dev/null +++ b/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml index ebaaad8..27b2b4a 100644 --- a/pom.xml +++ b/pom.xml @@ -12,10 +12,10 @@ YugaStore - a microservices based retail marketplace app - eureka-server-local products-microservice checkout-microservice cart-microservice + cart-microservice-v1 api-gateway-microservice react-ui login-microservice diff --git a/yugastore-java-architecture.png b/yugastore-java-architecture.png deleted file mode 100644 index 63ae8e0333528976c695351ba19e954fc7457d32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89966 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 diff --git a/yugastore-java-k8s-architecture.png b/yugastore-java-k8s-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..7c38264beaf9dfbb4d6183ab021ea89db509f7c5 GIT binary patch literal 45538 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 Date: Thu, 16 Jan 2020 12:03:55 -0800 Subject: [PATCH 05/11] changes to readme --- README.md | 47 ++++++-- resources/dataload.sh | 8 +- resources/k8s-deployoment-instructions.md | 131 ++++++++++++++++++++++ 3 files changed, 174 insertions(+), 12 deletions(-) create mode 100644 resources/k8s-deployoment-instructions.md diff --git a/README.md b/README.md index 63d675d..306a0f3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # YugaStore in Java -This is an implementation of a sample ecommerce app. This microservices-based retail marketplace or eCommerce app is composed of **microservices written in Spring (Java)**, a **UI based on React** and **YugaByte DB as the distributed SQL database**. +This is an implementation of a sample ecommerce app. This microservices-based retail marketplace or eCommerce app is composed of **microservices written in Spring (Java)**, a **UI based on React** and **YugaByte DB as the distributed SQL database**. If you're using this demo app, please :star: this repository! We appreciate your support. @@ -58,11 +58,13 @@ To push to a Docker registry you use the build goal, instead of dockerBuild, i.e $ ./mvnw com.google.cloud.tools:jib-maven-plugin:build -Dimage=nchandrappa/cart-microservice ``` +Note: Update docker image id to reflect the docker repository of your choice. + To run the app on your local Minikube, you need to first install YugaByte DB, create the necessary tables, start each of the microservices and finally the React UI. ## Running the app on Minikube -Make sure you have built the docker images as described above and you're in the yugastore-java base directory. Now do the following steps. +Make sure you have built the docker images as described above and you're in the `yugastore-java` base directory. Now do the following steps. ## verify if minikube in running @@ -75,7 +77,7 @@ $ minikube status You can [install YugaByte DB by following these instructions](https://docs.yugabyte.com/latest/quick-start/). -=> Install YugabyteDB in minikube +a. Install YugabyteDB in minikube ``` $ kubectl create -f k8s-deployments/util/default-rbac.yml @@ -84,18 +86,34 @@ $ kubectl create -f k8s-deployments/Yugabyte/yugabyte-statefulset-rf-1.yaml -n y ``` -==> Verify YugabyteDB installation by connecting to postgres terminal using the following command +b. Verify YugabyteDB installation by connecting to postgres terminal using the following command ``` $ kubectl -n yb-demo exec -it yb-tserver-0 /home/yugabyte/bin/ysqlsh -- -h yb-tserver-0 --echo-queries ``` -Now create the necessary tables as shown below. Load sample dataset by following the steps here: (resources/README.md) +c. find the YCQL and YSQL ip-address:port for YugabyteDB cluster by running the below command + +``` +$ minikube service yb-db-service -n yb-demo +``` + +set the following environment variables from above data. example: + +``` +$ export CQLSH_HOST=192.168.64.3 +$ export CQLSH_PORT=31620 +$ export YSQLSH_HOST=192.168.64.3 +$ export YSQLSH_PORT=32517 +``` + +d. Now create the necessary tables as shown below. Load sample dataset by following the steps here: (resources/README.md) ``` $ cd resources $ cqlsh -f schema.cql ``` + Next, load some sample data. Follow the data load steps in ``` @@ -103,7 +121,11 @@ $ cd resources $ ./dataload.sh ``` -Create the postgres tables in `resources/schema.sql` for the YSQL tables. +Create the postgres tables in `resources/schema.sql` for the YSQL tables + +``` +$ ysqlsh -h $YSQLSH_HOST -p $YSQLSH_PORT -d postgres -f schema.sql +``` ## Step 2: Deploy yugastore-java microservices @@ -114,11 +136,20 @@ $ kubectl create -f k8s-deployments/microservices/yugastore-deployment.yaml ## Step 3: browse to the marketplace app -To do this, simply run `npm start` from the `frontend` directory in a separate shell: - ``` $ minikube service yugastore-ui ``` this command will open up Yugastore Dashboard. + +# Next Steps + +- [Deploy Yugastore on Istio enabled Kubernetes Cluster] (/resources/k8s-deployoment-instructions.md) + + +# Learn more + +- [Learn YugabyteDB](https://learn.yugabyte.com/) +- [Contribute to YugabyteDB](https://www.yugabyte.com/community/) +- [Contribute to Spring Data YugabyteDB](https://github.com/yugabyte/spring-data-yugabytedb) diff --git a/resources/dataload.sh b/resources/dataload.sh index 4514d8a..7d52584 100755 --- a/resources/dataload.sh +++ b/resources/dataload.sh @@ -1,8 +1,8 @@ for i in products.json; do python parse_metadata_json.py $i; - ./cassandra-loader -f cronos_products.csv -host 127.0.0.1 -port 9042 -schema "cronos.products(asin, title, description, price, imUrl, also_bought, also_viewed, bought_together, buy_after_viewing, brand, categories,num_reviews,num_stars,avg_stars)" -maxInsertErrors 10000 -maxErrors 10000 -charsPerColumn 256000; - ./cassandra-loader -f cronos_product_rankings.csv -host 127.0.0.1 -port 9042 -schema "cronos.product_rankings(asin, category, sales_rank, title, price, imurl, num_reviews, num_stars, avg_stars)" -maxInsertErrors 10000 -maxErrors 10000 -charsPerColumn 256000; - ./cassandra-loader -f cronos_product_inventory.csv -host 127.0.0.1 -port 9042 -schema "cronos.product_inventory(asin, quantity)"; + ./cassandra-loader -f cronos_products.csv -host $CQLSH_HOST -port $CQLSH_PORT -schema "cronos.products(asin, title, description, price, imUrl, also_bought, also_viewed, bought_together, buy_after_viewing, brand, categories,num_reviews,num_stars,avg_stars)" -maxInsertErrors 10000 -maxErrors 10000 -charsPerColumn 256000; + ./cassandra-loader -f cronos_product_rankings.csv -host $CQLSH_HOST -port $CQLSH_PORT -schema "cronos.product_rankings(asin, category, sales_rank, title, price, imurl, num_reviews, num_stars, avg_stars)" -maxInsertErrors 10000 -maxErrors 10000 -charsPerColumn 256000; + ./cassandra-loader -f cronos_product_inventory.csv -host $CQLSH_HOST -port $CQLSH_PORT -schema "cronos.product_inventory(asin, quantity)"; rm *.csv* -done +done \ No newline at end of file diff --git a/resources/k8s-deployoment-instructions.md b/resources/k8s-deployoment-instructions.md new file mode 100644 index 0000000..d2c15e8 --- /dev/null +++ b/resources/k8s-deployoment-instructions.md @@ -0,0 +1,131 @@ +# Yugastore on Managed Kubernetes + +This is an implementation of a sample ecommerce app. This microservices-based retail marketplace or eCommerce app is composed of **microservices written in Spring (Java)**, a **UI based on React**, **YugaByte DB as the distributed SQL database** and **Istio for microservices traffic management**. + + +# Features + +* Written fully in Spring +* Desgined for multi-region and Kubernetes-native deployments +* Istio for microservices traffic management and Service Discovery +* Features 6 microservices +* Sample data has over 6K products in the store + + +# Build and run + +## Build Jars with Maven +To build, simply run the following from the base directory: + +``` +$ mvn -DskipTests package +``` + + +## Build a Docker Image with Maven + +To get started quickly, you can run Jib without even changing your pom.xml: + +``` +$ ./mvnw com.google.cloud.tools:jib-maven-plugin:dockerBuild -Dimage=nchandrappa/cart-microservice +``` + +To push to a Docker registry you use the build goal, instead of dockerBuild, i.e. + +``` +$ ./mvnw com.google.cloud.tools:jib-maven-plugin:build -Dimage=nchandrappa/cart-microservice +``` + +Note: Update docker image id to reflect the docker repository of your choice. + + +## Deploy Istio on kubernetes + +Install Istio on your kubernetes cluster using `demo` profile so that monitoring and tracing are enabled by default for microservices. [Istio installation docs] (https://istio.io/docs/setup/install/helm/) + + +## Deploy YugabyteDB cluster on Kubernetes + +You can [install YugaByte DB by following these instructions](https://docs.yugabyte.com/latest/quick-start/). + +a. Install YugabyteDB in minikube + +``` +$ kubectl create -f k8s-deployments/util/default-rbac.yml +$ kubectl create namespace yb-demo +$ kubectl create -f k8s-deployments/Yugabyte/yugabyte-statefulset-rf-1.yaml -n yb-demo + +``` + +## Load Sample Data into cluster created in previous step + +a. Verify YugabyteDB installation by connecting to postgres terminal using the following command + +``` +$ kubectl -n yb-demo exec -it yb-tserver-0 /home/yugabyte/bin/ysqlsh -- -h yb-tserver-0 --echo-queries +``` + +b. find the external-ip for YugabyteDB cluster by running the below command + +``` +$ kubectl get service yb-db-service -n yb-demo +``` + +set the following environment variables from above data. example: + +``` +$ export CQLSH_HOST=192.168.64.3 +$ export CQLSH_PORT=9042 +$ export YSQLSH_HOST=192.168.64.3 +$ export YSQLSH_PORT=5433 +``` + +d. Now create the necessary tables as shown below. Load sample dataset by following the steps here: (resources/README.md) + +``` +$ cqlsh -f resources/schema.cql +``` + +Next, load some sample data. Follow the data load steps in + +``` +$ ./resources/dataload.sh +``` + +Create the postgres tables in `resources/schema.sql` for the YSQL tables + +``` +$ ysqlsh -h $YSQLSH_HOST -p $YSQLSH_PORT -d postgres -f schema.sql +``` + +## Deploy Istio Destination Rules and Virtual Servers + + +``` +kubectl label namespace default istio-injection=enabled +kubectl apply -f k8s-deployments/istio/destination-rule-all.yaml +kubectl apply -f k8s-deployments/istio/virtual-service-all.yaml +``` + + +## Deploy Yugastore Microservices on Kubernetes + +Make sure you have built the docker images as described above and you're in the `yugastore-java` base directory. Now do the following steps. + +``` +$ kubectl apply -f k8s-deployments/microservices/yugastore-deployment.yaml +``` + +## Deploy istio ingress gateway for Yugastore-UI microservice + +``` +$ kubectl apply -f k8s-deployments +``` + +## Find the Istio gateway external-ip address and navigate to Yugastore-UI + +``` +$ kubectl get service istio-ingressgateway -n istio-system +``` + + From 7eea03eaea2e2b9771f3d9b1e24a48d74e94c22c Mon Sep 17 00:00:00 2001 From: Nikhil Malladihalli chandrappa Date: Thu, 16 Jan 2020 12:29:37 -0800 Subject: [PATCH 06/11] update readme --- README.md | 7 ++++--- ...ment-instructions.md => k8s-deployoment-instructions.md | 0 2 files changed, 4 insertions(+), 3 deletions(-) rename resources/k8s-deployoment-instructions.md => k8s-deployoment-instructions.md (100%) diff --git a/README.md b/README.md index 306a0f3..e005fe1 100644 --- a/README.md +++ b/README.md @@ -60,10 +60,11 @@ $ ./mvnw com.google.cloud.tools:jib-maven-plugin:build -Dimage=nchandrappa/cart- Note: Update docker image id to reflect the docker repository of your choice. -To run the app on your local Minikube, you need to first install YugaByte DB, create the necessary tables, start each of the microservices and finally the React UI. ## Running the app on Minikube +To run the app on your local Minikube, you need to first install YugaByte DB, create the necessary tables, deploy microservices and the React UI. + Make sure you have built the docker images as described above and you're in the `yugastore-java` base directory. Now do the following steps. @@ -107,7 +108,7 @@ $ export YSQLSH_HOST=192.168.64.3 $ export YSQLSH_PORT=32517 ``` -d. Now create the necessary tables as shown below. Load sample dataset by following the steps here: (resources/README.md) +d. Now create the necessary tables as shown below. Load sample dataset by following the steps [here](resources/README.md) ``` $ cd resources @@ -145,7 +146,7 @@ this command will open up Yugastore Dashboard. # Next Steps -- [Deploy Yugastore on Istio enabled Kubernetes Cluster] (/resources/k8s-deployoment-instructions.md) +- [Deploy Yugastore on Istio enabled Kubernetes Cluster](k8s-deployoment-instructions.md) # Learn more diff --git a/resources/k8s-deployoment-instructions.md b/k8s-deployoment-instructions.md similarity index 100% rename from resources/k8s-deployoment-instructions.md rename to k8s-deployoment-instructions.md From cca1dba1610e6ddd0bf601350fe9e1acb9d01817 Mon Sep 17 00:00:00 2001 From: Nikhil Malladihalli chandrappa Date: Thu, 16 Jan 2020 13:50:23 -0800 Subject: [PATCH 07/11] istio instructions --- k8s-deployoment-instructions.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/k8s-deployoment-instructions.md b/k8s-deployoment-instructions.md index d2c15e8..15bc710 100644 --- a/k8s-deployoment-instructions.md +++ b/k8s-deployoment-instructions.md @@ -128,4 +128,20 @@ $ kubectl apply -f k8s-deployments $ kubectl get service istio-ingressgateway -n istio-system ``` +# Traffic Management with Istio - Day 2 operations + +We have two versions of cart-microservice, one which uses standard postgres jdbc driver and v2 of the same microservice that uses YugabyteDB cluster aware JDBC driver. We are going to use these two microservices to demonstrate set of day 2 tasks that are commonly used in in microservices deployments like, canary testing, A/B testing, chaos testing.. to name a few. + + +## Canary testing of cart microservice + +Canary releases are used to reduce the risk of deploying a new version of microservice into production. You start by routing only a few selected users or small percentage of traffic on to newer version of the microservice. In this task, you'll configure a virtualservice to route 95% of traffic to cart-microservice:v1 and 5% of traffic to cart-microservice:v2. + +``` +$ kubectl apply -f k8s-deployments/istio/cart-microservice-canary-testing.yaml +``` + +## A/B Testing of cart microservice + +A/B testing is used to for testing the new features that are going to prod, like its usability, popularity, noticeability etc. In this task, you will configure a virtualservice to route 50% of traffic onto cart-microservice:v1 and other 50% of traffic to cart-microservice:v1 From 35a651036ce3919a4e41fcbe0be8ca568f81f276 Mon Sep 17 00:00:00 2001 From: Nikhil Malladihalli chandrappa Date: Thu, 16 Jan 2020 13:59:40 -0800 Subject: [PATCH 08/11] istio instructions --- k8s-deployoment-instructions.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/k8s-deployoment-instructions.md b/k8s-deployoment-instructions.md index 15bc710..19b9c6d 100644 --- a/k8s-deployoment-instructions.md +++ b/k8s-deployoment-instructions.md @@ -145,3 +145,6 @@ $ kubectl apply -f k8s-deployments/istio/cart-microservice-canary-testing.yaml A/B testing is used to for testing the new features that are going to prod, like its usability, popularity, noticeability etc. In this task, you will configure a virtualservice to route 50% of traffic onto cart-microservice:v1 and other 50% of traffic to cart-microservice:v1 +``` +$ kubectl apply -f cart-microservice-ab-testing.yaml +``` From e03d581cb5033bad38cbaf296d798750712adc0a Mon Sep 17 00:00:00 2001 From: Nikhil Malladihalli chandrappa Date: Thu, 16 Jan 2020 14:04:20 -0800 Subject: [PATCH 09/11] fixing typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e005fe1..7ac8986 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ To run the app on your local Minikube, you need to first install YugaByte DB, cr Make sure you have built the docker images as described above and you're in the `yugastore-java` base directory. Now do the following steps. -## verify if minikube in running +## verify if minikube is running ``` $ minikube status From 24a1d35f577dfe88ac301385a1c4830926f57a38 Mon Sep 17 00:00:00 2001 From: Nikhil Malladihalli chandrappa Date: Fri, 6 Mar 2020 14:17:45 -0500 Subject: [PATCH 10/11] update k8s readme --- k8s-deployoment-instructions.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/k8s-deployoment-instructions.md b/k8s-deployoment-instructions.md index 19b9c6d..4570eb3 100644 --- a/k8s-deployoment-instructions.md +++ b/k8s-deployoment-instructions.md @@ -48,7 +48,7 @@ Install Istio on your kubernetes cluster using `demo` profile so that monitoring You can [install YugaByte DB by following these instructions](https://docs.yugabyte.com/latest/quick-start/). -a. Install YugabyteDB in minikube +a. Install YugabyteDB on Kubernetes ``` $ kubectl create -f k8s-deployments/util/default-rbac.yml @@ -119,8 +119,9 @@ $ kubectl apply -f k8s-deployments/microservices/yugastore-deployment.yaml ## Deploy istio ingress gateway for Yugastore-UI microservice ``` -$ kubectl apply -f k8s-deployments +$ kubectl apply -f k8s-deployments/istio/yugastore-gateway.yaml ``` +This will expose the Yugastore-UI ingress to internet through Istio edge gateway. ## Find the Istio gateway external-ip address and navigate to Yugastore-UI From e983d4d30eec081eed4d21de8300a82dc07d5384 Mon Sep 17 00:00:00 2001 From: Nikhil Chandrappa Date: Wed, 16 Mar 2022 10:09:28 -0400 Subject: [PATCH 11/11] Updating Readme Updating instructions for Products data loading. --- k8s-deployoment-instructions.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/k8s-deployoment-instructions.md b/k8s-deployoment-instructions.md index 4570eb3..b96feef 100644 --- a/k8s-deployoment-instructions.md +++ b/k8s-deployoment-instructions.md @@ -89,7 +89,8 @@ $ cqlsh -f resources/schema.cql Next, load some sample data. Follow the data load steps in ``` -$ ./resources/dataload.sh +$ cd resources/ +$ ./dataload.sh ``` Create the postgres tables in `resources/schema.sql` for the YSQL tables