blob: 86ac22c8c1b7b11c357f869a507f0caa4718107f [file] [log] [blame]
package main
import (
"context"
"flag"
"fmt"
"io/ioutil"
"path"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"github.com/miracl/conflate"
)
var baseFile = flag.String("base", "", "Path to the homeserver.yaml config file.")
var mergeWith = flag.String("merge-with", "", "Name of the file from config to merge.")
var namespace = flag.String("namespace", "", "Namespace name.")
var configMapName = flag.String("config-map-name", "", "Name of the ConfigMap to create.")
func createClient() *kubernetes.Clientset {
config, err := rest.InClusterConfig()
if err != nil {
panic(err.Error())
}
cs, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
return cs
}
func newConig(data []byte) *v1.ConfigMap {
return &v1.ConfigMap{
TypeMeta: metav1.TypeMeta{
Kind: "ConfigMap",
APIVersion: "v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: *configMapName,
},
Data: map[string]string{
path.Base(*baseFile): string(data),
},
}
}
func main() {
flag.Parse()
client := createClient().CoreV1().ConfigMaps(*namespace)
conf := conflate.New()
generated, err := ioutil.ReadFile(*baseFile)
if err != nil {
panic(err)
}
fmt.Printf("--- BASE:\n%s\n", string(generated))
if err := conf.AddData(generated); err != nil {
panic(err)
}
mergeWith, err := ioutil.ReadFile(*mergeWith)
if err != nil {
panic(err)
}
fmt.Printf("--- MERGE WITH:\n%s\n", string(mergeWith))
if err := conf.AddData(mergeWith); err != nil {
panic(err)
}
merged, err := conf.MarshalYAML()
if err != nil {
panic(err)
}
fmt.Printf("--- MERGED:\n%s\n", string(merged))
config := newConig(merged)
_, err = client.Create(context.TODO(), config, metav1.CreateOptions{})
if err == nil {
return
}
if !errors.IsAlreadyExists(err) {
panic(err)
}
_, err = client.Update(context.TODO(), config, metav1.UpdateOptions{})
if err != nil {
panic(err)
}
}