mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-09-22 11:13:26 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
Executable
+64
@@ -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
|
||||
Executable
+159
@@ -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
|
||||
Reference in New Issue
Block a user