Skip to content

Commit 21e45eb

Browse files
authored
Fix bug with orphaned pods (#238)
* Fix bug with orphaned pods * run task fix and fix warning in github actions * one more try * pin and update submodule to desired location
1 parent 0a9b717 commit 21e45eb

File tree

13 files changed

+113
-84
lines changed

13 files changed

+113
-84
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
kind: Bugfix
2+
body: Fixed issue where job pods could be orphaned during runner shutdown
3+
time: 2025-01-06T10:42:09.764156-06:00

.github/workflows/tests.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ jobs:
2121
uses: actions/setup-go@v5
2222
with:
2323
go-version-file: 'src/go.mod'
24+
cache-dependency-path: |
25+
src/go.sum
2426
- name: Cache Go modules
2527
uses: actions/cache@v4
2628
with:

Taskfile.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ tasks:
6565
cmds:
6666
- cmd: echo "Setting up opslevel-go workspace..."
6767
silent: true
68-
- git submodule update --init --remote
6968
- go work init || exit 0
7069
- go work use . submodules/opslevel-go
7170
- cmd: echo "opslevel-go workspace ready!"

src/cmd/faktory.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ func extractCustomExtraFiles(helper worker.Helper, job *opslevel.RunnerJob) erro
157157
return nil
158158
}
159159

160-
func runJob(helper worker.Helper, job opslevel.RunnerJob) pkg.JobOutcome {
160+
func runJob(ctx context.Context, helper worker.Helper, job opslevel.RunnerJob) pkg.JobOutcome {
161161
logger := log.With().Str("runner", "faktory").Logger()
162162
logMaxBytes := viper.GetInt("job-pod-log-max-size")
163163
logMaxDuration := time.Duration(viper.GetInt("job-pod-log-max-interval")) * time.Second
@@ -169,12 +169,12 @@ func runJob(helper worker.Helper, job opslevel.RunnerJob) pkg.JobOutcome {
169169
pkg.NewPrefixLogProcessor(logPrefix),
170170
pkg.NewFaktoryAppendJobLogProcessor(helper, logger, job.Id, logMaxBytes, logMaxDuration),
171171
)
172-
go streamer.Run()
172+
go streamer.Run(ctx)
173173

174174
pkg.MetricJobsProcessing.Inc()
175175
logger.Info().Msgf("Starting job '%s'", job.Id)
176176
runner := pkg.NewJobRunner("faktory")
177-
outcome := runner.Run(job, streamer.Stdout, streamer.Stderr)
177+
outcome := runner.Run(ctx, job, streamer.Stdout, streamer.Stderr)
178178
streamer.Flush(outcome)
179179
return outcome
180180
}
@@ -221,7 +221,7 @@ func legacyJobHandler(ctx context.Context, args ...interface{}) error {
221221
return err
222222
}
223223

224-
outcome := runJob(helper, job)
224+
outcome := runJob(ctx, helper, job)
225225

226226
emitJobCompleteMetrics(jobStart, job, outcome)
227227
return nil

src/cmd/run.go

Lines changed: 23 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@ import (
88
"sync"
99
"time"
1010

11-
"github.com/getsentry/sentry-go"
12-
"go.opentelemetry.io/otel/attribute"
13-
"go.opentelemetry.io/otel/codes"
14-
"go.opentelemetry.io/otel/trace"
15-
clientset "k8s.io/client-go/kubernetes"
11+
"github.com/opslevel/opslevel-runner/signal"
1612

13+
"github.com/getsentry/sentry-go"
1714
"github.com/opslevel/opslevel-go/v2024"
1815
"github.com/opslevel/opslevel-runner/pkg"
1916
"github.com/rs/zerolog/log"
2017
"github.com/spf13/cobra"
2118
"github.com/spf13/viper"
19+
"go.opentelemetry.io/otel/attribute"
20+
"go.opentelemetry.io/otel/codes"
21+
"go.opentelemetry.io/otel/trace"
2222
)
2323

2424
// previewCmd represents the preview command
@@ -58,20 +58,17 @@ func doRun(cmd *cobra.Command, args []string) {
5858

5959
pkg.StartMetricsServer(string(runner.Id), viper.GetInt("metrics-port"))
6060

61-
if viper.GetBool("scaling-enabled") {
62-
config, err := pkg.GetKubernetesConfig()
63-
pkg.CheckErr(err)
64-
65-
k8sClient := clientset.NewForConfigOrDie(config)
61+
ctx := signal.Init(context.Background())
6662

67-
log.Info().Msgf("electing leader...")
68-
go electLeader(k8sClient, runner.Id)
63+
if viper.GetBool("scaling-enabled") {
64+
leaseLockName := viper.GetString("runner-deployment")
65+
leaseLockNamespace := viper.GetString("runner-pod-namespace")
66+
lockIdentity := viper.GetString("runner-pod-name")
67+
cobra.CheckErr(pkg.RunLeaderElection(ctx, runner.Id, leaseLockName, lockIdentity, leaseLockNamespace))
6968
}
7069

71-
stop := pkg.InitSignalHandler()
72-
wg := startWorkers(runner.Id, stop)
73-
<-stop // Enter Forever Loop
74-
log.Info().Msgf("interupt - waiting for jobs to complete ...")
70+
wg := startWorkers(ctx, runner.Id)
71+
time.Sleep(1 * time.Second)
7572
wg.Wait()
7673
log.Info().Msgf("Unregister runner for id '%s'...", runner.Id)
7774
err = client.RunnerUnregister(runner.Id)
@@ -81,23 +78,15 @@ func doRun(cmd *cobra.Command, args []string) {
8178
}
8279
}
8380

84-
func electLeader(k8sClient *clientset.Clientset, runnerId opslevel.ID) {
85-
leaseLockName := viper.GetString("runner-deployment")
86-
leaseLockNamespace := viper.GetString("runner-pod-namespace")
87-
lockIdentity := viper.GetString("runner-pod-name")
88-
89-
pkg.RunLeaderElection(k8sClient, runnerId, leaseLockName, lockIdentity, leaseLockNamespace)
90-
}
91-
92-
func startWorkers(runnerId opslevel.ID, stop <-chan struct{}) *sync.WaitGroup {
81+
func startWorkers(ctx context.Context, runnerId opslevel.ID) *sync.WaitGroup {
9382
wg := sync.WaitGroup{}
9483
concurrency := getConcurrency()
9584
wg.Add(concurrency)
9685
jobQueue := make(chan opslevel.RunnerJob)
9786
for w := 1; w <= concurrency; w++ {
98-
go jobWorker(&wg, w, runnerId, jobQueue)
87+
go jobWorker(ctx, &wg, w, runnerId, jobQueue)
9988
}
100-
go jobPoller(runnerId, stop, jobQueue)
89+
go jobPoller(ctx, runnerId, jobQueue)
10190
return &wg
10291
}
10392

@@ -109,7 +98,7 @@ func getConcurrency() int {
10998
return concurrency
11099
}
111100

112-
func jobWorker(wg *sync.WaitGroup, index int, runnerId opslevel.ID, jobQueue <-chan opslevel.RunnerJob) {
101+
func jobWorker(ctx context.Context, wg *sync.WaitGroup, index int, runnerId opslevel.ID, jobQueue <-chan opslevel.RunnerJob) {
113102
logMaxBytes := viper.GetInt("job-pod-log-max-size")
114103
logMaxDuration := time.Duration(viper.GetInt("job-pod-log-max-interval")) * time.Second
115104
logPrefix := func() string { return fmt.Sprintf("%s [%d] ", time.Now().UTC().Format(time.RFC3339), index) }
@@ -122,7 +111,6 @@ func jobWorker(wg *sync.WaitGroup, index int, runnerId opslevel.ID, jobQueue <-c
122111
logger.Info().Msgf("Starting job processor %d ...", index)
123112
defer wg.Done()
124113
for job := range jobQueue {
125-
ctx := context.Background()
126114
jobId := job.Id
127115
jobNumber := job.Number()
128116

@@ -142,13 +130,13 @@ func jobWorker(wg *sync.WaitGroup, index int, runnerId opslevel.ID, jobQueue <-c
142130
pkg.MetricJobsProcessing.Inc()
143131
logger.Info().Msgf("Starting job '%s'", jobNumber)
144132

145-
go streamer.Run()
146-
ctx, spanStart := tracer.Start(ctx, "start-job",
133+
go streamer.Run(ctx)
134+
traceCtx, spanStart := tracer.Start(ctx, "start-job",
147135
trace.WithSpanKind(trace.SpanKindConsumer),
148136
trace.WithAttributes(attribute.String("job", jobNumber)),
149137
)
150-
outcome := runner.Run(job, streamer.Stdout, streamer.Stderr)
151-
_, spanFinish := tracer.Start(ctx,
138+
outcome := runner.Run(ctx, job, streamer.Stdout, streamer.Stderr)
139+
_, spanFinish := tracer.Start(traceCtx,
152140
"finish-job",
153141
trace.WithSpanKind(trace.SpanKindConsumer),
154142
trace.WithAttributes(attribute.String("job", jobNumber)))
@@ -185,15 +173,15 @@ func jobWorker(wg *sync.WaitGroup, index int, runnerId opslevel.ID, jobQueue <-c
185173
logger.Info().Msgf("Shutting down job processor %d ...", index)
186174
}
187175

188-
func jobPoller(runnerId opslevel.ID, stop <-chan struct{}, jobQueue chan<- opslevel.RunnerJob) {
176+
func jobPoller(ctx context.Context, runnerId opslevel.ID, jobQueue chan<- opslevel.RunnerJob) {
189177
logger := log.With().Int("worker", 0).Logger()
190178
client := pkg.NewGraphClient()
191179
token := opslevel.ID("")
192180
pollWaitTime := time.Second * time.Duration(viper.GetInt("poll-interval"))
193181
logger.Info().Msg("Starting polling for jobs")
194182
for {
195183
select {
196-
case <-stop:
184+
case <-ctx.Done():
197185
logger.Info().Msg("Stopped Polling for jobs ...")
198186
close(jobQueue)
199187
return

src/cmd/test.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import (
66
"os"
77
"time"
88

9+
"github.com/opslevel/opslevel-runner/signal"
10+
"golang.org/x/net/context"
11+
912
"github.com/opslevel/opslevel-go/v2024"
1013
"github.com/opslevel/opslevel-runner/pkg"
1114
"github.com/rs/zerolog/log"
@@ -45,8 +48,10 @@ func doTest(cmd *cobra.Command, args []string) error {
4548
)
4649
runner := pkg.NewJobRunner("1")
4750

48-
go streamer.Run()
49-
outcome := runner.Run(*job, streamer.Stdout, streamer.Stderr)
51+
ctx := signal.Init(context.Background())
52+
53+
go streamer.Run(ctx)
54+
outcome := runner.Run(ctx, *job, streamer.Stdout, streamer.Stderr)
5055
streamer.Flush(outcome)
5156

5257
if outcome.Outcome != opslevel.RunnerJobOutcomeEnumSuccess {

src/go.mod

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@ require (
66
github.com/contribsys/faktory v1.9.1
77
github.com/contribsys/faktory_worker_go v1.7.0
88
github.com/getsentry/sentry-go v0.29.1
9-
github.com/go-resty/resty/v2 v2.16.0
9+
github.com/go-resty/resty/v2 v2.16.2
1010
github.com/mitchellh/mapstructure v1.5.0
11-
github.com/opslevel/opslevel-go/v2024 v2024.11.8
11+
github.com/opslevel/opslevel-go/v2024 v2024.12.24
1212
github.com/prometheus/client_golang v1.20.5
1313
github.com/rocktavious/autopilot/v2023 v2023.12.7
1414
github.com/rs/zerolog v1.33.0
1515
github.com/spf13/cobra v1.8.1
1616
github.com/spf13/viper v1.19.0
1717
go.opentelemetry.io/otel v1.32.0
1818
go.opentelemetry.io/otel/trace v1.32.0
19+
golang.org/x/net v0.34.0
1920
gopkg.in/yaml.v3 v3.0.1
2021
k8s.io/api v0.30.7
2122
k8s.io/apimachinery v0.30.7
@@ -33,22 +34,22 @@ require (
3334
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
3435
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
3536
github.com/fsnotify/fsnotify v1.7.0 // indirect
36-
github.com/gabriel-vasile/mimetype v1.4.5 // indirect
37+
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
3738
github.com/go-logr/logr v1.4.2 // indirect
3839
github.com/go-logr/stdr v1.2.2 // indirect
3940
github.com/go-openapi/jsonpointer v0.19.6 // indirect
4041
github.com/go-openapi/jsonreference v0.20.2 // indirect
4142
github.com/go-openapi/swag v0.22.3 // indirect
4243
github.com/go-playground/locales v0.14.1 // indirect
4344
github.com/go-playground/universal-translator v0.18.1 // indirect
44-
github.com/go-playground/validator/v10 v10.22.1 // indirect
45+
github.com/go-playground/validator/v10 v10.23.0 // indirect
4546
github.com/gogo/protobuf v1.3.2 // indirect
4647
github.com/golang/protobuf v1.5.4 // indirect
4748
github.com/google/gnostic-models v0.6.8 // indirect
4849
github.com/google/gofuzz v1.2.0 // indirect
4950
github.com/google/uuid v1.6.0 // indirect
5051
github.com/gorilla/websocket v1.5.0 // indirect
51-
github.com/gosimple/slug v1.14.0 // indirect
52+
github.com/gosimple/slug v1.15.0 // indirect
5253
github.com/gosimple/unidecode v1.0.1 // indirect
5354
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
5455
github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
@@ -78,7 +79,7 @@ require (
7879
github.com/prometheus/client_model v0.6.1 // indirect
7980
github.com/prometheus/common v0.55.0 // indirect
8081
github.com/prometheus/procfs v0.15.1 // indirect
81-
github.com/relvacode/iso8601 v1.5.0 // indirect
82+
github.com/relvacode/iso8601 v1.6.0 // indirect
8283
github.com/sagikazarmark/locafero v0.4.0 // indirect
8384
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
8485
github.com/shopspring/decimal v1.4.0 // indirect
@@ -90,12 +91,11 @@ require (
9091
go.opentelemetry.io/otel/metric v1.32.0 // indirect
9192
go.uber.org/atomic v1.9.0 // indirect
9293
go.uber.org/multierr v1.9.0 // indirect
93-
golang.org/x/crypto v0.31.0 // indirect
94+
golang.org/x/crypto v0.32.0 // indirect
9495
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
95-
golang.org/x/net v0.28.0 // indirect
9696
golang.org/x/oauth2 v0.21.0 // indirect
97-
golang.org/x/sys v0.28.0 // indirect
98-
golang.org/x/term v0.27.0 // indirect
97+
golang.org/x/sys v0.29.0 // indirect
98+
golang.org/x/term v0.28.0 // indirect
9999
golang.org/x/text v0.21.0 // indirect
100100
golang.org/x/time v0.6.0 // indirect
101101
google.golang.org/protobuf v1.34.2 // indirect

src/go.sum

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk
3535
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
3636
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
3737
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
38-
github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4=
39-
github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4=
38+
github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
39+
github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8=
4040
github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA=
4141
github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0=
4242
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
@@ -58,10 +58,10 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o
5858
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
5959
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
6060
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
61-
github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA=
62-
github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
63-
github.com/go-resty/resty/v2 v2.16.0 h1:qpKalHWI2bpp9BIKlyT8TYWEJXOk1NuKbfiT3RRnzWc=
64-
github.com/go-resty/resty/v2 v2.16.0/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU=
61+
github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o=
62+
github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
63+
github.com/go-resty/resty/v2 v2.16.2 h1:CpRqTjIzq/rweXUt9+GxzzQdlkqMdt8Lm/fuK/CAbAg=
64+
github.com/go-resty/resty/v2 v2.16.2/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU=
6565
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
6666
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
6767
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
@@ -86,8 +86,8 @@ github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
8686
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
8787
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
8888
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
89-
github.com/gosimple/slug v1.14.0 h1:RtTL/71mJNDfpUbCOmnf/XFkzKRtD6wL6Uy+3akm4Es=
90-
github.com/gosimple/slug v1.14.0/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ=
89+
github.com/gosimple/slug v1.15.0 h1:wRZHsRrRcs6b0XnxMUBM6WK1U1Vg5B0R7VkIf1Xzobo=
90+
github.com/gosimple/slug v1.15.0/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ=
9191
github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o=
9292
github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc=
9393
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
@@ -158,8 +158,8 @@ github.com/onsi/gomega v1.31.0 h1:54UJxxj6cPInHS3a35wm6BK/F9nHYueZ1NVujHDrnXE=
158158
github.com/onsi/gomega v1.31.0/go.mod h1:DW9aCi7U6Yi40wNVAvT6kzFnEVEI5n3DloYBiKiT6zk=
159159
github.com/opslevel/moredefaults v0.0.0-20240529152742-17d1318a3c12 h1:OQZ3W8kbyCcdS8QUWFTnZd6xtdkfhdckc7Paro7nXio=
160160
github.com/opslevel/moredefaults v0.0.0-20240529152742-17d1318a3c12/go.mod h1:g2GSXVP6LO+5+AIsnMRPN+BeV86OXuFRTX7HXCDtYeI=
161-
github.com/opslevel/opslevel-go/v2024 v2024.11.8 h1:m7MgIfvdeiofFOZ4xY43nPXZN/20RgSPi6Z7q9iyOMM=
162-
github.com/opslevel/opslevel-go/v2024 v2024.11.8/go.mod h1:34kLE/rM0i+alFg52micZnkYA7T63xfD/LaigQHldrk=
161+
github.com/opslevel/opslevel-go/v2024 v2024.12.24 h1:yqByehj/HBKcHV2xnZK9ozAhE+qQfXSWxtp6KLS1f9s=
162+
github.com/opslevel/opslevel-go/v2024 v2024.12.24/go.mod h1:cIwzFyu8HURaGdZKWtKn4pijsyYs8xP8uuDwqgohWgo=
163163
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
164164
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
165165
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
@@ -177,8 +177,8 @@ github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G
177177
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
178178
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
179179
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
180-
github.com/relvacode/iso8601 v1.5.0 h1:hM+cirGvOz6gKuUEqimr5TH3tiQiVOuc2QIO+nI5fY4=
181-
github.com/relvacode/iso8601 v1.5.0/go.mod h1:FlNp+jz+TXpyRqgmM7tnzHHzBnz776kmAH2h3sZCn0I=
180+
github.com/relvacode/iso8601 v1.6.0 h1:eFXUhMJN3Gz8Rcq82f9DTMW0svjtAVuIEULglM7QHTU=
181+
github.com/relvacode/iso8601 v1.6.0/go.mod h1:FlNp+jz+TXpyRqgmM7tnzHHzBnz776kmAH2h3sZCn0I=
182182
github.com/rocktavious/autopilot/v2023 v2023.12.7 h1:v0FieSwgpdZXfCfpffuVullbZ2jTDFPweijeCj1/bfY=
183183
github.com/rocktavious/autopilot/v2023 v2023.12.7/go.mod h1:BxaQ/N7Y6Rpcy04W1ovQVSeNYPHKhUVyKMdQ3a6kbK4=
184184
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
@@ -233,8 +233,8 @@ go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTV
233233
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
234234
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
235235
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
236-
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
237-
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
236+
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
237+
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
238238
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
239239
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
240240
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
@@ -243,8 +243,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
243243
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
244244
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
245245
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
246-
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
247-
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
246+
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
247+
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
248248
golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
249249
golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
250250
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -256,10 +256,10 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
256256
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
257257
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
258258
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
259-
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
260-
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
261-
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
262-
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
259+
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
260+
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
261+
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
262+
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
263263
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
264264
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
265265
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=

0 commit comments

Comments
 (0)