| Giorgi Lekveishvili | 7fb28bf | 2023-06-24 19:51:16 +0400 | [diff] [blame] | 1 | package installer |
| 2 | |
| 3 | import ( |
| Giorgi Lekveishvili | cd9e42c | 2023-12-13 09:49:44 +0400 | [diff] [blame] | 4 | "bytes" |
| Giorgi Lekveishvili | 7fb28bf | 2023-06-24 19:51:16 +0400 | [diff] [blame] | 5 | "context" |
| Giorgi Lekveishvili | cd9e42c | 2023-12-13 09:49:44 +0400 | [diff] [blame] | 6 | "encoding/json" |
| 7 | "fmt" |
| Giorgi Lekveishvili | 7fb28bf | 2023-06-24 19:51:16 +0400 | [diff] [blame] | 8 | |
| 9 | corev1 "k8s.io/api/core/v1" |
| Giorgi Lekveishvili | a1e7790 | 2023-11-06 14:48:27 +0400 | [diff] [blame] | 10 | "k8s.io/apimachinery/pkg/api/errors" |
| Giorgi Lekveishvili | 7fb28bf | 2023-06-24 19:51:16 +0400 | [diff] [blame] | 11 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
| Giorgi Lekveishvili | cd9e42c | 2023-12-13 09:49:44 +0400 | [diff] [blame] | 12 | "k8s.io/apimachinery/pkg/runtime/schema" |
| 13 | "k8s.io/client-go/dynamic" |
| Giorgi Lekveishvili | 7fb28bf | 2023-06-24 19:51:16 +0400 | [diff] [blame] | 14 | "k8s.io/client-go/kubernetes" |
| 15 | "k8s.io/client-go/rest" |
| 16 | "k8s.io/client-go/tools/clientcmd" |
| Giorgi Lekveishvili | cd9e42c | 2023-12-13 09:49:44 +0400 | [diff] [blame] | 17 | |
| 18 | dnsv1 "github.com/giolekva/pcloud/core/ns-controller/api/v1" |
| Giorgi Lekveishvili | 7fb28bf | 2023-06-24 19:51:16 +0400 | [diff] [blame] | 19 | ) |
| 20 | |
| 21 | type NamespaceCreator interface { |
| 22 | Create(name string) error |
| 23 | } |
| 24 | |
| Giorgi Lekveishvili | 1caed36 | 2023-12-13 16:29:43 +0400 | [diff] [blame^] | 25 | type ZoneInfo struct { |
| 26 | Zone string |
| 27 | Records string |
| 28 | } |
| 29 | |
| Giorgi Lekveishvili | cd9e42c | 2023-12-13 09:49:44 +0400 | [diff] [blame] | 30 | type ZoneStatusFetcher interface { |
| Giorgi Lekveishvili | 1caed36 | 2023-12-13 16:29:43 +0400 | [diff] [blame^] | 31 | Fetch(namespace, name string) (error, bool, ZoneInfo) |
| Giorgi Lekveishvili | cd9e42c | 2023-12-13 09:49:44 +0400 | [diff] [blame] | 32 | } |
| 33 | |
| Giorgi Lekveishvili | 7fb28bf | 2023-06-24 19:51:16 +0400 | [diff] [blame] | 34 | type realNamespaceCreator struct { |
| 35 | clientset *kubernetes.Clientset |
| 36 | } |
| 37 | |
| Giorgi Lekveishvili | 7fb28bf | 2023-06-24 19:51:16 +0400 | [diff] [blame] | 38 | func (n *realNamespaceCreator) Create(name string) error { |
| 39 | _, err := n.clientset.CoreV1().Namespaces().Create(context.Background(), &corev1.Namespace{ |
| 40 | TypeMeta: metav1.TypeMeta{ |
| 41 | Kind: " ", |
| 42 | APIVersion: "", |
| 43 | }, |
| 44 | ObjectMeta: metav1.ObjectMeta{ |
| 45 | Name: name, |
| 46 | }, |
| 47 | }, metav1.CreateOptions{}) |
| Giorgi Lekveishvili | a1e7790 | 2023-11-06 14:48:27 +0400 | [diff] [blame] | 48 | if err != nil && errors.IsAlreadyExists(err) { |
| 49 | return nil |
| 50 | } |
| Giorgi Lekveishvili | 7fb28bf | 2023-06-24 19:51:16 +0400 | [diff] [blame] | 51 | return err |
| 52 | } |
| Giorgi Lekveishvili | cd9e42c | 2023-12-13 09:49:44 +0400 | [diff] [blame] | 53 | |
| 54 | type realZoneStatusFetcher struct { |
| 55 | clientset dynamic.Interface |
| 56 | } |
| 57 | |
| Giorgi Lekveishvili | 1caed36 | 2023-12-13 16:29:43 +0400 | [diff] [blame^] | 58 | func (f *realZoneStatusFetcher) Fetch(namespace, name string) (error, bool, ZoneInfo) { |
| Giorgi Lekveishvili | cd9e42c | 2023-12-13 09:49:44 +0400 | [diff] [blame] | 59 | dnsZoneRes := schema.GroupVersionResource{Group: "dodo.cloud.dodo.cloud", Version: "v1", Resource: "dnszones"} |
| 60 | zoneUnstr, err := f.clientset.Resource(dnsZoneRes).Namespace(namespace).Get(context.TODO(), name, metav1.GetOptions{}) |
| 61 | fmt.Printf("%+v %+v\n", zoneUnstr, err) |
| 62 | if err != nil { |
| Giorgi Lekveishvili | 1caed36 | 2023-12-13 16:29:43 +0400 | [diff] [blame^] | 63 | return err, false, ZoneInfo{} |
| Giorgi Lekveishvili | cd9e42c | 2023-12-13 09:49:44 +0400 | [diff] [blame] | 64 | } |
| 65 | var contents bytes.Buffer |
| 66 | if err := json.NewEncoder(&contents).Encode(zoneUnstr.Object); err != nil { |
| Giorgi Lekveishvili | 1caed36 | 2023-12-13 16:29:43 +0400 | [diff] [blame^] | 67 | return err, false, ZoneInfo{} |
| Giorgi Lekveishvili | cd9e42c | 2023-12-13 09:49:44 +0400 | [diff] [blame] | 68 | } |
| 69 | var zone dnsv1.DNSZone |
| 70 | if err := json.NewDecoder(&contents).Decode(&zone); err != nil { |
| Giorgi Lekveishvili | 1caed36 | 2023-12-13 16:29:43 +0400 | [diff] [blame^] | 71 | return err, false, ZoneInfo{} |
| Giorgi Lekveishvili | cd9e42c | 2023-12-13 09:49:44 +0400 | [diff] [blame] | 72 | } |
| Giorgi Lekveishvili | 1caed36 | 2023-12-13 16:29:43 +0400 | [diff] [blame^] | 73 | return nil, zone.Status.Ready, ZoneInfo{zone.Spec.Zone, zone.Status.RecordsToPublish} |
| Giorgi Lekveishvili | cd9e42c | 2023-12-13 09:49:44 +0400 | [diff] [blame] | 74 | } |
| 75 | |
| 76 | func NewNamespaceCreator(kubeconfig string) (NamespaceCreator, error) { |
| 77 | clientset, err := NewKubeConfig(kubeconfig) |
| 78 | if err != nil { |
| 79 | return nil, err |
| 80 | } |
| 81 | return &realNamespaceCreator{clientset}, nil |
| 82 | } |
| 83 | |
| 84 | func NewZoneStatusFetcher(kubeconfig string) (ZoneStatusFetcher, error) { |
| 85 | if kubeconfig == "" { |
| 86 | config, err := rest.InClusterConfig() |
| 87 | if err != nil { |
| 88 | return nil, err |
| 89 | } |
| 90 | client, err := dynamic.NewForConfig(config) |
| 91 | if err != nil { |
| 92 | return nil, err |
| 93 | } |
| 94 | return &realZoneStatusFetcher{client}, nil |
| 95 | |
| 96 | } else { |
| 97 | config, err := clientcmd.BuildConfigFromFlags("", kubeconfig) |
| 98 | if err != nil { |
| 99 | return nil, err |
| 100 | } |
| 101 | client, err := dynamic.NewForConfig(config) |
| 102 | if err != nil { |
| 103 | return nil, err |
| 104 | } |
| 105 | return &realZoneStatusFetcher{client}, nil |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | func NewKubeConfig(kubeconfig string) (*kubernetes.Clientset, error) { |
| 110 | if kubeconfig == "" { |
| 111 | config, err := rest.InClusterConfig() |
| 112 | if err != nil { |
| 113 | return nil, err |
| 114 | } |
| 115 | return kubernetes.NewForConfig(config) |
| 116 | |
| 117 | } else { |
| 118 | config, err := clientcmd.BuildConfigFromFlags("", kubeconfig) |
| 119 | if err != nil { |
| 120 | return nil, err |
| 121 | } |
| 122 | return kubernetes.NewForConfig(config) |
| 123 | } |
| 124 | } |