Spaces:
Sleeping
title: Virtual Machine Placement (Python)
emoji: π
colorFrom: gray
colorTo: green
sdk: docker
app_port: 8080
pinned: false
license: apache-2.0
short_description: SolverForge Quickstart for the Vehicle Routing problem
VM Placement Quickstart
A SolverForge quickstart demonstrating constraint-based virtual machine placement optimization.
The Problem
You manage a datacenter with physical servers organized in racks, and must place virtual machines (VMs) onto those servers. Each server has limited CPU cores, memory, and storage capacity.
The challenge: Place all VMs while:
- Never exceeding any server's CPU, memory, or storage capacity
- Keeping database replicas on separate servers (anti-affinity)
- Placing related services together when possible (affinity)
- Minimizing the number of active servers (consolidation)
- Balancing load across active servers
Why Constraint Solving?
With constraints, you describe what a valid placement looks like, not how to compute one. Adding a new business rule (e.g., "GPU workloads need GPU servers") is a single constraint functionβnot a rewrite of your algorithm.
Quick Start
# 1. Create and activate virtual environment
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# 2. Install dependencies
pip install -e .
# 3. Run the application
run-app
# 4. Open http://localhost:8080 in your browser
Requirement: JDK 17+ must be installed (solverforge-legacy uses JPype to bridge Python and Java).
Running Tests
# Run all tests
pytest
# Run with verbose output
pytest -v
# Run specific test file
pytest tests/test_constraints.py
Project Structure
vm-placement-fast/
βββ src/vm_placement/
β βββ domain.py # Server, VM, and VMPlacementPlan
β βββ constraints.py # Hard and soft placement constraints
β βββ solver.py # SolverForge configuration
β βββ demo_data.py # Sample infrastructure and VMs
β βββ rest_api.py # FastAPI endpoints
β βββ converters.py # Domain β REST model conversion
βββ tests/
β βββ test_constraints.py # Unit tests for each constraint
βββ static/
β βββ index.html # Web UI with rack visualization
β βββ app.js # Frontend logic
β βββ config.js # Advanced settings sliders
βββ pyproject.toml # Dependencies
Constraints
Hard Constraints (must be satisfied)
- CPU Capacity: Server CPU cannot be exceeded by assigned VMs
- Memory Capacity: Server memory cannot be exceeded by assigned VMs
- Storage Capacity: Server storage cannot be exceeded by assigned VMs
- Anti-Affinity: VMs in the same anti-affinity group (e.g., database replicas) must be on different servers
Soft Constraints (optimize for)
- Affinity: VMs in the same affinity group (e.g., web tier) should be on the same server
- Minimize Servers Used: Consolidate VMs onto fewer servers to reduce costs
- Balance Utilization: Distribute load evenly across active servers
- Prioritize Placement: Higher-priority VMs should be placed first
API Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /demo-data |
List available datasets |
| GET | /demo-data/{id} |
Load demo data |
| POST | /demo-data/generate |
Generate custom infrastructure |
| POST | /placements |
Submit for optimization |
| GET | /placements/{id} |
Get current solution |
| GET | /placements/{id}/status |
Get solving status |
| DELETE | /placements/{id} |
Stop solving |
| PUT | /placements/analyze |
Analyze placement score |
API documentation available at http://localhost:8080/q/swagger-ui
Advanced Settings
The web UI includes configurable sliders for:
- Racks: Number of server racks (1-8)
- Servers per Rack: Servers in each rack (2-10)
- VMs: Number of VMs to place (5-200)
- Solver Time: How long to optimize (5s-2min)
Click "Generate New Data" to create custom scenarios.
VM Placement Concepts
| Term | Definition |
|---|---|
| Server | Physical machine with CPU, memory, and storage capacity |
| VM | Virtual machine requiring resources from a server |
| Rack | Physical grouping of servers in a datacenter |
| Affinity | VMs that should run on the same server |
| Anti-Affinity | VMs that must run on different servers |
| Consolidation | Using fewer servers to reduce power/cooling costs |