The basic idea is to write a k8s controller that runs against git and not k8s apiserver. So the controller is reading and writing objects to git and responding to changes in git. This is accomplished by creating a custom implemenation of the clients and caches in controller-runtime.
This is totally hacked up and just proving an idea. There's most likely a lot of issues with this code. For one the RESTMapping logic is completely wrong as offline you have knowledge if a resource is namespaced or not.
You should just be able to write a controller as normal but in the setup just set the NewClient, NewCache, and MapperProvider to the git based ones.
git, err := gitbacked.New(ctx, url, gitbacked.Options{
Branch: branch,
SubDirectory: subdir,
Interval: interval,
})
defer git.Close()
mgr, err := ctrl.NewManager(&rest.Config{}, ctrl.Options{
Scheme: scheme,
NewClient: git.NewClient,
NewCache: git.NewCache,
MapperProvider: git.MapperProvider,
})
The controller will pull from and push to the same branch. Right now the code will just call git push
so it is expect that that call will work with no user input (ssh keys or some agent based setup is in place).
A more complete example is in the ./example
folder.