diff --git a/.env b/.env new file mode 100644 index 00000000..6521c1f3 --- /dev/null +++ b/.env @@ -0,0 +1,3 @@ +CGO_ENABLED=1 +CGO_CFLAGS='-I/opt/homebrew/include' +CGO_LDFLAGS='-L/opt/homebrew/lib' diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e5252858..675a1f35 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -38,6 +38,7 @@ jobs: # https://github.com/abiosoft/colima/blob/main/docs/FAQ.md#cannot-connect-to-the-docker-daemon-at-unixvarrundockersock-is-the-docker-daemon-running run: | brew install docker + brew install jq colima start echo DOCKER_HOST="unix://${HOME}/.colima/default/docker.sock" >> $GITHUB_ENV - name: Login to Public ECR diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e53485a0..efa565ea 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,8 +20,17 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: "1.21" - - name: Run Tests - run: |- - cd src/ - go test -race -coverprofile=coverage.txt -covermode=atomic -v ./... + go-version-file: src/go.mod + - name: Install Task + uses: arduino/setup-task@v1 + with: + version: 3.x + repo-token: ${{ secrets.GITHUB_TOKEN }} + - name: Run quality checks and test code + run: task ci + - name: Upload Coverage + uses: codecov/codecov-action@v3 + with: + files: ./src/coverage.txt + fail_ci_if_error: false + verbose: true diff --git a/Taskfile.yml b/Taskfile.yml index 3dedb711..aed9d47e 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -2,6 +2,8 @@ version: '3' +dotenv: ['.env'] + env: OPSLEVEL_GO_PKG: "github.com/opslevel/opslevel-go/v2023" SRC_DIR: "{{.TASKFILE_DIR}}/src" @@ -12,6 +14,7 @@ tasks: cmds: - task: workspace - task: has-latest-opslevel-go + - which jq > /dev/null - task: install-gofumpt - task: install-golangci-lint - task: lint @@ -39,6 +42,7 @@ tasks: cmds: - cmd: echo "Installing development tools..." silent: true + - task: brew-install-jq - task: install-changie - task: install-gofumpt - task: install-golangci-lint @@ -94,6 +98,14 @@ tasks: # internal (not directly called) tasks + brew-install-jq: + internal: true + platforms: [darwin] + cmds: ["brew install jq"] + preconditions: + - sh: 'which brew' + msg: '"brew" needed to install "jq"- see https://brew.sh' + go-install-tool: desc: go install '{{.GO_TOOL}}' and set GOBIN if not set internal: true diff --git a/src/.goreleaser.yml b/src/.goreleaser.yml index 85975bcd..a1c90156 100644 --- a/src/.goreleaser.yml +++ b/src/.goreleaser.yml @@ -8,6 +8,8 @@ builds: mod_timestamp: '{{ .CommitTimestamp }}' flags: - -trimpath + ldflags: + - "-s -w" goos: - darwin goarch: diff --git a/src/cmd/collect.go b/src/cmd/collect.go index b9df3450..32079467 100644 --- a/src/cmd/collect.go +++ b/src/cmd/collect.go @@ -55,7 +55,8 @@ func init() { collectCmd.Flags().StringP("integration-url", "i", "", "OpsLevel integration url (OPSLEVEL_INTEGRATION_URL)") collectCmd.Flags().IntVar(&collectResyncInterval, "resync", 24, "The amount (in hours) before a full resync of the kubernetes cluster happens with OpsLevel. [default: 24]") - viper.BindEnv("integration-url", "OPSLEVEL_INTEGRATION_URL") + err := viper.BindEnv("integration-url", "OPSLEVEL_INTEGRATION_URL") + cobra.CheckErr(err) } func PushPayloads(integrationUrl string, queue <-chan string) { @@ -63,7 +64,8 @@ func PushPayloads(integrationUrl string, queue <-chan string) { restClient := createRestClient() for { for payload := range queue { - restClient.R().SetBody(payload).Post(integrationUrl) + _, err := restClient.R().SetBody(payload).Post(integrationUrl) + cobra.CheckErr(err) } } }() diff --git a/src/cmd/config.go b/src/cmd/config.go index 175fb511..5f7e1497 100644 --- a/src/cmd/config.go +++ b/src/cmd/config.go @@ -70,7 +70,8 @@ func init() { configCmd.AddCommand(configSchemaCmd, configViewCmd, configSampleCmd) configSampleCmd.Flags().Bool("simple", false, "Adjust the sample config to be less complex") - viper.BindPFlags(configSampleCmd.Flags()) + err := viper.BindPFlags(configSampleCmd.Flags()) + cobra.CheckErr(err) } func readConfig() []byte { diff --git a/src/cmd/root.go b/src/cmd/root.go index 36fc6d9b..41f6c405 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -54,14 +54,14 @@ func init() { rootCmd.PersistentFlags().StringP("output", "o", "text", "Output format. One of: json|text") rootCmd.PersistentFlags().Bool("disable-service-create", false, "Turns off automatic service creation (service data will still be reconciled). Overrides environment variable 'OPSLEVEL_DISABLE_SERVICE_CREATE'.") - viper.BindPFlags(rootCmd.PersistentFlags()) - viper.BindEnv("log-format", "OPSLEVEL_LOG_FORMAT", "OL_LOG_FORMAT", "OL_LOGFORMAT") - viper.BindEnv("log-level", "OPSLEVEL_LOG_LEVEL", "OL_LOG_LEVEL", "OL_LOGLEVEL") - viper.BindEnv("api-url", "OPSLEVEL_API_URL", "OL_API_URL", "OL_APIURL", "OPSLEVEL_APP_URL", "OL_APP_URL") - viper.BindEnv("api-token", "OPSLEVEL_API_TOKEN", "OL_API_TOKEN", "OL_APITOKEN") - viper.BindEnv("api-timeout", "OPSLEVEL_API_TIMEOUT") - viper.BindEnv("workers", "OPSLEVEL_WORKERS", "OL_WORKERS") - viper.BindEnv("disable-service-create", "OPSLEVEL_DISABLE_SERVICE_CREATE", "OL_DISABLE_SERVICE_CREATE") + cobra.CheckErr(viper.BindPFlags(rootCmd.PersistentFlags())) + cobra.CheckErr(viper.BindEnv("log-format", "OPSLEVEL_LOG_FORMAT", "OL_LOG_FORMAT", "OL_LOGFORMAT")) + cobra.CheckErr(viper.BindEnv("log-level", "OPSLEVEL_LOG_LEVEL", "OL_LOG_LEVEL", "OL_LOGLEVEL")) + cobra.CheckErr(viper.BindEnv("api-url", "OPSLEVEL_API_URL", "OL_API_URL", "OL_APIURL", "OPSLEVEL_APP_URL", "OL_APP_URL")) + cobra.CheckErr(viper.BindEnv("api-token", "OPSLEVEL_API_TOKEN", "OL_API_TOKEN", "OL_APITOKEN")) + cobra.CheckErr(viper.BindEnv("api-timeout", "OPSLEVEL_API_TIMEOUT")) + cobra.CheckErr(viper.BindEnv("workers", "OPSLEVEL_WORKERS", "OL_WORKERS")) + cobra.CheckErr(viper.BindEnv("disable-service-create", "OPSLEVEL_DISABLE_SERVICE_CREATE", "OL_DISABLE_SERVICE_CREATE")) cobra.OnInitialize(func() { setupEnv() setupLogging() @@ -117,7 +117,8 @@ func IsTextOutput() bool { } func setupConcurrency() { - maxprocs.Set(maxprocs.Logger(log.Debug().Msgf)) + _, err := maxprocs.Set(maxprocs.Logger(log.Debug().Msgf)) + cobra.CheckErr(err) concurrency = viper.GetInt("workers") if concurrency <= 0 { diff --git a/src/common/reconciler.go b/src/common/reconciler.go index 5889e737..ed52b0b0 100644 --- a/src/common/reconciler.go +++ b/src/common/reconciler.go @@ -73,28 +73,28 @@ func (r *ServiceReconciler) ContainsAllTags(tagAssigns []opslevel.TagInput, serv } func (r *ServiceReconciler) ServiceNeedsUpdate(input opslevel.ServiceUpdateInput, service *opslevel.Service) bool { - if input.Name != "" && input.Name != service.Name { + if input.Name != nil && *input.Name != service.Name { return true } - if input.Product != "" && input.Product != service.Product { + if input.Product != nil && *input.Product != service.Product { return true } - if input.Description != "" && input.Description != service.Description { + if input.Description != nil && *input.Description != service.Description { return true } - if input.Language != "" && input.Language != service.Language { + if input.Language != nil && *input.Language != service.Language { return true } - if input.Framework != "" && input.Framework != service.Framework { + if input.Framework != nil && *input.Framework != service.Framework { return true } - if input.Tier != "" && input.Tier != service.Tier.Alias { + if input.TierAlias != nil && *input.TierAlias != service.Tier.Alias { return true } - if input.Lifecycle != "" && input.Lifecycle != service.Lifecycle.Alias { + if input.LifecycleAlias != nil && *input.LifecycleAlias != service.Lifecycle.Alias { return true } - if input.Owner != nil && *input.Owner.Alias != service.Owner.Alias { + if input.OwnerInput != nil && *input.OwnerInput.Alias != service.Owner.Alias { return true } return false @@ -162,26 +162,26 @@ func (r *ServiceReconciler) handleService(registration opslevel_jq_parser.Servic func (r *ServiceReconciler) createService(registration opslevel_jq_parser.ServiceRegistration) (*opslevel.Service, error) { serviceCreateInput := opslevel.ServiceCreateInput{ Name: registration.Name, - Product: registration.Product, - Description: registration.Description, - Language: registration.Language, - Framework: registration.Framework, + Product: opslevel.RefOf[string](registration.Product), + Description: opslevel.RefOf[string](registration.Description), + Language: opslevel.RefOf[string](registration.Language), + Framework: opslevel.RefOf[string](registration.Framework), } if registration.System != "" { serviceCreateInput.Parent = opslevel.NewIdentifier(registration.System) } if v, ok := opslevel.Cache.TryGetTier(registration.Tier); ok { - serviceCreateInput.Tier = string(v.Alias) + serviceCreateInput.TierAlias = opslevel.RefOf(v.Alias) } else if registration.Tier != "" { log.Warn().Msgf("[%s] Unable to find 'Tier' with alias '%s'", registration.Name, registration.Tier) } if v, ok := opslevel.Cache.TryGetLifecycle(registration.Lifecycle); ok { - serviceCreateInput.Lifecycle = string(v.Alias) + serviceCreateInput.LifecycleAlias = opslevel.RefOf(v.Alias) } else if registration.Lifecycle != "" { log.Warn().Msgf("[%s] Unable to find 'Lifecycle' with alias '%s'", registration.Name, registration.Lifecycle) } if v, ok := opslevel.Cache.TryGetTeam(registration.Owner); ok { - serviceCreateInput.Owner = opslevel.NewIdentifier(v.Alias) + serviceCreateInput.OwnerInput = opslevel.NewIdentifier(v.Alias) } else if registration.Owner != "" { log.Warn().Msgf("[%s] Unable to find 'Team' with alias '%s'", registration.Name, registration.Owner) } @@ -196,27 +196,27 @@ func (r *ServiceReconciler) createService(registration opslevel_jq_parser.Servic func (r *ServiceReconciler) updateService(service *opslevel.Service, registration opslevel_jq_parser.ServiceRegistration) { updateServiceInput := opslevel.ServiceUpdateInput{ - Id: service.Id, - Product: registration.Product, - Description: registration.Description, - Language: registration.Language, - Framework: registration.Framework, + Id: &service.Id, + Product: opslevel.RefOf[string](registration.Product), + Description: opslevel.RefOf[string](registration.Description), + Language: opslevel.RefOf[string](registration.Language), + Framework: opslevel.RefOf[string](registration.Framework), } if registration.System != "" { updateServiceInput.Parent = opslevel.NewIdentifier(registration.System) } if v, ok := opslevel.Cache.TryGetTier(registration.Tier); ok { - updateServiceInput.Tier = string(v.Alias) + updateServiceInput.TierAlias = opslevel.RefOf(v.Alias) } else if registration.Tier != "" { log.Warn().Msgf("[%s] Unable to find 'Tier' with alias '%s'", service.Name, registration.Tier) } if v, ok := opslevel.Cache.TryGetLifecycle(registration.Lifecycle); ok { - updateServiceInput.Lifecycle = string(v.Alias) + updateServiceInput.LifecycleAlias = opslevel.RefOf(v.Alias) } else if registration.Lifecycle != "" { log.Warn().Msgf("[%s] Unable to find 'Lifecycle' with alias '%s'", service.Name, registration.Lifecycle) } if v, ok := opslevel.Cache.TryGetTeam(registration.Owner); ok { - updateServiceInput.Owner = opslevel.NewIdentifier(v.Alias) + updateServiceInput.OwnerInput = opslevel.NewIdentifier(v.Alias) } else if registration.Owner != "" { log.Warn().Msgf("[%s] Unable to find 'Team' with alias '%s'", service.Name, registration.Owner) } @@ -279,7 +279,7 @@ func (r *ServiceReconciler) handleCreateTags(service *opslevel.Service, registra continue } input := opslevel.TagCreateInput{ - Id: service.Id, + Id: &service.Id, Key: tag.Key, Value: tag.Value, } @@ -294,31 +294,31 @@ func (r *ServiceReconciler) handleCreateTags(service *opslevel.Service, registra func (r *ServiceReconciler) handleTools(service *opslevel.Service, registration opslevel_jq_parser.ServiceRegistration) { for _, tool := range registration.Tools { - if service.HasTool(tool.Category, tool.DisplayName, tool.Environment) { - log.Debug().Msgf("[%s] Tool '{Category: %s, Environment: %s, Name: %s}' already exists on service ... skipping", service.Name, tool.Category, tool.Environment, tool.DisplayName) + if service.HasTool(tool.Category, tool.DisplayName, *tool.Environment) { + log.Debug().Msgf("[%s] Tool '{Category: %s, Environment: %s, Name: %s}' already exists on service ... skipping", service.Name, tool.Category, *tool.Environment, tool.DisplayName) continue } - tool.ServiceId = service.Id + tool.ServiceId = &service.Id err := r.client.CreateTool(tool) if err != nil { - log.Error().Msgf("[%s] Failed assigning tool '{Category: %s, Environment: %s, Name: %s}'\n\tREASON: %v", service.Name, tool.Category, tool.Environment, tool.DisplayName, err.Error()) + log.Error().Msgf("[%s] Failed assigning tool '{Category: %s, Environment: %s, Name: %s}'\n\tREASON: %v", service.Name, tool.Category, *tool.Environment, tool.DisplayName, err.Error()) } else { - log.Info().Msgf("[%s] Ensured tool '{Category: %s, Environment: %s, Name: %s}'", service.Name, tool.Category, tool.Environment, tool.DisplayName) + log.Info().Msgf("[%s] Ensured tool '{Category: %s, Environment: %s, Name: %s}'", service.Name, tool.Category, *tool.Environment, tool.DisplayName) } } } func (r *ServiceReconciler) handleRepositories(service *opslevel.Service, registration opslevel_jq_parser.ServiceRegistration) { for _, repositoryCreate := range registration.Repositories { - repositoryAsString := fmt.Sprintf("{Alias: %s, Directory: %s, Name: %s}", *repositoryCreate.Repository.Alias, repositoryCreate.BaseDirectory, repositoryCreate.DisplayName) + repositoryAsString := fmt.Sprintf("{Alias: %s, Directory: %s, Name: %s}", *repositoryCreate.Repository.Alias, *repositoryCreate.BaseDirectory, *repositoryCreate.DisplayName) foundRepository, foundRepositoryErr := r.client.GetRepositoryWithAlias(*repositoryCreate.Repository.Alias) if foundRepositoryErr != nil { log.Warn().Msgf("[%s] Repository with alias: '%s' not found so it cannot be attached to service ... skipping", service.Name, repositoryAsString) continue } - serviceRepository := foundRepository.GetService(service.Id, repositoryCreate.BaseDirectory) + serviceRepository := foundRepository.GetService(service.Id, *repositoryCreate.BaseDirectory) if serviceRepository != nil { - if repositoryCreate.DisplayName != "" && serviceRepository.DisplayName != repositoryCreate.DisplayName { + if repositoryCreate.DisplayName != nil && serviceRepository.DisplayName != *repositoryCreate.DisplayName { repositoryUpdate := opslevel.ServiceRepositoryUpdateInput{ Id: serviceRepository.Id, DisplayName: repositoryCreate.DisplayName, diff --git a/src/common/reconciler_test.go b/src/common/reconciler_test.go index 6c4601c0..1c9cd989 100644 --- a/src/common/reconciler_test.go +++ b/src/common/reconciler_test.go @@ -61,8 +61,8 @@ func TestReconcilerReconcile(t *testing.T) { Aliases: []string{"test1", "test2", "test3"}, TagAssigns: []opslevel.TagInput{{Key: "foo", Value: "bar"}, {Key: "hello", Value: "world"}}, TagCreates: []opslevel.TagInput{{Key: "env", Value: "test"}}, - Tools: []opslevel.ToolCreateInput{{Category: opslevel.ToolCategoryCode, DisplayName: "test", Url: "https://example.com", Environment: "test"}}, - Repositories: []opslevel.ServiceRepositoryCreateInput{{Service: *opslevel.NewIdentifier(""), Repository: *opslevel.NewIdentifier(""), DisplayName: "", BaseDirectory: ""}}, + Tools: []opslevel.ToolCreateInput{{Category: opslevel.ToolCategoryCode, DisplayName: "test", Url: "https://example.com", Environment: opslevel.RefOf("test")}}, + Repositories: []opslevel.ServiceRepositoryCreateInput{{Service: *opslevel.NewIdentifier(""), Repository: *opslevel.NewIdentifier(""), DisplayName: opslevel.RefOf(""), BaseDirectory: opslevel.RefOf("")}}, } cases := map[string]TestCase{ "Missing Aliases Should Error": { @@ -350,48 +350,48 @@ func Test_Reconciler_ServiceNeedsUpdate(t *testing.T) { cases := map[string]TestCase{ "Is True When Input Differs 1": { input: opslevel.ServiceUpdateInput{ - Name: "Test1", + Name: opslevel.RefOf("Test1"), }, service: service1, result: true, }, "Is True When Input Differs 2": { input: opslevel.ServiceUpdateInput{ - Name: "Test", - Language: "Python", - Tier: "tier_2", + Name: opslevel.RefOf("Test"), + Language: opslevel.RefOf("Python"), + TierAlias: opslevel.RefOf("tier_2"), }, service: service1, result: true, }, "Is True When Input Differs 3": { input: opslevel.ServiceUpdateInput{ - Name: "Test", - Language: "Python", - Owner: opslevel.NewIdentifier("platform"), + Name: opslevel.RefOf("Test"), + Language: opslevel.RefOf("Python"), + OwnerInput: opslevel.NewIdentifier("platform"), }, service: service1, result: true, }, "Is False When Input Matches 1": { input: opslevel.ServiceUpdateInput{ - Id: "XXX", + Id: opslevel.NewID("XXX"), }, service: service2, result: false, }, "Is False When Input Matches 2": { input: opslevel.ServiceUpdateInput{ - Name: "Test", + Name: opslevel.RefOf("Test"), }, service: service2, result: false, }, "Is False When Input Matches 3": { input: opslevel.ServiceUpdateInput{ - Name: "Test", - Language: "Python", - Tier: "tier_1", + Name: opslevel.RefOf("Test"), + Language: opslevel.RefOf("Python"), + TierAlias: opslevel.RefOf("tier_1"), }, service: service2, result: false, diff --git a/src/go.mod b/src/go.mod index a79b6ea8..93cc7b0c 100644 --- a/src/go.mod +++ b/src/go.mod @@ -45,7 +45,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-retryablehttp v0.7.5 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hasura/go-graphql-client v0.10.1 // indirect + github.com/hasura/go-graphql-client v0.10.2 // indirect github.com/huandu/xstrings v1.4.0 // indirect github.com/iancoleman/orderedmap v0.3.0 // indirect github.com/imdario/mergo v0.3.16 // indirect @@ -74,12 +74,12 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.17.0 // indirect + golang.org/x/crypto v0.18.0 // indirect golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect - golang.org/x/net v0.19.0 // indirect + golang.org/x/net v0.20.0 // indirect golang.org/x/oauth2 v0.15.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/appengine v1.6.8 // indirect diff --git a/src/go.sum b/src/go.sum index c93225b6..1ca3ec48 100644 --- a/src/go.sum +++ b/src/go.sum @@ -71,8 +71,8 @@ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLe github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/gosimple/slug v1.13.1 h1:bQ+kpX9Qa6tHRaK+fZR0A0M2Kd7Pa5eHPPsb1JpHD+Q= github.com/gosimple/slug v1.13.1/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o= @@ -90,8 +90,8 @@ github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hasura/go-graphql-client v0.10.1 h1:9lY5mFfKRIjkPJ/EUq41mWYJZpTdAVjs24nibWoGyDo= -github.com/hasura/go-graphql-client v0.10.1/go.mod h1:z9UPkMmCBMuJjvBEtdE6F+oTR2r15AcjirVNq/8P+Ig= +github.com/hasura/go-graphql-client v0.10.2 h1:+/v5/gWYgWr0cpd0aCi4GNtiy8uAIxnkADHTKDM+boY= +github.com/hasura/go-graphql-client v0.10.2/go.mod h1:eNNnmHAp6NgwKZ4xRbZEfywxr07qk34Y0QhbPsYIfhw= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= @@ -218,8 +218,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -236,8 +236,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -259,16 +259,16 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= diff --git a/src/submodules/opslevel-go b/src/submodules/opslevel-go index 168be060..ba5d57f1 160000 --- a/src/submodules/opslevel-go +++ b/src/submodules/opslevel-go @@ -1 +1 @@ -Subproject commit 168be060e7ef6d5d665585748d43dc3cf2f29520 +Subproject commit ba5d57f1f5917943bfc3d32e8d89756838778610 diff --git a/src/submodules/opslevel-jq-parser b/src/submodules/opslevel-jq-parser index a6959ae6..2af0e52e 160000 --- a/src/submodules/opslevel-jq-parser +++ b/src/submodules/opslevel-jq-parser @@ -1 +1 @@ -Subproject commit a6959ae6cee67cebe525f2e869d1d8c4fa5b56c6 +Subproject commit 2af0e52e46087fc36572143c100644fa678194b3 diff --git a/src/submodules/opslevel-k8s-controller b/src/submodules/opslevel-k8s-controller index 1d18a3b2..67767566 160000 --- a/src/submodules/opslevel-k8s-controller +++ b/src/submodules/opslevel-k8s-controller @@ -1 +1 @@ -Subproject commit 1d18a3b28aeeee7b0dca63b5cb7f2e13569a60ca +Subproject commit 677675668a9b79712791ccad91bad0517800168c