@@ -18,6 +18,7 @@ package osclients
1818
1919import (
2020 "context"
21+ "encoding/json"
2122 "fmt"
2223 "iter"
2324
@@ -52,19 +53,28 @@ type NetworkExt struct {
5253 provider.NetworkProviderExt
5354}
5455
55- // NOTE(winiciusallan): This is a temporary extension struct to
56- // workaround a missing pointer on Gophercloud and must be
57- // removed in future releases.
58- // See https://github.com/gophercloud/gophercloud/issues/3605
59- type PortTmpExt struct {
60- PropagateUplinkStatusPtr * bool `json:"propagate_uplink_status,omitempty"`
61- }
62-
6356type PortExt struct {
6457 ports.Port
6558 portsecurity.PortSecurityExt
6659 portsbinding.PortsBindingExt
67- PortTmpExt //nolint:govet
60+
61+ PropagateUplinkStatusPtr * bool `json:"propagate_uplink_status,omitempty"`
62+ }
63+
64+ func (p * PortExt ) UnmarshalJSON (b []byte ) error {
65+ if err := json .Unmarshal (b , & p .Port ); err != nil {
66+ return err
67+ }
68+
69+ var tmp struct {
70+ PropagateUplinkStatusPtr * bool `json:"propagate_uplink_status"`
71+ }
72+ if err := json .Unmarshal (b , & tmp ); err != nil {
73+ return err
74+ }
75+
76+ p .PropagateUplinkStatusPtr = tmp .PropagateUplinkStatusPtr
77+ return nil
6878}
6979
7080type NetworkClient interface {
@@ -189,13 +199,30 @@ func (c networkClient) UpdateFloatingIP(ctx context.Context, id string, opts flo
189199
190200func (c networkClient ) ListPort (ctx context.Context , opts ports.ListOptsBuilder ) iter.Seq2 [* PortExt , error ] {
191201 extractPortExt := func (p pagination.Page ) ([]PortExt , error ) {
192- var resources []PortExt
193- err := ports .ExtractPortsInto (p , & resources )
202+ bodyMap , ok := p .(ports.PortPage ).Body .(map [string ]interface {})
203+ if ! ok {
204+ return nil , fmt .Errorf ("unexpected body type: %T" , p .(ports.PortPage ).Body )
205+ }
206+
207+ portsData , ok := bodyMap ["ports" ]
208+ if ! ok {
209+ return nil , fmt .Errorf ("ports key not found in response" )
210+ }
211+
212+ // Marshal and unmarshal to trigger UnmarshalJSON
213+ jsonData , err := json .Marshal (portsData )
194214 if err != nil {
195215 return nil , err
196216 }
217+
218+ var resources []PortExt
219+ if err := json .Unmarshal (jsonData , & resources ); err != nil {
220+ return nil , err
221+ }
222+
197223 return resources , nil
198224 }
225+
199226 pager := ports .List (c .serviceClient , opts )
200227 return func (yield func (* PortExt , error ) bool ) {
201228 _ = pager .EachPage (ctx , yieldPage (extractPortExt , yield ))
0 commit comments