Skip to content

Commit 33d61b7

Browse files
authored
Merge pull request #273 from moov-io/fixup-manual-upload-trigger
pipeline: fixup manual cutoff trigger endpoint
2 parents 80a43ad + e122027 commit 33d61b7

2 files changed

Lines changed: 66 additions & 10 deletions

File tree

internal/pipeline/manual_cutoff_times.go

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,21 @@
1818
package pipeline
1919

2020
import (
21+
"context"
2122
"encoding/json"
2223
"fmt"
2324
"net/http"
2425

25-
"github.com/moov-io/achgateway/internal/service"
2626
"github.com/moov-io/base/log"
27+
"github.com/moov-io/base/telemetry"
28+
29+
"go.opentelemetry.io/otel/attribute"
30+
"go.opentelemetry.io/otel/trace"
2731
)
2832

2933
type manuallyTriggeredCutoff struct {
30-
C chan error
34+
C chan error
35+
ctx context.Context
3136
}
3237

3338
type manualCutoffBody struct {
@@ -63,16 +68,28 @@ func (fr *FileReceiver) triggerManualCutoff() http.HandlerFunc {
6368
return
6469
}
6570

71+
ctx, span := telemetry.StartSpan(r.Context(), "api-manual-cutoff", trace.WithAttributes(
72+
attribute.StringSlice("achgateway.shards", body.ShardNames),
73+
))
74+
defer span.End()
75+
6676
responses := shardResponses{
6777
Shards: make(map[string]*string),
6878
}
6979

70-
for _, xfagg := range fr.shardAggregators {
80+
for _, shardName := range body.ShardNames {
81+
xfagg, ok := fr.shardAggregators[shardName]
82+
if !ok {
83+
errString := fmt.Sprintf("unknown shard %s", shardName)
84+
responses.Shards[shardName] = &errString
85+
continue
86+
}
87+
7188
logger := fr.logger.With(log.Fields{
7289
"shard": log.String(xfagg.shard.Name),
7390
})
7491

75-
waiter, err := processManualCutoff(logger, body.ShardNames, xfagg.shard, xfagg)
92+
waiter, err := processManualCutoff(ctx, logger, xfagg)
7693
if err != nil {
7794
errString := err.Error()
7895
responses.Shards[xfagg.shard.Name] = &errString
@@ -107,15 +124,12 @@ func (fr *FileReceiver) triggerManualCutoff() http.HandlerFunc {
107124
}
108125
}
109126

110-
func processManualCutoff(logger log.Logger, shardNames []string, shard service.Shard, xfagg *aggregator) (*manuallyTriggeredCutoff, error) {
111-
if !exists(shardNames, shard.Name) {
112-
return nil, fmt.Errorf("unknown shard %s", shard.Name)
113-
}
114-
127+
func processManualCutoff(ctx context.Context, logger log.Logger, xfagg *aggregator) (*manuallyTriggeredCutoff, error) {
115128
logger.Info().Log("found shard to manually trigger")
116129

117130
waiter := manuallyTriggeredCutoff{
118-
C: make(chan error, 1),
131+
C: make(chan error, 1),
132+
ctx: ctx,
119133
}
120134
xfagg.cutoffTrigger <- waiter
121135
return &waiter, nil
@@ -129,3 +143,11 @@ func exists(names []string, shardName string) bool {
129143
}
130144
return false
131145
}
146+
147+
func (fr *FileReceiver) getShardNames() []string {
148+
shardNames := make([]string, 0, len(fr.shardAggregators))
149+
for _, xfagg := range fr.shardAggregators {
150+
shardNames = append(shardNames, xfagg.shard.Name)
151+
}
152+
return shardNames
153+
}

internal/pipeline/manual_cutoff_times_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,32 @@ func TestFileReceiver__ManualCutoff(t *testing.T) {
7171
require.Nil(t, resp.Shards["testing"])
7272
}
7373

74+
func TestFileReceiver__ManualCutoff_RequestedShard_NotConfigured(t *testing.T) {
75+
fr, wg := setupFileReceiver(t, nil) // waiter returns 'nil' error
76+
77+
router := mux.NewRouter()
78+
router.Path("/trigger-cutoff").HandlerFunc(fr.triggerManualCutoff())
79+
80+
var buf bytes.Buffer
81+
buf.WriteString(`{"shardNames":["testing", "mordor"]}`)
82+
83+
w := httptest.NewRecorder()
84+
req := httptest.NewRequest("PUT", "/trigger-cutoff", &buf)
85+
router.ServeHTTP(w, req)
86+
87+
wg.Wait()
88+
w.Flush()
89+
require.Equal(t, http.StatusBadRequest, w.Code)
90+
91+
var resp shardResponses
92+
err := json.NewDecoder(w.Body).Decode(&resp)
93+
require.NoError(t, err)
94+
95+
require.Len(t, resp.Shards, 2)
96+
require.Nil(t, resp.Shards["testing"])
97+
require.NotNil(t, resp.Shards["mordor"])
98+
}
99+
74100
func TestFileReceiver__ManualCutoffErr(t *testing.T) {
75101
bad := errors.New("bad thing")
76102
fr, wg := setupFileReceiver(t, bad) // waiter returns error
@@ -115,6 +141,14 @@ func setupFileReceiver(t *testing.T, waiterResponse error) (*FileReceiver, *sync
115141
cutoffTrigger: cutoffTrigger,
116142
}
117143

144+
fr.shardAggregators["ND-live-veridian"] = &aggregator{
145+
shard: service.Shard{
146+
Name: "ND-live-veridian",
147+
},
148+
merger: &MockXferMerging{},
149+
cutoffTrigger: cutoffTrigger,
150+
}
151+
118152
var wg sync.WaitGroup
119153
wg.Add(1)
120154

0 commit comments

Comments
 (0)