Skip to content

Commit 5256425

Browse files
authored
Experimental arm64 support for Cassandra 3.11.6 (#36)
* Update netty for epoll arm64 support * Disable metrics monitor for arm64 since we have no binary for it * Update build for testing multiarch * Fix workflow typo * Update branch for testing * Try only adding aarch64 epoll binary instead of replace all netty * Revert "Try only adding aarch64 epoll binary instead of replace all netty" This reverts commit 8039c7c. * Fix release workflow for merging * Update ci to build 3.11 same as for release * Revert "Update ci to build 3.11 same as for release" This reverts commit fd5139b. * Revert "Revert "Update ci to build 3.11 same as for release"" This reverts commit 1a40ff1. * Update ci to build for amd64 and arm64 * Add use of buildx in integration test * Temporarily only test 3.11 * Revert "Temporarily only test 3.11" This reverts commit e64005d. * Update to use 3.11.7 explicitly
1 parent 5b98bcc commit 5256425

File tree

7 files changed

+212
-19
lines changed

7 files changed

+212
-19
lines changed

.github/workflows/ci.yaml

+10-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ jobs:
1818
path: ~/.m2
1919
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
2020
restore-keys: ${{ runner.os }}-m2
21+
- name: Setup Buildx
22+
id: buildx
23+
uses: crazy-max/ghaction-docker-buildx@v3
24+
with:
25+
version: latest
2126
- name: Build Management API in docker
2227
run: |
2328
cat <<EOF > ~/.m2/settings.xml
@@ -39,7 +44,11 @@ jobs:
3944
cp ~/.m2/settings.xml settings.xml
4045
docker build -t management-api-for-dse-builder -f ./Dockerfile-build-dse ./
4146
docker tag management-api-for-dse-builder management-api-for-apache-cassandra-builder
42-
docker build -t mgmtapi-3_11 -f Dockerfile-3_11 .
47+
docker buildx build \
48+
--tag mgmtapi-3_11 \
49+
--file Dockerfile-oss \
50+
--target oss311 \
51+
--platform linux/amd64,linux/arm64 .
4352
docker build -t mgmtapi-4_0 -f Dockerfile-4_0 .
4453
docker build -t mgmtapi-dse-68 -f Dockerfile-dse-68 .
4554
- name: Build with Maven

.github/workflows/docker-release.yaml

+22-11
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
- 'v*.*.*'
77

88
jobs:
9-
build:
9+
build-dse:
1010
runs-on: ubuntu-latest
1111
steps:
1212
- uses: actions/checkout@master
@@ -32,14 +32,14 @@ jobs:
3232
cp ~/.m2/settings.xml settings.xml
3333
docker build -t management-api-for-dse-builder -f ./Dockerfile-build-dse ./
3434
docker tag management-api-for-dse-builder management-api-for-apache-cassandra-builder
35-
- name: Publish 3.11 to Registry
35+
- name: Publish DSE 6.8 to Registry
3636
uses: elgohr/Publish-Docker-Github-Action@master
3737
with:
38-
name: datastax/cassandra-mgmtapi-3_11_7
38+
name: datastax/dse-mgmtapi-6_8
3939
username: ${{ secrets.DOCKER_USERNAME }}
4040
password: ${{ secrets.DOCKER_PASSWORD }}
4141
tag_names: true
42-
dockerfile: Dockerfile-3_11
42+
dockerfile: Dockerfile-dse-68
4343
- name: Publish 4.0 to Registry
4444
uses: elgohr/Publish-Docker-Github-Action@master
4545
with:
@@ -48,11 +48,22 @@ jobs:
4848
password: ${{ secrets.DOCKER_PASSWORD }}
4949
tag_names: true
5050
dockerfile: Dockerfile-4_0
51-
- name: Publish DSE 6.8 to Registry
52-
uses: elgohr/Publish-Docker-Github-Action@master
51+
build-oss:
52+
runs-on: ubuntu-latest
53+
steps:
54+
- uses: actions/checkout@master
55+
- name: Setup Buildx
56+
id: buildx
57+
uses: crazy-max/ghaction-docker-buildx@v3
5358
with:
54-
name: datastax/dse-mgmtapi-6_8
55-
username: ${{ secrets.DOCKER_USERNAME }}
56-
password: ${{ secrets.DOCKER_PASSWORD }}
57-
tag_names: true
58-
dockerfile: Dockerfile-dse-68
59+
version: latest
60+
- name: Login to Docker Hub
61+
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
62+
- name: Publish 3.11 to Registry
63+
run: |
64+
RELEASE_VERSION="${GITHUB_REF##*/}"
65+
docker buildx build --push \
66+
--tag datastax/cassandra-mgmtapi-3_11_7:$RELEASE_VERSION \
67+
--file Dockerfile-oss \
68+
--target oss311 \
69+
--platform linux/amd64,linux/arm64 .

Dockerfile-oss

+115
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
FROM --platform=$BUILDPLATFORM maven:3.6.3-jdk-8-slim as builder
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+
# this duplicates work done in the next steps, but this should provide
12+
# a solid cache layer that only gets reset on pom.xml changes
13+
RUN mvn -q -ff -T 1C install && rm -rf target
14+
15+
COPY management-api-agent ./management-api-agent
16+
COPY management-api-common ./management-api-common
17+
COPY management-api-server ./management-api-server
18+
COPY management-api-shim-3.x ./management-api-shim-3.x
19+
COPY management-api-shim-4.x ./management-api-shim-4.x
20+
RUN mvn -q -ff package -DskipTests
21+
22+
FROM --platform=$BUILDPLATFORM maven:3.6.3-jdk-8-slim as netty4150
23+
RUN mvn dependency:get -DgroupId=io.netty -DartifactId=netty-all -Dversion=4.1.50.Final -Dtransitive=false
24+
25+
FROM --platform=linux/amd64 cassandra:3.11.7 as oss311-amd64
26+
27+
FROM --platform=linux/arm64 cassandra:3.11.7 as oss311-arm64
28+
# Netty arm64 epoll support was not added until 4.1.50 (https://github.com/netty/netty/pull/9804)
29+
# Only replace this dependency for arm64 to avoid regressions
30+
RUN rm /opt/cassandra/lib/netty-all-*.jar
31+
COPY --from=netty4150 /root/.m2/repository/io/netty/netty-all/4.1.50.Final/netty-all-4.1.50.Final.jar /opt/cassandra/lib/netty-all-4.1.50.Final.jar
32+
33+
FROM oss311-${TARGETARCH} as oss311
34+
35+
ARG TARGETARCH
36+
37+
COPY --from=builder /build/management-api-common/target/datastax-mgmtapi-common-0.1.0-SNAPSHOT.jar /etc/cassandra/
38+
COPY --from=builder /build/management-api-agent/target/datastax-mgmtapi-agent-0.1.0-SNAPSHOT.jar /etc/cassandra/
39+
COPY --from=builder /build/management-api-server/target/datastax-mgmtapi-server-0.1.0-SNAPSHOT.jar /opt/mgmtapi/
40+
COPY --from=builder /build/management-api-shim-3.x/target/datastax-mgmtapi-shim-3.x-0.1.0-SNAPSHOT.jar /opt/mgmtapi/
41+
COPY --from=builder /build/management-api-shim-4.x/target/datastax-mgmtapi-shim-4.x-0.1.0-SNAPSHOT.jar /opt/mgmtapi/
42+
43+
ENV TINI_VERSION v0.18.0
44+
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${TARGETARCH} /tini
45+
RUN chmod +x /tini
46+
47+
RUN set -eux; \
48+
rm -fr /etc/apt/sources.list.d/*; \
49+
rm -rf /var/lib/apt/lists/*; \
50+
apt-get update; \
51+
apt-get install -y --no-install-recommends wget iproute2; \
52+
rm -rf /var/lib/apt/lists/*
53+
54+
ENV MCAC_VERSION 0.1.7
55+
ADD https://github.com/datastax/metric-collector-for-apache-cassandra/releases/download/v${MCAC_VERSION}/datastax-mcac-agent-${MCAC_VERSION}.tar.gz /opt/mcac-agent.tar.gz
56+
RUN mkdir /opt/mcac-agent && tar zxvf /opt/mcac-agent.tar.gz -C /opt/mcac-agent --strip-components 1 && rm /opt/mcac-agent.tar.gz
57+
58+
# backwards compat with upstream ENTRYPOINT
59+
COPY scripts/docker-entrypoint.sh /usr/local/bin/
60+
RUN chmod +x /usr/local/bin/docker-entrypoint.sh && \
61+
ln -sf /usr/local/bin/docker-entrypoint.sh /docker-entrypoint.sh
62+
63+
EXPOSE 9103
64+
EXPOSE 8080
65+
66+
ENTRYPOINT ["/docker-entrypoint.sh"]
67+
CMD ["mgmtapi"]
68+
69+
70+
# NOTE: Presently, OSS doesn't have official Cassandra 4.0 builds on dockerhub
71+
# and our build at datastax/cassandra:4.0 is not a multiarch image like the
72+
# official ones. Once one of those issues is fixed, the following targets can
73+
# be used to build Cassandra 4.0 with Management API.
74+
75+
# FROM --platform=linux/amd64 cassandra:4.0 as oss40-amd64
76+
77+
# FROM --platform=linux/arm64 cassandra:4.0 as oss40-arm64
78+
# # Netty arm64 epoll support was not added until 4.1.50 (https://github.com/netty/netty/pull/9804)
79+
# # Only replace this dependency for arm64 to avoid regressions
80+
# RUN rm /opt/cassandra/lib/netty-all-*.jar
81+
# COPY --from=netty4150 /root/.m2/repository/io/netty/netty-all/4.1.50.Final/netty-all-4.1.50.Final.jar /opt/cassandra/lib/netty-all-4.1.50.Final.jar
82+
83+
# FROM oss40-${TARGETARCH} as oss40
84+
85+
# ARG TARGETARCH
86+
87+
# COPY --from=builder /build/management-api-common/target/datastax-mgmtapi-common-0.1.0-SNAPSHOT.jar /etc/cassandra/
88+
# COPY --from=builder /build/management-api-agent/target/datastax-mgmtapi-agent-0.1.0-SNAPSHOT.jar /etc/cassandra/
89+
# COPY --from=builder /build/management-api-server/target/datastax-mgmtapi-server-0.1.0-SNAPSHOT.jar /opt/mgmtapi/
90+
# COPY --from=builder /build/management-api-shim-3.x/target/datastax-mgmtapi-shim-3.x-0.1.0-SNAPSHOT.jar /opt/mgmtapi/
91+
# COPY --from=builder /build/management-api-shim-4.x/target/datastax-mgmtapi-shim-4.x-0.1.0-SNAPSHOT.jar /opt/mgmtapi/
92+
93+
# ENV TINI_VERSION v0.18.0
94+
# ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${TARGETARCH} /tini
95+
# RUN chmod +x /tini
96+
97+
# RUN set -eux; \
98+
# apt-get update; \
99+
# apt-get install -y --no-install-recommends wget iproute2; \
100+
# rm -rf /var/lib/apt/lists/*
101+
102+
# ENV MCAC_VERSION 0.1.7
103+
# ADD https://github.com/datastax/metric-collector-for-apache-cassandra/releases/download/v${MCAC_VERSION}/datastax-mcac-agent-${MCAC_VERSION}.tar.gz /opt/mcac-agent.tar.gz
104+
# RUN mkdir /opt/mcac-agent && tar zxvf /opt/mcac-agent.tar.gz -C /opt/mcac-agent --strip-components 1 && rm /opt/mcac-agent.tar.gz
105+
106+
# # backwards compat with upstream ENTRYPOINT
107+
# COPY scripts/docker-entrypoint.sh /usr/local/bin/
108+
# RUN chmod +x /usr/local/bin/docker-entrypoint.sh && \
109+
# ln -sf /usr/local/bin/docker-entrypoint.sh /docker-entrypoint.sh
110+
111+
# EXPOSE 9103
112+
# EXPOSE 8080
113+
114+
# ENTRYPOINT ["/docker-entrypoint.sh"]
115+
# CMD ["mgmtapi"]

management-api-common/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<properties>
1515
<slf4j.version>1.7.25</slf4j.version>
1616
<logback.version>1.2.3</logback.version>
17-
<netty.version>4.1.45.Final</netty.version>
17+
<netty.version>4.1.50.Final</netty.version>
1818
<cassandra.version>3.11.5</cassandra.version>
1919
</properties>
2020

management-api-server/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<airline.version>2.7.0</airline.version>
2828
<jaxrs.version>2.0.8</jaxrs.version>
2929
<resteasy.version>4.0.0.Final</resteasy.version>
30-
<netty.version>4.1.45.Final</netty.version>
30+
<netty.version>4.1.50.Final</netty.version>
3131
<driver.version>4.4.0</driver.version>
3232
<docker.java.version>3.1.2</docker.java.version>
3333
<cassandra.version>3.11.5</cassandra.version>

management-api-server/src/test/java/com/datastax/mgmtapi/helpers/DockerHelper.java

+57-4
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,23 @@ public String getIpAddressOfContainer()
6666
public void startManagementAPI(String version, List<String> envVars)
6767
{
6868
File baseDir = new File(System.getProperty("dockerFileRoot","."));
69-
File dockerFile = Paths.get(baseDir.getPath(), "Dockerfile-" + version).toFile();
69+
File dockerFile;
70+
String target;
71+
boolean useBuildx;
72+
73+
if ("3_11".equals(version))
74+
{
75+
dockerFile = Paths.get(baseDir.getPath(), "Dockerfile-oss").toFile();
76+
target = "oss311";
77+
useBuildx = true;
78+
}
79+
else
80+
{
81+
dockerFile = Paths.get(baseDir.getPath(), "Dockerfile-" + version).toFile();
82+
target = null;
83+
useBuildx = false;
84+
}
85+
7086
if (!dockerFile.exists())
7187
throw new RuntimeException("Missing " + dockerFile.getAbsolutePath());
7288

@@ -79,7 +95,7 @@ public void startManagementAPI(String version, List<String> envVars)
7995
if (envVars != null)
8096
envList.addAll(envVars);
8197

82-
this.container = startDocker(dockerFile, baseDir, name, ports, volumeDescList, envList, cmdList);
98+
this.container = startDocker(dockerFile, baseDir, target, name, ports, volumeDescList, envList, cmdList, useBuildx);
8399

84100
waitForPort("localhost",8080, Duration.ofMillis(50000), logger, false);
85101
}
@@ -159,7 +175,29 @@ public boolean started()
159175
return container != null;
160176
}
161177

162-
private String startDocker(File dockerFile, File baseDir, String name, List<Integer> ports, List<String> volumeDescList, List<String> envList, List<String> cmdList)
178+
private void buildImageWithBuildx(File dockerFile, File baseDir, String target, String name) throws Exception {
179+
ProcessBuilder pb = new ProcessBuilder("docker", "buildx", "build",
180+
"--load",
181+
"--tag", name,
182+
"--file", dockerFile.getPath(),
183+
"--target", target,
184+
"--platform", "linux/amd64",
185+
baseDir.getPath());
186+
187+
Process p = pb.inheritIO().start();
188+
int exitCode = p.waitFor();
189+
190+
if (exitCode != 0)
191+
{
192+
throw new Exception("Command '" + String.join(" ", pb.command() + "' return error code: " + exitCode));
193+
}
194+
}
195+
private String startDocker(File dockerFile, File baseDir, String target, String name, List<Integer> ports, List<String> volumeDescList, List<String> envList, List<String> cmdList)
196+
{
197+
return startDocker(dockerFile, baseDir, target, name, ports, volumeDescList, envList, cmdList, false);
198+
}
199+
200+
private String startDocker(File dockerFile, File baseDir, String target, String name, List<Integer> ports, List<String> volumeDescList, List<String> envList, List<String> cmdList, boolean useBuildx)
163201
{
164202
ListContainersCmd listContainersCmd = dockerClient.listContainersCmd();
165203
listContainersCmd.getFilters().put("name", Arrays.asList(name));
@@ -200,12 +238,27 @@ public void onNext(BuildResponseItem item)
200238
};
201239

202240
logger.info("Building container: " + name + " from " + dockerFile);
203-
dockerClient.buildImageCmd()
241+
if (useBuildx)
242+
{
243+
try
244+
{
245+
buildImageWithBuildx(dockerFile, baseDir, target, name);
246+
}
247+
catch (Exception e)
248+
{
249+
e.printStackTrace();
250+
logger.error("Unable to build image");
251+
}
252+
}
253+
else
254+
{
255+
dockerClient.buildImageCmd()
204256
.withBaseDirectory(baseDir)
205257
.withDockerfile(dockerFile)
206258
.withTags(Sets.newHashSet(name))
207259
.exec(callback)
208260
.awaitImageId();
261+
}
209262

210263
List<ExposedPort> tcpPorts = new ArrayList<>();
211264
List<PortBinding> portBindings = new ArrayList<>();

scripts/docker-entrypoint.sh

+6-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ _sed-in-place() {
4040
rm "$tempFile"
4141
}
4242

43+
_metrics_collector_supported() {
44+
# currently, metrics collector does not work on arm64
45+
[ "$(uname -m)" != "aarch64" ]
46+
}
47+
4348
if [ "$1" = 'mgmtapi' ]; then
4449
echo "Starting Management API"
4550

@@ -55,7 +60,7 @@ if [ "$1" = 'mgmtapi' ]; then
5560
# 2. We don't wan't operator or configbuilder to care so much about the version number or
5661
# the fact this jar even exists.
5762

58-
if ! grep -qxF "JVM_OPTS=\"\$JVM_OPTS -javaagent:/opt/mcac-agent/lib/datastax-mcac-agent.jar\"" < /etc/cassandra/cassandra-env.sh ; then
63+
if _metrics_collector_supported && ! grep -qxF "JVM_OPTS=\"\$JVM_OPTS -javaagent:/opt/mcac-agent/lib/datastax-mcac-agent.jar\"" < /etc/cassandra/cassandra-env.sh ; then
5964
# ensure newline at end of file
6065
echo "" >> /etc/cassandra/cassandra-env.sh
6166
echo "JVM_OPTS=\"\$JVM_OPTS -javaagent:/opt/mcac-agent/lib/datastax-mcac-agent.jar\"" >> /etc/cassandra/cassandra-env.sh

0 commit comments

Comments
 (0)