diff --git a/build/Dockerfile b/build/Dockerfile index ebfafe8..4dc3f82 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -8,6 +8,8 @@ ENV OPERATOR=/usr/local/bin/ngrok-operator \ COPY build/_output/bin/ngrok-operator ${OPERATOR} COPY build/bin /usr/local/bin +COPY templates /templates + RUN /usr/local/bin/user_setup ENTRYPOINT ["/usr/local/bin/entrypoint"] diff --git a/deploy/crds/ngrok.com_ngroks_crd.yaml b/deploy/crds/ngrok.com_ngroks_crd.yaml index 48df6f8..000c2a2 100644 --- a/deploy/crds/ngrok.com_ngroks_crd.yaml +++ b/deploy/crds/ngrok.com_ngroks_crd.yaml @@ -40,9 +40,19 @@ spec: spec: description: NgrokSpec defines the desired state of Ngrok properties: + authtoken: + type: string + hostname: + type: string port: format: int32 type: integer + protocol: + default: http + enum: + - http + - tcp + type: string service: type: string required: diff --git a/pkg/apis/ngrok/v1alpha1/ngrok_types.go b/pkg/apis/ngrok/v1alpha1/ngrok_types.go index 96e2aa3..5be07c8 100644 --- a/pkg/apis/ngrok/v1alpha1/ngrok_types.go +++ b/pkg/apis/ngrok/v1alpha1/ngrok_types.go @@ -8,6 +8,17 @@ import ( type NgrokSpec struct { Service string `json:"service"` Port int32 `json:"port"` + + // +kubebuilder:validation:Enum=http;tcp + // +kubebuilder:default:=http + // +optional + Protocol string `json:"protocol"` + + // +optional + AuthToken string `json:"authtoken"` + + // +optional + Hostname string `json:"hostname"` } // NgrokStatus defines the observed state of Ngrok diff --git a/pkg/controller/ngrok/ngrok_controller.go b/pkg/controller/ngrok/ngrok_controller.go index 993f510..ad77a1b 100644 --- a/pkg/controller/ngrok/ngrok_controller.go +++ b/pkg/controller/ngrok/ngrok_controller.go @@ -1,11 +1,12 @@ package ngrok import ( + "bytes" "context" "io/ioutil" "net/http" "regexp" - "strconv" + "text/template" "time" ngrokv1alpha1 "github.com/zufardhiyaulhaq/ngrok-operator/pkg/apis/ngrok/v1alpha1" @@ -202,9 +203,7 @@ func (r *ReconcileNgrok) Reconcile(request reconcile.Request) (reconcile.Result, func newNgrokConfigMap(cr *ngrokv1alpha1.Ngrok) *corev1.ConfigMap { configMapData := make(map[string]string, 0) - ngrokProperties := ` -web_addr: 0.0.0.0:4040` - configMapData["ngrok.conf"] = ngrokProperties + configMapData["ngrok.conf"] = generateConfiguration(cr) labels := map[string]string{ "app": cr.Name, @@ -236,7 +235,7 @@ func newNgrokPod(cr *ngrokv1alpha1.Ngrok) *corev1.Pod { { Name: "ngrok", Image: "wernight/ngrok", - Command: []string{"ngrok", "http", "--config", "/ngrok/ngrok.conf", cr.Spec.Service + ":" + strconv.FormatInt(int64(cr.Spec.Port), 10)}, + Command: []string{"ngrok", "--config", "/ngrok/ngrok.conf", "--all"}, Ports: []corev1.ContainerPort{ {ContainerPort: ngrokPort}, }, @@ -263,3 +262,20 @@ func newNgrokPod(cr *ngrokv1alpha1.Ngrok) *corev1.Pod { }, } } + +func generateConfiguration(cr *ngrokv1alpha1.Ngrok) string { + var output bytes.Buffer + tmpl := "template/configuration.tmpl" + + tpl, err := template.ParseFiles(tmpl) + if err != nil { + panic(err) + } + + err = tpl.Execute(&output, cr) + if err != nil { + panic(err) + } + + return output.String() +} diff --git a/templates/configuration.tmpl b/templates/configuration.tmpl new file mode 100644 index 0000000..cb1c491 --- /dev/null +++ b/templates/configuration.tmpl @@ -0,0 +1,13 @@ +web_addr: 0.0.0.0:4040 + +{{if .Spec.AuthToken }} +authtoken: {{ .Spec.AuthToken }} +{{end}} + +tunnels: + app: + proto: {{ .Spec.Protocol }} + addr: {{ .Spec.Service }}:{{ .Spec.Port }} + {{if .Spec.AuthToken }}{{if .Spec.Hostname }} + hostname: {{ .Spec.Hostname }} + {{end}}{{end}}