Skip to main content

Development Setup

Set up a development environment for the homelab-autoscaler project.

Requirements​

  • Go 1.24.0+
  • Docker 17.03+
  • kubectl 1.11.3+
  • kind or minikube (local cluster)
  • make

Optional Tools​

  • golangci-lint (code linting)
  • grpcurl (gRPC testing)
  • k9s (Kubernetes TUI)

Quick Start​

# Clone and setup
git clone https://github.com/homecluster-dev/homelab-autoscaler.git
cd homelab-autoscaler

go mod download

# Install tools
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest

# Run development setup
make help # Show all targets
make install # Install CRDs
make run # Start controller

Local Cluster Setup​

Using kind​

kind create cluster --name homelab-autoscaler
kubectl cluster-info --context kind-homelab-autoscaler

Using minikube​

minikube start --driver=docker
minikube addons enable metrics-server

Common Development Tasks​

Build and Test​

make build # Build binary
make test # Run unit tests
make docker-build # Build Docker image

Deployment​

make install # Install CRDs to cluster
make deploy # Deploy controller
make undeploy # Remove controller

Running Locally​

# Run controller with development settings
make run

# Or with custom flags
go run cmd/main.go \\
--metrics-bind-address=:8080 \\
--leader-elect=false \\
--enable-grpc-server=true \\
--grpc-server-address=:50051

Testing gRPC Interface​

kubectl port-forward service/homelab-autoscaler-grpc 50051:50051 &
grpcurl -plaintext localhost:50051 list
grpcurl -plaintext localhost:50051 externalgrpc.CloudProvider/NodeGroups

Project Structure​

homelab-autoscaler/
├── api/ # CRD definitions
├── cmd/ # Main application
├── config/ # Kubernetes manifests
├── internal/ # Internal packages
│ ├── controller/ # Controllers
│ ├── grpcserver/ # gRPC server
│ └── webhook/ # Admission webhooks
├── proto/ # Protocol buffers
└── test/ # Test utilities

Key Files​

FilePurpose
cmd/main.goApplication entry point
api/infra/v1alpha1/group_types.goGroup CRD definition
api/infra/v1alpha1/node_types.goNode CRD definition
internal/grpcserver/server.gogRPC server implementation
MakefileBuild automation

Development Tips​

Debugging​

# Enable verbose logging
go run cmd/main.go --zap-log-level=debug

# Check controller logs
kubectl logs -n homelab-autoscaler-system deployment/homelab-autoscaler-controller-manager

Testing gRPC​

grpcurl -plaintext localhost:50051 list
grpcurl -plaintext -d '{}' localhost:50051 externalgrpc.CloudProvider/NodeGroups

Working with CRDs​

# Apply CRD changes
make install

# Create test resources
kubectl apply -k config/samples/

# Watch resources
kubectl get groups,nodes.infra.homecluster.dev -w

Known Issues​

Critical Bugs​

  1. gRPC Logic Bugs (HIGH)

    • File: internal/grpcserver/server.go:306-311
    • File: internal/grpcserver/server.go:461-473
  2. Controller Race Conditions (HIGH)

    • Use FSM architecture for state management with coordination locks

Testing Limitations​

  • Some tests hardcode namespace homelab-autoscaler-system

Contributing​

  1. Fix existing bugs before adding features
  2. Write tests for new functionality
  3. Update documentation with changes
  4. Follow Go conventions and gofmt formatting

Next Steps​

  1. Start with debugging critical gRPC bugs
  2. Test controller locally with make run
  3. Create sample resources to test functionality