FROM registry.fedoraproject.org/fedora:43 AS selenium-atd
LABEL maintainer="ansible-devtools@redhat.com"

COPY init.go .

COPY settings.json /home/selenium/.local/share/code-server/User/settings.json

# Gecko driver releases
# https://github.com/mozilla/geckodriver/releases
# Chrome versions
# https://www.ubuntuupdates.org/package/google_chrome/stable/main/base/google-chrome-stable
ARG \
GECKODRIVER_VERSION="v0.36.0" \
CHROME_VERSION="144.0.7559.59-1" \
SELENIUM_MAJOR_VERSION=4 \
SELENIUM_MINOR_VERSION=39 \
SELENIUM_PATCH_VERSION=0 \
SELENIUM_HTTP_JDK_CLIENT_VERSION="4.13.0"

ENV SELENIUM_HOME=/home/selenium

ENV \
SELENIUM_PORT=4444 \
SELENIUM_SESSION_TIMEOUT=1800 \
VNC_PORT=5999 \
API_PORT=8000 \
DISPLAY=:99 \
DBUS_SESSION_BUS_ADDRESS=/dev/null \
HOME=${SELENIUM_HOME} \
VNC_GEOMETRY="1600x900" \
SELENIUM_VERSION=${SELENIUM_MAJOR_VERSION}.${SELENIUM_MINOR_VERSION}.${SELENIUM_PATCH_VERSION} \
SELENIUM_PATH=${SELENIUM_HOME}/selenium-server/selenium-server-standalone.jar \
SELENIUM_HTTP_JDK_CLIENT_PATH=${SELENIUM_HOME}/selenium-server/selenium-http-jdk-client.jar \
PATH=${SELENIUM_HOME}/firefox:/opt/google/chrome:${PATH}

EXPOSE ${SELENIUM_PORT} ${VNC_PORT} ${API_PORT}

WORKDIR ${SELENIUM_HOME}

RUN --mount=type=cache,dst=/var/cache/dnf PACKAGES="\
alsa-lib \
at-spi2-atk \
at-spi2-core \
atk \
avahi-libs \
bzip2 \
cairo \
cairo-gobject \
cups-libs \
dbus-glib \
dbus-libs \
expat \
fluxbox \
fontconfig \
freetype \
fribidi \
gcc \
gdk-pixbuf2 \
go \
graphite2 \
gtk3 \
harfbuzz \
imlib2 \
java-latest-openjdk-headless \
jq \
libcloudproviders \
libdatrie \
libdrm \
libepoxy \
liberation-fonts \
liberation-fonts-common \
liberation-mono-fonts \
liberation-sans-fonts \
liberation-serif-fonts \
libfontenc \
libglvnd \
libglvnd-glx \
libICE \
libjpeg-turbo \
libpng \
libSM \
libthai \
libwayland-client \
libwayland-cursor \
libwayland-egl \
libwayland-server \
libwebp \
libX11 \
libX11-common \
libX11-xcb \
libXau \
libxcb \
libXcomposite \
libXcursor \
libXdamage \
libXdmcp \
libXext \
libXfixes \
libXfont2 \
libXft \
libXi \
libXinerama \
libxkbcommon \
libxkbfile \
libXpm \
libXrandr \
libXrender \
libXtst \
libxshmfence \
libXt \
mesa-libgbm \
nspr \
nss \
nss-softokn \
nss-softokn-freebl \
nss-util \
nss-tools \
nss-sysinit \
pango \
ncurses \
oniguruma-devel \
pixman \
python3-bcrypt \
python3-cffi \
python3-devel \
python3-markupsafe \
python3-pip \
python3-pyyaml \
python3-ruamel-yaml \
python3-wheel \
tar \
tigervnc-server-minimal \
tzdata-java \
unzip \
vulkan-loader \
wget \
xdg-utils \
xkbcomp \
xkeyboard-config" && \
microdnf -q -y install ${PACKAGES} >/dev/null
# ^ https://github.com/rpm-software-management/dnf5/issues/570

RUN --mount=type=bind,src=dist,dst=/dist python3 -m pip install --no-cache-dir --extra server "$(ls -1 /dist/ansible_dev_tools-*)[server]"

RUN --mount=type=cache,target=/.cache --mount=type=cache,target=/home/selenium/.cache/code-server \
GECKODRIVER_ARCH=$([ "$(arch)" = "aarch64" ] && echo linux-aarch64 || echo linux64) && \
mkdir -p ${SELENIUM_HOME}/selenium-server && \
cd /.cache && \
curl -sSfL -C - https://github.com/SeleniumHQ/selenium/releases/download/selenium-${SELENIUM_MAJOR_VERSION}.${SELENIUM_MINOR_VERSION}.0/selenium-server-${SELENIUM_VERSION}.jar \
-o ${SELENIUM_PATH} && \
curl -sSfL -C - https://repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-http-jdk-client/${SELENIUM_HTTP_JDK_CLIENT_VERSION}/selenium-http-jdk-client-${SELENIUM_HTTP_JDK_CLIENT_VERSION}.jar \
-o ${SELENIUM_HTTP_JDK_CLIENT_PATH} && \
curl -sSfL https://download-installer.cdn.mozilla.net/pub/firefox/releases/140.7.0esr/linux-$(arch)/en-US/firefox-140.7.0esr.tar.xz -o firefox.tar.xz && tar --xz -x -f firefox.tar.xz -C ${SELENIUM_HOME} && \
curl -sSfL -C - -O https://github.com/mozilla/geckodriver/releases/download/${GECKODRIVER_VERSION}/geckodriver-${GECKODRIVER_VERSION}-${GECKODRIVER_ARCH}.tar.gz && \
tar -C /usr/bin/ -xvf geckodriver-${GECKODRIVER_VERSION}-${GECKODRIVER_ARCH}.tar.gz && \
cd ${SELENIUM_HOME} && \
mkdir -p .cache/dconf .mozilla/plugins .vnc/ .fluxbox/ && \
echo "session.screen0.toolbar.autoHide: true" > .fluxbox/init && \
touch .Xauthority .vnc/config && \
curl -fsSL https://code-server.dev/install.sh | sh

COPY selenium-node.toml /home/selenium/selenium-node.toml

RUN \
code-server --install-extension ms-python.vscode-python-envs \
--install-extension ms-python.python \
--install-extension redhat.vscode-yaml \
--install-extension redhat.vscode-redhat-account && \
mkdir -p workspace && touch workspace/playbook.yaml && \
modutil -fips true -dbdir /etc/pki/nssdb -force && \
chown -R 0:0 /etc/pki/nssdb && \
chmod 644 /etc/pki/nssdb/* && \
chown -R 1001:0 ${SELENIUM_HOME} && \
chmod -R g=u ${SELENIUM_HOME} && \
geckodriver --version && \
code-server --version && \
Xvnc -version && \
fluxbox --version && \
java -version && \
firefox --version && \
if [ "$(arch)" = "aarch64" ]; then export JAVA_TOOL_OPTIONS=-XX:UseSVE=0; fi && \
java -Dwebdriver.http.factory=jdk-http-client -jar ${SELENIUM_PATH} --ext ${SELENIUM_HTTP_JDK_CLIENT_PATH} info

USER 1001

# install packages needed for go file
RUN go vet /init.go

# run init.go to start all process in order
CMD ["sh", "-c", "go run /init.go" ]
