Skip to content

Commit a41032c

Browse files
authored
Merge pull request #53 from ntnn/file-provider
✨ Add `file` provider for kubeconfig on the filesystem
2 parents 79d0407 + 04d1112 commit a41032c

File tree

11 files changed

+1442
-0
lines changed

11 files changed

+1442
-0
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ jobs:
2727
- providers/cluster-api
2828
- examples/cluster-inventory-api
2929
- providers/cluster-inventory-api
30+
- examples/file
31+
- providers/file
3032
name: golangci-lint [${{ matrix.working-directory }}]
3133
steps:
3234
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # tag=v5.0.0

examples/file/README.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# file
2+
3+
The file provider reads kubeconfig files from the local filesystem.
4+
5+
It provides clusters named after the filepath and context name.
6+
7+
This example lists configmaps in the clusters discovered by the file
8+
provider.
9+
10+
## Example
11+
12+
With a single kind cluster (`kind-kind` defined in `~/.kube/config`:
13+
14+
```bash
15+
$ go run . -kubeconfig ~/.kube/config
16+
2025-08-13T11:28:01+02:00 INFO file-cluster-provider file cluster provider initialized {"kubeconfigFiles": ["/home/user/.kube/config"], "kubeconfigDirs": [], "kubeconfigGlobs": [""]}
17+
2025-08-13T11:28:01+02:00 INFO controller-runtime.metrics Starting metrics server
18+
2025-08-13T11:28:01+02:00 INFO Starting Controller {"controller": "multicluster-configmaps", "controllerGroup": "", "controllerKind": "ConfigMap"}
19+
2025-08-13T11:28:01+02:00 INFO Starting workers {"controller": "multicluster-configmaps", "controllerGroup": "", "controllerKind": "ConfigMap", "worker count": 1}
20+
2025-08-13T11:28:01+02:00 INFO controller-runtime.metrics Serving metrics server {"bindAddress": ":8080", "secure": false}
21+
2025-08-13T11:28:01+02:00 INFO file-cluster-provider adding cluster {"name": "/home/user/.kube/config+kind-kind"}
22+
2025-08-13T11:28:01+02:00 INFO Starting EventSource {"controller": "multicluster-configmaps", "controllerGroup": "", "controllerKind": "ConfigMap", "source": "func source: 0x172ca20"}
23+
2025-08-13T11:28:01+02:00 INFO Reconciling ConfigMap {"controller": "multicluster-configmaps", "controllerGroup": "", "controllerKind": "ConfigMap", "reconcileID": "7096cf7e-f382-4f22-8d1b-bff768f99c07", "cluster": "/home/user/.kube/config+kind-kind"}
24+
2025-08-13T11:28:01+02:00 INFO ConfigMap found {"controller": "multicluster-configmaps", "controllerGroup": "", "controllerKind": "ConfigMap", "reconcileID": "7096cf7e-f382-4f22-8d1b-bff768f99c07", "cluster": "/home/user/.kube/config+kind-kind", "namespace": "default", "name": "kube-root-ca.crt", "cluster": "/home/user/.kube/config+kind-kind"}
25+
...
26+
```
27+
28+
Then adding another kind cluster with `kind create cluster --name test`:
29+
30+
```bash
31+
2025-08-13T11:28:54+02:00 INFO file-cluster-provider received fsnotify event {"event": "\"/home/user/.kube/config.lock\": CREATE"}
32+
2025-08-13T11:28:54+02:00 INFO file-cluster-provider received fsnotify event {"event": "\"/home/user/.kube/config\": WRITE"}
33+
2025-08-13T11:28:54+02:00 INFO file-cluster-provider adding cluster {"name": "/home/user/.kube/config+kind-test"}
34+
2025-08-13T11:28:54+02:00 INFO Starting EventSource {"controller": "multicluster-configmaps", "controllerGroup": "", "controllerKind": "ConfigMap", "source": "func source: 0x172ca20"}
35+
2025-08-13T11:28:54+02:00 INFO file-cluster-provider received fsnotify event {"event": "\"/home/user/.kube/config\": WRITE"}
36+
2025-08-13T11:28:54+02:00 INFO file-cluster-provider received fsnotify event {"event": "\"/home/user/.kube/config.lock\": REMOVE"}
37+
2025-08-13T11:28:54+02:00 INFO Reconciling ConfigMap {"controller": "multicluster-configmaps", "controllerGroup": "", "controllerKind": "ConfigMap", "reconcileID": "9d3e1e4b-b587-49b1-9fcf-a903f4e713f5", "cluster": "/home/user/.kube/config+kind-test"}
38+
2025-08-13T11:28:54+02:00 INFO ConfigMap found {"controller": "multicluster-configmaps", "controllerGroup": "", "controllerKind": "ConfigMap", "reconcileID": "9d3e1e4b-b587-49b1-9fcf-a903f4e713f5", "cluster": "/home/user/.kube/config+kind-test", "namespace": "local-path-storage", "name": "local-path-config", "cluster": "/home/user/.kube/config+kind-test"}
39+
...
40+
```
41+
42+
Adding new configmaps to either cluster will trigger a reconcile:
43+
44+
```bash
45+
kubectl --context kind-test create configmap test --from-literal hello=word
46+
```
47+
48+
```bash
49+
2025-08-13T11:30:37+02:00 INFO Reconciling ConfigMap {"controller": "multicluster-configmaps", "controllerGroup": "", "controllerKind": "ConfigMap", "reconcileID": "56f49ce6-7ff8-4eb9-b3ac-ad7586265c6d", "cluster": "/home/user/.kube/config+kind-test"}
50+
2025-08-13T11:30:37+02:00 INFO ConfigMap found {"controller": "multicluster-configmaps", "controllerGroup": "", "controllerKind": "ConfigMap", "reconcileID": "56f49ce6-7ff8-4eb9-b3ac-ad7586265c6d", "cluster": "/home/user/.kube/config+kind-test", "namespace": "default", "name": "test", "cluster": "/home/user/.kube/config+kind-test"}
51+
```

examples/file/go.mod

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
module sigs.k8s.io/multicluster-runtime/examples/file
2+
3+
go 1.24.0
4+
5+
replace (
6+
sigs.k8s.io/multicluster-runtime => ../..
7+
sigs.k8s.io/multicluster-runtime/providers/file => ../../providers/file
8+
)
9+
10+
require (
11+
sigs.k8s.io/multicluster-runtime v0.0.0-00010101000000-000000000000
12+
sigs.k8s.io/multicluster-runtime/providers/file v0.0.0-00010101000000-000000000000
13+
)
14+
15+
require (
16+
golang.org/x/sync v0.16.0
17+
k8s.io/apimachinery v0.33.3
18+
sigs.k8s.io/controller-runtime v0.21.0
19+
)
20+
21+
require (
22+
github.com/beorn7/perks v1.0.1 // indirect
23+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
24+
github.com/davecgh/go-spew v1.1.1 // indirect
25+
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
26+
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
27+
github.com/fsnotify/fsnotify v1.7.0 // indirect
28+
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
29+
github.com/go-logr/logr v1.4.3 // indirect
30+
github.com/go-logr/zapr v1.3.0 // indirect
31+
github.com/go-openapi/jsonpointer v0.21.0 // indirect
32+
github.com/go-openapi/jsonreference v0.20.2 // indirect
33+
github.com/go-openapi/swag v0.23.0 // indirect
34+
github.com/gogo/protobuf v1.3.2 // indirect
35+
github.com/google/btree v1.1.3 // indirect
36+
github.com/google/gnostic-models v0.6.9 // indirect
37+
github.com/google/go-cmp v0.7.0 // indirect
38+
github.com/google/uuid v1.6.0 // indirect
39+
github.com/josharian/intern v1.0.0 // indirect
40+
github.com/json-iterator/go v1.1.12 // indirect
41+
github.com/mailru/easyjson v0.7.7 // indirect
42+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
43+
github.com/modern-go/reflect2 v1.0.2 // indirect
44+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
45+
github.com/pkg/errors v0.9.1 // indirect
46+
github.com/prometheus/client_golang v1.22.0 // indirect
47+
github.com/prometheus/client_model v0.6.1 // indirect
48+
github.com/prometheus/common v0.62.0 // indirect
49+
github.com/prometheus/procfs v0.15.1 // indirect
50+
github.com/spf13/pflag v1.0.5 // indirect
51+
github.com/x448/float16 v0.8.4 // indirect
52+
go.uber.org/multierr v1.11.0 // indirect
53+
go.uber.org/zap v1.27.0 // indirect
54+
golang.org/x/net v0.41.0 // indirect
55+
golang.org/x/oauth2 v0.27.0 // indirect
56+
golang.org/x/sys v0.33.0 // indirect
57+
golang.org/x/term v0.32.0 // indirect
58+
golang.org/x/text v0.26.0 // indirect
59+
golang.org/x/time v0.9.0 // indirect
60+
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
61+
google.golang.org/protobuf v1.36.6 // indirect
62+
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
63+
gopkg.in/fsnotify.v1 v1.4.7 // indirect
64+
gopkg.in/inf.v0 v0.9.1 // indirect
65+
gopkg.in/yaml.v3 v3.0.1 // indirect
66+
k8s.io/api v0.33.3 // indirect
67+
k8s.io/apiextensions-apiserver v0.33.0 // indirect
68+
k8s.io/client-go v0.33.3 // indirect
69+
k8s.io/klog/v2 v2.130.1 // indirect
70+
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect
71+
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
72+
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
73+
sigs.k8s.io/randfill v1.0.0 // indirect
74+
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
75+
sigs.k8s.io/yaml v1.4.0 // indirect
76+
)

0 commit comments

Comments
 (0)