some more progress with crd generation

This commit is contained in:
2024-03-24 22:49:51 +01:00
parent 6f5c58b906
commit caf3653175
6 changed files with 126 additions and 58 deletions

View File

@@ -12,6 +12,7 @@ type Config = struct {
LogLevel string `default:"Info" env:"MAIL_DNS_SERVICE_LOGLEVEL"`
LabelSelector string `default:"kops.k8s.io/instance-role=Node" env:"MAIL_DNS_SERVICE_LABELSELECTOR"`
HcloudToken string `default:"" env:"MAIL_DNS_SERVICE_HCLOUD_TOKEN"`
Namespace string `default:"mailu" env:"MAIL_DNS_SERVICE_NAMESPACE"`
}
func GenConfig() (cfg *Config, err error) {

View File

@@ -9,6 +9,7 @@ var defaultConfig = Config{
LogLevel: "Info",
LabelSelector: "kops.k8s.io/instance-role=Node",
HcloudToken: "",
Namespace: "mailu",
}
func TestConfigDefaults(t *testing.T) {

View File

@@ -2,51 +2,106 @@ package internal
import (
"bytes"
"context"
"errors"
"fmt"
"html/template"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
)
func RecreateDnsCrd() error {
k8s_config, err := rest.InClusterConfig()
if err != nil {
return errors.New(fmt.Sprintf("Could not create in cluster k8s config: %v", err))
}
_, err = kubernetes.NewForConfig(k8s_config)
if err != nil {
return errors.New(fmt.Sprintf("Could not create k8s client: %v", err))
}
return nil
}
var CRD_TEMPLATE = `
apiVersion: externaldns.k8s.io/v1alpha1
kind: DNSEndpoint
metadata:
name: {{ .Name }}
annotations:
external.dns/provider: cf
spec:
endpoints:
- dnsName: mail
recordTTL: 180
recordType: A
targets:
- {{ .IP }}
{
"apiVersion": "externaldns.k8s.io/v1alpha1",
"kind": "DNSEndpoint",
"metadata": {
"name": "{{ .Name }}",
"annotations": {
"external.dns/provider": "cf"
}
},
"spec": {
"endpoints": [
{
"dnsName": "mail",
"recordTTL": 180,
"recordType": "A",
"targets": [
{{ range .IPs -}}
"{{ . }}",
{{ end -}}
]
}
]
}
}
`
type CrdConfig struct {
Name string
IP string
IPs []string
}
func generateCrd(name string, ip string) (string, error) {
func RecreateDnsCrd(cfg *Config, name string, ips []string) error {
routeclient, err := createRestClient()
if err != nil {
return errors.New(fmt.Sprintf("Error creating REST Client: %v", err.Error()))
}
body, err := generateCrd(name, ips)
if err != nil {
return errors.New(fmt.Sprintf("Error generating CRD: %v", err.Error()))
}
decode := scheme.Codecs.UniversalDeserializer().Decode
obj, _, err := decode([]byte(body), nil, nil)
if err != nil {
return errors.New(fmt.Sprintf("Could not deserialize CRD: %v", err.Error()))
}
res := routeclient.Post().
Namespace(cfg.Namespace).
Resource("routes").
Body(&obj).
Do(context.TODO())
var status int
res.StatusCode(&status)
if status >= 200 && status <= 400 {
return errors.New(fmt.Sprintf("Failed to post CRD to kube api: %v", res.Error().Error()))
}
return nil
}
func createRestClient() (*rest.RESTClient, error) {
k8s_config, err := rest.InClusterConfig()
if err != nil {
return nil, errors.New(fmt.Sprintf("Could not create in cluster k8s config: %v", err))
}
k8s_config.APIPath = "/apis"
k8s_config.NegotiatedSerializer = scheme.Codecs.WithoutConversion()
routeclient, err := rest.RESTClientFor(k8s_config)
if err != nil {
return nil, errors.New(fmt.Sprintf("Could not create k8s client: %v", err))
}
return routeclient, nil
}
func generateCrd(name string, ips []string) (string, error) {
config := CrdConfig{
Name: name,
IP: ip,
IPs: ips,
}
tmpl, err := template.New("crd").Parse(CRD_TEMPLATE)
if err != nil {

40
internal/k8s_test.go Normal file
View File

@@ -0,0 +1,40 @@
package internal
import (
"testing"
)
func TestGenerateCRD(t *testing.T) {
expected := `
{
"apiVersion": "externaldns.k8s.io/v1alpha1",
"kind": "DNSEndpoint",
"metadata": {
"name": "test",
"annotations": {
"external.dns/provider": "cf"
}
},
"spec": {
"endpoints": [
{
"dnsName": "mail",
"recordTTL": 180,
"recordType": "A",
"targets": [
"192.168.0.1",
"192.168.0.2",
]
}
]
}
}
`
got, err := generateCrd("test", []string{"192.168.0.1", "192.168.0.2"})
if err != nil {
t.Errorf("%s", err.Error())
}
if expected != got {
t.Errorf("got %+v, want %+v", got, expected)
}
}