From 6e21e5e03decbb467d4c8aead2a8a575d90dc774 Mon Sep 17 00:00:00 2001 From: Nikolay Petrov Date: Wed, 29 Nov 2023 14:57:50 -0500 Subject: [PATCH 1/8] add appProtocol support for http2 --- api/v1alpha1/tunnel_types.go | 3 ++ go.mod | 14 ++++----- go.sum | 29 ++++++++++--------- internal/controllers/tunnel_controller.go | 2 +- internal/store/driver.go | 35 ++++++++++++++++++----- pkg/tunneldriver/driver.go | 7 +++-- 6 files changed, 58 insertions(+), 32 deletions(-) diff --git a/api/v1alpha1/tunnel_types.go b/api/v1alpha1/tunnel_types.go index 55473142..0b5800fa 100644 --- a/api/v1alpha1/tunnel_types.go +++ b/api/v1alpha1/tunnel_types.go @@ -45,6 +45,9 @@ type TunnelSpec struct { // The configuration for backend connections to services BackendConfig *BackendConfig `json:"backend,omitempty"` + + // The appProtocol for the backend. Currently only supports `http2` + AppProtocol string `json:"appProtocol,omitempty"` } // BackendConfig defines the configuration for backend connections to services. diff --git a/go.mod b/go.mod index 00427d34..4e049a29 100644 --- a/go.mod +++ b/go.mod @@ -10,10 +10,10 @@ require ( github.com/onsi/ginkgo/v2 v2.7.0 github.com/onsi/gomega v1.26.0 github.com/spf13/cobra v1.6.1 - github.com/stretchr/testify v1.8.1 - golang.ngrok.com/ngrok v1.4.0 + github.com/stretchr/testify v1.8.4 + golang.ngrok.com/ngrok v1.6.1-0.20231129180200-b8b5d7fcf1d0 golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df - golang.org/x/sync v0.1.0 + golang.org/x/sync v0.3.0 k8s.io/api v0.26.0 k8s.io/apimachinery v0.26.0 k8s.io/client-go v0.26.0 @@ -83,11 +83,11 @@ require ( go.uber.org/zap v1.24.0 // indirect golang.ngrok.com/muxado/v2 v2.0.0 // indirect golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.14.0 // indirect + golang.org/x/net v0.15.0 // indirect golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/term v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/term v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.6.0 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index b27d81e5..ca0d80eb 100644 --- a/go.sum +++ b/go.sum @@ -512,8 +512,9 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -572,8 +573,8 @@ go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.ngrok.com/muxado/v2 v2.0.0 h1:bu9eIDhRdYNtIXNnqat/HyMeHYOAbUH55ebD7gTvW6c= golang.ngrok.com/muxado/v2 v2.0.0/go.mod h1:wzxJYX4xiAtmwumzL+QsukVwFRXmPNv86vB8RPpOxyM= -golang.ngrok.com/ngrok v1.4.0 h1:QhUJ2jZr1xyf80zFLJuUsdc8exf3fVebQgbvOyVSbbk= -golang.ngrok.com/ngrok v1.4.0/go.mod h1:8a8GVoqR305t0O51ld211Xq2UeKgm32o8px24ddvXZI= +golang.ngrok.com/ngrok v1.6.1-0.20231129180200-b8b5d7fcf1d0 h1:qsQytZkRifGlEJBTUgICPSDA2e8RhBBT1CimW0WGKqA= +golang.ngrok.com/ngrok v1.6.1-0.20231129180200-b8b5d7fcf1d0/go.mod h1:ruVcXZ7Rre5O9oeqqa8uZCB3Xtkt2PoyjF3eW9b7t6A= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -587,7 +588,7 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -671,8 +672,8 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -694,8 +695,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -750,12 +751,12 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -764,8 +765,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/internal/controllers/tunnel_controller.go b/internal/controllers/tunnel_controller.go index d38c962f..9afbb6a0 100644 --- a/internal/controllers/tunnel_controller.go +++ b/internal/controllers/tunnel_controller.go @@ -110,7 +110,7 @@ func (r *TunnelReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr func (r *TunnelReconciler) update(ctx context.Context, tunnel *ingressv1alpha1.Tunnel) error { tunnelName := r.statusID(tunnel) - return r.TunnelDriver.CreateTunnel(ctx, tunnelName, tunnel.Spec.Labels, tunnel.Spec.BackendConfig, tunnel.Spec.ForwardsTo) + return r.TunnelDriver.CreateTunnel(ctx, tunnelName, tunnel.Spec.Labels, tunnel.Spec.BackendConfig, tunnel.Spec.ForwardsTo, tunnel.Spec.AppProtocol) } func (r *TunnelReconciler) delete(ctx context.Context, tunnel *ingressv1alpha1.Tunnel) error { diff --git a/internal/store/driver.go b/internal/store/driver.go index eab9ca57..666f8889 100644 --- a/internal/store/driver.go +++ b/internal/store/driver.go @@ -611,7 +611,7 @@ func (d *Driver) calculateHTTPSEdges() map[string]ingressv1alpha1.HTTPSEdge { } serviceName := httpIngressPath.Backend.Service.Name - serviceUID, servicePort, _, err := d.getBackendServicePort(*httpIngressPath.Backend.Service, ingress.Namespace) + serviceUID, servicePort, _, _, err := d.getBackendServicePort(*httpIngressPath.Backend.Service, ingress.Namespace) if err != nil { d.log.Error(err, "could not find port for service", "namespace", ingress.Namespace, "service", serviceName) continue @@ -670,7 +670,7 @@ func (d *Driver) calculateTunnels() map[tunnelKey]ingressv1alpha1.Tunnel { } serviceName := path.Backend.Service.Name - serviceUID, servicePort, protocol, err := d.getBackendServicePort(*path.Backend.Service, ingress.Namespace) + serviceUID, servicePort, protocol, appProtocol, err := d.getBackendServicePort(*path.Backend.Service, ingress.Namespace) if err != nil { d.log.Error(err, "could not find port for service", "namespace", ingress.Namespace, "service", serviceName) } @@ -692,6 +692,7 @@ func (d *Driver) calculateTunnels() map[tunnelKey]ingressv1alpha1.Tunnel { BackendConfig: &ingressv1alpha1.BackendConfig{ Protocol: protocol, }, + AppProtocol: appProtocol, }, } } @@ -747,23 +748,28 @@ func (d *Driver) calculateIngressLoadBalancerIPStatus(ing *netv1.Ingress, c clie return status } -func (d *Driver) getBackendServicePort(backendSvc netv1.IngressServiceBackend, namespace string) (string, int32, string, error) { +func (d *Driver) getBackendServicePort(backendSvc netv1.IngressServiceBackend, namespace string) (string, int32, string, string, error) { service, err := d.store.GetServiceV1(backendSvc.Name, namespace) if err != nil { - return "", 0, "", err + return "", 0, "", "", err } servicePort, err := d.findServicesPort(service, backendSvc.Port) if err != nil { - return "", 0, "", err + return "", 0, "", "", err } protocol, err := d.getPortAnnotatedProtocol(service, servicePort.Name) if err != nil { - return "", 0, "", err + return "", 0, "", "", err } - return string(service.UID), servicePort.Port, protocol, nil + appProtocol, err := d.getPortAppProtocol(service, servicePort) + if err != nil { + return "", 0, "", "", err + } + + return string(service.UID), servicePort.Port, protocol, appProtocol, nil } func (d *Driver) findServicesPort(service *corev1.Service, backendSvcPort netv1.ServiceBackendPort) (*corev1.ServicePort, error) { @@ -802,6 +808,21 @@ func (d *Driver) getPortAnnotatedProtocol(service *corev1.Service, portName stri return "HTTP", nil } +func (d *Driver) getPortAppProtocol(service *corev1.Service, port *corev1.ServicePort) (string, error) { + if port.AppProtocol == nil { + return "", nil + } + + switch proto := *port.AppProtocol; proto { + case "k8s.ngrok.com/http2": + return "http2", nil + case "": + return "", nil + default: + return "", fmt.Errorf("Unsupported appProtocol: '%s', must be 'k8s.ngrok.com/http2' or ''. From: %s service: %s", proto, service.Namespace, service.Name) + } +} + func (d *Driver) edgeLabels(domain string) map[string]string { return map[string]string{ labelControllerNamespace: d.managerName.Namespace, diff --git a/pkg/tunneldriver/driver.go b/pkg/tunneldriver/driver.go index 9f09b9ce..2dd85753 100644 --- a/pkg/tunneldriver/driver.go +++ b/pkg/tunneldriver/driver.go @@ -123,7 +123,7 @@ func caCerts() (*x509.CertPool, error) { // CreateTunnel creates and starts a new tunnel in a goroutine. If a tunnel with the same name already exists, // it will be stopped and replaced with a new tunnel unless the labels match. -func (td *TunnelDriver) CreateTunnel(ctx context.Context, name string, labels map[string]string, backend *ingressv1alpha1.BackendConfig, destination string) error { +func (td *TunnelDriver) CreateTunnel(ctx context.Context, name string, labels map[string]string, backend *ingressv1alpha1.BackendConfig, destination string, appProtocol string) error { log := log.FromContext(ctx) if tun, ok := td.tunnels[name]; ok { @@ -136,7 +136,7 @@ func (td *TunnelDriver) CreateTunnel(ctx context.Context, name string, labels ma defer td.stopTunnel(context.Background(), tun) } - tun, err := td.session.Listen(ctx, td.buildTunnelConfig(labels, destination)) + tun, err := td.session.Listen(ctx, td.buildTunnelConfig(labels, destination, appProtocol)) if err != nil { return err } @@ -175,12 +175,13 @@ func (td *TunnelDriver) stopTunnel(ctx context.Context, tun ngrok.Tunnel) error return tun.CloseWithContext(ctx) } -func (td *TunnelDriver) buildTunnelConfig(labels map[string]string, destination string) config.Tunnel { +func (td *TunnelDriver) buildTunnelConfig(labels map[string]string, destination, appProtocol string) config.Tunnel { opts := []config.LabeledTunnelOption{} for key, value := range labels { opts = append(opts, config.WithLabel(key, value)) } opts = append(opts, config.WithForwardsTo(destination)) + opts = append(opts, config.WithAppProtocol(appProtocol)) return config.LabeledTunnel(opts...) } From 29204abeff2902683acb983038689b1d04477111 Mon Sep 17 00:00:00 2001 From: Nikolay Petrov Date: Wed, 29 Nov 2023 15:01:31 -0500 Subject: [PATCH 2/8] update manifests --- .../templates/crds/ingress.k8s.ngrok.com_tunnels.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/helm/ingress-controller/templates/crds/ingress.k8s.ngrok.com_tunnels.yaml b/helm/ingress-controller/templates/crds/ingress.k8s.ngrok.com_tunnels.yaml index f67724a3..7b9f20e2 100644 --- a/helm/ingress-controller/templates/crds/ingress.k8s.ngrok.com_tunnels.yaml +++ b/helm/ingress-controller/templates/crds/ingress.k8s.ngrok.com_tunnels.yaml @@ -44,6 +44,10 @@ spec: spec: description: TunnelSpec defines the desired state of Tunnel properties: + appProtocol: + description: The appProtocol for the backend. Currently only supports + `http2` + type: string backend: description: The configuration for backend connections to services properties: From 5dc4670943b6bbe44cef9fa6d02ff861d5759377 Mon Sep 17 00:00:00 2001 From: Nikolay Petrov Date: Thu, 30 Nov 2023 09:20:05 -0500 Subject: [PATCH 3/8] pass in full tunnel spec --- internal/controllers/tunnel_controller.go | 2 +- pkg/tunneldriver/driver.go | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/internal/controllers/tunnel_controller.go b/internal/controllers/tunnel_controller.go index 9afbb6a0..a854b798 100644 --- a/internal/controllers/tunnel_controller.go +++ b/internal/controllers/tunnel_controller.go @@ -110,7 +110,7 @@ func (r *TunnelReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr func (r *TunnelReconciler) update(ctx context.Context, tunnel *ingressv1alpha1.Tunnel) error { tunnelName := r.statusID(tunnel) - return r.TunnelDriver.CreateTunnel(ctx, tunnelName, tunnel.Spec.Labels, tunnel.Spec.BackendConfig, tunnel.Spec.ForwardsTo, tunnel.Spec.AppProtocol) + return r.TunnelDriver.CreateTunnel(ctx, tunnelName, tunnel.Spec) } func (r *TunnelReconciler) delete(ctx context.Context, tunnel *ingressv1alpha1.Tunnel) error { diff --git a/pkg/tunneldriver/driver.go b/pkg/tunneldriver/driver.go index 2dd85753..280dce26 100644 --- a/pkg/tunneldriver/driver.go +++ b/pkg/tunneldriver/driver.go @@ -123,11 +123,11 @@ func caCerts() (*x509.CertPool, error) { // CreateTunnel creates and starts a new tunnel in a goroutine. If a tunnel with the same name already exists, // it will be stopped and replaced with a new tunnel unless the labels match. -func (td *TunnelDriver) CreateTunnel(ctx context.Context, name string, labels map[string]string, backend *ingressv1alpha1.BackendConfig, destination string, appProtocol string) error { +func (td *TunnelDriver) CreateTunnel(ctx context.Context, name string, spec ingressv1alpha1.TunnelSpec) error { log := log.FromContext(ctx) if tun, ok := td.tunnels[name]; ok { - if maps.Equal(tun.Labels(), labels) { + if maps.Equal(tun.Labels(), spec.Labels) { log.Info("Tunnel labels match existing tunnel, doing nothing") return nil } @@ -136,16 +136,18 @@ func (td *TunnelDriver) CreateTunnel(ctx context.Context, name string, labels ma defer td.stopTunnel(context.Background(), tun) } - tun, err := td.session.Listen(ctx, td.buildTunnelConfig(labels, destination, appProtocol)) + tun, err := td.session.Listen(ctx, td.buildTunnelConfig(spec.Labels, spec.ForwardsTo, spec.AppProtocol)) if err != nil { return err } td.tunnels[name] = tun + protocol := "" - if backend != nil { - protocol = backend.Protocol + if spec.BackendConfig != nil { + protocol = spec.BackendConfig.Protocol } - go handleConnections(ctx, &net.Dialer{}, tun, destination, protocol) + + go handleConnections(ctx, &net.Dialer{}, tun, spec.ForwardsTo, protocol) return nil } From 1c360c619b3357b33897ccdb2866a223171ff8ed Mon Sep 17 00:00:00 2001 From: Nikolay Petrov Date: Thu, 30 Nov 2023 09:35:04 -0500 Subject: [PATCH 4/8] slightly refactor names --- internal/store/driver.go | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/internal/store/driver.go b/internal/store/driver.go index 666f8889..c79607ca 100644 --- a/internal/store/driver.go +++ b/internal/store/driver.go @@ -611,7 +611,7 @@ func (d *Driver) calculateHTTPSEdges() map[string]ingressv1alpha1.HTTPSEdge { } serviceName := httpIngressPath.Backend.Service.Name - serviceUID, servicePort, _, _, err := d.getBackendServicePort(*httpIngressPath.Backend.Service, ingress.Namespace) + serviceUID, servicePort, err := d.getEdgeBackend(*httpIngressPath.Backend.Service, ingress.Namespace) if err != nil { d.log.Error(err, "could not find port for service", "namespace", ingress.Namespace, "service", serviceName) continue @@ -670,7 +670,7 @@ func (d *Driver) calculateTunnels() map[tunnelKey]ingressv1alpha1.Tunnel { } serviceName := path.Backend.Service.Name - serviceUID, servicePort, protocol, appProtocol, err := d.getBackendServicePort(*path.Backend.Service, ingress.Namespace) + serviceUID, servicePort, protocol, appProtocol, err := d.getTunnelBackend(*path.Backend.Service, ingress.Namespace) if err != nil { d.log.Error(err, "could not find port for service", "namespace", ingress.Namespace, "service", serviceName) } @@ -748,13 +748,17 @@ func (d *Driver) calculateIngressLoadBalancerIPStatus(ing *netv1.Ingress, c clie return status } -func (d *Driver) getBackendServicePort(backendSvc netv1.IngressServiceBackend, namespace string) (string, int32, string, string, error) { - service, err := d.store.GetServiceV1(backendSvc.Name, namespace) +func (d *Driver) getEdgeBackend(backendSvc netv1.IngressServiceBackend, namespace string) (string, int32, error) { + service, servicePort, err := d.findBackendServicePort(backendSvc, namespace) if err != nil { - return "", 0, "", "", err + return "", 0, err } - servicePort, err := d.findServicesPort(service, backendSvc.Port) + return string(service.UID), servicePort.Port, nil +} + +func (d *Driver) getTunnelBackend(backendSvc netv1.IngressServiceBackend, namespace string) (string, int32, string, string, error) { + service, servicePort, err := d.findBackendServicePort(backendSvc, namespace) if err != nil { return "", 0, "", "", err } @@ -772,6 +776,20 @@ func (d *Driver) getBackendServicePort(backendSvc netv1.IngressServiceBackend, n return string(service.UID), servicePort.Port, protocol, appProtocol, nil } +func (d *Driver) findBackendServicePort(backendSvc netv1.IngressServiceBackend, namespace string) (*corev1.Service, *corev1.ServicePort, error) { + service, err := d.store.GetServiceV1(backendSvc.Name, namespace) + if err != nil { + return nil, nil, err + } + + servicePort, err := d.findServicesPort(service, backendSvc.Port) + if err != nil { + return nil, nil, err + } + + return service, servicePort, nil +} + func (d *Driver) findServicesPort(service *corev1.Service, backendSvcPort netv1.ServiceBackendPort) (*corev1.ServicePort, error) { for _, port := range service.Spec.Ports { if (backendSvcPort.Number > 0 && port.Port == backendSvcPort.Number) || port.Name == backendSvcPort.Name { From ff910f9afd1f80e9fe60de55f7a56b203271193c Mon Sep 17 00:00:00 2001 From: Nikolay Petrov Date: Thu, 30 Nov 2023 10:41:21 -0500 Subject: [PATCH 5/8] use k8s specific annotation --- internal/store/driver.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/store/driver.go b/internal/store/driver.go index c79607ca..8d54c7a9 100644 --- a/internal/store/driver.go +++ b/internal/store/driver.go @@ -832,12 +832,12 @@ func (d *Driver) getPortAppProtocol(service *corev1.Service, port *corev1.Servic } switch proto := *port.AppProtocol; proto { - case "k8s.ngrok.com/http2": + case "kubernetes.io/h2c": return "http2", nil case "": return "", nil default: - return "", fmt.Errorf("Unsupported appProtocol: '%s', must be 'k8s.ngrok.com/http2' or ''. From: %s service: %s", proto, service.Namespace, service.Name) + return "", fmt.Errorf("Unsupported appProtocol: '%s', must be 'kubernetes.io/h2c' or ''. From: %s service: %s", proto, service.Namespace, service.Name) } } From 160f8dfcc24cee88104f1c7b04d0c5e1cbaff694 Mon Sep 17 00:00:00 2001 From: Nikolay Petrov Date: Thu, 30 Nov 2023 13:43:43 -0500 Subject: [PATCH 6/8] support both k8s and our annotation --- internal/store/driver.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/store/driver.go b/internal/store/driver.go index 8d54c7a9..913717c4 100644 --- a/internal/store/driver.go +++ b/internal/store/driver.go @@ -832,12 +832,12 @@ func (d *Driver) getPortAppProtocol(service *corev1.Service, port *corev1.Servic } switch proto := *port.AppProtocol; proto { - case "kubernetes.io/h2c": + case "k8s.ngrok.com/http2", "kubernetes.io/h2c": return "http2", nil case "": return "", nil default: - return "", fmt.Errorf("Unsupported appProtocol: '%s', must be 'kubernetes.io/h2c' or ''. From: %s service: %s", proto, service.Namespace, service.Name) + return "", fmt.Errorf("Unsupported appProtocol: '%s', must be 'k8s.ngrok.com/http2', 'kubernetes.io/h2c' or ''. From: %s service: %s", proto, service.Namespace, service.Name) } } From f6ea5ff35b244373356b2c3412d38be187b4223d Mon Sep 17 00:00:00 2001 From: Nikolay Petrov Date: Fri, 1 Dec 2023 09:50:21 -0500 Subject: [PATCH 7/8] use nextProto if we are talking via TLS to the target service --- pkg/tunneldriver/driver.go | 14 ++++++++++---- pkg/tunneldriver/driver_test.go | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/pkg/tunneldriver/driver.go b/pkg/tunneldriver/driver.go index 280dce26..ddf47ae9 100644 --- a/pkg/tunneldriver/driver.go +++ b/pkg/tunneldriver/driver.go @@ -147,7 +147,7 @@ func (td *TunnelDriver) CreateTunnel(ctx context.Context, name string, spec ingr protocol = spec.BackendConfig.Protocol } - go handleConnections(ctx, &net.Dialer{}, tun, spec.ForwardsTo, protocol) + go handleConnections(ctx, &net.Dialer{}, tun, spec.ForwardsTo, protocol, spec.AppProtocol) return nil } @@ -187,7 +187,7 @@ func (td *TunnelDriver) buildTunnelConfig(labels map[string]string, destination, return config.LabeledTunnel(opts...) } -func handleConnections(ctx context.Context, dialer Dialer, tun ngrok.Tunnel, dest string, protocol string) { +func handleConnections(ctx context.Context, dialer Dialer, tun ngrok.Tunnel, dest string, protocol string, appProtocol string) { logger := log.FromContext(ctx).WithValues("id", tun.ID(), "protocol", protocol, "dest", dest) for { conn, err := tun.Accept() @@ -206,7 +206,7 @@ func handleConnections(ctx context.Context, dialer Dialer, tun ngrok.Tunnel, des go func() { ctx := log.IntoContext(ctx, connLogger) - err := handleConn(ctx, dest, protocol, dialer, conn) + err := handleConn(ctx, dest, protocol, appProtocol, dialer, conn) if err == nil || errors.Is(err, net.ErrClosed) { connLogger.Info("Connection closed") return @@ -217,7 +217,7 @@ func handleConnections(ctx context.Context, dialer Dialer, tun ngrok.Tunnel, des } } -func handleConn(ctx context.Context, dest string, protocol string, dialer Dialer, conn net.Conn) error { +func handleConn(ctx context.Context, dest string, protocol string, appProtocol string, dialer Dialer, conn net.Conn) error { log := log.FromContext(ctx) next, err := dialer.DialContext(ctx, "tcp", dest) if err != nil { @@ -230,10 +230,16 @@ func handleConn(ctx context.Context, dest string, protocol string, dialer Dialer if err != nil { host = dest } + var nextProtos []string + if appProtocol == "http2" { + nextProtos = []string{"h2", "http/1.1"} + } + next = tls.Client(next, &tls.Config{ ServerName: host, InsecureSkipVerify: true, Renegotiation: tls.RenegotiateFreelyAsClient, + NextProtos: nextProtos, }) } diff --git a/pkg/tunneldriver/driver_test.go b/pkg/tunneldriver/driver_test.go index fab00d2a..21c21405 100644 --- a/pkg/tunneldriver/driver_test.go +++ b/pkg/tunneldriver/driver_test.go @@ -45,7 +45,7 @@ func TestConnectionIsClosed(t *testing.T) { select {} }).AnyTimes() - go handleConnections(ctx, mockDialer, mockTun, "target:port", "") + go handleConnections(ctx, mockDialer, mockTun, "target:port", "", "") bothClosed.Wait() ctrl.Finish() From b334981d2f0a71dffe0eef1f29a97ec890e30047 Mon Sep 17 00:00:00 2001 From: Nikolay Petrov Date: Fri, 1 Dec 2023 11:35:35 -0500 Subject: [PATCH 8/8] update ngrok-go to 1.7.0 --- go.mod | 14 +++++++------- go.sum | 30 +++++++++++++++--------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/go.mod b/go.mod index 4e049a29..1d2afe99 100644 --- a/go.mod +++ b/go.mod @@ -11,9 +11,9 @@ require ( github.com/onsi/gomega v1.26.0 github.com/spf13/cobra v1.6.1 github.com/stretchr/testify v1.8.4 - golang.ngrok.com/ngrok v1.6.1-0.20231129180200-b8b5d7fcf1d0 + golang.ngrok.com/ngrok v1.7.0 golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df - golang.org/x/sync v0.3.0 + golang.org/x/sync v0.5.0 k8s.io/api v0.26.0 k8s.io/apimachinery v0.26.0 k8s.io/client-go v0.26.0 @@ -58,7 +58,7 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -83,11 +83,11 @@ require ( go.uber.org/zap v1.24.0 // indirect golang.ngrok.com/muxado/v2 v2.0.0 // indirect golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.15.0 // indirect + golang.org/x/net v0.19.0 // indirect golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.6.0 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index ca0d80eb..390440f1 100644 --- a/go.sum +++ b/go.sum @@ -383,8 +383,8 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= @@ -573,8 +573,8 @@ go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.ngrok.com/muxado/v2 v2.0.0 h1:bu9eIDhRdYNtIXNnqat/HyMeHYOAbUH55ebD7gTvW6c= golang.ngrok.com/muxado/v2 v2.0.0/go.mod h1:wzxJYX4xiAtmwumzL+QsukVwFRXmPNv86vB8RPpOxyM= -golang.ngrok.com/ngrok v1.6.1-0.20231129180200-b8b5d7fcf1d0 h1:qsQytZkRifGlEJBTUgICPSDA2e8RhBBT1CimW0WGKqA= -golang.ngrok.com/ngrok v1.6.1-0.20231129180200-b8b5d7fcf1d0/go.mod h1:ruVcXZ7Rre5O9oeqqa8uZCB3Xtkt2PoyjF3eW9b7t6A= +golang.ngrok.com/ngrok v1.7.0 h1:xwcr8QWue+ehgn54hdQwTya4B6A1qXg6+IRim6WINmA= +golang.ngrok.com/ngrok v1.7.0/go.mod h1:ruVcXZ7Rre5O9oeqqa8uZCB3Xtkt2PoyjF3eW9b7t6A= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -588,7 +588,7 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -672,8 +672,8 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -695,8 +695,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -751,12 +751,12 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -765,8 +765,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=