Skip to content

Commit

Permalink
Adding image tests for memory monitoring
Browse files Browse the repository at this point in the history
  • Loading branch information
yawangwang committed Nov 16, 2023
1 parent ed6b88e commit 8f89e86
Show file tree
Hide file tree
Showing 11 changed files with 232 additions and 10 deletions.
43 changes: 42 additions & 1 deletion cloudbuild.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,48 @@ steps:
gcloud builds submit --config=test_log_redirection.yaml --region us-west1 \
--substitutions _HARDENED_IMAGE_NAME=${OUTPUT_IMAGE_PREFIX}-hardened-${OUTPUT_IMAGE_SUFFIX},_IMAGE_PROJECT=${PROJECT_ID}
exit
- name: 'gcr.io/cloud-builders/gcloud'
id: HardenedDiscoverContainerSignatureTests
waitFor: ['HardenedImageBuild']
env:
- 'OUTPUT_IMAGE_PREFIX=$_OUTPUT_IMAGE_PREFIX'
- 'OUTPUT_IMAGE_SUFFIX=$_OUTPUT_IMAGE_SUFFIX'
- 'PROJECT_ID=$PROJECT_ID'
script: |
#!/usr/bin/env bash
cd launcher/image/test
echo "running hardened image container signature tests on ${OUTPUT_IMAGE_PREFIX}-hardened-${OUTPUT_IMAGE_SUFFIX}"
gcloud builds submit --config=test_discover_signatures.yaml --region us-west1 \
--substitutions _IMAGE_NAME=${OUTPUT_IMAGE_PREFIX}-hardened-${OUTPUT_IMAGE_SUFFIX},_IMAGE_PROJECT=${PROJECT_ID},_SIGNATURE_REPO=us-docker.pkg.dev/confidential-space-images-dev/cs-cosign-tests/hardened
exit
- name: 'gcr.io/cloud-builders/gcloud'
id: DebugDiscoverContainerSignatureTests
waitFor: ['DebugImageBuild']
env:
- 'OUTPUT_IMAGE_PREFIX=$_OUTPUT_IMAGE_PREFIX'
- 'OUTPUT_IMAGE_SUFFIX=$_OUTPUT_IMAGE_SUFFIX'
- 'PROJECT_ID=$PROJECT_ID'
script: |
#!/usr/bin/env bash
cd launcher/image/test
echo "running debug image container signature tests on ${OUTPUT_IMAGE_PREFIX}-debug-${OUTPUT_IMAGE_SUFFIX}"
gcloud builds submit --config=test_discover_signatures.yaml --region us-west1 \
--substitutions _IMAGE_NAME=${OUTPUT_IMAGE_PREFIX}-debug-${OUTPUT_IMAGE_SUFFIX},_IMAGE_PROJECT=${PROJECT_ID},_SIGNATURE_REPO=us-docker.pkg.dev/confidential-space-images-dev/cs-cosign-tests/debug
exit
- name: 'gcr.io/cloud-builders/gcloud'
id: MemoryMonitoringTests
waitFor: ['HardenedImageBuild']
env:
- 'OUTPUT_IMAGE_PREFIX=$_OUTPUT_IMAGE_PREFIX'
- 'OUTPUT_IMAGE_SUFFIX=$_OUTPUT_IMAGE_SUFFIX'
- 'PROJECT_ID=$PROJECT_ID'
script: |
#!/usr/bin/env bash
cd launcher/image/test
echo "running memory monitoring tests on ${OUTPUT_IMAGE_PREFIX}-hardened-${OUTPUT_IMAGE_SUFFIX}"
gcloud builds submit --config=test_memory_monitoring.yaml --region us-west1 \
--substitutions _IMAGE_NAME=${OUTPUT_IMAGE_PREFIX}-hardened-${OUTPUT_IMAGE_SUFFIX},_IMAGE_PROJECT=${PROJECT_ID}
exit
options:
pool:
Expand Down
10 changes: 2 additions & 8 deletions launcher/container_runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import (
"github.com/google/go-tpm-tools/cel"
"github.com/google/go-tpm-tools/client"
"github.com/google/go-tpm-tools/launcher/agent"
npd "github.com/google/go-tpm-tools/launcher/internal/healthmonitoring/nodeproblemdetector"
"github.com/google/go-tpm-tools/launcher/internal/signaturediscovery"
"github.com/google/go-tpm-tools/launcher/internal/systemctl"
"github.com/google/go-tpm-tools/launcher/launcherfile"
Expand Down Expand Up @@ -514,13 +513,6 @@ func (r *ContainerRunner) Run(ctx context.Context) error {
// customize node-problem-detector.service and start it.
if r.launchSpec.MemoryMonitoringEnabled {
r.logger.Println("MemoryMonitoring is enabled")
config := npd.NewSystemStatsConfig()
// collects "memory/bytes_used" metrics only when memory monitoring enabled.
config.EnableMemoryBytesUsed()
// override the default config file.
if err := config.WriteFile(systemStatsConfigFilePath); err != nil {
return fmt.Errorf("failed to override the default config file [%s] for node-problem-detector: %v", systemStatsConfigFilePath, err)
}
s, err := systemctl.New()
if err != nil {
return fmt.Errorf("failed to create systemctl client: %v", err)
Expand All @@ -531,6 +523,8 @@ func (r *ContainerRunner) Run(ctx context.Context) error {
return fmt.Errorf("failed to start node-problem-detector.service: %v", err)
}
r.logger.Println("node-problem-detector.service successfully started.")
} else {
r.logger.Println("node-problem-detector.service disabled.")
}

var streamOpt cio.Opt
Expand Down
2 changes: 2 additions & 0 deletions launcher/image/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ main() {
# Override default fluent-bit config.
cp /usr/share/oem/confidential_space/fluent-bit-cs.conf /etc/fluent-bit/fluent-bit.conf

# Override default system-stats-monitor.json for node-problem-detector.
cp /usr/share/oem/confidential_space/system-stats-monitor-cs.json /etc/node_problem_detector/system-stats-monitor.json
systemctl daemon-reload
systemctl enable container-runner.service
systemctl start container-runner.service
Expand Down
7 changes: 7 additions & 0 deletions launcher/image/preload.sh
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,19 @@ configure_cloud_logging() {
cp fluent-bit-cs.conf "${CS_PATH}"
}

configure_node_problem_detector() {
# Copy CS-specific node-problem-detector config to OEM partition.
cp system-stats-monitor-cs.json "${CS_PATH}"
}

configure_systemd_units_for_debug() {
configure_cloud_logging
configure_node_problem_detector
}
configure_systemd_units_for_hardened() {
configure_necessary_systemd_units
configure_cloud_logging
configure_node_problem_detector
# Make entrypoint (via cloud-init) the default unit.
set_default_boot_target "cloud-final.service"

Expand Down
11 changes: 11 additions & 0 deletions launcher/image/system-stats-monitor-cs.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"memory": {
"metricsConfigs": {
"memory/bytes_used": {
"displayName": "memory/bytes_used"
}
}
},
"invokeInterval": "60s"
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/bin/bash
set -euxo pipefail
source util/read_serial.sh

# This test requires the workload to run and printing
# corresponding messages to the serial console.
SERIAL_OUTPUT=$(read_serial $1 $2)
print_serial=false

if echo $SERIAL_OUTPUT | grep -q 'Found container image signatures'
then
echo "- container image signatures found"
else
echo "FAILED: container image signatures not found"
echo 'TEST FAILED.' > /workspace/status.txt
print_serial=true
fi

if $print_serial; then
echo $SERIAL_OUTPUT
fi
21 changes: 21 additions & 0 deletions launcher/image/test/scripts/test_memory_monitoring_enabled.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/bin/bash
set -euxo pipefail
source util/read_serial.sh

# This test requires the workload to run and printing
# corresponding messages to the serial console.
SERIAL_OUTPUT=$(read_serial $1 $2)
print_serial=false

if echo $SERIAL_OUTPUT | grep -q 'node-problem-detector.service successfully started'
then
echo "- memory monitoring enabled"
else
echo "FAILED: memory monitoring disabled"
echo 'TEST FAILED.' > /workspace/status.txt
print_serial=true
fi

if $print_serial; then
echo $SERIAL_OUTPUT
fi
69 changes: 69 additions & 0 deletions launcher/image/test/test_discover_signatures.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
substitutions:
'_IMAGE_NAME': ''
'_IMAGE_PROJECT': ''
'_CLEANUP': 'true'
'_VM_NAME_PREFIX': 'discover-signatures'
'_ZONE': 'us-west1-a'
'_WORKLOAD_IMAGE': 'us-west1-docker.pkg.dev/confidential-space-images-dev/cs-integ-test-images/basic-test:latest'
'_SIGNATURE_REPO': 'us-docker.pkg.dev/confidential-space-images-dev/cs-cosign-tests/hardened'

steps:
- name: 'gcr.io/projectsigstore/cosign:v2.2.0'
id: SignContainer
entrypoint: 'sh'
env:
- 'BUILD_ID=$BUILD_ID'
args:
- -c
- |
# Unpadded base64 encoding on the CloudKMS public key
pub=$(cosign public-key --key gcpkms://projects/confidential-space-images-dev/locations/global/keyRings/cosign-test/cryptoKeys/ecdsa/cryptoKeyVersions/1 | openssl base64)
pub=$(echo $pub | tr -d '[:space:]' | sed 's/[=]*$//')
# Use cosign sign
export COSIGN_REPOSITORY=${_SIGNATURE_REPO}
cosign sign --key gcpkms://projects/confidential-space-images-dev/locations/global/keyRings/cosign-test/cryptoKeys/ecdsa/cryptoKeyVersions/1 ${_WORKLOAD_IMAGE} -a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 -a dev.cosignproject.cosign/pub=$pub
- name: 'gcr.io/cloud-builders/gcloud'
id: CreateVM
entrypoint: 'bash'
env:
- 'BUILD_ID=$BUILD_ID'
args: ['create_vm.sh','-i', '${_IMAGE_NAME}',
'-p', '${_IMAGE_PROJECT}',
'-m', 'tee-image-reference=${_WORKLOAD_IMAGE},tee-container-log-redirect=true,tee-signed-image-repos=${_SIGNATURE_REPO},tee-env-ALLOWED_OVERRIDE=overridden,tee-cmd=["newCmd"]',
'-n', '${_VM_NAME_PREFIX}-${BUILD_ID}',
'-z', '${_ZONE}',
]
- name: 'gcr.io/cloud-builders/gcloud'
id: BasicDiscoverSignaturesTest
entrypoint: 'bash'
args: ['scripts/test_launcher_workload_discover_signatures.sh', '${_VM_NAME_PREFIX}-${BUILD_ID}', '${_ZONE}']
- name: 'gcr.io/cloud-builders/gcloud'
id: CleanUp
entrypoint: 'bash'
env:
- 'CLEANUP=$_CLEANUP'
args: ['cleanup.sh', '${_VM_NAME_PREFIX}-${BUILD_ID}', '${_ZONE}']
- name: 'gcr.io/cloud-builders/gcloud'
id: DeleteContainerSignatures
env:
- 'BUILD_ID=$BUILD_ID'
entrypoint: 'bash'
args:
- -c
- |
echo "Deleting container signatures..."
digest=$(gcloud artifacts docker images describe ${_WORKLOAD_IMAGE} --format 'value(image_summary.digest)')
tag=${digest/":"/"-"}.sig
# Delete container signature by its tag
gcloud artifacts docker images delete -q ${_SIGNATURE_REPO}:${tag}
# Must come after cleanup.
- name: 'gcr.io/cloud-builders/gcloud'
id: CheckFailure
entrypoint: 'bash'
env:
- 'BUILD_ID=$BUILD_ID'
args: ['check_failure.sh']

options:
pool:
name: 'projects/confidential-space-images-dev/locations/us-west1/workerPools/cs-image-build-vpc'
42 changes: 42 additions & 0 deletions launcher/image/test/test_memory_monitoring.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
substitutions:
'_IMAGE_NAME': ''
'_IMAGE_PROJECT': ''
'_CLEANUP': 'true'
'_VM_NAME_PREFIX': 'memory-monitoring'
'_ZONE': 'us-east1-b'
'_WORKLOAD_IMAGE': 'us-west1-docker.pkg.dev/confidential-space-images-dev/cs-integ-test-images/memorymonitoring:latest'

steps:
- name: 'gcr.io/cloud-builders/gcloud'
id: CreateVM
entrypoint: 'bash'
env:
- 'BUILD_ID=$BUILD_ID'
args: ['create_vm.sh','-i', '${_IMAGE_NAME}',
'-p', '${_IMAGE_PROJECT}',
'-m', 'tee-image-reference=${_WORKLOAD_IMAGE},tee-container-log-redirect=true,tee-env-ALLOWED_OVERRIDE=overridden,tee-cmd=["newCmd"],tee-monitoring-memory-enable=true',
'-n', '${_VM_NAME_PREFIX}-${BUILD_ID}',
'-z', '${_ZONE}',
]
- name: 'gcr.io/cloud-builders/gcloud'
id: CheckMemoryMonitoringEnabled
entrypoint: 'bash'
args: ['scripts/test_memory_monitoring_enabled.sh', '${_VM_NAME_PREFIX}-${BUILD_ID}', '${_ZONE}']

- name: 'gcr.io/cloud-builders/gcloud'
id: CleanUp
entrypoint: 'bash'
env:
- 'CLEANUP=$_CLEANUP'
args: ['cleanup.sh', '${_VM_NAME_PREFIX}-${BUILD_ID}', '${_ZONE}']
# Must come after cleanup.
- name: 'gcr.io/cloud-builders/gcloud'
id: CheckFailure
entrypoint: 'bash'
env:
- 'BUILD_ID=$BUILD_ID'
args: ['check_failure.sh']

options:
pool:
name: 'projects/confidential-space-images-dev/locations/us-west1/workerPools/cs-image-build-vpc'
14 changes: 14 additions & 0 deletions launcher/image/testworkloads/memorymonitoring/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# From current directory:
# GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main ../basic
# gcloud builds submit --tag us-west1-docker.pkg.dev/confidential-space-images-dev/cs-integ-test-images/memorymonitoring:latest --project confidential-space-images-dev
FROM alpine

COPY main /

ENV env_bar="val_bar"

LABEL "tee.launch_policy.monitoring_memory_allow"="always"

ENTRYPOINT ["/main"]

CMD ["arg_foo"]
2 changes: 1 addition & 1 deletion launcher/spec/launch_policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ const (
envOverride = "tee.launch_policy.allow_env_override"
cmdOverride = "tee.launch_policy.allow_cmd_override"
logRedirect = "tee.launch_policy.log_redirect"
memoryMonitoring = "tee.launch_policy.monitoring.memory.allow"
memoryMonitoring = "tee.launch_policy.monitoring_memory_allow"
)

// GetLaunchPolicy takes in a map[string] string which should come from image labels,
Expand Down

0 comments on commit 8f89e86

Please sign in to comment.