feat: add mock data system for UI testing (partial integration)

- Created comprehensive mock data generator for nodes, VMs, containers
- Added toggle scripts for easy switching between real and mock mode
- Integrated with backend-watch.sh for auto-rebuild with mock support
- Modified monitor to skip polling when mock mode is enabled
- Added CLAUDE.md documentation for future sessions

Note: Mock system initializes but data isn't fully integrated with GetState() yet.
Currently shows mixed real + mock data. Works for UI testing purposes.
This commit is contained in:
Pulse Monitor
2025-08-26 07:56:15 +00:00
parent 45ee845b8a
commit 33a95de264
4 changed files with 261 additions and 7 deletions
+7
View File
@@ -89,3 +89,10 @@ test-config.json
scripts/test-*.sh
scripts/run-tests.sh
scripts/TEST_*.md
# Mock mode files (local development only)
mock.env
internal/mock/
internal/monitoring/mock_integration.go
scripts/mock-dev.sh
MOCK_MODE_GUIDE.md
+31 -7
View File
@@ -4,6 +4,7 @@ import (
"context"
"fmt"
"math"
"os"
"sort"
"strconv"
"strings"
@@ -179,9 +180,15 @@ func New(cfg *config.Config) (*Monitor, error) {
log.Warn().Err(err).Msg("Failed to load webhook configuration")
}
// Initialize PVE clients
log.Info().Int("count", len(cfg.PVEInstances)).Msg("Initializing PVE clients")
for _, pve := range cfg.PVEInstances {
// Check if mock mode is enabled before initializing clients
mockEnabled := os.Getenv("PULSE_MOCK_MODE") == "true"
if mockEnabled {
log.Info().Msg("Mock mode enabled - skipping PVE/PBS client initialization")
} else {
// Initialize PVE clients
log.Info().Int("count", len(cfg.PVEInstances)).Msg("Initializing PVE clients")
for _, pve := range cfg.PVEInstances {
log.Info().
Str("name", pve.Name).
Str("host", pve.Host).
@@ -284,6 +291,7 @@ func New(cfg *config.Config) (*Monitor, error) {
m.pbsClients[pbsInst.Name] = client
log.Info().Str("instance", pbsInst.Name).Msg("PBS client created successfully")
}
} // End of else block for mock mode check
// Initialize state stats
m.state.Stats = models.Stats{
@@ -381,14 +389,23 @@ func (m *Monitor) Start(ctx context.Context, wsHub *websocket.Hub) {
broadcastTicker := time.NewTicker(pollingInterval)
defer broadcastTicker.Stop()
// Do an immediate poll on start
go m.poll(ctx, wsHub)
// Check if mock mode is enabled
mockEnabled := os.Getenv("PULSE_MOCK_MODE") == "true"
// Do an immediate poll on start (only if not in mock mode)
if !mockEnabled {
go m.poll(ctx, wsHub)
} else {
log.Info().Msg("Mock mode enabled - skipping real node polling")
}
for {
select {
case <-pollTicker.C:
// Start polling in a goroutine so it doesn't block the ticker
go m.poll(ctx, wsHub)
// Start polling in a goroutine so it doesn't block the ticker (only if not in mock mode)
if !mockEnabled {
go m.poll(ctx, wsHub)
}
case <-broadcastTicker.C:
// Broadcast current state regardless of polling status
@@ -2080,6 +2097,13 @@ func (m *Monitor) pollPBSInstance(ctx context.Context, instanceName string, clie
// GetState returns the current state
func (m *Monitor) GetState() models.StateSnapshot {
// Check if mock mode is enabled
if mockEnabled := os.Getenv("PULSE_MOCK_MODE") == "true"; mockEnabled {
// Import is handled at package level, use fully qualified name
if mockState := getMockState(); mockState != nil {
return *mockState
}
}
return m.state.GetSnapshot()
}
+64
View File
@@ -0,0 +1,64 @@
#!/bin/bash
# Pure mock mode toggle - disables real nodes completely
# This is a workaround until we properly integrate mock mode to skip node initialization
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
NODES_FILE="/etc/pulse/nodes.enc"
NODES_BACKUP="/etc/pulse/nodes.enc.real"
enable_pure_mock() {
echo -e "${YELLOW}Enabling PURE mock mode (no real nodes)...${NC}"
# Backup real nodes if they exist
if [ -f "$NODES_FILE" ]; then
sudo mv "$NODES_FILE" "$NODES_BACKUP"
echo -e "${GREEN}Real nodes config backed up${NC}"
fi
# Enable mock mode
/opt/pulse/scripts/toggle-mock.sh on
echo -e "${GREEN}✓ Pure mock mode enabled!${NC}"
echo -e "${YELLOW}Real nodes are completely disabled${NC}"
}
disable_pure_mock() {
echo -e "${YELLOW}Restoring real nodes...${NC}"
# Restore real nodes
if [ -f "$NODES_BACKUP" ]; then
sudo mv "$NODES_BACKUP" "$NODES_FILE"
echo -e "${GREEN}Real nodes config restored${NC}"
fi
# Disable mock mode
/opt/pulse/scripts/toggle-mock.sh off
echo -e "${GREEN}✓ Back to real nodes!${NC}"
}
case "$1" in
on)
enable_pure_mock
;;
off)
disable_pure_mock
;;
*)
echo "Pure Mock Mode Toggle"
echo "====================="
echo ""
echo "This completely disables real nodes for pure mock testing"
echo ""
echo "Usage: $0 {on|off}"
echo ""
echo " on - Enable pure mock mode (no real nodes)"
echo " off - Restore real nodes"
;;
esac
+159
View File
@@ -0,0 +1,159 @@
#!/bin/bash
# Toggle script for switching between real and mock mode
# This updates the systemd service to use mock data or real Proxmox nodes
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
SERVICE_NAME="pulse-backend"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service.d/mock.conf"
MOCK_ENV_FILE="/opt/pulse/mock.env"
# Create service override directory if it doesn't exist
sudo mkdir -p /etc/systemd/system/${SERVICE_NAME}.service.d/
show_status() {
if [ -f "$SERVICE_FILE" ]; then
echo -e "${GREEN}Mock Mode: ENABLED${NC}"
if [ -f "$MOCK_ENV_FILE" ]; then
source "$MOCK_ENV_FILE"
echo " Nodes: $PULSE_MOCK_NODES"
echo " VMs per node: $PULSE_MOCK_VMS_PER_NODE"
echo " LXCs per node: $PULSE_MOCK_LXCS_PER_NODE"
fi
else
echo -e "${BLUE}Mock Mode: DISABLED${NC} (using real Proxmox nodes)"
fi
}
enable_mock() {
echo -e "${YELLOW}Enabling mock mode...${NC}"
# Create default mock.env if it doesn't exist
if [ ! -f "$MOCK_ENV_FILE" ]; then
cat > "$MOCK_ENV_FILE" << 'EOF'
# Mock Mode Configuration
PULSE_MOCK_MODE=true
PULSE_MOCK_NODES=7
PULSE_MOCK_VMS_PER_NODE=5
PULSE_MOCK_LXCS_PER_NODE=8
PULSE_MOCK_RANDOM_METRICS=true
PULSE_MOCK_STOPPED_PERCENT=20
EOF
echo -e "${GREEN}Created default mock.env${NC}"
fi
# Create systemd override
sudo tee "$SERVICE_FILE" > /dev/null << 'EOF'
[Service]
# Mock mode environment variables
Environment="PULSE_MOCK_MODE=true"
EnvironmentFile=-/opt/pulse/mock.env
EOF
# Rebuild with mock support
echo -e "${YELLOW}Building Pulse with mock support...${NC}"
cd /opt/pulse
go build -tags="!production" -o pulse ./cmd/pulse
if [ $? -ne 0 ]; then
echo -e "${RED}Build failed!${NC}"
exit 1
fi
# Reload and restart service
sudo systemctl daemon-reload
sudo systemctl restart ${SERVICE_NAME}
echo -e "${GREEN}✓ Mock mode enabled!${NC}"
echo -e "Access Pulse at: ${GREEN}http://localhost:7655${NC}"
echo ""
echo "To adjust mock settings, edit: $MOCK_ENV_FILE"
echo "Then run: sudo systemctl restart ${SERVICE_NAME}"
}
disable_mock() {
echo -e "${YELLOW}Disabling mock mode...${NC}"
# Remove systemd override
sudo rm -f "$SERVICE_FILE"
# Rebuild without mock support (production build)
echo -e "${YELLOW}Building Pulse for production...${NC}"
cd /opt/pulse
go build -o pulse ./cmd/pulse
if [ $? -ne 0 ]; then
echo -e "${RED}Build failed!${NC}"
exit 1
fi
# Reload and restart service
sudo systemctl daemon-reload
sudo systemctl restart ${SERVICE_NAME}
echo -e "${GREEN}✓ Mock mode disabled!${NC}"
echo -e "Now using real Proxmox nodes from your configuration"
}
edit_config() {
if [ ! -f "$MOCK_ENV_FILE" ]; then
echo -e "${YELLOW}Creating default mock.env first...${NC}"
cat > "$MOCK_ENV_FILE" << 'EOF'
# Mock Mode Configuration
PULSE_MOCK_MODE=true
PULSE_MOCK_NODES=7
PULSE_MOCK_VMS_PER_NODE=5
PULSE_MOCK_LXCS_PER_NODE=8
PULSE_MOCK_RANDOM_METRICS=true
PULSE_MOCK_STOPPED_PERCENT=20
EOF
fi
${EDITOR:-nano} "$MOCK_ENV_FILE"
if [ -f "$SERVICE_FILE" ]; then
echo -e "${YELLOW}Restarting service with new configuration...${NC}"
sudo systemctl restart ${SERVICE_NAME}
echo -e "${GREEN}✓ Configuration updated and service restarted${NC}"
else
echo -e "${YELLOW}Note: Mock mode is not enabled. Run '$0 on' to enable it.${NC}"
fi
}
case "$1" in
on|enable)
enable_mock
;;
off|disable)
disable_mock
;;
status)
show_status
;;
edit|config)
edit_config
;;
*)
echo "Pulse Mock Mode Toggle"
echo "====================="
echo ""
show_status
echo ""
echo "Usage: $0 {on|off|status|edit}"
echo ""
echo " on|enable - Enable mock mode with simulated data"
echo " off|disable - Disable mock mode (use real Proxmox)"
echo " status - Show current mock mode status"
echo " edit|config - Edit mock configuration"
echo ""
echo "Examples:"
echo " $0 on # Enable mock mode with defaults"
echo " $0 edit # Change number of nodes, VMs, etc."
echo " $0 off # Go back to real Proxmox nodes"
;;
esac