Skip to content
Merged
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: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
MY_ISV_DOMAINS := bare_metal control-plane iam image-registry network observability security vm
MY_ISV_DOMAINS := bare_metal control-plane iam image-registry network observability security storage vm
DEMO_TARGETS := $(addprefix demo-,$(MY_ISV_DOMAINS))

.PHONY: help pre-commit build test coverage clean lint format install bump-patch bump-fix bump-minor bump-feat bump-major bump bump-check \
Expand Down
3 changes: 3 additions & 0 deletions docs/test-plan.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2444,6 +2444,7 @@ domains:
- summary: Verify volume snapshots
labels:
- min_req
- storage
priority: P1
milestone: M5
notes: ""
Expand All @@ -2456,6 +2457,7 @@ domains:
- summary: Verify volume resizing
labels:
- min_req
- storage
priority: P1
milestone: M5
notes: ""
Expand All @@ -2468,6 +2470,7 @@ domains:
- summary: Verify persistent block volumes survive instance restarts
labels:
- min_req
- storage
priority: P1
milestone: M5
notes: ""
Expand Down
173 changes: 173 additions & 0 deletions isvctl/configs/providers/aws/config/storage.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# AWS Storage (EBS Block Volume) Validation Configuration
#
# Storage is the block-volume implementation of the storage suite, so
# this config imports the provider-agnostic suites/storage.yaml and supplies
# AWS-specific commands (boto3 + SSH) and settings. The launch_instance /
# teardown steps reuse the VM reference scripts; the volume steps live in
# scripts/storage/.
#
# Steps:
# SETUP
# 1. launch_instance - boto3: provision an instance for the fixture
# 2. create_volume - boto3 + SSH: create/attach/format/mount/seed an EBS volume
# TEST
# 3. snapshot_lifecycle - DATASVC-XX-02 (#321): snapshot -> restore -> verify data
# 4. volume_resize - DATASVC-XX-03 (#322): ModifyVolume + growpart/resize2fs
# 5. volume_persistence - DATASVC-XX-04 (#323): stop/start -> verify reattach + data
# TEARDOWN
# 6. teardown_volume - boto3: detach + delete the fixture volume
# 7. teardown - boto3: terminate the instance + SG + key pair
#
# Usage:
# uv run isvctl test run -f isvctl/configs/providers/aws/config/storage.yaml
#
# Required IAM Permissions:
# ec2:DescribeInstances, ec2:RunInstances, ec2:TerminateInstances,
# ec2:StopInstances, ec2:StartInstances, ec2:DescribeImages, ec2:DescribeSubnets,
# ec2:DescribeVpcs, ec2:CreateKeyPair, ec2:DeleteKeyPair, ec2:CreateSecurityGroup,
# ec2:DeleteSecurityGroup, ec2:AuthorizeSecurityGroupIngress, ec2:CreateTags,
# ec2:CreateVolume, ec2:DeleteVolume, ec2:DescribeVolumes, ec2:AttachVolume,
# ec2:DetachVolume, ec2:ModifyVolume, ec2:DescribeVolumesModifications,
# ec2:CreateSnapshot, ec2:DeleteSnapshot, ec2:DescribeSnapshots

import:
- ../../../suites/storage.yaml

version: "1.0"

commands:
storage:
phases: ["setup", "test", "teardown"]
steps:
# AWS-specific: launch the fixture instance (reuses the VM script)
- name: launch_instance
phase: setup
command: "python3 ../scripts/vm/launch_instance.py"
args:
- "--name"
- "isv-test-block"
- "--instance-type"
- "{{instance_type}}"
- "--region"
- "{{region}}"
timeout: 600

# AWS-specific: create + attach + format + mount + seed an EBS volume
- name: create_volume
phase: setup
command: "python3 ../scripts/storage/create_volume.py"
args:
- "--instance-id"
- "{{steps.launch_instance.instance_id}}"
- "--region"
- "{{region}}"
- "--key-file"
- "{{steps.launch_instance.key_file}}"
- "--size-gib"
- "{{volume_size_gib}}"
timeout: 600

# DATASVC-XX-02: snapshot -> restore -> verify data
- name: snapshot_lifecycle
phase: test
command: "python3 ../scripts/storage/snapshot_lifecycle.py"
args:
- "--instance-id"
- "{{steps.launch_instance.instance_id}}"
- "--region"
- "{{region}}"
- "--volume-id"
- "{{steps.create_volume.volume_id}}"
- "--key-file"
- "{{steps.launch_instance.key_file}}"
- "--expected-content"
- "{{steps.create_volume.sentinel_content}}"
timeout: 900

# DATASVC-XX-03: ModifyVolume + in-guest growpart/resize2fs
- name: volume_resize
phase: test
command: "python3 ../scripts/storage/volume_resize.py"
args:
- "--instance-id"
- "{{steps.launch_instance.instance_id}}"
- "--region"
- "{{region}}"
- "--volume-id"
- "{{steps.create_volume.volume_id}}"
- "--key-file"
- "{{steps.launch_instance.key_file}}"
- "--mount-point"
- "{{steps.create_volume.mount_point}}"
timeout: 900

# DATASVC-XX-04: stop/start -> verify reattach + data
# Runs last so the stop/start IP churn does not affect the other tests.
- name: volume_persistence
phase: test
command: "python3 ../scripts/storage/volume_persistence.py"
args:
- "--instance-id"
- "{{steps.launch_instance.instance_id}}"
- "--region"
- "{{region}}"
- "--volume-id"
- "{{steps.create_volume.volume_id}}"
- "--key-file"
- "{{steps.launch_instance.key_file}}"
- "--mount-point"
- "{{steps.create_volume.mount_point}}"
- "--expected-content"
- "{{steps.create_volume.sentinel_content}}"
timeout: 900

# AWS-specific: detach + delete the fixture volume
- name: teardown_volume
phase: teardown
command: "python3 ../scripts/storage/teardown_volume.py"
args:
- "--region"
- "{{region}}"
- "--volume-id"
- "{{steps.create_volume.volume_id}}"
- "{{teardown_flag}}"
timeout: 300

# AWS-specific: terminate the instance (reuses the VM script)
- name: teardown
phase: teardown
command: "python3 ../scripts/vm/teardown.py"
args:
- "--instance-id"
- "{{steps.launch_instance.instance_id}}"
- "--region"
- "{{region}}"
- "--delete-key-pair"
- "--delete-security-group"
- "{{teardown_flag}}"
timeout: 600

tests:
cluster_name: "aws-storage-validation"
description: "AWS block storage (EBS) validation tests"

settings:
region: "us-west-2"
instance_type: "m6i.large"
volume_size_gib: "10"
teardown_flag: "{{(env.BLOCK_STORAGE_SKIP_TEARDOWN == 'true') | ternary('--skip-destroy', '')}}"
Loading