108 lines
3.0 KiB
Go
108 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"log"
|
|
"net/http"
|
|
"path/filepath"
|
|
|
|
"connectrpc.com/connect"
|
|
|
|
"connectrpc.com/validate"
|
|
"git.kocoder.xyz/kocoder/portforwarder/api/types/v1alpha1"
|
|
clientV1alpha1 "git.kocoder.xyz/kocoder/portforwarder/clientset/v1alpha1"
|
|
"git.kocoder.xyz/kocoder/portforwarder/gen/portforwarding/portforwardingv1connect"
|
|
"git.kocoder.xyz/kocoder/portforwarder/portforwarding"
|
|
"k8s.io/client-go/kubernetes/scheme"
|
|
"k8s.io/client-go/tools/clientcmd"
|
|
"k8s.io/client-go/util/homedir"
|
|
)
|
|
|
|
func main() {
|
|
var kubeconfig *string
|
|
if home := homedir.HomeDir(); home != "" {
|
|
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
|
|
} else {
|
|
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
|
|
}
|
|
flag.Parse()
|
|
|
|
// use the current context in kubeconfig
|
|
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
|
|
if err != nil {
|
|
panic(err.Error())
|
|
}
|
|
|
|
err = v1alpha1.AddToScheme(scheme.Scheme)
|
|
if err != nil {
|
|
panic(err.Error())
|
|
}
|
|
|
|
client, err := clientV1alpha1.NewForConfig(config)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
const namespace = "default"
|
|
|
|
pf := portforwarding.NewPortforwardingService(client.Ingressroute(namespace), namespace, "external-db-svc", ".kocoder.xyz", "k3s-kocoder-xyz-tls")
|
|
|
|
mux := http.NewServeMux()
|
|
path, handler := portforwardingv1connect.NewPortForwardingServiceHandler(
|
|
pf,
|
|
connect.WithInterceptors(validate.NewInterceptor()),
|
|
)
|
|
|
|
mux.Handle(path, handler)
|
|
p := new(http.Protocols)
|
|
p.SetHTTP1(true)
|
|
// Use h2c so we can serve HTTP/2 without TLS.
|
|
p.SetUnencryptedHTTP2(true)
|
|
s := http.Server{
|
|
Addr: "localhost:8080",
|
|
Handler: mux,
|
|
Protocols: p,
|
|
}
|
|
err = s.ListenAndServe()
|
|
log.Fatal(err)
|
|
|
|
// ir := &v1alpha1.IngressRoute{
|
|
// ObjectMeta: v1.ObjectMeta{
|
|
// Name: "beary-times",
|
|
// },
|
|
// Spec: v1alpha1.IngressRouteSpec{
|
|
// EntryPoints: []string{"websecure", "web"},
|
|
// Routes: []v1alpha1.Route{
|
|
// {
|
|
// Kind: "Rule",
|
|
// Match: "Host(`beary-times.kocoder.xyz`)",
|
|
// Services: []v1alpha1.Service{
|
|
// {
|
|
// Kind: "Service",
|
|
// Name: "external-db-svc",
|
|
// Namespace: "default",
|
|
// PassHostHeader: false,
|
|
// Port: 63419,
|
|
// ResponseForwarding: v1alpha1.ResponseForwarding{FlushInterval: "10ms"},
|
|
// Scheme: "https",
|
|
// Sticky: v1alpha1.Sticky{Cookie: v1alpha1.Cookie{HttpOnly: false, Name: "", Secure: false}},
|
|
// Strategy: "wrr",
|
|
// Weight: 0,
|
|
// },
|
|
// },
|
|
// Middlewares: []v1alpha1.Middleware{},
|
|
// Observability: v1alpha1.Observability{AccessLogs: true, Metrics: true, Tracing: true},
|
|
// Priority: 10,
|
|
// },
|
|
// },
|
|
// },
|
|
// }
|
|
|
|
// ir, err = client.Ingressroute("default").Create(context.TODO(), ir)
|
|
// if err != nil {
|
|
// panic(err)
|
|
// }
|
|
|
|
// client.Ingressroute("default").Delete(context.TODO(), "hannes", v1.DeleteOptions{})
|
|
}
|