Skip to content

Commit c9d6ebe

Browse files
authored
Add FLY_FORCE_INSTANCE support (#228)
1 parent 88c9ea5 commit c9d6ebe

2 files changed

Lines changed: 78 additions & 0 deletions

File tree

client.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ type ClientOptions struct {
168168
Logger Logger
169169
EnableDebugTrace *bool
170170
FlyForceRegion *string
171+
FlyForceInstance *string
171172
Transport *Transport
172173
}
173174

@@ -206,6 +207,14 @@ func (t *Transport) setDefaults(opts *ClientOptions) {
206207
t.FlyForceRegion = v
207208
}
208209
}
210+
211+
if opts.FlyForceInstance != nil {
212+
t.FlyForceInstance = *opts.FlyForceInstance
213+
} else if t.FlyForceInstance == "" {
214+
if v := os.Getenv("FLY_FORCE_INSTANCE"); v != "" {
215+
t.FlyForceInstance = v
216+
}
217+
}
209218
}
210219

211220
func NewClientFromOptions(opts ClientOptions) *Client {
@@ -359,6 +368,7 @@ type Transport struct {
359368
Tokens *tokens.Tokens
360369
EnableDebugTrace bool
361370
FlyForceRegion string
371+
FlyForceInstance string
362372
}
363373

364374
func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
@@ -372,6 +382,9 @@ func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
372382
if t.FlyForceRegion != "" {
373383
req.Header.Set("Fly-Force-Region", t.FlyForceRegion)
374384
}
385+
if t.FlyForceInstance != "" {
386+
req.Header.Set("Fly-Force-Instance", t.FlyForceInstance)
387+
}
375388

376389
return t.UnderlyingTransport.RoundTrip(req)
377390
}

client_test.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,71 @@ func TestTransportSetDefaults_DoesNotOverrideFlyForceRegionFromTransport(t *test
8383
}
8484
}
8585

86+
func TestTransportSetDefaults_DoesNotOverrideFlyForceInstanceFromTransport(t *testing.T) {
87+
t.Setenv("FLY_FORCE_INSTANCE", "worker-1")
88+
89+
transport := &Transport{FlyForceInstance: "worker-2"}
90+
opts := ClientOptions{Transport: transport}
91+
92+
transport.setDefaults(&opts)
93+
94+
if transport.FlyForceInstance != "worker-2" {
95+
t.Fatalf("expected FlyForceInstance to remain %q, got %q", "worker-2", transport.FlyForceInstance)
96+
}
97+
}
98+
99+
func TestTransportSetDefaults_SetsFlyForceInstanceFromEnv(t *testing.T) {
100+
t.Setenv("FLY_FORCE_INSTANCE", "worker-1")
101+
102+
transport := &Transport{}
103+
opts := ClientOptions{Transport: transport}
104+
105+
transport.setDefaults(&opts)
106+
107+
if transport.FlyForceInstance != "worker-1" {
108+
t.Fatalf("expected FlyForceInstance to be %q, got %q", "worker-1", transport.FlyForceInstance)
109+
}
110+
}
111+
112+
type captureTripper struct {
113+
req *http.Request
114+
}
115+
116+
func (c *captureTripper) RoundTrip(req *http.Request) (*http.Response, error) {
117+
c.req = req.Clone(req.Context())
118+
c.req.Header = req.Header.Clone()
119+
return &http.Response{
120+
StatusCode: http.StatusOK,
121+
Body: io.NopCloser(strings.NewReader("{}")),
122+
Header: make(http.Header),
123+
}, nil
124+
}
125+
126+
func TestTransportRoundTrip_SetsFlyForceInstanceHeader(t *testing.T) {
127+
capture := &captureTripper{}
128+
transport := &Transport{
129+
UnderlyingTransport: capture,
130+
UserAgent: "test/0",
131+
Token: "token",
132+
FlyForceInstance: "worker-2",
133+
}
134+
135+
req, err := http.NewRequest(http.MethodGet, "http://example.test", nil)
136+
if err != nil {
137+
t.Fatalf("NewRequest returned error: %v", err)
138+
}
139+
140+
resp, err := transport.RoundTrip(req)
141+
if err != nil {
142+
t.Fatalf("RoundTrip returned error: %v", err)
143+
}
144+
defer resp.Body.Close()
145+
146+
if got := capture.req.Header.Get("Fly-Force-Instance"); got != "worker-2" {
147+
t.Fatalf("Fly-Force-Instance header = %q, want %q", got, "worker-2")
148+
}
149+
}
150+
86151
func TestGraphQLOperationKind(t *testing.T) {
87152
cases := []struct {
88153
name string

0 commit comments

Comments
 (0)