== Camel Cassandraql route on Kubernetes cluster

This quickstart run in a Java standalone container, using Spring with
Apache Camel (Cassandraql component).

This example is based on:

* Minikube 1.11.0 (Kubernetes version >= 1.17)
* https://www.eclipse.org/jkube[Eclipse JKube]

First thing you'll need to do is to prepare the environment.

Don't forget to use a bit more memory for your Minikube setup to run this
example smoothly:

[source,sh]
----
$ minikube start --memory 5120 --cpus=4
----

Once your Minikube node is up and running you'll need to run the
following command. In your `src/main/resource/jkube/` folder you'll find
two yaml files. Run the following commands using them to prepare the Cassandra cluster:

[source,sh]
----
$ kubectl create -f src/main/resources/jkube/cassandra-service.yaml
$ kubectl create -f src/main/resources/jkube/cassandra-statefulset.yaml
----

To check the correct startup of the cluster run the following command:

[source,sh]
----
$ kubectl get statefulsets.apps
NAME        READY   AGE
cassandra   2/2     3h44m
----

and check the status of the pods

[source,sh]
----
$ kubectl get pods
NAME                                       READY     STATUS    RESTARTS   AGE
cassandra-0                                1/1       Running   0          2h
cassandra-1                                1/1       Running   0          2h
----

You can also verify the health of your cluster by running

[source,sh]
----
$ kubectl exec <pod_name> -it nodetool status
Datacenter: DC1-K8Demo
======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  172.17.0.4  212.14 KiB  32           53.1%             9bf81ccd-4aa1-451b-b56e-c16c5ee04836  Rack1-K8Demo
UN  172.17.0.6  170.08 KiB  32           46.9%             69cc6f60-9ccf-439d-a298-b79b643c1586  Rack1-K8Demo
----

=== Building and running

Navigate to the project folder where the example can be built with

[source,sh]
----
$ mvn clean -Pkubernetes-install k8s:deploy
----

When the example runs in Kubernetes, you can use the Kubectl command tool
to inspect the status

To list all the running pods:

[source,sh]
----
$ kubectl get pods
----

You can follow the log for the created Pod by running:

[source,sh]
----
$ mvn -Pkubernetes-install k8s:log
----

You should then see an output similar to this:

[source,sh]
----
[INFO] k8s: 2020-08-07 12:34:32,569 [main           ] INFO  GuavaCompatibility             - Detected Guava >= 19 in the classpath, using modern compatibility layer
[INFO] k8s: 2020-08-07 12:34:32,834 [main           ] INFO  ClockFactory                   - Using native clock to generate timestamps.
[INFO] k8s: 2020-08-07 12:34:33,005 [main           ] INFO  NettyUtil                      - Did not find Netty's native epoll transport in the classpath, defaulting to NIO.
[INFO] k8s: 2020-08-07 12:34:34,122 [main           ] INFO  DCAwareRoundRobinPolicy        - Using data-center name 'DC1-K8Demo' for DCAwareRoundRobinPolicy (if this is incorrect, please provide the correct datacenter name with DCAwareRoundRobinPolicy constructor)
[INFO] k8s: 2020-08-07 12:34:34,124 [main           ] INFO  Cluster                        - New Cassandra host cassandra/172.17.0.7:9042 added
[INFO] k8s: 2020-08-07 12:34:34,150 [main           ] INFO  Cluster                        - New Cassandra host cassandra/172.17.0.6:9042 added
[INFO] k8s: 2020-08-07 12:34:36,780 [main           ] INFO  CqlPopulateBean                - Cassandra was populated with sample values for test.users table
[INFO] k8s: 2020-08-07 12:34:37,372 [main           ] INFO  LRUCacheFactory                - Detected and using LRUCacheFactory: camel-caffeine-lrucache
[INFO] k8s: 2020-08-07 12:34:38,012 [main           ] INFO  AbstractCamelContext           - Apache Camel 3.5.0-SNAPSHOT (camel-1) is starting
[INFO] k8s: 2020-08-07 12:34:38,019 [main           ] INFO  AbstractCamelContext           - StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
[INFO] k8s: 2020-08-07 12:34:38,019 [main           ] INFO  AbstractCamelContext           - Using HealthCheck: camel-health
[INFO] k8s: 2020-08-07 12:34:38,664 [main           ] INFO  DefaultMavenCoordinates        - DataStax Java driver for Apache Cassandra(R) (com.datastax.oss:java-driver-core) version 4.8.0
[INFO] k8s: 2020-08-07 12:34:39,554 [s0-admin-0     ] INFO  Clock                          - Using native clock for microsecond precision
[INFO] k8s: 2020-08-07 12:34:41,453 [main           ] INFO  InternalRouteStartupManager    - Route: cassandra-route started and consuming from: timer://foo
[INFO] k8s: 2020-08-07 12:34:41,454 [main           ] INFO  AbstractCamelContext           - Total 1 routes, of which 1 are started
[INFO] k8s: 2020-08-07 12:34:41,455 [main           ] INFO  AbstractCamelContext           - Apache Camel 3.5.0-SNAPSHOT (camel-1) started in 3.441 seconds
[INFO] k8s: 2020-08-07 12:34:41,469 [main           ] INFO  BaseMainSupport                - Using properties from: classpath:application.properties;optional=true
[INFO] k8s: 2020-08-07 12:34:41,557 [main           ] INFO  DefaultRoutesCollector         - No additional Camel XML routes discovered from: classpath:camel/*.xml
[INFO] k8s: 2020-08-07 12:34:41,557 [main           ] INFO  DefaultRoutesCollector         - No additional Camel XML route templates discovered from: classpath:camel-template/*.xml
[INFO] k8s: 2020-08-07 12:34:41,559 [main           ] INFO  DefaultRoutesCollector         - No additional Camel XML rests discovered from: classpath:camel-rest/*.xml
[INFO] k8s: 2020-08-07 12:34:42,557 [1 - timer://foo] INFO  cassandra-route                - Query result set [1-oscerd,2-not-a-bot]
[INFO] k8s: 2020-08-07 12:34:47,548 [1 - timer://foo] INFO  cassandra-route                - Query result set [1-oscerd,2-not-a-bot]
[INFO] k8s: 2020-08-07 12:34:52,661 [1 - timer://foo] INFO  cassandra-route                - Query result set [1-oscerd,2-not-a-bot]
----

=== Cleanup

Run following to undeploy the application and cassandra nodes

[source,sh]
----
$ mvn -Pkubernetes-install k8s:undeploy
$ kubectl delete -f src/main/resources/jkube/cassandra-service.yaml
$ kubectl delete -f src/main/resources/jkube/cassandra-statefulset.yaml
----

Make sure no pod is running

[source,sh]
----
$ kubectl get pods
No resources found.
----

=== Help and contributions

If you hit any problem using Camel or have some feedback, then please
https://camel.apache.org/support.html[let us know].

We also love contributors, so
https://camel.apache.org/contributing.html[get involved] :-)

The Camel riders!
