Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package stackit-cli for openSUSE:Factory checked in at 2026-10-24 22:04:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/stackit-cli (Old) and /work/SRC/openSUSE:Factory/.stackit-cli.new.2252680 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "stackit-cli" Sat Oct 24 22:04:53 2026 rev:49 rq:1392192 version:0.76.0 Changes: -------- --- /work/SRC/openSUSE:Factory/stackit-cli/stackit-cli.changes 2026-10-17 21:26:45.340267697 +0200 +++ /work/SRC/openSUSE:Factory/.stackit-cli.new.2252680/stackit-cli.changes 2026-10-24 22:06:43.662892550 +0200 @@ -1,0 +2,40 @@ +Fri Oct 23 15:56:45 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 0.76.0: + * chore(deps): bump + github.com/stackitcloud/stackit-sdk-go/services/mariadb (#1688) + * chore(deps): bump + github.com/stackitcloud/stackit-sdk-go/services/resourcemanager + (#1687) + * feat(cli): bump golang version from 1.26.0 to 1.26.10 (#1694) + * chore(deps): bump goreleaser/goreleaser-action from 7.2.3 to + 7.3.0 (#1686) + * chore(deps): bump + github.com/stackitcloud/stackit-sdk-go/services/logme (#1685) + * chore(deps): bump + github.com/stackitcloud/stackit-sdk-go/services/edge (#1684) + * chore(deps): bump + github.com/stackitcloud/stackit-sdk-go/services/serviceenablement + (#1683) + * chore(deps): bump + github.com/stackitcloud/stackit-sdk-go/services/redis (#1682) + * chore(deps): bump + github.com/stackitcloud/stackit-sdk-go/services/iaas (#1681) + * feat(auth): add no browser open flag to login (#1602) + * feat(printer): add Noticef and Noticeln methods to printer + (#1675) + * chore(deps): bump + github.com/stackitcloud/stackit-sdk-go/services/authorization + (#1676) + * chore(deps): bump + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer + (#1677) + * chore(deps): bump + github.com/stackitcloud/stackit-sdk-go/services/dns (#1678) + * chore(deps): bump + github.com/stackitcloud/stackit-sdk-go/services/runcommand + (#1679) + * feat(iaas): support description field for network and network + area cmds (#1673) + +------------------------------------------------------------------- Old: ---- stackit-cli-0.75.0.obscpio New: ---- stackit-cli-0.76.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ stackit-cli.spec ++++++ --- /var/tmp/diff_new_pack.rNW8P2/_old 2026-10-24 22:06:45.705978538 +0200 +++ /var/tmp/diff_new_pack.rNW8P2/_new 2026-10-24 22:06:45.708978664 +0200 @@ -19,7 +19,7 @@ %define executable_name stackit Name: stackit-cli -Version: 0.75.0 +Version: 0.76.0 Release: 0 Summary: A command-line interface to manage STACKIT resources License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.rNW8P2/_old 2026-10-24 22:06:45.789982073 +0200 +++ /var/tmp/diff_new_pack.rNW8P2/_new 2026-10-24 22:06:45.800982536 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/stackitcloud/stackit-cli.git</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">refs/tags/v0.75.0</param> + <param name="revision">refs/tags/v0.76.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.rNW8P2/_old 2026-10-24 22:06:45.865985272 +0200 +++ /var/tmp/diff_new_pack.rNW8P2/_new 2026-10-24 22:06:45.876985735 +0200 @@ -3,6 +3,6 @@ <param name="url">https://github.com/stackitcloud/stackit-cli/</param> <param name="changesrevision">f388e861e2815ed9163cbcbe22088cd7e27f9cc5</param></service><service name="tar_scm"> <param name="url">https://github.com/stackitcloud/stackit-cli.git</param> - <param name="changesrevision">f02071216a078f1d3fd9cc1e53e0fb839ed3f3f8</param></service></servicedata> + <param name="changesrevision">5040102b0c4122e36cb4989602186f6b0b9822f9</param></service></servicedata> (No newline at EOF) ++++++ stackit-cli-0.75.0.obscpio -> stackit-cli-0.76.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/docs/stackit_auth_login.md new/stackit-cli-0.76.0/docs/stackit_auth_login.md --- old/stackit-cli-0.75.0/docs/stackit_auth_login.md 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/docs/stackit_auth_login.md 2026-10-22 09:35:59.000000000 +0200 @@ -21,9 +21,10 @@ ### Options ``` - -h, --help Help for "stackit auth login" - --port int The port on which the callback server will listen to. By default, it tries to bind a port between 8000 and 8020. - When a value is specified, it will only try to use the specified port. Valid values are within the range of 8000 to 8020. + -h, --help Help for "stackit auth login" + --no-browser-open If set, does not open the browser automatically but only prints the URL to the terminal + --port int The port on which the callback server will listen to. By default, it tries to bind a port between 8000 and 8020. + When a value is specified, it will only try to use the specified port. Valid values are within the range of 8000 to 8020. ``` ### Options inherited from parent commands diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/docs/stackit_network_create.md new/stackit-cli-0.76.0/docs/stackit_network_create.md --- old/stackit-cli-0.75.0/docs/stackit_network_create.md 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/docs/stackit_network_create.md 2026-10-22 09:35:59.000000000 +0200 @@ -16,6 +16,9 @@ Create a network with name "network-1" $ stackit network create --name network-1 + Create a network with name "network-1" and a description + $ stackit network create --name network-1 --description "My network" + Create a non-routed network with name "network-1" $ stackit network create --name network-1 --non-routed @@ -38,6 +41,7 @@ ### Options ``` + --description string Description of the network (up to 255 characters) -h, --help Help for "stackit network create" --ipv4-dns-name-servers strings List of DNS name servers for IPv4. Nameservers cannot be defined for routed networks --ipv4-gateway string The IPv4 gateway of a network. If not specified, the first IP of the network will be assigned as the gateway diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/docs/stackit_network_update.md new/stackit-cli-0.76.0/docs/stackit_network_update.md --- old/stackit-cli-0.75.0/docs/stackit_network_update.md 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/docs/stackit_network_update.md 2026-10-22 09:35:59.000000000 +0200 @@ -16,6 +16,12 @@ Update network with ID "xxx" with new name "network-1-new" $ stackit network update xxx --name network-1-new + Update the description of network with ID "xxx" + $ stackit network update xxx --description "My network" + + Clear the description of network with ID "xxx" + $ stackit network update xxx --description "" + Update network with ID "xxx" with no gateway $ stackit network update --no-ipv4-gateway @@ -32,6 +38,7 @@ ### Options ``` + --description string Description of the network (up to 255 characters). Use an empty string to clear it -h, --help Help for "stackit network update" --ipv4-dns-name-servers strings List of DNS name servers IPv4. Nameservers cannot be defined for routed networks --ipv4-gateway string The IPv4 gateway of a network. If not specified, the first IP of the network will be assigned as the gateway diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/go.mod new/stackit-cli-0.76.0/go.mod --- old/stackit-cli-0.75.0/go.mod 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/go.mod 2026-10-22 09:35:59.000000000 +0200 @@ -1,6 +1,6 @@ module github.com/stackitcloud/stackit-cli -go 1.26.0 +go 1.26.10 require ( github.com/fatih/color v1.19.0 @@ -18,25 +18,25 @@ github.com/stackitcloud/stackit-sdk-go/core v0.27.1 github.com/stackitcloud/stackit-sdk-go/services/alb v0.18.0 github.com/stackitcloud/stackit-sdk-go/services/albwaf v0.13.4 - github.com/stackitcloud/stackit-sdk-go/services/authorization v0.15.5 + github.com/stackitcloud/stackit-sdk-go/services/authorization v0.16.0 github.com/stackitcloud/stackit-sdk-go/services/automation v0.2.1 github.com/stackitcloud/stackit-sdk-go/services/cdn v1.21.0 - github.com/stackitcloud/stackit-sdk-go/services/dns v0.23.1 - github.com/stackitcloud/stackit-sdk-go/services/edge v0.13.2 + github.com/stackitcloud/stackit-sdk-go/services/dns v0.25.0 + github.com/stackitcloud/stackit-sdk-go/services/edge v0.14.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.14.1 - github.com/stackitcloud/stackit-sdk-go/services/iaas v1.14.5 + github.com/stackitcloud/stackit-sdk-go/services/iaas v1.15.1 github.com/stackitcloud/stackit-sdk-go/services/intake v0.12.0 github.com/stackitcloud/stackit-sdk-go/services/logs v0.10.2 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.13.0 github.com/stackitcloud/stackit-sdk-go/services/opensearch v1.5.0 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.15.0 - github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.26.1 - github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.10.2 + github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.27.0 + github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.11.0 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.19.1 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.7.3 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.6.0 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.20.1 - github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.7.2 + github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.8.0 github.com/stackitcloud/stackit-sdk-go/services/ske v1.21.2 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.18.1 github.com/stackitcloud/stackit-sdk-go/services/valkey v0.3.1 @@ -268,13 +268,13 @@ github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/stackitcloud/stackit-sdk-go/services/kms v1.14.0 - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.15.2 - github.com/stackitcloud/stackit-sdk-go/services/logme v1.4.0 - github.com/stackitcloud/stackit-sdk-go/services/mariadb v1.3.1 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.16.0 + github.com/stackitcloud/stackit-sdk-go/services/logme v1.5.0 + github.com/stackitcloud/stackit-sdk-go/services/mariadb v1.4.0 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.12.0 github.com/stackitcloud/stackit-sdk-go/services/observability v0.25.2 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v1.5.0 - github.com/stackitcloud/stackit-sdk-go/services/redis v1.5.0 + github.com/stackitcloud/stackit-sdk-go/services/redis v1.6.0 github.com/stackitcloud/stackit-sdk-go/services/sfs v0.11.3 github.com/subosito/gotenv v1.6.0 // indirect golang.org/x/sys v0.48.0 // indirect diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/go.sum new/stackit-cli-0.76.0/go.sum --- old/stackit-cli-0.75.0/go.sum 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/go.sum 2026-10-22 09:35:59.000000000 +0200 @@ -614,32 +614,32 @@ github.com/stackitcloud/stackit-sdk-go/services/alb v0.18.0/go.mod h1:zEx3JFbwg1VLB9uKa2P4BA2DdypghX1FT8mbJU+msjE= github.com/stackitcloud/stackit-sdk-go/services/albwaf v0.13.4 h1:KNEcAPj66Asb00V7f6v3Ku2d6ybP8PL1IwFQubUuxc0= github.com/stackitcloud/stackit-sdk-go/services/albwaf v0.13.4/go.mod h1:riXgEDfIjNdFjYk81zNnWt0npkv1+/P1iFRfFIt28Jo= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.15.5 h1:r4AkxPNdWeufZ4XaaXYK5dXJ5pzDTIZ5IqhvvjDIWpM= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.15.5/go.mod h1:J8YJeYIUWqyAh7pFEjOCT/r/hIxQ5iLf9v4Wjr/f8mE= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.16.0 h1:I4NJalm+y2hVk+NhK4nCW86U7i8kTkDqF89eFPReaxw= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.16.0/go.mod h1:J8YJeYIUWqyAh7pFEjOCT/r/hIxQ5iLf9v4Wjr/f8mE= github.com/stackitcloud/stackit-sdk-go/services/automation v0.2.1 h1:VxYQ4fCkuZAnzsqKXTSMxG8KX/OlfOgKJ0heB0Rf9gw= github.com/stackitcloud/stackit-sdk-go/services/automation v0.2.1/go.mod h1:pDhpbmeDlthML6h4jyI7ZRGrG2C4Tx3aIGru5Ts6ISo= github.com/stackitcloud/stackit-sdk-go/services/cdn v1.21.0 h1:lCs1eq/OOTdwGrrkxkJ8qCnS6yLM4XZhznpML3nd1NI= github.com/stackitcloud/stackit-sdk-go/services/cdn v1.21.0/go.mod h1:NBgvZH5ekJ2hFCNI480C9MdJsa4989YGC1YgX5ELA48= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.23.1 h1:6hm7oYJeR5Bu8d+PeCvVLWjUXh78pSfdsCTZ7lu5qdc= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.23.1/go.mod h1:t59gHqlbUzwV0yBuMHoUFQ8sOFXOYrhkNfneFolOHbY= -github.com/stackitcloud/stackit-sdk-go/services/edge v0.13.2 h1:UDkXmgOAlP3y/u7FKp6/MaVxvSi38hNqnj1HytM6bU4= -github.com/stackitcloud/stackit-sdk-go/services/edge v0.13.2/go.mod h1:hlUcPvOgH/CzZqH7u4SwV81qiismCVAtvw5pTAf6si4= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.25.0 h1:Yn4etadrdEEPU8YcbvF7a/UExSqri+jUC62w62ic4N8= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.25.0/go.mod h1:D0iv6XBYkaEwTjbBeom0VTZnwQMfwb48FC8R2jRg80c= +github.com/stackitcloud/stackit-sdk-go/services/edge v0.14.0 h1:TTwlI34FUb0AisiApxKs5brGNP3Ma9cTvdmbxzNxs40= +github.com/stackitcloud/stackit-sdk-go/services/edge v0.14.0/go.mod h1:FBBnDsQns6SjJYQrox3YSY7ydOa4T8FR3sXNwFRTsPc= github.com/stackitcloud/stackit-sdk-go/services/git v0.14.1 h1:7R5peSRer3Y83mfB6wcdCP0vhEjsq4myUdVhl24q6to= github.com/stackitcloud/stackit-sdk-go/services/git v0.14.1/go.mod h1:kz2pl17t9MNQx0+fNXg10ZAVfjmvOtsHB7VlAzu/Io8= -github.com/stackitcloud/stackit-sdk-go/services/iaas v1.14.5 h1:CVRo4/hCy6vLlh6LQjQikTDnh/0KF43nRhKsiicxyXc= -github.com/stackitcloud/stackit-sdk-go/services/iaas v1.14.5/go.mod h1:oJmNZY04vvjrQI+y91ZZWOQiCAREcCldkh6cib+YtP0= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.15.1 h1:5D0ABveu3SZyB7DBkVJcCSS4fr1TiMmfdJA98TgDn/o= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.15.1/go.mod h1:o6Mt/ZUB/3qvIwtu4B57m9IlyaUxAFS2Tu5XImiZxCE= github.com/stackitcloud/stackit-sdk-go/services/intake v0.12.0 h1:1RDIGabA3U/kWrV0vkbkTof075liEHMdn39BsNwDI4k= github.com/stackitcloud/stackit-sdk-go/services/intake v0.12.0/go.mod h1:+v3VG6bXopAB2/uRz5yDXNFUwMSw0qJVRPxb3SDsACM= github.com/stackitcloud/stackit-sdk-go/services/kms v1.14.0 h1:6vZhGEIEqXUcs6pzpVNsHRAcskAVuKRq9lNMCMlYn+Q= github.com/stackitcloud/stackit-sdk-go/services/kms v1.14.0/go.mod h1:ZBXRYWP4Yz3Gn75VSFz2mfcLSOrDEbiCoGTIXonvXkA= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.15.2 h1:a7zyn+0rRgaOTX+W9Ut037KckptGjNC978ArvsjKjfY= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.15.2/go.mod h1:bG7b8OjvqSUf8MTjmkt/RW92YyYhkDgwZ0Z7Y6Evr+c= -github.com/stackitcloud/stackit-sdk-go/services/logme v1.4.0 h1:sm6Xw4tnJvHguNoHBqndpMX3wwzNmQx2ZwvPsU03ass= -github.com/stackitcloud/stackit-sdk-go/services/logme v1.4.0/go.mod h1:88EgGOZDYkw31BPtuQsqhh2yqzF9ZfoggsP/cYz7+O0= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.16.0 h1:zcPGXu16E5NRp5ocF/0JTnm6AyAQmk61iqIlUpAbfgo= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.16.0/go.mod h1:tVD3LmpowgML5U3imG9DdGAjhLmccibO92Ta7DPNfc0= +github.com/stackitcloud/stackit-sdk-go/services/logme v1.5.0 h1:WFok0NMwTUTIZtClkYZW8M2mAkoQwyaIJD8hLltM+z8= +github.com/stackitcloud/stackit-sdk-go/services/logme v1.5.0/go.mod h1:88EgGOZDYkw31BPtuQsqhh2yqzF9ZfoggsP/cYz7+O0= github.com/stackitcloud/stackit-sdk-go/services/logs v0.10.2 h1:ZVOAS95S445ZUvXLjs4a+xL6kkxDm1bUHjDzYXwGbU4= github.com/stackitcloud/stackit-sdk-go/services/logs v0.10.2/go.mod h1:euyZx4EqA2N7lVrC/wWxdCKalZmnY5zjfrjouNkGycA= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v1.3.1 h1:FZJLUhHVrlrfFnI5VqAx0dOEcTZpMi/vnk/MxkzTkJI= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v1.3.1/go.mod h1:P1HFWSmuy2i1WA0PhcDfGsa0CRcbGTE+wDb1iEAL8/E= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v1.4.0 h1:LFpdvASJnTv5Y/PEfwgK0pn7ixXLgcUmLt2cRTg979g= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v1.4.0/go.mod h1:GpFHOEVEq+Pog9dWPMvGeF4mEvB+MVLIRh3/jB1isUI= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.13.0 h1:+7cw7kFNw2dZ3opWDusuW+GC+3lwf8mjpHtIvi2+wqs= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.13.0/go.mod h1:yNxGU6mwDzXX82/QfgxRzg2M3+ktVNKS1qPzT01QIi0= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.12.0 h1:IIvEF3DBLuPF38vvBfKWKaOTWKH9NjTpybd1pfAymb0= @@ -652,12 +652,12 @@ github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.15.0/go.mod h1:7Ka8vrinx+DjCXv6lqCVZbIkDIbrzA4qrkNjXr6MUDM= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v1.5.0 h1:SAro5TWVJDDyiqMwew9Ta1tMcItBmWrCRYErIQ9+UBI= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v1.5.0/go.mod h1:mjYkyr/A/+9rZnX5IOLEoAMFqHsRCIToZWpsYzYBwWo= -github.com/stackitcloud/stackit-sdk-go/services/redis v1.5.0 h1:+6TwnEoyqED1AgbWsBUkP1iOAg3fXfUqXCsjHqfKeQ4= -github.com/stackitcloud/stackit-sdk-go/services/redis v1.5.0/go.mod h1:/wE98YN+s1s1OcaEPt8Z2xO0Y46Gur3nXlg1AiiMNeY= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.26.1 h1:6NHoXh6c/GQ7+CO03bszc09rnKCeP0dzMmyrnz6mkvs= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.26.1/go.mod h1:IsId3wbkp5oaO0JEaHZpZnbVW6KFHlAptwB+1iG3v3w= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.10.2 h1:YpTj2lU0sKe7a1mBH9LW30wUijxZZ1z246a7V40zHDc= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.10.2/go.mod h1:KQLunYwad9IhSbnXuhkKAldVG9LNxCzIYHR8vMJlKQI= +github.com/stackitcloud/stackit-sdk-go/services/redis v1.6.0 h1:5UEPilI+RCuXEM8jm4ibREoZAsSAGI1+KnJ0oapye7Q= +github.com/stackitcloud/stackit-sdk-go/services/redis v1.6.0/go.mod h1:/wE98YN+s1s1OcaEPt8Z2xO0Y46Gur3nXlg1AiiMNeY= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.27.0 h1:lZl9X/wl0tF+HufZiurUkYJmk4u6/Vz8/FkdgT3wA10= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.27.0/go.mod h1:IsId3wbkp5oaO0JEaHZpZnbVW6KFHlAptwB+1iG3v3w= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.11.0 h1:EVeeGzvyiCN4VbInHIWXZtL8hPsVzZIdnfXjgyZzUf0= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.11.0/go.mod h1:KQLunYwad9IhSbnXuhkKAldVG9LNxCzIYHR8vMJlKQI= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.19.1 h1:Mym5vqa3YaF42LbqlVXDFYf/evsNU76l0wpUPGEu+0U= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.19.1/go.mod h1:oFbKTkCFtp/RVjTeuv5caSuuEnf3/JG8zRDB4nbLYes= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.7.3 h1:wqAj7RP4GrfWct1de6ny7UyJpB2vcMaNXR/8xPkPwKg= @@ -666,8 +666,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.6.0/go.mod h1:z17c+hqIi6S5Op9Uk0FmxaeZIoN6and2AAV7P1viAqQ= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.20.1 h1:zVVA/Puge2PK3G8lrGGolnQzxYwwsNUgfMyyRUUQc44= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.20.1/go.mod h1:xJNa86o89czK2o60+s46vz8+NSKDTbQduFGFaztJnsA= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.7.2 h1:ne+TBZTWUzIg47X5vRbeyPfJCA1tafIN3R20ADBIu2Q= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.7.2/go.mod h1:gmOQuuRATNTmHTuwCsJ6ko1AwHThYpvEkmD2uOYEJCQ= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.8.0 h1:PsLXr7R/R/ceWIJOkist2B5chWm/Q34IgQd/dmhvWbQ= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.8.0/go.mod h1:izKsr/tJKDNPsgZ/LFQ2civLOICA75BKU06NNWgADIw= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.11.3 h1:u3IgZPwcD6yncKPK+PYqPKKaRW4EqfH8x4ARa53DlXI= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.11.3/go.mod h1:QDhu6jIIgqgO7l/wAGlfUDHC4Q20vfyUifh3a0qT3W4= github.com/stackitcloud/stackit-sdk-go/services/ske v1.21.2 h1:4ApmRQGkcf/G/h1s19QsqH/vqE3oqfrdG1J/3/40iEM= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/internal/cmd/auth/login/login.go new/stackit-cli-0.76.0/internal/cmd/auth/login/login.go --- old/stackit-cli-0.75.0/internal/cmd/auth/login/login.go 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/internal/cmd/auth/login/login.go 2026-10-22 09:35:59.000000000 +0200 @@ -14,11 +14,13 @@ ) const ( - portFlag = "port" + portFlag = "port" + noBrowserOpenFlag = "no-browser-open" ) type inputModel struct { - Port *int + Port *int + NoBrowserOpen bool } func NewCmd(params *types.CmdParams) *cobra.Command { @@ -43,6 +45,7 @@ err = auth.AuthorizeUser(params.Printer, auth.UserAuthConfig{ IsReauthentication: false, Port: model.Port, + NoBrowserOpen: model.NoBrowserOpen, }) if err != nil { return fmt.Errorf("authorization failed: %w", err) @@ -62,6 +65,9 @@ "The port on which the callback server will listen to. By default, it tries to bind a port between 8000 and 8020.\n"+ "When a value is specified, it will only try to use the specified port. Valid values are within the range of 8000 to 8020.", ) + cmd.Flags().Bool(noBrowserOpenFlag, false, + "If set, does not open the browser automatically but only prints the URL to the terminal", + ) } func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { @@ -71,8 +77,11 @@ return nil, fmt.Errorf("port must be between 8000 and 8020") } + noBrowserOpen := flags.FlagToBoolValue(p, cmd, noBrowserOpenFlag) + model := inputModel{ - Port: port, + Port: port, + NoBrowserOpen: noBrowserOpen, } p.DebugInputModel(model) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/internal/cmd/network/create/create.go new/stackit-cli-0.76.0/internal/cmd/network/create/create.go --- old/stackit-cli-0.75.0/internal/cmd/network/create/create.go 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/internal/cmd/network/create/create.go 2026-10-22 09:35:59.000000000 +0200 @@ -25,6 +25,7 @@ const ( nameFlag = "name" + descriptionFlag = "description" ipv4DnsNameServersFlag = "ipv4-dns-name-servers" ipv4PrefixLengthFlag = "ipv4-prefix-length" ipv4PrefixFlag = "ipv4-prefix" @@ -43,6 +44,7 @@ type inputModel struct { *globalflags.GlobalFlagModel Name string + Description *string IPv4DnsNameServers []string IPv4PrefixLength *int64 IPv4Prefix *string @@ -70,6 +72,10 @@ `$ stackit network create --name network-1`, ), examples.NewExample( + `Create a network with name "network-1" and a description`, + `$ stackit network create --name network-1 --description "My network"`, + ), + examples.NewExample( `Create a non-routed network with name "network-1"`, `$ stackit network create --name network-1 --non-routed`, ), @@ -122,7 +128,7 @@ } // Call API - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) resp, err := req.Execute() if err != nil { return fmt.Errorf("create network : %w", err) @@ -152,6 +158,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().StringP(nameFlag, "n", "", "Network name") + cmd.Flags().String(descriptionFlag, "", "Description of the network (up to 255 characters)") cmd.Flags().StringSlice(ipv4DnsNameServersFlag, []string{}, "List of DNS name servers for IPv4. Nameservers cannot be defined for routed networks") cmd.Flags().Int64(ipv4PrefixLengthFlag, 0, "The prefix length of the IPv4 network") cmd.Flags().String(ipv4PrefixFlag, "", "The IPv4 prefix of the network (CIDR)") @@ -190,6 +197,7 @@ model := inputModel{ GlobalFlagModel: globalFlags, Name: flags.FlagToStringValue(p, cmd, nameFlag), + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), IPv4DnsNameServers: flags.FlagToStringSliceValue(p, cmd, ipv4DnsNameServersFlag), IPv4PrefixLength: flags.FlagToInt64Pointer(p, cmd, ipv4PrefixLengthFlag), IPv4Prefix: flags.FlagToStringPointer(p, cmd, ipv4PrefixFlag), @@ -246,8 +254,8 @@ return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateNetworkRequest { - req := apiClient.DefaultAPI.CreateNetwork(ctx, model.ProjectId, model.Region) +func buildRequest(ctx context.Context, model *inputModel, apiClient iaas.DefaultAPI) iaas.ApiCreateNetworkRequest { + req := apiClient.CreateNetwork(ctx, model.ProjectId, model.Region) var ipv4Network *iaas.CreateNetworkIPv4 var ipv6Network *iaas.CreateNetworkIPv6 @@ -297,6 +305,7 @@ payload := iaas.CreateNetworkPayload{ Name: model.Name, + Description: model.Description, Labels: model.Labels, Routed: utils.Ptr(!model.NonRouted), Ipv4: ipv4Network, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/internal/cmd/network/create/create_test.go new/stackit-cli-0.76.0/internal/cmd/network/create/create_test.go --- old/stackit-cli-0.75.0/internal/cmd/network/create/create_test.go 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/internal/cmd/network/create/create_test.go 2026-10-22 09:35:59.000000000 +0200 @@ -235,6 +235,26 @@ expectedModel: fixtureInputModel(), }, { + description: "description set", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[descriptionFlag] = "My network" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Description = new("My network") + }), + }, + { + description: "description empty", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[descriptionFlag] = "" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Description = new("") + }), + }, + { description: "required only", flagValues: map[string]string{ globalflags.ProjectIdFlag: testProjectId, @@ -510,6 +530,28 @@ expectedRequest: fixtureRequest(), }, { + description: "description set", + model: fixtureInputModel(func(model *inputModel) { + model.Description = new("My network") + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiCreateNetworkRequest) { + *request = request.CreateNetworkPayload(fixturePayload(func(payload *iaas.CreateNetworkPayload) { + payload.Description = new("My network") + })) + }), + }, + { + description: "description empty", + model: fixtureInputModel(func(model *inputModel) { + model.Description = new("") + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiCreateNetworkRequest) { + *request = request.CreateNetworkPayload(fixturePayload(func(payload *iaas.CreateNetworkPayload) { + payload.Description = new("") + })) + }), + }, + { description: "only name in payload", model: &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ @@ -632,7 +674,7 @@ } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(tt.expectedRequest, request, cmp.AllowUnexported(tt.expectedRequest), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/internal/cmd/network/describe/describe.go new/stackit-cli-0.76.0/internal/cmd/network/describe/describe.go --- old/stackit-cli-0.75.0/internal/cmd/network/describe/describe.go 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/internal/cmd/network/describe/describe.go 2026-10-22 09:35:59.000000000 +0200 @@ -136,6 +136,8 @@ table.AddSeparator() table.AddRow("NAME", network.Name) table.AddSeparator() + table.AddRow("DESCRIPTION", utils.PtrString(network.Description)) + table.AddSeparator() table.AddRow("STATE", network.Status) table.AddSeparator() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/internal/cmd/network/list/list.go new/stackit-cli-0.76.0/internal/cmd/network/list/list.go --- old/stackit-cli-0.75.0/internal/cmd/network/list/list.go 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/internal/cmd/network/list/list.go 2026-10-22 09:35:59.000000000 +0200 @@ -143,7 +143,7 @@ } table := tables.NewTable() - table.SetHeader("ID", "NAME", "STATUS", "PUBLIC IP", "PREFIXES", "ROUTED", "ROUTING TABLE ID") + table.SetHeader("ID", "NAME", "DESCRIPTION", "STATUS", "PUBLIC IP", "PREFIXES", "ROUTED", "ROUTING TABLE ID") for _, network := range networks { var publicIp, prefixes string @@ -160,6 +160,7 @@ table.AddRow( network.Id, network.Name, + utils.Truncate(network.Description, 70), network.Status, publicIp, prefixes, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/internal/cmd/network/update/update.go new/stackit-cli-0.76.0/internal/cmd/network/update/update.go --- old/stackit-cli-0.75.0/internal/cmd/network/update/update.go 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/internal/cmd/network/update/update.go 2026-10-22 09:35:59.000000000 +0200 @@ -27,6 +27,7 @@ networkIdArg = "NETWORK_ID" nameFlag = "name" + descriptionFlag = "description" ipv4DnsNameServersFlag = "ipv4-dns-name-servers" ipv4GatewayFlag = "ipv4-gateway" ipv6DnsNameServersFlag = "ipv6-dns-name-servers" @@ -41,6 +42,7 @@ *globalflags.GlobalFlagModel NetworkId string Name *string + Description *string IPv4DnsNameServers *[]string IPv4Gateway *string IPv6DnsNameServers *[]string @@ -63,6 +65,14 @@ `$ stackit network update xxx --name network-1-new`, ), examples.NewExample( + `Update the description of network with ID "xxx"`, + `$ stackit network update xxx --description "My network"`, + ), + examples.NewExample( + `Clear the description of network with ID "xxx"`, + `$ stackit network update xxx --description ""`, + ), + examples.NewExample( `Update network with ID "xxx" with no gateway`, `$ stackit network update --no-ipv4-gateway`, ), @@ -107,7 +117,7 @@ } // Call API - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) err = req.Execute() if err != nil { return fmt.Errorf("update network area: %w", err) @@ -138,6 +148,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().StringP(nameFlag, "n", "", "Network name") + cmd.Flags().String(descriptionFlag, "", "Description of the network (up to 255 characters). Use an empty string to clear it") cmd.Flags().StringSlice(ipv4DnsNameServersFlag, nil, "List of DNS name servers IPv4. Nameservers cannot be defined for routed networks") cmd.Flags().String(ipv4GatewayFlag, "", "The IPv4 gateway of a network. If not specified, the first IP of the network will be assigned as the gateway") cmd.Flags().StringSlice(ipv6DnsNameServersFlag, nil, "List of DNS name servers for IPv6. Nameservers cannot be defined for routed networks") @@ -159,6 +170,7 @@ model := inputModel{ GlobalFlagModel: globalFlags, Name: flags.FlagToStringPointer(p, cmd, nameFlag), + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), NetworkId: networkId, IPv4DnsNameServers: flags.FlagToStringSlicePointer(p, cmd, ipv4DnsNameServersFlag), IPv4Gateway: flags.FlagToStringPointer(p, cmd, ipv4GatewayFlag), @@ -170,12 +182,20 @@ Labels: flags.FlagToStringToAny(p, cmd, labelFlag), } + if model.Name == nil && model.Description == nil && + model.IPv4DnsNameServers == nil && model.IPv4Gateway == nil && + model.IPv6DnsNameServers == nil && model.IPv6Gateway == nil && + !model.NoIPv4Gateway && !model.NoIPv6Gateway && + model.RoutingTableId == nil && model.Labels == nil { + return nil, &cliErr.EmptyUpdateError{} + } + p.DebugInputModel(model) return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiPartialUpdateNetworkRequest { - req := apiClient.DefaultAPI.PartialUpdateNetwork(ctx, model.ProjectId, model.Region, model.NetworkId) +func buildRequest(ctx context.Context, model *inputModel, apiClient iaas.DefaultAPI) iaas.ApiPartialUpdateNetworkRequest { + req := apiClient.PartialUpdateNetwork(ctx, model.ProjectId, model.Region, model.NetworkId) var payloadIPv4 *iaas.UpdateNetworkIPv4Body var payloadIPv6 *iaas.UpdateNetworkIPv6Body @@ -209,6 +229,7 @@ payload := iaas.PartialUpdateNetworkPayload{ Name: model.Name, + Description: model.Description, Ipv4: payloadIPv4, Ipv6: payloadIPv6, Labels: model.Labels, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/internal/cmd/network/update/update_test.go new/stackit-cli-0.76.0/internal/cmd/network/update/update_test.go --- old/stackit-cli-0.75.0/internal/cmd/network/update/update_test.go 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/internal/cmd/network/update/update_test.go 2026-10-22 09:35:59.000000000 +0200 @@ -126,6 +126,28 @@ expectedModel: fixtureInputModel(), }, { + description: "description set", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[descriptionFlag] = "My network" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Description = new("My network") + }), + }, + { + description: "description empty", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[descriptionFlag] = "" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Description = new("") + }), + }, + { description: "required only", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { @@ -143,6 +165,15 @@ isValid: false, }, { + description: "no cmd specific flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + }, + isValid: false, + }, + { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { @@ -318,6 +349,39 @@ expectedRequest: fixtureRequest(), }, { + description: "description set", + model: fixtureInputModel(func(model *inputModel) { + model.Description = new("My network") + }), + expectedRequest: fixtureRequest(func(payload *iaas.PartialUpdateNetworkPayload) { + payload.Description = new("My network") + }), + }, + { + description: "description empty", + model: fixtureInputModel(func(model *inputModel) { + model.Description = new("") + }), + expectedRequest: fixtureRequest(func(payload *iaas.PartialUpdateNetworkPayload) { + payload.Description = new("") + }), + }, + { + description: "description only", + model: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + }, + NetworkId: testNetworkId, + Description: new("My network"), + }, + expectedRequest: testClient.DefaultAPI.PartialUpdateNetwork(testCtx, testProjectId, testRegion, testNetworkId). + PartialUpdateNetworkPayload(iaas.PartialUpdateNetworkPayload{ + Description: new("My network"), + }), + }, + { description: "not setting IPv4DnsNameServers does not result in nil pointer dereference", model: fixtureInputModel(func(model *inputModel) { model.IPv4DnsNameServers = nil @@ -343,7 +407,7 @@ for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/internal/cmd/network-area/route/list/list.go new/stackit-cli-0.76.0/internal/cmd/network-area/route/list/list.go --- old/stackit-cli-0.75.0/internal/cmd/network-area/route/list/list.go 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/internal/cmd/network-area/route/list/list.go 2026-10-22 09:35:59.000000000 +0200 @@ -152,14 +152,14 @@ routeNexthop := route.Nexthop if routeNexthop.NexthopIPv4 != nil { nextHop = routeNexthop.NexthopIPv4.Value - nextHopType = routeNexthop.NexthopIPv4.Type + nextHopType = string(routeNexthop.NexthopIPv4.Type) } else if routeNexthop.NexthopIPv6 != nil { nextHop = routeNexthop.NexthopIPv6.Value - nextHopType = routeNexthop.NexthopIPv6.Type + nextHopType = string(routeNexthop.NexthopIPv6.Type) } else if routeNexthop.NexthopBlackhole != nil { - nextHopType = routeNexthop.NexthopBlackhole.Type + nextHopType = string(routeNexthop.NexthopBlackhole.Type) } else if routeNexthop.NexthopInternet != nil { - nextHopType = routeNexthop.NexthopInternet.Type + nextHopType = string(routeNexthop.NexthopInternet.Type) } table.AddRow( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/internal/cmd/network-area/routingtable/route/create/create.go new/stackit-cli-0.76.0/internal/cmd/network-area/routingtable/route/create/create.go --- old/stackit-cli-0.75.0/internal/cmd/network-area/routingtable/route/create/create.go 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/internal/cmd/network-area/routingtable/route/create/create.go 2026-10-22 09:35:59.000000000 +0200 @@ -210,14 +210,14 @@ case destTypeCIDRv4: return &iaas.RouteDestination{ DestinationCIDRv4: &iaas.DestinationCIDRv4{ - Type: model.DestinationType, + Type: iaas.DestinationCIDRv4Type(model.DestinationType), Value: *model.DestinationValue, }, } case destTypeCIDRv6: return &iaas.RouteDestination{ DestinationCIDRv6: &iaas.DestinationCIDRv6{ - Type: model.DestinationType, + Type: iaas.DestinationCIDRv6Type(model.DestinationType), Value: *model.DestinationValue, }, } @@ -232,27 +232,27 @@ case nextHopTypeIPv4: return &iaas.RouteNexthop{ NexthopIPv4: &iaas.NexthopIPv4{ - Type: model.NextHopType, + Type: iaas.NexthopIPv4Type(model.NextHopType), Value: *model.NextHopValue, }, } case nextHopTypeIPv6: return &iaas.RouteNexthop{ NexthopIPv6: &iaas.NexthopIPv6{ - Type: model.NextHopType, + Type: iaas.NexthopIPv6Type(model.NextHopType), Value: *model.NextHopValue, }, } case nextHopTypeInternet: return &iaas.RouteNexthop{ NexthopInternet: &iaas.NexthopInternet{ - Type: model.NextHopType, + Type: iaas.NexthopInternetType(model.NextHopType), }, } case nextHopTypeBlackhole: return &iaas.RouteNexthop{ NexthopBlackhole: &iaas.NexthopBlackhole{ - Type: model.NextHopType, + Type: iaas.NexthopBlackholeType(model.NextHopType), }, } default: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/internal/pkg/auth/user_login.go new/stackit-cli-0.76.0/internal/pkg/auth/user_login.go --- old/stackit-cli-0.75.0/internal/pkg/auth/user_login.go 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/internal/pkg/auth/user_login.go 2026-10-22 09:35:59.000000000 +0200 @@ -51,6 +51,8 @@ IsReauthentication bool // Port defines which port should be used for the UserAuthFlow callback Port *int + // NoBrowserOpen stops the browser from opening automatically during the login flow + NoBrowserOpen bool } type apiClient interface { @@ -250,19 +252,28 @@ } }) - p.Debug(print.DebugLevel, "opening browser for authentication: %s", authorizationURL) p.Debug(print.DebugLevel, "using authentication server on %s", idpWellKnownConfig.Issuer) p.Debug(print.DebugLevel, "using client ID %s for authentication ", idpClientID) - // Open a browser window to the authorizationURL - err = openBrowser(authorizationURL) - if err != nil { - return fmt.Errorf("open browser to URL %s: %w", authorizationURL, err) - } + if authConfig.NoBrowserOpen { + p.Debug(print.DebugLevel, "skipping browser opening since the commandline flag was passed") - // Print the link - p.Info("Your browser has been opened to visit:\n\n") - p.Info("%s\n\n", authorizationURL) + // Print the link in terminal + p.Noticeln("Open the following URL in your browser:\n") + p.Outputf("%s\n\n", authorizationURL) + } else { + p.Debug(print.DebugLevel, "opening browser for authentication: %s", authorizationURL) + + // Open a browser window to the authorizationURL + err = openBrowser(authorizationURL) + if err != nil { + return fmt.Errorf("open browser to URL %s: %w", authorizationURL, err) + } + + // Print the link + p.Info("Your browser has been opened to visit:\n\n") + p.Info("%s\n\n", authorizationURL) + } // Start the blocking web server loop // It will exit when the handlers get fired and call server.Close() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/internal/pkg/print/print.go new/stackit-cli-0.76.0/internal/pkg/print/print.go --- old/stackit-cli-0.75.0/internal/pkg/print/print.go 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/internal/pkg/print/print.go 2026-10-22 09:35:59.000000000 +0200 @@ -97,6 +97,16 @@ mustPrint(fmt.Fprintln(p.StdOut, msg)) } +// Noticef prints a formatted notice to StdErr, regardless of verbosity or output format. +func (p *Printer) Noticef(msg string, args ...any) { + mustPrint(fmt.Fprintf(p.StdErr, msg, args...)) +} + +// Noticeln prints a notice followed by a newline to StdErr, regardless of verbosity or output format. +func (p *Printer) Noticeln(msg string) { + mustPrint(fmt.Fprintln(p.StdErr, msg)) +} + // Print a Debug level log through the "slog" package. // If the verbosity level is not Debug, it does nothing func (p *Printer) Debug(level Level, msg string, args ...any) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/internal/pkg/print/print_test.go new/stackit-cli-0.76.0/internal/pkg/print/print_test.go --- old/stackit-cli-0.75.0/internal/pkg/print/print_test.go 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/internal/pkg/print/print_test.go 2026-10-22 09:35:59.000000000 +0200 @@ -152,6 +152,153 @@ } } +func TestNoticef(t *testing.T) { + tests := []struct { + description string + message string + args []any + verbosity Level + outputFormatNone bool + expectedOutput string + }{ + { + description: "debug verbosity", + message: "Test message", + verbosity: DebugLevel, + expectedOutput: "Test message", + }, + { + description: "info verbosity", + message: "Test message", + verbosity: InfoLevel, + expectedOutput: "Test message", + }, + { + description: "with args", + message: "Test message with args: %s, %d\n", + args: []any{"arg1", 2}, + verbosity: InfoLevel, + expectedOutput: "Test message with args: arg1, 2\n", + }, + { + description: "warning verbosity", + message: "Test message", + verbosity: WarningLevel, + expectedOutput: "Test message", + }, + { + description: "error verbosity", + message: "Test message", + verbosity: ErrorLevel, + expectedOutput: "Test message", + }, + { + description: "output format none", + message: "Test message: %s", + args: []any{"arg1"}, + verbosity: ErrorLevel, + outputFormatNone: true, + expectedOutput: "Test message: arg1", + }, + { + description: "empty message", + verbosity: InfoLevel, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + var stdout, stderr bytes.Buffer + p := &Printer{ + StdOut: &stdout, + StdErr: &stderr, + Verbosity: tt.verbosity, + } + viper.Reset() + if tt.outputFormatNone { + viper.Set(outputFormatKey, NoneOutputFormat) + } + + p.Noticef(tt.message, tt.args...) + + if output := stderr.String(); output != tt.expectedOutput { + t.Errorf("unexpected stderr: got %q, want %q", output, tt.expectedOutput) + } + if output := stdout.String(); output != "" { + t.Errorf("unexpected stdout: got %q, want %q", output, "") + } + }) + } +} + +func TestNoticeln(t *testing.T) { + tests := []struct { + description string + message string + verbosity Level + outputFormatNone bool + }{ + { + description: "debug verbosity", + message: "Test message", + verbosity: DebugLevel, + }, + { + description: "info verbosity", + message: "Test message", + verbosity: InfoLevel, + }, + { + description: "warning verbosity", + message: "Test message", + verbosity: WarningLevel, + }, + { + description: "error verbosity", + message: "Test message", + verbosity: ErrorLevel, + }, + { + description: "output format none", + message: "Test message", + verbosity: ErrorLevel, + outputFormatNone: true, + }, + { + description: "empty message", + verbosity: InfoLevel, + }, + { + description: "literal format specifier", + message: "Test message: %s", + verbosity: InfoLevel, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + var stdout, stderr bytes.Buffer + p := &Printer{ + StdOut: &stdout, + StdErr: &stderr, + Verbosity: tt.verbosity, + } + viper.Reset() + if tt.outputFormatNone { + viper.Set(outputFormatKey, NoneOutputFormat) + } + + p.Noticeln(tt.message) + + expectedOutput := tt.message + "\n" + if output := stderr.String(); output != expectedOutput { + t.Errorf("unexpected stderr: got %q, want %q", output, expectedOutput) + } + if output := stdout.String(); output != "" { + t.Errorf("unexpected stdout: got %q, want %q", output, "") + } + }) + } +} + func TestPagerDisplay(t *testing.T) { tests := []struct { description string diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/internal/pkg/services/iaas/utils/utils.go new/stackit-cli-0.76.0/internal/pkg/services/iaas/utils/utils.go --- old/stackit-cli-0.75.0/internal/pkg/services/iaas/utils/utils.go 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/internal/pkg/services/iaas/utils/utils.go 2026-10-22 09:35:59.000000000 +0200 @@ -134,9 +134,9 @@ nextHopV6 := route.Nexthop.NexthopIPv6 nextHopV6Matches := nextHopV6 != nil && nextHopV6.Value == nexthop nextHopInet := route.Nexthop.NexthopInternet - nextHopInetMatches := nextHopInet != nil && nextHopInet.Type == nexthop + nextHopInetMatches := nextHopInet != nil && string(nextHopInet.Type) == nexthop nextHopBlackhole := route.Nexthop.NexthopBlackhole - nextHopBlackholeMatches := nextHopBlackhole != nil && nextHopBlackhole.Type == nexthop + nextHopBlackholeMatches := nextHopBlackhole != nil && string(nextHopBlackhole.Type) == nexthop nextHopMatches := nextHopV4Matches || nextHopV6Matches || nextHopInetMatches || nextHopBlackholeMatches if nextHopMatches { return route, nil diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stackit-cli-0.75.0/internal/pkg/services/network-area/routing-table/utils/utils.go new/stackit-cli-0.76.0/internal/pkg/services/network-area/routing-table/utils/utils.go --- old/stackit-cli-0.75.0/internal/pkg/services/network-area/routing-table/utils/utils.go 2026-10-16 09:48:00.000000000 +0200 +++ new/stackit-cli-0.76.0/internal/pkg/services/network-area/routing-table/utils/utils.go 2026-10-22 09:35:59.000000000 +0200 @@ -23,23 +23,23 @@ var routeDetails RouteDetails if route.Destination.DestinationCIDRv4 != nil { - routeDetails.DestType = route.Destination.DestinationCIDRv4.Type + routeDetails.DestType = string(route.Destination.DestinationCIDRv4.Type) routeDetails.DestValue = route.Destination.DestinationCIDRv4.Value } else if route.Destination.DestinationCIDRv6 != nil { - routeDetails.DestType = route.Destination.DestinationCIDRv6.Type + routeDetails.DestType = string(route.Destination.DestinationCIDRv6.Type) routeDetails.DestValue = route.Destination.DestinationCIDRv6.Value } if route.Nexthop.NexthopIPv4 != nil { - routeDetails.HopType = route.Nexthop.NexthopIPv4.Type + routeDetails.HopType = string(route.Nexthop.NexthopIPv4.Type) routeDetails.HopValue = route.Nexthop.NexthopIPv4.Value } else if route.Nexthop.NexthopIPv6 != nil { - routeDetails.HopType = route.Nexthop.NexthopIPv6.Type + routeDetails.HopType = string(route.Nexthop.NexthopIPv6.Type) routeDetails.HopValue = route.Nexthop.NexthopIPv6.Value } else if route.Nexthop.NexthopInternet != nil { - routeDetails.HopType = route.Nexthop.NexthopInternet.Type + routeDetails.HopType = string(route.Nexthop.NexthopInternet.Type) } else if route.Nexthop.NexthopBlackhole != nil { - routeDetails.HopType = route.Nexthop.NexthopBlackhole.Type + routeDetails.HopType = string(route.Nexthop.NexthopBlackhole.Type) } if len(route.Labels) > 0 { ++++++ stackit-cli.obsinfo ++++++ --- /var/tmp/diff_new_pack.rNW8P2/_old 2026-10-24 22:06:48.386091335 +0200 +++ /var/tmp/diff_new_pack.rNW8P2/_new 2026-10-24 22:06:48.396091756 +0200 @@ -1,5 +1,5 @@ name: stackit-cli -version: 0.75.0 -mtime: 1792136880 -commit: f02071216a078f1d3fd9cc1e53e0fb839ed3f3f8 +version: 0.76.0 +mtime: 1792654559 +commit: 5040102b0c4122e36cb4989602186f6b0b9822f9 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/stackit-cli/vendor.tar.gz /work/SRC/openSUSE:Factory/.stackit-cli.new.2252680/vendor.tar.gz differ: char 13, line 1
