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