Skip to content

Commit 33b8744

Browse files
committed
Add ProviderClient.DeepCopy, ServiceClient.DeepCopy
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
1 parent 2b8bb7a commit 33b8744

2 files changed

Lines changed: 54 additions & 0 deletions

File tree

provider_client.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,38 @@ func (f *reauthFuture) Get() error {
139139
return f.err
140140
}
141141

142+
// DeepCopy creates a deep copy of the ProviderClient.
143+
func (client *ProviderClient) DeepCopy() *ProviderClient {
144+
newClient := &ProviderClient{
145+
IdentityBase: client.IdentityBase,
146+
IdentityEndpoint: client.IdentityEndpoint,
147+
TokenID: client.TokenID,
148+
EndpointLocator: client.EndpointLocator,
149+
HTTPClient: client.HTTPClient,
150+
ReauthFunc: client.ReauthFunc,
151+
RetryBackoffFunc: client.RetryBackoffFunc,
152+
RetryFunc: client.RetryFunc,
153+
Throwaway: client.Throwaway,
154+
MaxBackoffRetries: client.MaxBackoffRetries,
155+
authResult: client.authResult,
156+
}
157+
158+
if len(client.UserAgent.prepend) > 0 {
159+
newClient.UserAgent.prepend = make([]string, len(client.UserAgent.prepend))
160+
copy(newClient.UserAgent.prepend, client.UserAgent.prepend)
161+
}
162+
163+
if client.mut != nil {
164+
newClient.mut = new(sync.RWMutex)
165+
}
166+
167+
if client.reauthmut != nil {
168+
newClient.reauthmut = new(reauthlock)
169+
}
170+
171+
return newClient
172+
}
173+
142174
// AuthenticatedHeaders returns a map of HTTP headers that are common for all
143175
// authenticated service requests. Blocks if Reauthenticate is in progress.
144176
func (client *ProviderClient) AuthenticatedHeaders() (m map[string]string) {

service_client.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package gophercloud
33
import (
44
"context"
55
"io"
6+
"maps"
67
"net/http"
78
"strings"
89
)
@@ -60,6 +61,27 @@ func (client *ServiceClient) initReqOpts(JSONBody any, JSONResponse any, opts *R
6061
}
6162
}
6263

64+
// DeepCopy creates a deep copy of the ServiceClient.
65+
func (client *ServiceClient) DeepCopy() *ServiceClient {
66+
newClient := &ServiceClient{
67+
Endpoint: client.Endpoint,
68+
ResourceBase: client.ResourceBase,
69+
Type: client.Type,
70+
Microversion: client.Microversion,
71+
}
72+
73+
if client.ProviderClient != nil {
74+
newClient.ProviderClient = client.ProviderClient.DeepCopy()
75+
}
76+
77+
if client.MoreHeaders != nil {
78+
newClient.MoreHeaders = make(map[string]string, len(client.MoreHeaders))
79+
maps.Copy(newClient.MoreHeaders, client.MoreHeaders)
80+
}
81+
82+
return newClient
83+
}
84+
6385
// Get calls `Request` with the "GET" HTTP verb.
6486
func (client *ServiceClient) Get(ctx context.Context, url string, JSONResponse any, opts *RequestOpts) (*http.Response, error) {
6587
if opts == nil {

0 commit comments

Comments
 (0)