Skip to content

Commit 96a9e47

Browse files
author
Eduard Tudenhoefner
committed
CDB-39: Add DSE Docker files for local testing
1 parent 5bb6033 commit 96a9e47

6 files changed

+261
-0
lines changed

.gitignore

+7
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@ buildNumber.properties
1111
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
1212
.mvn/wrapper/maven-wrapper.jar
1313

14+
# DSE-related files
15+
dse-db*.jar
16+
dse-db*.pom
17+
dse-commons*.jar
18+
dse-commons*.pom
19+
settings.xml
20+
1421
.metadata
1522
bin/
1623
tmp/

Dockerfile-build-dse

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
FROM maven:3.6.3-jdk-8-slim
2+
3+
WORKDIR /build
4+
5+
COPY pom.xml ./
6+
COPY management-api-agent/pom.xml ./management-api-agent/pom.xml
7+
COPY management-api-common/pom.xml ./management-api-common/pom.xml
8+
COPY management-api-server/pom.xml ./management-api-server/pom.xml
9+
COPY management-api-shim-3.x/pom.xml ./management-api-shim-3.x/pom.xml
10+
COPY management-api-shim-4.x/pom.xml ./management-api-shim-4.x/pom.xml
11+
COPY management-api-shim-dse-6.8/pom.xml ./management-api-shim-dse-6.8/pom.xml
12+
# this duplicates work done in the next steps, but this should provide
13+
# a solid cache layer that only gets reset on pom.xml changes
14+
RUN mvn -q -ff -T 1C install && rm -rf target
15+
16+
COPY dse-commons-6.8.2-SNAPSHOT* /root/.m2/repository/com/datastax/dse/dse-commons/6.8.2-SNAPSHOT/
17+
COPY dse-db-6.8.2-SNAPSHOT* /root/.m2/repository/com/datastax/dse/dse-db/6.8.2-SNAPSHOT/
18+
COPY settings.xml /root/.m2/
19+
20+
COPY management-api-agent ./management-api-agent
21+
COPY management-api-common ./management-api-common
22+
COPY management-api-server ./management-api-server
23+
COPY management-api-shim-3.x ./management-api-shim-3.x
24+
COPY management-api-shim-4.x ./management-api-shim-4.x
25+
COPY management-api-shim-dse-6.8 ./management-api-shim-dse-6.8
26+
RUN mvn -q -ff package -DskipTests -P dse

Dockerfile-dse-68

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
FROM management-api-for-dse-builder as builder
2+
3+
FROM datastax/dse-server:6.8.0-ubi7-1
4+
5+
# accept the License
6+
ENV DS_LICENSE=accept
7+
8+
COPY --from=builder /build/management-api-common/target/datastax-mgmtapi-common-0.1.0-SNAPSHOT.jar /opt/dse/
9+
COPY --from=builder /build/management-api-agent/target/datastax-mgmtapi-agent-0.1.0-SNAPSHOT.jar /opt/dse/
10+
COPY --from=builder /build/management-api-server/target/datastax-mgmtapi-server-0.1.0-SNAPSHOT.jar /opt/mgmtapi/
11+
COPY --from=builder /build/management-api-shim-3.x/target/datastax-mgmtapi-shim-3.x-0.1.0-SNAPSHOT.jar /opt/mgmtapi/
12+
COPY --from=builder /build/management-api-shim-4.x/target/datastax-mgmtapi-shim-4.x-0.1.0-SNAPSHOT.jar /opt/mgmtapi/
13+
14+
USER root
15+
ENV TINI_VERSION v0.18.0
16+
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
17+
RUN chmod +x /tini
18+
19+
RUN microdnf update -y && rm -rf /var/cache/yum
20+
RUN microdnf install wget procps python iproute net-tools -y && microdnf clean all
21+
22+
# backwards compat with upstream ENTRYPOINT
23+
COPY dse-68/docker-entrypoint.sh /usr/local/bin/
24+
RUN chmod +x /usr/local/bin/docker-entrypoint.sh && \
25+
ln -sf /usr/local/bin/docker-entrypoint.sh /docker-entrypoint.sh
26+
27+
EXPOSE 9103
28+
EXPOSE 8080
29+
30+
ENTRYPOINT ["/docker-entrypoint.sh"]
31+
CMD ["mgmtapi"]

README.md

+17
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,23 @@ Finally build the Management API image:
114114
> curl http://localhost:8080/api/v0/probes/readiness
115115
OK
116116

117+
## Usage with DSE
118+
119+
A DSE jar must be locally available before running the Management API with DSE. Details are described in the [DSE README](management-api-shim-dse-6.8/README.md).
120+
Once you have DSE jars published locally, follow these steps:
121+
```
122+
# The builder image needs to have the DSE jars, poms, and the Maven settings.xml (that provides access to Artifactory) and so we have to copy them over after building DSE:
123+
cp $HOME/.m2/repository/com/datastax/dse/dse-db/6.8.2-SNAPSHOT/dse-db-6.8.2-SNAPSHOT.{jar,pom} $PWD
124+
cp $HOME/.m2/repository/com/datastax/dse/dse-commons/6.8.2-SNAPSHOT/dse-commons-6.8.2-SNAPSHOT.{jar,pom} $PWD
125+
cp $HOME/.m2/settings.xml $PWD
126+
127+
docker build -t management-api-for-dse-builder -f ./Dockerfile-build-dse .
128+
129+
docker build -t mgmtapi-dse -f Dockerfile-dse-68 .
130+
131+
docker run -p 8080:8080 -it --rm mgmtapi-dse
132+
133+
```
117134

118135
### Using the Service with a locally installed C* or DSE instance
119136

dse-68/Dockerfile

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
FROM datastax/dse-server:6.8.0-ubi7-1
2+
3+
USER root
4+
RUN microdnf update && rm -rf /var/cache/yum && \
5+
microdnf install libjemalloc1 procps python iproute2 numactl iproute2 net-tools && microdnf clean all
6+
7+
ENV DS_LICENSE=accept
8+
ENV PATH $DSE_HOME/bin:$PATH
9+
10+
# smoke test
11+
USER dse:root
12+
RUN dse -v
13+
14+
VOLUME ["/var/lib/cassandra", "/var/lib/spark", "/var/lib/dsefs", "/var/log/cassandra", "/var/log/spark"]
15+
16+
COPY docker-entrypoint.sh /usr/local/bin/
17+
RUN ln -s usr/local/bin/docker-entrypoint.sh /docker-entrypoint.sh # backwards compat
18+
ENTRYPOINT ["docker-entrypoint.sh"]
19+
20+
CMD ["dse", "cassandra", "-f"]

dse-68/docker-entrypoint.sh

+160
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
#!/bin/bash
2+
set -e
3+
4+
# first arg is `-f` or `--some-option`
5+
# or there are no args
6+
if [ "$#" -eq 0 ] || [ "${1#-}" != "$1" ]; then
7+
set -- dse cassandra -f "$@"
8+
fi
9+
10+
if [ "$CASSANDRA_CONF" == "" ]; then
11+
export CASSANDRA_CONF=/opt/dse/resources/cassandra/conf
12+
fi
13+
14+
# allow the container to be started with `--user`
15+
if [ "$1" = 'mgmtapi' -a "$(id -u)" = '0' ]; then
16+
find "$CASSANDRA_CONF" /var/lib/cassandra /var/log/cassandra \
17+
\! -user dse -exec chown dse '{}' +
18+
fi
19+
20+
_ip_address() {
21+
# scrape the first non-localhost IP address of the container
22+
# in Swarm Mode, we often get two IPs -- the container IP, and the (shared) VIP, and the container IP should always be first
23+
ip address | awk '
24+
$1 == "inet" && $NF != "lo" {
25+
gsub(/\/.+$/, "", $2)
26+
print $2
27+
exit
28+
}
29+
'
30+
}
31+
32+
# "sed -i", but without "mv" (which doesn't work on a bind-mounted file, for example)
33+
_sed-in-place() {
34+
local filename="$1"; shift
35+
local tempFile
36+
tempFile="$(mktemp)"
37+
sed "$@" "$filename" > "$tempFile"
38+
cat "$tempFile" > "$filename"
39+
rm "$tempFile"
40+
}
41+
42+
if [ "$1" = 'mgmtapi' ]; then
43+
echo "Starting Management API"
44+
45+
if ! grep -qxF "JVM_OPTS=\"\$JVM_OPTS -javaagent:/opt/dse/datastax-mgmtapi-agent-0.1.0-SNAPSHOT.jar\"" < /opt/dse/resources/cassandra/conf/cassandra-env.sh ; then
46+
# ensure newline at end of file
47+
echo "" >> /opt/dse/resources/cassandra/conf/cassandra-env.sh
48+
echo "JVM_OPTS=\"\$JVM_OPTS -javaagent:/opt/dse/datastax-mgmtapi-agent-0.1.0-SNAPSHOT.jar\"" >> /opt/dse/resources/cassandra/conf/cassandra-env.sh
49+
fi
50+
51+
# Set this if you want to ignore default env variables, i.e. when running inside an operator
52+
if [ $IGNORE_DEFAULTS ]; then
53+
CASSANDRA_RPC_ADDRESS='0.0.0.0'
54+
CASSANDRA_BROADCAST_RPC_ADDRESS="$(_ip_address)"
55+
else
56+
: ${CASSANDRA_RPC_ADDRESS='0.0.0.0'}
57+
58+
: ${CASSANDRA_LISTEN_ADDRESS='auto'}
59+
if [ "$CASSANDRA_LISTEN_ADDRESS" = 'auto' ]; then
60+
CASSANDRA_LISTEN_ADDRESS="$(_ip_address)"
61+
fi
62+
63+
: ${CASSANDRA_BROADCAST_ADDRESS="$CASSANDRA_LISTEN_ADDRESS"}
64+
65+
if [ "$CASSANDRA_BROADCAST_ADDRESS" = 'auto' ]; then
66+
CASSANDRA_BROADCAST_ADDRESS="$(_ip_address)"
67+
fi
68+
: ${CASSANDRA_BROADCAST_RPC_ADDRESS:=$CASSANDRA_BROADCAST_ADDRESS}
69+
70+
if [ -n "${CASSANDRA_NAME:+1}" ]; then
71+
: ${CASSANDRA_SEEDS:="cassandra"}
72+
fi
73+
: ${CASSANDRA_SEEDS:="$CASSANDRA_BROADCAST_ADDRESS"}
74+
75+
CASSANDRA_YAML="cassandra.yaml"
76+
if [ $CASSANDRA_DEPLOYMENT ]; then
77+
CASSANDRA_DEPLOYMENT=`echo "$CASSANDRA_DEPLOYMENT" | awk '{print tolower($0)}'`
78+
CASSANDRA_YAML="cassandra-$CASSANDRA_DEPLOYMENT.yaml"
79+
fi
80+
81+
_sed-in-place "$CASSANDRA_CONF/$CASSANDRA_YAML" \
82+
-r 's/(- seeds:).*/\1 "'"$CASSANDRA_SEEDS"'"/'
83+
84+
for yaml in \
85+
broadcast_address \
86+
broadcast_rpc_address \
87+
cluster_name \
88+
endpoint_snitch \
89+
listen_address \
90+
num_tokens \
91+
rpc_address \
92+
start_rpc \
93+
; do
94+
var="CASSANDRA_${yaml^^}"
95+
val="${!var}"
96+
if [ "$val" ]; then
97+
_sed-in-place "$CASSANDRA_CONF/$CASSANDRA_YAML" \
98+
-r 's/^(# )?('"$yaml"':).*/\2 '"$val"'/'
99+
fi
100+
done
101+
102+
for rackdc in dc rack; do
103+
var="CASSANDRA_${rackdc^^}"
104+
val="${!var}"
105+
if [ "$val" ]; then
106+
_sed-in-place "$CASSANDRA_CONF/cassandra-rackdc.properties" \
107+
-r 's/^('"$rackdc"'=).*/\1 '"$val"'/'
108+
fi
109+
done
110+
fi
111+
112+
MGMT_API_ARGS=""
113+
114+
# Hardcoding these for now
115+
MGMT_API_CASSANDRA_SOCKET="--db-socket /tmp/db.sock"
116+
MGMT_API_LISTEN_TCP="--host tcp://0.0.0.0:8080"
117+
MGMT_API_LISTEN_SOCKET="--host file:///tmp/oss-mgmt.sock"
118+
119+
MGMT_API_ARGS="$MGMT_API_ARGS $MGMT_API_CASSANDRA_SOCKET $MGMT_API_LISTEN_TCP $MGMT_API_LISTEN_SOCKET"
120+
121+
# These will generally come from the k8s operator
122+
if [ ! -z "$MGMT_API_EXPLICIT_START" ]; then
123+
MGMT_API_EXPLICIT_START="--explicit-start $MGMT_API_EXPLICIT_START"
124+
MGMT_API_ARGS="$MGMT_API_ARGS $MGMT_API_EXPLICIT_START"
125+
fi
126+
127+
if [ ! -z "$MGMT_API_TLS_CA_CERT_FILE" ]; then
128+
MGMT_API_TLS_CA_CERT_FILE="--tlscacert $MGMT_API_TLS_CA_CERT_FILE"
129+
MGMT_API_ARGS="$MGMT_API_ARGS $MGMT_API_TLS_CA_CERT_FILE"
130+
fi
131+
if [ ! -z "$MGMT_API_TLS_CERT_FILE" ]; then
132+
MGMT_API_TLS_CERT_FILE="--tlscert $MGMT_API_TLS_CERT_FILE"
133+
MGMT_API_ARGS="$MGMT_API_ARGS $MGMT_API_TLS_CERT_FILE"
134+
fi
135+
if [ ! -z "$MGMT_API_TLS_KEY_FILE" ]; then
136+
MGMT_API_TLS_KEY_FILE="--tlskey $MGMT_API_TLS_KEY_FILE"
137+
MGMT_API_ARGS="$MGMT_API_ARGS $MGMT_API_TLS_KEY_FILE"
138+
fi
139+
140+
if [ ! -z "$MGMT_API_PID_FILE" ]; then
141+
MGMT_API_PID_FILE="--pidfile $MGMT_API_PID_FILE"
142+
MGMT_API_ARGS="$MGMT_API_ARGS $MGMT_API_PID_FILE"
143+
fi
144+
145+
MGMT_API_DSE_HOME="--db-home ${DSE_HOME}"
146+
MGMT_API_ARGS="$MGMT_API_ARGS $MGMT_API_DSE_HOME"
147+
148+
if [ ! -z "$MGMT_API_NO_KEEP_ALIVE" ]; then
149+
MGMT_API_NO_KEEP_ALIVE="--no-keep-alive $MGMT_API_NO_KEEP_ALIVE"
150+
MGMT_API_ARGS="$MGMT_API_ARGS $MGMT_API_NO_KEEP_ALIVE"
151+
fi
152+
153+
MGMT_API_JAR="$(find "/opt/mgmtapi" -name *server*.jar)"
154+
155+
echo "Running" java ${MGMT_API_JAVA_OPTS} -Xms128m -Xmx128m -jar "$MGMT_API_JAR" $MGMT_API_ARGS
156+
exec java ${MGMT_API_JAVA_OPTS} -Xms128m -Xmx128m -jar "$MGMT_API_JAR" $MGMT_API_ARGS
157+
158+
fi
159+
160+
exec "$@"

0 commit comments

Comments
 (0)