A Streamlit-based management tool for monitoring and modifying SmartQuotas across multiple Dell PowerScale (OneFS) clusters.
- Multi-cluster support: Manage 3-4+ clusters from a single interface
- Quota monitoring: Real-time usage percentages with visual status indicators
- Quick search: Find shares by name or access zone
- Top offenders: Highlight shares exceeding usage thresholds (>90%, >80%, >70%)
- Audit logging: All modifications logged to CSV for compliance
- Simple workflow: Login → Find share → Adjust quota → Done
- Python 3.8+ (required for
asyncioand modern typing) - Dell PowerScale (OneFS) cluster with PAPI enabled on port 8080
- Active Directory or local cluster accounts for authentication
- Network access to your PowerScale clusters
Run the automated setup script (works on macOS and Linux):
chmod +x setup.sh
./setup.shThis script will:
- Check Python version (requires 3.8+)
- Create a virtual environment
- Install all dependencies
# Clone the repository
git clone https://github.com/franksops/papi-q.git
cd papi-q
# Create and activate virtual environment
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# Install dependencies
pip install --upgrade pip
pip install -r requirements.txt| Package | Version | Purpose |
|---|---|---|
| isilon-sdk | 0.7.0 | Dell PowerScale OneFS API client |
| streamlit | >=1.32.0 | Web interface framework |
| pandas | >=2.0.0 | Data manipulation and display |
| urllib3 | >=2.0.0 | HTTP client for API communication |
| python-dotenv | >=1.0.0 | Environment variable management |
The application creates a ~/.papi-q/ directory on first run with configuration files.
Cluster definitions (API endpoints). This file is required before you can connect.
Default location: ~/.papi-q/clusters.json
Format:
{
"cluster_name": "https://cluster-fqdn.local:8080",
"cluster_prod": "https://isilon-prod.example.com:8080",
"cluster_dr": "https://isilon-dr.example.com:8080"
}How to add clusters:
- Via UI: Click "Cluster Management" in the sidebar → Add each cluster
- Direct edit: Edit
~/.papi-q/clusters.json(restart app after changes) - Bulk setup: Pre-populate before first run for team deployment
Global application settings with defaults shown:
Default location: ~/.papi-q/config.json
{
"verify_ssl": false,
"log_file": "/home/username/isilon_admin_audit.csv",
"max_retries": 3,
"cache_ttl_seconds": 60
}Configuration Options:
| Option | Default | Description |
|---|---|---|
verify_ssl |
false |
Set true to enforce SSL certificate validation |
log_file |
~/isilon_admin_audit.csv |
Full path to audit log CSV file |
max_retries |
3 |
Number of retry attempts for failed API calls |
cache_ttl_seconds |
60 |
Cache expiration time for quota data |
Default location: ~/isilon_admin_audit.csv
All quota modifications are logged with:
- Timestamp
- Admin user
- Cluster name
- Action performed
- Share Name
- Path
- Old limit (GB)
- New limit (GB)
Sample audit entry:
timestamp,admin,cluster,action,share_name,path,old_limit_gb,new_limit_gb
2024-04-08 14:30:22,jsmith,cluster_prod,QUOTA_MODIFY,data_backup,/ifs/data/backup,500,750# Default (binds to 127.0.0.1 for security)
streamlit run src/main.py
# On dev machine (binds to specific IP for lan access)
streamlit run src/main.py --server.address 192.168.1.10
# With custom port
streamlit run src/main.py --server.port 8502Then open the URL shown in your browser (default: http://127.0.0.1:8501)
Streamlit settings are in .streamlit/config.toml:
| Setting | Default | Description |
|---|---|---|
server.address |
127.0.0.1 |
Bind address for the app |
server.headless |
true |
Run without browser auto-open |
server.enableCORS |
false |
Disable CORS for local use |
browser.gatherUsageStats |
false |
Opt out of analytics |
- Connect: Select cluster from dropdown, enter credentials
- Monitor: View top offenders list on first load
- Search: Filter by share name (partial match) or access zone
- Modify: Select quota, enter new limits, confirm
- Verify: Check audit log for recorded changes
###典型使用场景
Alert: "Share data_backup at 96% usage"
- Login to
cluster_prod - Search for
data_backup - Click quota in table
- Modify from 500 GB → 750 GB
- Confirm
- Check audit log for verification
- Primary Orange: Pantone 158 (#F58513)
- Primary Green: Pantone 3435 (#006837)
- Background: White
| Status | Color | Usage Threshold |
|---|---|---|
| Critical | 🔴 Red (#D72638) | >90% |
| Warning | 🟡 Orange (#F58513) | 80-90% |
| Healthy | 🟢 Green (#006837) | <80% |
- Python 3.8+
- OneFS SDK 0.7.0
- Streamlit 1.32+
- Access to Dell PowerScale cluster(s)
papi-q/
├── src/
│ ├── __init__.py
│ ├── api.py # OneFS PAPI client wrapper
│ ├── audit.py # Audit logging functionality
│ ├── config.py # Configuration management
│ ├── main.py # Streamlit entry point
│ ├── ui/ # UI components
│ │ ├── components.py
│ │ └── session.py
│ └── utils.py # Utility functions
├── tests/ # Unit tests
├── docs/ # Documentation
│ ├── API.md
│ ├── QUICKSTART.md
│ └── REVIEW.md
├── assets/ # Images and resources
├── setup.sh # Automated setup script
├── requirements.txt # Python dependencies
└── README.md
source venv/bin/activate
pytest tests/ -vpip install mkdocs
mkdocs serveContributions are welcome! Please read our contributing guidelines before submitting pull requests.
This project is licensed under the MIT License - see the LICENSE file for details.
For issues and feature requests, please file an issue on GitHub.