733 lines
22 KiB
Markdown
Raw Normal View History

2025-10-07 11:05:08 +01:00
# Polkadot Zombienet Task Service
## Overview
The Polkadot Zombienet task service provides a complete installation and configuration of [Zombienet](https://github.com/paritytech/zombienet), a powerful testing framework for Polkadot and Substrate-based networks. Zombienet enables developers to spawn ephemeral networks with multiple validators, parachains, and test scenarios for comprehensive blockchain testing.
## Features
### Network Orchestration
- **Multi-Node Networks** - Deploy complex networks with multiple validators
- **Parachain Support** - Full parachain deployment and testing capabilities
- **Cross-Chain Messaging (XCM)** - Test cross-chain communication scenarios
- **Network Templates** - Pre-configured network topologies
- **Dynamic Configuration** - Flexible network configuration management
### Provider Support
- **Native Provider** - Local binary execution with process management
- **Kubernetes Provider** - Container-based deployment with k8s orchestration
- **Podman Provider** - Alternative container runtime support
- **Docker Provider** - Standard Docker container deployment
### Testing Framework
- **Test Scripts** - Domain-specific language (DSL) for test scenarios
- **Assertion Engine** - Comprehensive assertion and validation system
- **Network Health Checks** - Automated network status validation
- **Performance Testing** - Load testing and performance analysis
- **Regression Testing** - Automated regression test suites
- **Consensus Testing** - Support for Aura, GRANDPA, ELVES, and hybrid consensus testing
### Management Features
- **Network Lifecycle** - Complete network spawn, test, and teardown
- **Resource Management** - Automatic resource cleanup and management
- **Log Aggregation** - Centralized logging from all network components
- **Monitoring Integration** - Prometheus metrics and Grafana dashboards
## Configuration
### Basic Development Network
```kcl
zombienet: PolkadotZombienet = {
name: "dev-zombienet"
version: "1.3.40"
run_user: {
name: "zombienet"
home: "/home/zombienet"
}
provider: "native"
work_path: "/var/lib/zombienet"
config_path: "/etc/zombienet"
network_config: "simple-network.toml"
binaries: {
polkadot: {
version: "1.5.0"
path: "/usr/local/bin/polkadot"
}
}
timeout: 1800
log_level: "info"
}
```
### Production Testing Environment
```kcl
zombienet: PolkadotZombienet = {
name: "zombienet-testing"
version: "1.3.40"
run_user: {
name: "zombienet"
group: "zombienet"
home: "/opt/zombienet"
}
provider: "kubernetes"
work_path: "/var/lib/zombienet"
config_path: "/etc/zombienet"
network_config: "multi-parachain-network.toml"
binaries: {
polkadot: {
version: "1.5.0"
image: "parity/polkadot:v1.5.0"
}
parachain: {
version: "1.5.0"
image: "parity/cumulus:v1.5.0"
}
}
kubernetes: {
namespace: "zombienet-testing"
node_selector: {
"node-type": "testing"
}
resources: {
limits: {
cpu: "2"
memory: "4Gi"
}
requests: {
cpu: "1"
memory: "2Gi"
}
}
}
monitoring: {
prometheus_enabled: true
grafana_enabled: true
metrics_port: 9090
}
timeout: 3600
log_level: "debug"
cleanup_on_exit: true
}
```
### Multi-Parachain XCM Testing
```kcl
zombienet: PolkadotZombienet = {
name: "xcm-testing-network"
# ... base configuration
network_config: "multi-parachain-network.toml"
network_template: {
relay_chain: {
validators: 4
chain: "rococo-local"
}
parachains: [
{
id: 100
name: "asset-hub"
validators: 2
chain: "asset-hub-rococo-local"
},
{
id: 200
name: "bridge-hub"
validators: 2
chain: "bridge-hub-rococo-local"
},
{
id: 1000
name: "custom-parachain"
validators: 2
chain: "custom-parachain-local"
genesis_wasm: "/opt/zombienet/parachains/custom-parachain.wasm"
genesis_state: "/opt/zombienet/parachains/custom-parachain-genesis"
}
]
}
test_scenarios: [
"test-basic.zndsl",
"test-parachain.zndsl",
"test-xcm.zndsl"
]
xcm_testing: {
enabled: true
channels: [
{ from: 100, to: 200 },
{ from: 100, to: 1000 },
{ from: 200, to: 1000 }
]
}
}
```
### Kubernetes Production Setup
```kcl
zombienet: PolkadotZombienet = {
name: "zombienet-k8s-prod"
# ... base configuration
provider: "kubernetes"
kubernetes: {
namespace: "polkadot-testing"
storage_class: "fast-ssd"
node_selector: {
"testing-tier": "production"
"node-type": "compute-optimized"
}
tolerations: [
{
key: "testing-workload"
operator: "Equal"
value: "true"
effect: "NoSchedule"
}
]
resources: {
limits: {
cpu: "4"
memory: "8Gi"
storage: "100Gi"
}
requests: {
cpu: "2"
memory: "4Gi"
storage: "50Gi"
}
}
security_context: {
run_as_user: 1000
run_as_group: 1000
fs_group: 1000
}
}
monitoring: {
prometheus_enabled: true
grafana_enabled: true
metrics_port: 9090
service_monitor: true
}
persistence: {
enabled: true
storage_class: "fast-ssd"
size: "100Gi"
}
}
```
### ELVES Consensus Testing Network
```kcl
zombienet: PolkadotZombienet = {
name: "elves-consensus-testing"
# ... base configuration
network_config: "elves-consensus-network.toml"
network_template: {
relay_chain: {
validators: 4
chain: "rococo-local"
consensus: {
type: "elves"
elves_config: {
epoch_duration: 1200 # shorter for testing
validators_per_epoch: 4
proposal_timeout: 2000
prevote_timeout: 2000
precommit_timeout: 2000
commit_timeout: 500
}
}
}
parachains: [
{
id: 100
name: "elves-parachain"
validators: 2
chain: "elves-parachain-local"
consensus: {
type: "elves"
ethereum_compatibility: true
}
}
]
}
test_scenarios: [
"test-elves-consensus.zndsl",
"test-elves-epoch-transitions.zndsl",
"test-elves-ethereum-compatibility.zndsl"
]
elves_testing: {
enabled: true
epoch_monitoring: true
consensus_transition_tests: true
ethereum_compatibility_tests: true
}
}
```
### Hybrid Consensus Testing Network
```kcl
zombienet: PolkadotZombienet = {
name: "hybrid-consensus-testing"
# ... base configuration
network_template: {
relay_chain: {
validators: 6
chain: "rococo-local"
consensus: {
type: "hybrid"
primary_consensus: "aura"
secondary_consensus: "elves"
transition_rules: {
aura_to_elves: {
trigger: "network_partition"
min_validators: 2
}
elves_to_aura: {
trigger: "network_recovery"
consensus_timeout: 10000
}
}
}
}
}
test_scenarios: [
"test-hybrid-consensus.zndsl",
"test-consensus-transitions.zndsl",
"test-network-partitions.zndsl",
"test-recovery-scenarios.zndsl"
]
hybrid_testing: {
enabled: true
partition_simulation: true
recovery_testing: true
transition_monitoring: true
}
}
```
## Usage
### Deploy Zombienet
```bash
./core/nulib/provisioning taskserv create polkadot-zombienet --infra <infrastructure-name>
```
### List Available Task Services
```bash
./core/nulib/provisioning taskserv list
```
### SSH to Zombienet Server
```bash
./core/nulib/provisioning server ssh <zombienet-server>
```
### Service Management
```bash
# Check Zombienet status
systemctl status zombienet
# Start/stop Zombienet
systemctl start zombienet
systemctl stop zombienet
# View Zombienet logs
journalctl -u zombienet -f
# Check service management
sudo -u zombienet /opt/zombienet/scripts/zombienet-service.sh status
```
### Network Operations
```bash
# Spawn a network
sudo -u zombienet zombienet spawn network-config.toml
# Run tests against network
sudo -u zombienet zombienet test test-basic.zndsl
# Check network status
sudo -u zombienet zombienet info
# Tear down network
sudo -u zombienet zombienet down
```
### Testing Operations
```bash
# Run basic network tests
cd /var/lib/zombienet
sudo -u zombienet zombienet test simple-network.toml test-basic.zndsl
# Run parachain tests
sudo -u zombienet zombienet test parachain-network.toml test-parachain.zndsl
# Run XCM tests
sudo -u zombienet zombienet test multi-parachain-network.toml test-xcm.zndsl
# Custom test execution
sudo -u zombienet zombienet test custom-network.toml custom-test.zndsl
# ELVES Consensus Testing
# Run ELVES consensus tests
sudo -u zombienet zombienet test elves-consensus-network.toml test-elves-consensus.zndsl
# Test ELVES epoch transitions
sudo -u zombienet zombienet test elves-consensus-network.toml test-elves-epoch-transitions.zndsl
# Test ELVES Ethereum compatibility
sudo -u zombienet zombienet test elves-consensus-network.toml test-elves-ethereum-compatibility.zndsl
# Hybrid Consensus Testing
# Test consensus transitions
sudo -u zombienet zombienet test hybrid-consensus-network.toml test-consensus-transitions.zndsl
# Simulate network partitions
sudo -u zombienet zombienet test hybrid-consensus-network.toml test-network-partitions.zndsl
```
### Kubernetes Operations
```bash
# Check pod status
kubectl -n zombienet-testing get pods
# View pod logs
kubectl -n zombienet-testing logs -f zombienet-validator-0
# Execute commands in pods
kubectl -n zombienet-testing exec -it zombienet-validator-0 -- /bin/bash
# Port forward for debugging
kubectl -n zombienet-testing port-forward zombienet-validator-0 9944:9944
```
### Monitoring and Debugging
```bash
# Check network health
curl http://localhost:9933/health
# Monitor metrics
curl http://localhost:9090/metrics
# View aggregated logs
tail -f /var/lib/zombienet/logs/network.log
# Debug network connectivity
sudo -u zombienet zombienet debug connectivity
```
## Architecture
### System Architecture
```
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Test Runner │────│ Zombienet Core │────│ Network │
│ │ │ │ │ Components │
│ • Test Scripts │ │ • Orchestration │ │ │
│ • Assertions │────│ • Provider Mgmt │────│ • Validators │
│ • Scenarios │ │ • Network Spawn │ │ • Parachains │
│ • Reports │ │ • Health Checks │ │ • Collators │
└─────────────────┘ └──────────────────┘ └─────────────────┘
```
### Network Topology Example
```
┌─────────────────────────────────────────────────────────────┐
│ Relay Chain │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Validator 1 │ │ Validator 2 │ │ Validator 3 │ ... │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
┌────────────────────┼────────────────────┐
│ │ │
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│Parachain A│ │Parachain B│ │Parachain C│
│(ID: 100) │ │(ID: 200) │ │(ID: 1000) │
│ │◄─XCM──►│ │◄─XCM──►│ │
│Collator 1 │ │Collator 2 │ │Collator 3 │
│Collator 2 │ │Collator 3 │ │Collator 4 │
└───────────┘ └───────────┘ └───────────┘
```
### Provider Architecture
- **Native Provider** - Direct binary execution on host system
- **Kubernetes Provider** - Pod-based deployment with k8s resources
- **Docker Provider** - Container-based deployment with Docker
- **Podman Provider** - Alternative container runtime
### File Structure
```
/var/lib/zombienet/ # Main working directory
├── networks/ # Network configurations
├── binaries/ # Downloaded binaries
├── logs/ # Network and test logs
├── temp/ # Temporary files
└── data/ # Network data and state
/etc/zombienet/ # Configuration directory
├── networks/ # Network templates
│ ├── simple-network.toml
│ ├── parachain-network.toml
│ └── multi-parachain-network.toml
├── tests/ # Test scenarios
│ ├── test-basic.zndsl
│ ├── test-parachain.zndsl
│ └── test-xcm.zndsl
└── zombienet.conf # Main configuration
/opt/zombienet/ # Installation directory
├── bin/ # Zombienet binary
├── scripts/ # Management scripts
└── templates/ # Configuration templates
```
## Supported Operating Systems
- Ubuntu 20.04+ / Debian 11+
- CentOS 8+ / RHEL 8+ / Fedora 35+
## System Requirements
### Native Provider Requirements
- **RAM**: 8GB (16GB recommended for multi-parachain)
- **Storage**: 100GB SSD (200GB+ for extensive testing)
- **CPU**: 4 cores (8 cores recommended)
- **Network**: Good bandwidth for binary downloads
### Kubernetes Provider Requirements
- **Kubernetes Cluster** - v1.20+ with sufficient resources
- **Storage Classes** - Fast SSD storage classes
- **Network Policies** - Proper network connectivity between pods
- **Resource Limits** - Configured resource quotas
### Development Environment
- **RAM**: 4GB (8GB recommended)
- **Storage**: 50GB SSD
- **CPU**: 2 cores (4 cores recommended)
- **Network**: Standard internet connection
### CI/CD Environment
- **RAM**: 16GB+ (for parallel test execution)
- **Storage**: 200GB+ SSD
- **CPU**: 8+ cores for faster test execution
- **Network**: High bandwidth for artifact downloads
## Troubleshooting
### Network Spawn Issues
```bash
# Check Zombienet logs
journalctl -u zombienet -n 100
# Verify binary availability
ls -la /var/lib/zombienet/binaries/
# Test binary execution
sudo -u zombienet /var/lib/zombienet/binaries/polkadot --version
# Check network configuration
sudo -u zombienet zombienet validate network-config.toml
# Debug network spawn
sudo -u zombienet zombienet --log-level debug spawn network-config.toml
```
### Kubernetes Issues
```bash
# Check pod status
kubectl -n zombienet-testing get pods -o wide
# Describe problematic pods
kubectl -n zombienet-testing describe pod zombienet-validator-0
# Check events
kubectl -n zombienet-testing get events --sort-by='.lastTimestamp'
# View pod logs
kubectl -n zombienet-testing logs zombienet-validator-0 --previous
# Check storage
kubectl -n zombienet-testing get pvc
```
### Test Execution Issues
```bash
# Validate test syntax
sudo -u zombienet zombienet validate-test test-basic.zndsl
# Run test with debug logging
sudo -u zombienet zombienet --log-level debug test network.toml test.zndsl
# Check test reports
ls -la /var/lib/zombienet/reports/
# View detailed test output
cat /var/lib/zombienet/logs/test-execution.log
```
### Resource Issues
```bash
# Check system resources
htop
df -h /var/lib/zombienet
# Monitor memory usage
free -h
cat /proc/meminfo
# Check disk I/O
iostat -x 1
# Monitor network usage
iftop -i eth0
```
### Binary Issues
```bash
# Check binary permissions
ls -la /var/lib/zombienet/binaries/
# Test binary compatibility
file /var/lib/zombienet/binaries/polkadot
ldd /var/lib/zombienet/binaries/polkadot
# Download latest binaries
sudo -u zombienet zombienet setup
# Verify checksums
sudo -u zombienet zombienet verify-binaries
```
## Security Considerations
### Network Security
- **Isolated Networks** - Use isolated network namespaces
- **Port Management** - Careful management of exposed ports
- **Access Control** - Limit access to testing environments
- **Data Cleanup** - Ensure proper cleanup of test data
### Container Security
- **Image Security** - Use trusted container images
- **Resource Limits** - Set appropriate resource limits
- **Security Contexts** - Configure proper security contexts
- **Network Policies** - Implement network segmentation
### CI/CD Security
- **Secrets Management** - Secure handling of test credentials
- **Build Isolation** - Isolate test environments
- **Artifact Security** - Secure storage of test artifacts
- **Access Logs** - Comprehensive logging of access
## Performance Optimization
### System Performance
- **SSD Storage** - Use high-performance SSD storage
- **Memory Allocation** - Sufficient RAM for all network components
- **CPU Resources** - Adequate CPU for parallel operations
- **Network Optimization** - Optimize network settings for containers
### Test Performance
- **Parallel Execution** - Run tests in parallel where possible
- **Resource Tuning** - Optimize resource allocation per component
- **Caching** - Cache binaries and frequently used data
- **Cleanup Optimization** - Efficient cleanup between tests
### Kubernetes Optimization
- **Node Selection** - Use appropriate node types for testing
- **Resource Requests** - Set accurate resource requests
- **Storage Classes** - Use high-performance storage classes
- **Network CNI** - Optimize network plugin configuration
## Integration Examples
### CI/CD Pipeline Integration
```yaml
# GitHub Actions example
name: Zombienet Tests
on: [push, pull_request]
jobs:
zombienet-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup Zombienet
run: |
curl -L -o zombienet https://github.com/paritytech/zombienet/releases/latest/download/zombienet-linux
chmod +x zombienet
- name: Run Network Tests
run: |
./zombienet test network-config.toml test-suite.zndsl
- name: Upload Test Reports
uses: actions/upload-artifact@v2
with:
name: test-reports
path: reports/
```
### Kubernetes Deployment
```yaml
apiVersion: batch/v1
kind: Job
metadata:
name: zombienet-test
namespace: testing
spec:
template:
spec:
containers:
- name: zombienet
image: paritytech/zombienet:latest
command: ["zombienet"]
args: ["test", "network-config.toml", "test-suite.zndsl"]
resources:
requests:
memory: "4Gi"
cpu: "2"
limits:
memory: "8Gi"
cpu: "4"
volumeMounts:
- name: config
mountPath: /config
- name: storage
mountPath: /data
volumes:
- name: config
configMap:
name: zombienet-config
- name: storage
emptyDir:
sizeLimit: 50Gi
restartPolicy: Never
```
### Monitoring Integration
```yaml
# Prometheus scrape configuration
- job_name: 'zombienet'
kubernetes_sd_configs:
- role: pod
namespaces:
names:
- zombienet-testing
relabel_configs:
- source_labels: [__meta_kubernetes_pod_label_app]
action: keep
regex: zombienet
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: (.+)
replacement: ${1}:9090
```
## Resources
- **Official Documentation**: [paritytech.github.io/zombienet](https://paritytech.github.io/zombienet/)
- **GitHub Repository**: [paritytech/zombienet](https://github.com/paritytech/zombienet)
- **Polkadot Wiki**: [wiki.polkadot.network/docs/learn-launch](https://wiki.polkadot.network/docs/learn-launch)
- **Substrate Documentation**: [docs.substrate.io](https://docs.substrate.io)
- **Community**: [substrate.stackexchange.com](https://substrate.stackexchange.com)