Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .evergreen.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ variables:
variant: init_test_run
- name: build_init_appdb_images_ubi
variant: init_test_run
- name: publish_helm_chart
variant: init_test_run

- &community_dependency
depends_on:
Expand Down
13 changes: 10 additions & 3 deletions docker/mongodb-kubernetes-tests/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ RUN apt-get -qq update \
libldap2-dev \
libsasl2-dev \
git \
openssl
openssl \
unzip

RUN mkdir -p /tmp/mongodb-tools && \
tar xfz /tmp/mongodb-tools.tgz -C /tmp/mongodb-tools && \
Expand All @@ -66,6 +67,11 @@ RUN curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -
&& chmod +x ./kubectl \
&& mv ./kubectl /usr/local/bin/kubectl

# install aws, required to run helm registry login while running the tests
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
&& unzip -q awscliv2.zip \
&& ./aws/install

COPY --from=builder /venv /venv

ENV PATH="/venv/bin:${PATH}"
Expand All @@ -75,8 +81,9 @@ WORKDIR /tests

# copying the test files after python build, otherwise pip install will be called each time the tests change
COPY . /tests
# copying the helm_chart directory as well to support installation of the Operator from the test application
COPY helm_chart /helm_chart
# copying the helm_chart/crds directory so that we can install CRDs before installing the operator helm chart to run a test.
# operator is installed via published OCI helm repo and not the local helm repo.
COPY helm_chart/crds /helm_chart/crds
COPY release.json /release.json
# we use the public directory to automatically test resources samples
COPY public /mongodb-kubernetes/public
Expand Down
75 changes: 72 additions & 3 deletions docker/mongodb-kubernetes-tests/kubetester/helm.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

logger = test_logger.get_test_logger(__name__)


def helm_template(
helm_args: Dict,
helm_chart_path: Optional[str] = "helm_chart",
Expand Down Expand Up @@ -144,6 +143,53 @@ def process_run_and_check(args, **kwargs):
logger.error(f"output: {exc.output}")
raise

def oci_helm_registry_login(helm_registry: str, region: str):
logger.info(f"Attempting to log into ECR registry: {helm_registry}, using helm registry login.")

aws_command = ["aws", "ecr", "get-login-password", "--region", region]

# as we can see the password is being provided by stdin, that would mean we will have to
# pipe the aws_command (it figures out the password) into helm_command.
helm_command = ["helm", "registry", "login", "--username", "AWS", "--password-stdin", helm_registry]

try:
logger.info("Starting AWS ECR credential retrieval.")
aws_proc = subprocess.Popen(
aws_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True # Treat input/output as text strings
)

logger.info("Starting Helm registry login.")
helm_proc = subprocess.Popen(
helm_command, stdin=aws_proc.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
)

# Close the stdout stream of aws_proc in the parent process
# to prevent resource leakage (only needed if you plan to do more processing)
aws_proc.stdout.close()

# Wait for the Helm command (helm_proc) to finish and capture its output
helm_stdout, helm_stderr = helm_proc.communicate()

# Wait for the AWS process to finish as well
aws_proc.wait()

if aws_proc.returncode != 0:
_, aws_stderr = aws_proc.communicate()
raise Exception(f"aws command to get password failed. Error: {aws_stderr}")

if helm_proc.returncode == 0:
logger.info("Login to helm registry was successful.")
logger.info(helm_stdout.strip())
else:
raise Exception(
f"Login to helm registry failed, Exit code: {helm_proc.returncode}, Error: {helm_stderr.strip()}"
)

except FileNotFoundError as e:
# This catches errors if 'aws' or 'helm' are not in the PATH
raise Exception(f"Command not found. Please ensure '{e.filename}' is installed and in your system's PATH.")
except Exception as e:
raise Exception(f"An unexpected error occurred: {e}.")

def helm_upgrade(
name: str,
Expand All @@ -162,8 +208,18 @@ def helm_upgrade(
chart_dir = helm_chart_path if helm_override_path else _helm_chart_dir(helm_chart_path)

if apply_crds_first:
# right now tests image has the entire helm_chart directory, maybe we should just copy the CRDs
apply_crds_from_chart(chart_dir)

# login to helm registry because we are going to install published helm chart
try:
registry, repository, region = oci_chart_info()

oci_helm_registry_login(registry, region)
except Exception as e:
raise Exception(f"Failed logging in to the helm registry {registry}. Error: {e}")

chart_uri = f"oci://{registry}/{repository}"
command_args = _create_helm_args(helm_args, helm_options)
args = [
"helm",
Expand All @@ -173,15 +229,28 @@ def helm_upgrade(
*command_args,
name,
]

if custom_operator_version:
args.append(f"--version={custom_operator_version}")
else:
published_chart_version = os.environ.get("OPERATOR_VERSION")
if not published_chart_version:
logger.info("OPERATOR_VERSION env var is not set")
args.append(f"--version=0.0.0+{published_chart_version}")

args.append(chart_dir)
args.append(chart_uri)

command = " ".join(args)
process_run_and_check(command, check=True, capture_output=True, shell=True)

def oci_chart_info():
registry = os.environ.get("OCI_HELM_REGISTRY")
repository = os.environ.get("OCI_HELM_REPOSITORY")
region = os.environ.get("OCI_HELM_REGION")

print(f"oci chart details in test image is registry {registry}, repo {repository}, region {region}")

return registry, f"{repository}/mongodb-kubernetes", region

def apply_crds_from_chart(chart_dir: str):
crd_files = glob.glob(os.path.join(chart_dir, "crds", "*.yaml"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,22 @@ spec:
- name: OM_DEBUG_HTTP
value: "{{ .Values.omDebugHttp }}"
{{ end }}
{{ if .Values.helm.oci.registry }}
- name: OCI_HELM_REGISTRY
value: "{{ .Values.helm.oci.registry }}"
{{ end }}
{{ if .Values.operator.version }}
- name: OPERATOR_VERSION
value: "{{ .Values.operator.version }}"
{{ end }}
{{ if .Values.helm.oci.repository }}
- name: OCI_HELM_REPOSITORY
value: "{{ .Values.helm.oci.repository }}"
{{ end }}
{{ if .Values.helm.oci.region }}
- name: OCI_HELM_REGION
value: "{{ .Values.helm.oci.region }}"
{{ end }}
- name: ops_manager_version
value: "{{ .Values.opsManagerVersion }}"
- name: cognito_user_pool_id
Expand Down
11 changes: 11 additions & 0 deletions scripts/evergreen/deployments/test-app/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,14 @@ mdbImageType: "ubi8"

# set to "true" to set OM_DEBUG_HTTP=true for the operator
omDebugHttp:

# sets the configuration using which we can figure out the helm OCI repo of the MCK operator while deploying it
# to run a test.
helm:
oci:
registry: ""
repository: ""
region: ""

operator:
version: ""
21 changes: 21 additions & 0 deletions scripts/evergreen/e2e/single_e2e.sh
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ deploy_test_app() {
BUILD_ID="${BUILD_ID:-default_build_id}"
BUILD_VARIANT="${BUILD_VARIANT:-default_build_variant}"

chart_info=$(scripts/dev/run_python.sh scripts/release/oci_chart_info.py)
helm_oci_regisry=$(echo "$chart_info" | jq -r '.registry' )
helm_oci_repository=$(echo "$chart_info" | jq -r '.repository' )
helm_oci_registry_region=$(echo "$chart_info" | jq -r '.region' )

# note, that the 4 last parameters are used only for Mongodb resource testing - not for Ops Manager
helm_params=(
"--set" "taskId=${task_id:-'not-specified'}"
Expand Down Expand Up @@ -139,6 +144,22 @@ deploy_test_app() {
helm_params+=("--set" "omDebugHttp=true")
fi

if [[ -n "${helm_oci_regisry:-}" ]]; then
helm_params+=("--set" "helm.oci.registry=${helm_oci_regisry}")
fi

if [[ -n "${helm_oci_repository:-}" ]]; then
helm_params+=("--set" "helm.oci.repository=${helm_oci_repository}")
fi

if [[ -n "${helm_oci_registry_region:-}" ]]; then
helm_params+=("--set" "helm.oci.region=${helm_oci_registry_region}")
fi

if [[ -n "${OPERATOR_VERSION:-}" ]]; then
helm_params+=("--set" "operator.version=${OPERATOR_VERSION}")
fi

helm_params+=("--set" "opsManagerVersion=${ops_manager_version}")

helm template "scripts/evergreen/deployments/test-app" "${helm_params[@]}" > "${helm_template_file}" || exit 1
Expand Down
24 changes: 24 additions & 0 deletions scripts/release/oci_chart_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import os
import sys
import json

from dataclasses import asdict
from lib.base_logger import logger
from scripts.release.build.build_info import load_build_info

def main():
build_scenario = os.environ.get("BUILD_SCENARIO")
build_info = load_build_info(build_scenario)
chart_info = build_info.helm_charts["mongodb-kubernetes"]

j = json.dumps(asdict(chart_info))
print(j)



if __name__ == "__main__":
try:
main()
except Exception as e:
logger.error(f"Failed while dumping the chart_info as json. Error: {e}")
sys.exit(1)