Developing in Nemesis
The following requirements need to be installed for development:
Install the Protobuf Compiler
**Purpose:** Compiles protobuf specs to python (or other languages). * Install protobuf-compiler package# Install the protobuf compiler
wget https://github.com/protocolbuffers/protobuf/releases/download/v21.5/protoc-21.5-linux-x86_64.zip
sudo apt-get install -y zip
sudo unzip protoc-21.5-linux-x86_64.zip -d /usr/local/
Also ensure you have minikube and skaffold setup from the setup guide.
Running Nemesis during Dev
If you're doing general development, if you set the operation.environment variable in values.yaml to test which will deploy everything without persistent storage. Then running skaffold dev -m nemesis
will build the images and kick everything off.
If you want to perform remote debugging for the enrichment
container (see remote_debugging.md) set the operation.environment variable in values.yaml to development for the Helm chart which will deploy everything but the enrichment
container without persistent storage. Run skaffold dev -m nemesis
(or helm install nemesis ./helm/nemesis --timeout '45m'
to use the public images) and then launching skaffold dev -m enrichment
via VS Code will kick off the separate chart for just the enrichment container.
Service Development
The recommended way to develop a new (or modify a current) service is with VS Code and a remote workspace. This allows you to write and debug code without having to deploy the complete container.
To do this, follow this guide to set up remote SSH for development - we recommend having the code itself reside on a supported Debian 11 image and remoting in from your main OS for development. If you have issues, see the remote debugging guide for more details.
Once the remote session has been established:
- Open up just the module folder in ./cmd/ (e.g.,
enrichment
) - Go to
Terminal
->New Terminal
- (First time) activate the Poetry environment with
poetry install
- Ensure a
./vscode/launch.json
is present (see ./cmd/enrichment for an example) - Create a
.env
file in the root directory that contains VAR=val environment variables to set - Start the needed Nemesis infrastructure on the host, minus this module.
- Ensure the needed ports (RabbitMQ/etc.) are exposed locally
- On the left click the
Run and Debug
button and launch the application
Note: If you want to reset your Poetry environment, see this post.
Building and Troubleshooting Docker Images
You can build and troubleshoot Nemesis's docker containers using the docker CLI. For example, to troublehshoot the enrichment image you can do the following:
-
Build the image and give it a name of "test"
docker build -t test -f ./dockerfiles/enrichment.Dockerfile
-
Run the "test" image and do your troubleshooting via a bash prompt:
docker run --rm -ti test bash
To build the images inside of k8s, you can use skaffold:
skaffold build
Testing file processing
One can test file processing using the ./scripts/submit_to_nemesis.sh
script. To configure the script, modify the settings in ./cmd/enrichment/enrichment/cli/submit_to_nemesis/submit_to_nemesis.yaml
.
The ./sample_files/
folder contains many examples of files that Nemesis can process. For example, to test Nemesis's ability to extract a .ZIP file and process all the files inside of the zip, configure the YAML file and then run (make sure to specify the absolute path):
./scripts/submit_to_nemesis.sh -f ./sample_files/zip_test.zip
To see a list of all command line arguments run ./scripts/submit_to_nemesis.sh -h
.
kubectl / kubernetes version skews
According to kubernetes it's the best practice to keep kubectl and the kubernetes image used by minikube in sync. You can tell the versions of both with:
kubectl version --short
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.27.1
Kustomize Version: v5.0.1
Server Version: v1.24.3
WARNING: version difference between client (1.27) and server (1.24) exceeds the supported minor version skew of +/-1
You can update kubectl with:
sudo apt-get update
sudo apt-get install -y kubectl
If you want to specify a version for kubectl, use:
curl -LO https://dl.k8s.io/release/v1.25.4/bin/linux/amd64/kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
You can then specify the kubernetes imge pulled by minikube with:
minikube start --kubernetes-version v1.25.4
./scripts/
The following describes the files in the ./scripts/ directory:
File | Purpose |
---|---|
build_protobufs.sh | Builds the protobuf definition file. |
dashboard_start.sh | Starts the dashboard container. |
infra_start.sh | Starts the stable backend infrastructure pods. |
interact.sh | Takes a pod name an interacts with the main system's bash env. |
pod_resource_usage.sh | Displays an a continuously updated state of the pods' resource utilization. |
pull_images.sh | Downloads all docker iamges used by Nemesis. |
services_start.sh | Starts the main processing service pods. |
submit_to_nemesis.sh | Helper to manually submit a file to Nemesis. |
total_memory.sh | Displays the total memory currently being used by the cluster. |
watch_pods.sh | Displays an a continuously updated state of the pods' status(es). |