This section provides guidance for developers who want to contribute to machine-controller or extend it with new providers.
git clone https://github.com/kubermatic/machine-controller.git
cd machine-controller
Build the binary:
make build
Build the Docker image:
make docker-build
You can run machine-controller locally against a remote cluster:
# Set your kubeconfig
export KUBECONFIG=/path/to/kubeconfig
# Set cloud provider credentials (example for Hetzner)
export HCLOUD_TOKEN=your-token
# Run the controller
./machine-controller \
-kubeconfig=$KUBECONFIG \
-logtostderr \
-v=4 \
-worker-count=5
Run unit tests:
make test
Run end-to-end tests:
# Requires cloud provider credentials
make e2e-test
machine-controller/
├── cmd/ # Main applications
│ ├── machine-controller/ # Controller binary
│ └── webhook/ # Admission webhook
├── pkg/
│ ├── admission/ # Admission handlers
│ ├── cloudprovider/ # Cloud provider implementations
│ │ ├── provider/ # Individual provider packages
│ │ │ ├── aws/
│ │ │ ├── azure/
│ │ │ ├── hetzner/
│ │ │ └── ...
│ │ └── types/ # Common provider types
│ ├── controller/ # Controller logic
│ │ ├── machine/ # Machine controller
│ │ ├── machineset/ # MachineSet controller
│ │ └── machinedeployment/ # MachineDeployment controller
│ ├── health/ # Health check utilities
│ ├── migrations/ # Migration handlers
│ ├── node/ # Node utilities
│ └── rhsm/ # RHEL subscription manager
├── sdk/ # SDK module (separate Go module)
│ ├── apis/ # API definitions (CRDs)
│ ├── bootstrap/ # Bootstrap utilities
│ ├── cloudprovider/ # Cloud provider interfaces
│ ├── providerconfig/ # Provider configuration utilities
│ └── userdata/ # User data generation
├── examples/ # Example manifests
├── test/ # Test suites
│ ├── e2e/ # End-to-end tests
│ └── tools/ # Test utilities
└── Makefile # Build automation
See the detailed guide: Adding a new Cloud Provider
Quick overview:
pkg/cloudprovider/provider/<provider-name>/Provider interfacepkg/cloudprovider/provider.goexamples/test/e2e/provisioning/Follow the Go Code Review Comments and:
gofmt for formattinggolangci-lint for lintingmake lint
After modifying CRD definitions, regenerate code:
make generate
Example:
func TestProviderValidate(t *testing.T) {
tests := []struct {
name string
spec v1alpha1.MachineSpec
wantErr bool
}{
{
name: "valid spec",
spec: validMachineSpec(),
wantErr: false,
},
{
name: "missing required field",
spec: invalidMachineSpec(),
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := provider.Validate(tt.spec)
if (err != nil) != tt.wantErr {
t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
./machine-controller -v=6 -logtostderr
Create a run configuration in your IDE:
VS Code (launch.json):
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch machine-controller",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/cmd/machine-controller",
"args": [
"-kubeconfig=/path/to/kubeconfig",
"-logtostderr",
"-v=6"
],
"env": {
"HCLOUD_TOKEN": "your-token"
}
}
]
}
GoLand/IntelliJ: Create a “Go Build” run configuration with similar settings
dlv debug ./cmd/machine-controller -- \
-kubeconfig=$KUBECONFIG \
-logtostderr \
-v=6
git checkout -b feature/my-featuremake test lintgit push origin feature/my-featureFollow Conventional Commits:
<type>(<scope>): <subject>
<body>
<footer>
Examples:
feat(aws): add support for ARM instances
Add support for AWS Graviton instances in the AWS provider.
Closes #123
fix(azure): handle nil pointer in VM creation
Check for nil before dereferencing availability set pointer.
Fixes #456
All submissions require review. We use GitHub pull requests for this purpose. Reviewers will check:
Releases follow semantic versioning (SEMVER):
Release checklist:
# Build binary
make build
# Build Docker image
make docker-build
# Run tests
make test
# Run linters
make lint
# Generate code (after CRD changes)
make generate
# Clean build artifacts
make clean
# Run specific provider E2E test
make e2e-test PROVIDER=aws
# Format code
make fmt
# Update dependencies
go mod tidy
go mod vendor
# Update a specific dependency
go get github.com/some/dependency@version
# Update all dependencies
go get -u ./...
# Tidy and vendor
go mod tidy
go mod vendor
Some documentation is auto-generated from code:
# Generate API documentation
make api-docs
# Generate provider configuration documentation
make provider-docs