diff --git a/plugin.go b/plugin.go index cde7ce1..94de059 100644 --- a/plugin.go +++ b/plugin.go @@ -9,8 +9,9 @@ import ( "strings" "github.com/aymerick/raymond" - appv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" + appV1 "k8s.io/api/apps/v1" + coreV1 "k8s.io/api/core/v1" + v1BetaV1 "k8s.io/api/extensions/v1beta1" "k8s.io/client-go/kubernetes/scheme" ) @@ -91,7 +92,7 @@ func (p Plugin) Exec() error { } switch o := kubernetesObject.(type) { - case *appv1.Deployment: + case *appV1.Deployment: log.Print("📦 Resource type: Deployment") if p.KubeConfig.Namespace == "" { p.KubeConfig.Namespace = o.Namespace @@ -107,20 +108,27 @@ func (p Plugin) Exec() error { state, watchErr := waitUntilDeploymentSettled(clientset, p.KubeConfig.Namespace, o.ObjectMeta.Name, 120) log.Printf("%s", state) return watchErr - case *corev1.ConfigMap: + case *coreV1.ConfigMap: if p.KubeConfig.Namespace == "" { p.KubeConfig.Namespace = o.Namespace } log.Print("📦 Resource type: ConfigMap") err = ApplyConfigMapFromFile(clientset, p.KubeConfig.Namespace, o, p.ConfigMapFile) - case *corev1.Service: + case *coreV1.Service: if p.KubeConfig.Namespace == "" { p.KubeConfig.Namespace = o.Namespace } log.Print("Resource type: Service") err = ApplyService(clientset, p.KubeConfig.Namespace, o) + case *v1BetaV1.Ingress: + if p.KubeConfig.Namespace == "" { + p.KubeConfig.Namespace = o.Namespace + } + + log.Print("Resource type: Ingress") + err = ApplyIngress(clientset, p.KubeConfig.Namespace, o) default: return errors.New("⛔️ This plugin doesn't support that resource type") } diff --git a/resources.go b/resources.go index 83696a7..2f759d1 100644 --- a/resources.go +++ b/resources.go @@ -12,6 +12,7 @@ import ( appV1 "k8s.io/api/apps/v1" coreV1 "k8s.io/api/core/v1" + v1BetaV1 "k8s.io/api/extensions/v1beta1" kubeErrors "k8s.io/apimachinery/pkg/api/errors" metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" @@ -161,3 +162,31 @@ func configMapExists(clientset *kubernetes.Clientset, namespace string, name str } return true, nil } + +func ApplyIngress(clientset *kubernetes.Clientset, namespace string, ingress *v1BetaV1.Ingress) error { + _, exists, err := getIngress(clientset, namespace, ingress.Name) + if err != nil { + return err + } + + if !exists { + _, err = clientset.ExtensionsV1beta1().Ingresses(namespace).Create(ingress) + return err + } + + _, err = clientset.ExtensionsV1beta1().Ingresses(namespace).Update(ingress) + return err +} + +func getIngress(clientset *kubernetes.Clientset, namespace string, name string) (*v1BetaV1.Ingress, bool, error) { + ingress, err := clientset.ExtensionsV1beta1().Ingresses(namespace).Get(name, metaV1.GetOptions{}) + if err != nil { + statusError, ok := err.(*kubeErrors.StatusError) + if ok && statusError.Status().Code == http.StatusNotFound { + return nil, false, nil + } + return nil, false, err + } + + return ingress, true, nil +}