Skip to content

Commit 0f1e900

Browse files
committed
remove temp struct and add new Unmarshal logic
1 parent ca4f259 commit 0f1e900

1 file changed

Lines changed: 38 additions & 11 deletions

File tree

internal/osclients/networking.go

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package osclients
1818

1919
import (
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-
6356
type 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

7080
type NetworkClient interface {
@@ -189,13 +199,30 @@ func (c networkClient) UpdateFloatingIP(ctx context.Context, id string, opts flo
189199

190200
func (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

Comments
 (0)