Skip to content

Commit

Permalink
Merge pull request #6 from zufardhiyaulhaq/implement-status-handler
Browse files Browse the repository at this point in the history
Implement status handler to reload ngrok
  • Loading branch information
zufardhiyaulhaq authored Aug 20, 2021
2 parents 433d7f8 + f8370dd commit d3f5829
Show file tree
Hide file tree
Showing 12 changed files with 626 additions and 34 deletions.
2 changes: 1 addition & 1 deletion api/v1alpha1/ngrok_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import (

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/zufardhiyaulhaq/ngrok-operator/pkg/ngrok/utils"
"github.com/zufardhiyaulhaq/ngrok-operator/pkg/utils"
)

// NgrokSpec defines the desired state of Ngrok
Expand Down
67 changes: 56 additions & 11 deletions controllers/ngrok_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,17 @@ import (
"time"

ngrokcomv1alpha1 "github.com/zufardhiyaulhaq/ngrok-operator/api/v1alpha1"
builder "github.com/zufardhiyaulhaq/ngrok-operator/pkg/ngrok/builder"
builder "github.com/zufardhiyaulhaq/ngrok-operator/pkg/builder"
"github.com/zufardhiyaulhaq/ngrok-operator/pkg/utils"
corev1 "k8s.io/api/core/v1"
ctrl "sigs.k8s.io/controller-runtime"

"github.com/zufardhiyaulhaq/ngrok-operator/pkg/ngrok/utils"
"github.com/zufardhiyaulhaq/ngrok-operator/pkg/handler"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"sigs.k8s.io/controller-runtime/pkg/log"
)
Expand All @@ -41,7 +43,8 @@ const NGROK_STATUS_URL_FETCHING = "Fetching"
// NgrokReconciler reconciles a Ngrok object
type NgrokReconciler struct {
client.Client
Scheme *runtime.Scheme
Scheme *runtime.Scheme
StatusHandler handler.StatusHandler
}

//+kubebuilder:rbac:groups=ngrok.com,resources=ngroks,verbs=get;list;watch;create;update;patch;delete
Expand All @@ -55,38 +58,44 @@ func (r *NgrokReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
ngrok := &ngrokcomv1alpha1.Ngrok{}
err := r.Client.Get(context.TODO(), req.NamespacedName, ngrok)
if err != nil {
return ctrl.Result{}, err
return ctrl.Result{}, nil
}

log.Info("Build config map")
configmap, err := builder.NewNgrokConfigMapBuilder().
SetConfig(ngrok).
Build()
if err != nil {
return ctrl.Result{}, err
}

log.Info("Build pod")
pod, err := builder.NewNgrokPodBuilder().
SetConfig(ngrok).
Build()
if err != nil {
return ctrl.Result{}, err
}

log.Info("Build service")
service, err := builder.NewNgrokServiceBuilder().
SetConfig(ngrok).
Build()
if err != nil {
return ctrl.Result{}, err
}

log.Info("set reference config map")
if err := controllerutil.SetControllerReference(ngrok, configmap, r.Scheme); err != nil {
return ctrl.Result{}, err
}

log.Info("set reference pod")
if err := controllerutil.SetControllerReference(ngrok, pod, r.Scheme); err != nil {
return ctrl.Result{}, err
}

log.Info("set reference service")
if err := controllerutil.SetControllerReference(ngrok, service, r.Scheme); err != nil {
return ctrl.Result{}, err
}
Expand All @@ -95,8 +104,10 @@ func (r *NgrokReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
createdPod := &corev1.Pod{}
createdService := &corev1.Service{}

log.Info("get config map")
err = r.Client.Get(context.TODO(), types.NamespacedName{Name: configmap.Name, Namespace: configmap.Namespace}, createdConfigMap)
if err != nil && errors.IsNotFound(err) {
log.Info("create config map")
err = r.Client.Create(context.TODO(), configmap)
if err != nil {
return ctrl.Result{}, err
Expand All @@ -105,8 +116,10 @@ func (r *NgrokReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
return ctrl.Result{}, err
}

log.Info("get pod")
err = r.Client.Get(context.TODO(), types.NamespacedName{Name: pod.Name, Namespace: pod.Namespace}, createdPod)
if err != nil && errors.IsNotFound(err) {
log.Info("create pod")
err = r.Client.Create(context.TODO(), pod)
if err != nil {
return ctrl.Result{}, err
Expand All @@ -115,8 +128,10 @@ func (r *NgrokReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
return ctrl.Result{}, err
}

log.Info("get service")
err = r.Client.Get(context.TODO(), types.NamespacedName{Name: service.Name, Namespace: service.Namespace}, createdService)
if err != nil && errors.IsNotFound(err) {
log.Info("create service")
err = r.Client.Create(context.TODO(), service)
if err != nil {
return ctrl.Result{}, err
Expand All @@ -125,31 +140,61 @@ func (r *NgrokReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
return ctrl.Result{}, err
}

time.Sleep(30 * time.Second)
var ngrokURL string
log.Info("check pod running")
if createdPod.Status.Phase != corev1.PodRunning {
return ctrl.Result{RequeueAfter: time.Second * 10}, nil
}

if createdPod.Status.PodIP != "" {
adminAPI := "http://" + createdPod.Status.PodIP + ":4040/api/tunnels"
ngrokURL, err = utils.GetNgrokURL(adminAPI)
log.Info("get ngrok url")
url, err := utils.GetNgrokURL("http://" + service.Name + "." + service.Namespace + ".svc" + "/api/tunnels")
if err != nil {
return ctrl.Result{}, err
}

// get the status from ngrok URL
// if it's not running, recreate the pod
log.Info("get status ngrok")
status, err := r.StatusHandler.Running(url)
if err != nil {
return ctrl.Result{}, err
}
if !status {
log.Info("delete ngrok pod to restart session")
err := r.Client.Delete(context.TODO(), createdPod)
if err != nil {
return ctrl.Result{}, err
}

return ctrl.Result{RequeueAfter: time.Second * 10}, nil
}

log.Info("get ngrok")
ngrok = &ngrokcomv1alpha1.Ngrok{}
err = r.Client.Get(context.TODO(), req.NamespacedName, ngrok)
if err != nil {
return ctrl.Result{}, nil
}

ngrok.Status.Status = NGROK_STATUS_CREATED
ngrok.Status.URL = ngrokURL
ngrok.Status.URL = url

log.Info("update ngrok status")
err = r.Client.Status().Update(context.TODO(), ngrok)
if err != nil {
return ctrl.Result{}, err
}

return ctrl.Result{}, nil
// rather than finished the process and reconcile when object changed
// force to reconcile every 60 seconds
return ctrl.Result{RequeueAfter: time.Second * 60}, nil
}

// SetupWithManager sets up the controller with the Manager.
func (r *NgrokReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&ngrokcomv1alpha1.Ngrok{}).
WithOptions(controller.Options{
MaxConcurrentReconciles: 10,
}).
Complete(r)
}
15 changes: 15 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,27 @@ go 1.16

require (
cloud.google.com/go v0.60.0 // indirect
github.com/go-lintpack/lintpack v0.5.2 // indirect
github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 // indirect
github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c // indirect
github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 // indirect
github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee // indirect
github.com/golangci/golangci-lint v1.41.1 // indirect
github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547 // indirect
github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc // indirect
github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 // indirect
github.com/klauspost/cpuid v1.2.0 // indirect
github.com/onsi/ginkgo v1.16.4
github.com/onsi/gomega v1.13.0
github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7 // indirect
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 // indirect
golang.org/x/tools v0.1.3 // indirect
gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
k8s.io/api v0.21.2
k8s.io/apimachinery v0.21.2
k8s.io/client-go v0.21.2
sigs.k8s.io/controller-runtime v0.9.2
sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 // indirect
)
Loading

0 comments on commit d3f5829

Please sign in to comment.