Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package hcloud-cli for openSUSE:Factory checked in at 2026-05-21 18:33:09 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/hcloud-cli (Old) and /work/SRC/openSUSE:Factory/.hcloud-cli.new.2084 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "hcloud-cli" Thu May 21 18:33:09 2026 rev:20 rq:1354471 version:1.65.0 Changes: -------- --- /work/SRC/openSUSE:Factory/hcloud-cli/hcloud-cli.changes 2026-04-30 20:28:30.578187121 +0200 +++ /work/SRC/openSUSE:Factory/.hcloud-cli.new.2084/hcloud-cli.changes 2026-05-21 18:34:19.427809258 +0200 @@ -1,0 +2,22 @@ +Thu May 21 13:47:23 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 1.65.0: + * Load Balancer HTTP Services now support TimeoutIdle + A timeout for HTTP connections can now be set with + --http-timeout-idle while creating or updating Load Balancer + services. + See the changelog for more information. + https://docs.hetzner.cloud/changelog#2026-04-30-load-balancers-http-idle-timeout-can-now-be-configured + * Features + - load-balancer: support --http-timeout-idle flag (#1394) + * Dependencies + - deps: update dependency jdx/mise to v2026.5.9 (#1404) + - deps: update golang.org/x/ (#1406) + - deps: update dependency jdx/mise to v2026.5.2 (#1392) + - deps: update dependency go to v1.26.3 (#1402) + - deps: update module github.com/hetznercloud/hcloud-go/v2 to + v2.40.0 (#1401) + - deps: update dependency github:golangci/golangci-lint to + v2.12.2 (#1400) + +------------------------------------------------------------------- Old: ---- hcloud-cli-1.64.1.obscpio New: ---- hcloud-cli-1.65.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ hcloud-cli.spec ++++++ --- /var/tmp/diff_new_pack.PXsW3f/_old 2026-05-21 18:34:22.059918635 +0200 +++ /var/tmp/diff_new_pack.PXsW3f/_new 2026-05-21 18:34:22.087919798 +0200 @@ -19,7 +19,7 @@ %define executable_name hcloud Name: hcloud-cli -Version: 1.64.1 +Version: 1.65.0 Release: 0 Summary: A command-line interface for Hetzner Cloud License: MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.PXsW3f/_old 2026-05-21 18:34:22.319929439 +0200 +++ /var/tmp/diff_new_pack.PXsW3f/_new 2026-05-21 18:34:22.343930437 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/hetznercloud/cli</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v1.64.1</param> + <param name="revision">v1.65.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.PXsW3f/_old 2026-05-21 18:34:22.471935756 +0200 +++ /var/tmp/diff_new_pack.PXsW3f/_new 2026-05-21 18:34:22.511937418 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/hetznercloud/cli</param> - <param name="changesrevision">fbfa512ee92a876c839357a01b9b49849eca8c74</param></service></servicedata> + <param name="changesrevision">a9f3077b036d9145ef75e17b51483fa4481c0a9f</param></service></servicedata> (No newline at EOF) ++++++ hcloud-cli-1.64.1.obscpio -> hcloud-cli-1.65.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/.golangci.yml new/hcloud-cli-1.65.0/.golangci.yml --- old/hcloud-cli-1.64.1/.golangci.yml 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/.golangci.yml 2026-05-21 14:14:58.000000000 +0200 @@ -18,7 +18,7 @@ - gochecksumtype - gocritic - gomoddirectives - - gomodguard + - gomodguard_v2 - gosec - gosmopolitan - loggercheck diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/CHANGELOG.md new/hcloud-cli-1.65.0/CHANGELOG.md --- old/hcloud-cli-1.64.1/CHANGELOG.md 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/CHANGELOG.md 2026-05-21 14:14:58.000000000 +0200 @@ -1,5 +1,17 @@ # Changelog +## [v1.65.0](https://github.com/hetznercloud/cli/releases/tag/v1.65.0) + +### Load Balancer HTTP Services now support `TimeoutIdle` + +A timeout for HTTP connections can now be set with `--http-timeout-idle` while creating or updating Load Balancer services. + +See the [changelog](https://docs.hetzner.cloud/changelog#2026-04-30-load-balancers-http-idle-timeout-can-now-be-configured) for more information. + +### Features + +- **load-balancer**: support --http-timeout-idle flag (#1394) + ## [v1.64.1](https://github.com/hetznercloud/cli/releases/tag/v1.64.1) ### Bug Fixes diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/docs/reference/manual/hcloud_load-balancer_add-service.md new/hcloud-cli-1.65.0/docs/reference/manual/hcloud_load-balancer_add-service.md --- old/hcloud-cli-1.64.1/docs/reference/manual/hcloud_load-balancer_add-service.md 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/docs/reference/manual/hcloud_load-balancer_add-service.md 2026-05-21 14:14:58.000000000 +0200 @@ -26,6 +26,7 @@ --http-cookie-name string Sticky Sessions: Cookie Name we set --http-redirect-http Redirect all traffic on port 80 to port 443 (true, false) --http-sticky-sessions Enable Sticky Sessions (true, false) + --http-timeout-idle duration Idle timeout for HTTP connections (30s-300s) --listen-port int Listen port of the service --protocol string Protocol of the service (required) --proxy-protocol Enable proxyprotocol (true, false) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/docs/reference/manual/hcloud_load-balancer_update-service.md new/hcloud-cli-1.65.0/docs/reference/manual/hcloud_load-balancer_update-service.md --- old/hcloud-cli-1.64.1/docs/reference/manual/hcloud_load-balancer_update-service.md 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/docs/reference/manual/hcloud_load-balancer_update-service.md 2026-05-21 14:14:58.000000000 +0200 @@ -26,6 +26,7 @@ --http-cookie-name string Sticky Sessions: Cookie Name which will be set --http-redirect-http Enable or disable redirect all traffic on port 80 to port 443 (true, false) --http-sticky-sessions Enable or disable (with --http-sticky-sessions=false) Sticky Sessions (true, false) + --http-timeout-idle duration Idle timeout for HTTP connections (30s-300s) --listen-port int The listen port of the service that you want to update (required) --protocol string The protocol to use for load balancing traffic --proxy-protocol Enable or disable (with --proxy-protocol=false) Proxy Protocol (true, false) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/go.mod new/hcloud-cli-1.65.0/go.mod --- old/hcloud-cli-1.64.1/go.mod 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/go.mod 2026-05-21 14:14:58.000000000 +0200 @@ -2,7 +2,7 @@ go 1.25.0 -toolchain go1.26.2 +toolchain go1.26.3 require ( github.com/BurntSushi/toml v1.6.0 @@ -12,7 +12,7 @@ github.com/fatih/structs v1.1.0 github.com/goccy/go-yaml v1.19.2 github.com/guptarohit/asciigraph v0.9.0 - github.com/hetznercloud/hcloud-go/v2 v2.39.0 + github.com/hetznercloud/hcloud-go/v2 v2.40.0 github.com/jedib0t/go-pretty/v6 v6.7.10 github.com/spf13/cast v1.10.0 github.com/spf13/cobra v1.10.2 @@ -21,11 +21,11 @@ github.com/stretchr/testify v1.11.1 github.com/swaggest/assertjson v1.10.0 go.uber.org/mock v0.6.0 - golang.org/x/crypto v0.50.0 - golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f - golang.org/x/net v0.53.0 - golang.org/x/term v0.42.0 - golang.org/x/text v0.36.0 + golang.org/x/crypto v0.51.0 + golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a + golang.org/x/net v0.54.0 + golang.org/x/term v0.43.0 + golang.org/x/text v0.37.0 ) require ( @@ -59,7 +59,7 @@ github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/sys v0.43.0 // indirect + golang.org/x/sys v0.44.0 // indirect google.golang.org/protobuf v1.36.8 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/go.sum new/hcloud-cli-1.65.0/go.sum --- old/hcloud-cli-1.64.1/go.sum 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/go.sum 2026-05-21 14:14:58.000000000 +0200 @@ -37,8 +37,8 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/guptarohit/asciigraph v0.9.0 h1:MvCSRRVkT2XvU1IO6n92o7l7zqx1DiFaoszOUZQztbY= github.com/guptarohit/asciigraph v0.9.0/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= -github.com/hetznercloud/hcloud-go/v2 v2.39.0 h1:01t0YWSHMAWK6kLXSpFjmNSmHP9GYNdtcnvWpK4MReA= -github.com/hetznercloud/hcloud-go/v2 v2.39.0/go.mod h1:BHmbGdh59t0CazoUEFvbdp6PyV+gwnF0fl9D4Bdgqq0= +github.com/hetznercloud/hcloud-go/v2 v2.40.0 h1:fuP7khfiDQAIXdKyQq7f3LnnOjyZg0PXTafXjUKkqIA= +github.com/hetznercloud/hcloud-go/v2 v2.40.0/go.mod h1:ANz38eerXjPv00dm9dckKhttOGtYeeGmjjvwL5e6c5E= github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -119,19 +119,19 @@ go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= -golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= -golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f h1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM= -golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f/go.mod h1:J1xhfL/vlindoeF/aINzNzt2Bket5bjo9sdOYzOsU80= -golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= -golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= +golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a h1:+3jdDGGB8NGb1Zktc737jlt3/A5f6UlwSzmvqUuufxw= +golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a/go.mod h1:d2fgXJLVs4dYDHUk5lwMIfzRzSrWCfGZb0ZqeLa/Vcw= +golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= -golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= -golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= -golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= +golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/all/list.go new/hcloud-cli-1.65.0/internal/cmd/all/list.go --- old/hcloud-cli-1.64.1/internal/cmd/all/list.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/all/list.go 2026-05-21 14:14:58.000000000 +0200 @@ -98,7 +98,6 @@ // Start all requests in parallel in order to minimize response time for i, lc := range cmds { - i, lc := i, lc ch := make(chan response) responseChs[i] = ch diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/cmpl/suggestions_test.go new/hcloud-cli-1.65.0/internal/cmd/cmpl/suggestions_test.go --- old/hcloud-cli-1.64.1/internal/cmd/cmpl/suggestions_test.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/cmpl/suggestions_test.go 2026-05-21 14:14:58.000000000 +0200 @@ -31,7 +31,6 @@ } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { f := cmpl.SuggestCandidates(tt.cs...) sug, d := f(nil, nil, tt.toComplete) @@ -94,7 +93,6 @@ } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { f := cmpl.SuggestArgs(tt.vfs...) sug, d := f(nil, tt.args, "") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/loadbalancer/add_service.go new/hcloud-cli-1.65.0/internal/cmd/loadbalancer/add_service.go --- old/hcloud-cli-1.64.1/internal/cmd/loadbalancer/add_service.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/loadbalancer/add_service.go 2026-05-21 14:14:58.000000000 +0200 @@ -34,6 +34,7 @@ cmd.Flags().Duration("http-cookie-lifetime", 0, "Sticky Sessions: Lifetime of the cookie") cmd.Flags().StringSlice("http-certificates", []string{}, "IDs or names of Certificates which should be attached to this Load Balancer") cmd.Flags().Bool("http-redirect-http", false, "Redirect all traffic on port 80 to port 443 (true, false)") + cmd.Flags().Duration("http-timeout-idle", 0, "Idle timeout for HTTP connections (30s-300s)") cmd.Flags().String("health-check-protocol", "", "The protocol the health check is performed over") cmd.Flags().Int("health-check-port", 0, "The port the health check is performed over") @@ -91,6 +92,7 @@ httpCookieName, _ := cmd.Flags().GetString("http-cookie-name") httpCookieLifetime, _ := cmd.Flags().GetDuration("http-cookie-lifetime") httpRedirect, _ := cmd.Flags().GetBool("http-redirect-http") + httpTimeoutIdle, _ := cmd.Flags().GetDuration("http-timeout-idle") loadBalancer, _, err := s.Client().LoadBalancer().Get(s, idOrName) if err != nil { @@ -123,6 +125,10 @@ if httpCookieLifetime != 0 { opts.HTTP.CookieLifetime = &httpCookieLifetime } + if httpTimeoutIdle != 0 { + opts.HTTP.TimeoutIdle = &httpTimeoutIdle + } + for _, idOrName := range httpCertificates { cert, _, err := s.Client().Certificate().Get(s, idOrName) if err != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/loadbalancer/add_service_test.go new/hcloud-cli-1.65.0/internal/cmd/loadbalancer/add_service_test.go --- old/hcloud-cli-1.64.1/internal/cmd/loadbalancer/add_service_test.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/loadbalancer/add_service_test.go 2026-05-21 14:14:58.000000000 +0200 @@ -31,6 +31,7 @@ HTTP: &hcloud.LoadBalancerAddServiceOptsHTTP{ StickySessions: hcloud.Ptr(false), RedirectHTTP: hcloud.Ptr(false), + TimeoutIdle: hcloud.Ptr(60 * time.Second), }, Proxyprotocol: hcloud.Ptr(false), }). @@ -39,7 +40,7 @@ WaitForActions(gomock.Any(), gomock.Any(), &hcloud.Action{ID: 123}). Return(nil) - out, errOut, err := fx.Run(cmd, []string{"123", "--protocol", "http", "--listen-port", "80", "--destination-port", "8080"}) + out, errOut, err := fx.Run(cmd, []string{"123", "--protocol", "http", "--listen-port", "80", "--destination-port", "8080", "--http-timeout-idle", "60s"}) expOut := "Service was added to Load Balancer 123\n" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/loadbalancer/describe.go new/hcloud-cli-1.65.0/internal/cmd/loadbalancer/describe.go --- old/hcloud-cli-1.64.1/internal/cmd/loadbalancer/describe.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/loadbalancer/describe.go 2026-05-21 14:14:58.000000000 +0200 @@ -76,6 +76,7 @@ fmt.Fprintf(out, " Destination Port:\t%d\n", service.DestinationPort) fmt.Fprintf(out, " Proxy Protocol:\t%s\n", util.YesNo(service.Proxyprotocol)) if service.Protocol != hcloud.LoadBalancerServiceProtocolTCP { + fmt.Fprintf(out, " Timeout Idle:\t%vs\n", service.HTTP.TimeoutIdle.Seconds()) fmt.Fprintf(out, " Sticky Sessions:\t%s\n", util.YesNo(service.HTTP.StickySessions)) if service.HTTP.StickySessions { fmt.Fprintf(out, " Sticky Cookie Name:\t%s\n", service.HTTP.CookieName) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/loadbalancer/describe_test.go new/hcloud-cli-1.65.0/internal/cmd/loadbalancer/describe_test.go --- old/hcloud-cli-1.64.1/internal/cmd/loadbalancer/describe_test.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/loadbalancer/describe_test.go 2026-05-21 14:14:58.000000000 +0200 @@ -51,6 +51,35 @@ Algorithm: hcloud.LoadBalancerAlgorithm{ Type: hcloud.LoadBalancerAlgorithmTypeLeastConnections, }, + Services: []hcloud.LoadBalancerService{ + { + Protocol: hcloud.LoadBalancerServiceProtocolHTTP, + ListenPort: 80, + DestinationPort: 8080, + Proxyprotocol: true, + HTTP: hcloud.LoadBalancerServiceHTTP{ + TimeoutIdle: 60 * time.Second, + StickySessions: true, + CookieName: "my-cookie", + CookieLifetime: 5 * time.Minute, + RedirectHTTP: true, + }, + HealthCheck: hcloud.LoadBalancerServiceHealthCheck{ + Protocol: hcloud.LoadBalancerServiceProtocolHTTP, + Port: 8080, + Timeout: 10 * time.Second, + Interval: 15 * time.Second, + Retries: 3, + HTTP: &hcloud.LoadBalancerServiceHealthCheckHTTP{ + Domain: "example.com", + Path: "/health", + Response: "OK", + StatusCodes: []string{"200", "201"}, + TLS: true, + }, + }, + }, + }, IncludedTraffic: 20 * util.Tebibyte, IngoingTraffic: 10 * util.Tebibyte, OutgoingTraffic: 10 * util.Tebibyte, @@ -87,7 +116,24 @@ Max assigned Certificates: 10 Services: - No services + - Protocol: http + Listen Port: 80 + Destination Port: 8080 + Proxy Protocol: yes + Timeout Idle: 60s + Sticky Sessions: yes + Sticky Cookie Name: my-cookie + Sticky Cookie Lifetime: 300s + Health Check: + Protocol: http + Timeout: 10s + Interval: every 15s + Retries: 3 + HTTP Domain: example.com + HTTP Path: /health + Response: OK + TLS: yes + Status Codes: [200 201] Targets: No targets diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/loadbalancer/metrics.go new/hcloud-cli-1.65.0/internal/cmd/loadbalancer/metrics.go --- old/hcloud-cli-1.64.1/internal/cmd/loadbalancer/metrics.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/loadbalancer/metrics.go 2026-05-21 14:14:58.000000000 +0200 @@ -99,7 +99,7 @@ } switch { case outputFlags.IsSet("json") || outputFlags.IsSet("yaml"): - var schema map[string]interface{} + var schema map[string]any if err := json.NewDecoder(resp.Body).Decode(&schema); err != nil { return err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/loadbalancer/update_service.go new/hcloud-cli-1.65.0/internal/cmd/loadbalancer/update_service.go --- old/hcloud-cli-1.64.1/internal/cmd/loadbalancer/update_service.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/loadbalancer/update_service.go 2026-05-21 14:14:58.000000000 +0200 @@ -36,6 +36,7 @@ cmd.Flags().String("http-cookie-name", "", "Sticky Sessions: Cookie Name which will be set") cmd.Flags().Duration("http-cookie-lifetime", 0, "Sticky Sessions: Lifetime of the cookie") cmd.Flags().StringSlice("http-certificates", []string{}, "IDs or names of Certificates which should be attached to this Load Balancer") + cmd.Flags().Duration("http-timeout-idle", 0, "Idle timeout for HTTP connections (30s-300s)") cmd.Flags().String("health-check-protocol", "", "The protocol the health check is performed over") cmd.Flags().Int("health-check-port", 0, "The port the health check is performed over") @@ -103,6 +104,10 @@ cookieLifetime, _ := cmd.Flags().GetDuration("http-cookie-lifetime") opts.HTTP.CookieLifetime = &cookieLifetime } + if cmd.Flag("http-timeout-idle").Changed { + timeoutIdle, _ := cmd.Flags().GetDuration("http-timeout-idle") + opts.HTTP.TimeoutIdle = &timeoutIdle + } if cmd.Flag("http-certificates").Changed { certificates, _ := cmd.Flags().GetStringSlice("http-certificates") for _, idOrName := range certificates { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/loadbalancer/update_service_test.go new/hcloud-cli-1.65.0/internal/cmd/loadbalancer/update_service_test.go --- old/hcloud-cli-1.64.1/internal/cmd/loadbalancer/update_service_test.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/loadbalancer/update_service_test.go 2026-05-21 14:14:58.000000000 +0200 @@ -37,6 +37,7 @@ CookieName: hcloud.Ptr("test"), CookieLifetime: hcloud.Ptr(10 * time.Minute), Certificates: []*hcloud.Certificate{{ID: 1}}, + TimeoutIdle: hcloud.Ptr(60 * time.Second), }, HealthCheck: &hcloud.LoadBalancerUpdateServiceOptsHealthCheck{ Protocol: hcloud.LoadBalancerServiceProtocolTCP, @@ -69,6 +70,7 @@ "--http-cookie-name", "test", "--http-cookie-lifetime", "10m", "--http-certificates", "1", + "--http-timeout-idle", "60s", "--health-check-protocol", "tcp", "--health-check-port", "8080", "--health-check-interval", "10s", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/output/output.go new/hcloud-cli-1.65.0/internal/cmd/output/output.go --- old/hcloud-cli-1.64.1/internal/cmd/output/output.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/output/output.go 2026-05-21 14:14:58.000000000 +0200 @@ -97,7 +97,7 @@ } if len(parts) > 1 && validOptions[parts[0]] != nil { parts[1] = strings.ToLower(strings.TrimSpace(parts[1])) - for _, v := range strings.Split(parts[1], ",") { + for v := range strings.SplitSeq(parts[1], ",") { if !validOptions[parts[0]][v] { return fmt.Errorf("invalid value for output option %s: %s", parts[0], v) } @@ -225,7 +225,7 @@ // AddAllowedFields reads all first level fieldnames of the struct and allows them to be used. func (o *Table[T]) AddAllowedFields(obj T) *Table[T] { v := reflect.ValueOf(obj) - if v.Kind() == reflect.Ptr { + if v.Kind() == reflect.Pointer { v = v.Elem() } if v.Kind() != reflect.Struct { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/output/output_test.go new/hcloud-cli-1.65.0/internal/cmd/output/output_test.go --- old/hcloud-cli-1.64.1/internal/cmd/output/output_test.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/output/output_test.go 2026-05-21 14:14:58.000000000 +0200 @@ -44,7 +44,7 @@ }) t.Run("AddFieldOutputFn", func(t *testing.T) { - to.AddFieldFn("leeroy jenkins", func(interface{}) string { + to.AddFieldFn("leeroy jenkins", func(any) string { return "LEEROY JENKINS!!!" }) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/server/metrics.go new/hcloud-cli-1.65.0/internal/cmd/server/metrics.go --- old/hcloud-cli-1.64.1/internal/cmd/server/metrics.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/server/metrics.go 2026-05-21 14:14:58.000000000 +0200 @@ -97,7 +97,7 @@ } switch { case outputFlags.IsSet("json") || outputFlags.IsSet("yaml"): - var schema map[string]interface{} + var schema map[string]any if err := json.NewDecoder(resp.Body).Decode(&schema); err != nil { return err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/server/reset_password.go new/hcloud-cli-1.65.0/internal/cmd/server/reset_password.go --- old/hcloud-cli-1.64.1/internal/cmd/server/reset_password.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/server/reset_password.go 2026-05-21 14:14:58.000000000 +0200 @@ -47,7 +47,7 @@ } if outputFlags.IsSet("json") || outputFlags.IsSet("yaml") { - schema := make(map[string]interface{}) + schema := make(map[string]any) schema["root_password"] = result.RootPassword if outputFlags.IsSet("json") { return util.DescribeJSON(cmd.OutOrStdout(), schema) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/storagebox/describe_test.go new/hcloud-cli-1.65.0/internal/cmd/storagebox/describe_test.go --- old/hcloud-cli-1.64.1/internal/cmd/storagebox/describe_test.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/storagebox/describe_test.go 2026-05-21 14:14:58.000000000 +0200 @@ -154,8 +154,8 @@ Subaccounts Limit: 200 Deprecation: - Announced: 2023-06-01 00:00:00 UTC (2 years ago) - Unavailable After: 2023-09-01 00:00:00 UTC (2 years ago) + Announced: 2023-06-01 00:00:00 UTC (%s) + Unavailable After: 2023-09-01 00:00:00 UTC (%s) Location: ID: 42 @@ -166,7 +166,10 @@ City: Falkenstein Latitude: 50.476120 Longitude: 12.370071 -`, humanize.Time(storageBox.Created)) +`, + humanize.Time(storageBox.Created), + humanize.Time(storageBox.StorageBoxType.Deprecation.Announced), + humanize.Time(storageBox.StorageBoxType.Deprecation.UnavailableAfter)) require.NoError(t, err) assert.Empty(t, errOut) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/util/util.go new/hcloud-cli-1.65.0/internal/cmd/util/util.go --- old/hcloud-cli-1.64.1/internal/cmd/util/util.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/util/util.go 2026-05-21 14:14:58.000000000 +0200 @@ -173,7 +173,7 @@ return prefix + strings.ReplaceAll(text, "\n", "\n"+prefix) + tail } -func DescribeFormat(w io.Writer, object interface{}, format string) error { +func DescribeFormat(w io.Writer, object any, format string) error { if !strings.HasSuffix(format, "\n") { format += "\n" } @@ -184,13 +184,13 @@ return t.Execute(w, object) } -func DescribeJSON(w io.Writer, object interface{}) error { +func DescribeJSON(w io.Writer, object any) error { enc := json.NewEncoder(w) enc.SetIndent("", " ") return enc.Encode(object) } -func DescribeYAML(w io.Writer, object interface{}) error { +func DescribeYAML(w io.Writer, object any) error { enc := yaml.NewEncoder(w) return enc.Encode(object) } @@ -246,7 +246,7 @@ } val := reflect.ValueOf(v) switch val.Kind() { - case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Pointer, reflect.Slice: return val.IsNil() default: return false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/util/util_test.go new/hcloud-cli-1.65.0/internal/cmd/util/util_test.go --- old/hcloud-cli-1.64.1/internal/cmd/util/util_test.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/util/util_test.go 2026-05-21 14:14:58.000000000 +0200 @@ -89,7 +89,6 @@ } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { actual := util.ExactlyOneSet(tt.s, tt.ss...) if tt.expected != actual { @@ -145,7 +144,6 @@ } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { actual := util.Age(tt.t, tt.now) if tt.expected != actual { @@ -236,7 +234,7 @@ } func TestWrap(t *testing.T) { - wrapped := util.Wrap("json", map[string]interface{}{ + wrapped := util.Wrap("json", map[string]any{ "foo": "bar", }) jsonString, err := json.Marshal(wrapped) @@ -280,7 +278,7 @@ assert.True(t, util.IsNil((map[int]int)(nil))) assert.True(t, util.IsNil(([]int)(nil))) assert.True(t, util.IsNil((func())(nil))) - assert.True(t, util.IsNil((interface{})(nil))) + assert.True(t, util.IsNil((any)(nil))) assert.True(t, util.IsNil((error)(nil))) assert.False(t, util.IsNil(0)) assert.False(t, util.IsNil("")) @@ -292,7 +290,7 @@ type testStruct struct { a, b, c int //nolint:unused } - assert.Equal(t, []interface{}{0, ""}, util.FilterNil([]interface{}{0, nil, ""})) + assert.Equal(t, []any{0, ""}, util.FilterNil([]any{0, nil, ""})) assert.Equal(t, []*testStruct{{1, 2, 3}, {}}, util.FilterNil([]*testStruct{{1, 2, 3}, nil, {}, (*testStruct)(nil)})) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/util/validation_test.go new/hcloud-cli-1.65.0/internal/cmd/util/validation_test.go --- old/hcloud-cli-1.64.1/internal/cmd/util/validation_test.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/util/validation_test.go 2026-05-21 14:14:58.000000000 +0200 @@ -87,7 +87,6 @@ } for _, test := range tests { - test := test t.Run(test.name, func(t *testing.T) { stdout, stderr, err := testutil.CaptureOutStreams(func() error { cmd := &cobra.Command{Use: test.use} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/zone/describe.go new/hcloud-cli-1.65.0/internal/cmd/zone/describe.go --- old/hcloud-cli-1.64.1/internal/cmd/zone/describe.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/zone/describe.go 2026-05-21 14:14:58.000000000 +0200 @@ -18,7 +18,7 @@ ResourceNameSingular: "Zone", ShortDescription: "Describe a Zone", NameSuggestions: func(c hcapi2.Client) func() []string { return c.Zone().Names }, - Fetch: func(s state.State, _ *cobra.Command, idOrName string) (*hcloud.Zone, interface{}, error) { + Fetch: func(s state.State, _ *cobra.Command, idOrName string) (*hcloud.Zone, any, error) { idOrName, err := util.ParseZoneIDOrName(idOrName) if err != nil { return nil, nil, fmt.Errorf("failed to convert Zone name to ascii: %w", err) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/cmd/zone/rrset/describe.go new/hcloud-cli-1.65.0/internal/cmd/zone/rrset/describe.go --- old/hcloud-cli-1.64.1/internal/cmd/zone/rrset/describe.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/cmd/zone/rrset/describe.go 2026-05-21 14:14:58.000000000 +0200 @@ -18,7 +18,7 @@ ShortDescription: "Describe a Zone RRSet", PositionalArgumentOverride: []string{"zone", "name", "type"}, ValidArgsFunction: rrsetArgumentsCompletionFuncs, - FetchWithArgs: func(s state.State, _ *cobra.Command, args []string) (*hcloud.ZoneRRSet, interface{}, error) { + FetchWithArgs: func(s state.State, _ *cobra.Command, args []string) (*hcloud.ZoneRRSet, any, error) { zoneIDOrName, rrsetName, rrsetType := args[0], args[1], args[2] zoneIDOrName, err := util.ParseZoneIDOrName(zoneIDOrName) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/state/config/config.go new/hcloud-cli-1.65.0/internal/state/config/config.go --- old/hcloud-cli-1.64.1/internal/state/config/config.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/state/config/config.go 2026-05-21 14:14:58.000000000 +0200 @@ -154,7 +154,7 @@ // We don't use viper.Set here because of the value hierarchy. We want the env and flags to // be able to override the currently active context. viper.Set would take precedence over // env and flags. - err = cfg.v.ReadConfig(bytes.NewReader([]byte(fmt.Sprintf("context = %q\n", cfg.schema.ActiveContext)))) + err = cfg.v.ReadConfig(bytes.NewReader(fmt.Appendf(nil, "context = %q\n", cfg.schema.ActiveContext))) if err != nil { return err } @@ -192,7 +192,7 @@ // Merge token into viper // We use viper.MergeConfig here for the same reason as above, except for // that we merge the config instead of replacing it. - if err = cfg.v.MergeConfig(bytes.NewReader([]byte(fmt.Sprintf(`token = "%s"`, cfg.activeContext.ContextToken)))); err != nil { + if err = cfg.v.MergeConfig(bytes.NewReader(fmt.Appendf(nil, `token = "%s"`, cfg.activeContext.ContextToken))); err != nil { return err } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/internal/version/version.go new/hcloud-cli-1.65.0/internal/version/version.go --- old/hcloud-cli-1.64.1/internal/version/version.go 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/internal/version/version.go 2026-05-21 14:14:58.000000000 +0200 @@ -4,7 +4,7 @@ var ( // version is a semver version (https://semver.org). - version = "1.64.1" // x-releaser-pleaser-version + version = "1.65.0" // x-releaser-pleaser-version // versionPrerelease is a semver version pre-release identifier (https://semver.org). // diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.64.1/mise.toml new/hcloud-cli-1.65.0/mise.toml --- old/hcloud-cli-1.64.1/mise.toml 2026-04-28 16:04:59.000000000 +0200 +++ new/hcloud-cli-1.65.0/mise.toml 2026-05-21 14:14:58.000000000 +0200 @@ -1,7 +1,7 @@ [tools] -go = "1.26.2" +go = "1.26.3" "go:go.uber.org/mock/mockgen" = "v0.6.0" -"github:golangci/golangci-lint" = "2.11.4" +"github:golangci/golangci-lint" = "2.12.2" "github:goreleaser/goreleaser" = "v2.15.4" "github:anchore/quill" = "v0.7.1" "github:jstemmer/go-junit-report" = "v2.1.0" ++++++ hcloud-cli.obsinfo ++++++ --- /var/tmp/diff_new_pack.PXsW3f/_old 2026-05-21 18:34:24.584023524 +0200 +++ /var/tmp/diff_new_pack.PXsW3f/_new 2026-05-21 18:34:24.624025186 +0200 @@ -1,5 +1,5 @@ name: hcloud-cli -version: 1.64.1 -mtime: 1777385099 -commit: fbfa512ee92a876c839357a01b9b49849eca8c74 +version: 1.65.0 +mtime: 1779365698 +commit: a9f3077b036d9145ef75e17b51483fa4481c0a9f ++++++ vendor.tar.gz ++++++ ++++ 39661 lines of diff (skipped)
