Skip to content

Commit 3a68a09

Browse files
donoghucyaauie
authored andcommitted
forward-port observabilitySRE image creation into main (re-implament)
This is a forward-port of _functionality_ from the observabilitySRE feature branch into 8.x in PR #17541 (0b1d299), wholly re-implementing the changes in `docker/*` and `rakelib/artifacts.rake` from the 8.x-style docker structure to the refactored structure present on `main`.
1 parent 8f6eb2f commit 3a68a09

File tree

4 files changed

+188
-12
lines changed

4 files changed

+188
-12
lines changed

build.gradle

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,34 @@ tasks.register("compileGrammar") {
324324
}
325325
}
326326

327+
tasks.register("artifactDockerObservabilitySRE") {
328+
dependsOn bootstrap
329+
inputs.files fileTree("${projectDir}/rakelib")
330+
inputs.files fileTree("${projectDir}/bin")
331+
inputs.files fileTree("${projectDir}/config")
332+
inputs.files fileTree("${projectDir}/lib")
333+
inputs.files fileTree("${projectDir}/logstash-core-plugin-api")
334+
inputs.files fileTree("${projectDir}/logstash-core/lib")
335+
inputs.files fileTree("${projectDir}/logstash-core/src")
336+
inputs.files fileTree("${projectDir}/x-pack")
337+
outputs.files fileTree("${buildDir}") {
338+
include "Dockerfile-observability-sre"
339+
include "logstash-observability-sre-${project.version}-SNAPSHOT-linux-*.tar.gz"
340+
include "logstash-observability-sre-${project.version}-SNAPSHOT-docker-build-context.tar.gz"
341+
include "plugin_aliases_hashed.yml"
342+
include "jdk-*-linux-*.tar.gz"
343+
}
344+
doFirst {
345+
if (!fedrampHighMode) {
346+
logger.error("NOT in Fedramp High mode. Aborting.")
347+
throw new GradleException("cannot build docker artifact for observabilitySRE without `-PfedrampHighMode=true`")
348+
}
349+
}
350+
doLast {
351+
rake(projectDir, buildDir, 'artifact:docker_observabilitySRE')
352+
}
353+
}
354+
327355
tasks.register("assembleTarDistribution") {
328356
dependsOn bootstrap
329357
inputs.files fileTree("${projectDir}/rakelib")

docker/Makefile

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ else
2020
endif
2121
endif
2222

23-
IMAGE_FLAVORS ?= oss full wolfi
23+
IMAGE_FLAVORS ?= oss full wolfi observability-sre
2424
DEFAULT_IMAGE_FLAVOR ?= full
2525

2626
IMAGE_TAG := $(ELASTIC_REGISTRY)/logstash/logstash
@@ -58,6 +58,15 @@ build-from-local-wolfi-artifacts: dockerfile
5858
(docker kill $(HTTPD); false);
5959
-docker kill $(HTTPD)
6060

61+
build-from-local-observability-sre-artifacts: dockerfile
62+
docker run --rm -d --name=$(HTTPD) \
63+
-p 8000:8000 --expose=8000 -v $(ARTIFACTS_DIR):/mnt \
64+
python:3 bash -c 'cd /mnt && python3 -m http.server'
65+
timeout 120 bash -c 'until curl -s localhost:8000 > /dev/null; do sleep 1; done'
66+
docker build --progress=plain --network=host -t $(IMAGE_TAG)-observability-sre:$(VERSION_TAG) -f $(ARTIFACTS_DIR)/Dockerfile-observability-sre data/logstash || \
67+
(docker kill $(HTTPD); false);
68+
-docker kill $(HTTPD)
69+
6170
COPY_FILES := $(ARTIFACTS_DIR)/docker/config/pipelines.yml $(ARTIFACTS_DIR)/docker/config/logstash-oss.yml $(ARTIFACTS_DIR)/docker/config/logstash-full.yml
6271
COPY_FILES += $(ARTIFACTS_DIR)/docker/config/log4j2.file.properties $(ARTIFACTS_DIR)/docker/config/log4j2.properties
6372
COPY_FILES += $(ARTIFACTS_DIR)/docker/env2yaml/env2yaml.go $(ARTIFACTS_DIR)/docker/env2yaml/go.mod $(ARTIFACTS_DIR)/docker/env2yaml/go.sum
@@ -113,15 +122,15 @@ ironbank_docker_paths:
113122
mkdir -p $(ARTIFACTS_DIR)/ironbank/scripts/go/src/env2yaml/vendor
114123
mkdir -p $(ARTIFACTS_DIR)/ironbank/scripts/pipeline
115124

116-
public-dockerfiles: public-dockerfiles_oss public-dockerfiles_full public-dockerfiles_wolfi public-dockerfiles_ironbank
125+
public-dockerfiles: public-dockerfiles_oss public-dockerfiles_full public-dockerfiles_wolfi public-dockerfiles_observability-sre public-dockerfiles_ironbank
117126

118127
public-dockerfiles_full: templates/Dockerfile.erb docker_paths $(COPY_FILES)
119128
../vendor/jruby/bin/jruby -S erb -T "-"\
120129
created_date="${BUILD_DATE}" \
121130
elastic_version="${ELASTIC_VERSION}" \
122131
arch="${ARCHITECTURE}" \
123132
version_tag="${VERSION_TAG}" \
124-
release="${RELEASE}" \
133+
release="${RELEASE}" \
125134
image_flavor="full" \
126135
local_artifacts="false" \
127136
templates/Dockerfile.erb > "${ARTIFACTS_DIR}/Dockerfile-full" && \
@@ -142,7 +151,7 @@ public-dockerfiles_oss: templates/Dockerfile.erb docker_paths $(COPY_FILES)
142151
elastic_version="${ELASTIC_VERSION}" \
143152
arch="${ARCHITECTURE}" \
144153
version_tag="${VERSION_TAG}" \
145-
release="${RELEASE}" \
154+
release="${RELEASE}" \
146155
image_flavor="oss" \
147156
local_artifacts="false" \
148157
templates/Dockerfile.erb > "${ARTIFACTS_DIR}/Dockerfile-oss" && \
@@ -163,7 +172,7 @@ public-dockerfiles_wolfi: templates/Dockerfile.erb docker_paths $(COPY_FILES)
163172
elastic_version="${ELASTIC_VERSION}" \
164173
arch="${ARCHITECTURE}" \
165174
version_tag="${VERSION_TAG}" \
166-
release="${RELEASE}" \
175+
release="${RELEASE}" \
167176
image_flavor="wolfi" \
168177
local_artifacts="false" \
169178
templates/Dockerfile.erb > "${ARTIFACTS_DIR}/Dockerfile-wolfi" && \
@@ -178,6 +187,27 @@ build-from-dockerfiles_wolfi: public-dockerfiles_wolfi
178187
sed 's/artifacts/snapshots/g' Dockerfile > Dockerfile.tmp && mv Dockerfile.tmp Dockerfile && \
179188
docker build --progress=plain --network=host -t $(IMAGE_TAG)-dockerfile-wolfi:$(VERSION_TAG) .
180189

190+
public-dockerfiles_observability-sre: templates/Dockerfile.erb docker_paths $(COPY_FILES)
191+
../vendor/jruby/bin/jruby -S erb -T "-"\
192+
created_date="${BUILD_DATE}" \
193+
elastic_version="${ELASTIC_VERSION}" \
194+
arch="${ARCHITECTURE}" \
195+
version_tag="${VERSION_TAG}" \
196+
release="${RELEASE}" \
197+
image_flavor="observability-sre" \
198+
local_artifacts="false" \
199+
templates/Dockerfile.erb > "${ARTIFACTS_DIR}/Dockerfile-observability-sre" && \
200+
cd $(ARTIFACTS_DIR)/docker && \
201+
cp $(ARTIFACTS_DIR)/Dockerfile-observability-sre Dockerfile && \
202+
tar -zcf ../logstash-observability-sre-$(VERSION_TAG)-docker-build-context.tar.gz Dockerfile bin config env2yaml pipeline
203+
204+
build-from-dockerfiles_observability-sre: public-dockerfiles_observability-sre
205+
cd $(ARTIFACTS_DIR)/docker && \
206+
mkdir -p dockerfile_build_observability-sre && cd dockerfile_build_observability-sre && \
207+
tar -zxf ../../logstash-observability-sre-$(VERSION_TAG)-docker-build-context.tar.gz && \
208+
sed 's/artifacts/snapshots/g' Dockerfile > Dockerfile.tmp && mv Dockerfile.tmp Dockerfile && \
209+
docker build --progress=plain --network=host -t $(IMAGE_TAG)-dockerfile-observability-sre:$(VERSION_TAG) .
210+
181211
public-dockerfiles_ironbank: templates/hardening_manifest.yaml.erb templates/IronbankDockerfile.erb ironbank_docker_paths $(COPY_IRONBANK_FILES)
182212
../vendor/jruby/bin/jruby -S erb -T "-"\
183213
elastic_version="${ELASTIC_VERSION}" \
@@ -187,7 +217,7 @@ public-dockerfiles_ironbank: templates/hardening_manifest.yaml.erb templates/Iro
187217
elastic_version="${ELASTIC_VERSION}" \
188218
arch="${ARCHITECTURE}" \
189219
version_tag="${VERSION_TAG}" \
190-
release="${RELEASE}" \
220+
release="${RELEASE}" \
191221
image_flavor="ironbank" \
192222
local_artifacts="false" \
193223
templates/IronbankDockerfile.erb > "${ARTIFACTS_DIR}/Dockerfile-ironbank" && \

docker/templates/Dockerfile.erb

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# This Dockerfile was generated from templates/Dockerfile.erb
2-
<%# image_flavor 'full', oss', 'wolfi' -%>
2+
<%# image_flavor 'full', oss', 'wolfi', 'observability-sre' -%>
33
<% if local_artifacts == 'false' -%>
44
<% url_root = 'https://artifacts.elastic.co/downloads/logstash' -%>
55
<% else -%>
@@ -11,6 +11,9 @@
1111
<% elsif image_flavor == 'full' %>
1212
<% tarball = "logstash-#{elastic_version}-linux-${arch}.tar.gz" -%>
1313
<% license = 'Elastic License' -%>
14+
<% elsif image_flavor == 'observability-sre' -%><%# 'observability-sre' needs arch to be injected from the outside -%>
15+
<% tarball = "logstash-observability-sre-#{elastic_version}-linux-#{arch}.tar.gz" -%>
16+
<% license = 'Elastic License' -%>
1417
<% else -%><%# 'wolfi' needs arch to be injected from the outside -%>
1518
<% tarball = "logstash-#{elastic_version}-linux-#{arch}.tar.gz" -%>
1619
<% license = 'Elastic License' -%>
@@ -19,6 +22,10 @@
1922
<% base_image = 'redhat/ubi9-minimal:latest' -%>
2023
<% go_image = 'golang:1.23' -%>
2124
<% package_manager = 'microdnf' -%>
25+
<% elsif image_flavor == 'observability-sre' -%>
26+
<% base_image = 'docker.elastic.co/wolfi/chainguard-base-fips' -%>
27+
<% go_image = 'docker.elastic.co/wolfi/go:1.23' -%>
28+
<% package_manager = 'apk' -%>
2229
<% else -%>
2330
<% base_image = 'docker.elastic.co/wolfi/chainguard-base' -%>
2431
<% go_image = 'docker.elastic.co/wolfi/go:1.23' -%>
@@ -52,7 +59,7 @@ RUN \
5259
<%= package_manager %> install -y openssl && \
5360
<%= package_manager %> install -y which shadow-utils && \
5461
<%= package_manager %> clean all
55-
<% else -%><%# 'wolfi' -%>
62+
<% else -%><%# 'wolfi', 'observability-sre' -%>
5663
<%= package_manager %> add --no-cache curl bash openssl
5764
<% end -%>
5865

@@ -64,7 +71,7 @@ RUN groupadd --gid 1000 logstash && \
6471
--home "/usr/share/logstash" \
6572
--no-create-home \
6673
logstash && \
67-
<% else -%><%# 'wolfi' -%>
74+
<% else -%><%# 'wolfi', 'observability-sre' -%>
6875
RUN addgroup -g 1000 logstash && \
6976
adduser -u 1000 -G logstash \
7077
--disabled-password \
@@ -77,7 +84,7 @@ RUN addgroup -g 1000 logstash && \
7784
<% if image_flavor == 'full' || image_flavor == 'oss' -%>
7885
arch="$(rpm --query --queryformat='%{ARCH}' rpm)" && \
7986
<% end -%>
80-
curl -f -Lo logstash.tar.gz <%= url_root %>/<%= tarball %> && \
87+
curl --fail --location --output logstash.tar.gz <%= url_root %>/<%= tarball %> && \
8188
tar -zxf logstash.tar.gz -C /usr/share && \
8289
rm logstash.tar.gz && \
8390
mv /usr/share/logstash-<%= elastic_version %> /usr/share/logstash && \
@@ -93,12 +100,64 @@ COPY --from=builder-env2yaml /tmp/go/src/env2yaml/env2yaml /usr/local/bin/env2ya
93100
COPY --chown=logstash:root config/pipelines.yml config/log4j2.properties config/log4j2.file.properties /usr/share/logstash/config/
94101
<% if image_flavor == 'oss' -%>
95102
COPY --chown=logstash:root config/logstash-oss.yml /usr/share/logstash/config/logstash.yml
96-
<% else -%><%# 'full', 'wolfi' -%>
103+
<% else -%><%# 'full', 'wolfi', 'observability-sre' -%>
97104
COPY --chown=logstash:root config/logstash-full.yml /usr/share/logstash/config/logstash.yml
98105
<% end -%>
99106
COPY --chown=logstash:root pipeline/default.conf /usr/share/logstash/pipeline/logstash.conf
100107
COPY --chmod=0755 bin/docker-entrypoint /usr/local/bin/
101108

109+
<% if image_flavor == 'observability-sre' -%>
110+
# Add FIPS configuration for observability-sre image flavor
111+
RUN mkdir -p /usr/share/logstash/config/security
112+
113+
# Copy JVM security configuration files from the unpacked tarball
114+
RUN cp /usr/share/logstash/x-pack/distributions/internal/observabilitySRE/config/security/java.security /usr/share/logstash/config/security/ && \
115+
cp /usr/share/logstash/x-pack/distributions/internal/observabilitySRE/config/security/java.policy /usr/share/logstash/config/security/ && \
116+
chown --recursive logstash:root /usr/share/logstash/config/security/
117+
118+
# list the classes provided by the fips BC
119+
RUN find /usr/share/logstash -name *.jar | grep lib
120+
121+
# Convert JKS to BCFKS for truststore and keystore
122+
RUN /usr/share/logstash/jdk/bin/keytool -importkeystore \
123+
-srckeystore /usr/share/logstash/jdk/lib/security/cacerts \
124+
-destkeystore /usr/share/logstash/config/security/cacerts.bcfks \
125+
-srcstoretype jks \
126+
-deststoretype bcfks \
127+
-providerpath /usr/share/logstash/logstash-core/lib/jars/bc-fips-2.0.0.jar \
128+
-provider org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider \
129+
-deststorepass changeit \
130+
-srcstorepass changeit \
131+
-noprompt
132+
133+
RUN /usr/share/logstash/jdk/bin/keytool -importkeystore \
134+
-srckeystore /usr/share/logstash/jdk/lib/security/cacerts \
135+
-destkeystore /usr/share/logstash/config/security/keystore.bcfks \
136+
-srcstoretype jks \
137+
-deststoretype bcfks \
138+
-providerpath /usr/share/logstash/logstash-core/lib/jars/bc-fips-2.0.0.jar \
139+
-provider org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider \
140+
-deststorepass changeit \
141+
-srcstorepass changeit \
142+
-noprompt
143+
144+
# Set Java security properties through LS_JAVA_OPTS
145+
ENV LS_JAVA_OPTS="\
146+
-Djava.security.properties=/usr/share/logstash/config/security/java.security \
147+
-Djava.security.policy=/usr/share/logstash/config/security/java.policy \
148+
-Djavax.net.ssl.keyStore=/usr/share/logstash/config/security/keystore.bcfks \
149+
-Djavax.net.ssl.keyStoreType=BCFKS \
150+
-Djavax.net.ssl.keyStoreProvider=BCFIPS \
151+
-Djavax.net.ssl.keyStorePassword=changeit \
152+
-Djavax.net.ssl.trustStore=/usr/share/logstash/config/security/cacerts.bcfks \
153+
-Djavax.net.ssl.trustStoreType=BCFKS \
154+
-Djavax.net.ssl.trustStoreProvider=BCFIPS \
155+
-Djavax.net.ssl.trustStorePassword=changeit \
156+
-Dssl.KeyManagerFactory.algorithm=PKIX \
157+
-Dssl.TrustManagerFactory.algorithm=PKIX \
158+
-Dorg.bouncycastle.fips.approved_only=true"
159+
<% end -%>
160+
102161
WORKDIR /usr/share/logstash
103162

104163
USER 1000

rakelib/artifacts.rake

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ namespace "artifact" do
163163

164164
desc "Generate rpm, deb, tar and zip artifacts"
165165
task "all" => ["prepare", "build"]
166-
task "docker_only" => ["prepare", "build_docker_full", "build_docker_oss", "build_docker_wolfi"]
166+
task "docker_only" => ["prepare", "build_docker_full", "build_docker_oss", "build_docker_wolfi", "build_docker_observabilitySRE"]
167167

168168
desc "Build all (jdk bundled and not) tar.gz and zip of default logstash plugins with all dependencies"
169169
task "archives" => ["prepare", "generate_build_metadata"] do
@@ -255,6 +255,27 @@ namespace "artifact" do
255255
safe_system("./gradlew bootstrap") # force the build of Logstash jars
256256
end
257257

258+
desc "Build jdk bundled tar.gz of observabilitySRE logstash plugins with all dependencies for docker"
259+
task "archives_docker_observabilitySRE" => ["prepare-observabilitySRE", "generate_build_metadata"] do
260+
#with bundled JDKs
261+
@bundles_jdk = true
262+
exclude_paths = default_exclude_paths + %w(
263+
bin/logstash-plugin
264+
bin/logstash-plugin.bat
265+
bin/logstash-keystore
266+
bin/logstash-keystore.bat
267+
)
268+
license_details = ['ELASTIC-LICENSE','-observability-sre', exclude_paths]
269+
%w(x86_64 arm64).each do |arch|
270+
create_archive_pack(license_details, arch, "linux") do |dedicated_directory_tar|
271+
# injection point: Use `DedicatedDirectoryTarball#write(source_file, destination_path)` to
272+
# copy additional files into the tarball
273+
puts "HELLO(#{dedicated_directory_tar})"
274+
end
275+
end
276+
safe_system("./gradlew bootstrap") # force the build of Logstash jars
277+
end
278+
258279
desc "Build an RPM of logstash with all dependencies"
259280
task "rpm" => ["prepare", "generate_build_metadata"] do
260281
#with bundled JDKs
@@ -353,6 +374,12 @@ namespace "artifact" do
353374
build_docker('oss')
354375
end
355376

377+
desc "Build observabilitySRE docker image"
378+
task "docker_observabilitySRE" => ["prepare-observabilitySRE", "generate_build_metadata", "archives_docker_observabilitySRE"] do
379+
puts("[docker_observabilitySRE] Building observabilitySRE docker image")
380+
build_docker('observability-sre')
381+
end
382+
356383
desc "Build wolfi docker image"
357384
task "docker_wolfi" => %w(prepare generate_build_metadata archives_docker) do
358385
puts("[docker_wolfi] Building Wolfi docker image")
@@ -365,6 +392,7 @@ namespace "artifact" do
365392
build_dockerfile('oss')
366393
build_dockerfile('full')
367394
build_dockerfile('wolfi')
395+
build_dockerfile('observability-sre')
368396
build_dockerfile('ironbank')
369397
end
370398

@@ -381,6 +409,19 @@ namespace "artifact" do
381409
end
382410
end
383411

412+
desc "Generate Dockerfile for observability-sre images"
413+
task "dockerfile_observabilitySRE" => ["prepare-observabilitySRE", "generate_build_metadata"] do
414+
puts("[dockerfiles] Building observability-sre Dockerfile")
415+
build_dockerfile('observability-sre')
416+
end
417+
418+
namespace "dockerfile_observabilitySRE" do
419+
desc "Build ObservabilitySrE Docker image from Dockerfile context files"
420+
task "docker" => ["archives_docker_observabilitySRE", "dockerfile_observabilitySRE"] do
421+
build_docker_from_dockerfiles('observability-sre')
422+
end
423+
end
424+
384425
desc "Generate Dockerfile for full images"
385426
task "dockerfile_full" => ["prepare", "generate_build_metadata"] do
386427
puts("[dockerfiles] Building full Dockerfiles")
@@ -425,6 +466,7 @@ namespace "artifact" do
425466
Rake::Task["artifact:docker_wolfi"].invoke
426467
Rake::Task["artifact:dockerfiles"].invoke
427468
Rake::Task["artifact:docker_oss"].invoke
469+
Rake::Task["artifact:docker_observabilitySRE"].invoke
428470
end
429471

430472
Rake::Task["artifact:deb_oss"].invoke
@@ -444,6 +486,12 @@ namespace "artifact" do
444486
Rake::Task["artifact:dockerfile_oss:docker"].invoke
445487
end
446488

489+
task "build_docker_observabilitySRE" => [:generate_build_metadata] do
490+
Rake::Task["artifact:docker_observabilitySRE"].invoke
491+
Rake::Task["artifact:dockerfile_observabilitySRE"].invoke
492+
Rake::Task["artifact:dockerfile_observabilitySRE:docker"].invoke
493+
end
494+
447495
task "build_docker_wolfi" => [:generate_build_metadata] do
448496
Rake::Task["artifact:docker_wolfi"].invoke
449497
Rake::Task["artifact:dockerfile_wolfi"].invoke
@@ -527,6 +575,17 @@ namespace "artifact" do
527575
end
528576
end
529577

578+
task "prepare-observabilitySRE" do
579+
if ENV['SKIP_PREPARE'] != "1"
580+
Rake::Task['bootstrap'].invoke
581+
Rake::Task['plugin:install-default'].invoke
582+
Rake::Task['plugin:install'].invoke('logstash-filter-age')
583+
Rake::Task['plugin:trim-for-observabilitySRE'].invoke
584+
Rake::Task['plugin:install-fips-validation-plugin'].invoke
585+
Rake::Task['artifact:clean-bundle-config'].invoke
586+
end
587+
end
588+
530589
def ensure_logstash_version_constant_defined
531590
# we do not want this file required when rake (ruby) parses this file
532591
# only when there is a task executing, not at the very top of this file

0 commit comments

Comments
 (0)