From c7696dd2b4e3c76fc48738b4254aed7f2e488f9d Mon Sep 17 00:00:00 2001 From: Hilmar Falkenberg Date: Wed, 6 Mar 2024 11:54:00 +0100 Subject: [PATCH 01/83] MIT LICENSE for npm publish gist (#684) From cloverstd Fr 16.02.2024 17:10 You can use the code of this gist under the MIT LICENSE. --- .reuse/dep5 | 6 ++- LICENSES/MIT.txt | 9 ++++ .../handlers/generic/npm/blobhandler.go | 48 +++++++++++++++++-- .../handlers/generic/npm/publish.go | 48 +------------------ 4 files changed, 59 insertions(+), 52 deletions(-) create mode 100644 LICENSES/MIT.txt diff --git a/.reuse/dep5 b/.reuse/dep5 index f7b2f5d7de..30a2631ec6 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -25,9 +25,13 @@ Disclaimer: The code in this project may include calls to APIs ("API Calls") of parties the right to use of access any SAP External Product, through API Calls. Files: ** -Copyright: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors +Copyright: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors License: Apache-2.0 Files: pkg/mimeutils/* Copyright: Copyright 2010 The Go Authors. All rights reserved. License: BSD-3-Clause + +Files: pkg/contexts/ocm/blobhandler/handlers/generic/npm/publish.go +Copyright: Copyright 2021 - cloverstd +License: MIT diff --git a/LICENSES/MIT.txt b/LICENSES/MIT.txt new file mode 100644 index 0000000000..2071b23b0e --- /dev/null +++ b/LICENSES/MIT.txt @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/blobhandler.go index a8bcbd42b6..709141fd4d 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/blobhandler.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/blobhandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package npm import ( @@ -152,3 +148,47 @@ func (b *artifactHandler) StoreBlob(blob cpi.BlobAccess, _ string, _ string, _ c log.Debug("successfully uploaded") return npm.New(b.spec.Url, pkg.Name, pkg.Version), nil } + +// Check if package already exists in npm registry. If it does, checks if it's the same. +func packageExists(repoUrl string, pkg Package, token string) (bool, error) { + client := http.Client{} + req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, repoUrl+"/"+url.PathEscape(pkg.Name)+"/"+url.PathEscape(pkg.Version), nil) + if err != nil { + return false, err + } + req.Header.Set("authorization", "Bearer "+token) + resp, err := client.Do(req) + if err != nil { + return false, err + } + defer resp.Body.Close() + if resp.StatusCode == http.StatusNotFound { + // artifact doesn't exist, it's safe to upload + return false, nil + } + + // artifact exists, let's check if it's the same + all, err := io.ReadAll(resp.Body) + if err != nil { + return false, err + } + if resp.StatusCode != http.StatusOK { + return false, fmt.Errorf("http (%d) - %s", resp.StatusCode, string(all)) + } + var data map[string]interface{} + err = json.Unmarshal(all, &data) + if err != nil { + return false, err + } + dist := data["dist"].(map[string]interface{}) + if pkg.Dist.Integrity == dist["integrity"] { + // sha-512 sum is the same, we can skip the upload + return true, nil + } + if pkg.Dist.Shasum == dist["shasum"] { + // sha-1 sum is the same, we can skip the upload + return true, nil + } + + return false, fmt.Errorf("artifact already exists but has different shasum or integrity") +} diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/publish.go b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/publish.go index b97be893a4..cb5058e662 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/publish.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/publish.go @@ -1,6 +1,4 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 +// inspired by @cloverstd - https://gist.github.com/cloverstd/7355e95424d59256123a1093f76f78a6 package npm @@ -172,47 +170,3 @@ func prepare(data []byte) (*Package, error) { pkg.Dist.Integrity = createSha512(data) return &pkg, nil } - -// Check if package already exists in npm registry. If it does, checks if it's the same. -func packageExists(repoUrl string, pkg Package, token string) (bool, error) { - client := http.Client{} - req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, repoUrl+"/"+url.PathEscape(pkg.Name)+"/"+url.PathEscape(pkg.Version), nil) - if err != nil { - return false, err - } - req.Header.Set("authorization", "Bearer "+token) - resp, err := client.Do(req) - if err != nil { - return false, err - } - defer resp.Body.Close() - if resp.StatusCode == http.StatusNotFound { - // artifact doesn't exist, it's safe to upload - return false, nil - } - - // artifact exists, let's check if it's the same - all, err := io.ReadAll(resp.Body) - if err != nil { - return false, err - } - if resp.StatusCode != http.StatusOK { - return false, fmt.Errorf("http (%d) - %s", resp.StatusCode, string(all)) - } - var data map[string]interface{} - err = json.Unmarshal(all, &data) - if err != nil { - return false, err - } - dist := data["dist"].(map[string]interface{}) - if pkg.Dist.Integrity == dist["integrity"] { - // sha-512 sum is the same, we can skip the upload - return true, nil - } - if pkg.Dist.Shasum == dist["shasum"] { - // sha-1 sum is the same, we can skip the upload - return true, nil - } - - return false, fmt.Errorf("artifact already exists but has different shasum or integrity") -} From 715e348bea55d29e28f98ec60e35dc9beea3d522 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 10:28:47 +0100 Subject: [PATCH 02/83] Bump helm.sh/helm/v3 from 3.12.2 to 3.14.1 (#659) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [helm.sh/helm/v3](https://github.com/helm/helm) from 3.12.2 to 3.14.1.
Release notes

Sourced from helm.sh/helm/v3's releases.

Helm v3.14.1 is a security (patch) release. Users are strongly recommended to update to this release.

A Helm contributor discovered a path traversal vulnerability when Helm saves a chart including at download time.

Dominykas BlyΕΎΔ— with Nearform Ltd. discovered the vulnerability.

Installation and Upgrading

Download Helm v3.14.1. The common platform binaries are here:

This release was signed with 672C 657B E06B 4B30 969C 4A57 4614 49C2 5E36 B98E and can be found at @​mattfarina keybase account. Please use the attached signatures for verifying this release using gpg.

The Quickstart Guide will get you going from there. For upgrade instructions or detailed installation notes, check the install guide. You can also use a script to install on any system with bash.

What's Next

  • 3.14.2 will contain only bug fixes and be released on March 13, 2024.
  • 3.15.0 is the next feature release and will be on May 08, 2024.

Helm v3.14.0 is a feature release. Users are encouraged to upgrade for the best experience.

The community keeps growing, and we'd love to see you there!

  • Join the discussion in Kubernetes Slack:
    • for questions and just to hang out
    • for discussing PRs, code, and bugs
  • Hang out at the Public Developer Call: Thursday, 9:30 Pacific via Zoom
  • Test, debug, and contribute charts: ArtifactHub/packages

Notable Changes

  • New helm search flag of --fail-on-no-result
  • Allow a nested tpl invocation access to defines
  • Speed up the tpl function
  • Added qps/HELM_QPS parameter that tells Kubernetes packages how to operate
  • Added --kube-version to lint command
  • The ignore pkg is now public

Installation and Upgrading

... (truncated)

Commits
  • e8858f8 validation fix
  • 3fc9f4b Improve release action
  • 69dcc92 bump version to
  • 27921d0 Merge pull request #12698 from mattfarina/fix-10920
  • c042264 Fix issues when verify generation readiness was merged
  • b299359 Merge pull request #10920 from muang0/readiness-generation-check
  • 7fd0804 Merge pull request #12617 from porridge/dynamic-client
  • 1ccde5a Merge pull request #10677 from antoinedeschenes/lint-kube-version
  • 6e5332e fix test to use the default code's k8sVersionMinor
  • 869c1d2 lint: Add --kube-version flag to set capabilities and deprecation rules
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=helm.sh/helm/v3&package-manager=go_modules&previous-version=3.12.2&new-version=3.14.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/open-component-model/ocm/network/alerts).
--------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Uwe Krueger --- .github/workflows/release.yaml | 2 +- go.mod | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e33ec08358..41dc123c19 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -211,7 +211,7 @@ jobs: - name: Create and Push Release run: | - git checkout --detach HEAD + # git checkout --detach HEAD echo -n "${RELEASE_VERSION#v}" > VERSION git add VERSION git commit -m "Release $RELEASE_VERSION" diff --git a/go.mod b/go.mod index 9e77331d74..cec7243000 100644 --- a/go.mod +++ b/go.mod @@ -78,15 +78,6 @@ require ( sigs.k8s.io/yaml v1.4.0 ) -require ( - github.com/buildkite/go-pipeline v0.3.2 // indirect - github.com/gomodule/redigo v1.8.9 // indirect - github.com/gorilla/websocket v1.5.1 // indirect - github.com/jinzhu/gorm v1.9.16 // indirect - github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect - gopkg.in/evanphx/json-patch.v5 v5.7.0 // indirect -) - // indirect dependencies require ( cloud.google.com/go/compute v1.23.3 // indirect @@ -144,6 +135,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver v3.5.1+incompatible // indirect github.com/buildkite/agent/v3 v3.62.0 // indirect + github.com/buildkite/go-pipeline v0.3.2 // indirect github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect @@ -195,6 +187,7 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/gomodule/redigo v1.8.9 // indirect github.com/google/btree v1.1.2 // indirect github.com/google/certificate-transparency-go v1.1.7 // indirect github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect @@ -209,6 +202,7 @@ require ( github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/gorilla/mux v1.8.1 // indirect + github.com/gorilla/websocket v1.5.1 // indirect github.com/gosuri/uitable v0.0.4 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect @@ -222,6 +216,7 @@ require ( github.com/in-toto/in-toto-golang v0.9.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 // indirect + github.com/jinzhu/gorm v1.9.16 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmoiron/sqlx v1.3.5 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -251,6 +246,7 @@ require ( github.com/morikuni/aec v1.0.0 // indirect github.com/mozillazg/docker-credential-acr-helper v0.3.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/oleiade/reflections v1.0.1 // indirect @@ -322,6 +318,7 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect google.golang.org/grpc v1.61.0 // indirect google.golang.org/protobuf v1.32.0 // indirect + gopkg.in/evanphx/json-patch.v5 v5.7.0 // indirect gopkg.in/go-jose/go-jose.v2 v2.6.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect From bfff74046501cfbad981d61762cbc6d5d58857d1 Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Thu, 7 Mar 2024 10:41:55 +0100 Subject: [PATCH 03/83] Update dependabot.yml --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f689040921..ebcdbc4c68 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,7 +10,7 @@ updates: - "*" schedule: interval: "weekly" - day: "sunday" + day: "friday" - package-ecosystem: "gomod" directory: "/" groups: From 97498a63a3218c891c5648233bc5a346c400d0a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Mar 2024 15:04:56 +0100 Subject: [PATCH 04/83] Bump the go_modules group group with 2 updates (#689) Bumps the go_modules group group with 2 updates: [github.com/go-jose/go-jose/v3](https://github.com/go-jose/go-jose) and gopkg.in/go-jose/go-jose.v2. Updates `github.com/go-jose/go-jose/v3` from 3.0.1 to 3.0.3
Release notes

Sourced from github.com/go-jose/go-jose/v3's releases.

Version 3.0.3

Fixed

  • Limit decompression output size to prevent a DoS. Backport from v4.0.1.

Version 3.0.2

Fixed

  • DecryptMulti: handle decompression error (#19)

Changed

  • jwe/CompactSerialize: improve performance (#67)
  • Increase the default number of PBKDF2 iterations to 600k (#48)
  • Return the proper algorithm for ECDSA keys (#45)
  • Update golang.org/x/crypto to v0.19 (#94)

Added

  • Add Thumbprint support for opaque signers (#38)
Changelog

Sourced from github.com/go-jose/go-jose/v3's changelog.

v3.0.3

Fixed

  • Limit decompression output size to prevent a DoS. Backport from v4.0.1.

v3.0.2

Fixed

  • DecryptMulti: handle decompression error (#19)

Changed

  • jwe/CompactSerialize: improve performance (#67)
  • Increase the default number of PBKDF2 iterations to 600k (#48)
  • Return the proper algorithm for ECDSA keys (#45)

Added

  • Add Thumbprint support for opaque signers (#38)
Commits
  • add6a28 v3: backport decompression limit fix (#107)
  • 11bb4e7 doc: in v3 branch's README, point to v4 as latest (#101)
  • 863f73b v3.0.2: Update changelog (#95)
  • bdbc794 Update golang.org/x/crypto to v0.19 (backport) (#94)
  • 25bce79 Updated go-jose v3.0.0 to v3.0.1 in jose-util (#70)
  • aa386df jwe/CompactSerialize: improve performance. (#67)
  • 053c9bf DecryptMulti: handle decompression error (#19)
  • ca9011b Bump go version to 1.21.4 to satisfy govulncheck (#68)
  • c8399df Revert pull request #10 (multiple audiences) (#24)
  • ec819e9 Add a security.md doc for contacting us about potential security vulnerabilit...
  • Additional commits viewable in compare view

Updates `gopkg.in/go-jose/go-jose.v2` from 2.6.1 to 2.6.3 Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/open-component-model/ocm/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 21 ++++++++++----------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index cec7243000..e113c53f65 100644 --- a/go.mod +++ b/go.mod @@ -170,7 +170,7 @@ require ( github.com/go-chi/chi v4.1.2+incompatible // indirect github.com/go-errors/errors v1.5.1 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect - github.com/go-jose/go-jose/v3 v3.0.1 // indirect + github.com/go-jose/go-jose/v3 v3.0.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/analysis v0.22.0 // indirect github.com/go-openapi/errors v0.21.0 // indirect @@ -305,11 +305,11 @@ require ( go.step.sm/crypto v0.42.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.18.0 // indirect + golang.org/x/crypto v0.19.0 // indirect golang.org/x/mod v0.14.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/sys v0.17.0 // indirect + golang.org/x/term v0.17.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.17.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect @@ -319,7 +319,7 @@ require ( google.golang.org/grpc v1.61.0 // indirect google.golang.org/protobuf v1.32.0 // indirect gopkg.in/evanphx/json-patch.v5 v5.7.0 // indirect - gopkg.in/go-jose/go-jose.v2 v2.6.1 // indirect + gopkg.in/go-jose/go-jose.v2 v2.6.3 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 1cee437c29..769da631df 100644 --- a/go.sum +++ b/go.sum @@ -363,8 +363,8 @@ github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8b github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= -github.com/go-jose/go-jose/v3 v3.0.1 h1:pWmKFVtt+Jl0vBZTIpz/eAKwsm6LkIxDVVbFHKkchhA= -github.com/go-jose/go-jose/v3 v3.0.1/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= +github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= +github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= @@ -984,7 +984,6 @@ go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1001,8 +1000,8 @@ golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2Uz golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -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/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc h1:ao2WRsKSzW6KuUY9IWPwWahcHCgR0s52IfwutMfEbdM= golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= @@ -1101,8 +1100,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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= @@ -1111,8 +1110,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= -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/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -1203,8 +1202,8 @@ gopkg.in/evanphx/json-patch.v5 v5.7.0 h1:dGKGylPlZ/jus2g1YqhhyzfH0gPy2R8/MYUpW/O gopkg.in/evanphx/json-patch.v5 v5.7.0/go.mod h1:/kvTRh1TVm5wuM6OkHxqXtE/1nUZZpihg29RtuIyfvk= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/go-jose/go-jose.v2 v2.6.1 h1:qEzJlIDmG9q5VO0M/o8tGS65QMHMS1w01TQJB1VPJ4U= -gopkg.in/go-jose/go-jose.v2 v2.6.1/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI= +gopkg.in/go-jose/go-jose.v2 v2.6.3 h1:nt80fvSDlhKWQgSWyHyy5CfmlQr+asih51R8PTWNKKs= +gopkg.in/go-jose/go-jose.v2 v2.6.3/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= From 1a3efd01ea1117ae1d6cd45874932c4afa97b9b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Mar 2024 15:27:07 +0100 Subject: [PATCH 05/83] Bump the ci group with 1 update (#686) Bumps the ci group with 1 update: [anchore/sbom-action](https://github.com/anchore/sbom-action). Updates `anchore/sbom-action` from 0.15.8 to 0.15.9
Release notes

Sourced from anchore/sbom-action's releases.

v0.15.9

Changes in v0.15.9

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=anchore/sbom-action&package-manager=github_actions&previous-version=0.15.8&new-version=0.15.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Uwe Krueger --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 41dc123c19..f4d927f08d 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -140,7 +140,7 @@ jobs: go-version-file: '${{ github.workspace }}/go.mod' - name: Setup Syft - uses: anchore/sbom-action/download-syft@b6a39da80722a2cb0ef5d197531764a89b5d48c3 # v0.15.8 + uses: anchore/sbom-action/download-syft@9fece9e20048ca9590af301449208b2b8861333b # v0.15.9 - name: Setup Cosign uses: sigstore/cosign-installer@v3.4.0 From 6a87dac2663244068db4b1086395508a75549dec Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Fri, 8 Mar 2024 16:03:00 +0100 Subject: [PATCH 06/83] use app token in release (#692) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change. ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- .github/workflows/release.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index f4d927f08d..13d7ad7d69 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -191,6 +191,7 @@ jobs: - name: Update Release Notes File env: RELEASE_NOTES: ${{ steps.release-notes.outputs.body }} + GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} run: | if git ls-remote --exit-code origin refs/tags/${{ env.RELEASE_VERSION }}; then >&2 echo "tag ${{ env.RELEASE_VERSION }} already exists" @@ -210,6 +211,8 @@ jobs: fi - name: Create and Push Release + env: + GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} run: | # git checkout --detach HEAD echo -n "${RELEASE_VERSION#v}" > VERSION From 036adb6397b457e8b4241ae883384a85407b2334 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 8 Mar 2024 15:54:26 +0000 Subject: [PATCH 07/83] ReleaseNotes for v0.8.0 --- docs/releasenotes/v0.8.0.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 docs/releasenotes/v0.8.0.md diff --git a/docs/releasenotes/v0.8.0.md b/docs/releasenotes/v0.8.0.md new file mode 100644 index 0000000000..59d5e16245 --- /dev/null +++ b/docs/releasenotes/v0.8.0.md @@ -0,0 +1,15 @@ +Release v0.8.0 + +- use app token in release (#692) +- Bump the ci group with 1 update (#686) +- Bump the go\_modules group group with 2 updates (#689) +- Bump helm.sh/helm/v3 from 3.12.2 to 3.14.1 (#659) +- MIT LICENSE for npm publish gist (#684) +- cli: verify digests (#681) +- fix transfer OCI index (#683) +- Bump the ci group with 1 update (#678) +- remove second trigger and just keep pull\_request\_target (#682) +- Bump the go group with 35 updates (#679) +- component version check as lib function (#675) +- Wget access method (#630) + From 21dacd0b9c02596252ba533fa75d819d3d184cbb Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 8 Mar 2024 15:54:27 +0000 Subject: [PATCH 08/83] Release v0.8.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f8d71478f5..8adc70fdd9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.0-dev +0.8.0 \ No newline at end of file From 07d268a81935d93c580ec4022bb6112ca25a666f Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 8 Mar 2024 16:11:48 +0000 Subject: [PATCH 09/83] Update version file to 0.9.0-dev --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8adc70fdd9..c70836ca5c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.0 \ No newline at end of file +0.9.0-dev From 4727008141edbf9b5a04040fed39b240354c3e7c Mon Sep 17 00:00:00 2001 From: ikhandamirov <108289993+ikhandamirov@users.noreply.github.com> Date: Tue, 12 Mar 2024 15:57:08 +0100 Subject: [PATCH 10/83] support for github enterprise urls (#698) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change. ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [x] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [x] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- pkg/contexts/credentials/builtin/github/identity/identity.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/contexts/credentials/builtin/github/identity/identity.go b/pkg/contexts/credentials/builtin/github/identity/identity.go index 9f61e94055..2d95dd7759 100644 --- a/pkg/contexts/credentials/builtin/github/identity/identity.go +++ b/pkg/contexts/credentials/builtin/github/identity/identity.go @@ -58,7 +58,7 @@ func GetConsumerId(serverurl string, repo ...string) cpi.ConsumerIdentity { port := "" if serverurl != "" { u, err := url.Parse(serverurl) - if err != nil { + if err == nil { host = u.Host } } From a8b685a8cf6dd11b2fcab135e05c35a7a9aa12d9 Mon Sep 17 00:00:00 2001 From: Hilmar Falkenberg Date: Fri, 15 Mar 2024 09:29:02 +0100 Subject: [PATCH 11/83] follow Docker official images recommendation (#699) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Publishes latest changes on `main` branch as [package](https://github.com/open-component-model/ocm/pkgs/container/ocm). ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [x] πŸ€– Build - [ ] πŸ” CI - [x] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [x] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [x] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [x] Any dependent changes have been merged and published in downstream modules --- .dockerignore | 37 +++++++++++++++++ .github/workflows/push_ocm.yaml | 73 +++++++++++++++++++++++++++++++++ Dockerfile | 38 +++++++++++++++++ README.md | 43 ++++++++++++++++++- components/ocmcli/Dockerfile | 24 ++++++++--- components/ocmcli/README.md | 5 +-- components/ocmcli/ocm.sh | 20 +++++++++ 7 files changed, 229 insertions(+), 11 deletions(-) create mode 100644 .dockerignore create mode 100644 .github/workflows/push_ocm.yaml create mode 100644 Dockerfile create mode 100644 components/ocmcli/ocm.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..ba8f5ffed7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,37 @@ +.github +.reuse +.vscode +.idea +.project +.settings + +bin + +/cmds/demoplugin +/cmds/ecrplugin +/cmds/helminstaller +/cmds/test +/components/demoplugin +/components/ecrplugin +/components/helmdemo +/components/helminstaller +/components/subchartsdemo + +/docs +/examples +/hack +/LICENSES +/local + +/pkg/test* + +/testdata +/tmp + +.* +*.exe +*.md +**/Dockerfile + +!go.* +!**/*.go diff --git a/.github/workflows/push_ocm.yaml b/.github/workflows/push_ocm.yaml new file mode 100644 index 0000000000..6217d032e3 --- /dev/null +++ b/.github/workflows/push_ocm.yaml @@ -0,0 +1,73 @@ +name: publish as latest +on: + # publish on pushes to the main branch (image tagged as "latest") + # https://github.com/open-component-model/ocm/pkgs/container/ocm + push: + branches: + - main + +jobs: + docker_publish: + runs-on: ubuntu-latest + permissions: + contents: write + id-token: write + packages: write + + steps: + - name: Generate token + id: generate_token + uses: tibdex/github-app-token@v2 + with: + app_id: ${{ secrets.OCMBOT_APP_ID }} + private_key: ${{ secrets.OCMBOT_PRIV_KEY }} + + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ steps.generate_token.outputs.token }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker Login + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ghcr.io/${{ github.repository }} + + - name: Go Build Cache for Docker + uses: actions/cache@v4 + with: + path: go-build-cache + key: ${{ runner.os }}-go-build-cache-${{ hashFiles('**/go.sum') }} + + - name: inject go-build-cache into docker + uses: reproducible-containers/buildkit-cache-dance@v2 + with: + cache-source: go-build-cache + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + # supported platforms of https://hub.docker.com/_/golang/tags?page=1&name=1.22-alpine3.19 + # platforms: linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x + push: true + tags: | + ghcr.io/open-component-model/ocm:latest + ghcr.io/open-component-model/ocm/ocm.software/ocmcli/ocmcli-image:latest + ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..2172d20491 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,38 @@ +ARG GO_VERSION="1.22" +ARG ALPINE_VERSION="3.19" + +FROM golang:${GO_VERSION}-alpine${ALPINE_VERSION} AS build + +WORKDIR /src +RUN go env -w GOMODCACHE=/root/.cache/go-build + +COPY go.mod go.sum ./ + +ARG GO_PROXY="https://proxy.golang.org" +ENV GOPROXY=${GO_PROXY} +RUN --mount=type=cache,target=/root/.cache/go-build go mod download + +COPY . . +RUN --mount=type=cache,target=/root/.cache/go-build \ + export VERSION=$(go run pkg/version/generate/release_generate.go print-rc-version) && \ + export NOW=$(date -u +%FT%T%z) && \ + go build -trimpath -ldflags \ + "-s -w -X github.com/open-component-model/ocm/pkg/version.gitVersion=$VERSION -X github.com/open-component-model/ocm/pkg/version.buildDate=$NOW" \ + -o /bin/ocm ./cmds/ocm/main.go + +FROM alpine:${ALPINE_VERSION} +COPY --from=build /bin/ocm /bin/ocm +COPY --chmod=0755 components/ocmcli/ocm.sh /bin/ocm.sh + +# https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys +LABEL org.opencontainers.image.description="Open Component Model command line interface based on Alpine ${ALPINE_VERSION}" +LABEL org.opencontainers.image.vendor="SAP SE" +LABEL org.opencontainers.image.licenses="Apache-2.0" +LABEL org.opencontainers.image.url="https://ocm.software/" +LABEL org.opencontainers.image.source="https://github.com/open-component-model/ocm" +LABEL org.opencontainers.image.title="ocm" +LABEL org.opencontainers.image.documentation="https://github.com/open-component-model/ocm/blob/main/docs/reference/ocm.md" +LABEL org.opencontainers.image.base.name="alpine:${ALPINE_VERSION}" + +ENTRYPOINT ["/bin/ocm.sh"] +CMD ["/bin/ocm"] diff --git a/README.md b/README.md index 3d5016b40a..c425557462 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,15 @@ The OCI and OCM support can be found in packages ## Installation -Install the latest release via [Homebrew](https://brew.sh), [Nix](https://nixos.org), or directly from [GitHub Releases](https://github.com/open-component-model/ocm/releases). +Install the latest release via [Homebrew](https://brew.sh), [Nix](https://nixos.org), [Docker](https://www.docker.com/)/[Podman](https://podman.io/) or directly from [GitHub Releases](https://github.com/open-component-model/ocm/releases). + +### Bash + +To install with `bash` for macOS or Linux execute the following command: + +```sh +curl -s https://ocm.software/install.sh | sudo bash +``` ### Install using Homebrew @@ -78,6 +86,37 @@ nix profile list | grep ocm ocm --help ``` +### Usage via Docker / Podman + +```sh +podman run -t ghcr.io/open-component-model/ocm:latest --help +``` + +#### Build and run it yourself + +```sh +podman build -t ocm . +podman run --rm -t ocm --loglevel debug --help +``` + +or interactively: + +```sh +podman run --rm -it ocm /bin/sh +``` + +You can pass in the following arguments to override the predefined defaults: + +- `GO_VERSION`: The **golang** version to be used for compiling. +- `ALPINE_VERSION`: The **alpine** version to be used as the base image. +- `GO_PROXY`: Your **go** proxy to be used for fetching dependencies. + +Please check [hub.docker.com](https://hub.docker.com/_/golang/tags?page=1&name=alpine) for possible version combinations. + +```sh +podman build -t ocm --build-arg GO_VERSION=1.22 --build-arg ALPINE_VERSION=3.19 --build-arg GO_PROXY=https://proxy.golang.org . +``` + ## Examples An example of how to use the `ocm` CLI in a Makefile can be found in [`examples/make`](https://github.com/open-component-model/ocm/blob/main/examples/make/Makefile). @@ -92,6 +131,6 @@ OCM follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/m ## Licensing -Copyright 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +Copyright 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. Please see our [LICENSE](LICENSE) for copyright and license information. Detailed information including third-party components and their licensing/copyright information is available [via the REUSE tool](https://api.reuse.software/info/github.com/open-component-model/ocm). diff --git a/components/ocmcli/Dockerfile b/components/ocmcli/Dockerfile index 3f0cbca20c..3ee0091d14 100644 --- a/components/ocmcli/Dockerfile +++ b/components/ocmcli/Dockerfile @@ -1,11 +1,23 @@ -ARG SUFFIX -ARG OCM_VERSION +# This Dockerfile is used by `make` via the Makefile + ARG ALPINE_VERSION FROM --platform=$BUILDPLATFORM alpine:${ALPINE_VERSION} ARG SUFFIX ARG OCM_VERSION -ARG ALPINE_VERSION -LABEL org.opencontainers.image.description Open Component Model Client ${OCM_VERSION} based on Alpine ${ALPINE_VERSION} -COPY gen/ocmcli/ocmcli.$SUFFIX /usr/bin/ocm -ENTRYPOINT ["/usr/bin/ocm"] +# https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys +LABEL org.opencontainers.image.description="Open Component Model command line interface based on Alpine ${ALPINE_VERSION}" +LABEL org.opencontainers.image.vendor="SAP SE" +LABEL org.opencontainers.image.licenses="Apache-2.0" +LABEL org.opencontainers.image.url="https://ocm.software/" +LABEL org.opencontainers.image.source="https://github.com/open-component-model/ocm" +LABEL org.opencontainers.image.title="ocm" +LABEL org.opencontainers.image.version="${OCM_VERSION}" +LABEL org.opencontainers.image.revision="${OCM_VERSION}" +LABEL org.opencontainers.image.documentation="https://github.com/open-component-model/ocm/blob/main/docs/reference/ocm.md" +LABEL org.opencontainers.image.base.name="alpine:${ALPINE_VERSION}" + +COPY gen/ocmcli/ocmcli.$SUFFIX /bin/ocm +COPY --chmod=0755 components/ocmcli/ocm.sh /bin/ocm.sh +ENTRYPOINT ["/bin/ocm.sh"] +CMD ["/bin/ocm"] diff --git a/components/ocmcli/README.md b/components/ocmcli/README.md index c3139aa417..db5c63a192 100644 --- a/components/ocmcli/README.md +++ b/components/ocmcli/README.md @@ -1,9 +1,8 @@ -# Example ocmcli +# ocm - command line interface This folder contains an example how to build a component version for the OCM cli. - -# Building +## Building You can use `make` to build this component. You will have to adjust the variables at the top of the [makefile](Makefile) to your environment (at least `OCMREPO`). By default, all artifacts are built in the `gen` folder of this project. diff --git a/components/ocmcli/ocm.sh b/components/ocmcli/ocm.sh new file mode 100644 index 0000000000..0225d4c62d --- /dev/null +++ b/components/ocmcli/ocm.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -e + +# this if will check if the first argument is a flag but only works if all arguments require a hyphenated flag -v; -SL; -f arg; etc will work, but not arg1 arg2 +if [ "$#" -eq 0 ] || [ "${1#-}" != "$1" ]; then + set -- "$@" + exec /bin/ocm "$@" + return +fi + +# this case will check if the first argument is a known OCM command +case $1 in + add | bootstrap | cache | check | clean | completion | controller | create | credentials | describe | download | execute | get | hash | help | install | oci | ocm | show | sign | toi | transfer | verify | version) + exec /bin/ocm "$@" + return + ;; +esac + +# else default to run whatever the user wanted like "bash" or "sh" +exec "$@" From a8b6a08d022828bdf092a47dafda8760e935773e Mon Sep 17 00:00:00 2001 From: Hilmar Falkenberg Date: Mon, 18 Mar 2024 15:43:17 +0100 Subject: [PATCH 12/83] let's add a `user` within Docker (#704) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change. ## What type of PR is this? (check all applicable) - [x] πŸ• Feature - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [x] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- Dockerfile | 7 +++++++ cmds/ocm/topics/ocm/labels/topic.go | 6 +++--- components/ocmcli/Dockerfile | 12 ++++++++++-- examples/lib/tour/01-getting-started/README.md | 4 ++-- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2172d20491..8719b97569 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,6 +21,12 @@ RUN --mount=type=cache,target=/root/.cache/go-build \ -o /bin/ocm ./cmds/ocm/main.go FROM alpine:${ALPINE_VERSION} + +# Create group and user +ARG UID=1000 +ARG GID=1000 +RUN addgroup -g "${GID}" ocmGroup && adduser -u "${UID}" ocmUser -G ocmGroup -D + COPY --from=build /bin/ocm /bin/ocm COPY --chmod=0755 components/ocmcli/ocm.sh /bin/ocm.sh @@ -34,5 +40,6 @@ LABEL org.opencontainers.image.title="ocm" LABEL org.opencontainers.image.documentation="https://github.com/open-component-model/ocm/blob/main/docs/reference/ocm.md" LABEL org.opencontainers.image.base.name="alpine:${ALPINE_VERSION}" +USER ocmUser ENTRYPOINT ["/bin/ocm.sh"] CMD ["/bin/ocm"] diff --git a/cmds/ocm/topics/ocm/labels/topic.go b/cmds/ocm/topics/ocm/labels/topic.go index 244f585daf..3ba8d85e3d 100644 --- a/cmds/ocm/topics/ocm/labels/topic.go +++ b/cmds/ocm/topics/ocm/labels/topic.go @@ -30,7 +30,7 @@ which is a list of label definitions. Every label definition has several fields: - *name* *string* - The name of the label also determines the interpretaion of its value. All labels + The name of the label also determines the interpretation of its value. All labels with a dedicated name must have the same globally unique meaning, enabling a common understanding of label content for tools working of such properties of an element. @@ -54,7 +54,7 @@ which is a list of label definitions. Every label definition has several fields: - *value* *any* - The value of the label accoding to the specified format version of the + The value of the label according to the specified format version of the label in the context of its name. - *signing* *bool* (optional) @@ -63,7 +63,7 @@ which is a list of label definitions. Every label definition has several fields: digest of the component version. This allows adding, deleting or modifying labels as part of a process chain during the lifecycle of a component version. - Labels which should describe relevant and unmodifyable content can be marked + Labels which should describe relevant and unmodifiable content can be marked to be signing relevant by setting this label field to true. - *merge* *merge spec* (optional) diff --git a/components/ocmcli/Dockerfile b/components/ocmcli/Dockerfile index 3ee0091d14..5d183a7a67 100644 --- a/components/ocmcli/Dockerfile +++ b/components/ocmcli/Dockerfile @@ -2,9 +2,18 @@ ARG ALPINE_VERSION FROM --platform=$BUILDPLATFORM alpine:${ALPINE_VERSION} + +# Create group and user +ARG UID=1000 +ARG GID=1000 +RUN addgroup -g "${GID}" ocmGroup && adduser -u "${UID}" ocmUser -G ocmGroup -D + ARG SUFFIX ARG OCM_VERSION +COPY gen/ocmcli/ocmcli.$SUFFIX /bin/ocm +COPY --chmod=0755 components/ocmcli/ocm.sh /bin/ocm.sh + # https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys LABEL org.opencontainers.image.description="Open Component Model command line interface based on Alpine ${ALPINE_VERSION}" LABEL org.opencontainers.image.vendor="SAP SE" @@ -17,7 +26,6 @@ LABEL org.opencontainers.image.revision="${OCM_VERSION}" LABEL org.opencontainers.image.documentation="https://github.com/open-component-model/ocm/blob/main/docs/reference/ocm.md" LABEL org.opencontainers.image.base.name="alpine:${ALPINE_VERSION}" -COPY gen/ocmcli/ocmcli.$SUFFIX /bin/ocm -COPY --chmod=0755 components/ocmcli/ocm.sh /bin/ocm.sh +USER ocmUser ENTRYPOINT ["/bin/ocm.sh"] CMD ["/bin/ocm"] diff --git a/examples/lib/tour/01-getting-started/README.md b/examples/lib/tour/01-getting-started/README.md index f1e070aa66..6f84079274 100644 --- a/examples/lib/tour/01-getting-started/README.md +++ b/examples/lib/tour/01-getting-started/README.md @@ -164,7 +164,7 @@ differ, because the code always describes the latest version): ``` resources of the latest version: - version: 0.6.0 + version: 0.8.0 provider: ocm.software 1: name: ocmcli extra identity: "architecture"="amd64","os"="linux" @@ -177,7 +177,7 @@ resources of the latest version: 3: name: ocmcli-image extra identity: resource type: ociImage - access: OCI artifact ghcr.io/open-component-model/ocm/ocm.software/ocmcli/ocmcli-image:0.6.0 + access: OCI artifact ghcr.io/open-component-model/ocm/ocm.software/ocmcli/ocmcli-image:0.8.0 ``` Resources have some metadata, like their identity and a resource type. From 09e73686933678cc5ec9335d8b6e8c10fc3a7021 Mon Sep 17 00:00:00 2001 From: Fabian Burth Date: Thu, 21 Mar 2024 17:14:17 +0100 Subject: [PATCH 13/83] Fix repository cache (#705) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description The repository cache was not able to deal with repository specs that contained fields that cannot be marshalled (since the marshalled repository spec is used as key). This issue was already resolved in the session implementation that essentially implemented its own repository cache. To reduce code duplication and avoid such errors in the future, the session now uses the repository cache implementation. ## What type of PR is this? (check all applicable) - [X] πŸ• Feature - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- .../commands/ocmcmds/components/check/cmd.go | 4 +- .../ocmcmds/components/check/options.go | 4 +- pkg/contexts/ocm/internal/resolver.go | 52 +++++++++---------- pkg/contexts/ocm/session.go | 40 ++++++-------- 4 files changed, 46 insertions(+), 54 deletions(-) diff --git a/cmds/ocm/commands/ocmcmds/components/check/cmd.go b/cmds/ocm/commands/ocmcmds/components/check/cmd.go index d2a95207f7..c298f278d6 100644 --- a/cmds/ocm/commands/ocmcmds/components/check/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/check/cmd.go @@ -7,8 +7,6 @@ package check import ( "fmt" - "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/check" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/spf13/cobra" "k8s.io/apimachinery/pkg/util/json" @@ -24,6 +22,8 @@ import ( "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/ocm" + "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/check" + "github.com/open-component-model/ocm/pkg/optionutils" utils2 "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/cmds/ocm/commands/ocmcmds/components/check/options.go b/cmds/ocm/commands/ocmcmds/components/check/options.go index cb27a7f03f..ca04567f4b 100644 --- a/cmds/ocm/commands/ocmcmds/components/check/options.go +++ b/cmds/ocm/commands/ocmcmds/components/check/options.go @@ -5,11 +5,11 @@ package check import ( - "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/check" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/spf13/pflag" "github.com/open-component-model/ocm/cmds/ocm/pkg/options" + "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/check" + "github.com/open-component-model/ocm/pkg/optionutils" ) func From(o options.OptionSetProvider) *Option { diff --git a/pkg/contexts/ocm/internal/resolver.go b/pkg/contexts/ocm/internal/resolver.go index c94dee7f65..ad32729535 100644 --- a/pkg/contexts/ocm/internal/resolver.go +++ b/pkg/contexts/ocm/internal/resolver.go @@ -14,8 +14,8 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/finalizer" + "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/registrations" - "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) @@ -40,9 +40,12 @@ func (r *ResolverRule) GetPriority() int { return r.prio } +// RepositoryCache is a utility object intended to be used by higher level objects such as session or resolver. Since +// the closing of the repository objects depends on the usage context (e.g. if components have been looked up in this +// repository, these components have to be closed before the repository can be closed), it is the responsibility of the +// higher level objects to close the repositories correctly. type RepositoryCache struct { lock sync.Mutex - finalize finalizer.Finalizer repositories map[datacontext.ObjectKey]Repository } @@ -52,42 +55,32 @@ func NewRepositoryCache() *RepositoryCache { } } -func (c *RepositoryCache) LookupRepository(ctx Context, spec RepositorySpec) (Repository, error) { +func (c *RepositoryCache) LookupRepository(ctx Context, spec RepositorySpec) (Repository, bool, error) { spec, err := ctx.RepositoryTypes().Convert(spec) if err != nil { - return nil, err + return nil, false, err } - data, err := runtime.DefaultJSONEncoding.Marshal(spec) + keyName, err := utils.Key(spec) if err != nil { - return nil, err + return nil, false, err } key := datacontext.ObjectKey{ Object: ctx, - Name: string(data), + Name: keyName, } c.lock.Lock() defer c.lock.Unlock() if r := c.repositories[key]; r != nil { - return r, nil + return r, true, nil } repo, err := ctx.RepositoryForSpec(spec) if err != nil { - return nil, err + return nil, false, err } c.repositories[key] = repo - c.finalize.Close(repo) - return repo, err -} - -func (c *RepositoryCache) Finalize() error { - c.lock.Lock() - defer c.lock.Unlock() - - err := c.finalize.Finalize() - c.repositories = map[datacontext.ObjectKey]Repository{} - return err + return repo, false, err } func NewResolverRule(prefix string, spec RepositorySpec, prio ...int) *ResolverRule { @@ -112,10 +105,11 @@ func (r *ResolverRule) Match(name string) bool { } type MatchingResolver struct { - lock sync.Mutex - ctx Context - cache *RepositoryCache - rules []*ResolverRule + lock sync.Mutex + ctx Context + finalize finalizer.Finalizer + cache *RepositoryCache + rules []*ResolverRule } func NewMatchingResolver(ctx ContextProvider, rules ...*ResolverRule) *MatchingResolver { @@ -132,7 +126,7 @@ func (r *MatchingResolver) OCMContext() Context { } func (r *MatchingResolver) Finalize() error { - return r.cache.Finalize() + return r.finalize.Finalize() } func (r *MatchingResolver) GetRules() []*ResolverRule { @@ -162,10 +156,16 @@ func (r *MatchingResolver) LookupComponentVersion(name string, version string) ( for _, rule := range r.rules { if rule.Match(name) { - repo, err := r.cache.LookupRepository(r.ctx, rule.spec) + repo, cached, err := r.cache.LookupRepository(r.ctx, rule.spec) if err != nil { return nil, err } + if !cached { + // Even though the matching resolver is closed, there might be components or component versions, which + // contain a reference to the repository. Still, it shall be possible to close the matching resolver. + refmgmt.Lazy(repo) + r.finalize.Close(repo) + } cv, err := repo.LookupComponentVersion(name, version) if err == nil && cv != nil { return cv, nil diff --git a/pkg/contexts/ocm/session.go b/pkg/contexts/ocm/session.go index d15cea1696..81e11f8ea8 100644 --- a/pkg/contexts/ocm/session.go +++ b/pkg/contexts/ocm/session.go @@ -10,8 +10,8 @@ import ( "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/datacontext" + "github.com/open-component-model/ocm/pkg/contexts/ocm/internal" "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/utils" ) type ComponentContainer interface { @@ -46,7 +46,7 @@ type Session interface { type session struct { datacontext.Session base datacontext.SessionBase - repositories map[datacontext.ObjectKey]Repository + repositories *internal.RepositoryCache components map[datacontext.ObjectKey]ComponentAccess versions map[datacontext.ObjectKey]ComponentVersionAccess } @@ -63,7 +63,7 @@ func newSession(s datacontext.SessionBase) datacontext.Session { return &session{ Session: s.Session(), base: s, - repositories: map[datacontext.ObjectKey]Repository{}, + repositories: internal.NewRepositoryCache(), components: map[datacontext.ObjectKey]ComponentAccess{}, versions: map[datacontext.ObjectKey]ComponentVersionAccess{}, } @@ -91,36 +91,28 @@ func (s *session) Close() error { } func (s *session) LookupRepository(ctx Context, spec RepositorySpec) (Repository, error) { - spec, err := ctx.RepositoryTypes().Convert(spec) - if err != nil { - return nil, err - } - - keyName, err := utils.Key(spec) - if err != nil { - return nil, err - } - key := datacontext.ObjectKey{ - Object: ctx, - Name: keyName, - } - s.base.Lock() defer s.base.Unlock() if s.base.IsClosed() { return nil, errors.ErrClosed("session") } - if r := s.repositories[key]; r != nil { - return r, nil - } - repo, err := ctx.RepositoryForSpec(spec) + repo, cached, err := s.repositories.LookupRepository(ctx, spec) if err != nil { return nil, err } - s.repositories[key] = repo - s.base.AddCloser(repo) - return repo, err + + // The repo's closer function should only be added once with add closer. Otherwise, it would be attempted to close + // an already closed object. Thus, we only want to add the repo's closer function, if it was not already cached + // (and thus, consequently already added to the sessions close). + // Session has to take over responsibility for open repositories for the Repository Cache because the objects + // opened during a session have to be closed in the reverse order they were opened (e.g. components opened based + // on a previously opened repository have to be closed first). + if !cached { + s.base.AddCloser(repo) + } + + return repo, nil } func (s *session) LookupComponent(c ComponentContainer, name string) (ComponentAccess, error) { From c4c81c576d1390c1a594b0783bded6265f8dc0e8 Mon Sep 17 00:00:00 2001 From: Gerald Morrison <67469729+morri-son@users.noreply.github.com> Date: Thu, 28 Mar 2024 15:21:14 +0100 Subject: [PATCH 14/83] change to compopnent constrcutor file name (#712) ## Description Change name of file `components.yaml` `component.yaml` used in documentation and website to `component-constructor.yaml`. --- cmds/ocm/commands/ocmcmds/common/addhdlrs/interface.go | 2 +- cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go | 2 +- .../ocmcmds/common/inputs/types/ociartifact/input_test.go | 2 +- .../testdata/{component.yaml => component-constructor.yaml} | 0 cmds/ocm/commands/ocmcmds/components/add/cmd.go | 6 +++--- cmds/ocm/commands/ocmcmds/components/add/cmd_test.go | 6 +++--- .../testdata/{component.yaml => component-constructor.yaml} | 0 components/subchartsdemo/Makefile | 4 ++-- .../{components.yaml => component-constructor.yaml} | 0 docs/reference/ocm_add_componentversions.md | 6 +++--- 10 files changed, 14 insertions(+), 14 deletions(-) rename cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/testdata/{component.yaml => component-constructor.yaml} (100%) rename cmds/ocm/commands/ocmcmds/components/add/testdata/{component.yaml => component-constructor.yaml} (100%) rename components/subchartsdemo/{components.yaml => component-constructor.yaml} (100%) diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/interface.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/interface.go index c8bfdcabda..eb2e55c299 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/interface.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/interface.go @@ -101,7 +101,7 @@ type ElementSpec interface { // component versions. type Element interface { // Source provides info about the source the element has been - // derived from. (for example a component.yaml or resources.yaml). + // derived from. (for example a component-constructor.yaml or resources.yaml). Source() SourceInfo // Spec provides access to the element specification. Spec() ElementSpec diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go index 74c017db34..2801b48f6a 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go @@ -303,7 +303,7 @@ func ValidateElementIdentities(kind string, elems []Element) error { } // ValidateElementSpecIdentities validate the element specifications -// taken from some source (for example a resources.yaml or components.yaml). +// taken from some source (for example a resources.yaml or component-constructor.yaml). // The parameter src somehow identifies the element source, for example // the path of the parsed file. func ValidateElementSpecIdentities(kind string, src string, elems []ElementSpec) error { diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/input_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/input_test.go index 7653152958..5502158094 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/input_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/input_test.go @@ -163,7 +163,7 @@ var _ = Describe("Test Environment", func() { }) It("creates ctf and adds component", func() { - Expect(env.Execute("add", "c", "-fc", "--file", ARCH, "testdata/component.yaml")).To(Succeed()) + Expect(env.Execute("add", "c", "-fc", "--file", ARCH, "testdata/component-constructor.yaml")).To(Succeed()) Expect(env.DirExists(ARCH)).To(BeTrue()) CheckComponent(env) }) diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/testdata/component.yaml b/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/testdata/component-constructor.yaml similarity index 100% rename from cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/testdata/component.yaml rename to cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/testdata/component-constructor.yaml diff --git a/cmds/ocm/commands/ocmcmds/components/add/cmd.go b/cmds/ocm/commands/ocmcmds/components/add/cmd.go index a727f3798c..4d60a5b216 100644 --- a/cmds/ocm/commands/ocmcmds/components/add/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/add/cmd.go @@ -74,15 +74,15 @@ func NewCommand(ctx clictx.Context, names ...string) *cobra.Command { func (o *Command) ForName(name string) *cobra.Command { cmd := &cobra.Command{ - Use: "[] [--version ] [] {}", + Use: "[] [--version ] [] {}", Args: cobra.MinimumNArgs(1), Short: "add component version(s) to a (new) transport archive", Example: `
-$ ocm add componentversions --file ctf --version 1.0 components.yaml
+$ ocm add componentversions --file ctf --version 1.0 component-constructor.yaml
 
-and a file components.yaml: +and a file component-constructor.yaml:
 name: ocm.software/demo/test
diff --git a/cmds/ocm/commands/ocmcmds/components/add/cmd_test.go b/cmds/ocm/commands/ocmcmds/components/add/cmd_test.go
index a8b209d1ee..b84614ea16 100644
--- a/cmds/ocm/commands/ocmcmds/components/add/cmd_test.go
+++ b/cmds/ocm/commands/ocmcmds/components/add/cmd_test.go
@@ -89,13 +89,13 @@ var _ = Describe("Test Environment", func() {
 	})
 
 	It("creates ctf and adds component", func() {
-		Expect(env.Execute("add", "c", "-fc", "--file", ARCH, "testdata/component.yaml")).To(Succeed())
+		Expect(env.Execute("add", "c", "-fc", "--file", ARCH, "testdata/component-constructor.yaml")).To(Succeed())
 		Expect(env.DirExists(ARCH)).To(BeTrue())
 		CheckComponent(env, nil)
 	})
 
 	It("creates ctf and adds components", func() {
-		Expect(env.Execute("add", "c", "-fc", "--file", ARCH, "--version", "1.0.0", "testdata/components.yaml")).To(Succeed())
+		Expect(env.Execute("add", "c", "-fc", "--file", ARCH, "--version", "1.0.0", "testdata/component-constructor.yaml")).To(Succeed())
 		Expect(env.DirExists(ARCH)).To(BeTrue())
 		CheckComponent(env, nil)
 	})
@@ -160,7 +160,7 @@ var _ = Describe("Test Environment", func() {
 		})
 
 		It("creates ctf and adds components", func() {
-			Expect(env.Execute("add", "c", "-fcCV", "--lookup", LOOKUP, "--file", ARCH, "testdata/component.yaml")).To(Succeed())
+			Expect(env.Execute("add", "c", "-fcCV", "--lookup", LOOKUP, "--file", ARCH, "testdata/component-constructor.yaml")).To(Succeed())
 			Expect(env.DirExists(ARCH)).To(BeTrue())
 			CheckComponent(env, func(repo ocm.Repository) {
 				cv := MustWithOffset(2, R(repo.LookupComponentVersion(COMPONENT, VERSION)))
diff --git a/cmds/ocm/commands/ocmcmds/components/add/testdata/component.yaml b/cmds/ocm/commands/ocmcmds/components/add/testdata/component-constructor.yaml
similarity index 100%
rename from cmds/ocm/commands/ocmcmds/components/add/testdata/component.yaml
rename to cmds/ocm/commands/ocmcmds/components/add/testdata/component-constructor.yaml
diff --git a/components/subchartsdemo/Makefile b/components/subchartsdemo/Makefile
index ca7a7d29db..fcea0b1203 100644
--- a/components/subchartsdemo/Makefile
+++ b/components/subchartsdemo/Makefile
@@ -31,9 +31,9 @@ ctf: $(GEN)/ctf
 version:
 	@echo $(VERSION)
 
-$(GEN)/ctf: $(GEN)/.exists components.yaml $(ECHOCHARTSRCS) packagespec.yaml podinfo/podinfo-$(PODINFO_CHART_VERSION).tgz
+$(GEN)/ctf: $(GEN)/.exists component-constructor.yaml $(ECHOCHARTSRCS) packagespec.yaml podinfo/podinfo-$(PODINFO_CHART_VERSION).tgz
 	@rm -rf $(GEN)/ctf
-	$(OCM) add componentversions --create VERSION="$(VERSION)" COMMIT="$(COMMIT)" COMPONENT_PREFIX=$(COMPONENT_PREFIX) PROVIDER=$(PROVIDER) PODINFO_VERSION=$(PODINFO_VERSION) PODINFO_CHART_VERSION=$(PODINFO_CHART_VERSION) HELMINSTCOMP=$(HELMINSTCOMP) HELMINSTVERSION=$(HELMINSTVERSION) ECHO_VERSION=$(ECHO_VERSION) ECHO_CHART_VERSION=$(ECHO_CHART_VERSION) --file $(GEN)/ctf components.yaml
+	$(OCM) add componentversions --create VERSION="$(VERSION)" COMMIT="$(COMMIT)" COMPONENT_PREFIX=$(COMPONENT_PREFIX) PROVIDER=$(PROVIDER) PODINFO_VERSION=$(PODINFO_VERSION) PODINFO_CHART_VERSION=$(PODINFO_CHART_VERSION) HELMINSTCOMP=$(HELMINSTCOMP) HELMINSTVERSION=$(HELMINSTVERSION) ECHO_VERSION=$(ECHO_VERSION) ECHO_CHART_VERSION=$(ECHO_CHART_VERSION) --file $(GEN)/ctf component-constructor.yaml
 	@touch $(GEN)/ctf
 
 .PHONY: push
diff --git a/components/subchartsdemo/components.yaml b/components/subchartsdemo/component-constructor.yaml
similarity index 100%
rename from components/subchartsdemo/components.yaml
rename to components/subchartsdemo/component-constructor.yaml
diff --git a/docs/reference/ocm_add_componentversions.md b/docs/reference/ocm_add_componentversions.md
index 66c18b99fb..558b4c4cdd 100644
--- a/docs/reference/ocm_add_componentversions.md
+++ b/docs/reference/ocm_add_componentversions.md
@@ -3,7 +3,7 @@
 ### Synopsis
 
 ```
-ocm add componentversions [] [--version ] [] {}
+ocm add componentversions [] [--version ] [] {}
 ```
 
 ##### Aliases
@@ -149,11 +149,11 @@ script with the script option family.
 
 
 
-$ ocm add componentversions ‐‐file ctf ‐‐version 1.0 components.yaml
+$ ocm add componentversions ‐‐file ctf ‐‐version 1.0 component-constructor.yaml
 
-and a file components.yaml: +and a file component-constructor.yaml:

From 87584373c613da5b1a7c644e879c7cf3f8df4a8b Mon Sep 17 00:00:00 2001
From: Gerald Morrison <67469729+morri-son@users.noreply.github.com>
Date: Tue, 2 Apr 2024 15:33:53 +0200
Subject: [PATCH 15/83] remove docs that are available in the spec (#715)

## Description

remove parts from the "docs" folder that have been moved to the ocm-spec
---
 docs/README.md                                |  87 ---
 docs/formats/README.md                        |  34 -
 docs/formats/accessmethods/README.md          | 110 ---
 docs/formats/artifactdigests/README.md        |  27 -
 docs/formats/compdesc/README.md               |   6 -
 docs/formats/compdesc/v2.md                   |   0
 docs/formats/compdesc/v3alpha1.md             |   0
 docs/formats/repositories/README.md           |  49 --
 docs/formats/resources/README.md              |  22 -
 docs/labels/README.md                         |  10 -
 docs/names/README.md                          |  29 -
 docs/names/accessmethods.md                   |  94 ---
 docs/names/labels.md                          |  93 ---
 docs/names/repositorytypes.md                 |  49 --
 docs/names/resourcetypes.md                   |  44 --
 docs/ocm/Component Descriptor.pptx            | Bin 128517 -> 0 bytes
 docs/ocm/OCM-Implementation-Model.pptx        | Bin 69675 -> 0 bytes
 docs/ocm/README.md                            |  80 ---
 docs/ocm/interoperability.md                  |  68 --
 docs/ocm/model.md                             | 637 ------------------
 docs/ocm/modelmapping/filesystem/README.md    |  12 -
 .../oci/OCM-Implementation-Model.pptx         | Bin 61436 -> 0 bytes
 docs/ocm/modelmapping/oci/README.md           |  88 ---
 docs/ocm/modelmapping/oci/ocm2oci-mapping.png | Bin 131054 -> 0 bytes
 docs/ocm/modelmapping/s3/README.md            |  43 --
 docs/ocm/normalization.md                     | 280 --------
 docs/ocm/ocmaltbind.png                       | Bin 414074 -> 0 bytes
 docs/ocm/ocmidentity.png                      | Bin 80521 -> 0 bytes
 docs/ocm/ocmresourceaccess.png                | Bin 243837 -> 0 bytes
 docs/ocm/ocmspecstruct.png                    | Bin 342795 -> 0 bytes
 docs/ocm/operations.md                        | 111 ---
 docs/ocm/plugins.md                           |  39 --
 32 files changed, 2012 deletions(-)
 delete mode 100644 docs/README.md
 delete mode 100644 docs/formats/README.md
 delete mode 100644 docs/formats/accessmethods/README.md
 delete mode 100644 docs/formats/artifactdigests/README.md
 delete mode 100644 docs/formats/compdesc/README.md
 delete mode 100644 docs/formats/compdesc/v2.md
 delete mode 100644 docs/formats/compdesc/v3alpha1.md
 delete mode 100644 docs/formats/repositories/README.md
 delete mode 100644 docs/formats/resources/README.md
 delete mode 100644 docs/labels/README.md
 delete mode 100644 docs/names/README.md
 delete mode 100644 docs/names/accessmethods.md
 delete mode 100644 docs/names/labels.md
 delete mode 100644 docs/names/repositorytypes.md
 delete mode 100644 docs/names/resourcetypes.md
 delete mode 100755 docs/ocm/Component Descriptor.pptx
 delete mode 100755 docs/ocm/OCM-Implementation-Model.pptx
 delete mode 100644 docs/ocm/README.md
 delete mode 100644 docs/ocm/interoperability.md
 delete mode 100644 docs/ocm/model.md
 delete mode 100644 docs/ocm/modelmapping/filesystem/README.md
 delete mode 100755 docs/ocm/modelmapping/oci/OCM-Implementation-Model.pptx
 delete mode 100644 docs/ocm/modelmapping/oci/README.md
 delete mode 100755 docs/ocm/modelmapping/oci/ocm2oci-mapping.png
 delete mode 100644 docs/ocm/modelmapping/s3/README.md
 delete mode 100644 docs/ocm/normalization.md
 delete mode 100755 docs/ocm/ocmaltbind.png
 delete mode 100755 docs/ocm/ocmidentity.png
 delete mode 100755 docs/ocm/ocmresourceaccess.png
 delete mode 100755 docs/ocm/ocmspecstruct.png
 delete mode 100644 docs/ocm/operations.md
 delete mode 100644 docs/ocm/plugins.md

diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index 53143b257c..0000000000
--- a/docs/README.md
+++ /dev/null
@@ -1,87 +0,0 @@
-# Open Component Model (OCM)
-
-The goal of the Open Component Model is to describe a machine-readable format 
-for software-bill-of-deliveries (SBOD) with the focus on the delivery
-artifacts. Primarily, it does not deal with the content or packages those
-artifacts are composed of. This kind of meta information can be separately
-attached to described artifacts by labels, separate resources or even by separate
-components.
-
-It is a completely technology-agnostic model to describe artifacts and
-the technical access to their content. Technology-agnostic means:
-
-- it can describe any artifact regardless of its technology
-- the artifacts can basically be stored using any storage backend technology or
-  repository
-- the model information can be stored using any storage backend technology or
-  repository
-
-The only constraint is, that there must be
-- an implementation for accessing artifacts in the desired repository technology 
-  and map them to a blob format
-- and a specification for a [mapping scheme](ocm/interoperability.md) describing how
-  to map the elements
-  of the component model to the supported elements of the backend technology
-- and an [implementation](ocm/operations.md) of all the mapping schemes for the
-  storage scenarios used in a dedicated environment.
-
-The model uses a globally unique naming scheme for software [components](ocm/model.md#components).
-Components are versioned. Every component version describes
-a set of formally typed delivery artifacts (like OCI images). Those artifacts
-get assigned unique identities in the context of the component version.
-
-Those artifact definitions may carry an additional arbitrary attribution, and 
-they provide a formal specification of the access method, which can be used
-to access the technical content of the artifact in the actual evaluation
-context of a component version.
-
-The description model allows to transport content from one repository 
-landscape (hosting the real technical artifacts and the component version
-descriptions) into other, especially private,
-environments without losing the validity of the access information. In any
-environment the actual description of the component version carries valid
-environment-specific information for the artifact location.
-
-A transport tool can use the bill of material to determine the set of
-artifacts that have to be transferred and use the access information to access
-the technical content of the artifacts in the source environment. They will then
-be copied into a repository landscape on the target side. In the target
-environment, the model description will be stored, also, after it has been
-adapted to reflect the new location of the described artifacts.
-
-Using provided implementations for the used access types, this can be done 
-in completely generic manner if there is a common interface and a discovery
-mechanism for the implementation of the access methods, based on the type
-information stored along with the artifact description in the component version.
-
-This project contains a Go language binding for the Open Component Model, which
-exactly provides such an extensible implementation frame and a
-generic transport functionality based on this mechanism.
-
-Further, the description provides the possibility to add signatures, to
-be able to verify the authenticity of the described content even after any
-number of transportation steps.
-
-This is achieved by signing a normalized form of a component version description,
-which is independent of a concrete serialization format of a [component descriptor](ocm/model.md#component-descriptor)
-It includes the digests of the described artifacts, but not the technical access
-specifications used to access the artifact in the environment, where the
-signature is created.
-
-This way the Open Component model can be used as foundation or some kind of
-Lingua Franca for any number of _tools_ dealing with software and software artifacts:
-- By using the location-agnostic component, component version and artifact
-  identities to denote the entities they are dealing with
-- By using the location specific access methods described by a local version
-  of the component description to
-  - get access to the content of an artifact in defined formats.
-  - get the local location of the artifact.
-  - verify the authenticity of the artifacts found in the local environment.
-
-Because the identities and the content (but not the location of the content)
-are stable after transportation steps, information stored or provided by
-different tools accompanied by the notation scheme provided by the Open
-Component Model, is exchangeable across different environments and doesn't lose
-its validity.
-
-A more detailed specification can be found [here](ocm/README.md).
\ No newline at end of file
diff --git a/docs/formats/README.md b/docs/formats/README.md
deleted file mode 100644
index 0e086302c5..0000000000
--- a/docs/formats/README.md
+++ /dev/null
@@ -1,34 +0,0 @@
-## Format Specifications
-
-The Open Component Model (OCM) uses some dedicated formats 
-to represent content:
-
-- File Formats
-
-  - Common Transport Format (CTF)
-  
-    It is possible to represent OCI and OCM content as file system content.
-    This is used to provide a repository implementation based on a filesystem, 
-    which can be used to transport content without direct internet access.
-
-    There are three different technical flavors:
-    - `directory`: the content is stored directly as a directory tree
-    - `tar`: the directory tree is stored in a tar archive
-    - `tgz`: the directory tree is stored in a zipped tar archive
-
-    All those technical representations use the same [file formats and directory
-    structure](../../pkg/contexts/oci/repositories/ctf/README.md). 
-
-  - Raw Helm Chart Format
-  
-    Helm Charts can be stored as OCI artifacts in OCI repositories. When
-    downloading those artifacts, by default, they will be transformed to the
-    regular helm file system representation by some download handlers.
-    If a raw format is chosen the 
-    [OCI representation](../../pkg/contexts/oci/repositories/ctf/README.md#artifact-set-archive-format)
-    is used to represent the chart content.
-  
-- Component Descriptor
-  
-  There are two [serialization versions](compdesc/README.md) to store an OCM component descriptor
-  as YAML
\ No newline at end of file
diff --git a/docs/formats/accessmethods/README.md b/docs/formats/accessmethods/README.md
deleted file mode 100644
index 046da3ec17..0000000000
--- a/docs/formats/accessmethods/README.md
+++ /dev/null
@@ -1,110 +0,0 @@
-# Access Methods of the Open Component Model
-
-Access methods describe (and finally implement) dedicated technical ways how to
-access the blob content of a (re)source described by an
-[OCM component descriptor](../../formats/compdesc/README.md).
-
-They are always evaluated in the storage context used to read the component
-descriptor containing the access method description. There are two technical
-flavors of access methods:
-
-- *external access methods*
-
-  Those methods are self-describing and refer to
-  resources stored externally in any supported repository type. 
-
-- *local access methods*
-
-  The access method is evaluated in relation to the repository used to read
-  the component descriptor, which described it. So, this content is potentially
-  read from different repositories, if the component version is moved among
-  repositories, although the properties may be unchanged.
-
-Access Methods are an integral part of the Open Component Model. They always 
-provide the link between a component version stored in some repository context,
-and the technical access of the described resources applicable for this
-context. Therefore, the access method of a resource may change when 
-component versions are transported among repository contexts.
-
-Because of this feature, their implementation must be known to provide basic
-functionality of the model, like transporting
-content by value, in all kinds of environment.
-
-In a dedicated context all used access methods must be known by the used tool
-set. Nevertheless, the set of access methods is not fixed. The actual
-library/tool version provides a simple way to locally add new methods with
-their implementations to support own local environments. This is just done
-by providing an own main function with anonymous imports to the new
-access method packages (example links can be found below each documented
-access method). An external plugin mechanism by calling a separate
-executable is not yet supported.
-
-## Specification
-
-Every access method has a [type](../../names/accessmethods.md) and a
-specification version. The specification version defines the attribute set
-used to describe the information required by the implementation to
-address the resource blob.
-
-A complete access method specification is a yaml data fragment with
-the following fields:
-
-- **`type`** *string*
-
-  This field describes the access method type and optional specification
-  version according to the [access method naming scheme](../../names/accessmethods.md)
-
-Additional fields are used to provide the type specific specification.
-The fields may have any deep structure.
-
-## Centrally defined Access Methods
-
-The following method types are centrally defined and available in the OCM toolset:
-
-- [`ociArtifact`](../../../pkg/contexts/ocm/accessmethods/ociartifact/README.md) *external*
-  
-  Access of an OCI artifact stored in any OCI registry.
-
-- [`relativeOciReference`](../../../pkg/contexts/ocm/accessmethods/relativeociref/README.md) *local* *deprecated*
-
-  Access of an OCI artifact stored in any OCI registry.
-
-- [`ociBlob`](../../../pkg/contexts/ocm/accessmethods/ociblob/README.md) *external*
-
-  Access of an OCI artifact stored in any OCI registry.
-
-- [`gitHub`](../../../pkg/contexts/ocm/accessmethods/github/README.md) *external*
-
-  Access of a git commit in a [github](https://github.com) repository.
-
-- [`helm`](../../../pkg/contexts/ocm/accessmethods/helm/README.md) *external*
-
-  Access of a Helm chart in a [helm](https://helm.sh/docs/topics/chart_repository/) repository.
-
-- [`s3`](../../../pkg/contexts/ocm/accessmethods/s3/README.md) *external*
-
-  Access of a blob in an S3 blob store.
-
-- [`npm`](../../../pkg/contexts/ocm/accessmethods/npm/README.md) *external*
-
-  Access of an NPM module from an NPM registry.
-
-- [`localBlob`](../../../pkg/contexts/ocm/accessmethods/localblob/README.md) *local*
-
-  This is a special access method that has no global implementation.
-  It is used to store resource blobs along with the component descriptor
-  as part of the OCM repository. Therefore, all OCM repository implementations
-  MUST explicitly provide an implementation for this method.
-
-  For example, in an OCI based OCM repository the implementation stores
-  local blobs as additional artifact layers according to the OCI model.
-
-### Legacy Types
-
-- [`ociRegistry`](../../../pkg/contexts/ocm/accessmethods/ociartifact/README.md) *external* (deprecated)
-
-  It is a legacy name on the new official access method `ociArtifact`
-
-- [`github`](../../../pkg/contexts/ocm/accessmethods/github/README.md) *external*
-
-  It is a legacy name on the new official access method `gitHub`
diff --git a/docs/formats/artifactdigests/README.md b/docs/formats/artifactdigests/README.md
deleted file mode 100644
index 9117a16baf..0000000000
--- a/docs/formats/artifactdigests/README.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# Centrally Artifact Normalization Algorithms
-
-
-To be able to sign a component version, the content of described artifacts
-must be incorporated. Therefore, a digest for the artifact content must be
-determined.
-
-By default, this digest is calculated based on the blob provided by the 
-[access method](../../ocm/model.md#artifact-access)
-of an artifact. But there might be technology specific ways to uniquely identify
-the content for dedicated artifact types.
-
-Therefore, together with the digest and its algorithm, an artifact normalization
-algorithm is kept in the [component descriptor](../../ocm/model.md#component-descriptor).
-
-The following algorithms are centrally defined and available in the OCM toolset:
-
-- `ociArtifactDigest/v1`: OCI manifest digest
-
-  This algorithm is used for artifacts of type `ociArtifact`. It just uses the
-  manifest digest of the OCI artifact.
-
-- `genericBlobDigest/v1`: Blob byte stream digest
-  
-  This is the default normalization algorithm. It just uses the blob content
-  provided by the access method of an OCM artifact to calculate the digest. 
-  It is always used, if no special digester is available for an artifact type.
\ No newline at end of file
diff --git a/docs/formats/compdesc/README.md b/docs/formats/compdesc/README.md
deleted file mode 100644
index 21629f02be..0000000000
--- a/docs/formats/compdesc/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Component Descriptor Formats
-
-There are two versions to represent OCM component descriptors as YAML
-
-- [`v2`](v2.md)
-- [`v3alpha1`](v3alpha1.md)
\ No newline at end of file
diff --git a/docs/formats/compdesc/v2.md b/docs/formats/compdesc/v2.md
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/docs/formats/compdesc/v3alpha1.md b/docs/formats/compdesc/v3alpha1.md
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/docs/formats/repositories/README.md b/docs/formats/repositories/README.md
deleted file mode 100644
index f38e49d4c4..0000000000
--- a/docs/formats/repositories/README.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Open Component Model Repository Types
-
-Repository specifications describe technical
-ways of how to access OCM content stored in a technical storage backend of
-a dedicated type. To distinguish specifications for different types of
-storage backends they are typed. A repository type defines
-
-- the specification format of a repository specification used to describe a 
-  dedicated repository instance.
-- the technical procedure how to access the OCM model content in an instance of
-  this repository determined by the information stored in such a repository
-  specification.
-
-## Specification
-
-Every repository specification has a [type](../../names/repositorytypes.md) and
-an optional specification version. The specification version defines the attribute
-set used to describe the information required by the implementation to
-identify and gain access the repository instance (without access credentials).
-The default specification version is `v1`.
-
-A repository specification is a yaml/json data fragment with
-the following fields:
-
-- **`type`** *string*
-
-  This field describes the repository type and optional specification
-  version according to the [repository type naming scheme](../../names/repositorytypes.md).
-
-Every repository type can define arbitrary additional fields.
-These fields may have any deep, but type specific and defined structure.
-The type defines this attribute structure and its interpretation is left to the
-concrete implementation of the repository type. All implementations of a
-dedicated type have to conform to the attribute structure definition of this type.
-
-For example, the type `OCIRegistry` defines two additional flat
-[attributes](../../../pkg/contexts/ocm/repositories/ocireg/README.md): `baseURL`
-and `legacyTypes`.
-
-## Centrally defined Repository Types
-
-The following repository types are centrally defined:
-
-- [`OCIRegistry`](../../../pkg/contexts/ocm/repositories/ocireg/README.md): OCM Repository storing content in an OCI registry
-- [`CommonTransportFormat`](../../../pkg/contexts/ocm/repositories/ctf/README.md): OCM Repository storing content on the filesystem
-- [`ComponentArchive`](../../../pkg/contexts/ocm/repositories/comparch/README.md): Limited OCM Repository capable to store a single [component version](../../ocm/model.md#component-versions) on the filesystem
-
-Centrally defined repository types are supported by the 
-OCM library and tool set. 
\ No newline at end of file
diff --git a/docs/formats/resources/README.md b/docs/formats/resources/README.md
deleted file mode 100644
index 0969cf4e27..0000000000
--- a/docs/formats/resources/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Open Component Model Resource Types
-
-The following resource types are centrally defined:
-
-- `ociArtifact`: a generic OCI artifact following the
-   [open containers image specification](https://github.com/opencontainers/image-spec/blob/main/spec.md)
-- `ociImage`: an OCI image or image list
-- `helmChart`: a helm chart, either stored as OCI artifact or as tar blob (tar media type)
-- `blob`: any anonymous untyped blob data
-- `directoryTree`: a directory structures stored as archive (tar, tgz).
-- `filesystem`: (deprecated) a directory structures stored as archive (tar, tgz).
-
-For centrally defined resource types, there might be special support in the
-OCM library and tool set. For example, there is a dedicated downloader
-for helm charts providing the filesystem helm chart format regardless of
-the storage method and supported media type.
-
-Besides those types, there are some vendor types that are typically used:
-
-- `landscaper.gardener.cloud/blueprint`: an installation description for the landscaper tool
-- `landscaper.ocm.software/gitOpsTemplate`: a filesystem content (tar, tgz)
-  intended to be used as git ops template to set up a git repo used for continuous deployment (for example flux)
\ No newline at end of file
diff --git a/docs/labels/README.md b/docs/labels/README.md
deleted file mode 100644
index 78cb5a92c7..0000000000
--- a/docs/labels/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-## Predefined Labels
-
-Resources, sources, references and component versions feature [labels](../names/labels.md)
-with arbitrarily structured values.
-
-The Open Component Model (OCM) allows defining labels with a predefined meaning
-relevant for the interpretation of a component descriptor. Such label names
-lack a namespace and are just flat names.
-
-So far, no predefined labels are defined centrally.
\ No newline at end of file
diff --git a/docs/names/README.md b/docs/names/README.md
deleted file mode 100644
index 0547aed217..0000000000
--- a/docs/names/README.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# Naming Schemes used in the Open Component Model
-
-In OCM there are several kinds of type names. For all those kinds there
-is a dedicated naming scheme.
-
-- [Repository Type Names](repositorytypes.md)
-
-  OCM repositories can be described by a repository specification. The repository
-  type determines the field structure of the specification and its technical
-  access procedure. 
-
-- [Label Names](labels.md)
-
-  The OCM component descriptor itself, resources, sources  and component version
-  references can be enriched by labels capable to carry values with an
-  arbitrary structure.
-
-- [Resource Type Names](resourcetypes.md)
-
-  The OCM component descriptor describes a set of resources, their type and
-  meaning with attached meta and access information.
-  
-- [Access Method Names](accessmethods.md)
-
-  Access methods describe dedicated technical ways how to access the blob
-  content of a (re)source described by an 
-  [OCM component descriptor](../formats/compdesc/README.md). It is evaluated in
-  the storage context used to read the component descriptor containing the
-  access method description.
\ No newline at end of file
diff --git a/docs/names/accessmethods.md b/docs/names/accessmethods.md
deleted file mode 100644
index efe9fc0565..0000000000
--- a/docs/names/accessmethods.md
+++ /dev/null
@@ -1,94 +0,0 @@
-# Naming Scheme for Access Methods
-
-Access methods describe (and finally implement) dedicated technical ways how to
-access the blob content of a (re)source described by an
-[OCM component descriptor](../formats/compdesc/README.md).
-
-They are an integral part of the Open Component Model. They always
-provide the link between a component version stored in some repository context,
-and the technical access of the described resources applicable for this
-context. Therefore, the access method of a resource may change when
-component versions are transported among repository contexts.
-
-In a dedicated context all used access methods must be known by the used tool
-set. Nevertheless, the set of access methods is not fixed. The actual
-library/tool version provides a simple way to locally add new methods with
-their implementations to support own local environments.
-
-Because of this extensibility, the names of access methods must be globally
-unique.
-
-Like for [resource types](resourcetypes.md), there are two flavors
-of method names:
-
-- centrally provided access methods
-
-  Those methods are coming with the standard OCM library and tool set.
-  It provides an implementation and component version using only such
-  access methods can be use across local organizational extension.
-
-  These types use flat names following a camel case scheme with
-  the first character in lower case (for example `ociArtifact`).
-
-  Their format is described by the following regexp:
-
-  ```regex
-  [a-z][a-zA-Z0-9]*
-  ```
-
-- vendor specific types
-
-  any organization using the open component model may define dedicated access
-  methods on their own. Nevertheless, their name must be globally unique.
-  Basically there may be multiple such types provided by different organizations
-  with the same meaning. But we strongly encourage organizations to share
-  such types instead of introducing new type names.
-
-  Extending the toolset by own access methods always means to locally
-  provide a new tool version with the additionally registered access method
-  implementations. Because the purpose of the Open Component Model is the
-  exchange of software, the involved parties must agree on the used toolset.
-  This might involve methods provided by several potentially non-central 
-  providers. Therefore, use used access method names must be globally unique
-  with a globally unique meaning.
-
-  To support a unique namespace for those type names vendor specific types
-  have to follow a hierarchical naming scheme based on DNS domain names.
-  Every type name has to be suffixed by a DNS domain owned by the providing
-  organization.
-  The local type must follow the above rules for centrally defined type names
-  and suffixed by the namespace separated by a dot (`.`)
-
-  So, the complete pattern looks as follows:
-
-  ```
-  [a-z][a-zA-Z0-9]*\.
-  ```
-  
-Every access method type must define a specification of its attributes,
-required to locate the content. This specification may be versioned.
-Therefore, the type name used in an access specification in the component descriptor
-may include a specification version appended by a slash (`/`).
-Similar to the kubernetes api group versions, the version must match the
-following regexp
-
-```
-v[0-9]+([a-z][a-z0-9]*)?
-```
-
-Examples:
-- `ociArtifact/v1`
-- `myprotocol.acme.org/v1alpha1`
-
-If no version is specified, implicitly the version `v1` is assumed.
-
-The access method type is part of the access specification of an artifact
-in the component descriptor. The access method type may define
-additional specification attributes required to finally identify the 
-concrete access path to the artifact blob.
-
-For example, the access method `ociBlob` requires the OCI repository reference
-and the blob digest to be able to access the blob.
-
-Centrally defined access methods with their specification versions
-can be found [here](../formats/accessmethods/README.md).
\ No newline at end of file
diff --git a/docs/names/labels.md b/docs/names/labels.md
deleted file mode 100644
index 064ca693ac..0000000000
--- a/docs/names/labels.md
+++ /dev/null
@@ -1,93 +0,0 @@
-# Naming Scheme for Labels in the OCM Component Descriptor
-
-There are several elements in the component descriptor, which
-can be annotated by labels:
-
-- The component version itself
-- resource specifications
-- source specifications
-- component version references
-
-Besides the type of an element (for resources and sources), labels
-are intended to express additional semantics for an element. 
-To do so the meaning of labels must be clearly defied. Therefore,
-a label and its bound semantic must be uniquely identified by its name.
-
-The usage of labels is left to the creator of a component version, therefore
-the set of labels must be extensible.
-Because of this extensibility, the names of labels must be globally
-unique, also.
-
-Like for [resource types](resourcetypes.md) there are two flavors
-of label names:
-
-- labels with a predefined meaning for the component model itself.
-
-  Those labels are used by the standard OCM library and tool set to
-  control some behaviour like signing.
-
-  Such labels use flat names following a camel case scheme with
-  the first character in lower case.
-
-  Their format is described by the following regexp:
-
-  ```regex
-  [a-z][-a-zA-Z0-9]*
-  ```
-
-- vendor specific labels
-
-  any organization using the open component model may define dedicated labels
-  on their own. Nevertheless, their names must be globally unique.
-  Basically there may be multiple such labels provided by different organizations
-  with the same meaning. But we strongly encourage organizations to share
-  such types instead of introducing new type names.
-
-  To support a unique namespace for those label names vendor specific labels
-  have to follow a hierarchical naming scheme based on DNS domain names.
-  Every label name has to be preceded by a DNS domain owned by the providing
-  organization (for example `landscaper.gardener.cloud/blueprint`).
-  The local name must follow the above rules for centrally defined names
-  and is appended, separated by a slash (`/`).
-
-  So, the complete pattern looks as follows:
-
-  ```
-  /[a-z][-a-zA-Z0-9]*
-  ```
-  
-Every label must define a specification of its attributes,
-to describe its value space. This specification may be versioned.
-The version must match the following regexp
-
-```
-v[0-9]+([a-z][a-z0-9]*)?
-```
-
-A label entry in the component descriptor consists of a dedicated set of
-attributes with a predefined meaning. While arbitrary values are allowed for the 
-label `value`, additional (vendor/user specific) attributes are not
-allowed at the label entry level.
-
-- `name` (required) *string*
-
-  The label name according to the specification above.
-
-- `value` (required) *any*
-
-  The label value may be an arbitrary JSON compatible YAML value.
-
-- `version` (optional) *string*
-
-  The specification version for the label content. If no version is
-  specified, implicitly the version `v1` is assumed.
-
-- `signing` (optional) *bool*:  (default: `false`)
-
-  If this attribute is set to `true`, the label with its value will be incorporated
-  into the signatures of the component version.
-
-  By default, labels are not part of the signature.
-
-Centrally defined labels with their specification versions
-can be found [here](../labels/README.md).
\ No newline at end of file
diff --git a/docs/names/repositorytypes.md b/docs/names/repositorytypes.md
deleted file mode 100644
index 0b056b549e..0000000000
--- a/docs/names/repositorytypes.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Repository Types in the Open Component Model
-
-Any repository that can be used to store content according to the
-Open Component Model must be describable by a formal repository
-specification.
-
-Such a specification is usable by a language binding supporting
-this kind of specification to gain access to this repository.
-In a concrete environment, all repositories are usable, for which an
-implementation of [abstract model operations](../ocm/interoperability.md)
-exists.
-
-Therefore, a repository specification has a type, the *Repository Type*.
-Additionally, it defines dedicated attributes, which are
-used to determine the identity of and the access to a dedicated instance
-of this repository type (for example a URL of the repository instance).
-
-There are two kinds of types:
-- centrally defined type names managed by the OCM organization
-
-  The format of a repository type is described by the following regexp:
-
-  ```regex
-  [A-Z][a-zA-Z0-9]*
-  ```
-
-  The defined types with their meaning and format can be
-  found [here](../formats/repositories/README.md)
-
-- vendor specific types
-
-  any organization using the open component model may define dedicated types on
-  their own. Nevertheless, the meaning of those types must be defined.
-  Basically, there may be multiple such types provided by different organizations
-  with the same meaning. But we strongly encourage organizations to share
-  such types instead of introducing new type names.
-
-  To support a unique namespace for those type names vendor specific types 
-  have to follow a hierarchical naming scheme based on DNS domain names.
-  Every type name has to be suffixed by a DNS domain owned by the providing
-  organization (for example `myspecialrepo.acme.com`).
-  The local type must follow the above rules for centrally defined type names
-  and prepended, separated by a dot (`.`).
-
-  So, the complete pattern looks as follows:
-
-  ```
-  [a-z][a-zA-Z0-9].
-  ```
\ No newline at end of file
diff --git a/docs/names/resourcetypes.md b/docs/names/resourcetypes.md
deleted file mode 100644
index d9f649d091..0000000000
--- a/docs/names/resourcetypes.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# Resource Types in the Open Component Model
-
-The OCM component descriptor described a set of artifacts, their type and
-meaning with attached meta, and access information.
-
-The meaning is basically encoded into a dedicated *resource type*.
-Therefore, the resource type must be globally unique.
-The OCM defines a dedicated naming scheme to guarantee this uniqueness.
-
-There are two kinds of types:
-- centrally defined type names managed by the OCM organization
-
-  These types use flat names following a camel case scheme with
-  the first character in lower case (for example `ociArtifact`).
-
-  Their format is described by the following regexp:
-  
-  ```regex
-  [a-z][a-zA-Z0-9]*
-  ```
-  
-  The actually defined types with their meaning and format can be
-  found [here](../formats/resources/README.md)
-  
-- vendor specific types
-
-  any organization using the open component model may define dedicated types on
-  their own. Nevertheless, the meaning of those types must be defined.
-  Basically there may be multiple such types provided by different organizations
-  with the same meaning. But we strongly encourage organizations to share
-  such types instead of introducing new type names.
-
-  To support a unique namespace for those type names vendor specific types
-  have to follow a hierarchical naming scheme based on DNS domain names.
-  Every type name has to be preceded by a DNS domain owned by the providing
-  organization (for example `landscaper.gardener.cloud/blueprint`).
-  The local type must follow the above rules for centrally defined type names 
-  and is appended, separated by a slash (`/`).
-
-  So, the complete pattern looks as follows:
-
-  ```
-  /[a-z][a-zA-Z0-9]*
-  ```
\ No newline at end of file
diff --git a/docs/ocm/Component Descriptor.pptx b/docs/ocm/Component Descriptor.pptx
deleted file mode 100755
index 47b6dda25a5fd6bc1f35ed75ecec70afc0ac54a0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 128517
zcmeFXQh0Z+~Zuez};J(Y@PI!
z-R(_&>Cm~^SQ8e2fdKM={&xC5<-hX`45i7~p)ewb+=zdKCf5Qkto;?`*?4aq_6w0k
z&X?UN!u$0aDDq!l);cXv3z{StM^eRgXWwUxJYAXY5ARjSEx~7C3bhuNj1>KkOHe$v
z6YN$AL@|o)$DBrs=I0Vv-5fc+-;5o*TXrk+R(i-_gx^CHXEE~9YNNsNOif29Lkv!j
zmzcg1r~PxHM^BP)qVpVr<^!cEZuCb|kSkwW_wIh)4-RB0+lBU}Rgwvc1o{NvFLA{A
z$PHE{2Qb4vI2CvDHq3`qz)$dv&<8!u3ik10?N5C|v31ZJaA%+9br{0)GouxhHH%k+
z5;%EVf7UGmD>G+8!DsJDp^-k-q$l{oS`7#FXbllz_B@&|MJFf|mQkBk*(Lb5l*}XG
zLa*5#hQpeDXAbOt`ct#jw&-6W>5vAA>K3&r`+l!MJiqI3adZyPxJ
z-5mndhN0*pP`c=3=b|P_l4>JlUK`euY9nRR2QXQ^C*umE&!c0Js=z)b1nXG&ME&xY
zL-yD|txj!XOpSNQyoQ^De0$FEE)sQnW36pc+T5W+1#%J?+`eg*a~+{
zEu`JCYgkHnXw|Wma!P2TDdjR#{x&*D8BHurkO?MN913iIKPcMb^5pDY(@|E4Jr}`*
z*^KCCcbSK+D&sjpI4*uQ*uLQa0eydi0?GeR6k`6zDIXLV2x$K=L%{r{5Isi|>tFPA
z|6KnMb^LcGjQ`j6s)P+m(0`}{e1~Ytn|*_dc){9E_%wU$4akV86K4xoykw!LJAc=}
zfHt6eYKos=hg8Gv*%tLCsR2&6zo9}PZna;1huY1S0KJuvsgRxHha5C~lEI?3ZdIYb^KwRq=
zcmc2Q8-W&=AI%Xh1ymuMqX7>(`+3XN8U%Ae!h4NGj^isg^78>ackimj
zcqRl|SCWLB`=$U%@miqm1PORB=GO9|x^CxktG<5r%1*fpjM8jW;6
zhv_Ds@=dI$aL4Q$cU~|`d5?7OkQQWt7z(5U>x2LRb{rLYA-F!d@{R+vbO~K~laG2!
z#c(<9YdCHudrQf3IVPz){(c%s*}U=Cco@-jJvHOHK6i1ubanQ0TJz&wwQ>9d>f~ST
z+jlMf4Ww&+5wh)LaAl(1#l4QsmKgh9x316Humw46k#vrLQokQDv2sa>S;+@KSg0bK
zT4Zn@Zo4dag^7m{ew{fhvf+^h6N=;=W3lY1n>N2jZaruZ$3}*P;DNv$RJ{wYKL(sh
zao^y^ZycmSX(|nHFDuz!&I0$|uXsi&Vl4_V;Y8XvagBn8i1zd*nNbslIky1X&4YmCK>O%W^bbo!)q=~q3^=}`>*2LQv>Gknv5SJnz
z%9rewDU~IQkhdL5IVavVRR7t`=v7d77(n%2+ex)}FQdj=;2AKGXanRG1g2?sk(3_G
z=f8R*SVoE}Iv^~UhU{>ePF;dis?v)cC)y)ROFQr4%ScZew@aV4QUsp
z-q*Rs8@M8077)(p2qWYO=j)5t-q6ns(nfuMHf`G7b<^wRS0mUyAkY%R11dWaEttbl{BP8TisyBtW-<~=i-#NPgncd|
zT&y6`?iN{u*|WNn$=s5d=e%fnCK4K1aWE#e;5ZdgzLi-7C1k8glYT2QA`%D&J8(T0@nCSVj0nvm6q6~3@;cs_IgW!4vOLhxK`V8>fiStk!n8|NwJi+Y6Z~E
zSPNC+k-DiiUoV7UT9;H!C>`AtUu%FZYH`^J0J^hZ}x+6VBQACD0w^s4b&+g#!X($;BKDfh2-Suhs4SK=_V1o
zsVxX2uq2Ttz=cfQoa1kzRHjF=SK^26d?kZ}$wi8zge0)?6p?E|51yYHVkVWsWUE*6
zyNj6tGG!xq-Uhnags4hUhNzGrxk>V8|@?!Rf9_usV59fU|@
zLJ2NZ8pqd1lx?G+h0N7HWJeIq=rr~Zc2{+-CuzO_jj;kk)HsN!)=qp;*gm#;Hxz$q
zn3N&yrr@GuvKZ%>n)IFTJ-6B%KQ8S2!O>uW6{^#gFoW=RGG
zGbu^z;uUgV=Bc>6l(jN8o-ruD;VQzG*B_KF&m1+-IEsfm`h{C$IcnmS(<4=eg>Ry>
z_oE$Xl5mVZ$&1ScRi`c#rTVWqM?6H>_&G8gxouGz
z(}KPAzt-sI-8v7WQ=oCyWNB1BvVAr@5bVeRzo!j*wW@4)=4n;exqrJ5^nH<(i7u17
z!j4|-ZK^el^fhs(y##pNOb^i~RNx1v~O|A}5~b8d6P+4K(l<`(tg6LowM%#wKcS(L^+202P!4OkGH1)v}{X+peDE;AuLZS-einP3_#WQhMIw}9wO_G7~22qS30cST)
zZQEom?Ca}BAX7z52RBxb9&3cbB@p+=86cohTZMt(k3ihepvJyg2G{YA(WUa~#WJHu
zs9&Pg50k&LW4hrgRPvWTPokF=_Zixs?vo3y)l`>0uy(39}#mG+XtZ_nJo;G&<3AR@>C=6uTGq<+#s?mdl18ed0x-(9(|
zJ;twwJefVc20M$H0&I9Qq6cSN@0q?n(qY|LG%06JNwTJkm!H$E)(#J~{9m)*ck~Yg
z=!x?{H92%X;yXKDx^yS}U7oF&J~P*g!!M2QY{5pYjURkE1FIj`TL8J50=mSR7bWr9V5udeBvJ9?gt-PsrR+xyD(=6y@k1-${0Hn3@0^m3Ku3;boVoewQ=X!E4-a10ztc%KD>>px{pExe>BD1-
zNuV&;j>)0g=e~p0m_G*@W+PHR7bDEmwl&M%?-+7vOTq@f48d-D3Yt!
zLkn`!wz+rNMp@8S16BhSNHD#-sLl``yy`!+*g6SzLtoejQOD^&i9SJI)N?d){rTxl
z6Yl_6a^%ApUPc-m;}CiajuLkE(`e#kq!OTfSbmM#PU=
zrzOZ2`_(W9sgzR?T__9U{~;d&K{Aez1*C-1$!08ZhqJ+&Kp57&Y9_oj4^W
z^H+Ae>cNJY?F=kc)>i_%#OlB+W$RV#T-mT`*U**B>UDJ#q`9-{=y~zy%-rjMO0O`d
zo}|*3c`-f^r1-wApW^7gKz)I5Jsgo{$w0f6F7BOR*-z~;)uOx9fB0db>m3jK+KX_t
zXWC{Z$%yrqxWD1xrWcKEG*Z5vgr4Ic4_`hN4NLNl0?elYK7nGPz!d9#jH^nr{Wj((
z+3Lu`=%#XBf*{A3P{^r4(qvIEzM``IxTzVD0V;jf4!S}Orf8ZD{WilL#Z98&X6hpF
zcAp%&3XV@gZs5{v>Atd+iFcPRxWej(-haHg21$-g)N1SvwEb6k_DB$0az8l%dJf-z
z{2ii1Rl!M_48)6=i0+sShB|~rM9-!sq>01arF{!x_u8HfV
zPE4S-`~~5;37=00{06&C&-o+^jD2#%0uL$i
zBspB=#jt|(o&B-$+8K%vW*OY;^8IkkA;dk1d?DCYPa7e#``>{+eulP@PJ;!O=m`3$bHHIzw&dt7W*E
zm_Ml?#d4aHj98@c0trb$OYz7V7Gy}1pE#sCyR#s`5sLPaqqr)B8h!z4A&(%r8#HFQ8Fhv#S
zT!Leb^gUBcbqytwt6wH+3f{;rFDCEE(Kqf@8hf}ZNr)^i;iN~AcXcvChZadm!)17+
z40rWD;uzu=hFX1vW
zv4E<{u6E@YsGn~pRM*mc7v{hl0uvrpJ(>qBp>nqEuRU{&q50Zs^u>Ifp9rKB-{68Hc`zgF-XR7~U0
z`6MiL6O$?f$2$f4oKC^_4EOHLt846@Uc)E&opQHlhC{u-yS7KUq>5coe!v1~1-g}}
z9*Il2kd!gyje!TSwaa3!wxnPZ`H@AvS!;j8yQx;5T&aJWAnbu@O;u#d1qsQ_7qm_y
z39?5UUc`*#tShF#4u34uW@Xw|By(1ioziyZ_9WYddAw*BsL&y;2fH?N{n!a)`*hIi
z?gGMKYw~>CQ}V1%1#%@Q1p@bLVvcLSkb_8J$_P&^KRn>NAHacDQ*H@Ujk#Ql67FEo
z;L4*zvnZhf4Fr2-z~(WgH$L&jnH_^Z=#+B=%I`jQ{OZ=h0}RyKlJ92Mnm@o0p+PE<
z1;)^cl%kI0xL;P9Z?dAb*nLl3wAY2zv~|ndBMMl;K?`WaozbLu2yluKiTeI?v70&#
zJPBLklDEDIiuuJ^{Q@NT(FR_SJP62=DXmLs{0J4`d1ZO$+U<^}X5qT^hZWaHC1FCo
zmEe|(GG;LdfAlw}o>9F4OL2zMJ6DdQn(vr_sEO4-RZOPPQG7f`jP-B3dmu-Lc(v9z
zJR)-MH*Zb6``EE;uLCJJMtA-s&Woh{J(X22sH8^0CSjA~e@a1kyL_I4M9JO%CcW(*
zxp})KaYTDR&?!r$_w_2Q$XR0rmw9qaqKcnp^YOThX5=+MTtmDMY6Z-XizbARgb%Pu
zB#oi8>&$NP&)t{#oBOS`wwgiq^ON896rJGm3`*TJH2p)J+>bk;vx$ZVH_BFg>xSJiG3(X&0#@k(he??
znB!kCB=YbY=~2%A8qh04>S2X4&ae_CLK=h86mBTQGe;DzGT=4T_Mot#U8%~o<%5~d
zTo7hCQe7Ef9_%86s*I(v68{`d!Gnry8Y_e>kFlT9oPz%q
zESrTaTtPr+Y3>yJ^AJ|)Iif&KXujk55IjcO;^rNRQjd$G$bRSs
z0g$zLeRPF#0dy=WFU0yGY<%JCBw4O0pzT27jcC!*tX)BL?2TobbCR&<&QoPQ9Vc1I
zJbI~crTV~iXK9dr*7*qkqzJEqQ%Y}`(;piY5td%rz#_MCqWdnoXa0p5?33p5BNrXz
zVFhLrCAtbuqW}D}vK<=NjgB<{XiU6n1AqxdjFm7)t~wN-oRhOa^Sk#<)5^oF53zKU
zaS3H^nzkLOYcCHaK|(Ed1T0_!aVCwn19qh
zl#SL*K3s?;{U)_h*rUt7U7ugfPiXI|KEnTxKbdV?2KZL9zN08uN=&t_tA@N6ESh;Jn2F78I{t
z6Arb|NGyrTwWDdtBoM3S6cT_@*@{*+o=dEQy)$Yf6;`+9>hmCBx{T;LWEmjW^tJD?
zIn3#2a%^{)1g2Pm_z{XB3S1Y!K>J5u)_xu9BdU@ImCpkT&6vA>k1YoS=;Q7O!`apDCy3
zG}K0cAO=B}w^nob^8Em78R}*}mD(~ZjG@RuV{TT0N>sc2#@ckIcoo@(HDo+t#`yZk
z`bw0I`-4WD69WOdLZ7(h1Mw6pX$gsC@_a5jVSXX36(M#Dkk7
zALH_-geP05)sTi`+wcbca9#Ppc*dTR!OEb^1v@pgp9R*8Q=_>J^Sg_!{T(m%uMfCw
zlXo)LEzjcCcAX@_Yq3jE`^2D4)6zgqw4_kT7-H)4>u!rsHdb_at_>5e22mF!OZo#9
zYUf|e1i$Hu$4tR-15;Lr(Cia5d~#)fQd4;jU^uU6CVVtbtWK!)POhC+rf!4#hbM@~
z^-;7atL-HBOw9|=
z4D_U4EC)$lh{*N5!TfstkgW_QS)B8w`{cu{H)u|c3bmq&i}y>i`fEa`{k&*Sv_|c9
z6zk`xO28wRzfz{nC=?4A+zqHz8NJ4O{f777u2)@%Z6o9S*0W45swMKWV#M2)h?|6BhRxqDaeR24H!P
z*yJ2Yac!OKNK@u~jzw|buT^o8RvZ!?2x$@PUkUQ31hr3v^h^@?(uT$YSu0x@Dm;Od
z7xb@(8^3W`u-kj@&;u*gcw*{Y7+
ziLO4FI5avhae=ThKF$3&*%3EA$u6UHnkwCAMGN}H(DgIbfF&S(Zx#iq)#JXpOsuo{_|1w~m^#!NxW*^-*baF#IiC31K-
z!ZOn&$7FC8^!xS!);s>;xr=fBTc)_%
z@@JJGwcUZ$GP}YiazcuJWI?bAtb$ZKmf^u+0zb}k2vY~=FyD<+<`>aj5tc;O{Hm>=
ze#fQFzwT*eR=H!g42NK?>X_Jtd7xpM+SwTJ)-%#gR&~G>29f#$CX7uV);N>shl2&N
zO^K3?@{*UxFld~d53kwQ5)JRBwyWp=t?Ji%Kl%|sj>i<>6Of}xsc_+|LKS7SAaA>fQarE~xy>YSVn=n+b=y4M&Z`+^V~{V}1^rpp@^Z_$!O~AKMS_=TCj$kU_%P<3_LcKm392TpxIosWKxlA0Fzt
z&mFB^tUfKcJ!P}+ceLwRq6ch9>#GagA)^AgSaH(fFTxRhh&MDOqK@P!h1o5ks4s4u
z#M#BtMlef`a=IC&X)uk_Wl|G8o8Y}Wql5vbt%0H7ySu_jl(16sS1=O&UMoFp4~uO3
z0VpySe&8>7^{7o0!@-LZWl=-xau^R$@I~HuvlnisTx3UU*wrG+6TR$8Q$-2zksT!7
zT7~Y7IaxtFn5wvxh<(x2&8;g2lyXZ}Hi@ggmX(*9@OcOOc(9q6S7u<|TcqJh1)6Do
zLp*uH=x0le(c#HFhYG|bIK6&I*2LcmvV$attK&sx;5~V=95f9P8w@j)I>#|J{SDJ{^g4$6}%W$NLKxPVHu+kC?xpby;f{&{f#6@*01q-}qu7PWLiiUMjVVnX;y0luDM;sq6#91U0N
z7DrVpT2lApil4`nA#ee+Jkg!DRe^@N@>p}Lg4i_X9J5l$y#smK^0XbZ9gxLzb2_=qysz
z{!92G-y%UOBTwvvZX?
z$YJaz>Crw_tYo$pb}S>MR@+=?*9GKFUo5m!xFOfuD`n{IRb^;wQQgHLGzQG$&Wqi>oEe3SZu|rx|mLu}RX{SY5%2%a&|w
zyBYONE|5JJZnioOy{q>v2EfQ4LP-6e)LWwy`ho%g=;oDp2o_e%d3d@*7SGfd=UAD`
z^UcY)IG^b58+mLj$xv}hC932s!^Deb<>?NR)O#Y^pOuAAOEIeT-C~q)9b)O2NTMkY
zAbzHVz}dw9Fame3M5kX0xEFy595Lsrb(ZmkV5|CWEVq!o_fk|a%b&+vZd`wl_pr|v
zZ9cQE2Gm|&?mufz2QpfJ#kWYupl{Ug7u043ZQ9GaTZcO#$DykWWU=V$P(%zX27us+
zZV7|RiwHE*#{b|b)QT@hb{bb}DBO|Oi`%`Xo4tm{wlHI9Re)CGcH+h+CaiyHy8VIB
z{HX8~HJLH~=MiZh53wLAvA#c4LQyrWMLF6^cA4%biUG59vSVfaq@V(hZbtQ{!4#d#
z+DFA47#8bn61>eS)ZP$YX-&rONgKxYh1KWLoUtA%d%FE?EcuP1CZs8RO=MER#556I
zk#I9$Z{R;JOKer_J?!>jI0j-J%r3*R0n$w9TOncM!^yVKQN{KHBDTNjR!XN*id3
zu3w`SxX`1)ZgiphAOmteGxs|Xjb}hK>36rnM|l~)rg{ecoG}gm?s)mT8t5pMz~rH#
zxIMYELHEIt#TT1uVmpl>-D@GDo|T$MN6Knw9Z84RFm@M29b`%jj|gl2aiPvxE@&X5
zzad)RBsEjPx`sEdL0#^#pC(&PDkiINnL|}4ilc~TEuaRY0`Jn~O_y**rug(LCB{W+
zxpIiNd1#pU0xrDr4O>*yD6VzD6L~-fv7Cp3&j3kb;Fo{1P7s$-pILLIY1$9kHwRb4
z(d0pjeeK&>+%sXOqVa>g8Bczfph^0{$gMfu!M!`zcRZC>t<#mQx
zMG>o7mZF)auOgFZVi@0OR9k{%)fufV&dPkji8isF=QhqM!oZv(3FfvuW2ltjgA;dA
zir8Y|KcHK-)E%T5i7KVt!i%AC`t(;U&MWHndvTdW*PU9de=}?m8YO47Vt&*<`h58!
z2ua?Z80DY=m$4q9=2E@AY+K-K%JC#Z#m6&~iZ>C5BP)h%|Hu!E|2mPjUF82*i}^Zf
ztkvMljV_f60;(pIFN+^=JP$(cfK{TuuKwyQctA*05I9c!xH{wCC)dAB%5do0cB2)
zX1b(=qq_ODYs6Ayg}rs>!Sb#W(=qndSIXQI${CbI8(o~ow;Hrq!V};6gAE+*0kdG`E;t(H2%s=gEiKM
zx2*$MH=efPNDj%e{HfJGfet+k_NUd;VrZyb@p$m-$HhC==Fvm0=y2@?J4aSjXzyq+
z@2^L=!KLBYuU``KPuUliaE!9YN3{^+PX|qevz;b9lN7E&NeWIz1sS
zyq#2f7a*4>CxxVH!F#H05Wl<6X&bJA>|(syDdk$}WMJT{9Cz>9Kd6;wlb|@%D!t>b
zXwi7CZjtgf6zacDhJIt~+QD0^OP_t18zl?=qI47D*M#Y_;eD1OYL#)=H;>R-#8S2A
zVNV~Y8=FeCzWucd$KOj+Mv!d9_kn?6jgXUeflL!`^b%zjE^^Bkk
z8nfmmw&HQt`|}2@dV%DHmpDH&y6W)jQKnp8{iYNYEkXyKdsK7PM!D?R=mpGjAIR*I
zQC`U``1c+0RkJc+KHSO3fH
zD7HfS!uXYgSq8s^Sw*u6
z+^&;SWBoh$=U-n^=R|A`|E?h;SHYiAj(uTtol@p@piNEgqz|3ga8LRB5vGy|8Q*Pk
zrRJ@%+eya?L$SMmY$>hqZe-eYAsM`=$i@(~r8RLoD1T4zT9-+HcM<2wr3TRo?^RF>
zx+2#J)lH!vXqH~J;B!%nXyn#s)!UDa6&PPkU>rL+t8fC6hdlZ$(nYXQwRJPHfC*R3!
zp`o7lx~>V!nFkfje3kmcBU#rf^|U3-wKxgQLko@HTJUB|Eay6R2)sh=i&e`X3%&uj
z>}ouqo1&DpNBpkKlt
zKz^~BkggbO>cj|4YG7B3NNUEc_W;+>$=#}pLIS20qjUciJ@s>dL43LD=9h3k2DkZj
z(y8oKLz(x(k8$7vBUc*}Y>jii-YqTxlm=iou7h2CHt&mxvPPl}v}mN$GIvJ!+F
z3Wh18VR$*4n-$;783(s&gojd=w@UHZRFaE<0k67t1zK@7pvnxQIC~Ur3u@Z=ARHZ|
zL`FZjT$N=N#>Q~gfFr|9FC#L`Tcf8pUB)+9i2VZ1_als9NoT(CX+E%j`6w$^Y#2Yo
zll&C|*JF<~R+Kj7DVFWVU|H~Sv8adW&*O#Y=Q$i;ALO-Dg<@NbV!?&tK6)`@l;O(z
zMnIa}mKnGN{F>mf9E+j7d>S^*xXBlB-4XF&h){&VwsJKlzV=FX)9ao>&g*UDGEr?K>AK1N32vNELoJ)(nvKxoR|)T+!y-&@%{aLg9ZQP2{)|X(>`AE
z5c&4HA9sS0n!4zaLo?FK{_3T}s(9FF4M(Dxdu@yYOg%UAEw`_fF}|Nb~zHDt-|^U{erUWb#O9L{_TeQUYD_)vP?lR3Go
zJT`iMj-A{m{|a`+`MkRZA^(>8c#-K!`L4&0u8chBtUS2TbJ^tXf#<&VS#-KJEnNJg
zy1eVs1wTIxvtFR?<-`5P*sC22sethm=A&JmS-*w8=!)^3T(T4%=a@7=F;ssr25u`a
znGUa9oWt~5`-dgoZd62f=4I!%x6omCb4Pki`=srOylm4#8i^gz#Z1;+8cg|j0s((_kC9}Te5gjp%T@s-n
zK-!I|GgC6@JCt2l9}~b#hefRhX{(4^dBsYm?Kt4xtSXHy*@{8q*-4{%L2y6(H>bwU
zl`+s6kXm#}{tjj*zqPZ8K|hOe=EO$LoiTmTTRCja6}~z_?-1~dpIS7xVZAfbnkVFQ
z_QIC^+DnP|v&7x%Pv;lYWTmR_B)!4$9-KL6T(*s>Qhmn^xx2H5{-4^jGWUXONbD$A
zJ;7C*4QJ5Kjhc+|8~T&SdnSU~jnKOTgjTsEUixEKgdORVNJBNy#?G9|_e!V=a?@9r
z&rmJto}m-I0ll9}^*OJ@RY68<1bXzlK{&OMmMBxI7cY1H_md4D5IJL}Y7fzw_pgVm
zRbxJZdZrpYkq?}2@9!S4lMOE=i;l(kpe?`Qtk;$FsSi-9f&_yY!rKf$)|1G>il*#y
z!4BHE5b8MdlkRx?eyl;4i$hsYFebKv%>i8kuhoKEx8tl8l=hK}{-EF#5-y?K7sNCM
zk_c0;41{N3GMxdnu5Oc0yZpgMqJ1#-DI8&wMkI~Uhwt~9(PwKCX``>!xXiELnZ#U<
z9Dyvux?g@Iu62(1V`h^XMKS*_UEP5M|0i2<1cNS7CUjLY&C9UgCGdJ}pf!mL@WyS<
zeukrMb_ujXmS31mvIrL|D%P2HL9$%h0mY~@*!}kvkOs)ApVfAzLy1Q4A~zwkbx;Xt
z90Xx6V)#gjz&-sfA4!0-93zbqO4=ao{4V%D)SM|brI%y5K^n#F&UpGY+#!`UL)bE!
zBjYae(1i_hR4`+Ost%hTevmC+Ac|o!KiFod{o7r|y1SO^^l{;Aywq;n_N|r-sv5z@
z4+hn>)>|C=FPnp`8{=Wd3tDP;#ikZyvMJ0V+9&aM)VW$-scKZ+aOV1bXt6Ri$zg6C
z4uyvKV5tz1(C-puK>5(m76^`B$gE*mmdKs}ja_BzOJq`|X~Y+np=~s1Z7MWW2gTgY
zp=L@xn7rXTAewgDzS>LkE=pGWXt-Ov-FLwy%$uZK8M!+vWFZGh#)X-pFdWd_1r`D9
zUlqj;{tAxxhSK%BO*yF}KH$=kD;0_%76X`gOPin>dP-O=i+e+l%R9pE0ZOHu2~7P!
z$D|@F
zK|JS4YlRL3Zs9j-Qma|Wz5S6wzZyTT06J6Tuf~TM!#wn&-mGb!rY7RW!Z8xjZ7b+l
zl~DKE)bxqF?NT%Djz8H6;gl)FjNhC`U$PV{1TN_j;Pq))=v08-XQL+_S1Kj=)#<{@
zOu5c2e<&lA*(z*tRbGoY>wT(rgRF1+FXf4!Bf4r59&m^eb65mPD~TO)D$uI16seS{
zN=HIBgH}K&_wrS2tR-}pU0bC=Jq3ZMtU;OwyD^}08elP%Cudojvhum7jgwbIFRd+&
zu>OF=z#B~iUIwkugITUN?MYgEuZWjpd=w87N)rub%fU7dh6{rhRE%jJHd{W1l8&l6
z5XDSJo}_DyW@N1pwSRhTQhXE8wE(5-B}!aJr+Ytll&nUd_!Xgk&Iz)zOd=L0DqJ*0
zx{yH1*qLt5h+s0IwxBw**FU{1)O#QQ+yd@@wluMg)JA(0suqvGo}h|x(6{pNphLs
zGI_*`rzCl&k`9)x3f|KZy8=!JWs-}WiWwEx(-BP@mYgHa!|V#;a6r`{#!JX5k+dWT
z;wfcRX95ltn4W?cJocNy_<7ut`s1uJGo&$`h)EcOE_vwGI6xcOsVH5R3nQv!FKe@k
z;rA|dx^h1STiD;%&qhwMd7Xh;GqwIP5`M$(NTR}_0X3ww7(hHBC&a507a
zH)6&c)}VS>s%NNnBqNrLIz5ElO~AxP=v;_~Mx3A$nfD1ouiJrVs7pj%m=qK_Z>(802^Lq_1vnp{*sl4`I6N4>
za{O_Dx=~HuX}Py&dOj*P%Da5#uOFWTKAm;Ks}*mov^f^PkR&8mKezVYr2tt02K(t%Oux^KK(t@3^5Vccr!
zkpthbcJ6N4Fkx0Ve6khJ_;`MsP=3-`)x#>5AI`xT^eB9`#lpR
zne&~d9Myus%nP_@1S_DgqO)j5Gv>t#LPn0xTPAg&kjRv9__bxuKjUP+NK98c(@k#Z
z3aEhA+^n&oDtfvHLDUTVFRZy>9>&c-O`xW$A}!9aRQcWfTIYZZ4s6pOfa>pxO=g}5
z5XQ0`23c;sP)n=TX5h1)m&HP1szK{fp$JeTUJv7(p#;JUA`*doAMJtiLR*?vW7h*ILF+tL*gdE`Z#0nZ0<}Z;rA-b~R?3!55Z~Cb#wf#__W0F@i$D1#?hH&t=
zOss}u6xyKZ@qkvX`gr@o7J8TpV#H@)^<`kp5D^kc4r~HQ5u(~r)t4UUJ|bp~gbT?V
zKg#dteb{!dk?XI^e-TGTyf#s#EMaZ|6DeiDEP#~{RPh#QZ_Osc6M9J?w(ym3|6Egx
zRZ0;b^v+VLY6P3pzz4k5K1tz|rm
zn1h_F=8vRw*qLY;q)NvR;UEd(SQ1Cj9$g4M#yC5I9(BE~#juqTY*7VbqniZqT`EqY
z-{6D##&pA>Bdi4BwITggPTI4htG1dYe!+(g0vUz{#+vM;95R5p+KHrD$a2HxA0Z7l
z>Q=lOF8bB2wzT9(Y*4@&wf-rTPz;4ZM9`1XScISq9VkpmaE~tH_QnsTO66>w<(~p^
z%+f0g%3LcuXKnM4bgWkQfmW0ixC5ZiZ!z6$Ol}a*Z`deVmW1{Lm_=PLVK6swi^zOu
zU^r6&Mu&4i;Sgt=@MqDs34M)Hb_tk*&e?v~a1e&7lSoyGu8|2tO*NB_7A?7VkZ3%<
zM3J=-8-w*nxT4`N0cBPhXQoJvjV8Q2jpka1UhLa$JT>tscDUTUG$TwHJm1LT;8C~n
zj+7g}*o*qUiK#4mJe^dlwruj{yiWLXEiGQ`wen5`o6c_J=wpiXXjhfkJMOshahL*1
z)2^3&Rkzb(;a(q{yuIh-U)bE1KJd6`I2Ka;hF=Y+-x`d#mt4-?C)r<+nkM}Ytjxm&sT@1x
zGj#XuFtIP?G-R$wg&d}CO|BlGf@OEdf+7=c6hmf)hxBy#G;KPv4XS(S;fe)ELE*9w
zS456{s6ZvTk_f0OWKy54Ml-7x8%QpxXy|sBhNZ~%ApO7CI;SShwr&ZRZQJg$jV{}^
zZQJHsw(Tw(UAAr8_UZWUPQ?BJBWBEXvm!_4d{PMuDbNZr>D+ln`hi;~^bLVas`tsj
zV;ctx_e)&YrzIR*^!H!oA=bZ~%@Mdk#`P$odQLUU!9_)f(We45eJi;OV$REKA1Oq=
zRU;Ftq;d3=i+=_+?X=Gt=zUZ9&@#*%R+<#
zDG}Wi7fr&TVd}4musEa+J$NTLpzTl$%Z+RyJHMVH_}mkpJL2rBbn8R%Jv8e
zBn0Dd!XtL$3^0pHMysM$bhP_Vt2BpfTxerBmEqCSa53xpKiop3}T{BvXRZ2kXwC)0N
zfyf2*MT>0edLOkwD;Njd!Xca-4EZ&Neu9|yluJH4k8?fvHy3oHdd}&=8B>E+HCTQ-
zB9Z$BRm%kwE9c%0R+5p0ug~S3`PUQ^RX0o`_ZL@R+Tn(SgKN=WNEF!T3|t|#5x$Vw
z`2Z_v$M2?@>LqL2Z}`7Tp0-K5uxfA0i51q3#pWXts;DGDgdxBDCOS7*0^W0AYsF7O6)<)0SM+yohEbDXxt^0;I>(X(wG=AoX|1
zswA7bc|R-|Dd`pg0xpXQgOk}MEIZ>9yv?B2)LBBL=u-MEM3iWe%0Ld;X5j8~U;C5`
zfH@e7otLo0SF-0t>fmZV<2k5v)kwm2eZ<`&u#{MWlT3WnaJL#^@$n+#)JE0{i|VZ8
z`q?NWPev_r2AdGjG)++tb^7!?Y9u@|URiKnym{3Mf6y;|-0DtwmP15deSUrJt`K~6
z#q;r*2E^Jl2l9{ro7kfVlX1d^^C@ZZ4B|75-sUGzh*4qE?j0&9;G;m#9*SFzj)_Ip
zQ;4rFINx4Hf$au4BR7t!X)G0A43eZ5DpJs68<()wq1Yoh0)0h-Myw&X{)1gqE#X;*
zqE;xAp^-*76C}u`2&N)mD_L=sF%0xm+c3tTMT|!!F$u_riw)^`QIxvBA6Fly`=nN6$?%%Qc9+w
zKr&Azro8BKh97lek>td*urzKjerCizMoDyy{?LV0(Sy?wDZ^;KO++n{{1hS@C$2*I*V7g%VceJm
zHcp(4BU_~Ic0NfNr;^8wRjR@+s3DMSwvH9=NkP`UcWX
zAO4723!X~B%2FhXlNiCW6kZ90Od*L%^vE-ijxCn_NXp>XzYQkEAx;1v&__x@jW%Y`
zSKoD&b|B*-R27>NH~b%3fN)p|3^<4qU4fjUlb!+Y(8j$WEd(M5whn{=VxOO_L2KBT
zQu?xQ^EqsA;2A=b9O8g6K-(Y`fJ9arrpRCJ{0;$ZS8j7ZP=9Je(`m!8X=o+u@b%VI
zE3`4Di}u`^*aJXD#Sfer
zVyX9b#U$z}Bgro49B|B4u%@P5`ELqDicFSE5%4s`ef)6<&8(qmf;#d?^|!U3#n>4o
zO%)kxo7|ja46E))AaEuqt32EkdzuCK)V3L-ELj1Zw#n~Fg(Rd}}S{f&AU&qRSG
zzQ|r3H<*jnz@m6gC(g@;wFdN4taBS8biCJ6C>8?_as=Q3%qrrBn#UGUkcD_!nwP#9f9jDn-(7{|rcmqbS~#*h7m>
zaay*C46#{6za%rXXJXBfu+rDnx`7*bI90Ql_F?V=m^8RXNDnkJ8ruv{V6n#uP32}~
zJu=FU8w*GK2V2A^-usMIYL!W@ipz^l51i
zs*$ySlAOvS1H{z@WpI*J2<{g}H5l=1HnSD&yV+GR9uMgu*ys$?g}3N^+qIc-Ntk$i
zct=ExqAGeBuoGW+wk2PXn_z7#wirqQpE8=Fbb&kg57rb`B5Mf@R8GNQFOu-Oh?SZj
z`w6`hAsrL*a#IDDvat(fn9R^Tt}HFkq;>|;Gj;VD&_G&<;YF`AVOVM1G%w&>k_0q}
zFWk6>GBAb}k9-wORz||t$--n30`A5Evm5;-S<0ID?Gfrs3Mpoc?|P0~v^X*+?UJ0L
z809a!MUDbfl>$1w)S+XtUBK!uq3WlBHQ+xz+((S4HCTGYHGptO2+7aIaJ0
zfIZL6QK;fL5+s3nizXN#Xy24PLVlzZ{?%wX-5{R0o63_bIlD9iBVIMoT>g$Z4PFSz
zh$9wpsL;%r0$5Pfl)V7^`ikpc@Hc|``aYFFhk=_V3(gM>Zc-SSblpnOj4NAp_rEIy
ze+>-Uh2yO(Zr2?DTsq-JW*iz}-z&u}$jl=wfo85HCmE%WEql0Y!GfkR;f@;^dYsYn
zmo_i7I%<$Es2g`5a%)U-F$33QS6L9X5dr!(E$l1g5srlr*_UrrMJf|FcC^d5vV}mEsORKc~iDb$=ud
zEV~bWU+~}Dx~C~vKyAMtcexc7jk(D&Ea#kBFgf4%iK>^
z8Li!33k=3@9R%z?^S%~nY|@K^y*zOy^jBed#-ceAG5j(DNP0vC8C0nKQOn_LN|xh8
zf0+)9rKX{@bB{9;hpMpwmBUoMiNAB@WOe?`
ziWTB_*+=cV68`t5M4AxAoEHIPt>M~^k$S#Qk2qn8S5=DgyZUMInSOjlTOQsxe2CtD
zCb042n6uNv$z7up>dWspANgNSgf3mibdmCr`N+PbK;9y7W0l6>DbJb7wmRUm%EY^X
zmEuHKC$&s0>QDUSbkE*4I)oD;ggt&7kf+fW@)xN=)J=7BBMqU}kGc1v2+buNlH`4+C#oz0aUsEQWuekQJIitNQZ%
zfl)R3j5qY5jQ3L;x(D&?%Q=)sq+p_@=)4_Po&(CkSLbN0zIUBEI9%
zOTI8(YW&CECdO&rFg4xF4gQmAkT~=NSQGmuv`_phU6<5a_{V&O^u~RoUy|5;npSqD
zCGsN`x9#cA#}a=0&D?W>%R^W19hAoHKKxXT4}>Q>T&$hrOFnLqnZmB`mYoS_L^yRn
z9Z{%gh;KIB{`_40OZgaS7c-i3x-~1rLzJenGpbavgX8X5EoSp82AD~u(|}~+6HqbU
z*zFf$Sw$<8N?!SPzz8QMepT;@j0GvpS2y!K-nlU2Vl3hLu>XPUfuu~!91~Px55%3r
zDK5`>!u(vEESc!KcVvuF43!N29D^~^VUU3$q&4cU7upT?8%vuSq_sa~=z%e@fy+2e
zv1_Lt06obz>;;>^gQ?&=6_Vi0`WbL~Ib3f(3QLLPE=EkpX5&_?yRR&q!pDmKw~_Z2
z3X@5u?0&6Jhs8O+XxZ9xcW!y8;5h32e8)i2D)Ws|j5Yg$iOhGvkwlb}KP0Ld3YYAMV)Q%sX1jb=3>ys)pWUu?z+0I7_>bp
zYH@4>QxV={u0<5u0f|F~7WQn#1K!RH3n3y>%rZX&xRov3}G3xu6{2Y{f*LN-}Fedy&y}w<@
zzP+gUzPH~e9Oh^eJMwkMFTRO0rayKphU9D9gkRhf!*8x8ol%PR*5h0lAuN5%_h4XC
zuklCyMB?ZJxux8MLM;txZJLr&5Go5=(RJ4dc`X0ppE8-HEdJ8cf9DbP(^
zANYJyb}#IX`A+tZY?R8{O!^&1SYf!e7+tJ(selx-B<1+P;|QmN{B>D_gV=QB?eC*}
zHsv238lM|^v+QlmzQUl=4W({ca9w=E4q9VR{Si&r3BP>2ACR9{kNrq};qT>*9ree+
zVB(4+l&=zoZqeK5>0|pcXN~0!DDB#oY(SFKY&&-Bjb{btE;}ip_a$F+K`fkDiAaTl
z4!5ODsDsh#b15}K@}cctwrFb4@Wk9tTZ~V(?c75{dL|1Q2yE(l%%Jb&EUjZj28XYX
zJfdt82n=J5&**AX1j@jporFvlb3{LqiRPNiaMNIA1aqb{6j6%u2<2MRrs7eSf64h~
z9U^`{tIycC{&uaH{O44EppY{~D%ksiqh!)pLJJ9%FlD#^^#oalqR{_Qutb4$%oXty
z`NK@NQ@W1*>QiA{5d<}1VO*%|&r>ZSv!;oDr`W9JB|vMR=J-A_gthy&HSo~0)!J&N
zFAdK@>)Hn_{(dS9!W$_Kl-BQY5ZZV>`|dR(Q#lfdz|QqVw$zcOt*kt)`Zya8<1kM3
z6;|Do)xPi6Q9nR?IK-PZ)f1z3Av)(6=`Uv1k<)FOG{$PzXv3a4&44*H^`!$MKhD-3
zZ#ZNQz^*!cS~f(MmlNT{w`kmg^97Z4
z%#K?EPV|c>!YRd{AI&pz$*d|l?;QRn8?a~{jyF+7N;r?uo=j;H<5y0v;!Gz|GY9hKK`#E>@*9Wou@
zdwW!3Dx&Oqu|>y-t<1SxJ1+n5K9!~!nt<5sjx_l|ho`8x=ggHO|1ZsUROPDH*OGIR
zS2%2g0Q*_sRM`Gz`zL}28>cOInu0J>P5ter=+210hc1daj3t+g(T~T^{m=M=znc7_
z?mWKkwkxvvvG4as96vXyIcAXrjKMc%qon5tO$Vgxd8Z+360*(Y<%F6%+i=UZPdTQa
z2Ls&|Z<{0M?^MRMw|9HV3YfayH_a9;Q4JuybLks<0X3@u4XAxP-l8g_w^m8dCp(Cd
z#FLM6H@3yy+t5(mVr$QXpJH*{+X~EQ*MMuk}
z8^^^Z5tE0rf6Rv>HoV_ei3M@E)!C2%2c6N<27Z-W8#%11@|ootg~B`Uc1?GD>%b}k
zHq~k@S@!3?ZmD^DDzEW4Gcy!&n3H7q%C-evwRDum3Ms7#VU^qWZ@>N
z?rV$=xktR2d4v9k6wIPgl8$G|6mzF2X(nQ3!#`gi_Y6Pp8v`!4wp}{1$Bl>_hlsCc
zjJaFW;z?^?;aRtaS7~>J~w_uqZI-VRGGe6OCf@2m1@fkbTQA<61gUzc8SY1xIyyG%CdR_E
ze#V*4MJ74NchUD(9S=!3sETC7E1BgpK5rhaNp^PVN8T_#D=5fG@@#en4&Au)r*4-0
z+j0bwT@(PQmw0>ROeN7j45b-kGK^HSM9A@4#B@~RQpiDn)Mc0+c8(STt!uxJ-S29B
z;Eo>3^QP-P%mk+Ge_Cjs&Det&qRT{8w6F>IW@b9RCTvMoUp<T5Ty#Dk)9!Td
zJfg_&`S3r^oNjG7zZ_V)y1~&B-)S9OxXK;xBdpZr1J{)U#s=}E0;mIH6*hoaG$e(j0}L(UnE3kip!-e@1ODvK
zxgr_}B_TnZM^GVDLGA;ZiFJdPm;WS~uDc=`e3)h^{x;SM!7m=69O_t%39YT7K!|KGD)fdwjqkrS*
zPoO?r*-K+=a9_ZWXB*x($c{|-*b-ZAL9ZWeogtu3k1q3O5f}>u))z*2k_To$2D~bn
zjY=ffz=E0?`#?g1E`}p>q`GEp87D0G2=5joh!WXaNQ9gQTs`O%B{>Ewc8#5iyhI~H
ziP8j)p1E~eFK&Fupq4?6s@D{M`xjop|*o;?mS`U>CeXE
z=UY$V@qI*-U%Ocnx{YI`8*}{${MG?{c=EwvH%~t9MXi^Lkcl~~F)$a5wUYs|1a3T_
z2`_}hbaKo=Y-x2@cFJR71!n)Xp;iroM4w76y)2*BV!;6{5CD2v=G4q=2Q}8NYM
zJW-L_6kNzCv2aQFR#mWGE$KzLzDkN^NKBj&3ppAk*-Vtmi5LjWcQ=EDNg+=cGALx>
zzLR9!oqh+IBMey&N|oUi!0D_oxf&U|(QpSI52Z7V30z)s9VQkZ9G7`PW*}G7(@ddbl9*IBM$Rj6p(P
zQe3k56DVZJA&I{!oM1o_PPA^sCc~IZ!G3839VY%k4Q8);b78K$ZO5F(6}L5bga-fa
zz@r}rI)z|6HrHFNvljIB1RuJqfo2hKS|gh1w`kB2Fbl2qub+5&we#rIgBLqkx^lYr
zPT2Ob~5sLTG=;NDS4$eC+x^o#J5hp2`CNBrfFHHj1h8oLpg`}`YNYemN
zqlhh2BIb}8;WysR3@Fh@f@wYGOK?tB(4xuyx
z5H=IJ5wTTO_?apRrl@H;G70hjOm?M=B2CSo!*Nvz4!|k~2M$Ht-+MTp&-qn;2B+NY
z&iP2C)1yaYX3A#`#>MWAAtw%k0Ord#sWuo>VpJrbrn^IwP%9D0691)13Ls;P9wo7A
zd(id`o_x`dFSc2|mRZN85p#bPCUk(z6Q(`XMFRsWt9AiVt1%9PMId_eWWvM7fyD;c
z?o2Ge52?Fc6$&9x;F)rOBXTCiN(q%U#^gRmr3Nzpf2EWJ8&-0a5PAl`w&XPblud5qM3wqEwW4zf{!_21!)vJ5&;vZXp;2DfUxeP-8g)HRdPE
zUesfC)`1=4T6O4Cw*mhdJl5#_|X+`QBF65jT
z)R2az=vqW3&E10w6q*6_ksVCZkUDI@l`RzWAKMDoOaeF
zozY`10rq>I3DEa@s%l9C2p#Ds67E9+TF#)D=V8(QP|A%&khYufe@eeeGF*E*?x4NQ
z1pJYEuQ(DkM?ENF5%CH}8z2bW#|Idrk&69x*rb{E=!(Kq7?e;x-IH;Gd)6m~jB_e-
zgr00Ag5*EpLYB3>U0EZ0x}*xmjBZ*Be%m6lJ*gWwYAea+ERT#TrJ&)iiu5uV&4dw=
zJ&b^qPjH*=)20Po3Ims}D~NQ0K&%;^BMXBT%0tDAXKIHRb=kpwJ}uzc_o{iCU6<8=
z$g6!nj!grAT_m^<_dWkTUx$fG)Xu$|EcPk80Mj+>S7KW2?$zlJyL}ka(H9~+JGgRS
z57zAz1bUKh>^yR4*7NJu^|zf`&MkQ5-l$XX@622q0gq19h?XD%b~IuGk(ME*s39UI
zMetY$U)rI=C`LD&GAYvgxN6>U=IT60k~q3Nw*nhP*=PQZm0rXt{R3v=G=TQ&SMo#D
zc*{@$Wd#=8VYDPb2q=%;Acx&c5C7SfsWwF-l*A#Rz`^BAx;>z(3c+BRMogVFokSs=
zFYu^(&hiP)P0ff5dx^#@Bx$y#Xfm>vo-QMq{9`D_VIhVMiB_bU>xXEKrZ)!j;mE5s
z(XkjoVS_akVOBMI7<-RN70(k_xWR&UUdV~8=j@T@5QH29OUS0c=$PgQIEfN}=gM+az1<
ztw?qm8dJIg>czLK!AIoSDa$74#`X)ugl{@1N#Z<)$WFOF5H&PA7VIS8$krNIejX$S
zj708PCJ|W+g%}52a4-NXsU)U+oAodJEirM|X(M)8c~>SIiUbFb312ndFjb_t62_p`0>`pWDoVmWH7^iNb`iTHc?(@WbA%$
z6wSwRmLf8~Qnbg@26nkv8dnxEA?Smt7P54U;0Xhhr{jB{LJ6a_LsTD*yae$(=>7?*
zTXyx?he&@g{=263(+?r`ytv__z&r-?gQEacDO-yj>cBd+lm;yNplk{^y+
zOETp9_5T7hhxHK^WF#b0oH}r7{6RgFeP*3xwQL%271fOPhqm?94jTs@Bd(ARx@G!T
zBd+So4IpZpFyep{GT}{$K-xy^1~fes95D3}mA`m9m!U>>FnK_u)+JfBxdbbGwf-DB
zE1LYF-P=oOgmJ-tGM=eChLBrt$FaZ#;}T(J14>*+ieK^QvLb_i(V(Fw{
zEhM{Z!sUQ;AHJFq^1zQs}Qkylc3K2
zBEAOpAT5guZeLBONu2|AJz3?VnKw_P_%V7yd(IkpN9Nj5GdrtTED$k7lP385g7U0c
z=zO3frXxPSAy|o2F4O
z#DeTEJ7|4o0
z7_?%Etg?$?Vgitv2%i^YoQg#$N?F%BA2b*Ciw0gtrjhj_h*tO&@Jf4VB@l3a9#Pd8
z>qb;tWhusPvgz3mfPs;bDSM!1#U4ldBchDlWxWwoh`xWQH%Ko2T!NIQWp%nf1a^}-
zCKFaB5>C>KoouRu4)qvu!McCWn~xuHVFi-#f(&a3eLr4o;y>Q+5`)5I9;zz#fwjTy
zDz_+>1jp^TzK^kwFsX-@sE`O3@tZC*d`s|OT9UHNQ_&PCo{qyxzcB5Ys*3{VqB;kk
z>e31(-YvHii*=tQDFU?wFf2kc&}ACf00eVFE$pQfwSPdBYrE9&+oWK*dlPEV(|5C_
zcp;HS>k-{ViP13g%=dT2;r!GF42oxV_671Y4{`N$&st!8ZRtK#g{MpvDvr>!(-Wp=+U;?&EivN(V=te1kW_8dszTv5
zF;Zo={}vVmj%T)IAgrh?&WCqAEGdSiV&ZKtMso8~8yhRU4oG(UL2>MhSE|X`_};jTO=sHwD#O>jQ5J#2#n#11T6dd=
z#srOJ5-F@{0&i7ciiB|t>)ycQPLSI9lLlTlRO0TCge8Vil*zW`gO`)j?1p+;fa}=t
zw`q;2%W}?;>#+=Llg0M9
zN?ciq{js}EbLz>=q8e7b9j%t1JuJMHSl-i)O;H6_;YM4(%<{Rlqs$v=O}R*9jUcLE
z;oeOYs7RAJV?tx@6Tt--Hdk0IF!&~XCsg^)$MT()RC(kyX;Vs3n5;cCX4dzB*QqZk2?e9OZ5aJXmT)5>-3}oKrTP>86uq!&Qq2#`XVqgDwUC($5R#yRjG7}Dtmr}oCi@qDqZf>q+J7d9b&atQnC8Z1
zjgnH_!z;9ufH@f_k(LqUMbXe~uQEb_-sLjwU0Bxok
z^`V@;1jWlRUEW91%sBSMF6to_zWO%<43*MUL4_Kn1Jit~Z_V!`w0I420|Kr;X9>x)
zREHI2C?PYf+#tbCC%?Ry3BV(R3!KDtZj)I_vmq
zc%R`Nj?2?xHuT~7=}7-;2LFAwaA?T;g`oCkaq9@oBar>=Jdyv`P{3@9r|90;t=Su5
zSPDDEQluOb<;h^o0xmV?@4NzzY5pq>YCU|4NOI_X2)5~~vtd|H|9p2Dr+5M1NzDzlj2vi2Z7&GjOkj*Tu#AZj_J9+L09s3}*n&?abzrniq4FeKm&5=Th
zg^OE6lskk0vLXhS5U)eRZ)(X2oKTk65o6bsfHMkSaPk;7+%tT*^lP4hH_%eDqiA;0
z(nw_Y=I7tuper$Lkq9o5tLEmSmB&vs&AaU5_(^H5Fb8}_<{t@`GcJhvw~|&SAZF@J
zRJ6`QB%(@oCP;9W*Hlp%hx`!eIozeex6tD~7-(fE4P71hDnDjcCWNfMmb1ylwIGn2
zlaUskS_BggVzfeHSV-uZ9`z#7LK-~gZA9}XwhN8!?-|a*rtw8wnB|yI*(gM&aGSjf
z@6e@VvTNdU`oUFi^-;P!*}u>`tFFzYyP2^OB`-h*IHvR*r+*#JpKyXoqqSazcxOgU
zfgiU~)ox(BTkcJ4xJSXh-k&Z+fLxtpR0+1lVT;Ltsc|jJJ+owpNyyu
zy*I@4_ZCc7fk{TH*E+LxF2-Gw+K~<4RhrE!W5zLy@9v!sHof|R>(l_h
z|I@AH_uap}_nZGuZzAo`P>V9EzuvU{NY#?ZlaIrj>W*=?Zx-!IV=>H4$5a~m?PCA+
z`033hl5<7ht#KbXRNxY+@+giCfRw@_o;td~Ryrps#t-QEpcqzxLK<;JXv<^ZbjLf2
zPwa;pz}Ca(PRsNiH*L5ZMP)DOuY@8)K(2fv2c9NKwFHvh6P*TE+3lk3om9r*iSUk}
zXtllA(ve98?Zeu>!fXNpiZ?7%_RXB{ZVJGOlpK9@1+iwXQH#x{#9FK{+YtZ`8>_n1
zc{Uo^7#aJ5W54r-JZqX?rcHHyDZ9h&FAEl(3@b0
zI8Y%at&1>*DZ$f`$T$}Lnfl#TES_05Kf2iQ>&~kN-OlY~FFRqeu>}btBv%&ev2yJ~
zeF`D7Ki;`Xilwb_pb>;P6&zOqt)9Ysm8hsfc+zT$(>?pG1>q!V(!i`~acnImKG;-+
zwUZgum{ayiC{%)G+h(KRd*+WJ5vi_B8+IgPBDsRX!aaTvLp#QxCX4F;xsYazn3^_cEyqf(T>r$
z6=2C$TBRrfRse`%{t1rj`!YS=M@$W8zDjQuf#)W!i1XSou}ILGE$1LKMaxeNXNe@0
z2uih8S8GcT2w^6zeiucrE@$n#pY43uk$g!w|&LhQTI
z#>GN);@`0`8tF2L#_O7RTj^;MLdxXw^i`@I9Ry2!m7Rg-9SUr%3!Pd;b58od&?
zthZbap-pKx;Io0Gt~xAUlW6rtN6h3(>eO_!PNQR-exdq
zo92J|4KpJa?5g(IT-=iMIHZu)410gv+GGJO0I6wF2|V_W95nzeEvD4uIYg$kqA&J5
ziy(uKc_wC(+q$zF0zB!cn8HguKeY*_Y829M5}4MCZ6`?krVL1}M|
z7);(lGw_jwA9L!Nrp%z^1Tws&rA7|I)h#u07)Q4caaWOQWY7Q|$wZ&Zd1(yW@NvJm
zqUUs)CY_J|P?SU*nDa+!%MU-h9gxj68iA+p(!V($_*hS}j=l4|yzT`p)15K|foH)f
zf=(Pa?5mJGIAs*umc9_$T#sp@Q{aUtQ{AYG{bzFiQO_m&a>_3S8wgpTb1|w_R{qnq
z8G3z6V+AG0r+M#$`A_uS(uP>+U%I;XElG;;0Ih6sfo^kGfEJRtvNwP=X=IsFHIjKu
zlem9p2UK-rUIXc{!QX=fC`XmEva~oblz2kGt70=oOxQqzL^%N-HbHAI0;(ST-GFMV
zG6dF51oiugjY-mD!FUd-3L?0zRS&V*YNT)F7etbBe2ussFm|0}A9qkHu9qcC62elb
z#j~Y|afnQ$oP{boKs>Alc$u|-PPecex*&4p40I5_(+%-{_J((*lABc`vOyYE(2adGxbg%wRA5w8a(6alZnC8SDL;ID8?xXr8FeZ8(*W%)z+Tv@Ia
zaFwbKfWWb9Z)(`pmwMe9aqLR($rDBX3ZCTcHQ=ECKTPulO
z?p_&eyP-?jG#pBvN}1;1BO&*dY~YCNNL^22sT3^X=^LVI*)#!oO#io3RDRkP0tVmjITGRy&d0lip^qo9
z+(X}QE4A%6BaQq=<;d=={?m*50a+_1AC3&!kZGcg$@^EtcdUJ=gESi-zyDUByNiMz)}pvKbz*&*Se&EVR;!aQ}cJDPKjg7%GYUE
z2-aiu;3@AnatZbJ+nGbN)ZNun!~5yM$_)4?s=IerZtRI0PtN8y-Ejo>8?#~mr|?S&
zQPH`VX}fb|eD`Mo8OayxMC836ei=B!k4rB>HHPZM3rTSPtKHqi7ttThHs=KFcyrnw
zhFf3#>=ynVhi<)Z>^3`3p`{H%C$YP5`=q7A2NP~he|dq*-c286eTyfk<%fOtv>$|O
zo)KHW)I>zgoic0c+)W2|PpW65dOZa5Djz7>!hz3zU@L*mO?Yu?0n-s>wIgMW(B1Y`
zW3R4mmxCvCOnsYK;b#3Csdv7s3reC{_5MHYWO0NAA5sC?AS&vD4YV}2J1~q%imMPA
zQyV=ZgpX2^{d32&+#dpIo(h
z9@O#};TBUnsWT!d5nmlu2eZEKscJ%2XigsmmR2rw;$|&5mG+`{ygV}CBH#cFp8KSbrR(q>T!FEPLS5}R#;TGJxQCK|G&WuRU
zQ2(jxm#!nJkF53`w+|j)m%OBG^`+ArZikfB^
zl6&I{eMVok%w%#0&(KYo>OrQlrf$UjcU?2Dn2lHROlp5yyMyEfZ+J5;Q-vOQW=z|y
z;n)p+To&20!n(+eQkf2GvRE{9BKxpOt?|oaTm9&qDAM~vC5Xqn3dNJj*bWFD*`&8x
zq?~dXyd9{F)(Kau?Wec&vwz33rJtpkJZ~74Hq=b^Ah7VIN*p0)`Tj0KFKviYQ{YL$eodY}yx2c&NDN4OV(VfG(|hYge8u4&pNSt8V|m2+j3jw0N?J%veSYSOI!Kj#OX(dPtr1
zk%99;nA|YM4gNUVm-k#6Yc}*ne|w{W#rDgg9sXg(->LcWL{!<3oO4!X;Vt2IMy~7(
znlJqoeBU7Qg2SSSh@4Y9--Cd(<$AA}hf#!Y2-Zs`m8@l$Th4w}_-4(?sf@V&i%P+?
z_it+<;#n$$<3r2Lu<6q;mI!5rlV1tgzS>*_6`p>$%+}k_Z=*KS>F#-xld2+|)E$jI
z*vu?f#V<+!K6plkGX|Y*@MNu0qsZ!pR0HExRBG<#zk$o_xfAPzHCJxu`c`ybIaE_E
zz*@=Qnd8UXhZ_^%tP8NhXlPygvL=2uO6!u+oC+Uv@v=nqRDQ8r)z4>pT4_M>@|f)=
zZ5m2GSZ~8W(nx?l`Swpsr5?0h+Vj_8&y0j+UA0DZ@fqGqepBnxXuxjEk(Rj=zCcM+
zW6N6yM2T+26sE7X9Kw9djQT?l4@x4%$RjWhF@>y>Ks_w`lJr)mo~C;DMf%>oZN?s1
z^P|rCc5$BpLU%%
zZhe!`b&m|m20x>wr!9hv<=~T}e9xk{{QdPE%z|p#RqKMUoVdUz!+&C+WV};a?Ecm0
zUSRxp>mu9#n&dQY>^9hue)tV;1W%PgRQ`NRv!A227@>oAuvyGsvCz%214k}OtVgP&
ztu|hAJ=@whP_6+IFIVr@2k}#Dv*068LN;@Z_qZCpsQ1bqwBx6jD(OHA;O_>c0ra+^^Ja#1!(%|r
zq^!ODdspXB@J2?t3v5flMgjP={)M&t3qU*czLaI>`8b*ba`-rUEO4&d?jK=Ev{^OQ
z>17I<+qu^8j;U9)XUXbbt5UA4BwzT#H`VjNAragS!rg5*2GpAu`rYmLZEP^Qaq*!D
z(W?a)-bpAXPv7=+U+jgk(t^J2ki|9ip%T3F0Iu%yI)sT~5Bk<(o
znaYu}g>XpjaHIfLrVFtKR`8^jP3=)DT6>`xGob_Anl1aqVT1dM$jA=`(hxNCVleka
zv~#!JZg;qLp>RJ`^3?kqf!#v^wn7g@kJy)`32ZFIkw-7EXKL0i;@XV2$aL*=#X=Ra
z>3c}4H|IAj#1<5sVIPqR9hpkTy^`~9#Dph{3PF)y?bvnt$x6Bvu97j|&FumCFwrXp
zV*8;0#A$PIu&LRG4TQ#h<^vhx=Grm16Tw_Sep{15EOy%MsmJtcWH!+HH6m|S#W*H*
ztp&8-T>+`S0deHIf>(!3!H5fDjey@(?$3RbbO0@p0(Se+ItOICSUxrpEdEz^D;|YfI!o@wgio;!`_P!bR{|R|N5~);6;z!i0Np2T}i3ZbM-Wn
zI;>6l`8&;d``&>w5lWFKXk=MvB)0bp?g?B!DtmO>5qVyf2r7rM7K8gyl6s6~kTV}P>$e6?84zP_
z8@&Z-fgPM&BybS=hp*%_)s!U
zU_sB2lu)h~O@p?TzbkZm@vjKg@!4e;XjP(I)CjdwgBiNHv8+dQFKMf9xLA>%0PIt;
z?rAxB*{NagFC_%k
zgLv~qTFsa~DEWk6aQr%u(vU_5WY+#4TjvxUTGMsw*tTuk&W>%{wr$%^
zc5K_WZQFKo_ILi<_ikNu)#~btSv_Zu@eEC;4$KbRzcOJSe*YN?taa*#ivF)Sw{8D-
zfoA*v1zP7kmPjJ;r+1-8I9!i+<5{*hZoxS2;L4_)US;{|hm4RZ2{$o6XsoINH>PQ}
zA+ANP;lu$jAsz&D2!usN5y;`qBCkE8J>xy^_u<{*qHE~fFmcKj{78$({$TxIM5HNv
zYf!ImbUYqMlr;x7eCaq%53Y9vdQh+TYwhpD>3ip}^Htww<8bHx^&aEo$*rv|TH)xM
zMcW%&#wc@}TV9deAdGJbJo};Z8>FO9=8k;y@${lS6L#`#sm+eu%`JH$hq&mh+&v97
zl*HjVLr^L`9{Hn)%0`!r#UqQZ0OR|nmCOg6C))=D?&j?9ml4+J%jVVbr}O_(J~MZJ
z-j7$8GNKK-z-Fx9Kn9uGDD9Htj`_{#-_x>2F5#C~_d91_&y&7`dpPs#z!~23u6D7#
zXn(Rf3l9#=JzSpNCPU4{;`T#J?JA&bRjHc0sjyxlBg@DK!V4jK2xEC;yW+7?6iS3Ei1L`;;Xm0DZbdD!DYSyz&t`Y#F-y?6vT0){28Zsk~aQPfCFx7
z|CsV}PLDON;%B%}xsTOl)fv(2SzxIH`?
zuh+8$r;PUCTNy+*H@-K24)5*~FG+G>$&h`-cO5hI%jBXTJipfGzyf5A`g%TpT$CGc
zYolZQqTT>aqdh-L^Kf}LEiO7(wIp54c!cyUh2*jJn?>>}b+_S~94*JdeVgi$K0L^I
zz2}`mh!zm!#MY9G)QTH)(AGxN(n>}*&+7^6xNMjNVoTFOQR2&+9slNqvHfj71OyB9h0pLv9NucSJn^td(
zo~!_)U8IkW6^uR%kBpK!`Gn+Adv>A31tRDHCiJZzGU6DR(>aTYqL8Z1vzxi~K)wi8
z&v_`3NjtoJ#m(=LDZJb`1$i(`ku%ju(wu_&C@;`awx4gQEpTbL|Ak@}H~t23O#g#T
z0T5ie%Iedo`hj=L?U0#jYy$0$KbsV%cXGdqriOO-b;pu7qN*@q@LUS(vkU*)72&m_
zw8gB3r6&k5Ld)fM|KEtb0KRlhp|79+_svIxh;<%5X}&o*2W%)Ttx@>
zx=HyoYRr<&HF%GKaz89l0QvXoh!l_e)#AZl*QAhkmN}d_8Eo^>L
zaJn5#+pYF__2RqZN)H>jM)OxCx3-U-%|GuI<;(Y9A8C(1E-o?jElx!26A1xJbTHUp
zSHwg5R&9a^py#hAA(|6@e)qjvX8*r#XIi*)e`+%LB23uYq(uuNYyMA*ujXJV0_1EoFb68~sM5&ih8lLyutOuaY@(>{)atLe%ZNNhF
zAk;e_84__kTaXi__Df<-{ac7a;%7K^9I5_$f&%vOdQapbD^}lF+U~K6Bycyw+V_+!
zDJ*}ljSM#S%7gDP&U>VANMxvtflxqPxWqVIoj8B$?P>!_a1?%!TJp!Lu+_;I@&SVm
zlfQI$n|kw>akKTPe&$tTeg*I5Vl3V(U=(2xQFJQ>ktthb?680(0ZyR(p3C5CL*M$<
zzzIcv8g};8c-7g8#{Ap_T8_$pdf3ZKIjYaY%RJgiE~(S~N?Nv)xpTa|xEg$9#--79
zajU~NvFF3aus<4cNW|A1UG^f-U95VOEnE(Ygo6Lb=GC^9K09k=)G%$o?s=XfwE1r_
zXP{FdwykzBhV36pL?JPg9!_T+!p|3ko76Y;{6nd`wbEBHJ^I
zV=o$KxiTzH3m_C~$KF6gHfk*v@U2841*CLj8LS_KKUgAF=u5@7VQpHx8Ep0MJpVY>
zeSbIpy!d4D%;GMn1*NOjr1m@@nvc^R&p@3e1^~zn+VlXpP37h_BJ+rU
zlTVIgC205UXpK|`cC{ydn0_wvBh{FE_15F4g9NPLiPMnr9i~y3H~=v9kk7HJz0B~v;l-qbt})R}%{sl9Q*y0@WrSNqJ%vJ|g6#!7+auB9Rb_Q2~Z
z1t#X)bP6{$tzXuAe6MNDHI58U-nT-|`LXDvp`b~V*LxJrRW4AKk(;S`E-j0HOSR4|
zy5qi~QO@UjYz@VLegeXyqXDD^uko04_Xu$WhJz7y>wE%HUUb<~`Zbd$$&R5WM^;#?
zinG(;Z~~dDUCWm4QRbS%dlf5n^%xh!Ix|TaUhI`?4OfpJ{>m8E3PqdS1wpHjIOIbn
zMhag0mL-%5g#hg;vB2<*1lk^OuPmWtnMAWm8(B$Cn2fr0W#As!NX^NjcGVA$d~^(-
zFbW5oZIfxoAijc>?MZ%!8>ERJ7@BH+X5$wHTGenCgxDq5an>0#zvKi}nG|;nuuDSO
zWKzAYFr`wxwJ5%*^|J@FCG|MspL-D|4NV*v__s~MJOocBDJGnY2ZxV_%gH)Tq`Ju)R#r8END9s2g9D^{~D1dZEXOP7x~
zqRAAOACCn%iG!9;iyWR<BBpm!W)M?9Eg(Uh%aEe20QbpXVP(~))hjo+T7@Sa=3rYv7IgH@ReMq#k
zjc_sFD2(nVR8292k}k(RJU;r8jL^`_R0wmCtlhXuQ;t3sAucWb(fFLh#xVpe;&qu*
zTnSwX7x9R>Trks((-HPL0p772Rx-l5EpGneQUa%~lCWd#aXT9+0-^H$N6G#A;Puo%
zvkZb9VsTe?-is`-Dkse^`j&ZADy(p=z~@=_Mff~J{#{(6+J=b^-6Pj7UJTWs&qR1C
z))!>xg@7U^g{DyiAVVQg4|^npLKv8mG!%sna`81om~7TCrAq8@#+(!xgo>n{@^W
z**?t@#Q?YOZ-sTJ)a3+8-R-!%SIs&(^r(S&N}yCZG(E&nxtLv2f;?h~_Ko3C%!9T3KV;;ya0TWu(ybH30H7y2vU0MidPPCT-+eZH
zcwvH$EvX|mw}+5i2g6opT?@0}`y%@KB+^kyj>h_21)JS;oNM`bH8i~ywJ7=sbMrd0
zc$jKo?pPS6%pjq$;M08wRhAyPwtvrB!0im0X#MBP$hOkV9?6N)8yrK_SX_d_9yRy(
z^8I?%h+VC|)O<$KSg~bREaCQb^5$^?XeUfa64iC5u1Sh98fH&GC@({mB_p64=?8y#
z$kYsqqZV0aSKq857b6?7Td%AqzWi!igvsuKNb>5Hjs&=~IrMU-$3C%wjzaiKMn=P_
z(108kzKp>m|MoEleuy6AV*`dd2FmQi52PpmVf_+>AdgfjfBF~w(Nb#gad<5NZSsA0
zUC_g9PDJGwcla4M*a@E+M>XhNKW_hu1DJARtMQsoxed4F%#;n6{cfL1vqxUCHi+c(
zR`oOJ$(CnaIBNdJlCcrc1if|0pfjW)^W`?nr#();3-@#D_tT2B5H)g}rGNWr;mDpX
z+spAU!~S-bdjUyz1A_%Fx`~{C=45W_`6@!IxsZ0y^L|hjZq-k=LCg#bezY$Y3)r<)
zP6N$bZ`ptE6drDBav!|(?pXEB=)u~@vir1?8{70oF6p#>@Uw%F&K@Ihg8~5!hy=NY
zbs^E>=%b*B5ROGfj2)u3&b#PxP>EtH-u$DRYO1Y@2|%7MKY$zVwq@`dm|rqiP5n13
zm6SA`2C-|oAvm0?O!lKe@e>viZ#%Yb_1b>mkPG02ty%ni3*No)3IgG~;-UBjP
z$d&{&66A2}wdt~P&d^o%&1!03*fl+eJnz6cSK2fqgqF@gE1O!Z2%t$^A-f^5wfdu~
z{@s9Urhrq%4{OHHWBeXG#l+#_H0>mn5G9TdKcGLoZ;SV6*VJV8bP(tWU+UCtuV|J5
z-j%c?Z;C7fHReDBEE|QS7=wj(FLa!v#f*FxuA%f*!mu9#lt;GYFixdB>dnn8c}jHF
zB9q?Sl^k~CHr5tAisMJ?UQ~m0TmHBKikk`lV3&Pq-kekXICaP1E9soW&)b0ac=UL2
zE|amUba6keIa3m*miJwiw#$c>HOO3tqi&KD#x?sJ;Ye8Z>#lTgcp#BY-pAv7@KI-f
zE^amRkf-Pof8>4n7$CMJX?}MAX9~O(y<&#mGY*tj1vc#%Mf2qIxzMQm`H-e`CX6N<
z&1!NqY)WG)N-~oDB5ROFs#;w&RrmXg&WvNXM;a}ubDV`;tZGa9TVYl6nOrK8t+cm)
zAij{1z8EH*;%1X=)1dCQ8b)^cEz46CJE>BZu{}>>NHmJpUy6_&n`0&^AW*^-q4C)*LPbiZ%SSvtPi#2UA|TfB~)?x4*WF
z@lA+8%|fG_K+XK+p@X|q4bBc3@P$DBSw_OMfa76GZntp0`BMiuPOcVv6r8K^>zwrK
z>D^X`Yz}$Y=}N%WQ~YJd{-^wyisuX57^|lb3*4-nQSeRRpqpV(4^7N`NuQOVO{pS=
z&EMEZ61MpW&<+^qZWK%8Ynr*~e;doL6Qgq`kPTn-bkC^;)pRxrpnCw-fjQFD%*XEL
z!wcirf^Iq+0rJtn#%m}B{Se2-6Fa$MD{2LXvkQWg9o@e+=rEhuHzCheOdH<2erL2n
za3lJmlQZ(a@$cQte#31$)AOW#x05QLPo6#f5+;r_f70w&nDlt*V)sf!%8dz3v*Z-V0)F
zNuu91Q)Wq4e{~#7jBawWbIf&fK-Qjw{niNl@X%J3BT%km2+?a{R>OjB=tScRz~;0q
zs6(o#$&9mkV5{6!5mI+k^1AoKQ0d53(B?G#$$-7Nc~ip1wTB(2r!ZQfR2H)ttsCokZI#zF($Kx|}HBmnYXRLt951ZRC2`MdCsijjv0JBA$n#qMe67hh)&9{eH&_Renc
z;$KS=Ir1PNQNCW>*^{Uh)6OQg$wf{UrJs-Scwc{ZY~SqYuif`6rQDLA#ixDx_p8IJ
z)vm7Z)iAwBeV)Mg4v3N>#KdEYkc?=RDPhr9ht7vIz0flg4pS~~p)
z{O{hhAI*+m`}&MvUfFJ
zaE6oN-3MB_OSPI^pF>C5Q_Djk#zNGTV_73ldg;ph53)Y0Y
zR`={8mCxSd)w*=wmI^qwW{vsXFINW1%1Oh^vq`Y;#nm~NMc3`Vla@-;i_^*H&K}t?
zkw>Gihqx@gWL~qyp?R3>Y3gxzaN`{7c5Ei5>Ku
zRO)A*q&;Y|d&n~0sUEPZQXU~lK^kb(#8m1bNT)Hbsd#x!#awd8|$o>hk)U7}YLQXT(R)l1Qk7S=(#wZ-|8%|rsX`Zi&d0PKgQB}PMK=BDm
z@#iR1Bz!eOi;CGmG9+-A
zK(LKL$r49M;4HQv@p!(ZX?a;o)gRFCiW0F_7m_3d;C<-b*Q6tDfWFj?-}lI1aqj%w
z&x0i7TO{g`*1w7SDIjr6^Q$z7cp*oyLS`gMREmVe5`*V_mRkN7)Xq$R*53`KP;D&}
zFD_~7KPCxRjberhtXnKz82-;6UMj9tzaK=ISY-iORBI_TfMZXrA0;b-9Bo>d2v>6HK?)8yM8p$xVZ=2UAYaDA(-uodK3CpU*3E
z6A^W=b}^2XA^W$@bh~^6JXxl+PE-TVyleK`%VAw9+21{t2nojk%VFp+oPby(xQ=;=
zDZ~gZjQej<1`0s|P!9`Cp(_Lp%*6?sUbhNs3sZe1gjRc(4mD&A`QiF+D)lY@x6gjR
zdS85?@?9LD1c9Jn9GyrXQWy>jstPw?#=LSAy7jn0d&{(;nqtRL(XTyoMY#dPM;QLX
zwz0j-J;0J!8-wS(^S3*6|IVY5P6XKF=EN(bU$&Tr!s3HIPef^9zI%2tYk1{}t3BrR
z-pcwF{6>HAVl#i)+ebA2n9>qZLoxg-rd^Zm*1X?%WanW7<7C8p({z)i7I;r7!bY&&ZF2<}&|v~eeRT&b
zgw&v4sG7m^H8>xvKb~{}YFLdu;xQisg7vmAJhz;y#Y%?UyIpjr-I*^rPw6AYHyYou
zbkD;WGjz|$_T{}ro&iNQ```6r;D=e81KiJz!)sj)kLU~gMsj7-#qc(H2*p7F|n&mtd*(6e)~v^
zC6G!1)wDlt^eY7}js0116pC>vid>
z?iEbsUa8FWUa5pa7}L@TtDU3Uo^^4lFo>2&37e%yTC!rA$jz12rEE3;*)gQi96GQq
zdQ%+g;mWpQ%M7c|aXGjdXWWs{Y
zuMgp5Q{ZeAjt*yEMLgaA0IDO}04ej53Ix$MMu5JQ5^1%!3a&4Xk!Y$<7}i8wW&>dM
z1GTzEg_CT}X=?CD0D(Lk@WK1aMr~Rv$?sQwIm=j2lHm*M4QdNb9|R*srnB{-67Ty{
zA0S{J4#X>p9ppqjO#8rG>&#S}${yB~hDs_i%UYlu(*MEE_JO$_3tKJ2%DP)ts}>Gr
zSqMb@Q#7hJC4}N=5+A|pf^|9wkrck3pd*#EHduAmDdC;35{DFydv`MHGiR+Hl;l
zsL2>=6_ki1lZg{I;v$B^IKeF=WdvX~y{hfDsky%Cvf5_aIs*B$tZ}I<-JXvGc|t6V
zLDQmAFW^u_Lc^Z2b$uwjre>h4LsF2!6eXhBAg+TXR89{}Scd*|?3CQMj{2rrBhUbM
z>HmZ}mS6y;j2~N+jN@<&!L%eQzBuQANhO5jDjmk74!)#p0MI8}WbSlD4(B06S#8w2
zvqk6^dWSh6)xQ-?&NANU6C;7ZL8!?QlN}*|^cY+qUkPH&)M9`WMY6G;%Q+WOTn|!Q
z8_0Bu)0%V*$tqeAB7d_I!TNjX8?Qz-H{W0Y=bGaQ?-X_M(Ge$A1YBbcB1r^iD9jK-
z6UT5cWRLCye&O)i<7JRO*OgP``B%BMb@GSQ4bG}+`Z*eDWpe`%F%F~=u6;<1^@2hW
zZ4p6)h9#J}xSp4V$cnXpXfi}IyA@el-KVqy-_hQ8+)^NN4n();p&^j(D5xbDi#rfP
z#}1CdHrculEBc#wFMs
z=&!#OWjtDh=pT`K#({d0mEDy}DwY&!wF}5J5UGU?qe4EMvU-*#CduT@KC{{jiM|TT
z-+D+@A6ihuHlzdyT1f#r!7ZSw=opy4RA|9cqRl@ibwr9Ddghxt9YEBCXj=YYLs=dL
z11p#+K3kRUBiqfY>S0f)vdR+VNK*1Rkihl}I2wlGyZYcvXgr8TSu{Sf!IZDVlPo@0
zmEzgNvAVbpO{Q#%Jrxq6!I|#d>ud7Fct-L`h8FQf5=aKbn2ntek3o>}4;vc5rin!E
zv_~?Ym*>IM=h1d0K?i)h831}4)vPj_`rTTatI~bpoVF6_Z~0!Amr;P6qDuv1SV1we
zeIwBwYt_fW7)q=220%|X8&D&qfy{@4Q9Q7gk}Ou_E>8QGi7K1m(vo|J&5FHSRoe?=
zKdfr2+5`W1qXy@O=!)Rmm@p&hB!~^MQbWWcGD8rg($0e>Ewr;EsC*KPZchI^SSr_t
zd!6LjC&OfcEVGvyul$e2sRAlq6E&{5qkgz_CfKigj%rCS%e3Le2*FSh!Nd7y!-)Vu
zAfg2T@6-%&hOSdA#QP#1)jJL}Xd6!W4PMnD({Q{6iIfYL0*9XetEf~%PQ;{f)$2ZUuN_vU=I
zX<~B-nIz*2O$H1M+X6p8UYC)&m2C8Q{x5-NwS@Cj48n@N*V%^X_`Q$MS_0;+ejR#2t
zBO+nSm?lI`^B87;rGIQ-9M9E_^EG_3-2X}WJ1Qe-o3HNJe2!PDdaP1|cR{T;JMUw^lHN%wT!~_BWH$%V2kV(9-R-
zC5?n5vYGtFsECZ4i2S8<^koa@LUFH~Bx1UOcf+tTN|G(ZPMA%;03B1NCtzS)rteIW
zJ>!B_FY9Ip$`7m5V0Nctu58}eDm#zbe020>U?QSf!Z|Jw*oBB>AVf7eOYA8$8qzkp
zTNi{Q?vBqZKA?@iNfMa{d6~CXjTzV^<&555RE`-rQqwhpni?4&p2g!^{uGL1TQZm;
zy6Ir{Xki=yMTIip<9K+w-hPmY_&&A=1Xey^vR%s`se}!~6Fk(^
zF1fJbDnue-_Xi#KfHk)?_=^GWk{3gVpwD7%3GM
zSndgojvOgO)v>6lNr;3a;UxVO&_<`oDJQS7K$k&%@xQp38?hb6l^V2X6uB{P3cn{mE@4W=NG*3qs#nI45@YjaIMbLmZ|g4aws
zx9)jA4%*w&=d1^;Gc+Q~u(JO|yzZ5#5%Utfi&)YVVGanliIz1V;M=J+2yAres)ldt_1SJW
z7<(>0Q})x16W0URsXiVLdSSzAyrh%41?f8zK^WV+4#N-MH{Mj&I*C`;Bie3G-qB4|wXbIMt>P|=eU3AiH_QYp7Z0asZO%`@r{{-Q_7IC~^dFYsSk8O$yE70JZ}d^b
z!c>H9nQjIuNOTv+bT|Hs3-4akurNbD?2nOT0D!%5rCAkMevk9O+<+nEIs7wGPju<%@85H!XJC3G!!``+)5XAKsvC~)
z%rsY<-C_>h09bg^z_%h)aclr5Z|{i8MWc>4-Pq-0O!T-DR_9L!*=9|$?I}3=
zAC~F%IHZiPDr+(rgfl)Bc<@F=5#r$}5op|rf`7=4nSuZQT*w-cy~Y`S
z*{7JMDA|93t3{Z>KpS%I94F-kec*GMv=UycHAi;PV{1<~gETH2l-vl@{e1IhXh8X1^SMBSoz{8|>P
zXuyC!s-!vz5ws!}O~?#p4Le`5d1aSbA}>{*4t-p>mzGPAKBgfs8V4L?SqGJn{(z>j
zH(JmM*^pPtvf{1zc5nF__Mbz!b?Ap$PLd)i1!4y}I$6
z6<%=ZT&1U^eVa;nXxPD~c`iuc`j`9Ip4Sj_fa~W<1Dr&WbF;)&Jv&7i+f^2G2$|!I
zQZ)IBO%0=+4{?FGqJs$@hKFCZavXQ_1VOBcq%^hO&$&(1_4Ac%O9{zRmR3_Rp2LUg
z*y8|=WLerc^f==w94}J7$NjHKUUg&m0EY;@>>S^_06JsO7g7eF(PNX#gQw@ZproD+
zzhd3ZzN)mMi}gMrjf#(QKOoMhXh;B!z)j+CpqZz;DdA~Z(WKNt7bq2-cjXll4lZGh
zZzJic*yD!s@4!Cd@8|Xhy_yw$1axEgqwGWf*(vA0!RJHk_x!%I4fmiA@!Ka19U;%!
z%c~YWC(~~DZdiL;j8bpMHqdV-FLM(mQ=eFi7_j5jDFaf`Lp76d@J~#S;6wo4zOZ(C
zN>P-ZOh$%?d~#R#sS0=YC_4Ob)dL*I%Ot5NjExSjbiF4M7!$9!Y}rawv2p6{gxOXR
zl54Wpni9|zuut!6;cgcP6Psh4AQ?|gm|nHPfnu3TAe2tjbR$buvxfq)$oBYq&QoADq#3!BvwGQpSL7PUv3$<+I!V^^0f
z(r7_;C{@U+7gBQ>QQ>a)^Cde~Gv^dd>%lrxyz%ygVAQ8)nj~vSneb}Z2CMDt&N-=h
zPH%a0u%s#~2dG(g6Twrh;0c@)qe!Ai2!~X5jCjSY;u}+0er`o|JXK#hqFl~hKRM!A
zTt6m5H(QI6qVlj`u4Ze*smQuDi_&ge&w5nKmSBZjm=aehtTC`lfVSppk+u&m0X9e&+TL?>HHC}+9q8r$n}y_AO*
zyeWVDK`Ew+fhCa(_iwy=t=19n0TQJ=5ymOq(n|drv6bi>SHs?c?O3LX-hy{(Olb%>
zdQHEIERjK?Jz0I3V(Mf)?GGEo2M1;fK;{uYylF2_GDX0QKXd!T!qi}kr}O*R_FYg;
z@>HdGzdybAjSlNg=l(`rqXt(S_q3gU{QK=I^AYmvUNe6j`QZU#=&g|*S}pyQ
z)sCLFp^}Usr?^{IKXbp`IsWS*PmZ3>o9lP7AH_qzGvA96-jrEi#K}KNX2WC9$xiL*
z8DA|M;N&yv$)HZ^tZk6>iC0(0+t=IVsh_*5!t|9R!(B6`>pR%EKGQo7#*Z%S^@ZW*
z-gk`E9$;3Mc9W8i6}|5I8OEHul5gfp6A!lX)U(pD+=I|mZ`v!iZd~c%K-879E{x-z
z_u>=bwBUnr;giz22IYi1AZ*VH(Y;<(p5>fO}c8O>NTlbz6{`@7e+
zqX}?$WG))|(AHc=no;V@l*gXVRk=tr?z|FGg&mapBBbLyTd4d`#ntknp^0rlg(E-E
z>rz|a`{yu4XYXHz+|{j--?H}hkK%LJdm#~3Sgv1gb4yY^TCEJ4v%%fhpqdi{2Hag0
zW^5Y5v+{~;FoEsm5O52ThHFlx=j;ec@7uS9$^MU3^N(8Fs;Xr}I(n-OuB#WUfD2g$
z)7Xf5(kflphAi)w!?Lao+AZ(Mk^6hm3Y%-Cer%2Kv{S%U-^*NpSZCtpF@<3)4?D*g
zXQDOtV?N?aS&684D*~Zw(dLM
zT(G${+lK1z6<)y1TI+4VIq%%7d;b%s$z9aBFUSyFfa)!7Zrp#nnBTD5M$dO4o?lZS
z#qzR4iuw0hA#xdvXN<8|u|^ifBGBOmy8c)XXLYu43>EjR6H@5a3CW$ELt+UOa8`A^&9A>g#x
zSg+E030H#6LlX^$-n~BfSo3ZNef*_p%X`-&vCvI~^&_Amz3>es{2A8&j_n=qb+aeh
z?A-1B?WEUh0M
zjFn*Gk$JaVR0XeSEdbI%v)}4i!nbn`p*vi6(-HgT)v60Gb|#nv;E^m
z&Z|wkCP*)P4r;rKrzq*d%cBjk@>z8k?4HQ--$
zyGhaPz6VXgfFj6_aX|CPh6s5QVZ|MnAOK#exRoU5vQfSmVIbe7NLF3^e*ZpokwU73&=;6Nu+E5*La7*s=xxXKi%&hEPLJV5z
zoVxDZR?FT@jK*Tv*13`*pij$+>}vz1JF-+Uv--=Sa(@ZN$Y4zeuum>Kr_x-eA$Svt
zY|84si839n1sxlWCZa3LJF7}qSnH(OKQqN=1(_WusMWBZWtA>04Sy9Ym7Z1IwtH`P
zEr+P;(!xM&`)GEI&oDw=@(g!X$k&q8O=@i2b(e#mQLa<%?^h&rxI
zy4uA?lXgBQ%qKYnji<=usCL`8E=P#E?DU_6@Q4+#i$6@PDU_%-hP;;36cXvAMd%4l
z%LNkMN4YRPPEyRQ&Npd`IJ~S+!!>fwH#I)mp?gC%YGJTOn_C#$YHS!FmRO|zS$BDQ&`3YESSn0B62u4_XSKf5wlLCDTqjV|aL+{A
z%)q@B-0?l*7-EIiV4CrI_bgx98rQ?sz6Fz%Ka)1H2L`0OB(!;#bR30b?<+I0GKerZ
z_U*dd8_C@OF3owX_zVics?q~wd~nVLYECcfvp~z`XL06kDMmqC5BkeWCXicfn(ifT
zKnUv%rXUZZ5ih{`gLGz+dL_BV0OuM}5O7t;wxlcXxmc55Y^Ce|`}O>)-vk)?1Alb5
z21-Ts^;(Kok=~LfYmnC(_>cC$4`3l+t%@HHSR)ui@M?p}YCD~a-=X)*XD%o5jAr#U
zn)cL7-?0TdE~b2y5h@QW^eL(^K)}Z%nvP%z)4&}`Wf^XYtw{(Z*;hv{Z-J6-F-X~f
zWT4DkmJw9nVkdfV?s6Dl6Nb8i^X!hbsGPKmt)}D
z9)#dK^zRD5X#F`5<<>~K>kI>!#VIkq04@4`sQ6|A>?Ld?)+Ml|vBczTZmPjmvXKF#Dc(51?lRs
zJHhs>Bo`UX)}i}o5o0#PKHY;_nTis}8kO_0%N@U%o8$Z1?ar^B>=_9=GS|Ia<{T$w
zqqS?I%r{3IRIAs?>5Y>HS|tr^={XC$uecDoWT_yQn2!)Si1Xv+dp1ov={?KsBc}mE
zi3Zwlopy#>xxtKmLkrI$^tSN=OP1~N#$jh=QtsUp;AKMi#N-u+jX5j(zJ6XI7$r%NASFW{)(;qPvj)x=qkT0Pw>`kEK~
zp4~g^U&5`sC!6j5YsJ##Roo=Qj@)JT^&^K3ql*%(*-j1JxGP5Np6+)o6a~3pL@`8f
zVH__U4?=c|ztUmKB77zfw>LIKyHAZp>eqIs^1??OvN56G)=XJj$9m7?g_e_6V*xTm
zU4hu_Grb}Mo(5&W!Ibskp9P|1Ff0cJBWrO&*1Wg3%R+tWm$Qawt;^AJ^)}L!5|ET^
z!BEomCzV>}(eXkl+=b=w3oL9-R?tx~+gl^4v^Rcut6Eo`wN_eF7qma|X7_hLgtzN7
zSzlX^oS;xC1NeZ(*9$w6quEss6CT{o0Q~BQY
zzWq9~qc?W{Bt`Z-XUBRab)_C`(W9>xiqD65?bT*LdGBc~lzQKU?Ln;H+OuVAu|sl=
zJ4)F--4UNY`SHd(P(0VU9oQx3Um{(Sh3{mC14M;
zkGYellj~`Xt^o3fBUJtsgRL&EK}wEee4hhDNcx4O04p4nuw$6M2lAfkl_vRS!~JH$XzLx*86QW>
zu0xNpB#l<(JvAKJwiJ|Z4nv_vwdiA49|5h$L;n$TAiDDrslG!T0R)8WM+GV=kVj!S
z$q=wSzLy#U6$Ols0wQk9Pp9mNL`Su*q0yMsrH#Cbb(!ANwh$tu7
zWIxuoWX~!Z3?O#rRyP&w#uM|)hMBk&Ahs95-fIXdJ7~a`t;V0yqVl74ON{m6=S~Pc
zjMV2d0+DPwtH=pgj4b5-$l)CdD(brO+}^r2r7Q_~bF!c$(|PKm8@ASWUMHbX?p<%f
zhXu6V8E*XY$sQgSnY(?w-JjLr3ZTtV-nI3FPr9njs_8rh4
zhw00+hnqebhNnXb!C!yKk(+cIi7O1eO*C{yh1NY7>F%^<`j{laR$rz5iXHVi>pTit
zhUcH15F_u~siJ+}8aKx}y%os3T-7>bI5|A+9a?V^s>ES<=o}9VbI-IMsCigd%(Oq~
z+h!gPFy^t3`W6mSQNy({?CPYbcZ_Nw@&&TFA;TRBC_#lKrvDdWp
zHW9Z+ymyLF06Is_oCFgY2^QB?FoxP)O8|LyJTMc6!Xcr6pr)LgKM6rulWM5aN2?+gj07O1x_Jv>L>yc>VouzhysR_@a8h7#;mriDe&*Rf>4M<$GE{>;*85_iRm@QDJx5)Gl6j3x1vRq!3FYEWaoz!MY~-`&|R{5q^)%k_+xptjQB
zSF4TBYrb;&l-Uf}##Ee6WZ9h6nRYO+_&BWK3z`f6n`k2tZUe`{NEse=TpMIrD-Wo!
zRS;C3GQ11(%NkUfMhM~3VfawRTVx5`+d?dzNb%c5ifsBf&2KOZrr7R%mC%O3tEg=GBlL#^b5R`mhM0~1UwCV0uwl8(rO
zLKvm6qzTmi|FLyW!I?x0yN;bnGO=xbv2EM7ZQHhuiLD7Hwr$%sPWIk)?*6O3?yg!@
zz24_V2x>XTdf&7RhOKVF&aD1^9$wgK1@`poi(9~ErT?1B)uiB_*0{feRt?f~NE|m^
z#Qs*Y2NjghHDj##hCjco`rt5pLIv=jP}C{2l1UgN#k<$Ey>QmZMmK^epu;dqxM9$p
zKs!76*N&5G0Eq9?t<&vNnb}<^C4lReL&h$*cYXXAeG)&y1|Ih`%S@;1qAtABcWnd_v-P@Vl@4lm1;YQbx1%8*Xs)2+wxv&
z3s+80B!W{|b!iZnI8%)n@0piTu8U71pHND2R$vtz0@_&ehrV-g_L{9s%Z7?1GFv1?pw4imU6k*Gu;hSOycbHtbrj7!{ay9V<0DxGIM`Nq1qB_PB98h*
zNnM`~t7Jdq46eHSnYS|avI=&f3v6~aehr0Uo>E5&Q-J+gMU4CT2_nmnqzwg3)R$ooc-G>
zDlG256*XXg^TxR&C)XfXY<78kA`{`;5q
zY%7Mwp2R@$?=>o9$5}KNS=7t3i*w^iCKC?%6qrH@oAhmz%fE92spiWiqQ7EYN$E_4
zgzCNL-wp2A@kl`P(^uI?P4g{WAKL~kPnBditeF7$7NNf}2RUGh;h|<`^zTNDGW6>}R>*nK58hav&rpcW!xp$7^}CB8No^s6Ad*bbm%JvhhwIG}gu4)|6gB
zSLctlf&ohT$6(FVMeed%
z@D(e3dd3EN*oarf0&+HUB7E(GSo5bE5r92Nr!o$KMq2Dn9YWARX?Ahv7y|;j`%U4a
zLMA)}9qkk+yRz`jp_+Vm_mQYr2wpiwpEjpY*DMfBxPl_f0(t&D6*^;YepV3x8B~F9
zARx~VqoOA)u7yb$$A}zkFhV+;=FkIFu8}bZo-TL{gFZYgwInl{!X-y_U`A&Es|VA(
zC83mLc(xTpujQhN}o{|$74yRc?QKa%gA|D>hshC)u{GoyfSwhJNh-PBHi3WKFc37_8n$Z;;
zEcY<7Q^U&fY^qVEHuNlcsV1iq4~3q3HN(l$j)dW&V%T)Rn4pM3Z~(K=gMfK18g_sP
z86p7vt)NSKC2=>okxEnF$(YYHo9p>_8Ef^sU_xhe664)x31n70mi8~zXjnl#o*O0?
zB`6*$RY)fROadz_N~$@kyN!*XmZp&btejexAq280YK4XAnT9gYVCp<&52F2#W981M0L}7IBrb~fzs9(SiH9wY
zAw#Y$3`lHL`5^HVY9gw}K}~QpeM{)+?!G&bq@?ZyFkJ=$P0NCDyP=DD?qF_^O{
zc>KjZiY({S)lIt$6)k6U<`*rhzvu<(M#-r&i(!#95$n}#FO*+o
zC4K=fjjO$1zk8s1w+mlXKx&$RYVdqnn)XZJCt0vsugpJz?OAikYYAovI6ecu9(sAI
z;3{Lcrr9ekS-M}!lrhrk?}IfpI5gePY3G4KQ@n_cw4p4lxw(Bj6SFE^*GZ|bLale
zx1AlSZf*2Ej8sbvhJS2zAUI7;%@TfM@mBh5CchB+$$mLnG5rz}jj`_I9(81JK0J83p|b&bawkxSMW%7x0aoXS
z6-Un07EY;}ZUCBx0{b!zsJe1af5tC#XO`AE5Ok6hM8f^HK
zH2b#RK7R}*kio}VUHl-(raIIxMQjnNus9^9P8Qs_7e@gfD0+&2i7>-~HPw&?zQrS+S&TTcwD_x;$$2TYgI+C3z_qr-PYlN@$*U<@<#R{1GmHCAN4|}
zP_`>wm)9oFa>Ns2x@lsJQM^0b{tj%3v|6^;Ec-M*sGp3B1t812#uEqAbzJVTP
z`%oZJ+}{eWY)xahXQX;0;*I%$rDN%}i#-6
zkyQa$Z>rI`QzirPK}=MYQ76;z-|$W}$f9?g#R-n3?3+p4Cz&w&=rSSo2%it!s6(m`
z^E#8UNKlwa|#?b^@1fyUXOY^f;?oU?O5&U<-)_3WmCgk3HRc?DcD5^CWSD_ZfCUZCPe#fZsEGpP(i(7EEgv>Oz=OPDdJ42u
z1;$a9dn}aI
zB3ES(o$(xw+EmFL>!EEl3WCB&ql2e|;4#oxhudAB07SZOWkss}o0?Vpwv2W~3e$*y
z$vSPbTzTNw@*JI$dsb!8HYn7yvYHAXF3dJ#NCMGR
zS1us3i52)R9T30>0dy5FC;mSAxSY@V
zRxsU6@KJ?nLQ#;Il(+$1Du78zGECjxk=Q}q?&Wd3>4a%lv(k0?8n>#%c#=>9;|&2T
ziTY4p-V$zQc8=hKFG4sYV)G|lS}VX#f>JNp-JS(r&SYJ$G+P;+&hwvL$vU2hmb{2zW%(Z^y@wj>pK=GDj+C2RN9Gmp
zT}*8ZHJBmG2_9C5xXuwMn$=Yp9z2NaP=jO1$7r}=aO%}8swfB_acGJvuYO_rSSdYi
zX?FWqf=G-l9i|t6G@GsLSYs6aj>g737rCs0ghMNaXhntd?!gFSaQ~$nso~DMV96rS
z>sPk28WXMNl@wW|0xG9ixrW?mC00*#iZX_GBMxo7>WHCOK#3
zoG79;T5z!>hT6BM3d|9h@_9ukW{PN3!_oAkb;UThbu}~9WyQ%T$RIp1Vd5MJ@ja=?
zP$nX!9OZrn5b{!s;z6SahCOv8sh)wMGIhU1#zC@C=_-~X(2=~735Q93&*k{Sh6`Cs
z!QWe3)!!nDlP0IMRU{e7jjdO=U^CC@ciA*mY|dRjvu+iKFP!P|qcm
z?%x&{kT>`Wc_0he{qeUSK;Y?AasJxmtAt_3(|idg1DG+?ml22s8pLVz{J~^ZcUA{*
zR-cJuC@e9qTm=9AY_Gu$QwP;~^_Sdjbp)ZuUDV1>?8Os9_?~cQUhVmA$)Zv7@|sE*
z(AD&oyr=?q9b-xea;UFY-?7F9Ook;3i4@u
z4UGVQXJhQaJ)GvddmkNC3Oq7Lo6ca9SbUh2l);Ru=58#)+HFf+&aZYmIDmo?WsttM
z3hW|le%{TyvpS{k!hIi>AjIWKa?D_Uqwi~Iw)%2jd}E*$F3$D`|B8y*5`q?ebT?^s
zni{(Q5OLstbI=Al^ua47CH->Gdp4a1A+q95-;TNGe*cxOzUcjVe=hj-e)h9P<%?C?
z{}JV7;p_A|+_~;4_*#tP{A9M%4UUFZt-R;ru?_!MJItLMCxv<)l*5-Bn-gm%zd{|N
zr?-{O?Y1YU%37UCr8Tu?_khzY(yeU$@P2os`0cn
zXz$F#Ba&;Ihi|N2E!2^Pd@IIrQbRAY646DsMesptpZe%GzpRwixD~MDG4njgNLJ$&
zl%9i`Df$le1JIKTd!fQpA2SO2s1vZQVrXF}mT;xU4W8{>x{Dg3j4s6NuN{kN{-%A7
zHG0w>4!$JVn-a~hC38Q3E_4lmK0s}x|Ky~3&IIFBXBY@6UHlw$P~{n?iG
zSPwzEWW>32$-#?E#kmwN3p4K3BvLwjtOuI`53`yXjoF
zXOqg!3I<3NF2Z9o|TZ=v_C-tE}eC8>P+hhHTAU9hIycEd5$A
z#XX`c%A51#zq$PEi>wb0vGwbGZ*P6Pb86Uhy6SZP+E|lm-Y;#mqS@}$iC&p3bPRC0
zmxa{(=KDX99p66@AEuuax&Av4&`&KXkiES#y_2V)uY=eB-k$y5H!m)^vEg^FPCsn!uJ&4J%hb*`psYlr)pC&Jv4oHdt%P%KiD8SY;%-C6ab
zSF{Oq+OnaD1E@~SiSRNK90Sg3dEJZZ9Koj44-_Td=zrNp1$4<8SsER=^*Bf
zLG;_(tYw+gRQSrC7t_X}LN7v()2M7H6I^cP`JAiil?!M_i>mQ6bFqR<0DvSEp
zuUoXaI%8V2ecIi74%dV}wHA}s?>HxDbWg&Zp(=foNortht}BZoCqKW`YMbX4K4k}fty7;!)Z@6VntZ12jvmGL1LhTt=M4B~he
z4Z1k9jT_gCd8yFE=$D6T{i^vmv);bvH@<7=pTy|U^8=^vlv0<}zT$QJ9X;%omDV|}
z6!ZSdh@N(PD1*LL*6yy3*JlB@#OWZ+YwOX@JhA|JdN6JI-QUHYjlMd&+#7RGM%jQG
zSCTI;F9THoGkIzG!rjf1`)#9og8-v>Xe3;F|1iJ0qivG=yZ2)8ilCl?@#~#!m(=f%
zDr%|E7
zI1Brkmu@1P{;Hpw0Y{3$6(vM4{GlQg@l!;{6s=>Lqjg;VDXIqy?_~I2?D*17@jkvD
zRxN)!3y+$=oLspm_$GlwOTrYKbbK0M@t34Q<0@Aek^<#l<6)6$!sEX{rb9^qi8C$E
z+I7{e3QO)P(pVE%?vlQI(v0bq8vF8byP7U->V=CGA_iawDoFFc+aW9zmjWE=a0c73(~-a4aePiM3TQ@|5&Y
zUE?<>k56S5DyU9Lj%rZ8P9!IiGm7MIgwTP^BizM-mUxb#?2by;`}>;=_cS!#OwXwkT31KH
z5z^G%0hO}f$X7t!$v=&-FbE^C+wCJogj6|)v0%pmn|f|Md?ZNpuLvFP>3_8`R=8G@
z!aqviTl|f^ZC*M=qPq&TUk~xniuOD1#`_Q>XVFi?LNb0`Gyr90`zp=)-FV*4SKR2$
zOLuRWJ;h~-KYWI}_LGF$17`K(i-<-NFcHzn$3
zv0LGpP3~8DcrRr_YP^l2XF`@IRQX9KIABqYf=9Lwgi})|KpO^t(Cmr})0Q2PWQH*c
z11v3DA=K0pMC)i*ictFO?=h+HXaT-1Y*TB#;c1E6s4jfM3*C}-Xh>$XpuINjq8rd*
zAaoIFTgl*5(c1cQMMT*0BhXd{ZG?)=h>HwFCd9)6_KBKP{~&}P?K4OQ+47@+j>FV2
z-48+kwoG8GC03^;|)sD=Z(8Rxow4h@I1bSTKt4IL?#*&M{Mwm;QUA7VJ*ub+p
z=Ms+dj9&QiBfG?|4TH~2gxByZ<3V^iQ%PX&RKJ#IkT0z$VzC&;RWOJtSpv%LF*L@B
zg@umHDGZ4pEx@>vP^^ZqJp)btz~7+qIM6gbySsaWSTY@rT!iY*D4|OJ2yuBo-V((6
zcEC`QylcOX)caXY3EdF$3>M%>K@}^qi8MdTv5Mv-j4pB^!dU_O&1Apk5t{8X8OIPT
zAd1(o@-)ksGZP_64^&5E#c1KQc74IT2w|I0T@+;E<5*He#bSSs~5_H4im$UXnwX
zNwho-1eO<8`&q?fQ1j&}oOiPIbbdRf)#A48{is}SMZBbgZ(wC3{ZeYO5=Iu^Q0XFl
zl~oeY7Yt8%zw%yh{o$erf`#WFeU!1clh!YOlPr+H!$JRN*7a=$;+#TpVL<{}I5Acj
z@WOPLc^_dC4+{2sHV!DSf8=4R@D7#nMZosWE*Z%
z&M&M{SC!HrR!2*f(vO#Ls{LgT0bZ5K38O{6aprkGl-Esb{1@vp&PeN3awH%9I4KR;>e
zhCnJaXhZ3MRP;GS4bUf?RLL-IIBUd+w5n5P{WKQR97RdhFy`3L
zuc`qVwx#aGDW96g-f7>vtwQ%RxP{dO*P{V5S#JvRt&y`GpUE@CKqS(h&RB~oq_Pd7
zpk|Q;suG=icZ~TY_PHe#-%^y_zdFWo&wwkfz^q8ybm+j}OFb&_h
zLw0j)d|Nst`obyLhnQiqXKeHb;_JsiGg4xjmq0T*+OA5b$X3~02D!cZQ9YF3kjF4L{{bEr|I%D+|C7bkRJ{%8$)bWF$gzC!g
zdVaNhcOev{1TCvUB0wnd4F%@ME0=bMC$un%0-KOU7lum}$|d;&Yc?{vEOCZ}QE!Z4
z5@k~3%T+x5fF)=>*jC@%M1J
zzKx6ZFdEV7J4y%?{ZJF7h#4!PNcD8Fw-OWNrhn#2BYd%lu~1D#ngT5iI)5uuazIdP
zKmXNa%6E;eXUunvajXMB99KJkY!*rQ{%}P+;**1HYE@4u{GX&miki$lsiF4NDpU?qb%v{P
zO}^)`EMs0day5+(k9~(j`gcXn)dmRDj5!U5ujT>SrRB(UbzxyJVWKhZ;I>E{#(;f_
zNXpg##pIQmMWYU6uH!?-+D3_UZK&nuXu0|93iN$w%)IltY$h2MC7$x&+wStP#iUG&
zS!H5a>F}+jFJ?P5*Y-k|aUbT>M(H69W?b5}O0@m4a(CHxZ{|xU{OSZ1lOtKfdl3sB
znWA6PBPeMj7|8xB@<%Df*wos(~!=SfsoIbx}9z
z5CV&TX3hG%RDxSI+Ug|SyPD}z4$_gLs$z`l=yam1l;8knC2#^($bYSN&CvVqQEtYO
zwp6ddOoZ(hnc)bOVYau=q&;f`A39aq;~v!Qs!3vFf*xQ^!owY+gE?6x
zap~`6X;%LbG~sGPdJ@5~ZNfthg(mW>mYacaAqDUxqO>t@rb-0(G%tiN3I-<#v+kie
zl!3!kF@+n(68Ab^OjxWj)^gQjmSAP6;vvoUwN_aqcm73r9;d9O{hWf`cl6HVRhzI#
zKfLcK%yC?aQ(XIa8)08@0=7^+DC#iixE?KNZ1=7q9Vch%8BoQzcOFd`NR!~Eh)ec?
zAA{7EjI{6C=^0%E{NtF+KhK(I;<@K_ihtkaLOzif~a?&7ay&~Y5xd2W0TTTPHw1(
z*()Q}0yC(k3;e5MLr{qe5J_KH!NY&YJ^d?TKIhgeC1##BW$IbXC;YCV)q$8y2vZD@
zew$8!2NT1*4^qD(Y=9w5*HC7WY{7n572#vMO#;C*yY3P5m4Xq4b2hvIyWt^oxe5{(hXE7=;3x
z0O#kLz?zB#n+tH=fe$w`_fdYOZ)Fu&ixSu8myFRLFfA6zqEZz(9$62jGHdR8~d81m?at4
z)>cIj9ahOfo4}4*wZ-hyswGySv&%Q}
z;eu90Glb_QlyNL0iv)=y8f79V>|{Y{)}tNm(zK5bP6-FOZKp2aFIZP)TXJ8Wq-z|*
zFWE+&)2&U8vGkW0-JZia3Ct*wMGX3YJxzmRBiZ;E^#K%C#gqAm1#lyODWa^iJC}f#
zgXBaDgH$q5B(KLIT@Gn0SEx4KZO#v0byk_#<#Zh2>E}w13>s
zG;M!IHjymUvMV-@ZQRGz6_xF6tf&9@Ar5M7fs1RIXO2SGRl
z!1p#Ri-m;bFANR$fyAhMXGQ0KxUY|hn2Hxgv;}!Cavtr8TSMi(U2r&$Mg1206GQFt
zjyA84t4+2Jw%qA>W7V>TOD>vE^)!<9iueu?_yQkKG-xqq9itSq0$`9XvLF2sgh^7h
z!$y^Z2_dNBH<+3dy=3}P=~nw?c}-00SG3+pL_ODX2^LIK
zQvR0)-mL7oxAk#zhyKn)>H)fi_z5N3L@0!Yf6C)=$nGf7%7^Nh_p-$hnU0}wx?z$Uws
z&1%3Q%abc8^}Kxo4vm=jwp`&4a?vEsZ=y#zbv1FIOSgH|fVL`m?~TweTT?Wg#OJ2U
z)oSzZJxf`@3Np~vyD0K0%W$kH-~atT{cKp{B)d6cp(y*hVcP<1iHLs!3FORBp{J`8RY>6avA-fk@$
zO2lGDHzKOi&EOLNz*fXcGl}K3Kk4i7Tf5nrO0c0>A@wKrvfjx5v0iyyM8w7BPgn9YEnC7{#e=dCf}vKn>Was5`G%Ax
zfpUnfe2F#vK#3AP{o!!5SD(x7OzyJEoK1SOXQ^Y~y{)+w{pjLapFDPz6)Ks8UON9W
ztz#`-Okr*zMlhzb2PsC;>S6_%!nF)QF6Mp)z_&Zv!HFJeZrK(+wLJWt2Q3>Yb_6;q
z!6BQV-^G|npvt7oB5XK@5cPlxf|A9SO@S3o-KC!(fH)yDpgVO^h)m)(#tn%Ark3Fe
z6Q4mu`MW094IQ-T<);4c`PtManTSd@C_3$pyS^>Mf;GhFRn|Cjd9^Qqt2Bp4?0`UF2Z1WQ!QShZ&gqwN~?mYFU58KAS9vl3B
znt-H?7e8@W+zOA;sRAp?k4Pgx>BQAGV}Me^%DGvwbp;wGK@p=e((8nXfFlYVK^nSsRyui}wLc(KE(Ui)e?Gpp4B@mddA1L^fe~OGwNF7U(9uOZfKLBy@TxL&`WVQO|9E03nZwVsa
z?a^e-IOFO*v>d8_A8m(!pg-KEo=UxD$d2ektI`A%w1Q5dSpe8WijxNd;#XJPXE0OU
ztBG1)y>6tJovvryYN|n#uNPw7KP~~mrh6NM`e4^vlX43BPsg6OG-B$
z?TC6O!A6{dLUO^r4NIGS97l8BhHGP)a?c_wa$@$=qj1QoH9O?ga7$UR{TV2yW~B-4
zUV}{4$2P2%5AFxLl~*w4j}sV(;Gbb9;%1kbz18KdW@pf7Nb2vFefRf#^w0)0>u`qR
zk~V@;v9!dvyCdBGx~IAqx(LRdKeK#vPM1qXNCK4f#-#y{9P7O`Pc1=&;Y2
zYHG>Rky}mN4Yb%LDi*qK+4uOAh`}guvkqIG*5!XA9wEtnL^_vpHXK{`g
zJwO)=Ogw4@Sz#w$Wi22XQUXifCWX8B)Rp#;>JC%diJ=?M`m0Tr=0_J@r>HM#Ftu)#
zaP3-QYB(~Fieg&`l5{g4-@~og__2L(GXa*h2QdIvz)KFs@qhq9gDPAD64$5CM{piL&4G<7vkemwL`vojd~
z9w{RKBsXw=!{h4QC$+L#S7T~a3*0WYgJ
zAd0|A{Tp=i2l=h8j$md@!|p1u3^K$bV;~jK>wvx4vWc1uAoE#qRMP-XiG<37S586I
zFO2d2YC3YdyHi>SeZ3G$P_+#QCsNtQa)bgQE}zGP_ke@4KxwE)p+JLsSmDr{=>a7GJMs@UBnq*_HMKweDL#7yy3i2`m^U%KAGB{}}f33WD9Y3h_TMf7W*w
zd5~=0jVuy#8*i2I*?5Rr9qEI)XWvWkuKxM!eHCG`pbg)M2`_4q>g{<`JQQ%VGd7&t
z*TH8}Kt9Dj#1=VX^-&{4s{t$C7lw+n
z^8@p4z+&%Ci)hiHw@IVpR?eGqzB|b$Lv{RJX>>#8w{IIIC51BEtR346JKsz?a*r5$AO(@uJ(7m_r+ewSZA*DZ5l~sc^y{CZpotu-znCwQD^RQ
zLN1_Eo}4%ygd2600ATZ*%|RE&JJD^l^l}K(LfPZrHQ5px^P!Dd9U`$(+sZM2U_fp17X}4&6@Lh
ze|rjc)4sI&g+9A_Lca0;ud-@NTv)v+5+EQuU*P{6GXnmL8GTk`_r+aL8sRtm5bt_#
zfMP3F(i$pb^y6n+16gy>>+W7R
z%~@+jvsf@~QcIjL$oxEQB({6A;CZ9NcCWpk08;Ze7I&xb)=vgcQmJ}hr}Ok0cFe(_
zf6rvzp6h7U?8adaZC;m0%Rc(o*Y;Z%hrc@L*;ajCV6T_n@4jGIzpY-LZC+?U8&2RO
z@gd{>{krnqa=hN5TXlS1w+w8hP6}%cP)sv;TxE@&+$_kgbs!{Hsc^xoq4-7
zIx(fM$3bg%AY#LBep~iwe(Pu*LkDq~SQ`ysx{izl6H*3;LzgaK+@(2U>rXCjf6#8F
z+UazEEg^et)Kr_9{N%Wf!uX4mC(<8{ij)nhBph&*5iKzExRSp*G+6b#^JK5RcKhEe
z;hwm+&%emkjUB99q+UFDapOXLnemSG`cg}5vmbdMhp%hjf`Iv%M)C3aHonK5)jxjO
z$4FrWw^9?MZmW`G%6aDX?{RE=ETB@%>Q}TH)Oc@4ZHE4fs@-o=@2@?D
z&vsv#Geqh*&e?tpv$%CicX@Am_20e1PWR++<>+~;k1`m0zZdFm59rtA)xMhQ4oj0e
zV3H$`L)eZZo3~yE+8@q{dXIvqVl{oTy(P{3^)K|eW|v;yo>k}Ig)a~O18V1J_{;lN
zitqfG4g7r`GK6Pa&Z$$gFF!{A_H8|Q
zG>ykW+J?O)3s&)JTJg;X-zB{d_E!dMWigDOL|K~Oxmn}yYBc`@J{i7^N3&Db3#u!4
zbTXy)y7aB+v8chCBLa3kZ>WykA_ZS+Ad6bQ?i>_Ynj2q6xU5fVZOmuTduj3$J-%c}
z_VKtH&U&05(}bap!d_h6hxuCxWK(;N^9o5l8RxF}`v}2Rr@+z+6y{MogDNyCso2b}
z?n(&`VO;5mB*^77C8JWLea`$kYGm|}pjG=#tp}c(TtiO>$0{lG9$mx17H2S;HmfhEAG<
zAUjVrbS%b9iKIGcHVH>2itn8x!e_!76zv_G2w~8WGNf9CF)qVVP&1*HL_Gv2g9UC#
z^94_*X$7XSpB3@bHs|OvzOzUU=mv2d#KJ+h_n@i%bHhxql9bRDT4n!k&kLlQ)x|DM
zY8_D?w}xO~Bcdupb36cZ0QS-EQkW276w#I@{VL2wv%;~652MvD`6=d9A(OLCCD=ye
zfWnJWvrm#rdHmOEv-1H_<%|4pN@92%BzUg
zL1D0EfO0=VTtgw0;Ecv0)~>Q78M=v7+!PP>llAn?dM2B{ZqyjXkJ75tfoWp>$k}{E
z(=)3Ri>ebl^cfr^b5>`P0ev1JEnS(VPIJfPF@>X!6a-AJ1U|j^FrY%$sEz64GA4
z(8#f5TQv^<*GqcdlXB8KPX^zVXH!*x3>cUU;uaW?>;Doc@LktO5^h;m;^3drUH-X4
zvd@(Ov{=YbI>sL0QnRnv2FEBJAmQ&;+}X`M>QqH>*n|=An>PJV*0I_!K_B9eQJ?0~
zS*VgmUHp9t-RhJ(o)87u5V5t7*rr4b$%ITcF<7dQzEH(+hEzp<_=Qu9#vk|O?WeiFk`h{JRF-Q|q|v$Q`q%QT5O>p9w-8cuSudI@fD2ow$r
ziCD@o%CI8B0R|M7r>vnViNTtfc73Fe>?9-yfqWL~iz=t&e%qN-z6_Kn?Yneu@g4d&
zQK1$iMN^Wrx+$Sgk&xCR(EWE1o-mKNVeW45=?K-tv^Xj7AvmRsBnoI(GD}ioY9f__
zyu@Ie0=cG7o}v8SI=o~<#OWX6I9!j5jrD+qKk&~jmX%)Erlyf1U>xyl{5}DGG>!?3VO_l19c7pq9nhg;A=5JN8svSH9yu}ipHj|!gQHx@92tTnR9jdMlrv_
zOvy@ed|#YdbK=nEt($gxdDAXcApa^ObMp_HlP4k(bs9?(%d`n;t4A^$K}QmiVx&QX
za&wg(6r{k-36py`CyJ4KbXtxE(FnCrj|QReFYy+Ru*akvfOyaW_QoWQiRk5nNk0MC++sJ+{nu2lCV%f$
zne?>LE{AjN$`6o2Z)7!y4@N{?mfTHCsA?ths0rD_(Z7SqiOg#
zd$peYWaxdb+E0x^!gwYHSsIrX~s7eup&lc`?w^sY2<
znH2-RZR#Tz+F=>g(lnv!tBWcF+OHmvwu(dPa5&7<<4n?bo=3STk>|fTG7LlKKoctO
z@1WAm)Xb&1?3-@}>E4PQ7%^3Q^;Rj^W|Qxk?Mqo_DqE=!;GNH;s1Ks(y-@D#H&7Wb
zk`#+s_pOwPDV6PCgOGKguRL^jaj<2cl?L{(D1T?idC0->}ulZAp^c|x-=1l+?v
z+%F?H<5brAFqukRVHcD1CEDXPf5wZWgs@swnv>aOqo00_rW+1KFcZwKf|ZBQhyVQQ
zm72Lppm!3j=$V*dT*39{7`(V(g{GzMqV}z5?lY9ZXq8Yh64>-#ED>fg1c?)fhw2|K
z02G?#?$gU-8C-+wiKAFb|vKOGik{_BF{w7h-P67Pn^k_9EuO;e$I0~v(
z?lZf1K3}=J{^2cCOJ`3W3brOM!l!U*YJyMwH$TdSL}-gEO4f%rib4J#zX7M2j!p>x
z^{;%kK@t#=Rr_386OHb+Etzl@8T70SV@)f3O^5ZlEY8V5fYD$;Oup}u>c5y-##ub%
zgLL9>u}mUdrbzRHh#1{=}yROx7_SA5PKpZH2SD*X5Kln%r`zAb&Vq$8c0iy+DhRfuSr-yur-i*>nbb%zv
zboois7)|@hCJLKy5ahyTE_r9dq^)X6m`-O
z2or3K@>D9-q1n=MF_}7A5|upoO;5J{*^6&g{lCmxN|J%zjj*@;YD|BX!#D@L6vA7Z
zx~>H}mo)eOhyEV%9Co=IWB~)&DU7jozyFq}ASsN7{Qnko|k>OMVS;GLDDu~-)LxGUwx`(J^bn(E9
zB^DvsG`*Y2BlLKFa8_hEkizDs-++l>58nDn#Ai;?HI6`L^aQmY-@TKnlyH$heTrbG
zFo7vG=;UXNaGce}^OAJ=DdCfXy(K{Ned)wDO;1}PuC)A3;>P^SXwZ>OM1jAp{``}c
zFDTZIXo%-z`z_q9xx~am@G})&!~aj3V$hX9yI|0A^hL>>p;L@!)aPeVRAA~u^z&B5
zZYfXt_y$!8#~^~^qxx&#-lYj+cOt3x;t
z;%wy0<`jNDEAI0gfk4x~rr7dYGzGiqV#h<%qxS35+3}q#8FgJ{?&9s{02nD(cciL3
z-lM|&)m*L?%GoOBbO3}S7CFMYk9JQM7DdAh5r|0^YE4}v1JO@iZp51|STa7XKOJ6y%VkU`W=b=%ti52a|+J9X@
zB!d2$HtbOL^+5G8|Fr?JqOQAwYv!h>_Wy||g6b2AXEc4h04i)l(@bk|lP>OqOne(I
z8dYVQ^jt80A-$Tuh7nr*IOoo#`86({X
zXdr+cfI*aqP;xL~!6!IA=K2ldnAgu_){V*&(q>4g(31K(gkeA$3IOjL1in^9FW$fk
z=Gq7%CNPm|1Y)?spMdU5-kCWk6UZEd;MgzO#o>J~O`w=Wv~`1+Vj|dhf&;FGLb$&Y
z<*5$jsrxyxN%)9+K>v@fa}3VhkNfp@+pT%m?$)-qwr$(CZQHhOZnd?0*S2k*{-5W(
zJZB~^Gs#Sn-(-@{^}Rle%33R{QZ}T9C&;m3eZ)=evwr$o1c%aqVfkHvXL^fEh~m`P
znDp8o-oWi)LG6yE)t8rn``_5iN_upgfiJ9?%3gDS8TQ9`Wem2-Oy2N+ScS|m
z!BBVb$$9N(9#?eVqrt^?(gHi0$_;xY(c0KVdP=AlH)4ja(G7wBE>o}tY2|1!B{hk__Wt3#jp-{!#o3{$bR1Fk<2d8?*j+~ct8YDvm3*KhYY~zAnZ_L1SQ6{
zQMR7tr=zKgg0;p9r&ML&5S`0Sq_p=a|DeWFqq5}&wN8YPMW~wr_4^*ci24^z5M=_r
zT&J`{dKRS|cpEX_8!N_Yf`UXzuzCfo5Ka=d=7A*b$nU=%H^q~o~PASpwe{fx6+a?v?F+|0Z^gH}cnR=98SbgW$QP-?gH@z;lVmqtVS2FZ{
zXMJ(8Z`pj=bl&%vF2=k(wyJ0@E+24^7V2Cn2>x0vPsM1DZ*45P9BPF=_Vbyl4uWHq
z-0`z!(3GfqQi!xhY~^~GoN%=!Vk5If3H}5`
z<=mtE{ZBRkArQE2M9}l!
zmC>MDw4=^Z<;%6*ePVKv5JUiweA0urICn__8P#NYUp$Sy#tr4EAXp#>05QmUPZ?Wneh<
zyyb$Us!^Y=;8O_gWEh{yh2ocnyB?;@Nv*!FhQGX4KcNEb@$T
z_5fdm(v?=mqX@@1iE=xNs2=v=+wyq)s|-#Dx=zWmr>H(of6c5m>91=o_-BIG30dwY
z-w|MjVSo#*x5tIn5>xhX`fnH3J^$`TOdwqnqci(cf&Ha&;W~YGalX?@9)Hd?TbOmH
zgg7?|eACm@bW>Sq6)ik|XBH8qHLlv|@nG`%PB7628%F=j(${ltqGxQ-d#AR)yR|fS
zsTRg1is(9fIQtS7W)22%Im-mhL|yc>Wzqpg=)#tsC8FA0e?pzgXOx{va~!I`o!|$c
zW29?JXLUtVmhw>yYoXq<5)(KsG=y?kq~Mme5lq1SKe6yZy>p3qnSJ5rY9D;Yo+5ur
zPA?!tDQi|vogPCo{kO!zM7qr
zFoG53=LlmI26n%f@(24*iPwC=+@!`@F6P_f>5SC?kDKs6!Gk=Ux9@Bihx_u+c_+qW
zu*oGvU2JnRt8`J9UIhJ&3$b99S_I(`bH9}M-!5{((|fEMs^#H|goGmjUK%il-=`$g
zi=_gi9)Acc_{qovS=00sP`yj0BYegUMz!rn8y5ngwQW@``9~KQ0~A!q;mb%33i(4H
zzo$*3<*ocI*(cP9H-t|wD4^AJ?I=X*O$g~M>IsP`qey5n;VDU-)cMTRp&|f+&D0_U
z`I{Q@eh$rmg-3>%8c>o{3f}S8d~50F8wTf9vw)@us9oqkDEgG~+ahWf$$lT~x?&>v
zYM?+E(%_$lRE^>CAwgU-T(b}`A{GyMV|x@VKgA>ET2p~^dv^HY-6rc@mLg`K53qQC
zd*^=nQI>Fj*C?y0_Gpe{ut*pb!~Ph?{R~7RU$F9vTVlwOHu6Zu}0*#RBTh>
z1VlXS|M7_fA~p@SJAcxLQLu5d0O!btaC>T;UXh^M+ANk#tT3$MDC7j&U=OCXrk9yF
z0`=R@3U^+*kxh0FIHxBL9j~HC5=GvPNV5;LSb1|7A6s30nJ!+MPxI{%~d
z0qxeTQG$@nlA@VOWdxZhqi08rK%6ir|3{FBR)DIbmC~igsHd%cxlyz#
zDAgf*6U0cTqkq_M$*+e5^(&m+c=aoceKQ+e=yjA~%SL|LR-lPIsf&7SwNxA%1c{|VAGD69bT;
z@zw{txFj|jz2he<2)WUddrMGf@mwcBgrRo?*@
zB6zclB=;uXrGL1CiH>#e-J7Mq__(+8g(GNzwyD0rx`-MGu}{JP8S^339}a5>6BRM2
z-2+=QoOqH2YkhHp^i=WFvRkH`s|x5Kv^sImkNNj6$Yqv1UnFG%nj}Ar{D@rK%!pi5
zV1oalg+7n=IJr9N?3HS9I+cTQ|iD7P&e&0RehxB}uy)%?2
z06F8DAnzb5(_qZuPrt-6Zt36maX#vQ#YWgPC$2H|0Jm1dq(T}AcilG+OW1jpO8p#d
zViJCKBYb;U#@y&C5gh}lHGNF!sTG2D_B6&3o3$N_@RM7)2xLz2U)c}nk$FKWtq8u6
zWH)8LnY<2;nWgWb6caYJsR7YXRLLMIty*+f+US8bwp0vdT|^VQQ|e;A-P6~UoP47l
z66<0H=ag7o#DyqOaoS|RfTOK5Bj-j^?Mz}AAn(f95rp_2r7*SP0EUZq2Jv5_L1fT9
zNZI7%@2bw9gbQ{GRP=N5Au)_i8H_l4#>8zY9O8DG)k3T6u
zpY#?yG1v73{N>jFMJab1DE*7`a~3#u>H$+Vw`**qbwCZj-(FmP&R)-1^0Pe)U?~u<
zpY!`)S@R}h`2s^cKA97`n^6j%SMXtjNFu}UgjDAA{!&7`{b0{X$I4k+-o09cM7?F3
z{Z6jFz4o5(;DqS3_0l_ZHuHYc7GcSpRUCbIA$_Z(?BQnxL{|+qQP!eCc#u*Hr%Ee}
zuP$JmLLUHyei|#5MS#4>uf7ZRARl$WaPTKL1}FqV2;q@N_N{k4D?ppo3jRp~QkfhV
zx?Xa@e|j`Jw}xOpj`Es&SI4}*i1Io@(N_i|oCj1s-;96W1oBaHKZ_sEx`e5A2XT)Gpho3@U}bvY&&2Z
zs)WSr0#Zlxnls>uvC<;3*xmt4&BT^GMEQX-@05RAze-}Nj}dX98y1t
z7*^~DYLWRyk%K1d$addqp5=iEN@B5Kti)u1Lkr$8f6@Bhyo_Jp*
zylHHn+?kLnn5(YC$PJ2+1-n_=3*2-}?YESnQmqPJTbHu~
zuO?nrOmosDglUI9Jnjxht-=WpQl
zevUybA1tgsi3$PscN1U@Lu8u66mDTXZ@C0s-VZv-O68mKymTh5#dk24oG=f@PH_I@
z)C?}r`i8chUmo2mlY0)6Ts^t19(2HjyIO4I27}Wf*OUEu@=TdaLAnbrb3~q1CKE8(i}o}wVorPgwas&_S=vtZ$kVloZ@FZB2Wvv>c+99
z;mX6^2ofaZk-Tf#sB3w_7pZg)an!NaVMqOySy)K+|ltZ48H>L=}}P9v?QrdR+47i}+f>))k$)-e
z3ZP($XUE71xs8~yK&#XJy8Q{iCcMg-0;ZLQ)DsSKZOEjRCe2&AV#S$3{gZPWfP1U@
zvpymCD>Wy<%Nn>vGT{qJ5q|BO^&#o|cvp&Jrr#i((f(el&eycNIIQW{5T!?EdncQC
zJ8Amy)14^F9^!x*8#wcYgk~m9N50g(_-FqmrN+#=U21eOm-$s%cp8zw)s>|>Q+v6L)m44w7u>2
zzB~w3B+uFrxjbB2=*Re8bg^gZE3JKQ%+EBV45$0X{Xs9Wv)UjcKo4Vghd#ciduga|
zZ$kp;!37~Ey3_OCMFCrGGDX7>(Rk&@5aAnCn>L5n!$T*|#g-S=r07!NjoA$gS5sHp
zt1*Z5gFvKt{qcEhUevx?TC9QsaMwf4>Dx&(dfcI17b^e<36;n
zzS($Msok{T?^OuhN89o>*7!>#43(+!#lae&MW(Y0B=41w-DE1$Tjh1|43WXeKXLb&B!&$QL<;w8c*DLXU+VepYZLbA5@LlNQZhm
zOPDXW5nIj`m*d6Sjhzt|6dRmHoX%0i?FP#VJ+GCNdt5Sp(4V}Yjb7?O$!a93D$Sqi
zyRnsEis2CFsdsW%wgt&CUPEL{v>F*U#xN*nIf6=m9`LNjdi3
zIZuPUaYihxqT5AME;^JI7yWu2w{JH_v^lQgwn6SfK&u+k&yA&QF{u)$^R|Km^Ly$I
z)?wk77HpTo!xXGttt3Bu-(d8QOGfD1dD;OW^@kGg-u?XU2hiyjMytbv>-s@8DBtFe
zudEq8ur!imNfZu=^bhF^6fL)XLbLpx;)i0Qw;K4eR&3?3zEWKkSS+eA40!Sm?GUG$
zO$;u_NgFNPdbdoA)4D9iTe7adZqFNEKmT6@ly*kep7^&LJs$A?A)pxlhk(-lPqdKU
zv-#^07fcrnDh_MuWm{TSPMMetRLTT=K6{jfX4d*btUzGaTMUt4*>vPPnI7U%%Q5;Q
zq);y*)@-nXyU=IT6Gu^2em~<~($)RAe9A3J>?@EmEp$qlZeTObZ5&#;>V1#({n~gpV8DdiUTPc?emy+zpguxBI*QzJW|c
zY@r9&*gxibIBveaydA9F@6IbTz|~$`1
zyeYwlJPhqz0Cyf-H7{{>hBYsFbY1Lv7R}u%JnS-Ki5_mVtRI}@_>1)4r;3Wu?+oO9k`Lzj
z-R=&neq^XN$?*OqIMYmR4H}R1V#Fia8!dW86iay#XLyd2*~}^)_-)5j?!(ib{>gw3
zT=K8AA0V>hsFQJ4r=!cQZC3KtxH4kI_JR#Ovb!@B%^Sqi&JOLN>{wa|S-QO=t{lD=
zbos@EC#Hd5;MyB`=9C0X6|7zBtj2*~Y1L+%U)Pns1)@qVo({t~U%uU(
zqAO3ooIeiF-%!)Fu+X<(wDwDyfjz9L`fF+sPy5^2Y-
z<_W8510v{p19?>waY~qNH?!et?sjX}YC_-md3M$s`-TaBWp_M}OKTXJ297Q@{;K2M
z!O5VhMEC}u@FN~A9I%I`^{YCNzn>Bz=gRfTyz9Cf0sj!}6^8-L$_99pTN
zjU)6>pK9J2q^WCGc6f2hj@z2p9t|9zfQP$3olKiE*bY{Fe=f87dS*{GTF)tOVfUmR
zJeEw<{+mo?QKmxEO0oq7QZZE6{369IN_=Yc@M~V57V%%^{mYifj4^E$@_FBq{@0zw
zc^tEH`5i>sDkb9?7k29)7d$VsvpiJY3NBJ9ija(CS7>lV!ZNOi^mYnhu`76gO(0he
z7zt!)NKgoqAYv+pTuScIo*((H8^?~G;KOI~$P&mo;P(U;YMxfZl~)Cuf=|tJ4yf+(
zAiSrX57+_^42CocVTBpO=5+m~_}LJ?wGUNQp9EA9AucDvF9!&0jSgIs0(UGsXCW;u
zEf$3@7kah2)|i5KZ@RpXPt~RvzVY5S^OMFZ6Ag@-I2>hLO+LMX7OqX#7~(1oG@}wu
zN(rcjWA?`zdQyn7&HS{t1oIk{J8D)+=Q6~j8i2<8>c6fPV9pz@1xoTdk`0L4o+qjV
zqYl^u0jMJgJu*LwHfd1~Q)i!=Bbwzp*DPBa}^y
z!V1U}jy-%IyLZrR>BFTHK?Xr8%8p9L*X80^Z5`uthb9SBswGpc0LJQ}M$ZbA{-iV#
zyuz?fFneK4hdIrC?*DaxLzK;}52v`qk31m>T+`OEmTbv^!=q4u|B(M<eMc;BazwnHms3u=y#HT95
z(9m}1y9w)<2xu;PW0e}Llq&L1H4B?&6LLnV>pUc+2I2lGoQ&$PXdIic}yMp_;Z
z%ay}E%555w8o;Bf#e@!xY*22dAsl|ZE>=k0?bzb*|Lo}40%?u6%sY|b!5EO}UP6TR
z%io{pf7AWhbjKU){?y-Qe|gkx8JyQBsJ}=bb9wY0<4N)zu6O+j@XyPsin;m7v#6;YbL%$(mA^`WARiQ}
z+=c3$0W*wvylHQhlIG%V1X1&T9bGK4C@;L<{V+z1=6;G9g!GRH7b;XuAV`L=l54}2
z;)Pw9SSk#V;TOPnPEh%f#S#fcs#sA{67?VQRQ9$$=4W>O!0f#R?fF!Fw?4c3Ns|6V
znI8w|CI_+cCrcFbF?t>S!s0UW6-=>|C156tfEF(3AjMDrNKKu-g(n6W4%-Q4xUt_O
z0ApjmckG+4L)WjpPYX=A5<*}US&z?QUREG~Bb3=B0M{HR0l<|W(`
zSpZ7$tnJ&lnTO>j^Sw$W6R}*@i}{lArV|U^Oqz)Iy&-}z-YM{=#?Dpp*>F3=Gc#n$
z3>*g#gD@N;H(L3_T>O!m02D1S@t-kY=iWd`cN_
zskvd|-tDv?>m>V`sT6y}u>UBcdqpstAAKX=6wxhv2^tLDfw_t-iM$p|W$Awu5lljy
z9*BIc3w;yS#eao#)S+og3MJ-Q}0k&h$X+;=Za%OG=UNpSWoR(_H-P
z<`GVVdo?CuS5m&~tX>2l)iYS1Mbl!U$#~EC8+6=xeTBVh
zFe`O#A!6y-B#v@1bbfa0@$mZrsQSAJ4Q0lp!O}`?E
zTw_Ym>>usSJz
zK;qb&=-C^LPVDbAncE;ApAP7sYTH$^fJ&2jo_vL%XqWEeZpc}f-%o-C!>vcn&R7{Zp;NU~5r^
z&|aDCE|@Xj1#61{;$xccC&g9>Rv3(BH{CLi@SHV&0hlVJ&X$9F9(!v)t}MS0l!dWP
zb-*tcfHTSt#bQATBY;71;<(^h0z5_PvN%A9&+V$OIQ@J_^2mwhmv4RZ7qOZDRNZY>Xep|G?1+q7sLlYT}(;(Q$t@;XAckZ`jQ~Jm|JyLag
zek}z!l4K&6b&8dR@LfeXwWJ*hyW`xea88$49pduUq3}`A
zRAg1vAbuSvd8hL450e}Zm2yUTv5%s&32TCP%I{?B;=1#_Dk7Qd>=$P0V`pE_%x3Wd
zll&!NvX(iwK8c5WBc)MrW|dKJWSf+>w|@_n3$3e%YYCtlFqq~z#1?Z9%kc=5nxn;l
zSqqqiMBCu=t)DgNls<4?9L<^=fJ%!xp-PFuBnru>71f21YaC;k8_!^%!cr^o{aVxFU#w_``}>
z+NjSOHaGNOoP*{n`_Rs`ocflvReEs!THdCYBl~ZFJBH4SVc})|-5Y5!-A9USPyPVR
zX_~MpgCfZIyBNS-FK8HC<54}iKdG9SYwcj!cn3)V32_3
zG7W|yhWOkFNNN&o=?O`wP5z=`Dex7eD_t;Z@H=H>1njed)O%K%
znkoWxzOgO8Z~vKxs{|3UV^mcsmqG|8$)h&=>bO)8^+}BNqB6-6@?QAD5x2w8&v!W(
z*&v2~r$FQ~v$(QNjjph6pn>!0HuujZpd%#azW@Un#AizOEI|ySNy5M`@uD4^O|rMe
zrz>OFT#BO
z{x&{p278qDQE-?J*hM^&wt%4*A^
zW!qpQy3yHm&&q=Qun&uKCMruJ0Co}TRs$LE2lnxX`Jo*V)=r%7$r__+t(gCt;R=Qo
z;yPw?sSs#Y3H^KaARD@cFn)*<%VNB=UZ+aZ*BwcbnwV*&6NOKEu)eX|0`ObgP#3~1
zIn#T^%&lQ~!SI9mzP&Von$3>;mj7lyAX6+jCDx-vDBKko)*ts2fF6O8OLe>2M`C
zEE|8uD(Y}U;J1#Gu-8hbU}@ct?i*Yafm!V7b7CIX5N@yo^ofE6K|0{=uW%ev$c3Ex
zgY_~np0Zw$11R=5v$W(db`aXwX#BhZkCdvNZqBpWvfFx!Pxl;3UV0!zC@k{nQ*H!)8Ot#)`YX=}!bQ;2d{JWnAS6MN?al+hKO
zFiCrtl#dHDn}7nwoLD-8qC+8!)GPl-@3Ext
z4TP52aXDB2hj5h%&GWM`OWwG1C^MI;Lw<6gP5MxH*U-Q#P@vjm&7!x~d08C{5B0#b
zmlgxCxb*8~>d-_JPFiJ~f8cB74%H_T^@?2D{$!Thxh{W<#~P-KnHcV&3W2hrm*UYAC!{f{Au3tD$Z{Emy`W)Hd!ZPBNI7AU9lo2_R3XI>
zXKJx#yR`n$nN**fVjRk}fx-ew;4V}q|BUMH)yq7WjvIc&1_7tDrbHfj#tbQ#ryK?9
z{t|hgxL%BcKU$*hAp{>Ts2)5U^)@e=3utk25>H>W8wGCE2kpD{ZTC3&&+ai!6P?5~
zbOO4~&y6Bds(*104eiVZFKt>c9~@N{w==^KXlbP+NF4U9_gEWYO2$E8?IQKrx$Zqm
z>iNUYyjFyO7k}eNt1h0)`tw|l&YMo{b-5b5SMpU&b;G?B(1)Urcp(X7n$T&W>8?;c#cd-7u1H5KB?mpy{mNrcQ(mEvuxb#BQDu0Siki
z5%N{(WqdS?UP8h3RzGfv4FuSJ2v8A|OTYp_D7hdt{%Tf&kT1pOwY1vP!zZn>pKCZb
z8%h6};a&JAcI`JK=@t+*3l4R~l>+bC!X|J3t$
zuP7J-C^Zc;=-nG_htHFJwaIMbjHb`7@B*ds1AZK|B07;pS+)MWPOPmYg+S5}GR4{`
zewI-nzW6VH3a4?-4MxWXtPDkUOX~)s+uB))1YPV37egSgFvuKoy;}~in&5p|A^c)w
zJbn|fQcFHCdJQ;;SSn*MPKe?OHMVZJ?c4`i8=3?a8I1fEz>jZQS=`5nBZDjxHY9;D
zTP5H$t5Qpkty)o4i5SfQ_H+B43dQ}HDNmp9!Z4iB)DRt}EzH@r(o^%he@(fr*WkM5
z-{S%XUDMx@L4Z|r6QT*ZXgmp_%a|o#cp9={Y3&qUuhRAIWlT)eJRPnlw`ky;(@KW|
zJo}fXnBNv$koMxQssnaC2@TV@!FmOrgumjUSsQZGp2>q)6AttXu6g52$SOO|J{!bN
zBF5bKODFpl;ch)#gvCAXf(DfK7I%i-v8I9DHKc{4);W6oM2Q5~!%(|X_D0o3VM9_D
z85nq?vs=?CfdL%U!}C%~immPD&Kj@cDN~DM*kOE+huj7CDZld1_7G&2C+%7x?xg+|
zT3ugE-UHICvu`*(sbk|aFtZ3U#Xx)tWa4Ck1Vo^tf4NF&KD|e^rbYRgu-yG3Q85`x
z__9#FG=D*Gn+AjQMo}cP3bv#Hg0Wtx%L)lPHds7
zD+kpPyFJwCV;@Bo>HOIjCCZAm}EZ#2k>H8tMG
zS+|qvHjedM3J*4Gfm1Qm?5SDavv%`w%SQ2)I@-y{eX*oA|oZ(*p{P=NR`~R_=GyQM)rXEYgmf)kS_Z287+o?7)
zMC8U&!cCAaHT~mp+0OG&J4H!*RatyB>2ktHq0e!B+z
zZU;AJ8tCj;&|dY);j8Q0zS;S4ad>tO9L_wY_1=|)=P6l)$esIII$7S|^PnGt5PcFA
zZRN#lcX7gw)$;B(-}b1Sy;o^>46Pj)I`sC*iL!g#nj!_As?FH+>eaA)eW=Ok>3KC(
zcc3$bDjKu}D}&f2Qd4lyCtNb#7Wkmrm|UooXDNsHsHM4~cc#~OotJM`qp?}sib8Xp
zoUnz2Jc{6FQZ29j0>i^?=11bsC*Dr~y*bS1M^&PX*-dlNo1y=g$Cl@;wasR;!~LU>
z$%R)-^eAFy9JB9C9Wj8B>in`x-I`sMb2@Y%mTo0IX{XY-S;Lo2eI0Htbx9R9#+`d{
z;Awf(>*O%O$*nm}dicPJwbHlfcV>_}iyLoNcMn#Kh}dF7kN4x{W#|w)zADO>L+`a6
zVfHJ%6}+x3H^tYgjS(w80cnsv^Nzu@MUR;2t#zY2w~V{fwd035>*&)vS9>33Khj8&
zV^b-0ZU=4**-M>Qo#+GTJdkbKh)|J!&zJvs>oZ{z9clR3S)zA4|@mA19z
z#gJ|*z49T`
z$?(Ha{VUWJ*3|Y$6J7dnFE<2uZOX-jP5O^JJ+Zgf{I#x1bBkGHdf}*V%is&WNU!&q
z{h0DvS-(%{G|UCuUsp)Dt8YpSt+;;5t#kwPFMbh21;wcrnqM`hgz@B0KTJ?L-o2b(
zc75gbT#Y||Nrb@#d;NxKgV^T2g+D$OWD!zl7j5@$7B*z*quuCa;VE!;==n5qsI0Ae
z46~-sQ91MEZ~A1VzD!xZ_u?ie{eA$nYtWS~sHX)(oNRW)C)tJ0ELfiP8+x>(V!6J!
zRztm4(Q%8tcaq>VC=>{rk?dLsQc(TLjgwiM1{)8B&2-7B(l=&!mvg5w@71hCy%NeHgH&zz1$H9wvcIabE*8(PY5;4tnp-uaUEm
z$d<1^D|dDsld$M2Vrn$u{3v~e6uN>1rgHupD|HkV45&A1K6B$T3pKw6
zf$ObE1>e<%TeupPP+PJH&lm*|;bY%XNrVyMd>XEX#^MR!N#kxC+f&
zvO8s_`im%&=v|Nk*;RPJq8(@C-HqOdd3aHMO-XaadXr;-fK$MngVq`czrMS#8(Rs{bTGW)&B1@rl-i1EjttWbi;ubV@cU2iTgnQBP9@Jng+cYsmAmj*W^8%&xM0`
z-1{OgTwVA&7+q*40bo}_j3y+`C1fnAm{)S38}v|!HEr#HXpCb9_V#Iz=r7!S9J|lG
zA?6?BCWVhm`!2uJ&scekhggQPC~+tjCf;Ee%84k;FH~k|rotnca69%hN*DG9
z3xpt8fAYZe8}hI9J2EHYwrWYq;x`Q?v>qOpQl#Zi%~vQ@y1}1VAYyM88`A67l&MNe
z7sz)o!`CHHNRC%Bxbx{5Z&Lj;x4!n8yTSFcQ}psU90tJm?grUOC3R3#FkczlqoknWSFlYfM6LCv%|Juar4NUf%HF-%
zG~Zu?=%c3P_V{raudKiWXi;fki6mgGxP=6}Vlq(rEb(CIgl-u5^X3R?m1KkxM6f2G
zyaxWHH|x409-GdaO%o3V+8J%GxEU3C3&Dl7jo3^7ltI!BTS&)9j)+1d8~)^C5t#h3
zx03IXg!0RdG_iO4jAV#o>dJ#rO;)7!&Kz3B5$NH-gi{UiwbT1G`*k!Ab@$g};5##A
zfY#!JCjLuIxjqKDOO8>%_X9=-`)GL_Y|IvwUgWl&%Ma-pR
z`80sKp(wD49qhy^v1uz@Pl^Kju71k`-K9n#W~WRn?qX)>k!pq+V6jc|+Y=X$A_<+d
z?YC6@db3e8jvW0}Fppny%%oVq#(sZA#&+gk`+XI5wc)rCt0*BzOZb$(3wPbHS2gX{j{kdZStw4DT}D_s3k8Q6Vc7X
zssT}rP%5qy5bvT4rilUs`=Bpxn}<(L>pb+lP_v$E0ClU#WXi-*p(D}TdB+^aBRO@Ka|I8ec7Yp7
z&VY9pR+vvF=`uV>iwPo(kBSP|L(b(ZvcQMkf}v-TYH!0=E8`b<>Yjp1G+mWjv+`D<
zp`r2$&*P%Rsg;tIKK~J4Cyd2UbmCDSgU2B>E5a<01iaXKDQLy$Dk{pKm4sI
z>Krn^i*Yq*ajD8tNodc%w|x3RIhru%h&2Uu^)W}v+uU)oAIu|4NVJ$hKgAwfeA6UM
z6ll0yGas!SS)3AV9?=tnoG4814*hAemS-W$I$wHC%npklIxTeq4+;jJ6tJMZL38}D
zh4^HZ(1N1WDi7E(zqvT~P=z@h6oS3=qO!Qv))EDayE`MQT%4iJz1P^tv&F72`kFtQ
zI>Sl*&{m2l{$vOq1e++ZOYp4Eb7)#Yk}ALbP|DH^80Qn>pv50_3?yRD@RoWpYY?7R
z{`~!3doODG$-gSYOZpIJ$eX0e!Jzo68C2xHn|U6yxll>m_w>*uN;kV9q~Hf~sOI^|Dwjj+H~%qhY-m*eF_n}rZLMG4#`!IS
zppZQr%23|Fnzlq)mgW-Wj%p0cnhNkfrDzXT3_)D0+BD*ci<=GIDNF=dUR6LU{7c>isOH2xkFNolWt?
zLb+4WQZk_o_nRnj`az{Yv4WS*%}5tM!MghU`!s#Q@I=37|ZMKaX&{m$*-;gp+%dcNgwt7P
za7;z#D6#|*O45(mZiBhF)6xvm2rzcDHxD-U!=kdUlSX-igg8Hp?!Shtuktkrz%=08YeqU
zd8qSd;zbuvGF6ZdgF@`SM?jID!l!mX=?{Ak$6yfrakn#}Lxe
zKY1K}EmctRzmlSfQ03&%*%7PcyBH{gzoa=}%9-CCFD=rgL=b+<=)&7;G&Vsg7*-q9
z>7ujy$Fb^T!6qNzG;9#noP}8mBE%5XRN6yQV{I$ADTFkwF|dkCsV51g=?P*+72hu;
zc*`z`%o}v_BojI3M76zTOUG0eOHg*Mz#_IKI3NTI6k2Q=$ui*tK7M*bvcF!2!}U0L(*yZTltMt&U(C%
z(kO8+B{?OXZ-@5b*s6KRiTaEG1xnutmP{o&a`*cX1vL+G#t>9Bdb%*^GfRfZizz#+
z*$ra=Q9uiYcBS$G`x-#)W($=nWLco9SW
zr&DdNgA)vIho4xr97UK%sd&v)*_RT{8E-X
zHQLd4fJ>Z)GL9pQ)t#ey_0DfZ3AU5Me@x2T8lh(k&8iR&{}XJAw#ish9=PI$7%hvNT`_l{w@G+EbR
z*|u%lwolnMPT4wT+qP}nwr$%wRp+bc>3L_mXZpK(et-QdBQi4czIJ5ZE7o4IV+Tf4
z6sf3u`I0-+jq(oAf$|~LLznGdn_znxwj-3bRwG|)$xk&#Edn9v0qA{^F$fIEK`y&M
z=AUi3Xy~Cc=a#DiZpcxN@O!wt&k?SPTjEqJP)_Ari6Di>GFLYg)Ts#CtTqCqkz-Fk
z-@Q$^J8OQfd%ID8r}bHiDakjTlMoNgXBvtE-|v)3I>!K>DUIKcCsnUZPAuVdyJ#Pg
zIt^%?=r`a}R#fO0Sy9wkjs@X*}?nPqEwfR)*B9CYuAwA!5;Qa^w-vyy>;CWzRf9qh?-TxaMjO8CXn3m%Khs!sLeg%yG
z7y}+|#o5%}Xb8F>N!prRbh5p#j5}>^s4ta2*J^(50VkkrCXuf9ip$`gK-bEb@CCWe
zx(FHI|9$tc_4Bc=G`Z#I_Y~+Gpk8G7TVdw*^iEIP>qJNB;*fb8)=bHP1}FWtwijhG
zy3g;soIhvq5fw*2xun!)Qq&IE(b+4O_RsGfINK<%hbQpIMHzqe=%g%dxg~Y0-q4pU
zy((Eg*|j4?+35v56;dhe@a4dyr;Wjx(|C&-qi2hS<_j-
z$@OC7Y<_J!ULTTOa(*~$^&N?oT#XRJ4=uw#DXIKYk31FiWcSgmUVeGXYxj1%Yr!Zx
zA_NLQLk9W@xCVeFI99{JvH#7Jn
z4Tu+KmsD`u2BfjE90UZ31j3=hASHFtGDh^DVGSLwmOar6+mgH-gz&PK?6?ONqD|VL
z%89N8zxSp@88b*NR2C0-zfx@)IX%5q`8sLLS{B^6GnVx3Yf)`fqvm-#q@TV*syCE60CIOw<>Hc^!XyWr~n^SzSZb(@3N-V@v(PpE~aR9e2(3|O;yjnb1
zk2HPnd1saf=L*^p(vdV9jr
z)k9BEakWo=gV)~FQFzgw?$Pyf<)*LjhMnww-pt&Ak!NOzs8}-7lIuCV_$B=ZnWbWB
zGO0n+H|8WEgNbrvtlW~^rOhLQzOskroc}ER?();?pwN)-(?mPUN495jSR)GE@iC?4
zikIemdnId`*;!lamX;EbHwh_S(<&0=5GWZ!8^D;SnIex}gfM6^GfP1VKw?*sB_E%n
zxK(Tt<`Uco*iQQNNL{DGS?0kr=CzvA~n>xvcU8xB~5axFt>_
z0wOVjAVKIVsV4vhl0v$^+apkiW4@*&l|+DLZ=_M%!T070c=DfB@>O^uO_x@MAxxE>
z$`TrxxmQ)<%N}7UY;fjwiP*oylpTpUl4NOoA=7TIo#j7KgnJrJTVOw@zxan{@dHN)
zcw7QQwxPgFv!S5&EAyuT^E0(T`s@oO+CislA;ux3MR-cyOGGF(#r)fH{jaf}Fcxr>
zD?vpc-b?}jmp*pdQ9}}*_P7>*_B!?+-GHZn*a9lOprl4Z%rK&lGR66hN!~XLBBL}#
z<5^8WG@F5vfsrX&r6^50^PT}Sfa_<&rs`O>f{|H(mHCXa^nqD`2qFm(5d;!pFH9j=
z!N`x~!|YYsGh_p-iOd4B98`*J`%VI;nF*6^iJ3C@e+n1Zj@2EpU^a+BB{q_ZX#xuN
zla0Rjii~#U%v^x>QOts+$tXl?&G-L(myqcQk7ewd+HqX<7-2Zk4GO_69T9S%a2&QM
zC1A~}#(@G3N*?T=2-2vjr4~^#2#agt21p>@qjADti$>-##Vt#g0s60Qv9=F05_*v4
ze$q0nqs~pG){Md3u=zL=g$(s60t(7p;lDE6{a2VczPuy=jdJR50
zUvBU@xDOLa5AIn0_3c<~@Jl0xTtwbSeu&tid+WsEX+Lx;?W9(u#5JVQX#8{m0Dz37-*9(
zeyw;k)tCs^1H@C;7H0`MY_*sK7)v$f1J)Wo0-Bx|W^dWFV~1%^g#O<9Y}A22IQtXp
zB<$L7ml2VU0)fTu*En(gh#NMa3Q%!(MKf7au#_TdX{xfdyf*UOkF5L&DZfKcEa&@X
zH4(aWLd--&pUTREKWH)1wH~n0U0>b0uy|oiMLv*5jG#(%(fFOo!upx~`8TvZWylQ2G~!3@Xte=TKz5c2+tfFR0x;!|v!C06A$~eS|Wien({m
z3s~!sS*$SyJIxiKoj17li2C<4x*d`X_5C0a5$+NRcjJk!0tL25LSX?53OrDySw7aD
ze!vQ!toc^Z&iPcd@LV@Zf}*E4kx=IPKj0!Tr781i+yqJ#s5%m78z#aLc*!ETOy=+s
zTvEe_g5vq#f$il21KELT%vf*poQ8tgFmNZ?)B^U`lq%6SE)%BJlxiK+F`i{#|Jn2S
zv)!D&pngmu6U9(gblAZnLbuQdX5b$>LfHnWw*#if8SR6h=Uwywk$K4N2=!*}@KYJu
zSiKh_05rS_U}DPswuy})Lt^jYu1PP&0yOn}IbdK+yaKWd8!wZH<*bJ6c^qP|sf!yU
z(R)O5WUMWQbzRM0jv(FL6tf;go6bfcj&-pBqt#ilLE=stE79uo>TdV+_y;}eMkVd|
z)S)R7KF>zjTAK9eydn8bpCHAuY8yd0pKI^7t8Z7da|5`ichN2f0hO3=ED6&MZnvVn#J2bpubAI`B`&2Hm8Cz;@w7cebgB}v&kPmN
zV7y=%2fsE*sPqsB`bancV%F~tvI^H+u-QB@JRRUrn*;`PJxL4>#XQs~2~uVpzooI)
zJndZlAeXhak-N;x!#t>2dC*h*^f<|u34ponWx)RV3<2D54iAuE%tB-mgccgE3ydg0
zcxT^WE`fkdj)Y9NRs@7AYVsj*dSiWG^GF;)c|?mD_x7OOpuSWv57jkBWgslOEiG++
zZK%-aq<8_#u^xG#00g8
zAVH{BA%Z~RWQDNOL$uC4o>RwRkYG!JfY;X$bo`AYUvoWofqv4BY~~Q0*ToJaoH81!
zP!?r3p!tf1WMG_gK-f_)9pmH4S2CuLae{C><6K>0L_@`W9{25W$#4unYm{Pzwua;#
zTqvOLD@}}TQg98tk9bn`RhY0bq5K&@`oxWW#Y8$mGoa&lAJSKZ*Wv)vY9c4E>WM3B
zw85!Z!;~pWGT9*#jU_4$ffn>3Tj;Rt%tVjnU5tI7UA0^SuR5R0Ya-DR!-$5VM6`uG
zn1WdqK~N0)?5Pn
zB-au&Anu@yoQ6yA*M3eSb`(5J_5PaP!Nq80#6ZBymQ0nK&&p#5jV4T41)2egWl@_rSsQS(lT1@bFIEWcT#PVUN
z?w$ZW3KbzQsAK#U<(19-8uth>YcO+RxJgoDz-Z79MX8f;7-kotEe>X4Sz
z$^k*f3ZTI_&p3gOSQY6o^YK!{#{{CJvZPquSo(t@EkU^R!MS~&>+H}Ll
zrn4eL!LTBM(~|EeO51t)Hsx!LLpw5S^vCuF`J66sl~j&OD&}fhZfsSFPpKosEpMXs
z@F1ron8bxe-e5r`hD%9EVjX@>r-1t*XqPw3hsmqgZ&jTuGS{i93t3L#t@bD$-Bpi#
zMRv^VIv7m|JidL}zvdRabV@_7CFh9Gss;Z*QH3N2Rg7=n><~-`5Cfu^Qx`?Udx}3-
zz$*~hONjn(uRm;MfkB)zTLRa%?ejjf-cuybPZI1EAiN+FToxmz2S?NCAd
zCUpAr9yDwE)GE1G{VXzQ(QLAf>jsob#M4+vU%x3ao-g?Q(Xn-#s`$<9KIepq$W-%((Qb1)cFJ6LXcBi;msm)BJUBK4(rN
zr!DjalA1@5jDI}x@i;rr9V;z8mma!@k?LTQDbux!+FOYk5zj&?<8vFpO(NZuRcg%C
zrFc?aENMvP1ns+(z+;hu2y<>ftKNBw-;C7GeNcw>op3q@LN;bg!!PowjuZBk?Rboh
z@8}9^M@IL%U}+F;7lB3l?8AEPf*N;LF`Gc2CF!{O
za@F``r462oC@tF>-YHIcvCu{(R;miWxHE3Lfy^#U=JF|0l6GEoR^ohG@>3AQJTDZU
zd_U}6jbs3Y2}9^yK}vY#Nmokd0Kf0Ga@b2iR>CHb9S;$bqc-W$BkSprq_(ysm(%#g
zYK6;dCUg%D(`Uk+w1vY~ewbUmPS@+96j}1oASFC}7UZ0M+WI3)?!ww0H6fW&iO4nc
zD^NcUQkOuoHBmFZcc2U>^5l#qYiBYHyO?&4hjIb8_^L(Oa^lZtY~f?>a(9y^vW~!h
zt|qc~l)POGWCNseA7qe#MnvT@illWD>9+Cpo^W0&h?ck+a-liM-atoI{X68rF-
z>K()PjgZ1vDnYt$eD84{NKT!OR=A`(aD
zHs!Igfnf=tz>{q~m=w+rFJE-hW|#%$!h8-1p$$dTNcr+HIVvi%BrRBKNv;FHuRR1h
zckhLJ-Byvu=2EsN8BNm+R|NlFoHGCni%Z}Fq7tsPi@-xd${;q9AA(TTF2eWfDmKP2Y5H7sZh5im>5V~6)5nBW_4Ph!al4=_
zf(U;QKH-51QYre&u*j&FuO{e*c&^4k6I2E$anE@In7fGq?a}V62u~00(9L=(K{Hym6wIpU
z3_yLDST#}P@h=#~^lcdDKw}z41GzS$!R3K9inv!&pdH_MqZ)u|VX%@|Nko`UuYG#{
z1e4agVdJ0NSZfTPuY7-SyL%Y%&?%W#6+Jo^j)2)cUaToOH2bmg$^UP|s+i&MKzhGh
z*Z~0m2)>VYc24w;KP`++9O?BOOny54qw;rR1G>NJkuzPE0}Ke@w_UTY2rX*$%#B6r
z(~3~RGNj(V!dx3f^(0OXp*!7J)~B;~-M@UQx%tuPuM^jXa`Td4A)v@K(aB)>S87sR
z5wsc99~onVqcEmFACz8X@uYe8*GSP+AS(^%NWCeBOp8G^hDGw^hEvgLnkEyZ%xyU0
zxLBtu#yx@G11P~N2;rMS?YEFVN1_i-VZ6l}=upP-5x*BxI`z?37uBbdQ(+ZuzQ9Y{
z){FU`b341W`~m%UV%q;d>;H}{`>(bBZ$0t9)_T^z)YSi4>)HORt!MwQww~kvQ0q~w
zxP!X>|q_>9>aD?&o#{HEIHBcMnSOH}Q>pk;8
zmy(S)YLrRj-ef+Q#gNYATv_CyH+r$SyqU@ydv;RBz8PzNty*xiSmMuWo^@895yMQJ
z*B4@*n_V&;N01pEO>uNR7-i2#Ls1nCVs5(T)V4L>w}F5D00YQN1B0LdfB`^!*9igs
z*>uAH?O@ON_eO62gL(gDw*L#$`9H<>rMdXK&j0I^r}^jiE@R+s>+JL|RPP_B{$v6Xak2g@2;D|I-V9^WJ|{{)Ya^_cQ;I2mfs9&0OO2m@g`#+sWx46h>o$jfk%Dw
z(b{Jg`9$zFDy@FWo|=nQ2)goM9ZZqj**P%^zer_j_IF0G_(~{P(u<)qz*rY
zBcJnmKnwLMs6xta>L_OYbOIWm@hV*kW}!C8Y-yHup8*Rv6HmjgJdnS`LSmj_3Neg%
zmG^-cB}F4_d^E;9*@G^6VWS8=wgJ-_bz1R#9(ceQi$3^#!1xK6K`GQM&=rqajWxPM
zRH-SD{ro$T(R!5>42K&t;6Ww%3jmtms1e&DdD9tdFSw)mN
zN^2Z?{v@@I2vSZy%?zc(0F#qNU;)K&i`XeEL!#`6g<}KyZwGo-A;40>9Xq63ysjOA
z?W{?y>3440v4_<=pi`FNaxKRh0???gnwnI7TYMU(7uQ9T^mH8J#y`m!wufRNg8rl3
zs5oDepeLvt4-K=TjFL>Nyz~NgEJB2R7AS7^egl65?X)OOhd!IkfHciS%nbDeoaiIc
zF%~nL%i5kycXapxuKyJF9@LZYkupk2XA%j`qmXh$#a*DXP!Pwo+TR}d4TNBNJd-&7
z28K%~l9TG8kQRCPUNG3}tZ*I-Iu6YrR?k2y#NWnkP8QS{a+&Sf?e%&8VyoBl`vIsV
z0&kLi-AQK#?aEjKX`g3$caQ`njwnoCY5-uamz-o~pXEimC~J;5rU`iX#KH`R&w&vx
z>dW(PQR6mhsMiRX?58A*TwcN8xE;HJpFV&3%^0ZwkPnTDAb`_|oGh-;%w@
z>g3<2;QJwgj8yaO%JHNB=l}5E1ZGnG!e)aF2=edo
zZ1w!<^v=?nXmWfyq{APTy2Z}f$+EQ3phm53Ije5#TAN>C0k1@H}f&QI!Q`~8`q6e5gts$5U-os`>R8KFyFl5Qy^{?OOfBb)
z{?Gp=BVMyf(O~GM684oB37h}Rw0t4G~RID!X
zOtNOze~5nuqPJT$!1&2=~7`QNSt?`y#iwlEsMS~d`wcdV%ZPo
zced{s=O%roeDTt=8o_~|^icabPD!|kEizbb9TO@`34Z)6Q5`_mqgqA32Z2=V+-$xJ
z*NMY1p_@H%p?K<{vTrZYmih;7_sjP5D)|#E_dF`N>V58t%UrpbN>L<=FB9H-G@+KJ
zo}YG2oru2hiS4TBl%|U8sfs&$;lw(GAk_8!>Y?`q6VUXq`
zJY}@dhM1H*h?FBs#v6_S`8|=?L9F*q7!(swIM8kR5P%Z?O#VT{AGY#rx%0oqU~SB$G?l+
z@Z10{TMt$3TWUvBXb-P2^2KwAvp1u@SGtXA_}53;#T2!o6E
z{bo^f1|@25taI!$M6@TC=HD~QKepb(uH209yp3*3_=e$fdziJWsIKImlnfM3YTe5f
zTQs`^)Bv|EiLn=fN7x%&3$b!E;SM?y+O*zy?(HX0&KbJ7JqJ{SW4uy5Jg`C#`A{B%
zXUV(Q&9Vhro3JAT17EBCdHw9HCKv+o7CMfRAzGf3;^gaa>BfaKVhEjZZ^H6_+j1`+
z)GslvVHGKEj;THiHLy0;p|{cq^2K+_m$8n^;i6xh6Fa4UN)CV=cemP&(R%Z6p^csBN*P
z-SdJUT7?5NkO;!v{nc3<<8t)jIj1LMFrKq~XHVESwOs-ZzBG$*X|fo%vQvsiQm;p(
zt}x4HCWz3NJ4~G0NLxRIKw}^zP3eI9klm0?S-$tqNi2W>4?};okY0XK_Y_pi5;lp4LS
zPr$Q$_~VCS4QHLGZAhT&_*r-Y#i`>Dy$RIy{Xp73u1w)q|Zo4~%o5m^e
zxhC1X9$+KS#u+M=8?DIo!J%5jC?;6EHry(tFYPJ(Xpz$fLNvf`{kaxw3NKOG;
zLd)ypftN9#Z$9?_^;azN^$1bFg~<_c0Dyntt+ED=P9_fj!dw4w>i=AhPI*KM36CFbM=EEB;Qr+5v
z*7ug(|E7CKWeo-4zCA-`w*S{)`aj+KHzEF~j=j|Uv^i)+{L>?_BPjoerV&k45r3Eq
zT)O!hZS)E>WfOQ73AZASR3+bg3=eJ9>`bdMrs2mtA?dmUl4rt2u^rHWuPCf|!QSuV
zh{l~ib{&&ZtTh>xG-6~PW*K1g@k~?U7jbVJDnH+f=O9!IY3QN(m~PyRzU-b?dOB-@
zWwXB~vHGlljZvmzqb7q8mh2eJ<3aW6k99QefR2w%x{QHrE-nN$8+HVrneaK9ui%nt
zs3))A-YI8N9^8{}CDSUCI}xg4(@$i4zov*PuxP71!W+wvVM7&u+>|e_<9ovxL+mu(NJ91Jj^Di%%I4e}J
zdui(}5+IADi}fYz>ro2GI{iFvRG#{*^oLAg165tx6iVu(*p
z{aH4)pCay-F!YFc?f0uM_eHU-T(vD^!v4{rnkmllfXEC|FVP*UdtMXHiOV){*+#{T
z_#uYFMTjdZ40T|X$VH;kP6~+HrIz2hlf$9*LxV4B(?HP?bUj3w8{YvRpnEdD{pWa_
zTT0@@v|}SM&~m8LH970ofTQ{0TelG*x;vU6U>#6SWL2n`ITEN5e|jXp>o7pplS-B0
zY*iPtKUh)O^u%E?V>psP0!9ml4Tq-wQIjUdel?IMq(x11O_p*%)ewHr#t2_)bw6SU
z3g=&&5h#i1j1eG;uI4QcakthRsIc#g>(aq;Vx+PD2m}hRG6>)P$4)-W
zI?U`t-3`$OnxP+mPp~+|4>vUi3q^2ik!KI|fZJUBOk10d94%l{`x*%cIgFeXS(Hiv
zB696SI^wxtvDBk1xfjz8@5rohR=byuvy!JUV@kT~f4{0{jo^s5r)gspvAAVH7E2jS
zJR@B3L!s;tRR_uifoqmlso=l-<96@|DWLmX$SU><(5Wff0W2*r5Ok(nwI@B
zKQwps+3WrOnjSC-O0wirFCX9y&KW)g@H;idCB6>^&&C7w*`w7{B@rJ#QsIy?0ZWWX
z|7QzDE?m!1Jh@367N_3BZ%CvpTj@?slZdt@<7c@P=I)c@SvTwiD2qYbe+O$C>
z)66U~kKTy4YFn+fc;is>i`*8Qo%!1gY;Kwzz}{soS1ISCJ)z3YGfym5I)(_=g{x8X
z%dF!7MpQ9G>r6V7R-$?BSa;rjTITp7Ag#rZtUZ+<_f%?9T!Yum(TFBGs{WiW<#+%O
z^)KL_X3IWthybXTFGR02o#%UD>dOgpDKFrqlTM5IxRZ-!*#_p0h8P~qXM?5LZ_7h{
zSDF#(Be^%^Cz?j-@#>uEOG^s*avZW`&_Vx>8U4siC1-n9si>ttg%ld}nGmeWxITdX
zxWWEe{rxIugRt?{Cf2%Q3&gP;4$fBL$Pq!(ulk}{BWsV4rK;+zM{E!bfBR6@$!7ac
z;YDyQ5%bo}w~z8+INNqF;#o~vOI;1Z7rQZKY1*Uo@geF0e;vzJn)?IOJB=WtgJ&pi
zjK)&+a%XEA^!$2z+4&wGXIx8b&hz278doY5&^rt;TICLf9|@4OjDfUv>@O9mi&JAM
z9!C(f$5*Qm+%Y-?yfiOWk8V1v$7OI;h&rJ4KoL3EpAkiEF8Za|y|)I@TNtEl^;tSxNT%Xg#OL(~;{(xwINJS+InwL*`qKSbgUq4kP|7Klm9%C3
z4%_Q4_v>5CcZA96JP@tVNXV@apiblQ;c=i$Qeig=ks28sDxBmwG}6BFNs%aLY(
z=~5lYJd_WA0nne{l?U$v)GQpRSX=_oU*Aztz~9E>)qKF}t{*&g_gy@@EyWE3>eh^4
zdj+iA80Fs>Mf4P+350JH$D0GS#+l*3Te}7kua}%TjGkPOIWic*sJt)f)i_E*>j6UlAQ?maIOJY)fO_@)HKsJgK4Z*S75WV;&y?E
z0{5%<5-3znlR#tCGHv_G<{L|+zGYWerq-YWf+C8S_U-Ie6g_YDDR2j-*o7G8aHD)|
z=5buYS)TqRboDMz^Z|`sFcSJbgw*RQqTRnq7~K*&5R4|Bkwf4^b~tV>4%ar=7LfT!
z0PeQrat`v=Kp#rM;PT(ABz}X6!&Hv>Q}WRrqQ9E&bHUqgI!d0eqJ-$|ZT<+h^QM#q7pdQRI7$Kk&~A*L
ztGeFXdrdZZkvI{}JZxHfy(@r!0-he@^Mr?LM3j48Yp58`-c-+lX|#n8_Zm@K|1O!0
z6pz1-34FY;zxx1?17EGd`nH#lc$d1ml(|aHcVwCNv?>27{myXH+;he^S@}W@(e^S~eRTD4+QH&jjY(8e#AXit;715dnbnY#1fb@+4en
zAYk)R^({h9`3}^MwJwQ&~juwmoO=zM~X-IBhMhCWhplulj>)v^Vyx
z=aN)Bn``+q84y;N2_Bj!FRG8AKm6gJGY0g0+_&&yoZS=koUkn@BV9N~(VsQPzk2P1
z4W}}^+?Jj?Rc2JP%pJf%kJz%T`{gsTZJ4!Hw~5!JUP2R`*32{ik}XpaNy
z5N%Fe9`qT+h~kM!>|2IOU?U@t8Hd0S7y$D|Bbcgtz7UIt;*Tx$MPX(k=n*kpOeMnZ
zMEzENnl6dn(20@|D)%0MpVlXVR@Xg->ei$eoNwIOk77c_cm
zi>@i~u^CE7<%U^N(8if;6XQ2_g<#I+S2pI1G?g}sxIAt3F
z2!4@u0R6pD{WPC%T)1o{1#&9#n%+O=sf+0x?CoN737>d!@@&|ux$N@xlilRVuDpIR|A&akXhCQ
zg)fD#Kw^fs*G51%3_Lwo0im2Aehe)8BC~B75TjrixnnhhW!8T3{><6M&%5XPs}g|Q
z4E9AxS7Tt+3(37XP@HZ5RPtRmb2v3%TR35~V9Ibxm$t!OaqnBv(J7C(g=V!vBM#1O
z-wMG48;lV`FvJ0(H>Dv%B%*=+)vb{-&&E^p;K7RhEb;1!yV02bvR>|PWL&3MRXw(B
z)_p?74ahjDEg&>0kVyj5%2Gi05O)K9>R^*8J(O38HC^5iwR^)pFYl(LvphRmcz7^5BE&6Nh5&PA?VcH-eeoVF;v-_SO~bzItU2}JPfV|DXCp6&r;2)4Hk
zP0I6(C{6evh$6TI_dW;=IGk+>u5{T!6Jdz-1%IWlQ=Yyx_O{x{TQgTEn7YR@0U#X@
zf-vJOcsP$jLJ9YoDn>c9mox{HKCdeJBJcC|{B*O^?frRzxj6*$Q1jV#Zpvms9xWUm
zPoNqti9t|ic|k13+sh*(fdsDL&s>#-7r(Kt5COj+x8uE^e?#?P3*kim_VYor2__H>
zLntOyFCse38n1?>e(|lM4$b!A>vK7@ka6cWOyj(XVWg^qmh0v1CTGCs-+E)UhLRm}
zAOHaJ-^;%K6M+6bOEszXm$ZrU^_R41-h&y2r!&#`?x!D|5XJAVst*!-Q)@g?8
zrR6Y(hNL@Gr4qJ}duoF{QD?nl8PU!>^0}Y->D5*#oqXr8RWEm)1hI^Q^c!E*nO|o8
z-Kg=&A2wI)=4+j_?SfGA*F%VfIbofj+Rtp^&7=IX$ZB(gz4l~SW&&=pac;=;#@<;y
z=;6i6jo(!7qCTXL-76W?28&7a%-8HycLNl~dL2>O>MzYZatnsdI^n8Ou`ov5?0^kf
z9-5X>)7tjS%2C)uvgYf|}
zKB9Meabw_u=b}`5ZeEi->zCK*MJ2{li5F~s6=dVo^VAF2AnRTw#$jVT88TXdwZ(P>
zpQY&XHev($nnS77RSMgpdD$$p}O62ZC
znCc6?-5q(0;-s9=OOoSW1~TMfmK1YJK6}G1bz^p%7++Y4d~mFuCklAO$D^ONXqEYT
z#+i`78Tm|Zb^8Z&6Te`W`FS{I&C1mjZ*P|wRO@$2QWro2a(F`#Lw3Lmh6mn|LBgp3
zoImimU|;S8W-*4=TY4YAYy+GtCM=KQN`1aLMitCS40U#F!~0xNoml
zzwX}_^m@F$9$z5aBk+oIvMDb-*c`|uiFPD~dts2FTyH1@7@v4WcvE6oAP*L&P+dJ_
z@EpL=Vh-eHb{OX#H2+{2dKS(U%deoV4A`8$tLwqhTy3yy+Z*TYhtwg~gnu~{NY0;2
zE0(8th)#B$3W^NzeM07Z2MPQeX-H9mhMVJ?%?YCZXE6FZJnkR!EdK*W8e!;R%HM3x
z89TPQZs=au^)?*Z_SwYM35-m975_Rdk;_Nc~1
zoGZIz`pc%o&$I)Wp>+1Q+rkU?itQ?{xkE+XaO!V1$Ia@h#69ZlT{2d&oc()<@#}9k
zclI}%lOuA=k`D4wSNmj`S;lA9qJPaTX54Ne9LvxZ<-Xl#&rWGJff-VT75va1(xthW
zw|o$TrE$;OqO~3ka_4@m0Xb=3vGGCutnWb?J{x*gR97h@Ps_A6^I%L%8*#DXn#O&p
zXv@gasSzpAN`k%cFrc2dd8{cId2MP8x367|LAywKSw*{e#IrKf?d4Qg7H9SU;K5-D
zc_{y;l1||;(Gh~vp=|k@t2YfWqPppbv1ND!HX;Iv@c_mU4JdOoVyl00yYhTgA#B{<
zx-y?YKW8|s%Y~eTTjGC&SEmg!TFJ~oj)|0rz3~-VoHC^Yg&ROX3}G;&4+0RQ$;;$N
zl8l8=0zy4(rc-26Zd2ZVQ@Wnh@Rt9Z(oGwZD7Acg%qK2#re6-H6gSM=ccC!Dq_I1I
zmsRZ6Z~PQq3CO;YV<9>w3_sIh8fp7rcE@!-igNKO&=fV?M!S%^>R~@9d?HA>FFr2r
zsoDc6JFMVOyt`fLSEZg(T*Ey5@-wROiOi9gbFPL*+4f(Vu!nWWTT!`Nj?WsJkkXua
z5Ogp|yDUW(m(3@~k;EXsk%eJ)L7rYQ33IJq)M&4K@UQ96v{r=9Ditaq3DZe7Kq$lm
z1_?nBp%?}L3(E+CF{60G*Ui&J!HP{@dVxrCqaon?N|(<&X^+LFU8FBtuyn9DfU7H~
zUGl5$7`A#4+R_}p5ar%U*|FJchiQp%2=_?(2W^Mt<>a3Hht??%4^!=m?mJrwi-QFAaaI=pVCf6BGVdQ$4RP?DOmA
zbE+HbD5R~O@5;-m#Wg$Z{nxliff`tc;_C)As&_$}kjd+{RM2FSRJ`=B3dKHh&9c{Q
zqOB<)0VQ-`q!2uad<>xAQ2ZeKbJMVw+axJU>w+?8-J0WY6O=J@X|#u+r=|9O9*n5U
zMe*#gWK*eM=W>9EGCBf4nSK<}%)9SpH>M~G#G+O`A~2;Rr>Nso)oeC
zdZCE~`d7gXu*3wsp%w7m2}NS=?waEbl{a%Tv`ZJK@;_p@-n2wsjLM$P%2Uo`50@ik
zACBSnw!@I7nc~6D4FNS|2nis{m+EeSkwj^NphAJ3ZUf<+%N$(jPfh{h(gQ&$<>r+^
zaYuYhx#0t=b9_1a0Hc00+}YQ1n}f+(RLtUjPj0`zzR>6JeLVonp)XAOI814dmp3g4-?zCe?%J=Pb+~Fj>X>{%240ikE79u@
zFN#A4Rlj{X!8EsRSs0fcs9DoypL|YKAxaumzpTPMX{HvOZHtWX{dsc#`u9%sHEcqC
z{Wk}+M*h#R`*(=WrTUgbCL2okjm(Z;-U<{!Ai$5y$@>C1v&_{6XFOluWoh70sH=4w
zGG_OxXZw2+UZh>wpX9nF_9N(RfKpk)z){_C@Nc7
z`0F(@7~wyyBF%CQAwpUBAN`=dyj#BBH&a-Kpx%=>33Qkqrrxoa6%-kj+fFTW(KO~)$W)h-|dibNz5v&3~PxmDB
zTey>d@B@DcdvbpYYKUKn&OLv83Js-!ricOtos&r8vOqK*Y#014A@DE^o9|r9m8P4@
zWXI!AH0zBk<*@3lBty0m4b0|j0mYpIdfaM=Bb6+sgN2+9+CD>M?)R#GAQ+V`2h|)~
z68^Q*n9vQH`e4-}So(G=+=_zHJD^dPVeW5!3HDsgMQeQbVNLZ5dh1k%oh*)*Ei26_rfwv~sL;D<5HhZt8PbR5Gef1rZ_dWS&1e_+xG$t26MWyJ-jA7)%H?rdz4L`ZziY{tX
zIbS?g?%?CUlZs4Cdq6cd-taj#l7J8vHs_*{CgQGA{E;xxnAOSs`c~5Nq?6M_N2qBAS?#VDPJ9
z;H7{zDZoN4*Yzf`=a0H6;Z_oV%0WimCZbw{^R8ZnR5!O+eVfeIXd~t(%cz7
zvM{`j>TDD__;*gF3FLxEsMA;#1##JB)uLbX%jB}@-!p~pO=V_J_66i#>bUG;$rQc@
z`^H>67{O;74n^1t*b6hmrj4$QwouMNTMTs1Nzyf59R6HAUy>fH#A8{a=UWxz?w@a
zt9~+EOk6K8(EcOOzTDB7WGINM1u=ztghsaPTwiBl5Rm~Kk%~02|45d?>(sTP%e=_#lpyZ
zhCmA-T(f0I;Ct`K%xd)I=1qD^4^qmbeS5s2v;1*n^`K69=O7gDJToa0TpC12An3rO
zZ?!CzaplA>z{j^8rC^+(D6AwDM!0fUSI8>KZ}_LyYS$=89voSR92JT%um~C(j)rn%Q%g9j|fyv_+06rR*D((u(XCYv8=#-%E
zxc7EGWhFLy17}0R4M+`hsf5@5cZH=ysQsQ~1>kkO{Z{%ae54Va4UrrR*A-QNL)5dH
zrX?%uCrz!-9!u(9de$agvnaCK)U{qaqJVj1oww~6Z9rQ3;CHfWNTsTqC)HKeB_`hG
zd|b3U3VPOsM=S5=P2KBQJ04^Sara&m8A3_pXsMkF#$#&)gEh0Tqkd2mXVMTHL~F^LkuH({)SYUFRR
zIIuu*Tr}c>*VgJKW0JFqZ;Qhtn@^3i#g0^PT)_>)X;&?Tmi>W{S*}bRa9HEG%55a>
z7#)xcHv7vJAq|x5o+G@GOO#jn#D7V6=k~^r7Gy_w%?vX+wZdrJ{`Svsooe>L^EuEu
z6Bc>#E^`qpH*-%e91bzD_Xx1N6M_tZ68K;3opoH5%l7a$-JQ}YAT83}T_Pwg-6h>h
zr*wCBcSxra(%s!4E%k0a_g^|wQEH&de%I9TOR-^0wVtDM47
z-L0OYu<>N5GGG|BaE7@V=o>mn4_q$0!Y>bO3UYt`zM)vv(~fI!NeC9{>0>yQV|?5?
z;u<+a`L0X~HF2=4B%F$w>30Kjl?pF6j1*qR-BMsBc)BQsJy8X>Vc_q1HF}BzJnz*n
zh3al8p7kK(t6`S#^Gy=*?P3*}3c`AVbQi+AdY%j56zQM6g&IZ^%%*^|8Ru~Sb6@g3
zu<4tB_Y51*zZ+}P9=UQNNM^J*SADZX`&}i>_!d|xDn4A4P*l2lgYerXrE{yVWSp6q
zYzeyWUWWnd7^#fe665YhVlCzgrn@GY7)Kjb;|KmZgE}F3yn?|WW&|H@hhgT>9laig
zus$<((EMQwOHd(cgmgh1%*CeNgRZ|Q@}{la=glV-j>My6+e7nqVM%hX0FwgL6Y2}#
z1Zve@i?PvM+=$yz+{y)NT5Qo>k^ewx{b969MuR{uTuu)%Fb(~!`eI>l&|kNx1u!LC8xuH*ylDeCIu>E<(n($=-#+Cx9n5+mblqqgL)a}etoU%%Tp|Bwf4kh
z`%49JU2DDy&cPN@9K*@wp|B@b)M9LQfBK$z(D_n{~Z_p>7Xwy##urgMf
zRA5$-Uy14P(0$B3EU|SWGa30GwJcpIqe7B7I6^*w;XcLH6-Wq%h3DZjxIRht_D6X3
zILS;*U;!}+kcIdqQ2Pp5>_ot)Ci9P@gw&#
zX(BRiCx3FytHjtsT#vTrFKA)Kaa|6z0
z!u$=N@$X?@_g1C@BgMk_BLoIp0YZu)T|8adKRqZ2vn2?f|zBb$294aBELFY_ED
z&esDg7TlfZlTY;Ql4qYu8UaM+Qpj@F1wNkXvh0iqYmnbmWcQm~Sj^ifk}Op8rcBRilKg?x1tQR%$2C((zX&A$;n|$Ss*EoU4xSb;sL;dM(
z=&Cf_RJE{E6$=9Xcu^{7f7IaDjo0S#U>VRsAnZJkam3?1z$EFJ&+n(
zGcn2()T=L&#wt1Rm&O|69;(RmoRZ0TQlMpNKSHd)@zR^dT2MNYpxco?2Zgp_dGs2)
zyCX+_Hx*l=r_2TFGK^GC%9H?w716JsCvQA9DO0_;?vgs;na>oyMghrQd{f*f10#iC
z&^Q~&NNt167r|dhF=kOPu_%M`Jn>o?zObE!9TrZKKYPPX#}kYO&`D0_2%L&Nh`kU3
zI*qe#HO%MY5=k6!99H{d_q-UiW89X=XUACqI*n^_emZ~NXSVdFxXwBkPJ51G29t%j
znlscdPA?dx;RRyPp1<0av|WZuvp0oY?C4hdJB$mv78++qDvOV5F)zsppd#0fn~7`h
z03XbTSV8g|M@kiW>(!xxKME;JXk@U)2oipwp$t4pBE}^hgf(iEa*DI}Nya_I1IWJx
zg8*|Vu#W929=WWi+!K!+dHR7e;+f_%JxKg8iYM})Ut;ddcPeMciPa;u5%|Kw5q`bL7<E^o=No
z`u1}fSWoVi*mLxcHw5t$Q^LdK`BSu5u0d2B2}vqN-Rh#1DY>LR9j6{_hw?q8NC|d$
z!~}=PFcPHHm|Q1Z8ylSIUkDYBtHnNE8opl@wX@Qew^!RlGF@TmjukkeXBORiBKl0U
z(LkTq{Jq0qW610G7nAF?NDkoEvrt?f?E7E@t$61kz&~HTMM}u<@O|6wx_*U}XuP&{
ztbf-ICBxxp65De#l6@@nVeCtq$+que5h$I|D2W&}t5DeMWMLT0CbU}@i~d!7gHEt3
zB$a}u$L?c*)4=f_y!{;xRaUz^h=I2*c*>;_lZ;|LSjA)w4*ycTxQT{=2L}OX
z1|NeXL$X@yLCVkdZuae0OPF&Ktr=cTOY13wfGdMI8wT5m%_ggJVsPC^%)G#-`oZ>&1M8W
zUL`4SrxdV42LGr;yQ)kh1fskDwGS?imPKTQTEYZ-F75UUP?OzVF0U6*W`%jP>7zyp
zcZPHE7qEiBXQ8@nv{${_gf;po1E@lAE@t6&#f)+~2h{iY*0iRL63!hbSiEmD1B>K&
z3c#yvB`EP&81+acJ%y@06&p44PnMMJ=p)WfB}_7h8=O-MRI)x1+u)`@PvOx@xp{C<
z#})r9)D$=)>I;084(pcmxptXP%0BdDaY>G+ZpWOzBd)^Q5TF
zSGnerL&b9>eC{Ua)?dkigSuM(k#VYUVGUr=9^OD7J5#1c)AU$WwO%9rjDE2yy_C9+
z^gO1XHS@#*9Sp2Z5mqIY;TVf)@quzlGso3wOw3$iNq}{|1*-rUt~76kwJWU$6WTFv+6bAk#Ji^FQOLc)nH+2rvpI
z+M}1FvsN*ZtOj~J9z-WHvYS*lADa)Uzp47#e->_{M_d%FWTSJ2@cf*)I8XbHV8`QuCI_lNo?rnslOD&HNAWk1btty{6&rAj2G
zdiwHX$gzeLftdsQ1TTtqx48%d34`Ed5Muxn9*H(5zy1|j8UBGvado5eKwR5Ki1u>a
z8oril47*OA%0Xp=jUdtd*n_(p-T;
z6FR^dQKJ{~*gB0mi)hHM_Veop&P7Hbl>R$!XM(!`*?0}7J+#Eu&$bZ=$5unv!XUJ<
zYC1K{zaWZ`XIA86!IhQ7I&G~A*0qB81$-RVLvU)qZox1RS6n|}9x^VZ^gfF}^RSZM
zL#jeh(tRr!I}E4yna$KxD%2gQ7L(bt3b6Q7&*d$l%ue4sIGg>aj(kEqptgbf#
zLD~ork{ilt_T{y=m$!0pkAe84YM6mBQ@#xzcosrSH$l!jmwK$@nF;hhXqLZgyMMQ!q{%L4B-5&Kpg`bIKHC-UkRqs$p
z(#DLRG%NvJA_p2h8ax8VDVj{aT7K?O(kFp01Fq>qKmE|hM7Xx(WB6#Ve`XlPy|pM8&8tx>G-gCf}cP$?p2w`g4Y@R5_dl8SFy
z944Z--G`rwel^W&)b+w{DBk1PhaPDO^Q=L=@D3vE3TV!r>r@KMREo(I^5+om<3CL$
z(MfSj9lU*T(fr>Jv;GmT0^C>UKP1fh-?y}lLYL&
z4Uqpv@BI(2;O{Z_uJoVXkw*o3x-~gEcde
z`|d{);O$BddDXd9(#&-r>r>D5sieNByhW5VaTU%vcR_X21_Qcu}
zpM8u)xba38IG>(7DAzpQ818ec;*3#JG`5Jqnu*hp(qAu|i+gX)aPww=o#Lv>)CO*<
z>I4sL1m2Vy;4fu$0?d)O!GVvfbEV+-S
zm6YJFNH@sNo(>@U5@?(E$t9LSTM4uWfpZa$-enr-++~KgA)kq|!y#SO^qA)h*a_As
z4FcUsUN8kBIdqvWE4SZ>IfQ3%1EB5PhQTbc44z%ArDg>u4^GK7f7^
z`7SOjjdv%&9_UWe68qSJ>~LCJSFz?sA2nf^y}U?9iKtiJd8BY?)W$sAo#I%F@73!2
z#ODj`9al==9TaJfCB3HtL4r60&$;UNWk-4TKT>mF(N^*miBy&f7c1k>jeDx(6{y7e
zYTRMVp$6@!9T24pTPS4|aY%3HI~e2*pz386#$2X)RZ5MPcD}_5)|M)MKh9=j{u*2N
zeCPfAcoO1u;{aUQ);4N1sq71nCp
zaEGgeUL-jZgkEj|c+iiVI)c^FgfK3
zm%^?mS30x9yE!v??RpxDUL<62my>b<&&R{#DQuiln>Q-%U{#b(F;s-&g3IL*=W2vU
zCdJN(g_7(bC8(QJeJqd1<)#=T*Vzu`M^-Xn%^d=DWe+z!%Za$N&ly$i!}%HAY_SgH
zOg@MStIY2WIt7eqampnfk{GgAsc(PkTR}x;kC!p3R2mki(p%L5g=zBQv|rBZ-;Wt>
zzD9Z~-4mP&@JRbWJ7^tu=cpQRC;H7}ciz@X@Iu9M*B_QHlV)X98u`2ez0C4aTGmc$
zUU?AXYhwAH@@}kIm0o!(cMEHnyaeHMPlZ+D^sBlTS4?9C^-sJ{jb|FUiDsSiIi*Ax
z&Rwy{h0v0R(Y=*dGss#JkH80BHM+R8Eh!+sv7^{n$G+;tmBtZyBwYc2L?(`WtcLYs
zKZjD>2)*O>>8X*;hi@Lcn4j?*e)RTec0gy16gTT}X^UYQJW(F;#dfg#2ry^)x6!lb
z$mf(g;&^mu@kV%;l7P+{bmIPxfDXH&Be-bzSJzOjTMtL4{`)5Wm(9ffLrna?FNI$=75lH1
z!Y`YP{ntw2mrch0Yo+kp&Bp#i2EeorP2Bvnz33l%F8wim^U%Iy|6OAEPkbmO`1*NO
z5x9#(K5z~X{U6$3W2k4QNB{lb?^WJakqwz)!EB~4UEu#bcf{N4?!o3wJ0l$tr^~=3
zK16CZgsCI(Ow36?h=eaJ*-82JyZ!VSQ0Eyz`AR;x%FQgo$9$f1`@WN+66Hb()6e=d
zp-Y({yU0$RLwK9cFD}R~2b^Cr+R`y#d69$FI2J5%u*Fq`l6`u2b>X72Q};fU5(Y&N
zhM-oJX7+sl_EOgVv)Q91Y)+ySzZt_tk>|x06Fb_7?P9aqCW$Ro5G#z~pVvM)^$d}3
z1{-}CGql-eB=O%NqlByq!GwF-Jy7?2Yra29mhxIMQx44f<6xw*shFW@t#Lkm83xGO
z07N<%);i488hcZCv0zxJrPdmvp-D@Jla40(K`vel%L=9CuoCQ&KPRBS>TR_sPvVoqw14h1z`;Ts{d
zqz?eRNs!(MlBtzjgo`)w?$20GP2{F`@fI6`mnL^`91sF1#g(8oeHM(ME{*L&Au`Sj
z51S688;amHQn#}$rt8GQJHlp|HB#9ZL4|sQ&^G*NNTC~M3ylDYv^l
zdd=%KO-)zxcS!8b<9H2{G=+75x*&H#9>y|qXwTMXLm3yBW3coN^RO>OTIE2i
zPp%`LHF8ZA67Ty<>mh4-uERjYWRT00+Ke(+w@s3qp%DA1hx8^gwPFrm`mvD;6+ULC
zU?Po&O>-uLY&JCmZ(Z;)d!NEaDq^C=#l@zg88aM0Xdw+(KB7+vp2A1;BQs4$&sSQ7M-qC|1j
zs4_x73@^$zGO?B6uh$XfT@S$|p3L2Ny>6c?nV$(EMwkKz)O)Q0?QGRWQ-&n=
zrS+^8rmlIFSQM`=vysydTNHp{6myu
z-?JoKjz}W|BNctWP!sxUOJ`>!nIB|gCI#7gJ_0rR2U
zL~E#~bd%~dist0yItE)JUM4}%mBvTtHUt5V7j6=3)(095IR!yRbPamS8k$xg2xM`|
zB$o8UDZRD8eY(3yv!WgH#x+I7_1N;l`%Lo^Pr7pU3%t+5^*ce*
zWu%>N9h`k#{1wB_5tNL!=Lc-#D*dk%N4xldHt~3?Id0Gb~gmN%E#={9q{>Vrtp2GUGb
z+CfbMTJsckh|1vG{g^t`C3rlNYFKlb3ZLVcxN@r}TXK*)pw+KL%5D^yvfPjDiUIV`XcQXJ%02nCf
zw{Ktq2Yy39LqLFoL%>2oK|;gB!o$PC!oeXRq9P+8q9DS-A!8z=prK=6V8A0`VPm3W
zqoQM=e}jO40rP-Ez(7F2pd-K`p#R(Ht_6Ss4G0ARfPs(zKv6)zP(bcF06+&~5C~vt
zzZLi&2?P{aMo1`V7+5&q8>)~2pdesipx|KNN)3FsEAVvyI0^(RF(W@Dn!FYii52?O
zcVTJJqylBF7|(|e$(Xd?c)-A7VqrhRA%9FkN%iCzGYcylJBOfXV&me|GcvQXb8_?Y%PT6Ys%vWN
z>f72oI=i}idOr@2jE;>@OioQNEw8Mut#52@Z6AF(J~=%*zqtJRtzO^i`Oox6#qQM$
z1z0aoaBwhisBiTG0ksESU?|`a#Eg)r{PIv*R%j$o-$A1bgr$|W!jLjOKg7^}GX#rC
z_H2p#=v&pk*X-|A%;W#6X8)?#k9ti5;K4wEjR%GT;04?$qz6y}{@+}t;be@J;S54@
z%5m=jV0q5~+th6~gwxOO0G$N5hg|U#-n`XZvMZ7%A9N&!g*R(_@E@~7#W-4XQe(G^
z($>HRN%mKQqLzoaD=!rzlh^x
zAm`Zl73QmY_8{4$H~I?Sq!%)mJlb-@mnK+eFKLv`ztGb+dXe9&V|rYfsk2`jVu;Vr
ztk9iO8SWtX@`xqOV5#oZRY7drMje&XZ9J5GbUKV5W&XvkA{|qxA=tEG3H(^IF=Zn~
z&P6y9+J(d&K;THkr{3ku=7BYOudRu_U3J;)%z#%xde18cVr7ZN+}X^%3yT#jzecSi
zu#Wi0!HZETf`@0-&m{MZUDZimFGEwVNIRe$l_o>-Q;r$1VkF->ea;h(1ZD
zs6Vfb&TT-h@g`Rk|w>x!Mi2$cDjP}iDd>*`u@CD`C;YR1B4+0A!ezV33
zs@tDAlslN>$X{OwVe>Mscn(75hD-}C35t{>`D>t2PPl6!+*Db3@)9;&-2t4#E<;oR
zC&tvlV?0a_V1h?4G#-s|nJw+mqx5o27f0~q!Kyp<<@P@Et6uCY7vUqNa9ZK?(TiB#
zc(-&^e!+gNnU)hU>5W5bi~`rzX%F$G#(b`3eI{rnIq@@;s<72GeU~fexCkwYoSQR4j(QkPUO{V>pQ-!*>QTa;Ah3YWH)3yYycO?nw`G}3PUlBcTg)OyX
z(&Mn|OowB@tmVd|E!?oA?4s+J7snaboEPM-NA#lJF4mbHw85E97^80j?*JUjY-qia
zs71#T9B7H!Z@D=Fj*x;ht3rHu(5^v8+@1&<*)G$vDtW*KGs%|gDep&%1?`GBsE3l3
zvp7Lde}GcDXjpWG>a2Fd90dwv>z2Hcl4zK&3Ob`cw0Rcv=}h?~rwETJp8i{oZR%bg
zGPhw3v_sy2XS{GzI~*(}%MCYn?P4i{(lX2q)sp^-@Y%%CmtX~EM3$d=z;WhAo7f!a
zs6$YVoDBR=q%}Lf;wN>Eb$MIlc1%cU2@DjzjaI{hTv?lC8kHYj8t--$wr)n`dNt2|
z;ke|E#$8%&W+GWN8eHCVgc6Stp}z~iV#o9@(WW>cxotr%J%9?HGCctB&x@M1qh5TX
zkv)GakRp7dI(!C(x9$V%#$msayrk8xi~pg$Lx&Y0=6Vot`A_Na5?>C%;B-MN!ora4VXr1e$mG<9yl*0KLAxkf
zbVX|Cp_r)rq>1j(&380VP^2+wR3q0mU6nPLSzW}1KuTjoOjiNDs*63F6}epHqHtK!
zJx`{I>agTOPJ`2wvm%RVVt0#aa;4x9&0*5o&=)DW3X`H+RHgd_vb8pGWe1iLY)#gG
z0rJ}UC|nl(qWFN%mv7XZ=2;T1*k|450Obzk?J^B@St}Aks#jiexj~aC5w$VX&l*t<
zYvc}Nx(9I`JQXff?F;)09WsqM>;q}5a2YX*GNx2oBsJzH4l$QDgO|
zlAhYf4b6ds0A@{8<7V8Pp-NmZLcd#V{v|W?ya4VAlbftq5v#S_<05u84Xmp~=k5?L
zDHp6ocjSw=DRnBL8`=J5a-Acz%TPcS|<{5O$!9DF9+WNO61LMoCxVP99TP>*v6X;Lwu)Y
zJ$dF>nhQ6pSqZ4G%*usxxSV*R2S%uC;~LZANWVl&H6Yu$u1xnHI(IV}*{2}kw)yTJ
zUkly=yc!*j_p0XwrtbhIbm>Sj>#iAl{8+oGj;ahG$1F#h!VV+d^B5PJ#xc{kX%?A*
zTh-a52GQ$$iAyMwb%wbg{*ii!96kkb@Q+i|9iQ0C<Tv*Qgn@5z1(ZDR;)|izvu4W8uW@STgbYM
z)oB*GkBi>|bfYW6dfbxyqD^B(=|$@NGj}ZUTopgPiWoWP#6rEk^(E4nk9w2^)$~y_
z#3oovgS#WkNk}pyF6a=bGX=;$wg~GdGQz{Rl%n?t*Fa$YK
z`zsChR4BJz?^uUka4yXpK)aA0ig@RBly0kN`0D7`;?!D(cboeyGAu4deqk$a3ZSa7
zx1z=H2%yYl`0F9m<@m%|Ze!pIR3|Tlu@fGPrGpcdtnVoybAYimf6mOj+Ds3xkFaWP
z9N$$B8SfWhuns}i(Mao8-wt{YcVrjp%uCJb_zmAGgr_5eu3?uWs^U22rg#W_PpyDG
zdnaK0d2>|Bbzbn)3y##w=b`FK6fT5qB9zm!)v|6P*sQA!qFtGB=qChxF)4u?A=$D
zc)xD3mw?ZyAkFe+NlJ+C`C5jnU-_FQ%MKmz#R9|I{$`|8cW-yFYw{&&o3`nuIMX3D
zT*siH{ih98)*cc2-s>g9};>1U5Xt
z5wa;1xMLFf^M7l=T#|T8bo+^Qp8fE=GZ*bu&4}$FibDV|%7wLpzjA_fZHRPLC4pf#
z@wI3UU662Tc`J0mIWF;{o-vg4}e5}nIe3Jvonp+?R!eO2Q++F4X!w@nCG&iwgop&
z&=qpk=GwWQ&vfjr!sTIP*Z`I+SMY9pg#j*8gu4}a$~%mMIfEHn@unOl-WIP%_Jq}dcur<%vY~!-~)I#&_NCb
z__X@%I62EVde+}(8NPYv7DgAy)9m}VzQ$9vdV)7IoGG23y$?d!1ru*Z
zLu8g?bifnOt6qPS9&ZP+IdXa7y3w+|ZiJT(rI*B_0CNcXPE2~(#%VfwaYh|3hUkrk
zR1$Vyro^EjyJf}gg%&ebg`$kK#)X`dNyh7EbpnyEH*VBA$|5+KVQUyF;yuQ3IbjLk
z+u_2O!u5a7NX97wSnn%_pf
zHho%c^yVY6pe`6yHca7{Y>&b&GC^q4WZmZEEe2YSz0A_N9C=g45hG1F`hg|J4*|T!
zM!`%UG{u;bzhV!r%TG;h3Q{w2^smGogX1k~FpYy-cc3CxxbzZ}iz7NJPL$?fJk_J&
zrxKwL%E!8DCB)uQz7ypN*WH~Rq3)=bNr*niN!K6Yiw}ofm-HakQxwR5Oyfm>G9s|=
zb!xBFbFifDrsztZxUIoA;tnEB$A3h=YQ-JIeS3vlmo-L>aJ=-F|9hJ0m^&
ze>HNDLaX@<1N;Z1O%A
zbCH62#`QU3czg;6SA+=eaNcQ=Gq-Rh1ygs8L)S?5tIdn3L;jQ*Hhq{j@18Zkf3DI>
zUx0`Z`#HiPSC8oEm60!L!WC@7@mnFZ0t+&;p2V%UrwjAidN*szUum_Bz=KU~Gw9`n
zh{C{k(j2^9Upu5d;(;w&mLl-DQNHGU-BY*Ni(X$rNAfao?P+%Sj2k|tiF!-7qS=l%
zvZqLWlIv0Zrr#r_vy(SO49|CR#SmIZsg%ln7~jw7RYX6k4zf$)c_V_(ghDQNa?KvE
zR-mT;fv!r6mfQetV1PX(XA6L%Vpm!|@+Dx&N&khIPImBTbav}#uYs2&(eFdCUBs|-
zMv%haUvGcFvf+HB1Gb1b&G2YkH>f6=Fum?_^pNbty@tdIKT5rBWq_xO&WKi(0^`G*
z?A!~e4^O`GZ*vhiN8j$4&I4QV&w-SaH^Cu=z?-)kcmX#e`F<1IXla}3DcCrg>RErg
zjp6&m5j_~N`IbKT+Z*1x(hACxp|=rH+i!zBi6q|QGt59;nbW)c5>DUGE0G@aYFGCe
z*xe!sYCZE@CKP0dv!@Qfkd~FPulB$lh(>`!7d8j`}CJvgUgbrB}A(d|LA}5(86nde&w2
zVtlMF@8$`O8(;au(O`5hcrL#HDt|hDN;t$vD#D)CF_7~MLK^&->6M;|J=$Q=uNQcDMg=Dko_<8`
zU7GrV3Fh+5At!M95v}BE03`w1rT|SK_?)FbfeV+evZQi_$y}w2~y?dJS
zshmbQv{+6zHa$#S`#t8#dm9qTjmJg0Qg?vy@m<1;>;puLhrOU|c-fuWfFhy<%98*9
z4e~>te=P8Slj@HZZK8B=5Xw{l@V)=tDQK`P0H`&Pi#Ln&t%eqfvvMC%awMs2I3*D4
zaYV(XbUwW@Hd<&}&!)E7r1ZbLl5hCnEv(L1kz<&eXDo+}kH8}X>2`Hv3>MJY)k=px
z)Pn!0dTvA1xua78=4cnKAYF)sAu!XTXsREZ=4B*9^d~X)S5!L5Hs$-K6r-B9AI2}6
zLFOXz5Ix_yVB^T$a4&JP1ZUXSlG?*yuL*nGVPV4NlwRvT3C^!^6kuG0XkW4s?pS0kIoA>`}!5`WmG}sydJX#QP@yg=>dEH!r+mA;21C0l37@Y&c
zRwcrWu7EzetFvbg2A4zPquT?6_&M6X?SMFLVX%UHNbe!}gB8QYni=|<)K{jvdr~L}
zvte2jbWQPS14N@W35{
zp{A7WCc>&|#{cZ*Ru30U&qM_{Rm6D<9?Hg3c?dk8Ou2%d=NkvsU
zJV8%SKS3=+^I39Wa7=bUc7(o%UY7Pr&tM<*kgSm5^YRK9N!lln<-0+qCt6YosiWmm
zeyPc2$!W=XS#@P~!8~fCB80sfoZp(@&wbxBtMExXPyiqR=&XVaG-v->A=9$7{MPaP
zuj+o28vwAYC~q;%fb5o1dG~tF$k`AfXc#8$1qM7L3?*ustKAA*nf`8%-N>+Jv*h#P
zQV}sJXFPhBjjK2IO~-R(2{B0|?5`+-2_WV^$?)-Yi->)|he$AVI^rf8u%@kjiX+lW
zpk|5YcH5yeuKW4}xaemuy9}aJ9^B{K%jkBq>gg&Oj~VT{xdZGZrNeu$A3t`Res@+m
zu?0`r=|K$()-nl?J>ecxC02QlLorF6XQ?yyMb~CSA3+cX-R@b*
zRghBboPJz5<9Td^C9#f4qBvI_HGWu>BV@zV=guMtLVeI|L8+11dT*CJ(HFJhQXiSg
zS76k*m^en)ALjes;yzU^Sk{3L8e;85LkB%csP5hj>%$Bz3s>&t<*R;Q
z=fRl$SgQ8T+w2`M7BG!S*Ul_q{e55dj`>&1tJIio$f2V9sbZUyJ#|rPSE=cW0{)8Y
zjR-j+&Y~=c;2Eb{FbT7dqi+uL$%xp*3r&SDa2DZb=9o-lwn)QHU}xFszV7izq)Cx2
zub{u=*+(s`x9D{!8If{)Bph}4BvsWWH6CQ#urJD`@=N6VzBQK9J@{i?@>k_v8%j4|
z8mYA%@^6e!#>og_Uu4j)tm%I_?tb}{r2$?v;7nHwoRWljN%wM99X9_);~+^izW*e}
z*@H6%rsL{W6_yUD#PZ<+8r~sUxmrWtB-;4E+TdYS82jq0dFDwxO_8gD%kCQ9?K<9i
zQ@T_7nqCs7B?3f+!;8=&1#|vIiM$+L*B1TBU?q%etBMF^)9b;lrw_VxpPJQV<@-a{M`EDg@TRf4%rrFIhi+fRVx3s2^`@;$q^#SMjgS05RU3+
za9{J|QFwD+%fTdyK!cDcun3Q~>nxV2smtr>M>u$t95F0D(FBG#s(0orXVHH#)7Z}+
zVHIjsfeJENTK_P`wBCV$VGr|YREsTKaTdy`B&bUsc2~R)w#s18NaZObl(VfonvF^F
z!X7K$T!vakztU|T&8KiSb5#BS7@W8?h$7-grL(c(u>0*yZ*38-MAc8*$L4^sv=4~W
z?}C>J3n)qnp!xf=_5Qa8#X;d(CZLS)K6f7vp(;(ydqkAj@H`mU<*f)sOS&pl>8Z@-
z_BIY4zsv^fv~XPDG77Jjb2um*>U}!r!uo#s_;pOUdw98-DoPcW53Z2|HM8U(E#zQy
z_^7)r7zDoc>msZuj3y=&PY-6F$Q=au`f>zW71fuOIJrVFUmbeW2
z5>L3p;|;M;R`X!2bNp$>nC2HzM*_MzrI~Lfs$j2*7g0fUeB&)6kOom7B*{v)}BtDCejp!*y^T_F)q6c}xHXO2QEG)_TzQsFkhZOOOCKO-C3Zq`((
zdJ@5J9)6tY8^PM!#i^J|`-(!6yR8yU2V5nxZnOYJqt9RnnRKIWz){{9dx@KkOaI(H
zjvBBHqf*<(ClNNBGHp_R>*%#Fp=q9RHzv<%$4ZBF3Vq$+4(Zlh;z
zqxr(oQqNlboASy@{t7U>ut@{Dd;pe#5a0$)KP5q+GtM8+ir;;|?`NdHC=sOrK6La0
zt=2c!;UCE!I7a*D1S9anwQP(m%pdw_CPV`87GO43;KvjH$PWBz4Cos5jqv@TvtN#r
zWBd`0dA~rv$BhCj_8Z)f1C{UN?jOqiqktpuzr}su>EJ9@)tqC5a&4Ha6T>_h*0C?sc
za9{DCQXp`y_$S);=J?)q-xn5Ho>nU|833^30&)*g1JsTCi0^&YeZ&!5cXJ*o03dI8
zAMus#&xr48a38V!q_g&d8~`{-zK;;)Rj%Lf<_>Zf{q;)*!1Dq*Pi83_a+e=f&^
z3aWkfnST^`iqdY${kmXtJivHRLuUw_uyKKm;->oyBIySh531qo+th_
z?!mFb{Vm0Q;E>Y)8u#$H;rEuIA^QQ|Pj|>4y7+q&_Iq+`&fg*b-&nKm+`mKqeb0P<
z%a?-}m3YCpQ8;
zGX7`@B8(i$=@Quf25v@zeD~hF8sdD|2=xJ@^7JkfA8Io
zSpHG!@v1-2_v4rUDBSOZt$q;HKY;u$^y+>M?>kiefHd|0QH)>QtL|sN@2c}7d&b}&
z*?)1|xu5;MC&-WNoEf!t9tBV*6*$8uj`#Zvl=IUX8o%~_Y3puYU9rU_sO4Be>4r|J||WK?D2iwExc(r@8x-2ZuJl&SU=!*arF+{c8dBpR?L>k`TZHKY#}X1HV*&
MlQvOHAi&@L4?Hc20{{R3

diff --git a/docs/ocm/OCM-Implementation-Model.pptx b/docs/ocm/OCM-Implementation-Model.pptx
deleted file mode 100755
index 7844eccb42f7a57bf4e3a32c8b670d1cb6fe4303..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 69675
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

diff --git a/docs/ocm/README.md b/docs/ocm/README.md
deleted file mode 100644
index 4e959d7f4e..0000000000
--- a/docs/ocm/README.md
+++ /dev/null
@@ -1,80 +0,0 @@
-# Open Component Model Specification
-
-This specification is divided into three parts:
-
-- Layer 1: The [model elements](model.md) defined by the Open Component Model
-- Layer 2: The [abstract operations](operations.md) , which must be provided to
-  interact with those model elements stored in any OCM persistence
-- Layer 3: The [interoperability specifications](interoperability.md) describing how the model elements
-  are mapped to elements of an underlying persistence layer
-  (for example and OCI registry)
-
-
-Structure of OCM Specification -
- -Layer 1 describes the elements and data formats the Open Component Model deals -with. All client APIs MUST provide a binding -for the mandatory operations for the client code and SHOULD provide a -binding for the optional ones. - -Layer 2 describes the abstract operations, which handle the persistence -of the described top-level elements. All client APIs MUST provide a binding -for those operations for the client code. - - -The OCM specification does not explicitly describe a dedicated remote API for -interacting with a repository conforming to the OCM specification. -Instead, it focuses on the mapping of the OCM functionality to an already -existing, common storage backend, like the OCI Registries. - -Layer 3 defines how the elements of layer 1 are mapped to various -storage technologies. The border between a client tool and a storage backend, -and therefore the interoperability layer, is typically the API of -the storage backend. - -This avoids the need for a dedicated OCM server infrastructure. Client code -includes a dedicated binding for the supported storage technology and -an implementation of the specified mapping of the OCM elements to the -storage elements. This will then be encapsulated behind a common binding -of an interpretation of the layer 1 and 2 specification for the dedicated client -environment. - -An implementation of this layer for a dedicated storage technology MUST -implement this mapping by supporting the mandatory abstract model operations -defined in layer 2. It SHOULD implement the optional operations, also. - -
-Alternatives for Language Bindings -
- -There are two basic ways how layer 1/2 and layer 3 can interact in a given -language binding. - -1) The left diagram in the above picture shows two independent implementations - for two storage technologies. Here, the consumer code has to deal - with different variants of an OCM conform API to deal with different storage - technologies. This is a valid implementation, but it makes it extremely - difficult for tools on top of these APIs to work with different technologies. - All tools have to implement this technology fork on their own. -2) The right diagram shows the preferred solution. A *generic language binding* - for layer 1 and 2 of the specification maps the operations to an internal - *Provider API* that has to be implemented by a dedicated mapping - implementation. According to information provided by a repository specification, - which is already part of the OCM specification, the fork can be implemented - transparently for the consumer code. - -This way, all appropriate clients can interoperate with all instances of the -supported storage backend types. - -The binding provided by this project offers a general client API conforming -to layer 1 and 2 (package [github.com/open-component-model/pkg/contexts/ocm](../../pkg/contexts/ocm)) -and a provider API for embedding different storage backend mappings -(package [github.com/open-component-model/pkg/contexts/ocm/cpi](../../pkg/contexts/ocm/cpi)), -which will then be available for the generalized client API. -Mappings are provided for the filesystem persistence and for OCI registries. - -Layer 4, as shown in the picture, is finally out-of-scope for this -specification. It describes the storage-technology-specific APIs, which -will be used as basis for the OCM mapping specification dedicated to -this storage technology. \ No newline at end of file diff --git a/docs/ocm/interoperability.md b/docs/ocm/interoperability.md deleted file mode 100644 index 5b5afeed49..0000000000 --- a/docs/ocm/interoperability.md +++ /dev/null @@ -1,68 +0,0 @@ -# Mapping Specifications for OCM Storage Backends - -The operational specification of the Open Component Model restricts itself -to an abstract set of operations an [OCM repository](model.md#repositories) -must support. - -It does not describe a dedicated -remotely accessible repository API (like for example the [OCI distribution -specification](https://github.com/opencontainers/distribution-spec/blob/main/spec.md)). - -The model is intended to be stored in any kind of storage sub system, which -is able to store a potentially unlimited number of blobs with an adequate -addressing scheme, supporting arbitrary names. - -This is achieved by specifying mapping schemes for every supported storage -backend technology, which describes how elements of the [component model](model.md) -are mapped to elements provided by the underlying storage technology. - -The OCM based tools used in a dedicated environment must use an adequate -implementation of the mapping schemes required for the storage technologies -intended to be used in this environment. It finally has to implement the -[abstract model operations based on this mapping scheme](operations.md) - -## Support Library - -The standard Go implementation provided by the project, provides a general -library supporting mappings for -- a filesystem representation -- an OCI based representation - -The library encapsulates those bindings under a generic and extensible interface. -Based on this library, a command line client tool is provided, using this -generalized interface to implement typical tasks to work with the component model -in a repository type agnostic way. - -This kind of generalized interface for the library consumer is extensible and -makes it possible -to add further mapping implementations just by registering new -type objects with functions provided by the library. So, combining this -library, the new/local type implementations and the CLI in a new executable, -can extend the existing generic CLI functionality with the supported new -repository types. - -There are several such extension points: -- repository types -- access method types -- specialized artifact down-loaders (for example foe helm charts) -- specialized artifact digesters (for example for OCI images) -- transport policies -- credential repositories and types -- signing handlers - -The provided library already supports a usable and consistent set -of those elements to work with filesystem and OCI registries with -dedicated specialized support for helm charts and OCI images. - -## Mapping Specifications - -Mappings are already specified for the following storage backends: - -- [**`CommonTransportFormat`**](modelmapping/filesystem/README.md) File structure stored under - a directory or in tar or tgz file. - -- [**`OCIRegistry`**](modelmapping/oci/README.md) storing OCM component versions in - an OCI conform registry - -- [**`S3`**](modelmapping/s3/README.md) storing OCM component versions in an S3 blob - store \ No newline at end of file diff --git a/docs/ocm/model.md b/docs/ocm/model.md deleted file mode 100644 index fe18255312..0000000000 --- a/docs/ocm/model.md +++ /dev/null @@ -1,637 +0,0 @@ -# Elements used by the Open Component Model - -The Open Component Model provides a formal description of -delivery artifacts for dedicated semantics that are accessible -in some kind of repository. - -This leads to the following major elements that must be specified -as part of the Open Component Model specification - -- [Repositories](#repositories) -- [Components](#components) - - [Component Versions](#component-versions) - - [Artifacts](#artifacts) - - [Sources](#sources) - - [Resources](#resources) - - [Artifact Access](#artifact-access) - - [Labels](#labels) -- [Repository Contexts](#repository-contexts) -- [Signatures](#signatures) - -Those elements partly use further sub-level elements that are -defined in the context of their usage. - -## Repositories - -A *Component Repository* is a dedicated entity that provides technical access -to the other elements of the Open Component Model. - -So far, we don't define a repository API for a dedicated technical native -instance of an OCM repository, because we want to use existing storage -subsystems, without the need of running OCM specific servers (Nevertheless, -such an API is still compatible with this specification and could be defined in -the future). - -Therefore, a component repository is typically given by a well-known storage -subsystem hosting a content structure adhering to an [element mapping specification](interoperability.md) -for this kind of storage backend (e.g. OCI). - -So, any tool or language binding can map an existing storage technology into an -OCM repository view by implementing the [abstract operations](operations.md) -using this specification for the dedicated storage technology. - -If required, an own specification for a native OCM repository (similar to the -[OCI distribution spec](https://github.com/opencontainers/distribution-spec/blob/main/spec.md)) -can be added. - -## Components - -A *Component* is an abstract entity describing a dedicated usage context or -meaning for provided software. This semantic is defined by the owner of a -component and subsumed by the component identity. It is technically defined -by a globally unique identifier. - -A component identifier uses the following naming scheme: - -
- -*<DNS domain>* `/` *<name component> {* `/` *<name component> }* - -
- -Hereby the DNS domain plus optionally any number of leading name components MUST -be owned by the provider of a component. For example, `github.com`, as DNS domain -is shared by lots of organizations. Therefore, all component identities provided -based on this DNS name, must include the owner prefix of the providing -organization, e.g. `github.com/gardener`. - -The component acts as a namespace to host multiple [*Component Versions*](#component-versions), -which finally describe dedicated technical artifact sets, which describe the -software artifacts required to run this tool. - -*Example:* - -The component with the identity `github.com/gardener/external-dns-management` -contains software versions of a tool maintaining DNS entries in DNS providers -based on Kubernetes resource manifests. - -Hereby, the prefix `github.com/gardener` describes a *GitHub* organization owned -by the Gardener team developing the component `external-dns-management`. - -### Component Versions - -A *Component Version* is a concrete instance of a [Component](#components). -As such it describes a concrete set of [Artifacts](#Artifacts) -adhering to the semantic assigned to the containing [Component](#components) (by its owner). -It has a unique identity composed of the [component identity](#components) and -a version name following the [semantic versioning](https://semver.org) -specification. - -So, all versions provided for a component should provide software artifacts -with the semantic defined by the component. For example, for a component -pretending to be a Kubernetes DNS Controller, all provided versions should -provide versions of a DNS Controller, and not an ingress controller. - -A component version is formally described by a [Component Descriptor](#component-descriptor). - -#### Component Descriptor - -A *Component Descriptor* is used to describe a dedicated component version. -It is a YAML file with the structure defined [here](../formats/compdesc/README.md) - -The main purpose of a component version is to describe a set of delivery -[artifacts](#artifacts). Such an artifact set is composed with two -mechanisms: - 1) Artifacts can be directly described by a component descriptor - 2) Artifacts described by another component version can be included into - the local artifact set by describing a [reference](#references) to this - component version. - -Those artifact composing elements all feature a common [set of attributes](#composing-the-artifact-set), -which are used to uniquely identify the elements in the context of their component -descriptor. Additionally, they provide a possibility to formally enrich the -information attached to an element by using an arbitrary number of -appropriately named labels without the need for explicit dedicated model -attributes (for example, attaching hints for the triage of identified -vulnerabilities for this artifact). - -A component descriptor describes: -- a history of [Repository Contexts](#repository-contexts) describing - former repository locations of the component version along a transportation - chain -- an optional creation timestamp (RFC3339) rounded to seconds. -- a set of [Labels](#labels) to assign arbitrary kinds of information to the - component version, which is not formally defined by the Open Component Model -- an optional set of [Sources](#sources), that were used to generate the - [Resources](#resources) provided by the component version -- a set of [Resources](#resources) provided with this component version -- an optional set of [References](#references) included component versions -- an optional set of [Signatures](#signatures) provided by some authority - to confirm some state or origin of the component version - -##### Composing the Artifact Set - -There are several elements in a [component descriptor](#component-descriptor), -which can be used to compose the artifact set finally described by a component -version. - -- elements, which directly describe an [artifact](#artifacts) as part of the - component descriptor. -- [references](#references), which can be used to include artifact sets described - by other components. - -All those descriptive elements share a common basic attribute set. -First, such an element must be uniquely identifiable in the context -of a component version. Therefore, it requires an [*Identity*](#identity). -To be able to attach additional formal meta to such an element, which -is not directly described by existing model elements, it is possible to -define arbitrary [*Labels*](#labels). This enables the use of application specific -attributes, without the need of extending the basic component model for every -new arising use case. - -###### Identity - -[Resources](#resources), [Sources](#sources), and [References](#references) -have a unique identity in the context of a [Component Version](#component-versions). - -All those element types share the same notion of an identity, which is a set -of key/value string pairs. -This includes at least the value of the `name` attribute of those elements. -If the element name cannot be chosen uniquely an optional `version` attribute -can be provided to assure uniqueness in the context of the [component version](#component-versions). -In such a case this attribute will be added to the effective identity -attribute set. -If even this is not sufficient to meet the requirements to identify -artifacts in the context of the component version, explicit identity attributes -can be defined. If given, all those -attributes always contribute to the identity of the element. - -The element identity is composed by the following formal fields: - -- **`name`** (required) *string* - - The name of the element. In most of the cases the name should be chosen - to be unique in the context of the list of elements. - It basically also expresses the meaning or purpose of the element in the - context of the component version. But it might be the - case that multiple elements should be used for the same purpose. For example, - a component version is used to describe multiple versions of an artifact, - which should be selected for different environment versions for deployment. - Then, they could share the same name, to be able to easily find all those - elements. In such a case the name is not sufficient to uniquely identify - a dedicated element. - -- **`version`** (optional) *string* - - This optional attribute version describes the version of the element. - If given, and the name of the element is not unique in its context, the - version is added to the identity attribute set. - -- **`extraIdentity`** (optional) *map[string]string* - - If name and version are not sufficient to provide a unique selection - scheme, any arbitrary identity dimension can be added by using this field. - If given, all those attributes contribute to the identity of the element - and must be given to uniquely identify an element. - -Using attributes of an artifact for its identity makes it easier to formally -describe the identity and to select a dedicated artifact from the set of -described artifacts. It avoids the need to -marshal a dedicated identity scheme for an intended usage scenario into a -single attribute value. Instead, different attributes can be used to represent -the dedicated selection dimensions. Selecting all artifacts for partial set -of constraints is then just a partial match of the set of identity attributes. - -For example: - -You want to describe different image versions to be used -for different Kubernetes versions and for multiple purposes. With the identity -attributes this can easily be modeled by using -- the `name` attribute for the purpose (e.g. DNS controller) -- the `version` attribute for the image version -- and an extra identity attribute for the intended Kubernetes Version. - -Then you don't need to derive artificially unique artifact names, instead -the identity of the artifact can naturally be composed by using appropriate -attributes. Selecting all artifacts for a dedicated purpose is possible -by selecting all artifacts with the appropriate `name` attribute, without the -need of parsing an artificial structure imprinted on the name attribute. - -
-Identities -
- -Every resource described by the Open Component Model can therefore be identified -by the triple *(Component Identity, Version Name, Local Resource Identity)*. - - -###### Labels - -*Labels* can be used to add additional formal information to a component -model element, which do not have static formal fields in the -[component descriptor](#component-descriptor). Its usage is -left to users of the component model, or better to the used toolsets -looking at component versions (for example: a scanning environment, -used to scan artifacts for vulnerabilities, uses a dedicated label -to control its behavior). - -To be able to evaluate labels used by dedicated tool environments for any -[component version](#component-versions), the same -label name must have the same meaning, regardless by which component provider -they are generated. To assure that this information -has a globally unique interpretation or meaning, labels must comply with some -naming scheme and use a common [structure](../names/labels.md). - -Labels are described by the element field - -- **`labels`** *[]label* - - A list of arbitrary labels described by a formal name with a globally - unique meaning (see [label structure](../names/labels.md) - -#### Artifacts - -An *Artifact* is a blob containing some data in some technical format. -Every artifact described by the component version has -- an [Identity](#identity) in the context of the component version -- a dedicated globally unique [type](../names/resourcetypes.md) representing - the kind of content and how it can be used -- a set of [Labels](#labels) to assign arbitrary kinds of information to the - component version, which is not formally defined by the Open Component Model. -- a formal description of the [Access Specification](#artifact-access) , - which can be used to technically access the content of the artifact in form of - a blob with a format defined by the artifact type. If there are multiple variants - possible for the blob format, the access specification must be able to - describe an optional media type. Applying an access specification always - yields a media type. It might be implicitly provided the [implementation of - an access method](operations.md#access-methods) or explicitly provided by the - access specification. -- a (optional) digest of the artifact that is immutable during transport steps. - -Those attributes are described by formal fields of the element description -in the component descriptor: - -- the [identity](#identity) fields are directly embedded - -- **`type`** (required) *string* - - The [type of an artifact](../names/resourcetypes.md) uniquely specifies the - technical interpretation of an artifact, its kind, independent of its - concrete technical representation. - - If there are different possible technical representation the [access method](#artifact-access) - returns the concrete format used for the returned blob. - - For example, a helm chart (type `helmChart`) can be represented as - OCI artifact or helm chart archive. Nevertheless, the technical meaning is - to be a helm chart, even if represented as OCI image. The type `ociImage` - describes an object that can be used as container image. So, although the - technical representation might in both cases be an OCI image manifest, its - semantics and use case is completely different. This is expressed - by the chosen type of the artifact, which focuses on the semantics. - -- **`labels`** (optional) *[]label* - - A list of arbitrary labels described by a formal name with a globally - unique meaning (see [label structure](../names/labels.md) - -- **`access`** (required) *access specification* - - The [access specification](../names/accessmethods.md) for the actual artifact. - The specification is typed. The type determines an access method to use - to access the artifact blob. This type determines the technical procedure - to use to access the artifact blob as well as the specification of the - attributes that are required by this procedure to be able to identify a - dedicated target blob. - -The Open Component Model distinguishes two kinds of artifacts: -- [*Sources*](#sources) are optional artifacts that contain the sources, which - were used to generate the deployment-relevant *Resources* -- [*Resources*](#resources) are artifacts that finally make up the deployment - relevant set of artifacts - -##### Sources - -A *Source* is an [Artifact](#artifacts), which describes the sources that were -used to generate one or more of the [Resources](#resources) described by the -[component descriptor](#component-descriptor). This information might be used -by scanner tools to extract more information about then final binaries. - -Source elements do not have specific additional formal attributes. - -##### Resources - -A *Resource* is a delivery [Artifact](#artifacts), -intended for deployment into a runtime environment, or describing additional -content, relevant for a deployment mechanism. For example, installation procedures -or meta-model descriptions controlling orchestration and/or deployment mechanisms. -(A simple example how such elements could be used to construct a deployment -mechanism on top of the Open Component Model can be found [here](../reference/ocm_toi-bootstrapping.md).) - -The Open Component Model makes absolutely no assumptions, about how content described -by the model is finally deployed or used. All this is left to external tools and tool -specific deployment information is formally represented as other artifacts with -an appropriate dedicated own type. - -In addition to the common [artifact](#artifacts) information, a resource -may optionally describe a reference to the [source](#sources) by specifying -its artifact identity. - -A resource uses the following additional formal fields: - -- **`digest`** (optional) [*digest*](#digest-info) - - If the component descriptor is signed (directly or indirectly by one of its - referencing component versions), a digest of a resource is stored along with - the resource description. This is required because there might be different - digest and resource normalization algorithms. - -- **`srcRefs`** (optional) *[]struct* - - This field describes a list of sources used to generate the resource. - The selection is done by the following two fields: - - - **`identitySelector`** *map[string]string* - - [Identity attributes](#identity) determining an appropriate [source](#sources) - element. - - - **`labels`** (optional) *[]label - - A list of arbitrary labels described by a formal name with a globally - unique meaning (see [label structure](../names/labels.md)) can be used - to attach more information about the part or kind of usage of the sources. - - -##### Artifact Access - -The technical access to the physical content of an -[artifact](#artifacts) described as -part of a [Component Version](#component-versions) is expressed by an -*Access Specification*. It describes the [type](../names/accessmethods.md) of -the *access method* and the type-specific access path to the content in the -[repository context](#repository-contexts) the component descriptor has been -retrieved from. - -Every access specification has a formal type and type specific attributes. -The type uniquely specifies the technical procedure how to use the -attributes and the [repository context](#repository-contexts) of -the component descriptor containing the [access method specification](../formats/accessmethods/README.md) -to retrieve the content of the artifact. - -There are basically two ways an artifact blob can be stored: -- `external` access methods allow referring to artifacts in any other - technical repository as long as the access type is supported by the - used tool set. -- `internal` access methods ([`localBlob`](../../pkg/contexts/ocm/accessmethods/localblob/README.md)). - are used to store an artifact together with the component descriptor in an - OCM repository. These methods must be supported by all OCM repository - implementations. - -The specification must contain at least the field - -- **`type`** (required) *string* - - The type of the access method. It determines the possible and required - additional fields of the access specification. - - -The content of a described artifact is accessible by applying its -global identity triple to the following procedure: - -- [lookup](operations.md#mandatory-model-operations) of a [component version](#component-versions)) and its - [component descriptor](#component-descriptor) by using its - component identity and version name in - the desired [repository context](#repository-contexts) -- identify the artifact by its local [identity](#identity) (distinguish between [source](#sources) - and [resource](#resources)) -- [apply](operations.md#access-methods) the described [access method](#artifact-access) - -
-Structure of OCM Specification -
- -#### References - -A component version may refer to other [component versions](#component-versions) -by adding a *Reference* to the component version. - -The reference describes only the component version and no location or OCM -repository. It is always evaluated in the actual repository context. -This means, that the artifact set described by the referenced component version -is added to the local artifact set described by the component version defining -the reference. To keep a unique addressing scheme, like [artifacts](#artifacts), -references have an [identity](#identity). - -A reference element has the following additional formal fields: - -- **`componentName`** (required) *string* - - The identity of the component whose version is referenced. - The elements common version field is required in this usage context. - -##### Resource Reference - -Following the chain of [references](#references), starting from an initial -[component version](#component-versions), -any local or non-local artifact can be addressed relative to a component -version by a possibly empty sequence (for a local artifact) of reference -identities followed by the artifact identity in the context of the finally -reached component version. - -The composite is called *Source Reference* or *Resource Reference*. -It can be used in artifacts to refer to other artifacts described by the -same component version containing the artifact. - -*Example:* - -CompVers: `A:1.0.0` -``` -- Resources: - - name: DEPLOYER - type: mySpecialDeploymentDescription - -- References: - - name: content - component: B:1.0.0 -``` - -CompVers: `B:1.0.0` -``` -- Resources: - - name IMAGE - type: ociImage -``` - -The deployment description contained in CompVers `A:1.0.0` may have -the following content - -``` -... -deploymentImages: - - resource: - name: IMAGE - referencePath: - - name: content -``` - -This description contains a resource reference indicating to -use the resource `IMAGE` in component version `B:1.0.0` when evaluated -in the context of component version `A:1.0.0`. - -The reference path may contain any number (including zero) entries, describing -the path from the root component version along the nested `references` entries -of involved component versions to the component version finally describing the -desired resource. Hereby, the `name` is the name of the reference entry in the -component descriptor, it is NOT the component name. If no or an empty path is given, -the resource is looked up in the actual component version. - -Besides the name, there might also be extra identities to uniquely identify the next -element. - -This way any content-related tool can interact with the Open Component Model, -by identifying resources and finally access resources described by the component -model. - -This kind of relative access description is location-agnostic, meaning, independent -of the [repository context](#repository-contexts) used to access -the initial component version and resource. The stored description only -includes identities provided by the model. They can then be evaluated in a -dedicated repository context to finally obtain the artifact content -(or location) in the actually used environment (for example, after -transportation into a fenced environment). - -Depending on the transport history of the component version, the -correct artifact location valid for the actual environment is used. - -#### Signatures - -A [component version](#component-versions) may be signed by some authority. -It is possible to have multiple signatures in the component descriptor. - -When signing a component version, all included component versions are -digested by digesting their [resources](#resources) and normalizing -their component descriptors (see [Digest Info](#digest-info)). - -Every signature entry has the following formal fields: - -- **`name`** (required) *string* - - The name if the signature. It must be unique in the context of a component - version. - -- **`digest`** (required) [*digest*](#digest-info) - - The digest of the component version used to generate the signature. - Different signatures may use different digest algorithms. - - The digest of a component version does not include volatile fields, like - the access specification, which can change along a transportation chain. - -- **`signature`** (required) [*signature*](#signature-info) - - The signature for the specified digest. - - -##### Digest Info - -A digest is specified by the following fields: - -- **`hashAlgorithm`** (required) *string* - - The used digest algorithm. - -- **`normalisationAlgorithm`** (required) *string* - - The used normalization algorithm for the signed element. - - For example, the digest of a component version must not include volatile - fields, like - the access specification, which can change along a transportation chain. - To achieve a stable byte stream for calculating the digest, the component - descriptor is transformed into a normalized form. The method to do so - is specified by the normalization algorithm. - - Even artifact blobs can be normalized, for example the technical representation - of an OCI image may depend on the access method. But the digest should be independent - of the technical representation. The default is to just use the blob digest, - but for OCI images the digest of the image manifest is used, regardless of the - technical representation. - - This is handled by *Digest Handlers*, which can be defined for dedicated - artifact type and media type combinations. All implementations must provide - appropriate handlers for the used resources types to be interoperable. - -- **`value`** (required) *string* - - The digest itself. - -##### Signature Info - -A signature is specified by the following fields: - -- **`algorithm`** (required) *string* - - The used signing algorithm. - -- **`mediaType`** (required) *string* - - The media type of the technical representation of the signature value. - -- **`value`** (required) *string* - - The signature itself. - -- **`issuer`** *string* - - The description of the issuer. - - -## Repository Contexts - -A *Repository Context* describes the access to an [OCM Repository](#repositories). - -This access is described by a [formal and typed specification](../names/repositorytypes.md) - -A [component descriptor](#component-descriptor) may contain information -about the transport history by keeping a list of repository contexts. -It should at least describe the last repository context for a remotely accessible -OCM repository it was transported into. - -## Signatures - -A component version can be signed. The signatures are stored along with the -[component descriptor](#component-descriptor). -There may be multiple signatures. Every signature is defined by its name, a type, -a normalization algorithm, a digest and a digest algorithm used to calculate the digest -on the normalization. - -### Artifact Digests - -Signing of a component version incorporates the described artifacts -(resources and sources). Therefore, the artifact content is digested. -This digest is then incorporated into the digest of a component version. - -Because every artifact is provided in dedicated blob formats, such -a digest can be calculated based on this blob. This is the default behaviour. -Nevertheless, there might be technology specific ways to provide an immutable -digest for a dedicated type of artifact. For example, an OCI artifact -is always uniquely identified by its manifest digest. This can be exploited -for the calculation of OCM artifact digests. - -Together with the digest and its algorithm, for example SHA-256, a -normalization is kept for an artifact. This algorithm specifies the way -the digest is determined. For example, for OCI artifacts, the algorithm -`ociArtifactDigest/v1` is used by default. This behaviour can be controlled by -appropriate digest handlers. Supported algorithms can be found [here](../formats/artifactdigests/README.md). - -If the digest algorithm `NO-DIGEST` is specified for an artifact, -this artifact content is not included into the component version digest. -This is typically configured for source artifacts, which are not deliverable. - -### Component Version Digests - -Because a component descriptor contains information, which might change over time, -a [normalized version](normalization.md) of the component descriptor, containing -only signature relevant information, is used to calculate the digest of a -component version. diff --git a/docs/ocm/modelmapping/filesystem/README.md b/docs/ocm/modelmapping/filesystem/README.md deleted file mode 100644 index 7fe22b51ed..0000000000 --- a/docs/ocm/modelmapping/filesystem/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# OCM Mapping to a Filesystem Structure - -The filesystem structure is stored in a -- directory -- tar file -- or GNU-zipped tar file (tgz) - -The file structure is based on the [OCI mapping](../oci/README.md). -The resulting OCI artifacts are stored according to the -[filesystem mapping of OCI artifacts](../../../../pkg/contexts/oci/repositories/ctf/README.md) -and is called *Common Transport Format* (CTF). - diff --git a/docs/ocm/modelmapping/oci/OCM-Implementation-Model.pptx b/docs/ocm/modelmapping/oci/OCM-Implementation-Model.pptx deleted file mode 100755 index ef2d0291b1cd78e0736cc91f6cefac0f7d5193cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61436 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 WfB<&=005o=e+Ymf>3u8T{`)^ - -*<oci base repository>* `/component-descriptors/` *<component id>* - - - -An OCM *version name* of a component version is mapped to an OCI *tag*. - -The *component version* is represented as OCI *image manifest*. - -This manifest uses a config media type `application/vnd.ocm.software.component.config.v1+json`. -According to the [OCI image specification](https://github.com/opencontainers/image-spec/blob/main/spec.md) this must be a JSON blob. -This json file has one defined formal field: - -- **`componentDescriptorLayer`** (required) [*OCI Content Descriptor*](https://github.com/opencontainers/image-spec/blob/main/descriptor.md) - - It references the layer blob containing the component descriptor. The layer - always must be layer 0 of the manifest. It uses the media type - `application/vnd.ocm.software.component-descriptor.v2+yaml+tar` - - -TODO: decide which media type to use for v3 descriptors. - -The descriptor layer contains a tar archive with at least a single file -with the name `component-descriptor.yaml` containing the component descriptor of the -component version. This file should always be the first file in the tar archive. - -OCM *Local Blobs* are stored in additional OCI *Image Layers*. The local blob -identifier stored in the `localBlob` access specification is the OCI *blob digest* -of the blob. The media type of the blob is the one specified in the -access specification. - -
- -drawing - -
- -## Version Mapping - -The Open Component Model supports version names according to [semantic versioning](https://semver.org/)[^1]. The tags used to represent versions in the OCI specification do not allow to directly use semantic version names as tags, because the plus (`+`) character is not supported. Therefore, the open component model version names have to be mapped -to OCI-compliant tag names. - -[^1]: In addition to the specification of semantic versioning OCM version names may use a leading `v`. - -The following mapping for version is used, here: -- the optional plus `+` character used to attach build information in semantic versions is mapped to the sequence (`.build-`) - -Mapping tags back to versions uses the following mappings: -- the last character sequence (`.build-`) is mapped to a plus (`+`) character. - -## Blob Mappings - -Local blobs with an OCI artifact media type will implicitly be mapped to a regular -artifact. The *reference hint* provided by the specification of the local access -is used to compose a repository name of the form: - -
- -*<oci base repository>* `/` *<reference hint>* - -
- -Without a given tag, the provided external access specification (of type `ociArtifact`) -uses a digest based reference. - -Additional blob transformations can be added by registering appropriate blob handlers. - - -## Binding - -The constants of the mapping are defined [here](../../../../pkg/contexts/ocm/repositories/genericocireg/componentmapping/constants.go). - -The reference implementation of the mapping is contained in package [github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/genericocireg](../../../../pkg/contexts/ocm/repositories/genericocireg). - -The blob handler for the described blob mappings can be found [here](../../../../pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo). \ No newline at end of file diff --git a/docs/ocm/modelmapping/oci/ocm2oci-mapping.png b/docs/ocm/modelmapping/oci/ocm2oci-mapping.png deleted file mode 100755 index c34cab0e202a3996c5be42d3e549990c5e191ebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131054 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

9Hf zz0{D=s>l!AL8)2w;_kW`B1zy``e&;P2l@uT_yf@oZ~#_sHpqwyncc?Q`PzRjkm$Tq zOFQK6e{cxU8R@Vp``UIABiJX_`y|ER{|h4oRUGSD3F_$<0_^jY(f>!_s2nUQT!KG~ zirU-VlH8rc@(nFHbFjdnHiL!Xu>sYCYEo+U|4`uk$jQ%WFknlu-2H3vilF3bI0ikP z^7V<^UVX`sR6hgL0)LuAb`UwXG#b|dmwY{R-ygK3`-=bJQT(VS){j#U=TSc-CG1h` zJh1MC1d3gl;BBI}kQBXIzK67O3OpP?U{&}kd}~S3&H}tsH#CtmTXc1)uBjQ^$@|6X z#y@xTlc-2Lx^k8<%U24Xzdt%;+?1yyVygP{!#A(yQrdNf>C&jYI{>^}?K&4S(*w65SzpZufe zt%Jx$g=zq%3)TQ&CA+SH0rBYJQZS<4?PJO%2{|c#7TGiQc8;?qk7B5znt9#~4qwkv zUh#Ox--lc;c4g`)nk$^NV4+1*lS8MORzUSfQ=WLK9~-5gnhljQE?N$La+k${HyoUq4#D6;$XtZofJ&qI>X-zc z7S-QovuoMIt10tK*mi?Er&ZUBU*_4iLBDt*JM=S{;9I6bb6A}K(;2qwO0-CO?$89S zAgE|K3aZv7Kar$9)NZ$|MCl^_CN9eu#jf_s&D=y zk(i7)%l?On7e3Ak-w9372UE2MVD&Q+Lz=7c7Y98`=;>iNn>Yly;8GMdBV-kxB8_Z zDufKy;;`nt^-#d8%XCiW{0iTpm2UpY7NmyG{I zIkPO^nS<$h`;s~ST20{qI_EwGU(%l(K!0?0Um0HS4u{hZhfNNLuN@5cU51CzXdQS? z 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 - β”‚Β Β  └── __versions__ - β”‚Β Β  └── - β”‚Β Β  β”œβ”€β”€ component-descriptor.yaml - β”‚Β Β  β”œβ”€β”€ - β”‚Β Β  └── - └── github.com - └── gardener - └── external-dns-management - └── __versions__ - └── 1.0.0 - β”œβ”€β”€ component-descriptor.yaml - └── sha256.1d4382e73dc767efc4f3cf43cb970d09104ea26301fc1495244c11e2ad45639e - -``` \ No newline at end of file diff --git a/docs/ocm/normalization.md b/docs/ocm/normalization.md deleted file mode 100644 index 90727c851e..0000000000 --- a/docs/ocm/normalization.md +++ /dev/null @@ -1,280 +0,0 @@ -# Component Descriptor Normalization - -The [component descriptor](../formats/compdesc/README.md) is used to describe -a [component version](model.md#component-versions). It contains several kinds -of information: -- volatile label settings, which might be changeable. -- artifact access information, which might be changed during transport steps. -- static information describing the features and artifacts of a component - version. - - - -For signing a digest of the component descriptor needs to be generated. -Therefore, a standardized normalized form is needed, which contains only the signature relevant -information. This is the source to calculate a digest, which is finally signed (and verified). - -Like for signature algorithms, the model offers the possibility to work with -different normalization algorithms/formats. - -To support legacy versions of the component model, there are two different -normalizations. -- `JsonNormalisationV1`: This is a legacy format, which depends of the format of the - component descriptor -- `JsonNormalisationV2`: This is the new format. which is independent of the - chosen representation format of the component desriptor. - -## Generic Normalization format - -The generic format is based on a data structure consisting of dictionaries, lists and -simple values (like strings and integers). - -The signing relevant information described by a component descriptor is mapped -to such a data structure according to the format specifications described below. - -This data structure is then mapped to a formal JSON representation, which -only contains clearly ordered elements. It is marshalled without white-spaces contained -in the representation. Therefor, the resulting byte stream is directly defined -by the inbound data structure and independent of the order of marshalling -dictionaries/objects. -Its digest can be used as basis to calculate a signature. - -To map lists and dictionaries into such clearly ordered elements the rules described -below are used. The inbound data structures in the examples below are shown in -YAML notation. - -### Simple Values - -Simple values are kept as they are. - -Example: -```yaml - "bob" -``` -will result in : - -```json - "bob" -``` -### Dictionary - -All dictionaries are converted to a list where each element is a single-entry -dictionary containing the key/value pair of the original entry. This list is -ordered by lexicographical order of the keys. - -Example: -```yaml - bob: 26 - alice: 25 -``` -will result in : - -```json - [{"alice":25},{"bob":26}] -``` - -The values are converted according to the same rules, recursively. - -Example: -```yaml - people: - bob: 26 - alice: 25 -``` -will result in : - -```json - [{"people":[{"alice":25},{"bob":26}]}] -``` - -### Lists - -Lists are converted to JSON arrays and preserve the order of the elements - -Example: -```yaml -- bob -- alice -``` - -normalized to: -```json -["bob","alice"] -``` - -The values are converted according to the same rules, recursively. - -Example: -```yaml - - bob: 26 - - alice: 25 -``` - -will result in : - -```json - [[{"bob":26}],[{"alice":25}]] -``` - -### Combined example - -The following snippet is taken from a real component descriptor. - -```yaml -resources: -- access: - localReference: blob - mediaType: text/plain - referenceName: ref - type: localBlob - extraIdentity: - additional: value - other: othervalue - name: elem1 - relation: local - type: elemtype - version: 1 -``` - -normalized to - -```json -[{"resources":[[{"access":[{"localReference":"blob"},{"mediaType":"text/plain"},{"referenceName":"ref"},{"type":"localBlob"}]},{"extraIdentity":[{"additional":"value"},{"other":"othervalue"}]},{"name":"elem1"},{"relation":"local"},{"type":"elemtype"},{"version":1}]]}] -``` - -formatted with white spaces for better readability it looks like: - -```json -[ - { - "resources": [ - [ - { - "access": [ - { - "localReference": "blob" - }, - { - "mediaType": "text/plain" - }, - { - "referenceName": "ref" - }, - { - "type": "localBlob" - } - ] - }, - { - "extraIdentity": [ - { - "additional": "value" - }, - { - "other": "othervalue" - } - ] - }, - { - "name": "elem1" - }, - { - "relation": "local" - }, - { - "type": "elemtype" - }, - { - "version": 1 - } - ] - ] - } -] -``` - -### Empty values: - -Empty lists are normalized as empty lists - -```yaml -myList: [] -``` - -```json -[{"myList":[]}] -``` - -Null values are skipped during initialization - -```yaml -myList: ~ -``` - -```yaml -myList: null -``` - -```yaml -myList: -``` -are all normalized to: - -```json -[] -``` - -## Relevant information in Component Descriptors. - -A component descriptor contains signature relevant information and -information, which may change. For example, the access methods specifications -might be changed during atransport step. - -Relevant fields and their mapping to the normalized data structure for `JsonNormalisationV2`: -- Component Name: mapped to `component.name` -- Component Version: mapped to `component.version` -- Component Labels: mapped to `component.labels` (see [Labels](#labels)]) -- Component Provider: mapped to `component.provider` -- Resources: mapped to `component.resources`, always empty list enforced, without the source references (see [Labels](#labels)] and [Access Methods](#access-methods)]) -- Sources: mapped to `component.sources`, always empty list enforced, (see [Labels](#labels)] and [Access Methods](#access-methods)]) -- References: mapped to `component.references`, always empty list enforced, (see [Labels](#labels)]) - - -### Access Methods - -Access method specifications are completely ignored. -A resource/source is ignored, if the access method type is `none`. - -## Labels - -Labels are removed before signing but can be marked with a special boolean -property `signing` not to be removed and thus be part of the signature. -The structure of signing-relevant labels is preserved from the component -descriptor version `v2`. - -Example: - -```yaml -labels: -- name: label1 - value: foo -- name: label2 - value: bar - signing: true -``` - -`label1` will be excluded from the signature, `label2` will be included. -The label values is takes as it is, preserving a potentially deep structure. - - -# `JsonNormalisationV1` vs `JsonNormalisationV2` - -The `JsonNormalisationV1` serialization format is based on the serialization -format of the component descriptor. The format version fields are included - -`JsonNormalisationV2` strictly uses only the relevant component descriptor -information according to the field specification shown above. diff --git a/docs/ocm/ocmaltbind.png b/docs/ocm/ocmaltbind.png deleted file mode 100755 index c64e27b4f1b8035d1c4d21af3c9a8cd7a4385c9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 414074 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

    WjxsMGsGqVNaEE-ei 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

    =-h1@-s08b%nX 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%0Ap6W2T^?h)=(g%u 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 diff --git a/docs/ocm/ocmresourceaccess.png b/docs/ocm/ocmresourceaccess.png deleted file mode 100755 index 233d7fe629ccc37a6c85685b9340d17c99c6570a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243837 zcmeFZc~q0v)(6bJ_SW`Vq*bp2W1U3>WQd4NtvCh&CCU({YGg%i0Rlw`7$9J)hA{*~5)cxi0*OpX5t0BQk0)uo?(3O;GP=a>b4{SD)O;)qsxr~U}| z=ab-XUB1=Qs!Uxof8ihC|Ie?S^u}muSv=SL{B6%Ac)ymGnsn;ux96_;j|;-fApQ7F z(IxC1h3k%eQuyOP|M`zQKYsG$#+Q3cdlYY!w1Xv6pCV4~INA-3FlNwL1I_VlYx>_- zL$tqVJaE$g#O&)Zr+-7Y?fv#7VSrzyz@(qtbtiG_gR~>>w9WP)5B#fW?MwTnsgBqN zshkL@3gQg}%Wd*gryodj>A}o!9^6u#c0HaoyA#m)f7kzU;Qx0Vush&*EuD4gV^KCg zI3k{=Oqu;Dh4#r?LS(#0jL=1*%s;<$OK)8btYw9K#i#5L|26^kC=6zR`TRL~T6Jtw z+RW^#rMKpsEGO@N^m$fg$4;$c@Oy{+h@|$SvPz@%e_mHAj&`56I$Nl34J&*ZJShk% zKXm?wW0JbGXL5W|M9t#dFIj1PR_5(pLkT-;SG&*0EM4T87kT7RkJZ_14uKDq=zitW zl0+S%C5_cyld}Up>zbQgb*T1Q!tg-9vx;UUGwdO*Q~dJc%v{y+m;Qf}p!sd;YIU?4 z<CGimY%hS>I}O~=lBJ!PRev=3M=FIdW(YU@a^)yFBx{l{LxqM3Cz^ytnO=R zdS-tNq7mV{CBnSFnI0R-wHLG2Yqox-uQpA&Aof@?_-)>y;Hk+AMF#_h7&o;1bs1uJ55u-MXmOa`uP~ZVq-{FXi}B z(suHcUk>wjt#dr#bC-T)zRG3+Kg#lp-}uRr1zgKH`j{LVb2CkpILK*B{t78L^wdh% zt;Ewe}#`#F81F|B!)( zAL=yD-h6R<5X_MvHUyGIn8cW3AfyiSqOZ1mcW04tG6pN{KRbN%`IaSF_}wKcEw z`>l`*qtO5-6S|8 z{ad((uYc_Da?We_buq>~&>h@H9Q=Lw%)nkcnjZY$_CP>;9O~E!F&!FB{U78IHbxE> z@fE?JJv&Xp%GYJbLbjR(goOeY{p~;N-dJ7C`T0v)HRA=}{-|q=k$FPev*U%*xyjs+ zzuO$!-ojy|&+O;MUH7lcpPA2jA4@Ls^&{6z(|J={5Tf!eHm~})EnEWoi17M}_f}-d3Se%YHD#cv6*KbTe!-J)N79la*R$Su9 z^b1>fU&W5Q!%AVDvN=!BtQ#Q3xXLm_u_c3O(o0C@e$jSM?9hg(r6{t~q8-0UAX)ni z4N11M=lr2eJH$G1&E?O?p>}r=R9QaCu_L#g;4wuT+LZ@5X+n_DxpU3>8RanOm{`=s zMiG_1)#dvbqxG))@IAL_Pab5~H%2fzrwFq-RTV{i>?w|8abAX!Ok&$pb6#vlkNcl$ z^=k^xKLO{}7s@)BJ|q6wOO1!U4W)Wt)`5Wmi7F>j=|nUh&W!TqB}*&FsofI6a^>Q(HN%99QJF|Koyzq zhTolYQECu0O3ZmwZX;zn$2V7>A^xBtvz0Jwh{-SZZH7DJ=zhuKUID8OeqB zy}fjI^l85c)nFaFva#-cl`$%hcJjL8PDP9{44pI;Ie6@17=VkL1`h`U2evsWyluna zFDk{{GCvMcZ}5|>jVESlcZez4eiaYcQSU96?Cot5G+BrC>5tB7_4zFvoNo7ruMj$r6NSg~ z`LoSix}QZ}9`9|wGc{Lk9o+%P+O7V@( zgRi_0V}}RY&BG`KxWuHGgA9lDX(WeD%~LTCHF7zNmRuXUmXa#2F0=}3>l(Prf?^I- zuU3Eu);^c(eJ4#2BbkU;mGe`q>sKUW29G|7p%@=%GteA0^Afid(5oQPxw!^om zG9_KlY^Opsn3OAJt8`lZuptf@v3{{zSO|A5wpvvoQL>;b|rN3mpg`oUm#NS5HU0-d`x<;64Y4EH*=+4NEL7&WDwqrx#jDdV?FR7_=TmV*>)t^dXCY zfFiflheK}-G{MBXJ8g5)%?Dp%*H++j$k4%>hc9fPQvvm?7hP4b`aCCeYSZT6YErJ~Mv{2~h5KEE3u+gu%M3O_hB z%xEFq=lL%%~R*# zi6@zH4$YXe#B{*flBwN=!cc{)LzX_GJ%Z^pC-;=a$CaRCli zA17d%%rX|nbD<-RX!*506TkFTMqV@kI>hlEyw9_>J`PQ!r|Ve<-sK-k<0%`eg++&& z^IDQ~Ex0zL%ZMW^Ak;MNjWqM(An4$?VL2z6_}s|26m7_kUe0aZ2>4e)1;Db;W(e>TlSS`TDB;6{tsMiH`1gfRs&yP@j7ri4fY z=}$3heq(>)6dox4<&l+yaGJam@H?msX5~c~Do?klK@RCB?|#R}SbC7R{9IFxVGeHq zf&Wfkv_!YYH{rew`rKh`n{Dtvr4Jj}4Iu1IW1~`7RAKY8AA_ampb#z}hs?>4-r9(c z0>0YTk&W{A;bsjn?o=;qdHpeW6P)GbI-&~`iG6WPBhM#Yb>Dw&oNNoBMk0=)B>S*& zZN`h_{Oz%of}-noWaKacZGSVvWxtr%ZX5}ro-C!>_VAg&)5aK6vO6Lpdt7X8@}t}t z59o6?djq#~S*uP5=>& z*4PbbicSZvK3!zM#V&xU8N5~va|V+Z3s!h z)rAZ1&StV}1;SWO+H(mAG?AYTj_DiyZJ!{!N?`oiD}st40Whwh!0dwBeX63 zhul%OpCF%+&%#qT0>?7c;Y7bw^+JSdX}nC$bN;9s+ePyQGKs;E6F1)sil{Z=Dw<#EFy7kzkVd)G4*Na zLe3s8-{OCmN%BAnj}?t8_=m)u1jthGX-|>-D9TYXTC=y6ol65B5u$h-_tKgHp7p)`4huCebv;g)_<{tvwi};$G(O#}& zb*3|QY4u~xJ!R?w3`LBFxBQ2zWaIberrc3^NWfP{Iv?WB*b6DIcAcop#h9XpQP8Z5 zAqIeRhk`{8k1HEt@}L~c=x~C(hd-zEZL=-1QfLetV?eqYxSmcE&lfhB61wg2zpyo{ zPu2-436R?VK`DI`ym9Kthr8Uwx#E4No)7vID* z6sHcCKVTQjVwdFTTD#Anv~K5Aef~98MbHGp2)z?DV)xu7tbBfipnGr| zMb88p+2f`$P8M>o=2wX9A5he1LCBL!$8)XSvYTlX=yFGEzTf&N1U$4di(2?s}<6Wks~n}Wgb%78tw zs2Onfk^1JQd9V;bwK_D8saz!KcC& zRX0@M81nR}YXRp+i<+&2z?_oClE@IOe_M_yon6OG!Tn)T^+~vtr1O34SbHqx3nsU# zo?%-QKejQ`qyz7z2tNRm7=VqS8y9G?*XIqI1C-Jkq2@CsHhnE;MSZ%IqE; z@Uh#CAPoEsF-8a8=zs9o_lGxP=Vd>tHiJvvAt1`iX}=}3efNE&i&lb7VE2*x^cNm?o6=Avd2ffa?F9NTrr zBl##P0?zeCeZ2F9O<*#q57lhSjTsHTaI(CJK!Yj_w(P@(wc#y-^L^jj77bfwSSnPJ z`+*h|GV$D+mg&8TbJYw^svDX6*7r6mqA$;PnNH2-iQbIC0Y$%KDWM z^Tb@_53g9igqv4((SmLa=D15@jTd7$-4mT}ygX2SPmsrTOK8V1Cq{G;A_akIPGV#b zW4 zfQ=(DC~EU|Czfn8338Xi!JPt#G}j=KA|OPy1IMmf*h6`z$-!PNm~5HS&uCnlf$i@- zGw8BIcc&}&`MrAoKgC`!8^YzoP>kE0&AR(6f>rR2Q)C7W14j*!4eHN{$$8&bMnXu{ zXX+F!n@Q$y>nj2h+tR$+4Q}U#sPoE%8CdQ7l4~rcV za~>aD!sPFY+_%33783JCtKV*owLcm9xV`IoM{a`qi_?WQTOV_-MLr})=`fo&lW=+6 zH!RNiwA1WfEmQ!VBHb*&+sGF%;-U`kv7K4!Fb5VAv3&ZP9aZ4ufdr+e?x- zN8e_1gn_^E5C-jC0-Wps23gj^5l4QAIZdWmTOV%&36W=j1{_48G1?=xhsv2dOo}Lo#c0pH|ARX!<78H!m3h!O+$kBBK&IfH3{)yFgya}A z#^3a*;KX(^dH@Q5>jAQ_q}=v`D5QPr*`9~y-G*g&qal4^_XWo0Si@~FF|wl`rSmcq2M~{G3vCjc-oPFUfE~fW&z3M0=&Q>{3T#8Kim_SWV#$i1)eFk!Se0 zIt(^y!bDH#J|L7^zUo@Ar?RVhGd*xiIIeXl-S>xY0*Vek-r>ZwOw(9L7*U_W@x-Z} zw6~=hYnxJ&jSv;)MFT_|;H2E^k0W@y-EH$pw45rTkEW*F*5$8jyPAg4fz_KfKS~*d zC+Nq=x8b%D29QF55wmm~W1=dZ~yM8wEYdK%DhK@MRtLaV!4CSmWzGptBt5I5>ld!r4I`MB6Pc}@|62EfjLMzhdAX3 zCcls~UO|k286@Bw0>=+wjYm7U8}6`*4h_dLdhrl93U>VPG56dE%3zW~u|~grD{iu5 zUj@UGvJ$N_X;Q}ZwZ?vkl1g0dIi+v&pe(RMe`$oZW+U@&w4(39b2H2lV6m;dPoM8k zvf7CmU4utI5FO~bWMK`<+(n35Z5P|Oj;=0a)CBypWw75`zwRHi&OfazQcl1hMEO=cBr#*CrR z9L*SIfk>vPCD}8b#*n-sqnFv=lUASQR8{U=*OT3M8`Li?YG0E$Z!N4b=rsskBAkLq zvaF35+CZJAoSpC=&2DeuEAv1Y2t{i$gid6s%rx+_OYxJPj2!fc^dW*Gn*1$mFY{ZC z^20h_6~M{{bBI0^m@!rQ0}nj#qEV^Drp@9j6$)+xA=Wv|9TAq(l0(NondTdG;wUy# zHbHsNL6*6~-pW(B;IMWHPOhXLb$UV0_PIDu(>_Ft*lwch2WNeo1Sz%=oe6l+Jb67O z^otSa#F*2fgRS~KY-|6CyuHk`r844P4Y^J@lE;{McVHWa^E9PTb)FrYQq7 z)t@Nt9DX>K!N@DM+D)p4r}KLgkd-}40C3|UcZ+V(v~3dZ1SMo7e@5$juZzh(vzD3r z15csEX5_s zGT2Q{nd7-;A`m7#}jqYsJ97!F+G@KJ4;qSu%g?rNWKC!*6P z)oD)tUHf5W`B^Bk>D44r>Q-4OOEFJrwtuA(mA^hRVV6P=6FS_+A-7sDoPkqXyK<<$ zOHJ-~1&_Y}`o69oRD1Qv)J#~Z=GD#CB4r(bP*~5yWib zMfE~)Um{}cP@p#6bi@EwGG!_XJH_S`MB*F_q1>~?7$4nPmk|cs*A&%?SD(z*H;s`% zl?MfG*9Y8vr)J;@OL(Y3fZ@XsR42sf1l-zgDR#j(o4)S3p7Y*1bos~6SFLwp&_shv zpOJx^-+m7c8bmUi(`J@t!{Cc+-+@n!Cw=ZOU-!o9!fBs-@xSc?w=B7yuS!QdxK8>k zec%bce*68MU4y<;5lf4>;N#z(H%NB@T25YH8aRS4><)lW2{R_GOQr^YK3}!&ztcYZ zOZE^kb-T3w^W_76yYYo;)q*5Qs0 ztE4Xf%bZuK%2njgZ5C*@D|FEA+}MPyr)byEj99YtaVMbaw=YW`j)vnE!nye$J{{_RSt&uR+ZWNc}N~6>4NiQ z(Jn3Vr1s$VUJCQ&GyK+7X02?x-hZuuK5#rt?|yhnl+j8yF=MOL!LP5)&*=H9?lyb6 zH9bNfSqK(1FQ4hT)5n?C1ycFQ3_?&40$u10g?(fO3$`x5>urHoxZJ2N^hjK!>U&9- z8Esafb2YiuXmssz#A)fgLRG1EzrNB?7d!VrP!ON_+08@mmb<`Q6tq+S-Se%HTiXkwwi&WZJ^^1t3xCBrG2iqIAd9X@&E zjSaT*{6y+k1#7a&pei&RqvoP)Bzfc(#}Kd9z>`rSfLcA zza&ZpY7y8-Yk$!@rliEyu77TH)qqXYi&p(|H?=3F`<>(8_PIvg8cVtf5y1e4{j9_g=pv7ET)eqQtj+*EA6ayoSV zZ=#X>v9*O6iSmU5_-e1S2+myD zg;=#ygpT0E3O4Ac9_)#~3Uuu$TBLd-i&hj#9=}S2=X3R`Qim-HHh$@mEHL(TW#72t z2JMDgmj<_J;nc6~jy9z*ZborWP>-vUEYa;KZhV zl6OCSHTyUsbtO69w9d6ItYT%S*48&EXGZ5r!PNeIXMXpTvYyr>*}k0kx4o!(_4d*U ziBVk5-(u7Tf)ff?zE2(NnfRIFFZXKT11z&p{icYoT6i6#zNna_|4Z?#Z#=I^nPPLB z_F;u%xsf0yF~^!B>4NyTRW8r!^8-RFgaZ8hcV#t7Y%|?4KOx)Z4sB%RD5dnKV*cf( zikkXx?{GyvG`Y5PV&Mhwak2_YB5c|3EkKELoo9b=AMG3Cp*FJ-Y$4I#Vf{m z*@FD0R;SLLp&2HuK0g8X6yyU;sH|X^4xX=-(_}7vl;Lm6K!*OEa{IA?}fo)H}K&GdQ ztcW)9_On;DNzh;1rrou{z0hamgvkSpFnqlB^1&JCD5^$@)IjMZ0mVgcxWM3K&)?jn z+9+(jD7m;6VVchx1BXPN&BcPA$a8^jH0xTOT)*=-<~UM+fvZ&XH2{8sxUXePr|cdj_61_Njj1 zrmKRev;{dZ|0?U*R&KO{qVG}k~f>*?0?(-E8KSZ$?*sM_LwT{MV(jvckQXMJ#N=uuc?@SZ1%zQ&j{-0>*1>K zig+1NTP)?Evet1xQVRm?9{}dV%WCSIFqq5ODQUby6dw;9x+)z|6kkzWA0IVi6jCFT=a=fmC{2zYo~hPJvqch5c7(U9=whdOgn?9ak^UvfsMxKi9|K zo+>?GW2*ap7kw5$)az_SkF|RK2k_J6(AXER936cVAev)yQ`McDYK&Cp!KACS_TN+= zI&$(H5!m+jS5o6J6>#zmY50jhf2J~^b`F~VQZlZ(F zzR=-3Y#O(gyN{EDn;CgMVE9e^Z$B$rv#+aB7}Z4SZq`CjnoLfu z<>#o2PPq9i4a`CVRP4-}3RU0lc(^vqT_Tu8;Mjc^9|DpJ+y&)m1$@!2n5jQx(m~*# zo0>PSuHuU3D3h7A@|vE0VEKQ^o_`K>hn$UY%p8lj%fG%*1;nW2WsfN;^2T{hQ@KVe zMP0j=7N%h)PZfT>K|n_vGz|ltnx52oCks+fSv%g29}=yW*OpgA$6uqysA?N!0>_2+ z`tD`1uWOiUA$4JO>HtR7@6oR^@(z{9N7Dr=DUg?$L$ML6UU_xCW{3;CvX}iERkL73 z>-px?gUU_eanIx0UE=02aV=qTx9|nU4;r1dubZ0`vU8XDou3bd$2?Vj1V$~sa$tO+ z7)Sxpta2}%m4=}dWmK3gU<1)G5);7X z`zvh4reM{8s=_-ItL6gVGmx#u4~9d*0u{jUG0j5r?yg83Ws z?_L;XSUc`f4}gHb3fS=Tie>#3H*mqSOSS%?3So45s*&7_Vy!f~EBt9b1$$lC)Q|s{ zmZWKub-l0=kol{N!)(LkwR$Chw=&biv)&pT@TV#+O8nXZ!%(?dxphx`3{bcD)p$?! zMY;gr{5bsCLMX7nz`tlLyNoN@KC=34)p)t5TeS3gzpYxdDSE|BKN|+9a^vHpWYf8? zaWaN~S+S5F_f+ktndPHB$ZnKCb_)8t)dNB5g3N>UAkG4H!`G2G+oKEv`y) zZ{sukgyTfx-?cJ>7u|+(dUc-qM*n!+*0K$0Ra7EM1 zn>dO}QDI%t)CE?`kW!?L3tVf*mk#su32&m+WMJk@%o@bI8=onc7k(ZLd>o>hd51=; zUjU)?kmJ!*0babO-!uL^@P=MR*+%|S|L|zX_^uoC-)A1IP`9l}LxbS-v4o}&YRnvS zHQrav0yaDyWQRY4;7Pd&c&~1;WA#C$G#*6fAQ)PP^^nWd+1J9l0ZH7~vM9>IdetaO zAp+As^Raf!X&ju@A%pOxyhiD`BGP((#~y@)M1WfzSbh&kUCt=J(#jDImX1}xL1e3# z)hXJo)VXT3Y_TgrKp(PUO+5f;A0C6?rC#}&RwqJrN%2uHeluN^@YNFTYCSi=X>x0d zb-rpiy_6}l2D3dMY547cWAl#<%G_|;Mpt7!~Yv=fVMa7 zlidMT3Uv_(qr1yM7CREN>SK_)xPEyG;QR2ySGa-O4R7!;Fv%$JR?^dsXEd&Pba@@+ zN`WREvkN)8um%MBn}dOce${WZ17retAaI?iGRY0|;KF=n@; zVmzT)(p{Q~4PQ~Ex#Ct<9v$uyTrH+k)ApwIG{?H|*}ggpkIzAcFD z-)E%y6&OLCFui-$N|3ZKqxrYzfFU{q2e*aG`9X~0rGx{|D`XpT``>Og18{v4jud5b7TCd=)F>9I|1EF;B;4Ae^tE6-V z?tc3;wZdOL8r<|HMltfi1xWXbk)UC`N%=--SE)R?qSWw|=UJb6)U6NrM2Tj0CJLvj z3D#~=23)%?>kI#|oX_9z20X@b+6#wESYcbC8UoHu)<1u6PYM!{FR+*2Jw_8*MfX!TK)i??V^pUtZ z=8AI9lcyR#4XR3lfH6P?dEnzE#c-{etVL7NT9GlIHv|E=4y>s!(JeY)0049yFbLse z{-Z{c6Tt>-&lmqz#h2n@y}+fSa8 z79DA@*_6t0WW{~^Uspx<*GB_q04g}X_hsp0IxiEigEGex+vVAG)lpVosI)Iy{XO7g zCXmxY<+U`&xTo>tl{c2vR?vsvn04{-Wtz3G&1+Z09aH$+Q+uz#3-R^<^}_{Rd%7SK z3qHnv0IR&7W@pNUDVr3JL2|c3O}>G>ejy*5(a@l# z|CcGlaBpgqMgYk_Ujj}$`28ytTRxJx!UX+9mbE+11=hL%U1KdS55jD>!B?tZadGbx z|FWaSgz0sA4G2h)izI~0^EH)dO=hqhqu;<5A2;B5KQ^e({Z4JPaKp&L^5TH&kfqvH zvGjDrGO_%B{+}xFyf5FTO=n=4+Iii!7VOad{?X*_NdA`u;=i{|+H2jgiPUZ})=gWg z@Nd_W7~m-)tM_R7nWR$ zY>ji-oruV>sAXl*x2GSS-ABBMNp_&TuXX)9Kb(e*ht3~=kJ+a>uC9NQFd2!C-W*R` z_FysRm#*-;mkpAgv}AJ&PjBypbZ0DBB-YO)?um>lobj&yDYyIpKGJ(V1|4^pi(;VqTim5WsEmeTDA{ z6@qN+^j_WlD&IIo?R#Nj>Cm??83(^UF~uT?YC_iSh3qgRUs(Hg9f63-oOU&#D+jAE zt$vQLSYIz4b0euzyTyc9eKE<`iTLS(8;3L5Kl+wfMy_>o6feC`t7VTWqm97R4sCWp zf+umKzR>lNdsI1hl!vHn-`v5uWjAjM{!r_5+?Ct0aqu_-{t1|s17?-!JFWul58i#g zOXaGy|48}Pu>-^^t&EZT#CuNVodg(94*_}+Rz66!fNEdekUhv5tX&sXNQ|U1 z#8_Hbgvvd+Im$F5RmKc0QI>N$#@q=ghd{cyWK!myVdZ#=JkUZO0_TK}AXVFo`Kw@s zv8m|OQM|o$7`u0JmQX2$*VPs%ofXfj#irccQal;5G~W7I>-E)0{=LYDA*X3ONS_v% z-@*7Cd_N?ry_#GgJLEbs_fmlwoF;MS#JoZ)7B%WPoO^gjIc5Y`R*_zUV0i*OHxqq=>zAlTr6p#92?~8+uhbpw4wsCEETCs zv~-LZ@I^G|)~6su7fWc=VfG^)(f;6cLniy8(KOPg)FN}WD+y=w z%75R4$`}`f#6^$ezAk^D^fz@HJ7ei#Oda#93zN{TU*%u}O)2uLVdE{8G-cJRyrt&g ztzio!zpxr5vZ3;rM-sAZSL3M$Dg7mBr4`60uVyfMPZ&uy#TP~oQS_cjUKpYwO%!p> za9wfE#irwHseS7qR8ePm7DkuY#M2z)qrSAamD}G_x&}ZY)EQdjL!tsY(wCsHJ(h&O zD@%U)45G*a%~FvcOb1++f{5?ry&oFtl!b3UTaM5hp9M2Uk`knvwV-$~Os5DIy*=;v70T zHq7LIeeM+1EH;d%Z<-5PCkT3=rHj@DpXAR(cS4hhoI+}q62X426kd$rGp>aBumXo zY@BNT;8XvCfI9t%XO1{F$D7ziI6)&!jd$=MCh)J} zQ_yXGrEb21zk%+?B+MRbUc|-m0%f9fnyI+(-WHrTy-O&6gQYynWXBer&V?}~jDFCQUyQ%tde1eynt{oWhvm34I9psRgWfqvD=VY& zFB<(=K+ClVBlBj;Ji>AsU(O)pV-M{i=aD)|ZI+2 zK^f`R*C3x1nU@tw3J#~P7XsXDCqP1|5!ZU^0UXKi40lbW(SEcC4|N7l3)X|K$4V5yDB_rC z{Fj2t?cjjjkh_oK3%S<0_XAy3}za0qyWv1%J)*q=_WOuhgU*;>1r!iZ09jh2JX z!9y4#J#x^X=$5_Q+X-{F)M_9{rbDVk_w2W3L=^G##KVll(*hro{eeIMi!3v=&Cs(9 zOmcoxg%GZSDZKXh4d%c*eMVxEIv~}iRGElzsPq1Eo%VfFz^ItHeh2DefzkW*eg?*p zb7Mo+;T|U@EX@XUU(ZZ)wixup*Jq%EQt4-r4k*2DD1v&1n5ave0*70TzM!Z!kd%2< zaxptH)nG4E)*E3K$jV@x%Bl)?5<)~NKBcefZWRPqa;so{PE<@L=!eAcE`~TP<;1mb zZs}%Z?Da(d-rPydxh0BmP4DjNO|yX}!>Hh7=%LeVXc3_8b3bTi&@_N%JZ(OLoF^W3 z0;eoXcQM@8`!Vf?I^B?G(P4aoF%)fuRj~@rsdHw-%*|++?auvGB%DiD{ieC{*Cw%HJbM)s$(6zpq=;m+j!5v)A4&JgHRv^T@Q zkBjU{eQB3;mRM1V;Oy};v+$7cTik`qoRIGm4{dWXq0}<6gi*ZF1zH^TVFc}uHs5Wc zOTQ18!9!=(A8&g&+nKv5rUkdZx;I#}D{)N)uf+=hfr2uz_kr=o^>J_YBW1;l9cVGw z;m*|GDIuVeUy6$dFeGvCDJc{5Es&BP*jhj3V3&mln@Tu0)_W7(5vRv){ak2u0#Ok& zdc3&t*3TO;?!>9eWdBnDm1ESg?9`U7>-`AToG9vYvJ=kOA^ZW`a5HG;DC9caK8zUz zZ!3X|dsm6i!0U-v*Th+qlwmHK}u$Q~fQrs;&dvE2#tZ&I6?$nTzdj;_mIbsHQ%|{M&PPE

    M@vXtyY2*18Od$Hjjzp+D=VUwy1DB4mE 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%0DB`HO0`NJ=th;AK3O^ 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

    Release notes

    Sourced from mercedesbenzio/detect-action's releases.

    v2.0.0

    What's Changed

    Full Changelog: https://github.com/tvcsantos/detect-action/compare/v1.5.0...v2.0.0

    v1.5.0

    What's Changed

    Full Changelog: https://github.com/tvcsantos/detect-action/compare/v1.4.1...v1.5.0

    v1.4.1

    What's Changed

    Full Changelog: https://github.com/mercedesbenzio/detect-action/compare/v1.4.0...v1.4.1

    v1.4.0

    What's Changed

    Full Changelog: https://github.com/mercedesbenzio/detect-action/compare/v1.3.0...v1.4.0

    v1.3.0

    What's Changed

    Full Changelog: https://github.com/mercedesbenzio/detect-action/compare/v1.2.0...v1.3.0

    v1.2.0

    What's Changed

    Full Changelog: https://github.com/mercedesbenzio/detect-action/compare/v1.1.0...v1.2.0

    v1.1.0

    What's Changed

    Full Changelog: https://github.com/mercedesbenzio/detect-action/compare/v1.0.0...v1.1.0

    Changelog

    Sourced from mercedesbenzio/detect-action's changelog.

    Commits

    Updates `myrotvorets/trigger-repository-dispatch-action` from 2.0.0 to 2.0.2
    Release notes

    Sourced from myrotvorets/trigger-repository-dispatch-action's releases.

    2.0.2

    What's Changed

    Full Changelog: https://github.com/myrotvorets/trigger-repository-dispatch-action/compare/v2.0.1...v2.0.2

    2.0.1

    What's Changed

    ... (truncated)

    Commits

    Updates `anchore/sbom-action` from 0.15.9 to 0.15.10
    Release notes

    Sourced from anchore/sbom-action's releases.

    v0.15.10

    Changes in v0.15.10

    Commits
    • ab5d7b5 chore(deps): update Syft to v1.1.0 (#454)
    • 6e7f9d7 chore(deps): bump release-drafter/release-drafter from 5.25.0 to 6.0.0 (#450)
    • 2d906a3 chore(deps): bump peter-evans/create-or-update-comment (#452)
    • 691c762 chore(deps): bump peter-evans/create-pull-request from 5.0.2 to 6.0.2 (#453)
    • f0dafef chore(deps): bump actions/checkout from 4.1.1 to 4.1.2 (#451)
    • c6d7b2a chore: add dependabot configuration for actions (#449)
    • 31e2bb2 chore(deps): update @types/node to Node 20 (#443)
    • 670514f chore: Bump Node to v20 on download-syft/publish-sbom actions (#448)
    • a5afbb1 chore(deps): update Syft to v1.0.1 (#444)
    • See full diff in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/blackduck_scan_scheduled.yaml | 2 +- .github/workflows/pr_run_inttest.yaml | 2 +- .github/workflows/release.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/blackduck_scan_scheduled.yaml b/.github/workflows/blackduck_scan_scheduled.yaml index 1b9e08e346..6c863de77e 100644 --- a/.github/workflows/blackduck_scan_scheduled.yaml +++ b/.github/workflows/blackduck_scan_scheduled.yaml @@ -20,7 +20,7 @@ jobs: distribution: 'temurin' - name: Blackduck Full Scan - uses: mercedesbenzio/detect-action@v1 + uses: mercedesbenzio/detect-action@v2 env: DETECT_PROJECT_USER_GROUPS: opencomponentmodel DETECT_PROJECT_VERSION_DISTRIBUTION: SAAS diff --git a/.github/workflows/pr_run_inttest.yaml b/.github/workflows/pr_run_inttest.yaml index bf1bd99d04..f3743d26a1 100644 --- a/.github/workflows/pr_run_inttest.yaml +++ b/.github/workflows/pr_run_inttest.yaml @@ -29,7 +29,7 @@ jobs: private_key: ${{ secrets.OCMBOT_PRIV_KEY }} - name: Repository Dispatch if: github.event.pull_request.head.repo.fork == false - uses: myrotvorets/trigger-repository-dispatch-action@v2.0.0 + uses: myrotvorets/trigger-repository-dispatch-action@v2.0.2 with: token: ${{ steps.generate_token.outputs.token }} # metadata:read and contents:read&write repo: open-component-model/ocm-integrationtest diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 13d7ad7d69..253b145af8 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -140,7 +140,7 @@ jobs: go-version-file: '${{ github.workspace }}/go.mod' - name: Setup Syft - uses: anchore/sbom-action/download-syft@9fece9e20048ca9590af301449208b2b8861333b # v0.15.9 + uses: anchore/sbom-action/download-syft@ab5d7b5f48981941c4c5d6bf33aeb98fe3bae38c # v0.15.10 - name: Setup Cosign uses: sigstore/cosign-installer@v3.4.0 From dd13e574f99b4934f877b9a3cd0ff3a80c57be93 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Apr 2024 07:17:08 +0000 Subject: [PATCH 17/83] Bump the go_modules group group with 3 updates (#707) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the go_modules group group with 3 updates: [github.com/docker/docker](https://github.com/docker/docker), [helm.sh/helm/v3](https://github.com/helm/helm) and google.golang.org/protobuf. Updates `github.com/docker/docker` from 24.0.7+incompatible to 24.0.9+incompatible
    Release notes

    Sourced from github.com/docker/docker's releases.

    v24.0.9

    24.0.9

    For a full list of pull requests and changes in this release, refer to the relevant GitHub milestones:

    Security

    This release contains security fixes for the following CVEs affecting Docker Engine and its components.

    CVE Component Fix version Severity
    CVE-2024-21626 runc 1.1.12 High, CVSS 8.6
    CVE-2024-24557 Docker Engine 24.0.9 Medium, CVSS 6.9

    Important ⚠️

    Note that this release of Docker Engine doesn't include fixes for the following known vulnerabilities in BuildKit:

    To address these vulnerabilities, upgrade to Docker Engine v25.0.2.

    For more information about the security issues addressed in this release, and the unaddressed vulnerabilities in BuildKit, refer to the blog post. For details about each vulnerability, see the relevant security advisory:

    Packaging updates

    v24.0.8

    24.0.8

    For a full list of pull requests and changes in this release, refer to the relevant GitHub milestones:

    Bug fixes and enhancements

    • Live restore: Containers with auto remove (docker run --rm) are no longer forcibly removed on engine restart. moby/moby#46857

    ... (truncated)

    Commits
    • fca702d Merge pull request from GHSA-xw73-rw38-6vjc
    • f78a772 Merge pull request #47281 from thaJeztah/24.0_backport_bump_containerd_binary...
    • 61afffe Merge pull request #47270 from thaJeztah/24.0_backport_bump_runc_binary_1.1.12
    • b38e74c Merge pull request #47276 from thaJeztah/24.0_backport_bump_runc_1.1.12
    • dac5663 update containerd binary to v1.7.13
    • 20e1af3 vendor: github.com/opencontainers/runc v1.1.12
    • 858919d update runc binary to v1.1.12
    • 141ad39 Merge pull request #47266 from vvoland/ci-fix-makeps1-templatefail-24
    • db968c6 hack/make.ps1: Fix go list pattern
    • 61c51fb Merge pull request #47221 from vvoland/pkg-pools-close-noop-24
    • Additional commits viewable in compare view

    Updates `helm.sh/helm/v3` from 3.14.2 to 3.14.3
    Release notes

    Sourced from helm.sh/helm/v3's releases.

    Helm v3.14.3 is a patch release. Users are encouraged to upgrade for the best experience. Users are encouraged to upgrade for the best experience.

    The community keeps growing, and we'd love to see you there!

    • Join the discussion in Kubernetes Slack:
      • for questions and just to hang out
      • for discussing PRs, code, and bugs
    • Hang out at the Public Developer Call: Thursday, 9:30 Pacific via Zoom
    • Test, debug, and contribute charts: ArtifactHub/packages

    Installation and Upgrading

    Download Helm v3.14.3. The common platform binaries are here:

    This release was signed with 672C 657B E06B 4B30 969C 4A57 4614 49C2 5E36 B98E and can be found at @​mattfarina keybase account. Please use the attached signatures for verifying this release using gpg.

    The Quickstart Guide will get you going from there. For upgrade instructions or detailed installation notes, check the install guide. You can also use a script to install on any system with bash.

    What's Next

    • 3.14.4 will contain only bug fixes and be released on April 10, 2024.
    • 3.15.0 is the next feature release and will be on May 08, 2024.

    Changelog

    • Add a note about --dry-run displaying secrets f03cc04caaa8f6d7c3e67cf918929150cf6f3f12 (Matt Farina)
    • add error messages 1a7330fe3802beeb3f897a1c701d8a4b9c1316c5 (George Jenkins)
    • Fix: Ignore alias validation error for index load d6acc0027dca47dec40ccdd66febd0c8bcf4813f (George Jenkins)
    • chore(deps): bump github.com/containerd/containerd from 1.7.11 to 1.7.12 b2738fb782d149ffa4748cb0ee78d674986d04b0 (dependabot[bot])
    • chore(deps): bump github.com/DATA-DOG/go-sqlmock from 1.5.0 to 1.5.2 5b0847e0e763e98bcbf8a12e8f9c5f7c11d123a1 (dependabot[bot])
    • Update architecture detection method 7e18c39f0753c73e4660f3796f01f5b33f2552b5 (weidongkl)
    Commits
    • f03cc04 Add a note about --dry-run displaying secrets
    • 1a7330f add error messages
    • d6acc00 Fix: Ignore alias validation error for index load
    • b2738fb chore(deps): bump github.com/containerd/containerd from 1.7.11 to 1.7.12
    • 5b0847e chore(deps): bump github.com/DATA-DOG/go-sqlmock from 1.5.0 to 1.5.2
    • 7e18c39 Update architecture detection method
    • See full diff in compare view

    Updates `google.golang.org/protobuf` from 1.32.0 to 1.33.0 Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/open-component-model/ocm/network/alerts).
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gerald Morrison <67469729+morri-son@users.noreply.github.com> Co-authored-by: Hilmar Falkenberg --- go.mod | 6 +++--- go.sum | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index e113c53f65..7a819b0fb8 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46 github.com/distribution/reference v0.5.0 github.com/docker/cli v24.0.7+incompatible - github.com/docker/docker v24.0.7+incompatible + github.com/docker/docker v24.0.9+incompatible github.com/docker/go-connections v0.5.0 github.com/drone/envsubst v1.0.3 github.com/fluxcd/cli-utils v0.36.0-flux.3 @@ -68,7 +68,7 @@ require ( golang.org/x/oauth2 v0.16.0 golang.org/x/text v0.14.0 gopkg.in/yaml.v3 v3.0.1 - helm.sh/helm/v3 v3.14.2 + helm.sh/helm/v3 v3.14.3 k8s.io/api v0.29.0 k8s.io/apiextensions-apiserver v0.29.0 k8s.io/apimachinery v0.29.0 @@ -317,7 +317,7 @@ require ( google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect google.golang.org/grpc v1.61.0 // indirect - google.golang.org/protobuf v1.32.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/evanphx/json-patch.v5 v5.7.0 // indirect gopkg.in/go-jose/go-jose.v2 v2.6.3 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 769da631df..ff00b08b5b 100644 --- a/go.sum +++ b/go.sum @@ -58,8 +58,8 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= -github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= +github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= github.com/InfiniteLoopSpace/go_S-MIME v0.0.0-20181221134359-3f58f9a4b2b6 h1:TkEaE2dfSBN9onWsQ1pC9EVMmVDJqkYWNUwS6+EYxlM= @@ -298,8 +298,8 @@ github.com/docker/cli v24.0.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvM github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= -github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.9+incompatible h1:HPGzNmwfLZWdxHqK9/II92pyi1EpYKsAqcl4G0Of9v0= +github.com/docker/docker v24.0.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= @@ -1188,8 +1188,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII= @@ -1226,8 +1226,8 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -helm.sh/helm/v3 v3.14.2 h1:V71fv+NGZv0icBlr+in1MJXuUIHCiPG1hW9gEBISTIA= -helm.sh/helm/v3 v3.14.2/go.mod h1:2itvvDv2WSZXTllknfQo6j7u3VVgMAvm8POCDgYH424= +helm.sh/helm/v3 v3.14.3 h1:HmvRJlwyyt9HjgmAuxHbHv3PhMz9ir/XNWHyXfmnOP4= +helm.sh/helm/v3 v3.14.3/go.mod h1:v6myVbyseSBJTzhmeE39UcPLNv6cQK6qss3dvgAySaE= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/api v0.29.0 h1:NiCdQMY1QOp1H8lfRyeEf8eOwV6+0xA6XEE44ohDX2A= From c6dddba691b82c5bc9197e2a9f40974fc7894779 Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Wed, 3 Apr 2024 09:54:20 +0200 Subject: [PATCH 18/83] spec normalization for OCI based OCM repository spec (#710) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description The OCM repository specs based on OCI repository specs are now featuring a normalization handler, which can be used to map information provided as formal part of the OCI spec to OCM related parts. THis is used to identify URL sub paths given by an OCIRegistry repo spec (which would not be allowed for OCI) and transfer them into the subPath part of the OCM specification. This now aligns the handling in the constructor functions with the deserialization of OCI related OCM repository specifications. ## What type of PR is this? (check all applicable) - [x] πŸ• Feature - [x] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [x] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents Fixes open-component-model/ocm-project#126 ## Screenshots ## Added tests? - [x] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Hilmar Falkenberg --- pkg/common/printer.go | 7 +- pkg/common/printer_test.go | 6 ++ .../repositories/genericocireg/specnorm.go | 55 ++++++++++++++ .../ocm/repositories/genericocireg/type.go | 7 +- .../ocm/repositories/ocireg/specnorm.go | 34 +++++++++ .../ocm/repositories/ocireg/specnorm_test.go | 73 +++++++++++++++++++ .../ocm/repositories/ocireg/suite_test.go | 17 +++++ pkg/contexts/ocm/repositories/ocireg/type.go | 17 +---- pkg/contexts/ocm/transfer/transfer.go | 2 +- 9 files changed, 195 insertions(+), 23 deletions(-) create mode 100644 pkg/contexts/ocm/repositories/genericocireg/specnorm.go create mode 100644 pkg/contexts/ocm/repositories/ocireg/specnorm.go create mode 100644 pkg/contexts/ocm/repositories/ocireg/specnorm_test.go create mode 100644 pkg/contexts/ocm/repositories/ocireg/suite_test.go diff --git a/pkg/common/printer.go b/pkg/common/printer.go index e4b9bb0f45..9f6ecfabc6 100644 --- a/pkg/common/printer.go +++ b/pkg/common/printer.go @@ -12,6 +12,8 @@ import ( "strings" "github.com/mandelsoft/logging" + + "github.com/open-component-model/ocm/pkg/utils" ) type Flusher interface { @@ -58,10 +60,7 @@ func NewPrinter(writer io.Writer) Printer { } func AssurePrinter(p Printer) Printer { - if p != nil { - return p - } - return NewPrinter(nil) + return utils.OptionalDefaulted(NonePrinter, p) } func NewBufferedPrinter() (Printer, *bytes.Buffer) { diff --git a/pkg/common/printer_test.go b/pkg/common/printer_test.go index bbdc4c6ce2..2f57bdf665 100644 --- a/pkg/common/printer_test.go +++ b/pkg/common/printer_test.go @@ -50,6 +50,12 @@ var _ = Describe("Printer", func() { Expect(buf.String()).To(Equal("line\n test\n next\nback\n")) }) + It("defaults printer", func() { + Expect(AssurePrinter(nil)).To(BeIdenticalTo(NonePrinter)) + p := NewPrinter(nil) + Expect(AssurePrinter(p)).To(BeIdenticalTo(p)) + }) + Context("loggging", func() { var buf *bytes.Buffer var logctx logging.Context diff --git a/pkg/contexts/ocm/repositories/genericocireg/specnorm.go b/pkg/contexts/ocm/repositories/genericocireg/specnorm.go new file mode 100644 index 0000000000..c74f7d2d55 --- /dev/null +++ b/pkg/contexts/ocm/repositories/genericocireg/specnorm.go @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package genericocireg + +import ( + "slices" + "sync" +) + +type SpecificationNormalizer func(s *RepositorySpec) + +type Normalizers struct { + lock sync.Mutex + handlers map[string][]SpecificationNormalizer +} + +func (n *Normalizers) Register(typ string, f SpecificationNormalizer) { + n.lock.Lock() + defer n.lock.Unlock() + + n.handlers[typ] = append(n.handlers[typ], f) +} + +func (n *Normalizers) Get(typ string) []SpecificationNormalizer { + n.lock.Lock() + defer n.lock.Unlock() + return slices.Clone(n.handlers[typ]) +} + +func (n *Normalizers) Normalize(s *RepositorySpec) *RepositorySpec { + n.lock.Lock() + defer n.lock.Unlock() + + found := false + for _, f := range n.handlers[s.GetType()] { + found = true + f(s) + } + if !found && s.GetType() != s.GetKind() { + for _, f := range n.handlers[s.GetKind()] { + f(s) + } + } + return s +} + +var normalizers = &Normalizers{handlers: map[string][]SpecificationNormalizer{}} + +// RegisterSpecificationNormalizer can be used to register OCI repository type +// specific handlers used to normalize an OCI type based OCM repository spec. +func RegisterSpecificationNormalizer(typ string, f SpecificationNormalizer) { + normalizers.Register(typ, f) +} diff --git a/pkg/contexts/ocm/repositories/genericocireg/type.go b/pkg/contexts/ocm/repositories/genericocireg/type.go index 06e3116e9f..461fb55692 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/type.go +++ b/pkg/contexts/ocm/repositories/genericocireg/type.go @@ -66,7 +66,7 @@ func (d *delegation) Decode(ctx cpi.Context, data []byte, unmarshal runtime.Unma if err != nil { return nil, errors.Wrapf(err, "cannot unmarshal component repository meta information") } - return NewRepositorySpec(ospec, meta), nil + return normalizers.Normalize(NewRepositorySpec(ospec, meta)), nil } func (d *delegation) Priority() int { @@ -106,10 +106,11 @@ var ( ) func NewRepositorySpec(spec oci.RepositorySpec, meta *ComponentRepositoryMeta) *RepositorySpec { - return &RepositorySpec{ + s := &RepositorySpec{ RepositorySpec: spec, ComponentRepositoryMeta: *DefaultComponentRepositoryMeta(meta), } + return normalizers.Normalize(s) } func (a *RepositorySpec) PathPrefix() string { @@ -142,6 +143,8 @@ func (u *RepositorySpec) UnmarshalJSON(data []byte) error { u.RepositorySpec = ocispec u.ComponentRepositoryMeta = *compmeta + + normalizers.Normalize(u) return nil } diff --git a/pkg/contexts/ocm/repositories/ocireg/specnorm.go b/pkg/contexts/ocm/repositories/ocireg/specnorm.go new file mode 100644 index 0000000000..babc96c088 --- /dev/null +++ b/pkg/contexts/ocm/repositories/ocireg/specnorm.go @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package ocireg + +import ( + "strings" + + "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ocireg" + "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/genericocireg" +) + +func init() { + genericocireg.RegisterSpecificationNormalizer(ocireg.Type, Normalize) + genericocireg.RegisterSpecificationNormalizer(ocireg.TypeV1, Normalize) +} + +func Normalize(s *genericocireg.RepositorySpec) { + if os, ok := s.RepositorySpec.(*ocireg.RepositorySpec); ok { + if s.SubPath == "" { + scheme := "" + baseURL := os.BaseURL + if idx := strings.Index(baseURL, "://"); idx > 0 { + scheme = baseURL[:idx+3] + baseURL = baseURL[idx+3:] + } + if idx := strings.Index(baseURL, "/"); idx > 0 { + s.SubPath = baseURL[idx+1:] + os.BaseURL = scheme + baseURL[:idx] + } + } + } +} diff --git a/pkg/contexts/ocm/repositories/ocireg/specnorm_test.go b/pkg/contexts/ocm/repositories/ocireg/specnorm_test.go new file mode 100644 index 0000000000..8c18bc78ad --- /dev/null +++ b/pkg/contexts/ocm/repositories/ocireg/specnorm_test.go @@ -0,0 +1,73 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package ocireg_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/open-component-model/ocm/pkg/contexts/ocm" + "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ocireg" +) + +var _ = Describe("ref parsing", func() { + + Context("deserialization", func() { + It("handles regular spec", func() { + spec := ` +type: ` + ocireg.Type + ` +baseUrl: ghcr.io +subPath: open-component-model/ocm +` + s := Must(ocm.DefaultContext().RepositorySpecForConfig([]byte(spec), nil)) + + Expect(s).To(Equal(ocireg.NewRepositorySpec("ghcr.io", ocireg.NewComponentRepositoryMeta("open-component-model/ocm")))) + Expect(s).To(Equal(ocireg.NewRepositorySpec("ghcr.io/open-component-model/ocm"))) + }) + + It("handles combined url", func() { + spec := ` +type: ` + ocireg.Type + ` +baseUrl: ghcr.io/open-component-model/ocm +` + s := Must(ocm.DefaultContext().RepositorySpecForConfig([]byte(spec), nil)) + + Expect(s).To(Equal(ocireg.NewRepositorySpec("ghcr.io", ocireg.NewComponentRepositoryMeta("open-component-model/ocm")))) + Expect(s).To(Equal(ocireg.NewRepositorySpec("ghcr.io/open-component-model/ocm"))) + }) + + It("handles scheme", func() { + spec := ` +type: ` + ocireg.Type + ` +baseUrl: https://ghcr.io/open-component-model/ocm +` + s := Must(ocm.DefaultContext().RepositorySpecForConfig([]byte(spec), nil)) + + Expect(s).To(Equal(ocireg.NewRepositorySpec("https://ghcr.io", ocireg.NewComponentRepositoryMeta("open-component-model/ocm")))) + Expect(s).To(Equal(ocireg.NewRepositorySpec("https://ghcr.io/open-component-model/ocm"))) + }) + }) + + Context("constructor", func() { + It("handles path", func() { + s := ocireg.NewRepositorySpec("ghcr.io/open-component-model/ocm") + Expect(s).To(Equal(ocireg.NewRepositorySpec("ghcr.io", ocireg.NewComponentRepositoryMeta("open-component-model/ocm")))) + Expect(s).To(Equal(ocireg.NewRepositorySpec("ghcr.io/open-component-model/ocm"))) + }) + + It("handles scheme", func() { + s := ocireg.NewRepositorySpec("https://ghcr.io/open-component-model/ocm") + Expect(s).To(Equal(ocireg.NewRepositorySpec("https://ghcr.io", ocireg.NewComponentRepositoryMeta("open-component-model/ocm")))) + Expect(s).To(Equal(ocireg.NewRepositorySpec("https://ghcr.io/open-component-model/ocm"))) + }) + + It("handles meta", func() { + s := ocireg.NewRepositorySpec("ghcr.io", ocireg.NewComponentRepositoryMeta("open-component-model/ocm")) + Expect(s).To(Equal(ocireg.NewRepositorySpec("ghcr.io", ocireg.NewComponentRepositoryMeta("open-component-model/ocm")))) + Expect(s).To(Equal(ocireg.NewRepositorySpec("ghcr.io/open-component-model/ocm"))) + }) + }) +}) diff --git a/pkg/contexts/ocm/repositories/ocireg/suite_test.go b/pkg/contexts/ocm/repositories/ocireg/suite_test.go new file mode 100644 index 0000000000..bc5da284fd --- /dev/null +++ b/pkg/contexts/ocm/repositories/ocireg/suite_test.go @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package ocireg_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "OCI Registry OCM Repository Test Suite") +} diff --git a/pkg/contexts/ocm/repositories/ocireg/type.go b/pkg/contexts/ocm/repositories/ocireg/type.go index 9cc9ad835a..b8e5bbf839 100644 --- a/pkg/contexts/ocm/repositories/ocireg/type.go +++ b/pkg/contexts/ocm/repositories/ocireg/type.go @@ -5,8 +5,6 @@ package ocireg import ( - "strings" - "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ocireg" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/genericocireg" @@ -36,20 +34,7 @@ type RepositorySpec = genericocireg.RepositorySpec // If no ocm meta is given, the subPath part is extracted from the base URL. // Otherwise, the given URL is used as OCI registry URL as it is. func NewRepositorySpec(baseURL string, metas ...*ComponentRepositoryMeta) *RepositorySpec { - meta := utils.Optional(metas...) - if meta == nil { - scheme := "" - if idx := strings.Index(baseURL, "://"); idx > 0 { - scheme = baseURL[:idx+3] - baseURL = baseURL[idx+3:] - } - if idx := strings.Index(baseURL, "/"); idx > 0 { - meta = NewComponentRepositoryMeta(baseURL[idx+1:]) - baseURL = scheme + baseURL[:idx] - } - } - - return genericocireg.NewRepositorySpec(ocireg.NewRepositorySpec(baseURL), meta) + return genericocireg.NewRepositorySpec(ocireg.NewRepositorySpec(baseURL), utils.Optional(metas...)) } func NewComponentRepositoryMeta(subPath string, mapping ...ComponentNameMapping) *ComponentRepositoryMeta { diff --git a/pkg/contexts/ocm/transfer/transfer.go b/pkg/contexts/ocm/transfer/transfer.go index deb2576bb0..b14884902f 100644 --- a/pkg/contexts/ocm/transfer/transfer.go +++ b/pkg/contexts/ocm/transfer/transfer.go @@ -215,7 +215,7 @@ func transferVersion(printer common.Printer, log logging.Logger, state WalkingSt } func CopyVersion(printer common.Printer, log logging.Logger, hist common.History, src ocm.ComponentVersionAccess, t ocm.ComponentVersionAccess, handler TransferHandler) (rerr error) { - return copyVersion(printer, log, hist, src, t, src.GetDescriptor().Copy(), handler) + return copyVersion(common.AssurePrinter(printer), log, hist, src, t, src.GetDescriptor().Copy(), handler) } // copyVersion (purely internal) expects an already prepared target comp desc for t given as prep. From e7ef62a3f770752ac38d3b6a12d020836477c20c Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Wed, 3 Apr 2024 10:20:27 +0200 Subject: [PATCH 19/83] readonly mode configurable for CVs (#711) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description So far, only complete OCM repositories can be handled in ReadOnly mode. THis PR introduces the possibility to set a dedicate CV access to readonly mode. to avoid undesired writes to the backend. ## What type of PR is this? (check all applicable) - [x] πŸ• Feature - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [x] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [x] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- Makefile | 2 +- cmds/ocm/app/app_test.go | 4 +- cmds/ocm/topics/common/credentials/topic.go | 10 +++ components/helminstaller/Dockerfile | 2 +- .../ocm_add_componentversions_ocm-labels.md | 6 +- docs/reference/ocm_credential-handling.md | 16 ++++ docs/reference/ocm_logging.md | 1 + docs/reference/ocm_ocm-labels.md | 6 +- go.mod | 4 +- go.sum | 2 + pkg/common/accessobj/accessobject.go | 4 + pkg/common/accessobj/accessstate.go | 6 ++ pkg/common/accessobj/filesystemaccess.go | 4 + pkg/contexts/datacontext/context.go | 4 + pkg/contexts/datacontext/session.go | 4 + .../compdesc/meta/v1/zz_generated.deepcopy.go | 1 - .../v3alpha1/zz_generated.deepcopy.go | 1 - .../versions/v2/zz_generated.deepcopy.go | 1 - pkg/contexts/ocm/cpi/dummy.go | 7 ++ pkg/contexts/ocm/cpi/repocpi/backend.go | 23 +++++- pkg/contexts/ocm/cpi/repocpi/bridge_cv.go | 5 ++ pkg/contexts/ocm/cpi/repocpi/bridge_r.go | 11 +++ pkg/contexts/ocm/cpi/repocpi/view_cv.go | 9 +++ pkg/contexts/ocm/cpi/repocpi/view_r.go | 11 +++ pkg/contexts/ocm/internal/repository.go | 14 +++- .../repositories/comparch/componentarchive.go | 8 ++ .../ocm/repositories/comparch/repository.go | 12 +++ .../repositories/composition/repository.go | 37 ++++++--- .../composition/repository_test.go | 37 +++++++++ .../ocm/repositories/ctf/repo_test.go | 75 +++++++++++++++++++ .../repositories/genericocireg/component.go | 13 +++- .../genericocireg/componentversion.go | 4 + .../ocm/repositories/genericocireg/logging.go | 2 + .../repositories/genericocireg/repository.go | 20 +++-- .../ocm/repositories/genericocireg/state.go | 12 +++ .../ocm/repositories/virtual/access.go | 2 + .../repositories/virtual/componentversion.go | 4 + .../repositories/virtual/example/example.go | 21 ++++-- .../ocm/repositories/virtual/repository.go | 8 ++ pkg/errors/list.go | 4 + pkg/logging/interface.go | 1 + pkg/logging/logging.go | 19 +++++ 42 files changed, 396 insertions(+), 41 deletions(-) diff --git a/Makefile b/Makefile index 11fdd1bed0..57f3e63682 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ EFFECTIVE_VERSION := $(VERSION)+$(shell git rev-par GIT_TREE_STATE := $(shell [ -z "$$(git status --porcelain 2>/dev/null)" ] && echo clean || echo dirty) COMMIT := $(shell git rev-parse --verify HEAD) -CONTROLLER_TOOLS_VERSION ?= v0.9.0 +CONTROLLER_TOOLS_VERSION ?= v0.14.0 CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen CREDS ?= diff --git a/cmds/ocm/app/app_test.go b/cmds/ocm/app/app_test.go index 1c6feb4a7c..1980b7faf9 100644 --- a/cmds/ocm/app/app_test.go +++ b/cmds/ocm/app/app_test.go @@ -137,7 +137,9 @@ ERROR ctxerror realm ocm realm test Expect(err).To(Succeed()) fmt.Printf("%s\n", string(data)) - Expect(len(string(data))).To(Equal(181)) + // {"level":"error","msg":"error","realm":"test","time":"2024-03-27 09:54:19"} + // {"level":"error","msg":"ctxerror","realm":"test","time":"2024-03-27 09:54:19"} + Expect(len(string(data))).To(Equal(155)) }) It("sets attr from file", func() { diff --git a/cmds/ocm/topics/common/credentials/topic.go b/cmds/ocm/topics/common/credentials/topic.go index 821761d27c..4c8835656a 100644 --- a/cmds/ocm/topics/common/credentials/topic.go +++ b/cmds/ocm/topics/common/credentials/topic.go @@ -133,6 +133,16 @@ behaviours are described in the following list: ### Credential Providers +Credential providers offer sets of named credentials from variuos sources, +which might be directly mapped to consumer identities (if supported +by the provider type). + +The type Credentials can be used to inline +credentials in credential configuration objects +to configure mappings of consumer identities to a credential +set (see ocm configfile). + +The following types are currently available: ` + ctx.CredentialsContext().RepositoryTypes().Describe(), } } diff --git a/components/helminstaller/Dockerfile b/components/helminstaller/Dockerfile index d160f60630..7473c4596d 100644 --- a/components/helminstaller/Dockerfile +++ b/components/helminstaller/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM golang:1.21 AS builder +FROM --platform=$BUILDPLATFORM golang:1.22 AS builder ARG COMMIT EFFECTIVE_VERSION GIT_TREE_STATE ARG TARGETOS TARGETARCH diff --git a/docs/reference/ocm_add_componentversions_ocm-labels.md b/docs/reference/ocm_add_componentversions_ocm-labels.md index 13f59fcf92..4652a06ec6 100644 --- a/docs/reference/ocm_add_componentversions_ocm-labels.md +++ b/docs/reference/ocm_add_componentversions_ocm-labels.md @@ -16,7 +16,7 @@ which is a list of label definitions. Every label definition has several fields: - *name* *string* - The name of the label also determines the interpretaion of its value. All labels + The name of the label also determines the interpretation of its value. All labels with a dedicated name must have the same globally unique meaning, enabling a common understanding of label content for tools working of such properties of an element. @@ -40,7 +40,7 @@ which is a list of label definitions. Every label definition has several fields: - *value* *any* - The value of the label accoding to the specified format version of the + The value of the label according to the specified format version of the label in the context of its name. - *signing* *bool* (optional) @@ -49,7 +49,7 @@ which is a list of label definitions. Every label definition has several fields: digest of the component version. This allows adding, deleting or modifying labels as part of a process chain during the lifecycle of a component version. - Labels which should describe relevant and unmodifyable content can be marked + Labels which should describe relevant and unmodifiable content can be marked to be signing relevant by setting this label field to true. - *merge* *merge spec* (optional) diff --git a/docs/reference/ocm_credential-handling.md b/docs/reference/ocm_credential-handling.md index 46b2699ce3..998d942fda 100644 --- a/docs/reference/ocm_credential-handling.md +++ b/docs/reference/ocm_credential-handling.md @@ -248,6 +248,16 @@ behaviours are described in the following list: ### Credential Providers +Credential providers offer sets of named credentials from variuos sources, +which might be directly mapped to consumer identities (if supported +by the provider type). + +The type Credentials can be used to inline +credentials in credential configuration objects +to configure mappings of consumer identities to a credential +set (see [ocm configfile](ocm_configfile.md)). + +The following types are currently available: - Credential provider Credentials @@ -356,3 +366,9 @@ behaviours are described in the following list: * [ocm](ocm.md) — Open Component Model command line client + + +##### Additional Links + +* [ocm configfile](ocm_configfile.md) — configuration file + diff --git a/docs/reference/ocm_logging.md b/docs/reference/ocm_logging.md index 58f0dc7801..08a6292a2c 100644 --- a/docs/reference/ocm_logging.md +++ b/docs/reference/ocm_logging.md @@ -12,6 +12,7 @@ for dedicated tags and realms or realm prefixes (logging keys). The following *tags* are used by the command line tool: - blobhandler: execution of blob handler used to upload resource blobs to an ocm repository. + - cd-diff: component descriptor modification diff --git a/docs/reference/ocm_ocm-labels.md b/docs/reference/ocm_ocm-labels.md index 51c305ece1..82e13977f8 100644 --- a/docs/reference/ocm_ocm-labels.md +++ b/docs/reference/ocm_ocm-labels.md @@ -16,7 +16,7 @@ which is a list of label definitions. Every label definition has several fields: - *name* *string* - The name of the label also determines the interpretaion of its value. All labels + The name of the label also determines the interpretation of its value. All labels with a dedicated name must have the same globally unique meaning, enabling a common understanding of label content for tools working of such properties of an element. @@ -40,7 +40,7 @@ which is a list of label definitions. Every label definition has several fields: - *value* *any* - The value of the label accoding to the specified format version of the + The value of the label according to the specified format version of the label in the context of its name. - *signing* *bool* (optional) @@ -49,7 +49,7 @@ which is a list of label definitions. Every label definition has several fields: digest of the component version. This allows adding, deleting or modifying labels as part of a process chain during the lifecycle of a component version. - Labels which should describe relevant and unmodifyable content can be marked + Labels which should describe relevant and unmodifiable content can be marked to be signing relevant by setting this label field to true. - *merge* *merge spec* (optional) diff --git a/go.mod b/go.mod index 7a819b0fb8..558382efc1 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/open-component-model/ocm -go 1.21 +go 1.22 replace github.com/spf13/cobra => github.com/open-component-model/cobra v0.0.0-20230329075350-b1fd876abfb9 @@ -39,7 +39,7 @@ require ( github.com/klauspost/compress v1.17.4 github.com/klauspost/pgzip v1.2.6 github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3 - github.com/mandelsoft/logging v0.0.0-20230905123808-7042ee3aae45 + github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf github.com/mandelsoft/spiff v1.7.0-beta-5 github.com/mandelsoft/vfs v0.4.3 github.com/marstr/guid v1.1.0 diff --git a/go.sum b/go.sum index ff00b08b5b..0491278013 100644 --- a/go.sum +++ b/go.sum @@ -641,6 +641,8 @@ github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3 h1:oo9nIgnyiBg github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3/go.mod h1:LxhqC7khDoRENwooP6f/vWvia9ivj6TqLYrR39zqkN0= github.com/mandelsoft/logging v0.0.0-20230905123808-7042ee3aae45 h1:BGJBqw9q1Brn3XAYcj52hhonjV7aHUftVJ3SuJpXQ/M= github.com/mandelsoft/logging v0.0.0-20230905123808-7042ee3aae45/go.mod h1:J/kRqdfAOQmMPfJeAcV2pfX1QLV9/NlAQdAJzpnaU+g= +github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf h1:WEmgzeArDbp6Aw34jmziMIE5ygo2zpl/atXRq3D7lSw= +github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf/go.mod h1:uO460C1lIB3IOOgrbXhAlz3AKsOv4T2K6ALBn3PwuSg= github.com/mandelsoft/spiff v1.7.0-beta-5 h1:3kC10nTviDQhL8diSxp7i4IC2iSiDg6KPbH1CAq7Lfw= github.com/mandelsoft/spiff v1.7.0-beta-5/go.mod h1:TwEeOPuRZxlzQBCLEyVTlHmBSruSGGNdiQ2fovVJ8ao= github.com/mandelsoft/vfs v0.4.3 h1:2UMrxQkMXkcHyuqSFhgFDupQ1fmqpKLZuu04DOHx1PA= diff --git a/pkg/common/accessobj/accessobject.go b/pkg/common/accessobj/accessobject.go index 372c08d174..12fc35f91a 100644 --- a/pkg/common/accessobj/accessobject.go +++ b/pkg/common/accessobj/accessobject.go @@ -150,6 +150,10 @@ func (a *AccessObject) IsReadOnly() bool { return a.state.IsReadOnly() } +func (a *AccessObject) SetReadOnly() { + a.state.SetReadOnly() +} + func (a *AccessObject) updateDescriptor() (bool, error) { if a.IsClosed() { return false, accessio.ErrClosed diff --git a/pkg/common/accessobj/accessstate.go b/pkg/common/accessobj/accessstate.go index a590ec8330..696a761a9e 100644 --- a/pkg/common/accessobj/accessstate.go +++ b/pkg/common/accessobj/accessstate.go @@ -114,6 +114,8 @@ type State interface { // Update updates the technical representation in its persistence Update() (bool, error) + + SetReadOnly() } type state struct { @@ -203,6 +205,10 @@ func NewBlobStateForObject(mode AccessMode, obj interface{}, p StateHandler) (St return NewBlobStateForBlob(mode, blobaccess.ForData("", data), p) } +func (s *state) SetReadOnly() { + s.mode |= ACC_READONLY +} + func (s *state) IsReadOnly() bool { return s.mode.IsReadonly() } diff --git a/pkg/common/accessobj/filesystemaccess.go b/pkg/common/accessobj/filesystemaccess.go index 2afbe01ceb..116c9ea75d 100644 --- a/pkg/common/accessobj/filesystemaccess.go +++ b/pkg/common/accessobj/filesystemaccess.go @@ -35,6 +35,10 @@ func (a *FileSystemBlobAccess) Access() *AccessObject { return a.base } +func (a *FileSystemBlobAccess) SetReadOnly() { + a.base.SetReadOnly() +} + func (a *FileSystemBlobAccess) IsReadOnly() bool { return a.base.IsReadOnly() } diff --git a/pkg/contexts/datacontext/context.go b/pkg/contexts/datacontext/context.go index b3f836710b..1cf0a7fe19 100644 --- a/pkg/contexts/datacontext/context.go +++ b/pkg/contexts/datacontext/context.go @@ -92,6 +92,10 @@ func (d _delegates) LoggingContext() logging.Context { return d.logging } +func (d _delegates) AttributionContext() logging.AttributionContext { + return d.logging.AttributionContext() +} + func (d _delegates) Logger(messageContext ...logging.MessageContext) logging.Logger { return d.logging.Logger(messageContext) } diff --git a/pkg/contexts/datacontext/session.go b/pkg/contexts/datacontext/session.go index 750bbd4380..b05f8d44d0 100644 --- a/pkg/contexts/datacontext/session.go +++ b/pkg/contexts/datacontext/session.go @@ -18,6 +18,10 @@ import ( // Added closers may be closed prio to the session without causing // errors. type Session interface { + // Closer adds a closer returned by a function call providing a closer and an error + // to the session if not error is returned. The results of the call are forwarded to + // the own result. Unfortunately, Go does not support type parameters for methods, + // therefore only an io.Closer can be returned a function result. Closer(closer io.Closer, extra ...interface{}) (io.Closer, error) GetOrCreate(key interface{}, creator func(SessionBase) Session) Session AddCloser(closer io.Closer, callbacks ...accessio.CloserCallback) io.Closer diff --git a/pkg/contexts/ocm/compdesc/meta/v1/zz_generated.deepcopy.go b/pkg/contexts/ocm/compdesc/meta/v1/zz_generated.deepcopy.go index e3e8dc5ab0..bd3d75bd51 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/zz_generated.deepcopy.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. // diff --git a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/zz_generated.deepcopy.go b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/zz_generated.deepcopy.go index 1933041e9c..6a7a920bdb 100644 --- a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/zz_generated.deepcopy.go +++ b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. // diff --git a/pkg/contexts/ocm/compdesc/versions/v2/zz_generated.deepcopy.go b/pkg/contexts/ocm/compdesc/versions/v2/zz_generated.deepcopy.go index 6eae2539c5..bd66eac0f6 100644 --- a/pkg/contexts/ocm/compdesc/versions/v2/zz_generated.deepcopy.go +++ b/pkg/contexts/ocm/compdesc/versions/v2/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. // diff --git a/pkg/contexts/ocm/cpi/dummy.go b/pkg/contexts/ocm/cpi/dummy.go index 099bf84ab4..1e8856b7ca 100644 --- a/pkg/contexts/ocm/cpi/dummy.go +++ b/pkg/contexts/ocm/cpi/dummy.go @@ -31,6 +31,13 @@ func (d *DummyComponentVersionAccess) IsClosed() bool { return false } +func (d *DummyComponentVersionAccess) IsReadOnly() bool { + return true +} + +func (d *DummyComponentVersionAccess) SetReadOnly() { +} + func (d *DummyComponentVersionAccess) Dup() (ComponentVersionAccess, error) { return d, nil } diff --git a/pkg/contexts/ocm/cpi/repocpi/backend.go b/pkg/contexts/ocm/cpi/repocpi/backend.go index cbfeabee7b..5b03d33e97 100644 --- a/pkg/contexts/ocm/cpi/repocpi/backend.go +++ b/pkg/contexts/ocm/cpi/repocpi/backend.go @@ -29,7 +29,14 @@ type StorageBackendImpl interface { io.Closer GetContext() cpi.Context GetSpecification() cpi.RepositorySpec - IsReadOnly() bool + + // IsReadOnly returns readonly mode for repo, + // if key is given for the dedicated component version access. + IsReadOnly(key ...common.NameVersion) bool + + // SetReadOnly sets readonly mode for repo, + // if key is given for the dedicated component version access. + SetReadOnly(key ...common.NameVersion) ComponentLister() cpi.ComponentLister HasComponent(name string) (bool, error) @@ -90,6 +97,14 @@ func (s *storageBackendRepository) Close() error { return s.impl.Close() } +func (s *storageBackendRepository) IsReadOnly() bool { + return s.impl.IsReadOnly() +} + +func (s *storageBackendRepository) SetReadOnly() { + s.impl.SetReadOnly() +} + func (s *storageBackendRepository) GetContext() cpi.Context { return s.impl.GetContext() } @@ -242,7 +257,11 @@ func (s *storageBackendComponentVersion) Repository() cpi.Repository { } func (s *storageBackendComponentVersion) IsReadOnly() bool { - return s.comp.repo.impl.IsReadOnly() + return s.comp.repo.impl.IsReadOnly() || s.comp.repo.impl.IsReadOnly(s.name) +} + +func (s *storageBackendComponentVersion) SetReadOnly() { + s.comp.repo.impl.SetReadOnly(s.name) } func (s *storageBackendComponentVersion) GetDescriptor() *compdesc.ComponentDescriptor { diff --git a/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go b/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go index 95bdc20a47..b50611bb05 100644 --- a/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go +++ b/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go @@ -41,6 +41,7 @@ type ComponentVersionAccessImpl interface { Repository() cpi.Repository IsReadOnly() bool + SetReadOnly() GetDescriptor() *compdesc.ComponentDescriptor SetDescriptor(*compdesc.ComponentDescriptor) error @@ -182,6 +183,10 @@ func (b *componentVersionAccessBridge) IsReadOnly() bool { return b.impl.IsReadOnly() } +func (b *componentVersionAccessBridge) SetReadOnly() { + b.impl.SetReadOnly() +} + //////////////////////////////////////////////////////////////////////////////// // with access to actual view diff --git a/pkg/contexts/ocm/cpi/repocpi/bridge_r.go b/pkg/contexts/ocm/cpi/repocpi/bridge_r.go index 0af0c2c2c0..c59a39fd3b 100644 --- a/pkg/contexts/ocm/cpi/repocpi/bridge_r.go +++ b/pkg/contexts/ocm/cpi/repocpi/bridge_r.go @@ -25,6 +25,9 @@ type RepositoryImpl interface { GetContext() cpi.Context + IsReadOnly() bool + SetReadOnly() + GetSpecification() cpi.RepositorySpec ComponentLister() cpi.ComponentLister @@ -69,6 +72,14 @@ func (b *repositoryBridge) GetContext() cpi.Context { return b.ctx } +func (b *repositoryBridge) IsReadOnly() bool { + return b.impl.IsReadOnly() +} + +func (b *repositoryBridge) SetReadOnly() { + b.impl.SetReadOnly() +} + func (b *repositoryBridge) Unwrap() interface{} { return b.impl } diff --git a/pkg/contexts/ocm/cpi/repocpi/view_cv.go b/pkg/contexts/ocm/cpi/repocpi/view_cv.go index f6c131f989..76b4bbe02e 100644 --- a/pkg/contexts/ocm/cpi/repocpi/view_cv.go +++ b/pkg/contexts/ocm/cpi/repocpi/view_cv.go @@ -74,6 +74,7 @@ type ComponentVersionAccessBridge interface { AddBlob(blob cpi.BlobAccess, arttype, refName string, global cpi.AccessSpec, final bool, opts *cpi.BlobUploadOptions) (cpi.AccessSpec, error) IsReadOnly() bool + SetReadOnly() // ShouldUpdate checks, whether an update is indicated // by the state of object, considering persistence, lazy, discard @@ -142,6 +143,14 @@ func (c *componentVersionAccessView) Unwrap() interface{} { return c.bridge } +func (c *componentVersionAccessView) IsReadOnly() bool { + return c.bridge.IsReadOnly() +} + +func (c *componentVersionAccessView) SetReadOnly() { + c.bridge.SetReadOnly() +} + func (c *componentVersionAccessView) Close() error { list := errors.ErrListf("closing %s", common.VersionedElementKey(c)) err := c._componentVersionAccessView.Close() diff --git a/pkg/contexts/ocm/cpi/repocpi/view_r.go b/pkg/contexts/ocm/cpi/repocpi/view_r.go index 3c94f10fb6..a1fcfcbde5 100644 --- a/pkg/contexts/ocm/cpi/repocpi/view_r.go +++ b/pkg/contexts/ocm/cpi/repocpi/view_r.go @@ -35,6 +35,9 @@ type RepositoryBridge interface { GetContext() cpi.Context + IsReadOnly() bool + SetReadOnly() + GetSpecification() cpi.RepositorySpec ComponentLister() cpi.ComponentLister @@ -117,6 +120,14 @@ func (r *repositoryView) GetContext() cpi.Context { return r.bridge.GetContext() } +func (r *repositoryView) IsReadOnly() bool { + return r.bridge.IsReadOnly() +} + +func (r *repositoryView) SetReadOnly() { + r.bridge.SetReadOnly() +} + func (r *repositoryView) ComponentLister() cpi.ComponentLister { return r.bridge.ComponentLister() } diff --git a/pkg/contexts/ocm/internal/repository.go b/pkg/contexts/ocm/internal/repository.go index e87fc06d04..8505db3983 100644 --- a/pkg/contexts/ocm/internal/repository.go +++ b/pkg/contexts/ocm/internal/repository.go @@ -15,6 +15,16 @@ import ( "github.com/open-component-model/ocm/pkg/refmgmt/resource" ) +type ReadOnlyFeature interface { + IsReadOnly() bool + // SetReadOnly is used to set the element into readonly mode. + // Once enabled it cannot be reverted. An underlying object, for + // example a CTF might be in readonly mode, forced by filesystem + // permissions. Such elements cannot be set into write mode again. + // Therefore, generally only one direction is possible. + SetReadOnly() +} + type ComponentVersionResolver interface { LookupComponentVersion(name string, version string) (ComponentVersionAccess, error) } @@ -29,7 +39,8 @@ type RepositoryImpl interface { LookupComponentVersion(name string, version string) (ComponentVersionAccess, error) LookupComponent(name string) (ComponentAccess, error) - Close() error + io.Closer + ReadOnlyFeature } type Repository interface { @@ -109,6 +120,7 @@ type ComponentVersionAccess interface { resource.ResourceView[ComponentVersionAccess] common.VersionedElement io.Closer + ReadOnlyFeature GetContext() Context Repository() Repository diff --git a/pkg/contexts/ocm/repositories/comparch/componentarchive.go b/pkg/contexts/ocm/repositories/comparch/componentarchive.go index 1ee8f4cf25..42eaa96fa0 100644 --- a/pkg/contexts/ocm/repositories/comparch/componentarchive.go +++ b/pkg/contexts/ocm/repositories/comparch/componentarchive.go @@ -80,6 +80,10 @@ func (c *ComponentArchive) IsReadOnly() bool { return c.container.IsReadOnly() } +func (c *ComponentArchive) SetReadOnly() { + c.container.SetReadOnly() +} + // Repository returns a non referencing repository which does not // close the archive. func (c *ComponentArchive) Repository() cpi.Repository { @@ -136,6 +140,10 @@ func (c *componentArchiveContainer) IsReadOnly() bool { return c.fsacc.IsReadOnly() } +func (c *componentArchiveContainer) SetReadOnly() { + c.fsacc.SetReadOnly() +} + func (c *componentArchiveContainer) Update() error { return c.fsacc.Update() } diff --git a/pkg/contexts/ocm/repositories/comparch/repository.go b/pkg/contexts/ocm/repositories/comparch/repository.go index 7ab49eea54..56ae0d1078 100644 --- a/pkg/contexts/ocm/repositories/comparch/repository.go +++ b/pkg/contexts/ocm/repositories/comparch/repository.go @@ -57,6 +57,14 @@ func (r *RepositoryImpl) Close() error { return r.arch.container.Close() } +func (r *RepositoryImpl) IsReadOnly() bool { + return r.arch.IsReadOnly() +} + +func (r *RepositoryImpl) SetReadOnly() { + r.arch.SetReadOnly() +} + func (r *RepositoryImpl) SetBridge(base repocpi.RepositoryBridge) { r.bridge = base r.nonref = repocpi.NewNoneRefRepositoryView(base) @@ -256,6 +264,10 @@ func (c *ComponentVersionContainer) IsReadOnly() bool { return c.comp.repo.arch.IsReadOnly() } +func (c *ComponentVersionContainer) SetReadOnly() { + c.comp.repo.arch.SetReadOnly() +} + func (c *ComponentVersionContainer) Update() error { desc := c.comp.repo.arch.GetDescriptor() *desc = *c.descriptor.Copy() diff --git a/pkg/contexts/ocm/repositories/composition/repository.go b/pkg/contexts/ocm/repositories/composition/repository.go index 02093212ce..aa39d52042 100644 --- a/pkg/contexts/ocm/repositories/composition/repository.go +++ b/pkg/contexts/ocm/repositories/composition/repository.go @@ -11,6 +11,7 @@ import ( "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" + "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localblob" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" @@ -43,9 +44,10 @@ func NewRepository(ctx cpi.ContextProvider, names ...string) cpi.Repository { type Index = virtual.Index[common.NameVersion] type Access struct { - lock sync.Mutex - index *Index - blobs map[string]blobaccess.BlobAccess + lock sync.Mutex + index *Index + blobs map[string]blobaccess.BlobAccess + readonly bool } var _ virtual.Access = (*Access)(nil) @@ -58,7 +60,11 @@ func NewAccess() *Access { } func (a *Access) IsReadOnly() bool { - return false + return a.readonly +} + +func (a *Access) SetReadOnly() { + a.readonly = true } func (a *Access) ComponentLister() cpi.ComponentLister { @@ -99,7 +105,7 @@ func (a *Access) GetComponentVersion(comp, version string) (virtual.VersionAcces } else { cd = i.CD() } - return &VersionAccess{a, cd.GetName(), cd.GetVersion(), cd.Copy()}, nil + return &VersionAccess{a, cd.GetName(), cd.GetVersion(), a.IsReadOnly(), cd.Copy()}, nil } func (a *Access) GetBlob(name string) (blobaccess.BlobAccess, error) { @@ -141,10 +147,11 @@ func (a *Access) Close() error { var _ virtual.Access = (*Access)(nil) type VersionAccess struct { - access *Access - comp string - vers string - desc *compdesc.ComponentDescriptor + access *Access + comp string + vers string + readonly bool + desc *compdesc.ComponentDescriptor } func (v *VersionAccess) GetDescriptor() *compdesc.ComponentDescriptor { @@ -156,6 +163,9 @@ func (v *VersionAccess) GetBlob(name string) (cpi.DataAccess, error) { } func (v *VersionAccess) AddBlob(blob cpi.BlobAccess) (string, error) { + if v.readonly { + return "", accessio.ErrReadOnly + } return v.access.AddBlob(blob) } @@ -163,6 +173,9 @@ func (v *VersionAccess) Update() error { v.access.lock.Lock() defer v.access.lock.Unlock() + if v.readonly { + return accessio.ErrReadOnly + } if v.desc.GetName() != v.comp || v.desc.GetVersion() != v.vers { return errors.ErrInvalid(cpi.KIND_COMPONENTVERSION, common.VersionedElementKey(v.desc).String()) } @@ -178,7 +191,11 @@ func (v *VersionAccess) Close() error { } func (v *VersionAccess) IsReadOnly() bool { - return false + return v.readonly +} + +func (v *VersionAccess) SetReadOnly() { + v.readonly = true } func (v *VersionAccess) GetInexpensiveContentVersionIdentity(a cpi.AccessSpec) string { diff --git a/pkg/contexts/ocm/repositories/composition/repository_test.go b/pkg/contexts/ocm/repositories/composition/repository_test.go index fb09b00c35..cefbf5b1d0 100644 --- a/pkg/contexts/ocm/repositories/composition/repository_test.go +++ b/pkg/contexts/ocm/repositories/composition/repository_test.go @@ -7,6 +7,8 @@ package composition_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/open-component-model/ocm/pkg/common/accessio" + "github.com/open-component-model/ocm/pkg/common/accessobj" . "github.com/open-component-model/ocm/pkg/testutils" "github.com/mandelsoft/vfs/pkg/memoryfs" @@ -97,4 +99,39 @@ var _ = Describe("repository", func() { MustBeSuccessful(finalize.Finalize()) Expect(refmgmt.ReferenceCount(repo)).To(Equal(1)) }) + + It("readonly mode on repo", func() { + env := builder.NewBuilder(env.FileSystem(memoryfs.New(), "")) + + env.OCMCompositionRepository("test", func() { + env.Component(COMPONENT, func() { + env.Version(VERSION, func() { + env.Provider("acme.org") + env.Resource("text", VERSION, "special", metav1.LocalRelation, func() { + env.BlobStringData(mime.MIME_TEXT, "testdata") + }) + }) + }) + }) + + var finalize finalizer.Finalizer + defer Defer(finalize.Finalize, "final") + + sess := ocm.NewSession(nil) + repo := me.NewRepository(env, "test") + sess.AddCloser(repo) + finalize.Close(sess, "repo") + + repo.SetReadOnly() + Expect(repo.IsReadOnly()).To(BeTrue()) + + cv := Must(repo.LookupComponentVersion(COMPONENT, VERSION)) + cl := accessio.OnceCloser(cv) + sess.AddCloser(cl) + + Expect(cv.IsReadOnly()).To(BeTrue()) + + cv.GetDescriptor().Provider.Name = "acme.org" + ExpectError(cl.Close()).To(MatchError(accessobj.ErrReadOnly)) + }) }) diff --git a/pkg/contexts/ocm/repositories/ctf/repo_test.go b/pkg/contexts/ocm/repositories/ctf/repo_test.go index 6553239d65..c4d3e57734 100644 --- a/pkg/contexts/ocm/repositories/ctf/repo_test.go +++ b/pkg/contexts/ocm/repositories/ctf/repo_test.go @@ -5,11 +5,17 @@ package ctf_test import ( + "bytes" + + "github.com/mandelsoft/logging" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/genericocireg" . "github.com/open-component-model/ocm/pkg/contexts/ocm/testhelper" . "github.com/open-component-model/ocm/pkg/finalizer" + ocmlog "github.com/open-component-model/ocm/pkg/logging" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/tonglil/buflogr" "github.com/mandelsoft/vfs/pkg/memoryfs" "github.com/mandelsoft/vfs/pkg/vfs" @@ -171,4 +177,73 @@ var _ = Describe("access method", func() { MustBeSuccessful(final.Finalize()) }) + + It("logs diff", func() { + r := Must(ctf.Open(ctx, ctf.ACC_CREATE, "test.ctf", 0o700, accessio.FormatDirectory, accessio.PathFileSystem(fs))) + defer Close(r, "repo") + + c := Must(r.LookupComponent("acme.org/test")) + defer Close(c, "comp") + + cv := Must(c.NewVersion("v1")) + + ocmlog.PushContext(nil) + ocmlog.Context().AddRule(logging.NewConditionRule(logging.DebugLevel, genericocireg.TAG_CDDIFF)) + var buf bytes.Buffer + def := buflogr.NewWithBuffer(&buf) + ocmlog.Context().SetBaseLogger(def) + defer ocmlog.Context().ResetRules() + defer ocmlog.PopContext() + + MustBeSuccessful(c.AddVersion(cv)) + MustBeSuccessful(cv.Close()) + + cv = Must(c.LookupVersion("v1")) + cv.GetDescriptor().Provider.Name = "acme.org" + MustBeSuccessful(cv.Close()) + Expect("\n" + buf.String()).To(Equal(` +V[4] component descriptor has been changed realm ocm realm ocm/oci/mapping diff [ComponentSpec.ObjectMeta.Provider.Name: acme != acme.org] +V[4] component descriptor has been changed realm ocm realm ocm/oci/mapping diff [ComponentSpec.ObjectMeta.Provider.Name: acme != acme.org] +`)) + }) + + It("handles readonly mode", func() { + r := Must(ctf.Open(ctx, ctf.ACC_CREATE, "test.ctf", 0o700, accessio.FormatDirectory, accessio.PathFileSystem(fs))) + defer Close(r, "repo") + + c := Must(r.LookupComponent("acme.org/test")) + defer Close(c, "comp") + + cv := Must(c.NewVersion("v1")) + + MustBeSuccessful(c.AddVersion(cv)) + MustBeSuccessful(cv.Close()) + + cv = Must(c.LookupVersion("v1")) + cv.SetReadOnly() + Expect(cv.IsReadOnly()).To(BeTrue()) + cv.GetDescriptor().Provider.Name = "acme.org" + ExpectError(cv.Close()).To(MatchError(accessio.ErrReadOnly)) + }) + + It("handles readonly mode on repo", func() { + r := Must(ctf.Open(ctx, ctf.ACC_CREATE, "test.ctf", 0o700, accessio.FormatDirectory, accessio.PathFileSystem(fs))) + defer Close(r, "repo") + + c := Must(r.LookupComponent("acme.org/test")) + defer Close(c, "comp") + + cv := Must(c.NewVersion("v1")) + + MustBeSuccessful(c.AddVersion(cv)) + MustBeSuccessful(cv.Close()) + + r.SetReadOnly() + cv = Must(c.LookupVersion("v1")) + Expect(cv.IsReadOnly()).To(BeTrue()) + cv.GetDescriptor().Provider.Name = "acme.org" + ExpectError(cv.Close()).To(MatchError(accessio.ErrReadOnly)) + + ExpectError(c.NewVersion("v2")).To(MatchError(accessio.ErrReadOnly)) + }) }) diff --git a/pkg/contexts/ocm/repositories/genericocireg/component.go b/pkg/contexts/ocm/repositories/genericocireg/component.go index 9343493847..02d7131414 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/component.go +++ b/pkg/contexts/ocm/repositories/genericocireg/component.go @@ -9,6 +9,7 @@ import ( "github.com/Masterminds/semver/v3" + "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" @@ -96,8 +97,7 @@ func toVersion(t string) string { } func (c *componentAccessImpl) IsReadOnly() bool { - // TODO: extend OCI to query ReadOnly mode - return false + return c.repo.IsReadOnly() } func (c *componentAccessImpl) ListVersions() ([]string, error) { @@ -139,10 +139,17 @@ func (c *componentAccessImpl) LookupVersion(version string) (*repocpi.ComponentV } return nil, err } - return newComponentVersionAccess(accessobj.ACC_WRITABLE, c, version, acc, true) + m := accessobj.ACC_WRITABLE + if c.IsReadOnly() { + m = accessobj.ACC_READONLY + } + return newComponentVersionAccess(m, c, version, acc, true) } func (c *componentAccessImpl) NewVersion(version string, overrides ...bool) (*repocpi.ComponentVersionAccessInfo, error) { + if c.IsReadOnly() { + return nil, accessio.ErrReadOnly + } override := utils.Optional(overrides...) acc, err := c.namespace.GetArtifact(toTag(version)) if err == nil { diff --git a/pkg/contexts/ocm/repositories/genericocireg/componentversion.go b/pkg/contexts/ocm/repositories/genericocireg/componentversion.go index 6458f4c49f..322b8726b9 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/componentversion.go +++ b/pkg/contexts/ocm/repositories/genericocireg/componentversion.go @@ -91,6 +91,10 @@ func (c *ComponentVersionContainer) Close() error { return c.access.Close() } +func (c *ComponentVersionContainer) SetReadOnly() { + c.state.SetReadOnly() +} + func (c *ComponentVersionContainer) Check() error { if c.version != c.GetDescriptor().Version { return errors.ErrInvalid("component version", c.GetDescriptor().Version) diff --git a/pkg/contexts/ocm/repositories/genericocireg/logging.go b/pkg/contexts/ocm/repositories/genericocireg/logging.go index be788483d8..162225750f 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/logging.go +++ b/pkg/contexts/ocm/repositories/genericocireg/logging.go @@ -12,6 +12,8 @@ import ( var REALM = ocmlog.DefineSubRealm("OCM to OCI Registry Mapping", "oci", "mapping") +var TAG_CDDIFF = logging.DefineTag("cd-diff", "component descriptor modification") + func Logger(ctx logging.ContextProvider, messageContext ...logging.MessageContext) logging.Logger { return ctx.LoggingContext().Logger(append([]logging.MessageContext{REALM}, messageContext...)) } diff --git a/pkg/contexts/ocm/repositories/genericocireg/repository.go b/pkg/contexts/ocm/repositories/genericocireg/repository.go index 88a5824eb2..3cb94399b8 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/repository.go +++ b/pkg/contexts/ocm/repositories/genericocireg/repository.go @@ -40,11 +40,12 @@ func GetOCIRepository(r cpi.Repository) ocicpi.Repository { } type RepositoryImpl struct { - bridge repocpi.RepositoryBridge - ctx cpi.Context - meta ComponentRepositoryMeta - nonref cpi.Repository - ocirepo oci.Repository + bridge repocpi.RepositoryBridge + ctx cpi.Context + meta ComponentRepositoryMeta + nonref cpi.Repository + ocirepo oci.Repository + readonly bool } var ( @@ -65,6 +66,15 @@ func (r *RepositoryImpl) Close() error { return r.ocirepo.Close() } +func (r *RepositoryImpl) IsReadOnly() bool { + // TODO: extend OCI to query ReadOnly mode + return r.readonly +} + +func (r *RepositoryImpl) SetReadOnly() { + r.readonly = true +} + func (r *RepositoryImpl) SetBridge(base repocpi.RepositoryBridge) { r.bridge = base r.nonref = repocpi.NewNoneRefRepositoryView(base) diff --git a/pkg/contexts/ocm/repositories/genericocireg/state.go b/pkg/contexts/ocm/repositories/genericocireg/state.go index 4baaaf0d7c..884ce3aba4 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/state.go +++ b/pkg/contexts/ocm/repositories/genericocireg/state.go @@ -13,6 +13,8 @@ import ( "reflect" "strings" + "github.com/go-test/deep" + "github.com/mandelsoft/logging" "github.com/opencontainers/go-digest" ociv1 "github.com/opencontainers/image-spec/specs-go/v1" @@ -25,6 +27,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/genericocireg/componentmapping" "github.com/open-component-model/ocm/pkg/errors" + ocmlog "github.com/open-component-model/ocm/pkg/logging" "github.com/open-component-model/ocm/pkg/utils" ) @@ -265,6 +268,15 @@ func (i StateHandler) Decode(data []byte) (interface{}, error) { } func (i StateHandler) Equivalent(a, b interface{}) bool { + if l := Logger(ocmlog.Context(), TAG_CDDIFF); l.Enabled(logging.DebugLevel) { + diff := deep.Equal(a, b) + if len(diff) > 0 { + l.Debug("component descriptor has been changed", "diff", diff) + return false + } + return true + } + ea, err := i.Encode(a) if err == nil { eb, err := i.Encode(b) diff --git a/pkg/contexts/ocm/repositories/virtual/access.go b/pkg/contexts/ocm/repositories/virtual/access.go index ed0ba205d1..2eca7cb95f 100644 --- a/pkg/contexts/ocm/repositories/virtual/access.go +++ b/pkg/contexts/ocm/repositories/virtual/access.go @@ -17,6 +17,7 @@ type VersionAccess interface { Close() error IsReadOnly() bool + SetReadOnly() GetInexpensiveContentVersionIdentity(a cpi.AccessSpec) string } @@ -29,6 +30,7 @@ type Access interface { GetComponentVersion(comp, version string) (VersionAccess, error) IsReadOnly() bool + SetReadOnly() Close() error } diff --git a/pkg/contexts/ocm/repositories/virtual/componentversion.go b/pkg/contexts/ocm/repositories/virtual/componentversion.go index a74f4c1dbd..745e13c098 100644 --- a/pkg/contexts/ocm/repositories/virtual/componentversion.go +++ b/pkg/contexts/ocm/repositories/virtual/componentversion.go @@ -89,6 +89,10 @@ func (c *ComponentVersionContainer) IsReadOnly() bool { return c.access.IsReadOnly() } +func (c *ComponentVersionContainer) SetReadOnly() { + c.access.SetReadOnly() +} + func (c *ComponentVersionContainer) IsClosed() bool { return c.access == nil } diff --git a/pkg/contexts/ocm/repositories/virtual/example/example.go b/pkg/contexts/ocm/repositories/virtual/example/example.go index b18e0173d5..912956fb53 100644 --- a/pkg/contexts/ocm/repositories/virtual/example/example.go +++ b/pkg/contexts/ocm/repositories/virtual/example/example.go @@ -70,6 +70,10 @@ func (a *Access) IsReadOnly() bool { return a.readonly } +func (a *Access) SetReadOnly() { + a.readonly = true +} + func (a *Access) Reset() error { a.lock.Lock() defer a.lock.Unlock() @@ -140,7 +144,7 @@ func (a *Access) GetComponentVersion(comp, version string) (virtual.VersionAcces } else { cd = i.CD() } - return &VersionAccess{a, cd.GetName(), cd.GetVersion(), cd.Copy()}, nil + return &VersionAccess{a, cd.GetName(), cd.GetVersion(), a.readonly, cd.Copy()}, nil } func (a *Access) Close() error { @@ -150,10 +154,11 @@ func (a *Access) Close() error { var _ virtual.Access = (*Access)(nil) type VersionAccess struct { - access *Access - comp string - vers string - desc *compdesc.ComponentDescriptor + access *Access + comp string + vers string + readonly bool + desc *compdesc.ComponentDescriptor } func (v *VersionAccess) GetDescriptor() *compdesc.ComponentDescriptor { @@ -219,7 +224,11 @@ func (v *VersionAccess) Close() error { } func (v *VersionAccess) IsReadOnly() bool { - return v.access.readonly + return v.readonly || v.access.readonly +} + +func (v *VersionAccess) SetReadOnly() { + v.readonly = true } func (v *VersionAccess) GetInexpensiveContentVersionIdentity(a cpi.AccessSpec) string { diff --git a/pkg/contexts/ocm/repositories/virtual/repository.go b/pkg/contexts/ocm/repositories/virtual/repository.go index a1cc262e70..fe3cc2eaa0 100644 --- a/pkg/contexts/ocm/repositories/virtual/repository.go +++ b/pkg/contexts/ocm/repositories/virtual/repository.go @@ -30,6 +30,14 @@ func (r *RepositoryImpl) Close() error { return r.access.Close() } +func (r *RepositoryImpl) IsReadOnly() bool { + return r.access.IsReadOnly() +} + +func (r *RepositoryImpl) SetReadOnly() { + r.access.SetReadOnly() +} + func (r *RepositoryImpl) SetBridge(base repocpi.RepositoryBridge) { r.bridge = base r.nonref = repocpi.NewNoneRefRepositoryView(base) diff --git a/pkg/errors/list.go b/pkg/errors/list.go index cd4591b6d9..699d02a17d 100644 --- a/pkg/errors/list.go +++ b/pkg/errors/list.go @@ -22,6 +22,10 @@ type ErrorList struct { //nolint: errname // Intentional naming. errors []error } +func (l *ErrorList) Unwrap() []error { + return l.errors +} + func (l *ErrorList) Error() string { msg := "" if l.msg != "" { diff --git a/pkg/logging/interface.go b/pkg/logging/interface.go index 55804086d1..43097dc484 100644 --- a/pkg/logging/interface.go +++ b/pkg/logging/interface.go @@ -13,6 +13,7 @@ import ( type LogProvider interface { logging.ContextProvider + logging.AttributionContextProvider Logger(messageContext ...logging.MessageContext) logging.Logger } diff --git a/pkg/logging/logging.go b/pkg/logging/logging.go index 4de8492ffd..cab3549981 100644 --- a/pkg/logging/logging.go +++ b/pkg/logging/logging.go @@ -113,3 +113,22 @@ func ConfigureGlobal(config *logcfg.Config, extra ...string) error { func DynamicLogger(messageContext ...logging.MessageContext) logging.UnboundLogger { return logging.DynamicLogger(Context(), messageContext...) } + +var ( + contexts []*StaticContext + lock sync.Mutex +) + +func PushContext(ctx logging.Context) { + lock.Lock() + defer lock.Unlock() + contexts = append(contexts, logContext) + SetContext(ctx) +} + +func PopContext() { + lock.Lock() + defer lock.Unlock() + logContext = contexts[len(contexts)-1] + contexts = contexts[:len(contexts)-1] +} From fd81dbc591f2a7047c07d9c20c5757293ed07bba Mon Sep 17 00:00:00 2001 From: Gerald Morrison <67469729+morri-son@users.noreply.github.com> Date: Fri, 5 Apr 2024 11:23:09 +0200 Subject: [PATCH 20/83] add metadata for hyperspace (#719) ## Description add metadata for Hyperspace. Until the ocm repo is split into ocm-cli and com-core, the metadata files need to placed in two different locations. --- components/ocmcli/metadata.yaml | 32 ++++++++++++++++++++++++++++++++ metadata.yaml | 24 ++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 components/ocmcli/metadata.yaml create mode 100644 metadata.yaml diff --git a/components/ocmcli/metadata.yaml b/components/ocmcli/metadata.yaml new file mode 100644 index 0000000000..27cd66fdc9 --- /dev/null +++ b/components/ocmcli/metadata.yaml @@ -0,0 +1,32 @@ +kind: Component +metadata: + name: ocm-cli + displayName: OCM CLI + description: OCM Command Line Interface + longDescription: |- + The OCM CLI can be used to interact with OCM components. It makes it easy to create component versions and embed them in software lifecyce processes. + labels: + language: go + tags: + - open-component-model + - ocm + - cli + - open-source + - inner-source +spec: + type: + name: CLI + lifecycle: production + team: + name: ocm + logo: https://ocm.software/images/logo-image.png + docs: + techDocsLinks: + - name: OCM Documentation + url: https://ocm.software + icon: .sa-icon--sys-help-2 + description: Documentation + - name: OCM Command Line Client + url: https://github.com/open-component-model/ocm/blob/main/docs/reference/ocm.md + icon: .sa-icon--sys-help-2 + description: Open Component Model Command Line Client \ No newline at end of file diff --git a/metadata.yaml b/metadata.yaml new file mode 100644 index 0000000000..d8c8ad4f9d --- /dev/null +++ b/metadata.yaml @@ -0,0 +1,24 @@ +kind: Component +metadata: + name: ocm-core + displayName: OCM Core Library + description: OCM Core Library + labels: + language: go + tags: + - ocm + - open-source + - inner-source +spec: + type: + name: Library + lifecycle: production + team: + name: ocm + logo: https://ocm.software/images/logo-image.png + docs: + techDocsLinks: + - name: OCM Core Library + url: https://github.com/open-component-model/ocm#ocm-library + icon: .sa-icon--sys-help-2 + description: OCM Core Library \ No newline at end of file From 4a026dee1b4622715e4ca089e60f4d966731695b Mon Sep 17 00:00:00 2001 From: Gerald Morrison <67469729+morri-son@users.noreply.github.com> Date: Mon, 8 Apr 2024 10:08:01 +0200 Subject: [PATCH 21/83] add go setup --- .github/workflows/blackduck_scan_scheduled.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/blackduck_scan_scheduled.yaml b/.github/workflows/blackduck_scan_scheduled.yaml index 6c863de77e..2dbff357dd 100644 --- a/.github/workflows/blackduck_scan_scheduled.yaml +++ b/.github/workflows/blackduck_scan_scheduled.yaml @@ -18,6 +18,11 @@ jobs: with: java-version: '17' distribution: 'temurin' + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version-file: '${{ github.workspace }}/go.mod' - name: Blackduck Full Scan uses: mercedesbenzio/detect-action@v2 From f44a710da58918ab30b3771ccd0114d4ee9f29b9 Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Mon, 15 Apr 2024 11:01:58 +0200 Subject: [PATCH 22/83] align ca-cert opts + remove relation constraints for inputs (#725) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description - deprecate the rootverts options and introduce the commonly used ca-certs options - get rid of the artificial constraint for the relation enforced by the input/access mode when composing a component version. now an appropriate relation is defaulted, but not enforced anymore (access -> external, input -> local). ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸ› Bug Fix - [x] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- .../common/options/keyoption/option.go | 2 +- cmds/ocm/commands/misccmds/hash/sign/cmd.go | 28 ++++++++++++++++++- .../ocmcmds/common/addhdlrs/rscs/elements.go | 11 -------- docs/reference/ocm.md | 2 +- docs/reference/ocm_add_componentversions.md | 2 +- docs/reference/ocm_sign_componentversions.md | 2 +- docs/reference/ocm_sign_hash.md | 9 +++--- .../reference/ocm_verify_componentversions.md | 2 +- 8 files changed, 37 insertions(+), 21 deletions(-) diff --git a/cmds/ocm/commands/common/options/keyoption/option.go b/cmds/ocm/commands/common/options/keyoption/option.go index cf02f69737..ace52bcb06 100644 --- a/cmds/ocm/commands/common/options/keyoption/option.go +++ b/cmds/ocm/commands/common/options/keyoption/option.go @@ -47,7 +47,7 @@ func (o *Option) AddFlags(fs *pflag.FlagSet) { fs.StringArrayVarP(&o.publicKeys, "public-key", "k", nil, "public key setting") fs.StringArrayVarP(&o.privateKeys, "private-key", "K", nil, "private key setting") fs.StringArrayVarP(&o.issuers, "issuer", "I", nil, "issuer name or distinguished name (DN) (optionally for dedicated signature) ([:=]") - fs.StringArrayVarP(&o.rootCAs, "ca-cert", "", nil, "additional root certificate authorities") + fs.StringArrayVarP(&o.rootCAs, "ca-cert", "", nil, "additional root certificate authorities (for signing certificates)") } func (o *Option) Configure(ctx clictx.Context) error { diff --git a/cmds/ocm/commands/misccmds/hash/sign/cmd.go b/cmds/ocm/commands/misccmds/hash/sign/cmd.go index 537f000ecf..68777ad498 100644 --- a/cmds/ocm/commands/misccmds/hash/sign/cmd.go +++ b/cmds/ocm/commands/misccmds/hash/sign/cmd.go @@ -5,6 +5,7 @@ package sign import ( + "crypto/x509" "crypto/x509/pkix" "fmt" "strings" @@ -36,6 +37,7 @@ type Command struct { pubFile string rootFile string + rootCAs []string stype string priv signutils.GenericPrivateKey @@ -72,7 +74,9 @@ $ ocm sign hash key.priv SHA-256:810ff2fb242a5dee4220f2cb0e6a519891fb67f2f828a6c func (o *Command) AddFlags(set *pflag.FlagSet) { set.StringVarP(&o.stype, "algorithm", "S", rsa.Algorithm, "signature algorithm") set.StringVarP(&o.pubFile, "publicKey", "", "", "public key certificate file") - set.StringVarP(&o.rootFile, "rootCerts", "", "", "root certificates file") + set.StringVarP(&o.rootFile, "rootCerts", "", "", "root certificates file (deprecated)") + set.StringArrayVarP(&o.rootCAs, "ca-cert", "", nil, "additional root certificate authorities (for signing certificates)") + } func (o *Command) Complete(args []string) error { @@ -109,6 +113,28 @@ func (o *Command) Complete(args []string) error { } } + if len(o.rootCAs) > 0 { + var list []*x509.Certificate + for _, r := range o.rootCAs { + data, err := utils2.ReadFile(r, o.FileSystem()) + if err != nil { + return errors.Wrapf(err, "root CA") + } + certs, err := signutils.GetCertificateChain(data, false) + if err != nil { + return errors.Wrapf(err, "root CA") + } + list = append(list, certs...) + } + if o.roots != nil { + for _, c := range list { + o.roots.(*x509.CertPool).AddCert(c) + } + } else { + o.roots = list + } + } + o.priv, err = utils2.ReadFile(args[0], o.FileSystem()) if err != nil { return err diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/rscs/elements.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/rscs/elements.go index dff1093f70..7569f6e8e2 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/rscs/elements.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/rscs/elements.go @@ -166,16 +166,5 @@ func (r *ResourceSpec) Validate(ctx clictx.Context, input *addhdlrs.ResourceInpu if err := compdescv2.ValidateResource(fldPath, rsc, false); err != nil { allErrs = append(allErrs, err...) } - - if input.Access != nil { - if r.Relation == metav1.LocalRelation { - allErrs = append(allErrs, field.Forbidden(fldPath.Child("relation"), "access requires external relation")) - } - } - if input.Input != nil { - if r.Relation != metav1.LocalRelation { - allErrs = append(allErrs, field.Forbidden(fldPath.Child("relation"), "input requires local relation")) - } - } return allErrs.ToAggregate() } diff --git a/docs/reference/ocm.md b/docs/reference/ocm.md index 77ee2b50e7..37f76ecd06 100644 --- a/docs/reference/ocm.md +++ b/docs/reference/ocm.md @@ -10,7 +10,7 @@ ocm [] ... ``` -X, --attribute stringArray attribute setting - --ca-cert stringArray additional root certificate authorities + --ca-cert stringArray additional root certificate authorities (for signing certificates) --config stringArray configuration file --config-set strings apply configuration set -C, --cred stringArray credential setting diff --git a/docs/reference/ocm_add_componentversions.md b/docs/reference/ocm_add_componentversions.md index 558b4c4cdd..d54e8dd1f5 100644 --- a/docs/reference/ocm_add_componentversions.md +++ b/docs/reference/ocm_add_componentversions.md @@ -149,7 +149,7 @@ script with the script option family.
    -$ ocm add componentversions ‐‐file ctf ‐‐version 1.0 component-constructor.yaml
    +$ ocm add componentversions ‐‐file ctf ‐‐version 1.0 component‐constructor.yaml
     
    diff --git a/docs/reference/ocm_sign_componentversions.md b/docs/reference/ocm_sign_componentversions.md index c2c2ffd972..f349615e29 100644 --- a/docs/reference/ocm_sign_componentversions.md +++ b/docs/reference/ocm_sign_componentversions.md @@ -16,7 +16,7 @@ componentversions, componentversion, cv, components, component, comps, comp, c ``` -S, --algorithm string signature handler (default "RSASSA-PKCS1-V1_5") - --ca-cert stringArray additional root certificate authorities + --ca-cert stringArray additional root certificate authorities (for signing certificates) -c, --constraints constraints version constraint -H, --hash string hash algorithm (default "SHA-256") -h, --help help for componentversions diff --git a/docs/reference/ocm_sign_hash.md b/docs/reference/ocm_sign_hash.md index 8360af3b18..ee5af1c0bb 100644 --- a/docs/reference/ocm_sign_hash.md +++ b/docs/reference/ocm_sign_hash.md @@ -9,10 +9,11 @@ ocm sign hash [] ### Options ``` - -S, --algorithm string signature algorithm (default "RSASSA-PKCS1-V1_5") - -h, --help help for hash - --publicKey string public key certificate file - --rootCerts string root certificates file + -S, --algorithm string signature algorithm (default "RSASSA-PKCS1-V1_5") + --ca-cert stringArray additional root certificate authorities (for signing certificates) + -h, --help help for hash + --publicKey string public key certificate file + --rootCerts string root certificates file (deprecated) ``` ### Description diff --git a/docs/reference/ocm_verify_componentversions.md b/docs/reference/ocm_verify_componentversions.md index fd5e2ad2db..e34ae26685 100644 --- a/docs/reference/ocm_verify_componentversions.md +++ b/docs/reference/ocm_verify_componentversions.md @@ -15,7 +15,7 @@ componentversions, componentversion, cv, components, component, comps, comp, c ### Options ``` - --ca-cert stringArray additional root certificate authorities + --ca-cert stringArray additional root certificate authorities (for signing certificates) -c, --constraints constraints version constraint -h, --help help for componentversions -I, --issuer stringArray issuer name or distinguished name (DN) (optionally for dedicated signature) ([:=] From df930a01873715bc21df1b4450dbaa74c54eabbd Mon Sep 17 00:00:00 2001 From: Gerald Morrison <67469729+morri-son@users.noreply.github.com> Date: Tue, 16 Apr 2024 15:15:24 +0200 Subject: [PATCH 23/83] modify add sources doc (#727) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change. ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- cmds/ocm/commands/ocmcmds/sources/add/cmd.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmds/ocm/commands/ocmcmds/sources/add/cmd.go b/cmds/ocm/commands/ocmcmds/sources/add/cmd.go index 0f11b46d01..1b8e16782b 100644 --- a/cmds/ocm/commands/ocmcmds/sources/add/cmd.go +++ b/cmds/ocm/commands/ocmcmds/sources/add/cmd.go @@ -50,7 +50,8 @@ $ ocm add sources --file path/to/cafile sources.yaml func (o *Command) Long() string { return ` -Add source information specified in a resource file to a component version. +Add information about the sources, e.g. commits in a Github repository, +that have been used to create the resources specified in a resource file to a component version. So far only component archives are supported as target. This command accepts source specification files describing the sources From db0f39fef213da43eb2ceeee63de38ef74403158 Mon Sep 17 00:00:00 2001 From: Hilmar Falkenberg Date: Wed, 17 Apr 2024 09:39:35 +0200 Subject: [PATCH 24/83] fix issue with create tempfile on MS Windows (#726) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description There can occur an issue, when trying to create tempFiles: ``` <*fmt.wrapError | 0xc0008f2240>: unable to read access: unable to create temporary file: mkdir C:\FOO~1\TEMP\user: lstat /C:: CreateFile C:/FOO~1/TEMP/user/VFS-1551776656/C:: The filename, directory name, or volume label syntax is incorrect. msg: "unable to create temporary file: mkdir C:\\FOO~1\\TEMP\\user: lstat /C:: CreateFile C:/FOO~1/TEMP/user/VFS-1551776656/C:: The filename, directory name, or volume label syntax is incorrect." err: <*fs.PathError | 0xc0008f47e0>{ Op: "mkdir", Path: "C:\\FOO~1\\TEMP\\user", Err: <*fs.PathError | 0xc0008f47b0>{ Op: "lstat", Path: "/C:", Err: <*fs.PathError | 0xc0008f4780>{ Op: "CreateFile", Path: "C:/FOO~1/TEMP/user/VFS-1551776656/C:", Err: 0x7b, ``` Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change. ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [x] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [x] πŸ™… no documentation needed ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- pkg/common/accessobj/cachedblob_test.go | 11 +++------- .../datacontext/attrs/tmpcache/attr.go | 21 +++++++------------ .../ocm/accessmethods/github/method_test.go | 14 ++++--------- .../ocm/accessmethods/s3/method_test.go | 15 +++++-------- 4 files changed, 20 insertions(+), 41 deletions(-) diff --git a/pkg/common/accessobj/cachedblob_test.go b/pkg/common/accessobj/cachedblob_test.go index 6f7e6549d4..4bf670e50b 100644 --- a/pkg/common/accessobj/cachedblob_test.go +++ b/pkg/common/accessobj/cachedblob_test.go @@ -1,17 +1,12 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessobj_test import ( "io" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessio" @@ -72,7 +67,7 @@ var _ = Describe("cached blob", func() { Expect(err).To(Succeed()) ctx = datacontext.New(nil) vfsattr.Set(ctx, fs) - tmpcache.Set(ctx, &tmpcache.Attribute{Path: "/tmp"}) + tmpcache.Set(ctx, &tmpcache.Attribute{Path: "/tmp", Filesystem: fs}) }) AfterEach(func() { diff --git a/pkg/contexts/datacontext/attrs/tmpcache/attr.go b/pkg/contexts/datacontext/attrs/tmpcache/attr.go index 54a3591b84..7c4164ed7f 100644 --- a/pkg/contexts/datacontext/attrs/tmpcache/attr.go +++ b/pkg/contexts/datacontext/attrs/tmpcache/attr.go @@ -1,12 +1,7 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tmpcache import ( "fmt" - "os" "github.com/mandelsoft/vfs/pkg/vfs" @@ -14,6 +9,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" + "github.com/open-component-model/ocm/pkg/utils" ) const ( @@ -76,18 +72,17 @@ func (a *Attribute) CreateTempFile(pat string) (vfs.File, error) { //////////////////////////////////////////////////////////////////////////////// -var def = &Attribute{ - Path: os.TempDir(), -} - func Get(ctx datacontext.Context) *Attribute { v := ctx.GetAttributes().GetAttribute(ATTR_KEY) - a := def - + fs := utils.FileSystem(vfsattr.Get(ctx)) if v != nil { - a, _ = v.(*Attribute) + a := v.(*Attribute) + if a.Filesystem == nil { + a.Filesystem = fs + } + return a } - return &Attribute{a.Path, vfsattr.Get(ctx)} + return &Attribute{fs.FSTempDir(), fs} } func Set(ctx datacontext.Context, a *Attribute) { diff --git a/pkg/contexts/ocm/accessmethods/github/method_test.go b/pkg/contexts/ocm/accessmethods/github/method_test.go index 184395abc0..df6b50e003 100644 --- a/pkg/contexts/ocm/accessmethods/github/method_test.go +++ b/pkg/contexts/ocm/accessmethods/github/method_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package github_test import ( @@ -11,20 +7,18 @@ import ( "net/http" "os" - _ "github.com/open-component-model/ocm/pkg/contexts/datacontext/config" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - "github.com/mandelsoft/filepath/pkg/filepath" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/github/identity" "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/tmpcache" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" + _ "github.com/open-component-model/ocm/pkg/contexts/datacontext/config" "github.com/open-component-model/ocm/pkg/contexts/ocm" me "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/github" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" @@ -105,7 +99,7 @@ var _ = Describe("Method", func() { fs, err = osfs.NewTempFileSystem() Expect(err).To(Succeed()) vfsattr.Set(ctx, fs) - tmpcache.Set(ctx, &tmpcache.Attribute{Path: "/tmp"}) + tmpcache.Set(ctx, &tmpcache.Attribute{Path: "/tmp", Filesystem: fs}) }) AfterEach(func() { diff --git a/pkg/contexts/ocm/accessmethods/s3/method_test.go b/pkg/contexts/ocm/accessmethods/s3/method_test.go index 3baf76b0ea..e5f5de1dc1 100644 --- a/pkg/contexts/ocm/accessmethods/s3/method_test.go +++ b/pkg/contexts/ocm/accessmethods/s3/method_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package s3_test import ( @@ -11,14 +7,11 @@ import ( "os" "reflect" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - . "github.com/open-component-model/ocm/pkg/env/builder" - . "github.com/open-component-model/ocm/pkg/testutils" - "github.com/mandelsoft/filepath/pkg/filepath" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" "github.com/open-component-model/ocm/pkg/common/accessio/downloader" "github.com/open-component-model/ocm/pkg/contexts/credentials" @@ -29,7 +22,9 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/s3" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/s3/identity" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + . "github.com/open-component-model/ocm/pkg/env/builder" "github.com/open-component-model/ocm/pkg/generics" + . "github.com/open-component-model/ocm/pkg/testutils" ) type mockDownloader struct { @@ -141,7 +136,7 @@ var _ = Describe("Method", func() { Expect(err).To(Succeed()) ctx = datacontext.New(nil) vfsattr.Set(ctx, fs) - tmpcache.Set(ctx, &tmpcache.Attribute{Path: "/tmp"}) + tmpcache.Set(ctx, &tmpcache.Attribute{Path: "/tmp", Filesystem: fs}) mcc = ocm.New(datacontext.MODE_INITIAL) mcc.CredentialsContext().SetCredentialsForConsumer(credentials.ConsumerIdentity{credentials.ID_TYPE: identity.CONSUMER_TYPE}, credentials.DirectCredentials{ "accessKeyID": "accessKeyID", From 0fc98aa0759d6e8aaf63586daeb89b6dbcf7478d Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Thu, 18 Apr 2024 10:55:17 +0200 Subject: [PATCH 25/83] fast version list command (#728) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description The `ocm get cv` command can be used to detect and filter existing versions for a component, if the given specification omits a version name. But because the component versions are completely read from the repository to provide additional information fr the output list, it is quite slow. To just get a list of available versions a new `ocm list cv` is provided, which can be used just to detect available versions. Also the yaml and json flavors just prvide the found versions and no further information. Therefore, the found versions must not be read from the repository and the list can be determined much faster. Like for the `get`command a version is only read if a given specification involves a version name to check, whether the version exists. The version constraint options from the `get`command are supported, also. Therefore, this command can be used to detect available versions according to various constraints, for example the latest version. ## What type of PR is this? (check all applicable) - [x] πŸ• Feature - [ ] πŸ› Bug Fix - [x] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [x] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- cmds/ocm/app/app.go | 2 + .../ocmcmds/common/handlers/comphdlr/sort.go | 3 +- .../common/handlers/vershdlr/options.go | 99 ++++++++ .../ocmcmds/common/handlers/vershdlr/sort.go | 26 ++ .../common/handlers/vershdlr/typehandler.go | 234 ++++++++++++++++++ cmds/ocm/commands/ocmcmds/components/cmd.go | 2 + .../commands/ocmcmds/components/list/cmd.go | 122 +++++++++ .../ocmcmds/components/list/cmd_test.go | 225 +++++++++++++++++ .../ocmcmds/components/list/suite_test.go | 17 ++ cmds/ocm/commands/verbs/list/cmd.go | 23 ++ cmds/ocm/commands/verbs/verbs.go | 1 + cmds/ocm/pkg/output/tableoutput.go | 19 +- docs/reference/ocm.md | 1 + docs/reference/ocm_add_sources.md | 3 +- docs/reference/ocm_list.md | 25 ++ docs/reference/ocm_list_componentversions.md | 126 ++++++++++ pkg/common/types.go | 3 +- .../ocm/compdesc/componentdescriptor.go | 3 +- pkg/contexts/ocm/session.go | 2 +- pkg/semverutils/sort.go | 25 ++ 20 files changed, 953 insertions(+), 8 deletions(-) create mode 100644 cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/options.go create mode 100644 cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/sort.go create mode 100644 cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go create mode 100644 cmds/ocm/commands/ocmcmds/components/list/cmd.go create mode 100644 cmds/ocm/commands/ocmcmds/components/list/cmd_test.go create mode 100644 cmds/ocm/commands/ocmcmds/components/list/suite_test.go create mode 100644 cmds/ocm/commands/verbs/list/cmd.go create mode 100644 docs/reference/ocm_list.md create mode 100644 docs/reference/ocm_list_componentversions.md diff --git a/cmds/ocm/app/app.go b/cmds/ocm/app/app.go index 2c94b2cb25..71af0e4282 100644 --- a/cmds/ocm/app/app.go +++ b/cmds/ocm/app/app.go @@ -45,6 +45,7 @@ import ( "github.com/open-component-model/ocm/cmds/ocm/commands/verbs/get" "github.com/open-component-model/ocm/cmds/ocm/commands/verbs/hash" "github.com/open-component-model/ocm/cmds/ocm/commands/verbs/install" + "github.com/open-component-model/ocm/cmds/ocm/commands/verbs/list" "github.com/open-component-model/ocm/cmds/ocm/commands/verbs/show" "github.com/open-component-model/ocm/cmds/ocm/commands/verbs/sign" "github.com/open-component-model/ocm/cmds/ocm/commands/verbs/transfer" @@ -234,6 +235,7 @@ func newCliCommand(opts *CLIOptions, mod ...func(clictx.Context, *cobra.Command) cmd.AddCommand(check.NewCommand(opts.Context)) cmd.AddCommand(get.NewCommand(opts.Context)) + cmd.AddCommand(list.NewCommand(opts.Context)) cmd.AddCommand(create.NewCommand(opts.Context)) cmd.AddCommand(add.NewCommand(opts.Context)) cmd.AddCommand(sign.NewCommand(opts.Context)) diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/sort.go b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/sort.go index 4b83411a50..cd252766a0 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/sort.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/sort.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/open-component-model/ocm/cmds/ocm/pkg/processing" + "github.com/open-component-model/ocm/pkg/semverutils" ) func Compare(a, b interface{}) int { @@ -18,7 +19,7 @@ func Compare(a, b interface{}) int { if c != 0 { return c } - return strings.Compare(aa.ComponentVersion.GetVersion(), ab.ComponentVersion.GetVersion()) + return semverutils.Compare(aa.ComponentVersion.GetVersion(), ab.ComponentVersion.GetVersion()) } // Sort is a processing chain sorting original objects provided by type handler. diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/options.go b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/options.go new file mode 100644 index 0000000000..6f6e842841 --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/options.go @@ -0,0 +1,99 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package vershdlr + +import ( + "github.com/Masterminds/semver/v3" + + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/lookupoption" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/versionconstraintsoption" + "github.com/open-component-model/ocm/cmds/ocm/pkg/options" + "github.com/open-component-model/ocm/pkg/contexts/ocm" + "github.com/open-component-model/ocm/pkg/utils" +) + +type Option interface { + ApplyToHandler(handler *TypeHandler) +} + +type Options []Option + +func (o Options) ApplyToHandler(handler *TypeHandler) { + for _, e := range o { + e.ApplyToHandler(handler) + } +} + +func OptionsFor(o options.OptionSetProvider) Options { + var hopts []Option + if constr := versionconstraintsoption.From(o); constr != nil { + if len(constr.Constraints) > 0 { + hopts = append(hopts, WithVersionConstraints(constr.Constraints)) + } + if constr.Latest { + hopts = append(hopts, LatestOnly()) + } + } + if lookup := lookupoption.From(o); lookup != nil { + hopts = append(hopts, Resolver(lookup)) + } + return hopts +} + +//////////////////////////////////////////////////////////////////////////////// + +type constraints struct { + constraints []*semver.Constraints +} + +func (o constraints) ApplyToHandler(handler *TypeHandler) { + handler.constraints = o.constraints +} + +func WithVersionConstraints(c []*semver.Constraints) Option { + return constraints{c} +} + +//////////////////////////////////////////////////////////////////////////////// + +type latestonly struct { + flag bool +} + +func (o latestonly) ApplyToHandler(handler *TypeHandler) { + handler.latest = o.flag +} + +func LatestOnly(b ...bool) Option { + return latestonly{utils.OptionalDefaultedBool(true, b...)} +} + +//////////////////////////////////////////////////////////////////////////////// + +type resolver struct { + resolver ocm.ComponentVersionResolver +} + +func (o resolver) ApplyToHandler(handler *TypeHandler) { + handler.resolver = o.resolver +} + +func Resolver(r ocm.ComponentVersionResolver) Option { + return resolver{r} +} + +//////////////////////////////////////////////////////////////////////////////// + +type repository struct { + repository ocm.Repository +} + +func (o repository) ApplyToHandler(handler *TypeHandler) { + handler.repobase = o.repository +} + +func Repository(r ocm.Repository) Option { + return repository{r} +} diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/sort.go b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/sort.go new file mode 100644 index 0000000000..3ada0c6851 --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/sort.go @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package vershdlr + +import ( + "strings" + + "github.com/open-component-model/ocm/cmds/ocm/pkg/processing" + "github.com/open-component-model/ocm/pkg/semverutils" +) + +func Compare(a, b interface{}) int { + aa := a.(*Object) + ab := b.(*Object) + + c := strings.Compare(aa.Component, ab.Component) + if c != 0 { + return c + } + return semverutils.Compare(aa.Version, ab.Version) +} + +// Sort is a processing chain sorting original objects provided by type handler. +var Sort = processing.Sort(Compare) diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go new file mode 100644 index 0000000000..b3ec2de9ba --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go @@ -0,0 +1,234 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package vershdlr + +import ( + "fmt" + "os" + + "github.com/Masterminds/semver/v3" + + "github.com/open-component-model/ocm/cmds/ocm/pkg/output" + "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" + "github.com/open-component-model/ocm/pkg/contexts/clictx" + "github.com/open-component-model/ocm/pkg/contexts/ocm" + "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/semverutils" +) + +func Elem(e interface{}) *Object { + return e.(*Object) +} + +//////////////////////////////////////////////////////////////////////////////// + +type Object struct { + Spec ocm.RefSpec + Repository ocm.Repository + Component string + Version string +} + +type Manifest struct { + Component string `json:"component"` + Version string `json:"version"` + Message string `json:"error,omitempty"` +} + +func (o *Object) AsManifest() interface{} { + tag := "" + msg := "" + if o.Spec.Version != nil { + tag = *o.Spec.Version + } + if o.Version == "" { + msg = "" + } + return &Manifest{ + o.Component, + tag, + msg, + } +} + +//////////////////////////////////////////////////////////////////////////////// + +type TypeHandler struct { + octx clictx.OCM + session ocm.Session + repobase ocm.Repository + resolver ocm.ComponentVersionResolver + constraints []*semver.Constraints + latest bool +} + +func NewTypeHandler(octx clictx.OCM, session ocm.Session, repobase ocm.Repository, opts ...Option) utils.TypeHandler { + h := &TypeHandler{ + octx: octx, + session: session, + repobase: repobase, + } + for _, o := range opts { + o.ApplyToHandler(h) + } + return h +} + +func (h *TypeHandler) Close() error { + return nil +} + +func (h *TypeHandler) All() ([]output.Object, error) { + if h.repobase == nil { + return nil, nil + } + return h.all(h.repobase) +} + +func (h *TypeHandler) all(repo ocm.Repository) ([]output.Object, error) { + lister := repo.ComponentLister() + if lister == nil { + return nil, nil + } + list, err := lister.GetComponents("", true) + if err != nil { + return nil, err + } + var result []output.Object + for _, l := range list { + part, err := h.get(repo, utils.StringSpec(l)) + if err != nil { + fmt.Fprintf(os.Stderr, "Warning: %s\n", err) + } + result = append(result, part...) + } + return result, nil +} + +func (h *TypeHandler) Get(elemspec utils.ElemSpec) ([]output.Object, error) { + return h.get(h.repobase, elemspec) +} + +func (h *TypeHandler) filterVersions(vers []string) []string { + if len(h.constraints) == 0 && !h.latest { + return vers + } + versions, _ := semverutils.MatchVersionStrings(vers, h.constraints...) + if h.latest && len(versions) > 1 { + versions = versions[len(versions)-1:] + } + vers = nil + for _, v := range versions { + vers = append(vers, v.Original()) + } + return vers +} + +func (h *TypeHandler) get(repo ocm.Repository, elemspec utils.ElemSpec) ([]output.Object, error) { + var component ocm.ComponentAccess + var result []output.Object + var err error + + name := elemspec.String() + spec := ocm.RefSpec{} + if repo == nil { + evaluated, err := h.session.EvaluateComponentRef(h.octx.Context(), name) + if err != nil { + if !errors.IsErrNotFound(err) { + if h.resolver != nil { + comp, err := ocm.ParseComp(name) + if err != nil { + return nil, errors.Wrapf(err, "invalid component version reference %q", name) + } + if comp.IsVersion() { + cv, err := h.resolver.LookupComponentVersion(comp.Component, *comp.Version) + if err != nil { + return nil, err + } + if cv != nil { + evaluated = &ocm.EvaluationResult{} + evaluated.Ref.UniformRepositorySpec = *cv.Repository().GetSpecification().AsUniformSpec(h.octx.Context()) + evaluated.Ref.CompSpec = comp + evaluated.Version = cv + evaluated.Repository = cv.Repository() + h.session.Closer(cv) + } + } + } + } + if evaluated == nil { + return nil, errors.Wrapf(err, "%s: invalid component version reference", name) + } + } + if evaluated.Version != nil { + result = append(result, &Object{ + Spec: evaluated.Ref, + Repository: evaluated.Repository, + Component: evaluated.Component.GetName(), + Version: evaluated.Version.GetVersion(), + }) + return result, nil + } + spec = evaluated.Ref + component = evaluated.Component + repo = evaluated.Repository + } else { + comp := ocm.CompSpec{Component: ""} + if name != "" { + comp, err = ocm.ParseComp(name) + if err != nil { + return nil, errors.Wrapf(err, "reference %q", name) + } + } + component, err = h.session.LookupComponent(repo, comp.Component) + if err != nil { + return nil, errors.Wrapf(err, "reference %q", name) + } + spec.UniformRepositorySpec = *repo.GetSpecification().AsUniformSpec(h.octx.Context()) + spec.Component = comp.Component + spec.Version = comp.Version + } + + if spec.IsVersion() { + vers := "" + v, err := h.session.GetComponentVersion(component, *spec.Version) + if err != nil { + if !errors.IsErrNotFound(err) { + return nil, err + } + } else { + vers = v.GetVersion() + } + result = append(result, &Object{ + Repository: repo, + Spec: spec, + Component: component.GetName(), + Version: vers, + }) + } else { + if component == nil { + return h.all(repo) + } else { + versions, err := component.ListVersions() + if err != nil { + return nil, err + } + versions = h.filterVersions(versions) + + for _, vers := range versions { + t := vers + s := spec + s.Version = &t + result = append(result, &Object{ + Repository: repo, + Spec: s, + Component: component.GetName(), + Version: vers, + }) + } + } + } + return result, nil +} diff --git a/cmds/ocm/commands/ocmcmds/components/cmd.go b/cmds/ocm/commands/ocmcmds/components/cmd.go index 7bee1e2726..f15db411f5 100644 --- a/cmds/ocm/commands/ocmcmds/components/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/cmd.go @@ -12,6 +12,7 @@ import ( "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/components/download" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/components/get" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/components/hash" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/components/list" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/components/sign" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/components/transfer" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/components/verify" @@ -34,6 +35,7 @@ func NewCommand(ctx clictx.Context) *cobra.Command { func AddCommands(ctx clictx.Context, cmd *cobra.Command) { cmd.AddCommand(add.NewCommand(ctx, add.Verb)) cmd.AddCommand(get.NewCommand(ctx, get.Verb)) + cmd.AddCommand(list.NewCommand(ctx, list.Verb)) cmd.AddCommand(hash.NewCommand(ctx, hash.Verb)) cmd.AddCommand(sign.NewCommand(ctx, sign.Verb)) cmd.AddCommand(transfer.NewCommand(ctx, transfer.Verb)) diff --git a/cmds/ocm/commands/ocmcmds/components/list/cmd.go b/cmds/ocm/commands/ocmcmds/components/list/cmd.go new file mode 100644 index 0000000000..47d2757abd --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/components/list/cmd.go @@ -0,0 +1,122 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package list + +import ( + "fmt" + + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr" + "github.com/spf13/cobra" + + ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/lookupoption" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/repooption" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/schemaoption" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/versionconstraintsoption" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/names" + "github.com/open-component-model/ocm/cmds/ocm/commands/verbs" + "github.com/open-component-model/ocm/cmds/ocm/pkg/output" + "github.com/open-component-model/ocm/cmds/ocm/pkg/processing" + "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" + "github.com/open-component-model/ocm/pkg/contexts/clictx" + "github.com/open-component-model/ocm/pkg/contexts/ocm" +) + +var ( + Names = names.Components + Verb = verbs.List +) + +type Command struct { + utils.BaseCommand + + Refs []string +} + +// NewCommand creates a new ctf command. +func NewCommand(ctx clictx.Context, names ...string) *cobra.Command { + return utils.SetupCommand( + &Command{BaseCommand: utils.NewBaseCommand(ctx, + versionconstraintsoption.New(), repooption.New(), + output.OutputOptions(outputs, + lookupoption.New(), + schemaoption.New("", true), + ))}, + utils.Names(Names, names...)..., + ) +} + +func (o *Command) ForName(name string) *cobra.Command { + return &cobra.Command{ + Use: "[] {}", + Short: "list component version names", + Long: ` +List lists the version names of the specified objects, if only a component is specified +all versions according to the given versuin constraints are listed. +`, + Example: ` +$ ocm list componentversion ghcr.io/mandelsoft/kubelink +$ ocm list componentversion --repo OCIRegistry::ghcr.io mandelsoft/kubelink +`, + } +} + +func (o *Command) Complete(args []string) error { + o.Refs = args + if len(args) == 0 && repooption.From(o).Spec == "" { + return fmt.Errorf("a repository or at least one argument that defines the reference is needed") + } + return nil +} + +func (o *Command) Run() error { + session := ocm.NewSession(nil) + defer session.Close() + + err := o.ProcessOnOptions(ocmcommon.CompleteOptionsWithSession(o, session)) + if err != nil { + return err + } + handler := vershdlr.NewTypeHandler(o.Context.OCM(), session, repooption.From(o).Repository, vershdlr.OptionsFor(o)) + return utils.HandleArgs(output.From(o), handler, o.Refs...) +} + +///////////////////////////////////////////////////////////////////////////// + +func addIdentityField(e interface{}) []string { + p := e.(*comphdlr.Object) + return []string{p.Identity.String()} +} + +func TableOutput(opts *output.Options, mapping processing.MappingFunction) *output.TableOutput { + return &output.TableOutput{ + Headers: output.Fields("COMPONENT", "VERSION", "MESSAGE"), + Options: opts, + Chain: vershdlr.Sort, + Mapping: mapping, + } +} + +///////////////////////////////////////////////////////////////////////////// + +var outputs = output.NewOutputs(getRegular, output.Outputs{}).AddManifestOutputs() + +func getRegular(opts *output.Options) output.Output { + return TableOutput(opts, mapGetRegularOutput).New() +} + +func mapGetRegularOutput(e interface{}) interface{} { + p := vershdlr.Elem(e) + + tag := "" + if p.Spec.Version != nil { + tag = *p.Spec.Version + } + if p.Version == "" { + return []string{p.Component, tag, ""} + } + return []string{p.Spec.Component, tag, ""} +} diff --git a/cmds/ocm/commands/ocmcmds/components/list/cmd_test.go b/cmds/ocm/commands/ocmcmds/components/list/cmd_test.go new file mode 100644 index 0000000000..031cc9264f --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/components/list/cmd_test.go @@ -0,0 +1,225 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package list_test + +import ( + "bytes" + "fmt" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/cmds/ocm/testhelper" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/open-component-model/ocm/pkg/common/accessio" +) + +const ARCH = "/tmp/ca" +const ARCH2 = "/tmp/ca2" +const VERSION = "v1" +const VERSION11 = "v1.1" +const VERSION2 = "v2" +const COMP = "test.de/x" +const COMP2 = "test.de/y" +const COMP3 = "test.de/z" +const PROVIDER = "mandelsoft" + +var _ = Describe("Test Environment", func() { + var env *TestEnv + + BeforeEach(func() { + env = NewTestEnv() + }) + + AfterEach(func() { + env.Cleanup() + }) + + It("list component archive", func() { + env.ComponentArchive(ARCH, accessio.FormatDirectory, COMP, VERSION, func() { + env.Provider(PROVIDER) + }) + + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("list", "components", ARCH)).To(Succeed()) + Expect(buf.String()).To(StringEqualTrimmedWithContext( + ` +COMPONENT VERSION MESSAGE +test.de/x v1 +`)) + }) + + It("list component archive with refs", func() { + env.ComponentArchive(ARCH, accessio.FormatDirectory, COMP, VERSION, func() { + env.Provider(PROVIDER) + env.Reference("ref", COMP2, VERSION) + }) + + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("list", "components", ARCH)).To(Succeed()) + Expect(buf.String()).To(StringEqualTrimmedWithContext( + ` +COMPONENT VERSION MESSAGE +test.de/x v1 +`)) + }) + + It("lists ctf file", func() { + env.OCMCommonTransport(ARCH, accessio.FormatDirectory, func() { + env.Component(COMP, func() { + env.Version(VERSION, func() { + env.Provider(PROVIDER) + }) + }) + }) + + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("list", "components", ARCH)).To(Succeed()) + Expect(buf.String()).To(StringEqualTrimmedWithContext( + ` +COMPONENT VERSION MESSAGE +test.de/x v1 +`)) + }) + + Context("ctf with multiple versions", func() { + BeforeEach(func() { + env.OCMCommonTransport(ARCH, accessio.FormatDirectory, func() { + env.Component(COMP, func() { + env.Version(VERSION, func() { + env.Provider(PROVIDER) + }) + }) + env.Component(COMP, func() { + env.Version(VERSION11, func() { + env.Provider(PROVIDER) + }) + }) + env.Component(COMP, func() { + env.Version(VERSION2, func() { + env.Provider(PROVIDER) + }) + }) + }) + }) + + It("lists all versions", func() { + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("list", "components", "--repo", ARCH, COMP)).To(Succeed()) + Expect(buf.String()).To(StringEqualTrimmedWithContext( + ` +COMPONENT VERSION MESSAGE +test.de/x v1 +test.de/x v1.1 +test.de/x v2 +`)) + }) + + It("lists latest version", func() { + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("list", "components", "--latest", "--repo", ARCH, COMP)).To(Succeed()) + Expect(buf.String()).To(StringEqualTrimmedWithContext( + ` +COMPONENT VERSION MESSAGE +test.de/x v2 +`)) + }) + + It("lists constrainted version", func() { + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("list", "components", "--constraints", ">1.0", "--repo", ARCH, COMP)).To(Succeed()) + Expect(buf.String()).To(StringEqualTrimmedWithContext( + ` +COMPONENT VERSION MESSAGE +test.de/x v1.1 +test.de/x v2 +`)) + }) + + It("lists constrainted version", func() { + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("list", "components", "--constraints", "1.x.x", "--latest", "--repo", ARCH, COMP)).To(Succeed()) + Expect(buf.String()).To(StringEqualTrimmedWithContext( + ` +COMPONENT VERSION MESSAGE +test.de/x v1.1 +`)) + }) + + }) + + Context("ctf", func() { + BeforeEach(func() { + env.OCMCommonTransport(ARCH, accessio.FormatDirectory, func() { + env.Component(COMP2, func() { + env.Version(VERSION, func() { + env.Provider(PROVIDER) + env.Reference("xx", COMP, VERSION) + }) + }) + env.Component(COMP, func() { + env.Version(VERSION, func() { + env.Provider(PROVIDER) + }) + }) + }) + }) + + It("lists all components", func() { + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("list", "components", "--repo", ARCH)).To(Succeed()) + Expect(buf.String()).To(StringEqualTrimmedWithContext( + ` +COMPONENT VERSION MESSAGE +test.de/x v1 +test.de/y v1 +`)) + }) + + It("lists all components as json", func() { + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("list", "components", "--repo", ARCH, "-o", "json")).To(Succeed()) + fmt.Printf("%s\n", buf.String()) + Expect(buf.String()).To(YAMLEqual(` +items: +- component: test.de/x + version: v1 +- component: test.de/y + version: v1 +`)) + }) + + It("reports unknown in repo", func() { + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("list", "components", "--repo", ARCH, COMP3+":v1")).To(Succeed()) + Expect(buf.String()).To(StringEqualTrimmedWithContext( + ` +COMPONENT VERSION MESSAGE +test.de/z v1 +`)) + }) + + It("reports unknown", func() { + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("list", "components", ARCH+"//"+COMP3+":v1")).To(Succeed()) + Expect(buf.String()).To(StringEqualTrimmedWithContext( + ` +COMPONENT VERSION MESSAGE +test.de/z v1 +`)) + }) + + It("reports unknown as json", func() { + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("list", "components", ARCH+"//"+COMP3+":v1", "-o", "json")).To(Succeed()) + Expect(buf.String()).To(YAMLEqual(` +items: +- component: test.de/z + version: v1 + error: +`)) + }) + }) +}) diff --git a/cmds/ocm/commands/ocmcmds/components/list/suite_test.go b/cmds/ocm/commands/ocmcmds/components/list/suite_test.go new file mode 100644 index 0000000000..a1299859ed --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/components/list/suite_test.go @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package list_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "OCM list component versions") +} diff --git a/cmds/ocm/commands/verbs/list/cmd.go b/cmds/ocm/commands/verbs/list/cmd.go new file mode 100644 index 0000000000..9be99c6001 --- /dev/null +++ b/cmds/ocm/commands/verbs/list/cmd.go @@ -0,0 +1,23 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package list + +import ( + "github.com/spf13/cobra" + + components "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/components/list" + "github.com/open-component-model/ocm/cmds/ocm/commands/verbs" + "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" + "github.com/open-component-model/ocm/pkg/contexts/clictx" +) + +// NewCommand creates a new command. +func NewCommand(ctx clictx.Context) *cobra.Command { + cmd := utils.MassageCommand(&cobra.Command{ + Short: "List information about components", + }, verbs.List) + cmd.AddCommand(components.NewCommand(ctx)) + return cmd +} diff --git a/cmds/ocm/commands/verbs/verbs.go b/cmds/ocm/commands/verbs/verbs.go index b7ed57982f..636e929676 100644 --- a/cmds/ocm/commands/verbs/verbs.go +++ b/cmds/ocm/commands/verbs/verbs.go @@ -6,6 +6,7 @@ package verbs const ( Get = "get" + List = "list" Check = "check" Describe = "describe" Hash = "hash" diff --git a/cmds/ocm/pkg/output/tableoutput.go b/cmds/ocm/pkg/output/tableoutput.go index 6e2314dbbe..5027043ccb 100644 --- a/cmds/ocm/pkg/output/tableoutput.go +++ b/cmds/ocm/pkg/output/tableoutput.go @@ -8,6 +8,8 @@ import ( "strings" . "github.com/open-component-model/ocm/cmds/ocm/pkg/processing" + "github.com/open-component-model/ocm/pkg/semverutils" + "github.com/open-component-model/ocm/pkg/utils" "github.com/open-component-model/ocm/cmds/ocm/pkg/data" "github.com/open-component-model/ocm/pkg/errors" @@ -126,7 +128,7 @@ func (this *TableProcessingOutput) Out() error { if n < this.opts.FixedColums { return errors.Newf("field '%s' not possible", k) } - cmp := compareColumn(idxs[key]) + cmp := compareColumn(idxs[key], strings.Contains(strings.ToLower(key), "version")) if this.opts.FixedColums > 0 { sortFixed(this.opts.FixedColums, slice, cmp) } else { @@ -139,12 +141,23 @@ func (this *TableProcessingOutput) Out() error { return this.ElementOutput.Out() } -func compareColumn(c int) CompareFunction { +// compareColumn returns a compare function for a dedicated output column. +// if vers is set to true, a semver based comparison is applied, otherwise +// a regular string comparison. +func compareColumn(c int, vers ...bool) CompareFunction { + if utils.Optional(vers...) { + return _compareColumn(c, semverutils.Compare) + } else { + return _compareColumn(c, strings.Compare) + } +} + +func _compareColumn(c int, cmp func(a, b string) int) CompareFunction { return func(a interface{}, b interface{}) int { aa := a.([]string) ab := b.([]string) if len(aa) > c && len(ab) > c { - return strings.Compare(aa[c], ab[c]) + return cmp(aa[c], ab[c]) } return len(aa) - len(ab) } diff --git a/docs/reference/ocm.md b/docs/reference/ocm.md index 37f76ecd06..3046ee8c66 100644 --- a/docs/reference/ocm.md +++ b/docs/reference/ocm.md @@ -367,6 +367,7 @@ by a certificate delivered with the signature. * [ocm get](ocm_get.md) — Get information about artifacts and components * [ocm hash](ocm_hash.md) — Hash and normalization operations * [ocm install](ocm_install.md) — Install elements. +* [ocm list](ocm_list.md) — List information about components * [ocm show](ocm_show.md) — Show tags or versions * [ocm sign](ocm_sign.md) — Sign components or hashes * [ocm transfer](ocm_transfer.md) — Transfer artifacts or components diff --git a/docs/reference/ocm_add_sources.md b/docs/reference/ocm_add_sources.md index 88289f54cb..0270fae913 100644 --- a/docs/reference/ocm_add_sources.md +++ b/docs/reference/ocm_add_sources.md @@ -93,7 +93,8 @@ sources, source, src, s ### Description -Add source information specified in a resource file to a component version. +Add information about the sources, e.g. commits in a Github repository, +that have been used to create the resources specified in a resource file to a component version. So far only component archives are supported as target. This command accepts source specification files describing the sources diff --git a/docs/reference/ocm_list.md b/docs/reference/ocm_list.md new file mode 100644 index 0000000000..3324efee87 --- /dev/null +++ b/docs/reference/ocm_list.md @@ -0,0 +1,25 @@ +## ocm list — List Information About Components + +### Synopsis + +``` +ocm list [] ... +``` + +### Options + +``` + -h, --help help for list +``` + +### SEE ALSO + +##### Parents + +* [ocm](ocm.md) — Open Component Model command line client + + +##### Sub Commands + +* [ocm list componentversions](ocm_list_componentversions.md) — list component version names + diff --git a/docs/reference/ocm_list_componentversions.md b/docs/reference/ocm_list_componentversions.md new file mode 100644 index 0000000000..9eabce871c --- /dev/null +++ b/docs/reference/ocm_list_componentversions.md @@ -0,0 +1,126 @@ +## ocm list componentversions — List Component Version Names + +### Synopsis + +``` +ocm list componentversions [] {} +``` + +##### Aliases + +``` +componentversions, componentversion, cv, components, component, comps, comp, c +``` + +### Options + +``` + -c, --constraints constraints version constraint + -h, --help help for componentversions + --latest restrict component versions to latest + --lookup stringArray repository name or spec for closure lookup fallback + -o, --output string output mode (JSON, json, yaml) + --repo string repository name or spec + -S, --scheme string schema version + -s, --sort stringArray sort fields +``` + +### Description + + +List lists the version names of the specified objects, if only a component is specified +all versions according to the given versuin constraints are listed. + + +If the option --constraints is given, and no version is specified +for a component, only versions matching the given version constraints +(semver https://github.com/Masterminds/semver) are selected. +With --latest only +the latest matching versions will be selected. + + +If the --repo option is specified, the given names are interpreted +relative to the specified repository using the syntax + +
    +
    <component>[:<version>]
    +
    + +If no --repo option is specified the given names are interpreted +as located OCM component version references: + +
    +
    [<repo type>::]<host>[:<port>][/<base path>]//<component>[:<version>]
    +
    + +Additionally there is a variant to denote common transport archives +and general repository specifications + +
    +
    [<repo type>::]<filepath>|<spec json>[//<component>[:<version>]]
    +
    + +The --repo option takes an OCM repository specification: + +
    +
    [<repo type>::]<configured name>|<file path>|<spec json>
    +
    + +For the *Common Transport Format* the types directory, +tar or tgz is possible. + +Using the JSON variant any repository types supported by the +linked library can be used: + +Dedicated OCM repository types: + - ComponentArchive: v1 + +OCI Repository types (using standard component repository to OCI mapping): + - CommonTransportFormat: v1 + - OCIRegistry: v1 + - oci: v1 + - ociRegistry + + +\ +If a component lookup for building a reference closure is required +the --lookup option can be used to specify a fallback +lookup repository. By default, the component versions are searched in +the repository holding the component version for which the closure is +determined. For *Component Archives* this is never possible, because +it only contains a single component version. Therefore, in this scenario +this option must always be specified to be able to follow component +references. + + +If the option --scheme is given, the component descriptor +is converted to the specified format for output. If no format is given +the storage format of the actual descriptor is used or, for new ones v2 +is used. +With internal the internal representation is shown. +The following schema versions are supported for explicit conversions: + - ocm.software/v3alpha1 + - v2 + +With the option --output the output mode can be selected. +The following modes are supported: + - (default) + - JSON + - json + - yaml + + +### Examples + +``` +$ ocm list componentversion ghcr.io/mandelsoft/kubelink +$ ocm list componentversion --repo OCIRegistry::ghcr.io mandelsoft/kubelink +``` + +### SEE ALSO + +##### Parents + +* [ocm list](ocm_list.md) — List information about components +* [ocm](ocm.md) — Open Component Model command line client + diff --git a/pkg/common/types.go b/pkg/common/types.go index 5468a2dee9..2bba104131 100644 --- a/pkg/common/types.go +++ b/pkg/common/types.go @@ -10,6 +10,7 @@ import ( "strings" "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/semverutils" ) // VersionedElement describes an element that has a name and a version. @@ -56,7 +57,7 @@ func (n NameVersion) MarshalJSON() ([]byte, error) { func (n NameVersion) Compare(o NameVersion) int { c := strings.Compare(n.name, o.name) if c == 0 { - return strings.Compare(n.version, o.version) + return semverutils.Compare(n.version, o.version) } return c } diff --git a/pkg/contexts/ocm/compdesc/componentdescriptor.go b/pkg/contexts/ocm/compdesc/componentdescriptor.go index e7a0caf68b..b25fe36e61 100644 --- a/pkg/contexts/ocm/compdesc/componentdescriptor.go +++ b/pkg/contexts/ocm/compdesc/componentdescriptor.go @@ -13,6 +13,7 @@ import ( metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" + "github.com/open-component-model/ocm/pkg/semverutils" ) const InternalSchemaVersion = "internal" @@ -742,7 +743,7 @@ func (r References) Less(i, j int) bool { if c != 0 { return c < 0 } - return strings.Compare(r[i].Version, r[j].Version) < 0 + return semverutils.Compare(r[i].Version, r[j].Version) < 0 } func (r References) Copy() References { diff --git a/pkg/contexts/ocm/session.go b/pkg/contexts/ocm/session.go index 81e11f8ea8..b257b52953 100644 --- a/pkg/contexts/ocm/session.go +++ b/pkg/contexts/ocm/session.go @@ -217,7 +217,7 @@ func (s *session) EvaluateVersionRef(ctx Context, ref string) (*EvaluationResult func (s *session) EvaluateComponentRef(ctx Context, ref string) (*EvaluationResult, error) { evaluated, err := s.EvaluateRef(ctx, ref) if err != nil { - return nil, err + return evaluated, err } if evaluated.Component == nil { lister := evaluated.Repository.ComponentLister() diff --git a/pkg/semverutils/sort.go b/pkg/semverutils/sort.go index a25e9f4f9e..895194d3e2 100644 --- a/pkg/semverutils/sort.go +++ b/pkg/semverutils/sort.go @@ -6,6 +6,7 @@ package semverutils import ( "sort" + "strings" "github.com/Masterminds/semver/v3" "golang.org/x/exp/slices" @@ -25,6 +26,30 @@ func (c VersionCache) Get(v string) (*semver.Version, error) { return s, nil } +func (c VersionCache) Compare(a, b string) int { + va, err := c.Get(a) + if err != nil { + return strings.Compare(a, b) + } + vb, err := c.Get(b) + if err != nil { + return strings.Compare(a, b) + } + return va.Compare(vb) +} + +func Compare(a, b string) int { + va, err := semver.NewVersion(a) + if err != nil { + return strings.Compare(a, b) + } + vb, err := semver.NewVersion(b) + if err != nil { + return strings.Compare(a, b) + } + return va.Compare(vb) +} + func SortVersions(vers []string) error { cache := VersionCache{} for _, v := range vers { From 7d613d874c3f5a1a35b9bd9dd818de0074e9ca80 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 14:54:25 +0200 Subject: [PATCH 26/83] Bump the ci group with 2 updates (#723) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the ci group with 2 updates: [reproducible-containers/buildkit-cache-dance](https://github.com/reproducible-containers/buildkit-cache-dance) and [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer). Updates `reproducible-containers/buildkit-cache-dance` from 2 to 3
    Release notes

    Sourced from reproducible-containers/buildkit-cache-dance's releases.

    v3.0.0

    Rewrote the action in TypeScript and adds support for cache-map that gets a string of files that need to be injected as a JSON string. This makes it possible to inject multiple directories in one call and simplifies the usage.

    This release also makes it possible to run the script outside GitHub Actions in other CI platforms or locally using command line arguments.

    Thanks to @​aminya (#25)


    What's Changed

    New Contributors

    Full Changelog: https://github.com/reproducible-containers/buildkit-cache-dance/compare/v2.1.4...v3.0.0

    v2.1.4

    What's Changed

    New Contributors

    Full Changelog: https://github.com/reproducible-containers/buildkit-cache-dance/compare/v2.1.3...v2.1.4

    v2.1.3

    What's Changed

    New Contributors

    Full Changelog: https://github.com/reproducible-containers/buildkit-cache-dance/compare/v2.1.2...v2.1.3

    v2.1.2

    What's Changed

    Full Changelog: https://github.com/reproducible-containers/buildkit-cache-dance/compare/v2.1.1...v2.1.2

    v2.1.1

    What's Changed

    ... (truncated)

    Commits
    • 5de31fc Merge pull request #28 from aminya/support-cache-props
    • 2a1e987 test: add tests for run functions
    • d2e9ac7 test: add unit tests for the opts functions
    • 969118a fix: add defaults for the missing actions options
    • cfc6f5e docs: update the version to v3.1.0
    • 2df8be0 test: test the id option for var/cache/apt
    • 43a181d feat: support arbitrary mount options for each cache
    • 8da9ff0 Merge pull request #27 from aminya/ignore-cleanup
    • f182ab1 fix: ignore clean-up errors
    • 0fc239d Merge pull request #25 from aminya/rewrite
    • Additional commits viewable in compare view

    Updates `sigstore/cosign-installer` from 3.4.0 to 3.5.0
    Release notes

    Sourced from sigstore/cosign-installer's releases.

    v3.5.0

    What's Changed

    Full Changelog: https://github.com/sigstore/cosign-installer/compare/v3.4.0...v3.5.0

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/push_ocm.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/push_ocm.yaml b/.github/workflows/push_ocm.yaml index 6217d032e3..8197605ce7 100644 --- a/.github/workflows/push_ocm.yaml +++ b/.github/workflows/push_ocm.yaml @@ -55,7 +55,7 @@ jobs: key: ${{ runner.os }}-go-build-cache-${{ hashFiles('**/go.sum') }} - name: inject go-build-cache into docker - uses: reproducible-containers/buildkit-cache-dance@v2 + uses: reproducible-containers/buildkit-cache-dance@v3 with: cache-source: go-build-cache diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 253b145af8..ee2bcd6b8c 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -143,7 +143,7 @@ jobs: uses: anchore/sbom-action/download-syft@ab5d7b5f48981941c4c5d6bf33aeb98fe3bae38c # v0.15.10 - name: Setup Cosign - uses: sigstore/cosign-installer@v3.4.0 + uses: sigstore/cosign-installer@v3.5.0 - name: Setup git config run: | From 93096c65797287718537313a7b99917cc9855999 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:35:13 +0200 Subject: [PATCH 27/83] Bump github.com/sigstore/cosign/v2 from 2.2.3 to 2.2.4 (#722) Bumps [github.com/sigstore/cosign/v2](https://github.com/sigstore/cosign) from 2.2.3 to 2.2.4.
    Release notes

    Sourced from github.com/sigstore/cosign/v2's releases.

    v2.2.4

    Bug Fixes

    • Fixes for GHSA-88jx-383q-w4qc and GHSA-95pr-fxf5-86gv (#3661)
    • ErrNoSignaturesFound should be used when there is no signature attached to an image. (#3526)
    • fix semgrep issues for dgryski.semgrep-go ruleset (#3541)
    • Honor creation timestamp for signatures again (#3549)

    Features

    • Adds Support for Fulcio Client Credentials Flow, and Argument to Set Flow Explicitly (#3578)

    Documentation

    • add oci bundle spec (#3622)
    • Correct help text of triangulate cmd (#3551)
    • Correct help text of verify-attestation policy argument (#3527)
    • feat: add OVHcloud MPR registry tested with cosign (#3639)

    Testing

    • Refactor e2e-tests.yml workflow (#3627)
    • Clean up and clarify e2e scripts (#3628)
    • Don't ignore transparency log in tests if possible (#3528)
    • Make E2E tests hermetic (#3499)
    • add e2e test for pkcs11 token signing (#3495)

    Full Changelog: https://github.com/sigstore/cosign/compare/v2.2.3...v2.2.4

    Changelog

    Sourced from github.com/sigstore/cosign/v2's changelog.

    v2.2.4

    Bug Fixes

    • Fixes for GHSA-88jx-383q-w4qc and GHSA-95pr-fxf5-86gv (#3661)
    • ErrNoSignaturesFound should be used when there is no signature attached to an image. (#3526)
    • fix semgrep issues for dgryski.semgrep-go ruleset (#3541)
    • Honor creation timestamp for signatures again (#3549)

    Features

    • Adds Support for Fulcio Client Credentials Flow, and Argument to Set Flow Explicitly (#3578)

    Documentation

    • add oci bundle spec (#3622)
    • Correct help text of triangulate cmd (#3551)
    • Correct help text of verify-attestation policy argument (#3527)
    • feat: add OVHcloud MPR registry tested with cosign (#3639)

    Testing

    • Refactor e2e-tests.yml workflow (#3627)
    • Clean up and clarify e2e scripts (#3628)
    • Don't ignore transparency log in tests if possible (#3528)
    • Make E2E tests hermetic (#3499)
    • add e2e test for pkcs11 token signing (#3495)
    Commits
    • fb651b4 Add v2.2.4 changelog (#3662)
    • 629f5f8 Fixes for GHSA-88jx-383q-w4qc and GHSA-95pr-fxf5-86gv (#3661)
    • 302aee6 Refactor e2e-tests.yml workflow (#3627)
    • d0b9861 chore(deps): bump golang.org/x/crypto from 0.21.0 to 0.22.0 (#3649)
    • c95439b chore(deps): bump github.com/spiffe/go-spiffe/v2 from 2.1.7 to 2.2.0 (#3653)
    • 430c985 chore(deps): bump golang.org/x/sync from 0.6.0 to 0.7.0 (#3655)
    • 48858a2 chore(deps): bump github.com/xanzy/go-gitlab from 0.101.0 to 0.102.0 (#3652)
    • eba7c59 chore(deps): bump golang.org/x/term from 0.18.0 to 0.19.0 (#3651)
    • 2d13b65 chore(deps): bump golang.org/x/oauth2 from 0.18.0 to 0.19.0 (#3650)
    • d56c9e8 chore(deps): bump the gomod group with 3 updates (#3648)
    • Additional commits viewable in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/sigstore/cosign/v2&package-manager=go_modules&previous-version=2.2.3&new-version=2.2.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/open-component-model/ocm/network/alerts).
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gerald Morrison <67469729+morri-son@users.noreply.github.com> --- go.mod | 126 +++++++++--------- go.sum | 397 ++++++++++++++++++++++++++++++--------------------------- 2 files changed, 275 insertions(+), 248 deletions(-) diff --git a/go.mod b/go.mod index 558382efc1..df145204c0 100644 --- a/go.mod +++ b/go.mod @@ -8,12 +8,12 @@ require ( github.com/DataDog/gostackparse v0.7.0 github.com/InfiniteLoopSpace/go_S-MIME v0.0.0-20181221134359-3f58f9a4b2b6 github.com/Masterminds/semver/v3 v3.2.1 - github.com/aws/aws-sdk-go-v2 v1.25.2 - github.com/aws/aws-sdk-go-v2/config v1.27.4 - github.com/aws/aws-sdk-go-v2/credentials v1.17.4 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.6 + github.com/aws/aws-sdk-go-v2 v1.26.0 + github.com/aws/aws-sdk-go-v2/config v1.27.9 + github.com/aws/aws-sdk-go-v2/credentials v1.17.9 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.9 github.com/aws/aws-sdk-go-v2/service/ecr v1.27.1 - github.com/aws/aws-sdk-go-v2/service/s3 v1.51.1 + github.com/aws/aws-sdk-go-v2/service/s3 v1.51.4 github.com/containerd/containerd v1.7.13 github.com/containerd/log v0.1.0 github.com/containers/image/v5 v5.29.2 @@ -28,8 +28,8 @@ require ( github.com/gertd/go-pluralize v0.2.1 github.com/ghodss/yaml v1.0.0 github.com/go-logr/logr v1.4.1 - github.com/go-openapi/strfmt v0.22.1 - github.com/go-openapi/swag v0.22.9 + github.com/go-openapi/strfmt v0.23.0 + github.com/go-openapi/swag v0.23.0 github.com/go-test/deep v1.1.0 github.com/goccy/go-yaml v1.11.3 github.com/golang/mock v1.6.0 @@ -49,11 +49,11 @@ require ( github.com/onsi/ginkgo/v2 v2.15.0 github.com/onsi/gomega v1.31.1 github.com/opencontainers/go-digest v1.0.0 - github.com/opencontainers/image-spec v1.1.0-rc5 + github.com/opencontainers/image-spec v1.1.0 github.com/pkg/errors v0.9.1 - github.com/sigstore/cosign/v2 v2.2.3 - github.com/sigstore/rekor v1.3.4 - github.com/sigstore/sigstore v1.8.1 + github.com/sigstore/cosign/v2 v2.2.4 + github.com/sigstore/rekor v1.3.6 + github.com/sigstore/sigstore v1.8.3 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 @@ -64,8 +64,8 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 - golang.org/x/net v0.20.0 - golang.org/x/oauth2 v0.16.0 + golang.org/x/net v0.22.0 + golang.org/x/oauth2 v0.19.0 golang.org/x/text v0.14.0 gopkg.in/yaml.v3 v3.0.1 helm.sh/helm/v3 v3.14.3 @@ -78,9 +78,14 @@ require ( sigs.k8s.io/yaml v1.4.0 ) +require ( + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/go-jose/go-jose/v4 v4.0.1 // indirect +) + // indirect dependencies require ( - cloud.google.com/go/compute v1.23.3 // indirect + cloud.google.com/go/compute v1.25.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect @@ -117,19 +122,19 @@ require ( github.com/aliyun/credentials-go v1.3.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.3 // indirect github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.5 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.20.3 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.28.5 // indirect github.com/aws/smithy-go v1.20.1 // indirect github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -147,7 +152,7 @@ require ( github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 // indirect github.com/containers/ocicrypt v1.1.9 // indirect github.com/containers/storage v1.51.0 // indirect - github.com/coreos/go-oidc/v3 v3.9.0 // indirect + github.com/coreos/go-oidc/v3 v3.10.0 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 // indirect @@ -166,33 +171,32 @@ require ( github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fvbommel/sortorder v1.1.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/go-chi/chi v4.1.2+incompatible // indirect github.com/go-errors/errors v1.5.1 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect github.com/go-jose/go-jose/v3 v3.0.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/analysis v0.22.0 // indirect - github.com/go-openapi/errors v0.21.0 // indirect - github.com/go-openapi/jsonpointer v0.20.2 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect - github.com/go-openapi/loads v0.21.5 // indirect - github.com/go-openapi/runtime v0.27.1 // indirect - github.com/go-openapi/spec v0.20.13 // indirect - github.com/go-openapi/validate v0.22.4 // indirect + github.com/go-openapi/analysis v0.23.0 // indirect + github.com/go-openapi/errors v0.22.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/loads v0.22.0 // indirect + github.com/go-openapi/runtime v0.28.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect + github.com/go-openapi/validate v0.24.0 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/gomodule/redigo v1.8.9 // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/certificate-transparency-go v1.1.7 // indirect + github.com/google/certificate-transparency-go v1.1.8 // indirect github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/go-containerregistry v0.18.0 // indirect + github.com/google/go-containerregistry v0.19.1 // indirect github.com/google/go-github/v55 v55.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect @@ -231,7 +235,6 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/miekg/pkcs11 v1.1.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect @@ -256,9 +259,9 @@ require ( github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.18.0 // indirect - github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/client_golang v1.19.0 // indirect + github.com/prometheus/client_model v0.6.0 // indirect + github.com/prometheus/common v0.51.1 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rubenv/sql-migrate v1.6.0 // indirect @@ -271,14 +274,14 @@ require ( github.com/segmentio/ksuid v1.0.4 // indirect github.com/shibumi/go-pathspec v1.3.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect - github.com/sigstore/fulcio v1.4.3 // indirect - github.com/sigstore/timestamp-authority v1.2.1 // indirect + github.com/sigstore/fulcio v1.4.5 // indirect + github.com/sigstore/timestamp-authority v1.2.2 // indirect github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect github.com/spf13/viper v1.18.2 // indirect - github.com/spiffe/go-spiffe/v2 v2.1.7 // indirect + github.com/spiffe/go-spiffe/v2 v2.2.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/thales-e-security/pool v0.0.2 // indirect @@ -290,33 +293,32 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect github.com/vbatts/tar-split v0.11.5 // indirect - github.com/xanzy/go-gitlab v0.96.0 // indirect + github.com/xanzy/go-gitlab v0.102.0 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xlab/treeprint v1.2.0 // indirect github.com/zeebo/errs v1.3.0 // indirect go.mongodb.org/mongo-driver v1.14.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect - go.opentelemetry.io/otel v1.22.0 // indirect - go.opentelemetry.io/otel/metric v1.22.0 // indirect - go.opentelemetry.io/otel/trace v1.22.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect go.starlark.net v0.0.0-20231121155337-90ade8b19d09 // indirect - go.step.sm/crypto v0.42.1 // indirect + go.step.sm/crypto v0.44.2 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.19.0 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.17.0 // indirect - golang.org/x/term v0.17.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/mod v0.16.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.19.0 // indirect + golang.org/x/term v0.19.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.17.0 // indirect + golang.org/x/tools v0.19.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/api v0.159.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect - google.golang.org/grpc v1.61.0 // indirect + google.golang.org/api v0.172.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/grpc v1.62.1 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/evanphx/json-patch.v5 v5.7.0 // indirect gopkg.in/go-jose/go-jose.v2 v2.6.3 // indirect @@ -325,7 +327,7 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect k8s.io/apiserver v0.29.0 // indirect k8s.io/component-base v0.29.0 // indirect - k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/klog/v2 v2.120.1 // indirect k8s.io/kube-openapi v0.0.0-20240103195357-a9f8850cb432 // indirect k8s.io/kubectl v0.29.0 // indirect k8s.io/utils v0.0.0-20240102154912-e7106e64919e // indirect diff --git a/go.sum b/go.sum index 0491278013..15735b4fa0 100644 --- a/go.sum +++ b/go.sum @@ -1,31 +1,35 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= -cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= +cloud.google.com/go/compute v1.25.0 h1:H1/4SqSUhjPFE7L5ddzHOfY2bCAvjwNRZPNl6Ni5oYU= +cloud.google.com/go/compute v1.25.0/go.mod h1:GR7F0ZPZH8EhChlMo9FkLd7eUTwEymjqQagxzilIxIE= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= -cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= -cloud.google.com/go/kms v1.15.5 h1:pj1sRfut2eRbD9pFRjNnPNg/CzJPuQAzUujMIM1vVeM= -cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= +cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= +cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= +cloud.google.com/go/kms v1.15.8 h1:szIeDCowID8th2i8XE4uRev5PMxQFqW+JjwYxL9h6xs= +cloud.google.com/go/kms v1.15.8/go.mod h1:WoUHcDjD9pluCg7pNds131awnH429QGvRM3N/4MyoVs= +cuelabs.dev/go/oci/ociregistry v0.0.0-20240314152124-224736b49f2e h1:GwCVItFUPxwdsEYnlUcJ6PJxOjTeFFCKOh6QWg4oAzQ= +cuelabs.dev/go/oci/ociregistry v0.0.0-20240314152124-224736b49f2e/go.mod h1:ApHceQLLwcOkCEXM1+DyCXTHEJhNGDpJ2kmV6axsx24= +cuelang.org/go v0.8.1 h1:VFYsxIFSPY5KgSaH1jQ2GxHOrbu6Ga3kEI70yCZwnOg= +cuelang.org/go v0.8.1/go.mod h1:CoDbYolfMms4BhWUlhD+t5ORnihR7wvjcfgyO9lL5FI= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= -github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230618160516-e936619f9f18 h1:rd389Q26LMy03gG4anandGFC2LW/xvjga5GezeeaxQk= -github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230618160516-e936619f9f18/go.mod h1:fgJuSBrJP5qZtKqaMJE0hmhS2tmRH+44IkfZvjtaf1M= +github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d h1:zjqpY4C7H15HjRPEenkS4SAn3Jy2eRRjkjZbGR30TOg= +github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d/go.mod h1:XNqJ7hv2kY++g8XEHREpi+JqZo3+0l+CH2egBVN4yqM= github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0 h1:8+4G8JaejP8Xa6W46PzJEwisNgBXMvFcz78N6zG/ARw= github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0/go.mod h1:GgeIE+1be8Ivm7Sh4RgwI42aTtC9qrcj+Y9Y6CjJhJs= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 h1:lGlwhPtrX6EVml1hO0ivjkUxsSyl4dsiw9qcA1k/3IQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0 h1:n1DH8TPV4qqPTje2RcUBYwtrTWlabVp4n46+74X2pn4= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0/go.mod h1:HDcZnuGbiyppErN6lB+idp4CKhjbc8gwjto6OPpyggM= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 h1:6oNBlSdi1QqM1PNW7FPA6xOGA5UNsXnkaYZz9vdPGhA= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0 h1:DRiANoJTiW6obBQe3SqZizkuV1PEgfiiGivmVocDy64= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0/go.mod h1:qLIye2hwb/ZouqhpSD9Zn3SJipvpEnz1Ywl3VUk9Y0s= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= @@ -53,8 +57,8 @@ github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+Z github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= @@ -79,6 +83,8 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/hcsshim v0.12.0-rc.1 h1:Hy+xzYujv7urO5wrgcG58SPMOXNLrj4WCJbySs2XX/A= github.com/Microsoft/hcsshim v0.12.0-rc.1/go.mod h1:Y1a1S0QlYp1mBpyvGiuEdOfZqnao+0uX5AWHXQ5NhZU= +github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= +github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c h1:kMFnB0vCcX7IL/m9Y5LO+KQYv+t1CQOiFe6+SV2J7bE= github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= @@ -87,6 +93,8 @@ github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/O github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/ThalesIgnite/crypto11 v1.2.5 h1:1IiIIEqYmBvUYFeMnHqRft4bwf/O36jryEUpY+9ef8E= github.com/ThalesIgnite/crypto11 v1.2.5/go.mod h1:ILDKtnCKiQ7zRoNxcp36Y1ZR8LBPmR2E23+wTQe/MlE= +github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= +github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= @@ -138,53 +146,53 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/aws/aws-sdk-go v1.50.0 h1:HBtrLeO+QyDKnc3t1+5DR1RxodOHCGr8ZcrHudpv7jI= -github.com/aws/aws-sdk-go v1.50.0/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.51.6 h1:Ld36dn9r7P9IjU8WZSaswQ8Y/XUCRpewim5980DwYiU= +github.com/aws/aws-sdk-go v1.51.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2 v1.25.2 h1:/uiG1avJRgLGiQM9X3qJM8+Qa6KRGK5rRPuXE0HUM+w= -github.com/aws/aws-sdk-go-v2 v1.25.2/go.mod h1:Evoc5AsmtveRt1komDwIsjHFyrP5tDuF1D1U+6z6pNo= +github.com/aws/aws-sdk-go-v2 v1.26.0 h1:/Ce4OCiM3EkpW7Y+xUnfAFpchU78K7/Ug01sZni9PgA= +github.com/aws/aws-sdk-go-v2 v1.26.0/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1 h1:gTK2uhtAPtFcdRRJilZPx8uJLL2J85xK11nKtWL0wfU= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1/go.mod h1:sxpLb+nZk7tIfCWChfd+h4QwHNUR57d8hA1cleTkjJo= -github.com/aws/aws-sdk-go-v2/config v1.27.4 h1:AhfWb5ZwimdsYTgP7Od8E9L1u4sKmDW2ZVeLcf2O42M= -github.com/aws/aws-sdk-go-v2/config v1.27.4/go.mod h1:zq2FFXK3A416kiukwpsd+rD4ny6JC7QSkp4QdN1Mp2g= -github.com/aws/aws-sdk-go-v2/credentials v1.17.4 h1:h5Vztbd8qLppiPwX+y0Q6WiwMZgpd9keKe2EAENgAuI= -github.com/aws/aws-sdk-go-v2/credentials v1.17.4/go.mod h1:+30tpwrkOgvkJL1rUZuRLoxcJwtI/OkeBLYnHxJtVe0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2 h1:AK0J8iYBFeUk2Ax7O8YpLtFsfhdOByh2QIkHmigpRYk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2/go.mod h1:iRlGzMix0SExQEviAyptRWRGdYNo3+ufW/lCzvKVTUc= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.6 h1:prcsGA3onmpc7ea1W/m+SMj4uOn5vZ63uJp805UhJJs= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.6/go.mod h1:7eQrvATnVFDY0WfMYhfKkSQ1YtZlClT71fAAlsA1s34= +github.com/aws/aws-sdk-go-v2/config v1.27.9 h1:gRx/NwpNEFSk+yQlgmk1bmxxvQ5TyJ76CWXs9XScTqg= +github.com/aws/aws-sdk-go-v2/config v1.27.9/go.mod h1:dK1FQfpwpql83kbD873E9vz4FyAxuJtR22wzoXn3qq0= +github.com/aws/aws-sdk-go-v2/credentials v1.17.9 h1:N8s0/7yW+h8qR8WaRlPQeJ6czVMNQVNtNdUqf6cItao= +github.com/aws/aws-sdk-go-v2/credentials v1.17.9/go.mod h1:446YhIdmSV0Jf/SLafGZalQo+xr2iw7/fzXGDPTU1yQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0 h1:af5YzcLf80tv4Em4jWVD75lpnOHSBkPUZxZfGkrI3HI= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0/go.mod h1:nQ3how7DMnFMWiU1SpECohgC82fpn4cKZ875NDMmwtA= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.9 h1:vXY/Hq1XdxHBIYgBUmug/AbMyIe1AKulPYS2/VE1X70= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.9/go.mod h1:GyJJTZoHVuENM4TeJEl5Ffs4W9m19u+4wKJcDi/GZ4A= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2 h1:bNo4LagzUKbjdxE0tIcR9pMzLR2U/Tgie1Hq1HQ3iH8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2/go.mod h1:wRQv0nN6v9wDXuWThpovGQjqF1HFdcgWjporw14lS8k= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4 h1:0ScVK/4qZ8CIW0k8jOeFVsyS/sAiXpYxRBLolMkuLQM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4/go.mod h1:84KyjNZdHC6QZW08nfHI6yZgPd+qRgaWcYsyLUo3QY8= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2 h1:EtOU5jsPdIQNP+6Q2C5e3d65NKT1PeCiQk+9OdzO12Q= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2/go.mod h1:tyF5sKccmDz0Bv4NrstEr+/9YkSPJHrcO7UsUKf7pWM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4 h1:sHmMWWX5E7guWEFQ9SVo6A3S4xpPrWnd77a6y4WM6PU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4/go.mod h1:WjpDrhWisWOIoS9n3nk67A3Ll1vfULJ9Kq6h29HTD48= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.2 h1:en92G0Z7xlksoOylkUhuBSfJgijC7rHVLRdnIlHEs0E= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.2/go.mod h1:HgtQ/wN5G+8QSlK62lbOtNwQ3wTSByJ4wH2rCkPt+AE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.3 h1:mDnFOE2sVkyphMWtTH+stv0eW3k0OTx94K63xpxHty4= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.3/go.mod h1:V8MuRVcCRt5h1S+Fwu8KbC7l/gBGo3yBAyUbJM2IJOk= github.com/aws/aws-sdk-go-v2/service/ecr v1.27.1 h1:GFt/4yMrCuMDi4YzKy0HCW9NhwbxoYZUMqIWqWJFsqE= github.com/aws/aws-sdk-go-v2/service/ecr v1.27.1/go.mod h1:ydHfHlVpaydWdStDKNcV6BnI0fD+ZwlPWvDgVG2fLt0= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2 h1:PpbXaecV3sLAS6rjQiaKw4/jyq3Z8gNzmoJupHAoBp0= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2/go.mod h1:fUHpGXr4DrXkEDpGAjClPsviWf+Bszeb0daKE0blxv8= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.2 h1:zSdTXYLwuXDNPUS+V41i1SFDXG7V0ITp0D9UT9Cvl18= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.2/go.mod h1:v8m8k+qVy95nYi7d56uP1QImleIIY25BPiNJYzPBdFE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2 h1:5ffmXjPtwRExp1zc7gENLgCPyHFbhEPwVTkTiH9niSk= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2/go.mod h1:Ru7vg1iQ7cR4i7SZ/JTLYN9kaXtbL69UdgG0OQWQxW0= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.2 h1:1oY1AVEisRI4HNuFoLdRUB0hC63ylDAN6Me3MrfclEg= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.2/go.mod h1:KZ03VgvZwSjkT7fOetQ/wF3MZUvYFirlI1H5NklUNsY= -github.com/aws/aws-sdk-go-v2/service/kms v1.27.9 h1:W9PbZAZAEcelhhjb7KuwUtf+Lbc+i7ByYJRuWLlnxyQ= -github.com/aws/aws-sdk-go-v2/service/kms v1.27.9/go.mod h1:2tFmR7fQnOdQlM2ZCEPpFnBIQD1U8wmXmduBgZbOag0= -github.com/aws/aws-sdk-go-v2/service/s3 v1.51.1 h1:juZ+uGargZOrQGNxkVHr9HHR/0N+Yu8uekQnV7EAVRs= -github.com/aws/aws-sdk-go-v2/service/s3 v1.51.1/go.mod h1:SoR0c7Jnq8Tpmt0KSLXIavhjmaagRqQpe9r70W3POJg= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.1 h1:utEGkfdQ4L6YW/ietH7111ZYglLJvS+sLriHJ1NBJEQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.1/go.mod h1:RsYqzYr2F2oPDdpy+PdhephuZxTfjHQe7SOBcZGoAU8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1 h1:9/GylMS45hGGFCcMrUZDVayQE1jYSIN6da9jo7RAYIw= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1/go.mod h1:YjAPFn4kGFqKC54VsHs5fn5B6d+PCY2tziEa3U/GB5Y= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.1 h1:3I2cBEYgKhrWlwyZgfpSO2BpaMY1LHPqXYk/QGlu2ew= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.1/go.mod h1:uQ7YYKZt3adCRrdCBREm1CD3efFLOUNH77MrUCvx5oA= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.5 h1:mbWNpfRUTT6bnacmvOTKXZjR/HycibdWzNpfbrbLDIs= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.5/go.mod h1:FCOPWGjsshkkICJIn9hq9xr6dLKtyaWpuUojiN3W1/8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6 h1:b+E7zIUHMmcB4Dckjpkapoy47W6C9QBv/zoUP+Hn8Kc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6/go.mod h1:S2fNV0rxrP78NhPbCZeQgY8H9jdDMeGtwcfZIRxzBqU= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.3 h1:4t+QEX7BsXz98W8W1lNvMAG+NX8qHz2CjLBxQKku40g= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.3/go.mod h1:oFcjjUq5Hm09N9rpxTdeMeLeQcxS7mIkBkL8qUKng+A= +github.com/aws/aws-sdk-go-v2/service/kms v1.30.0 h1:yS0JkEdV6h9JOo8sy2JSpjX+i7vsKifU8SIeHrqiDhU= +github.com/aws/aws-sdk-go-v2/service/kms v1.30.0/go.mod h1:+I8VUUSVD4p5ISQtzpgSva4I8cJ4SQ4b1dcBcof7O+g= +github.com/aws/aws-sdk-go-v2/service/s3 v1.51.4 h1:lW5xUzOPGAMY7HPuNF4FdyBwRc3UJ/e8KsapbesVeNU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.51.4/go.mod h1:MGTaf3x/+z7ZGugCGvepnx2DS6+caCYYqKhzVoLNYPk= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.3 h1:mnbuWHOcM70/OFUlZZ5rcdfA8PflGXXiefU/O+1S3+8= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.3/go.mod h1:5HFu51Elk+4oRBZVxmHrSds5jFXmFj8C3w7DVF2gnrs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3 h1:uLq0BKatTmDzWa/Nu4WO0M1AaQDaPpwTKAeByEc6WFM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3/go.mod h1:b+qdhjnxj8GSR6t5YfphOffeoQSQ1KmpoVVuBn+PWxs= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.5 h1:J/PpTf/hllOjx8Xu9DMflff3FajfLxqM5+tepvVXmxg= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.5/go.mod h1:0ih0Z83YDH/QeQ6Ori2yGE2XvWYv/Xm+cZc01LC6oK0= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= @@ -239,6 +247,8 @@ github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBS github.com/cloudfoundry-incubator/candiedyaml v0.0.0-20170901234223-a41693b7b7af h1:6Cpkahw28+gcBdnXQL7LcMTX488+6jl6hfoTMRT6Hm4= github.com/cloudfoundry-incubator/candiedyaml v0.0.0-20170901234223-a41693b7b7af/go.mod h1:dOLSIXcRQJiDS1vlrYFNJicoHNZLsBKideE+70hGdV4= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg= +github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= @@ -262,8 +272,8 @@ github.com/containers/ocicrypt v1.1.9 h1:2Csfba4jse85Raxk5HIyEk8OwZNjRvfkhEGijOj github.com/containers/ocicrypt v1.1.9/go.mod h1:dTKx1918d8TDkxXvarscpNVY+lyPakPNFN4jwA9GBys= github.com/containers/storage v1.51.0 h1:AowbcpiWXzAjHosKz7MKvPEqpyX+ryZA/ZurytRrFNA= github.com/containers/storage v1.51.0/go.mod h1:ybl8a3j1PPtpyaEi/5A6TOFs+5TrEyObeKJzVtkUlfc= -github.com/coreos/go-oidc/v3 v3.9.0 h1:0J/ogVOd4y8P0f0xUh8l9t07xRP/d8tccvjHl2dcsSo= -github.com/coreos/go-oidc/v3 v3.9.0/go.mod h1:rTKz2PYwftcrtoCzV5g5kvfJoWcm0Mk8AF8y1iAQro4= +github.com/coreos/go-oidc/v3 v3.10.0 h1:tDnXHnLyiTVyT/2zLDGj09pFPkhND8Gl8lnTRhoEaJU= +github.com/coreos/go-oidc/v3 v3.10.0/go.mod h1:5j11xcw0D3+SGxn6Z/WFADsgcWVMyNAlSQupk0KK3ac= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= @@ -318,9 +328,13 @@ github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/drone/envsubst v1.0.3 h1:PCIBwNDYjs50AsLZPYdfhSATKaRg/FJmDc2D6+C2x8g= github.com/drone/envsubst v1.0.3/go.mod h1:N2jZmlMufstn1KEqvbHjw40h1KyTmnVzHcSc9bFiJ2g= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dvsekhvalnov/jose2go v0.0.0-20170216131308-f21a8cedbbae/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= github.com/emicklei/go-restful/v3 v3.11.1 h1:S+9bSbua1z3FgCnV0KKOSSZ3mDthb5NyEPL5gEpCvyk= github.com/emicklei/go-restful/v3 v3.11.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/proto v1.12.1 h1:6n/Z2pZAnBwuhU66Gs8160B8rrrYKo7h2F2sCOnNceE= +github.com/emicklei/proto v1.12.1/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -363,52 +377,57 @@ github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8b github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= +github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= +github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U= +github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= -github.com/go-openapi/analysis v0.22.0 h1:wQ/d07nf78HNj4u+KiSY0sT234IAyePPbMgpUjUJQR0= -github.com/go-openapi/analysis v0.22.0/go.mod h1:acDnkkCI2QxIo8sSIPgmp1wUlRohV7vfGtAIVae73b0= -github.com/go-openapi/errors v0.21.0 h1:FhChC/duCnfoLj1gZ0BgaBmzhJC2SL/sJr8a2vAobSY= -github.com/go-openapi/errors v0.21.0/go.mod h1:jxNTMUxRCKj65yb/okJGEtahVd7uvWnuWfj53bse4ho= -github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= -github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= -github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= -github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= -github.com/go-openapi/runtime v0.27.1 h1:ae53yaOoh+fx/X5Eaq8cRmavHgDma65XPZuvBqvJYto= -github.com/go-openapi/runtime v0.27.1/go.mod h1:fijeJEiEclyS8BRurYE1DE5TLb9/KZl6eAdbzjsrlLU= -github.com/go-openapi/spec v0.20.13 h1:XJDIN+dLH6vqXgafnl5SUIMnzaChQ6QTo0/UPMbkIaE= -github.com/go-openapi/spec v0.20.13/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= -github.com/go-openapi/strfmt v0.22.1 h1:5Ky8cybT4576C6Ffc+8gYji/wRXCo6Ozm8RaWjPI6jc= -github.com/go-openapi/strfmt v0.22.1/go.mod h1:OfVoytIXJasDkkGvkb1Cceb3BPyMOwk1FgmyyEw7NYg= -github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= -github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= -github.com/go-openapi/validate v0.22.4 h1:5v3jmMyIPKTR8Lv9syBAIRxG6lY0RqeBPB1LKEijzk8= -github.com/go-openapi/validate v0.22.4/go.mod h1:qm6O8ZIcPVdSY5219468Jv7kBdGvkiZLPOmqnqTUZ2A= +github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= +github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= +github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= +github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco= +github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs= +github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ= +github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= +github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= +github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= +github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= +github.com/go-piv/piv-go v1.11.0 h1:5vAaCdRTFSIW4PeqMbnsDlUZ7odMYWnHBDGdmtU/Zhg= +github.com/go-piv/piv-go v1.11.0/go.mod h1:NZ2zmjVkfFaL/CF8cVQ/pXdXtuj110zEKGdJM6fJZZM= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE= -github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-rod/rod v0.114.5 h1:1x6oqnslwFVuXJbJifgxspJUd3O4ntaGhRLHt+4Er9c= -github.com/go-rod/rod v0.114.5/go.mod h1:aiedSEFg5DwG/fnNbUOTPMTTWX3MRj6vIs/a684Mthw= +github.com/go-playground/validator/v10 v10.18.0 h1:BvolUXjp4zuvkZ5YN5t7ebzbhlUtPsPm2S9NAZ5nl9U= +github.com/go-playground/validator/v10 v10.18.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-rod/rod v0.114.7 h1:h4pimzSOUnw7Eo41zdJA788XsawzHjJMyzCE3BrBww0= +github.com/go-rod/rod v0.114.7/go.mod h1:aiedSEFg5DwG/fnNbUOTPMTTWX3MRj6vIs/a684Mthw= github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= -github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= @@ -429,8 +448,8 @@ github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzw github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= -github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -454,8 +473,8 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= @@ -463,8 +482,8 @@ github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs0 github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= -github.com/google/certificate-transparency-go v1.1.7 h1:IASD+NtgSTJLPdzkthwvAG1ZVbF2WtFg4IvoA68XGSw= -github.com/google/certificate-transparency-go v1.1.7/go.mod h1:FSSBo8fyMVgqptbfF6j5p/XNdgQftAhSmXcIxV9iphE= +github.com/google/certificate-transparency-go v1.1.8 h1:LGYKkgZF7satzgTak9R4yzfJXEeYVAjV6/EAEJOf1to= +github.com/google/certificate-transparency-go v1.1.8/go.mod h1:bV/o8r0TBKRf1X//iiiSgWrvII4d7/8OiA+3vG26gI8= github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU= github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49/go.mod h1:BkkQ4L1KS1xMt2aWSPStnn55ChGC0DPOn2FQYj+f25M= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -479,8 +498,8 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.18.0 h1:ShE7erKNPqRh5ue6Z9DUOlk04WsnFWPO6YGr3OxnfoQ= -github.com/google/go-containerregistry v0.18.0/go.mod h1:u0qB2l7mvtWVR5kNcbFIhFY1hLbf8eeGapA+vbFDCtQ= +github.com/google/go-containerregistry v0.19.1 h1:yMQ62Al6/V0Z7CqIrrS1iYoA5/oQCm88DeNujc7C1KY= +github.com/google/go-containerregistry v0.19.1/go.mod h1:YCMFNQeeXeLF+dnhhWkqDItx/JSkH01j1Kis4PsjzFI= github.com/google/go-github/v45 v45.2.0 h1:5oRLszbrkvxDDqBCNj2hjDZMKmvexaZ1xw/FCD+K3FI= github.com/google/go-github/v45 v45.2.0/go.mod h1:FObaZJEDSTa/WGCzZ2Z3eoCDXWJKMenWWTrd8jrta28= github.com/google/go-github/v55 v55.0.0 h1:4pp/1tNMB9X/LuAhs5i0KQAE40NmiR/y6prLNb9x9cg= @@ -499,8 +518,8 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/tink/go v1.7.0 h1:6Eox8zONGebBFcCBqkVmt60LaWZa6xg1cl/DwAh/J1w= github.com/google/tink/go v1.7.0/go.mod h1:GAUOd+QE3pgj9q8VKIGTCP33c/B7eb4NhxLcgTJZStM= -github.com/google/trillian v1.5.3 h1:3ioA5p09qz+U9/t2riklZtaQdZclaStp0/eQNfewNRg= -github.com/google/trillian v1.5.3/go.mod h1:p4tcg7eBr7aT6DxrAoILpc3uXNfcuAvZSnQKonVg+Eo= +github.com/google/trillian v1.6.0 h1:jMBeDBIkINFvS2n6oV5maDqfRlxREAc6CW9QYWQ0qT4= +github.com/google/trillian v1.6.0/go.mod h1:Yu3nIMITzNhhMJEHjAtp6xKiu+H/iHu2Oq5FjV2mCWI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -508,8 +527,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= +github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= @@ -552,8 +571,8 @@ github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31 github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= github.com/hashicorp/vault-client-go v0.4.3 h1:zG7STGVgn/VK6rnZc0k8PGbfv2x/sJExRKHSUg3ljWc= github.com/hashicorp/vault-client-go v0.4.3/go.mod h1:4tDw7Uhq5XOxS1fO+oMtotHL7j4sB9cp0T7U6m4FzDY= -github.com/hashicorp/vault/api v1.10.0 h1:/US7sIjWN6Imp4o/Rj1Ce2Nr5bki/AXi9vAW3p2tOJQ= -github.com/hashicorp/vault/api v1.10.0/go.mod h1:jo5Y/ET+hNyz+JnKDt8XLAdKs+AM0G5W0Vp1IrFI8N8= +github.com/hashicorp/vault/api v1.12.2 h1:7YkCTE5Ni90TcmYHDBExdt4WGJxhpzaHqR6uGbQb/rE= +github.com/hashicorp/vault/api v1.12.2/go.mod h1:LSGf1NGT1BnvFFnKVtnvcaLBM2Lz+gJdpL6HUYed8KE= github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef h1:A9HsByNhogrvm9cWb28sjiS3i7tcKCkflWFEkHfuAgM= github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -571,8 +590,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 h1:TMtDYDHKYY15rFihtRfck/bfFqNfvcabqvXAFQfAUpY= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= -github.com/jellydator/ttlcache/v3 v3.1.1 h1:RCgYJqo3jgvhl+fEWvjNW8thxGWsgxi+TPhRir1Y9y8= -github.com/jellydator/ttlcache/v3 v3.1.1/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4= +github.com/jellydator/ttlcache/v3 v3.2.0 h1:6lqVJ8X3ZaUwvzENqPAobDsXNExfUJd61u++uW8a3LE= +github.com/jellydator/ttlcache/v3 v3.2.0/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4= github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o= github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= @@ -621,8 +640,8 @@ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/letsencrypt/boulder v0.0.0-20231026200631-000cd05d5491 h1:WGrKdjHtWC67RX96eTkYD2f53NDHhrq/7robWTAfk4s= github.com/letsencrypt/boulder v0.0.0-20231026200631-000cd05d5491/go.mod h1:o158RFmdEbYyIZmXAbrvmJWesbyxlLKee6X64VPVuOc= github.com/lib/pq v0.0.0-20150723085316-0dad96c0b94f/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -639,8 +658,6 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3 h1:oo9nIgnyiBgYPbcZslRT4y29siuL5EoNJ/t1tr0xEVQ= github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3/go.mod h1:LxhqC7khDoRENwooP6f/vWvia9ivj6TqLYrR39zqkN0= -github.com/mandelsoft/logging v0.0.0-20230905123808-7042ee3aae45 h1:BGJBqw9q1Brn3XAYcj52hhonjV7aHUftVJ3SuJpXQ/M= -github.com/mandelsoft/logging v0.0.0-20230905123808-7042ee3aae45/go.mod h1:J/kRqdfAOQmMPfJeAcV2pfX1QLV9/NlAQdAJzpnaU+g= github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf h1:WEmgzeArDbp6Aw34jmziMIE5ygo2zpl/atXRq3D7lSw= github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf/go.mod h1:uO460C1lIB3IOOgrbXhAlz3AKsOv4T2K6ALBn3PwuSg= github.com/mandelsoft/spiff v1.7.0-beta-5 h1:3kC10nTviDQhL8diSxp7i4IC2iSiDg6KPbH1CAq7Lfw= @@ -659,11 +676,9 @@ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/mattn/go-sqlite3 v1.6.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= -github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= @@ -741,12 +756,14 @@ github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= github.com/open-component-model/cobra v0.0.0-20230329075350-b1fd876abfb9 h1:b2cJvZ8nWAVvCqvPhUaFl26Wht4nM4mqfl2ksY9lVzU= github.com/open-component-model/cobra v0.0.0-20230329075350-b1fd876abfb9/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/open-policy-agent/opa v0.63.0 h1:ztNNste1v8kH0/vJMJNquE45lRvqwrM5mY9Ctr9xIXw= +github.com/open-policy-agent/opa v0.63.0/go.mod h1:9VQPqEfoB2N//AToTxzZ1pVTVPUoF2Mhd64szzjWPpU= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= -github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= @@ -775,30 +792,34 @@ github.com/prometheus/client_golang v0.9.0-pre1.0.20180209125602-c332b6f63c06/go github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= -github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= -github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/common v0.51.1 h1:eIjN50Bwglz6a/c3hAgSMcofL3nD+nFQkV6Dd4DsQCw= +github.com/prometheus/common v0.51.1/go.mod h1:lrWtQx+iDfn2mbH5GUzlH9TSHyfZpHkSiG1W7y3sF2Q= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf h1:014O62zIzQwvoD7Ekj3ePDF5bv9Xxy0w6AZk0qYbjUk= +github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf/go.mod h1:jgxiZysxFPM+iWKwQwPR+y+Jvo54ARd4EisXxKYpB5c= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rubenv/sql-migrate v1.6.0 h1:IZpcTlAx/VKXphWEpwWJ7BaMq05tYtE80zYz+8a5Il8= github.com/rubenv/sql-migrate v1.6.0/go.mod h1:m3ilnKP7sNb4eYkLsp6cGdPOl4OBcXM6rcbzU+Oqc5k= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -811,8 +832,8 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sassoftware/relic v7.2.1+incompatible h1:Pwyh1F3I0r4clFJXkSI8bOyJINGqpgjJU3DYAZeI05A= github.com/sassoftware/relic v7.2.1+incompatible/go.mod h1:CWfAxv73/iLZ17rbyhIEq3K9hs5w6FpNMdUT//qR+zk= -github.com/sassoftware/relic/v7 v7.6.1 h1:O5s8ewCgq5QYNpv45dK4u6IpBmDM9RIcsbf/G1uXepQ= -github.com/sassoftware/relic/v7 v7.6.1/go.mod h1:NxwtWxWxlUa9as2qZi635Ye6bBT/tGnMALLq7dSfOOU= +github.com/sassoftware/relic/v7 v7.6.2 h1:rS44Lbv9G9eXsukknS4mSjIAuuX+lMq/FnStgmZlUv4= +github.com/sassoftware/relic/v7 v7.6.2/go.mod h1:kjmP0IBVkJZ6gXeAu35/KCEfca//+PKM6vTAsyDPY+k= github.com/secure-systems-lab/go-securesystemslib v0.8.0 h1:mr5An6X45Kb2nddcFlbmfHkLguCE9laoZCUzEEpIZXA= github.com/secure-systems-lab/go-securesystemslib v0.8.0/go.mod h1:UH2VZVuJfCYR8WgMlCU1uFsOUU+KeyrTWcSS73NBOzU= github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c= @@ -824,24 +845,24 @@ github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/sigstore/cosign/v2 v2.2.3 h1:WX7yawI+EXu9h7S5bZsfYCbB9XW6Jc43ctKy/NoOSiA= -github.com/sigstore/cosign/v2 v2.2.3/go.mod h1:WpMn4MBt0cI23GdHsePwO4NxhX1FOz1ITGB3ALUjFaI= -github.com/sigstore/fulcio v1.4.3 h1:9JcUCZjjVhRF9fmhVuz6i1RyhCc/EGCD7MOl+iqCJLQ= -github.com/sigstore/fulcio v1.4.3/go.mod h1:BQPWo7cfxmJwgaHlphUHUpFkp5+YxeJes82oo39m5og= -github.com/sigstore/rekor v1.3.4 h1:RGIia1iOZU7fOiiP2UY/WFYhhp50S5aUm7YrM8aiA6E= -github.com/sigstore/rekor v1.3.4/go.mod h1:1GubPVO2yO+K0m0wt/3SHFqnilr/hWbsjSOe7Vzxrlg= -github.com/sigstore/sigstore v1.8.1 h1:mAVposMb14oplk2h/bayPmIVdzbq2IhCgy4g6R0ZSjo= -github.com/sigstore/sigstore v1.8.1/go.mod h1:02SL1158BSj15bZyOFz7m+/nJzLZfFd9A8ab3Kz7w/E= -github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.1 h1:rEDdUefulkIQaMJyzLwtgPDLNXBIltBABiFYfb0YmgQ= -github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.1/go.mod h1:RCdYCc1IxCYWzh2IdzdA6Yf7JIY0cMRqH08fpQYechw= -github.com/sigstore/sigstore/pkg/signature/kms/azure v1.8.1 h1:DvRWG99QGWZC5mp42SEde2Xke/Q384Idnj2da7yB+Mk= -github.com/sigstore/sigstore/pkg/signature/kms/azure v1.8.1/go.mod h1:s13mo3a0UCQS3+PAUUZfvKe48sMDMsHk2GE1b2YfPcU= -github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.8.1 h1:lwdRsJv1UbBemuk7w5YfXAQilQxMoFevrzamdPbG0wY= -github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.8.1/go.mod h1:2OaSQ80EcdyVRSQ3T4d1lsc6Scopblsiq8U2AEk5K1A= -github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.8.1 h1:9Ki0qudKpc1FQdef7xHO2bkLyTuw+qNUpWRzjBEmF4c= -github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.8.1/go.mod h1:nhIgyu4YwwNgalIwTGsoAzam16jjAn3ADRSWKbWPwGI= -github.com/sigstore/timestamp-authority v1.2.1 h1:j9RmqSAdvKgSofeltPO4x7d+1M3AXaROBzUJ+AA7L5Q= -github.com/sigstore/timestamp-authority v1.2.1/go.mod h1:Ce+vWWEf0QaKLY2u6mpwEJbmYXEVeOfUk4fQ69kE6ck= +github.com/sigstore/cosign/v2 v2.2.4 h1:iY4vtEacmu2hkNj1Fh+8EBqBwKs2DHM27/lbNWDFJro= +github.com/sigstore/cosign/v2 v2.2.4/go.mod h1:JZlRD2uaEjVAvZ1XJ3QkkZJhTqSDVtLaet+C/TMR81Y= +github.com/sigstore/fulcio v1.4.5 h1:WWNnrOknD0DbruuZWCbN+86WRROpEl3Xts+WT2Ek1yc= +github.com/sigstore/fulcio v1.4.5/go.mod h1:oz3Qwlma8dWcSS/IENR/6SjbW4ipN0cxpRVfgdsjMU8= +github.com/sigstore/rekor v1.3.6 h1:QvpMMJVWAp69a3CHzdrLelqEqpTM3ByQRt5B5Kspbi8= +github.com/sigstore/rekor v1.3.6/go.mod h1:JDTSNNMdQ/PxdsS49DJkJ+pRJCO/83nbR5p3aZQteXc= +github.com/sigstore/sigstore v1.8.3 h1:G7LVXqL+ekgYtYdksBks9B38dPoIsbscjQJX/MGWkA4= +github.com/sigstore/sigstore v1.8.3/go.mod h1:mqbTEariiGA94cn6G3xnDiV6BD8eSLdL/eA7bvJ0fVs= +github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.3 h1:LTfPadUAo+PDRUbbdqbeSl2OuoFQwUFTnJ4stu+nwWw= +github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.3/go.mod h1:QV/Lxlxm0POyhfyBtIbTWxNeF18clMlkkyL9mu45y18= +github.com/sigstore/sigstore/pkg/signature/kms/azure v1.8.3 h1:xgbPRCr2npmmsuVVteJqi/ERw9+I13Wou7kq0Yk4D8g= +github.com/sigstore/sigstore/pkg/signature/kms/azure v1.8.3/go.mod h1:G4+I83FILPX6MtnoaUdmv/bRGEVtR3JdLeJa/kXdk/0= +github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.8.3 h1:vDl2fqPT0h3D/k6NZPlqnKFd1tz3335wm39qjvpZNJc= +github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.8.3/go.mod h1:9uOJXbXEXj+M6QjMKH5PaL5WDMu43rHfbIMgXzA8eKI= +github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.8.3 h1:h9G8j+Ds21zqqulDbA/R/ft64oQQIyp8S7wJYABYSlg= +github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.8.3/go.mod h1:zgCeHOuqF6k7A7TTEvftcA9V3FRzB7mrPtHOhXAQBnc= +github.com/sigstore/timestamp-authority v1.2.2 h1:X4qyutnCQqJ0apMewFyx+3t7Tws00JQ/JonBiu3QvLE= +github.com/sigstore/timestamp-authority v1.2.2/go.mod h1:nEah4Eq4wpliDjlY342rXclGSO7Kb9hoRrl9tqLW13A= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= @@ -869,8 +890,8 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= -github.com/spiffe/go-spiffe/v2 v2.1.7 h1:VUkM1yIyg/x8X7u1uXqSRVRCdMdfRIEdFBzpqoeASGk= -github.com/spiffe/go-spiffe/v2 v2.1.7/go.mod h1:QJDGdhXllxjxvd5B+2XnhhXB/+rC8gr+lNrtOryiWeE= +github.com/spiffe/go-spiffe/v2 v2.2.0 h1:9Vf06UsvsDbLYK/zJ4sYsIsHmMFknUD+feA7IYoWMQY= +github.com/spiffe/go-spiffe/v2 v2.2.0/go.mod h1:Urzb779b3+IwDJD2ZbN8fVl3Aa8G4N/PiUe6iXC0XxU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -896,6 +917,8 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes= +github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c h1:HelZ2kAFadG0La9d+4htN4HzQ68Bm2iM9qKMSMES6xg= github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c/go.mod h1:JlzghshsemAMDGZLytTFY8C1JQxQPhnatWqNwUXjggo= github.com/thales-e-security/pool v0.0.2 h1:RAPs4q2EbWsTit6tpzuvTFlgFRJ3S8Evf5gtvVDbmPg= @@ -921,8 +944,8 @@ github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQ github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vbatts/tar-split v0.11.5 h1:3bHCTIheBm1qFTcgh9oPu+nNBtX+XJIupG/vacinCts= github.com/vbatts/tar-split v0.11.5/go.mod h1:yZbwRsSeGjusneWgA781EKej9HF8vme8okylkAeNKLk= -github.com/xanzy/go-gitlab v0.96.0 h1:LGkZ+wSNMRtHIBaYE4Hq3dZVjprwHv3Y1+rhKU3WETs= -github.com/xanzy/go-gitlab v0.96.0/go.mod h1:ETg8tcj4OhrB84UEgeE8dSuV/0h4BBL1uOV/qK0vlyI= +github.com/xanzy/go-gitlab v0.102.0 h1:ExHuJ1OTQ2yt25zBMMj0G96ChBirGYv8U7HyUiYkZ+4= +github.com/xanzy/go-gitlab v0.102.0/go.mod h1:ETg8tcj4OhrB84UEgeE8dSuV/0h4BBL1uOV/qK0vlyI= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -932,6 +955,8 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17 github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/yashtewari/glob-intersection v0.2.0 h1:8iuHdN88yYuCzCdjt0gDe+6bAhUwBeEWqThExu54RFg= +github.com/yashtewari/glob-intersection v0.2.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok= github.com/ysmood/fetchup v0.2.3 h1:ulX+SonA0Vma5zUFXtv52Kzip/xe7aj4vqT5AJwQ+ZQ= github.com/ysmood/fetchup v0.2.3/go.mod h1:xhibcRKziSvol0H1/pj33dnKrYyI2ebIvz5cOOkYGns= github.com/ysmood/goob v0.4.0 h1:HsxXhyLBeGzWXnqVKtmT9qM7EuVs/XOgkX7T6r1o1AQ= @@ -953,36 +978,36 @@ github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMzt github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -github.com/zalando/go-keyring v0.2.2 h1:f0xmpYiSrHtSNAVgwip93Cg8tuF45HJM6rHq/A5RI/4= -github.com/zalando/go-keyring v0.2.2/go.mod h1:sI3evg9Wvpw3+n4SqplGSJUMwtDeROfD4nsFz4z9PG0= +github.com/zalando/go-keyring v0.2.3 h1:v9CUu9phlABObO4LPWycf+zwMG7nlbb3t/B5wa97yms= +github.com/zalando/go-keyring v0.2.3/go.mod h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk= github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs= github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= -go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= -go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= -go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= -go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= -go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= -go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= -go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= -go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= +go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.starlark.net v0.0.0-20231121155337-90ade8b19d09 h1:hzy3LFnSN8kuQK8h9tHl4ndF6UruMj47OqwqsS+/Ai4= go.starlark.net v0.0.0-20231121155337-90ade8b19d09/go.mod h1:LcLNIzVOMp4oV+uusnpk+VU+SzXaJakUuBjoCSWH5dM= -go.step.sm/crypto v0.42.1 h1:OmwHm3GJO8S4VGWL3k4+I+Q4P/F2s+j8msvTyGnh1Vg= -go.step.sm/crypto v0.42.1/go.mod h1:yNcTLFQBnYCA75fC5bklBoTAT7y0dRZsB1TkinB8JMs= +go.step.sm/crypto v0.44.2 h1:t3p3uQ7raP2jp2ha9P6xkQF85TJZh+87xmjSLaib+jk= +go.step.sm/crypto v0.44.2/go.mod h1:x1439EnFhadzhkuaGX7sz03LEMQ+jV4gRamf5LCZJQQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -1002,8 +1027,9 @@ golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2Uz golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc h1:ao2WRsKSzW6KuUY9IWPwWahcHCgR0s52IfwutMfEbdM= golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= @@ -1018,8 +1044,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1051,11 +1077,11 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= -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/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= -golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg= +golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1066,8 +1092,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1102,8 +1128,9 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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= @@ -1112,14 +1139,14 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= -golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= @@ -1144,8 +1171,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1155,21 +1182,19 @@ golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSm golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/api v0.159.0 h1:fVTj+7HHiUYz4JEZCHHoRIeQX7h5FMzrA2RF/DzDdbs= -google.golang.org/api v0.159.0/go.mod h1:0mu0TpK33qnydLvWqbImq2b1eQ5FHRSDCBzAxX9ZHyw= +google.golang.org/api v0.172.0 h1:/1OcMZGPmW1rX2LCu2CmGUD1KXK1+pfzxotxyRUCCdk= +google.golang.org/api v0.172.0/go.mod h1:+fJZq6QXWfa9pXhnIzsjx4yI22d4aI9ZpLb58gvXjis= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 h1:nz5NESFLZbJGPFxDT/HCn+V1mZ8JGNoY4nUpmW/Y2eg= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 h1:rcS6EyEaoCO52hQDupoSfrxI3R6C2Tq741is7X8OvnM= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac h1:nUQEQmH/csSvFECKYRv6HWEyypysidKl2I6Qpsglq/0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= +google.golang.org/genproto v0.0.0-20240311173647-c811ad7063a7 h1:ImUcDPHjTrAqNhlOkSocDLfG9rrNHH7w7uoKWPaWZ8s= +google.golang.org/genproto v0.0.0-20240311173647-c811ad7063a7/go.mod h1:/3XmxOjePkvmKrHuBy4zNFw7IzxJXtAgdpXi8Ll990U= +google.golang.org/genproto/googleapis/api v0.0.0-20240311173647-c811ad7063a7 h1:oqta3O3AnlWbmIE3bFnWbu4bRxZjfbWCp0cKSuZh01E= +google.golang.org/genproto/googleapis/api v0.0.0-20240311173647-c811ad7063a7/go.mod h1:VQW3tUculP/D4B+xVCo+VgSq8As6wA9ZjHl//pmk+6s= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= @@ -1177,8 +1202,8 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= -google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1246,8 +1271,8 @@ k8s.io/client-go v0.29.0 h1:KmlDtFcrdUzOYrBhXHgKw5ycWzc3ryPX5mQe0SkG3y8= k8s.io/client-go v0.29.0/go.mod h1:yLkXH4HKMAywcrD82KMSmfYg2DlE8mepPR4JGSo5n38= k8s.io/component-base v0.29.0 h1:T7rjd5wvLnPBV1vC4zWd/iWRbV8Mdxs+nGaoaFzGw3s= k8s.io/component-base v0.29.0/go.mod h1:sADonFTQ9Zc9yFLghpDpmNXEdHyQmFIGbiuZbqAXQ1M= -k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= -k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= +k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20240103195357-a9f8850cb432 h1:+XYBQU3ZKUu60H6fEnkitTTabGoKfIG8zczhZBENu9o= k8s.io/kube-openapi v0.0.0-20240103195357-a9f8850cb432/go.mod h1:Pa1PvrP7ACSkuX6I7KYomY6cmMA0Tx86waBhDUgoKPw= k8s.io/kubectl v0.29.0 h1:Oqi48gXjikDhrBF67AYuZRTcJV4lg2l42GmvsP7FmYI= @@ -1270,5 +1295,5 @@ sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+s sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= -software.sslmate.com/src/go-pkcs12 v0.2.0 h1:nlFkj7bTysH6VkC4fGphtjXRbezREPgrHuJG20hBGPE= -software.sslmate.com/src/go-pkcs12 v0.2.0/go.mod h1:23rNcYsMabIc1otwLpTkCCPwUq6kQsTyowttG/as0kQ= +software.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k= +software.sslmate.com/src/go-pkcs12 v0.4.0/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI= From 3b6f0f78f04c12b836ddc24d97c985b1c086e999 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 17:24:02 +0200 Subject: [PATCH 28/83] Bump the go group with 27 updates (#729) Bumps the go group with 27 updates --- go.mod | 159 ++++++++++----------- go.sum | 237 ++++++++++++++++--------------- pkg/toi/drivers/docker/driver.go | 12 +- 3 files changed, 207 insertions(+), 201 deletions(-) diff --git a/go.mod b/go.mod index df145204c0..a51d6b9e32 100644 --- a/go.mod +++ b/go.mod @@ -5,26 +5,24 @@ go 1.22 replace github.com/spf13/cobra => github.com/open-component-model/cobra v0.0.0-20230329075350-b1fd876abfb9 require ( - github.com/DataDog/gostackparse v0.7.0 - github.com/InfiniteLoopSpace/go_S-MIME v0.0.0-20181221134359-3f58f9a4b2b6 - github.com/Masterminds/semver/v3 v3.2.1 - github.com/aws/aws-sdk-go-v2 v1.26.0 - github.com/aws/aws-sdk-go-v2/config v1.27.9 - github.com/aws/aws-sdk-go-v2/credentials v1.17.9 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.9 - github.com/aws/aws-sdk-go-v2/service/ecr v1.27.1 - github.com/aws/aws-sdk-go-v2/service/s3 v1.51.4 - github.com/containerd/containerd v1.7.13 + github.com/aws/aws-sdk-go-v2 v1.26.1 + github.com/aws/aws-sdk-go-v2/config v1.27.11 + github.com/aws/aws-sdk-go-v2/credentials v1.17.11 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15 + github.com/aws/aws-sdk-go-v2/service/ecr v1.27.4 + github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 + github.com/containerd/containerd v1.7.15 github.com/containerd/log v0.1.0 - github.com/containers/image/v5 v5.29.2 - github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46 - github.com/distribution/reference v0.5.0 - github.com/docker/cli v24.0.7+incompatible - github.com/docker/docker v24.0.9+incompatible + github.com/containers/image/v5 v5.30.0 + github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f + github.com/DataDog/gostackparse v0.7.0 + github.com/distribution/reference v0.6.0 + github.com/docker/cli v25.0.5+incompatible + github.com/docker/docker v25.0.5+incompatible github.com/docker/go-connections v0.5.0 github.com/drone/envsubst v1.0.3 - github.com/fluxcd/cli-utils v0.36.0-flux.3 - github.com/fluxcd/pkg/ssa v0.36.0 + github.com/fluxcd/cli-utils v0.36.0-flux.5 + github.com/fluxcd/pkg/ssa v0.38.0 github.com/gertd/go-pluralize v0.2.1 github.com/ghodss/yaml v1.0.0 github.com/go-logr/logr v1.4.1 @@ -36,18 +34,20 @@ require ( github.com/google/go-github/v45 v45.2.0 github.com/hashicorp/vault-client-go v0.4.3 github.com/imdario/mergo v0.3.16 - github.com/klauspost/compress v1.17.4 + github.com/InfiniteLoopSpace/go_S-MIME v0.0.0-20181221134359-3f58f9a4b2b6 + github.com/klauspost/compress v1.17.7 github.com/klauspost/pgzip v1.2.6 github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3 github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf github.com/mandelsoft/spiff v1.7.0-beta-5 github.com/mandelsoft/vfs v0.4.3 github.com/marstr/guid v1.1.0 + github.com/Masterminds/semver/v3 v3.2.1 github.com/mitchellh/copystructure v1.2.0 - github.com/mittwald/go-helm-client v0.12.8 + github.com/mittwald/go-helm-client v0.12.9 github.com/modern-go/reflect2 v1.0.2 - github.com/onsi/ginkgo/v2 v2.15.0 - github.com/onsi/gomega v1.31.1 + github.com/onsi/ginkgo/v2 v2.17.1 + github.com/onsi/gomega v1.32.0 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.1.0 github.com/pkg/errors v0.9.1 @@ -60,55 +60,29 @@ require ( github.com/stretchr/testify v1.9.0 github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c github.com/tonglil/buflogr v1.1.1 - github.com/ulikunitz/xz v0.5.11 + github.com/ulikunitz/xz v0.5.12 github.com/xeipuuv/gojsonschema v1.2.0 - golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc + golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 - golang.org/x/net v0.22.0 + golang.org/x/net v0.24.0 golang.org/x/oauth2 v0.19.0 golang.org/x/text v0.14.0 gopkg.in/yaml.v3 v3.0.1 - helm.sh/helm/v3 v3.14.3 - k8s.io/api v0.29.0 - k8s.io/apiextensions-apiserver v0.29.0 - k8s.io/apimachinery v0.29.0 - k8s.io/cli-runtime v0.29.0 - k8s.io/client-go v0.29.0 - sigs.k8s.io/controller-runtime v0.16.3 + helm.sh/helm/v3 v3.14.4 + k8s.io/api v0.29.3 + k8s.io/apiextensions-apiserver v0.29.3 + k8s.io/apimachinery v0.29.3 + k8s.io/cli-runtime v0.29.3 + k8s.io/client-go v0.29.3 + sigs.k8s.io/controller-runtime v0.17.2 sigs.k8s.io/yaml v1.4.0 ) -require ( - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/go-jose/go-jose/v4 v4.0.1 // indirect -) - -// indirect dependencies require ( cloud.google.com/go/compute v1.25.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect - github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0 // indirect - github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect - github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.29 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect - github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 // indirect - github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect - github.com/MakeNowJust/heredoc v1.0.0 // indirect - github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/sprig/v3 v3.2.3 // indirect - github.com/Masterminds/squirrel v1.5.4 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/Microsoft/hcsshim v0.12.0-rc.1 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect - github.com/ThalesIgnite/crypto11 v1.2.5 // indirect github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect github.com/alibabacloud-go/cr-20160607 v1.0.1 // indirect github.com/alibabacloud-go/cr-20181201 v1.0.10 // indirect @@ -120,28 +94,41 @@ require ( github.com/alibabacloud-go/tea-utils v1.4.5 // indirect github.com/alibabacloud-go/tea-xml v1.1.3 // indirect github.com/aliyun/credentials-go v1.3.1 // indirect + github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 // indirect github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.5 // indirect - github.com/aws/smithy-go v1.20.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 // indirect + github.com/aws/smithy-go v1.20.2 // indirect github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8 // indirect + github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/Azure/go-autorest v14.2.0+incompatible // indirect + github.com/Azure/go-autorest/autorest v0.11.29 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect + github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 // indirect + github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 // indirect + github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect + github.com/Azure/go-autorest/logger v0.2.1 // indirect + github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver v3.5.1+incompatible // indirect + github.com/blang/semver/v4 v4.0.0 // indirect github.com/buildkite/agent/v3 v3.62.0 // indirect github.com/buildkite/go-pipeline v0.3.2 // indirect github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251 // indirect + github.com/BurntSushi/toml v1.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 // indirect @@ -151,7 +138,7 @@ require ( github.com/containerd/stargz-snapshotter/estargz v0.15.1 // indirect github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 // indirect github.com/containers/ocicrypt v1.1.9 // indirect - github.com/containers/storage v1.51.0 // indirect + github.com/containers/storage v1.53.0 // indirect github.com/coreos/go-oidc/v3 v3.10.0 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect @@ -159,13 +146,14 @@ require ( github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7 // indirect github.com/dimchansky/utfbom v1.1.1 // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker-credential-helpers v0.8.0 // indirect + github.com/docker/docker-credential-helpers v0.8.1 // indirect github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect github.com/docker/go-metrics v0.0.1 // indirect github.com/docker/go-units v0.5.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/emicklei/go-restful/v3 v3.11.1 // indirect github.com/evanphx/json-patch v5.7.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.7.0 // indirect + github.com/evanphx/json-patch/v5 v5.8.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/fatih/color v1.16.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect @@ -175,6 +163,7 @@ require ( github.com/go-errors/errors v1.5.1 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect github.com/go-jose/go-jose/v3 v3.0.3 // indirect + github.com/go-jose/go-jose/v4 v4.0.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/analysis v0.23.0 // indirect github.com/go-openapi/errors v0.22.0 // indirect @@ -232,9 +221,15 @@ require ( github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect + github.com/MakeNowJust/heredoc v1.0.0 // indirect + github.com/Masterminds/goutils v1.1.1 // indirect + github.com/Masterminds/sprig/v3 v3.2.3 // indirect + github.com/Masterminds/squirrel v1.5.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/hcsshim v0.12.0-rc.3 // indirect github.com/miekg/pkcs11 v1.1.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect @@ -263,6 +258,7 @@ require ( github.com/prometheus/client_model v0.6.0 // indirect github.com/prometheus/common v0.51.1 // indirect github.com/prometheus/procfs v0.12.0 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rubenv/sql-migrate v1.6.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -285,6 +281,7 @@ require ( github.com/subosito/gotenv v1.6.0 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/thales-e-security/pool v0.0.2 // indirect + github.com/ThalesIgnite/crypto11 v1.2.5 // indirect github.com/theupdateframework/go-tuf v0.7.0 // indirect github.com/theupdateframework/notary v0.7.0 // indirect github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect @@ -320,21 +317,21 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect google.golang.org/grpc v1.62.1 // indirect google.golang.org/protobuf v1.33.0 // indirect - gopkg.in/evanphx/json-patch.v5 v5.7.0 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/go-jose/go-jose.v2 v2.6.3 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiserver v0.29.0 // indirect - k8s.io/component-base v0.29.0 // indirect + k8s.io/apiserver v0.29.3 // indirect + k8s.io/component-base v0.29.3 // indirect k8s.io/klog/v2 v2.120.1 // indirect k8s.io/kube-openapi v0.0.0-20240103195357-a9f8850cb432 // indirect - k8s.io/kubectl v0.29.0 // indirect - k8s.io/utils v0.0.0-20240102154912-e7106e64919e // indirect - oras.land/oras-go v1.2.4 // indirect + k8s.io/kubectl v0.29.3 // indirect + k8s.io/utils v0.0.0-20240310230437-4693a0247e57 // indirect + oras.land/oras-go v1.2.5 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/kustomize/api v0.16.0 // indirect - sigs.k8s.io/kustomize/kyaml v0.16.0 // indirect + sigs.k8s.io/kustomize/api v0.17.0 // indirect + sigs.k8s.io/kustomize/kyaml v0.17.0 // indirect sigs.k8s.io/release-utils v0.7.7 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect ) diff --git a/go.sum b/go.sum index 15735b4fa0..17911edf25 100644 --- a/go.sum +++ b/go.sum @@ -81,8 +81,8 @@ github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8 github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.12.0-rc.1 h1:Hy+xzYujv7urO5wrgcG58SPMOXNLrj4WCJbySs2XX/A= -github.com/Microsoft/hcsshim v0.12.0-rc.1/go.mod h1:Y1a1S0QlYp1mBpyvGiuEdOfZqnao+0uX5AWHXQ5NhZU= +github.com/Microsoft/hcsshim v0.12.0-rc.3 h1:5GNGrobGs/sN/0nFO21W9k4lFn+iXXZAE8fCZbmdRak= +github.com/Microsoft/hcsshim v0.12.0-rc.3/go.mod h1:WuNfcaYNaw+KpCEsZCIM6HCEmu0c5HfXpi+dDSmveP0= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c h1:kMFnB0vCcX7IL/m9Y5LO+KQYv+t1CQOiFe6+SV2J7bE= @@ -149,53 +149,53 @@ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:W github.com/aws/aws-sdk-go v1.51.6 h1:Ld36dn9r7P9IjU8WZSaswQ8Y/XUCRpewim5980DwYiU= github.com/aws/aws-sdk-go v1.51.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2 v1.26.0 h1:/Ce4OCiM3EkpW7Y+xUnfAFpchU78K7/Ug01sZni9PgA= -github.com/aws/aws-sdk-go-v2 v1.26.0/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1 h1:gTK2uhtAPtFcdRRJilZPx8uJLL2J85xK11nKtWL0wfU= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1/go.mod h1:sxpLb+nZk7tIfCWChfd+h4QwHNUR57d8hA1cleTkjJo= -github.com/aws/aws-sdk-go-v2/config v1.27.9 h1:gRx/NwpNEFSk+yQlgmk1bmxxvQ5TyJ76CWXs9XScTqg= -github.com/aws/aws-sdk-go-v2/config v1.27.9/go.mod h1:dK1FQfpwpql83kbD873E9vz4FyAxuJtR22wzoXn3qq0= -github.com/aws/aws-sdk-go-v2/credentials v1.17.9 h1:N8s0/7yW+h8qR8WaRlPQeJ6czVMNQVNtNdUqf6cItao= -github.com/aws/aws-sdk-go-v2/credentials v1.17.9/go.mod h1:446YhIdmSV0Jf/SLafGZalQo+xr2iw7/fzXGDPTU1yQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0 h1:af5YzcLf80tv4Em4jWVD75lpnOHSBkPUZxZfGkrI3HI= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0/go.mod h1:nQ3how7DMnFMWiU1SpECohgC82fpn4cKZ875NDMmwtA= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.9 h1:vXY/Hq1XdxHBIYgBUmug/AbMyIe1AKulPYS2/VE1X70= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.9/go.mod h1:GyJJTZoHVuENM4TeJEl5Ffs4W9m19u+4wKJcDi/GZ4A= +github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= +github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= +github.com/aws/aws-sdk-go-v2/config v1.27.11 h1:f47rANd2LQEYHda2ddSCKYId18/8BhSRM4BULGmfgNA= +github.com/aws/aws-sdk-go-v2/config v1.27.11/go.mod h1:SMsV78RIOYdve1vf36z8LmnszlRWkwMQtomCAI0/mIE= +github.com/aws/aws-sdk-go-v2/credentials v1.17.11 h1:YuIB1dJNf1Re822rriUOTxopaHHvIq0l/pX3fwO+Tzs= +github.com/aws/aws-sdk-go-v2/credentials v1.17.11/go.mod h1:AQtFPsDH9bI2O+71anW6EKL+NcD7LG3dpKGMV4SShgo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15 h1:7Zwtt/lP3KNRkeZre7soMELMGNoBrutx8nobg1jKWmo= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15/go.mod h1:436h2adoHb57yd+8W+gYPrrA9U/R/SuAuOO42Ushzhw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4 h1:0ScVK/4qZ8CIW0k8jOeFVsyS/sAiXpYxRBLolMkuLQM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4/go.mod h1:84KyjNZdHC6QZW08nfHI6yZgPd+qRgaWcYsyLUo3QY8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4 h1:sHmMWWX5E7guWEFQ9SVo6A3S4xpPrWnd77a6y4WM6PU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4/go.mod h1:WjpDrhWisWOIoS9n3nk67A3Ll1vfULJ9Kq6h29HTD48= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.3 h1:mDnFOE2sVkyphMWtTH+stv0eW3k0OTx94K63xpxHty4= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.3/go.mod h1:V8MuRVcCRt5h1S+Fwu8KbC7l/gBGo3yBAyUbJM2IJOk= -github.com/aws/aws-sdk-go-v2/service/ecr v1.27.1 h1:GFt/4yMrCuMDi4YzKy0HCW9NhwbxoYZUMqIWqWJFsqE= -github.com/aws/aws-sdk-go-v2/service/ecr v1.27.1/go.mod h1:ydHfHlVpaydWdStDKNcV6BnI0fD+ZwlPWvDgVG2fLt0= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 h1:81KE7vaZzrl7yHBYHVEzYB8sypz11NMOZ40YlWvPxsU= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5/go.mod h1:LIt2rg7Mcgn09Ygbdh/RdIm0rQ+3BNkbP1gyVMFtRK0= +github.com/aws/aws-sdk-go-v2/service/ecr v1.27.4 h1:Qr9W21mzWT3RhfYn9iAux7CeRIdbnTAqmiOlASqQgZI= +github.com/aws/aws-sdk-go-v2/service/ecr v1.27.4/go.mod h1:if7ybzzjOmDB8pat9FE35AHTY6ZxlYSy3YviSmFZv8c= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2 h1:PpbXaecV3sLAS6rjQiaKw4/jyq3Z8gNzmoJupHAoBp0= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2/go.mod h1:fUHpGXr4DrXkEDpGAjClPsviWf+Bszeb0daKE0blxv8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.5 h1:mbWNpfRUTT6bnacmvOTKXZjR/HycibdWzNpfbrbLDIs= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.5/go.mod h1:FCOPWGjsshkkICJIn9hq9xr6dLKtyaWpuUojiN3W1/8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6 h1:b+E7zIUHMmcB4Dckjpkapoy47W6C9QBv/zoUP+Hn8Kc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6/go.mod h1:S2fNV0rxrP78NhPbCZeQgY8H9jdDMeGtwcfZIRxzBqU= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.3 h1:4t+QEX7BsXz98W8W1lNvMAG+NX8qHz2CjLBxQKku40g= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.3/go.mod h1:oFcjjUq5Hm09N9rpxTdeMeLeQcxS7mIkBkL8qUKng+A= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 h1:ZMeFZ5yk+Ek+jNr1+uwCd2tG89t6oTS5yVWpa6yy2es= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7/go.mod h1:mxV05U+4JiHqIpGqqYXOHLPKUC6bDXC44bsUhNjOEwY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 h1:ogRAwT1/gxJBcSWDMZlgyFUM962F51A5CRhDLbxLdmo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7/go.mod h1:YCsIZhXfRPLFFCl5xxY+1T9RKzOKjCut+28JSX2DnAk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 h1:f9RyWNtS8oH7cZlbn+/JNPpjUk5+5fLd5lM9M0i49Ys= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5/go.mod h1:h5CoMZV2VF297/VLhRhO1WF+XYWOzXo+4HsObA4HjBQ= github.com/aws/aws-sdk-go-v2/service/kms v1.30.0 h1:yS0JkEdV6h9JOo8sy2JSpjX+i7vsKifU8SIeHrqiDhU= github.com/aws/aws-sdk-go-v2/service/kms v1.30.0/go.mod h1:+I8VUUSVD4p5ISQtzpgSva4I8cJ4SQ4b1dcBcof7O+g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.51.4 h1:lW5xUzOPGAMY7HPuNF4FdyBwRc3UJ/e8KsapbesVeNU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.51.4/go.mod h1:MGTaf3x/+z7ZGugCGvepnx2DS6+caCYYqKhzVoLNYPk= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.3 h1:mnbuWHOcM70/OFUlZZ5rcdfA8PflGXXiefU/O+1S3+8= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.3/go.mod h1:5HFu51Elk+4oRBZVxmHrSds5jFXmFj8C3w7DVF2gnrs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3 h1:uLq0BKatTmDzWa/Nu4WO0M1AaQDaPpwTKAeByEc6WFM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3/go.mod h1:b+qdhjnxj8GSR6t5YfphOffeoQSQ1KmpoVVuBn+PWxs= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.5 h1:J/PpTf/hllOjx8Xu9DMflff3FajfLxqM5+tepvVXmxg= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.5/go.mod h1:0ih0Z83YDH/QeQ6Ori2yGE2XvWYv/Xm+cZc01LC6oK0= +github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 h1:6cnno47Me9bRykw9AEv9zkXE+5or7jz8TsskTTccbgc= +github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1/go.mod h1:qmdkIIAC+GCLASF7R2whgNrJADz0QZPX+Seiw/i4S3o= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 h1:vN8hEbpRnL7+Hopy9dzmRle1xmDc7o8tmY0klsr175w= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.5/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 h1:Jux+gDDyi1Lruk+KHF91tK2KCuY61kzoCpvtvJJBtOE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 h1:cwIxeBttqPN3qkaAjcEcsh8NYr8n2HZPkcKgPAi1phU= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.6/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= -github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= +github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8 h1:SoFYaT9UyGkR0+nogNyD/Lj+bsixB+SNuAS4ABlEs6M= github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8/go.mod h1:2JF49jcDOrLStIXN/j/K1EKRq8a8R2qRnlZA6/o/c7c= github.com/beorn7/perks v0.0.0-20150223135152-b965b613227f/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -207,6 +207,8 @@ github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENU github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= @@ -225,6 +227,8 @@ github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251/go.mod h1:gb github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M= github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -256,34 +260,36 @@ github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups/v3 v3.0.2 h1:f5WFqIVSgo5IZmtTT3qVBo6TzI1ON6sycSBKkymb9L0= github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE= -github.com/containerd/containerd v1.7.13 h1:wPYKIeGMN8vaggSKuV1X0wZulpMz4CrgEsZdaCyB6Is= -github.com/containerd/containerd v1.7.13/go.mod h1:zT3up6yTRfEUa6+GsITYIJNgSVL9NQ4x4h1RPzk0Wu4= +github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= +github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/errdefs v0.1.0 h1:m0wCRBiu1WJT/Fr+iOoQHMQS/eP5myQ8lCv4Dz5ZURM= +github.com/containerd/errdefs v0.1.0/go.mod h1:YgWiiHtLmSeBrvpw+UfPijzbLaB77mEG1WwJTDETIV0= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/stargz-snapshotter/estargz v0.15.1 h1:eXJjw9RbkLFgioVaTG+G/ZW/0kEe2oEKCdS/ZxIyoCU= github.com/containerd/stargz-snapshotter/estargz v0.15.1/go.mod h1:gr2RNwukQ/S9Nv33Lt6UC7xEx58C+LHRdoqbEKjz1Kk= -github.com/containers/image/v5 v5.29.2 h1:b8U0XYWhaQbKucK73IbmSm8WQyKAhKDbAHQc45XlsOw= -github.com/containers/image/v5 v5.29.2/go.mod h1:kQ7qcDsps424ZAz24thD+x7+dJw1vgur3A9tTDsj97E= +github.com/containers/image/v5 v5.30.0 h1:CmHeSwI6W2kTRWnUsxATDFY5TEX4b58gPkaQcEyrLIA= +github.com/containers/image/v5 v5.30.0/go.mod h1:gSD8MVOyqBspc0ynLsuiMR9qmt8UQ4jpVImjmK0uXfk= github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 h1:Qzk5C6cYglewc+UyGf6lc8Mj2UaPTHy/iF2De0/77CA= github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY= github.com/containers/ocicrypt v1.1.9 h1:2Csfba4jse85Raxk5HIyEk8OwZNjRvfkhEGijOjIdEM= github.com/containers/ocicrypt v1.1.9/go.mod h1:dTKx1918d8TDkxXvarscpNVY+lyPakPNFN4jwA9GBys= -github.com/containers/storage v1.51.0 h1:AowbcpiWXzAjHosKz7MKvPEqpyX+ryZA/ZurytRrFNA= -github.com/containers/storage v1.51.0/go.mod h1:ybl8a3j1PPtpyaEi/5A6TOFs+5TrEyObeKJzVtkUlfc= +github.com/containers/storage v1.53.0 h1:VSES3C/u1pxjTJIXvLrSmyP7OBtDky04oGu07UvdTEA= +github.com/containers/storage v1.53.0/go.mod h1:pujcoOSc+upx15Jirdkebhtd8uJiLwbSd/mYT6zDJK8= github.com/coreos/go-oidc/v3 v3.10.0 h1:tDnXHnLyiTVyT/2zLDGj09pFPkhND8Gl8lnTRhoEaJU= github.com/coreos/go-oidc/v3 v3.10.0/go.mod h1:5j11xcw0D3+SGxn6Z/WFADsgcWVMyNAlSQupk0KK3ac= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46 h1:2Dx4IHfC1yHWI12AxQDJM1QbRCDfk6M+blLzlZCXdrc= -github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= +github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f h1:eHnXnuK47UlSTOQexbzxAZfekVz6i+LKRdj1CU5DPaM= +github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= -github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= +github.com/danieljoos/wincred v1.2.1 h1:dl9cBrupW8+r5250DYkYxocLeZ1Y4vB1kxgtjxw8GQs= +github.com/danieljoos/wincred v1.2.1/go.mod h1:uGaFL9fDn3OLTvzCGulzE+SzjEe5NGlh5FdCcyfPwps= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -301,17 +307,17 @@ github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aBfCb7iqHmDEIp6fBvC/hQUddQfg+3qdYjwzaiP9Hnc= github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2/go.mod h1:WHNsWjnIn2V1LYOrME7e8KxSeKunYHsxEm4am0BUtcI= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v24.0.7+incompatible h1:wa/nIwYFW7BVTGa7SWPVyyXU9lgORqUb1xfI36MSkFg= -github.com/docker/cli v24.0.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/cli v25.0.5+incompatible h1:3Llw3kcE1gOScEojA247iDD+p1l9hHeC7H3vf3Zd5fk= +github.com/docker/cli v25.0.5+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.9+incompatible h1:HPGzNmwfLZWdxHqK9/II92pyi1EpYKsAqcl4G0Of9v0= -github.com/docker/docker v24.0.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= -github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= +github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= +github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo= +github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= @@ -342,18 +348,18 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI= github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.7.0 h1:nJqP7uwL84RJInrohHfW0Fx3awjbm8qZeFv0nW9SYGc= -github.com/evanphx/json-patch/v5 v5.7.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fluxcd/cli-utils v0.36.0-flux.3 h1:5CQTOc08UnabfwluIYxIhlhpCCTplWBn/xpjVr560J0= -github.com/fluxcd/cli-utils v0.36.0-flux.3/go.mod h1:9lShvUz7uRPIjYZ6phr5AOuORkRDmaUgf/sZN7SDcpo= -github.com/fluxcd/pkg/ssa v0.36.0 h1:h9FB6SrrdVlxNQtfG+Fb/Roe1e61EPgtmJ5ORlAxwkU= -github.com/fluxcd/pkg/ssa v0.36.0/go.mod h1:FJj4xznwBvRM+9h02lGGC0CGYGucPeXO7P6NEPphbys= +github.com/fluxcd/cli-utils v0.36.0-flux.5 h1:I4joM3LW8w7PixC2SsxKG6E0PizoKhs8r91cQdTYMzw= +github.com/fluxcd/cli-utils v0.36.0-flux.5/go.mod h1:1E7LHgOwAJiAZEEo3+ouZOyl4KafYwfqxz1pwrrrXzo= +github.com/fluxcd/pkg/ssa v0.38.0 h1:Hn7Ow8dJVHzDz1IvTOvudno/CRDY1kgHqKQ42/iJiRg= +github.com/fluxcd/pkg/ssa v0.38.0/go.mod h1:LcTL2SP4MOdKA9z3/g3cNB30v/j/NiNHEPqMJHwHLJI= github.com/foxcpp/go-mockdns v1.0.0 h1:7jBqxd3WDWwi/6WhDvacvH1XsN3rOLXyHM1uhvIx6FI= github.com/foxcpp/go-mockdns v1.0.0/go.mod h1:lgRN6+KxQBawyIghpnl5CezHFGS9VLzvtVlwxvzXTQ4= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= @@ -391,8 +397,8 @@ github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= -github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= @@ -543,6 +549,9 @@ github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -620,8 +629,8 @@ github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVE github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= -github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= +github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -698,8 +707,8 @@ github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mittwald/go-helm-client v0.12.8 h1:i85RsE+9j9onkju/Pp0j5dxD+QdDSUB9TknmAq3MLG4= -github.com/mittwald/go-helm-client v0.12.8/go.mod h1:ukR3Et5zbfBij7bFL1ZnLvPytsbBXCrI2qQYr2yVi9I= +github.com/mittwald/go-helm-client v0.12.9 h1:tfI5ECgrbfAolA9TnlCeA5F2TEIvdsOxVmoSyW80lCI= +github.com/mittwald/go-helm-client v0.12.9/go.mod h1:ukR3Et5zbfBij7bFL1ZnLvPytsbBXCrI2qQYr2yVi9I= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= @@ -745,15 +754,15 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= -github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= +github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8= +github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= -github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= +github.com/onsi/gomega v1.32.0 h1:JRYU78fJ1LPxlckP6Txi/EYqJvjtMrDC04/MM5XRHPk= +github.com/onsi/gomega v1.32.0/go.mod h1:a4x4gW6Pz2yK1MAmvluYme5lvYTn61afQ2ETw/8n4Lg= github.com/open-component-model/cobra v0.0.0-20230329075350-b1fd876abfb9 h1:b2cJvZ8nWAVvCqvPhUaFl26Wht4nM4mqfl2ksY9lVzU= github.com/open-component-model/cobra v0.0.0-20230329075350-b1fd876abfb9/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/open-policy-agent/opa v0.63.0 h1:ztNNste1v8kH0/vJMJNquE45lRvqwrM5mY9Ctr9xIXw= @@ -936,8 +945,8 @@ github.com/tonglil/buflogr v1.1.1 h1:CKAjOHBSMmgbRFxpn/RhQHPj5oANc7ekhlsoUDvcZIg github.com/tonglil/buflogr v1.1.1/go.mod h1:WLLtPRLqcFYWQLbA+ytXy5WrFTYnfA+beg1MpvJCxm4= github.com/transparency-dev/merkle v0.0.2 h1:Q9nBoQcZcgPamMkGn7ghV8XiTZ/kRxn1yCG81+twTK4= github.com/transparency-dev/merkle v0.0.2/go.mod h1:pqSy+OXefQ1EDUVmAJ8MUhHB9TXGuzVAT58PqBoHz1A= -github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= -github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= +github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= @@ -992,12 +1001,18 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0 h1:9M3+rhx7kZCIQQhQRYaZCdNu1V73tm4TvXs2ntl98C4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0/go.mod h1:noq80iT8rrHP1SfybmPiRGc9dc5M8RPmGvtwo7Oo7tc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.starlark.net v0.0.0-20231121155337-90ade8b19d09 h1:hzy3LFnSN8kuQK8h9tHl4ndF6UruMj47OqwqsS+/Ai4= go.starlark.net v0.0.0-20231121155337-90ade8b19d09/go.mod h1:LcLNIzVOMp4oV+uusnpk+VU+SzXaJakUuBjoCSWH5dM= go.step.sm/crypto v0.44.2 h1:t3p3uQ7raP2jp2ha9P6xkQF85TJZh+87xmjSLaib+jk= @@ -1031,8 +1046,8 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc h1:ao2WRsKSzW6KuUY9IWPwWahcHCgR0s52IfwutMfEbdM= -golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -1077,8 +1092,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg= golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= @@ -1180,8 +1195,6 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= -gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/api v0.172.0 h1:/1OcMZGPmW1rX2LCu2CmGUD1KXK1+pfzxotxyRUCCdk= google.golang.org/api v0.172.0/go.mod h1:+fJZq6QXWfa9pXhnIzsjx4yI22d4aI9ZpLb58gvXjis= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -1225,8 +1238,8 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/evanphx/json-patch.v5 v5.7.0 h1:dGKGylPlZ/jus2g1YqhhyzfH0gPy2R8/MYUpW/OslTY= -gopkg.in/evanphx/json-patch.v5 v5.7.0/go.mod h1:/kvTRh1TVm5wuM6OkHxqXtE/1nUZZpihg29RtuIyfvk= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/go-jose/go-jose.v2 v2.6.3 h1:nt80fvSDlhKWQgSWyHyy5CfmlQr+asih51R8PTWNKKs= @@ -1253,42 +1266,42 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -helm.sh/helm/v3 v3.14.3 h1:HmvRJlwyyt9HjgmAuxHbHv3PhMz9ir/XNWHyXfmnOP4= -helm.sh/helm/v3 v3.14.3/go.mod h1:v6myVbyseSBJTzhmeE39UcPLNv6cQK6qss3dvgAySaE= +helm.sh/helm/v3 v3.14.4 h1:6FSpEfqyDalHq3kUr4gOMThhgY55kXUEjdQoyODYnrM= +helm.sh/helm/v3 v3.14.4/go.mod h1:Tje7LL4gprZpuBNTbG34d1Xn5NmRT3OWfBRwpOSer9I= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.29.0 h1:NiCdQMY1QOp1H8lfRyeEf8eOwV6+0xA6XEE44ohDX2A= -k8s.io/api v0.29.0/go.mod h1:sdVmXoz2Bo/cb77Pxi71IPTSErEW32xa4aXwKH7gfBA= -k8s.io/apiextensions-apiserver v0.29.0 h1:0VuspFG7Hj+SxyF/Z/2T0uFbI5gb5LRgEyUVE3Q4lV0= -k8s.io/apiextensions-apiserver v0.29.0/go.mod h1:TKmpy3bTS0mr9pylH0nOt/QzQRrW7/h7yLdRForMZwc= -k8s.io/apimachinery v0.29.0 h1:+ACVktwyicPz0oc6MTMLwa2Pw3ouLAfAon1wPLtG48o= -k8s.io/apimachinery v0.29.0/go.mod h1:eVBxQ/cwiJxH58eK/jd/vAk4mrxmVlnpBH5J2GbMeis= -k8s.io/apiserver v0.29.0 h1:Y1xEMjJkP+BIi0GSEv1BBrf1jLU9UPfAnnGGbbDdp7o= -k8s.io/apiserver v0.29.0/go.mod h1:31n78PsRKPmfpee7/l9NYEv67u6hOL6AfcE761HapDM= -k8s.io/cli-runtime v0.29.0 h1:q2kC3cex4rOBLfPOnMSzV2BIrrQlx97gxHJs21KxKS4= -k8s.io/cli-runtime v0.29.0/go.mod h1:VKudXp3X7wR45L+nER85YUzOQIru28HQpXr0mTdeCrk= -k8s.io/client-go v0.29.0 h1:KmlDtFcrdUzOYrBhXHgKw5ycWzc3ryPX5mQe0SkG3y8= -k8s.io/client-go v0.29.0/go.mod h1:yLkXH4HKMAywcrD82KMSmfYg2DlE8mepPR4JGSo5n38= -k8s.io/component-base v0.29.0 h1:T7rjd5wvLnPBV1vC4zWd/iWRbV8Mdxs+nGaoaFzGw3s= -k8s.io/component-base v0.29.0/go.mod h1:sADonFTQ9Zc9yFLghpDpmNXEdHyQmFIGbiuZbqAXQ1M= +k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= +k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= +k8s.io/apiextensions-apiserver v0.29.3 h1:9HF+EtZaVpFjStakF4yVufnXGPRppWFEQ87qnO91YeI= +k8s.io/apiextensions-apiserver v0.29.3/go.mod h1:po0XiY5scnpJfFizNGo6puNU6Fq6D70UJY2Cb2KwAVc= +k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= +k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= +k8s.io/apiserver v0.29.3 h1:xR7ELlJ/BZSr2n4CnD3lfA4gzFivh0wwfNfz9L0WZcE= +k8s.io/apiserver v0.29.3/go.mod h1:hrvXlwfRulbMbBgmWRQlFru2b/JySDpmzvQwwk4GUOs= +k8s.io/cli-runtime v0.29.3 h1:r68rephmmytoywkw2MyJ+CxjpasJDQY7AGc3XY2iv1k= +k8s.io/cli-runtime v0.29.3/go.mod h1:aqVUsk86/RhaGJwDhHXH0jcdqBrgdF3bZWk4Z9D4mkM= +k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= +k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= +k8s.io/component-base v0.29.3 h1:Oq9/nddUxlnrCuuR2K/jp6aflVvc0uDvxMzAWxnGzAo= +k8s.io/component-base v0.29.3/go.mod h1:Yuj33XXjuOk2BAaHsIGHhCKZQAgYKhqIxIjIr2UXYio= k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20240103195357-a9f8850cb432 h1:+XYBQU3ZKUu60H6fEnkitTTabGoKfIG8zczhZBENu9o= k8s.io/kube-openapi v0.0.0-20240103195357-a9f8850cb432/go.mod h1:Pa1PvrP7ACSkuX6I7KYomY6cmMA0Tx86waBhDUgoKPw= -k8s.io/kubectl v0.29.0 h1:Oqi48gXjikDhrBF67AYuZRTcJV4lg2l42GmvsP7FmYI= -k8s.io/kubectl v0.29.0/go.mod h1:0jMjGWIcMIQzmUaMgAzhSELv5WtHo2a8pq67DtviAJs= -k8s.io/utils v0.0.0-20240102154912-e7106e64919e h1:eQ/4ljkx21sObifjzXwlPKpdGLrCfRziVtos3ofG/sQ= -k8s.io/utils v0.0.0-20240102154912-e7106e64919e/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -oras.land/oras-go v1.2.4 h1:djpBY2/2Cs1PV87GSJlxv4voajVOMZxqqtq9AB8YNvY= -oras.land/oras-go v1.2.4/go.mod h1:DYcGfb3YF1nKjcezfX2SNlDAeQFKSXmf+qrFmrh4324= -sigs.k8s.io/controller-runtime v0.16.3 h1:2TuvuokmfXvDUamSx1SuAOO3eTyye+47mJCigwG62c4= -sigs.k8s.io/controller-runtime v0.16.3/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= +k8s.io/kubectl v0.29.3 h1:RuwyyIU42MAISRIePaa8Q7A3U74Q9P4MoJbDFz9o3us= +k8s.io/kubectl v0.29.3/go.mod h1:yCxfY1dbwgVdEt2zkJ6d5NNLOhhWgTyrqACIoFhpdd4= +k8s.io/utils v0.0.0-20240310230437-4693a0247e57 h1:gbqbevonBh57eILzModw6mrkbwM0gQBEuevE/AaBsHY= +k8s.io/utils v0.0.0-20240310230437-4693a0247e57/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= +oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= +sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kustomize/api v0.16.0 h1:/zAR4FOQDCkgSDmVzV2uiFbuy9bhu3jEzthrHCuvm1g= -sigs.k8s.io/kustomize/api v0.16.0/go.mod h1:MnFZ7IP2YqVyVwMWoRxPtgl/5hpA+eCCrQR/866cm5c= -sigs.k8s.io/kustomize/kyaml v0.16.0 h1:6J33uKSoATlKZH16unr2XOhDI+otoe2sR3M8PDzW3K0= -sigs.k8s.io/kustomize/kyaml v0.16.0/go.mod h1:xOK/7i+vmE14N2FdFyugIshB8eF6ALpy7jI87Q2nRh4= +sigs.k8s.io/kustomize/api v0.17.0 h1:AygX5EzZ+2NDxCWkeHy4IK2oftvl4odZZJmq1rK4HYU= +sigs.k8s.io/kustomize/api v0.17.0/go.mod h1:ffn5491s2EiNrJSmgqcWGzQUVhc/pB0OKNI0HsT/0tA= +sigs.k8s.io/kustomize/kyaml v0.17.0 h1:G2bWs03V9Ur2PinHLzTUJ8Ded+30SzXZKiO92SRDs3c= +sigs.k8s.io/kustomize/kyaml v0.17.0/go.mod h1:6lxkYF1Cv9Ic8g/N7I86cvxNc5iinUo/P2vKsHNmpyE= sigs.k8s.io/release-utils v0.7.7 h1:JKDOvhCk6zW8ipEOkpTGDH/mW3TI+XqtPp16aaQ79FU= sigs.k8s.io/release-utils v0.7.7/go.mod h1:iU7DGVNi3umZJ8q6aHyUFzsDUIaYwNnNKGHo3YE5E3s= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= diff --git a/pkg/toi/drivers/docker/driver.go b/pkg/toi/drivers/docker/driver.go index cef5e1c892..05c756cb5f 100644 --- a/pkg/toi/drivers/docker/driver.go +++ b/pkg/toi/drivers/docker/driver.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( @@ -168,7 +164,7 @@ func pullImage(ctx context.Context, cli command.Cli, image string) error { return fmt.Errorf("unable to parse repository info: %w", err) } - authConfig := command.ResolveAuthConfig(ctx, cli, repoInfo.Index) + authConfig := command.ResolveAuthConfig(cli.ConfigFile(), repoInfo.Index) encodedAuth, err := registrytypes.EncodeAuthConfig(authConfig) if err != nil { @@ -254,7 +250,7 @@ func (d *Driver) Exec(op *install.Operation) (*install.OperationResult, error) { } if d.config[OptionCleanup] == trueAsString { - defer cli.Client().ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{}) + defer cli.Client().ContainerRemove(ctx, resp.ID, container.RemoveOptions{}) } containerUID := getContainerUserID(ii.Config.User) @@ -277,7 +273,7 @@ func (d *Driver) Exec(op *install.Operation) (*install.OperationResult, error) { } tarContent.Close() - attach, err := cli.Client().ContainerAttach(ctx, resp.ID, types.ContainerAttachOptions{ + attach, err := cli.Client().ContainerAttach(ctx, resp.ID, container.AttachOptions{ Stream: true, Stdout: true, Stderr: true, @@ -310,7 +306,7 @@ func (d *Driver) Exec(op *install.Operation) (*install.OperationResult, error) { } }() - if err = cli.Client().ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil { + if err = cli.Client().ContainerStart(ctx, resp.ID, container.StartOptions{}); err != nil { return nil, fmt.Errorf("cannot start container: %w", err) } statusc, errc := cli.Client().ContainerWait(ctx, resp.ID, container.WaitConditionNotRunning) From 6f25eb46491ce56596be1be731f0918dd01e1e6e Mon Sep 17 00:00:00 2001 From: Fabian Burth Date: Mon, 22 Apr 2024 08:27:55 +0200 Subject: [PATCH 29/83] add documentation for wget access (#733) --- pkg/contexts/ocm/accessmethods/wget/cli.go | 75 +++++++++++++++++++ pkg/contexts/ocm/accessmethods/wget/method.go | 4 +- 2 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 pkg/contexts/ocm/accessmethods/wget/cli.go diff --git a/pkg/contexts/ocm/accessmethods/wget/cli.go b/pkg/contexts/ocm/accessmethods/wget/cli.go new file mode 100644 index 0000000000..2ea5cf501c --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/wget/cli.go @@ -0,0 +1,75 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package wget + +import ( + "github.com/open-component-model/ocm/pkg/cobrautils/flagsets" + "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/options" + "github.com/open-component-model/ocm/pkg/mime" +) + +func ConfigHandler() flagsets.ConfigOptionTypeSetHandler { + return flagsets.NewConfigOptionTypeSetHandler( + Type, AddConfig, + options.URLOption, + options.MediatypeOption, + options.HTTPHeaderOption, + options.HTTPVerbOption, + options.HTTPBodyOption, + options.HTTPRedirectOption, + ) +} + +func AddConfig(opts flagsets.ConfigOptions, config flagsets.Config) error { + flagsets.AddFieldByOptionP(opts, options.URLOption, config, "url") + flagsets.AddFieldByOptionP(opts, options.MediatypeOption, config, "mediaType") + flagsets.AddFieldByOptionP(opts, options.HTTPHeaderOption, config, "header") + flagsets.AddFieldByOptionP(opts, options.HTTPVerbOption, config, "verb") + flagsets.AddFieldByOptionP(opts, options.HTTPBodyOption, config, "body") + flagsets.AddFieldByOptionP(opts, options.HTTPRedirectOption, config, "noredirect") + return nil +} + +var usage = ` +This method implements access to resources stored on an http server. +` + +var formatV1 = ` +The url is the url pointing to the http endpoint from which a resource is +downloaded. The mimeType can be used to specify the MIME type of the +resource. + +This blob type specification supports the following fields: +- **url** *string* + +This REQUIRED property describes the url from which the resource is to be +downloaded. + +- **mediaType *string* + +This OPTIONAL property describes the media type of the resource to be +downloaded. If omitted, ocm tries to read the mediaType from the Content-Type header +of the http response. If the mediaType cannot be set from the Content-Type header as well, +ocm tries to deduct the mediaType from the URL. If that is not possible either, the default +media type is defaulted to ` + mime.MIME_OCTET + `. + +- **header** *map[string][]string* + +This OPTIONAL property describes the http headers to be set in the http request to the server. + +- **verb** *string* + +This OPTIONAL property describes the http verb (also known as http request method) for the http +request. If omitted, the http verb is defaulted to GET. + +- **body** *[]byte* + +This OPTIONAL property describes the http body to be included in the request. + +- **noredirect** *bool* + +This OPTIONAL property describes whether http redirects should be disabled. If omitted, +it is defaulted to false (so, per default, redirects are enabled). +` diff --git a/pkg/contexts/ocm/accessmethods/wget/method.go b/pkg/contexts/ocm/accessmethods/wget/method.go index d0d2432ee4..cf51cb5a55 100644 --- a/pkg/contexts/ocm/accessmethods/wget/method.go +++ b/pkg/contexts/ocm/accessmethods/wget/method.go @@ -26,8 +26,8 @@ const ( ) func init() { - accspeccpi.RegisterAccessType(accspeccpi.NewAccessSpecType[*AccessSpec](Type)) - accspeccpi.RegisterAccessType(accspeccpi.NewAccessSpecType[*AccessSpec](TypeV1)) + accspeccpi.RegisterAccessType(accspeccpi.NewAccessSpecType[*AccessSpec](Type, accspeccpi.WithDescription(usage))) + accspeccpi.RegisterAccessType(accspeccpi.NewAccessSpecType[*AccessSpec](TypeV1, accspeccpi.WithFormatSpec(formatV1), accspeccpi.WithConfigHandler(ConfigHandler()))) } func Is(spec accspeccpi.AccessSpec) bool { From 91f974961d08a20701417bf9ad3c58fc7e52a4fc Mon Sep 17 00:00:00 2001 From: Fabian Burth Date: Mon, 22 Apr 2024 10:02:17 +0200 Subject: [PATCH 30/83] Wget doc (#739) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Fixes formatting bugs in wget documentation. Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change. ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- cmds/ocm/commands/ocmcmds/common/inputs/types/wget/type.go | 4 ++-- pkg/contexts/ocm/accessmethods/wget/cli.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/type.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/type.go index faf2f0abc1..da1285707d 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/type.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/type.go @@ -26,7 +26,7 @@ This blob type specification supports the following fields: This REQUIRED property describes the url from which the resource is to be downloaded. -- **mediaType *string* +- **mediaType** *string* This OPTIONAL property describes the media type of the resource to be downloaded. If omitted, ocm tries to read the mediaType from the Content-Type header @@ -47,7 +47,7 @@ This blob type specification supports the following fields: This OPTIONAL property describes the http body to be included in the request. -- **noredirect** *bool* +- **noredirect** *bool* This OPTIONAL property describes whether http redirects should be disabled. If omitted, it is defaulted to false (so, per default, redirects are enabled). diff --git a/pkg/contexts/ocm/accessmethods/wget/cli.go b/pkg/contexts/ocm/accessmethods/wget/cli.go index 2ea5cf501c..77550c0a1e 100644 --- a/pkg/contexts/ocm/accessmethods/wget/cli.go +++ b/pkg/contexts/ocm/accessmethods/wget/cli.go @@ -47,7 +47,7 @@ This blob type specification supports the following fields: This REQUIRED property describes the url from which the resource is to be downloaded. -- **mediaType *string* +- **mediaType** *string* This OPTIONAL property describes the media type of the resource to be downloaded. If omitted, ocm tries to read the mediaType from the Content-Type header @@ -68,7 +68,7 @@ request. If omitted, the http verb is defaulted to GET. This OPTIONAL property describes the http body to be included in the request. -- **noredirect** *bool* +- **noredirect** *bool* This OPTIONAL property describes whether http redirects should be disabled. If omitted, it is defaulted to false (so, per default, redirects are enabled). From 2fbf6fd61aa28d82807b6745bfbabed2c57e5668 Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Mon, 22 Apr 2024 10:39:15 +0200 Subject: [PATCH 31/83] incorporate VERSION file if built without make (#732) --- Dockerfile | 2 +- cmds/ocm/pkg/output/tableoutput.go | 2 +- components/helminstaller/Dockerfile | 2 +- pkg/version/version.go | 9 +++++++++ version.go | 10 ++++++++++ 5 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 version.go diff --git a/Dockerfile b/Dockerfile index 8719b97569..45a407ccf6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ FROM golang:${GO_VERSION}-alpine${ALPINE_VERSION} AS build WORKDIR /src RUN go env -w GOMODCACHE=/root/.cache/go-build -COPY go.mod go.sum ./ +COPY go.mod go.sum *.go VERSION ./ ARG GO_PROXY="https://proxy.golang.org" ENV GOPROXY=${GO_PROXY} diff --git a/cmds/ocm/pkg/output/tableoutput.go b/cmds/ocm/pkg/output/tableoutput.go index 5027043ccb..2fadc8218d 100644 --- a/cmds/ocm/pkg/output/tableoutput.go +++ b/cmds/ocm/pkg/output/tableoutput.go @@ -146,7 +146,7 @@ func (this *TableProcessingOutput) Out() error { // a regular string comparison. func compareColumn(c int, vers ...bool) CompareFunction { if utils.Optional(vers...) { - return _compareColumn(c, semverutils.Compare) + return _compareColumn(c, semverutils.VersionCache{}.Compare) } else { return _compareColumn(c, strings.Compare) } diff --git a/components/helminstaller/Dockerfile b/components/helminstaller/Dockerfile index 7473c4596d..df0112adb5 100644 --- a/components/helminstaller/Dockerfile +++ b/components/helminstaller/Dockerfile @@ -3,7 +3,7 @@ ARG COMMIT EFFECTIVE_VERSION GIT_TREE_STATE ARG TARGETOS TARGETARCH WORKDIR /go/src/github.com/open-component-model/ocm/ -COPY go.* ./ +COPY go.* *.go VERSION ./ COPY pkg pkg COPY cmds cmds COPY hack/generate-docs hack/generate-docs diff --git a/pkg/version/version.go b/pkg/version/version.go index ef3506e228..5a9742f2f1 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -11,6 +11,8 @@ import ( "strings" "github.com/Masterminds/semver/v3" + + "github.com/open-component-model/ocm" ) var ( @@ -20,6 +22,13 @@ var ( buildDate = "1970-01-01T00:00:00Z" ) +func init() { + if gitVersion == "0.0.0-dev" { + // gitVersion = strings.TrimSpace(string(MustAsset("../../VERSION"))) + gitVersion = strings.TrimSpace(ocm.Version) + } +} + type Info struct { Major string `json:"major"` Minor string `json:"minor"` diff --git a/version.go b/version.go new file mode 100644 index 0000000000..c22302ad07 --- /dev/null +++ b/version.go @@ -0,0 +1,10 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package ocm + +import _ "embed" + +//go:embed VERSION +var Version string From bcf3890e379e232039265550c485eaeefe3cda3b Mon Sep 17 00:00:00 2001 From: Gergely Brautigam <182850+Skarlso@users.noreply.github.com> Date: Mon, 22 Apr 2024 13:25:47 +0200 Subject: [PATCH 32/83] fix: remove all personal information from tests (#740) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Fixes https://github.com/open-component-model/ocm-project/issues/43 ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- pkg/env/builder/ocm_version_test.go | 4 ++-- pkg/toi/install/credentials_test.go | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pkg/env/builder/ocm_version_test.go b/pkg/env/builder/ocm_version_test.go index 73e5beceeb..25509b2b88 100644 --- a/pkg/env/builder/ocm_version_test.go +++ b/pkg/env/builder/ocm_version_test.go @@ -21,9 +21,9 @@ import ( const ARCH = "/tmp/ctf" const ARCH2 = "/tmp/ctf2" -const PROVIDER = "mandelsoft" +const PROVIDER = "open-component-model" const VERSION = "v1" -const COMPONENT = "github.com/mandelsoft/test" +const COMPONENT = "github.com/open-component-model/test" const OUT = "/tmp/res" var _ = Describe("Transfer handler", func() { diff --git a/pkg/toi/install/credentials_test.go b/pkg/toi/install/credentials_test.go index 4dc34251e0..6b4c33432e 100644 --- a/pkg/toi/install/credentials_test.go +++ b/pkg/toi/install/credentials_test.go @@ -21,14 +21,14 @@ import ( ) var _ = Describe("credential mapping", func() { - consumerid := credentials.NewConsumerIdentity("CT", identity.ID_HOSTNAME, "github.com", identity.ID_PATHPREFIX, "mandelsoft") + consumerid := credentials.NewConsumerIdentity("CT", identity.ID_HOSTNAME, "github.com", identity.ID_PATHPREFIX, "open-component-model") ccreds := common.Properties{ - "user": "mandelsoft", + "user": "open-component-model", "pass": "mypass", } memspec := memory.NewRepositorySpec("default") memcred := credentials.DirectCredentials{ - "username": "mandelsoft", + "username": "open-component-model", "password": "secret", } cfgdata := ` @@ -36,7 +36,7 @@ configurations: - credentials: - credentials: password: secret - username: mandelsoft + username: open-component-model credentialsName: other - credentials: token: XXX @@ -55,11 +55,11 @@ configurations: - credentialsName: Credentials properties: pass: mypass - user: mandelsoft + user: open-component-model type: Credentials identity: hostname: github.com - pathprefix: mandelsoft/testrepo + pathprefix: open-component-model/testrepo type: CT type: credentials.config.ocm.software type: generic.config.ocm.software @@ -99,7 +99,7 @@ forwardedConsumers: - consumerId: type: CT hostname: github.com - pathprefix: mandelsoft/testrepo + pathprefix: open-component-model/testrepo consumerType: hostpath ` spec, err := install.ParseCredentialSpecification([]byte(input), "settings") @@ -126,7 +126,7 @@ forwardedConsumers: Expect(mem.LookupCredentials("other")).To(Equal(memcred)) creq := consumerid.Copy() - creq[identity.ID_PATHPREFIX] = "mandelsoft/testrepo/bla" + creq[identity.ID_PATHPREFIX] = "open-component-model/testrepo/bla" props := Must(credentials.CredentialsForConsumer(ctx, creq, hostpath.Matcher)) Expect(props.Properties()).To(Equal(ccreds)) }) From 0da176504ec64a42b6530be7457eeb6f6fa94081 Mon Sep 17 00:00:00 2001 From: Gergely Brautigam <182850+Skarlso@users.noreply.github.com> Date: Tue, 23 Apr 2024 08:49:05 +0200 Subject: [PATCH 33/83] fix: do not create a new resource manager client (#742) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Fixes https://github.com/open-component-model/ocm-project/issues/178 ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- .../commands/controllercmds/install/cmd.go | 19 +++++++++++-------- .../install/install_cert_manager.go | 13 ++----------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/cmds/ocm/commands/controllercmds/install/cmd.go b/cmds/ocm/commands/controllercmds/install/cmd.go index e17d8379fb..f79063131b 100644 --- a/cmds/ocm/commands/controllercmds/install/cmd.go +++ b/cmds/ocm/commands/controllercmds/install/cmd.go @@ -50,6 +50,7 @@ type Command struct { DryRun bool SkipPreFlightCheck bool InstallPrerequisites bool + SM *ssa.ResourceManager } var _ utils.OCMCommand = (*Command)(nil) @@ -86,6 +87,14 @@ func (o *Command) Complete(args []string) error { } func (o *Command) Run() error { + kubeconfigArgs := genericclioptions.NewConfigFlags(false) + sm, err := NewResourceManager(kubeconfigArgs) + if err != nil { + return fmt.Errorf("βœ— failed to create resource manager: %w", err) + } + + o.SM = sm + ctx := context.Background() if !o.SkipPreFlightCheck { out.Outf(o.Context, "β–Ί running pre-install check\n") @@ -163,23 +172,17 @@ func (o *Command) installManifest(ctx context.Context, releaseURL, baseURL, mani } out.Outf(o.Context, "β–Ί applying to cluster...\n") - kubeconfigArgs := genericclioptions.NewConfigFlags(false) - sm, err := NewResourceManager(kubeconfigArgs) - if err != nil { - return fmt.Errorf("βœ— failed to create resource manager: %w", err) - } - objects, err := readObjects(path) if err != nil { return fmt.Errorf("βœ— failed to construct objects to apply: %w", err) } - if _, err := sm.ApplyAllStaged(context.Background(), objects, ssa.DefaultApplyOptions()); err != nil { + if _, err := o.SM.ApplyAllStaged(context.Background(), objects, ssa.DefaultApplyOptions()); err != nil { return fmt.Errorf("βœ— failed to apply manifests: %w", err) } out.Outf(o.Context, "β–Ί waiting for ocm deployment to be ready\n") - if err = sm.Wait(objects, ssa.DefaultWaitOptions()); err != nil { + if err = o.SM.Wait(objects, ssa.DefaultWaitOptions()); err != nil { return fmt.Errorf("βœ— failed to wait for objects to be ready: %w", err) } diff --git a/cmds/ocm/commands/controllercmds/install/install_cert_manager.go b/cmds/ocm/commands/controllercmds/install/install_cert_manager.go index 8dcde14dd5..e24766d770 100644 --- a/cmds/ocm/commands/controllercmds/install/install_cert_manager.go +++ b/cmds/ocm/commands/controllercmds/install/install_cert_manager.go @@ -2,15 +2,12 @@ package install import ( "context" + _ "embed" "fmt" "os" - _ "embed" - "github.com/fluxcd/pkg/ssa" "github.com/mandelsoft/filepath/pkg/filepath" - "k8s.io/cli-runtime/pkg/genericclioptions" - "github.com/open-component-model/ocm/pkg/out" ) @@ -54,18 +51,12 @@ func (o *Command) createRegistryCertificate() error { return fmt.Errorf("failed to write issuer.yaml file at location: %w", err) } - kubeconfigArgs := genericclioptions.NewConfigFlags(false) - sm, err := NewResourceManager(kubeconfigArgs) - if err != nil { - return fmt.Errorf("failed to create resource manager: %w", err) - } - objects, err := readObjects(path) if err != nil { return fmt.Errorf("failed to construct objects to apply: %w", err) } - if _, err := sm.ApplyAllStaged(context.Background(), objects, ssa.DefaultApplyOptions()); err != nil { + if _, err := o.SM.ApplyAllStaged(context.Background(), objects, ssa.DefaultApplyOptions()); err != nil { return fmt.Errorf("failed to apply manifests: %w", err) } From 5ffd6d1a144fb617c4773bf4908fa3337afd0d87 Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Tue, 23 Apr 2024 14:17:03 +0200 Subject: [PATCH 34/83] Rework object finalization (#703) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- pkg/contexts/clictx/internal/context.go | 99 ++++++++---- pkg/contexts/config/config/context_test.go | 46 +++++- pkg/contexts/config/config/dummy_test.go | 11 ++ pkg/contexts/config/context_test.go | 2 + pkg/contexts/config/cpi/interface.go | 4 + pkg/contexts/config/internal/context.go | 31 +++- pkg/contexts/config/internal/updater.go | 35 +++- .../credentials/internal/builder_test.go | 6 +- pkg/contexts/credentials/internal/context.go | 33 +++- .../repositories/dockerconfig/repo_test.go | 2 + .../repositories/dockerconfig/repository.go | 3 +- .../datacontext/attrs/rootcertsattr/config.go | 2 +- .../datacontext/context-refcount-model.png | Bin 0 -> 259864 bytes pkg/contexts/datacontext/context.go | 61 ++++--- pkg/contexts/datacontext/context_test.go | 27 ++++ pkg/contexts/datacontext/cpi.go | 152 +++++++++++++++--- pkg/contexts/datacontext/gc_test.go | 58 ++++++- pkg/contexts/oci/internal/builder_test.go | 2 +- pkg/contexts/oci/internal/context.go | 35 ++-- pkg/contexts/ocm/attrs/signingattr/config.go | 5 +- .../handlers/generic/ocirepo/blobhandler.go | 1 + pkg/contexts/ocm/internal/builder_test.go | 8 +- pkg/contexts/ocm/internal/context.go | 35 ++-- pkg/contexts/ocm/internal/resolver.go | 27 +++- .../ocm/repositories/comparch/repository.go | 4 +- .../repositories/composition/repository.go | 8 +- .../repositories/genericocireg/repository.go | 4 +- .../ocm/repositories/virtual/repository.go | 5 +- pkg/finalizer/object.go | 2 +- pkg/refmgmt/finalized/doc.go | 33 ++++ pkg/refmgmt/finalized/finalized_test.go | 146 +++++++++++++++++ pkg/refmgmt/finalized/finalizedref.go | 48 ++++++ pkg/refmgmt/finalized/suite_test.go | 17 ++ 33 files changed, 795 insertions(+), 157 deletions(-) create mode 100755 pkg/contexts/datacontext/context-refcount-model.png create mode 100644 pkg/contexts/datacontext/context_test.go create mode 100644 pkg/refmgmt/finalized/doc.go create mode 100644 pkg/refmgmt/finalized/finalized_test.go create mode 100644 pkg/refmgmt/finalized/finalizedref.go create mode 100644 pkg/refmgmt/finalized/suite_test.go diff --git a/pkg/contexts/clictx/internal/context.go b/pkg/contexts/clictx/internal/context.go index ef30d76158..d6a3cfa70c 100644 --- a/pkg/contexts/clictx/internal/context.go +++ b/pkg/contexts/clictx/internal/context.go @@ -24,6 +24,7 @@ import ( ctfocm "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" + "github.com/open-component-model/ocm/pkg/utils" ) const CONTEXT_TYPE = "ocm.cmd" + datacontext.OCM_CONTEXT_SUFFIX @@ -47,15 +48,18 @@ func (f *FileSystem) ApplyOption(options accessio.Options) error { return nil } +type ContextProvider interface { + CLIContext() Context +} + type Context interface { datacontext.Context - - AttributesContext() datacontext.AttributesContext - - ConfigContext() config.Context - CredentialsContext() credentials.Context - OCIContext() oci.Context - OCMContext() ocm.Context + ContextProvider + datacontext.ContextProvider + config.ContextProvider + credentials.ContextProvider + oci.ContextProvider + ocm.ContextProvider FileSystem() *FileSystem @@ -91,13 +95,14 @@ func DefinedForContext(ctx context.Context) (Context, bool) { //////////////////////////////////////////////////////////////////////////////// +type _InternalContext = datacontext.InternalContext + type _context struct { - datacontext.Context + _InternalContext updater cfgcpi.Updater sharedAttributes datacontext.AttributesContext - config config.Context credentials credentials.Context oci *_oci ocm *_ocm @@ -105,7 +110,29 @@ type _context struct { out out.Context } -var _ Context = &_context{} +var ( + _ Context = (*_context)(nil) + _ datacontext.ViewCreator[Context] = (*_context)(nil) +) + +// gcWrapper is used as garbage collectable +// wrapper for a context implementation +// to establish a runtime finalizer. +type gcWrapper struct { + datacontext.GCWrapper + *_context +} + +func newView(c *_context, ref ...bool) Context { + if utils.Optional(ref...) { + return datacontext.FinalizedContext[gcWrapper](c) + } + return c +} + +func (w *gcWrapper) SetContext(c *_context) { + w._context = c +} func newContext(shared datacontext.AttributesContext, ocmctx ocm.Context, outctx out.Context, fs vfs.FileSystem, delegates datacontext.Delegates) Context { if outctx == nil { @@ -115,19 +142,27 @@ func newContext(shared datacontext.AttributesContext, ocmctx ocm.Context, outctx shared = ocmctx.AttributesContext() } c := &_context{ - sharedAttributes: shared, - credentials: ocmctx.CredentialsContext(), - config: ocmctx.CredentialsContext().ConfigContext(), + sharedAttributes: datacontext.PersistentContextRef(shared), + credentials: datacontext.PersistentContextRef(ocmctx.CredentialsContext()), out: outctx, } - c.Context = datacontext.NewContextBase(c, CONTEXT_TYPE, key, ocmctx.GetAttributes(), delegates) - c.updater = cfgcpi.NewUpdater(ocmctx.CredentialsContext().ConfigContext(), c) + c._InternalContext = datacontext.NewContextBase(c, CONTEXT_TYPE, key, ocmctx.GetAttributes(), delegates) + c.updater = cfgcpi.NewUpdater(datacontext.PersistentContextRef(ocmctx.CredentialsContext().ConfigContext()), c) + ocmctx = datacontext.PersistentContextRef(ocmctx) c.oci = newOCI(c, ocmctx) c.ocm = newOCM(c, ocmctx) if fs != nil { vfsattr.Set(c.AttributesContext(), fs) } - return c + return newView(c, true) +} + +func (c *_context) CreateView() Context { + return newView(c, true) +} + +func (c *_context) CLIContext() Context { + return newView(c) } func (c *_context) Update() error { @@ -139,7 +174,7 @@ func (c *_context) AttributesContext() datacontext.AttributesContext { } func (c *_context) ConfigContext() config.Context { - return c.config + return c.updater.GetContext() } func (c *_context) CredentialsContext() credentials.Context { @@ -155,7 +190,7 @@ func (c *_context) OCMContext() ocm.Context { } func (c *_context) FileSystem() *FileSystem { - return &FileSystem{vfsattr.Get(c)} + return &FileSystem{vfsattr.Get(c.CLIContext())} } func (c *_context) OCI() OCI { @@ -185,7 +220,7 @@ func (c *_context) StdIn() io.Reader { func (c *_context) WithStdIO(r io.Reader, o io.Writer, e io.Writer) Context { return &_view{ - Context: c, + Context: c.CLIContext(), out: out.NewFor(out.WithStdIO(c.out, r, o, e)), } } @@ -211,7 +246,7 @@ func (c *_view) StdIn() io.Reader { func (c *_view) WithStdIO(r io.Reader, o io.Writer, e io.Writer) Context { return &_view{ - Context: c.Context, + Context: c.CLIContext(), out: out.NewFor(out.WithStdIO(c.out, r, o, e)), } } @@ -222,16 +257,16 @@ func (c *_view) WithStdIO(r io.Reader, o io.Writer, e io.Writer) Context { // _ocm uses ocm and ctfocm type _oci struct { - *_context + cli *_context ctx oci.Context repos map[string]oci.RepositorySpec } func newOCI(ctx *_context, ocmctx ocm.Context) *_oci { return &_oci{ - _context: ctx, - ctx: ocmctx.OCIContext(), - repos: map[string]oci.RepositorySpec{}, + cli: ctx, + ctx: ocmctx.OCIContext(), + repos: map[string]oci.RepositorySpec{}, } } @@ -240,29 +275,29 @@ func (c *_oci) Context() oci.Context { } func (c *_oci) OpenCTF(path string) (oci.Repository, error) { - ok, err := vfs.Exists(c.FileSystem(), path) + ok, err := vfs.Exists(c.cli.FileSystem(), path) if err != nil { return nil, err } if !ok { return nil, errors.ErrNotFound("file", path) } - return ctfoci.Open(c.ctx, accessobj.ACC_WRITABLE, path, 0, accessio.PathFileSystem(c.FileSystem())) + return ctfoci.Open(c.ctx, accessobj.ACC_WRITABLE, path, 0, accessio.PathFileSystem(c.cli.FileSystem())) } //////////////////////////////////////////////////////////////////////////////// type _ocm struct { - *_context + cli *_context ctx ocm.Context repos map[string]ocm.RepositorySpec } func newOCM(ctx *_context, ocmctx ocm.Context) *_ocm { return &_ocm{ - _context: ctx, - ctx: ocmctx, - repos: map[string]ocm.RepositorySpec{}, + cli: ctx, + ctx: ocmctx, + repos: map[string]ocm.RepositorySpec{}, } } @@ -271,12 +306,12 @@ func (c *_ocm) Context() ocm.Context { } func (c *_ocm) OpenCTF(path string) (ocm.Repository, error) { - ok, err := vfs.Exists(c.FileSystem(), path) + ok, err := vfs.Exists(c.cli.FileSystem(), path) if err != nil { return nil, err } if !ok { return nil, errors.ErrNotFound("file", path) } - return ctfocm.Open(c.ctx, accessobj.ACC_WRITABLE, path, 0, c) + return ctfocm.Open(c.ctx, accessobj.ACC_WRITABLE, path, 0, c.cli.FileSystem()) } diff --git a/pkg/contexts/config/config/context_test.go b/pkg/contexts/config/config/context_test.go index 161f87edaf..7fffc81209 100644 --- a/pkg/contexts/config/config/context_test.go +++ b/pkg/contexts/config/config/context_test.go @@ -7,17 +7,27 @@ package config_test import ( "os" "reflect" + "runtime" + "time" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" + "github.com/open-component-model/ocm/pkg/generics" "sigs.k8s.io/yaml" "github.com/open-component-model/ocm/pkg/contexts/config" local "github.com/open-component-model/ocm/pkg/contexts/config/config" - "github.com/open-component-model/ocm/pkg/testutils" + . "github.com/open-component-model/ocm/pkg/testutils" ) +func CheckRefs(ctx config.Context, n int) { + runtime.GC() + time.Sleep(time.Second) + Expect(datacontext.GetContextRefCount(ctx)).To(Equal(n)) // all temp refs have been finalized +} + var _ = Describe("generic config handling", func() { var scheme config.ConfigTypeScheme @@ -41,6 +51,8 @@ var _ = Describe("generic config handling", func() { Expect(err).To(Succeed()) Expect(config.IsGeneric(result)).To(BeFalse()) Expect(reflect.TypeOf(result).String()).To(Equal("*config.Config")) + + CheckRefs(cfgctx, 1) }) It("it applies to existing context", func() { @@ -57,6 +69,8 @@ var _ = Describe("generic config handling", func() { Expect(len(cfgs)).To(Equal(3)) Expect(d.getApplied()).To(Equal([]*Config{NewConfig("alice", ""), NewConfig("", "bob")})) + + CheckRefs(cfgctx, 1) }) It("it applies nested to existing context", func() { @@ -73,6 +87,8 @@ var _ = Describe("generic config handling", func() { Expect(len(cfgs)).To(Equal(4)) Expect(d.getApplied()).To(Equal([]*Config{NewConfig("alice", ""), NewConfig("", "bob")})) + + CheckRefs(cfgctx, 1) }) It("it applies unknown type to existing context", func() { @@ -82,7 +98,7 @@ var _ = Describe("generic config handling", func() { err = cfgctx.ApplyConfig(cfg, "testconfig") Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(testutils.StringEqualWithContext("testconfig: config apply errors: {config entry 0--testconfig: config type \"Dummy\" is unknown, config entry 1--testconfig: config type \"Dummy\" is unknown}")) + Expect(err.Error()).To(StringEqualWithContext("testconfig: config apply errors: {config entry 0--testconfig: config type \"Dummy\" is unknown, config entry 1--testconfig: config type \"Dummy\" is unknown}")) gen, cfgs := cfgctx.GetConfig(config.AllGenerations, nil) Expect(gen).To(Equal(int64(3))) Expect(len(cfgs)).To(Equal(3)) @@ -90,6 +106,8 @@ var _ = Describe("generic config handling", func() { RegisterAt(scheme) d := newDummy(cfgctx) Expect(d.getApplied()).To(Equal([]*Config{NewConfig("alice", ""), NewConfig("", "bob")})) + + CheckRefs(cfgctx, 1) }) It("it applies composed config to existing context", func() { @@ -110,6 +128,8 @@ var _ = Describe("generic config handling", func() { Expect(len(cfgs)).To(Equal(3)) Expect(d.getApplied()).To(Equal([]*Config{NewConfig("alice", ""), NewConfig("", "bob")})) + + CheckRefs(cfgctx, 1) }) It("it applies composed config set to existing context", func() { @@ -138,5 +158,27 @@ var _ = Describe("generic config handling", func() { Expect(gen).To(Equal(int64(3))) Expect(len(cfgs)).To(Equal(3)) Expect(d.getApplied()).To(Equal([]*Config{NewConfig("", "bob"), NewConfig("alice", "")})) + + CheckRefs(cfgctx, 1) + }) + + It("it applies compig to storing target", func() { + RegisterAt(scheme) + d := newDummy(cfgctx) + + cfg := NewConfig("alice", "") + + err := cfgctx.ApplyConfig(cfg, "testconfig") + Expect(err).To(Succeed()) + + Expect(d.getApplied()).To(Equal([]*Config{NewConfig("alice", "")})) + + target := dummyTarget{} + MustBeSuccessful(cfgctx.ApplyTo(0, &target)) + Expect(target.used).NotTo(BeNil()) + Expect(target.used.GetId()).To(Equal(cfgctx.GetId())) + + CheckRefs(cfgctx, generics.Conditional(datacontext.MULTI_REF, 2, 1)) // config context stored in target with separate ref + target.used.GetId() }) }) diff --git a/pkg/contexts/config/config/dummy_test.go b/pkg/contexts/config/config/dummy_test.go index 26d30fd226..117056a0e6 100644 --- a/pkg/contexts/config/config/dummy_test.go +++ b/pkg/contexts/config/config/dummy_test.go @@ -50,11 +50,22 @@ func (a *Config) ApplyTo(ctx config.Context, target interface{}) error { d.applied = append(d.applied, a) return nil } + c, ok := target.(*dummyTarget) + if ok { + c.used = ctx + return nil + } return cpi.ErrNoContext(DummyType) } //////////////////////////////////////////////////////////////////////////////// +type dummyTarget struct { + used config.Context +} + +//////////////////////////////////////////////////////////////////////////////// + func newDummy(ctx config.Context) *dummyContext { d := &dummyContext{ config: ctx, diff --git a/pkg/contexts/config/context_test.go b/pkg/contexts/config/context_test.go index 4292864c48..b1ee3fcb2a 100644 --- a/pkg/contexts/config/context_test.go +++ b/pkg/contexts/config/context_test.go @@ -10,6 +10,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/config" "github.com/open-component-model/ocm/pkg/errors" @@ -23,6 +24,7 @@ var _ = Describe("config handling", func() { BeforeEach(func() { scheme = config.NewConfigTypeScheme() cfgctx = config.WithConfigTypeScheme(scheme).New() + Expect(cfgctx.AttributesContext().GetId()).NotTo(BeIdenticalTo(datacontext.DefaultContext.GetId())) }) It("can deserialize unknown", func() { diff --git a/pkg/contexts/config/cpi/interface.go b/pkg/contexts/config/cpi/interface.go index f5351a649d..d2ce4d6db2 100644 --- a/pkg/contexts/config/cpi/interface.go +++ b/pkg/contexts/config/cpi/interface.go @@ -62,6 +62,10 @@ func NewUpdater(ctx Context, target interface{}) Updater { return internal.NewUpdater(ctx, target) } +func NewUpdaterForFactory[T any](ctx Context, f func() T) Updater { + return internal.NewUpdaterForFactory(ctx, f) +} + //////////////////////////////////////////////////////////////////////////////// func ErrNoContext(name string) error { diff --git a/pkg/contexts/config/internal/context.go b/pkg/contexts/config/internal/context.go index a4bc566445..ea23e652ac 100644 --- a/pkg/contexts/config/internal/context.go +++ b/pkg/contexts/config/internal/context.go @@ -12,6 +12,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" + "github.com/open-component-model/ocm/pkg/utils" ) // OCM_CONFIG_TYPE_SUFFIX is the standard suffix used for configuration @@ -130,7 +131,10 @@ type _context struct { description string } -var _ Context = &_context{} +var ( + _ Context = (*_context)(nil) + _ datacontext.ViewCreator[Context] = (*_context)(nil) +) // gcWrapper is used as garbage collectable // wrapper for a context implementation @@ -140,6 +144,13 @@ type gcWrapper struct { *_context } +func newView(c *_context, ref ...bool) Context { + if utils.Optional(ref...) { + return datacontext.FinalizedContext[gcWrapper](c) + } + return c +} + func (w *gcWrapper) SetContext(c *_context) { w._context = c } @@ -153,14 +164,18 @@ func newContext(shared datacontext.AttributesContext, reposcheme ConfigTypeSchem }, } c._InternalContext = datacontext.NewContextBase(c, CONTEXT_TYPE, key, shared.GetAttributes(), delegates) - c.updater = NewUpdater(c, c) - datacontext.AssureUpdater(shared, NewUpdater(c, shared)) + c.updater = NewUpdaterForFactory(c, c.ConfigContext) // provide target as new view to internal context + datacontext.AssureUpdater(shared, NewUpdater(c, datacontext.PersistentContextRef(shared))) - return datacontext.FinalizedContext[gcWrapper](c) + return newView(c, true) +} + +func (c *_context) CreateView() Context { + return newView(c, true) } func (c *_context) ConfigContext() Context { - return c + return newView(c) } func (c *_context) Update() error { @@ -177,7 +192,7 @@ func (c *_context) WithInfo(desc string) Context { if c.description != "" { desc = desc + "--" + c.description } - return &_context{c.coreContext, desc} + return newView(&_context{c.coreContext, desc}) } func (c *_context) AttributesContext() datacontext.AttributesContext { @@ -203,7 +218,9 @@ func (c *_context) GetConfigForData(data []byte, unmarshaler runtime.Unmarshaler func (c *_context) ApplyConfig(spec Config, desc string) error { var unknown error - spec = (&AppliedConfig{config: spec}).eval(c) + + // use temporary view for outbound calls + spec = (&AppliedConfig{config: spec}).eval(newView(c)) if IsGeneric(spec) { unknown = errors.ErrUnknown(KIND_CONFIGTYPE, spec.GetType()) } diff --git a/pkg/contexts/config/internal/updater.go b/pkg/contexts/config/internal/updater.go index ce76a0024e..170710ca5a 100644 --- a/pkg/contexts/config/internal/updater.go +++ b/pkg/contexts/config/internal/updater.go @@ -26,29 +26,52 @@ type Updater interface { RUnlock() } +// updater implements the Updater interface. +// It must be prepared to work with an internal config context +// representation. Therefore, it must pass a self reference +// of the context to outbound calls. type updater struct { sync.RWMutex ctx Context - target interface{} + targetFunc func() interface{} lastGeneration int64 inupdate bool } +// TargetFunction can be used to map any type specific factory function +// to a target function returning a formal interface{} type. +func TargetFunction[T any](f func() T) func() interface{} { + return func() interface{} { return f() } +} + // NewUpdater create a configuration updater for a configuration target // based on a dedicated configuration context. func NewUpdater(ctx Context, target interface{}) Updater { + var targetFunc func() interface{} + if f, ok := target.(func() interface{}); ok { + targetFunc = f + } else { + targetFunc = func() interface{} { return target } + } + return &updater{ + ctx: ctx, + targetFunc: targetFunc, + } +} + +func NewUpdaterForFactory[T any](ctx Context, t func() T) Updater { return &updater{ - ctx: ctx, - target: target, + ctx: ctx, + targetFunc: TargetFunction(t), } } func (u *updater) GetContext() Context { - return u.ctx + return u.ctx.ConfigContext() } func (u *updater) GetTarget() interface{} { - return u.target + return u.targetFunc() } func (u *updater) State() (int64, bool) { @@ -66,7 +89,7 @@ func (u *updater) Update() error { u.inupdate = true u.Unlock() - gen, err := u.ctx.ApplyTo(u.lastGeneration, u.target) + gen, err := u.ctx.ApplyTo(u.lastGeneration, u.GetTarget()) u.Lock() defer u.Unlock() diff --git a/pkg/contexts/credentials/internal/builder_test.go b/pkg/contexts/credentials/internal/builder_test.go index f748bdebe7..b128be5a93 100644 --- a/pkg/contexts/credentials/internal/builder_test.go +++ b/pkg/contexts/credentials/internal/builder_test.go @@ -21,7 +21,7 @@ var _ = Describe("builder test", func() { Expect(ctx).NotTo(BeIdenticalTo(local.DefaultContext)) Expect(ctx.RepositoryTypes()).To(BeIdenticalTo(local.DefaultRepositoryTypeScheme)) - Expect(ctx.ConfigContext()).To(BeIdenticalTo(config.DefaultContext())) + Expect(ctx.ConfigContext().GetId()).To(BeIdenticalTo(config.DefaultContext().GetId())) }) It("creates defaulted", func() { @@ -31,7 +31,7 @@ var _ = Describe("builder test", func() { Expect(ctx).NotTo(BeIdenticalTo(local.DefaultContext)) Expect(ctx.RepositoryTypes()).To(BeIdenticalTo(local.DefaultRepositoryTypeScheme)) - Expect(ctx.ConfigContext()).NotTo(BeIdenticalTo(config.DefaultContext())) + Expect(ctx.ConfigContext().GetId()).NotTo(BeIdenticalTo(config.DefaultContext().GetType())) Expect(ctx.ConfigContext().ConfigTypes()).To(BeIdenticalTo(config.DefaultContext().ConfigTypes())) }) @@ -43,7 +43,7 @@ var _ = Describe("builder test", func() { Expect(ctx.RepositoryTypes()).NotTo(BeIdenticalTo(local.DefaultRepositoryTypeScheme)) Expect(ctx.RepositoryTypes().KnownTypeNames()).To(Equal(local.DefaultRepositoryTypeScheme.KnownTypeNames())) - Expect(ctx.ConfigContext()).NotTo(BeIdenticalTo(config.DefaultContext())) + Expect(ctx.ConfigContext().GetId()).NotTo(BeIdenticalTo(config.DefaultContext().GetId())) Expect(ctx.ConfigContext().ConfigTypes()).NotTo(BeIdenticalTo(config.DefaultContext().ConfigTypes())) Expect(ctx.ConfigContext().ConfigTypes().KnownTypeNames()).To(Equal(config.DefaultContext().ConfigTypes().KnownTypeNames())) }) diff --git a/pkg/contexts/credentials/internal/context.go b/pkg/contexts/credentials/internal/context.go index e6d3e952c0..a2d1074437 100644 --- a/pkg/contexts/credentials/internal/context.go +++ b/pkg/contexts/credentials/internal/context.go @@ -14,6 +14,7 @@ import ( "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/runtime" + "github.com/open-component-model/ocm/pkg/utils" ) // CONTEXT_TYPE is the global type for a credential context. @@ -102,7 +103,10 @@ type _context struct { consumerProviders *consumerProviderRegistry } -var _ Context = &_context{} +var ( + _ Context = (*_context)(nil) + _ datacontext.ViewCreator[Context] = (*_context)(nil) +) // gcWrapper is used as garbage collectable // wrapper for a context implementation @@ -112,24 +116,35 @@ type gcWrapper struct { *_context } +func newView(c *_context, ref ...bool) Context { + if utils.Optional(ref...) { + return datacontext.FinalizedContext[gcWrapper](c) + } + return c +} + func (w *gcWrapper) SetContext(c *_context) { w._context = c } func newContext(configctx config.Context, reposcheme RepositoryTypeScheme, consumerMatchers IdentityMatcherRegistry, delegates datacontext.Delegates) Context { c := &_context{ - sharedattributes: configctx.AttributesContext(), + sharedattributes: datacontext.PersistentContextRef(configctx.AttributesContext()), knownRepositoryTypes: reposcheme, consumerIdentityMatchers: consumerMatchers, consumerProviders: newConsumerProviderRegistry(), } c._InternalContext = datacontext.NewContextBase(c, CONTEXT_TYPE, key, configctx.GetAttributes(), delegates) - c.updater = cfgcpi.NewUpdater(configctx, c) - return datacontext.FinalizedContext[gcWrapper](c) + c.updater = cfgcpi.NewUpdaterForFactory(datacontext.PersistentContextRef(configctx), c.CredentialsContext) + return newView(c, true) +} + +func (c *_context) CreateView() Context { + return newView(c, true) } func (c *_context) CredentialsContext() Context { - return c + return newView(c) } func (c *_context) Update() error { @@ -157,12 +172,13 @@ func (c *_context) RepositorySpecForConfig(data []byte, unmarshaler runtime.Unma } func (c *_context) RepositoryForSpec(spec RepositorySpec, creds ...CredentialsSource) (Repository, error) { - cred, err := CredentialsChain(creds).Credentials(c) + out := newView(c) + cred, err := CredentialsChain(creds).Credentials(out) if err != nil { return nil, err } c.Update() - return spec.Repository(c, cred) + return spec.Repository(out, cred) } func (c *_context) RepositoryForConfig(data []byte, unmarshaler runtime.Unmarshaler, creds ...CredentialsSource) (Repository, error) { @@ -174,7 +190,8 @@ func (c *_context) RepositoryForConfig(data []byte, unmarshaler runtime.Unmarsha } func (c *_context) CredentialsForSpec(spec CredentialsSpec, creds ...CredentialsSource) (Credentials, error) { - repospec := spec.GetRepositorySpec(c) + out := newView(c) + repospec := spec.GetRepositorySpec(out) repo, err := c.RepositoryForSpec(repospec, creds...) if err != nil { return nil, err diff --git a/pkg/contexts/credentials/repositories/dockerconfig/repo_test.go b/pkg/contexts/credentials/repositories/dockerconfig/repo_test.go index d4cd772560..7a42e69f0d 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/repo_test.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/repo_test.go @@ -13,6 +13,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" . "github.com/open-component-model/ocm/pkg/testutils" "github.com/open-component-model/ocm/pkg/common" @@ -165,6 +166,7 @@ var _ = Describe("docker config", func() { ctx.GetType() Expect(r.Get()).To(BeNil()) + Expect(datacontext.GetContextRefCount(ctx)).To(Equal(1)) ctx = nil runtime.GC() time.Sleep(time.Second) diff --git a/pkg/contexts/credentials/repositories/dockerconfig/repository.go b/pkg/contexts/credentials/repositories/dockerconfig/repository.go index 756df304c4..79d2aea161 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/repository.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/repository.go @@ -17,6 +17,7 @@ import ( "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/utils" @@ -33,7 +34,7 @@ type Repository struct { func NewRepository(ctx cpi.Context, path string, data []byte, propagate bool) (*Repository, error) { r := &Repository{ - ctx: ctx, + ctx: datacontext.InternalContextRef(ctx), propagate: propagate, path: path, data: data, diff --git a/pkg/contexts/datacontext/attrs/rootcertsattr/config.go b/pkg/contexts/datacontext/attrs/rootcertsattr/config.go index 9fcf7d1238..d562553964 100644 --- a/pkg/contexts/datacontext/attrs/rootcertsattr/config.go +++ b/pkg/contexts/datacontext/attrs/rootcertsattr/config.go @@ -62,7 +62,7 @@ func (a *Config) AddRootCertificate(chain signutils.GenericCertificateChain) err func (a *Config) ApplyTo(ctx cfgcpi.Context, target interface{}) error { if t, ok := target.(Context); ok { - if t.AttributesContext() == t { // apply only to root context + if t.AttributesContext().IsAttributesContext() { // apply only to root context return errors.Wrapf(a.ApplyToAttribute(Get(t)), "applying config to certattr failed") } } diff --git a/pkg/contexts/datacontext/context-refcount-model.png b/pkg/contexts/datacontext/context-refcount-model.png new file mode 100755 index 0000000000000000000000000000000000000000..89d79e12c8eff5153706e700db0eb5ba399337b6 GIT binary patch literal 259864 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∋3eOb8evd#Wt+Z)C3NQ=EPuJ6!BEYSmarPtRTC=D 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%0AA5W~DQL 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

    jqWan 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 MkAua3`P)DK7hlrGkN^Mx literal 0 HcmV?d00001 diff --git a/pkg/contexts/datacontext/context.go b/pkg/contexts/datacontext/context.go index 1cf0a7fe19..2af9fb34d9 100644 --- a/pkg/contexts/datacontext/context.go +++ b/pkg/contexts/datacontext/context.go @@ -9,7 +9,6 @@ import ( "fmt" "io" "reflect" - runtime2 "runtime" "sync" "github.com/mandelsoft/logging" @@ -19,6 +18,7 @@ import ( "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/finalizer" ocmlog "github.com/open-component-model/ocm/pkg/logging" + "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) @@ -47,6 +47,8 @@ const ( MODE_INITIAL ) +const MULTI_REF = false + func (m BuilderMode) String() string { switch m { case MODE_SHARED: @@ -123,6 +125,8 @@ type Context interface { ContextProvider Delegates + IsIdenticalTo(Context) bool + // GetType returns the context type GetType() string GetId() ContextIdentity @@ -137,7 +141,7 @@ type InternalContext interface { Context finalizer.RecorderProvider GetKey() interface{} - Cleanup() error + GetAllocatable() refmgmt.Allocatable } //////////////////////////////////////////////////////////////////////////////// @@ -216,40 +220,21 @@ type gcWrapper struct { *_context } -func (w *gcWrapper) SetContext(c *_context) { - w._context = c -} - -// var _ Context = gcWrapper{} - -// AttributesContext must be defined at wrapper as special -// case for a root context. -// Unfortunately GO generics do not accept this these for -// FinalizedContext anymore because of this -// pointer receiver, therefore we have to copy and specialize -// the complete stuff. -func (w *gcWrapper) AttributesContext() AttributesContext { - if w.updater != nil { - w.updater.Update() +func newView(c *_context, ref ...bool) AttributesContext { + if utils.Optional(ref...) { + return FinalizedContext[gcWrapper](c) } - return w + return c } -func finalizedContext(c *_context) AttributesContext { - var v gcWrapper - p := &v - p.SetContext(c) - p.setSelf(p, c.GetKey()) // prepare for generic bind operation - runtime2.SetFinalizer(&v, lfi) - Debug(p, "create context", "id", c.GetId()) - return p +func (w *gcWrapper) SetContext(c *_context) { + w._context = c } -func lfi(c *gcWrapper) { - err := c.Cleanup() - c.GetRecorder().Record(c.GetId()) - Debug(c, "cleanup context", "error", err) -} +var ( + _ Context = (*_context)(nil) + _ ViewCreator[AttributesContext] = (*_context)(nil) +) // New provides a root attribute context. func New(parentAttrs ...Attributes) AttributesContext { @@ -265,8 +250,18 @@ func newWithActions(mode BuilderMode, parentAttrs Attributes, actions handlers.R c.contextBase = newContextBase(c, CONTEXT_TYPE, key, parentAttrs, &c.updater, ComposeDelegates(logging.NewWithBase(ocmlog.Context()), handlers.NewRegistry(nil, actions)), ) - // return SetupContext(mode, FinalizedContext[gcWrapper](c)) // see above - return SetupContext(mode, finalizedContext(c)) + return SetupContext(mode, c.CreateView()) // see above +} + +func (c *_context) CreateView() AttributesContext { + return newView(c, true) +} + +func (c *_context) AttributesContext() AttributesContext { + if c.updater != nil { + c.updater.Update() + } + return newView(c) } func (c *_context) IsAttributesContext() bool { diff --git a/pkg/contexts/datacontext/context_test.go b/pkg/contexts/datacontext/context_test.go new file mode 100644 index 0000000000..ecb1593e1d --- /dev/null +++ b/pkg/contexts/datacontext/context_test.go @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package datacontext_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + me "github.com/open-component-model/ocm/pkg/contexts/datacontext" +) + +var _ = Describe("area test", func() { + It("can be garbage collected", func() { + // ocmlog.Context().AddRule(logging.NewConditionRule(logging.DebugLevel, me.Realm)) + + ctx := me.New() + Expect(ctx.IsIdenticalTo(ctx)).To(BeTrue()) + + ctx2 := ctx.AttributesContext() + Expect(ctx.IsIdenticalTo(ctx2)).To(BeTrue()) + + ctx3 := me.New() + Expect(ctx.IsIdenticalTo(ctx3)).To(BeFalse()) + }) +}) diff --git a/pkg/contexts/datacontext/cpi.go b/pkg/contexts/datacontext/cpi.go index 3bb83318be..4d372330ad 100644 --- a/pkg/contexts/datacontext/cpi.go +++ b/pkg/contexts/datacontext/cpi.go @@ -7,13 +7,15 @@ package datacontext import ( "context" "fmt" - runtime2 "runtime" "github.com/mandelsoft/logging" + "github.com/modern-go/reflect2" "github.com/open-component-model/ocm/pkg/contexts/datacontext/action/handlers" "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/finalizer" + "github.com/open-component-model/ocm/pkg/refmgmt" + "github.com/open-component-model/ocm/pkg/refmgmt/finalized" ) // NewContextBase creates a context base implementation supporting @@ -29,22 +31,38 @@ func NewContextBase(eff Context, typ string, key interface{}, parentAttrs Attrib // for a context wrapper handling garbage collection. // It also handles the BindTo interface for a context. type GCWrapper struct { - self Context + ref *finalized.FinalizedRef + self Context // reference to wrapper + ctx Context // reference to internal context key interface{} } +var _ provider = (*GCWrapper)(nil) // wrapper provides access to internal context ref + // setSelf is not public to enforce // the usage of this GCWrapper type in context // specific garbage collection wrappers. // It is enforced by the // finalizableContextWrapper interface. -func (w *GCWrapper) setSelf(self Context, key interface{}) { +func (w *GCWrapper) setSelf(a refmgmt.Allocatable, self Context, ictx Context, key interface{}) { + if a != nil { + w.ref, _ = finalized.NewPlainFinalizedView(a) + } w.self = self + w.ctx = ictx w.key = key } +func (w *GCWrapper) IsPersistent() bool { + return true +} + +func (w *GCWrapper) GetInternalContext() Context { + return w.ctx +} + func init() { // linter complains about unused method. - (&GCWrapper{}).setSelf(nil, nil) + (&GCWrapper{}).setSelf(nil, nil, nil, nil) } // BindTo makes the Context reachable via the resulting context.Context. @@ -53,6 +71,88 @@ func (b GCWrapper) BindTo(ctx context.Context) context.Context { return context.WithValue(ctx, b.key, b.self) } +func (w GCWrapper) getAllocatable() refmgmt.Allocatable { + return w.ref.GetAllocatable() +} + +type view interface { + getAllocatable() refmgmt.Allocatable +} + +type viewI interface { + GetAllocatable() refmgmt.Allocatable +} + +func GetContextRefCount(ctx Context) int { + switch a := ctx.(type) { + case view: + if m, ok := a.getAllocatable().(refmgmt.RefMgmt); ok { + return m.RefCount() + } + case viewI: + if m, ok := a.GetAllocatable().(refmgmt.RefMgmt); ok { + return m.RefCount() + } + } + return -1 +} + +type persistent interface { + IsPersistent() bool +} + +type provider interface { + GetInternalContext() Context +} + +type ViewCreator[C Context] interface { + CreateView() C +} + +func IsPersistentContextRef(ctx Context) bool { + if p, ok := ctx.(persistent); ok { + return p.IsPersistent() + } + return false +} + +// PersistentContextRef ensures a persistent context ref to the given +// context to avoid an automatic cleanup of the context, which is +// executed if all persistent refs are gone. +// If you want to keep context related objects longer than your used +// context reference, you should keep a persistent ref. This +// could be the one provided by context creation, or by retrieving +// an explicit one using this function. +func PersistentContextRef[C Context](ctx C) C { + if IsPersistentContextRef(ctx) { + return ctx + } + var c interface{} = ctx + for { + if p, ok := c.(provider); ok { + c = p.GetInternalContext() + } else { + break + } + } + return c.(ViewCreator[C]).CreateView() +} + +func InternalContextRef[C Context](ctx C) C { + if IsPersistentContextRef(ctx) { + var c interface{} = ctx + for { + if p, ok := c.(provider); ok { + c = p.GetInternalContext() + } else { + break + } + } + return c.(C) + } + return ctx +} + // finalizableContextWrapper is the interface for // a context wrapper used to establish a garbage collectable // runtime finalizer. @@ -62,7 +162,8 @@ type finalizableContextWrapper[C InternalContext, P any] interface { InternalContext SetContext(C) - setSelf(Context, interface{}) + provider + setSelf(refmgmt.Allocatable, Context, Context, interface{}) *P } @@ -81,24 +182,17 @@ func FinalizedContext[W Context, C InternalContext, P finalizableContextWrapper[ var v W p := (P)(&v) p.SetContext(c) - p.setSelf(p, c.GetKey()) // prepare for generic bind operation - runtime2.SetFinalizer(p, fi[W, C, P]) - Debug(p, "create context", "id", c.GetId()) + p.setSelf(c.GetAllocatable(), p, c, c.GetKey()) // prepare for generic bind operation return p } -func fi[W Context, C InternalContext, P finalizableContextWrapper[C, W]](c P) { - err := c.Cleanup() - c.GetRecorder().Record(c.GetId()) - Debug(c, "cleanup context", "error", err) -} - type contextBase struct { - ctxtype string - id ContextIdentity - key interface{} - effective Context - attributes *_attributes + ctxtype string + allocatable refmgmt.Allocatable + id ContextIdentity + key interface{} + effective Context + attributes *_attributes delegates finalizer *finalizer.Finalizer @@ -120,9 +214,22 @@ func newContextBase(eff Context, typ string, key interface{}, parentAttrs Attrib delegates: delegates, recorder: recorder, } + c.allocatable = refmgmt.NewAllocatable(c.cleanup, true) + Debug(c, "create context", "id", c.GetId()) return c } +func (c *contextBase) IsIdenticalTo(ctx Context) bool { + if reflect2.IsNil(ctx) { + return false + } + return c.GetId() == ctx.GetId() +} + +func (c *contextBase) GetAllocatable() refmgmt.Allocatable { + return c.allocatable +} + func (c *contextBase) BindTo(ctx context.Context) context.Context { panic("should never be called") } @@ -151,6 +258,13 @@ func (c *contextBase) GetRecorder() *finalizer.RuntimeFinalizationRecoder { return c.recorder } +func (c *contextBase) cleanup() error { + if c.recorder != nil { + c.recorder.Record(c.id) + } + return c.Cleanup() +} + func (c *contextBase) Cleanup() error { list := errors.ErrListf("cleanup %s", c.id) list.Addf(nil, c.finalizer.Finalize(), "finalizers") diff --git a/pkg/contexts/datacontext/gc_test.go b/pkg/contexts/datacontext/gc_test.go index ffae3b33c3..a3c833961f 100644 --- a/pkg/contexts/datacontext/gc_test.go +++ b/pkg/contexts/datacontext/gc_test.go @@ -10,16 +10,34 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/open-component-model/ocm/pkg/generics" me "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/finalizer" ) var _ = Describe("area test", func() { - It("can be garbage collected", func() { + It("can be garbage collectede", func() { + ctx := me.New() + r := finalizer.GetRuntimeFinalizationRecorder(ctx) + id := ctx.GetId() + Expect(me.GetContextRefCount(ctx)).To(Equal(1)) + ctx = nil + runtime.GC() + time.Sleep(time.Second) + Expect(r.Get()).To(ConsistOf(id)) + + }) + + It("provides second reference", func() { // ocmlog.Context().AddRule(logging.NewConditionRule(logging.DebugLevel, me.Realm)) + multiRefs := generics.Conditional(me.MULTI_REF, 2, 1) ctx := me.New() + Expect(me.GetContextRefCount(ctx)).To(Equal(1)) + + actx := ctx.AttributesContext() + Expect(me.GetContextRefCount(ctx)).To(Equal(multiRefs)) r := finalizer.GetRuntimeFinalizationRecorder(ctx) Expect(r).NotTo(BeNil()) @@ -29,6 +47,14 @@ var _ = Describe("area test", func() { ctx.GetType() Expect(r.Get()).To(BeNil()) + actx.GetType() + actx = nil + runtime.GC() + time.Sleep(time.Second) + ctx.GetType() + Expect(r.Get()).To(BeNil()) + Expect(me.GetContextRefCount(ctx)).To(Equal(1)) + ctx = nil for i := 0; i < 100; i++ { runtime.GC() @@ -37,4 +63,34 @@ var _ = Describe("area test", func() { Expect(r.Get()).To(ContainElement(ContainSubstring(me.CONTEXT_TYPE))) }) + + It("creates views", func() { + ctx := me.New() + r := finalizer.GetRuntimeFinalizationRecorder(ctx) + + Expect(me.GetContextRefCount(ctx)).To(Equal(1)) + Expect(me.IsPersistentContextRef(ctx)).To(BeTrue()) + + view := me.PersistentContextRef(ctx) + Expect(me.GetContextRefCount(view)).To(Equal(1)) // reuse persistent ref + Expect(me.IsPersistentContextRef(view)).To(BeTrue()) + + non := view.AttributesContext() + Expect(me.IsPersistentContextRef(non)).To(BeFalse()) + + view2 := me.PersistentContextRef(non) + Expect(me.GetContextRefCount(view2)).To(Equal(2)) // create new view + Expect(me.IsPersistentContextRef(view2)).To(BeTrue()) + + Expect(ctx.IsIdenticalTo(view)).To(BeTrue()) + Expect(ctx.IsIdenticalTo(view2)).To(BeTrue()) + + ctx = nil + view = nil + view2 = nil + + runtime.GC() + time.Sleep(time.Second) + Expect(len(r.Get())).To(Equal(1)) // ref non is not persistent + }) }) diff --git a/pkg/contexts/oci/internal/builder_test.go b/pkg/contexts/oci/internal/builder_test.go index 3b4cffc107..2240f5bd48 100644 --- a/pkg/contexts/oci/internal/builder_test.go +++ b/pkg/contexts/oci/internal/builder_test.go @@ -22,7 +22,7 @@ var _ = Describe("builder test", func() { Expect(ctx).NotTo(BeIdenticalTo(local.DefaultContext)) Expect(ctx.RepositoryTypes()).To(BeIdenticalTo(local.DefaultRepositoryTypeScheme)) - Expect(ctx.ConfigContext()).To(BeIdenticalTo(config.DefaultContext())) + Expect(ctx.ConfigContext().GetId()).To(BeIdenticalTo(config.DefaultContext().GetId())) Expect(ctx.CredentialsContext()).To(BeIdenticalTo(credentials.DefaultContext())) }) diff --git a/pkg/contexts/oci/internal/context.go b/pkg/contexts/oci/internal/context.go index da67e49200..6013260894 100644 --- a/pkg/contexts/oci/internal/context.go +++ b/pkg/contexts/oci/internal/context.go @@ -14,6 +14,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/runtime" + "github.com/open-component-model/ocm/pkg/utils" ) const CONTEXT_TYPE = "oci" + datacontext.OCM_CONTEXT_SUFFIX @@ -77,15 +78,17 @@ type _context struct { _InternalContext updater cfgcpi.Updater - sharedattributes datacontext.AttributesContext - credentials credentials.Context + credentials credentials.Context knownRepositoryTypes RepositoryTypeScheme specHandlers RepositorySpecHandlers aliases map[string]RepositorySpec } -var _ Context = &_context{} +var ( + _ Context = (*_context)(nil) + _ datacontext.ViewCreator[Context] = (*_context)(nil) +) // gcWrapper is used as garbage collectable // wrapper for a context implementation @@ -95,25 +98,35 @@ type gcWrapper struct { *_context } +func newView(c *_context, ref ...bool) Context { + if utils.Optional(ref...) { + return datacontext.FinalizedContext[gcWrapper](c) + } + return c +} + func (w *gcWrapper) SetContext(c *_context) { w._context = c } func newContext(credctx credentials.Context, reposcheme RepositoryTypeScheme, specHandlers RepositorySpecHandlers, delegates datacontext.Delegates) Context { c := &_context{ - sharedattributes: credctx.AttributesContext(), - credentials: credctx, + credentials: datacontext.PersistentContextRef(credctx), knownRepositoryTypes: reposcheme, specHandlers: specHandlers, aliases: map[string]RepositorySpec{}, } c._InternalContext = datacontext.NewContextBase(c, CONTEXT_TYPE, key, credctx.ConfigContext().GetAttributes(), delegates) - c.updater = cfgcpi.NewUpdater(credctx.ConfigContext(), c) - return datacontext.FinalizedContext[gcWrapper](c) + c.updater = cfgcpi.NewUpdaterForFactory(credctx.ConfigContext(), c.OCIContext) + return newView(c, true) +} + +func (c *_context) CreateView() Context { + return newView(c, true) } func (c *_context) OCIContext() Context { - return c + return newView(c) } func (c *_context) Update() error { @@ -121,7 +134,7 @@ func (c *_context) Update() error { } func (c *_context) AttributesContext() datacontext.AttributesContext { - return c.sharedattributes + return c.credentials.AttributesContext() } func (c *_context) ConfigContext() config.Context { @@ -141,7 +154,7 @@ func (c *_context) RepositorySpecHandlers() RepositorySpecHandlers { } func (c *_context) MapUniformRepositorySpec(u *UniformRepositorySpec) (RepositorySpec, error) { - return c.specHandlers.MapUniformRepositorySpec(c, u) + return c.specHandlers.MapUniformRepositorySpec(c.OCIContext(), u) } func (c *_context) RepositorySpecForConfig(data []byte, unmarshaler runtime.Unmarshaler) (RepositorySpec, error) { @@ -153,7 +166,7 @@ func (c *_context) RepositoryForSpec(spec RepositorySpec, creds ...credentials.C if err != nil { return nil, err } - return spec.Repository(c, cred) + return spec.Repository(c.OCIContext(), cred) } func (c *_context) RepositoryForConfig(data []byte, unmarshaler runtime.Unmarshaler, creds ...credentials.CredentialsSource) (Repository, error) { diff --git a/pkg/contexts/ocm/attrs/signingattr/config.go b/pkg/contexts/ocm/attrs/signingattr/config.go index e531e5cb5b..8eff58ab8b 100644 --- a/pkg/contexts/ocm/attrs/signingattr/config.go +++ b/pkg/contexts/ocm/attrs/signingattr/config.go @@ -210,10 +210,7 @@ func (a *Config) ApplyTo(ctx cfgcpi.Context, target interface{}) error { t, ok := target.(Context) if !ok { if t, ok := target.(datacontext.AttributesContext); ok { - // datacontext.Context is implemented by all context types. - // Therefore, we have to check for the root context, this is the one - // identical to the attributes context of a context. - if t.AttributesContext() == t { + if t.AttributesContext().IsAttributesContext() { return errors.Wrapf(a.ApplyToRootCertsAttr(rootcertsattr.Get(t)), "applying config to certattr failed") } } diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/blobhandler.go index ca073b5987..6dd9bc9641 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/blobhandler.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/blobhandler.go @@ -61,6 +61,7 @@ func (b *artifactHandler) StoreBlob(blob cpi.BlobAccess, artType, hint string, g return nil, err } + // this section is for logging, only target, err := json.Marshal(repo.GetSpecification()) if err != nil { return nil, errors.Wrapf(err, "cannot marshal target specification") diff --git a/pkg/contexts/ocm/internal/builder_test.go b/pkg/contexts/ocm/internal/builder_test.go index 5350affe3c..98b133c2c2 100644 --- a/pkg/contexts/ocm/internal/builder_test.go +++ b/pkg/contexts/ocm/internal/builder_test.go @@ -29,11 +29,9 @@ var _ = Describe("builder test", func() { Expect(ctx.BlobHandlers()).To(BeIdenticalTo(local.DefaultBlobHandlerRegistry)) Expect(ctx.BlobDigesters()).To(BeIdenticalTo(local.DefaultBlobDigesterRegistry)) - Expect(ctx.ConfigContext()).To(BeIdenticalTo(config.DefaultContext())) - - Expect(ctx.CredentialsContext()).To(BeIdenticalTo(credentials.DefaultContext())) - - Expect(ctx.OCIContext()).To(BeIdenticalTo(oci.DefaultContext())) + Expect(ctx.ConfigContext().GetId()).To(BeIdenticalTo(config.DefaultContext().GetId())) + Expect(ctx.CredentialsContext().GetId()).To(BeIdenticalTo(credentials.DefaultContext().GetId())) + Expect(ctx.OCIContext().GetId()).To(BeIdenticalTo(oci.DefaultContext().GetId())) }) It("creates defaulted", func() { diff --git a/pkg/contexts/ocm/internal/context.go b/pkg/contexts/ocm/internal/context.go index 5e395afad2..f09de688b8 100644 --- a/pkg/contexts/ocm/internal/context.go +++ b/pkg/contexts/ocm/internal/context.go @@ -21,6 +21,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ctf" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/runtime" + "github.com/open-component-model/ocm/pkg/utils" ) const CONTEXT_TYPE = "ocm" + datacontext.OCM_CONTEXT_SUFFIX @@ -127,9 +128,8 @@ type _context struct { _InternalContext updater cfgcpi.Updater - sharedattributes datacontext.AttributesContext - credctx credentials.Context - ocictx oci.Context + credctx credentials.Context + ocictx oci.Context knownRepositoryTypes RepositoryTypeScheme knownAccessTypes AccessTypeScheme @@ -141,7 +141,10 @@ type _context struct { resolver *resolver } -var _ Context = &_context{} +var ( + _ Context = (*_context)(nil) + _ datacontext.ViewCreator[Context] = (*_context)(nil) +) // gcWrapper is used as garbage collectable // wrapper for a context implementation @@ -151,15 +154,21 @@ type gcWrapper struct { *_context } +func newView(c *_context, ref ...bool) Context { + if utils.Optional(ref...) { + return datacontext.FinalizedContext[gcWrapper](c) + } + return c +} + func (w *gcWrapper) SetContext(c *_context) { w._context = c } func newContext(credctx credentials.Context, ocictx oci.Context, reposcheme RepositoryTypeScheme, accessscheme AccessTypeScheme, specHandlers RepositorySpecHandlers, blobHandlers BlobHandlerRegistry, blobDigesters BlobDigesterRegistry, repodel RepositoryDelegationRegistry, delegates datacontext.Delegates) Context { c := &_context{ - sharedattributes: credctx.AttributesContext(), - credctx: credctx, - ocictx: ocictx, + credctx: datacontext.PersistentContextRef(credctx), + ocictx: datacontext.PersistentContextRef(ocictx), specHandlers: specHandlers, blobHandlers: blobHandlers, blobDigesters: blobDigesters, @@ -172,17 +181,21 @@ func newContext(credctx credentials.Context, ocictx oci.Context, reposcheme Repo c.knownRepositoryTypes = NewRepositoryTypeScheme(&delegatingDecoder{ctx: c, delegate: repodel}, reposcheme) } c._InternalContext = datacontext.NewContextBase(c, CONTEXT_TYPE, key, credctx.GetAttributes(), delegates) - c.updater = cfgcpi.NewUpdater(credctx.ConfigContext(), c) + c.updater = cfgcpi.NewUpdaterForFactory(credctx.ConfigContext(), c.OCMContext) c.resolver = &resolver{ ctx: c, MatchingResolver: NewMatchingResolver(c), } c.Finalizer().With(c.resolver.Finalize) - return datacontext.FinalizedContext[gcWrapper](c) + return newView(c, true) +} + +func (c *_context) CreateView() Context { + return newView(c, true) } func (c *_context) OCMContext() Context { - return c + return newView(c) } func (c *_context) Update() error { @@ -190,7 +203,7 @@ func (c *_context) Update() error { } func (c *_context) AttributesContext() datacontext.AttributesContext { - return c.sharedattributes + return c.credctx.AttributesContext() } func (c *_context) ConfigContext() config.Context { diff --git a/pkg/contexts/ocm/internal/resolver.go b/pkg/contexts/ocm/internal/resolver.go index ad32729535..85665b2855 100644 --- a/pkg/contexts/ocm/internal/resolver.go +++ b/pkg/contexts/ocm/internal/resolver.go @@ -55,6 +55,13 @@ func NewRepositoryCache() *RepositoryCache { } } +func (c *RepositoryCache) Reset() { + c.lock.Lock() + defer c.lock.Unlock() + + c.repositories = map[datacontext.ObjectKey]Repository{} +} + func (c *RepositoryCache) LookupRepository(ctx Context, spec RepositorySpec) (Repository, bool, error) { spec, err := ctx.RepositoryTypes().Convert(spec) if err != nil { @@ -104,9 +111,17 @@ func (r *ResolverRule) Match(name string) bool { return r.prefix == "" || r.prefix == name || strings.HasPrefix(name, r.prefix+"/") } +// MatchingResolver hosts rule to match component version names. +// Matched names will be mapped to a specification for repository +// which should be used to look up the component version. +// Therefore, it keeps a reference to the context to use. +// +// ATTENTION: Because such an object is used by the context +// implementation, the context must be kept as ContextProvider +// to provide context views to outbound calls. type MatchingResolver struct { lock sync.Mutex - ctx Context + ctx ContextProvider finalize finalizer.Finalizer cache *RepositoryCache rules []*ResolverRule @@ -115,17 +130,20 @@ type MatchingResolver struct { func NewMatchingResolver(ctx ContextProvider, rules ...*ResolverRule) *MatchingResolver { return &MatchingResolver{ lock: sync.Mutex{}, - ctx: ctx.OCMContext(), + ctx: ctx, cache: NewRepositoryCache(), rules: nil, } } func (r *MatchingResolver) OCMContext() Context { - return r.ctx + return r.ctx.OCMContext() } func (r *MatchingResolver) Finalize() error { + r.lock.Lock() + defer r.lock.Unlock() + defer r.cache.Reset() return r.finalize.Finalize() } @@ -154,9 +172,10 @@ func (r *MatchingResolver) LookupComponentVersion(name string, version string) ( r.lock.Lock() defer r.lock.Unlock() + ctx := r.ctx.OCMContext() for _, rule := range r.rules { if rule.Match(name) { - repo, cached, err := r.cache.LookupRepository(r.ctx, rule.spec) + repo, cached, err := r.cache.LookupRepository(ctx, rule.spec) if err != nil { return nil, err } diff --git a/pkg/contexts/ocm/repositories/comparch/repository.go b/pkg/contexts/ocm/repositories/comparch/repository.go index 56ae0d1078..c99c9c0d98 100644 --- a/pkg/contexts/ocm/repositories/comparch/repository.go +++ b/pkg/contexts/ocm/repositories/comparch/repository.go @@ -12,6 +12,7 @@ import ( "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/common/accessio" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localblob" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localfsblob" @@ -33,7 +34,8 @@ type RepositoryImpl struct { var _ repocpi.RepositoryImpl = (*RepositoryImpl)(nil) -func NewRepository(ctx cpi.Context, s *RepositorySpec) (cpi.Repository, error) { +func NewRepository(ctxp cpi.ContextProvider, s *RepositorySpec) (cpi.Repository, error) { + ctx := datacontext.InternalContextRef(ctxp.OCMContext()) if s.GetPathFileSystem() == nil { s.SetPathFileSystem(vfsattr.Get(ctx)) } diff --git a/pkg/contexts/ocm/repositories/composition/repository.go b/pkg/contexts/ocm/repositories/composition/repository.go index aa39d52042..a199ebd4f9 100644 --- a/pkg/contexts/ocm/repositories/composition/repository.go +++ b/pkg/contexts/ocm/repositories/composition/repository.go @@ -12,6 +12,7 @@ import ( "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/common/accessio" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localblob" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" @@ -22,18 +23,19 @@ import ( //////////////////////////////////////////////////////////////////////////////// -func NewRepository(ctx cpi.ContextProvider, names ...string) cpi.Repository { +func NewRepository(ctxp cpi.ContextProvider, names ...string) cpi.Repository { var repositories *Repositories + ctx := datacontext.InternalContextRef(ctxp.OCMContext()) name := utils.Optional(names...) if name != "" { - repositories = ctx.OCMContext().GetAttributes().GetOrCreateAttribute(ATTR_REPOS, newRepositories).(*Repositories) + repositories = ctx.GetAttributes().GetOrCreateAttribute(ATTR_REPOS, newRepositories).(*Repositories) if repo := repositories.GetRepository(name); repo != nil { repo, _ = repo.Dup() return repo } } - repo := virtual.NewRepository(ctx.OCMContext(), NewAccess()) + repo := virtual.NewRepository(ctx, NewAccess()) if repositories != nil { repositories.SetRepository(name, repo) repo, _ = repo.Dup() diff --git a/pkg/contexts/ocm/repositories/genericocireg/repository.go b/pkg/contexts/ocm/repositories/genericocireg/repository.go index 3cb94399b8..37c46ae8a7 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/repository.go +++ b/pkg/contexts/ocm/repositories/genericocireg/repository.go @@ -12,6 +12,7 @@ import ( "strings" "github.com/open-component-model/ocm/pkg/contexts/credentials" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/oci" ocicpi "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" @@ -53,7 +54,8 @@ var ( _ credentials.ConsumerIdentityProvider = (*RepositoryImpl)(nil) ) -func NewRepository(ctx cpi.Context, meta *ComponentRepositoryMeta, ocirepo oci.Repository) cpi.Repository { +func NewRepository(ctxp cpi.ContextProvider, meta *ComponentRepositoryMeta, ocirepo oci.Repository) cpi.Repository { + ctx := datacontext.InternalContextRef(ctxp.OCMContext()) impl := &RepositoryImpl{ ctx: ctx, meta: *DefaultComponentRepositoryMeta(meta), diff --git a/pkg/contexts/ocm/repositories/virtual/repository.go b/pkg/contexts/ocm/repositories/virtual/repository.go index fe3cc2eaa0..dafbe5457d 100644 --- a/pkg/contexts/ocm/repositories/virtual/repository.go +++ b/pkg/contexts/ocm/repositories/virtual/repository.go @@ -5,6 +5,7 @@ package virtual import ( + "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/repocpi" ) @@ -18,9 +19,9 @@ type RepositoryImpl struct { var _ repocpi.RepositoryImpl = (*RepositoryImpl)(nil) -func NewRepository(ctx cpi.Context, acc Access) cpi.Repository { +func NewRepository(ctxp cpi.ContextProvider, acc Access) cpi.Repository { impl := &RepositoryImpl{ - ctx: ctx, + ctx: datacontext.InternalContextRef(ctxp.OCMContext()), access: acc, } return repocpi.NewRepository(impl, "OCM repo[Simple]") diff --git a/pkg/finalizer/object.go b/pkg/finalizer/object.go index 0cd95cfc46..d092914916 100644 --- a/pkg/finalizer/object.go +++ b/pkg/finalizer/object.go @@ -94,7 +94,7 @@ func fi(o *RuntimeFinalizer) { o.finalize() } -func NewRuntimeFinalizer(id ObjectIdentity, r *RuntimeFinalizationRecoder) *RuntimeFinalizer { +func NewRuntimeFinalizer(id ObjectIdentity, r *RuntimeFinalizationRecoder, cleanup ...func() error) *RuntimeFinalizer { f := &RuntimeFinalizer{ id: id, recorder: r, diff --git a/pkg/refmgmt/finalized/doc.go b/pkg/refmgmt/finalized/doc.go new file mode 100644 index 0000000000..13b1e31d54 --- /dev/null +++ b/pkg/refmgmt/finalized/doc.go @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +// Package finalized provided a view management for a backend object, +// which is based on Go Garbage Collection and runtime finalizers. +// Finalization is not possible in Go, if an object is involved in +// a reference cycle. In such a case the complete cycle is not +// garbage collected at all. +// +// If some kind of finalization is required together with cyclic +// object dependencies, the cleanup of the object can therefore not +// be done with runtime finalizers. +// We separate a garbage collectable view object, which holds a +// reference to a backend object featuring cycles. +// The view object uses reference counting for its backend +// together with runtime finalization. Therefore, it does not require +// a Close method. If the view is garbage collected it releases its +// reference to the backend object. If the last view vanished +// the cleanup method for the backend object is called. +// +// The object functionality is exposed via an interface, only, which +// is also implemented by the vies by embedding a pointer to the backend +// object. +// +// If the backend object requires a cycle by holding local objects +// requiring a reference to the object, this can be done +// by NOT using view objects for this cycle, but the backend object +// itself. If the local object wants to pass the backend object to some +// outgoing call, it MUST wrap the backend object again into a new view. +// Therefore, objects involved in the cycle MUST be prepared to handle +// such outgoing references. +package finalized diff --git a/pkg/refmgmt/finalized/finalized_test.go b/pkg/refmgmt/finalized/finalized_test.go new file mode 100644 index 0000000000..09d9dce5a9 --- /dev/null +++ b/pkg/refmgmt/finalized/finalized_test.go @@ -0,0 +1,146 @@ +// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package finalized_test + +import ( + "runtime" + "time" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/open-component-model/ocm/pkg/finalizer" + "github.com/open-component-model/ocm/pkg/refmgmt" + "github.com/open-component-model/ocm/pkg/refmgmt/finalized" +) + +type Interface interface { + GetId() finalizer.ObjectIdentity + GetSelf() Interface + + GetRefId() finalizer.ObjectIdentity +} + +type object struct { + refmgmt.Allocatable + recorder *finalizer.RuntimeFinalizationRecoder + name finalizer.ObjectIdentity +} + +func (o *object) GetId() finalizer.ObjectIdentity { + return o.name +} + +func (o *object) GetSelf() Interface { + v, _ := newView(o) + return v +} + +func (o *object) cleanup() error { + o.recorder.Record(finalizer.ObjectIdentity(o.name)) + return nil +} + +type view struct { + ref *finalized.FinalizedRef + *object +} + +var _ Interface = (*view)(nil) + +func newView(o *object) (Interface, error) { + ref, err := finalized.NewFinalizedView(o.Allocatable, finalizer.NewObjectIdentity("test"), o.recorder) + if err != nil { + return nil, err + } + return &view{ + ref: ref, + object: o, + }, nil +} + +func (v *view) GetRefId() finalizer.ObjectIdentity { + return v.ref.GetRefId() +} + +func New(name string, rec *finalizer.RuntimeFinalizationRecoder) Interface { + o := &object{ + name: finalizer.ObjectIdentity(name), + recorder: rec, + } + o.Allocatable = refmgmt.NewAllocatable(o.cleanup, true) + + v, _ := newView(o) + return v +} + +//////////////////////////////////////////////////////////////////////////////// + +var _ = Describe("finalized ref", func() { + var rec *finalizer.RuntimeFinalizationRecoder + + BeforeEach(func() { + rec = &finalizer.RuntimeFinalizationRecoder{} + }) + + It("cleanup ref and object", func() { + o := New("test", rec) + orefid := o.GetRefId() + id := o.GetId() + + o = nil + + runtime.GC() + time.Sleep(time.Second) + + Expect(rec.Get()).To(ConsistOf( + id, + orefid, + )) + }) + + It("cleanup ref after ref and then object", func() { + o := New("test", rec) + o2 := o + orefoid := o.GetRefId() + Expect(o2.GetRefId()).To(Equal(orefoid)) + + id := o.GetId() + r := o.GetSelf() + rrefid := r.GetRefId() + + Expect(r.GetId()).To(Equal(id)) + Expect(orefoid).NotTo(Equal(rrefid)) + + o.GetId() + o = nil + runtime.GC() + time.Sleep(time.Second) + + Expect(rec.Get()).To(ConsistOf()) + + r.GetId() + r = nil + runtime.GC() + time.Sleep(time.Second) + + Expect(rec.Get()).To(ConsistOf( + rrefid, + )) + + o2.GetId() + o2 = nil + runtime.GC() + time.Sleep(time.Second) + + Expect(rec.Get()).To(ContainElements( + orefoid, + rrefid, + id, + )) + + }) + +}) diff --git a/pkg/refmgmt/finalized/finalizedref.go b/pkg/refmgmt/finalized/finalizedref.go new file mode 100644 index 0000000000..c6262fb157 --- /dev/null +++ b/pkg/refmgmt/finalized/finalizedref.go @@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package finalized + +import ( + "runtime" + + "github.com/open-component-model/ocm/pkg/finalizer" + "github.com/open-component-model/ocm/pkg/refmgmt" +) + +type FinalizedRef struct { + allocatable refmgmt.Allocatable + id finalizer.ObjectIdentity + recorder *finalizer.RuntimeFinalizationRecoder +} + +func NewPlainFinalizedView(allocatable refmgmt.Allocatable) (*FinalizedRef, error) { + return NewFinalizedView(allocatable, "", nil) +} + +func NewFinalizedView(allocatable refmgmt.Allocatable, id finalizer.ObjectIdentity, rec *finalizer.RuntimeFinalizationRecoder) (*FinalizedRef, error) { + err := allocatable.Ref() + if err != nil { + return nil, err + } + v := &FinalizedRef{allocatable, id, rec} + + runtime.SetFinalizer(v, cleanup) + return v, nil +} + +func (v *FinalizedRef) GetAllocatable() refmgmt.Allocatable { + return v.allocatable +} + +func (v *FinalizedRef) GetRefId() finalizer.ObjectIdentity { + return v.id +} + +func cleanup(v *FinalizedRef) { + v.allocatable.Unref() + if v.recorder != nil { + v.recorder.Record(v.id) + } +} diff --git a/pkg/refmgmt/finalized/suite_test.go b/pkg/refmgmt/finalized/suite_test.go new file mode 100644 index 0000000000..46c70a1d28 --- /dev/null +++ b/pkg/refmgmt/finalized/suite_test.go @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package finalized_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Finalized Object Test Suite") +} From bcf07413333b284483888c4c5e17cb19934eacc9 Mon Sep 17 00:00:00 2001 From: Fabian Burth Date: Tue, 23 Apr 2024 14:34:53 +0200 Subject: [PATCH 35/83] enable http registries as ocm repositories (#676) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description So far, it was not possible for the ocm tooling to communicate with OCI registries with `http`, but only with `https`. The reason therefore was primarily that the scheme was not considered in the parsing and it defaulted to `https`. This PR extends the code, especially the parsing rules, to be able to also handle `http`. Furthermore, it was not possible to specify `localhost` in OCI commands (e.g. `ocm get artifact`). This PR also extends the code to be able to handle `localhost`. Consequently, the following specifications are now possible: For OCI commands (such as ocm get artifact): `http://example.com/repo:version` `http://localhost:8080/repo:version` `localhost:8080/repo:version`(The port, thus `:8080` is required, here. So, `localhost/repo:version` is not possible, since e.g. `localhost/example:1.0.0` is also a valid dockerhub artifact reference and would therefore be ambiguous.) `localhost//repo:version` (The scheme, thus `http://` can be omitted, if the host is separated from the repo with an unambiguous double slash (//).) `http://localhost:8080//repo:version` (A combination of the previous two formats is also possible, although kind of unintuitive.) For OCM commands (such as ocm transfer): `OCIRegistry::http://localhost:80/test//github.com/example` (The type, thus `OCIRegistry::` is required) `OCIRegistry::localhost:80/test//github.com/example` (Works as well without the scheme, but will default to `https`) and the variations with an actual domain `OCIRegistry::http://example.com:80/test//github.com/example` `http://example.com:80/test//github.com/example` `example.com:80/test//github.com/example` (will default to `https`) `example.com/test//github.com/example` (will default to `https`) ... Furthermore, since using http might potentially be insecure and should only be used in test scenarios, the user should get a warning. To enable this, a corresponding log message was introduced on log level warn and the general default log level for the cli tool was changed from error to warn. Short types for repositories that were expected to work (e.g. oci) are now registered with corresponding repository and repository spec handlers. `make generate` also checks whether the examples are running. This failed on mac, since the component of the 01-getting-started did not contain an arm64 darwin executable due to a mistake in its build. This is now fixed, so after the next release `make generate` will be callable on mac again. Until then, one can call e.g. go generate ./cmds/ocm/... manually. ## What type of PR is this? (check all applicable) - [X] πŸ• Feature - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Added tests? - [X] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) ## Added to documentation? Adjusted the existing ocm references and oci references cli documentations and added additional examples for the most common use cases. ## Checklist: - [X] My code follows the style guidelines of this project - [X] I have performed a self-review of my code - [X] I have commented my code, particularly in hard-to-understand areas - [X] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [X] I have added tests that prove my fix is effective or that my feature works - [X] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Uwe Krueger --- cmds/ocm/app/app.go | 4 +- cmds/ocm/app/app_test.go | 4 +- cmds/ocm/topics/oci/refs/topic.go | 109 ++- cmds/ocm/topics/ocm/refs/topic.go | 69 +- components/ocmcli/Makefile | 2 +- components/ocmcli/resources.yaml | 2 +- .../plugin_accessmethod_compose.md | 8 + docs/pluginreference/plugin_descriptor.md | 8 + .../plugin_valueset_compose.md | 8 + docs/reference/ocm.md | 4 +- docs/reference/ocm_add_routingslips.md | 2 + docs/reference/ocm_bootstrap_configuration.md | 2 + docs/reference/ocm_bootstrap_package.md | 2 + docs/reference/ocm_check_componentversions.md | 2 + docs/reference/ocm_describe_artifacts.md | 1 + docs/reference/ocm_describe_package.md | 2 + docs/reference/ocm_download_artifacts.md | 1 + docs/reference/ocm_download_cli.md | 2 + .../ocm_download_componentversions.md | 2 + docs/reference/ocm_download_resources.md | 2 + docs/reference/ocm_get_artifacts.md | 1 + docs/reference/ocm_get_componentversions.md | 2 + docs/reference/ocm_get_references.md | 2 + docs/reference/ocm_get_resources.md | 2 + docs/reference/ocm_get_routingslips.md | 2 + docs/reference/ocm_get_sources.md | 2 + docs/reference/ocm_hash_componentversions.md | 2 + docs/reference/ocm_install_plugins.md | 2 + docs/reference/ocm_oci-references.md | 109 ++- docs/reference/ocm_ocm-references.md | 55 +- docs/reference/ocm_show_tags.md | 1 + docs/reference/ocm_show_versions.md | 2 + docs/reference/ocm_sign_componentversions.md | 2 + docs/reference/ocm_transfer_artifacts.md | 1 + .../ocm_transfer_componentversions.md | 2 + .../reference/ocm_verify_componentversions.md | 2 + pkg/cobrautils/logopts/options.go | 2 +- pkg/contexts/oci/grammar/grammar.go | 51 +- pkg/contexts/oci/internal/context.go | 1 + pkg/contexts/oci/internal/uniform.go | 35 +- pkg/contexts/oci/ref.go | 65 +- pkg/contexts/oci/ref_test.go | 661 +++++++++++++++++- pkg/contexts/oci/repositories/ctf/uniform.go | 1 + .../oci/repositories/ocireg/repository.go | 40 +- .../oci/repositories/ocireg/uniform.go | 21 +- .../handlers/oci/ocirepo/blobhandler.go | 13 +- pkg/contexts/ocm/grammar/grammar.go | 38 +- pkg/contexts/ocm/grammar/grammar_test.go | 25 +- pkg/contexts/ocm/internal/uniform.go | 12 +- pkg/contexts/ocm/ref.go | 129 +++- pkg/contexts/ocm/ref_test.go | 248 ++++++- pkg/contexts/ocm/repositories/ctf/uniform.go | 2 +- .../ocm/repositories/genericocireg/uniform.go | 24 +- pkg/runtime/utils.go | 18 + 54 files changed, 1613 insertions(+), 198 deletions(-) diff --git a/cmds/ocm/app/app.go b/cmds/ocm/app/app.go index 71af0e4282..3f479b79c9 100644 --- a/cmds/ocm/app/app.go +++ b/cmds/ocm/app/app.go @@ -95,9 +95,9 @@ type CLIOptions struct { } var desc = ` -The Open Component Model command line client support the work with OCM +The Open Component Model command line client supports the work with OCM artifacts, like Component Archives, Common Transport Archive, -Component Repositories, and component versions. +Component Repositories, and Component Versions. Additionally it provides some limited support for the docker daemon, OCI artifacts and registries. diff --git a/cmds/ocm/app/app_test.go b/cmds/ocm/app/app_test.go index 1980b7faf9..4d19586ea8 100644 --- a/cmds/ocm/app/app_test.go +++ b/cmds/ocm/app/app_test.go @@ -72,7 +72,9 @@ var _ = Describe("Test Environment", func() { buf := bytes.NewBuffer(nil) Expect(env.CatchOutput(buf).ExecuteModified(addTestCommands, "logtest")).To(Succeed()) Expect(log.String()).To(StringEqualTrimmedWithContext(` +V[2] warn realm ocm realm test ERROR error realm ocm realm test +V[2] ctxwarn realm ocm realm test ERROR ctxerror realm ocm realm test `)) }) @@ -139,7 +141,7 @@ ERROR ctxerror realm ocm realm test fmt.Printf("%s\n", string(data)) // {"level":"error","msg":"error","realm":"test","time":"2024-03-27 09:54:19"} // {"level":"error","msg":"ctxerror","realm":"test","time":"2024-03-27 09:54:19"} - Expect(len(string(data))).To(Equal(155)) + Expect(len(string(data))).To(Equal(312)) }) It("sets attr from file", func() { diff --git a/cmds/ocm/topics/oci/refs/topic.go b/cmds/ocm/topics/oci/refs/topic.go index 74bc6ba8ca..3664c59110 100644 --- a/cmds/ocm/topics/oci/refs/topic.go +++ b/cmds/ocm/topics/oci/refs/topic.go @@ -18,7 +18,21 @@ func New(ctx clictx.Context) *cobra.Command { Use: "oci-references", Short: "notation for OCI references", Example: ` -ghcr.io/mandelsoft/cnudie:1.0.0 ++ctf+directory::./ocm/ctf//ocm.software/ocmcli/ocmcli-image:0.7.0@sha256:29c842be1ef1da67f6a1c07a3a3a8eb101bbcc4c80f174b87d147b341bca9625 + +oci::{"baseUrl": "ghcr.io"}//open-component-model/ocm/ocm.software/ocmcli/ocmcli-image:0.7.0@sha256:29c842be1ef1da67f6a1c07a3a3a8eb101bbcc4c80f174b87d147b341bca9625 + +oci::https://ghcr.io/open-component-model/ocm/ocm.software/ocmcli/ocmcli-image:0.7.0@sha256:29c842be1ef1da67f6a1c07a3a3a8eb101bbcc4c80f174b87d147b341bca9625 +oci::https://ghcr.io//open-component-model/ocm/ocm.software/ocmcli/ocmcli-image:0.7.0@sha256:29c842be1ef1da67f6a1c07a3a3a8eb101bbcc4c80f174b87d147b341bca9625 + +oci::http://localhost:8080/ocm.software/ocmcli/ocmcli-image:0.7.0@sha256:29c842be1ef1da67f6a1c07a3a3a8eb101bbcc4c80f174b87d147b341bca9625 +oci::http://localhost:8080//ocm.software/ocmcli/ocmcli-image:0.7.0@sha256:29c842be1ef1da67f6a1c07a3a3a8eb101bbcc4c80f174b87d147b341bca9625 + +ubuntu:24.04 +ubuntu + +tensorflow/tensorflow:2.15.0 +tensorflow/tensorflow `, Long: ` The command line client supports a special notation scheme for specifying @@ -29,26 +43,97 @@ images are possible:

    [+][<type>::][./][<file path>//<repository>[:<tag>][@<digest>]
    - or -
    [<type>::][<json repo spec>//]<repository>[:<tag>][@<digest>]
    - or -
    [<type>::][<scheme>:://]<domain>[:<port>/]<repository>[:<tag>][@<digest>]
    - or +
    + +or + +
    +
    [+][<type>::][<json repo spec>//]<repository>[:<tag>][@<digest>]
    +
    + +Notice that if you specify the <type> in the beginning of this +notation AND in the <json repo spec>, the types have to match +(but there is no reason to specify the type in both places). + +or + +
    +
    [+][<type>::][<scheme>://]<domain>[:<port>][/]/<repository>[:<tag>][@<digest>]
    +
    + +Notice that this notation optionally also allows a double slash to +seperate <domain>[:<port>] and <repository>. While it is +not necessary for unambiguous parsing here, it is supported for +consistency with the other notations. + +or + +
    +
    [+][<type>::][<scheme>://]<host>:<port>/<repository>[:<tag>][@<digest>]
    +
    + +Notice that <port> is required in this notation. Without <port>, +this notation would be ambiguous with the docker library notation +mentioned below. + +or + +
    +
    [+][<type>::][<scheme>://]<host>[:<port>]//<repository>[:<tag>][@<digest>]
    +
    + +Notice the double slash (//) before the <repository>. This serves as +a clear separator between <host>[:<port>] and <repository>. +Thus, with this notation, the port is optional and can therefore be +omitted without creating ambiguity with the docker library notation +mentioned below. + +or + +
    <docker library>[:<tag>][@<digest>]
    - or +
    + +or + +
    <docker repository>/<docker image>[:<tag>][@<digest>]
    +--- + Besides dedicated artifacts it is also possible to denote registries as a whole:
    -
    [+][<type>::][<scheme>:://]<domain>[:<port>]
    - or -
    [+][<type>::]<json repo spec>
    - or -
    [+][<type>::][./]<file path>
    +
    [+][<type>::][./]<file path>
    +
    + +or + +
    +
    [+][<type>::]<json repo spec>
    +
    + +Notice that if you specify the <type> in the beginning of this +notation AND in the <json repo spec>, the types have to match +(but there is no reason to specify the type in both places). + +or + +
    +
    [+][<type>::][<scheme>://]<domain>[:<port>]
    +
    + +or + +
    +
    [+][<type>::][<scheme>://]<host>[:<port>]
    + +Notice that <port> is optional in this notation since this cannot be +an image reference and therefore cannot be ambiguous with the docker +library notation. ` + FileBasedUsage(), } } diff --git a/cmds/ocm/topics/ocm/refs/topic.go b/cmds/ocm/topics/ocm/refs/topic.go index 5bb6f499ad..41cac75876 100644 --- a/cmds/ocm/topics/ocm/refs/topic.go +++ b/cmds/ocm/topics/ocm/refs/topic.go @@ -16,9 +16,27 @@ func New(ctx clictx.Context) *cobra.Command { Use: "ocm-references", Short: "notation for OCM references", Example: ` -ghcr.io/mandelsoft/cnudie//github.com/mandelsoft/pause:1.0.0 +Complete Component Reference Specifications (including all optional arguments): -ctf+tgz::./ctf ++ctf+directory::./ocm/ctf//ocm.software/ocmcli:0.7.0 + +oci::{"baseUrl":"ghcr.io","componentNameMapping":"urlPath","subPath":"open-component-model"}//ocm.software/ocmcli.0.7.0 + +oci::https://ghcr.io:443/open-component-model//ocm.software/ocmcli:0.7.0 + +oci::http://localhost:8080/local-component-repository//ocm.software/ocmcli:0.7.0 + +--- + +Short-Hand Component Reference Specifications (omitting optional arguments): + +./ocm/ctf//ocm.software/ocmcli:0.7.0 + +ghcr.io/open-component-model//ocm.software/ocmcli:0.7.0 + +localhost:8080/local-component-repository//ocm.software/ocmcli:0.7.0 (defaulting to https) + +http://localhost:8080/local-component-repository//ocm.software/ocmcli:0.7.0 `, Long: ` The command line client supports a special notation scheme for specifying @@ -27,24 +45,53 @@ references to any registry supported by the OCM toolset that can host OCM components:
    -
    [+][<type>::][./][<file path>//<component id>[:<version>]
    - or -
    [+][<type>::]<domain>[:<port>][/<repository prefix>]//<component id>[:<version]
    - or -
    [<type>::][<json repo spec>//]<component id>[:<version>]
    +
    [+][<type>::][./]<file path>//<component id>[:<version>]
    +
    + +or +
    +
    [+][<type>::][<json repo spec>//]<component id>[:<version>]
    +or + +
    +
    [+][<type>::][<scheme>://]<domain>[:<port>][/<repository prefix>]//<component id>[:<version]
    +
    + +or + +
    +
    [+][<type>::][<scheme>://]<host>[:<port>][/<repository prefix>]//<component id>[:<version]
    +
    + +--- + Besides dedicated components it is also possible to denote repositories as a whole:
    -
    [+][<type>::][<scheme>:://]<domain>[:<port>][/<repository prefix>]
    - or -
    [+][<type>::]<json repo spec>
    - or
    [+][<type>::][./]<file path>
    + +or + +
    +
    [+][<type>::]<json repo spec>
    +
    + +or + +
    +
    [+][<type>::][<scheme>://]<domain>[:<port>][/<repository prefix>]
    +
    + +or + +
    +
    [+][<type>::][<scheme>://]<host>[:<port>][/<repository prefix>]
    +
    ` + topicocirefs.FileBasedUsage(), } } diff --git a/components/ocmcli/Makefile b/components/ocmcli/Makefile index 694f6b7269..30db9447fc 100644 --- a/components/ocmcli/Makefile +++ b/components/ocmcli/Makefile @@ -20,7 +20,7 @@ PLATFORM_ARCH := $(shell go env GOARCH) CMDSRCS=$(shell find $(REPO_ROOT)/cmds/$(CMD) -type f) Makefile OCMSRCS=$(shell find $(REPO_ROOT)/pkg -type f) $(REPO_ROOT)/go.* -ATTRIBUTES = VERSION="$(VERSION)" NAME="$(NAME)" COMMIT="$(COMMIT)" IMAGE="$(IMAGE):$(VERSION)" PLATFORMS="$(IMAGE_PLATFORMS)" GEN="$(GEN)" MULTI=$(MULTI) +ATTRIBUTES = VERSION="$(VERSION)" NAME="$(NAME)" COMMIT="$(COMMIT)" IMAGE="$(IMAGE):$(VERSION)" PLATFORMS="$(PLATFORMS)" IMAGE_PLATFORMS="$(IMAGE_PLATFORMS)" GEN="$(GEN)" MULTI=$(MULTI) ifeq ($(MULTI),true) FLAGSUF = .multi diff --git a/components/ocmcli/resources.yaml b/components/ocmcli/resources.yaml index 312ab25ff4..ac152b9b83 100644 --- a/components/ocmcli/resources.yaml +++ b/components/ocmcli/resources.yaml @@ -23,7 +23,7 @@ helper: input: type: (( bool(values.MULTI) ? "dockermulti" :"docker" )) repository: (( index(values.IMAGE, ":") >= 0 ? substr(values.IMAGE,0,index(values.IMAGE,":")) :values.IMAGE )) - variants: (( bool(values.MULTI) ? map[split(" ", values.PLATFORMS)|v|-> values.IMAGE "-" replace(v,"/","-")] :~~ )) + variants: (( bool(values.MULTI) ? map[split(" ", values.IMAGE_PLATFORMS)|v|-> values.IMAGE "-" replace(v,"/","-")] :~~ )) path: (( !bool(values.MULTI) ? values.IMAGE :~~ )) diff --git a/docs/pluginreference/plugin_accessmethod_compose.md b/docs/pluginreference/plugin_accessmethod_compose.md index 58bd57eff4..5ffbea5834 100644 --- a/docs/pluginreference/plugin_accessmethod_compose.md +++ b/docs/pluginreference/plugin_accessmethod_compose.md @@ -40,28 +40,36 @@ The following predefined option types can be used: - accessRegistry: [*string*] registry base URL - accessRepository: [*string*] repository URL - accessVersion: [*string*] version for access specification + - body: [*string*] body of a http request - bucket: [*string*] bucket name - comment: [*string*] comment field value - commit: [*string*] git commit id - digest: [*string*] blob digest - globalAccess: [*map[string]YAML*] access specification for global access + - header: [*string:string,string*] http headers - hint: [*string*] (repository) hint for local artifacts - mediaType: [*string*] media type for artifact blob representation + - noredirect: [*bool*] http redirect behavior - reference: [*string*] reference name - region: [*string*] region name - size: [*int*] blob size + - url: [*string*] artifact or server url + - verb: [*string*] http request method The following predefined value types are supported: - YAML: JSON or YAML document string + - []byte: byte value - []string: list of string values - bool: boolean flag - int: integer value - map[string]YAML: JSON or YAML map - string: string value + - string:string,string: string map defined by dedicated assignment of comma separated strings - string=YAML: string map with arbitrary values defined by dedicated assignments - string=string: string map defined by dedicated assignments + - string=string,string: string map defined by dedicated assignment of comma separated strings ### SEE ALSO diff --git a/docs/pluginreference/plugin_descriptor.md b/docs/pluginreference/plugin_descriptor.md index 2700827888..f04a2169f4 100644 --- a/docs/pluginreference/plugin_descriptor.md +++ b/docs/pluginreference/plugin_descriptor.md @@ -125,28 +125,36 @@ The following predefined option types can be used: - accessRegistry: [*string*] registry base URL - accessRepository: [*string*] repository URL - accessVersion: [*string*] version for access specification + - body: [*string*] body of a http request - bucket: [*string*] bucket name - comment: [*string*] comment field value - commit: [*string*] git commit id - digest: [*string*] blob digest - globalAccess: [*map[string]YAML*] access specification for global access + - header: [*string:string,string*] http headers - hint: [*string*] (repository) hint for local artifacts - mediaType: [*string*] media type for artifact blob representation + - noredirect: [*bool*] http redirect behavior - reference: [*string*] reference name - region: [*string*] region name - size: [*int*] blob size + - url: [*string*] artifact or server url + - verb: [*string*] http request method The following predefined value types are supported: - YAML: JSON or YAML document string + - []byte: byte value - []string: list of string values - bool: boolean flag - int: integer value - map[string]YAML: JSON or YAML map - string: string value + - string:string,string: string map defined by dedicated assignment of comma separated strings - string=YAML: string map with arbitrary values defined by dedicated assignments - string=string: string map defined by dedicated assignments + - string=string,string: string map defined by dedicated assignment of comma separated strings #### Uploader Descriptor diff --git a/docs/pluginreference/plugin_valueset_compose.md b/docs/pluginreference/plugin_valueset_compose.md index d7466f9d9f..0ad1025ed4 100644 --- a/docs/pluginreference/plugin_valueset_compose.md +++ b/docs/pluginreference/plugin_valueset_compose.md @@ -40,28 +40,36 @@ The following predefined option types can be used: - accessRegistry: [*string*] registry base URL - accessRepository: [*string*] repository URL - accessVersion: [*string*] version for access specification + - body: [*string*] body of a http request - bucket: [*string*] bucket name - comment: [*string*] comment field value - commit: [*string*] git commit id - digest: [*string*] blob digest - globalAccess: [*map[string]YAML*] access specification for global access + - header: [*string:string,string*] http headers - hint: [*string*] (repository) hint for local artifacts - mediaType: [*string*] media type for artifact blob representation + - noredirect: [*bool*] http redirect behavior - reference: [*string*] reference name - region: [*string*] region name - size: [*int*] blob size + - url: [*string*] artifact or server url + - verb: [*string*] http request method The following predefined value types are supported: - YAML: JSON or YAML document string + - []byte: byte value - []string: list of string values - bool: boolean flag - int: integer value - map[string]YAML: JSON or YAML map - string: string value + - string:string,string: string map defined by dedicated assignment of comma separated strings - string=YAML: string map with arbitrary values defined by dedicated assignments - string=string: string map defined by dedicated assignments + - string=string,string: string map defined by dedicated assignment of comma separated strings ### SEE ALSO diff --git a/docs/reference/ocm.md b/docs/reference/ocm.md index 3046ee8c66..d2e3a12be2 100644 --- a/docs/reference/ocm.md +++ b/docs/reference/ocm.md @@ -29,9 +29,9 @@ ocm [] ... ### Description -The Open Component Model command line client support the work with OCM +The Open Component Model command line client supports the work with OCM artifacts, like Component Archives, Common Transport Archive, -Component Repositories, and component versions. +Component Repositories, and Component Versions. Additionally it provides some limited support for the docker daemon, OCI artifacts and registries. diff --git a/docs/reference/ocm_add_routingslips.md b/docs/reference/ocm_add_routingslips.md index ce8478ffa4..dd10010bf6 100644 --- a/docs/reference/ocm_add_routingslips.md +++ b/docs/reference/ocm_add_routingslips.md @@ -97,10 +97,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_bootstrap_configuration.md b/docs/reference/ocm_bootstrap_configuration.md index e7609ec4cb..142e8d2202 100644 --- a/docs/reference/ocm_bootstrap_configuration.md +++ b/docs/reference/ocm_bootstrap_configuration.md @@ -78,10 +78,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_bootstrap_package.md b/docs/reference/ocm_bootstrap_package.md index ed44d538b5..bef6e13a14 100644 --- a/docs/reference/ocm_bootstrap_package.md +++ b/docs/reference/ocm_bootstrap_package.md @@ -159,10 +159,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_check_componentversions.md b/docs/reference/ocm_check_componentversions.md index 66af32da98..db42cf0858 100644 --- a/docs/reference/ocm_check_componentversions.md +++ b/docs/reference/ocm_check_componentversions.md @@ -66,10 +66,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_describe_artifacts.md b/docs/reference/ocm_describe_artifacts.md index 218a74ba85..5c5728682a 100644 --- a/docs/reference/ocm_describe_artifacts.md +++ b/docs/reference/ocm_describe_artifacts.md @@ -60,6 +60,7 @@ linked library can be used: - DockerDaemon: v1 - Empty: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_describe_package.md b/docs/reference/ocm_describe_package.md index 60eb15f23a..1790bd2a77 100644 --- a/docs/reference/ocm_describe_package.md +++ b/docs/reference/ocm_describe_package.md @@ -69,10 +69,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_download_artifacts.md b/docs/reference/ocm_download_artifacts.md index c2a2e85abe..101dea7314 100644 --- a/docs/reference/ocm_download_artifacts.md +++ b/docs/reference/ocm_download_artifacts.md @@ -62,6 +62,7 @@ linked library can be used: - DockerDaemon: v1 - Empty: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_download_cli.md b/docs/reference/ocm_download_cli.md index fc7a0ee462..01dc462c08 100644 --- a/docs/reference/ocm_download_cli.md +++ b/docs/reference/ocm_download_cli.md @@ -76,10 +76,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_download_componentversions.md b/docs/reference/ocm_download_componentversions.md index 82487f63b6..de66681659 100644 --- a/docs/reference/ocm_download_componentversions.md +++ b/docs/reference/ocm_download_componentversions.md @@ -65,10 +65,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_download_resources.md b/docs/reference/ocm_download_resources.md index b48beb3071..2754454a4f 100644 --- a/docs/reference/ocm_download_resources.md +++ b/docs/reference/ocm_download_resources.md @@ -101,10 +101,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_get_artifacts.md b/docs/reference/ocm_get_artifacts.md index 2eb9447cb9..a1f370c2c9 100644 --- a/docs/reference/ocm_get_artifacts.md +++ b/docs/reference/ocm_get_artifacts.md @@ -60,6 +60,7 @@ linked library can be used: - DockerDaemon: v1 - Empty: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_get_componentversions.md b/docs/reference/ocm_get_componentversions.md index 3f33d7d644..8d225c75b9 100644 --- a/docs/reference/ocm_get_componentversions.md +++ b/docs/reference/ocm_get_componentversions.md @@ -75,10 +75,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_get_references.md b/docs/reference/ocm_get_references.md index aaf24e7728..0807414767 100644 --- a/docs/reference/ocm_get_references.md +++ b/docs/reference/ocm_get_references.md @@ -76,10 +76,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_get_resources.md b/docs/reference/ocm_get_resources.md index cf9ef134d3..8abddf2f05 100644 --- a/docs/reference/ocm_get_resources.md +++ b/docs/reference/ocm_get_resources.md @@ -76,10 +76,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_get_routingslips.md b/docs/reference/ocm_get_routingslips.md index 518d9d3c0c..d0adb0de32 100644 --- a/docs/reference/ocm_get_routingslips.md +++ b/docs/reference/ocm_get_routingslips.md @@ -75,10 +75,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_get_sources.md b/docs/reference/ocm_get_sources.md index f3bc6f3c1f..51b4bfe545 100644 --- a/docs/reference/ocm_get_sources.md +++ b/docs/reference/ocm_get_sources.md @@ -76,10 +76,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_hash_componentversions.md b/docs/reference/ocm_hash_componentversions.md index 7999825f90..f9fd49fc13 100644 --- a/docs/reference/ocm_hash_componentversions.md +++ b/docs/reference/ocm_hash_componentversions.md @@ -109,10 +109,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_install_plugins.md b/docs/reference/ocm_install_plugins.md index 5e27180a96..72777db8db 100644 --- a/docs/reference/ocm_install_plugins.md +++ b/docs/reference/ocm_install_plugins.md @@ -68,10 +68,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_oci-references.md b/docs/reference/ocm_oci-references.md index c29d9b2404..b317192bfa 100644 --- a/docs/reference/ocm_oci-references.md +++ b/docs/reference/ocm_oci-references.md @@ -11,27 +11,98 @@ images are possible:
    [+][<type>::][./][<file path>//<repository>[:<tag>][@<digest>]
    - or -
    [<type>::][<json repo spec>//]<repository>[:<tag>][@<digest>]
    - or -
    [<type>::][<scheme>:://]<domain>[:<port>/]<repository>[:<tag>][@<digest>]
    - or +
    + +or + +
    +
    [+][<type>::][<json repo spec>//]<repository>[:<tag>][@<digest>]
    +
    + +Notice that if you specify the <type> in the beginning of this +notation AND in the <json repo spec>, the types have to match +(but there is no reason to specify the type in both places). + +or + +
    +
    [+][<type>::][<scheme>://]<domain>[:<port>][/]/<repository>[:<tag>][@<digest>]
    +
    + +Notice that this notation optionally also allows a double slash to +seperate <domain>[:<port>] and <repository>. While it is +not necessary for unambiguous parsing here, it is supported for +consistency with the other notations. + +or + +
    +
    [+][<type>::][<scheme>://]<host>:<port>/<repository>[:<tag>][@<digest>]
    +
    + +Notice that <port> is required in this notation. Without <port>, +this notation would be ambiguous with the docker library notation +mentioned below. + +or + +
    +
    [+][<type>::][<scheme>://]<host>[:<port>]//<repository>[:<tag>][@<digest>]
    +
    + +Notice the double slash (//) before the <repository>. This serves as +a clear separator between <host>[:<port>] and <repository>. +Thus, with this notation, the port is optional and can therefore be +omitted without creating ambiguity with the docker library notation +mentioned below. + +or + +
    <docker library>[:<tag>][@<digest>]
    - or +
    + +or + +
    <docker repository>/<docker image>[:<tag>][@<digest>]
    +--- + Besides dedicated artifacts it is also possible to denote registries as a whole:
    -
    [+][<type>::][<scheme>:://]<domain>[:<port>]
    - or -
    [+][<type>::]<json repo spec>
    - or -
    [+][<type>::][./]<file path>
    +
    [+][<type>::][./]<file path>
    +
    + +or + +
    +
    [+][<type>::]<json repo spec>
    +
    + +Notice that if you specify the <type> in the beginning of this +notation AND in the <json repo spec>, the types have to match +(but there is no reason to specify the type in both places). + +or + +
    +
    [+][<type>::][<scheme>://]<domain>[:<port>]
    +
    + +or + +
    +
    [+][<type>::][<scheme>://]<host>[:<port>]
    +Notice that <port> is optional in this notation since this cannot be +an image reference and therefore cannot be ambiguous with the docker +library notation. + The optional + is used for file based implementations (Common Transport Format) to indicate the creation of a not yet existing file. @@ -42,7 +113,21 @@ character. The following formats are supported: directory, ta ### Examples ``` -ghcr.io/mandelsoft/cnudie:1.0.0 ++ctf+directory::./ocm/ctf//ocm.software/ocmcli/ocmcli-image:0.7.0@sha256:29c842be1ef1da67f6a1c07a3a3a8eb101bbcc4c80f174b87d147b341bca9625 + +oci::{"baseUrl": "ghcr.io"}//open-component-model/ocm/ocm.software/ocmcli/ocmcli-image:0.7.0@sha256:29c842be1ef1da67f6a1c07a3a3a8eb101bbcc4c80f174b87d147b341bca9625 + +oci::https://ghcr.io/open-component-model/ocm/ocm.software/ocmcli/ocmcli-image:0.7.0@sha256:29c842be1ef1da67f6a1c07a3a3a8eb101bbcc4c80f174b87d147b341bca9625 +oci::https://ghcr.io//open-component-model/ocm/ocm.software/ocmcli/ocmcli-image:0.7.0@sha256:29c842be1ef1da67f6a1c07a3a3a8eb101bbcc4c80f174b87d147b341bca9625 + +oci::http://localhost:8080/ocm.software/ocmcli/ocmcli-image:0.7.0@sha256:29c842be1ef1da67f6a1c07a3a3a8eb101bbcc4c80f174b87d147b341bca9625 +oci::http://localhost:8080//ocm.software/ocmcli/ocmcli-image:0.7.0@sha256:29c842be1ef1da67f6a1c07a3a3a8eb101bbcc4c80f174b87d147b341bca9625 + +ubuntu:24.04 +ubuntu + +tensorflow/tensorflow:2.15.0 +tensorflow/tensorflow ``` ### SEE ALSO diff --git a/docs/reference/ocm_ocm-references.md b/docs/reference/ocm_ocm-references.md index 28e2e37c64..9b486b596e 100644 --- a/docs/reference/ocm_ocm-references.md +++ b/docs/reference/ocm_ocm-references.md @@ -9,25 +9,54 @@ references to any registry supported by the OCM toolset that can host OCM components:
    -
    [+][<type>::][./][<file path>//<component id>[:<version>]
    - or -
    [+][<type>::]<domain>[:<port>][/<repository prefix>]//<component id>[:<version]
    - or -
    [<type>::][<json repo spec>//]<component id>[:<version>]
    +
    [+][<type>::][./]<file path>//<component id>[:<version>]
    +
    + +or + +
    +
    [+][<type>::][<json repo spec>//]<component id>[:<version>]
    +
    + +or + +
    +
    [+][<type>::][<scheme>://]<domain>[:<port>][/<repository prefix>]//<component id>[:<version]
    +
    +or + +
    +
    [+][<type>::][<scheme>://]<host>[:<port>][/<repository prefix>]//<component id>[:<version]
    +--- + Besides dedicated components it is also possible to denote repositories as a whole:
    -
    [+][<type>::][<scheme>:://]<domain>[:<port>][/<repository prefix>]
    - or -
    [+][<type>::]<json repo spec>
    - or
    [+][<type>::][./]<file path>
    +or + +
    +
    [+][<type>::]<json repo spec>
    +
    + +or + +
    +
    [+][<type>::][<scheme>://]<domain>[:<port>][/<repository prefix>]
    +
    + +or + +
    +
    [+][<type>::][<scheme>://]<host>[:<port>][/<repository prefix>]
    +
    + The optional + is used for file based implementations (Common Transport Format) to indicate the creation of a not yet existing file. @@ -38,9 +67,13 @@ character. The following formats are supported: directory, ta ### Examples ``` -ghcr.io/mandelsoft/cnudie//github.com/mandelsoft/pause:1.0.0 ++ctf+directory::./ocm/ctf//ocm.software/ocmcli:0.7.0 + +oci::{"baseUrl":"ghcr.io","componentNameMapping":"urlPath","subPath":"open-component-model"}//ocm.software/ocmcli.0.7.0 + +oci::https://ghcr.io:443/open-component-model//ocm.software/ocmcli:0.7.0 -ctf+tgz::./ctf +oci::http://localhost:8080/local-component-repository//ocm.software/ocmcli:0.7.0 ``` ### SEE ALSO diff --git a/docs/reference/ocm_show_tags.md b/docs/reference/ocm_show_tags.md index 886ee7a49f..3fd0a36d29 100644 --- a/docs/reference/ocm_show_tags.md +++ b/docs/reference/ocm_show_tags.md @@ -52,6 +52,7 @@ linked library can be used: - DockerDaemon: v1 - Empty: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_show_versions.md b/docs/reference/ocm_show_versions.md index 344a20baff..309f09b1e0 100644 --- a/docs/reference/ocm_show_versions.md +++ b/docs/reference/ocm_show_versions.md @@ -62,10 +62,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_sign_componentversions.md b/docs/reference/ocm_sign_componentversions.md index f349615e29..a19b73c505 100644 --- a/docs/reference/ocm_sign_componentversions.md +++ b/docs/reference/ocm_sign_componentversions.md @@ -84,10 +84,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_transfer_artifacts.md b/docs/reference/ocm_transfer_artifacts.md index b650382015..3a57c7b4f2 100644 --- a/docs/reference/ocm_transfer_artifacts.md +++ b/docs/reference/ocm_transfer_artifacts.md @@ -71,6 +71,7 @@ linked library can be used: - DockerDaemon: v1 - Empty: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_transfer_componentversions.md b/docs/reference/ocm_transfer_componentversions.md index cbbae63fe8..5e75f7db5b 100644 --- a/docs/reference/ocm_transfer_componentversions.md +++ b/docs/reference/ocm_transfer_componentversions.md @@ -87,10 +87,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_verify_componentversions.md b/docs/reference/ocm_verify_componentversions.md index e34ae26685..08997e38ef 100644 --- a/docs/reference/ocm_verify_componentversions.md +++ b/docs/reference/ocm_verify_componentversions.md @@ -81,10 +81,12 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 + - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 + - ctf: v1 - oci: v1 - ociRegistry diff --git a/pkg/cobrautils/logopts/options.go b/pkg/cobrautils/logopts/options.go index 85058baa07..5af9483f5f 100644 --- a/pkg/cobrautils/logopts/options.go +++ b/pkg/cobrautils/logopts/options.go @@ -87,7 +87,7 @@ func (o *Options) Configure(ctx ocm.Context, logctx logging.Context) error { } logctx.SetDefaultLevel(l) } else { - logctx.SetDefaultLevel(logging.ErrorLevel) + logctx.SetDefaultLevel(logging.WarnLevel) } logcfg := &config.Config{DefaultLevel: logging.LevelName(logctx.GetDefaultLevel())} diff --git a/pkg/contexts/oci/grammar/grammar.go b/pkg/contexts/oci/grammar/grammar.go index e949574f11..09990802b6 100644 --- a/pkg/contexts/oci/grammar/grammar.go +++ b/pkg/contexts/oci/grammar/grammar.go @@ -50,14 +50,14 @@ var ( // repository name components. RepositorySeparatorRegexp = Literal(RepositorySeparator) - // alphaNumericRegexp defines the alpha numeric atom, typically a + // AlphaNumericRegexp defines the alpha numeric atom, typically a // component of names. This only allows lower case characters and digits. AlphaNumericRegexp = Match(`[a-z0-9]+`) - // separatorRegexp defines the separators allowed to be embedded in name + // SeparatorRegexp defines the separators allowed to be embedded in name // components. This allow one period, one or two underscore and multiple // dashes. - separatorRegexp = Match(`(?:[._]|__|[-]*)`) + SeparatorRegexp = Match(`(?:[._]|__|[-]*)`) // dockerOrgSeparatorRegexp defines the separators allowed to be // embedded in a docker organization name. @@ -76,7 +76,7 @@ var ( // separated by one period, one or two underscore and multiple dashes. NameComponentRegexp = Sequence( AlphaNumericRegexp, - Optional(Repeated(separatorRegexp, AlphaNumericRegexp))) + Optional(Repeated(SeparatorRegexp, AlphaNumericRegexp))) // DomainComponentRegexp restricts the registry domain component of a // repository name to start with a component as defined by DomainPortRegexp @@ -85,6 +85,10 @@ var ( IPRegexp = Sequence(Match("[0-9]+"), Literal(`.`), Match("[0-9]+"), Literal(`.`), Match("[0-9]+"), Literal(`.`), Match("[0-9]+")) + SchemeRegexp = Sequence(Capture(Match("[a-z]+")), Literal(`://`)) + + AnchoredSchemedRegexp = Anchored(Optional(SchemeRegexp), Capture(Match(".*"))) + // DomainRegexp defines the structure of potential domain components // that may be part of image names. This is purposely a subset of what is // allowed by DNS to ensure backwards compatibility with Docker image @@ -101,11 +105,48 @@ var ( DomainRegexp, Optional(Literal(`:`), Match(`[0-9]+`))) + // SchemeDomainPortRegexp defines the structure of potential domain components + // that may be part of image names. This is purposely a subset of what is + // allowed by DNS to ensure backwards compatibility with Docker image + // names followed by an optional port part. + SchemeDomainPortRegexp = Sequence( + Optional(SchemeRegexp), + Capture(DomainPortRegexp)) + // HostPortRegexp describes a non-DNS simple hostname like localhost. HostPortRegexp = Sequence( Or(DomainComponentRegexp, IPRegexp), Optional(Literal(`:`), Match(`[0-9]+`))) + // SchemedHostPortRegexp describes a non-DNS simple hostname with scheme like https://localhost. + SchemedHostPortRegexp = Sequence( + SchemeRegexp, + Capture(HostPortRegexp)) + + SchemeHostPortRegexp = Sequence( + Optional(SchemeRegexp), + Capture(ReqHostPortRegexp)) + + // SchemedHostPortArtifactRegexp describes a non-DNS simple hostname with scheme like https://localhost/repository:1.0.0 with the scheme being required. + AnchoredTypedSchemedHostPortArtifactRegexp = Anchored(Sequence( + Optional(Capture(TypeRegexp), Literal("::")), + Optional(SchemeRegexp), + Capture(Or(HostPortRegexp, DomainPortRegexp)), + Literal("/"), + Literal("/"), + CapturedArtifactVersionRegexp)) + + ReqHostPortRegexp = Sequence( + Or(DomainComponentRegexp, IPRegexp), + Literal(`:`), Match(`[0-9]+`)) + + AnchoredTypedOptSchemedReqHostReqPortArtifactRegexp = Anchored( + Optional(Capture(TypeRegexp), Literal("::")), + Optional(SchemeRegexp), + Capture(ReqHostPortRegexp), + Match(RepositorySeparator), + Optional(CapturedArtifactVersionRegexp)) + PathRegexp = Sequence( Optional(Literal("/")), Match(`[a-zA-Z0-9-_.]+(?:/[a-zA-Z0-9-_.]+)+`)) @@ -124,7 +165,7 @@ var ( // DigestRegexp matches valid digests. DigestRegexp = Match(`[A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}`) - // RepositoryRegexp is the format of a repository ppart of references. + // RepositoryRegexp is the format of a repository part of references. RepositoryRegexp = Sequence( NameComponentRegexp, Optional(Repeated(RepositorySeparatorRegexp, NameComponentRegexp))) diff --git a/pkg/contexts/oci/internal/context.go b/pkg/contexts/oci/internal/context.go index 6013260894..2fd458db76 100644 --- a/pkg/contexts/oci/internal/context.go +++ b/pkg/contexts/oci/internal/context.go @@ -38,6 +38,7 @@ type Context interface { RepositoryForSpec(spec RepositorySpec, creds ...credentials.CredentialsSource) (Repository, error) RepositoryForConfig(data []byte, unmarshaler runtime.Unmarshaler, creds ...credentials.CredentialsSource) (Repository, error) + RepositorySpecForConfig(data []byte, unmarshaler runtime.Unmarshaler) (RepositorySpec, error) GetAlias(name string) RepositorySpec SetAlias(name string, spec RepositorySpec) diff --git a/pkg/contexts/oci/internal/uniform.go b/pkg/contexts/oci/internal/uniform.go index 24a8f39ad8..ad4a204bb5 100644 --- a/pkg/contexts/oci/internal/uniform.go +++ b/pkg/contexts/oci/internal/uniform.go @@ -11,9 +11,11 @@ import ( "strings" "sync" + "github.com/containerd/containerd/reference" "github.com/sirupsen/logrus" "golang.org/x/exp/slices" + "github.com/open-component-model/ocm/pkg/contexts/oci/grammar" "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) @@ -84,21 +86,34 @@ func (u *UniformRepositorySpec) RepositoryRef() string { return fmt.Sprintf("%s%s://%s", t, u.Scheme, u.Host) } +func (u *UniformRepositorySpec) SetType(typ string) { + t, _ := grammar.SplitTypeSpec(typ) + u.Type = t + u.TypeHint = typ +} + func (u *UniformRepositorySpec) String() string { return u.RepositoryRef() } func UniformRepositorySpecForHostURL(typ string, host string) *UniformRepositorySpec { - scheme := "" - parsed, err := url.Parse(host) + s := "" + h := host + var parsed *url.URL + ref, err := reference.Parse(host) + if err == nil { + parsed, err = url.Parse("https://" + ref.Locator) + } else { + parsed, err = url.Parse(host) + } if err == nil { - host = parsed.Host - scheme = parsed.Scheme + s = parsed.Scheme + h = parsed.Host } u := &UniformRepositorySpec{ Type: typ, - Scheme: scheme, - Host: host, + Scheme: s, + Host: h, } return u } @@ -168,6 +183,14 @@ func (s *specHandlers) MapUniformRepositorySpec(ctx Context, u *UniformRepositor defer s.lock.RUnlock() deferr := errors.ErrNotSupported("uniform repository ref", u.String()) + if u.Info != "" && string(u.Info[0]) == "{" && u.Host == "" && u.Scheme == "" { + data, err := runtime.CompleteSpecWithType(u.Type, []byte(u.Info)) + if err != nil { + return nil, err + } + return ctx.RepositorySpecForConfig(data, runtime.DefaultJSONEncoding) + } + if u.Type == "" { if u.Info != "" { spec := ctx.GetAlias(u.Info) diff --git a/pkg/contexts/oci/ref.go b/pkg/contexts/oci/ref.go index 24500d5faf..764058884a 100644 --- a/pkg/contexts/oci/ref.go +++ b/pkg/contexts/oci/ref.go @@ -23,37 +23,30 @@ const ( KIND_ARETEFACT_REFERENCE = "artifact reference" ) -// ParseRepo parses a standard oci repository reference into a internal representation. +// ParseRepo parses a standard oci repository reference into an internal representation. func ParseRepo(ref string) (UniformRepositorySpec, error) { create := false if strings.HasPrefix(ref, "+") { create = true ref = ref[1:] } + uspec := UniformRepositorySpec{} match := grammar.AnchoredRegistryRegexp.FindSubmatch([]byte(ref)) if match == nil { match = grammar.AnchoredGenericRegistryRegexp.FindSubmatch([]byte(ref)) if match == nil { - return UniformRepositorySpec{}, errors.ErrInvalid(KIND_OCI_REFERENCE, ref) + return uspec, errors.ErrInvalid(KIND_OCI_REFERENCE, ref) } - h := string(match[1]) - t, _ := grammar.SplitTypeSpec(h) - return UniformRepositorySpec{ - Type: t, - TypeHint: h, - Info: string(match[2]), - CreateIfMissing: create, - }, nil + uspec.SetType(string(match[1])) + uspec.Info = string(match[2]) + uspec.CreateIfMissing = create + return uspec, nil } - h := string(match[1]) - t, _ := grammar.SplitTypeSpec(h) - return UniformRepositorySpec{ - Type: t, - TypeHint: h, - Scheme: string(match[2]), - Host: string(match[3]), - CreateIfMissing: create, - }, nil + uspec.SetType(string(match[1])) + uspec.Scheme = string(match[2]) + uspec.Host = string(match[3]) + uspec.CreateIfMissing = create + return uspec, nil } // RefSpec is a go internal representation of an oci reference. @@ -87,10 +80,30 @@ func ParseRef(ref string) (RefSpec, error) { } spec := RefSpec{UniformRepositorySpec: UniformRepositorySpec{CreateIfMissing: create}} + match := grammar.AnchoredTypedSchemedHostPortArtifactRegexp.FindSubmatch([]byte(ref)) + if match != nil { + spec.SetType(string(match[1])) + spec.Scheme = string(match[2]) + spec.Host = string(match[3]) + spec.Repository = string(match[4]) + spec.Tag = pointer(match[5]) + spec.Digest = dig(match[6]) + return spec, nil + } - match := grammar.FileReferenceRegexp.FindSubmatch([]byte(ref)) + match = grammar.AnchoredTypedOptSchemedReqHostReqPortArtifactRegexp.FindSubmatch([]byte(ref)) + if match != nil { + spec.SetType(string(match[1])) + spec.Scheme = string(match[2]) + spec.Host = string(match[3]) + spec.Repository = string(match[4]) + spec.Tag = pointer(match[5]) + spec.Digest = dig(match[6]) + return spec, nil + } + match = grammar.FileReferenceRegexp.FindSubmatch([]byte(ref)) if match != nil { - spec.Type = string(match[1]) + spec.SetType(string(match[1])) spec.Info = string(match[2]) spec.Repository = string(match[3]) spec.Tag = pointer(match[4]) @@ -124,7 +137,7 @@ func ParseRef(ref string) (RefSpec, error) { } match = grammar.TypedReferenceRegexp.FindSubmatch([]byte(ref)) if match != nil { - spec.Type = string(match[1]) + spec.SetType(string(match[1])) spec.Scheme = string(match[2]) spec.Host = string(match[3]) spec.Repository = string(match[4]) @@ -134,7 +147,7 @@ func ParseRef(ref string) (RefSpec, error) { } match = grammar.TypedURIRegexp.FindSubmatch([]byte(ref)) if match != nil { - spec.Type = string(match[1]) + spec.SetType(string(match[1])) spec.Scheme = string(match[2]) spec.Host = string(match[3]) spec.Repository = string(match[4]) @@ -144,7 +157,7 @@ func ParseRef(ref string) (RefSpec, error) { } match = grammar.TypedGenericReferenceRegexp.FindSubmatch([]byte(ref)) if match != nil { - spec.Type = string(match[1]) + spec.SetType(string(match[1])) spec.Info = string(match[2]) spec.Repository = string(match[3]) spec.Tag = pointer(match[4]) @@ -153,7 +166,7 @@ func ParseRef(ref string) (RefSpec, error) { } match = grammar.AnchoredRegistryRegexp.FindSubmatch([]byte(ref)) if match != nil { - spec.Type = string(match[1]) + spec.SetType(string(match[1])) spec.Info = string(match[2]) spec.Repository = string(match[3]) spec.Tag = pointer(match[4]) @@ -163,7 +176,7 @@ func ParseRef(ref string) (RefSpec, error) { match = grammar.AnchoredGenericRegistryRegexp.FindSubmatch([]byte(ref)) if match != nil { - spec.Type = string(match[1]) + spec.SetType(string(match[1])) spec.Info = string(match[2]) match = grammar.ErrorCheckRegexp.FindSubmatch([]byte(ref)) diff --git a/pkg/contexts/oci/ref_test.go b/pkg/contexts/oci/ref_test.go index 3dc52f38b2..b0c8d1977f 100644 --- a/pkg/contexts/oci/ref_test.go +++ b/pkg/contexts/oci/ref_test.go @@ -5,14 +5,85 @@ package oci_test import ( + "strings" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/testutils" - "github.com/opencontainers/go-digest" + godigest "github.com/opencontainers/go-digest" + "github.com/open-component-model/ocm/pkg/common/accessio" + "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/oci" + "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ctf" + "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ocireg" + "github.com/open-component-model/ocm/pkg/runtime" ) +func Type(t string) string { + if t == "" { + return t + } + return t + "::" +} +func FileFormat(t, f string) string { + if t == "" { + return f + } + if f == "" { + return t + } + return t + "+" + f +} +func FileType(t, f string) string { + if t != "" { + return t + } else { + return f + } +} +func Scheme(s string) string { + if s == "" { + return s + } + return s + "://" +} +func Sub(t string) string { + if t == "" { + return t + } + return "/" + t +} +func Vers(t, d string) string { + if t == "" && d == "" { + return "" + } + if t == "" { + return "@" + d + } + if d == "" { + return ":" + t + } + return ":" + t + "@" + d +} + +func Dig(b []byte) *godigest.Digest { + if len(b) == 0 { + return nil + } + s := godigest.Digest(b) + return &s +} + +func Pointer(b []byte) *string { + if len(b) == 0 { + return nil + } + s := string(b) + return &s +} + func CheckRef(ref string, exp *oci.RefSpec) { spec, err := oci.ParseRef(ref) if exp == nil { @@ -34,12 +105,460 @@ func CheckRepo(ref string, exp *oci.UniformRepositorySpec) { } var _ = Describe("ref parsing", func() { - digest := digest.Digest("sha256:3d05e105e350edf5be64fe356f4906dd3f9bf442a279e4142db9879bba8e677a") + digest := godigest.Digest("sha256:3d05e105e350edf5be64fe356f4906dd3f9bf442a279e4142db9879bba8e677a") tag := "v1" ghcr := oci.UniformRepositorySpec{Host: "ghcr.io"} docker := oci.UniformRepositorySpec{Host: "docker.io"} + Context("parse file path refs", func() { + t := "ctf" + p := "file/path" + r := "github.com/mandelsoft/ocm" + v := "v1" + d := "sha256:3d05e105e350edf5be64fe356f4906dd3f9bf442a279e4142db9879bba8e677a" + + Context("[+][::][./][//[:]", func() { + for _, cm := range []string{"", "+"} { + for _, ut := range []string{"", t} { + for _, uf := range []string{"", "directory", "tar", "tgz"} { + for _, up := range []string{p, "./" + p} { + for _, uv := range []string{"", v, v + ".1.1", v + "-rc.1", v + ".1.2-rc.1"} { + for _, ud := range []string{"", d} { + ref := cm + Type(FileFormat(ut, uf)) + up + "//" + r + Vers(uv, ud) + ut, uf, uv, up, ud := ut, uf, uv, up, ud + + // tests parsing of all permutations of + // [+][::][./][//[:][@] + It("parses ref "+ref, func() { + CheckRef(ref, &oci.RefSpec{ + UniformRepositorySpec: oci.UniformRepositorySpec{ + Type: FileType(ut, uf), + Scheme: "", + Host: "", + Info: up, + CreateIfMissing: ref[0] == '+', + TypeHint: FileFormat(ut, uf), + }, + ArtSpec: oci.ArtSpec{ + Repository: r, + Tag: Pointer([]byte(uv)), + Digest: Dig([]byte(ud)), + }, + }) + }) + } + } + } + } + } + } + }) + }) + + Context("parse domain refs", func() { + t := "oci" + h := "ghcr.io" + r := "github.com/mandelsoft/ocm" + v := "v1" + d := "sha256:3d05e105e350edf5be64fe356f4906dd3f9bf442a279e4142db9879bba8e677a" + + // Notice that the file formats (directory, tar, tgz) CAN BE PARSED in this notation, BUT for non file based + // implementations like oci, this information is not used. + Context("[+][::][://][:][/]/[:][@]", func() { + for _, cm := range []string{"", "+"} { + for _, ut := range []string{"", t} { + for _, uf := range []string{"", "directory", "tar", "tgz"} { + for _, ush := range []string{"", "http", "https"} { + for _, uh := range []string{h, h + ":3030"} { + for _, uv := range []string{"", v, v + ".1.1", v + "-rc.1", v + ".1.2-rc.1"} { + for _, ud := range []string{"", d} { + for _, sep := range []string{"/", "//"} { + ref := cm + Type(FileFormat(ut, uf)) + Scheme(ush) + uh + sep + r + Vers(uv, ud) + ut, uf, ush, uh, uv, ud := ut, uf, ush, uh, uv, ud + + // tests parsing of all permutations of + // [::][://][:][/]/[:][@] + It("parses ref "+ref, func() { + CheckRef(ref, &oci.RefSpec{ + UniformRepositorySpec: oci.UniformRepositorySpec{ + Type: FileType(ut, uf), + Scheme: ush, + Host: uh, + Info: "", + CreateIfMissing: ref[0] == '+', + TypeHint: FileFormat(ut, uf), + }, + ArtSpec: oci.ArtSpec{ + Repository: r, + Tag: Pointer([]byte(uv)), + Digest: Dig([]byte(ud)), + }, + }) + }) + } + } + } + } + } + } + } + } + }) + + It("repository creation from parsed repo", func() { + ctx := oci.New() + aliasreg := ocireg.NewRepositorySpec("http://ghcr.io") + ctx.SetAlias("myalias", aliasreg) + repo := Must(oci.ParseRef("myalias//repository:1.0.0")) + spec := Must(ctx.MapUniformRepositorySpec(&repo.UniformRepositorySpec)) + Expect(spec).To(Equal(aliasreg)) + }) + }) + + Context("parse host port refs", func() { + t := "oci" + h := "localhost" + r := "github.com/mandelsoft/ocm" + v := "v1" + d := "sha256:3d05e105e350edf5be64fe356f4906dd3f9bf442a279e4142db9879bba8e677a" + + // localhost (with and without port) (and other host names) are a special case since these are not formally + // valid domains + // the combination of this test and the test below test parsing of all permutations of + // [::][://]:/[:][@] + Context("[+][::][://]:/[:][@]", func() { + for _, cm := range []string{"", "+"} { + for _, ut := range []string{"", t} { + for _, uf := range []string{"", "directory", "tar", "tgz"} { + for _, ush := range []string{"", "http", "https"} { + for _, uh := range []string{h + ":3030"} { + for _, uv := range []string{"", v, v + ".1.1", v + "-rc.1", v + ".1.2-rc.1"} { + for _, ud := range []string{"", d} { + ref := cm + Type(FileFormat(ut, uf)) + Scheme(ush) + uh + "/" + r + Vers(uv, ud) + ut, uf, ush, uh, uv, ud := ut, uf, ush, uh, uv, ud + + // tests parsing of all permutations of + // [::][://]:/[:][@] + It("parses ref "+ref, func() { + CheckRef(ref, &oci.RefSpec{ + UniformRepositorySpec: oci.UniformRepositorySpec{ + Type: FileType(ut, uf), + Scheme: ush, + Host: uh, + Info: "", + CreateIfMissing: ref[0] == '+', + TypeHint: FileFormat(ut, uf), + }, + ArtSpec: oci.ArtSpec{ + Repository: r, + Tag: Pointer([]byte(uv)), + Digest: Dig([]byte(ud)), + }, + }) + }) + } + } + } + } + } + } + } + }) + Context("[+][::][://][:]//[:][@]", func() { + for _, cm := range []string{"", "+"} { + for _, ut := range []string{"", t} { + for _, uf := range []string{"", "directory", "tar", "tgz"} { + for _, ush := range []string{"", "http", "https"} { + for _, uh := range []string{h, h + ":3030"} { + for _, uv := range []string{"", v, v + ".1.1", v + "-rc.1", v + ".1.2-rc.1"} { + for _, ud := range []string{"", d} { + ref := cm + Type(FileFormat(ut, uf)) + Scheme(ush) + uh + "//" + r + Vers(uv, ud) + ut, uf, ush, uh, uv, ud := ut, uf, ush, uh, uv, ud + + // tests parsing of all permutations of + // [::][://][:]//[:][@] + It("parses ref "+ref, func() { + CheckRef(ref, &oci.RefSpec{ + UniformRepositorySpec: oci.UniformRepositorySpec{ + Type: FileType(ut, uf), + Scheme: ush, + Host: uh, + Info: "", + CreateIfMissing: ref[0] == '+', + TypeHint: FileFormat(ut, uf), + }, + ArtSpec: oci.ArtSpec{ + Repository: r, + Tag: Pointer([]byte(uv)), + Digest: Dig([]byte(ud)), + }, + }) + }) + } + } + } + } + } + } + } + }) + }) + + Context("parse json repo spec refs", func() { + t := "oci" + h := "ghcr.io" + r := "github.com/mandelsoft/ocm" + v := "v1" + d := "sha256:3d05e105e350edf5be64fe356f4906dd3f9bf442a279e4142db9879bba8e677a" + + repospec := ocireg.NewRepositorySpec(h) + jsonrepospec := string(Must(runtime.DefaultJSONEncoding.Marshal(repospec))) + + // Notice that the file formats (directory, tar, tgz) CAN BE PARSED in this notation, BUT for non file based + // implementations like oci, this information is not used. + Context("[+][::][//][:][@]", func() { + for _, cm := range []string{"", "+"} { + for _, ut := range []string{"", t} { + for _, uf := range []string{"", "directory", "tar", "tgz"} { + for _, uv := range []string{"", v, v + ".1.1", v + "-rc.1", v + ".1.2-rc.1"} { + for _, ud := range []string{"", d} { + ref := cm + Type(FileFormat(ut, uf)) + jsonrepospec + "//" + r + Vers(uv, ud) + ut, uf, uv, ud := ut, uf, uv, ud + + // tests parsing of all permutations of + // [::][//][:][@] + It("parses ref "+ref, func() { + CheckRef(ref, &oci.RefSpec{ + UniformRepositorySpec: oci.UniformRepositorySpec{ + Type: FileType(ut, uf), + Scheme: "", + Host: "", + Info: jsonrepospec, + CreateIfMissing: ref[0] == '+', + TypeHint: FileFormat(ut, uf), + }, + ArtSpec: oci.ArtSpec{ + Repository: r, + Tag: Pointer([]byte(uv)), + Digest: Dig([]byte(ud)), + }, + }) + }) + } + } + } + } + } + }) + }) + + Context("parse docker library refs", func() { + // h := "docker.io" + r := "ubuntu" + v := "v1" + d := "sha256:3d05e105e350edf5be64fe356f4906dd3f9bf442a279e4142db9879bba8e677a" + + Context("[:][@]", func() { + for _, uv := range []string{"", v, v + ".1.1", v + "-rc.1", v + ".1.2-rc.1"} { + for _, ud := range []string{"", d} { + ref := r + Vers(uv, ud) + uv, ud := uv, ud + + // tests parsing of all permutations of + // [:][@] + It("parses ref "+ref, func() { + CheckRef(ref, &oci.RefSpec{ + UniformRepositorySpec: oci.UniformRepositorySpec{ + Type: "", + Scheme: "", + Host: "docker.io", + Info: "", + CreateIfMissing: false, + TypeHint: "", + }, + ArtSpec: oci.ArtSpec{ + Repository: "library/" + r, + Tag: Pointer([]byte(uv)), + Digest: Dig([]byte(ud)), + }, + }) + }) + } + } + }) + }) + + Context("parse docker repository refs", func() { + // h := "docker.io" + r := "docker-repo/ubuntu" + v := "v1" + d := "sha256:3d05e105e350edf5be64fe356f4906dd3f9bf442a279e4142db9879bba8e677a" + + Context("/[:][@]", func() { + for _, uv := range []string{"", v, v + ".1.1", v + "-rc.1", v + ".1.2-rc.1"} { + for _, ud := range []string{"", d} { + ref := r + Vers(uv, ud) + uv, ud := uv, ud + + // tests parsing of all permutations of + // [:][@] + It("parses ref "+ref, func() { + CheckRef(ref, &oci.RefSpec{ + UniformRepositorySpec: oci.UniformRepositorySpec{ + Type: "", + Scheme: "", + Host: "docker.io", + Info: "", + CreateIfMissing: false, + TypeHint: "", + }, + ArtSpec: oci.ArtSpec{ + Repository: r, + Tag: Pointer([]byte(uv)), + Digest: Dig([]byte(ud)), + }, + }) + }) + } + } + }) + }) + + Context("parse file path repos", func() { + t := "ctf" + p := "file/path" + + Context("[+][::][./][", func() { + for _, cm := range []string{"", "+"} { + for _, ut := range []string{"", t} { + for _, uf := range []string{"", "directory", "tar", "tgz"} { + for _, up := range []string{p, "./" + p} { + ref := cm + Type(FileFormat(ut, uf)) + up + ut, uf, up := ut, uf, up + // tests parsing of all permutations of + // [+][::][./][//[:][@] + It("parses ref "+ref, func() { + CheckRepo(ref, &oci.UniformRepositorySpec{ + Type: FileType(ut, uf), + Scheme: "", + Host: "", + Info: up, + CreateIfMissing: ref[0] == '+', + TypeHint: FileFormat(ut, uf), + }) + }) + } + } + } + } + }) + }) + + Context("parse domain repos", func() { + t := "oci" + h := "ghcr.io" + + Context("[+][::][://][:]", func() { + for _, cm := range []string{"", "+"} { + for _, ut := range []string{"", t} { + for _, uf := range []string{"", "directory", "tar", "tgz"} { + for _, ush := range []string{"", "http", "https"} { + for _, uh := range []string{h, h + ":3030", "localhost", "localhost:3030"} { + ref := cm + Type(FileFormat(ut, uf)) + Scheme(ush) + uh + ut, uf, ush, uh := ut, uf, ush, uh + + // tests parsing of all permutations of + // [+][::][://][:] + It("parses ref "+ref, func() { + // if you are coming from the ocm test and + // wondering why the corresponding tests if + // has an additional condition that the + // type has to be empty - this is because + // the corresponding parse method calls + // an intermediate handler based on the + // type that resolves the localhost in the + // info. + // For oci repositories, such this + // handling is done in the + // MapUniformRepositorySpec logic. + if strings.HasPrefix(uh, "localhost") { + CheckRepo(ref, &oci.UniformRepositorySpec{ + Type: FileType(ut, uf), + Scheme: "", + Host: "", + Info: Scheme(ush) + uh, + CreateIfMissing: ref[0] == '+', + TypeHint: FileFormat(ut, uf), + }) + } else { + CheckRepo(ref, &oci.UniformRepositorySpec{ + Type: FileType(ut, uf), + Scheme: ush, + Host: uh, + Info: "", + CreateIfMissing: ref[0] == '+', + TypeHint: FileFormat(ut, uf), + }) + } + }) + } + } + } + } + } + }) + It("repository creation from parsed repo with localhost", func() { + ctx := oci.New() + repo := Must(oci.ParseRepo("http://localhost")) + spec := Must(ctx.MapUniformRepositorySpec(&repo)) + Expect(spec).To(Equal(ocireg.NewRepositorySpec("http://localhost"))) + }) + It("repository creation from parsed repo with localhost", func() { + ctx := oci.New() + + aliasreg := ocireg.NewRepositorySpec("http://ghcr.io") + ctx.SetAlias("myalias", aliasreg) + repo := Must(oci.ParseRepo("myalias")) + spec := Must(ctx.MapUniformRepositorySpec(&repo)) + Expect(spec).To(Equal(aliasreg)) + }) + }) + + Context("parse json repo spec refs", func() { + t := "oci" + h := "ghcr.io" + + repospec := ocireg.NewRepositorySpec(h) + jsonrepospec := string(Must(runtime.DefaultJSONEncoding.Marshal(repospec))) + + // Notice that the file formats (directory, tar, tgz) CAN BE PARSED in this notation, BUT for non file based + // implementations like oci, this information is not used. + Context("[+][::]", func() { + for _, cm := range []string{"", "+"} { + for _, ut := range []string{"", t} { + for _, uf := range []string{"", "directory", "tar", "tgz"} { + ref := cm + Type(FileFormat(ut, uf)) + jsonrepospec + ut, uf := ut, uf + + // tests parsing of all permutations of + // [::] + It("parses ref "+ref, func() { + CheckRepo(ref, &oci.UniformRepositorySpec{ + Type: FileType(ut, uf), + Scheme: "", + Host: "", + Info: jsonrepospec, + CreateIfMissing: ref[0] == '+', + TypeHint: FileFormat(ut, uf), + }) + }) + } + } + } + }) + }) + It("succeeds for repository", func() { CheckRef("::ghcr.io/", &oci.RefSpec{UniformRepositorySpec: ghcr}) }) @@ -67,10 +586,11 @@ var _ = Describe("ref parsing", func() { }) CheckRef("type::https://ghcr.io/repo/repo:v1@"+digest.String(), &oci.RefSpec{ UniformRepositorySpec: oci.UniformRepositorySpec{ - Type: "type", - Scheme: "https", - Host: "ghcr.io", - Info: "", + Type: "type", + Scheme: "https", + Host: "ghcr.io", + Info: "", + TypeHint: "type", }, ArtSpec: oci.ArtSpec{ Repository: "repo/repo", @@ -93,10 +613,11 @@ var _ = Describe("ref parsing", func() { }) CheckRef("directory::a/b", &oci.RefSpec{ UniformRepositorySpec: oci.UniformRepositorySpec{ - Type: "directory", - Scheme: "", - Host: "", - Info: "a/b", + Type: "directory", + Scheme: "", + Host: "", + Info: "a/b", + TypeHint: "directory", }, ArtSpec: oci.ArtSpec{ Repository: "", @@ -104,10 +625,11 @@ var _ = Describe("ref parsing", func() { }) CheckRef("ctf+directory::a/b", &oci.RefSpec{ UniformRepositorySpec: oci.UniformRepositorySpec{ - Type: "ctf+directory", - Scheme: "", - Host: "", - Info: "a/b", + Type: "ctf", + Scheme: "", + Host: "", + Info: "a/b", + TypeHint: "ctf+directory", }, ArtSpec: oci.ArtSpec{ Repository: "", @@ -115,11 +637,12 @@ var _ = Describe("ref parsing", func() { }) CheckRef("+ctf+directory::a/b", &oci.RefSpec{ UniformRepositorySpec: oci.UniformRepositorySpec{ - Type: "ctf+directory", + Type: "ctf", Scheme: "", Host: "", Info: "a/b", CreateIfMissing: true, + TypeHint: "ctf+directory", }, ArtSpec: oci.ArtSpec{ Repository: "", @@ -140,10 +663,11 @@ var _ = Describe("ref parsing", func() { CheckRef("directory::a/b//c/d", &oci.RefSpec{ UniformRepositorySpec: oci.UniformRepositorySpec{ - Type: "directory", - Scheme: "", - Host: "", - Info: "a/b", + Type: "directory", + Scheme: "", + Host: "", + Info: "a/b", + TypeHint: "directory", }, ArtSpec: oci.ArtSpec{ Repository: "c/d", @@ -152,10 +676,11 @@ var _ = Describe("ref parsing", func() { CheckRef("oci::ghcr.io", &oci.RefSpec{ UniformRepositorySpec: oci.UniformRepositorySpec{ - Type: "oci", - Scheme: "", - Host: "ghcr.io", - Info: "", + Type: "oci", + Scheme: "", + Host: "ghcr.io", + Info: "", + TypeHint: "oci", }, ArtSpec: oci.ArtSpec{ Repository: "", @@ -184,6 +709,52 @@ var _ = Describe("ref parsing", func() { }) + It("json spec", func() { + ctx := oci.New() + + tag := "1.0.0" + CheckRef("OCIRegistry::{\"baseUrl\": \"test.com\"}//repo:1.0.0", &oci.RefSpec{ + UniformRepositorySpec: oci.UniformRepositorySpec{ + Type: "OCIRegistry", + Scheme: "", + Host: "", + Info: "{\"baseUrl\": \"test.com\"}", + TypeHint: "OCIRegistry", + }, + ArtSpec: oci.ArtSpec{ + Repository: "repo", + Tag: &tag, + }, + }) + ref := Must(oci.ParseRef("OCIRegistry::{\"type\":\"OCIRegistry\", \"baseUrl\": \"test.com\"}//repo:1.0.0")) + spec := Must(ctx.MapUniformRepositorySpec(&ref.UniformRepositorySpec)) + repo := Must(spec.Repository(ctx, nil)) + _ = repo + }) + + It("fail for json spec with type mismatch", func() { + ctx := oci.New() + + tag := "1.0.0" + CheckRef("oci::{\"type\":\"OCIRegistry\", \"baseUrl\": \"test.com\"}//repo:1.0.0", &oci.RefSpec{ + UniformRepositorySpec: oci.UniformRepositorySpec{ + Type: "oci", + Scheme: "", + Host: "", + Info: "{\"type\":\"OCIRegistry\", \"baseUrl\": \"test.com\"}", + TypeHint: "oci", + }, + ArtSpec: oci.ArtSpec{ + Repository: "repo", + Tag: &tag, + }, + }) + ref := Must(oci.ParseRef("oci::{\"type\":\"OCIRegistry\", \"baseUrl\": \"test.com\"}//repo:1.0.0")) + spec, err := ctx.MapUniformRepositorySpec(&ref.UniformRepositorySpec) + Expect(spec).To(BeNil()) + Expect(err).ToNot(BeNil()) + }) + It("fails", func() { CheckRef("https://ubuntu", nil) CheckRef("ubuntu@4711", nil) @@ -212,5 +783,49 @@ var _ = Describe("ref parsing", func() { Info: "a/b.tar", }) }) + It("localhost", func() { + ctx := oci.New() + // port is necessary here, otherwise it is ambiguous with dockerhub reference (localhost/test:1.0.0 could be + // an artifact stored on duckerhub) + ref := Must(oci.ParseRef("localhost:80/test:1.0.0")) + spec := Must(ctx.MapUniformRepositorySpec(&ref.UniformRepositorySpec)) + Expect(spec).To(Equal(ocireg.NewRepositorySpec("localhost:80"))) + }) + It("localhost with unambiguous separator and without port", func() { + ctx := oci.New() + ref := Must(oci.ParseRef("localhost//test:1.0.0")) + spec := Must(ctx.MapUniformRepositorySpec(&ref.UniformRepositorySpec)) + Expect(spec).To(Equal(ocireg.NewRepositorySpec("localhost"))) + }) + It("localhost with unambiguous separator", func() { + ctx := oci.New() + ref := Must(oci.ParseRef("localhost:80//test:1.0.0")) + spec := Must(ctx.MapUniformRepositorySpec(&ref.UniformRepositorySpec)) + Expect(spec).To(Equal(ocireg.NewRepositorySpec("localhost:80"))) + }) + It("scheme://localhost:port//repository:version", func() { + ctx := oci.New() + ref := Must(oci.ParseRef("http://localhost:80//test:1.0.0")) + spec := Must(ctx.MapUniformRepositorySpec(&ref.UniformRepositorySpec)) + Expect(spec).To(Equal(ocireg.NewRepositorySpec("http://localhost:80"))) + }) + It("scheme://localhost:port/repository:version", func() { + ctx := oci.New() + ref := Must(oci.ParseRef("http://localhost:80/test:1.0.0")) + spec := Must(ctx.MapUniformRepositorySpec(&ref.UniformRepositorySpec)) + Expect(spec).To(Equal(ocireg.NewRepositorySpec("http://localhost:80"))) + }) + It("ctf with create", func() { + ctx := oci.New() + ref := Must(oci.ParseRef("+ctf+directory::./file/path//github.com/mandelsoft/ocm")) + spec := Must(ctx.MapUniformRepositorySpec(&ref.UniformRepositorySpec)) + Expect(spec).To(Equal(Must(ctf.NewRepositorySpec(accessobj.ACC_CREATE, "./file/path", accessio.FormatDirectory)))) + }) + It("ctf without create", func() { + ctx := oci.New() + ref := Must(oci.ParseRepo("ctf+directory::./file/path")) + spec := Must(ctx.MapUniformRepositorySpec(&ref)) + Expect(spec).To(Equal(Must(ctf.NewRepositorySpec(accessobj.ACC_WRITABLE, "./file/path")))) + }) }) diff --git a/pkg/contexts/oci/repositories/ctf/uniform.go b/pkg/contexts/oci/repositories/ctf/uniform.go index 2ecc3e462c..2b668addb9 100644 --- a/pkg/contexts/oci/repositories/ctf/uniform.go +++ b/pkg/contexts/oci/repositories/ctf/uniform.go @@ -17,6 +17,7 @@ func init() { h := &repospechandler{} cpi.RegisterRepositorySpecHandler(h, "") cpi.RegisterRepositorySpecHandler(h, Type) + cpi.RegisterRepositorySpecHandler(h, AltType) for _, f := range SupportedFormats() { cpi.RegisterRepositorySpecHandler(h, string(f)) } diff --git a/pkg/contexts/oci/repositories/ocireg/repository.go b/pkg/contexts/oci/repositories/ocireg/repository.go index 376e7851f2..ed474c4ffa 100644 --- a/pkg/contexts/oci/repositories/ocireg/repository.go +++ b/pkg/contexts/oci/repositories/ocireg/repository.go @@ -62,6 +62,9 @@ var ( func NewRepository(ctx cpi.Context, spec *RepositorySpec, info *RepositoryInfo) (cpi.Repository, error) { urs := spec.UniformRepositorySpec() + if urs.Scheme == "http" { + ocmlog.Logger(REALM).Warn("using insecure http for oci registry {{host}}", "host", urs.Host) + } i := &RepositoryImpl{ RepositoryImplBase: cpi.NewRepositoryImplBase(ctx), logger: logging.DynamicLogger(ctx, REALM, logging.NewAttribute(ocmlog.ATTR_HOST, urs.Host)), @@ -145,23 +148,28 @@ func (r *RepositoryImpl) getResolver(comp string) (resolve.Resolver, error) { }, DefaultScheme: r.info.Scheme, //nolint:gosec // used like the default, there are OCI servers (quay.io) not working with min version. - DefaultTLS: &tls.Config{ - // MinVersion: tls.VersionTLS13, - RootCAs: func() *x509.CertPool { - var rootCAs *x509.CertPool - if creds != nil { - c := creds.GetProperty(credentials.ATTR_CERTIFICATE_AUTHORITY) - if c != "" { - rootCAs = x509.NewCertPool() - rootCAs.AppendCertsFromPEM([]byte(c)) + DefaultTLS: func() *tls.Config { + if r.info.Scheme == "http" { + return nil + } + return &tls.Config{ + // MinVersion: tls.VersionTLS13, + RootCAs: func() *x509.CertPool { + var rootCAs *x509.CertPool + if creds != nil { + c := creds.GetProperty(credentials.ATTR_CERTIFICATE_AUTHORITY) + if c != "" { + rootCAs = x509.NewCertPool() + rootCAs.AppendCertsFromPEM([]byte(c)) + } } - } - if rootCAs == nil { - rootCAs = rootcertsattr.Get(r.GetContext()).GetRootCertPool(true) - } - return rootCAs - }(), - }, + if rootCAs == nil { + rootCAs = rootcertsattr.Get(r.GetContext()).GetRootCertPool(true) + } + return rootCAs + }(), + } + }(), })), } diff --git a/pkg/contexts/oci/repositories/ocireg/uniform.go b/pkg/contexts/oci/repositories/ocireg/uniform.go index 4cf9233581..761a772a60 100644 --- a/pkg/contexts/oci/repositories/ocireg/uniform.go +++ b/pkg/contexts/oci/repositories/ocireg/uniform.go @@ -6,6 +6,8 @@ package ocireg import ( "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" + "github.com/open-component-model/ocm/pkg/contexts/oci/grammar" + "github.com/open-component-model/ocm/pkg/regex" ) func init() { @@ -15,9 +17,24 @@ func init() { type repospechandler struct{} func (h *repospechandler) MapReference(ctx cpi.Context, u *cpi.UniformRepositorySpec) (cpi.RepositorySpec, error) { - if u.Info != "" || u.Host == "" { + scheme := u.Scheme + host := u.Host + if u.Host == "" && u.Scheme == "" && u.Info != "" { + host = u.Info + match := grammar.AnchoredSchemedRegexp.FindStringSubmatch(host) + if match != nil { + scheme = match[1] + host = match[2] + } + if !(regex.Anchored(grammar.HostPortRegexp).MatchString(host) || regex.Anchored(grammar.DomainPortRegexp).MatchString(host)) { + return nil, nil + } + } else if u.Info != "" || u.Host == "" { return nil, nil } - return NewRepositorySpec(u.Host), nil + if scheme != "" { + host = scheme + "://" + host + } + return NewRepositorySpec(host), nil } diff --git a/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/blobhandler.go index 14bf533573..5ce47f72e7 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/blobhandler.go +++ b/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/blobhandler.go @@ -17,6 +17,7 @@ import ( "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" + "github.com/open-component-model/ocm/pkg/contexts/oci/grammar" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/artifactset" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ocireg" "github.com/open-component-model/ocm/pkg/contexts/oci/transfer" @@ -329,8 +330,16 @@ func (b *artifactHandler) StoreBlob(blob cpi.BlobAccess, artType, hint string, g if err != nil { return nil, wrap(err, errhint, "transfer artifact") } - - ref := path.Join(base, namespace.GetNamespace()) + version + match := grammar.AnchoredSchemedRegexp.FindStringSubmatch(base) + scheme := "" + if match != nil { + scheme = match[1] + base = match[2] + } + if scheme != "" { + scheme += "://" + } + ref := scheme + path.Join(base, namespace.GetNamespace()) + version return ociartifact.New(ref), nil } diff --git a/pkg/contexts/ocm/grammar/grammar.go b/pkg/contexts/ocm/grammar/grammar.go index 96aa3ef385..d84ac83cf8 100644 --- a/pkg/contexts/ocm/grammar/grammar.go +++ b/pkg/contexts/ocm/grammar/grammar.go @@ -30,7 +30,19 @@ var ( // AnchoredRepositoryRegexp parses a uniform repository spec. AnchoredRepositoryRegexp = Anchored( Optional(Capture(TypeRegexp), Literal("::")), - Capture(grammar.DomainPortRegexp), Optional(grammar.RepositorySeparatorRegexp, Capture(grammar.RepositoryRegexp)), + grammar.SchemeDomainPortRegexp, Optional(grammar.RepositorySeparatorRegexp, Capture(grammar.RepositoryRegexp)), + ) + + // AnchoredSchemedHostPortRepositoryRegexp parses a uniform repository spec. + AnchoredSchemedHostPortRepositoryRegexp = Anchored( + Optional(Capture(TypeRegexp), Literal("::")), + grammar.SchemedHostPortRegexp, Optional(grammar.RepositorySeparatorRegexp, Capture(grammar.RepositoryRegexp)), + ) + + // AnchoredHostWithPortRepositoryRegexp parses a uniform repository spec. + AnchoredHostWithPortRepositoryRegexp = Anchored( + Optional(Capture(TypeRegexp), Literal("::")), + grammar.SchemeHostPortRegexp, Optional(grammar.RepositorySeparatorRegexp, Capture(grammar.RepositoryRegexp)), ) // AnchoredGenericRepositoryRegexp describes a CTF reference. @@ -54,7 +66,29 @@ var ( // It provides 5 captures: type, repository host port, sub path, component and version. AnchoredReferenceRegexp = Anchored( Optional(Capture(TypeRegexp), Literal("::")), - Capture(grammar.DomainPortRegexp), Optional(grammar.RepositorySeparatorRegexp, Capture(grammar.RepositoryRegexp)), + grammar.SchemeDomainPortRegexp, Optional(grammar.RepositorySeparatorRegexp, Capture(grammar.RepositoryRegexp)), + Literal("//"), Capture(ComponentRegexp), + Optional(Literal(VersionSeparator), Capture(VersionRegexp)), + ) + + // AnchoredSchemedHostPortReferenceRegexp parses a complete string representation for default component references + // including the repository part. Since the type is optional, the scheme is required to allow for a distinction + // from filepaths. + // It provides 6 captures: type, scheme, repository host port, sub path, component and version. + AnchoredSchemedHostPortReferenceRegexp = Anchored( + Optional(Capture(TypeRegexp), Literal("::")), + grammar.SchemedHostPortRegexp, Optional(grammar.RepositorySeparatorRegexp, Capture(grammar.RepositoryRegexp)), + Literal("//"), Capture(ComponentRegexp), + Optional(Literal(VersionSeparator), Capture(VersionRegexp)), + ) + + // AnchoredHostWithPortReferenceRegexp parses a complete string representation for default component references + // including the repository part. Since the type is optional, the scheme is required to allow for a distinction + // from filepaths. + // It provides 6 captures: type, scheme, repository host port, sub path, component and version. + AnchoredHostWithPortReferenceRegexp = Anchored( + Optional(Capture(TypeRegexp), Literal("::")), + grammar.SchemeHostPortRegexp, Optional(grammar.RepositorySeparatorRegexp, Capture(grammar.RepositoryRegexp)), Literal("//"), Capture(ComponentRegexp), Optional(Literal(VersionSeparator), Capture(VersionRegexp)), ) diff --git a/pkg/contexts/ocm/grammar/grammar_test.go b/pkg/contexts/ocm/grammar/grammar_test.go index 507b38ed04..1878e60256 100644 --- a/pkg/contexts/ocm/grammar/grammar_test.go +++ b/pkg/contexts/ocm/grammar/grammar_test.go @@ -50,6 +50,12 @@ func Type(t string) string { } return t + "::" } +func Scheme(sc string) string { + if sc == "" { + return sc + } + return sc + "://" +} func Sub(t string) string { if t == "" { return t @@ -90,6 +96,7 @@ var _ = Describe("ref matching", func() { Context("complete refs", func() { t := "OCIRepository" + sc := "http" s := "mandelsoft/cnudie" v := "v1" @@ -98,10 +105,12 @@ var _ = Describe("ref matching", func() { It("succeeds", func() { for _, ut := range []string{"", t} { - for _, us := range []string{"", s} { - for _, uv := range []string{"", v} { - ref := Type(ut) + h + Sub(us) + "//" + c + Vers(uv) - CheckRef(ref, ut, h, us, c, uv) + for _, usc := range []string{"", sc} { + for _, us := range []string{"", s} { + for _, uv := range []string{"", v} { + ref := Type(ut) + Scheme(usc) + h + Sub(us) + "//" + c + Vers(uv) + CheckRef(ref, ut, usc, h, us, c, uv) + } } } } @@ -129,10 +138,10 @@ var _ = Describe("ref matching", func() { Context("repo", func() { It("succeeds", func() { - Check("directory::ghcr.io/sub/path", AnchoredRepositoryRegexp, "directory", "ghcr.io", "sub/path") - Check("ghcr.io/sub/path", AnchoredRepositoryRegexp, "", "ghcr.io", "sub/path") - Check("ghcr.io", AnchoredRepositoryRegexp, "", "ghcr.io", "") - Check("ghcr.io/sub/path", AnchoredRepositoryRegexp, "", "ghcr.io", "sub/path") + Check("directory::ghcr.io/sub/path", AnchoredRepositoryRegexp, "directory", "", "ghcr.io", "sub/path") + Check("ghcr.io/sub/path", AnchoredRepositoryRegexp, "", "", "ghcr.io", "sub/path") + Check("ghcr.io", AnchoredRepositoryRegexp, "", "", "ghcr.io", "") + Check("ghcr.io/sub/path", AnchoredRepositoryRegexp, "", "", "ghcr.io", "sub/path") }) It("fails", func() { Check("/ghcr.io/sub/path", AnchoredRepositoryRegexp) diff --git a/pkg/contexts/ocm/internal/uniform.go b/pkg/contexts/ocm/internal/uniform.go index 6460d11284..91bcbbd3b2 100644 --- a/pkg/contexts/ocm/internal/uniform.go +++ b/pkg/contexts/ocm/internal/uniform.go @@ -27,6 +27,8 @@ const ( type UniformRepositorySpec struct { // Type Type string `json:"type,omitempty"` + // Scheme + Scheme string `json:"scheme,omitempty"` // Host is the hostname of an ocm ref. Host string `json:"host,omitempty"` // SubPath is the sub path spec used to host component versions @@ -36,7 +38,7 @@ type UniformRepositorySpec struct { // CreateIfMissing indicates whether a file based or dynamic repo should be created if it does not exist CreateIfMissing bool `json:"createIfMissing,omitempty"` - // TypeHintshould be set if CreateIfMissing is true to help to decide what kind of repo to create + // TypeHint should be set if CreateIfMissing is true to help to decide what kind of repo to create TypeHint string `json:"typeHint,omitempty"` } @@ -151,6 +153,14 @@ func (s *specHandlers) MapUniformRepositorySpec(ctx Context, u *UniformRepositor s.lock.RLock() defer s.lock.RUnlock() + if u.Info != "" && string(u.Info[0]) == "{" && u.Host == "" && u.Scheme == "" && u.SubPath == "" { + data, err := runtime.CompleteSpecWithType(u.Type, []byte(u.Info)) + if err != nil { + return nil, err + } + return ctx.RepositorySpecForConfig(data, runtime.DefaultJSONEncoding) + } + deferr := errors.ErrNotSupported("uniform repository ref", u.String()) if u.Type == "" { if u.Info != "" { diff --git a/pkg/contexts/ocm/ref.go b/pkg/contexts/ocm/ref.go index 366027188f..c630a621a0 100644 --- a/pkg/contexts/ocm/ref.go +++ b/pkg/contexts/ocm/ref.go @@ -33,27 +33,57 @@ func ParseRepo(ref string) (UniformRepositorySpec, error) { }) } match := grammar.AnchoredRepositoryRegexp.FindSubmatch([]byte(ref)) - if match == nil { - match = grammar.AnchoredGenericRepositoryRegexp.FindSubmatch([]byte(ref)) - if match == nil { - return UniformRepositorySpec{}, errors.ErrInvalid(KIND_OCM_REFERENCE, ref) - } + if match != nil { + h := string(match[1]) + t, _ := grammar.SplitTypeSpec(h) + return cpi.HandleRef(UniformRepositorySpec{ + Type: t, + TypeHint: h, + Scheme: string(match[2]), + Host: string(match[3]), + SubPath: string(match[4]), + CreateIfMissing: create, + }) + } + + match = grammar.AnchoredSchemedHostPortRepositoryRegexp.FindSubmatch([]byte(ref)) + if match != nil { + h := string(match[1]) + t, _ := grammar.SplitTypeSpec(h) + return cpi.HandleRef(UniformRepositorySpec{ + Type: t, + TypeHint: h, + Scheme: string(match[2]), + Host: string(match[3]), + SubPath: string(match[4]), + CreateIfMissing: create, + }) + } + + match = grammar.AnchoredHostWithPortRepositoryRegexp.FindSubmatch([]byte(ref)) + if match != nil { h := string(match[1]) t, _ := grammar.SplitTypeSpec(h) return cpi.HandleRef(UniformRepositorySpec{ Type: t, TypeHint: h, - Info: string(match[2]), + Scheme: string(match[2]), + Host: string(match[3]), + SubPath: string(match[4]), CreateIfMissing: create, }) } + + match = grammar.AnchoredGenericRepositoryRegexp.FindSubmatch([]byte(ref)) + if match == nil { + return UniformRepositorySpec{}, errors.ErrInvalid(KIND_OCM_REFERENCE, ref) + } h := string(match[1]) t, _ := grammar.SplitTypeSpec(h) return cpi.HandleRef(UniformRepositorySpec{ Type: t, TypeHint: h, - Host: string(match[2]), - SubPath: string(match[3]), + Info: string(match[2]), CreateIfMissing: create, }) } @@ -90,49 +120,104 @@ func ParseRef(ref string) (RefSpec, error) { var spec RefSpec v := "" match := grammar.AnchoredReferenceRegexp.FindSubmatch([]byte(ref)) - if match == nil { - match = grammar.AnchoredGenericReferenceRegexp.FindSubmatch([]byte(ref)) - if match == nil { - return RefSpec{}, errors.ErrInvalid(KIND_OCM_REFERENCE, ref) - } - v = string(match[4]) + if match != nil { + v = string(match[6]) + s := string(match[2]) h := string(match[1]) t, _ := grammar.SplitTypeSpec(h) spec = RefSpec{ UniformRepositorySpec{ Type: t, TypeHint: h, - Info: string(match[2]), + Scheme: s, + Host: string(match[3]), + SubPath: string(match[4]), CreateIfMissing: create, }, CompSpec{ - Component: string(match[3]), + Component: string(match[5]), Version: nil, }, } - } else { - v = string(match[5]) + } + + if match == nil { + match = grammar.AnchoredSchemedHostPortReferenceRegexp.FindSubmatch([]byte(ref)) + if match != nil { + v = string(match[6]) + s := string(match[2]) + h := string(match[1]) + t, _ := grammar.SplitTypeSpec(h) + spec = RefSpec{ + UniformRepositorySpec{ + Type: t, + TypeHint: h, + Scheme: s, + Host: string(match[3]), + SubPath: string(match[4]), + CreateIfMissing: create, + }, + CompSpec{ + Component: string(match[5]), + Version: nil, + }, + } + } + } + + if match == nil { + match = grammar.AnchoredHostWithPortReferenceRegexp.FindSubmatch([]byte(ref)) + if match != nil { + v = string(match[6]) + s := string(match[2]) + h := string(match[1]) + t, _ := grammar.SplitTypeSpec(h) + spec = RefSpec{ + UniformRepositorySpec{ + Type: t, + TypeHint: h, + Scheme: s, + Host: string(match[3]), + SubPath: string(match[4]), + CreateIfMissing: create, + }, + CompSpec{ + Component: string(match[5]), + Version: nil, + }, + } + } + } + + if match == nil { + match = grammar.AnchoredGenericReferenceRegexp.FindSubmatch([]byte(ref)) + if match == nil { + return RefSpec{}, errors.ErrInvalid(KIND_OCM_REFERENCE, ref) + } + v = string(match[4]) h := string(match[1]) t, _ := grammar.SplitTypeSpec(h) spec = RefSpec{ UniformRepositorySpec{ Type: t, TypeHint: h, - Host: string(match[2]), - SubPath: string(match[3]), + Info: string(match[2]), CreateIfMissing: create, }, CompSpec{ - Component: string(match[4]), + Component: string(match[3]), Version: nil, }, } } + if v != "" { spec.Version = &v } var err error - spec.UniformRepositorySpec, err = cpi.HandleRef(spec.UniformRepositorySpec) + if spec.Info == "" || !(string(spec.Info[0]) == "{") { + spec.UniformRepositorySpec, err = cpi.HandleRef(spec.UniformRepositorySpec) + } return spec, err } diff --git a/pkg/contexts/ocm/ref_test.go b/pkg/contexts/ocm/ref_test.go index 4fad348779..3501bc4905 100644 --- a/pkg/contexts/ocm/ref_test.go +++ b/pkg/contexts/ocm/ref_test.go @@ -5,8 +5,6 @@ package ocm_test import ( - "strings" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/testutils" @@ -22,6 +20,28 @@ func Type(t string) string { } return t + "::" } +func FileFormat(t, f string) string { + if t == "" { + return f + } + if f == "" { + return t + } + return t + "+" + f +} +func FileType(t, f string) string { + if t != "" { + return t + } else { + return f + } +} +func Scheme(s string) string { + if s == "" { + return s + } + return s + "://" +} func Sub(t string) string { if t == "" { return t @@ -35,7 +55,7 @@ func Vers(t string) string { return ":" + t } -func CheckRef(ref, ut, h, us, c, uv, i string, th ...string) { +func CheckRef(ref, ut, scheme, h, us, c, uv, i string, th ...string) { var v *string if uv != "" { v = &uv @@ -48,6 +68,7 @@ func CheckRef(ref, ut, h, us, c, uv, i string, th ...string) { Expect(spec).WithOffset(1).To(Equal(ocm.RefSpec{ UniformRepositorySpec: ocm.UniformRepositorySpec{ Type: ut, + Scheme: scheme, Host: h, SubPath: us, Info: i, @@ -62,7 +83,80 @@ func CheckRef(ref, ut, h, us, c, uv, i string, th ...string) { } var _ = Describe("ref parsing", func() { - Context("complete refs", func() { + Context("file path refs", func() { + t := "ctf" + p := "file/path" + c := "github.com/mandelsoft/ocm" + v := "v1" + + Context("[+][::][./][//[:]", func() { + for _, cm := range []string{"", "+"} { + for _, ut := range []string{"", t} { + for _, uf := range []string{"", "directory", "tar", "tgz"} { + for _, up := range []string{p, "./" + p} { + for _, uv := range []string{"", v, v + ".1.1", v + "-rc.1", v + "+65", v + ".1.2-rc.1", v + ".1.2+65"} { + ref := cm + Type(FileFormat(ut, uf)) + up + "//" + c + Vers(uv) + ut, uf, uv, up := ut, uf, uv, up + + // tests parsing of all permutations of + // [+][::][./]//[:] + It("parses ref "+ref, func() { + if ut != "" || uf != "" { + CheckRef(ref, FileType(ut, uf), "", "", "", c, uv, up, FileFormat(ut, uf)) + } else { + CheckRef(ref, FileType(ut, uf), "", "", "", c, uv, up) + } + }) + } + } + } + } + } + }) + }) + + Context("json repo spec refs", func() { + t := ocireg.Type + s := "mandelsoft/cnudie" + v := "v1" + + h := "ghcr.io" + c := "github.com/mandelsoft/ocm" + + repospec := ocireg.NewRepositorySpec(h, &ocireg.ComponentRepositoryMeta{ + ComponentNameMapping: "", + SubPath: s, + }) + jsonrepospec := string(Must(repospec.MarshalJSON())) + + Context("[::][//][:]", func() { + for _, cm := range []string{"", "+"} { + for _, ut := range []string{t, ""} { + for _, uv := range []string{"", v, v + ".1.1", v + "-rc.1", v + "+65", v + ".1.2-rc.1", v + ".1.2+65"} { + ref := cm + Type(ut) + jsonrepospec + "//" + c + Vers(uv) + ut, uv := ut, uv + + // tests parsing of all permutations of + // [::][//][:] + It("parses ref "+ref, func() { + CheckRef(ref, ut, "", "", "", c, uv, jsonrepospec) + }) + } + } + } + }) + + It("fail if mismatch between type in ref (here, ctf) and type in json repo spec (here, OCIRegistry)", func() { + ctx := ocm.New() + + ref := Must(ocm.ParseRef("ctf::{\"baseUrl\":\"ghcr.io\",\"subPath\":\"mandelsoft/cnudie\",\"type\":\"OCIRegistry\"}//github.com/mandelsoft/ocm:v1")) + spec, err := ctx.MapUniformRepositorySpec(&ref.UniformRepositorySpec) + Expect(spec).To(BeNil()) + Expect(err).ToNot(BeNil()) + }) + }) + + Context("domain refs", func() { t := ocireg.Type s := "mandelsoft/cnudie" v := "v1" @@ -70,48 +164,110 @@ var _ = Describe("ref parsing", func() { h := "ghcr.io" c := "github.com/mandelsoft/ocm" - Context("without info", func() { - for _, ut := range []string{t, ""} { - for _, uh := range []string{h, h + ":3030", "localhost", "localhost:3030"} { - for _, us := range []string{"", s} { - for _, uv := range []string{"", v, v + ".1.1", v + "-rc.1", v + "+65", v + ".1.2-rc.1", v + ".1.2+65"} { - ref := Type(ut) + uh + Sub(us) + "//" + c + Vers(uv) - ut, uh, us, uv := ut, uh, us, uv - - It("parses ref "+ref, func() { - if ut == "" && strings.HasPrefix(uh, "localhost") { - CheckRef(ref, ut, "", "", c, uv, uh+Sub(us)) - } else { - CheckRef(ref, ut, uh, us, c, uv, "") + Context("[+][::][://][:][/]//[:::][scheme://][:][/]//[:::]://[:][/]//[:::]scheme://[:][/]//[:::][://]:[/]//[:::][scheme://]:[/]//[: 0 { - host = u.Info[:idx] - subp = u.Info[idx+1:] + host = info[:idx] + subp = info[idx+1:] } else { - host = u.Info + host = info } if grammar.HostPortRegexp.MatchString(host) || grammar.DomainPortRegexp.MatchString(host) { + u.Scheme = scheme u.Host = host u.SubPath = subp u.Info = "" diff --git a/pkg/runtime/utils.go b/pkg/runtime/utils.go index 2f8ec1a6d5..cbd1360537 100644 --- a/pkg/runtime/utils.go +++ b/pkg/runtime/utils.go @@ -122,3 +122,21 @@ func CheckSpecification(data []byte) error { } // --- end check --- + +func CompleteSpecWithType(typ string, data []byte) ([]byte, error) { + var m map[string]interface{} + err := DefaultJSONEncoding.Unmarshal(data, &m) + if err != nil { + return nil, err + } + if typ != "" { + if m["type"] != nil && m["type"] != typ { + return nil, fmt.Errorf("type mismatch between type in reference \"%s\" and type in json spec \"%s\"", typ, m["type"]) + } + m["type"] = typ + return DefaultJSONEncoding.Marshal(m) + } else if m["type"] == nil { + return nil, fmt.Errorf("type missing") + } + return data, nil +} From 600f585d767aeaef3f5a6cfdd25b1db337d29b3e Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Wed, 24 Apr 2024 09:50:12 +0200 Subject: [PATCH 36/83] eliminate lib to cli dependencies (#741) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description There are dependencies from the library (package pkg) to the cli (cmds). This is because of - using command executions in plugin tests - using some parsing provided by cli in some app support - using cli based test environment in lib tests The cli based test environment can be replaced by the lib test environment, it was just accidently used. The parsing support has been moved to a cli support package in the lib. The plugin tests based on command executions have been moved to a plugin test package in the top-level cli package. Additionally, the lib now tests the pure lib version of the plugin usage without command executions. ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [x] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [x] βœ… Test - [x] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- .github/pull_request_template.md | 1 + cmds/ocm/app/app.go | 2 +- .../ocmcmds/componentarchive/create/cmd.go | 6 +- .../plugins/tests/accessmethods/cmd_test.go | 79 ++++++++++++++++++ .../plugins/tests/accessmethods/suite_test.go | 23 +++++ .../plugins/tests/accessmethods/testdata/test | 83 +++++++++++++++++++ .../plugins/tests/routingslips/cmd_test.go | 69 +++++++++++++++ .../plugins/tests/routingslips/suite_test.go | 17 ++++ .../plugins/tests/routingslips/testdata/test | 78 +++++++++++++++++ go.mod | 47 ++++++----- go.sum | 2 + .../common => pkg/clisupport}/labels.go | 4 +- .../ocm/accessmethods/plugin/cmd_test.go | 79 +++++++++--------- .../genericaccess/resource_test.go | 10 +-- .../routingslip/types/plugin/cmd_test.go | 62 +++++++------- .../routingslip/types/plugin/entry_test.go | 6 +- .../ocm/repositories/virtual/repo_test.go | 9 +- pkg/contexts/ocm/utils/check/check_test.go | 6 +- pkg/toi/support/app.go | 4 +- 19 files changed, 474 insertions(+), 113 deletions(-) create mode 100644 cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/cmd_test.go create mode 100644 cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/suite_test.go create mode 100755 cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/testdata/test create mode 100644 cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/cmd_test.go create mode 100644 cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/suite_test.go create mode 100755 cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/testdata/test rename {cmds/ocm/commands/ocmcmds/common => pkg/clisupport}/labels.go (96%) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index b9d61c3e89..d370119fee 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -11,6 +11,7 @@ Please include a summary of the changes and the related issue. Please also inclu ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature +- [ ] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style diff --git a/cmds/ocm/app/app.go b/cmds/ocm/app/app.go index 3f479b79c9..c598c9aba5 100644 --- a/cmds/ocm/app/app.go +++ b/cmds/ocm/app/app.go @@ -11,6 +11,7 @@ import ( "strings" "unicode" + common2 "github.com/open-component-model/ocm/pkg/clisupport" _ "github.com/open-component-model/ocm/pkg/contexts/clictx/config" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs" @@ -24,7 +25,6 @@ import ( creds "github.com/open-component-model/ocm/cmds/ocm/commands/misccmds/credentials" "github.com/open-component-model/ocm/cmds/ocm/commands/ocicmds" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds" - common2 "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/componentarchive" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/components" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/plugins" diff --git a/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd.go b/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd.go index 7d93479bef..6954114acb 100644 --- a/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd.go +++ b/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd.go @@ -9,11 +9,11 @@ import ( "strings" "github.com/mandelsoft/vfs/pkg/vfs" + "github.com/open-component-model/ocm/pkg/clisupport" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/formatoption" - "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/fileoption" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/schemaoption" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/names" @@ -91,7 +91,7 @@ func (o *Command) Complete(args []string) error { o.Version = args[1] for _, a := range args[2:] { - o.Labels, err = common.AddParsedLabel(o.FileSystem(), o.Labels, a) + o.Labels, err = clisupport.AddParsedLabel(o.FileSystem(), o.Labels, a) if err != nil { return err } @@ -104,7 +104,7 @@ func (o *Command) Complete(args []string) error { o.Provider = a continue } - o.ProviderLabels, err = common.AddParsedLabel(o.FileSystem(), o.ProviderLabels, a) + o.ProviderLabels, err = clisupport.AddParsedLabel(o.FileSystem(), o.ProviderLabels, a) if err != nil { return err } diff --git a/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/cmd_test.go b/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/cmd_test.go new file mode 100644 index 0000000000..9557131805 --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/cmd_test.go @@ -0,0 +1,79 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package accessmethods_test + +import ( + "encoding/json" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/cmds/ocm/testhelper" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/open-component-model/ocm/pkg/contexts/ocm" + "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugincacheattr" + "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugindirattr" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" + metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/plugins" + "github.com/open-component-model/ocm/pkg/contexts/ocm/registration" + "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/comparch" +) + +const CA = "/tmp/ca" +const VERSION = "v1" + +var _ = Describe("Add with new access method", func() { + var env *TestEnv + var ctx ocm.Context + var registry plugins.Set + + BeforeEach(func() { + env = NewTestEnv(TestData()) + ctx = env.OCMContext() + + plugindirattr.Set(ctx, "testdata") + registry = plugincacheattr.Get(ctx) + Expect(registration.RegisterExtensions(ctx)).To(Succeed()) + p := registry.Get("test") + Expect(p).NotTo(BeNil()) + + Expect(env.Execute("create", "ca", "-ft", "directory", "test.de/x", VERSION, "--provider", "mandelsoft", "--file", CA)).To(Succeed()) + }) + + AfterEach(func() { + env.Cleanup() + }) + + It("adds external resource by options", func() { + Expect(env.Execute("add", "resources", CA, + "--type", "testContent", + "--name", "text", + "--version", "v0.1.0", + "--accessType", "test", + "--accessPath", "textfile", + "--mediaType", "text/plain")).To(Succeed()) + data := Must(env.ReadFile(env.Join(CA, comparch.ComponentDescriptorFileName))) + cd := Must(compdesc.Decode(data)) + Expect(len(cd.Resources)).To(Equal(1)) + + r := Must(cd.GetResourceByIdentity(metav1.NewIdentity("text"))) + Expect(r.Type).To(Equal("testContent")) + Expect(r.Version).To(Equal("v0.1.0")) + Expect(r.Relation).To(Equal(metav1.ResourceRelation("external"))) + + Expect(r.Access.GetType()).To(Equal("test")) + acc := Must(env.OCMContext().AccessSpecForSpec(r.Access)) + var myacc AccessSpec + + MustBeSuccessful(json.Unmarshal(Must(json.Marshal(acc)), &myacc)) + Expect(myacc).To(Equal(AccessSpec{Type: "test", Path: "textfile", MediaType: "text/plain"})) + + m := Must(acc.AccessMethod(&cpi.DummyComponentVersionAccess{env.OCMContext()})) + data = Must(m.Get()) + Expect(string(data)).To(Equal("test content\n{\"mediaType\":\"text/plain\",\"path\":\"textfile\",\"type\":\"test\"}\n")) + }) +}) diff --git a/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/suite_test.go b/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/suite_test.go new file mode 100644 index 0000000000..29a58e6af1 --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/suite_test.go @@ -0,0 +1,23 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package accessmethods_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +type AccessSpec struct { + Type string `json:"type"` + Path string `json:"path"` + MediaType string `json:"mediaType"` +} + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Access Methods Plugin Test Suite") +} diff --git a/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/testdata/test b/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/testdata/test new file mode 100755 index 0000000000..566e080ff1 --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/testdata/test @@ -0,0 +1,83 @@ +#!/bin/bash + +# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +# +# SPDX-License-Identifier: Apache-2.0 + +NAME="$(basename "$0")" + +Error() { + echo '{ "error": "'$1'" }' >&2 + exit 1 +} + +extract() { + v="$(echo "$2" | sed 's/.*"'"$1"'": *"\([^"]*\)".*/\1/')" + if [ "$v" != "$2" ]; then + echo "$v" + fi +} + +setfield() { + local v + s="$(echo "$2" | sed 's/\//\\\//g')" + v="$(echo "$BASE" | sed 's/"'"$1"'": *"[^"]*"/"'"$1"'":"'"$s"'"/')" + if [ "$v" == "$BASE" ]; then + v="$(echo "$BASE" | sed 's/^{"/{"'"$1"'":"'"$s"'","/')" + fi + if [ "$v" == "$BASE" ]; then + v="$(echo "$BASE" | sed 's/^{/{"'"$1"'":"'"$s"'"/')" + fi + BASE="$v" +} + +setopt() { + local v + v="$(extract "$1" "$OPTS")" + if [ -n "$v" ]; then + setfield "$2" "$v" + fi +} + +Info() { + PATHOPT='{"name":"accessPath","type":"string","description":"file path"}' + MEDIAOPT='{"name":"mediaType"}' + OPTS='['$PATHOPT','$MEDIAOPT']' + echo '{"version":"v1","pluginName":"'$NAME'","pluginVersion":"v1","shortDescription":"a test plugin","description":"a test plugin with access method test","accessMethods":[{"name":"test","shortDescription":"test access","description":"","options":'$OPTS'},{"name":"test","version":"v1","shortDescription":"test access","description":""}]} +' +} + +Get() { + echo "test content" + for arg; do + echo "$arg" + done +} + +Validate() { + echo '{"short":"a test","mediaType":"plain/text","description":"","hint":"testfile","consumerId":{"hostname":"localhost","type":"test"}}' +} + +Compose() { + BASE="$3" + OPTS="$2" + + setopt accessPath path + setopt mediaType mediaType + echo "$BASE" +} + +AccessMethod() { + case "$1" in + get) Get "${@:2}";; + validate) Validate "${@:2}";; + compose) Compose "${@:2}";; + *) Error "invalid accessmethod command $1";; + esac +} + +case "$1" in + info) Info;; + accessmethod) AccessMethod "${@:2}";; + *) Error "invalid command $1";; +esac diff --git a/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/cmd_test.go b/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/cmd_test.go new file mode 100644 index 0000000000..12812e0d8d --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/cmd_test.go @@ -0,0 +1,69 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package routingslips_test + +import ( + "bytes" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/cmds/ocm/testhelper" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/open-component-model/ocm/pkg/common/accessio" + "github.com/open-component-model/ocm/pkg/common/accessobj" + "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugincacheattr" + "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugindirattr" + "github.com/open-component-model/ocm/pkg/contexts/ocm/labels/routingslip" + "github.com/open-component-model/ocm/pkg/contexts/ocm/registration" + "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" +) + +const ARCH = "/tmp/ca" +const VERSION = "v1" +const COMP = "test.de/x" +const PROVIDER = "acme.org" + +var _ = Describe("Test Environment", func() { + var env *TestEnv + + BeforeEach(func() { + env = NewTestEnv() + env.OCMCommonTransport(ARCH, accessio.FormatDirectory, func() { + env.Component(COMP, func() { + env.Version(VERSION, func() { + env.Provider(PROVIDER) + }) + }) + }) + env.RSAKeyPair(PROVIDER) + + ctx := env.OCMContext() + plugindirattr.Set(ctx, "testdata") + registry := plugincacheattr.Get(ctx) + Expect(registration.RegisterExtensions(ctx)).To(Succeed()) + p := registry.Get("test") + Expect(p).NotTo(BeNil()) + }) + + AfterEach(func() { + env.Cleanup() + }) + + It("adds entry by plugin option", func() { + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("add", "routingslip", ARCH, PROVIDER, "test", "--accessPath", "some path", "--mediaType", "media type")).To(Succeed()) + Expect(buf.String()).To(StringEqualTrimmedWithContext( + ` +`)) + repo := Must(ctf.Open(env, accessobj.ACC_READONLY, ARCH, 0, env)) + defer Close(repo, "repo") + cv := Must(repo.LookupComponentVersion(COMP, VERSION)) + defer Close(cv, "cv") + slip := Must(routingslip.GetSlip(cv, PROVIDER)) + Expect(slip.Len()).To(Equal(1)) + Expect(Must(slip.Get(0).Payload.Evaluate(env.OCMContext())).Describe(env.OCMContext())).To(Equal("a test")) + }) +}) diff --git a/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/suite_test.go b/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/suite_test.go new file mode 100644 index 0000000000..025f19b67a --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/suite_test.go @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package routingslips_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Routing Slips Plugin Test Suite") +} diff --git a/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/testdata/test b/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/testdata/test new file mode 100755 index 0000000000..3162fb01f3 --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/testdata/test @@ -0,0 +1,78 @@ +#!/bin/bash + +# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +# +# SPDX-License-Identifier: Apache-2.0 + +NAME="$(basename "$0")" + +set -e + +Error() { + echo '{ "error": "'$1'" }' >&2 + exit 1 +} + +extract() { + v="$(echo "$2" | sed 's/.*"'"$1"'": *"\([^"]*\)".*/\1/')" + if [ "$v" != "$2" ]; then + echo "$v" + fi +} + +setfield() { + local v + v="$(echo "$BASE" | sed 's/"'"$1"'": *"[^"]*"/"'""$1""'":"'"${2//\//\\\/}"'"/')" + if [ "$v" == "$BASE" ]; then + v="$(echo "$BASE" | sed 's/^{"/{"'"$1"'":"'"${2//\//\\\/}"'","/')" + fi + if [ "$v" == "$BASE" ]; then + v="$(echo "$BASE" | sed 's/^{/{"'"$1"'":"'"${2//\//\\\/}"'"/')" + fi + BASE="$v" +} + +setopt() { + local v + v="$(extract "$1" "$OPTS")" + if [ -n "$v" ]; then + setfield "$2" "$v" + fi +} + +Info() { + PATHOPT='{"name":"accessPath","type":"string","description":"file path"}' + MEDIAOPT='{"name":"mediaType"}' + OPTS='['$PATHOPT','$MEDIAOPT']' + echo '{"version":"v1","pluginName":"'$NAME'","pluginVersion":"v1","shortDescription":"a test plugin","description":"a test plugin with valueset test","valuesets":[{"name":"test","purposes":["routingslip"],"shortDescription":"test set","description":"","options":'$OPTS'},{"name":"test","purposes":["routingslip"],"version":"v1","shortDescription":"test set","description":""}]} +' +} + +Compose() { + BASE="$4" + OPTS="$3" + + setopt accessPath path + setopt mediaType mediaType + echo "$BASE" +} + +Validate() { + echo '{"description":"a test"}' +} + + +ValueSet() { + case "$1" in + get) Get "${@:2}";; + compose) Compose "${@:2}";; + validate) Validate "${@:2}";; + *) Error "invalid valueset command $1";; + esac +} + +case "$1" in + info) Info;; + valueset) ValueSet "${@:2}";; + *) Error "invalid command $1";; +esac diff --git a/go.mod b/go.mod index a51d6b9e32..3bc988c938 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,9 @@ go 1.22 replace github.com/spf13/cobra => github.com/open-component-model/cobra v0.0.0-20230329075350-b1fd876abfb9 require ( + github.com/DataDog/gostackparse v0.7.0 + github.com/InfiniteLoopSpace/go_S-MIME v0.0.0-20181221134359-3f58f9a4b2b6 + github.com/Masterminds/semver/v3 v3.2.1 github.com/aws/aws-sdk-go-v2 v1.26.1 github.com/aws/aws-sdk-go-v2/config v1.27.11 github.com/aws/aws-sdk-go-v2/credentials v1.17.11 @@ -15,7 +18,6 @@ require ( github.com/containerd/log v0.1.0 github.com/containers/image/v5 v5.30.0 github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f - github.com/DataDog/gostackparse v0.7.0 github.com/distribution/reference v0.6.0 github.com/docker/cli v25.0.5+incompatible github.com/docker/docker v25.0.5+incompatible @@ -34,15 +36,14 @@ require ( github.com/google/go-github/v45 v45.2.0 github.com/hashicorp/vault-client-go v0.4.3 github.com/imdario/mergo v0.3.16 - github.com/InfiniteLoopSpace/go_S-MIME v0.0.0-20181221134359-3f58f9a4b2b6 github.com/klauspost/compress v1.17.7 github.com/klauspost/pgzip v1.2.6 github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3 + github.com/mandelsoft/goutils v0.0.0-20240422120338-5e35748a0391 github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf github.com/mandelsoft/spiff v1.7.0-beta-5 github.com/mandelsoft/vfs v0.4.3 github.com/marstr/guid v1.1.0 - github.com/Masterminds/semver/v3 v3.2.1 github.com/mitchellh/copystructure v1.2.0 github.com/mittwald/go-helm-client v0.12.9 github.com/modern-go/reflect2 v1.0.2 @@ -83,6 +84,26 @@ require ( cloud.google.com/go/compute/metadata v0.2.3 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect + github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0 // indirect + github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/Azure/go-autorest v14.2.0+incompatible // indirect + github.com/Azure/go-autorest/autorest v0.11.29 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect + github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 // indirect + github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 // indirect + github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect + github.com/Azure/go-autorest/logger v0.2.1 // indirect + github.com/Azure/go-autorest/tracing v0.6.0 // indirect + github.com/BurntSushi/toml v1.3.2 // indirect + github.com/MakeNowJust/heredoc v1.0.0 // indirect + github.com/Masterminds/goutils v1.1.1 // indirect + github.com/Masterminds/sprig/v3 v3.2.3 // indirect + github.com/Masterminds/squirrel v1.5.4 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/hcsshim v0.12.0-rc.3 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect + github.com/ThalesIgnite/crypto11 v1.2.5 // indirect github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect github.com/alibabacloud-go/cr-20160607 v1.0.1 // indirect github.com/alibabacloud-go/cr-20181201 v1.0.10 // indirect @@ -94,7 +115,6 @@ require ( github.com/alibabacloud-go/tea-utils v1.4.5 // indirect github.com/alibabacloud-go/tea-xml v1.1.3 // indirect github.com/aliyun/credentials-go v1.3.1 // indirect - github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 // indirect @@ -112,23 +132,12 @@ require ( github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 // indirect github.com/aws/smithy-go v1.20.2 // indirect github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8 // indirect - github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect - github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.29 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect - github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 // indirect - github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver v3.5.1+incompatible // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/buildkite/agent/v3 v3.62.0 // indirect github.com/buildkite/go-pipeline v0.3.2 // indirect github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 // indirect @@ -221,15 +230,9 @@ require ( github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/MakeNowJust/heredoc v1.0.0 // indirect - github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/sprig/v3 v3.2.3 // indirect - github.com/Masterminds/squirrel v1.5.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/Microsoft/hcsshim v0.12.0-rc.3 // indirect github.com/miekg/pkcs11 v1.1.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect @@ -258,7 +261,6 @@ require ( github.com/prometheus/client_model v0.6.0 // indirect github.com/prometheus/common v0.51.1 // indirect github.com/prometheus/procfs v0.12.0 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rubenv/sql-migrate v1.6.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -281,7 +283,6 @@ require ( github.com/subosito/gotenv v1.6.0 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/thales-e-security/pool v0.0.2 // indirect - github.com/ThalesIgnite/crypto11 v1.2.5 // indirect github.com/theupdateframework/go-tuf v0.7.0 // indirect github.com/theupdateframework/notary v0.7.0 // indirect github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect diff --git a/go.sum b/go.sum index 17911edf25..4eca05d991 100644 --- a/go.sum +++ b/go.sum @@ -667,6 +667,8 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3 h1:oo9nIgnyiBgYPbcZslRT4y29siuL5EoNJ/t1tr0xEVQ= github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3/go.mod h1:LxhqC7khDoRENwooP6f/vWvia9ivj6TqLYrR39zqkN0= +github.com/mandelsoft/goutils v0.0.0-20240422120338-5e35748a0391 h1:6etBMMPXMD4ti9OJbyNyH45qm6NvnzIOoGzZnkIRiD4= +github.com/mandelsoft/goutils v0.0.0-20240422120338-5e35748a0391/go.mod h1:EbNqk9JceSMq7MJuALB/vlOpoD4MAGE0TenM9TR+C0o= github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf h1:WEmgzeArDbp6Aw34jmziMIE5ygo2zpl/atXRq3D7lSw= github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf/go.mod h1:uO460C1lIB3IOOgrbXhAlz3AKsOv4T2K6ALBn3PwuSg= github.com/mandelsoft/spiff v1.7.0-beta-5 h1:3kC10nTviDQhL8diSxp7i4IC2iSiDg6KPbH1CAq7Lfw= diff --git a/cmds/ocm/commands/ocmcmds/common/labels.go b/pkg/clisupport/labels.go similarity index 96% rename from cmds/ocm/commands/ocmcmds/common/labels.go rename to pkg/clisupport/labels.go index 1983c3e450..57bd059200 100644 --- a/cmds/ocm/commands/ocmcmds/common/labels.go +++ b/pkg/clisupport/labels.go @@ -1,8 +1,8 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. // // SPDX-License-Identifier: Apache-2.0 -package common +package clisupport import ( "encoding/json" diff --git a/pkg/contexts/ocm/accessmethods/plugin/cmd_test.go b/pkg/contexts/ocm/accessmethods/plugin/cmd_test.go index b6aa15176e..231ece0f07 100644 --- a/pkg/contexts/ocm/accessmethods/plugin/cmd_test.go +++ b/pkg/contexts/ocm/accessmethods/plugin/cmd_test.go @@ -5,34 +5,34 @@ package plugin_test import ( - "encoding/json" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/open-component-model/ocm/cmds/ocm/testhelper" + . "github.com/open-component-model/ocm/pkg/env" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/sliceutils" + "github.com/mandelsoft/goutils/transformer" + "github.com/spf13/pflag" + + "github.com/open-component-model/ocm/pkg/cobrautils/flagsets" "github.com/open-component-model/ocm/pkg/contexts/ocm" + "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/options" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugincacheattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugindirattr" - "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" - metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/plugins" "github.com/open-component-model/ocm/pkg/contexts/ocm/registration" - "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/comparch" ) const CA = "/tmp/ca" const VERSION = "v1" var _ = Describe("Add with new access method", func() { - var env *TestEnv + var env *Environment var ctx ocm.Context var registry plugins.Set BeforeEach(func() { - env = NewTestEnv(TestData()) + env = NewEnvironment(TestData()) ctx = env.OCMContext() plugindirattr.Set(ctx, "testdata") @@ -40,40 +40,43 @@ var _ = Describe("Add with new access method", func() { Expect(registration.RegisterExtensions(ctx)).To(Succeed()) p := registry.Get("test") Expect(p).NotTo(BeNil()) - - Expect(env.Execute("create", "ca", "-ft", "directory", "test.de/x", VERSION, "--provider", "mandelsoft", "--file", CA)).To(Succeed()) }) AfterEach(func() { env.Cleanup() }) - It("adds external resource by options", func() { - Expect(env.Execute("add", "resources", CA, - "--type", "testContent", - "--name", "text", - "--version", "v0.1.0", - "--accessType", "test", - "--accessPath", "textfile", - "--mediaType", "text/plain")).To(Succeed()) - data := Must(env.ReadFile(env.Join(CA, comparch.ComponentDescriptorFileName))) - cd := Must(compdesc.Decode(data)) - Expect(len(cd.Resources)).To(Equal(1)) - - r := Must(cd.GetResourceByIdentity(metav1.NewIdentity("text"))) - Expect(r.Type).To(Equal("testContent")) - Expect(r.Version).To(Equal("v0.1.0")) - Expect(r.Relation).To(Equal(metav1.ResourceRelation("external"))) - - Expect(r.Access.GetType()).To(Equal("test")) - acc := Must(env.OCMContext().AccessSpecForSpec(r.Access)) - var myacc AccessSpec - - MustBeSuccessful(json.Unmarshal(Must(json.Marshal(acc)), &myacc)) - Expect(myacc).To(Equal(AccessSpec{Type: "test", Path: "textfile", MediaType: "text/plain"})) - - m := Must(acc.AccessMethod(&cpi.DummyComponentVersionAccess{env.OCMContext()})) - data = Must(m.Get()) - Expect(string(data)).To(Equal("test content\n{\"mediaType\":\"text/plain\",\"path\":\"textfile\",\"type\":\"test\"}\n")) + It("handles resource options", func() { + at := ctx.AccessMethods().GetType("test") + Expect(at).NotTo(BeNil()) + + h := at.ConfigOptionTypeSetHandler() + Expect(h).NotTo(BeNil()) + Expect(h.GetName()).To(Equal("test")) + + ot := h.OptionTypes() + Expect(len(ot)).To(Equal(2)) + + opts := h.CreateOptions() + Expect(sliceutils.Transform(opts.Options(), transformer.GetName[flagsets.Option, string])).To(ConsistOf( + "mediaType", "accessPath")) + + fs := &pflag.FlagSet{} + fs.SortFlags = true + opts.AddFlags(fs) + + Expect("\n" + fs.FlagUsages()).To(Equal(` + --accessPath string file path + --mediaType string media type for artifact blob representation +`)) + + MustBeSuccessful(fs.Parse([]string{"--accessPath", "filepath", "--" + options.MediatypeOption.GetName(), "yaml"})) + + cfg := flagsets.Config{} + MustBeSuccessful(h.ApplyConfig(opts, cfg)) + Expect(cfg).To(YAMLEqual(` +mediaType: yaml +path: filepath +`)) }) }) diff --git a/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource_test.go b/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource_test.go index 34b7f4bb46..ad960184f5 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource_test.go +++ b/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource_test.go @@ -7,8 +7,8 @@ package genericaccess_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/open-component-model/ocm/cmds/ocm/testhelper" . "github.com/open-component-model/ocm/pkg/contexts/oci/testhelper" + . "github.com/open-component-model/ocm/pkg/env/builder" . "github.com/open-component-model/ocm/pkg/testutils" "github.com/open-component-model/ocm/pkg/common/accessio" @@ -25,15 +25,15 @@ const OCIPATH = "/tmp/oci" const OCIHOST = "alias" var _ = Describe("dir tree resource access", func() { - var env *TestEnv + var env *Builder BeforeEach(func() { - env = NewTestEnv() + env = NewBuilder() - FakeOCIRepo(env.Builder, OCIPATH, OCIHOST) + FakeOCIRepo(env, OCIPATH, OCIHOST) env.OCICommonTransport(OCIPATH, accessio.FormatDirectory, func() { - OCIManifest1(env.Builder) + OCIManifest1(env) }) }) diff --git a/pkg/contexts/ocm/labels/routingslip/types/plugin/cmd_test.go b/pkg/contexts/ocm/labels/routingslip/types/plugin/cmd_test.go index 334bf1109a..f2a68fd6d6 100644 --- a/pkg/contexts/ocm/labels/routingslip/types/plugin/cmd_test.go +++ b/pkg/contexts/ocm/labels/routingslip/types/plugin/cmd_test.go @@ -5,20 +5,20 @@ package plugin_test import ( - "bytes" - + "github.com/mandelsoft/goutils/sliceutils" + "github.com/mandelsoft/goutils/transformer" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/open-component-model/ocm/cmds/ocm/testhelper" + "github.com/open-component-model/ocm/pkg/contexts/ocm/registration" + . "github.com/open-component-model/ocm/pkg/env" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/spf13/pflag" - "github.com/open-component-model/ocm/pkg/common/accessio" - "github.com/open-component-model/ocm/pkg/common/accessobj" + "github.com/open-component-model/ocm/pkg/cobrautils/flagsets" + "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/options" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugincacheattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugindirattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/labels/routingslip" - "github.com/open-component-model/ocm/pkg/contexts/ocm/registration" - "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" ) const ARCH = "/tmp/ca" @@ -27,18 +27,10 @@ const COMP = "test.de/x" const PROVIDER = "acme.org" var _ = Describe("Test Environment", func() { - var env *TestEnv + var env *Environment BeforeEach(func() { - env = NewTestEnv() - env.OCMCommonTransport(ARCH, accessio.FormatDirectory, func() { - env.Component(COMP, func() { - env.Version(VERSION, func() { - env.Provider(PROVIDER) - }) - }) - }) - env.RSAKeyPair(PROVIDER) + env = NewEnvironment(TestData()) ctx := env.OCMContext() plugindirattr.Set(ctx, "testdata") @@ -52,18 +44,30 @@ var _ = Describe("Test Environment", func() { env.Cleanup() }) - It("adds entry by plugin option", func() { - buf := bytes.NewBuffer(nil) - Expect(env.CatchOutput(buf).Execute("add", "routingslip", ARCH, PROVIDER, "test", "--accessPath", "some path", "--mediaType", "media type")).To(Succeed()) - Expect(buf.String()).To(StringEqualTrimmedWithContext( - ` + It("handles plugin based entry type", func() { + prov := routingslip.For(env.OCMContext()).CreateConfigTypeSetConfigProvider().(flagsets.ExplicitlyTypedConfigTypeOptionSetConfigProvider) + configopts := prov.CreateOptions() + Expect(sliceutils.Transform(configopts.Options(), transformer.GetName[flagsets.Option, string])).To(ConsistOf( + "entry", "comment", // default settings + "mediaType", "accessPath", // by plugin + )) + + fs := &pflag.FlagSet{} + fs.SortFlags = true + configopts.AddFlags(fs) + Expect("\n" + fs.FlagUsages()).To(Equal(` + --accessPath string file path + --comment string comment field value + --entry YAML routing slip entry specification (YAML) + --mediaType string media type for artifact blob representation +`)) + MustBeSuccessful(fs.Parse([]string{"--accessPath", "some path", "--" + options.MediatypeOption.GetName(), "media type"})) + prov.SetTypeName("test") + data := Must(prov.GetConfigFor(configopts)) + Expect(data).To(YAMLEqual(` +type: test +mediaType: media type +path: some path `)) - repo := Must(ctf.Open(env, accessobj.ACC_READONLY, ARCH, 0, env)) - defer Close(repo, "repo") - cv := Must(repo.LookupComponentVersion(COMP, VERSION)) - defer Close(cv, "cv") - slip := Must(routingslip.GetSlip(cv, PROVIDER)) - Expect(slip.Len()).To(Equal(1)) - Expect(Must(slip.Get(0).Payload.Evaluate(env.OCMContext())).Describe(env.OCMContext())).To(Equal("a test")) }) }) diff --git a/pkg/contexts/ocm/labels/routingslip/types/plugin/entry_test.go b/pkg/contexts/ocm/labels/routingslip/types/plugin/entry_test.go index b6e998361e..3b2b183ea0 100644 --- a/pkg/contexts/ocm/labels/routingslip/types/plugin/entry_test.go +++ b/pkg/contexts/ocm/labels/routingslip/types/plugin/entry_test.go @@ -20,16 +20,16 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/labels/routingslip/spi" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/plugins" "github.com/open-component-model/ocm/pkg/contexts/ocm/registration" - env2 "github.com/open-component-model/ocm/pkg/env" + . "github.com/open-component-model/ocm/pkg/env" ) var _ = Describe("setup plugin cache", func() { var ctx ocm.Context var registry plugins.Set - var env *env2.Environment + var env *Environment BeforeEach(func() { - env = env2.NewEnvironment() + env = NewEnvironment() ctx = env.OCMContext() plugindirattr.Set(ctx, "testdata") registry = plugincacheattr.Get(ctx) diff --git a/pkg/contexts/ocm/repositories/virtual/repo_test.go b/pkg/contexts/ocm/repositories/virtual/repo_test.go index c069be8437..e8dd0ce36f 100644 --- a/pkg/contexts/ocm/repositories/virtual/repo_test.go +++ b/pkg/contexts/ocm/repositories/virtual/repo_test.go @@ -7,7 +7,8 @@ package virtual_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/open-component-model/ocm/cmds/ocm/testhelper" + . "github.com/open-component-model/ocm/pkg/env" + . "github.com/open-component-model/ocm/pkg/env/builder" . "github.com/open-component-model/ocm/pkg/testutils" "github.com/mandelsoft/vfs/pkg/layerfs" @@ -30,7 +31,7 @@ import ( ) var _ = Describe("virtual repo", func() { - var env *TestEnv + var env *Builder var repo ocm.Repository var access *example.Access @@ -43,7 +44,7 @@ var _ = Describe("virtual repo", func() { Context("readonly", func() { BeforeEach(func() { - env = NewTestEnv(TestData()) + env = NewBuilder(TestData()) access = Must(example.NewAccess(Must(projectionfs.New(env, "testdata")), true)) repo = virtual.NewRepository(env.OCMContext(), access) }) @@ -74,7 +75,7 @@ var _ = Describe("virtual repo", func() { Context("modifiable", func() { BeforeEach(func() { - env = NewTestEnv(TestData()) + env = NewBuilder(TestData()) fs := Must(projectionfs.New(env, "testdata")) fs = layerfs.New(memoryfs.New(), fs) diff --git a/pkg/contexts/ocm/utils/check/check_test.go b/pkg/contexts/ocm/utils/check/check_test.go index 33c7b99b53..259adf82f2 100644 --- a/pkg/contexts/ocm/utils/check/check_test.go +++ b/pkg/contexts/ocm/utils/check/check_test.go @@ -9,7 +9,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/open-component-model/ocm/cmds/ocm/testhelper" + . "github.com/open-component-model/ocm/pkg/env/builder" . "github.com/open-component-model/ocm/pkg/testutils" "github.com/open-component-model/ocm/pkg/common" @@ -30,10 +30,10 @@ const COMP3 = "test.de/z" const COMP4 = "test.de/a" var _ = Describe("Test Environment", func() { - var env *TestEnv + var env *Builder BeforeEach(func() { - env = NewTestEnv() + env = NewBuilder() }) AfterEach(func() { diff --git a/pkg/toi/support/app.go b/pkg/toi/support/app.go index 6875774f1c..0b1886f67e 100644 --- a/pkg/toi/support/app.go +++ b/pkg/toi/support/app.go @@ -13,7 +13,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" - common2 "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" + "github.com/open-component-model/ocm/pkg/clisupport" "github.com/open-component-model/ocm/pkg/cobrautils" "github.com/open-component-model/ocm/pkg/cobrautils/logopts" "github.com/open-component-model/ocm/pkg/common" @@ -135,7 +135,7 @@ func (o *BootstrapperCLIOptions) Complete() error { return errors.Newf("empty credential attribute set for %s", id.String()) } - set, err := common2.ParseLabels(vfsattr.Get(o.Context), o.Settings, "attribute setting") + set, err := clisupport.ParseLabels(vfsattr.Get(o.Context), o.Settings, "attribute setting") if err == nil && len(set) > 0 { ctx := o.Context.ConfigContext() spec := datactg.New() From ae2578b02696788e22b65ab503806b73cd27201c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Apr 2024 14:20:48 +0000 Subject: [PATCH 37/83] Bump github.com/docker/docker from 25.0.5+incompatible to 26.1.0+incompatible (#744) Bumps [github.com/docker/docker](https://github.com/docker/docker) from 25.0.5+incompatible to 26.1.0+incompatible.
    Commits
    • c8af8eb Merge pull request #47738 from vvoland/c8d-walk-image-badimagetarget
    • 7d95fe8 c8d/list: Ignore unexpected image target
    • 801fd16 Merge pull request #47735 from cpuguy83/better_walk_error
    • 6667e96 Include more details in errnotManifestOrIndex
    • ee8b788 Merge pull request #47734 from krissetto/image-history-timestamp-dereference
    • 96c9353 Merge pull request #47723 from vvoland/builder-fix-workdir-slash
    • ab570ab nil dereference fix on image history Created value
    • 7532420 container/SetupWorkingDirectory: Don't mutate config
    • a4d5b6b builder/normalizeWorkdir: Always return cleaned path
    • e829cca Merge pull request #47584 from robmry/upstream_dns_windows
    • Additional commits viewable in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/docker/docker&package-manager=go_modules&previous-version=25.0.5+incompatible&new-version=26.1.0+incompatible)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Hilmar Falkenberg --- go.mod | 3 ++- go.sum | 6 ++++-- pkg/contexts/oci/repositories/docker/namespace.go | 8 ++------ pkg/contexts/oci/repositories/docker/repository.go | 10 +++------- pkg/toi/drivers/docker/driver.go | 9 +++++---- 5 files changed, 16 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 3bc988c938..80b14f7091 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f github.com/distribution/reference v0.6.0 github.com/docker/cli v25.0.5+incompatible - github.com/docker/docker v25.0.5+incompatible + github.com/docker/docker v26.1.0+incompatible github.com/docker/go-connections v0.5.0 github.com/drone/envsubst v1.0.3 github.com/fluxcd/cli-utils v0.36.0-flux.5 @@ -238,6 +238,7 @@ require ( github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/locker v1.0.1 // indirect github.com/moby/spdystream v0.2.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect diff --git a/go.sum b/go.sum index 4eca05d991..2c1cc46488 100644 --- a/go.sum +++ b/go.sum @@ -314,8 +314,8 @@ github.com/docker/cli v25.0.5+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvM github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v26.1.0+incompatible h1:W1G9MPNbskA6VZWL7b3ZljTh0pXI68FpINx0GKaOdaM= +github.com/docker/docker v26.1.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo= github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= @@ -711,6 +711,8 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mittwald/go-helm-client v0.12.9 h1:tfI5ECgrbfAolA9TnlCeA5F2TEIvdsOxVmoSyW80lCI= github.com/mittwald/go-helm-client v0.12.9/go.mod h1:ukR3Et5zbfBij7bFL1ZnLvPytsbBXCrI2qQYr2yVi9I= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= diff --git a/pkg/contexts/oci/repositories/docker/namespace.go b/pkg/contexts/oci/repositories/docker/namespace.go index 8e289c604f..8790054c12 100644 --- a/pkg/contexts/oci/repositories/docker/namespace.go +++ b/pkg/contexts/oci/repositories/docker/namespace.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( @@ -11,7 +7,7 @@ import ( "github.com/containers/image/v5/image" "github.com/containers/image/v5/types" - dockertypes "github.com/docker/docker/api/types" + dockertypes "github.com/docker/docker/api/types/image" "github.com/mandelsoft/logging" "github.com/opencontainers/go-digest" @@ -131,7 +127,7 @@ func (n *namespaceContainer) GetBlobDescriptor(digest digest.Digest) *cpi.Descri } func (n *namespaceHandler) ListTags() ([]string, error) { - opts := dockertypes.ImageListOptions{} + opts := dockertypes.ListOptions{} list, err := n.repo.client.ImageList(dummyContext, opts) if err != nil { return nil, err diff --git a/pkg/contexts/oci/repositories/docker/repository.go b/pkg/contexts/oci/repositories/docker/repository.go index a645562bd3..59b43b5db5 100644 --- a/pkg/contexts/oci/repositories/docker/repository.go +++ b/pkg/contexts/oci/repositories/docker/repository.go @@ -1,14 +1,10 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( "strings" "github.com/containers/image/v5/types" - dockertypes "github.com/docker/docker/api/types" + dockertypes "github.com/docker/docker/api/types/image" "github.com/docker/docker/client" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" @@ -75,7 +71,7 @@ func (r *RepositoryImpl) GetNamespaces(prefix string, closure bool) ([]string, e } func (r *RepositoryImpl) GetRepositories() ([]string, error) { - opts := dockertypes.ImageListOptions{} + opts := dockertypes.ListOptions{} list, err := r.client.ImageList(dummyContext, opts) if err != nil { return nil, err @@ -103,7 +99,7 @@ func (r *RepositoryImpl) ExistsArtifact(name string, version string) (bool, erro if err != nil { return false, err } - opts := dockertypes.ImageListOptions{} + opts := dockertypes.ListOptions{} opts.Filters.Add("reference", ref.StringWithinTransport()) list, err := r.client.ImageList(dummyContext, opts) if err != nil { diff --git a/pkg/toi/drivers/docker/driver.go b/pkg/toi/drivers/docker/driver.go index 05c756cb5f..354e0fa0d7 100644 --- a/pkg/toi/drivers/docker/driver.go +++ b/pkg/toi/drivers/docker/driver.go @@ -15,6 +15,7 @@ import ( "github.com/docker/cli/cli/command" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/image" registrytypes "github.com/docker/docker/api/types/registry" "github.com/docker/docker/client" "github.com/docker/docker/pkg/jsonmessage" @@ -152,8 +153,8 @@ func (d *Driver) SetContainerErr(w io.Writer) { d.containerErr = w } -func pullImage(ctx context.Context, cli command.Cli, image string) error { - ref, err := reference.ParseNormalizedNamed(image) +func pullImage(ctx context.Context, cli command.Cli, imageName string) error { + ref, err := reference.ParseNormalizedNamed(imageName) if err != nil { return fmt.Errorf("unable to parse normalized name: %w", err) } @@ -171,11 +172,11 @@ func pullImage(ctx context.Context, cli command.Cli, image string) error { return fmt.Errorf("unable encode auth: %w", err) } - options := types.ImagePullOptions{ + options := image.PullOptions{ RegistryAuth: encodedAuth, } - responseBody, err := cli.Client().ImagePull(ctx, image, options) + responseBody, err := cli.Client().ImagePull(ctx, imageName, options) if err != nil { return fmt.Errorf("unable to pull image: %w", err) } From 2ea3ed6a91d84163e09f9673b67692842f18fee2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Apr 2024 14:33:56 +0000 Subject: [PATCH 38/83] Bump github.com/docker/cli from 25.0.5+incompatible to 26.1.0+incompatible (#743) Bumps [github.com/docker/cli](https://github.com/docker/cli) from 25.0.5+incompatible to 26.1.0+incompatible.
    Commits
    • 9714adc Merge pull request #5034 from vvoland/vendor-docker
    • aec1d36 vendor: github.com/docker/docker v26.1.0-dev (c8af8ebe4a89)
    • e397e50 Merge pull request #5033 from laurazard/hooks-error-message
    • 43cb06e hooks: pass command execution error to plugins
    • d8fc76e Merge pull request #5030 from laurazard/hooks-plugin-name
    • 9d8320d hooks: include full configured command
    • 118d6ba Merge pull request #4981 from vvoland/ci-validate-pr
    • 4eeb776 Merge pull request #5031 from vvoland/vendor-docker
    • 6ad5120 vendor: github.com/docker/docker v26.1.0-dev (ee8b788538ea)
    • c3243a8 ci/validate-pr: Use ::error:: command to print errors
    • Additional commits viewable in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/docker/cli&package-manager=go_modules&previous-version=25.0.5+incompatible&new-version=26.1.0+incompatible)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Hilmar Falkenberg --- go.mod | 21 +++++++++++++++------ go.sum | 43 ++++++++++++++++++++++++------------------- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/go.mod b/go.mod index 80b14f7091..2c9823614f 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/containers/image/v5 v5.30.0 github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f github.com/distribution/reference v0.6.0 - github.com/docker/cli v25.0.5+incompatible + github.com/docker/cli v26.1.0+incompatible github.com/docker/docker v26.1.0+incompatible github.com/docker/go-connections v0.5.0 github.com/drone/envsubst v1.0.3 @@ -138,6 +138,7 @@ require ( github.com/buildkite/agent/v3 v3.62.0 // indirect github.com/buildkite/go-pipeline v0.3.2 // indirect github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 // indirect @@ -207,6 +208,7 @@ require ( github.com/gorilla/websocket v1.5.1 // indirect github.com/gosuri/uitable v0.0.4 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -300,9 +302,15 @@ require ( go.mongodb.org/mongo-driver v1.14.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.25.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.25.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.22.0 // indirect + go.opentelemetry.io/otel/metric v1.25.0 // indirect + go.opentelemetry.io/otel/sdk v1.25.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.25.0 // indirect + go.opentelemetry.io/otel/trace v1.25.0 // indirect + go.opentelemetry.io/proto/otlp v1.1.0 // indirect go.starlark.net v0.0.0-20231121155337-90ade8b19d09 // indirect go.step.sm/crypto v0.44.2 // indirect go.uber.org/multierr v1.11.0 // indirect @@ -316,8 +324,9 @@ require ( golang.org/x/tools v0.19.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/api v0.172.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.62.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240311173647-c811ad7063a7 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect + google.golang.org/grpc v1.63.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/go-jose/go-jose.v2 v2.6.3 // indirect diff --git a/go.sum b/go.sum index 2c1cc46488..ab61779c55 100644 --- a/go.sum +++ b/go.sum @@ -227,8 +227,8 @@ github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251/go.mod h1:gb github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M= github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -309,8 +309,8 @@ github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aB github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2/go.mod h1:WHNsWjnIn2V1LYOrME7e8KxSeKunYHsxEm4am0BUtcI= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v25.0.5+incompatible h1:3Llw3kcE1gOScEojA247iDD+p1l9hHeC7H3vf3Zd5fk= -github.com/docker/cli v25.0.5+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v26.1.0+incompatible h1:+nwRy8Ocd8cYNQ60mozDDICICD8aoFGtlPXifX/UQ3Y= +github.com/docker/cli v26.1.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= @@ -549,7 +549,6 @@ github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= @@ -1003,20 +1002,26 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.4 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k= +go.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.25.0 h1:hDKnobznDpcdTlNzO0S/owRB8tyVr1OoeZZhDoqY+Cs= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.25.0/go.mod h1:kUDQaUs1h8iTIHbQTk+iJRiUvSfJYMMKTtMCaiVu7B0= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0 h1:9M3+rhx7kZCIQQhQRYaZCdNu1V73tm4TvXs2ntl98C4= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0/go.mod h1:noq80iT8rrHP1SfybmPiRGc9dc5M8RPmGvtwo7Oo7tc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.22.0 h1:H2JFgRcGiyHg7H7bwcwaQJYrNFqCqrbTQ8K4p1OvDu8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.22.0/go.mod h1:WfCWp1bGoYK8MeULtI15MmQVczfR+bFkk0DF3h06QmQ= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA= +go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s= +go.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo= +go.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw= +go.opentelemetry.io/otel/sdk/metric v1.25.0 h1:7CiHOy08LbrxMAp4vWpbiPcklunUshVpAvGBrdDRlGw= +go.opentelemetry.io/otel/sdk/metric v1.25.0/go.mod h1:LzwoKptdbBBdYfvtGCzGwk6GWMA3aUzBOwtQpR6Nz7o= +go.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM= +go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I= +go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= +go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= go.starlark.net v0.0.0-20231121155337-90ade8b19d09 h1:hzy3LFnSN8kuQK8h9tHl4ndF6UruMj47OqwqsS+/Ai4= go.starlark.net v0.0.0-20231121155337-90ade8b19d09/go.mod h1:LcLNIzVOMp4oV+uusnpk+VU+SzXaJakUuBjoCSWH5dM= go.step.sm/crypto v0.44.2 h1:t3p3uQ7raP2jp2ha9P6xkQF85TJZh+87xmjSLaib+jk= @@ -1210,8 +1215,8 @@ google.golang.org/genproto v0.0.0-20240311173647-c811ad7063a7 h1:ImUcDPHjTrAqNhl google.golang.org/genproto v0.0.0-20240311173647-c811ad7063a7/go.mod h1:/3XmxOjePkvmKrHuBy4zNFw7IzxJXtAgdpXi8Ll990U= google.golang.org/genproto/googleapis/api v0.0.0-20240311173647-c811ad7063a7 h1:oqta3O3AnlWbmIE3bFnWbu4bRxZjfbWCp0cKSuZh01E= google.golang.org/genproto/googleapis/api v0.0.0-20240311173647-c811ad7063a7/go.mod h1:VQW3tUculP/D4B+xVCo+VgSq8As6wA9ZjHl//pmk+6s= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= @@ -1219,8 +1224,8 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= -google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= +google.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8= +google.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From f125c4b6242aa72b5363e3d4a9222560caafe46c Mon Sep 17 00:00:00 2001 From: Gerald Morrison <67469729+morri-son@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:48:20 +0200 Subject: [PATCH 39/83] change wording (#747) ## Description Minor change to the ocm command documentation. --- cmds/ocm/commands/ocmcmds/components/add/cmd.go | 4 ++-- docs/reference/ocm_add_componentversions.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmds/ocm/commands/ocmcmds/components/add/cmd.go b/cmds/ocm/commands/ocmcmds/components/add/cmd.go index 4d60a5b216..9c41c7f346 100644 --- a/cmds/ocm/commands/ocmcmds/components/add/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/add/cmd.go @@ -114,8 +114,8 @@ The resource text is taken from a file testdata locate next to the description file. `, Long: ` -Add component versions specified by a description file to a Common Transport -Archive. This might be either a directory prepared to host component version +Add component versions specified by a constructor file to a Common Transport +Archive. The archive might be either a directory prepared to host component version content or a tar/tgz file (see option --type). If option --create is given, the archive is created first. An diff --git a/docs/reference/ocm_add_componentversions.md b/docs/reference/ocm_add_componentversions.md index d54e8dd1f5..990c62f5c4 100644 --- a/docs/reference/ocm_add_componentversions.md +++ b/docs/reference/ocm_add_componentversions.md @@ -36,8 +36,8 @@ componentversions, componentversion, cv, components, component, comps, comp, c ### Description -Add component versions specified by a description file to a Common Transport -Archive. This might be either a directory prepared to host component version +Add component versions specified by a constructor file to a Common Transport +Archive. The archive might be either a directory prepared to host component version content or a tar/tgz file (see option --type). If option --create is given, the archive is created first. An From 2ff7417264c5a5fe5c88c033129d3fa63b50f77b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 09:14:49 +0200 Subject: [PATCH 40/83] Bump github.com/fluxcd/cli-utils from 0.36.0-flux.5 to 0.36.0-flux.6 (#737) Bumps [github.com/fluxcd/cli-utils](https://github.com/fluxcd/cli-utils) from 0.36.0-flux.5 to 0.36.0-flux.6.
    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/fluxcd/cli-utils&package-manager=go_modules&previous-version=0.36.0-flux.5&new-version=0.36.0-flux.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Hilmar Falkenberg --- go.mod | 32 +++++++++++++++++--------------- go.sum | 56 ++++++++++++++++++++++++++++---------------------------- 2 files changed, 45 insertions(+), 43 deletions(-) diff --git a/go.mod b/go.mod index 2c9823614f..4d8bd28cf3 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/open-component-model/ocm -go 1.22 +go 1.22.0 + +toolchain go1.22.2 replace github.com/spf13/cobra => github.com/open-component-model/cobra v0.0.0-20230329075350-b1fd876abfb9 @@ -23,7 +25,7 @@ require ( github.com/docker/docker v26.1.0+incompatible github.com/docker/go-connections v0.5.0 github.com/drone/envsubst v1.0.3 - github.com/fluxcd/cli-utils v0.36.0-flux.5 + github.com/fluxcd/cli-utils v0.36.0-flux.6 github.com/fluxcd/pkg/ssa v0.38.0 github.com/gertd/go-pluralize v0.2.1 github.com/ghodss/yaml v1.0.0 @@ -70,11 +72,11 @@ require ( golang.org/x/text v0.14.0 gopkg.in/yaml.v3 v3.0.1 helm.sh/helm/v3 v3.14.4 - k8s.io/api v0.29.3 - k8s.io/apiextensions-apiserver v0.29.3 - k8s.io/apimachinery v0.29.3 - k8s.io/cli-runtime v0.29.3 - k8s.io/client-go v0.29.3 + k8s.io/api v0.30.0 + k8s.io/apiextensions-apiserver v0.30.0 + k8s.io/apimachinery v0.30.0 + k8s.io/cli-runtime v0.30.0 + k8s.io/client-go v0.30.0 sigs.k8s.io/controller-runtime v0.17.2 sigs.k8s.io/yaml v1.4.0 ) @@ -163,7 +165,7 @@ require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/emicklei/go-restful/v3 v3.11.1 // indirect github.com/evanphx/json-patch v5.7.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.8.0 // indirect + github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/fatih/color v1.16.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect @@ -316,12 +318,12 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/crypto v0.22.0 // indirect - golang.org/x/mod v0.16.0 // indirect + golang.org/x/mod v0.17.0 // indirect golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/term v0.19.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.19.0 // indirect + golang.org/x/tools v0.20.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/api v0.172.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240311173647-c811ad7063a7 // indirect @@ -333,15 +335,15 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiserver v0.29.3 // indirect - k8s.io/component-base v0.29.3 // indirect + k8s.io/apiserver v0.30.0 // indirect + k8s.io/component-base v0.30.0 // indirect k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20240103195357-a9f8850cb432 // indirect - k8s.io/kubectl v0.29.3 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/kubectl v0.30.0 // indirect k8s.io/utils v0.0.0-20240310230437-4693a0247e57 // indirect oras.land/oras-go v1.2.5 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/kustomize/api v0.17.0 // indirect + sigs.k8s.io/kustomize/api v0.17.1 // indirect sigs.k8s.io/kustomize/kyaml v0.17.0 // indirect sigs.k8s.io/release-utils v0.7.7 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect diff --git a/go.sum b/go.sum index ab61779c55..dd484b4a2f 100644 --- a/go.sum +++ b/go.sum @@ -348,16 +348,16 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI= github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= -github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= +github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fluxcd/cli-utils v0.36.0-flux.5 h1:I4joM3LW8w7PixC2SsxKG6E0PizoKhs8r91cQdTYMzw= -github.com/fluxcd/cli-utils v0.36.0-flux.5/go.mod h1:1E7LHgOwAJiAZEEo3+ouZOyl4KafYwfqxz1pwrrrXzo= +github.com/fluxcd/cli-utils v0.36.0-flux.6 h1:SQuBgZFGPJbksLEA1gYkfqmIorhcZDd2QuDcmwL53h8= +github.com/fluxcd/cli-utils v0.36.0-flux.6/go.mod h1:zH0+K5kx9Lp9ZGlei5LdTXw96HX0K/kzOTbLYuVW+I8= github.com/fluxcd/pkg/ssa v0.38.0 h1:Hn7Ow8dJVHzDz1IvTOvudno/CRDY1kgHqKQ42/iJiRg= github.com/fluxcd/pkg/ssa v0.38.0/go.mod h1:LcTL2SP4MOdKA9z3/g3cNB30v/j/NiNHEPqMJHwHLJI= github.com/foxcpp/go-mockdns v1.0.0 h1:7jBqxd3WDWwi/6WhDvacvH1XsN3rOLXyHM1uhvIx6FI= @@ -1068,8 +1068,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1195,8 +1195,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= -golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= +golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= +golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1279,26 +1279,26 @@ helm.sh/helm/v3 v3.14.4 h1:6FSpEfqyDalHq3kUr4gOMThhgY55kXUEjdQoyODYnrM= helm.sh/helm/v3 v3.14.4/go.mod h1:Tje7LL4gprZpuBNTbG34d1Xn5NmRT3OWfBRwpOSer9I= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= -k8s.io/apiextensions-apiserver v0.29.3 h1:9HF+EtZaVpFjStakF4yVufnXGPRppWFEQ87qnO91YeI= -k8s.io/apiextensions-apiserver v0.29.3/go.mod h1:po0XiY5scnpJfFizNGo6puNU6Fq6D70UJY2Cb2KwAVc= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= -k8s.io/apiserver v0.29.3 h1:xR7ELlJ/BZSr2n4CnD3lfA4gzFivh0wwfNfz9L0WZcE= -k8s.io/apiserver v0.29.3/go.mod h1:hrvXlwfRulbMbBgmWRQlFru2b/JySDpmzvQwwk4GUOs= -k8s.io/cli-runtime v0.29.3 h1:r68rephmmytoywkw2MyJ+CxjpasJDQY7AGc3XY2iv1k= -k8s.io/cli-runtime v0.29.3/go.mod h1:aqVUsk86/RhaGJwDhHXH0jcdqBrgdF3bZWk4Z9D4mkM= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= -k8s.io/component-base v0.29.3 h1:Oq9/nddUxlnrCuuR2K/jp6aflVvc0uDvxMzAWxnGzAo= -k8s.io/component-base v0.29.3/go.mod h1:Yuj33XXjuOk2BAaHsIGHhCKZQAgYKhqIxIjIr2UXYio= +k8s.io/api v0.30.0 h1:siWhRq7cNjy2iHssOB9SCGNCl2spiF1dO3dABqZ8niA= +k8s.io/api v0.30.0/go.mod h1:OPlaYhoHs8EQ1ql0R/TsUgaRPhpKNxIMrKQfWUp8QSE= +k8s.io/apiextensions-apiserver v0.30.0 h1:jcZFKMqnICJfRxTgnC4E+Hpcq8UEhT8B2lhBcQ+6uAs= +k8s.io/apiextensions-apiserver v0.30.0/go.mod h1:N9ogQFGcrbWqAY9p2mUAL5mGxsLqwgtUce127VtRX5Y= +k8s.io/apimachinery v0.30.0 h1:qxVPsyDM5XS96NIh9Oj6LavoVFYff/Pon9cZeDIkHHA= +k8s.io/apimachinery v0.30.0/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= +k8s.io/apiserver v0.30.0 h1:QCec+U72tMQ+9tR6A0sMBB5Vh6ImCEkoKkTDRABWq6M= +k8s.io/apiserver v0.30.0/go.mod h1:smOIBq8t0MbKZi7O7SyIpjPsiKJ8qa+llcFCluKyqiY= +k8s.io/cli-runtime v0.30.0 h1:0vn6/XhOvn1RJ2KJOC6IRR2CGqrpT6QQF4+8pYpWQ48= +k8s.io/cli-runtime v0.30.0/go.mod h1:vATpDMATVTMA79sZ0YUCzlMelf6rUjoBzlp+RnoM+cg= +k8s.io/client-go v0.30.0 h1:sB1AGGlhY/o7KCyCEQ0bPWzYDL0pwOZO4vAtTSh/gJQ= +k8s.io/client-go v0.30.0/go.mod h1:g7li5O5256qe6TYdAMyX/otJqMhIiGgTapdLchhmOaY= +k8s.io/component-base v0.30.0 h1:cj6bp38g0ainlfYtaOQuRELh5KSYjhKxM+io7AUIk4o= +k8s.io/component-base v0.30.0/go.mod h1:V9x/0ePFNaKeKYA3bOvIbrNoluTSG+fSJKjLdjOoeXQ= k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240103195357-a9f8850cb432 h1:+XYBQU3ZKUu60H6fEnkitTTabGoKfIG8zczhZBENu9o= -k8s.io/kube-openapi v0.0.0-20240103195357-a9f8850cb432/go.mod h1:Pa1PvrP7ACSkuX6I7KYomY6cmMA0Tx86waBhDUgoKPw= -k8s.io/kubectl v0.29.3 h1:RuwyyIU42MAISRIePaa8Q7A3U74Q9P4MoJbDFz9o3us= -k8s.io/kubectl v0.29.3/go.mod h1:yCxfY1dbwgVdEt2zkJ6d5NNLOhhWgTyrqACIoFhpdd4= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/kubectl v0.30.0 h1:xbPvzagbJ6RNYVMVuiHArC1grrV5vSmmIcSZuCdzRyk= +k8s.io/kubectl v0.30.0/go.mod h1:zgolRw2MQXLPwmic2l/+iHs239L49fhSeICuMhQQXTI= k8s.io/utils v0.0.0-20240310230437-4693a0247e57 h1:gbqbevonBh57eILzModw6mrkbwM0gQBEuevE/AaBsHY= k8s.io/utils v0.0.0-20240310230437-4693a0247e57/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= @@ -1307,8 +1307,8 @@ sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeG sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kustomize/api v0.17.0 h1:AygX5EzZ+2NDxCWkeHy4IK2oftvl4odZZJmq1rK4HYU= -sigs.k8s.io/kustomize/api v0.17.0/go.mod h1:ffn5491s2EiNrJSmgqcWGzQUVhc/pB0OKNI0HsT/0tA= +sigs.k8s.io/kustomize/api v0.17.1 h1:MYJBOP/yQ3/5tp4/sf6HiiMfNNyO97LmtnirH9SLNr4= +sigs.k8s.io/kustomize/api v0.17.1/go.mod h1:ffn5491s2EiNrJSmgqcWGzQUVhc/pB0OKNI0HsT/0tA= sigs.k8s.io/kustomize/kyaml v0.17.0 h1:G2bWs03V9Ur2PinHLzTUJ8Ded+30SzXZKiO92SRDs3c= sigs.k8s.io/kustomize/kyaml v0.17.0/go.mod h1:6lxkYF1Cv9Ic8g/N7I86cvxNc5iinUo/P2vKsHNmpyE= sigs.k8s.io/release-utils v0.7.7 h1:JKDOvhCk6zW8ipEOkpTGDH/mW3TI+XqtPp16aaQ79FU= From 09bb41cb768b2c8197c3c827817a3b5a3e3f815a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 07:25:32 +0000 Subject: [PATCH 41/83] Bump the go group across 1 directory with 3 updates (#748) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the go group with 3 updates in the / directory: [github.com/klauspost/compress](https://github.com/klauspost/compress), [github.com/onsi/gomega](https://github.com/onsi/gomega) and [sigs.k8s.io/controller-runtime](https://github.com/kubernetes-sigs/controller-runtime). Updates `github.com/klauspost/compress` from 1.17.7 to 1.17.8
    Release notes

    Sourced from github.com/klauspost/compress's releases.

    v1.17.8

    What's Changed

    New Contributors

    Full Changelog: https://github.com/klauspost/compress/compare/v1.17.7...v1.17.8

    Commits

    Updates `github.com/onsi/gomega` from 1.32.0 to 1.33.0
    Release notes

    Sourced from github.com/onsi/gomega's releases.

    v1.33.0

    1.33.0

    Features

    Receive not accepts Receive(<POINTER>, MATCHER>), allowing you to pick out a specific value on the channel that satisfies the provided matcher and is stored in the provided pointer.

    Maintenance

    • Bump github.com/onsi/ginkgo/v2 from 2.15.0 to 2.17.1 (#745) [9999deb]
    • Bump github-pages from 229 to 230 in /docs (#735) [cb5ff21]
    • Bump golang.org/x/net from 0.20.0 to 0.23.0 (#746) [bac6596]
    Changelog

    Sourced from github.com/onsi/gomega's changelog.

    1.33.0

    Features

    Receive not accepts Receive(<POINTER>, MATCHER>), allowing you to pick out a specific value on the channel that satisfies the provided matcher and is stored in the provided pointer.

    Maintenance

    • Bump github.com/onsi/ginkgo/v2 from 2.15.0 to 2.17.1 (#745) [9999deb]
    • Bump github-pages from 229 to 230 in /docs (#735) [cb5ff21]
    • Bump golang.org/x/net from 0.20.0 to 0.23.0 (#746) [bac6596]
    Commits
    • f2e65fc v1.33.0
    • 02e8706 docs: Receive(POINTER, MATCHER)
    • ec1f186 feat: receiver matcher accepting (POINTER, MATCHER), includes unit tests
    • 9999deb Bump github.com/onsi/ginkgo/v2 from 2.15.0 to 2.17.1 (#745)
    • cb5ff21 Bump github-pages from 229 to 230 in /docs (#735)
    • bac6596 Bump golang.org/x/net from 0.20.0 to 0.23.0 (#746)
    • See full diff in compare view

    Updates `sigs.k8s.io/controller-runtime` from 0.17.2 to 0.18.0
    Release notes

    Sourced from sigs.k8s.io/controller-runtime's releases.

    v0.18.0

    :warning: Breaking Changes

    • Bump to k8s.io/* v1.30 (#2693 #2754 #2765 #2776 #2786)
    • Remove deprecated v1alpha1.ControllerManagerConfiguration (#2648)
    • admission.Decoder is now an interface (#2736)
    • Source, Event, Predicate, Handler: Add generics support (#2783 #2796)
    • client: Fix SubResourceCreateOptions signature in subresource client (#2766)

    :sparkles: New Features

    • cache: Add TransformStripManagedFields transform func (#2791)
    • client: Add client.WithFieldOwner to configure client-wide FieldManager (#2771 #2777)
    • controller: Add NewQueue option (#2767)
    • manager: Export HTTP server runnable implementation (#2473)
    • metrics/server: Add ListenConfig option (#2519)

    :bug: Bug Fixes

    • builder/webhook: Return error if For() is used multiple times (#2740)
    • cache: Keep selectors when byObject.Namespaces is defaulted (#2747)
    • cache: Prevent race when informers are started more than once (#2758)
    • fake client: Allow fakeclient to patch CR with no resourceVersion (#2725)
    • fake client: Do not consider an apply patch to be a strategic merge patch (#2679)
    • manager: Prevent leader election when shutting down a non-elected manager (#2724)
    • manager: Runnable group should check if stopped before enqueueing (#2757)
    • restmapper: Clean restmapper cache if a version is notFound (#2663)
    • restmapper: Fix cache invalidation (#2687)

    :seedling: Others

    • ci: Add OSSF scorecard action (#2714)
    • ci: Improve github actions dependencies versions and permissions (#2715)
    • ci: Pin checkout action in golangci-lint action, bump checkout action, use consistent tag format (#2729)
    • ci: Update golangci-lint to v1.57.2 (#2708 #2751)
    • ci: Update scorecard github action (#2728)
    • ci: Use go-install for versioned dependencies (#2710)
    • envtest: WaitForDefaultNamespace while starting up envtest (#2668)
    • owners: Cleanup owners files (#2730)
    • owners: Remove outdated testing framework approvers (#2709)
    • predicate: Compare labels and annotations using maps.Equal (#2705)
    • typos: Fix typo of CacheReader comment (#2773)
    • typos: Fix typo in channel option (#2792)
    • typos: Minor typo fixes in docstrings (#2727)

    :book: Additionally, there have been 3 contributions to our documentation and book. (#2712, #2770, #2789)

    Dependencies

    ... (truncated)

    Commits
    • ed81fa6 Merge pull request #2796 from alvaroaleman/mark
    • b35cd6b :book: Mark Typed Handlers as experimental
    • b74908f Merge pull request #2793 from kubernetes-sigs/dependabot/github_actions/actio...
    • a9db208 Merge pull request #2794 from kubernetes-sigs/dependabot/github_actions/actio...
    • 757ae66 :seedling: Bump actions/upload-artifact from 4.3.1 to 4.3.3
    • 18ae9e0 :seedling: Bump actions/checkout from 4.1.2 to 4.1.3
    • 4f00207 Merge pull request #2792 from sbueringer/pr-fix-typo
    • 9fb4913 Fix typo in channel option
    • 5823d1b Merge pull request #2791 from alvaroaleman/add-default-transform
    • ae0f6ab Merge pull request #2783 from alvaroaleman/compatible-generics
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 4d8bd28cf3..2fb9c75696 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/google/go-github/v45 v45.2.0 github.com/hashicorp/vault-client-go v0.4.3 github.com/imdario/mergo v0.3.16 - github.com/klauspost/compress v1.17.7 + github.com/klauspost/compress v1.17.8 github.com/klauspost/pgzip v1.2.6 github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3 github.com/mandelsoft/goutils v0.0.0-20240422120338-5e35748a0391 @@ -50,7 +50,7 @@ require ( github.com/mittwald/go-helm-client v0.12.9 github.com/modern-go/reflect2 v1.0.2 github.com/onsi/ginkgo/v2 v2.17.1 - github.com/onsi/gomega v1.32.0 + github.com/onsi/gomega v1.33.0 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.1.0 github.com/pkg/errors v0.9.1 @@ -77,7 +77,7 @@ require ( k8s.io/apimachinery v0.30.0 k8s.io/cli-runtime v0.30.0 k8s.io/client-go v0.30.0 - sigs.k8s.io/controller-runtime v0.17.2 + sigs.k8s.io/controller-runtime v0.18.0 sigs.k8s.io/yaml v1.4.0 ) diff --git a/go.sum b/go.sum index dd484b4a2f..505dbbed3a 100644 --- a/go.sum +++ b/go.sum @@ -628,8 +628,8 @@ github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVE github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= -github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= +github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -764,8 +764,8 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.32.0 h1:JRYU78fJ1LPxlckP6Txi/EYqJvjtMrDC04/MM5XRHPk= -github.com/onsi/gomega v1.32.0/go.mod h1:a4x4gW6Pz2yK1MAmvluYme5lvYTn61afQ2ETw/8n4Lg= +github.com/onsi/gomega v1.33.0 h1:snPCflnZrpMsy94p4lXVEkHo12lmPnc3vY5XBbreexE= +github.com/onsi/gomega v1.33.0/go.mod h1:+925n5YtiFsLzzafLUHzVMBpvvRAzrydIBiSIxjX3wY= github.com/open-component-model/cobra v0.0.0-20230329075350-b1fd876abfb9 h1:b2cJvZ8nWAVvCqvPhUaFl26Wht4nM4mqfl2ksY9lVzU= github.com/open-component-model/cobra v0.0.0-20230329075350-b1fd876abfb9/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/open-policy-agent/opa v0.63.0 h1:ztNNste1v8kH0/vJMJNquE45lRvqwrM5mY9Ctr9xIXw= @@ -1303,8 +1303,8 @@ k8s.io/utils v0.0.0-20240310230437-4693a0247e57 h1:gbqbevonBh57eILzModw6mrkbwM0g k8s.io/utils v0.0.0-20240310230437-4693a0247e57/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo= -sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= -sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= +sigs.k8s.io/controller-runtime v0.18.0 h1:Z7jKuX784TQSUL1TIyeuF7j8KXZ4RtSX0YgtjKcSTME= +sigs.k8s.io/controller-runtime v0.18.0/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kustomize/api v0.17.1 h1:MYJBOP/yQ3/5tp4/sf6HiiMfNNyO97LmtnirH9SLNr4= From 4b9a12f8017bf51712c03253d3c4ac2071ce522e Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Fri, 26 Apr 2024 14:23:21 +0200 Subject: [PATCH 42/83] eliminate dep from demo plugin to cli (#746) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change. ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [x] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [x] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- cmds/demoplugin/valuesets/check_test.go | 126 +++++++++++++----- .../commands/ocmcmds/routingslips/add/cmd.go | 2 +- .../flagsets/flagsetscheme/scheme.go | 41 +++++- .../ocm/attrs/plugincacheattr/attr.go | 3 +- .../labels/routingslip/internal/entrytypes.go | 12 +- .../routingslip/types/plugin/cmd_test.go | 2 +- pkg/contexts/ocm/registration/registration.go | 3 +- 7 files changed, 149 insertions(+), 40 deletions(-) diff --git a/cmds/demoplugin/valuesets/check_test.go b/cmds/demoplugin/valuesets/check_test.go index c11f85aba0..fc18624394 100644 --- a/cmds/demoplugin/valuesets/check_test.go +++ b/cmds/demoplugin/valuesets/check_test.go @@ -4,19 +4,24 @@ //go:build unix -package valuesets +package valuesets_test import ( - "bytes" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/env" + . "github.com/open-component-model/ocm/pkg/env/builder" . "github.com/open-component-model/ocm/pkg/testutils" - "github.com/open-component-model/ocm/cmds/ocm/testhelper" - "github.com/open-component-model/ocm/pkg/common/accessio" + "github.com/spf13/pflag" + + "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugincacheattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugindirattr" + "github.com/open-component-model/ocm/pkg/contexts/ocm/labels/routingslip" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/cache" + "github.com/open-component-model/ocm/pkg/contexts/ocm/registration" + "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/composition" + "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" ) const ARCH = "/tmp/ctf" @@ -25,39 +30,100 @@ const VERS = "1.0.0" const PROV = "acme.org" var _ = Describe("demoplugin", func() { - var env *testhelper.TestEnv + /* + Context("cli", func() { + var env *testhelper.TestEnv + + BeforeEach(func() { + env = testhelper.NewTestEnv(testhelper.TestData()) + + cache.DirectoryCache.Reset() + plugindirattr.Set(env.OCMContext(), "testdata") + + env.OCMCommonTransport(ARCH, accessio.FormatDirectory, func() { + env.ComponentVersion(COMP, VERS, func() { + env.Provider(PROV) + }) + }) + env.RSAKeyPair(PROV) + }) + + AfterEach(func() { + env.Cleanup() + }) + + It("add check routing slip entry", func() { + buf := bytes.NewBuffer(nil) + MustBeSuccessful(env.CatchOutput(buf).Execute("add", "routingslip", ARCH, PROV, "check", "--checkStatus", "test=passed", "--checkMessage", "test=25 tests successful")) + Expect(buf.String()).To(Equal("")) + + buf.Reset() + MustBeSuccessful(env.CatchOutput(buf).Execute("get", "routingslip", ARCH, PROV)) + Expect(buf.String()).To(StringMatchTrimmedWithContext(` + COMPONENT-VERSION NAME TYPE TIMESTAMP DESCRIPTION + acme.org/test:1.0.0 acme.org check .{20} test: passed + `)) + buf.Reset() + MustBeSuccessful(env.CatchOutput(buf).Execute("get", "routingslip", ARCH, PROV, "-oyaml")) + Expect(buf.String()).To(StringMatchTrimmedWithContext(`message: 25 tests successful`)) + }) + }) + */ + + Context("lib", func() { + var env *Builder - BeforeEach(func() { - env = testhelper.NewTestEnv() + BeforeEach(func() { + env = NewBuilder(TestData()) - cache.DirectoryCache.Reset() - plugindirattr.Set(env.OCMContext(), "testdata") + cache.DirectoryCache.Reset() + plugindirattr.Set(env.OCMContext(), "testdata") - env.OCMCommonTransport(ARCH, accessio.FormatDirectory, func() { - env.ComponentVersion(COMP, VERS, func() { - env.Provider(PROV) + registry := plugincacheattr.Get(env) + Expect(registration.RegisterExtensions(env)).To(Succeed()) + p := registry.Get("demo") + Expect(p).NotTo(BeNil()) + + env.OCMCompositionRepository("test", func() { + env.ComponentVersion(COMP, VERS, func() { + env.Provider(PROV) + }) }) + env.RSAKeyPair(PROV) }) - env.RSAKeyPair(PROV) - }) - AfterEach(func() { - env.Cleanup() - }) + AfterEach(func() { + env.Cleanup() + }) + + It("add check routing slip entry", func() { + fs := &pflag.FlagSet{} + prov := routingslip.For(env).CreateConfigTypeSetConfigProvider() + configopts := prov.CreateOptions() + configopts.AddFlags(fs) - It("add check routing slip entry", func() { - buf := bytes.NewBuffer(nil) - MustBeSuccessful(env.CatchOutput(buf).Execute("add", "routingslip", ARCH, PROV, "check", "--checkStatus", "test=passed", "--checkMessage", "test=25 tests successful")) - Expect(buf.String()).To(Equal("")) + MustBeSuccessful(fs.Parse([]string{"--checkStatus", "test=passed", "--checkMessage", "test=25 tests successful"})) + prov.SetTypeName("check") + data := Must(prov.GetConfigFor(configopts)) - buf.Reset() - MustBeSuccessful(env.CatchOutput(buf).Execute("get", "routingslip", ARCH, PROV)) - Expect(buf.String()).To(StringMatchTrimmedWithContext(` -COMPONENT-VERSION NAME TYPE TIMESTAMP DESCRIPTION -acme.org/test:1.0.0 acme.org check .{20} test: passed + Expect(data).To(YAMLEqual(` +type: check +checks: + test: + status: passed + message: 25 tests successful `)) - buf.Reset() - MustBeSuccessful(env.CatchOutput(buf).Execute("get", "routingslip", ARCH, PROV, "-oyaml")) - Expect(buf.String()).To(StringMatchTrimmedWithContext(`message: 25 tests successful`)) + + entry := Must(routingslip.NewGenericEntry("", data)) + MustBeSuccessful(entry.Validate(env.OCMContext())) + + repo := composition.NewRepository(env, "test") + defer Close(repo, "repo") + + cv := Must(repo.LookupComponentVersion(COMP, VERS)) + defer Close(cv, "cv") + + Must(routingslip.AddEntry(cv, PROV, rsa.Algorithm, entry, nil)) + }) }) }) diff --git a/cmds/ocm/commands/ocmcmds/routingslips/add/cmd.go b/cmds/ocm/commands/ocmcmds/routingslips/add/cmd.go index 8a4efd6e2e..b47d086340 100644 --- a/cmds/ocm/commands/ocmcmds/routingslips/add/cmd.go +++ b/cmds/ocm/commands/ocmcmds/routingslips/add/cmd.go @@ -82,7 +82,7 @@ $ ocm add routingslip ghcr.io/mandelsoft/ocm//ocmdemoinstaller:0.0.1-dev mandels } func (o *Command) AddFlags(fs *pflag.FlagSet) { - o.prov = routingslip.For(o.OCMContext()).CreateConfigTypeSetConfigProvider().(flagsets.ExplicitlyTypedConfigTypeOptionSetConfigProvider) + o.prov = routingslip.For(o.OCMContext()).CreateConfigTypeSetConfigProvider() o.configopts = o.prov.CreateOptions() o.configopts.AddFlags(fs) diff --git a/pkg/cobrautils/flagsets/flagsetscheme/scheme.go b/pkg/cobrautils/flagsets/flagsetscheme/scheme.go index c403fe28d4..327b2ea997 100644 --- a/pkg/cobrautils/flagsets/flagsetscheme/scheme.go +++ b/pkg/cobrautils/flagsets/flagsetscheme/scheme.go @@ -22,12 +22,43 @@ type VersionTypedObjectType[T runtime.VersionedTypedObject] interface { //////////////////////////////////////////////////////////////////////////////// +// ExtendedTypeScheme is the appropriately extended scheme interface based on +// runtime.TypeScheme supporting an extended config provider interface. +type ExtendedTypeScheme[T runtime.VersionedTypedObject, R VersionTypedObjectType[T], P flagsets.ConfigTypeOptionSetConfigProvider] interface { + descriptivetype.TypeScheme[T, R] + + CreateConfigTypeSetConfigProvider() P + + Unwrap() TypeScheme[T, R] +} + +type _TypeScheme[T runtime.VersionedTypedObject, R VersionTypedObjectType[T]] interface { + TypeScheme[T, R] +} + +type typeSchemeWrapper[T runtime.VersionedTypedObject, R VersionTypedObjectType[T], P flagsets.ConfigTypeOptionSetConfigProvider] struct { + _TypeScheme[T, R] +} + +func (s *typeSchemeWrapper[T, R, P]) CreateConfigTypeSetConfigProvider() P { + return s._TypeScheme.CreateConfigTypeSetConfigProvider().(P) +} + +func (s *typeSchemeWrapper[T, R, P]) Unwrap() TypeScheme[T, R] { + return s._TypeScheme +} + +// NewTypeSchemeWrapper wraps a [TypeScheme] into a scheme returning a specialized config provider +// by casting the result. The type scheme constructor provides different implementations based on its +// arguments. This method here can be used to provide a type scheme returning the correct type. +func NewTypeSchemeWrapper[T runtime.VersionedTypedObject, R VersionTypedObjectType[T], P flagsets.ConfigTypeOptionSetConfigProvider](s TypeScheme[T, R]) ExtendedTypeScheme[T, R, P] { + return &typeSchemeWrapper[T, R, P]{s} +} + // TypeScheme is the appropriately extended scheme interface based on // runtime.TypeScheme. type TypeScheme[T runtime.VersionedTypedObject, R VersionTypedObjectType[T]] interface { - descriptivetype.TypeScheme[T, R] - - CreateConfigTypeSetConfigProvider() flagsets.ConfigTypeOptionSetConfigProvider + ExtendedTypeScheme[T, R, flagsets.ConfigTypeOptionSetConfigProvider] } type _typeScheme[T runtime.VersionedTypedObject, R VersionTypedObjectType[T]] interface { @@ -62,6 +93,10 @@ func NewTypeScheme[T runtime.VersionedTypedObject, R VersionTypedObjectType[T], } } +func (s *typeScheme[T, R, S]) Unwrap() TypeScheme[T, R] { + return s +} + func (t *typeScheme[T, R, S]) CreateConfigTypeSetConfigProvider() flagsets.ConfigTypeOptionSetConfigProvider { var prov flagsets.ConfigTypeOptionSetConfigProvider if t.typeOption == "" { diff --git a/pkg/contexts/ocm/attrs/plugincacheattr/attr.go b/pkg/contexts/ocm/attrs/plugincacheattr/attr.go index 0a365e9149..ad49116ce3 100644 --- a/pkg/contexts/ocm/attrs/plugincacheattr/attr.go +++ b/pkg/contexts/ocm/attrs/plugincacheattr/attr.go @@ -18,7 +18,8 @@ const ( //////////////////////////////////////////////////////////////////////////////// -func Get(ctx ocm.Context) plugins.Set { +func Get(ctxp ocm.ContextProvider) plugins.Set { + ctx := ctxp.OCMContext() path := plugindirattr.Get(ctx) // avoid dead lock reading attribute during attribute creation diff --git a/pkg/contexts/ocm/labels/routingslip/internal/entrytypes.go b/pkg/contexts/ocm/labels/routingslip/internal/entrytypes.go index 932d972c41..bf6b232287 100644 --- a/pkg/contexts/ocm/labels/routingslip/internal/entrytypes.go +++ b/pkg/contexts/ocm/labels/routingslip/internal/entrytypes.go @@ -10,8 +10,10 @@ import ( "reflect" "strings" + "github.com/mandelsoft/goutils/sliceutils" "github.com/modern-go/reflect2" + "github.com/open-component-model/ocm/pkg/cobrautils/flagsets" "github.com/open-component-model/ocm/pkg/cobrautils/flagsets/flagsetscheme" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/errors" @@ -42,14 +44,18 @@ type ( //////////////////////////////////////////////////////////////////////////////// -type EntryTypeScheme = flagsetscheme.TypeScheme[Entry, EntryType] +type EntryTypeScheme = flagsetscheme.ExtendedTypeScheme[Entry, EntryType, flagsets.ExplicitlyTypedConfigTypeOptionSetConfigProvider] + +func unwrapTypeScheme(s EntryTypeScheme) flagsetscheme.TypeScheme[Entry, EntryType] { + return s.Unwrap() +} func NewEntryTypeScheme(base ...EntryTypeScheme) EntryTypeScheme { - return flagsetscheme.NewTypeScheme[Entry, EntryType, EntryTypeScheme]("Entry type", "entry", "", "routing slip entry specification", "Entry Specification Options", &UnknownEntry{}, true, base...) + return flagsetscheme.NewTypeSchemeWrapper[Entry, EntryType, flagsets.ExplicitlyTypedConfigTypeOptionSetConfigProvider](flagsetscheme.NewTypeScheme[Entry, EntryType, flagsetscheme.TypeScheme[Entry, EntryType]]("Entry type", "entry", "", "routing slip entry specification", "Entry Specification Options", &UnknownEntry{}, true, sliceutils.Transform(base, unwrapTypeScheme)...)) } func NewStrictEntryTypeScheme(base ...EntryTypeScheme) EntryTypeScheme { - return flagsetscheme.NewTypeScheme[Entry, EntryType, EntryTypeScheme]("Entry type", "entry", "", "routing slip entry specification", "Entry Specification Options", nil, false, base...) + return flagsetscheme.NewTypeSchemeWrapper[Entry, EntryType, flagsets.ExplicitlyTypedConfigTypeOptionSetConfigProvider](flagsetscheme.NewTypeScheme[Entry, EntryType, flagsetscheme.TypeScheme[Entry, EntryType]]("Entry type", "entry", "", "routing slip entry specification", "Entry Specification Options", nil, false, sliceutils.Transform(base, unwrapTypeScheme)...)) } func CreateEntry(t runtime.TypedObject) (Entry, error) { diff --git a/pkg/contexts/ocm/labels/routingslip/types/plugin/cmd_test.go b/pkg/contexts/ocm/labels/routingslip/types/plugin/cmd_test.go index f2a68fd6d6..4fe6da4742 100644 --- a/pkg/contexts/ocm/labels/routingslip/types/plugin/cmd_test.go +++ b/pkg/contexts/ocm/labels/routingslip/types/plugin/cmd_test.go @@ -45,7 +45,7 @@ var _ = Describe("Test Environment", func() { }) It("handles plugin based entry type", func() { - prov := routingslip.For(env.OCMContext()).CreateConfigTypeSetConfigProvider().(flagsets.ExplicitlyTypedConfigTypeOptionSetConfigProvider) + prov := routingslip.For(env.OCMContext()).CreateConfigTypeSetConfigProvider() configopts := prov.CreateOptions() Expect(sliceutils.Transform(configopts.Options(), transformer.GetName[flagsets.Option, string])).To(ConsistOf( "entry", "comment", // default settings diff --git a/pkg/contexts/ocm/registration/registration.go b/pkg/contexts/ocm/registration/registration.go index db9b95407d..e8fd3899a6 100644 --- a/pkg/contexts/ocm/registration/registration.go +++ b/pkg/contexts/ocm/registration/registration.go @@ -27,7 +27,8 @@ import ( ) // RegisterExtensions registers all the extension provided by the found plugin. -func RegisterExtensions(ctx ocm.Context) error { +func RegisterExtensions(ctxp ocm.ContextProvider) error { + ctx := ctxp.OCMContext() pi := plugincacheattr.Get(ctx) logger := Logger(ctx) From 9cbb14b8b40cf9479530d0fb894220add2f16688 Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Fri, 26 Apr 2024 16:07:07 +0200 Subject: [PATCH 43/83] normalize order of used component lister results (#750) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change. ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [x] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- .../commands/ocmcmds/common/handlers/comphdlr/typehandler.go | 2 ++ .../commands/ocmcmds/common/handlers/vershdlr/typehandler.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go index ce22fbf778..1c03831787 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go @@ -7,6 +7,7 @@ package comphdlr import ( "fmt" "os" + "sort" "github.com/Masterminds/semver/v3" @@ -117,6 +118,7 @@ func (h *TypeHandler) all(repo ocm.Repository) ([]output.Object, error) { return nil, err } var result []output.Object + sort.Strings(list) for _, l := range list { part, err := h.get(repo, utils.StringSpec(l)) if err != nil { diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go index b3ec2de9ba..c814c27424 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go @@ -7,6 +7,7 @@ package vershdlr import ( "fmt" "os" + "sort" "github.com/Masterminds/semver/v3" @@ -97,6 +98,7 @@ func (h *TypeHandler) all(repo ocm.Repository) ([]output.Object, error) { return nil, err } var result []output.Object + sort.Strings(list) for _, l := range list { part, err := h.get(repo, utils.StringSpec(l)) if err != nil { From d125b48c637e375213989682995f2b4375ea8f3e Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 Apr 2024 14:19:36 +0000 Subject: [PATCH 44/83] ReleaseNotes for v0.9.0 --- docs/releasenotes/v0.9.0.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 docs/releasenotes/v0.9.0.md diff --git a/docs/releasenotes/v0.9.0.md b/docs/releasenotes/v0.9.0.md new file mode 100644 index 0000000000..f2eb57cd72 --- /dev/null +++ b/docs/releasenotes/v0.9.0.md @@ -0,0 +1,36 @@ +Release v0.9.0 + +- normalize order of used component lister results (#750) +- eliminate dep from demo plugin to cli (#746) +- Bump the go group across 1 directory with 3 updates (#748) +- Bump github.com/fluxcd/cli-utils from 0.36.0-flux.5 to 0.36.0-flux.6 (#737) +- change wording (#747) +- Bump github.com/docker/cli from 25.0.5+incompatible to 26.1.0+incompatible (#743) +- Bump github.com/docker/docker from 25.0.5+incompatible to 26.1.0+incompatible (#744) +- eliminate lib to cli dependencies (#741) +- enable http registries as ocm repositories (#676) +- Rework object finalization (#703) +- fix: do not create a new resource manager client (#742) +- fix: remove all personal information from tests (#740) +- incorporate VERSION file if built without make (#732) +- Wget doc (#739) +- add documentation for wget access (#733) +- Bump the go group with 27 updates (#729) +- Bump github.com/sigstore/cosign/v2 from 2.2.3 to 2.2.4 (#722) +- Bump the ci group with 2 updates (#723) +- fast version list command (#728) +- fix issue with create tempfile on MS Windows (#726) +- modify add sources doc (#727) +- align ca-cert opts + remove relation constraints for inputs (#725) +- add metadata for hyperspace (#719) +- readonly mode configurable for CVs (#711) +- spec normalization for OCI based OCM repository spec (#710) +- Bump the go\_modules group group with 3 updates (#707) +- Bump the ci group with 3 updates (#713) +- remove docs that are available in the spec (#715) +- change to compopnent constrcutor file name (#712) +- Fix repository cache (#705) +- let's add a \`user\` within Docker (#704) +- follow Docker official images recommendation (#699) +- support for github enterprise urls (#698) + From 548f7a55b87efd776ba72e8621f31cabb7310243 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 Apr 2024 14:19:37 +0000 Subject: [PATCH 45/83] Release v0.9.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c70836ca5c..899f24fc75 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.9.0-dev +0.9.0 \ No newline at end of file From dc3d80ce55d6aef30462ab189f0903b6d9a35720 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 Apr 2024 14:36:31 +0000 Subject: [PATCH 46/83] Update version file to 0.10.0-dev --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 899f24fc75..29b2d3ea50 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.9.0 \ No newline at end of file +0.10.0-dev From 2f5b0e1311cdb0f0ff4b4fceafad9f9d104d0b3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Apr 2024 09:16:05 +0200 Subject: [PATCH 47/83] Bump github.com/fluxcd/cli-utils from 0.36.0-flux.6 to 0.36.0-flux.7 (#752) Bumps [github.com/fluxcd/cli-utils](https://github.com/fluxcd/cli-utils) from 0.36.0-flux.6 to 0.36.0-flux.7.
    Commits
    • 7fd1e87 Merge pull request #8 from fluxcd/controller-runtime-v0.18.0
    • 45e89c4 Update controller-runtime to v0.18.0
    • See full diff in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/fluxcd/cli-utils&package-manager=go_modules&previous-version=0.36.0-flux.6&new-version=0.36.0-flux.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2fb9c75696..30b83f4fc8 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/docker/docker v26.1.0+incompatible github.com/docker/go-connections v0.5.0 github.com/drone/envsubst v1.0.3 - github.com/fluxcd/cli-utils v0.36.0-flux.6 + github.com/fluxcd/cli-utils v0.36.0-flux.7 github.com/fluxcd/pkg/ssa v0.38.0 github.com/gertd/go-pluralize v0.2.1 github.com/ghodss/yaml v1.0.0 diff --git a/go.sum b/go.sum index 505dbbed3a..7c45fcd221 100644 --- a/go.sum +++ b/go.sum @@ -356,8 +356,8 @@ github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fluxcd/cli-utils v0.36.0-flux.6 h1:SQuBgZFGPJbksLEA1gYkfqmIorhcZDd2QuDcmwL53h8= -github.com/fluxcd/cli-utils v0.36.0-flux.6/go.mod h1:zH0+K5kx9Lp9ZGlei5LdTXw96HX0K/kzOTbLYuVW+I8= +github.com/fluxcd/cli-utils v0.36.0-flux.7 h1:81zEo/LNmIRWMgtsZy/8L13TMUZHmmJib4gHRvKwVE8= +github.com/fluxcd/cli-utils v0.36.0-flux.7/go.mod h1:TcfLhvBjtQnqxYMsHQUAEB2c5WJRVuibtas2Izz5ZTs= github.com/fluxcd/pkg/ssa v0.38.0 h1:Hn7Ow8dJVHzDz1IvTOvudno/CRDY1kgHqKQ42/iJiRg= github.com/fluxcd/pkg/ssa v0.38.0/go.mod h1:LcTL2SP4MOdKA9z3/g3cNB30v/j/NiNHEPqMJHwHLJI= github.com/foxcpp/go-mockdns v1.0.0 h1:7jBqxd3WDWwi/6WhDvacvH1XsN3rOLXyHM1uhvIx6FI= From 2d1f9346cb30d1565b2efd1ed845e3ba65326c36 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Apr 2024 09:26:59 +0200 Subject: [PATCH 48/83] Bump the go group with 3 updates (#751) Bumps the go group with 3 updates: [github.com/containerd/containerd](https://github.com/containerd/containerd), [github.com/fluxcd/pkg/ssa](https://github.com/fluxcd/pkg) and [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo). Updates `github.com/containerd/containerd` from 1.7.15 to 1.7.16
    Release notes

    Sourced from github.com/containerd/containerd's releases.

    containerd 1.7.16

    Welcome to the v1.7.16 release of containerd!

    The sixteenth patch release for containerd 1.7 contains various fixes and updates.

    Highlights

    • Update AppArmor template to allow confined runc to kill containers (#10129)
    • Fix config import relative path glob (#9834)
    • Update AppArmor template to better support rootlesskit (#10116)
    • Update HTTP fallback to better account for TLS timeout and previous attempts (#10112)
    • Add support for HPC port forwarding (#10008)
    • Prevent GC from schedule itself with 0 period. (#10102)
    • Fix issue with using invalid token to retry fetching layer (#10065)
    • Automatically decompress archives for transfer service import (#9989)
    • Fix HTTPFallback fails when pushing manifest (#10044)
    • Add support for configuring otel from env and config deprecation notice (#9992)
    • Fix deadlock during NRI plugin registration (containerd/nri#79)

    Build and Release Toolchain

    • Update Go to 1.21.9 and 1.22.2 with net/http security fix (#10115)

    Container Runtime Interface (CRI)

    • Fix CRI snapshotter root path when not under containerd root (#10096)
    • Fix network creation failure from CreatedAt time as 269 years ago (#10122)
    • Include userns info in PodSandboxStatus (#9865)
    • Fix default working directory Windows HostProcess containers (#10071)
    • Fix ListPodSandboxStats to skip sandboxes with missing tasks (#10042)

    Deprecations

    • Add support for configuring otel from env and config deprecation notice (#9992)

    Please try out the release binaries and report any issues at https://github.com/containerd/containerd/issues.

    Contributors

    • Derek McGowan
    • Samuel Karp
    • Wei Fu
    • Danny Canter
    • Kazuyoshi Kato
    • Kirtana Ashok
    • Maksym Pavlenko
    • Phil Estes
    • Sebastiaan van Stijn
    • Brian Goff

    ... (truncated)

    Commits
    • 8303183 Merge pull request #10124 from kiashok/new-1.7.16-tag
    • fb2d43a Merge pull request #10129 from k8s-infra-cherrypick-robot/cherry-pick-10123-t...
    • 1c62308 Add release notes for v1.7.16
    • 18a2c36 apparmor: Allow confined runc to kill containers
    • ae97657 Merge pull request #9834 from neoaggelos/fix/config-relative
    • c4a8642 Merge pull request #10096 from Kern--/cri-remote-snapshotter-stats
    • 733d456 Merge pull request #10122 from AkihiroSuda/cherrypick-9673-1.7
    • 293f515 pod: CreatedAt time will be 269 years ago while creating cri network failed.
    • e412ca7 Merge pull request #10116 from AkihiroSuda/cherrypick-10111-1.7
    • d8acdaf Merge pull request #10115 from thaJeztah/1.7_backport_go1.21.9
    • Additional commits viewable in compare view

    Updates `github.com/fluxcd/pkg/ssa` from 0.38.0 to 0.39.0
    Commits
    • e32ccc2 Merge pull request #763 from fluxcd/kubernetes-1.30
    • 2b974af Update sigs.k8s.io/controller-tools to v0.15.0
    • 52c1fc5 Update sigs.k8s.io/controller-runtime to v0.18.0
    • c906252 Update dependencies to Kubernetes 1.30
    • 92c1348 Merge pull request #764 from fluxcd/dependabot/github_actions/ci-e44cfae560
    • ccb916a build(deps): bump the ci group with 3 updates
    • 6081556 Merge pull request #761 from fluxcd/kustomize-name-prefix-suffix
    • abf5675 kustomize: Add support for namePrefix and nameSuffix
    • 98d2522 Merge pull request #760 from fluxcd/dependabot/github_actions/ci-8f082d4f6d
    • efcd824 build(deps): bump docker/setup-buildx-action in the ci group
    • Additional commits viewable in compare view

    Updates `github.com/onsi/ginkgo/v2` from 2.17.1 to 2.17.2
    Release notes

    Sourced from github.com/onsi/ginkgo/v2's releases.

    v2.17.2

    2.17.2

    Fixes

    • fix: close files [32259c8]
    • fix github output log level for skipped specs [780e7a3]

    Maintenance

    • Bump github.com/google/pprof [d91fe4e]
    • Bump github.com/go-task/slim-sprig to v3 [8cb662e]
    • Bump golang.org/x/net in /integration/_fixtures/version_mismatch_fixture (#1391) [3134422]
    • Bump github-pages from 230 to 231 in /docs (#1384) [eca81b4]
    • Bump golang.org/x/tools from 0.19.0 to 0.20.0 (#1383) [760def8]
    • Bump golang.org/x/net from 0.23.0 to 0.24.0 (#1381) [4ce33f4]
    • Fix test for gomega version bump [f2fcd97]
    • Bump github.com/onsi/gomega from 1.30.0 to 1.33.0 (#1390) [fd622d2]
    • Bump golang.org/x/tools from 0.17.0 to 0.19.0 (#1368) [5474a26]
    • Bump github-pages from 229 to 230 in /docs (#1359) [e6d1170]
    • Bump google.golang.org/protobuf from 1.28.0 to 1.33.0 (#1374) [7f447b2]
    • Bump golang.org/x/net from 0.20.0 to 0.23.0 (#1380) [f15239a]
    Changelog

    Sourced from github.com/onsi/ginkgo/v2's changelog.

    2.17.2

    Fixes

    • fix: close files [32259c8]
    • fix github output log level for skipped specs [780e7a3]

    Maintenance

    • Bump github.com/google/pprof [d91fe4e]
    • Bump github.com/go-task/slim-sprig to v3 [8cb662e]
    • Bump golang.org/x/net in /integration/_fixtures/version_mismatch_fixture (#1391) [3134422]
    • Bump github-pages from 230 to 231 in /docs (#1384) [eca81b4]
    • Bump golang.org/x/tools from 0.19.0 to 0.20.0 (#1383) [760def8]
    • Bump golang.org/x/net from 0.23.0 to 0.24.0 (#1381) [4ce33f4]
    • Fix test for gomega version bump [f2fcd97]
    • Bump github.com/onsi/gomega from 1.30.0 to 1.33.0 (#1390) [fd622d2]
    • Bump golang.org/x/tools from 0.17.0 to 0.19.0 (#1368) [5474a26]
    • Bump github-pages from 229 to 230 in /docs (#1359) [e6d1170]
    • Bump google.golang.org/protobuf from 1.28.0 to 1.33.0 (#1374) [7f447b2]
    • Bump golang.org/x/net from 0.20.0 to 0.23.0 (#1380) [f15239a]
    Commits
    • 7836496 v2.17.2
    • d91fe4e Bump github.com/google/pprof
    • 8cb662e Bump github.com/go-task/slim-sprig to v3
    • 32259c8 fix: close files
    • 3134422 Bump golang.org/x/net in /integration/_fixtures/version_mismatch_fixture (#1391)
    • eca81b4 Bump github-pages from 230 to 231 in /docs (#1384)
    • 760def8 Bump golang.org/x/tools from 0.19.0 to 0.20.0 (#1383)
    • 4ce33f4 Bump golang.org/x/net from 0.23.0 to 0.24.0 (#1381)
    • f2fcd97 Fix test for gomega version bump
    • fd622d2 Bump github.com/onsi/gomega from 1.30.0 to 1.33.0 (#1390)
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Hilmar Falkenberg --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 30b83f4fc8..8e52e0dd73 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15 github.com/aws/aws-sdk-go-v2/service/ecr v1.27.4 github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 - github.com/containerd/containerd v1.7.15 + github.com/containerd/containerd v1.7.16 github.com/containerd/log v0.1.0 github.com/containers/image/v5 v5.30.0 github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f @@ -26,7 +26,7 @@ require ( github.com/docker/go-connections v0.5.0 github.com/drone/envsubst v1.0.3 github.com/fluxcd/cli-utils v0.36.0-flux.7 - github.com/fluxcd/pkg/ssa v0.38.0 + github.com/fluxcd/pkg/ssa v0.39.0 github.com/gertd/go-pluralize v0.2.1 github.com/ghodss/yaml v1.0.0 github.com/go-logr/logr v1.4.1 @@ -49,7 +49,7 @@ require ( github.com/mitchellh/copystructure v1.2.0 github.com/mittwald/go-helm-client v0.12.9 github.com/modern-go/reflect2 v1.0.2 - github.com/onsi/ginkgo/v2 v2.17.1 + github.com/onsi/ginkgo/v2 v2.17.2 github.com/onsi/gomega v1.33.0 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.1.0 @@ -185,7 +185,7 @@ require ( github.com/go-openapi/runtime v0.28.0 // indirect github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/validate v0.24.0 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect @@ -201,7 +201,7 @@ require ( github.com/google/go-github/v55 v55.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b // indirect + github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect diff --git a/go.sum b/go.sum index 7c45fcd221..ab6ce0c20c 100644 --- a/go.sum +++ b/go.sum @@ -260,8 +260,8 @@ github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups/v3 v3.0.2 h1:f5WFqIVSgo5IZmtTT3qVBo6TzI1ON6sycSBKkymb9L0= github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE= -github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= -github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= +github.com/containerd/containerd v1.7.16 h1:7Zsfe8Fkj4Wi2My6DXGQ87hiqIrmOXolm72ZEkFU5Mg= +github.com/containerd/containerd v1.7.16/go.mod h1:NL49g7A/Fui7ccmxV6zkBWwqMgmMxFWzujYCc+JLt7k= github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/containerd/errdefs v0.1.0 h1:m0wCRBiu1WJT/Fr+iOoQHMQS/eP5myQ8lCv4Dz5ZURM= @@ -358,8 +358,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fluxcd/cli-utils v0.36.0-flux.7 h1:81zEo/LNmIRWMgtsZy/8L13TMUZHmmJib4gHRvKwVE8= github.com/fluxcd/cli-utils v0.36.0-flux.7/go.mod h1:TcfLhvBjtQnqxYMsHQUAEB2c5WJRVuibtas2Izz5ZTs= -github.com/fluxcd/pkg/ssa v0.38.0 h1:Hn7Ow8dJVHzDz1IvTOvudno/CRDY1kgHqKQ42/iJiRg= -github.com/fluxcd/pkg/ssa v0.38.0/go.mod h1:LcTL2SP4MOdKA9z3/g3cNB30v/j/NiNHEPqMJHwHLJI= +github.com/fluxcd/pkg/ssa v0.39.0 h1:MdsTjwmF7mxTuZRt1XcLp5SzDI0PcRDR8bnbGH4nvHo= +github.com/fluxcd/pkg/ssa v0.39.0/go.mod h1:bS/QGx2YjAiyzPl1CGb8w+6ETmoIhpeViTcEnTpv+t4= github.com/foxcpp/go-mockdns v1.0.0 h1:7jBqxd3WDWwi/6WhDvacvH1XsN3rOLXyHM1uhvIx6FI= github.com/foxcpp/go-mockdns v1.0.0/go.mod h1:lgRN6+KxQBawyIghpnl5CezHFGS9VLzvtVlwxvzXTQ4= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= @@ -436,8 +436,8 @@ github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpv github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= @@ -516,8 +516,8 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b h1:RMpPgZTSApbPf7xaVel+QkoGPRLFLrwFO89uDUHEGf0= -github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= +github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= @@ -757,8 +757,8 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8= -github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= +github.com/onsi/ginkgo/v2 v2.17.2 h1:7eMhcy3GimbsA3hEnVKdw/PQM9XN9krpKVXsZdph0/g= +github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= From ebe976e7a778c1d909b3ff1ad0b3377b338bb022 Mon Sep 17 00:00:00 2001 From: Hilmar Falkenberg Date: Thu, 2 May 2024 14:49:54 +0200 Subject: [PATCH 49/83] Don't Panik! (#758) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The answer is: 42 ## Description Populate error to top, if it's not a semver.org conform version. ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Closes #756 ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- .../repositories/genericocireg/component.go | 22 +++++++++++-------- .../genericocireg/componentversion.go | 10 ++++----- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/pkg/contexts/ocm/repositories/genericocireg/component.go b/pkg/contexts/ocm/repositories/genericocireg/component.go index 02d7131414..75c9e9b0e0 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/component.go +++ b/pkg/contexts/ocm/repositories/genericocireg/component.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg import ( @@ -73,12 +69,12 @@ func (c *componentAccessImpl) GetName() string { //////////////////////////////////////////////////////////////////////////////// -func toTag(v string) string { +func toTag(v string) (string, error) { _, err := semver.NewVersion(v) if err != nil { - panic(errors.Wrapf(err, "%s is no semver version", v)) + return "", err } - return strings.ReplaceAll(v, "+", META_SEPARATOR) + return strings.ReplaceAll(v, "+", META_SEPARATOR), nil } func toVersion(t string) string { @@ -132,7 +128,11 @@ func (c *componentAccessImpl) HasVersion(vers string) (bool, error) { } func (c *componentAccessImpl) LookupVersion(version string) (*repocpi.ComponentVersionAccessInfo, error) { - acc, err := c.namespace.GetArtifact(toTag(version)) + tag, err := toTag(version) + if err != nil { + return nil, err + } + acc, err := c.namespace.GetArtifact(tag) if err != nil { if errors.IsErrNotFound(err) { return nil, cpi.ErrComponentVersionNotFoundWrap(err, c.name, version) @@ -151,7 +151,11 @@ func (c *componentAccessImpl) NewVersion(version string, overrides ...bool) (*re return nil, accessio.ErrReadOnly } override := utils.Optional(overrides...) - acc, err := c.namespace.GetArtifact(toTag(version)) + tag, err := toTag(version) + if err != nil { + return nil, err + } + acc, err := c.namespace.GetArtifact(tag) if err == nil { if override { return newComponentVersionAccess(accessobj.ACC_CREATE, c, version, acc, false) diff --git a/pkg/contexts/ocm/repositories/genericocireg/componentversion.go b/pkg/contexts/ocm/repositories/genericocireg/componentversion.go index 322b8726b9..862f9986d5 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/componentversion.go +++ b/pkg/contexts/ocm/repositories/genericocireg/componentversion.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg import ( @@ -222,7 +218,11 @@ func (c *ComponentVersionContainer) Update() error { } logger.Debug("add oci artifact") - if _, err := c.comp.namespace.AddArtifact(c.manifest, toTag(c.version)); err != nil { + tag, err := toTag(c.version) + if err != nil { + return err + } + if _, err := c.comp.namespace.AddArtifact(c.manifest, tag); err != nil { return fmt.Errorf("unable to add artifact: %w", err) } } From 0b2baf5bc3bd36279cdc4662297354636ed95c5d Mon Sep 17 00:00:00 2001 From: Hilmar Falkenberg Date: Thu, 2 May 2024 15:08:44 +0200 Subject: [PATCH 50/83] add negative test for non-semver version (#759) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [x] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Issues - #758 - #756 ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- .../repositories/genericocireg/repo_test.go | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/pkg/contexts/ocm/repositories/genericocireg/repo_test.go b/pkg/contexts/ocm/repositories/genericocireg/repo_test.go index 51a7b35305..50ab789483 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/repo_test.go +++ b/pkg/contexts/ocm/repositories/genericocireg/repo_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg_test import ( @@ -9,12 +5,10 @@ import ( "path" "reflect" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - . "github.com/open-component-model/ocm/pkg/testutils" - "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -50,6 +44,7 @@ import ( "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/signing/hasher/sha256" + . "github.com/open-component-model/ocm/pkg/testutils" ) var DefaultContext = ocm.New() @@ -79,6 +74,15 @@ var _ = Describe("component repository mapping", func() { vfs.Cleanup(tempfs) }) + It("Don't Panik! When it's not a semver.org conform version. #756", func() { + repo := Must(DefaultContext.RepositoryForSpec(spec)) + comp := Must(repo.LookupComponent(COMPONENT)) + cva, err := comp.NewVersion("v1.two.zeo-2") + Expect(err).To(HaveOccurred()) + Expect(cva).To(BeNil()) + Expect(err.Error()).To(Equal("Invalid Semantic Version")) + }) + It("creates a dummy component", func() { var finalize finalizer.Finalizer defer Defer(finalize.Finalize) From 53f36177c11a0218d0e77f427b77e2da6ae4a5e4 Mon Sep 17 00:00:00 2001 From: Gerald Morrison <67469729+morri-son@users.noreply.github.com> Date: Thu, 2 May 2024 16:07:31 +0200 Subject: [PATCH 51/83] add cleanup to action for self hosted runner (#760) ## Description Add action for cleanup of self-hosted runner --- .github/workflows/buildcomponents.yaml | 5 ++++- .github/workflows/components.yaml | 7 +++++++ .github/workflows/lint_and_test.yaml | 6 ++++++ .github/workflows/release.yaml | 2 ++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/workflows/buildcomponents.yaml b/.github/workflows/buildcomponents.yaml index 98aa930a0f..6ecf024d72 100644 --- a/.github/workflows/buildcomponents.yaml +++ b/.github/workflows/buildcomponents.yaml @@ -24,6 +24,9 @@ jobs: packages: write repository-projects: read steps: + - name: Self Hosted Runner Post Job Cleanup Action + uses: TooMuch4U/actions-clean@v2.1 + - name: Checkout uses: actions/checkout@v4 with: @@ -63,4 +66,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: ocm.ctf - path: gen/ctf \ No newline at end of file + path: gen/ctf diff --git a/.github/workflows/components.yaml b/.github/workflows/components.yaml index 7f326a97a9..5e8b60e728 100644 --- a/.github/workflows/components.yaml +++ b/.github/workflows/components.yaml @@ -39,6 +39,7 @@ jobs: run: | cd components/ocmcli PATH=$PATH:$(go env GOPATH)/bin make ctf + build-helminstaller: name: Build HelmInstaller runs-on: large_runner @@ -65,6 +66,7 @@ jobs: run: | cd components/helminstaller PATH=$PATH:$(go env GOPATH)/bin make ctf + build-helmdemo: name: Build HelmDemo runs-on: large_runner @@ -91,6 +93,7 @@ jobs: run: | cd components/helmdemo PATH=$PATH:$(go env GOPATH)/bin make ctf + build-subchartsdemo: name: Build Helm SubChartsDemo runs-on: large_runner @@ -117,10 +120,14 @@ jobs: run: | cd components/subchartsdemo PATH=$PATH:$(go env GOPATH)/bin make ctf + build-ecrplugin: name: Build ECR Plugin runs-on: large_runner steps: + - name: Self Hosted Runner Post Job Cleanup Action + uses: TooMuch4U/actions-clean@v2.1 + - name: Checkout uses: actions/checkout@v4 with: diff --git a/.github/workflows/lint_and_test.yaml b/.github/workflows/lint_and_test.yaml index 3078c9bc29..6f243c0d2f 100644 --- a/.github/workflows/lint_and_test.yaml +++ b/.github/workflows/lint_and_test.yaml @@ -39,6 +39,7 @@ jobs: run: | PATH=$PATH:$(go env GOPATH)/bin make build PATH=$PATH:$(go env GOPATH)/bin make test + lint: name: Lint runs-on: large_runner @@ -71,10 +72,14 @@ jobs: - name: Lint run: | PATH=$PATH:$(go env GOPATH)/bin make check + generate: name: DeepCopy verification runs-on: large_runner steps: + - name: Self Hosted Runner Post Job Cleanup Action + uses: TooMuch4U/actions-clean@v2.1 + - name: Checkout uses: actions/checkout@v4 with: @@ -99,3 +104,4 @@ jobs: - name: Check for diff run: | git diff --exit-code --shortstat + diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index ee2bcd6b8c..0df1d1ad30 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -122,6 +122,8 @@ jobs: id-token: write packages: write steps: + - name: Self Hosted Runner Post Job Cleanup Action + uses: TooMuch4U/actions-clean@v2.1 - name: Generate token id: generate_token uses: tibdex/github-app-token@v2 From ea79db625a33260006585329f1e2cc10ae33e6e0 Mon Sep 17 00:00:00 2001 From: dee0sap <82829708+dee0sap@users.noreply.github.com> Date: Fri, 3 May 2024 00:00:27 -0700 Subject: [PATCH 52/83] Fix ocm issue 179, block in config yields invalid yaml (#734) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Fixes https://github.com/open-component-model/ocm-project/issues/179 ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [x ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [x ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # 179 - Closes # (179) - Fixes # (179) > Remove if not applicable ## Screenshots ## Added tests? - [x ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ x] πŸ™… no documentation needed ## Checklist: - [x ] My code follows the style guidelines of this project - [ x] I have performed a self-review of my code - [ x] I have commented my code, particularly in hard-to-understand areas - [ x] I have made corresponding changes to the documentation - [ x] My changes generate no new warnings - [ x] I have added tests that prove my fix is effective or that my feature works - [ x] New and existing unit tests pass locally with my changes - [ x] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Gergely Brautigam <182850+Skarlso@users.noreply.github.com> --- go.mod | 12 +- go.sum | 28 +- .../ocm/utils/localize/instantiate_test.go | 2 +- pkg/contexts/ocm/utils/localize/subst.go | 7 +- pkg/contexts/ocm/utils/localize/subst_test.go | 8 +- .../ocm/utils/localize/target_test.go | 5 +- pkg/contexts/ocm/utils/localize/utils_test.go | 14 +- pkg/utils/subst/subst.go | 192 ++++++---- pkg/utils/subst/subst_test.go | 332 ++++++++++++++++-- 9 files changed, 488 insertions(+), 112 deletions(-) diff --git a/go.mod b/go.mod index 8e52e0dd73..9a172caa3f 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,6 @@ require ( github.com/go-openapi/strfmt v0.23.0 github.com/go-openapi/swag v0.23.0 github.com/go-test/deep v1.1.0 - github.com/goccy/go-yaml v1.11.3 github.com/golang/mock v1.6.0 github.com/google/go-github/v45 v45.2.0 github.com/hashicorp/vault-client-go v0.4.3 @@ -46,6 +45,7 @@ require ( github.com/mandelsoft/spiff v1.7.0-beta-5 github.com/mandelsoft/vfs v0.4.3 github.com/marstr/guid v1.1.0 + github.com/mikefarah/yq/v4 v4.43.1 github.com/mitchellh/copystructure v1.2.0 github.com/mittwald/go-helm-client v0.12.9 github.com/modern-go/reflect2 v1.0.2 @@ -70,6 +70,7 @@ require ( golang.org/x/net v0.24.0 golang.org/x/oauth2 v0.19.0 golang.org/x/text v0.14.0 + gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 gopkg.in/yaml.v3 v3.0.1 helm.sh/helm/v3 v3.14.4 k8s.io/api v0.30.0 @@ -106,6 +107,8 @@ require ( github.com/Microsoft/hcsshim v0.12.0-rc.3 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect github.com/ThalesIgnite/crypto11 v1.2.5 // indirect + github.com/a8m/envsubst v1.4.2 // indirect + github.com/alecthomas/participle/v2 v2.1.1 // indirect github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect github.com/alibabacloud-go/cr-20160607 v1.0.1 // indirect github.com/alibabacloud-go/cr-20181201 v1.0.10 // indirect @@ -163,6 +166,7 @@ require ( github.com/docker/go-metrics v0.0.1 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/elliotchance/orderedmap v1.5.1 // indirect github.com/emicklei/go-restful/v3 v3.11.1 // indirect github.com/evanphx/json-patch v5.7.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect @@ -187,6 +191,8 @@ require ( github.com/go-openapi/validate v0.24.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gobwas/glob v0.2.3 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-yaml v1.11.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -222,6 +228,7 @@ require ( github.com/in-toto/in-toto-golang v0.9.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 // indirect + github.com/jinzhu/copier v0.4.0 // indirect github.com/jinzhu/gorm v1.9.16 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmoiron/sqlx v1.3.5 // indirect @@ -259,7 +266,7 @@ require ( github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pborman/uuid v1.2.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.0 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.19.0 // indirect @@ -300,6 +307,7 @@ require ( github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xlab/treeprint v1.2.0 // indirect + github.com/yuin/gopher-lua v1.1.1 // indirect github.com/zeebo/errs v1.3.0 // indirect go.mongodb.org/mongo-driver v1.14.0 // indirect go.opencensus.io v0.24.0 // indirect diff --git a/go.sum b/go.sum index ab6ce0c20c..97c9e3c82d 100644 --- a/go.sum +++ b/go.sum @@ -93,8 +93,16 @@ github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/O github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/ThalesIgnite/crypto11 v1.2.5 h1:1IiIIEqYmBvUYFeMnHqRft4bwf/O36jryEUpY+9ef8E= github.com/ThalesIgnite/crypto11 v1.2.5/go.mod h1:ILDKtnCKiQ7zRoNxcp36Y1ZR8LBPmR2E23+wTQe/MlE= +github.com/a8m/envsubst v1.4.2 h1:4yWIHXOLEJHQEFd4UjrWDrYeYlV7ncFWJOCBRLOZHQg= +github.com/a8m/envsubst v1.4.2/go.mod h1:MVUTQNGQ3tsjOOtKCNd+fl8RzhsXcDvvAEzkhGtlsbY= github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= +github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= +github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= +github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= +github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= +github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= +github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= @@ -337,6 +345,8 @@ github.com/drone/envsubst v1.0.3/go.mod h1:N2jZmlMufstn1KEqvbHjw40h1KyTmnVzHcSc9 github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dvsekhvalnov/jose2go v0.0.0-20170216131308-f21a8cedbbae/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= +github.com/elliotchance/orderedmap v1.5.1 h1:G1X4PYlljzimbdQ3RXmtIZiQ9d6aRQ3sH1nzjq5mECE= +github.com/elliotchance/orderedmap v1.5.1/go.mod h1:wsDwEaX5jEoyhbs7x93zk2H/qv0zwuhg4inXhDkYqys= github.com/emicklei/go-restful/v3 v3.11.1 h1:S+9bSbua1z3FgCnV0KKOSSZ3mDthb5NyEPL5gEpCvyk= github.com/emicklei/go-restful/v3 v3.11.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emicklei/proto v1.12.1 h1:6n/Z2pZAnBwuhU66Gs8160B8rrrYKo7h2F2sCOnNceE= @@ -442,6 +452,8 @@ github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-yaml v1.11.3 h1:B3W9IdWbvrUu2OYQGwvU1nZtvMQJPBKgBUuweJjLj6I= github.com/goccy/go-yaml v1.11.3/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= @@ -581,6 +593,8 @@ github.com/hashicorp/vault-client-go v0.4.3 h1:zG7STGVgn/VK6rnZc0k8PGbfv2x/sJExR github.com/hashicorp/vault-client-go v0.4.3/go.mod h1:4tDw7Uhq5XOxS1fO+oMtotHL7j4sB9cp0T7U6m4FzDY= github.com/hashicorp/vault/api v1.12.2 h1:7YkCTE5Ni90TcmYHDBExdt4WGJxhpzaHqR6uGbQb/rE= github.com/hashicorp/vault/api v1.12.2/go.mod h1:LSGf1NGT1BnvFFnKVtnvcaLBM2Lz+gJdpL6HUYed8KE= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef h1:A9HsByNhogrvm9cWb28sjiS3i7tcKCkflWFEkHfuAgM= github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -600,6 +614,8 @@ github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 h1:TMtDYDHKYY github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= github.com/jellydator/ttlcache/v3 v3.2.0 h1:6lqVJ8X3ZaUwvzENqPAobDsXNExfUJd61u++uW8a3LE= github.com/jellydator/ttlcache/v3 v3.2.0/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4= +github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= +github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o= github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= @@ -695,6 +711,8 @@ github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WT github.com/miekg/pkcs11 v1.0.3-0.20190429190417-a667d056470f/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mikefarah/yq/v4 v4.43.1 h1:1bCrQwVDhjGnPboQidy30hu6U2TCd8sUQTy1hKCHOGI= +github.com/mikefarah/yq/v4 v4.43.1/go.mod h1:jcSqtyUKbPWvwaa8cNw8Ej4rmPb3iWE8zYvpkTvM7oc= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -783,14 +801,16 @@ github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pelletier/go-toml/v2 v2.2.0 h1:QLgLl2yMN7N+ruc31VynXs1vhMZa7CeHHejIeBAsoHo= +github.com/pelletier/go-toml/v2 v2.2.0/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -984,6 +1004,8 @@ github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= +github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= @@ -1258,6 +1280,8 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE= +gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog= gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1 h1:d4KQkxAaAiRY2h5Zqis161Pv91A37uZyJOx73duwUwM= gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1/go.mod h1:WbjuEoo1oadwzQ4apSDU+JTvmllEHtsNHS6y7vFc7iw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= diff --git a/pkg/contexts/ocm/utils/localize/instantiate_test.go b/pkg/contexts/ocm/utils/localize/instantiate_test.go index 1117258fbf..09d86e0c27 100644 --- a/pkg/contexts/ocm/utils/localize/instantiate_test.go +++ b/pkg/contexts/ocm/utils/localize/instantiate_test.go @@ -130,7 +130,7 @@ values: fs := memoryfs.New() err := localize.Instantiate(rules, cv, nil, config, fs, RESOURCE_TYPE) Expect(err).To(Succeed()) - CheckFile("dir/manifest1.yaml", fs, ` + CheckYAMLFile("dir/manifest1.yaml", fs, ` manifest: value1: ghcr.io/mandelsoft/test:v1 value2: mine diff --git a/pkg/contexts/ocm/utils/localize/subst.go b/pkg/contexts/ocm/utils/localize/subst.go index b0c9a6f951..10ddb51078 100644 --- a/pkg/contexts/ocm/utils/localize/subst.go +++ b/pkg/contexts/ocm/utils/localize/subst.go @@ -5,8 +5,6 @@ package localize import ( - yaml "github.com/goccy/go-yaml" - "github.com/goccy/go-yaml/ast" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/errors" @@ -72,6 +70,10 @@ func SubstituteMappingsForData(subs ValueMappings, data []byte) ([]byte, error) return target.Content() } +/* +2024-04-28 Don't see any use of this in either ocm or ocm-controller +As it exposes the implementation detail of what YAML model we use +_and_ we're switching to yqlib from goccy comment it out. func Set(content *ast.File, path string, value *ast.File) error { p, err := yaml.PathString("$." + path) if err != nil { @@ -79,3 +81,4 @@ func Set(content *ast.File, path string, value *ast.File) error { } return p.ReplaceWithFile(content, value) } +*/ diff --git a/pkg/contexts/ocm/utils/localize/subst_test.go b/pkg/contexts/ocm/utils/localize/subst_test.go index 4a08a29f9a..292e3c491c 100644 --- a/pkg/contexts/ocm/utils/localize/subst_test.go +++ b/pkg/contexts/ocm/utils/localize/subst_test.go @@ -48,12 +48,12 @@ var _ = Describe("value substitution in filesystem", func() { err := localize.Substitute(subs, payloadfs) Expect(err).To(Succeed()) - CheckFile("dir/manifest1.yaml", payloadfs, ` + CheckYAMLFile("dir/manifest1.yaml", payloadfs, ` manifest: value1: config1 value2: orig2 `) - CheckFile("dir/manifest2.yaml", payloadfs, ` + CheckYAMLFile("dir/manifest2.yaml", payloadfs, ` manifest: value1: orig1 value2: config2 @@ -74,7 +74,7 @@ manifest: err := localize.Substitute(subs, payloadfs) Expect(err).To(Succeed()) - CheckFile("dir/manifest1.yaml", payloadfs, ` + CheckYAMLFile("dir/manifest1.yaml", payloadfs, ` manifest: value1: config1 value2: config2 @@ -93,7 +93,7 @@ manifest: err := localize.Substitute(subs, payloadfs) Expect(err).To(Succeed()) - CheckFile("dir/some.json", payloadfs, ` + CheckJSONFile("dir/some.json", payloadfs, ` {"manifest": {"value1": {"some": {"value": 1}}, "value2": "orig2"}} `) diff --git a/pkg/contexts/ocm/utils/localize/target_test.go b/pkg/contexts/ocm/utils/localize/target_test.go index c46ffbe808..b22fb86166 100644 --- a/pkg/contexts/ocm/utils/localize/target_test.go +++ b/pkg/contexts/ocm/utils/localize/target_test.go @@ -7,7 +7,6 @@ package localize_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/open-component-model/ocm/pkg/testutils" "github.com/mandelsoft/vfs/pkg/vfs" @@ -127,7 +126,7 @@ manifest: result, err := localize.SubstituteMappingsForData(subs, data) Expect(err).To(Succeed()) - Expect(string(result)).To(StringEqualTrimmedWithContext(` + Expect(string(result)).To(MatchYAML(` manifest: value1: config1 value2: config2 @@ -145,7 +144,7 @@ manifest: result, err := localize.SubstituteMappingsForData(subs, data) Expect(err).To(Succeed()) - Expect(string(result)).To(StringEqualTrimmedWithContext(` + Expect(string(result)).To(MatchYAML(` manifest: value1: some: diff --git a/pkg/contexts/ocm/utils/localize/utils_test.go b/pkg/contexts/ocm/utils/localize/utils_test.go index 2acb56337f..939e90bf47 100644 --- a/pkg/contexts/ocm/utils/localize/utils_test.go +++ b/pkg/contexts/ocm/utils/localize/utils_test.go @@ -5,9 +5,6 @@ package localize_test import ( - "fmt" - "strings" - . "github.com/onsi/gomega" "github.com/mandelsoft/vfs/pkg/vfs" @@ -52,9 +49,14 @@ func UnmarshalInstRules(data string) *localize.InstantiationRules { return &v } -func CheckFile(path string, fs vfs.FileSystem, content string) { +func CheckYAMLFile(path string, fs vfs.FileSystem, content string) { + data, err := vfs.ReadFile(fs, path) + ExpectWithOffset(1, err).To(Succeed()) + ExpectWithOffset(1, string(data)).To(MatchYAML(content)) +} + +func CheckJSONFile(path string, fs vfs.FileSystem, content string) { data, err := vfs.ReadFile(fs, path) ExpectWithOffset(1, err).To(Succeed()) - fmt.Printf("\n%s\n", string(data)) - ExpectWithOffset(1, strings.Trim(string(data), "\n")).To(Equal(strings.Trim(content, "\n"))) + ExpectWithOffset(1, string(data)).To(MatchJSON(content)) } diff --git a/pkg/utils/subst/subst.go b/pkg/utils/subst/subst.go index b89e7e9685..8eec669dc5 100644 --- a/pkg/utils/subst/subst.go +++ b/pkg/utils/subst/subst.go @@ -5,12 +5,18 @@ package subst import ( - "github.com/goccy/go-yaml" - "github.com/goccy/go-yaml/ast" - "github.com/goccy/go-yaml/parser" + "bytes" + "container/list" + "sync" + + mlog "github.com/mandelsoft/logging" "github.com/mandelsoft/vfs/pkg/vfs" + "github.com/mikefarah/yq/v4/pkg/yqlib" + glog "gopkg.in/op/go-logging.v1" + "gopkg.in/yaml.v3" "github.com/open-component-model/ocm/pkg/errors" + ocmlog "github.com/open-component-model/ocm/pkg/logging" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) @@ -36,110 +42,156 @@ func ParseFile(file string, fss ...vfs.FileSystem) (SubstitutionTarget, error) { return s, nil } +var yqLibLogInit sync.Once + func Parse(data []byte) (SubstitutionTarget, error) { + yqLibLogInit.Do(func() { + var lvl glog.Level + switch ocmlog.Context().GetDefaultLevel() { + case mlog.None: + fallthrough + case mlog.ErrorLevel: + lvl = glog.ERROR + case mlog.WarnLevel: + lvl = glog.WARNING + case mlog.InfoLevel: + lvl = glog.INFO + case mlog.DebugLevel: + fallthrough + case mlog.TraceLevel: + lvl = glog.DEBUG + } + glog.SetLevel(lvl, "yq-lib") + }) + var ( - err error - content interface{} - fi fileinfo + err error + fi fileinfo ) fi.json = true - if err = runtime.DefaultJSONEncoding.Unmarshal(data, &content); err != nil { + rdr := bytes.NewBuffer(data) + jsnDcdr := yqlib.NewJSONDecoder() + + if err := jsnDcdr.Init(rdr); err != nil { + return nil, err + } + + if fi.content, err = jsnDcdr.Decode(); err != nil { fi.json = false - if err = runtime.DefaultYAMLEncoding.Unmarshal(data, &content); err != nil { - return nil, errors.Wrapf(err, "no yaml or json data") + ymlPrfs := yqlib.NewDefaultYamlPreferences() + ymlDcdr := yqlib.NewYamlDecoder(ymlPrfs) + rdr = bytes.NewBuffer(data) + if err := ymlDcdr.Init(rdr); err != nil { + return nil, err + } + if fi.content, err = ymlDcdr.Decode(); err != nil { + return nil, err } - data, err = runtime.DefaultYAMLEncoding.Marshal(content) - } else { - data, err = runtime.DefaultJSONEncoding.Marshal(content) - } - if err != nil { - return nil, errors.Wrapf(err, "cannor marshal data") } - // mixed json/yaml cannot be parsed, modified and marshalled again, correctly - // so try to come with pure yaml or pure json. - fi.content, err = parser.ParseBytes(data, 0) - if err != nil { - return nil, errors.Wrapf(err, "invalid YAML") - } + fi.content.SetDocument(0) + fi.content.SetFilename("substitution-target") + fi.content.SetFileIndex(0) + return &fi, nil } type fileinfo struct { - content *ast.File + content *yqlib.CandidateNode json bool } func (f *fileinfo) Content() ([]byte, error) { - data := []byte(f.content.String()) - + var enc yqlib.Encoder if f.json { - // TODO: the package seems to keep the file type json/yaml, but I'm not sure - var err error - data, err = yaml.YAMLToJSON(data) - if err != nil { - return nil, errors.Wrapf(err, "cannot marshal json") - } + prfs := yqlib.NewDefaultJsonPreferences() + prfs.ColorsEnabled = false + enc = yqlib.NewJSONEncoder(prfs) + } else { + prfs := yqlib.NewDefaultYamlPreferences() + enc = yqlib.NewYamlEncoder(prfs) } - return data, nil -} -func (f *fileinfo) SubstituteByData(path string, value []byte) error { - var m interface{} - err := runtime.DefaultYAMLEncoding.Unmarshal(value, &m) - if err != nil { - return err - } - if f.json { - value, err = runtime.DefaultJSONEncoding.Marshal(m) + buf := bytes.NewBuffer([]byte{}) + pw := yqlib.NewSinglePrinterWriter(buf) + p := yqlib.NewPrinter(enc, pw) + inptLst := list.New() + inptLst.PushBack(f.content) + + if err := p.PrintResults(inptLst); err == nil { + return buf.Bytes(), nil } else { - value, err = runtime.DefaultYAMLEncoding.Marshal(m) + return nil, err } - if err != nil { - return err - } - return f.substituteByData(path, value) } -func (f *fileinfo) substituteByData(path string, value []byte) error { - file, err := parser.ParseBytes(value, 0) +func (f *fileinfo) SubstituteByData(path string, value []byte) error { + m := &yaml.Node{} + err := yaml.Unmarshal(value, m) if err != nil { - return errors.Wrapf(err, "cannot unmarshal value") + return err } - p, err := yaml.PathString("$." + path) - if err != nil { - return errors.Wrapf(err, "invalid substitution path") + if !f.json { + var replaceFlowStyle func(*yaml.Node) + replaceFlowStyle = func(nd *yaml.Node) { + if nd.Style == yaml.FlowStyle { + nd.Style = yaml.LiteralStyle + } + for _, chld := range nd.Content { + replaceFlowStyle(chld) + } + } + replaceFlowStyle(m) } - return p.ReplaceWithFile(f.content, file) + nd := &yqlib.CandidateNode{} + nd.SetDocument(0) + nd.SetFilename("value") + nd.SetFileIndex(0) + + if err = nd.UnmarshalYAML(m.Content[0], map[string]*yqlib.CandidateNode{}); err != nil { + return err + } + return f.substituteByValue(path, nd) } func (f *fileinfo) SubstituteByValue(path string, value interface{}) error { - var ( - err error - data []byte - ) + var mrshl func(interface{}) ([]byte, error) + if f.json { - data, err = runtime.DefaultJSONEncoding.Marshal(value) + mrshl = runtime.DefaultJSONEncoding.Marshal } else { - data, err = runtime.DefaultYAMLEncoding.Marshal(value) + mrshl = runtime.DefaultYAMLEncoding.Marshal } + + if bval, err := mrshl(value); err != nil { + return err + } else { + return f.SubstituteByData(path, bval) + } +} + +func (f *fileinfo) substituteByValue(path string, value *yqlib.CandidateNode) error { + inptLst := list.New() + inptLst.PushBack(f.content) + + vlLst := list.New() + vlLst.PushBack(value) + + ctxt := yqlib.Context{MatchingNodes: inptLst} + ctxt.SetVariable("newValue", vlLst) + + yqlib.InitExpressionParser() + expr := "." + path + " |= $newValue" + + nd, err := yqlib.ExpressionParser.ParseExpression(expr) if err != nil { return err } - return f.substituteByData(path, data) - /* - node, err := yaml.ValueToNode(value) - if err != nil { - return errors.Wrapf(err, "cannot unmarshal value") - } - p, err := yaml.PathString("$." + path) - if err != nil { - return errors.Wrapf(err, "invalid substitution path") - } - return p.ReplaceWithNode(f.content, node) - */ + ngvtr := yqlib.NewDataTreeNavigator() + _, err = ngvtr.GetMatchingNodes(ctxt, nd) + return err } diff --git a/pkg/utils/subst/subst_test.go b/pkg/utils/subst/subst_test.go index 734a2e3880..2cecebb199 100644 --- a/pkg/utils/subst/subst_test.go +++ b/pkg/utils/subst/subst_test.go @@ -5,9 +5,6 @@ package subst import ( - "fmt" - "strings" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) @@ -33,14 +30,79 @@ data: result, err := content.Content() Expect(err).To(Succeed()) - Expect(strings.Trim(string(result), "\n")).To(Equal(strings.Trim(` + Expect(string(result)).To(MatchYAML(` data: value1: v1 value2: orig2 -`, "\n"))) +`)) + }) + + It("handles simple block value substitution on yaml", func() { + data := ` +data: + value1: null + value2: orig2 +` + content, err := Parse([]byte(data)) + Expect(err).To(Succeed()) + + Expect(content.SubstituteByValue("data.value1", `-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE-----`)).To(Succeed()) + + result, err := content.Content() + Expect(err).To(Succeed()) + + expected := ` +data: + value1: |- + -----BEGIN CERTIFICATE----- + MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh + MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 + d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH + MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT + MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j + b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG + 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI + 2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx + 1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ + q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz + tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ + vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP + BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV + 5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY + 1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 + NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG + Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 + 8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe + pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl + MrY= + -----END CERTIFICATE----- + value2: orig2 +` + Expect(string(result)).To(MatchYAML(expected)) }) - It("handles complex value substitution on yaml", func() { + It("handles complex value substitution on yaml 1", func() { data := ` data: value1: orig1 @@ -54,14 +116,13 @@ data: result, err := content.Content() Expect(err).To(Succeed()) - fmt.Printf("\n%s\n", string(result)) - Expect(strings.Trim(string(result), "\n")).To(Equal(strings.Trim(` + Expect(string(result)).To(MatchYAML(` data: value1: value1: v1 value2: "" value2: orig2 -`, "\n"))) +`)) }) }) @@ -80,14 +141,132 @@ data: result, err := content.Content() Expect(err).To(Succeed()) - Expect(strings.Trim(string(result), "\n")).To(Equal(strings.Trim(` + Expect(string(result)).To(MatchYAML(` data: value1: v1 value2: orig2 -`, "\n"))) +`)) + }) + + It("open-component-model/ocm-project issue 179 store object produces invalid yaml", func() { + value := `certificate_authority_url: https://example1.com/v1/pki/root/ca/pem +deployment: deveaws +deployment_size: xsmall +domain: example2.com +landscape_region: eu12 +org: deveaws +service_hostname_suffix: .example3.com +service_kubernetes_hostname_suffix: .example4.com +space: sac` + data := `dmi: + gcp_project_id: unset + orca_env_stable_values: {} + protect_persisted_data: ""` + content, err := Parse([]byte(data)) + Expect(err).To(Succeed()) + + Expect(content.SubstituteByData("dmi.orca_env_stable_values", []byte(value))).To(Succeed()) + + result, err := content.Content() + Expect(err).To(Succeed()) + + expected := `dmi: + gcp_project_id: unset + orca_env_stable_values: + certificate_authority_url: https://example1.com/v1/pki/root/ca/pem + deployment: deveaws + deployment_size: xsmall + domain: example2.com + landscape_region: eu12 + org: deveaws + service_hostname_suffix: .example3.com + service_kubernetes_hostname_suffix: .example4.com + space: sac + protect_persisted_data: ""` + Expect(string(result)).To(MatchYAML(expected)) + }) + + It("Converts json subtitution to yaml when destination is yaml doc", func() { + value := `{ + "certificate_authority_url": "https://example1.com/v1/pki/root/ca/pem", + "deployment": "deveaws", + "deployment_size": "xsmall", + "domain": "example2.com", + "landscape_region": "eu12", + "org": "deveaws", + "service_hostname_suffix": ".example3.com", + "service_kubernetes_hostname_suffix": ".example4.com", + "space": "sac" +}` + data := `dmi: + gcp_project_id: unset + orca_env_stable_values: {} + protect_persisted_data: ""` + content, err := Parse([]byte(data)) + Expect(err).To(Succeed()) + + Expect(content.SubstituteByData("dmi.orca_env_stable_values", []byte(value))).To(Succeed()) + + result, err := content.Content() + Expect(err).To(Succeed()) + + expected := `dmi: + gcp_project_id: unset + orca_env_stable_values: + certificate_authority_url: https://example1.com/v1/pki/root/ca/pem + deployment: deveaws + deployment_size: xsmall + domain: example2.com + landscape_region: eu12 + org: deveaws + service_hostname_suffix: .example3.com + service_kubernetes_hostname_suffix: .example4.com + space: sac + protect_persisted_data: ""` + Expect(string(result)).To(MatchYAML(expected)) + + Expect(string(result)).To(Not(ContainSubstring("{"))) + }) + + It("Store sequence in yaml", func() { + value := `- https://example1.com/v1/pki/root/ca/pem +- deveaws +- xsmall +- example2.com +- eu12 +- deveaws +- .example3.com +- .example4.com +- sac` + data := `dmi: + gcp_project_id: unset + orca_env_stable_values: [] + protect_persisted_data: ""` + content, err := Parse([]byte(data)) + Expect(err).To(Succeed()) + + Expect(content.SubstituteByData("dmi.orca_env_stable_values", []byte(value))).To(Succeed()) + + result, err := content.Content() + Expect(err).To(Succeed()) + + expected := `dmi: + gcp_project_id: unset + orca_env_stable_values: + - https://example1.com/v1/pki/root/ca/pem + - deveaws + - xsmall + - example2.com + - eu12 + - deveaws + - .example3.com + - .example4.com + - sac + protect_persisted_data: ""` + Expect(string(result)).To(MatchYAML(expected)) }) - It("handles complex value substitution on yaml", func() { + It("handles complex value substitution on yaml 2", func() { value := ` value1: v1 value2: "" @@ -105,17 +284,127 @@ data: result, err := content.Content() Expect(err).To(Succeed()) - fmt.Printf("\n%s\n", string(result)) - Expect(strings.Trim(string(result), "\n")).To(Equal(strings.Trim(` + Expect(string(result)).To(MatchYAML(` data: value1: value1: v1 value2: "" value2: orig2 -`, "\n"))) +`)) }) }) + It("handles differing string styles", func() { + value := `folded: > + foo + bar +folded_strip: >- + foo + bar +folded_keep: >+ + foo + bar +literal: | + foo + bar +literal_strip: |- + foo + bar +literal_keep: |+ + foo + bar +double: "foo\nbar" +single: 'foo\nbar'` + data := `data: + value1: origs1 + value2: orig2` + content, err := Parse([]byte(data)) + Expect(err).To(Succeed()) + + Expect(content.SubstituteByData("data.value1", []byte(value))).To(Succeed()) + + result, err := content.Content() + Expect(err).To(Succeed()) + + Expect(string(result)).To(MatchYAML(`data: + value1: + folded: > + foo + bar + folded_strip: >- + foo + bar + folded_keep: >+ + foo + bar + literal: | + foo + bar + literal_strip: |- + foo + bar + literal_keep: |+ + foo + bar + double: "foo\nbar" + single: 'foo\nbar' + value2: orig2`)) + }) + + It("handles non-string scalar", func() { + value := `2` + + data := `data: + value1: orig1 + value2: orig2` + + content, err := Parse([]byte(data)) + Expect(err).To(Succeed()) + + Expect(content.SubstituteByData("data.value1", []byte(value))).To(Succeed()) + + result, err := content.Content() + Expect(err).To(Succeed()) + expected := `data: + value1: 2 + value2: orig2` + + Expect(string(result)).To(MatchYAML(expected)) + }) + + It("handles multiple updates", func() { + value1 := `2` + value2 := `3` + + data := `data: + value1: orig1 + value2: orig2` + + content, err := Parse([]byte(data)) + Expect(err).To(Succeed()) + + Expect(content.SubstituteByData("data.value1", []byte(value1))).To(Succeed()) + + result1, err := content.Content() + Expect(err).To(Succeed()) + expected1 := `data: + value1: 2 + value2: orig2` + + Expect(string(result1)).To(MatchYAML(expected1)) + + Expect(content.SubstituteByData("data.value2", []byte(value2))).To(Succeed()) + + result2, err := content.Content() + Expect(err).To(Succeed()) + + expected2 := `data: + value1: 2 + value2: 3` + + Expect(string(result2)).To(MatchYAML(expected2)) + }) + It("handles complex value substitution on json", func() { value := ` value1: v1 @@ -135,11 +424,10 @@ value2: "" result, err := content.Content() Expect(err).To(Succeed()) - - fmt.Printf("\n%s\n", string(result)) - Expect(strings.Trim(string(result), "\n")).To(Equal(strings.Trim(` + expected := ` {"data": {"value1": {"value1": "v1", "value2": ""}, "value2": "orig2"}} -`, "\n"))) +` + Expect(string(result)).To(MatchJSON(expected)) }) /* @@ -198,13 +486,13 @@ data: { result, err := content.Content() Expect(err).To(Succeed()) - fmt.Printf("\n%s\n", string(result)) - Expect(strings.Trim(string(result), "\n")).To(Equal(strings.Trim(` + expected := ` data: value1: value1: v1 value2: "" value2: orig2 -`, "\n"))) +` + Expect(string(result)).To(MatchYAML(expected)) }) }) From 43431bbee0e91af276a9b2c720e4a3e261456af0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 May 2024 11:18:45 +0200 Subject: [PATCH 53/83] Bump the ci group with 2 updates (#762) Bumps the ci group with 2 updates: [TooMuch4U/actions-clean](https://github.com/toomuch4u/actions-clean) and [anchore/sbom-action](https://github.com/anchore/sbom-action). Updates `TooMuch4U/actions-clean` from 2.1 to 2.2
    Commits

    Updates `anchore/sbom-action` from 0.15.10 to 0.15.11
    Release notes

    Sourced from anchore/sbom-action's releases.

    v0.15.11

    Changes in v0.15.11

    Commits
    • 7ccf588 chore(deps): update Syft to v1.3.0 (#456)
    • 7f33cf5 chore: remove outdated snapshot workflow (#457)
    • 04a486a fix: extend existing environment when invoking syft instead of creating a new...
    • See full diff in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/buildcomponents.yaml | 2 +- .github/workflows/components.yaml | 2 +- .github/workflows/lint_and_test.yaml | 2 +- .github/workflows/release.yaml | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/buildcomponents.yaml b/.github/workflows/buildcomponents.yaml index 6ecf024d72..6e6d142199 100644 --- a/.github/workflows/buildcomponents.yaml +++ b/.github/workflows/buildcomponents.yaml @@ -25,7 +25,7 @@ jobs: repository-projects: read steps: - name: Self Hosted Runner Post Job Cleanup Action - uses: TooMuch4U/actions-clean@v2.1 + uses: TooMuch4U/actions-clean@v2.2 - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/components.yaml b/.github/workflows/components.yaml index 5e8b60e728..7eb52b1dc3 100644 --- a/.github/workflows/components.yaml +++ b/.github/workflows/components.yaml @@ -126,7 +126,7 @@ jobs: runs-on: large_runner steps: - name: Self Hosted Runner Post Job Cleanup Action - uses: TooMuch4U/actions-clean@v2.1 + uses: TooMuch4U/actions-clean@v2.2 - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/lint_and_test.yaml b/.github/workflows/lint_and_test.yaml index 6f243c0d2f..73434107be 100644 --- a/.github/workflows/lint_and_test.yaml +++ b/.github/workflows/lint_and_test.yaml @@ -78,7 +78,7 @@ jobs: runs-on: large_runner steps: - name: Self Hosted Runner Post Job Cleanup Action - uses: TooMuch4U/actions-clean@v2.1 + uses: TooMuch4U/actions-clean@v2.2 - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 0df1d1ad30..d44be89180 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -123,7 +123,7 @@ jobs: packages: write steps: - name: Self Hosted Runner Post Job Cleanup Action - uses: TooMuch4U/actions-clean@v2.1 + uses: TooMuch4U/actions-clean@v2.2 - name: Generate token id: generate_token uses: tibdex/github-app-token@v2 @@ -142,7 +142,7 @@ jobs: go-version-file: '${{ github.workspace }}/go.mod' - name: Setup Syft - uses: anchore/sbom-action/download-syft@ab5d7b5f48981941c4c5d6bf33aeb98fe3bae38c # v0.15.10 + uses: anchore/sbom-action/download-syft@7ccf588e3cf3cc2611714c2eeae48550fbc17552 # v0.15.11 - name: Setup Cosign uses: sigstore/cosign-installer@v3.5.0 From 975a48507a4c752df2395240d2625a137e0f27e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 10:02:38 +0200 Subject: [PATCH 54/83] Bump the go group with 7 updates (#763) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the go group with 7 updates: | Package | From | To | | --- | --- | --- | | [github.com/docker/cli](https://github.com/docker/cli) | `26.1.0+incompatible` | `26.1.1+incompatible` | | [github.com/docker/docker](https://github.com/docker/docker) | `26.1.0+incompatible` | `26.1.1+incompatible` | | [github.com/fluxcd/pkg/ssa](https://github.com/fluxcd/pkg) | `0.39.0` | `0.39.1` | | [github.com/onsi/gomega](https://github.com/onsi/gomega) | `1.33.0` | `1.33.1` | | [golang.org/x/oauth2](https://github.com/golang/oauth2) | `0.19.0` | `0.20.0` | | [golang.org/x/text](https://github.com/golang/text) | `0.14.0` | `0.15.0` | | [sigs.k8s.io/controller-runtime](https://github.com/kubernetes-sigs/controller-runtime) | `0.18.0` | `0.18.1` | Updates `github.com/docker/cli` from 26.1.0+incompatible to 26.1.1+incompatible
    Commits
    • 4cf5afa Merge pull request #5047 from vvoland/v26.1-5038
    • 6c2b06d Merge pull request #5045 from vvoland/vendor-docker-26.1.1-dev
    • 1c6a8ec cli-plugins: PluginRunCommand: use cmd.Environ instead of os.Environ
    • 6d1c387 vendor: github.com/docker/docker ac2de55998d4 (v26.1.1)
    • 1e6db5d Merge pull request #5044 from vvoland/wait-cancel-noerror
    • 840016e waitExitOrRemoved: Handle context cancellation
    • See full diff in compare view

    Updates `github.com/docker/docker` from 26.1.0+incompatible to 26.1.1+incompatible
    Release notes

    Sourced from github.com/docker/docker's releases.

    v26.1.1

    26.1.1

    For a full list of pull requests and changes in this release, refer to the relevant GitHub milestones:

    Bug fixes and enhancements

    • Fix docker run -d printing an context canceled spurious error when OTEL is configured. docker/cli#5044
    • Experimental environment variable DOCKER_BRIDGE_PRESERVE_KERNEL_LL=1 will prevent the daemon from removing the kernel-assigned link local address on a Linux bridge. moby/moby#47775
    • Resolve an issue preventing container creation on hosts with a read-only /proc/sys/net filesystem. If IPv6 cannot be disabled on an interface due to this, either disable IPv6 by default on the host or ensure /proc/sys/net is read-write. Otherwise, start dockerd with DOCKER_ALLOW_IPV6_ON_IPV4_INTERFACE=1 to bypass the error. moby/moby#47769

    [!NOTE] The DOCKER_ALLOW_IPV6_ON_IPV4_INTERFACE is added as a temporary fix and will be phased out in a future major release after simplifying the IPv6 enablement process.

    Packaging updates

    Commits
    • ac2de55 Merge pull request #47775 from vvoland/v26.1-47771
    • 9a2b531 Merge pull request #47774 from vvoland/v26.1-47769
    • 2f5bbbe Option to avoid deleting the kernel_ll address from bridges.
    • 4061808 Allow for a read-only "/proc/sys/net".
    • 21da192 Merge pull request #47767 from austinvazquez/cherry-pick-eeec716e332e5c058dfe...
    • 2c91196 Update containerd to v1.7.16
    • a9a8787 Merge pull request #47762 from tonistiigi/26.1-update-buildkit-v0.13.2
    • c9689ec vendor: update buildkit to v0.13.2
    • See full diff in compare view

    Updates `github.com/fluxcd/pkg/ssa` from 0.39.0 to 0.39.1
    Commits
    • adcfcbe Merge pull request #769 from fluxcd/controller-runtime-v0.18.1
    • 0e74a82 Update runtime pkg docs
    • b329d92 Update dependencies to controller-runtime v0.18.1
    • d0bf8ed Merge pull request #768 from fluxcd/dependabot/github_actions/ci-b93eff89fb
    • 14f05d7 build(deps): bump actions/checkout from 4.1.3 to 4.1.4 in the ci group
    • 3790516 Merge pull request #767 from fluxcd/up-internal-deps
    • 37ea30c Update internal dependencies
    • See full diff in compare view

    Updates `github.com/onsi/gomega` from 1.33.0 to 1.33.1
    Release notes

    Sourced from github.com/onsi/gomega's releases.

    v1.33.1

    1.33.1

    Fixes

    • fix confusing eventually docs [3a66379]

    Maintenance

    • Bump github.com/onsi/ginkgo/v2 from 2.17.1 to 2.17.2 [e9bc35a]
    Changelog

    Sourced from github.com/onsi/gomega's changelog.

    1.33.1

    Fixes

    • fix confusing eventually docs [3a66379]

    Maintenance

    • Bump github.com/onsi/ginkgo/v2 from 2.17.1 to 2.17.2 [e9bc35a]
    Commits

    Updates `golang.org/x/oauth2` from 0.19.0 to 0.20.0
    Commits
    • 84cb9f7 oauth2: fix typo in comment
    • 4b7f0bd go.mod: update cloud.google.com/go/compute/metadata dependency
    • e11eea8 microsoft: added DeviceAuthURL to AzureADEndpoint
    • See full diff in compare view

    Updates `golang.org/x/text` from 0.14.0 to 0.15.0
    Commits

    Updates `sigs.k8s.io/controller-runtime` from 0.18.0 to 0.18.1
    Release notes

    Sourced from sigs.k8s.io/controller-runtime's releases.

    v0.18.1

    What's Changed

    Full Changelog: https://github.com/kubernetes-sigs/controller-runtime/compare/v0.18.0...v0.18.1

    Commits
    • cd2885e Merge pull request #2809 from k8s-infra-cherrypick-robot/cherry-pick-2806-to-...
    • 06acde3 πŸ› correct kind source type
    • d6feaae Merge pull request #2808 from k8s-infra-cherrypick-robot/cherry-pick-2805-to-...
    • 87cae4c bug: Cache: Fix label defaulting of byObject when namespaces are configured
    • See full diff in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 17 ++++++++--------- go.sum | 33 ++++++++++++++++----------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/go.mod b/go.mod index 9a172caa3f..bd365e9b1b 100644 --- a/go.mod +++ b/go.mod @@ -21,12 +21,12 @@ require ( github.com/containers/image/v5 v5.30.0 github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f github.com/distribution/reference v0.6.0 - github.com/docker/cli v26.1.0+incompatible - github.com/docker/docker v26.1.0+incompatible + github.com/docker/cli v26.1.1+incompatible + github.com/docker/docker v26.1.1+incompatible github.com/docker/go-connections v0.5.0 github.com/drone/envsubst v1.0.3 github.com/fluxcd/cli-utils v0.36.0-flux.7 - github.com/fluxcd/pkg/ssa v0.39.0 + github.com/fluxcd/pkg/ssa v0.39.1 github.com/gertd/go-pluralize v0.2.1 github.com/ghodss/yaml v1.0.0 github.com/go-logr/logr v1.4.1 @@ -50,7 +50,7 @@ require ( github.com/mittwald/go-helm-client v0.12.9 github.com/modern-go/reflect2 v1.0.2 github.com/onsi/ginkgo/v2 v2.17.2 - github.com/onsi/gomega v1.33.0 + github.com/onsi/gomega v1.33.1 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.1.0 github.com/pkg/errors v0.9.1 @@ -68,8 +68,8 @@ require ( golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 golang.org/x/net v0.24.0 - golang.org/x/oauth2 v0.19.0 - golang.org/x/text v0.14.0 + golang.org/x/oauth2 v0.20.0 + golang.org/x/text v0.15.0 gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 gopkg.in/yaml.v3 v3.0.1 helm.sh/helm/v3 v3.14.4 @@ -78,13 +78,12 @@ require ( k8s.io/apimachinery v0.30.0 k8s.io/cli-runtime v0.30.0 k8s.io/client-go v0.30.0 - sigs.k8s.io/controller-runtime v0.18.0 + sigs.k8s.io/controller-runtime v0.18.1 sigs.k8s.io/yaml v1.4.0 ) require ( - cloud.google.com/go/compute v1.25.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/compute/metadata v0.3.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0 // indirect diff --git a/go.sum b/go.sum index 97c9e3c82d..13c2f428ef 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,7 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= -cloud.google.com/go/compute v1.25.0 h1:H1/4SqSUhjPFE7L5ddzHOfY2bCAvjwNRZPNl6Ni5oYU= -cloud.google.com/go/compute v1.25.0/go.mod h1:GR7F0ZPZH8EhChlMo9FkLd7eUTwEymjqQagxzilIxIE= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= cloud.google.com/go/kms v1.15.8 h1:szIeDCowID8th2i8XE4uRev5PMxQFqW+JjwYxL9h6xs= @@ -317,13 +315,13 @@ github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aB github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2/go.mod h1:WHNsWjnIn2V1LYOrME7e8KxSeKunYHsxEm4am0BUtcI= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v26.1.0+incompatible h1:+nwRy8Ocd8cYNQ60mozDDICICD8aoFGtlPXifX/UQ3Y= -github.com/docker/cli v26.1.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v26.1.1+incompatible h1:bE1/uE2tCa08fMv+7ikLR/RDPoCqytwrLtkIkSzxLvw= +github.com/docker/cli v26.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v26.1.0+incompatible h1:W1G9MPNbskA6VZWL7b3ZljTh0pXI68FpINx0GKaOdaM= -github.com/docker/docker v26.1.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v26.1.1+incompatible h1:oI+4kkAgIwwb54b9OC7Xc3hSgu1RlJA/Lln/DF72djQ= +github.com/docker/docker v26.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo= github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= @@ -368,8 +366,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fluxcd/cli-utils v0.36.0-flux.7 h1:81zEo/LNmIRWMgtsZy/8L13TMUZHmmJib4gHRvKwVE8= github.com/fluxcd/cli-utils v0.36.0-flux.7/go.mod h1:TcfLhvBjtQnqxYMsHQUAEB2c5WJRVuibtas2Izz5ZTs= -github.com/fluxcd/pkg/ssa v0.39.0 h1:MdsTjwmF7mxTuZRt1XcLp5SzDI0PcRDR8bnbGH4nvHo= -github.com/fluxcd/pkg/ssa v0.39.0/go.mod h1:bS/QGx2YjAiyzPl1CGb8w+6ETmoIhpeViTcEnTpv+t4= +github.com/fluxcd/pkg/ssa v0.39.1 h1:xPYRKqgqB5p+5jgz2xBkXCE/7i1FIOa+nA3Wr7Gu2Ek= +github.com/fluxcd/pkg/ssa v0.39.1/go.mod h1:AkhMoFxipMf3WoO3lkXjj2nHNIz6sA5yQ50aBodtxnk= github.com/foxcpp/go-mockdns v1.0.0 h1:7jBqxd3WDWwi/6WhDvacvH1XsN3rOLXyHM1uhvIx6FI= github.com/foxcpp/go-mockdns v1.0.0/go.mod h1:lgRN6+KxQBawyIghpnl5CezHFGS9VLzvtVlwxvzXTQ4= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= @@ -782,8 +780,8 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.33.0 h1:snPCflnZrpMsy94p4lXVEkHo12lmPnc3vY5XBbreexE= -github.com/onsi/gomega v1.33.0/go.mod h1:+925n5YtiFsLzzafLUHzVMBpvvRAzrydIBiSIxjX3wY= +github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= +github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= github.com/open-component-model/cobra v0.0.0-20230329075350-b1fd876abfb9 h1:b2cJvZ8nWAVvCqvPhUaFl26Wht4nM4mqfl2ksY9lVzU= github.com/open-component-model/cobra v0.0.0-20230329075350-b1fd876abfb9/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/open-policy-agent/opa v0.63.0 h1:ztNNste1v8kH0/vJMJNquE45lRvqwrM5mY9Ctr9xIXw= @@ -1126,8 +1124,8 @@ golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg= -golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1198,8 +1196,9 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1327,8 +1326,8 @@ k8s.io/utils v0.0.0-20240310230437-4693a0247e57 h1:gbqbevonBh57eILzModw6mrkbwM0g k8s.io/utils v0.0.0-20240310230437-4693a0247e57/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo= -sigs.k8s.io/controller-runtime v0.18.0 h1:Z7jKuX784TQSUL1TIyeuF7j8KXZ4RtSX0YgtjKcSTME= -sigs.k8s.io/controller-runtime v0.18.0/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw= +sigs.k8s.io/controller-runtime v0.18.1 h1:RpWbigmuiylbxOCLy0tGnq1cU1qWPwNIQzoJk+QeJx4= +sigs.k8s.io/controller-runtime v0.18.1/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kustomize/api v0.17.1 h1:MYJBOP/yQ3/5tp4/sf6HiiMfNNyO97LmtnirH9SLNr4= From 4473dacca406e4c84c0ac5e6e14393c659384afc Mon Sep 17 00:00:00 2001 From: Hilmar Falkenberg Date: Mon, 6 May 2024 10:30:10 +0200 Subject: [PATCH 55/83] Npm/auth access (#757) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description When credentials are configured, let's also use them for the read access. ## What type of PR is this? (check all applicable) - [x] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [x] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [x] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Closes #753 ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [x] Any dependent changes have been merged and published in downstream modules --- pkg/contexts/ocm/accessmethods/npm/method.go | 30 +++--- .../handlers/generic/npm/blobhandler.go | 35 ++----- .../handlers/generic/npm/publish.go | 41 -------- pkg/npm/login.go | 99 +++++++++++++++++++ 4 files changed, 123 insertions(+), 82 deletions(-) create mode 100644 pkg/npm/login.go diff --git a/pkg/contexts/ocm/accessmethods/npm/method.go b/pkg/contexts/ocm/accessmethods/npm/method.go index 7698cd9920..07784f25e9 100644 --- a/pkg/contexts/ocm/accessmethods/npm/method.go +++ b/pkg/contexts/ocm/accessmethods/npm/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package npm import ( @@ -20,11 +16,13 @@ import ( "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" + "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/iotools" "github.com/open-component-model/ocm/pkg/mime" + "github.com/open-component-model/ocm/pkg/npm" "github.com/open-component-model/ocm/pkg/runtime" ) @@ -95,23 +93,27 @@ func (a *AccessSpec) GetInexpensiveContentVersionIdentity(access accspeccpi.Comp return "" } +// PackageUrl returns the URL of the NPM package (Registry/Package/Version). +func (a *AccessSpec) PackageUrl() string { + return a.Registry + path.Join("/", a.Package, a.Version) +} + func (a *AccessSpec) getPackageMeta(ctx accspeccpi.Context) (*meta, error) { - url := a.Registry + path.Join("/", a.Package, a.Version) - r, err := reader(url, vfsattr.Get(ctx)) + r, err := reader(a, vfsattr.Get(ctx), ctx) if err != nil { return nil, err } buf := &bytes.Buffer{} _, err = io.Copy(buf, io.LimitReader(r, 200000)) if err != nil { - return nil, errors.Wrapf(err, "cannot get version metadata for %s", url) + return nil, errors.Wrapf(err, "cannot get version metadata for %s", a.PackageUrl()) } var metadata meta err = json.Unmarshal(buf.Bytes(), &metadata) if err != nil { - return nil, errors.Wrapf(err, "cannot unmarshal version metadata for %s", url) + return nil, errors.Wrapf(err, "cannot unmarshal version metadata for %s", a.PackageUrl()) } return &metadata, nil } @@ -126,7 +128,7 @@ func newMethod(c accspeccpi.ComponentVersionAccess, a *AccessSpec) (accspeccpi.A } f := func() (io.ReadCloser, error) { - return reader(meta.Dist.Tarball, vfsattr.Get(c.GetContext())) + return reader(a, vfsattr.Get(c.GetContext()), c.GetContext(), meta.Dist.Tarball) } if meta.Dist.Shasum != "" { tf := f @@ -151,9 +153,11 @@ type meta struct { } `json:"dist"` } -func reader(url string, fs vfs.FileSystem) (io.ReadCloser, error) { - c := &http.Client{} - +func reader(a *AccessSpec, fs vfs.FileSystem, ctx cpi.ContextProvider, tar ...string) (io.ReadCloser, error) { + url := a.PackageUrl() + if len(tar) > 0 { + url = tar[0] + } if strings.HasPrefix(url, "file://") { path := url[7:] return fs.OpenFile(path, vfs.O_RDONLY, 0o600) @@ -163,6 +167,8 @@ func reader(url string, fs vfs.FileSystem) (io.ReadCloser, error) { if err != nil { return nil, err } + npm.Authorize(req, ctx, a.Registry, a.Package) + c := &http.Client{} resp, err := c.Do(req) if err != nil { return nil, err diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/blobhandler.go index 709141fd4d..76032ffca3 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/blobhandler.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/blobhandler.go @@ -9,11 +9,11 @@ import ( "net/http" "net/url" - npmCredentials "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/npm/identity" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/npm" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/logging" "github.com/open-component-model/ocm/pkg/mime" + npmLogin "github.com/open-component-model/ocm/pkg/npm" ) const BLOB_HANDLER_NAME = "ocm/npmPackage" @@ -52,7 +52,7 @@ func (b *artifactHandler) StoreBlob(blob cpi.BlobAccess, _ string, _ string, _ c } // read package.json from tarball to get name, version, etc. - log := logging.Context().Logger(npmCredentials.REALM) + log := logging.Context().Logger(npmLogin.REALM) log.Debug("reading package.json from tarball") var pkg *Package pkg, err = prepare(data) @@ -64,33 +64,10 @@ func (b *artifactHandler) StoreBlob(blob cpi.BlobAccess, _ string, _ string, _ c log = log.WithValues("package", pkg.Name, "version", pkg.Version) log.Debug("identified") - // get credentials and TODO cache it - cred := npmCredentials.GetCredentials(ctx.GetContext(), b.spec.Url, pkg.Name) - if cred == nil { - return nil, fmt.Errorf("No credentials found for %s. Couldn't upload '%s'.", b.spec.Url, pkg.Name) - } - log.Debug("found credentials") - - // check if token exists, if not login and retrieve token - token := cred[npmCredentials.ATTR_TOKEN] - if token == "" { - // use user+pass+mail from credentials to login and retrieve bearer token - username := cred[npmCredentials.ATTR_USERNAME] - password := cred[npmCredentials.ATTR_PASSWORD] - email := cred[npmCredentials.ATTR_EMAIL] - if username == "" || password == "" || email == "" { - return nil, fmt.Errorf("No credentials for %s are invalid. Username, password or email missing! Couldn't upload '%s'.", b.spec.Url, pkg.Name) - } - log = log.WithValues("user", username, "repo", b.spec.Url) - log.Debug("login") - - // TODO: check different kinds of .npmrc content - token, err = login(b.spec.Url, username, password, email) - if err != nil { - return nil, err - } - } else { - log.Debug("token found, skipping login") + token, err := npmLogin.BearerToken(ctx.GetContext(), b.spec.Url, pkg.Name) + if err != nil { + // we assume, it's not possible to publish anonymous - without token + return nil, err } // check if package exists diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/publish.go b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/publish.go index cb5058e662..d27a306a1d 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/publish.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/publish.go @@ -6,7 +6,6 @@ import ( "archive/tar" "bytes" "compress/gzip" - "context" //nolint:gosec // older npm (prior to v5) uses sha1 "crypto/sha1" "crypto/sha512" @@ -16,8 +15,6 @@ import ( "errors" "fmt" "io" - "net/http" - "net/url" ) type Package struct { @@ -58,44 +55,6 @@ func NewAttachment(data []byte) *Attachment { } } -// Login to npm registry (URL) and retrieve bearer token. -func login(registry string, username string, password string, email string) (string, error) { - data := map[string]interface{}{ - "_id": "org.couchdb.user:" + username, - "name": username, - "email": email, - "password": password, - "type": "user", - } - marshal, err := json.Marshal(data) - if err != nil { - return "", err - } - req, err := http.NewRequestWithContext(context.Background(), http.MethodPut, registry+"/-/user/org.couchdb.user:"+url.PathEscape(username), bytes.NewReader(marshal)) - if err != nil { - return "", err - } - req.SetBasicAuth(username, password) - req.Header.Set("content-type", "application/json") - resp, err := http.DefaultClient.Do(req) - if err != nil { - return "", err - } - defer resp.Body.Close() - if resp.StatusCode >= http.StatusBadRequest { - all, _ := io.ReadAll(resp.Body) - return "", fmt.Errorf("%d, %s", resp.StatusCode, string(all)) - } - var token struct { - Token string `json:"token"` - } - err = json.NewDecoder(resp.Body).Decode(&token) - if err != nil { - return "", err - } - return token.Token, nil -} - func createSha512(data []byte) string { hash := sha512.New() hash.Write(data) diff --git a/pkg/npm/login.go b/pkg/npm/login.go new file mode 100644 index 0000000000..17f45b0298 --- /dev/null +++ b/pkg/npm/login.go @@ -0,0 +1,99 @@ +package npm + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + + "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/npm/identity" + "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" + "github.com/open-component-model/ocm/pkg/logging" +) + +var REALM = identity.REALM + +// Login to npm registry (URL) and retrieve bearer token. +func Login(registry string, username string, password string, email string) (string, error) { + data := map[string]interface{}{ + "_id": "org.couchdb.user:" + username, + "name": username, + "email": email, + "password": password, + "type": "user", + } + marshal, err := json.Marshal(data) + if err != nil { + return "", err + } + req, err := http.NewRequestWithContext(context.Background(), http.MethodPut, registry+"/-/user/org.couchdb.user:"+url.PathEscape(username), bytes.NewReader(marshal)) + if err != nil { + return "", err + } + req.SetBasicAuth(username, password) + req.Header.Set("content-type", "application/json") + resp, err := http.DefaultClient.Do(req) + if err != nil { + return "", err + } + defer resp.Body.Close() + if resp.StatusCode >= http.StatusBadRequest { + all, _ := io.ReadAll(resp.Body) + return "", fmt.Errorf("%d, %s", resp.StatusCode, string(all)) + } + var token struct { + Token string `json:"token"` + } + err = json.NewDecoder(resp.Body).Decode(&token) + if err != nil { + return "", err + } + return token.Token, nil +} + +// BearerToken retrieves the bearer token for the given repository URL and package name. +// Either it's setup in the credentials or it will login to the registry and retrieve it. +func BearerToken(ctx cpi.ContextProvider, repoUrl string, pkgName string) (string, error) { + // get credentials and TODO cache it + cred := identity.GetCredentials(ctx, repoUrl, pkgName) + if cred == nil { + return "", fmt.Errorf("no credentials found for %s. Couldn't upload '%s'", repoUrl, pkgName) + } + log := logging.Context().Logger(identity.REALM) + log.Debug("found credentials") + + // check if token exists, if not login and retrieve token + token := cred[identity.ATTR_TOKEN] + if token != "" { + log.Debug("token found, skipping login") + return token, nil + } + + // use user+pass+mail from credentials to login and retrieve bearer token + username := cred[identity.ATTR_USERNAME] + password := cred[identity.ATTR_PASSWORD] + email := cred[identity.ATTR_EMAIL] + if username == "" || password == "" || email == "" { + return "", fmt.Errorf("credentials for %s are invalid. Username, password or email missing! Couldn't upload '%s'", repoUrl, pkgName) + } + log = log.WithValues("user", username, "repo", repoUrl) + log.Debug("login") + + // TODO: check different kinds of .npmrc content + return Login(repoUrl, username, password, email) +} + +// Authorize the given request with the bearer token for the given repository URL and package name. +// If the token is empty (login failed or credentials not found), it will not be set. +func Authorize(req *http.Request, ctx cpi.ContextProvider, repoUrl string, pkgName string) { + token, err := BearerToken(ctx, repoUrl, pkgName) + if err != nil { + log := logging.Context().Logger(identity.REALM) + log.Debug("Couldn't authorize", "error", err.Error(), "repo", repoUrl, "package", pkgName) + } else if token != "" { + req.Header.Set("authorization", "Bearer "+token) + } +} From e05a5a083e96085114b24d03925f614683d9e8cc Mon Sep 17 00:00:00 2001 From: Hilmar Falkenberg Date: Mon, 6 May 2024 15:55:14 +0200 Subject: [PATCH 56/83] Create codeql.yml (#764) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description [Analyze (go)](https://github.com/open-component-model/ocm/actions/runs/8966268485/job/24621423943) is failing now with: ``` System.IO.IOException: No space left on device : '/home/runner/runners/2.316.0/_diag/Worker_20240506-083021-utc.log' at System.IO.RandomAccess.WriteAtOffset(SafeFileHandle handle, ReadOnlySpan`1 buffer, Int64 fileOffset) at System.IO.Strategies.BufferedFileStreamStrategy.FlushWrite() at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder) at System.Diagnostics.TextWriterTraceListener.Flush() at GitHub.Runner.Common.HostTraceListener.WriteHeader(String source, TraceEventType eventType, Int32 id) at GitHub.Runner.Common.HostTraceListener.TraceEvent(TraceEventCache eventCache, String source, TraceEventType eventType, Int32 id, String message) at System.Diagnostics.TraceSource.TraceEvent(TraceEventType eventType, Int32 id, String message) at GitHub.Runner.Worker.Worker.RunAsync(String pipeIn, String pipeOut) at GitHub.Runner.Worker.Program.MainAsync(IHostContext context, String[] args) System.IO.IOException: No space left on device : '/home/runner/runners/2.316.0/_diag/Worker_20240506-083021-utc.log' at System.IO.RandomAccess.WriteAtOffset(SafeFileHandle handle, ReadOnlySpan`1 buffer, Int64 fileOffset) at System.IO.Strategies.BufferedFileStreamStrategy.FlushWrite() at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder) at System.Diagnostics.TextWriterTraceListener.Flush() at GitHub.Runner.Common.HostTraceListener.WriteHeader(String source, TraceEventType eventType, Int32 id) at GitHub.Runner.Common.HostTraceListener.TraceEvent(TraceEventCache eventCache, String source, TraceEventType eventType, Int32 id, String message) at System.Diagnostics.TraceSource.TraceEvent(TraceEventType eventType, Int32 id, String message) at GitHub.Runner.Common.Tracing.Error(Exception exception) at GitHub.Runner.Worker.Program.MainAsync(IHostContext context, String[] args) Unhandled exception. System.IO.IOException: No space left on device : '/home/runner/runners/2.316.0/_diag/Worker_20240506-083021-utc.log' at System.IO.RandomAccess.WriteAtOffset(SafeFileHandle handle, ReadOnlySpan`1 buffer, Int64 fileOffset) at System.IO.Strategies.BufferedFileStreamStrategy.FlushWrite() at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder) at System.Diagnostics.TextWriterTraceListener.Flush() at System.Diagnostics.TraceSource.Flush() at GitHub.Runner.Common.TraceManager.Dispose(Boolean disposing) at GitHub.Runner.Common.TraceManager.Dispose() at GitHub.Runner.Common.HostContext.Dispose(Boolean disposing) at GitHub.Runner.Common.HostContext.Dispose() at GitHub.Runner.Worker.Program.Main(String[] args) ``` ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [x] πŸ€– Build - [x] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- .github/workflows/codeql.yml | 95 ++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000000..0e1964b0cd --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,95 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + schedule: + - cron: '26 14 * * 2' + +jobs: + analyze: + name: Analyze (${{ matrix.language }}) + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners (GitHub.com only) + # Consider using larger runners or machines with greater resources for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} + permissions: + # required for all workflows + security-events: write + + # required to fetch internal or private CodeQL packs + packages: read + + # only required for workflows in private repositories + actions: read + contents: read + + strategy: + fail-fast: false + matrix: + include: + - language: go + build-mode: autobuild + # CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' + # Use `c-cpp` to analyze code written in C, C++ or both + # Use 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, + # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. + # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how + # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages + steps: + - name: Self Hosted Runner Post Job Cleanup Action + uses: TooMuch4U/actions-clean@v2.2 + + - name: Checkout repository + uses: actions/checkout@v4 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + # If the analyze step fails for one of the languages you are analyzing with + # "We were unable to automatically build your code", modify the matrix above + # to set the build mode to "manual" for that language. Then modify this step + # to build your code. + # ℹ️ Command-line programs to run using the OS shell. + # πŸ“š See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + - if: matrix.build-mode == 'manual' + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" From 8a4d9192ede06a32c789d813e6100942c70144ea Mon Sep 17 00:00:00 2001 From: Gergely Brautigam <182850+Skarlso@users.noreply.github.com> Date: Tue, 7 May 2024 15:22:32 +0200 Subject: [PATCH 57/83] feat: add uninstall command to the controller (#766) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Closes https://github.com/open-component-model/ocm-project/issues/37 ## What type of PR is this? (check all applicable) - [x] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- .../{install/apply.go => common/applyer.go} | 4 +- .../commands/controllercmds/common/fetcher.go | 107 +++++++++++ .../controllercmds/common/manifests.go | 115 ++++++++++++ .../commands/controllercmds/install/cmd.go | 166 +----------------- .../install/install_cert_manager.go | 13 +- .../install/resource_manager.go | 55 ++++++ .../commands/controllercmds/uninstall/cmd.go | 115 ++++++++++++ .../controllercmds/uninstall/cmd_test.go | 74 ++++++++ .../issuer/registry_certificate.yaml | 29 +++ .../uninstall/resource_manager.go | 55 ++++++ .../controllercmds/uninstall/suite_test.go | 17 ++ .../uninstall/testdata/install.yaml | 1 + .../uninstall/uninstall_cert_manager.go | 68 +++++++ cmds/ocm/commands/verbs/controller/cmd.go | 2 + cmds/ocm/commands/verbs/verbs.go | 1 + 15 files changed, 650 insertions(+), 172 deletions(-) rename cmds/ocm/commands/controllercmds/{install/apply.go => common/applyer.go} (96%) create mode 100644 cmds/ocm/commands/controllercmds/common/fetcher.go create mode 100644 cmds/ocm/commands/controllercmds/common/manifests.go create mode 100644 cmds/ocm/commands/controllercmds/install/resource_manager.go create mode 100644 cmds/ocm/commands/controllercmds/uninstall/cmd.go create mode 100644 cmds/ocm/commands/controllercmds/uninstall/cmd_test.go create mode 100644 cmds/ocm/commands/controllercmds/uninstall/issuer/registry_certificate.yaml create mode 100644 cmds/ocm/commands/controllercmds/uninstall/resource_manager.go create mode 100644 cmds/ocm/commands/controllercmds/uninstall/suite_test.go create mode 100644 cmds/ocm/commands/controllercmds/uninstall/testdata/install.yaml create mode 100644 cmds/ocm/commands/controllercmds/uninstall/uninstall_cert_manager.go diff --git a/cmds/ocm/commands/controllercmds/install/apply.go b/cmds/ocm/commands/controllercmds/common/applyer.go similarity index 96% rename from cmds/ocm/commands/controllercmds/install/apply.go rename to cmds/ocm/commands/controllercmds/common/applyer.go index 395bb1eea3..a2f07e3966 100644 --- a/cmds/ocm/commands/controllercmds/install/apply.go +++ b/cmds/ocm/commands/controllercmds/common/applyer.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -package install +package common import ( "bufio" @@ -20,7 +20,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" ) -func readObjects(manifestPath string) ([]*unstructured.Unstructured, error) { +func ReadObjects(manifestPath string) ([]*unstructured.Unstructured, error) { fi, err := os.Lstat(manifestPath) if err != nil { return nil, err diff --git a/cmds/ocm/commands/controllercmds/common/fetcher.go b/cmds/ocm/commands/controllercmds/common/fetcher.go new file mode 100644 index 0000000000..189bcca072 --- /dev/null +++ b/cmds/ocm/commands/controllercmds/common/fetcher.go @@ -0,0 +1,107 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package common + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "os" + "path/filepath" + "strings" +) + +func getLatestVersion(ctx context.Context, url string) (string, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url+"/latest", nil) + if err != nil { + return "", err + } + + res, err := http.DefaultClient.Do(req) + if err != nil { + return "", fmt.Errorf("GitHub API call failed: %w", err) + } + + if res.Body != nil { + defer res.Body.Close() + } + + type meta struct { + Tag string `json:"tag_name"` + } + var m meta + if err := json.NewDecoder(res.Body).Decode(&m); err != nil { + return "", fmt.Errorf("decoding GitHub API response failed: %w", err) + } + + return m.Tag, err +} + +// existingVersion calls the GitHub API to confirm the given version does exist. +func existingVersion(ctx context.Context, url, version string) (bool, error) { + if !strings.HasPrefix(version, "v") { + version = "v" + version + } + + ghURL := fmt.Sprintf(url+"/tags/%s", version) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, ghURL, nil) + if err != nil { + return false, fmt.Errorf("GitHub API call failed: %w", err) + } + + res, err := http.DefaultClient.Do(req) + if err != nil { + return false, err + } + + if res.Body != nil { + defer res.Body.Close() + } + + switch res.StatusCode { + case http.StatusOK: + return true, nil + case http.StatusNotFound: + return false, nil + default: + return false, fmt.Errorf("GitHub API returned an unexpected status code (%d)", res.StatusCode) + } +} + +func fetch(ctx context.Context, url, version, dir, filename string) error { + ghURL := fmt.Sprintf("%s/latest/download/%s", url, filename) + if strings.HasPrefix(version, "v") { + ghURL = fmt.Sprintf("%s/download/%s/%s", url, version, filename) + } + + req, err := http.NewRequest(http.MethodGet, ghURL, nil) + if err != nil { + return fmt.Errorf("failed to create HTTP request for %s, error: %w", ghURL, err) + } + + resp, err := http.DefaultClient.Do(req.WithContext(ctx)) + if err != nil { + return fmt.Errorf("failed to download manifests.tar.gz from %s, error: %w", ghURL, err) + } + defer resp.Body.Close() + + // check response + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("failed to download %s from %s, status: %s", filename, ghURL, resp.Status) + } + + wf, err := os.OpenFile(filepath.Join(dir, filename), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o777) + if err != nil { + return fmt.Errorf("failed to open temp file: %w", err) + } + + if _, err := io.Copy(wf, resp.Body); err != nil { + return fmt.Errorf("failed to write to temp file: %w", err) + } + + return nil +} diff --git a/cmds/ocm/commands/controllercmds/common/manifests.go b/cmds/ocm/commands/controllercmds/common/manifests.go new file mode 100644 index 0000000000..b49871b6d4 --- /dev/null +++ b/cmds/ocm/commands/controllercmds/common/manifests.go @@ -0,0 +1,115 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package common + +import ( + "context" + "fmt" + "os" + "path/filepath" + + "github.com/fluxcd/pkg/ssa" + "github.com/open-component-model/ocm/pkg/contexts/clictx" + "github.com/open-component-model/ocm/pkg/out" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" +) + +func Install(ctx context.Context, octx clictx.Context, sm *ssa.ResourceManager, releaseURL, baseURL, manifest, filename, version string, dryRun bool) error { + objects, err := fetchObjects(ctx, octx, releaseURL, baseURL, manifest, filename, version, dryRun) + if err != nil { + return fmt.Errorf("βœ— failed to construct objects to apply: %w", err) + } + + // dry run was set to true, no objects are returned + if len(objects) == 0 { + return nil + } + + if _, err := sm.ApplyAllStaged(context.Background(), objects, ssa.DefaultApplyOptions()); err != nil { + return fmt.Errorf("βœ— failed to apply manifests: %w", err) + } + + out.Outf(octx, "β–Ί waiting for ocm deployment to be ready\n") + if err = sm.Wait(objects, ssa.DefaultWaitOptions()); err != nil { + return fmt.Errorf("βœ— failed to wait for objects to be ready: %w", err) + } + + return nil +} + +func Uninstall(ctx context.Context, octx clictx.Context, sm *ssa.ResourceManager, releaseURL, baseURL, manifest, filename, version string, dryRun bool) error { + objects, err := fetchObjects(ctx, octx, releaseURL, baseURL, manifest, filename, version, dryRun) + if err != nil { + return fmt.Errorf("βœ— failed to construct objects to apply: %w", err) + } + + // dry run was set to true, no objects are returned + if len(objects) == 0 { + return nil + } + + if _, err := sm.DeleteAll(context.Background(), objects, ssa.DefaultDeleteOptions()); err != nil { + return fmt.Errorf("βœ— failed to delete manifests: %w", err) + } + + out.Outf(octx, "β–Ί waiting for ocm deployment to be deleted\n") + if err = sm.WaitForTermination(objects, ssa.DefaultWaitOptions()); err != nil { + return fmt.Errorf("βœ— failed to wait for objects to be deleted: %w", err) + } + + return nil +} + +func fetchObjects(ctx context.Context, octx clictx.Context, releaseURL, baseURL, manifest, filename, version string, dryRun bool) ([]*unstructured.Unstructured, error) { + if version == "latest" { + latest, err := getLatestVersion(ctx, releaseURL) + if err != nil { + return nil, fmt.Errorf("βœ— failed to retrieve latest version for %s: %w", manifest, err) + } + out.Outf(octx, "β–Ί got latest version %q\n", latest) + version = latest + } else { + exists, err := existingVersion(ctx, releaseURL, version) + if err != nil { + return nil, fmt.Errorf("βœ— failed to check if version exists: %w", err) + } + if !exists { + return nil, fmt.Errorf("βœ— version %q does not exist", version) + } + } + + temp, err := os.MkdirTemp("", manifest+"-download") + if err != nil { + return nil, fmt.Errorf("βœ— failed to create temp folder: %w", err) + } + defer os.RemoveAll(temp) + + if err := fetch(ctx, baseURL, version, temp, filename); err != nil { + return nil, fmt.Errorf("βœ— failed to download install.yaml file: %w", err) + } + + path := filepath.Join(temp, filename) + if _, err := os.Stat(path); os.IsNotExist(err) { + return nil, fmt.Errorf("βœ— failed to find %s file at location: %w", filename, err) + } + out.Outf(octx, "βœ” successfully fetched install file\n") + if dryRun { + content, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("βœ— failed to read %s file at location: %w", filename, err) + } + + out.Outf(octx, string(content)) + return nil, nil + } + out.Outf(octx, "β–Ί applying to cluster...\n") + + objects, err := ReadObjects(path) + if err != nil { + return nil, fmt.Errorf("βœ— failed to construct objects to apply: %w", err) + } + + return objects, nil +} diff --git a/cmds/ocm/commands/controllercmds/install/cmd.go b/cmds/ocm/commands/controllercmds/install/cmd.go index f79063131b..546601e9b5 100644 --- a/cmds/ocm/commands/controllercmds/install/cmd.go +++ b/cmds/ocm/commands/controllercmds/install/cmd.go @@ -6,16 +6,11 @@ package install import ( "context" - "encoding/json" "fmt" - "io" - "net/http" - "os" - "strings" "time" "github.com/fluxcd/pkg/ssa" - "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/common" "github.com/spf13/cobra" "github.com/spf13/pflag" corev1 "k8s.io/api/core/v1" @@ -55,7 +50,7 @@ type Command struct { var _ utils.OCMCommand = (*Command)(nil) -// NewCommand creates a new controller cdommand. +// NewCommand creates a new controller command. func NewCommand(ctx clictx.Context, names ...string) *cobra.Command { return utils.SetupCommand(&Command{BaseCommand: utils.NewBaseCommand(ctx)}, utils.Names(Names, names...)...) } @@ -114,13 +109,16 @@ func (o *Command) Run() error { out.Outf(o.Context, "β–Ί installing ocm-controller with version %s\n", o.Version) version := o.Version - if err := o.installManifest( + if err := common.Install( ctx, + o.Context, + sm, o.ReleaseAPIURL, o.BaseURL, "ocm-controller", "install.yaml", version, + o.DryRun, ); err != nil { return err } @@ -129,158 +127,6 @@ func (o *Command) Run() error { return nil } -func (o *Command) installManifest(ctx context.Context, releaseURL, baseURL, manifest, filename, version string) error { - if version == "latest" { - latest, err := o.getLatestVersion(ctx, releaseURL) - if err != nil { - return fmt.Errorf("βœ— failed to retrieve latest version for %s: %w", manifest, err) - } - out.Outf(o.Context, "β–Ί got latest version %q\n", latest) - version = latest - } else { - exists, err := o.existingVersion(ctx, releaseURL, version) - if err != nil { - return fmt.Errorf("βœ— failed to check if version exists: %w", err) - } - if !exists { - return fmt.Errorf("βœ— version %q does not exist", version) - } - } - - temp, err := os.MkdirTemp("", manifest+"-download") - if err != nil { - return fmt.Errorf("βœ— failed to create temp folder: %w", err) - } - defer os.RemoveAll(temp) - - if err := o.fetch(ctx, baseURL, version, temp, filename); err != nil { - return fmt.Errorf("βœ— failed to download install.yaml file: %w", err) - } - - path := filepath.Join(temp, filename) - if _, err := os.Stat(path); os.IsNotExist(err) { - return fmt.Errorf("βœ— failed to find %s file at location: %w", filename, err) - } - out.Outf(o.Context, "βœ” successfully fetched install file\n") - if o.DryRun { - content, err := os.ReadFile(path) - if err != nil { - return fmt.Errorf("βœ— failed to read %s file at location: %w", filename, err) - } - out.Outf(o.Context, string(content)) - return nil - } - out.Outf(o.Context, "β–Ί applying to cluster...\n") - - objects, err := readObjects(path) - if err != nil { - return fmt.Errorf("βœ— failed to construct objects to apply: %w", err) - } - - if _, err := o.SM.ApplyAllStaged(context.Background(), objects, ssa.DefaultApplyOptions()); err != nil { - return fmt.Errorf("βœ— failed to apply manifests: %w", err) - } - - out.Outf(o.Context, "β–Ί waiting for ocm deployment to be ready\n") - if err = o.SM.Wait(objects, ssa.DefaultWaitOptions()); err != nil { - return fmt.Errorf("βœ— failed to wait for objects to be ready: %w", err) - } - - return nil -} - -// getLatestVersion calls the GitHub API and returns the latest released version. -func (o *Command) getLatestVersion(ctx context.Context, url string) (string, error) { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url+"/latest", nil) - if err != nil { - return "", err - } - - res, err := http.DefaultClient.Do(req) - if err != nil { - return "", fmt.Errorf("GitHub API call failed: %w", err) - } - - if res.Body != nil { - defer res.Body.Close() - } - - type meta struct { - Tag string `json:"tag_name"` - } - var m meta - if err := json.NewDecoder(res.Body).Decode(&m); err != nil { - return "", fmt.Errorf("decoding GitHub API response failed: %w", err) - } - - return m.Tag, err -} - -// existingVersion calls the GitHub API to confirm the given version does exist. -func (o *Command) existingVersion(ctx context.Context, url, version string) (bool, error) { - if !strings.HasPrefix(version, "v") { - version = "v" + version - } - - ghURL := fmt.Sprintf(url+"/tags/%s", version) - req, err := http.NewRequestWithContext(ctx, http.MethodGet, ghURL, nil) - if err != nil { - return false, fmt.Errorf("GitHub API call failed: %w", err) - } - - res, err := http.DefaultClient.Do(req) - if err != nil { - return false, err - } - - if res.Body != nil { - defer res.Body.Close() - } - - switch res.StatusCode { - case http.StatusOK: - return true, nil - case http.StatusNotFound: - return false, nil - default: - return false, fmt.Errorf("GitHub API returned an unexpected status code (%d)", res.StatusCode) - } -} - -func (o *Command) fetch(ctx context.Context, url, version, dir, filename string) error { - ghURL := fmt.Sprintf("%s/latest/download/%s", url, filename) - if strings.HasPrefix(version, "v") { - ghURL = fmt.Sprintf("%s/download/%s/%s", url, version, filename) - } - - req, err := http.NewRequest(http.MethodGet, ghURL, nil) - if err != nil { - return fmt.Errorf("failed to create HTTP request for %s, error: %w", ghURL, err) - } - - resp, err := http.DefaultClient.Do(req.WithContext(ctx)) - if err != nil { - return fmt.Errorf("failed to download manifests.tar.gz from %s, error: %w", ghURL, err) - } - defer resp.Body.Close() - - // check response - if resp.StatusCode != http.StatusOK { - return fmt.Errorf("failed to download %s from %s, status: %s", filename, ghURL, resp.Status) - } - - wf, err := os.OpenFile(filepath.Join(dir, filename), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o777) - if err != nil { - return fmt.Errorf("failed to open temp file: %w", err) - } - - if _, err := io.Copy(wf, resp.Body); err != nil { - return fmt.Errorf("failed to write to temp file: %w", err) - } - - return nil -} - // RunPreFlightCheck checks if the target cluster has the following items: // - secret containing certificates for the in-cluster registry // - flux installed. diff --git a/cmds/ocm/commands/controllercmds/install/install_cert_manager.go b/cmds/ocm/commands/controllercmds/install/install_cert_manager.go index e24766d770..50c87df916 100644 --- a/cmds/ocm/commands/controllercmds/install/install_cert_manager.go +++ b/cmds/ocm/commands/controllercmds/install/install_cert_manager.go @@ -8,6 +8,7 @@ import ( "github.com/fluxcd/pkg/ssa" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/common" "github.com/open-component-model/ocm/pkg/out" ) @@ -17,15 +18,7 @@ var issuer []byte func (o *Command) installPrerequisites(ctx context.Context) error { out.Outf(o.Context, "β–Ί installing cert-manager with version %s\n", o.CertManagerVersion) - version := o.CertManagerVersion - if err := o.installManifest( - ctx, - o.CertManagerReleaseAPIURL, - o.CertManagerBaseURL, - "cert-manager", - "cert-manager.yaml", - version, - ); err != nil { + if err := common.Install(ctx, o.Context, o.SM, o.CertManagerReleaseAPIURL, o.CertManagerBaseURL, "cert-manager", "cert-manager.yaml", o.CertManagerVersion, o.DryRun); err != nil { return err } @@ -51,7 +44,7 @@ func (o *Command) createRegistryCertificate() error { return fmt.Errorf("failed to write issuer.yaml file at location: %w", err) } - objects, err := readObjects(path) + objects, err := common.ReadObjects(path) if err != nil { return fmt.Errorf("failed to construct objects to apply: %w", err) } diff --git a/cmds/ocm/commands/controllercmds/install/resource_manager.go b/cmds/ocm/commands/controllercmds/install/resource_manager.go new file mode 100644 index 0000000000..ffd7cde1be --- /dev/null +++ b/cmds/ocm/commands/controllercmds/install/resource_manager.go @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package install + +import ( + "fmt" + + "github.com/fluxcd/cli-utils/pkg/kstatus/polling" + "github.com/fluxcd/pkg/ssa" + corev1 "k8s.io/api/core/v1" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + apiruntime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/cli-runtime/pkg/genericclioptions" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +// ownerRef contains the server-side apply field manager and ownership labels group. +var ownerRef = ssa.Owner{ + Field: "ocm", + Group: "ocm-controller.delivery.ocm.software", +} + +// NewResourceManager creates a ResourceManager for the given cluster. +func NewResourceManager(rcg genericclioptions.RESTClientGetter) (*ssa.ResourceManager, error) { + cfg, err := rcg.ToRESTConfig() + if err != nil { + return nil, fmt.Errorf("loading kubeconfig failed: %w", err) + } + // bump limits + cfg.QPS = 100.0 + cfg.Burst = 300 + + restMapper, err := rcg.ToRESTMapper() + if err != nil { + return nil, err + } + + kubeClient, err := client.New(cfg, client.Options{Mapper: restMapper, Scheme: newScheme()}) + if err != nil { + return nil, err + } + + kubePoller := polling.NewStatusPoller(kubeClient, restMapper, polling.Options{}) + + return ssa.NewResourceManager(kubeClient, kubePoller, ownerRef), nil +} + +func newScheme() *apiruntime.Scheme { + scheme := apiruntime.NewScheme() + _ = apiextensionsv1.AddToScheme(scheme) + _ = corev1.AddToScheme(scheme) + return scheme +} diff --git a/cmds/ocm/commands/controllercmds/uninstall/cmd.go b/cmds/ocm/commands/controllercmds/uninstall/cmd.go new file mode 100644 index 0000000000..e8ff182a46 --- /dev/null +++ b/cmds/ocm/commands/controllercmds/uninstall/cmd.go @@ -0,0 +1,115 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package uninstall + +import ( + "context" + "fmt" + "time" + + "github.com/fluxcd/pkg/ssa" + "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/common" + "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/names" + "github.com/open-component-model/ocm/cmds/ocm/commands/verbs" + "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" + "github.com/open-component-model/ocm/pkg/contexts/clictx" + "github.com/open-component-model/ocm/pkg/out" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "k8s.io/cli-runtime/pkg/genericclioptions" +) + +var ( + Names = names.Controller + Verb = verbs.Uninstall +) + +type Command struct { + utils.BaseCommand + Namespace string + ControllerName string + Timeout time.Duration + Version string + BaseURL string + ReleaseAPIURL string + CertManagerBaseURL string + CertManagerReleaseAPIURL string + CertManagerVersion string + SM *ssa.ResourceManager + UninstallPrerequisites bool + DryRun bool +} + +var _ utils.OCMCommand = (*Command)(nil) + +// NewCommand creates a new controller command. +func NewCommand(ctx clictx.Context, names ...string) *cobra.Command { + return utils.SetupCommand(&Command{BaseCommand: utils.NewBaseCommand(ctx)}, utils.Names(Names, names...)...) +} + +func (o *Command) ForName(name string) *cobra.Command { + return &cobra.Command{ + Use: "uninstall controller", + Short: "Uninstalls the ocm-controller and all of its dependencies", + } +} + +// AddFlags for the known item to delete. +func (o *Command) AddFlags(set *pflag.FlagSet) { + set.StringVarP(&o.Version, "version", "v", "latest", "the version of the controller to install") + set.StringVarP(&o.BaseURL, "base-url", "u", "https://github.com/open-component-model/ocm-controller/releases", "the base url to the ocm-controller's release page") + set.StringVarP(&o.ReleaseAPIURL, "release-api-url", "a", "https://api.github.com/repos/open-component-model/ocm-controller/releases", "the base url to the ocm-controller's API release page") + set.StringVar(&o.CertManagerBaseURL, "cert-manager-base-url", "https://github.com/cert-manager/cert-manager/releases", "the base url to the cert-manager's release page") + set.StringVar(&o.CertManagerReleaseAPIURL, "cert-manager-release-api-url", "https://api.github.com/repos/cert-manager/cert-manager/releases", "the base url to the cert-manager's API release page") + set.StringVar(&o.CertManagerVersion, "cert-manager-version", "v1.13.2", "version for cert-manager") + set.StringVarP(&o.ControllerName, "controller-name", "c", "ocm-controller", "name of the controller that's used for status check") + set.StringVarP(&o.Namespace, "namespace", "n", "ocm-system", "the namespace into which the controller is installed") + set.DurationVarP(&o.Timeout, "timeout", "t", 1*time.Minute, "maximum time to wait for deployment to be ready") + set.BoolVarP(&o.UninstallPrerequisites, "uninstall-prerequisites", "p", false, "uninstall prerequisites required by ocm-controller") + set.BoolVarP(&o.DryRun, "dry-run", "d", false, "if enabled, prints the downloaded manifest file") +} + +func (o *Command) Complete(args []string) error { + return nil +} + +func (o *Command) Run() error { + kubeconfigArgs := genericclioptions.NewConfigFlags(false) + sm, err := NewResourceManager(kubeconfigArgs) + if err != nil { + return fmt.Errorf("βœ— failed to create resource manager: %w", err) + } + + o.SM = sm + ctx := context.Background() + + out.Outf(o.Context, "β–Ί uninstalling ocm-controller with version %s\n", o.Version) + if err := common.Uninstall( + ctx, + o.Context, + sm, + o.ReleaseAPIURL, + o.BaseURL, + "ocm-controller", + "install.yaml", + o.Version, + o.DryRun, + ); err != nil { + return err + } + + out.Outf(o.Context, "βœ” ocm-controller successfully uninstalled\n") + + if o.UninstallPrerequisites { + out.Outf(o.Context, "β–Ί uninstalling cert-manager and issuers\n") + if err := o.uninstallPrerequisites(ctx); err != nil { + return fmt.Errorf("βœ— failed to uninstall pre-requesits: %w\n", err) + } + + out.Outf(o.Context, "βœ” successfully uninstalled prerequisites\n") + } + + return nil +} diff --git a/cmds/ocm/commands/controllercmds/uninstall/cmd_test.go b/cmds/ocm/commands/controllercmds/uninstall/cmd_test.go new file mode 100644 index 0000000000..b123b5bda3 --- /dev/null +++ b/cmds/ocm/commands/controllercmds/uninstall/cmd_test.go @@ -0,0 +1,74 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package uninstall_test + +import ( + "bytes" + "fmt" + "net/http" + "net/http/httptest" + "os" + "strings" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/cmds/ocm/testhelper" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/mandelsoft/filepath/pkg/filepath" +) + +var _ = Describe("Test Environment", func() { + var ( + env *TestEnv + testServer *httptest.Server + ) + + BeforeEach(func() { + env = NewTestEnv() + testServer = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if strings.Contains(r.URL.String(), "download") { + content, err := os.ReadFile(filepath.Join("testdata", "install.yaml")) + if err != nil { + fmt.Fprintf(w, "failed") + return + } + + fmt.Fprintf(w, string(content)) + return + } + + fmt.Fprintf(w, `{ + "tag_name": "v0.0.1-test" +} +`) + })) + }) + + AfterEach(func() { + env.Cleanup() + }) + + It("uninstall latest version", func() { + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("controller", "uninstall", "-d", "-u", testServer.URL, "-a", testServer.URL)).To(Succeed()) + Expect(buf.String()).To(StringEqualTrimmedWithContext(`β–Ί uninstalling ocm-controller with version latest +β–Ί got latest version "v0.0.1-test" +βœ” successfully fetched install file +test: content +βœ” ocm-controller successfully uninstalled +`)) + }) + + It("uninstall specific version", func() { + buf := bytes.NewBuffer(nil) + Expect(env.CatchOutput(buf).Execute("controller", "uninstall", "-d", "-u", testServer.URL, "-a", testServer.URL, "-v", "v0.1.0-test-2")).To(Succeed()) + Expect(buf.String()).To(StringEqualTrimmedWithContext(`β–Ί uninstalling ocm-controller with version v0.1.0-test-2 +βœ” successfully fetched install file +test: content +βœ” ocm-controller successfully uninstalled +`)) + }) +}) diff --git a/cmds/ocm/commands/controllercmds/uninstall/issuer/registry_certificate.yaml b/cmds/ocm/commands/controllercmds/uninstall/issuer/registry_certificate.yaml new file mode 100644 index 0000000000..a19e12f5b5 --- /dev/null +++ b/cmds/ocm/commands/controllercmds/uninstall/issuer/registry_certificate.yaml @@ -0,0 +1,29 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: ocm-system +--- +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: ocm-issuer +spec: + selfSigned: {} +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: ocm-registry-certificate + namespace: ocm-system +spec: + isCA: true + secretName: ocm-registry-tls-certs + dnsNames: + - registry.ocm-system.svc.cluster.local + privateKey: + algorithm: ECDSA + size: 256 + issuerRef: + name: ocm-issuer + kind: ClusterIssuer + group: cert-manager.io diff --git a/cmds/ocm/commands/controllercmds/uninstall/resource_manager.go b/cmds/ocm/commands/controllercmds/uninstall/resource_manager.go new file mode 100644 index 0000000000..0c1dba937a --- /dev/null +++ b/cmds/ocm/commands/controllercmds/uninstall/resource_manager.go @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package uninstall + +import ( + "fmt" + + "github.com/fluxcd/cli-utils/pkg/kstatus/polling" + "github.com/fluxcd/pkg/ssa" + corev1 "k8s.io/api/core/v1" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + apiruntime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/cli-runtime/pkg/genericclioptions" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +// ownerRef contains the server-side apply field manager and ownership labels group. +var ownerRef = ssa.Owner{ + Field: "ocm", + Group: "ocm-controller.delivery.ocm.software", +} + +// NewResourceManager creates a ResourceManager for the given cluster. +func NewResourceManager(rcg genericclioptions.RESTClientGetter) (*ssa.ResourceManager, error) { + cfg, err := rcg.ToRESTConfig() + if err != nil { + return nil, fmt.Errorf("loading kubeconfig failed: %w", err) + } + // bump limits + cfg.QPS = 100.0 + cfg.Burst = 300 + + restMapper, err := rcg.ToRESTMapper() + if err != nil { + return nil, err + } + + kubeClient, err := client.New(cfg, client.Options{Mapper: restMapper, Scheme: newScheme()}) + if err != nil { + return nil, err + } + + kubePoller := polling.NewStatusPoller(kubeClient, restMapper, polling.Options{}) + + return ssa.NewResourceManager(kubeClient, kubePoller, ownerRef), nil +} + +func newScheme() *apiruntime.Scheme { + scheme := apiruntime.NewScheme() + _ = apiextensionsv1.AddToScheme(scheme) + _ = corev1.AddToScheme(scheme) + return scheme +} diff --git a/cmds/ocm/commands/controllercmds/uninstall/suite_test.go b/cmds/ocm/commands/controllercmds/uninstall/suite_test.go new file mode 100644 index 0000000000..0c28f00a4f --- /dev/null +++ b/cmds/ocm/commands/controllercmds/uninstall/suite_test.go @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package uninstall_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Uninstall controller") +} diff --git a/cmds/ocm/commands/controllercmds/uninstall/testdata/install.yaml b/cmds/ocm/commands/controllercmds/uninstall/testdata/install.yaml new file mode 100644 index 0000000000..3571bf35c7 --- /dev/null +++ b/cmds/ocm/commands/controllercmds/uninstall/testdata/install.yaml @@ -0,0 +1 @@ +test: content diff --git a/cmds/ocm/commands/controllercmds/uninstall/uninstall_cert_manager.go b/cmds/ocm/commands/controllercmds/uninstall/uninstall_cert_manager.go new file mode 100644 index 0000000000..944c881eb0 --- /dev/null +++ b/cmds/ocm/commands/controllercmds/uninstall/uninstall_cert_manager.go @@ -0,0 +1,68 @@ +package uninstall + +import ( + "context" + _ "embed" + "fmt" + "os" + + "github.com/fluxcd/pkg/ssa" + "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/common" + "github.com/open-component-model/ocm/pkg/out" +) + +//go:embed issuer/registry_certificate.yaml +var issuer []byte + +func (o *Command) uninstallPrerequisites(ctx context.Context) error { + out.Outf(o.Context, "β–Ί uninstalling cert-manager with version %s\n", o.CertManagerVersion) + + if err := o.removeRegistryCertificate(); err != nil { + return fmt.Errorf("βœ— failed to create registry certificate: %w", err) + } + + version := o.CertManagerVersion + if err := common.Uninstall( + ctx, + o.Context, + o.SM, + o.CertManagerReleaseAPIURL, + o.CertManagerBaseURL, + "cert-manager", + "cert-manager.yaml", + version, + o.DryRun, + ); err != nil { + return err + } + + out.Outf(o.Context, "βœ” cert-manager successfully uninstalled\n") + + return nil +} + +func (o *Command) removeRegistryCertificate() error { + out.Outf(o.Context, "β–Ί remove certificate for internal registry\n") + temp, err := os.MkdirTemp("", "issuer") + if err != nil { + return fmt.Errorf("failed to create temp folder: %w", err) + } + defer os.RemoveAll(temp) + + path := filepath.Join(temp, "issuer.yaml") + if err := os.WriteFile(path, issuer, 0o600); err != nil { + return fmt.Errorf("failed to write issuer.yaml file at location: %w", err) + } + + objects, err := common.ReadObjects(path) + if err != nil { + return fmt.Errorf("failed to construct objects to apply: %w", err) + } + + if _, err := o.SM.DeleteAll(context.Background(), objects, ssa.DefaultDeleteOptions()); err != nil { + return fmt.Errorf("failed to delete manifests: %w", err) + } + + return nil +} diff --git a/cmds/ocm/commands/verbs/controller/cmd.go b/cmds/ocm/commands/verbs/controller/cmd.go index f93b0d7f95..3575fb9988 100644 --- a/cmds/ocm/commands/verbs/controller/cmd.go +++ b/cmds/ocm/commands/verbs/controller/cmd.go @@ -5,6 +5,7 @@ package controller import ( + "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/uninstall" "github.com/spf13/cobra" "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/install" @@ -19,5 +20,6 @@ func NewCommand(ctx clictx.Context) *cobra.Command { Short: "Commands acting on the ocm-controller", }, names.Controller...) cmd.AddCommand(install.NewCommand(ctx, install.Verb)) + cmd.AddCommand(uninstall.NewCommand(ctx, uninstall.Verb)) return cmd } diff --git a/cmds/ocm/commands/verbs/verbs.go b/cmds/ocm/commands/verbs/verbs.go index 636e929676..489ae83c91 100644 --- a/cmds/ocm/commands/verbs/verbs.go +++ b/cmds/ocm/commands/verbs/verbs.go @@ -20,5 +20,6 @@ const ( Verify = "verify" Clean = "clean" Install = "install" + Uninstall = "uninstall" Execute = "execute" ) From 7f589f71c73ac456edd1d2885ebccdd11ddf7bd6 Mon Sep 17 00:00:00 2001 From: Gergely Brautigam <182850+Skarlso@users.noreply.github.com> Date: Wed, 8 May 2024 14:47:53 +0200 Subject: [PATCH 58/83] fix: stop ignoring most of the errors (#745) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Fixes https://github.com/open-component-model/ocm-project/issues/40 ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [x] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Hilmar Falkenberg --- cmds/demoplugin/accessmethods/demo.go | 6 ++- cmds/demoplugin/uploaders/demo.go | 6 ++- cmds/ocm/commands/misccmds/rsakeypair/cmd.go | 15 +++++-- .../common/handlers/artifacthdlr/attached.go | 21 +++++++-- .../common/handlers/artifacthdlr/clean.go | 14 +++++- .../common/handlers/artifacthdlr/closure.go | 15 ++++++- .../handlers/artifacthdlr/typehandler.go | 45 +++++++++++++++---- cmds/ocm/commands/ocmcmds/common/addconfig.go | 18 +++++--- .../common/handlers/comphdlr/typehandler.go | 16 ++++--- .../common/handlers/vershdlr/typehandler.go | 16 ++++--- .../common/options/fileoption/option.go | 1 + .../ocmcmds/plugins/describe/describe.go | 7 ++- .../commands/toicmds/package/bootstrap/cmd.go | 7 ++- cmds/ocm/topics/common/attributes/topic.go | 6 ++- pkg/contexts/oci/artdesc/artifact.go | 8 +++- pkg/contexts/ocm/accessmethods/npm/method.go | 5 ++- pkg/contexts/ocm/attrs/ociuploadattr/attr.go | 5 ++- pkg/contexts/ocm/attrs/plugindirattr/attr.go | 6 ++- pkg/contexts/ocm/plugin/cache/plugindir.go | 7 ++- pkg/contexts/ocm/plugin/cache/updater.go | 5 ++- .../repositories/comparch/componentarchive.go | 5 ++- .../ocm/repositories/comparch/repository.go | 5 ++- .../genericocireg/componentversion.go | 14 +++--- pkg/mimeutils/type.go | 6 +-- pkg/toi/support/support.go | 10 ++++- 25 files changed, 209 insertions(+), 60 deletions(-) diff --git a/cmds/demoplugin/accessmethods/demo.go b/cmds/demoplugin/accessmethods/demo.go index 5b22521bc6..df91686592 100644 --- a/cmds/demoplugin/accessmethods/demo.go +++ b/cmds/demoplugin/accessmethods/demo.go @@ -104,7 +104,11 @@ func (a *AccessMethod) ComposeAccessSpecification(p ppi.Plugin, opts ppi.Config, func (a *AccessMethod) Reader(p ppi.Plugin, spec ppi.AccessSpec, creds credentials.Credentials) (io.ReadCloser, error) { my := spec.(*AccessSpec) - cfg, _ := p.GetConfig() + cfg, err := p.GetConfig() + if err != nil { + return nil, errors.Wrapf(err, "can't get config for access method %s", my.MediaType) + } + root := os.TempDir() if cfg != nil && cfg.(*config.Config).AccessMethods.Path != "" { root = cfg.(*config.Config).Uploaders.Path diff --git a/cmds/demoplugin/uploaders/demo.go b/cmds/demoplugin/uploaders/demo.go index b3697c9b6c..eae170eece 100644 --- a/cmds/demoplugin/uploaders/demo.go +++ b/cmds/demoplugin/uploaders/demo.go @@ -80,7 +80,11 @@ func (a *Uploader) Writer(p ppi.Plugin, arttype, mediatype, hint string, repo pp var file *os.File var err error - cfg, _ := p.GetConfig() + cfg, err := p.GetConfig() + if err != nil { + return nil, nil, errors.Wrapf(err, "can't get config for access method %s", mediatype) + } + root := os.TempDir() if cfg != nil && cfg.(*config.Config).Uploaders.Path != "" { root = cfg.(*config.Config).Uploaders.Path diff --git a/cmds/ocm/commands/misccmds/rsakeypair/cmd.go b/cmds/ocm/commands/misccmds/rsakeypair/cmd.go index b23367b63f..c7b2f541f9 100644 --- a/cmds/ocm/commands/misccmds/rsakeypair/cmd.go +++ b/cmds/ocm/commands/misccmds/rsakeypair/cmd.go @@ -140,7 +140,10 @@ func (o *Command) Complete(args []string) error { if o.rootcerts != "" { pool, err := signutils.GetCertPool(o.rootcerts, false) if err != nil { - path, _ := utils2.ResolvePath(o.rootcerts) + path, err := utils2.ResolvePath(o.rootcerts) + if err != nil { + return errors.Wrapf(err, "failed to resolve root certificates") + } data, err := vfs.ReadFile(o.Context.FileSystem(), path) if err != nil { return errors.Wrapf(err, "cannot read root cert file %q", o.rootcerts) @@ -190,7 +193,10 @@ func (o *Command) Complete(args []string) error { raw := []byte(o.cacert) cert, pool, err := signutils.GetCertificate(o.cacert, false) if err != nil { - path, _ := utils2.ResolvePath(o.cacert) + path, err := utils2.ResolvePath(o.cacert) + if err != nil { + return errors.Wrapf(err, "failed to resolve cacert file %q", o.cacert) + } data, err := vfs.ReadFile(o.Context.FileSystem(), path) if err != nil { return errors.Wrapf(err, "cannot read ca cert file %q", o.cacert) @@ -222,7 +228,10 @@ func (o *Command) Complete(args []string) error { if o.cakey != "" { key, err := parse.ParsePrivateKey(o.cakey) if err != nil { - path, _ := utils2.ResolvePath(o.cakey) + path, err := utils2.ResolvePath(o.cakey) + if err != nil { + return errors.Wrapf(err, "failed to resolve ca key file %q", o.cakey) + } data, err := vfs.ReadFile(o.Context.FileSystem(), path) if err != nil { return errors.Wrapf(err, "cannot read private key file %q", o.cakey) diff --git a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/attached.go b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/attached.go index 534c2e48e7..b1ec977243 100644 --- a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/attached.go +++ b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/attached.go @@ -7,6 +7,7 @@ package artifacthdlr import ( "strings" + "github.com/mandelsoft/logging" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/cmds/ocm/pkg/output" @@ -22,9 +23,17 @@ func Attachment(d digest.Digest, suffix string) string { var ExplodeAttached = processing.Explode(explodeAttached) func explodeAttached(o interface{}) []interface{} { - obj := o.(*Object) + obj, ok := o.(*Object) + if !ok { + return nil + } result := []interface{}{o} - blob, _ := obj.Artifact.Blob() + blob, err := obj.Artifact.Blob() + if err != nil { + logging.DefaultContext().Logger().LogError(err, "failed to fetch blob from artifact") + + return nil + } dig := blob.Digest() prefix := Attachment(dig, "") list, err := obj.Namespace.ListTags() @@ -38,9 +47,15 @@ func explodeAttached(o interface{}) []interface{} { s := obj.Spec s.Tag = &t s.Digest = nil + key, err := Key(a) + if err != nil { + // this list ignores errors as this segment only happens when err == nil. + continue + } + att := &Object{ History: hist, - Key: Key(a), + Key: key, Spec: s, AttachKind: l[len(prefix):], Namespace: obj.Namespace, diff --git a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/clean.go b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/clean.go index 79f81173c2..6531fbd9dd 100644 --- a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/clean.go +++ b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/clean.go @@ -31,7 +31,12 @@ func clean(iterable data.Iterable) data.Iterable { e := it.Next().(*Object) data.Add(e) l := len(e.History) - blob, _ := e.Artifact.Blob() + blob, err := e.Artifact.Blob() + if err != nil { + // ignore if we don't have the artifact and get the next element + + continue + } if l > depth[blob.Digest()] { depth[blob.Digest()] = l @@ -43,7 +48,12 @@ func clean(iterable data.Iterable) data.Iterable { output.Print(data, "clean in") for i := 0; i < len(data); i++ { - e := data[i].(*Object) + e, ok := data[i].(*Object) + if !ok { + // ignore if we don't have an object and continue cleaning the rest + + continue + } l := len(e.History) blob, _ := e.Artifact.Blob() dig := blob.Digest() diff --git a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/closure.go b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/closure.go index 3a800dda85..5ac9b94686 100644 --- a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/closure.go +++ b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/closure.go @@ -18,9 +18,16 @@ func ClosureExplode(opts *output.Options, e interface{}) []interface{} { } func traverse(hist common.History, o *Object, octx out.Context) []output.Object { - blob, _ := o.Artifact.Blob() + blob, err := o.Artifact.Blob() + if err != nil { + out.Errf(octx, "unable to get artifact blob: %s", err) + + return nil + } key := common.NewNameVersion("", blob.Digest().String()) if err := hist.Add(oci.KIND_OCIARTIFACT, key); err != nil { + out.Errf(octx, "unable to add artifact to history: %s", err) + return nil } result := []output.Object{o} @@ -38,9 +45,13 @@ func traverse(hist common.History, o *Object, octx out.Context) []output.Object if err != nil { out.Errf(octx, "Warning: lookup nested artifact %q [%s]: %s\n", ref.Digest, hist, err) } + version, err := Key(nested) + if err != nil { + out.Errf(octx, "Failed to find nested key %q [%s]: %s\n", ref.Digest, hist, err) + } obj := &Object{ History: hist.Copy(), - Key: Key(nested), + Key: version, Spec: oci.RefSpec{ UniformRepositorySpec: o.Spec.UniformRepositorySpec, ArtSpec: oci.ArtSpec{ diff --git a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/typehandler.go b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/typehandler.go index 901269471c..515159f36a 100644 --- a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/typehandler.go +++ b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/typehandler.go @@ -8,6 +8,7 @@ import ( "fmt" "os" + "github.com/mandelsoft/logging" "github.com/open-component-model/ocm/cmds/ocm/pkg/output" "github.com/open-component-model/ocm/cmds/ocm/pkg/tree" "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" @@ -52,7 +53,13 @@ func (o *Object) GetKind() string { } func (o *Object) IsNode() *common.NameVersion { - blob, _ := o.Artifact.Blob() + blob, err := o.Artifact.Blob() + if err != nil { + logging.DefaultContext().Logger().LogError(err, "failed to fetch blob from artifact") + + return nil + } + nv := common.NewNameVersion("", blob.Digest().String()) return &nv } @@ -73,7 +80,11 @@ func (o *Object) AsManifest() interface{} { } func (o *Object) String() string { - blob, _ := o.Artifact.Blob() + blob, err := o.Artifact.Blob() + if err != nil { + return "" + } + dig := blob.Digest() tag := "-" if o.Spec.Tag != nil { @@ -90,9 +101,13 @@ type Manifest struct { //////////////////////////////////////////////////////////////////////////////// -func Key(a oci.ArtifactAccess) common.NameVersion { - blob, _ := a.Blob() - return common.NewNameVersion("", blob.Digest().String()) +func Key(a oci.ArtifactAccess) (common.NameVersion, error) { + blob, err := a.Blob() + if err != nil { + return common.NameVersion{}, fmt.Errorf("unable to determine blob name: %w", err) + } + + return common.NewNameVersion("", blob.Digest().String()), nil } type TypeHandler struct { @@ -165,8 +180,13 @@ func (h *TypeHandler) get(repo oci.Repository, elemspec utils.ElemSpec) ([]outpu spec = evaluated.Ref namespace = evaluated.Namespace if evaluated.Artifact != nil { + key, err := Key(evaluated.Artifact) + if err != nil { + return nil, fmt.Errorf("unable to determine key for artifact %q: %w", name, err) + } + obj := &Object{ - Key: Key(evaluated.Artifact), + Key: key, Spec: spec, Namespace: namespace, Artifact: evaluated.Artifact, @@ -198,8 +218,12 @@ func (h *TypeHandler) get(repo oci.Repository, elemspec utils.ElemSpec) ([]outpu return nil, err } h.session.AddCloser(a) + key, err := Key(a) + if err != nil { + return nil, fmt.Errorf("unable to determine key for artifact %q: %w", name, err) + } obj := &Object{ - Key: Key(a), + Key: key, Spec: spec, Namespace: namespace, Artifact: a, @@ -219,8 +243,13 @@ func (h *TypeHandler) get(repo oci.Repository, elemspec utils.ElemSpec) ([]outpu t := tag s := spec s.Tag = &t + key, err := Key(a) + if err != nil { + return nil, fmt.Errorf("unable to determine key for artifact %q: %w", name, err) + } + result = append(result, &Object{ - Key: Key(a), + Key: key, Spec: s, Namespace: namespace, Artifact: a, diff --git a/cmds/ocm/commands/ocmcmds/common/addconfig.go b/cmds/ocm/commands/ocmcmds/common/addconfig.go index 8116125ad3..5be1a34f3c 100644 --- a/cmds/ocm/commands/ocmcmds/common/addconfig.go +++ b/cmds/ocm/commands/ocmcmds/common/addconfig.go @@ -111,23 +111,27 @@ func (o *ResourceConfigAdderCommand) ProcessResourceDescriptions(h ResourceSpecH listkey := utils.Plural(h.Key(), 0) var current string - configFile, _ := utils2.ResolvePath(o.ConfigFile) - if ok, err := vfs.FileExists(fs, configFile); ok { + configFile, err := utils2.ResolvePath(o.ConfigFile) + if err != nil { + return errors.Wrapf(err, "failed to resolve config file %s", o.ConfigFile) + } + + ok, err := vfs.FileExists(fs, configFile) + if err != nil { + return errors.Wrapf(err, "cannot read %s config file %q", listkey, o.ConfigFile) + } + + if ok { fi, err := fs.Stat(configFile) if err != nil { return errors.Wrapf(err, "cannot stat %s config file %q", listkey, o.ConfigFile) } mode = fi.Mode().Perm() - if err != nil { - return err - } data, err := vfs.ReadFile(fs, configFile) if err != nil { return errors.Wrapf(err, "cannot read %s config file %q", listkey, o.ConfigFile) } current = string(data) - } else if err != nil { - return errors.Wrapf(err, "cannot read %s config file %q", listkey, o.ConfigFile) } for _, source := range o.Resources { diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go index 1c03831787..9dcceb4839 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go @@ -133,11 +133,14 @@ func (h *TypeHandler) Get(elemspec utils.ElemSpec) ([]output.Object, error) { return h.get(h.repobase, elemspec) } -func (h *TypeHandler) filterVersions(vers []string) []string { +func (h *TypeHandler) filterVersions(vers []string) ([]string, error) { if len(h.constraints) == 0 && !h.latest { - return vers + return vers, nil + } + versions, err := semverutils.MatchVersionStrings(vers, h.constraints...) + if err != nil { + return nil, fmt.Errorf("invalid constraints: %v", err) } - versions, _ := semverutils.MatchVersionStrings(vers, h.constraints...) if h.latest && len(versions) > 1 { versions = versions[len(versions)-1:] } @@ -145,7 +148,7 @@ func (h *TypeHandler) filterVersions(vers []string) []string { for _, v := range versions { vers = append(vers, v.Original()) } - return vers + return vers, nil } func (h *TypeHandler) get(repo ocm.Repository, elemspec utils.ElemSpec) ([]output.Object, error) { @@ -230,7 +233,10 @@ func (h *TypeHandler) get(repo ocm.Repository, elemspec utils.ElemSpec) ([]outpu if err != nil { return nil, err } - versions = h.filterVersions(versions) + versions, err = h.filterVersions(versions) + if err != nil { + return nil, err + } for _, vers := range versions { v, err := h.session.GetComponentVersion(component, vers) diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go index c814c27424..bc271b09e4 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go @@ -113,11 +113,14 @@ func (h *TypeHandler) Get(elemspec utils.ElemSpec) ([]output.Object, error) { return h.get(h.repobase, elemspec) } -func (h *TypeHandler) filterVersions(vers []string) []string { +func (h *TypeHandler) filterVersions(vers []string) ([]string, error) { if len(h.constraints) == 0 && !h.latest { - return vers + return vers, nil + } + versions, err := semverutils.MatchVersionStrings(vers, h.constraints...) + if err != nil { + return nil, err } - versions, _ := semverutils.MatchVersionStrings(vers, h.constraints...) if h.latest && len(versions) > 1 { versions = versions[len(versions)-1:] } @@ -125,7 +128,7 @@ func (h *TypeHandler) filterVersions(vers []string) []string { for _, v := range versions { vers = append(vers, v.Original()) } - return vers + return vers, nil } func (h *TypeHandler) get(repo ocm.Repository, elemspec utils.ElemSpec) ([]output.Object, error) { @@ -217,7 +220,10 @@ func (h *TypeHandler) get(repo ocm.Repository, elemspec utils.ElemSpec) ([]outpu if err != nil { return nil, err } - versions = h.filterVersions(versions) + versions, err = h.filterVersions(versions) + if err != nil { + return nil, err + } for _, vers := range versions { t := vers diff --git a/cmds/ocm/commands/ocmcmds/common/options/fileoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/fileoption/option.go index fc2d817fc7..896ec3f513 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/fileoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/fileoption/option.go @@ -62,6 +62,7 @@ func (o *Option) GetPath(args []string, fss ...vfs.FileSystem) (string, []string if ok, err := vfs.Exists(fs, args[0]); !ok || err != nil { return o.Path, args } + // ignored: I can't rewrite this whole segment. if ok, _ := vfs.IsDir(fs, args[0]); ok { return args[0], args[1:] } diff --git a/cmds/ocm/commands/ocmcmds/plugins/describe/describe.go b/cmds/ocm/commands/ocmcmds/plugins/describe/describe.go index b43f55cfe9..322b2094c3 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/describe/describe.go +++ b/cmds/ocm/commands/ocmcmds/plugins/describe/describe.go @@ -30,7 +30,12 @@ func DescribePlugin(p plugin.Plugin, out common.Printer) { out.Printf(" Version: %s\n", src.Version) out.Printf(" Resource: %s\n", src.Resource) u := src.Repository.AsUniformSpec(p.Context()) - data, _ := json.Marshal(src.Repository) + data, err := json.Marshal(src.Repository) + if err != nil { + out.Printf("Status: %s\n", err) + + return + } out.Printf(" Repository: %s\n", u.String()) out.Printf(" Specification: %s\n", string(data)) } else { diff --git a/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go b/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go index 6af818daf6..3f5c83c0d0 100644 --- a/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go +++ b/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go @@ -189,7 +189,12 @@ func (o *Command) Complete(args []string) error { return errors.Wrapf(err, "bootstrap resource identity pattern") } if len(o.CredentialsFile) == 0 { - if ok, _ := vfs.FileExists(o.FileSystem(), DEFAULT_CREDENTIALS_FILE); ok { + ok, err := vfs.FileExists(o.FileSystem(), DEFAULT_CREDENTIALS_FILE) + if err != nil { + return err + } + + if ok { o.CredentialsFile = DEFAULT_CREDENTIALS_FILE } } diff --git a/cmds/ocm/topics/common/attributes/topic.go b/cmds/ocm/topics/common/attributes/topic.go index b6974506eb..0e71b2dd2d 100644 --- a/cmds/ocm/topics/common/attributes/topic.go +++ b/cmds/ocm/topics/common/attributes/topic.go @@ -34,7 +34,11 @@ func Attributes() string { s := "" sep := "" for _, a := range datacontext.DefaultAttributeScheme.KnownTypeNames() { - t, _ := datacontext.DefaultAttributeScheme.GetType(a) + t, err := datacontext.DefaultAttributeScheme.GetType(a) + if err != nil { + continue + } + desc := t.Description() if !strings.Contains(desc, "not via command line") { for strings.HasPrefix(desc, "\n") { diff --git a/pkg/contexts/oci/artdesc/artifact.go b/pkg/contexts/oci/artdesc/artifact.go index b9151d0e92..dda23c3325 100644 --- a/pkg/contexts/oci/artdesc/artifact.go +++ b/pkg/contexts/oci/artdesc/artifact.go @@ -6,6 +6,7 @@ package artdesc import ( "encoding/json" + out "fmt" "github.com/containerd/containerd/images" "github.com/opencontainers/go-digest" @@ -235,7 +236,12 @@ func (d *Artifact) ToBlobAccess() (blobaccess.BlobAccess, error) { func (d *Artifact) GetBlobDescriptor(digest digest.Digest) *Descriptor { if d.IsManifest() { - m, _ := d.Manifest() + m, err := d.Manifest() + if err != nil { + out.Printf("manifest was empty for artifact digest %s", digest) + + return nil + } return m.GetBlobDescriptor(digest) } if d.IsIndex() { diff --git a/pkg/contexts/ocm/accessmethods/npm/method.go b/pkg/contexts/ocm/accessmethods/npm/method.go index 07784f25e9..7a940eade1 100644 --- a/pkg/contexts/ocm/accessmethods/npm/method.go +++ b/pkg/contexts/ocm/accessmethods/npm/method.go @@ -86,7 +86,10 @@ func (a *AccessSpec) AccessMethod(c accspeccpi.ComponentVersionAccess) (accspecc } func (a *AccessSpec) GetInexpensiveContentVersionIdentity(access accspeccpi.ComponentVersionAccess) string { - meta, _ := a.getPackageMeta(access.GetContext()) + meta, err := a.getPackageMeta(access.GetContext()) + if err != nil { + return "" + } if meta != nil { return meta.Dist.Shasum } diff --git a/pkg/contexts/ocm/attrs/ociuploadattr/attr.go b/pkg/contexts/ocm/attrs/ociuploadattr/attr.go index e6523f1f9c..1d93d6e850 100644 --- a/pkg/contexts/ocm/attrs/ociuploadattr/attr.go +++ b/pkg/contexts/ocm/attrs/ociuploadattr/attr.go @@ -127,7 +127,10 @@ func (a *Attribute) GetInfo(ctx cpi.Context) (oci.Repository, *oci.UniformReposi } func (a *Attribute) getBySpec(ctx cpi.Context) (oci.Repository, *oci.UniformRepositorySpec, string, error) { - data, _ := a.Repository.MarshalJSON() + data, err := a.Repository.MarshalJSON() + if err != nil { + return nil, nil, "", errors.Wrap(err, a.ref.String()) + } spec, err := a.Repository.Evaluate(ctx.OCIContext()) if err != nil { diff --git a/pkg/contexts/ocm/attrs/plugindirattr/attr.go b/pkg/contexts/ocm/attrs/plugindirattr/attr.go index d33a758993..1b2615fa89 100644 --- a/pkg/contexts/ocm/attrs/plugindirattr/attr.go +++ b/pkg/contexts/ocm/attrs/plugindirattr/attr.go @@ -26,7 +26,11 @@ func init() { } func DefaultDir(fs vfs.FileSystem) string { - home, _ := os.UserHomeDir() + home, err := os.UserHomeDir() + if err != nil { + return "" + } + if home != "" { dir := filepath.Join(home, DEFAULT_PLUGIN_DIR) if ok, err := vfs.DirExists(fs, dir); ok && err == nil { diff --git a/pkg/contexts/ocm/plugin/cache/plugindir.go b/pkg/contexts/ocm/plugin/cache/plugindir.go index e3d341b47d..ec74289e1b 100644 --- a/pkg/contexts/ocm/plugin/cache/plugindir.go +++ b/pkg/contexts/ocm/plugin/cache/plugindir.go @@ -58,7 +58,12 @@ func (c *pluginDirImpl) Get(name string) Plugin { func (c *pluginDirImpl) add(name string, desc *descriptor.Descriptor, path string, errmsg string, list *errors.ErrorList) { c.plugins[name] = NewPlugin(name, path, desc, errmsg) if path != "" { - src, _ := ReadPluginSource(filepath.Dir(path), filepath.Base(path)) + src, err := ReadPluginSource(filepath.Dir(path), filepath.Base(path)) + if err != nil && list != nil { + list.Add(fmt.Errorf("%s: %s", name, err.Error())) + return + } + c.plugins[name].source = src } if errmsg != "" && list != nil { diff --git a/pkg/contexts/ocm/plugin/cache/updater.go b/pkg/contexts/ocm/plugin/cache/updater.go index 198970187a..e196517d30 100644 --- a/pkg/contexts/ocm/plugin/cache/updater.go +++ b/pkg/contexts/ocm/plugin/cache/updater.go @@ -161,7 +161,10 @@ func (o *PluginUpdater) downloadLatest(session ocm.Session, comp ocm.ComponentAc return errors.Wrapf(err, "no versions found for component %s", comp.GetName()) } - versions, _ := semverutils.MatchVersionStrings(vers, o.Constraints...) + versions, err := semverutils.MatchVersionStrings(vers, o.Constraints...) + if err != nil { + return fmt.Errorf("failed to match version strings for component %s: %w", comp.GetName(), err) + } if len(versions) == 0 { return fmt.Errorf("no versions for component %s match the constraints", comp.GetName()) } diff --git a/pkg/contexts/ocm/repositories/comparch/componentarchive.go b/pkg/contexts/ocm/repositories/comparch/componentarchive.go index 42eaa96fa0..56f0f5aa23 100644 --- a/pkg/contexts/ocm/repositories/comparch/componentarchive.go +++ b/pkg/contexts/ocm/repositories/comparch/componentarchive.go @@ -217,7 +217,10 @@ func (c *componentArchiveContainer) GetInexpensiveContentVersionIdentity(a cpi.A return "" } defer m.Close() - digest, _ := blobaccess.Digest(m) + digest, err := blobaccess.Digest(m) + if err != nil { + return "" + } return digest.String() } return "" diff --git a/pkg/contexts/ocm/repositories/comparch/repository.go b/pkg/contexts/ocm/repositories/comparch/repository.go index c99c9c0d98..5dc9262c4d 100644 --- a/pkg/contexts/ocm/repositories/comparch/repository.go +++ b/pkg/contexts/ocm/repositories/comparch/repository.go @@ -326,7 +326,10 @@ func (c *ComponentVersionContainer) GetInexpensiveContentVersionIdentity(a cpi.A return "" } defer m.Close() - digest, _ := blobaccess.Digest(m) + digest, err := blobaccess.Digest(m) + if err != nil { + return "" + } return digest.String() } return "" diff --git a/pkg/contexts/ocm/repositories/genericocireg/componentversion.go b/pkg/contexts/ocm/repositories/genericocireg/componentversion.go index 862f9986d5..0cebe286ab 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/componentversion.go +++ b/pkg/contexts/ocm/repositories/genericocireg/componentversion.go @@ -147,13 +147,15 @@ func (c *ComponentVersionContainer) GetInexpensiveContentVersionIdentity(a cpi.A } switch a.GetKind() { - case localblob.Type: - return accessSpec.(*localblob.AccessSpec).LocalReference - case localociblob.Type: - return accessSpec.(*localblob.AccessSpec).LocalReference + case localblob.Type, localociblob.Type: + if spec, ok := accessSpec.(*localblob.AccessSpec); ok { + return spec.LocalReference + } case relativeociref.Type: - d, _ := accessSpec.(*relativeociref.AccessSpec).GetDigest() - return d + if spec, ok := accessSpec.(*relativeociref.AccessSpec); ok { + d, _ := spec.GetDigest() + return d + } } return "" diff --git a/pkg/mimeutils/type.go b/pkg/mimeutils/type.go index cbd4c8bad1..080e7f1aab 100644 --- a/pkg/mimeutils/type.go +++ b/pkg/mimeutils/type.go @@ -140,8 +140,7 @@ func TypeByExtension(ext string) string { if c >= utf8RuneSelf { // Slow path. si, _ := mimeTypesLower.Load(strings.ToLower(ext)) - s, _ := si.(string) - return s + return si.(string) } if 'A' <= c && c <= 'Z' { lower = append(lower, c+('a'-'A')) @@ -150,8 +149,7 @@ func TypeByExtension(ext string) string { } } si, _ := mimeTypesLower.Load(string(lower)) - s, _ := si.(string) - return s + return si.(string) } // ExtensionsByType returns the extensions known to be associated with the MIME diff --git a/pkg/toi/support/support.go b/pkg/toi/support/support.go index df2bb2ad16..57cad73f35 100644 --- a/pkg/toi/support/support.go +++ b/pkg/toi/support/support.go @@ -99,7 +99,10 @@ func (o *ExecutorOptions) Complete() error { } if o.OCMConfig == "" { - cfg, _ := utils2.ResolvePath(o.Inputs + "/" + install.InputOCMConfig) + cfg, err := utils2.ResolvePath(o.Inputs + "/" + install.InputOCMConfig) + if err != nil { + return errors.Wrapf(err, "cannot resolve OCM config %q", o.Inputs) + } if ok, err := vfs.FileExists(o.FileSystem(), cfg); ok && err == nil { o.OCMConfig = cfg } @@ -111,7 +114,10 @@ func (o *ExecutorOptions) Complete() error { } if o.Parameters == "" { - p, _ := utils2.ResolvePath(o.Inputs + "/" + install.InputParameters) + p, err := utils2.ResolvePath(o.Inputs + "/" + install.InputParameters) + if err != nil { + return errors.Wrapf(err, "cannot resolve path %q", o.Inputs) + } if ok, err := vfs.FileExists(o.FileSystem(), p); ok && err == nil { o.Parameters = p } From b44a4890a2cbd6c706fbd9b08a158ac6cb175c61 Mon Sep 17 00:00:00 2001 From: Hilmar Falkenberg Date: Wed, 8 May 2024 15:10:32 +0200 Subject: [PATCH 59/83] let's get rid of reuse PendingDeprecationWarning (#765) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description ``` Copyright and licensing information for 'xyz.go' has been found in both 'xyz.go' and in the DEP5 file located at '.reuse/dep5'. ``` You might want to take a look at the individual [commits.](https://github.com/open-component-model/ocm/pull/765/commits) ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [x] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [x] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [x] πŸ™… no documentation needed ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [x] Any dependent changes have been merged and published in downstream modules --- Makefile | 15 +----- cmds/demoplugin/accessmethods/demo.go | 4 -- cmds/demoplugin/common/const.go | 4 -- cmds/demoplugin/config/config.go | 4 -- cmds/demoplugin/main.go | 4 -- cmds/demoplugin/uploaders/demo.go | 4 -- cmds/demoplugin/uploaders/writer.go | 4 -- cmds/demoplugin/valuesets/check.go | 4 -- cmds/demoplugin/valuesets/check_test.go | 4 -- cmds/demoplugin/valuesets/suite_test.go | 4 -- cmds/ecrplugin/actions/action.go | 4 -- cmds/ecrplugin/config/config.go | 4 -- cmds/ecrplugin/config/tweak.go | 4 -- cmds/ecrplugin/main.go | 4 -- cmds/helminstaller/app/app.go | 4 -- cmds/helminstaller/app/config.go | 4 -- cmds/helminstaller/app/driver/driver.go | 4 -- cmds/helminstaller/app/driver/helm/driver.go | 4 -- cmds/helminstaller/app/driver/helm/install.go | 4 -- .../app/driver/helm/uninstall.go | 4 -- cmds/helminstaller/app/execute.go | 4 -- cmds/helminstaller/app/executor.go | 4 -- cmds/helminstaller/app/set.go | 4 -- cmds/helminstaller/main.go | 4 -- cmds/helminstaller/testhelper/env.go | 4 -- cmds/ocm/app/app.go | 6 +-- cmds/ocm/app/app_test.go | 4 -- cmds/ocm/app/prepare.go | 4 -- cmds/ocm/app/suite_test.go | 4 -- cmds/ocm/ca/component-descriptor.yaml | 10 ++++ cmds/ocm/commands/cachecmds/clean/cmd.go | 4 -- cmds/ocm/commands/cachecmds/cmd.go | 4 -- cmds/ocm/commands/cachecmds/describe/cmd.go | 4 -- cmds/ocm/commands/cachecmds/names/names.go | 4 -- .../common/elements/components/cmd.go | 4 -- .../common/options/closureoption/option.go | 4 -- .../common/options/destoption/option.go | 4 -- .../options/failonerroroption/option.go | 4 -- .../common/options/formatoption/option.go | 4 -- .../common/options/keyoption/option.go | 4 -- .../commands/controllercmds/common/applyer.go | 4 -- .../commands/controllercmds/common/fetcher.go | 4 -- .../controllercmds/common/manifests.go | 4 -- .../commands/controllercmds/install/cmd.go | 4 -- .../controllercmds/install/cmd_test.go | 4 -- .../install/install_cert_manager.go | 4 +- .../install/resource_manager.go | 4 -- .../controllercmds/install/suite_test.go | 4 -- .../commands/controllercmds/names/names.go | 4 -- .../commands/controllercmds/uninstall/cmd.go | 4 -- .../controllercmds/uninstall/cmd_test.go | 4 -- .../uninstall/resource_manager.go | 4 -- .../controllercmds/uninstall/suite_test.go | 4 -- cmds/ocm/commands/misccmds/action/cmd.go | 4 -- .../commands/misccmds/action/execute/cmd.go | 4 -- cmds/ocm/commands/misccmds/credentials/cmd.go | 4 -- .../commands/misccmds/credentials/get/cmd.go | 4 -- .../misccmds/credentials/get/cmd_test.go | 4 -- .../misccmds/credentials/get/suite_test.go | 4 -- cmds/ocm/commands/misccmds/hash/cmd.go | 4 -- cmds/ocm/commands/misccmds/hash/sign/cmd.go | 4 -- .../commands/misccmds/hash/sign/cmd_test.go | 4 -- .../commands/misccmds/hash/sign/suite_test.go | 4 -- cmds/ocm/commands/misccmds/names/names.go | 4 -- cmds/ocm/commands/misccmds/rsakeypair/cmd.go | 4 -- .../commands/misccmds/rsakeypair/cmd_test.go | 4 -- .../misccmds/rsakeypair/suite_test.go | 4 -- cmds/ocm/commands/ocicmds/artifacts/cmd.go | 4 -- .../ocicmds/artifacts/describe/cmd.go | 4 -- .../ocicmds/artifacts/download/cmd.go | 4 -- .../ocicmds/artifacts/download/cmd_test.go | 4 -- .../ocicmds/artifacts/download/option.go | 4 -- .../ocicmds/artifacts/download/suite_test.go | 4 -- .../ocm/commands/ocicmds/artifacts/get/cmd.go | 4 -- .../ocicmds/artifacts/get/cmd_test.go | 4 -- .../commands/ocicmds/artifacts/get/options.go | 4 -- .../ocicmds/artifacts/get/suite_test.go | 4 -- .../ocicmds/artifacts/transfer/cmd.go | 4 -- .../ocicmds/artifacts/transfer/cmd_test.go | 4 -- .../ocicmds/artifacts/transfer/suite_test.go | 4 -- cmds/ocm/commands/ocicmds/cmd.go | 4 -- .../common/handlers/artifacthdlr/attached.go | 4 -- .../common/handlers/artifacthdlr/clean.go | 4 -- .../common/handlers/artifacthdlr/closure.go | 4 -- .../common/handlers/artifacthdlr/convert.go | 4 -- .../common/handlers/artifacthdlr/sort.go | 4 -- .../handlers/artifacthdlr/typehandler.go | 4 -- .../common/options/repooption/option.go | 4 -- cmds/ocm/commands/ocicmds/common/utils.go | 4 -- cmds/ocm/commands/ocicmds/ctf/cmd.go | 4 -- cmds/ocm/commands/ocicmds/ctf/create/cmd.go | 4 -- .../commands/ocicmds/ctf/create/cmd_test.go | 4 -- .../commands/ocicmds/ctf/create/suite_test.go | 4 -- cmds/ocm/commands/ocicmds/names/names.go | 4 -- cmds/ocm/commands/ocicmds/tags/cmd.go | 4 -- cmds/ocm/commands/ocicmds/tags/show/cmd.go | 4 -- .../commands/ocicmds/tags/show/cmd_test.go | 4 -- .../commands/ocicmds/tags/show/suite_test.go | 4 -- cmds/ocm/commands/ocmcmds/cli/cmd.go | 4 -- cmds/ocm/commands/ocmcmds/cli/download/cmd.go | 4 -- .../commands/ocmcmds/cli/download/cmd_test.go | 4 -- .../commands/ocmcmds/cli/download/const.go | 4 -- .../commands/ocmcmds/cli/download/is_unix.go | 4 -- .../ocmcmds/cli/download/is_windows.go | 4 -- .../ocmcmds/cli/download/suite_test.go | 4 -- cmds/ocm/commands/ocmcmds/cmd.go | 4 -- cmds/ocm/commands/ocmcmds/common/addconfig.go | 4 -- .../common/addhdlrs/comp/components.go | 4 -- .../ocmcmds/common/addhdlrs/comp/elements.go | 4 -- .../ocmcmds/common/addhdlrs/interface.go | 4 -- .../ocmcmds/common/addhdlrs/refs/elements.go | 4 -- .../ocmcmds/common/addhdlrs/rscs/elements.go | 4 -- .../ocmcmds/common/addhdlrs/srcs/elements.go | 4 -- .../commands/ocmcmds/common/addhdlrs/utils.go | 4 -- .../ocmcmds/common/cmds/signing/cmd.go | 4 -- .../common/handlers/comphdlr/closure.go | 4 -- .../common/handlers/comphdlr/convert.go | 4 -- .../common/handlers/comphdlr/options.go | 4 -- .../ocmcmds/common/handlers/comphdlr/sort.go | 4 -- .../common/handlers/comphdlr/typehandler.go | 4 -- .../ocmcmds/common/handlers/comphdlr/util.go | 4 -- .../common/handlers/elemhdlr/convert.go | 4 -- .../common/handlers/elemhdlr/options.go | 4 -- .../common/handlers/elemhdlr/output.go | 4 -- .../ocmcmds/common/handlers/elemhdlr/sort.go | 4 -- .../common/handlers/elemhdlr/typehandler.go | 4 -- .../common/handlers/pluginhdlr/typehandler.go | 4 -- .../common/handlers/vershdlr/options.go | 4 -- .../ocmcmds/common/handlers/vershdlr/sort.go | 4 -- .../common/handlers/vershdlr/typehandler.go | 4 -- .../ocmcmds/common/inputs/cpi/helper.go | 4 -- .../ocmcmds/common/inputs/inputfields.go | 4 -- .../ocmcmds/common/inputs/inputtype.go | 4 -- .../ocmcmds/common/inputs/inputtype_test.go | 4 -- .../ocmcmds/common/inputs/suite_test.go | 4 -- .../common/inputs/testutils/testutils.go | 4 -- .../ocmcmds/common/inputs/types/binary/cli.go | 4 -- .../inputs/types/binary/inputtype_test.go | 4 -- .../common/inputs/types/binary/spec.go | 4 -- .../common/inputs/types/binary/suite_test.go | 4 -- .../common/inputs/types/binary/type.go | 4 -- .../common/inputs/types/directory/cli.go | 4 -- .../inputs/types/directory/inputtype_test.go | 4 -- .../common/inputs/types/directory/spec.go | 4 -- .../inputs/types/directory/suite_test.go | 4 -- .../common/inputs/types/directory/type.go | 4 -- .../ocmcmds/common/inputs/types/docker/cli.go | 4 -- .../common/inputs/types/docker/spec.go | 4 -- .../common/inputs/types/docker/type.go | 4 -- .../common/inputs/types/dockermulti/cli.go | 4 -- .../common/inputs/types/dockermulti/spec.go | 4 -- .../common/inputs/types/dockermulti/type.go | 4 -- .../ocmcmds/common/inputs/types/file/cli.go | 4 -- .../ocmcmds/common/inputs/types/file/spec.go | 4 -- .../common/inputs/types/file/support.go | 4 -- .../ocmcmds/common/inputs/types/file/type.go | 4 -- .../ocmcmds/common/inputs/types/helm/cli.go | 4 -- .../ocmcmds/common/inputs/types/helm/spec.go | 4 -- .../ocmcmds/common/inputs/types/helm/type.go | 4 -- .../ocmcmds/common/inputs/types/helm/utils.go | 4 -- .../ocmcmds/common/inputs/types/init.go | 4 -- .../common/inputs/types/ociartifact/cli.go | 4 -- .../inputs/types/ociartifact/input_test.go | 4 -- .../common/inputs/types/ociartifact/spec.go | 4 -- .../inputs/types/ociartifact/suite_test.go | 4 -- .../common/inputs/types/ociartifact/type.go | 4 -- .../ocmcmds/common/inputs/types/spiff/cli.go | 4 -- .../ocmcmds/common/inputs/types/spiff/spec.go | 4 -- .../common/inputs/types/spiff/spiff_test.go | 4 -- .../common/inputs/types/spiff/suite_test.go | 4 -- .../ocmcmds/common/inputs/types/spiff/type.go | 4 -- .../ocmcmds/common/inputs/types/utf8/cli.go | 4 -- .../inputs/types/utf8/inputtype_test.go | 4 -- .../ocmcmds/common/inputs/types/utf8/spec.go | 4 -- .../common/inputs/types/utf8/suite_test.go | 4 -- .../ocmcmds/common/inputs/types/utf8/type.go | 4 -- .../ocmcmds/common/inputs/types/wget/cli.go | 4 -- .../common/inputs/types/wget/input_test.go | 4 -- .../ocmcmds/common/inputs/types/wget/spec.go | 4 -- .../common/inputs/types/wget/suite_test.go | 4 -- .../ocmcmds/common/inputs/types/wget/type.go | 4 -- .../options/comppathopt/comppath_test.go | 4 -- .../common/options/comppathopt/option.go | 4 -- .../common/options/downloaderoption/option.go | 4 -- .../common/options/dryrunoption/option.go | 4 -- .../common/options/fileoption/option.go | 4 -- .../common/options/hashoption/option.go | 4 -- .../common/options/keepglobaloption/option.go | 4 -- .../common/options/lookupoption/option.go | 4 -- .../options/omitaccesstypeoption/option.go | 4 -- .../common/options/optutils/reg_test.go | 4 -- .../common/options/optutils/registration.go | 4 -- .../common/options/optutils/suite_test.go | 4 -- .../common/options/overwriteoption/option.go | 4 -- .../common/options/repooption/option.go | 4 -- .../common/options/rscbyvalueoption/option.go | 4 -- .../common/options/schemaoption/option.go | 4 -- .../common/options/scriptoption/config.go | 4 -- .../common/options/scriptoption/option.go | 4 -- .../common/options/signoption/option.go | 4 -- .../common/options/skipdigestoption/option.go | 4 -- .../common/options/skipupdateoption/option.go | 4 -- .../common/options/srcbyvalueoption/option.go | 4 -- .../options/stoponexistingoption/option.go | 4 -- .../common/options/templateroption/option.go | 4 -- .../common/options/uploaderoption/option.go | 4 -- .../options/uploaderoption/suite_test.go | 4 -- .../options/uploaderoption/uploader_test.go | 4 -- .../versionconstraintsoption/option.go | 4 -- cmds/ocm/commands/ocmcmds/common/resources.go | 4 -- .../commands/ocmcmds/common/resources_test.go | 4 -- cmds/ocm/commands/ocmcmds/common/settings.go | 4 -- .../ocm/commands/ocmcmds/common/suite_test.go | 4 -- cmds/ocm/commands/ocmcmds/common/utils.go | 4 -- .../commands/ocmcmds/componentarchive/cmd.go | 4 -- .../ocmcmds/componentarchive/create/cmd.go | 6 +-- .../componentarchive/create/cmd_test.go | 4 -- .../componentarchive/create/suite_test.go | 4 -- .../ocmcmds/componentarchive/transfer/cmd.go | 4 -- .../commands/ocmcmds/components/add/cmd.go | 4 -- .../ocmcmds/components/add/cmd_test.go | 4 -- .../ocmcmds/components/add/suite_test.go | 4 -- .../commands/ocmcmds/components/check/cmd.go | 4 -- .../ocmcmds/components/check/cmd_test.go | 4 -- .../ocmcmds/components/check/options.go | 4 -- .../ocmcmds/components/check/suite_test.go | 4 -- cmds/ocm/commands/ocmcmds/components/cmd.go | 4 -- .../ocmcmds/components/download/cmd.go | 4 -- .../ocmcmds/components/download/cmd_test.go | 4 -- .../ocmcmds/components/download/suite_test.go | 4 -- .../commands/ocmcmds/components/get/cmd.go | 4 -- .../ocmcmds/components/get/cmd_test.go | 4 -- .../ocmcmds/components/get/suite_test.go | 4 -- .../commands/ocmcmds/components/hash/cmd.go | 4 -- .../ocmcmds/components/hash/cmd_test.go | 4 -- .../ocmcmds/components/hash/options.go | 4 -- .../ocmcmds/components/hash/suite_test.go | 4 -- .../commands/ocmcmds/components/list/cmd.go | 6 +-- .../ocmcmds/components/list/cmd_test.go | 4 -- .../ocmcmds/components/list/suite_test.go | 4 -- .../commands/ocmcmds/components/sign/cmd.go | 4 -- .../ocmcmds/components/sign/cmd_test.go | 4 -- .../ocmcmds/components/sign/suite_test.go | 4 -- .../ocmcmds/components/transfer/cmd.go | 4 -- .../ocmcmds/components/transfer/cmd_test.go | 4 -- .../components/transfer/disableupload_test.go | 4 -- .../ocmcmds/components/transfer/suite_test.go | 4 -- .../components/transfer/upload_test.go | 4 -- .../commands/ocmcmds/components/verify/cmd.go | 4 -- .../ocmcmds/components/verify/cmd_test.go | 4 -- .../ocmcmds/components/verify/suite_test.go | 4 -- cmds/ocm/commands/ocmcmds/ctf/cmd.go | 4 -- cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go | 4 -- .../commands/ocmcmds/ctf/transfer/cmd_test.go | 4 -- .../ocmcmds/ctf/transfer/suite_test.go | 4 -- cmds/ocm/commands/ocmcmds/init.go | 4 -- cmds/ocm/commands/ocmcmds/names/names.go | 4 -- cmds/ocm/commands/ocmcmds/plugins/cmd.go | 4 -- .../commands/ocmcmds/plugins/describe/cmd.go | 4 -- .../ocmcmds/plugins/describe/cmd_test.go | 4 -- .../ocmcmds/plugins/describe/describe.go | 4 -- .../ocmcmds/plugins/describe/suite_test.go | 4 -- .../ocmcmds/plugins/describe/testdata/action | 4 -- .../ocmcmds/plugins/describe/testdata/test | 4 -- cmds/ocm/commands/ocmcmds/plugins/get/cmd.go | 4 -- .../commands/ocmcmds/plugins/get/cmd_test.go | 4 -- .../ocmcmds/plugins/get/suite_test.go | 4 -- .../ocmcmds/plugins/get/testdata/test | 4 -- .../commands/ocmcmds/plugins/install/cmd.go | 4 -- .../ocmcmds/plugins/install/suite_test.go | 4 -- .../plugins/tests/accessmethods/cmd_test.go | 4 -- .../plugins/tests/accessmethods/suite_test.go | 4 -- .../plugins/tests/accessmethods/testdata/test | 4 -- .../plugins/tests/routingslips/cmd_test.go | 4 -- .../plugins/tests/routingslips/suite_test.go | 4 -- .../plugins/tests/routingslips/testdata/test | 4 -- .../commands/ocmcmds/references/add/cmd.go | 4 -- .../ocmcmds/references/add/cmd_test.go | 4 -- .../ocmcmds/references/add/provider.go | 4 -- .../ocmcmds/references/add/suite_test.go | 4 -- cmds/ocm/commands/ocmcmds/references/cmd.go | 4 -- .../ocmcmds/references/common/typehandler.go | 4 -- .../commands/ocmcmds/references/get/cmd.go | 4 -- .../ocmcmds/references/get/cmd_test.go | 4 -- .../ocmcmds/references/get/suite_test.go | 4 -- .../ocmcmds/resourceconfig/add/cmd.go | 4 -- .../ocmcmds/resourceconfig/add/cmd_test.go | 4 -- .../ocmcmds/resourceconfig/add/suite_test.go | 4 -- .../commands/ocmcmds/resourceconfig/cmd.go | 4 -- .../ocm/commands/ocmcmds/resources/add/cmd.go | 4 -- .../ocmcmds/resources/add/cmd_test.go | 4 -- .../ocmcmds/resources/add/provider.go | 4 -- .../ocmcmds/resources/add/suite_test.go | 4 -- cmds/ocm/commands/ocmcmds/resources/cmd.go | 4 -- .../ocmcmds/resources/common/typehandler.go | 4 -- .../ocmcmds/resources/download/action.go | 4 -- .../ocmcmds/resources/download/cmd.go | 4 -- .../ocmcmds/resources/download/cmd_test.go | 4 -- .../resources/download/dirtree_test.go | 4 -- .../ocmcmds/resources/download/options.go | 4 -- .../ocmcmds/resources/download/suite_test.go | 4 -- .../ocm/commands/ocmcmds/resources/get/cmd.go | 4 -- .../ocmcmds/resources/get/cmd_test.go | 4 -- .../ocmcmds/resources/get/deep_test.go | 4 -- .../ocmcmds/resources/get/suite_test.go | 4 -- .../commands/ocmcmds/routingslips/add/cmd.go | 4 -- .../ocmcmds/routingslips/add/cmd_test.go | 4 -- .../ocmcmds/routingslips/add/suite_test.go | 4 -- cmds/ocm/commands/ocmcmds/routingslips/cmd.go | 4 -- .../ocmcmds/routingslips/common/options.go | 4 -- .../routingslips/common/typehandler.go | 4 -- .../commands/ocmcmds/routingslips/get/cmd.go | 4 -- .../ocmcmds/routingslips/get/cmd_test.go | 4 -- .../ocmcmds/routingslips/get/options.go | 4 -- .../ocmcmds/routingslips/get/suite_test.go | 4 -- .../commands/ocmcmds/sourceconfig/add/cmd.go | 4 -- .../ocmcmds/sourceconfig/add/cmd_test.go | 4 -- .../ocmcmds/sourceconfig/add/suite_test.go | 4 -- cmds/ocm/commands/ocmcmds/sourceconfig/cmd.go | 4 -- cmds/ocm/commands/ocmcmds/sources/add/cmd.go | 4 -- .../commands/ocmcmds/sources/add/cmd_test.go | 4 -- .../ocmcmds/sources/add/suite_test.go | 4 -- cmds/ocm/commands/ocmcmds/sources/cmd.go | 4 -- .../ocmcmds/sources/common/typehandler.go | 4 -- cmds/ocm/commands/ocmcmds/sources/get/cmd.go | 4 -- .../commands/ocmcmds/sources/get/cmd_test.go | 4 -- .../ocmcmds/sources/get/suite_test.go | 4 -- cmds/ocm/commands/ocmcmds/versions/cmd.go | 4 -- .../ocm/commands/ocmcmds/versions/show/cmd.go | 4 -- .../ocmcmds/versions/show/cmd_test.go | 4 -- .../ocmcmds/versions/show/suite_test.go | 4 -- cmds/ocm/commands/toicmds/cmd.go | 4 -- .../commands/toicmds/config/bootstrap/cmd.go | 4 -- .../toicmds/config/bootstrap/cmd_test.go | 4 -- .../toicmds/config/bootstrap/suite_test.go | 4 -- cmds/ocm/commands/toicmds/config/cmd.go | 4 -- cmds/ocm/commands/toicmds/names/names.go | 4 -- .../commands/toicmds/package/bootstrap/cmd.go | 4 -- cmds/ocm/commands/toicmds/package/cmd.go | 4 -- .../commands/toicmds/package/describe/cmd.go | 4 -- .../commands/toicmds/verbs/bootstrap/cmd.go | 4 -- .../commands/toicmds/verbs/describe/cmd.go | 4 -- cmds/ocm/commands/verbs/add/cmd.go | 4 -- cmds/ocm/commands/verbs/bootstrap/cmd.go | 4 -- cmds/ocm/commands/verbs/check/cmd.go | 4 -- cmds/ocm/commands/verbs/clean/cmd.go | 4 -- cmds/ocm/commands/verbs/controller/cmd.go | 4 -- cmds/ocm/commands/verbs/create/cmd.go | 4 -- cmds/ocm/commands/verbs/describe/cmd.go | 4 -- cmds/ocm/commands/verbs/download/cmd.go | 4 -- cmds/ocm/commands/verbs/execute/cmd.go | 4 -- cmds/ocm/commands/verbs/get/cmd.go | 4 -- cmds/ocm/commands/verbs/hash/cmd.go | 4 -- cmds/ocm/commands/verbs/install/cmd.go | 4 -- cmds/ocm/commands/verbs/list/cmd.go | 4 -- cmds/ocm/commands/verbs/show/cmd.go | 4 -- cmds/ocm/commands/verbs/sign/cmd.go | 4 -- cmds/ocm/commands/verbs/transfer/cmd.go | 4 -- cmds/ocm/commands/verbs/verbs.go | 4 -- cmds/ocm/commands/verbs/verify/cmd.go | 4 -- cmds/ocm/main.go | 4 -- cmds/ocm/pkg/data/convert.go | 4 -- cmds/ocm/pkg/data/dll.go | 4 -- cmds/ocm/pkg/data/dll_test.go | 4 -- cmds/ocm/pkg/data/indexed.go | 4 -- cmds/ocm/pkg/data/indexed_test.go | 4 -- cmds/ocm/pkg/data/iterator.go | 4 -- cmds/ocm/pkg/data/list.go | 4 -- cmds/ocm/pkg/data/list_test.go | 4 -- cmds/ocm/pkg/data/sort.go | 4 -- cmds/ocm/pkg/data/suite_test.go | 4 -- cmds/ocm/pkg/options/interfaces.go | 4 -- cmds/ocm/pkg/options/options_test.go | 4 -- cmds/ocm/pkg/options/suite_test.go | 4 -- cmds/ocm/pkg/output/attroutput.go | 4 -- cmds/ocm/pkg/output/attrset.go | 4 -- cmds/ocm/pkg/output/chain.go | 4 -- cmds/ocm/pkg/output/complexoutput.go | 4 -- cmds/ocm/pkg/output/elementoutput.go | 4 -- cmds/ocm/pkg/output/funcoutput.go | 4 -- cmds/ocm/pkg/output/options.go | 4 -- cmds/ocm/pkg/output/output.go | 4 -- cmds/ocm/pkg/output/select.go | 4 -- cmds/ocm/pkg/output/singleelemoutput.go | 4 -- cmds/ocm/pkg/output/sort_test.go | 4 -- cmds/ocm/pkg/output/stringoutput.go | 4 -- cmds/ocm/pkg/output/suite_test.go | 4 -- cmds/ocm/pkg/output/table.go | 4 -- cmds/ocm/pkg/output/tableoutput.go | 8 +-- cmds/ocm/pkg/output/treeoutput.go | 4 -- cmds/ocm/pkg/output/utils.go | 4 -- cmds/ocm/pkg/processing/buffer.go | 4 -- cmds/ocm/pkg/processing/buffer_test.go | 4 -- cmds/ocm/pkg/processing/chain.go | 4 -- cmds/ocm/pkg/processing/logging.go | 4 -- cmds/ocm/pkg/processing/operation.go | 4 -- cmds/ocm/pkg/processing/parallel.go | 4 -- cmds/ocm/pkg/processing/pool.go | 4 -- cmds/ocm/pkg/processing/processing.go | 4 -- cmds/ocm/pkg/processing/processing_test.go | 4 -- cmds/ocm/pkg/processing/sequential.go | 4 -- cmds/ocm/pkg/processing/suite_test.go | 4 -- cmds/ocm/pkg/processing/utils.go | 4 -- cmds/ocm/pkg/tree/convert.go | 4 -- cmds/ocm/pkg/tree/suite_test.go | 4 -- cmds/ocm/pkg/tree/tree.go | 4 -- cmds/ocm/pkg/tree/tree_test.go | 4 -- cmds/ocm/pkg/utils/command.go | 4 -- cmds/ocm/pkg/utils/fileutils.go | 4 -- cmds/ocm/pkg/utils/handling.go | 4 -- cmds/ocm/pkg/utils/plural.go | 4 -- cmds/ocm/pkg/utils/validate.go | 4 -- cmds/ocm/testhelper/env.go | 4 -- cmds/ocm/testhelper/forward.go | 4 -- cmds/ocm/testhelper/suite_test.go | 4 -- cmds/ocm/testhelper/testhelper_test.go | 4 -- cmds/ocm/topics/common/attributes/topic.go | 4 -- cmds/ocm/topics/common/config/topic.go | 4 -- cmds/ocm/topics/common/credentials/topic.go | 4 -- cmds/ocm/topics/common/logging/topic.go | 4 -- cmds/ocm/topics/oci/refs/topic.go | 4 -- cmds/ocm/topics/ocm/accessmethods/topic.go | 4 -- cmds/ocm/topics/ocm/downloadhandlers/topic.go | 4 -- cmds/ocm/topics/ocm/labels/topic.go | 4 -- cmds/ocm/topics/ocm/refs/topic.go | 4 -- cmds/ocm/topics/ocm/uploadhandlers/topic.go | 4 -- cmds/ocm/topics/toi/bootstrapping/topic.go | 4 -- .../ocm_add_resource-configuration.md | 54 ++++++++++++++++++- docs/reference/ocm_add_resources.md | 54 ++++++++++++++++++- docs/reference/ocm_add_routingslips.md | 2 - .../reference/ocm_add_source-configuration.md | 54 ++++++++++++++++++- docs/reference/ocm_add_sources.md | 54 ++++++++++++++++++- docs/reference/ocm_bootstrap_configuration.md | 2 - docs/reference/ocm_bootstrap_package.md | 2 - docs/reference/ocm_check_componentversions.md | 2 - docs/reference/ocm_describe_artifacts.md | 1 - docs/reference/ocm_describe_package.md | 2 - docs/reference/ocm_download_artifacts.md | 1 - docs/reference/ocm_download_cli.md | 2 - .../ocm_download_componentversions.md | 2 - docs/reference/ocm_download_resources.md | 2 - docs/reference/ocm_get_artifacts.md | 1 - docs/reference/ocm_get_componentversions.md | 2 - docs/reference/ocm_get_references.md | 2 - docs/reference/ocm_get_resources.md | 2 - docs/reference/ocm_get_routingslips.md | 2 - docs/reference/ocm_get_sources.md | 2 - docs/reference/ocm_hash_componentversions.md | 2 - docs/reference/ocm_install_plugins.md | 2 - docs/reference/ocm_ocm-accessmethods.md | 45 ++++++++++++++++ docs/reference/ocm_ocm-references.md | 14 +++++ docs/reference/ocm_show_tags.md | 1 - docs/reference/ocm_show_versions.md | 2 - docs/reference/ocm_sign_componentversions.md | 2 - docs/reference/ocm_transfer_artifacts.md | 1 - .../ocm_transfer_componentversions.md | 2 - .../reference/ocm_verify_componentversions.md | 2 - .../lib/comparison-scenario/00-consumer.go | 5 +- .../lib/comparison-scenario/00-provider.go | 4 -- examples/lib/comparison-scenario/01-create.go | 4 -- examples/lib/comparison-scenario/02-sign.go | 4 -- .../lib/comparison-scenario/04-transport.go | 4 -- examples/lib/comparison-scenario/05-verify.go | 4 -- .../lib/comparison-scenario/06-download.go | 5 +- examples/lib/comparison-scenario/07-getref.go | 4 -- .../comparison-scenario/08-deployscript.go | 4 -- .../lib/comparison-scenario/09-localize.go | 9 ++-- examples/lib/comparison-scenario/main.go | 4 -- examples/lib/comparison-scenario/utils.go | 11 ++-- examples/lib/config1/example.go | 4 -- examples/lib/config1/main.go | 4 -- examples/lib/config2/example.go | 4 -- examples/lib/config2/main.go | 4 -- examples/lib/config3/example.go | 4 -- examples/lib/config3/main.go | 4 -- examples/lib/cred1/example.go | 4 -- examples/lib/cred1/main.go | 4 -- examples/lib/cred2/example.go | 4 -- examples/lib/cred2/main.go | 4 -- examples/lib/cred3/example.go | 4 -- examples/lib/cred3/main.go | 4 -- examples/lib/ctf/example.go | 5 +- examples/lib/ctf/main.go | 4 -- examples/lib/example.go | 4 -- examples/lib/helper/helper.go | 4 -- examples/lib/main.go | 4 -- .../lib/tour/01-getting-started/README.md | 22 ++++++-- .../lib/tour/01-getting-started/example.go | 4 -- examples/lib/tour/01-getting-started/main.go | 4 -- .../01-basic-componentversion-creation.go | 4 -- .../02-composition-version.go | 4 -- .../02-composing-a-component-version/main.go | 4 -- .../01-using-credentials.go | 4 -- .../02-basic-credential-management.go | 4 -- .../03-credential-repositories.go | 4 -- .../03-working-with-credentials/common.go | 4 -- .../tour/03-working-with-credentials/main.go | 4 -- .../01-basic-config-management.go | 4 -- .../02-handle-arbitrary-config.go | 4 -- .../03-using-ocm-config.go | 7 +-- .../04-write-config-type.go | 7 +-- .../05-write-config-consumer.go | 4 -- .../lib/tour/04-working-with-config/common.go | 4 -- .../lib/tour/04-working-with-config/main.go | 4 -- .../common.go | 4 -- .../example.go | 4 -- .../main.go | 4 -- .../01-basic-signing.go | 4 -- .../02-using-context-settings.go | 4 -- .../06-signing-component-versions/common.go | 4 -- .../06-signing-component-versions/main.go | 4 -- examples/lib/tour/doc.go | 4 -- examples/lib/transfer1/example.go | 4 -- examples/lib/transfer1/main.go | 4 -- flake.nix | 5 -- hack/Makefile | 4 -- hack/boilerplate.go.txt | 3 -- hack/check.sh | 4 -- hack/cross-build.sh | 4 -- hack/format.sh | 6 +-- hack/generate-docs/cobradoc/gen.go | 4 -- hack/generate-docs/cobradoc/md_docs.go | 7 +-- hack/generate-docs/cobradoc/mod.go | 4 -- hack/generate-docs/cobradoc/space.go | 4 -- hack/generate-docs/cobradoc/suite_test.go | 4 -- hack/generate-docs/cobradoc/util.go | 4 -- hack/generate-docs/main.go | 4 -- hack/generate.sh | 4 -- hack/install-requirements.sh | 6 --- hack/install.sh | 4 -- hack/tools.go | 4 -- pkg/blobaccess/blobaccess_test.go | 4 -- pkg/blobaccess/bpi/interface.go | 4 -- pkg/blobaccess/bpi/utils.go | 4 -- pkg/blobaccess/bpi/view.go | 4 -- pkg/blobaccess/cached.go | 4 -- pkg/blobaccess/compress.go | 4 -- pkg/blobaccess/compress_test.go | 4 -- pkg/blobaccess/dataaccess.go | 4 -- pkg/blobaccess/digest.go | 4 -- pkg/blobaccess/dirtree/access.go | 4 -- pkg/blobaccess/dirtree/options.go | 4 -- pkg/blobaccess/doc.go | 4 -- pkg/blobaccess/dockerdaemon/access.go | 4 -- pkg/blobaccess/dockerdaemon/options.go | 4 -- pkg/blobaccess/dockermulti/access.go | 4 -- pkg/blobaccess/dockermulti/options.go | 4 -- pkg/blobaccess/helm/options.go | 4 -- pkg/blobaccess/helm/resource.go | 4 -- pkg/blobaccess/interface.go | 4 -- pkg/blobaccess/internal/interface.go | 4 -- pkg/blobaccess/ociartifact/options.go | 4 -- pkg/blobaccess/ociartifact/resource.go | 4 -- pkg/blobaccess/standard.go | 4 -- pkg/blobaccess/suite_test.go | 4 -- pkg/blobaccess/temp_test.go | 4 -- pkg/blobaccess/utils.go | 4 -- pkg/blobaccess/wget/access.go | 4 -- pkg/blobaccess/wget/logging.go | 4 -- pkg/blobaccess/wget/options.go | 4 -- pkg/clisupport/labels.go | 4 -- pkg/cobrautils/cleanup_test.go | 4 -- pkg/cobrautils/flag/bytes.go | 4 -- pkg/cobrautils/flag/labelledstring.go | 4 -- pkg/cobrautils/flag/labelledstring_test.go | 4 -- pkg/cobrautils/flag/labelledvalue.go | 4 -- pkg/cobrautils/flag/labelledvalue_test.go | 4 -- pkg/cobrautils/flag/semver.go | 4 -- pkg/cobrautils/flag/semver_constraint.go | 4 -- .../flag/string_colon_stringslice.go | 4 -- .../flag/string_colon_stringslice_test.go | 4 -- pkg/cobrautils/flag/string_to_stringslice.go | 4 -- .../flag/string_to_stringslice_test.go | 4 -- pkg/cobrautils/flag/string_to_value.go | 4 -- pkg/cobrautils/flag/string_to_value_test.go | 4 -- pkg/cobrautils/flag/suite_test.go | 4 -- pkg/cobrautils/flag/yaml.go | 4 -- pkg/cobrautils/flag/yaml_test.go | 4 -- pkg/cobrautils/flagsets/configoptions.go | 4 -- pkg/cobrautils/flagsets/configoptionset.go | 4 -- pkg/cobrautils/flagsets/configure_test.go | 4 -- pkg/cobrautils/flagsets/filter.go | 4 -- pkg/cobrautils/flagsets/flags_test.go | 4 -- pkg/cobrautils/flagsets/flagsetscheme/doc.go | 4 -- .../flagsets/flagsetscheme/scheme.go | 4 -- .../flagsets/flagsetscheme/types.go | 4 -- .../flagsets/flagsetscheme/types_options.go | 4 -- pkg/cobrautils/flagsets/handler.go | 4 -- pkg/cobrautils/flagsets/provider.go | 4 -- pkg/cobrautils/flagsets/suite_test.go | 4 -- pkg/cobrautils/flagsets/typeset_test.go | 4 -- pkg/cobrautils/flagsets/utils.go | 4 -- pkg/cobrautils/flagsets/utils_test.go | 4 -- pkg/cobrautils/funcs.go | 4 -- pkg/cobrautils/groups/flagusages.go | 4 -- pkg/cobrautils/links.go | 4 -- pkg/cobrautils/logopts/options.go | 4 -- pkg/cobrautils/logopts/options_test.go | 4 -- pkg/cobrautils/logopts/suite_test.go | 4 -- pkg/cobrautils/suite_test.go | 4 -- pkg/cobrautils/template.go | 4 -- pkg/cobrautils/tweak.go | 4 -- pkg/common/accessio/access.go | 4 -- pkg/common/accessio/cache.go | 4 -- pkg/common/accessio/cache_test.go | 4 -- pkg/common/accessio/digestreader.go | 4 -- pkg/common/accessio/digestwriter.go | 4 -- pkg/common/accessio/downloader/downloader.go | 4 -- .../accessio/downloader/http/downloader.go | 4 -- .../accessio/downloader/s3/downloader.go | 4 -- pkg/common/accessio/format.go | 4 -- pkg/common/accessio/limitwriter.go | 4 -- pkg/common/accessio/ondemandreader.go | 4 -- pkg/common/accessio/opts.go | 4 -- pkg/common/accessio/resettablereader.go | 4 -- pkg/common/accessio/resettablereader_test.go | 4 -- pkg/common/accessio/retry_test.go | 4 -- pkg/common/accessio/suite_test.go | 4 -- pkg/common/accessio/utils.go | 4 -- pkg/common/accessio/wrapper.go | 4 -- pkg/common/accessobj/accessobject.go | 4 -- pkg/common/accessobj/accessstate.go | 4 -- pkg/common/accessobj/cachedblob.go | 4 -- pkg/common/accessobj/cachedblob_test.go | 5 +- pkg/common/accessobj/check.go | 4 -- pkg/common/accessobj/filesystemaccess.go | 4 -- pkg/common/accessobj/format-directory.go | 4 -- pkg/common/accessobj/format-tar.go | 4 -- pkg/common/accessobj/format-tgz.go | 4 -- pkg/common/accessobj/format.go | 4 -- pkg/common/accessobj/suite_test.go | 4 -- pkg/common/accessobj/utils.go | 4 -- pkg/common/compression/c_bzip2.go | 4 -- pkg/common/compression/c_gzip.go | 4 -- pkg/common/compression/c_xz.go | 4 -- pkg/common/compression/c_zstd.go | 4 -- pkg/common/compression/compression.go | 4 -- pkg/common/compression/compression_test.go | 4 -- pkg/common/compression/default.go | 4 -- pkg/common/compression/matchreader.go | 4 -- pkg/common/compression/types.go | 4 -- pkg/common/compression/utils.go | 4 -- pkg/common/const.go | 4 -- pkg/common/history.go | 4 -- pkg/common/history_test.go | 4 -- pkg/common/printer.go | 4 -- pkg/common/printer_test.go | 4 -- pkg/common/properties.go | 4 -- pkg/common/suite_test.go | 4 -- pkg/common/types.go | 4 -- pkg/common/utils.go | 4 -- pkg/common/walk.go | 4 -- pkg/contexts/clictx/builder.go | 4 -- pkg/contexts/clictx/config/config_test.go | 4 -- pkg/contexts/clictx/config/suite_test.go | 4 -- pkg/contexts/clictx/config/type.go | 4 -- pkg/contexts/clictx/interface.go | 4 -- pkg/contexts/clictx/internal/builder.go | 4 -- pkg/contexts/clictx/internal/context.go | 4 -- pkg/contexts/config/builder.go | 4 -- pkg/contexts/config/config/context_test.go | 10 ++-- pkg/contexts/config/config/dummy_test.go | 4 -- pkg/contexts/config/config/suite_test.go | 4 -- pkg/contexts/config/config/type.go | 4 -- pkg/contexts/config/context_test.go | 6 +-- pkg/contexts/config/cpi/config.go | 4 -- pkg/contexts/config/cpi/content.go | 4 -- pkg/contexts/config/cpi/interface.go | 4 -- pkg/contexts/config/dummy_test.go | 4 -- pkg/contexts/config/gc_test.go | 4 -- pkg/contexts/config/init.go | 4 -- pkg/contexts/config/interface.go | 4 -- pkg/contexts/config/internal/builder.go | 4 -- pkg/contexts/config/internal/builder_test.go | 4 -- pkg/contexts/config/internal/config.go | 4 -- pkg/contexts/config/internal/configtypes.go | 4 -- pkg/contexts/config/internal/context.go | 4 -- pkg/contexts/config/internal/errors.go | 4 -- pkg/contexts/config/internal/logging.go | 4 -- pkg/contexts/config/internal/setup_test.go | 4 -- pkg/contexts/config/internal/store.go | 4 -- pkg/contexts/config/internal/suite_test.go | 4 -- pkg/contexts/config/internal/updater.go | 4 -- pkg/contexts/config/logging.go | 4 -- pkg/contexts/config/suite_test.go | 4 -- pkg/contexts/credentials/area_test.go | 4 -- pkg/contexts/credentials/builder.go | 4 -- .../credentials/builtin/github/ghcr.go | 4 -- .../credentials/builtin/github/github.go | 4 -- .../builtin/github/identity/identity.go | 4 -- .../builtin/helm/identity/identity.go | 4 -- .../builtin/helm/identity/identity_test.go | 4 -- .../builtin/helm/identity/suite_test.go | 4 -- pkg/contexts/credentials/builtin/init.go | 4 -- .../credentials/builtin/oci/identity/creds.go | 4 -- .../builtin/oci/identity/id_test.go | 4 -- .../builtin/oci/identity/identity.go | 4 -- .../builtin/oci/identity/suite_test.go | 4 -- .../builtin/wget/identity/identity.go | 4 -- .../builtin/wget/identity/identity_test.go | 4 -- .../builtin/wget/identity/suite_test.go | 4 -- .../credentials/config/config_test.go | 4 -- pkg/contexts/credentials/config/suite_test.go | 4 -- pkg/contexts/credentials/config/type.go | 4 -- pkg/contexts/credentials/const.go | 4 -- pkg/contexts/credentials/cpi/builtin.go | 4 -- pkg/contexts/credentials/cpi/const.go | 4 -- pkg/contexts/credentials/cpi/interface.go | 4 -- pkg/contexts/credentials/cpi/repotypes.go | 4 -- pkg/contexts/credentials/doc.go | 4 -- pkg/contexts/credentials/gc_test.go | 4 -- .../credentials/identity/hostpath/id_test.go | 4 -- .../credentials/identity/hostpath/identity.go | 4 -- .../identity/hostpath/suite_test.go | 4 -- pkg/contexts/credentials/init.go | 4 -- pkg/contexts/credentials/interface.go | 4 -- pkg/contexts/credentials/internal/builder.go | 4 -- .../credentials/internal/builder_test.go | 4 -- pkg/contexts/credentials/internal/builtin.go | 4 -- pkg/contexts/credentials/internal/const.go | 4 -- .../credentials/internal/consumers.go | 4 -- pkg/contexts/credentials/internal/context.go | 4 -- .../credentials/internal/cred_test.go | 4 -- .../credentials/internal/credentials.go | 4 -- .../credentials/internal/credentialsspec.go | 4 -- pkg/contexts/credentials/internal/errors.go | 4 -- pkg/contexts/credentials/internal/identity.go | 4 -- .../credentials/internal/repository.go | 4 -- .../credentials/internal/repotypes.go | 4 -- .../credentials/internal/suite_test.go | 4 -- pkg/contexts/credentials/internal/utils.go | 4 -- .../credentials/repositories/aliases/cache.go | 4 -- .../repositories/aliases/repo_test.go | 4 -- .../repositories/aliases/repository.go | 4 -- .../repositories/aliases/suite_test.go | 4 -- .../credentials/repositories/aliases/type.go | 4 -- .../repositories/directcreds/a_usage.go | 4 -- .../repositories/directcreds/credentials.go | 4 -- .../repositories/directcreds/repo_test.go | 4 -- .../repositories/directcreds/repository.go | 4 -- .../repositories/directcreds/suite_test.go | 4 -- .../repositories/directcreds/type.go | 4 -- .../repositories/dockerconfig/a_usage.go | 4 -- .../repositories/dockerconfig/cache.go | 4 -- .../repositories/dockerconfig/credentials.go | 4 -- .../repositories/dockerconfig/default.go | 4 -- .../repositories/dockerconfig/logging.go | 4 -- .../repositories/dockerconfig/provider.go | 4 -- .../repositories/dockerconfig/repo_test.go | 6 +-- .../repositories/dockerconfig/repository.go | 4 -- .../repositories/dockerconfig/suite_test.go | 4 -- .../repositories/dockerconfig/type.go | 4 -- .../repositories/gardenerconfig/cache.go | 4 -- .../gardenerconfig/cpi/interface.go | 4 -- .../gardenerconfig/credentials.go | 4 -- .../handler/container_registry/credentials.go | 4 -- .../handler/container_registry/handler.go | 4 -- .../gardenerconfig/identity/identity.go | 4 -- .../repositories/gardenerconfig/init.go | 4 -- .../repositories/gardenerconfig/repo_test.go | 4 -- .../repositories/gardenerconfig/repository.go | 4 -- .../repositories/gardenerconfig/suite_test.go | 4 -- .../repositories/gardenerconfig/type.go | 4 -- .../credentials/repositories/memory/cache.go | 4 -- .../repositories/memory/config/config_test.go | 4 -- .../repositories/memory/config/suite_test.go | 4 -- .../repositories/memory/config/type.go | 4 -- .../repositories/memory/repo_test.go | 4 -- .../repositories/memory/repository.go | 4 -- .../repositories/memory/suite_test.go | 4 -- .../credentials/repositories/memory/type.go | 4 -- .../credentials/repositories/vault/a_usage.go | 4 -- .../credentials/repositories/vault/auth.go | 4 -- .../credentials/repositories/vault/cache.go | 4 -- .../repositories/vault/identity/identity.go | 4 -- .../credentials/repositories/vault/logging.go | 4 -- .../credentials/repositories/vault/options.go | 4 -- .../repositories/vault/provider.go | 4 -- .../repositories/vault/repository.go | 4 -- .../repositories/vault/suite_test.go | 4 -- .../credentials/repositories/vault/type.go | 4 -- pkg/contexts/credentials/suite_test.go | 4 -- pkg/contexts/credentials/usage.go | 4 -- pkg/contexts/credentials/utils.go | 4 -- .../datacontext/action/api/action_test.go | 4 -- .../datacontext/action/api/interface.go | 4 -- .../datacontext/action/api/options.go | 4 -- .../datacontext/action/api/registry.go | 4 -- .../datacontext/action/api/registry_test.go | 4 -- .../datacontext/action/api/suite_test.go | 4 -- pkg/contexts/datacontext/action/api/utils.go | 4 -- .../datacontext/action/handlers/options.go | 4 -- .../datacontext/action/handlers/registry.go | 4 -- pkg/contexts/datacontext/action/type.go | 4 -- pkg/contexts/datacontext/attrs.go | 4 -- pkg/contexts/datacontext/attrs/init.go | 4 -- .../datacontext/attrs/logforward/attr.go | 4 -- .../datacontext/attrs/rootcertsattr/attr.go | 4 -- .../attrs/rootcertsattr/attr_test.go | 4 -- .../datacontext/attrs/rootcertsattr/config.go | 4 -- .../attrs/rootcertsattr/suite_test.go | 4 -- .../datacontext/attrs/vfsattr/attr.go | 4 -- pkg/contexts/datacontext/builder.go | 4 -- .../datacontext/config/attrs/config_test.go | 4 -- .../datacontext/config/attrs/suite_test.go | 4 -- pkg/contexts/datacontext/config/attrs/type.go | 4 -- pkg/contexts/datacontext/config/init.go | 4 -- .../datacontext/config/logging/config_test.go | 4 -- .../datacontext/config/logging/suite_test.go | 4 -- .../datacontext/config/logging/type.go | 4 -- pkg/contexts/datacontext/context.go | 4 -- pkg/contexts/datacontext/context_test.go | 4 -- pkg/contexts/datacontext/cpi.go | 4 -- pkg/contexts/datacontext/gc_test.go | 6 +-- pkg/contexts/datacontext/logging.go | 4 -- pkg/contexts/datacontext/session.go | 4 -- pkg/contexts/datacontext/setup.go | 4 -- pkg/contexts/datacontext/suite_test.go | 4 -- pkg/contexts/datacontext/util.go | 4 -- pkg/contexts/oci/action_test.go | 4 -- pkg/contexts/oci/actions/init.go | 4 -- .../actions/oci-repository-prepare/exec.go | 4 -- .../actions/oci-repository-prepare/type.go | 4 -- pkg/contexts/oci/annotations/annotations.go | 4 -- pkg/contexts/oci/art_test.go | 4 -- pkg/contexts/oci/artdesc/artifact.go | 4 -- pkg/contexts/oci/artdesc/config.go | 4 -- pkg/contexts/oci/artdesc/helper/generic.go | 4 -- pkg/contexts/oci/artdesc/index.go | 4 -- pkg/contexts/oci/artdesc/manifest.go | 4 -- pkg/contexts/oci/artdesc/suite_test.go | 4 -- pkg/contexts/oci/artdesc/utils.go | 4 -- pkg/contexts/oci/artdesc/utils_test.go | 4 -- pkg/contexts/oci/attrs/cacheattr/attr.go | 4 -- pkg/contexts/oci/attrs/cacheattr/attr_test.go | 4 -- .../oci/attrs/cacheattr/suite_test.go | 4 -- pkg/contexts/oci/attrs/init.go | 4 -- pkg/contexts/oci/builder.go | 4 -- pkg/contexts/oci/config/config_test.go | 4 -- pkg/contexts/oci/config/suite_test.go | 4 -- pkg/contexts/oci/config/type.go | 4 -- pkg/contexts/oci/cpi/interface.go | 4 -- pkg/contexts/oci/cpi/mod.go | 4 -- pkg/contexts/oci/cpi/repotypes.go | 4 -- pkg/contexts/oci/cpi/state.go | 4 -- pkg/contexts/oci/cpi/suite_test.go | 4 -- pkg/contexts/oci/cpi/support/artifact.go | 4 -- .../oci/cpi/support/artifactsetblobaccess.go | 4 -- pkg/contexts/oci/cpi/support/base.go | 4 -- pkg/contexts/oci/cpi/support/flavor_index.go | 4 -- .../oci/cpi/support/flavor_manifest.go | 4 -- pkg/contexts/oci/cpi/support/namespace.go | 4 -- pkg/contexts/oci/cpi/utils.go | 4 -- pkg/contexts/oci/cpi/utils_test.go | 4 -- pkg/contexts/oci/cpi/view.go | 4 -- pkg/contexts/oci/gc_test.go | 4 -- pkg/contexts/oci/grammar/grammar.go | 4 -- pkg/contexts/oci/grammar/grammar_test.go | 4 -- pkg/contexts/oci/identity/creds.go | 4 -- pkg/contexts/oci/init.go | 4 -- pkg/contexts/oci/interface.go | 4 -- pkg/contexts/oci/internal/builder.go | 4 -- pkg/contexts/oci/internal/builder_test.go | 4 -- pkg/contexts/oci/internal/context.go | 4 -- pkg/contexts/oci/internal/errors.go | 4 -- pkg/contexts/oci/internal/repository.go | 4 -- pkg/contexts/oci/internal/repotypes.go | 4 -- pkg/contexts/oci/internal/suite_test.go | 4 -- pkg/contexts/oci/internal/uniform.go | 4 -- pkg/contexts/oci/ociutils/handler.go | 4 -- pkg/contexts/oci/ociutils/helm/art_test.go | 4 -- pkg/contexts/oci/ociutils/helm/artifact.go | 4 -- pkg/contexts/oci/ociutils/helm/ignore/doc.go | 4 -- .../oci/ociutils/helm/ignore/rules.go | 4 -- .../oci/ociutils/helm/ignore/rules_test.go | 4 -- pkg/contexts/oci/ociutils/helm/suite_test.go | 4 -- .../oci/ociutils/helm/sympath/walk.go | 4 -- .../oci/ociutils/helm/sympath/walk_test.go | 4 -- pkg/contexts/oci/ociutils/info.go | 4 -- pkg/contexts/oci/ociutils/print.go | 4 -- pkg/contexts/oci/ref.go | 4 -- pkg/contexts/oci/ref_test.go | 4 -- .../repositories/artifactset/artifactset.go | 4 -- .../artifactset/artifactset_test.go | 4 -- .../oci/repositories/artifactset/error.go | 4 -- .../artifactset/filesystemaccess.go | 4 -- .../oci/repositories/artifactset/format.go | 4 -- .../oci/repositories/artifactset/options.go | 4 -- .../oci/repositories/artifactset/repo_test.go | 4 -- .../repositories/artifactset/repository.go | 4 -- .../oci/repositories/artifactset/state.go | 4 -- .../repositories/artifactset/suite_test.go | 4 -- .../artifactset/testhelper/formats.go | 4 -- .../oci/repositories/artifactset/type.go | 4 -- .../oci/repositories/artifactset/uniform.go | 4 -- .../artifactset/utils_synthesis.go | 4 -- pkg/contexts/oci/repositories/ctf/ctf_test.go | 4 -- pkg/contexts/oci/repositories/ctf/format.go | 4 -- .../oci/repositories/ctf/format/const.go | 4 -- .../oci/repositories/ctf/index/ctfindex.go | 4 -- .../oci/repositories/ctf/index/index.go | 4 -- .../oci/repositories/ctf/index/index_test.go | 4 -- .../oci/repositories/ctf/index/suite_test.go | 4 -- .../oci/repositories/ctf/namespace.go | 4 -- .../oci/repositories/ctf/repository.go | 4 -- pkg/contexts/oci/repositories/ctf/state.go | 4 -- .../oci/repositories/ctf/suite_test.go | 4 -- .../oci/repositories/ctf/synthesis_test.go | 4 -- .../oci/repositories/ctf/testhelper/fill.go | 4 -- pkg/contexts/oci/repositories/ctf/type.go | 4 -- pkg/contexts/oci/repositories/ctf/uniform.go | 4 -- .../oci/repositories/docker/artifact.go | 4 -- .../oci/repositories/docker/client.go | 4 -- .../oci/repositories/docker/convert.go | 4 -- pkg/contexts/oci/repositories/docker/type.go | 4 -- .../oci/repositories/docker/uniform.go | 4 -- pkg/contexts/oci/repositories/docker/utils.go | 4 -- .../oci/repositories/empty/repository.go | 4 -- pkg/contexts/oci/repositories/empty/type.go | 4 -- .../oci/repositories/empty/uniform.go | 4 -- pkg/contexts/oci/repositories/init.go | 4 -- pkg/contexts/oci/repositories/ocireg/blobs.go | 4 -- .../oci/repositories/ocireg/logging.go | 4 -- .../oci/repositories/ocireg/namespace.go | 4 -- .../oci/repositories/ocireg/repository.go | 4 -- pkg/contexts/oci/repositories/ocireg/type.go | 4 -- .../oci/repositories/ocireg/uniform.go | 4 -- pkg/contexts/oci/repositories/ocireg/utils.go | 4 -- pkg/contexts/oci/session.go | 4 -- pkg/contexts/oci/suite_test.go | 4 -- pkg/contexts/oci/testhelper/manifests.go | 4 -- pkg/contexts/oci/testhelper/oci.go | 4 -- pkg/contexts/oci/transfer/filters/filter.go | 4 -- pkg/contexts/oci/transfer/suite_test.go | 4 -- pkg/contexts/oci/transfer/transfer.go | 4 -- pkg/contexts/oci/transfer/transfer_test.go | 4 -- pkg/contexts/oci/utils.go | 4 -- .../ocm/accessmethods/compose/method.go | 4 -- pkg/contexts/ocm/accessmethods/github/cli.go | 4 -- .../ocm/accessmethods/github/method.go | 4 -- .../ocm/accessmethods/github/method_test.go | 8 +-- .../ocm/accessmethods/github/suite_test.go | 4 -- pkg/contexts/ocm/accessmethods/helm/cli.go | 4 -- pkg/contexts/ocm/accessmethods/helm/method.go | 4 -- .../ocm/accessmethods/helm/method_test.go | 4 -- .../ocm/accessmethods/helm/suite_test.go | 4 -- pkg/contexts/ocm/accessmethods/init.go | 4 -- .../ocm/accessmethods/localblob/cli.go | 4 -- .../ocm/accessmethods/localblob/method.go | 4 -- .../accessmethods/localblob/method_test.go | 4 -- .../ocm/accessmethods/localblob/suite_test.go | 4 -- .../ocm/accessmethods/localfsblob/method.go | 4 -- .../accessmethods/localfsblob/method_test.go | 4 -- .../accessmethods/localfsblob/suite_test.go | 4 -- .../ocm/accessmethods/localociblob/method.go | 4 -- .../accessmethods/localociblob/method_test.go | 4 -- .../accessmethods/localociblob/suite_test.go | 4 -- pkg/contexts/ocm/accessmethods/none/method.go | 4 -- pkg/contexts/ocm/accessmethods/npm/cli.go | 4 -- .../ocm/accessmethods/npm/method_test.go | 4 -- .../ocm/accessmethods/npm/suite_test.go | 4 -- .../ocm/accessmethods/ociartifact/cli.go | 4 -- .../ocm/accessmethods/ociartifact/logging.go | 4 -- .../ocm/accessmethods/ociartifact/method.go | 4 -- .../accessmethods/ociartifact/method_test.go | 4 -- .../accessmethods/ociartifact/suite_test.go | 4 -- .../ocm/accessmethods/ociartifact/utils.go | 4 -- pkg/contexts/ocm/accessmethods/ociblob/cli.go | 4 -- .../ocm/accessmethods/ociblob/method.go | 4 -- .../ocm/accessmethods/ociblob/method_test.go | 4 -- .../ocm/accessmethods/ociblob/suite_test.go | 4 -- pkg/contexts/ocm/accessmethods/options/doc.go | 4 -- .../ocm/accessmethods/options/init.go | 4 -- .../ocm/accessmethods/options/registry.go | 4 -- .../accessmethods/options/registry_test.go | 4 -- .../ocm/accessmethods/options/standard.go | 4 -- .../ocm/accessmethods/options/suite_test.go | 4 -- .../ocm/accessmethods/options/types.go | 4 -- .../ocm/accessmethods/plugin/cmd_test.go | 4 -- pkg/contexts/ocm/accessmethods/plugin/doc.go | 4 -- .../ocm/accessmethods/plugin/method.go | 4 -- .../ocm/accessmethods/plugin/method_test.go | 4 -- .../ocm/accessmethods/plugin/plugin.go | 4 -- .../ocm/accessmethods/plugin/suite_test.go | 4 -- .../ocm/accessmethods/plugin/testdata/test | 4 -- pkg/contexts/ocm/accessmethods/plugin/type.go | 4 -- .../accessmethods/relativeociref/method.go | 4 -- .../relativeociref/method_test.go | 4 -- .../relativeociref/suite_test.go | 4 -- .../relativeociref/transfer_test.go | 4 -- pkg/contexts/ocm/accessmethods/s3/cli.go | 4 -- .../ocm/accessmethods/s3/identity/identity.go | 4 -- .../ocm/accessmethods/s3/ifce_test.go | 4 -- pkg/contexts/ocm/accessmethods/s3/method.go | 4 -- .../ocm/accessmethods/s3/method_test.go | 9 ++-- .../ocm/accessmethods/s3/suite_test.go | 4 -- pkg/contexts/ocm/accessmethods/s3/v1.go | 4 -- pkg/contexts/ocm/accessmethods/s3/v2.go | 4 -- pkg/contexts/ocm/accessmethods/wget/cli.go | 4 -- .../ocm/accessmethods/wget/logging.go | 4 -- pkg/contexts/ocm/accessmethods/wget/method.go | 4 -- .../ocm/accessmethods/wget/method_test.go | 4 -- .../ocm/accessmethods/wget/options.go | 4 -- .../ocm/accessmethods/wget/suite_test.go | 4 -- pkg/contexts/ocm/actionhandler/init.go | 4 -- .../ocm/actionhandler/plugin/action_test.go | 4 -- .../ocm/actionhandler/plugin/actionhandler.go | 4 -- .../ocm/actionhandler/plugin/registration.go | 4 -- .../ocm/actionhandler/plugin/suite_test.go | 4 -- .../ocm/actionhandler/plugin/testdata/action | 4 -- pkg/contexts/ocm/attrs/compatattr/attr.go | 4 -- .../ocm/attrs/compatattr/attr_test.go | 4 -- .../ocm/attrs/compatattr/suite_test.go | 4 -- .../ocm/attrs/compositionmodeattr/attr.go | 4 -- .../attrs/compositionmodeattr/attr_test.go | 4 -- .../attrs/compositionmodeattr/suite_test.go | 4 -- pkg/contexts/ocm/attrs/hashattr/attr.go | 4 -- pkg/contexts/ocm/attrs/hashattr/attr_test.go | 4 -- pkg/contexts/ocm/attrs/hashattr/config.go | 4 -- pkg/contexts/ocm/attrs/hashattr/suite_test.go | 4 -- pkg/contexts/ocm/attrs/init.go | 4 -- pkg/contexts/ocm/attrs/keepblobattr/attr.go | 4 -- .../ocm/attrs/keepblobattr/attr_test.go | 4 -- .../ocm/attrs/keepblobattr/suite_test.go | 4 -- pkg/contexts/ocm/attrs/mapocirepoattr/attr.go | 4 -- .../ocm/attrs/mapocirepoattr/attr_test.go | 4 -- .../ocm/attrs/mapocirepoattr/suite_test.go | 4 -- pkg/contexts/ocm/attrs/ociuploadattr/attr.go | 4 -- .../ocm/attrs/ociuploadattr/attr_test.go | 4 -- .../ocm/attrs/ociuploadattr/suite_test.go | 4 -- .../ocm/attrs/plugincacheattr/attr.go | 4 -- .../ocm/attrs/plugindirattr/attr_test.go | 4 -- .../ocm/attrs/plugindirattr/suite_test.go | 4 -- pkg/contexts/ocm/attrs/signingattr/attr.go | 4 -- .../ocm/attrs/signingattr/attr_test.go | 4 -- pkg/contexts/ocm/attrs/signingattr/config.go | 4 -- pkg/contexts/ocm/attrs/signingattr/setup.go | 4 -- .../ocm/attrs/signingattr/suite_test.go | 4 -- pkg/contexts/ocm/bind_test.go | 4 -- pkg/contexts/ocm/blobhandler/config/type.go | 4 -- pkg/contexts/ocm/blobhandler/doc.go | 4 -- .../handlers/generic/npm/publish_test.go | 4 -- .../handlers/generic/npm/registration.go | 4 -- .../handlers/generic/npm/registration_test.go | 4 -- .../handlers/generic/npm/suite_test.go | 4 -- .../handlers/generic/ocirepo/blobhandler.go | 4 -- .../handlers/generic/ocirepo/registration.go | 4 -- .../handlers/generic/ocirepo/suite_test.go | 4 -- .../handlers/generic/ocirepo/upload_test.go | 4 -- .../handlers/generic/plugin/blobhandler.go | 4 -- .../handlers/generic/plugin/registration.go | 4 -- .../handlers/generic/plugin/suite_test.go | 4 -- .../handlers/generic/plugin/testdata/test | 4 -- .../handlers/generic/plugin/upload_test.go | 4 -- pkg/contexts/ocm/blobhandler/handlers/init.go | 4 -- .../ocm/blobhandler/handlers/oci/ctx.go | 4 -- .../ocm/blobhandler/handlers/oci/doc.go | 4 -- .../handlers/oci/ocirepo/blobhandler.go | 4 -- .../handlers/oci/ocirepo/handler_test.go | 4 -- .../handlers/oci/ocirepo/suite_test.go | 4 -- .../handlers/ocm/comparch/blobhandler.go | 4 -- .../handlers/ocm/comparch/blobhandler_test.go | 4 -- .../handlers/ocm/comparch/suite_test.go | 4 -- .../ocm/blobhandler/handlers/ocm/ctx.go | 4 -- .../ocm/blobhandler/handlers/ocm/doc.go | 4 -- pkg/contexts/ocm/blobhandler/interface.go | 4 -- pkg/contexts/ocm/blobhandler/registration.go | 4 -- pkg/contexts/ocm/builder.go | 4 -- pkg/contexts/ocm/compdesc/codecs.go | 4 -- pkg/contexts/ocm/compdesc/compdesc_test.go | 4 -- .../ocm/compdesc/componentdescriptor.go | 4 -- pkg/contexts/ocm/compdesc/copy_test.go | 4 -- pkg/contexts/ocm/compdesc/default.go | 4 -- pkg/contexts/ocm/compdesc/equal.go | 4 -- pkg/contexts/ocm/compdesc/equal_test.go | 4 -- pkg/contexts/ocm/compdesc/equivalent/equal.go | 4 -- .../compdesc/equivalent/testhelper/helper.go | 4 -- pkg/contexts/ocm/compdesc/helper.go | 4 -- pkg/contexts/ocm/compdesc/helper_test.go | 4 -- pkg/contexts/ocm/compdesc/init.go | 4 -- pkg/contexts/ocm/compdesc/logging.go | 4 -- pkg/contexts/ocm/compdesc/logging_test.go | 4 -- pkg/contexts/ocm/compdesc/meta.go | 4 -- pkg/contexts/ocm/compdesc/meta/v1/identity.go | 4 -- .../ocm/compdesc/meta/v1/identity_test.go | 4 -- pkg/contexts/ocm/compdesc/meta/v1/labels.go | 4 -- .../ocm/compdesc/meta/v1/labels_test.go | 4 -- .../ocm/compdesc/meta/v1/resourceref.go | 4 -- .../ocm/compdesc/meta/v1/signature.go | 4 -- .../ocm/compdesc/meta/v1/stringmap.go | 4 -- .../ocm/compdesc/meta/v1/suite_test.go | 4 -- pkg/contexts/ocm/compdesc/meta/v1/types.go | 4 -- .../ocm/compdesc/meta/v1/types_test.go | 4 -- pkg/contexts/ocm/compdesc/meta/v1/utils.go | 4 -- .../compdesc/meta/v1/zz_generated.deepcopy.go | 4 -- pkg/contexts/ocm/compdesc/none.go | 4 -- pkg/contexts/ocm/compdesc/norm_test.go | 4 -- pkg/contexts/ocm/compdesc/normalization.go | 4 -- .../ocm/compdesc/normalizations/init.go | 4 -- .../compdesc/normalizations/jsonv1/norm.go | 4 -- .../compdesc/normalizations/jsonv2/norm.go | 4 -- .../normalizations/rules/compdescrules.go | 4 -- pkg/contexts/ocm/compdesc/op.go | 4 -- pkg/contexts/ocm/compdesc/schemes.go | 4 -- pkg/contexts/ocm/compdesc/selectors.go | 4 -- pkg/contexts/ocm/compdesc/signing.go | 4 -- pkg/contexts/ocm/compdesc/suite_test.go | 4 -- .../ocm/compdesc/testutils/compnametest.go | 4 -- pkg/contexts/ocm/compdesc/util.go | 4 -- pkg/contexts/ocm/compdesc/versions/init.go | 4 -- .../v3alpha1/componentdescriptor.go | 4 -- .../versions/ocm.software/v3alpha1/default.go | 4 -- .../v3alpha1/jsonscheme/jsonscheme.go | 4 -- .../versions/ocm.software/v3alpha1/signing.go | 4 -- .../ocm.software/v3alpha1/validation.go | 4 -- .../ocm.software/v3alpha1/validation_test.go | 4 -- .../versions/ocm.software/v3alpha1/version.go | 4 -- .../v3alpha1/zz_generated.deepcopy.go | 4 -- .../versions/v2/componentdescriptor.go | 4 -- .../ocm/compdesc/versions/v2/default.go | 4 -- .../versions/v2/jsonscheme/jsonscheme.go | 4 -- .../ocm/compdesc/versions/v2/signing.go | 4 -- .../ocm/compdesc/versions/v2/validation.go | 4 -- .../compdesc/versions/v2/validation_test.go | 4 -- .../ocm/compdesc/versions/v2/version.go | 4 -- .../versions/v2/zz_generated.deepcopy.go | 4 -- pkg/contexts/ocm/config/config_test.go | 4 -- pkg/contexts/ocm/config/suite_test.go | 4 -- pkg/contexts/ocm/config/type.go | 4 -- pkg/contexts/ocm/consts/extra_identities.go | 4 -- pkg/contexts/ocm/context/interface.go | 4 -- .../ocm/cpi/accspeccpi/accessspec_options.go | 4 -- .../ocm/cpi/accspeccpi/accesstypes.go | 4 -- pkg/contexts/ocm/cpi/accspeccpi/interface.go | 4 -- pkg/contexts/ocm/cpi/accspeccpi/method.go | 4 -- pkg/contexts/ocm/cpi/accspeccpi/methodview.go | 4 -- pkg/contexts/ocm/cpi/compose_test.go | 4 -- pkg/contexts/ocm/cpi/dummy.go | 4 -- pkg/contexts/ocm/cpi/interface.go | 4 -- pkg/contexts/ocm/cpi/logging.go | 4 -- pkg/contexts/ocm/cpi/modopts.go | 4 -- pkg/contexts/ocm/cpi/ref.go | 4 -- pkg/contexts/ocm/cpi/repocpi/backend.go | 4 -- pkg/contexts/ocm/cpi/repocpi/blobcache.go | 4 -- pkg/contexts/ocm/cpi/repocpi/bridge_c.go | 4 -- pkg/contexts/ocm/cpi/repocpi/bridge_cv.go | 4 -- pkg/contexts/ocm/cpi/repocpi/bridge_r.go | 4 -- pkg/contexts/ocm/cpi/repocpi/doc.go | 4 -- .../ocm/cpi/repocpi/helperinterfaces.go | 4 -- pkg/contexts/ocm/cpi/repocpi/view_c.go | 4 -- pkg/contexts/ocm/cpi/repocpi/view_cv.go | 4 -- pkg/contexts/ocm/cpi/repocpi/view_r.go | 4 -- pkg/contexts/ocm/cpi/repotypes.go | 4 -- pkg/contexts/ocm/cpi/storagectx.go | 4 -- pkg/contexts/ocm/cpi/suite_test.go | 4 -- pkg/contexts/ocm/cpi/utils.go | 4 -- pkg/contexts/ocm/cpi/view_rsc.go | 4 -- .../digester/digesters/artifact/digester.go | 4 -- .../ocm/digester/digesters/blob/digester.go | 4 -- pkg/contexts/ocm/digester/digesters/init.go | 4 -- pkg/contexts/ocm/download/config/type.go | 4 -- pkg/contexts/ocm/download/doc.go | 4 -- pkg/contexts/ocm/download/download.go | 4 -- .../ocm/download/handlers/blob/handler.go | 4 -- .../handlers/blueprint/blueprint_test.go | 4 -- .../download/handlers/blueprint/extractor.go | 4 -- .../download/handlers/blueprint/handler.go | 4 -- .../handlers/blueprint/registration.go | 3 -- .../handlers/blueprint/registration_test.go | 4 -- .../download/handlers/blueprint/suite_test.go | 4 -- .../download/handlers/dirtree/dirtree_test.go | 4 -- .../ocm/download/handlers/dirtree/handler.go | 4 -- .../download/handlers/dirtree/registration.go | 4 -- .../handlers/dirtree/registration_test.go | 4 -- .../download/handlers/dirtree/suite_test.go | 4 -- .../download/handlers/executable/handler.go | 4 -- .../ocm/download/handlers/helm/download.go | 4 -- .../ocm/download/handlers/helm/handler.go | 4 -- pkg/contexts/ocm/download/handlers/init.go | 4 -- .../ocm/download/handlers/ocirepo/handler.go | 4 -- .../download/handlers/ocirepo/registration.go | 4 -- .../download/handlers/ocirepo/suite_test.go | 4 -- .../download/handlers/ocirepo/upload_test.go | 4 -- .../download/handlers/plugin/download_test.go | 4 -- .../ocm/download/handlers/plugin/handler.go | 4 -- .../download/handlers/plugin/registration.go | 4 -- .../download/handlers/plugin/suite_test.go | 4 -- .../download/handlers/plugin/testdata/test | 4 -- pkg/contexts/ocm/download/logging.go | 4 -- pkg/contexts/ocm/download/registration.go | 4 -- pkg/contexts/ocm/download/registry.go | 4 -- pkg/contexts/ocm/download/setup.go | 4 -- .../ocm/elements/artifactaccess/doc.go | 4 -- .../artifactaccess/genericaccess/resource.go | 4 -- .../genericaccess/resource_test.go | 4 -- .../genericaccess/suite_test.go | 4 -- .../artifactaccess/githubaccess/options.go | 4 -- .../artifactaccess/githubaccess/resource.go | 4 -- .../artifactaccess/helmaccess/resource.go | 4 -- .../artifactaccess/npmaccess/resource.go | 4 -- .../ociartifactaccess/resource.go | 4 -- .../artifactaccess/ociblobaccess/options.go | 4 -- .../artifactaccess/ociblobaccess/resource.go | 4 -- .../artifactaccess/s3access/options.go | 4 -- .../artifactaccess/s3access/resource.go | 4 -- .../artifactaccess/wgetaccess/options.go | 4 -- .../artifactaccess/wgetaccess/resource.go | 4 -- .../ocm/elements/artifactblob/api/options.go | 4 -- .../elements/artifactblob/datablob/options.go | 4 -- .../artifactblob/datablob/resource.go | 4 -- .../artifactblob/dirtreeblob/options.go | 4 -- .../artifactblob/dirtreeblob/resource.go | 4 -- .../artifactblob/dirtreeblob/resource_test.go | 4 -- .../artifactblob/dirtreeblob/suite_test.go | 4 -- pkg/contexts/ocm/elements/artifactblob/doc.go | 4 -- .../artifactblob/dockerdaemonblob/options.go | 4 -- .../artifactblob/dockerdaemonblob/resource.go | 4 -- .../artifactblob/dockermultiblob/options.go | 4 -- .../artifactblob/dockermultiblob/resource.go | 4 -- .../elements/artifactblob/externalblob/doc.go | 4 -- .../artifactblob/externalblob/options.go | 4 -- .../artifactblob/externalblob/resource.go | 4 -- .../elements/artifactblob/fileblob/options.go | 4 -- .../artifactblob/fileblob/resource.go | 4 -- .../artifactblob/genericblob/options.go | 4 -- .../artifactblob/genericblob/resource.go | 4 -- .../elements/artifactblob/helmblob/options.go | 4 -- .../artifactblob/helmblob/resource.go | 4 -- .../artifactblob/ociartifactblob/options.go | 4 -- .../artifactblob/ociartifactblob/resource.go | 4 -- .../elements/artifactblob/textblob/options.go | 4 -- .../artifactblob/textblob/resource.go | 4 -- .../elements/artifactblob/wgetblob/options.go | 4 -- .../artifactblob/wgetblob/resource.go | 4 -- pkg/contexts/ocm/elements/artifacts.go | 4 -- pkg/contexts/ocm/elements/common.go | 4 -- pkg/contexts/ocm/elements/digests.go | 4 -- pkg/contexts/ocm/elements/doc.go | 4 -- pkg/contexts/ocm/elements/references.go | 4 -- pkg/contexts/ocm/elements/resources.go | 4 -- pkg/contexts/ocm/elements/resources_test.go | 4 -- pkg/contexts/ocm/elements/sources.go | 4 -- pkg/contexts/ocm/elements/suite_test.go | 4 -- pkg/contexts/ocm/extraid/extra_identities.go | 4 -- pkg/contexts/ocm/gc_test.go | 4 -- pkg/contexts/ocm/grammar/grammar.go | 4 -- pkg/contexts/ocm/grammar/grammar_test.go | 4 -- pkg/contexts/ocm/init.go | 4 -- pkg/contexts/ocm/interface.go | 4 -- pkg/contexts/ocm/internal/accessspecref.go | 4 -- pkg/contexts/ocm/internal/accesstypes.go | 4 -- pkg/contexts/ocm/internal/blobhandler.go | 4 -- pkg/contexts/ocm/internal/blobhandler_test.go | 4 -- pkg/contexts/ocm/internal/builder.go | 4 -- pkg/contexts/ocm/internal/builder_test.go | 4 -- pkg/contexts/ocm/internal/context.go | 4 -- pkg/contexts/ocm/internal/delegation.go | 4 -- pkg/contexts/ocm/internal/digesthandler.go | 4 -- .../ocm/internal/digesthandler_test.go | 4 -- pkg/contexts/ocm/internal/errors.go | 4 -- pkg/contexts/ocm/internal/hasher.go | 4 -- pkg/contexts/ocm/internal/modopts.go | 4 -- pkg/contexts/ocm/internal/repository.go | 4 -- pkg/contexts/ocm/internal/repotypes.go | 4 -- pkg/contexts/ocm/internal/resolver.go | 4 -- pkg/contexts/ocm/internal/suite_test.go | 4 -- pkg/contexts/ocm/internal/uniform.go | 4 -- pkg/contexts/ocm/internal/uniform_test.go | 4 -- pkg/contexts/ocm/labels/init.go | 4 -- pkg/contexts/ocm/labels/routingslip/entry.go | 4 -- .../ocm/labels/routingslip/entrytypes_test.go | 4 -- pkg/contexts/ocm/labels/routingslip/init.go | 4 -- .../ocm/labels/routingslip/interface.go | 4 -- .../ocm/labels/routingslip/internal/attr.go | 4 -- .../labels/routingslip/internal/entrytypes.go | 4 -- pkg/contexts/ocm/labels/routingslip/label.go | 4 -- pkg/contexts/ocm/labels/routingslip/slip.go | 4 -- .../ocm/labels/routingslip/slip_test.go | 4 -- .../routingslip/spi/entrytype_options.go | 4 -- .../ocm/labels/routingslip/spi/interface.go | 4 -- .../ocm/labels/routingslip/spi/support.go | 4 -- .../ocm/labels/routingslip/suite_test.go | 4 -- .../ocm/labels/routingslip/transfer_test.go | 4 -- .../labels/routingslip/types/comment/cli.go | 4 -- .../labels/routingslip/types/comment/entry.go | 4 -- .../ocm/labels/routingslip/types/init.go | 4 -- .../routingslip/types/plugin/cmd_test.go | 11 ++-- .../labels/routingslip/types/plugin/doc.go | 4 -- .../labels/routingslip/types/plugin/entry.go | 4 -- .../routingslip/types/plugin/entry_test.go | 6 +-- .../labels/routingslip/types/plugin/plugin.go | 4 -- .../routingslip/types/plugin/suite_test.go | 4 -- .../routingslip/types/plugin/testdata/test | 4 -- .../labels/routingslip/types/plugin/type.go | 4 -- pkg/contexts/ocm/labels/routingslip/usage.go | 4 -- pkg/contexts/ocm/modopts.go | 4 -- pkg/contexts/ocm/plugin/cache/dircache.go | 4 -- pkg/contexts/ocm/plugin/cache/doc.go | 4 -- pkg/contexts/ocm/plugin/cache/exec.go | 4 -- pkg/contexts/ocm/plugin/cache/plugin.go | 4 -- pkg/contexts/ocm/plugin/cache/plugindir.go | 4 -- pkg/contexts/ocm/plugin/cache/registry.go | 4 -- pkg/contexts/ocm/plugin/cache/updater.go | 4 -- pkg/contexts/ocm/plugin/common/common.go | 4 -- pkg/contexts/ocm/plugin/common/describe.go | 4 -- pkg/contexts/ocm/plugin/config/type.go | 4 -- pkg/contexts/ocm/plugin/descriptor/const.go | 4 -- .../ocm/plugin/descriptor/descriptor.go | 4 -- pkg/contexts/ocm/plugin/descriptor/doc.go | 4 -- pkg/contexts/ocm/plugin/descriptor/keys.go | 4 -- .../ocm/plugin/descriptor/suite_test.go | 4 -- pkg/contexts/ocm/plugin/descriptor/utils.go | 4 -- .../ocm/plugin/descriptor/utils_test.go | 4 -- pkg/contexts/ocm/plugin/doc.go | 4 -- pkg/contexts/ocm/plugin/interface.go | 4 -- pkg/contexts/ocm/plugin/internal/access.go | 4 -- pkg/contexts/ocm/plugin/internal/action.go | 4 -- pkg/contexts/ocm/plugin/internal/upload.go | 4 -- pkg/contexts/ocm/plugin/internal/valueset.go | 4 -- pkg/contexts/ocm/plugin/plugin.go | 4 -- pkg/contexts/ocm/plugin/plugin_test.go | 4 -- pkg/contexts/ocm/plugin/plugins/plugins.go | 4 -- .../ocm/plugin/ppi/cmds/accessmethod/cmd.go | 4 -- .../ppi/cmds/accessmethod/compose/cmd.go | 4 -- .../plugin/ppi/cmds/accessmethod/get/cmd.go | 4 -- .../ppi/cmds/accessmethod/identity/cmd.go | 4 -- .../ppi/cmds/accessmethod/validate/cmd.go | 4 -- .../ocm/plugin/ppi/cmds/action/cmd.go | 4 -- .../ocm/plugin/ppi/cmds/action/execute/cmd.go | 4 -- pkg/contexts/ocm/plugin/ppi/cmds/app.go | 4 -- .../ocm/plugin/ppi/cmds/common/const.go | 4 -- pkg/contexts/ocm/plugin/ppi/cmds/desc.go | 4 -- .../ocm/plugin/ppi/cmds/describe/cmd.go | 4 -- .../ocm/plugin/ppi/cmds/doc/generate.go | 4 -- .../ocm/plugin/ppi/cmds/download/cmd.go | 4 -- pkg/contexts/ocm/plugin/ppi/cmds/info/cmd.go | 4 -- .../ocm/plugin/ppi/cmds/mergehandler/cmd.go | 4 -- .../ppi/cmds/mergehandler/execute/cmd.go | 4 -- .../ppi/cmds/topics/descriptor/topic.go | 4 -- .../ocm/plugin/ppi/cmds/upload/cmd.go | 4 -- .../ocm/plugin/ppi/cmds/upload/put/cmd.go | 4 -- .../plugin/ppi/cmds/upload/validate/cmd.go | 4 -- .../ocm/plugin/ppi/cmds/valueset/cmd.go | 4 -- .../plugin/ppi/cmds/valueset/compose/cmd.go | 4 -- .../plugin/ppi/cmds/valueset/validate/cmd.go | 4 -- pkg/contexts/ocm/plugin/ppi/doc.go | 4 -- pkg/contexts/ocm/plugin/ppi/interface.go | 4 -- pkg/contexts/ocm/plugin/ppi/options.go | 4 -- pkg/contexts/ocm/plugin/ppi/plugin.go | 4 -- pkg/contexts/ocm/plugin/ppi/utils.go | 4 -- pkg/contexts/ocm/plugin/suite_test.go | 4 -- pkg/contexts/ocm/plugin/testdata/action | 4 -- pkg/contexts/ocm/plugin/testdata/identity | 4 -- pkg/contexts/ocm/plugin/testdata/merge | 4 -- pkg/contexts/ocm/plugin/testdata/test | 4 -- pkg/contexts/ocm/plugin/utils.go | 4 -- pkg/contexts/ocm/ref.go | 4 -- pkg/contexts/ocm/ref_test.go | 4 -- pkg/contexts/ocm/registration/logging.go | 4 -- pkg/contexts/ocm/registration/registration.go | 4 -- pkg/contexts/ocm/repo_test.go | 4 -- .../comparch/accessmethod_localfs.go | 4 -- .../comparch/accessmethod_test.go | 4 -- .../repositories/comparch/comparch_test.go | 4 -- .../repositories/comparch/componentarchive.go | 4 -- .../ocm/repositories/comparch/format.go | 4 -- .../ocm/repositories/comparch/repository.go | 4 -- .../ocm/repositories/comparch/state.go | 4 -- .../ocm/repositories/comparch/suite_test.go | 4 -- .../testdata/common/component-descriptor.yaml | 4 -- .../directory/component-descriptor.yaml | 4 -- .../ocm/repositories/comparch/type.go | 4 -- .../ocm/repositories/comparch/uniform.go | 4 -- .../ocm/repositories/composition/cache.go | 4 -- .../repositories/composition/close_test.go | 4 -- .../ocm/repositories/composition/gc_test.go | 4 -- .../repositories/composition/repository.go | 4 -- .../composition/repository_test.go | 8 +-- .../repositories/composition/suite_test.go | 4 -- .../ocm/repositories/composition/type.go | 4 -- .../ocm/repositories/composition/version.go | 4 -- .../repositories/composition/version_test.go | 4 -- pkg/contexts/ocm/repositories/ctf/ctf_test.go | 4 -- pkg/contexts/ocm/repositories/ctf/format.go | 4 -- .../ocm/repositories/ctf/repo_test.go | 12 ++--- .../ocm/repositories/ctf/suite_test.go | 4 -- pkg/contexts/ocm/repositories/ctf/type.go | 4 -- pkg/contexts/ocm/repositories/ctf/uniform.go | 4 -- .../genericocireg/accessmethod_localblob.go | 4 -- .../accessmethod_localoclblob.go | 4 -- .../componentmapping/constants.go | 4 -- .../repositories/genericocireg/cred_test.go | 4 -- .../repositories/genericocireg/excludes.go | 4 -- .../genericocireg/fallback_test.go | 4 -- .../ocm/repositories/genericocireg/info.go | 4 -- .../ocm/repositories/genericocireg/logging.go | 4 -- .../repositories/genericocireg/repo_test.go | 7 +-- .../repositories/genericocireg/repository.go | 4 -- .../repositories/genericocireg/semver_test.go | 4 -- .../repositories/genericocireg/spec_test.go | 4 -- .../repositories/genericocireg/specnorm.go | 4 -- .../ocm/repositories/genericocireg/state.go | 4 -- .../repositories/genericocireg/suite_test.go | 4 -- .../ocm/repositories/genericocireg/type.go | 4 -- .../ocm/repositories/genericocireg/uniform.go | 4 -- pkg/contexts/ocm/repositories/init.go | 4 -- .../ocm/repositories/ocireg/specnorm.go | 4 -- .../ocm/repositories/ocireg/specnorm_test.go | 4 -- .../ocm/repositories/ocireg/suite_test.go | 4 -- pkg/contexts/ocm/repositories/ocireg/type.go | 4 -- .../ocm/repositories/virtual/access.go | 4 -- .../virtual/accessmethod_localblob.go | 4 -- .../ocm/repositories/virtual/component.go | 4 -- .../repositories/virtual/componentversion.go | 4 -- .../ocm/repositories/virtual/example/doc.go | 4 -- .../repositories/virtual/example/example.go | 4 -- .../ocm/repositories/virtual/index.go | 4 -- .../ocm/repositories/virtual/repo_test.go | 4 -- .../ocm/repositories/virtual/repository.go | 4 -- .../ocm/repositories/virtual/suite_test.go | 4 -- .../virtual/testdata/descriptors/cd1.yaml | 4 -- .../virtual/testdata/descriptors/cd2.yaml | 4 -- pkg/contexts/ocm/repositories/virtual/type.go | 4 -- pkg/contexts/ocm/resolver.go | 4 -- pkg/contexts/ocm/resolver_test.go | 4 -- pkg/contexts/ocm/resourcetypes/const.go | 4 -- pkg/contexts/ocm/session.go | 4 -- pkg/contexts/ocm/session_test.go | 4 -- pkg/contexts/ocm/signing/convenience.go | 4 -- pkg/contexts/ocm/signing/digestctx.go | 4 -- pkg/contexts/ocm/signing/handle.go | 4 -- pkg/contexts/ocm/signing/handler_test.go | 4 -- pkg/contexts/ocm/signing/options.go | 4 -- pkg/contexts/ocm/signing/options_test.go | 4 -- pkg/contexts/ocm/signing/signing_test.go | 4 -- pkg/contexts/ocm/signing/suite_test.go | 4 -- pkg/contexts/ocm/signing/transport_test.go | 4 -- pkg/contexts/ocm/suite_test.go | 4 -- pkg/contexts/ocm/testhelper/references.go | 4 -- pkg/contexts/ocm/testhelper/refmgmt.go | 4 -- pkg/contexts/ocm/testhelper/resources.go | 4 -- pkg/contexts/ocm/transfer/autohandler.go | 4 -- pkg/contexts/ocm/transfer/autohandler_test.go | 4 -- pkg/contexts/ocm/transfer/convenience.go | 4 -- pkg/contexts/ocm/transfer/debug.go | 4 -- pkg/contexts/ocm/transfer/init.go | 4 -- pkg/contexts/ocm/transfer/internal/merge.go | 4 -- pkg/contexts/ocm/transfer/logging.go | 4 -- pkg/contexts/ocm/transfer/merge_test.go | 4 -- pkg/contexts/ocm/transfer/needs.go | 4 -- pkg/contexts/ocm/transfer/options.go | 4 -- pkg/contexts/ocm/transfer/suite_test.go | 4 -- pkg/contexts/ocm/transfer/transfer.go | 4 -- .../transfer/transferhandler/config/config.go | 4 -- .../ocm/transfer/transferhandler/doc.go | 4 -- .../ocm/transfer/transferhandler/registry.go | 4 -- .../transfer/transferhandler/spiff/handler.go | 4 -- .../transferhandler/spiff/handler_test.go | 4 -- .../transfer/transferhandler/spiff/options.go | 4 -- .../transferhandler/spiff/suite_test.go | 4 -- .../transferhandler/standard/handler.go | 4 -- .../transferhandler/standard/handler_test.go | 4 -- .../transferhandler/standard/options.go | 4 -- .../transferhandler/standard/suite_test.go | 4 -- .../transferhandler/standard/utils.go | 4 -- .../transferhandler/standard/utils_test.go | 4 -- .../transferhandler/transferhandler.go | 4 -- pkg/contexts/ocm/transfer/transferrepo.go | 4 -- pkg/contexts/ocm/usage.go | 4 -- pkg/contexts/ocm/utils.go | 4 -- pkg/contexts/ocm/utils/check/check.go | 4 -- pkg/contexts/ocm/utils/check/check_test.go | 4 -- pkg/contexts/ocm/utils/check/options.go | 4 -- pkg/contexts/ocm/utils/check/suite_test.go | 4 -- .../utils/defaultconfigregistry/configure.go | 4 -- pkg/contexts/ocm/utils/localize/config.go | 4 -- .../ocm/utils/localize/config_test.go | 4 -- pkg/contexts/ocm/utils/localize/format.go | 4 -- .../ocm/utils/localize/instantiate.go | 4 -- .../ocm/utils/localize/instantiate_test.go | 4 -- pkg/contexts/ocm/utils/localize/localize.go | 4 -- .../ocm/utils/localize/localize_test.go | 4 -- pkg/contexts/ocm/utils/localize/subst.go | 4 -- pkg/contexts/ocm/utils/localize/subst_test.go | 4 -- pkg/contexts/ocm/utils/localize/suite_test.go | 4 -- .../ocm/utils/localize/target_test.go | 4 -- pkg/contexts/ocm/utils/localize/utils_test.go | 4 -- pkg/contexts/ocm/utils/registry/registry.go | 4 -- .../ocm/utils/registry/registry_test.go | 4 -- pkg/contexts/ocm/utils/registry/regkey.go | 4 -- pkg/contexts/ocm/utils/registry/suite_test.go | 4 -- pkg/contexts/ocm/utils/resource.go | 4 -- pkg/contexts/ocm/utils/resourceref.go | 4 -- pkg/contexts/ocm/utils/resourceref_test.go | 4 -- pkg/contexts/ocm/utils/suite_test.go | 4 -- pkg/contexts/ocm/utils/utils.go | 4 -- pkg/contexts/ocm/utils/walk.go | 4 -- .../valuemergehandler/config/config_test.go | 4 -- .../valuemergehandler/config/suite_test.go | 4 -- .../ocm/valuemergehandler/config/type.go | 4 -- .../handlers/defaultmerge/config.go | 4 -- .../handlers/defaultmerge/handler.go | 4 -- .../handlers/defaultmerge/handler_test.go | 4 -- .../handlers/defaultmerge/suite_test.go | 4 -- .../ocm/valuemergehandler/handlers/init.go | 4 -- .../handlers/maplistmerge/config.go | 4 -- .../handlers/maplistmerge/handler.go | 4 -- .../handlers/maplistmerge/handler_test.go | 4 -- .../handlers/maplistmerge/suite_test.go | 4 -- .../handlers/plugin/config.go | 4 -- .../handlers/plugin/handler.go | 4 -- .../handlers/plugin/handler_test.go | 4 -- .../handlers/plugin/suite_test.go | 4 -- .../handlers/plugin/testdata/merge | 4 -- .../handlers/simplelistmerge/config.go | 4 -- .../handlers/simplelistmerge/handler.go | 4 -- .../handlers/simplelistmerge/handler_test.go | 4 -- .../handlers/simplelistmerge/suite_test.go | 4 -- .../handlers/simplemapmerge/config.go | 4 -- .../handlers/simplemapmerge/handler.go | 4 -- .../handlers/simplemapmerge/handler_test.go | 4 -- .../handlers/simplemapmerge/suite_test.go | 4 -- .../ocm/valuemergehandler/hpi/interface.go | 4 -- .../ocm/valuemergehandler/hpi/logging.go | 4 -- .../ocm/valuemergehandler/hpi/merge.go | 4 -- .../ocm/valuemergehandler/hpi/setup.go | 4 -- .../ocm/valuemergehandler/hpi/support.go | 4 -- .../ocm/valuemergehandler/interface.go | 4 -- .../valuemergehandler/internal/interface.go | 4 -- .../ocm/valuemergehandler/internal/support.go | 4 -- .../internal/valuemergehandler.go | 4 -- pkg/contexts/ocm/valuemergehandler/merge.go | 4 -- pkg/contexts/ocm/valuemergehandler/usage.go | 4 -- pkg/contexts/options/utils.go | 4 -- pkg/dirtree/context.go | 4 -- pkg/dirtree/dirtree.go | 4 -- pkg/dirtree/suite_test.go | 4 -- pkg/dirtree/tar.go | 4 -- pkg/dirtree/utils.go | 4 -- pkg/dirtree/vfs.go | 4 -- pkg/dirtree/vfs_test.go | 4 -- pkg/docker/fetcher.go | 4 -- pkg/docker/handler.go | 4 -- pkg/docker/httpreadseeker.go | 4 -- pkg/docker/lister.go | 4 -- pkg/docker/orig.go | 4 -- pkg/docker/pusher.go | 4 -- pkg/docker/registry.go | 4 -- pkg/docker/resolve/interface.go | 4 -- pkg/docker/resolver.go | 4 -- pkg/encrypt/encrypt.go | 4 -- pkg/env/builder/blob.go | 4 -- pkg/env/builder/builder.go | 4 -- pkg/env/builder/builder_test.go | 18 ++----- pkg/env/builder/oci_anno.go | 4 -- pkg/env/builder/oci_artifact.go | 4 -- pkg/env/builder/oci_artifactset.go | 4 -- pkg/env/builder/oci_config.go | 4 -- pkg/env/builder/oci_ctf.go | 4 -- pkg/env/builder/oci_layer.go | 4 -- pkg/env/builder/oci_namespace.go | 4 -- pkg/env/builder/oci_platform.go | 4 -- pkg/env/builder/oci_repo.go | 4 -- pkg/env/builder/oci_tags.go | 4 -- pkg/env/builder/ocm_access.go | 4 -- pkg/env/builder/ocm_comparch.go | 4 -- pkg/env/builder/ocm_component.go | 4 -- pkg/env/builder/ocm_composition.go | 4 -- pkg/env/builder/ocm_ctf.go | 4 -- pkg/env/builder/ocm_identity.go | 4 -- pkg/env/builder/ocm_label.go | 4 -- pkg/env/builder/ocm_provider.go | 4 -- pkg/env/builder/ocm_reference.go | 4 -- pkg/env/builder/ocm_repo.go | 4 -- pkg/env/builder/ocm_resource.go | 4 -- pkg/env/builder/ocm_source.go | 4 -- pkg/env/builder/ocm_version.go | 4 -- pkg/env/builder/ocm_version_test.go | 4 -- pkg/env/builder/rsa_keypair.go | 4 -- pkg/env/builder/suite_test.go | 4 -- pkg/env/env.go | 4 -- pkg/env/env_test.go | 4 -- pkg/env/keypair.go | 4 -- pkg/env/suite_test.go | 4 -- pkg/errors/alreadyexists.go | 4 -- pkg/errors/closed.go | 4 -- pkg/errors/error.go | 4 -- pkg/errors/error_test.go | 4 -- pkg/errors/errprop.go | 4 -- pkg/errors/errprop_test.go | 4 -- pkg/errors/format.go | 4 -- pkg/errors/invalid.go | 4 -- pkg/errors/kinds.go | 4 -- pkg/errors/list.go | 4 -- pkg/errors/list_test.go | 4 -- pkg/errors/nomatch.go | 4 -- pkg/errors/notfound.go | 4 -- pkg/errors/notimpl.go | 4 -- pkg/errors/notsupported.go | 4 -- pkg/errors/readonly.go | 4 -- pkg/errors/recursion.go | 4 -- pkg/errors/required.go | 4 -- pkg/errors/stillinuse.go | 4 -- pkg/errors/suite_test.go | 4 -- pkg/errors/unknown.go | 4 -- pkg/errors/utils.go | 4 -- pkg/exception/exception.go | 4 -- pkg/exception/exception_test.go | 4 -- pkg/exception/suite_test.go | 4 -- pkg/finalizer/closer.go | 4 -- pkg/finalizer/finalizer.go | 4 -- pkg/finalizer/finalizer_test.go | 4 -- pkg/finalizer/object.go | 4 -- pkg/finalizer/object_test.go | 4 -- pkg/finalizer/suite_test.go | 4 -- pkg/generics/cast.go | 4 -- pkg/generics/conditional.go | 4 -- pkg/generics/convert.go | 4 -- pkg/generics/map.go | 4 -- pkg/generics/set.go | 4 -- pkg/generics/slice.go | 4 -- pkg/generics/utils.go | 4 -- pkg/helm/chartaccess.go | 4 -- pkg/helm/downloader.go | 4 -- pkg/helm/identity/identity.go | 4 -- pkg/helm/loader/access.go | 4 -- pkg/helm/loader/directory.go | 4 -- pkg/helm/loader/forward.go | 4 -- pkg/helm/loader/loader.go | 4 -- pkg/helm/options.go | 4 -- pkg/iotools/countingreader.go | 4 -- pkg/iotools/digestreader.go | 4 -- pkg/iotools/digestwriter.go | 4 -- pkg/iotools/files.go | 4 -- pkg/iotools/readerwriter.go | 4 -- pkg/iotools/utils.go | 4 -- pkg/listformat/listhelp.go | 4 -- pkg/logging/config_test.go | 4 -- pkg/logging/interface.go | 4 -- pkg/logging/logging.go | 4 -- pkg/logging/stdkeys.go | 4 -- pkg/logging/suite_test.go | 4 -- pkg/logging/testhelper/testhelper.go | 4 -- pkg/logging/utils.go | 4 -- pkg/mime/types.go | 4 -- pkg/mime/util.go | 4 -- pkg/optionutils/nested.go | 4 -- pkg/optionutils/options.go | 4 -- pkg/optionutils/pointer.go | 4 -- pkg/optionutils/target.go | 4 -- pkg/out/context.go | 4 -- pkg/refmgmt/doc.go | 4 -- pkg/refmgmt/finalized/doc.go | 4 -- pkg/refmgmt/finalized/finalized_test.go | 4 -- pkg/refmgmt/finalized/finalizedref.go | 4 -- pkg/refmgmt/finalized/suite_test.go | 4 -- pkg/refmgmt/refcloser.go | 4 -- pkg/refmgmt/refmgmt.go | 4 -- pkg/refmgmt/resource/doc.go | 4 -- pkg/refmgmt/resource/resource.go | 4 -- pkg/refmgmt/resource/resource_test.go | 4 -- pkg/refmgmt/resource/suite_test.go | 4 -- pkg/refmgmt/suite_test.go | 4 -- pkg/refmgmt/view.go | 4 -- pkg/refmgmt/view_test.go | 4 -- pkg/regex/regex.go | 4 -- pkg/registrations/info.go | 4 -- pkg/registrations/registrations.go | 4 -- pkg/registrations/registrations_test.go | 4 -- pkg/registrations/suite_test.go | 4 -- pkg/registrations/utils.go | 4 -- pkg/runtime/binary.go | 4 -- pkg/runtime/convert.go | 4 -- pkg/runtime/datatypes.go | 4 -- pkg/runtime/descriptivetype/options.go | 4 -- pkg/runtime/descriptivetype/type.go | 4 -- pkg/runtime/encoding.go | 4 -- pkg/runtime/multi.go | 4 -- pkg/runtime/multi_test.go | 4 -- pkg/runtime/object_test.go | 4 -- pkg/runtime/scheme.go | 4 -- pkg/runtime/scheme_test.go | 4 -- pkg/runtime/suite_test.go | 4 -- pkg/runtime/typedobject.go | 4 -- pkg/runtime/unstructured.go | 4 -- pkg/runtime/unstructured_test.go | 4 -- pkg/runtime/unstructuredversioned.go | 4 -- pkg/runtime/utils.go | 4 -- pkg/runtime/validate.go | 4 -- pkg/runtime/value.go | 4 -- pkg/runtime/version_test.go | 4 -- pkg/runtime/versionedtype.go | 4 -- pkg/semverutils/sort.go | 4 -- pkg/semverutils/suite_test.go | 4 -- pkg/semverutils/utils.go | 4 -- pkg/semverutils/utils_test.go | 4 -- pkg/signing/cert.go | 4 -- pkg/signing/cert_test.go | 4 -- pkg/signing/deprecated.go | 4 -- pkg/signing/encrypt.go | 4 -- pkg/signing/handlers/init.go | 4 -- .../rsa-pss-signingservice/handler.go | 4 -- pkg/signing/handlers/rsa-pss/handler.go | 4 -- .../handlers/rsa-signingservice/client.go | 4 -- .../handlers/rsa-signingservice/handler.go | 4 -- pkg/signing/handlers/rsa/certhelper.go | 4 -- pkg/signing/handlers/rsa/format.go | 4 -- pkg/signing/handlers/rsa/handler.go | 4 -- pkg/signing/handlers/sigstore/attr/attr.go | 4 -- pkg/signing/handlers/sigstore/handler.go | 4 -- pkg/signing/hasher/hashfuncs.go | 4 -- pkg/signing/hasher/init.go | 4 -- pkg/signing/hasher/nodigest/hasher.go | 4 -- pkg/signing/hasher/sha256/hasher.go | 4 -- pkg/signing/hasher/sha512/hasher.go | 4 -- pkg/signing/hashfuncs.go | 4 -- pkg/signing/norm/entry/norm.go | 4 -- pkg/signing/norm/jcs/norm.go | 4 -- pkg/signing/normalization.go | 4 -- pkg/signing/normalization_test.go | 4 -- pkg/signing/registry.go | 4 -- pkg/signing/rules.go | 4 -- pkg/signing/signing_test.go | 4 -- pkg/signing/signutils/certs.go | 4 -- pkg/signing/signutils/certs_test.go | 4 -- pkg/signing/signutils/names.go | 4 -- pkg/signing/signutils/names_test.go | 4 -- pkg/signing/signutils/signature.go | 4 -- pkg/signing/signutils/suite_test.go | 4 -- pkg/signing/signutils/types.go | 4 -- pkg/signing/signutils/utils.go | 4 -- pkg/signing/suite_test.go | 4 -- pkg/signing/tsa/pem.go | 4 -- pkg/signing/tsa/tsa.go | 4 -- pkg/signing/tsa/types.go | 4 -- pkg/signing/types.go | 4 -- pkg/signing/utils.go | 4 -- pkg/signing/x509_certificate.go | 4 -- pkg/spiff/options.go | 4 -- pkg/spiff/spiff.go | 4 -- pkg/spiff/spiff_test.go | 4 -- pkg/spiff/suite_test.go | 4 -- pkg/spiff/validate.go | 4 -- pkg/testutils/object.go | 4 -- pkg/testutils/signing_test.go | 4 -- pkg/testutils/string.go | 4 -- pkg/testutils/suite_test.go | 4 -- pkg/testutils/utils.go | 4 -- pkg/testutils/yaml.go | 4 -- pkg/toi/drivers/default/driver.go | 4 -- pkg/toi/drivers/docker/client.go | 4 -- pkg/toi/drivers/docker/opts.go | 4 -- pkg/toi/drivers/filesystem/driver.go | 4 -- pkg/toi/drivers/mock/driver.go | 4 -- pkg/toi/install/action.go | 4 -- pkg/toi/install/action_test.go | 4 -- pkg/toi/install/bundle/spec.go | 4 -- pkg/toi/install/credentials.go | 4 -- pkg/toi/install/credentials_test.go | 4 -- pkg/toi/install/execute.go | 4 -- pkg/toi/install/functions.go | 4 -- pkg/toi/install/interface.go | 4 -- pkg/toi/install/suite_test.go | 4 -- pkg/toi/logging.go | 4 -- pkg/toi/spec.go | 4 -- pkg/toi/support/app.go | 4 -- pkg/toi/support/support.go | 4 -- pkg/tokens/github/main/main.go | 4 -- pkg/utils/ctf.go | 4 -- pkg/utils/key.go | 4 -- pkg/utils/keyinfo.go | 4 -- pkg/utils/locator.go | 4 -- pkg/utils/log.go | 4 -- pkg/utils/panics/panics.go | 4 -- pkg/utils/panics/panics_test.go | 4 -- pkg/utils/panics/suite_test.go | 4 -- pkg/utils/selector/selector.go | 4 -- pkg/utils/stringset.go | 4 -- pkg/utils/stringslice.go | 4 -- pkg/utils/subst/subst.go | 4 -- pkg/utils/subst/subst_test.go | 4 -- pkg/utils/subst/suite_test.go | 4 -- pkg/utils/suite_test.go | 4 -- pkg/utils/tarutils/compress.go | 4 -- pkg/utils/tarutils/extract.go | 4 -- pkg/utils/tarutils/list.go | 4 -- pkg/utils/tarutils/pack.go | 4 -- pkg/utils/tarutils/pack_test.go | 4 -- pkg/utils/tarutils/suite_test.go | 4 -- pkg/utils/template/gotmpl.go | 4 -- pkg/utils/template/merge.go | 4 -- pkg/utils/template/none.go | 4 -- pkg/utils/template/registry.go | 4 -- pkg/utils/template/spiff.go | 4 -- pkg/utils/template/subst.go | 4 -- pkg/utils/template/template.go | 4 -- pkg/utils/template/template_test.go | 4 -- pkg/utils/time.go | 4 -- pkg/utils/unwrap.go | 4 -- pkg/utils/url.go | 4 -- pkg/utils/utils.go | 4 -- pkg/utils/utils_test.go | 4 -- pkg/utils/validate.go | 4 -- pkg/version/generate/release_generate.go | 4 -- pkg/version/version.go | 4 -- version.go | 4 -- 1806 files changed, 358 insertions(+), 7196 deletions(-) create mode 100644 cmds/ocm/ca/component-descriptor.yaml delete mode 100644 hack/boilerplate.go.txt diff --git a/Makefile b/Makefile index 57f3e63682..78a0609f3b 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME := ocm REPO_ROOT := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) GITHUBORG ?= open-component-model @@ -69,11 +65,11 @@ test: .PHONY: generate generate: - @$(REPO_ROOT)/hack/generate.sh $(REPO_ROOT)/pkg... $(REPO_ROOT)/cmds/ocm/... $(REPO_ROOT)/cmds/helminst/... $(REPO_ROOT)/examples/... + @$(REPO_ROOT)/hack/generate.sh $(REPO_ROOT)/pkg... $(REPO_ROOT)/cmds/ocm/... $(REPO_ROOT)/cmds/helminstaller/... $(REPO_ROOT)/examples/... .PHONY: generate-deepcopy generate-deepcopy: controller-gen - $(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths=./pkg/contexts/ocm/compdesc/versions/... paths=./pkg/contexts/ocm/compdesc/meta/... + $(CONTROLLER_GEN) object paths=./pkg/contexts/ocm/compdesc/versions/... paths=./pkg/contexts/ocm/compdesc/meta/... .PHONY: controller-gen controller-gen: $(CONTROLLER_GEN) ## Download controller-gen locally if necessary. @@ -111,13 +107,6 @@ info: @echo "GIT_TREE_STATE= $(GIT_TREE_STATE)" @echo "COMPONENTS = $(COMPONENTS)" -.PHONY: generate-license -generate-license: - for f in $(shell find . -name "*.go" -o -name "*.sh"); do \ - reuse addheader -r --copyright="SAP SE or an SAP affiliate company and Open Component Model contributors." --license="Apache-2.0" $$f --skip-unrecognised; \ - done - - $(GEN)/.exists: @mkdir -p $(GEN) @touch $@ diff --git a/cmds/demoplugin/accessmethods/demo.go b/cmds/demoplugin/accessmethods/demo.go index df91686592..a04089f3b2 100644 --- a/cmds/demoplugin/accessmethods/demo.go +++ b/cmds/demoplugin/accessmethods/demo.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessmethods import ( diff --git a/cmds/demoplugin/common/const.go b/cmds/demoplugin/common/const.go index 4663991ed4..2a136fb8dd 100644 --- a/cmds/demoplugin/common/const.go +++ b/cmds/demoplugin/common/const.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common const CONSUMER_TYPE = "demo" diff --git a/cmds/demoplugin/config/config.go b/cmds/demoplugin/config/config.go index 87461e7886..f2956ed6fe 100644 --- a/cmds/demoplugin/config/config.go +++ b/cmds/demoplugin/config/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/cmds/demoplugin/main.go b/cmds/demoplugin/main.go index dd744c3270..a0866c2bf1 100644 --- a/cmds/demoplugin/main.go +++ b/cmds/demoplugin/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/cmds/demoplugin/uploaders/demo.go b/cmds/demoplugin/uploaders/demo.go index eae170eece..177decd848 100644 --- a/cmds/demoplugin/uploaders/demo.go +++ b/cmds/demoplugin/uploaders/demo.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package uploaders import ( diff --git a/cmds/demoplugin/uploaders/writer.go b/cmds/demoplugin/uploaders/writer.go index ef4f306ac4..c1cd6b7d8a 100644 --- a/cmds/demoplugin/uploaders/writer.go +++ b/cmds/demoplugin/uploaders/writer.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package uploaders import ( diff --git a/cmds/demoplugin/valuesets/check.go b/cmds/demoplugin/valuesets/check.go index 498491bf0e..6360af9097 100644 --- a/cmds/demoplugin/valuesets/check.go +++ b/cmds/demoplugin/valuesets/check.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package valuesets import ( diff --git a/cmds/demoplugin/valuesets/check_test.go b/cmds/demoplugin/valuesets/check_test.go index fc18624394..e7ab2e6a0c 100644 --- a/cmds/demoplugin/valuesets/check_test.go +++ b/cmds/demoplugin/valuesets/check_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:build unix package valuesets_test diff --git a/cmds/demoplugin/valuesets/suite_test.go b/cmds/demoplugin/valuesets/suite_test.go index 89647ef5dc..6152fc880a 100644 --- a/cmds/demoplugin/valuesets/suite_test.go +++ b/cmds/demoplugin/valuesets/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package valuesets_test import ( diff --git a/cmds/ecrplugin/actions/action.go b/cmds/ecrplugin/actions/action.go index 60bfd64c8e..9ee7d1f824 100644 --- a/cmds/ecrplugin/actions/action.go +++ b/cmds/ecrplugin/actions/action.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package actions import ( diff --git a/cmds/ecrplugin/config/config.go b/cmds/ecrplugin/config/config.go index 9af1ffd391..4983dade50 100644 --- a/cmds/ecrplugin/config/config.go +++ b/cmds/ecrplugin/config/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/cmds/ecrplugin/config/tweak.go b/cmds/ecrplugin/config/tweak.go index 84ba30cc4f..3c8a30f655 100644 --- a/cmds/ecrplugin/config/tweak.go +++ b/cmds/ecrplugin/config/tweak.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/cmds/ecrplugin/main.go b/cmds/ecrplugin/main.go index 2d7049f5ac..5334e23742 100644 --- a/cmds/ecrplugin/main.go +++ b/cmds/ecrplugin/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/cmds/helminstaller/app/app.go b/cmds/helminstaller/app/app.go index 0f8ab8444e..77edd7c211 100644 --- a/cmds/helminstaller/app/app.go +++ b/cmds/helminstaller/app/app.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package app import ( diff --git a/cmds/helminstaller/app/config.go b/cmds/helminstaller/app/config.go index 5aa9cc2d35..3df93131d0 100644 --- a/cmds/helminstaller/app/config.go +++ b/cmds/helminstaller/app/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package app import ( diff --git a/cmds/helminstaller/app/driver/driver.go b/cmds/helminstaller/app/driver/driver.go index 8b860bb946..0ba959b021 100644 --- a/cmds/helminstaller/app/driver/driver.go +++ b/cmds/helminstaller/app/driver/driver.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package driver import ( diff --git a/cmds/helminstaller/app/driver/helm/driver.go b/cmds/helminstaller/app/driver/helm/driver.go index 2828581659..2f1f664782 100644 --- a/cmds/helminstaller/app/driver/helm/driver.go +++ b/cmds/helminstaller/app/driver/helm/driver.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/cmds/helminstaller/app/driver/helm/install.go b/cmds/helminstaller/app/driver/helm/install.go index 0dc9b0cf77..f169ca6ce0 100644 --- a/cmds/helminstaller/app/driver/helm/install.go +++ b/cmds/helminstaller/app/driver/helm/install.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/cmds/helminstaller/app/driver/helm/uninstall.go b/cmds/helminstaller/app/driver/helm/uninstall.go index b80e56f711..18ff39b133 100644 --- a/cmds/helminstaller/app/driver/helm/uninstall.go +++ b/cmds/helminstaller/app/driver/helm/uninstall.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/cmds/helminstaller/app/execute.go b/cmds/helminstaller/app/execute.go index ce28912763..7f8ee7872f 100644 --- a/cmds/helminstaller/app/execute.go +++ b/cmds/helminstaller/app/execute.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package app import ( diff --git a/cmds/helminstaller/app/executor.go b/cmds/helminstaller/app/executor.go index f585b72a87..70e944a208 100644 --- a/cmds/helminstaller/app/executor.go +++ b/cmds/helminstaller/app/executor.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package app import ( diff --git a/cmds/helminstaller/app/set.go b/cmds/helminstaller/app/set.go index d66e10a917..83b794066a 100644 --- a/cmds/helminstaller/app/set.go +++ b/cmds/helminstaller/app/set.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package app import ( diff --git a/cmds/helminstaller/main.go b/cmds/helminstaller/main.go index 63131bd6c4..47f4dd9093 100644 --- a/cmds/helminstaller/main.go +++ b/cmds/helminstaller/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/cmds/helminstaller/testhelper/env.go b/cmds/helminstaller/testhelper/env.go index 275eb1efd4..f91613618d 100644 --- a/cmds/helminstaller/testhelper/env.go +++ b/cmds/helminstaller/testhelper/env.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testhelper import ( diff --git a/cmds/ocm/app/app.go b/cmds/ocm/app/app.go index c598c9aba5..d110f67bf7 100644 --- a/cmds/ocm/app/app.go +++ b/cmds/ocm/app/app.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:generate go run -mod=mod ../../../hack/generate-docs ../../../docs/reference package app @@ -11,7 +7,6 @@ import ( "strings" "unicode" - common2 "github.com/open-component-model/ocm/pkg/clisupport" _ "github.com/open-component-model/ocm/pkg/contexts/clictx/config" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs" @@ -62,6 +57,7 @@ import ( topicocmrefs "github.com/open-component-model/ocm/cmds/ocm/topics/ocm/refs" topicocmuploaders "github.com/open-component-model/ocm/cmds/ocm/topics/ocm/uploadhandlers" topicbootstrap "github.com/open-component-model/ocm/cmds/ocm/topics/toi/bootstrapping" + common2 "github.com/open-component-model/ocm/pkg/clisupport" "github.com/open-component-model/ocm/pkg/cobrautils" "github.com/open-component-model/ocm/pkg/cobrautils/logopts" "github.com/open-component-model/ocm/pkg/common" diff --git a/cmds/ocm/app/app_test.go b/cmds/ocm/app/app_test.go index 4d19586ea8..013296e001 100644 --- a/cmds/ocm/app/app_test.go +++ b/cmds/ocm/app/app_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package app_test import ( diff --git a/cmds/ocm/app/prepare.go b/cmds/ocm/app/prepare.go index 32010c46f2..a3b6f040ab 100644 --- a/cmds/ocm/app/prepare.go +++ b/cmds/ocm/app/prepare.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package app import ( diff --git a/cmds/ocm/app/suite_test.go b/cmds/ocm/app/suite_test.go index 54b8d25955..78c82d92a9 100644 --- a/cmds/ocm/app/suite_test.go +++ b/cmds/ocm/app/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package app_test import ( diff --git a/cmds/ocm/ca/component-descriptor.yaml b/cmds/ocm/ca/component-descriptor.yaml new file mode 100644 index 0000000000..c9b54655c1 --- /dev/null +++ b/cmds/ocm/ca/component-descriptor.yaml @@ -0,0 +1,10 @@ +apiVersion: ocm.software/v3alpha1 +kind: ComponentVersion +metadata: + creationTime: "2024-05-03T09:43:30Z" + name: test.com/postgresql + provider: + name: test.com + version: 14.0.5 +repositoryContexts: [] +spec: {} diff --git a/cmds/ocm/commands/cachecmds/clean/cmd.go b/cmds/ocm/commands/cachecmds/clean/cmd.go index c0a58b6acb..583fa8e7ab 100644 --- a/cmds/ocm/commands/cachecmds/clean/cmd.go +++ b/cmds/ocm/commands/cachecmds/clean/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package clean import ( diff --git a/cmds/ocm/commands/cachecmds/cmd.go b/cmds/ocm/commands/cachecmds/cmd.go index 7b915aa0b2..53bc85722a 100644 --- a/cmds/ocm/commands/cachecmds/cmd.go +++ b/cmds/ocm/commands/cachecmds/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cachecmds import ( diff --git a/cmds/ocm/commands/cachecmds/describe/cmd.go b/cmds/ocm/commands/cachecmds/describe/cmd.go index da80952f9d..78ba0037d9 100644 --- a/cmds/ocm/commands/cachecmds/describe/cmd.go +++ b/cmds/ocm/commands/cachecmds/describe/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package describe import ( diff --git a/cmds/ocm/commands/cachecmds/names/names.go b/cmds/ocm/commands/cachecmds/names/names.go index 812c440275..765238c621 100644 --- a/cmds/ocm/commands/cachecmds/names/names.go +++ b/cmds/ocm/commands/cachecmds/names/names.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package names var Cache = []string{"cache"} diff --git a/cmds/ocm/commands/common/elements/components/cmd.go b/cmds/ocm/commands/common/elements/components/cmd.go index 307d4f8dbc..577c6f3e39 100644 --- a/cmds/ocm/commands/common/elements/components/cmd.go +++ b/cmds/ocm/commands/common/elements/components/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package components import ( diff --git a/cmds/ocm/commands/common/options/closureoption/option.go b/cmds/ocm/commands/common/options/closureoption/option.go index dabfa32a1d..ef148e4c9a 100644 --- a/cmds/ocm/commands/common/options/closureoption/option.go +++ b/cmds/ocm/commands/common/options/closureoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package closureoption import ( diff --git a/cmds/ocm/commands/common/options/destoption/option.go b/cmds/ocm/commands/common/options/destoption/option.go index 45e0f82370..4f7ad402ed 100644 --- a/cmds/ocm/commands/common/options/destoption/option.go +++ b/cmds/ocm/commands/common/options/destoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package destoption import ( diff --git a/cmds/ocm/commands/common/options/failonerroroption/option.go b/cmds/ocm/commands/common/options/failonerroroption/option.go index d50aed70c5..6616096e3a 100644 --- a/cmds/ocm/commands/common/options/failonerroroption/option.go +++ b/cmds/ocm/commands/common/options/failonerroroption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package failonerroroption import ( diff --git a/cmds/ocm/commands/common/options/formatoption/option.go b/cmds/ocm/commands/common/options/formatoption/option.go index 2df11a2dd2..7c254dd984 100644 --- a/cmds/ocm/commands/common/options/formatoption/option.go +++ b/cmds/ocm/commands/common/options/formatoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package formatoption import ( diff --git a/cmds/ocm/commands/common/options/keyoption/option.go b/cmds/ocm/commands/common/options/keyoption/option.go index ace52bcb06..fd3e41974f 100644 --- a/cmds/ocm/commands/common/options/keyoption/option.go +++ b/cmds/ocm/commands/common/options/keyoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package keyoption import ( diff --git a/cmds/ocm/commands/controllercmds/common/applyer.go b/cmds/ocm/commands/controllercmds/common/applyer.go index a2f07e3966..cc66b5105d 100644 --- a/cmds/ocm/commands/controllercmds/common/applyer.go +++ b/cmds/ocm/commands/controllercmds/common/applyer.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/cmds/ocm/commands/controllercmds/common/fetcher.go b/cmds/ocm/commands/controllercmds/common/fetcher.go index 189bcca072..6806f3806a 100644 --- a/cmds/ocm/commands/controllercmds/common/fetcher.go +++ b/cmds/ocm/commands/controllercmds/common/fetcher.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/cmds/ocm/commands/controllercmds/common/manifests.go b/cmds/ocm/commands/controllercmds/common/manifests.go index b49871b6d4..2f827f0180 100644 --- a/cmds/ocm/commands/controllercmds/common/manifests.go +++ b/cmds/ocm/commands/controllercmds/common/manifests.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/cmds/ocm/commands/controllercmds/install/cmd.go b/cmds/ocm/commands/controllercmds/install/cmd.go index 546601e9b5..cec957dcbd 100644 --- a/cmds/ocm/commands/controllercmds/install/cmd.go +++ b/cmds/ocm/commands/controllercmds/install/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install import ( diff --git a/cmds/ocm/commands/controllercmds/install/cmd_test.go b/cmds/ocm/commands/controllercmds/install/cmd_test.go index 13d2c4617f..9b8f5a31e3 100644 --- a/cmds/ocm/commands/controllercmds/install/cmd_test.go +++ b/cmds/ocm/commands/controllercmds/install/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install_test import ( diff --git a/cmds/ocm/commands/controllercmds/install/install_cert_manager.go b/cmds/ocm/commands/controllercmds/install/install_cert_manager.go index 50c87df916..4b6be219fd 100644 --- a/cmds/ocm/commands/controllercmds/install/install_cert_manager.go +++ b/cmds/ocm/commands/controllercmds/install/install_cert_manager.go @@ -2,12 +2,14 @@ package install import ( "context" - _ "embed" "fmt" "os" + _ "embed" + "github.com/fluxcd/pkg/ssa" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/common" "github.com/open-component-model/ocm/pkg/out" ) diff --git a/cmds/ocm/commands/controllercmds/install/resource_manager.go b/cmds/ocm/commands/controllercmds/install/resource_manager.go index ffd7cde1be..8864d39042 100644 --- a/cmds/ocm/commands/controllercmds/install/resource_manager.go +++ b/cmds/ocm/commands/controllercmds/install/resource_manager.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install import ( diff --git a/cmds/ocm/commands/controllercmds/install/suite_test.go b/cmds/ocm/commands/controllercmds/install/suite_test.go index 97d79fd488..060cd56f7c 100644 --- a/cmds/ocm/commands/controllercmds/install/suite_test.go +++ b/cmds/ocm/commands/controllercmds/install/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install_test import ( diff --git a/cmds/ocm/commands/controllercmds/names/names.go b/cmds/ocm/commands/controllercmds/names/names.go index 138e9c9cb9..94eca559a2 100644 --- a/cmds/ocm/commands/controllercmds/names/names.go +++ b/cmds/ocm/commands/controllercmds/names/names.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package names var ( diff --git a/cmds/ocm/commands/controllercmds/uninstall/cmd.go b/cmds/ocm/commands/controllercmds/uninstall/cmd.go index e8ff182a46..699070651e 100644 --- a/cmds/ocm/commands/controllercmds/uninstall/cmd.go +++ b/cmds/ocm/commands/controllercmds/uninstall/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package uninstall import ( diff --git a/cmds/ocm/commands/controllercmds/uninstall/cmd_test.go b/cmds/ocm/commands/controllercmds/uninstall/cmd_test.go index b123b5bda3..a9559d69ba 100644 --- a/cmds/ocm/commands/controllercmds/uninstall/cmd_test.go +++ b/cmds/ocm/commands/controllercmds/uninstall/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package uninstall_test import ( diff --git a/cmds/ocm/commands/controllercmds/uninstall/resource_manager.go b/cmds/ocm/commands/controllercmds/uninstall/resource_manager.go index 0c1dba937a..2d50a283c0 100644 --- a/cmds/ocm/commands/controllercmds/uninstall/resource_manager.go +++ b/cmds/ocm/commands/controllercmds/uninstall/resource_manager.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package uninstall import ( diff --git a/cmds/ocm/commands/controllercmds/uninstall/suite_test.go b/cmds/ocm/commands/controllercmds/uninstall/suite_test.go index 0c28f00a4f..7a571488f0 100644 --- a/cmds/ocm/commands/controllercmds/uninstall/suite_test.go +++ b/cmds/ocm/commands/controllercmds/uninstall/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package uninstall_test import ( diff --git a/cmds/ocm/commands/misccmds/action/cmd.go b/cmds/ocm/commands/misccmds/action/cmd.go index 612a67e23b..2419e61cc1 100644 --- a/cmds/ocm/commands/misccmds/action/cmd.go +++ b/cmds/ocm/commands/misccmds/action/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package action import ( diff --git a/cmds/ocm/commands/misccmds/action/execute/cmd.go b/cmds/ocm/commands/misccmds/action/execute/cmd.go index 03c78cabf5..9ce8351b6d 100644 --- a/cmds/ocm/commands/misccmds/action/execute/cmd.go +++ b/cmds/ocm/commands/misccmds/action/execute/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package execute import ( diff --git a/cmds/ocm/commands/misccmds/credentials/cmd.go b/cmds/ocm/commands/misccmds/credentials/cmd.go index ff8ef97433..29dbaa1e7e 100644 --- a/cmds/ocm/commands/misccmds/credentials/cmd.go +++ b/cmds/ocm/commands/misccmds/credentials/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package credentials import ( diff --git a/cmds/ocm/commands/misccmds/credentials/get/cmd.go b/cmds/ocm/commands/misccmds/credentials/get/cmd.go index 6ddd4c7f0a..64574dc0ee 100644 --- a/cmds/ocm/commands/misccmds/credentials/get/cmd.go +++ b/cmds/ocm/commands/misccmds/credentials/get/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get import ( diff --git a/cmds/ocm/commands/misccmds/credentials/get/cmd_test.go b/cmds/ocm/commands/misccmds/credentials/get/cmd_test.go index 68a8aad6e4..6c2566d391 100644 --- a/cmds/ocm/commands/misccmds/credentials/get/cmd_test.go +++ b/cmds/ocm/commands/misccmds/credentials/get/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/misccmds/credentials/get/suite_test.go b/cmds/ocm/commands/misccmds/credentials/get/suite_test.go index 08c7892020..7f93315576 100644 --- a/cmds/ocm/commands/misccmds/credentials/get/suite_test.go +++ b/cmds/ocm/commands/misccmds/credentials/get/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/misccmds/hash/cmd.go b/cmds/ocm/commands/misccmds/hash/cmd.go index ed85415955..f4aca12d31 100644 --- a/cmds/ocm/commands/misccmds/hash/cmd.go +++ b/cmds/ocm/commands/misccmds/hash/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package credentials import ( diff --git a/cmds/ocm/commands/misccmds/hash/sign/cmd.go b/cmds/ocm/commands/misccmds/hash/sign/cmd.go index 68777ad498..eb4d9525e3 100644 --- a/cmds/ocm/commands/misccmds/hash/sign/cmd.go +++ b/cmds/ocm/commands/misccmds/hash/sign/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package sign import ( diff --git a/cmds/ocm/commands/misccmds/hash/sign/cmd_test.go b/cmds/ocm/commands/misccmds/hash/sign/cmd_test.go index 762f14046c..0c542f75ab 100644 --- a/cmds/ocm/commands/misccmds/hash/sign/cmd_test.go +++ b/cmds/ocm/commands/misccmds/hash/sign/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package sign_test import ( diff --git a/cmds/ocm/commands/misccmds/hash/sign/suite_test.go b/cmds/ocm/commands/misccmds/hash/sign/suite_test.go index 4e58a574ec..956ec56419 100644 --- a/cmds/ocm/commands/misccmds/hash/sign/suite_test.go +++ b/cmds/ocm/commands/misccmds/hash/sign/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package sign_test import ( diff --git a/cmds/ocm/commands/misccmds/names/names.go b/cmds/ocm/commands/misccmds/names/names.go index e305d6d4b7..727abbee0d 100644 --- a/cmds/ocm/commands/misccmds/names/names.go +++ b/cmds/ocm/commands/misccmds/names/names.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package names var ( diff --git a/cmds/ocm/commands/misccmds/rsakeypair/cmd.go b/cmds/ocm/commands/misccmds/rsakeypair/cmd.go index c7b2f541f9..1921f92e48 100644 --- a/cmds/ocm/commands/misccmds/rsakeypair/cmd.go +++ b/cmds/ocm/commands/misccmds/rsakeypair/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rsakeypair import ( diff --git a/cmds/ocm/commands/misccmds/rsakeypair/cmd_test.go b/cmds/ocm/commands/misccmds/rsakeypair/cmd_test.go index d4f6cc69b4..1748244a13 100644 --- a/cmds/ocm/commands/misccmds/rsakeypair/cmd_test.go +++ b/cmds/ocm/commands/misccmds/rsakeypair/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rsakeypair_test import ( diff --git a/cmds/ocm/commands/misccmds/rsakeypair/suite_test.go b/cmds/ocm/commands/misccmds/rsakeypair/suite_test.go index 4293272b8a..cb5cae3e7c 100644 --- a/cmds/ocm/commands/misccmds/rsakeypair/suite_test.go +++ b/cmds/ocm/commands/misccmds/rsakeypair/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rsakeypair_test import ( diff --git a/cmds/ocm/commands/ocicmds/artifacts/cmd.go b/cmds/ocm/commands/ocicmds/artifacts/cmd.go index 7f2efc7fd8..a1579d7dcd 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/cmd.go +++ b/cmds/ocm/commands/ocicmds/artifacts/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifacts import ( diff --git a/cmds/ocm/commands/ocicmds/artifacts/describe/cmd.go b/cmds/ocm/commands/ocicmds/artifacts/describe/cmd.go index 0c8abbb752..96149a5034 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/describe/cmd.go +++ b/cmds/ocm/commands/ocicmds/artifacts/describe/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package describe import ( diff --git a/cmds/ocm/commands/ocicmds/artifacts/download/cmd.go b/cmds/ocm/commands/ocicmds/artifacts/download/cmd.go index 2a1af7be2f..66f5f4edf0 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/download/cmd.go +++ b/cmds/ocm/commands/ocicmds/artifacts/download/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download import ( diff --git a/cmds/ocm/commands/ocicmds/artifacts/download/cmd_test.go b/cmds/ocm/commands/ocicmds/artifacts/download/cmd_test.go index d33b513cdb..ed54c68414 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/download/cmd_test.go +++ b/cmds/ocm/commands/ocicmds/artifacts/download/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download_test import ( diff --git a/cmds/ocm/commands/ocicmds/artifacts/download/option.go b/cmds/ocm/commands/ocicmds/artifacts/download/option.go index 516558a18b..9b1a62b199 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/download/option.go +++ b/cmds/ocm/commands/ocicmds/artifacts/download/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download import ( diff --git a/cmds/ocm/commands/ocicmds/artifacts/download/suite_test.go b/cmds/ocm/commands/ocicmds/artifacts/download/suite_test.go index 2cefd07fb6..5333856c24 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/download/suite_test.go +++ b/cmds/ocm/commands/ocicmds/artifacts/download/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download_test import ( diff --git a/cmds/ocm/commands/ocicmds/artifacts/get/cmd.go b/cmds/ocm/commands/ocicmds/artifacts/get/cmd.go index 16bb86c59f..8e67c24b1d 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/get/cmd.go +++ b/cmds/ocm/commands/ocicmds/artifacts/get/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get import ( diff --git a/cmds/ocm/commands/ocicmds/artifacts/get/cmd_test.go b/cmds/ocm/commands/ocicmds/artifacts/get/cmd_test.go index 3a2e6d1983..0fd0a8f957 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/get/cmd_test.go +++ b/cmds/ocm/commands/ocicmds/artifacts/get/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/ocicmds/artifacts/get/options.go b/cmds/ocm/commands/ocicmds/artifacts/get/options.go index bbd466d680..dcf4964fa4 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/get/options.go +++ b/cmds/ocm/commands/ocicmds/artifacts/get/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get import ( diff --git a/cmds/ocm/commands/ocicmds/artifacts/get/suite_test.go b/cmds/ocm/commands/ocicmds/artifacts/get/suite_test.go index 5655a33cc1..27cb552795 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/get/suite_test.go +++ b/cmds/ocm/commands/ocicmds/artifacts/get/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/ocicmds/artifacts/transfer/cmd.go b/cmds/ocm/commands/ocicmds/artifacts/transfer/cmd.go index 00c7156167..90ca43d55f 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/transfer/cmd.go +++ b/cmds/ocm/commands/ocicmds/artifacts/transfer/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer import ( diff --git a/cmds/ocm/commands/ocicmds/artifacts/transfer/cmd_test.go b/cmds/ocm/commands/ocicmds/artifacts/transfer/cmd_test.go index c843ab3130..5fa95cb888 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/transfer/cmd_test.go +++ b/cmds/ocm/commands/ocicmds/artifacts/transfer/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer_test import ( diff --git a/cmds/ocm/commands/ocicmds/artifacts/transfer/suite_test.go b/cmds/ocm/commands/ocicmds/artifacts/transfer/suite_test.go index c43d6ccb14..3584c20999 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/transfer/suite_test.go +++ b/cmds/ocm/commands/ocicmds/artifacts/transfer/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer_test import ( diff --git a/cmds/ocm/commands/ocicmds/cmd.go b/cmds/ocm/commands/ocicmds/cmd.go index f2578d1d4b..4ebb6afb82 100644 --- a/cmds/ocm/commands/ocicmds/cmd.go +++ b/cmds/ocm/commands/ocicmds/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocicmds import ( diff --git a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/attached.go b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/attached.go index b1ec977243..bdcc759956 100644 --- a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/attached.go +++ b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/attached.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifacthdlr import ( diff --git a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/clean.go b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/clean.go index 6531fbd9dd..bd9f8f2099 100644 --- a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/clean.go +++ b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/clean.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifacthdlr import ( diff --git a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/closure.go b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/closure.go index 5ac9b94686..28f67009ca 100644 --- a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/closure.go +++ b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/closure.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifacthdlr import ( diff --git a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/convert.go b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/convert.go index 0909fa6a5a..82cbe2b994 100644 --- a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/convert.go +++ b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/convert.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifacthdlr import ( diff --git a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/sort.go b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/sort.go index 711b3aebf5..57fa2963de 100644 --- a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/sort.go +++ b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/sort.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifacthdlr import ( diff --git a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/typehandler.go b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/typehandler.go index 515159f36a..451f77c746 100644 --- a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/typehandler.go +++ b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/typehandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifacthdlr import ( diff --git a/cmds/ocm/commands/ocicmds/common/options/repooption/option.go b/cmds/ocm/commands/ocicmds/common/options/repooption/option.go index 92fe54f88e..7cd49a5b7c 100644 --- a/cmds/ocm/commands/ocicmds/common/options/repooption/option.go +++ b/cmds/ocm/commands/ocicmds/common/options/repooption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package repooption import ( diff --git a/cmds/ocm/commands/ocicmds/common/utils.go b/cmds/ocm/commands/ocicmds/common/utils.go index 98deef18e3..11c4bbd3cd 100644 --- a/cmds/ocm/commands/ocicmds/common/utils.go +++ b/cmds/ocm/commands/ocicmds/common/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/cmds/ocm/commands/ocicmds/ctf/cmd.go b/cmds/ocm/commands/ocicmds/ctf/cmd.go index 49b6ce6d33..b5c70431fe 100644 --- a/cmds/ocm/commands/ocicmds/ctf/cmd.go +++ b/cmds/ocm/commands/ocicmds/ctf/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf import ( diff --git a/cmds/ocm/commands/ocicmds/ctf/create/cmd.go b/cmds/ocm/commands/ocicmds/ctf/create/cmd.go index 5c9ddb65fe..6f119b6d35 100644 --- a/cmds/ocm/commands/ocicmds/ctf/create/cmd.go +++ b/cmds/ocm/commands/ocicmds/ctf/create/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package create import ( diff --git a/cmds/ocm/commands/ocicmds/ctf/create/cmd_test.go b/cmds/ocm/commands/ocicmds/ctf/create/cmd_test.go index 479e083e8e..da85ae1808 100644 --- a/cmds/ocm/commands/ocicmds/ctf/create/cmd_test.go +++ b/cmds/ocm/commands/ocicmds/ctf/create/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package create_test import ( diff --git a/cmds/ocm/commands/ocicmds/ctf/create/suite_test.go b/cmds/ocm/commands/ocicmds/ctf/create/suite_test.go index 01346d35a9..08a6e7461c 100644 --- a/cmds/ocm/commands/ocicmds/ctf/create/suite_test.go +++ b/cmds/ocm/commands/ocicmds/ctf/create/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package create_test import ( diff --git a/cmds/ocm/commands/ocicmds/names/names.go b/cmds/ocm/commands/ocicmds/names/names.go index 3ef06ba368..90118150e4 100644 --- a/cmds/ocm/commands/ocicmds/names/names.go +++ b/cmds/ocm/commands/ocicmds/names/names.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package names var ( diff --git a/cmds/ocm/commands/ocicmds/tags/cmd.go b/cmds/ocm/commands/ocicmds/tags/cmd.go index 7751c1d1f9..77b26d800c 100644 --- a/cmds/ocm/commands/ocicmds/tags/cmd.go +++ b/cmds/ocm/commands/ocicmds/tags/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tags import ( diff --git a/cmds/ocm/commands/ocicmds/tags/show/cmd.go b/cmds/ocm/commands/ocicmds/tags/show/cmd.go index 375e8cb637..ff03887ea7 100644 --- a/cmds/ocm/commands/ocicmds/tags/show/cmd.go +++ b/cmds/ocm/commands/ocicmds/tags/show/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package show import ( diff --git a/cmds/ocm/commands/ocicmds/tags/show/cmd_test.go b/cmds/ocm/commands/ocicmds/tags/show/cmd_test.go index 94079d58f4..de55d8a26f 100644 --- a/cmds/ocm/commands/ocicmds/tags/show/cmd_test.go +++ b/cmds/ocm/commands/ocicmds/tags/show/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package show_test import ( diff --git a/cmds/ocm/commands/ocicmds/tags/show/suite_test.go b/cmds/ocm/commands/ocicmds/tags/show/suite_test.go index a622b98a20..308c7d37a0 100644 --- a/cmds/ocm/commands/ocicmds/tags/show/suite_test.go +++ b/cmds/ocm/commands/ocicmds/tags/show/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package show_test import ( diff --git a/cmds/ocm/commands/ocmcmds/cli/cmd.go b/cmds/ocm/commands/ocmcmds/cli/cmd.go index bafb49e717..aea68ce264 100644 --- a/cmds/ocm/commands/ocmcmds/cli/cmd.go +++ b/cmds/ocm/commands/ocmcmds/cli/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cli import ( diff --git a/cmds/ocm/commands/ocmcmds/cli/download/cmd.go b/cmds/ocm/commands/ocmcmds/cli/download/cmd.go index b6ee053969..4f952ae838 100644 --- a/cmds/ocm/commands/ocmcmds/cli/download/cmd.go +++ b/cmds/ocm/commands/ocmcmds/cli/download/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download import ( diff --git a/cmds/ocm/commands/ocmcmds/cli/download/cmd_test.go b/cmds/ocm/commands/ocmcmds/cli/download/cmd_test.go index 2ca30d586e..bb194fc70e 100644 --- a/cmds/ocm/commands/ocmcmds/cli/download/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/cli/download/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download_test import ( diff --git a/cmds/ocm/commands/ocmcmds/cli/download/const.go b/cmds/ocm/commands/ocmcmds/cli/download/const.go index 951069500e..eea3474fd9 100644 --- a/cmds/ocm/commands/ocmcmds/cli/download/const.go +++ b/cmds/ocm/commands/ocmcmds/cli/download/const.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download const COMPONENT = "ocm.software/ocmcli" diff --git a/cmds/ocm/commands/ocmcmds/cli/download/is_unix.go b/cmds/ocm/commands/ocmcmds/cli/download/is_unix.go index 5268beb6fe..29ae32b564 100644 --- a/cmds/ocm/commands/ocmcmds/cli/download/is_unix.go +++ b/cmds/ocm/commands/ocmcmds/cli/download/is_unix.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:build !windows package download diff --git a/cmds/ocm/commands/ocmcmds/cli/download/is_windows.go b/cmds/ocm/commands/ocmcmds/cli/download/is_windows.go index 6151831aab..c578051708 100644 --- a/cmds/ocm/commands/ocmcmds/cli/download/is_windows.go +++ b/cmds/ocm/commands/ocmcmds/cli/download/is_windows.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:build windows package download diff --git a/cmds/ocm/commands/ocmcmds/cli/download/suite_test.go b/cmds/ocm/commands/ocmcmds/cli/download/suite_test.go index cb15765a6e..1d5900d836 100644 --- a/cmds/ocm/commands/ocmcmds/cli/download/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/cli/download/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download_test import ( diff --git a/cmds/ocm/commands/ocmcmds/cmd.go b/cmds/ocm/commands/ocmcmds/cmd.go index 617d3401cb..25d5145b40 100644 --- a/cmds/ocm/commands/ocmcmds/cmd.go +++ b/cmds/ocm/commands/ocmcmds/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocmcmds import ( diff --git a/cmds/ocm/commands/ocmcmds/common/addconfig.go b/cmds/ocm/commands/ocmcmds/common/addconfig.go index 5be1a34f3c..cf8c412052 100644 --- a/cmds/ocm/commands/ocmcmds/common/addconfig.go +++ b/cmds/ocm/commands/ocmcmds/common/addconfig.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/components.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/components.go index 2fc15e8136..aa92ad3c4f 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/components.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/components.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comp import ( diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/elements.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/elements.go index 4f971737ea..9a6b1bcdcc 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/elements.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/elements.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comp import ( diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/interface.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/interface.go index eb2e55c299..cbe8315404 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/interface.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package addhdlrs import ( diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/refs/elements.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/refs/elements.go index b448f44d9a..ae892c882a 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/refs/elements.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/refs/elements.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package refs import ( diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/rscs/elements.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/rscs/elements.go index 7569f6e8e2..ee6a7ea46c 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/rscs/elements.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/rscs/elements.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rscs import ( diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/srcs/elements.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/srcs/elements.go index 78ca12cd00..b2d815b79d 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/srcs/elements.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/srcs/elements.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package srcs import ( diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go index 2801b48f6a..2b9393fad8 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package addhdlrs import ( diff --git a/cmds/ocm/commands/ocmcmds/common/cmds/signing/cmd.go b/cmds/ocm/commands/ocmcmds/common/cmds/signing/cmd.go index 031b5b336e..23f60897d8 100644 --- a/cmds/ocm/commands/ocmcmds/common/cmds/signing/cmd.go +++ b/cmds/ocm/commands/ocmcmds/common/cmds/signing/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/closure.go b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/closure.go index 40c3468fe3..1f91984234 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/closure.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/closure.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comphdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/convert.go b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/convert.go index 123243d834..ffc82cdd76 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/convert.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/convert.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comphdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/options.go b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/options.go index f3c7e1ce64..5fd9674a7e 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/options.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comphdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/sort.go b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/sort.go index cd252766a0..aad35bd61a 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/sort.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/sort.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comphdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go index 9dcceb4839..f0c5ba9512 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comphdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/util.go b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/util.go index f93156b5d8..89f11f6856 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/util.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/util.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comphdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/convert.go b/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/convert.go index 15ca47357a..71151e96bc 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/convert.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/convert.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package elemhdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/options.go b/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/options.go index 91b169e5fa..d13f50f468 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/options.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package elemhdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/output.go b/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/output.go index 91855c9d5e..02e7c61e71 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/output.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/output.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package elemhdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/sort.go b/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/sort.go index b1f74d06da..8127338d8d 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/sort.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/sort.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package elemhdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/typehandler.go b/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/typehandler.go index fc3a57f17f..f6dbbc42ee 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/elemhdlr/typehandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package elemhdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr/typehandler.go b/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr/typehandler.go index 8d9665717f..5d53a59a3a 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr/typehandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package pluginhdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/options.go b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/options.go index 6f6e842841..d1d84a0a92 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/options.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package vershdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/sort.go b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/sort.go index 3ada0c6851..941e6aed41 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/sort.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/sort.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package vershdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go index bc271b09e4..ebf79b7263 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package vershdlr import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/cpi/helper.go b/cmds/ocm/commands/ocmcmds/common/inputs/cpi/helper.go index 1a6f32645d..a1d86c03b5 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/cpi/helper.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/cpi/helper.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/inputfields.go b/cmds/ocm/commands/ocmcmds/common/inputs/inputfields.go index a12819c971..1e94bd2b5c 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/inputfields.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/inputfields.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package inputs import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/inputtype.go b/cmds/ocm/commands/ocmcmds/common/inputs/inputtype.go index ffabedd0f3..dbe7a2b065 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/inputtype.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/inputtype.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package inputs import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/inputtype_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/inputtype_test.go index 5b6752193f..5ffbf25547 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/inputtype_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/inputtype_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package inputs_test import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/suite_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/suite_test.go index fed3737521..73388de780 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package inputs_test import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/testutils/testutils.go b/cmds/ocm/commands/ocmcmds/common/inputs/testutils/testutils.go index 1060539759..3276ec4029 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/testutils/testutils.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/testutils/testutils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testutils import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/cli.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/cli.go index b3d2c88867..b195b28103 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/cli.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package binary import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/inputtype_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/inputtype_test.go index 55438108d3..ee4e761fcc 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/inputtype_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/inputtype_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package binary import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/spec.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/spec.go index d26a65ee10..e7b33599cc 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/spec.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/spec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package binary import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/suite_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/suite_test.go index 66f4cba4e5..b8eb4ac17b 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package binary import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/type.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/type.go index 1a486f7f8a..10d4b76cda 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/type.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/binary/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package binary import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/cli.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/cli.go index 02f34772a0..fe3b007bbf 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/cli.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package directory import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/inputtype_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/inputtype_test.go index 9a64b6f493..8045da8a6b 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/inputtype_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/inputtype_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package directory import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/spec.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/spec.go index 9496001e50..4084b544ab 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/spec.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/spec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package directory import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/suite_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/suite_test.go index bf047104d2..0ec9b54d8f 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package directory import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/type.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/type.go index 8658b9f905..94b92fce4d 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/type.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/directory/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package directory import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/docker/cli.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/docker/cli.go index fb18a09e8f..fae0c599b9 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/docker/cli.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/docker/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/docker/spec.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/docker/spec.go index 67b528ff99..a8a34ffd9c 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/docker/spec.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/docker/spec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/docker/type.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/docker/type.go index 289f1954ce..159e8c4af7 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/docker/type.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/docker/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/cli.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/cli.go index 2fc02b0f3c..ba884b6fb0 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/cli.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockermulti import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/spec.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/spec.go index 44a82e6963..0ab9e15e6f 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/spec.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/spec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockermulti import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/type.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/type.go index b6e4888efd..3c367a33ca 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/type.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockermulti import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/file/cli.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/file/cli.go index f84be039b2..35715de766 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/file/cli.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/file/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package file import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/file/spec.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/file/spec.go index cde4dfec74..c1caefec9c 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/file/spec.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/file/spec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package file import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/file/support.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/file/support.go index fc2d53cf2e..23c10ccb30 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/file/support.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/file/support.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package file import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/file/type.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/file/type.go index ad0957f962..ef38730c1d 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/file/type.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/file/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package file import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/cli.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/cli.go index 5670243a8f..cee1743183 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/cli.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/spec.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/spec.go index 648f61220a..848611a522 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/spec.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/spec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/type.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/type.go index 426cf06bf2..ddb5cead7e 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/type.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/utils.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/utils.go index 61566883d0..7c2f7fe88c 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/utils.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/init.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/init.go index a03bc21f54..ccf3c66649 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/init.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package handlers import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/cli.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/cli.go index 91af337585..7e47332964 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/cli.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifact import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/input_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/input_test.go index 5502158094..c9799f3638 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/input_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/input_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifact_test import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/spec.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/spec.go index 7695eebb24..3809ec45c5 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/spec.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/spec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifact import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/suite_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/suite_test.go index 8d896eda8c..9fadceed1e 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifact_test import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/type.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/type.go index c94e0c4a02..8b9188d5e6 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/type.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifact import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/cli.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/cli.go index 2afa17bf49..3e9a96ea95 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/cli.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spiff import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/spec.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/spec.go index e95eb55bde..b79f6d8a29 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/spec.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/spec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spiff import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/spiff_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/spiff_test.go index 6cb55979fe..f3ef038177 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/spiff_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/spiff_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spiff_test import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/suite_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/suite_test.go index 812ce9536c..845f0a96b4 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spiff_test import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/type.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/type.go index 3b134cf5e0..40e860dff8 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/type.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spiff import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/cli.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/cli.go index 00daa66cbf..166a4c43d4 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/cli.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utf8 import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/inputtype_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/inputtype_test.go index 978d55eb68..073f72401f 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/inputtype_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/inputtype_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utf8 import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/spec.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/spec.go index 835e5b6163..e94c614c73 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/spec.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/spec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utf8 import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/suite_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/suite_test.go index ddb2218189..8dcba1ca84 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utf8 import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/type.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/type.go index 9d1e393dac..8606f59d59 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/type.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utf8 import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/cli.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/cli.go index fb12cf2e58..21c6f72fd5 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/cli.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wget import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/input_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/input_test.go index 5476ce5256..30bb607f0a 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/input_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/input_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wget_test import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/spec.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/spec.go index 2a051a161c..3c58a9d8a1 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/spec.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/spec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wget import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/suite_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/suite_test.go index bf7b09dda2..531313f2e9 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wget_test import ( diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/type.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/type.go index da1285707d..b1b9236a00 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/type.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/wget/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wget import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/comppathopt/comppath_test.go b/cmds/ocm/commands/ocmcmds/common/options/comppathopt/comppath_test.go index 9a65fc9645..cf823a156e 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/comppathopt/comppath_test.go +++ b/cmds/ocm/commands/ocmcmds/common/options/comppathopt/comppath_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comppathopt_test import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/comppathopt/option.go b/cmds/ocm/commands/ocmcmds/common/options/comppathopt/option.go index e0571a7bce..67a113465f 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/comppathopt/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/comppathopt/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comppathopt import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option.go index f511c41ed1..4f8cb8353f 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package downloaderoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/dryrunoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/dryrunoption/option.go index 70818f2617..a0a5c25605 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/dryrunoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/dryrunoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dryrunoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/fileoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/fileoption/option.go index 896ec3f513..f29f6a3c1b 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/fileoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/fileoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package fileoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/hashoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/hashoption/option.go index b8ca3345fa..072eb58368 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/hashoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/hashoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hashoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/keepglobaloption/option.go b/cmds/ocm/commands/ocmcmds/common/options/keepglobaloption/option.go index 593349a206..b2f4ea0192 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/keepglobaloption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/keepglobaloption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package keepglobaloption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/lookupoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/lookupoption/option.go index a16744e45c..38fb8738f1 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/lookupoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/lookupoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package lookupoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/omitaccesstypeoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/omitaccesstypeoption/option.go index fd88747656..8329e58d7b 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/omitaccesstypeoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/omitaccesstypeoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package omitaccesstypeoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/optutils/reg_test.go b/cmds/ocm/commands/ocmcmds/common/options/optutils/reg_test.go index cc0425bcc2..e983644215 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/optutils/reg_test.go +++ b/cmds/ocm/commands/ocmcmds/common/options/optutils/reg_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package optutils_test import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go b/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go index 2126dccc39..36d8033669 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go +++ b/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package optutils import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/optutils/suite_test.go b/cmds/ocm/commands/ocmcmds/common/options/optutils/suite_test.go index 350e84e69c..bdcfd28203 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/optutils/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/common/options/optutils/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package optutils_test import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/overwriteoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/overwriteoption/option.go index b8bfb4af57..3bdf0c67c7 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/overwriteoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/overwriteoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package overwriteoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/repooption/option.go b/cmds/ocm/commands/ocmcmds/common/options/repooption/option.go index b9683f2e9f..f922398789 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/repooption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/repooption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package repooption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/rscbyvalueoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/rscbyvalueoption/option.go index f1f75e199d..1d259f33a4 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/rscbyvalueoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/rscbyvalueoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rscbyvalueoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/schemaoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/schemaoption/option.go index 68d79a3c70..a3a20354f8 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/schemaoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/schemaoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package schemaoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/scriptoption/config.go b/cmds/ocm/commands/ocmcmds/common/options/scriptoption/config.go index 7d2ff5dc5e..dab1b7fe02 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/scriptoption/config.go +++ b/cmds/ocm/commands/ocmcmds/common/options/scriptoption/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package scriptoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/scriptoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/scriptoption/option.go index 0ccf6d3c50..077ea33919 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/scriptoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/scriptoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package scriptoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/signoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/signoption/option.go index affc03c218..2840390e71 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/signoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/signoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/skipdigestoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/skipdigestoption/option.go index 75b0aab48a..94ac9e5531 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/skipdigestoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/skipdigestoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package skipdigestoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/skipupdateoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/skipupdateoption/option.go index fa9a40d08b..23bf3ef97b 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/skipupdateoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/skipupdateoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package skipupdateoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/srcbyvalueoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/srcbyvalueoption/option.go index c68f42c516..e6f3fd8fd0 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/srcbyvalueoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/srcbyvalueoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package srcbyvalueoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/stoponexistingoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/stoponexistingoption/option.go index b8fc9782f8..9a55a36667 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/stoponexistingoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/stoponexistingoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package stoponexistingoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/templateroption/option.go b/cmds/ocm/commands/ocmcmds/common/options/templateroption/option.go index 8126f15b2b..efe98c4cae 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/templateroption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/templateroption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package templateroption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option.go index fa6d2469fa..be11fc982c 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package uploaderoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/suite_test.go b/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/suite_test.go index e89834e31f..72ac4e046b 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package uploaderoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/uploader_test.go b/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/uploader_test.go index 22bdf72984..2591895b54 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/uploader_test.go +++ b/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/uploader_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package uploaderoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/options/versionconstraintsoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/versionconstraintsoption/option.go index 1ea52b7796..8a101cf9f4 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/versionconstraintsoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/versionconstraintsoption/option.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package versionconstraintsoption import ( diff --git a/cmds/ocm/commands/ocmcmds/common/resources.go b/cmds/ocm/commands/ocmcmds/common/resources.go index ffe97068a5..45c5d60d88 100644 --- a/cmds/ocm/commands/ocmcmds/common/resources.go +++ b/cmds/ocm/commands/ocmcmds/common/resources.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/cmds/ocm/commands/ocmcmds/common/resources_test.go b/cmds/ocm/commands/ocmcmds/common/resources_test.go index 4c8e387864..9a3fd4bdf6 100644 --- a/cmds/ocm/commands/ocmcmds/common/resources_test.go +++ b/cmds/ocm/commands/ocmcmds/common/resources_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common_test import ( diff --git a/cmds/ocm/commands/ocmcmds/common/settings.go b/cmds/ocm/commands/ocmcmds/common/settings.go index f72fa75511..d96564edcb 100644 --- a/cmds/ocm/commands/ocmcmds/common/settings.go +++ b/cmds/ocm/commands/ocmcmds/common/settings.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/cmds/ocm/commands/ocmcmds/common/suite_test.go b/cmds/ocm/commands/ocmcmds/common/suite_test.go index 689151b675..ccfc0d2bfc 100644 --- a/cmds/ocm/commands/ocmcmds/common/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/common/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common_test import ( diff --git a/cmds/ocm/commands/ocmcmds/common/utils.go b/cmds/ocm/commands/ocmcmds/common/utils.go index cac497181a..8c237db5da 100644 --- a/cmds/ocm/commands/ocmcmds/common/utils.go +++ b/cmds/ocm/commands/ocmcmds/common/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/cmds/ocm/commands/ocmcmds/componentarchive/cmd.go b/cmds/ocm/commands/ocmcmds/componentarchive/cmd.go index 59357cc40a..0d055b37ce 100644 --- a/cmds/ocm/commands/ocmcmds/componentarchive/cmd.go +++ b/cmds/ocm/commands/ocmcmds/componentarchive/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package componentarchive import ( diff --git a/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd.go b/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd.go index 6954114acb..2a4464fff1 100644 --- a/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd.go +++ b/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package create import ( @@ -9,7 +5,6 @@ import ( "strings" "github.com/mandelsoft/vfs/pkg/vfs" - "github.com/open-component-model/ocm/pkg/clisupport" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -19,6 +14,7 @@ import ( "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/names" "github.com/open-component-model/ocm/cmds/ocm/commands/verbs" "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" + "github.com/open-component-model/ocm/pkg/clisupport" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/clictx" diff --git a/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd_test.go b/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd_test.go index 258451f1d0..9f542f7ff6 100644 --- a/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package create_test import ( diff --git a/cmds/ocm/commands/ocmcmds/componentarchive/create/suite_test.go b/cmds/ocm/commands/ocmcmds/componentarchive/create/suite_test.go index e2319406c3..4b681acb4c 100644 --- a/cmds/ocm/commands/ocmcmds/componentarchive/create/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/componentarchive/create/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package create_test import ( diff --git a/cmds/ocm/commands/ocmcmds/componentarchive/transfer/cmd.go b/cmds/ocm/commands/ocmcmds/componentarchive/transfer/cmd.go index 1d632c87b5..c5604bc0e8 100644 --- a/cmds/ocm/commands/ocmcmds/componentarchive/transfer/cmd.go +++ b/cmds/ocm/commands/ocmcmds/componentarchive/transfer/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer import ( diff --git a/cmds/ocm/commands/ocmcmds/components/add/cmd.go b/cmds/ocm/commands/ocmcmds/components/add/cmd.go index 9c41c7f346..58a6f3f161 100644 --- a/cmds/ocm/commands/ocmcmds/components/add/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/add/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add import ( diff --git a/cmds/ocm/commands/ocmcmds/components/add/cmd_test.go b/cmds/ocm/commands/ocmcmds/components/add/cmd_test.go index b84614ea16..d570b0b176 100644 --- a/cmds/ocm/commands/ocmcmds/components/add/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/components/add/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/add/suite_test.go b/cmds/ocm/commands/ocmcmds/components/add/suite_test.go index 5aaf3b8506..7ed2c5b5ff 100644 --- a/cmds/ocm/commands/ocmcmds/components/add/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/components/add/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/check/cmd.go b/cmds/ocm/commands/ocmcmds/components/check/cmd.go index c298f278d6..f2bd233fbc 100644 --- a/cmds/ocm/commands/ocmcmds/components/check/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/check/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package check import ( diff --git a/cmds/ocm/commands/ocmcmds/components/check/cmd_test.go b/cmds/ocm/commands/ocmcmds/components/check/cmd_test.go index 95dec8b0af..f658fdb47e 100644 --- a/cmds/ocm/commands/ocmcmds/components/check/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/components/check/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package check_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/check/options.go b/cmds/ocm/commands/ocmcmds/components/check/options.go index ca04567f4b..55a1c6d12f 100644 --- a/cmds/ocm/commands/ocmcmds/components/check/options.go +++ b/cmds/ocm/commands/ocmcmds/components/check/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package check import ( diff --git a/cmds/ocm/commands/ocmcmds/components/check/suite_test.go b/cmds/ocm/commands/ocmcmds/components/check/suite_test.go index c7753f5d8d..087c311045 100644 --- a/cmds/ocm/commands/ocmcmds/components/check/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/components/check/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package check_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/cmd.go b/cmds/ocm/commands/ocmcmds/components/cmd.go index f15db411f5..597cc1f09f 100644 --- a/cmds/ocm/commands/ocmcmds/components/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package components import ( diff --git a/cmds/ocm/commands/ocmcmds/components/download/cmd.go b/cmds/ocm/commands/ocmcmds/components/download/cmd.go index 5197fd4d8f..57af5f531f 100644 --- a/cmds/ocm/commands/ocmcmds/components/download/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/download/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download import ( diff --git a/cmds/ocm/commands/ocmcmds/components/download/cmd_test.go b/cmds/ocm/commands/ocmcmds/components/download/cmd_test.go index 3f6c1ea37e..34cc369f66 100644 --- a/cmds/ocm/commands/ocmcmds/components/download/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/components/download/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/download/suite_test.go b/cmds/ocm/commands/ocmcmds/components/download/suite_test.go index 2cefd07fb6..5333856c24 100644 --- a/cmds/ocm/commands/ocmcmds/components/download/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/components/download/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/get/cmd.go b/cmds/ocm/commands/ocmcmds/components/get/cmd.go index 25944d2fc1..6f81005db9 100644 --- a/cmds/ocm/commands/ocmcmds/components/get/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/get/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get import ( diff --git a/cmds/ocm/commands/ocmcmds/components/get/cmd_test.go b/cmds/ocm/commands/ocmcmds/components/get/cmd_test.go index bb8c12f2b7..8fa20be932 100644 --- a/cmds/ocm/commands/ocmcmds/components/get/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/components/get/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/get/suite_test.go b/cmds/ocm/commands/ocmcmds/components/get/suite_test.go index 0986c50bf3..9c35ccb7f3 100644 --- a/cmds/ocm/commands/ocmcmds/components/get/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/components/get/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/hash/cmd.go b/cmds/ocm/commands/ocmcmds/components/hash/cmd.go index 6ad5a7d37f..9c5730639f 100644 --- a/cmds/ocm/commands/ocmcmds/components/hash/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/hash/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hash import ( diff --git a/cmds/ocm/commands/ocmcmds/components/hash/cmd_test.go b/cmds/ocm/commands/ocmcmds/components/hash/cmd_test.go index 949de4210a..ee121232bb 100644 --- a/cmds/ocm/commands/ocmcmds/components/hash/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/components/hash/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hash_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/hash/options.go b/cmds/ocm/commands/ocmcmds/components/hash/options.go index 758644a791..edc82961b1 100644 --- a/cmds/ocm/commands/ocmcmds/components/hash/options.go +++ b/cmds/ocm/commands/ocmcmds/components/hash/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hash import ( diff --git a/cmds/ocm/commands/ocmcmds/components/hash/suite_test.go b/cmds/ocm/commands/ocmcmds/components/hash/suite_test.go index 4e3a9b91ef..325c8d91b1 100644 --- a/cmds/ocm/commands/ocmcmds/components/hash/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/components/hash/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hash_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/list/cmd.go b/cmds/ocm/commands/ocmcmds/components/list/cmd.go index 47d2757abd..66d8e45326 100644 --- a/cmds/ocm/commands/ocmcmds/components/list/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/list/cmd.go @@ -1,17 +1,13 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package list import ( "fmt" - "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr" "github.com/spf13/cobra" ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/lookupoption" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/repooption" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/schemaoption" diff --git a/cmds/ocm/commands/ocmcmds/components/list/cmd_test.go b/cmds/ocm/commands/ocmcmds/components/list/cmd_test.go index 031cc9264f..8a501ca65c 100644 --- a/cmds/ocm/commands/ocmcmds/components/list/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/components/list/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package list_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/list/suite_test.go b/cmds/ocm/commands/ocmcmds/components/list/suite_test.go index a1299859ed..b0f9f1b0dd 100644 --- a/cmds/ocm/commands/ocmcmds/components/list/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/components/list/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package list_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/sign/cmd.go b/cmds/ocm/commands/ocmcmds/components/sign/cmd.go index 0bac2d7c30..e38503bd3a 100644 --- a/cmds/ocm/commands/ocmcmds/components/sign/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/sign/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package sign import ( diff --git a/cmds/ocm/commands/ocmcmds/components/sign/cmd_test.go b/cmds/ocm/commands/ocmcmds/components/sign/cmd_test.go index 05097d367e..79e683ae6c 100644 --- a/cmds/ocm/commands/ocmcmds/components/sign/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/components/sign/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package sign_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/sign/suite_test.go b/cmds/ocm/commands/ocmcmds/components/sign/suite_test.go index b2245fe423..bf47a24103 100644 --- a/cmds/ocm/commands/ocmcmds/components/sign/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/components/sign/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package sign_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/transfer/cmd.go b/cmds/ocm/commands/ocmcmds/components/transfer/cmd.go index 195f37d952..3f2a77b7cc 100644 --- a/cmds/ocm/commands/ocmcmds/components/transfer/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/transfer/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer import ( diff --git a/cmds/ocm/commands/ocmcmds/components/transfer/cmd_test.go b/cmds/ocm/commands/ocmcmds/components/transfer/cmd_test.go index fdad82d84f..53bc0cb9e0 100644 --- a/cmds/ocm/commands/ocmcmds/components/transfer/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/components/transfer/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/transfer/disableupload_test.go b/cmds/ocm/commands/ocmcmds/components/transfer/disableupload_test.go index bd255e1c2b..4782cf0ca2 100644 --- a/cmds/ocm/commands/ocmcmds/components/transfer/disableupload_test.go +++ b/cmds/ocm/commands/ocmcmds/components/transfer/disableupload_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/transfer/suite_test.go b/cmds/ocm/commands/ocmcmds/components/transfer/suite_test.go index e4ab47baa8..8f3709710c 100644 --- a/cmds/ocm/commands/ocmcmds/components/transfer/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/components/transfer/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/transfer/upload_test.go b/cmds/ocm/commands/ocmcmds/components/transfer/upload_test.go index 04e5b72082..8005df7f92 100644 --- a/cmds/ocm/commands/ocmcmds/components/transfer/upload_test.go +++ b/cmds/ocm/commands/ocmcmds/components/transfer/upload_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/verify/cmd.go b/cmds/ocm/commands/ocmcmds/components/verify/cmd.go index 35619e2ca5..048452a19f 100644 --- a/cmds/ocm/commands/ocmcmds/components/verify/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/verify/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package verify import ( diff --git a/cmds/ocm/commands/ocmcmds/components/verify/cmd_test.go b/cmds/ocm/commands/ocmcmds/components/verify/cmd_test.go index 6b16f04261..d500ea47a4 100644 --- a/cmds/ocm/commands/ocmcmds/components/verify/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/components/verify/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package verify_test import ( diff --git a/cmds/ocm/commands/ocmcmds/components/verify/suite_test.go b/cmds/ocm/commands/ocmcmds/components/verify/suite_test.go index 6aad5ddcdc..a20439831f 100644 --- a/cmds/ocm/commands/ocmcmds/components/verify/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/components/verify/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package verify_test import ( diff --git a/cmds/ocm/commands/ocmcmds/ctf/cmd.go b/cmds/ocm/commands/ocmcmds/ctf/cmd.go index f3c807c553..657963d9ad 100644 --- a/cmds/ocm/commands/ocmcmds/ctf/cmd.go +++ b/cmds/ocm/commands/ocmcmds/ctf/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf import ( diff --git a/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go b/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go index a5b4081cc5..415dde9f9b 100644 --- a/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go +++ b/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer import ( diff --git a/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd_test.go b/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd_test.go index 6a1a8a0003..0b55125a30 100644 --- a/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer_test import ( diff --git a/cmds/ocm/commands/ocmcmds/ctf/transfer/suite_test.go b/cmds/ocm/commands/ocmcmds/ctf/transfer/suite_test.go index 7b46b2d1b7..91fe8896bb 100644 --- a/cmds/ocm/commands/ocmcmds/ctf/transfer/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/ctf/transfer/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer_test import ( diff --git a/cmds/ocm/commands/ocmcmds/init.go b/cmds/ocm/commands/ocmcmds/init.go index d0766f6128..aa571e56c2 100644 --- a/cmds/ocm/commands/ocmcmds/init.go +++ b/cmds/ocm/commands/ocmcmds/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocmcmds import ( diff --git a/cmds/ocm/commands/ocmcmds/names/names.go b/cmds/ocm/commands/ocmcmds/names/names.go index dd81133537..bf3b44b534 100644 --- a/cmds/ocm/commands/ocmcmds/names/names.go +++ b/cmds/ocm/commands/ocmcmds/names/names.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package names var ( diff --git a/cmds/ocm/commands/ocmcmds/plugins/cmd.go b/cmds/ocm/commands/ocmcmds/plugins/cmd.go index 9333d72762..e7b3bb9298 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/cmd.go +++ b/cmds/ocm/commands/ocmcmds/plugins/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugins import ( diff --git a/cmds/ocm/commands/ocmcmds/plugins/describe/cmd.go b/cmds/ocm/commands/ocmcmds/plugins/describe/cmd.go index b81d7e3bee..ea568cf15e 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/describe/cmd.go +++ b/cmds/ocm/commands/ocmcmds/plugins/describe/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package describe import ( diff --git a/cmds/ocm/commands/ocmcmds/plugins/describe/cmd_test.go b/cmds/ocm/commands/ocmcmds/plugins/describe/cmd_test.go index b50e58d1f2..2dc4707514 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/describe/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/plugins/describe/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:build unix package describe_test diff --git a/cmds/ocm/commands/ocmcmds/plugins/describe/describe.go b/cmds/ocm/commands/ocmcmds/plugins/describe/describe.go index 322b2094c3..67da8d3f48 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/describe/describe.go +++ b/cmds/ocm/commands/ocmcmds/plugins/describe/describe.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package describe import ( diff --git a/cmds/ocm/commands/ocmcmds/plugins/describe/suite_test.go b/cmds/ocm/commands/ocmcmds/plugins/describe/suite_test.go index f2f1a448df..8860f28775 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/describe/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/plugins/describe/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package describe_test import ( diff --git a/cmds/ocm/commands/ocmcmds/plugins/describe/testdata/action b/cmds/ocm/commands/ocmcmds/plugins/describe/testdata/action index 0df59877e0..8443c4c3ec 100755 --- a/cmds/ocm/commands/ocmcmds/plugins/describe/testdata/action +++ b/cmds/ocm/commands/ocmcmds/plugins/describe/testdata/action @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" Error() { diff --git a/cmds/ocm/commands/ocmcmds/plugins/describe/testdata/test b/cmds/ocm/commands/ocmcmds/plugins/describe/testdata/test index 2659730865..a99dc69aad 100755 --- a/cmds/ocm/commands/ocmcmds/plugins/describe/testdata/test +++ b/cmds/ocm/commands/ocmcmds/plugins/describe/testdata/test @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" Error() { diff --git a/cmds/ocm/commands/ocmcmds/plugins/get/cmd.go b/cmds/ocm/commands/ocmcmds/plugins/get/cmd.go index 347d3849b9..1347dc1e73 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/get/cmd.go +++ b/cmds/ocm/commands/ocmcmds/plugins/get/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get import ( diff --git a/cmds/ocm/commands/ocmcmds/plugins/get/cmd_test.go b/cmds/ocm/commands/ocmcmds/plugins/get/cmd_test.go index ba8e31201f..739327d3ef 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/get/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/plugins/get/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:build unix package get_test diff --git a/cmds/ocm/commands/ocmcmds/plugins/get/suite_test.go b/cmds/ocm/commands/ocmcmds/plugins/get/suite_test.go index 1fc1b991da..c7663f71d8 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/get/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/plugins/get/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/ocmcmds/plugins/get/testdata/test b/cmds/ocm/commands/ocmcmds/plugins/get/testdata/test index 2659730865..a99dc69aad 100755 --- a/cmds/ocm/commands/ocmcmds/plugins/get/testdata/test +++ b/cmds/ocm/commands/ocmcmds/plugins/get/testdata/test @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" Error() { diff --git a/cmds/ocm/commands/ocmcmds/plugins/install/cmd.go b/cmds/ocm/commands/ocmcmds/plugins/install/cmd.go index 5ed274af82..2f9ebd987f 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/install/cmd.go +++ b/cmds/ocm/commands/ocmcmds/plugins/install/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install import ( diff --git a/cmds/ocm/commands/ocmcmds/plugins/install/suite_test.go b/cmds/ocm/commands/ocmcmds/plugins/install/suite_test.go index 714be3d1a3..552279553e 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/install/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/plugins/install/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install_test import ( diff --git a/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/cmd_test.go b/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/cmd_test.go index 9557131805..dbba590d97 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessmethods_test import ( diff --git a/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/suite_test.go b/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/suite_test.go index 29a58e6af1..1a9e8d9af4 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessmethods_test import ( diff --git a/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/testdata/test b/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/testdata/test index 566e080ff1..71243c2dfc 100755 --- a/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/testdata/test +++ b/cmds/ocm/commands/ocmcmds/plugins/tests/accessmethods/testdata/test @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" Error() { diff --git a/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/cmd_test.go b/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/cmd_test.go index 12812e0d8d..039cc03c61 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package routingslips_test import ( diff --git a/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/suite_test.go b/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/suite_test.go index 025f19b67a..5da4a4a899 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package routingslips_test import ( diff --git a/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/testdata/test b/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/testdata/test index 3162fb01f3..65d99addb7 100755 --- a/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/testdata/test +++ b/cmds/ocm/commands/ocmcmds/plugins/tests/routingslips/testdata/test @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" set -e diff --git a/cmds/ocm/commands/ocmcmds/references/add/cmd.go b/cmds/ocm/commands/ocmcmds/references/add/cmd.go index 16c0427bd7..fdef0d6da2 100644 --- a/cmds/ocm/commands/ocmcmds/references/add/cmd.go +++ b/cmds/ocm/commands/ocmcmds/references/add/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add import ( diff --git a/cmds/ocm/commands/ocmcmds/references/add/cmd_test.go b/cmds/ocm/commands/ocmcmds/references/add/cmd_test.go index 30af56ff21..586a87b60d 100644 --- a/cmds/ocm/commands/ocmcmds/references/add/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/references/add/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add_test import ( diff --git a/cmds/ocm/commands/ocmcmds/references/add/provider.go b/cmds/ocm/commands/ocmcmds/references/add/provider.go index 248aaa6c0c..a0a948c589 100644 --- a/cmds/ocm/commands/ocmcmds/references/add/provider.go +++ b/cmds/ocm/commands/ocmcmds/references/add/provider.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add import ( diff --git a/cmds/ocm/commands/ocmcmds/references/add/suite_test.go b/cmds/ocm/commands/ocmcmds/references/add/suite_test.go index b9fd9462b1..f71b4bb96f 100644 --- a/cmds/ocm/commands/ocmcmds/references/add/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/references/add/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add_test import ( diff --git a/cmds/ocm/commands/ocmcmds/references/cmd.go b/cmds/ocm/commands/ocmcmds/references/cmd.go index ea1165e286..798a0503b8 100644 --- a/cmds/ocm/commands/ocmcmds/references/cmd.go +++ b/cmds/ocm/commands/ocmcmds/references/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package references import ( diff --git a/cmds/ocm/commands/ocmcmds/references/common/typehandler.go b/cmds/ocm/commands/ocmcmds/references/common/typehandler.go index 888f6720e4..1d603f50c2 100644 --- a/cmds/ocm/commands/ocmcmds/references/common/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/references/common/typehandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/cmds/ocm/commands/ocmcmds/references/get/cmd.go b/cmds/ocm/commands/ocmcmds/references/get/cmd.go index 598fec1e18..3f61c030bf 100644 --- a/cmds/ocm/commands/ocmcmds/references/get/cmd.go +++ b/cmds/ocm/commands/ocmcmds/references/get/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get import ( diff --git a/cmds/ocm/commands/ocmcmds/references/get/cmd_test.go b/cmds/ocm/commands/ocmcmds/references/get/cmd_test.go index e8b1024a15..3deb2538b7 100644 --- a/cmds/ocm/commands/ocmcmds/references/get/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/references/get/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/ocmcmds/references/get/suite_test.go b/cmds/ocm/commands/ocmcmds/references/get/suite_test.go index 6bbee06d5c..74287bb6c3 100644 --- a/cmds/ocm/commands/ocmcmds/references/get/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/references/get/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/ocmcmds/resourceconfig/add/cmd.go b/cmds/ocm/commands/ocmcmds/resourceconfig/add/cmd.go index e63d71ed01..826cc8278d 100644 --- a/cmds/ocm/commands/ocmcmds/resourceconfig/add/cmd.go +++ b/cmds/ocm/commands/ocmcmds/resourceconfig/add/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add import ( diff --git a/cmds/ocm/commands/ocmcmds/resourceconfig/add/cmd_test.go b/cmds/ocm/commands/ocmcmds/resourceconfig/add/cmd_test.go index 83e61da861..dd6805e198 100644 --- a/cmds/ocm/commands/ocmcmds/resourceconfig/add/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/resourceconfig/add/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add_test import ( diff --git a/cmds/ocm/commands/ocmcmds/resourceconfig/add/suite_test.go b/cmds/ocm/commands/ocmcmds/resourceconfig/add/suite_test.go index 8cfbdfd074..6dd1820081 100644 --- a/cmds/ocm/commands/ocmcmds/resourceconfig/add/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/resourceconfig/add/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add_test import ( diff --git a/cmds/ocm/commands/ocmcmds/resourceconfig/cmd.go b/cmds/ocm/commands/ocmcmds/resourceconfig/cmd.go index 3e3cc7617f..9aff8887e4 100644 --- a/cmds/ocm/commands/ocmcmds/resourceconfig/cmd.go +++ b/cmds/ocm/commands/ocmcmds/resourceconfig/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package resourceconfig import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/add/cmd.go b/cmds/ocm/commands/ocmcmds/resources/add/cmd.go index d5e974734a..2bf53f1119 100644 --- a/cmds/ocm/commands/ocmcmds/resources/add/cmd.go +++ b/cmds/ocm/commands/ocmcmds/resources/add/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/add/cmd_test.go b/cmds/ocm/commands/ocmcmds/resources/add/cmd_test.go index 750a7964f4..779b270294 100644 --- a/cmds/ocm/commands/ocmcmds/resources/add/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/resources/add/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add_test import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/add/provider.go b/cmds/ocm/commands/ocmcmds/resources/add/provider.go index 24abdaf247..5224a9beed 100644 --- a/cmds/ocm/commands/ocmcmds/resources/add/provider.go +++ b/cmds/ocm/commands/ocmcmds/resources/add/provider.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/add/suite_test.go b/cmds/ocm/commands/ocmcmds/resources/add/suite_test.go index df3aea6a21..75aa638921 100644 --- a/cmds/ocm/commands/ocmcmds/resources/add/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/resources/add/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add_test import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/cmd.go b/cmds/ocm/commands/ocmcmds/resources/cmd.go index eff7fb68a2..eab7809ec0 100644 --- a/cmds/ocm/commands/ocmcmds/resources/cmd.go +++ b/cmds/ocm/commands/ocmcmds/resources/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package resources import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/common/typehandler.go b/cmds/ocm/commands/ocmcmds/resources/common/typehandler.go index d65f6f6925..0351c34bf8 100644 --- a/cmds/ocm/commands/ocmcmds/resources/common/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/resources/common/typehandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/download/action.go b/cmds/ocm/commands/ocmcmds/resources/download/action.go index d2e0eaac6c..7d543716bd 100644 --- a/cmds/ocm/commands/ocmcmds/resources/download/action.go +++ b/cmds/ocm/commands/ocmcmds/resources/download/action.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/download/cmd.go b/cmds/ocm/commands/ocmcmds/resources/download/cmd.go index 2fd88eef59..38272f7a9b 100644 --- a/cmds/ocm/commands/ocmcmds/resources/download/cmd.go +++ b/cmds/ocm/commands/ocmcmds/resources/download/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/download/cmd_test.go b/cmds/ocm/commands/ocmcmds/resources/download/cmd_test.go index 6444db9c68..c170782d54 100644 --- a/cmds/ocm/commands/ocmcmds/resources/download/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/resources/download/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download_test import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/download/dirtree_test.go b/cmds/ocm/commands/ocmcmds/resources/download/dirtree_test.go index d5f978ad47..8f7a6677b6 100644 --- a/cmds/ocm/commands/ocmcmds/resources/download/dirtree_test.go +++ b/cmds/ocm/commands/ocmcmds/resources/download/dirtree_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download_test import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/download/options.go b/cmds/ocm/commands/ocmcmds/resources/download/options.go index cc4bd735f4..a23a78f641 100644 --- a/cmds/ocm/commands/ocmcmds/resources/download/options.go +++ b/cmds/ocm/commands/ocmcmds/resources/download/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/download/suite_test.go b/cmds/ocm/commands/ocmcmds/resources/download/suite_test.go index 2cefd07fb6..5333856c24 100644 --- a/cmds/ocm/commands/ocmcmds/resources/download/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/resources/download/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download_test import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/get/cmd.go b/cmds/ocm/commands/ocmcmds/resources/get/cmd.go index c66176d9ca..4877b52fa5 100644 --- a/cmds/ocm/commands/ocmcmds/resources/get/cmd.go +++ b/cmds/ocm/commands/ocmcmds/resources/get/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/get/cmd_test.go b/cmds/ocm/commands/ocmcmds/resources/get/cmd_test.go index 0edac1b527..8c7e389201 100644 --- a/cmds/ocm/commands/ocmcmds/resources/get/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/resources/get/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/get/deep_test.go b/cmds/ocm/commands/ocmcmds/resources/get/deep_test.go index 61252380d8..aea2298126 100644 --- a/cmds/ocm/commands/ocmcmds/resources/get/deep_test.go +++ b/cmds/ocm/commands/ocmcmds/resources/get/deep_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/ocmcmds/resources/get/suite_test.go b/cmds/ocm/commands/ocmcmds/resources/get/suite_test.go index 6bbee06d5c..74287bb6c3 100644 --- a/cmds/ocm/commands/ocmcmds/resources/get/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/resources/get/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/ocmcmds/routingslips/add/cmd.go b/cmds/ocm/commands/ocmcmds/routingslips/add/cmd.go index b47d086340..2b7c2cb1f7 100644 --- a/cmds/ocm/commands/ocmcmds/routingslips/add/cmd.go +++ b/cmds/ocm/commands/ocmcmds/routingslips/add/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add import ( diff --git a/cmds/ocm/commands/ocmcmds/routingslips/add/cmd_test.go b/cmds/ocm/commands/ocmcmds/routingslips/add/cmd_test.go index 177b173df9..84676d6051 100644 --- a/cmds/ocm/commands/ocmcmds/routingslips/add/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/routingslips/add/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add_test import ( diff --git a/cmds/ocm/commands/ocmcmds/routingslips/add/suite_test.go b/cmds/ocm/commands/ocmcmds/routingslips/add/suite_test.go index c6034febd6..6285705a72 100644 --- a/cmds/ocm/commands/ocmcmds/routingslips/add/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/routingslips/add/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add_test import ( diff --git a/cmds/ocm/commands/ocmcmds/routingslips/cmd.go b/cmds/ocm/commands/ocmcmds/routingslips/cmd.go index fc69b2b94d..3af64eca38 100644 --- a/cmds/ocm/commands/ocmcmds/routingslips/cmd.go +++ b/cmds/ocm/commands/ocmcmds/routingslips/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package routingslips import ( diff --git a/cmds/ocm/commands/ocmcmds/routingslips/common/options.go b/cmds/ocm/commands/ocmcmds/routingslips/common/options.go index 9a337cd2b3..f6d1039f28 100644 --- a/cmds/ocm/commands/ocmcmds/routingslips/common/options.go +++ b/cmds/ocm/commands/ocmcmds/routingslips/common/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/cmds/ocm/commands/ocmcmds/routingslips/common/typehandler.go b/cmds/ocm/commands/ocmcmds/routingslips/common/typehandler.go index f5fbdf746c..b1051ea700 100644 --- a/cmds/ocm/commands/ocmcmds/routingslips/common/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/routingslips/common/typehandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/cmds/ocm/commands/ocmcmds/routingslips/get/cmd.go b/cmds/ocm/commands/ocmcmds/routingslips/get/cmd.go index c6645213ec..8ddfb92a84 100644 --- a/cmds/ocm/commands/ocmcmds/routingslips/get/cmd.go +++ b/cmds/ocm/commands/ocmcmds/routingslips/get/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get import ( diff --git a/cmds/ocm/commands/ocmcmds/routingslips/get/cmd_test.go b/cmds/ocm/commands/ocmcmds/routingslips/get/cmd_test.go index 7fde37874c..72326b0e3e 100644 --- a/cmds/ocm/commands/ocmcmds/routingslips/get/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/routingslips/get/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/ocmcmds/routingslips/get/options.go b/cmds/ocm/commands/ocmcmds/routingslips/get/options.go index a3bd5d0de6..2741cdc2d2 100644 --- a/cmds/ocm/commands/ocmcmds/routingslips/get/options.go +++ b/cmds/ocm/commands/ocmcmds/routingslips/get/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get import ( diff --git a/cmds/ocm/commands/ocmcmds/routingslips/get/suite_test.go b/cmds/ocm/commands/ocmcmds/routingslips/get/suite_test.go index cc430b3e5c..d4eac5d24e 100644 --- a/cmds/ocm/commands/ocmcmds/routingslips/get/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/routingslips/get/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/ocmcmds/sourceconfig/add/cmd.go b/cmds/ocm/commands/ocmcmds/sourceconfig/add/cmd.go index 79184ba76f..40a06f79f1 100644 --- a/cmds/ocm/commands/ocmcmds/sourceconfig/add/cmd.go +++ b/cmds/ocm/commands/ocmcmds/sourceconfig/add/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add import ( diff --git a/cmds/ocm/commands/ocmcmds/sourceconfig/add/cmd_test.go b/cmds/ocm/commands/ocmcmds/sourceconfig/add/cmd_test.go index 93d5aa8c8d..633b194b8b 100644 --- a/cmds/ocm/commands/ocmcmds/sourceconfig/add/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/sourceconfig/add/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add_test import ( diff --git a/cmds/ocm/commands/ocmcmds/sourceconfig/add/suite_test.go b/cmds/ocm/commands/ocmcmds/sourceconfig/add/suite_test.go index 8cfbdfd074..6dd1820081 100644 --- a/cmds/ocm/commands/ocmcmds/sourceconfig/add/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/sourceconfig/add/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add_test import ( diff --git a/cmds/ocm/commands/ocmcmds/sourceconfig/cmd.go b/cmds/ocm/commands/ocmcmds/sourceconfig/cmd.go index 4c8527fb18..c89bbf4057 100644 --- a/cmds/ocm/commands/ocmcmds/sourceconfig/cmd.go +++ b/cmds/ocm/commands/ocmcmds/sourceconfig/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package sourceconfig import ( diff --git a/cmds/ocm/commands/ocmcmds/sources/add/cmd.go b/cmds/ocm/commands/ocmcmds/sources/add/cmd.go index 1b8e16782b..95c9fbf31e 100644 --- a/cmds/ocm/commands/ocmcmds/sources/add/cmd.go +++ b/cmds/ocm/commands/ocmcmds/sources/add/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add import ( diff --git a/cmds/ocm/commands/ocmcmds/sources/add/cmd_test.go b/cmds/ocm/commands/ocmcmds/sources/add/cmd_test.go index 5d2768623b..631c1b125e 100644 --- a/cmds/ocm/commands/ocmcmds/sources/add/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/sources/add/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add_test import ( diff --git a/cmds/ocm/commands/ocmcmds/sources/add/suite_test.go b/cmds/ocm/commands/ocmcmds/sources/add/suite_test.go index b9fd9462b1..f71b4bb96f 100644 --- a/cmds/ocm/commands/ocmcmds/sources/add/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/sources/add/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add_test import ( diff --git a/cmds/ocm/commands/ocmcmds/sources/cmd.go b/cmds/ocm/commands/ocmcmds/sources/cmd.go index e4b7fe9e5c..19378385e3 100644 --- a/cmds/ocm/commands/ocmcmds/sources/cmd.go +++ b/cmds/ocm/commands/ocmcmds/sources/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package sources import ( diff --git a/cmds/ocm/commands/ocmcmds/sources/common/typehandler.go b/cmds/ocm/commands/ocmcmds/sources/common/typehandler.go index 7a7d2d5071..60f75806fc 100644 --- a/cmds/ocm/commands/ocmcmds/sources/common/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/sources/common/typehandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/cmds/ocm/commands/ocmcmds/sources/get/cmd.go b/cmds/ocm/commands/ocmcmds/sources/get/cmd.go index e7bac039ad..4b119d8ff1 100644 --- a/cmds/ocm/commands/ocmcmds/sources/get/cmd.go +++ b/cmds/ocm/commands/ocmcmds/sources/get/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get import ( diff --git a/cmds/ocm/commands/ocmcmds/sources/get/cmd_test.go b/cmds/ocm/commands/ocmcmds/sources/get/cmd_test.go index c0e625238c..a2c126f6a7 100644 --- a/cmds/ocm/commands/ocmcmds/sources/get/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/sources/get/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/ocmcmds/sources/get/suite_test.go b/cmds/ocm/commands/ocmcmds/sources/get/suite_test.go index f452275ca9..47cb6a0eb0 100644 --- a/cmds/ocm/commands/ocmcmds/sources/get/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/sources/get/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get_test import ( diff --git a/cmds/ocm/commands/ocmcmds/versions/cmd.go b/cmds/ocm/commands/ocmcmds/versions/cmd.go index 069cb89306..b40031b0d3 100644 --- a/cmds/ocm/commands/ocmcmds/versions/cmd.go +++ b/cmds/ocm/commands/ocmcmds/versions/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package versions import ( diff --git a/cmds/ocm/commands/ocmcmds/versions/show/cmd.go b/cmds/ocm/commands/ocmcmds/versions/show/cmd.go index 28631943db..c5394ecddd 100644 --- a/cmds/ocm/commands/ocmcmds/versions/show/cmd.go +++ b/cmds/ocm/commands/ocmcmds/versions/show/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package show import ( diff --git a/cmds/ocm/commands/ocmcmds/versions/show/cmd_test.go b/cmds/ocm/commands/ocmcmds/versions/show/cmd_test.go index d9dea291a4..330a8945e1 100644 --- a/cmds/ocm/commands/ocmcmds/versions/show/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/versions/show/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package show_test import ( diff --git a/cmds/ocm/commands/ocmcmds/versions/show/suite_test.go b/cmds/ocm/commands/ocmcmds/versions/show/suite_test.go index a622b98a20..308c7d37a0 100644 --- a/cmds/ocm/commands/ocmcmds/versions/show/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/versions/show/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package show_test import ( diff --git a/cmds/ocm/commands/toicmds/cmd.go b/cmds/ocm/commands/toicmds/cmd.go index 9326e592f9..33a3ee21c9 100644 --- a/cmds/ocm/commands/toicmds/cmd.go +++ b/cmds/ocm/commands/toicmds/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package toicmds import ( diff --git a/cmds/ocm/commands/toicmds/config/bootstrap/cmd.go b/cmds/ocm/commands/toicmds/config/bootstrap/cmd.go index 8e2ecd6a4f..910f3c7c02 100644 --- a/cmds/ocm/commands/toicmds/config/bootstrap/cmd.go +++ b/cmds/ocm/commands/toicmds/config/bootstrap/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package bootstrap import ( diff --git a/cmds/ocm/commands/toicmds/config/bootstrap/cmd_test.go b/cmds/ocm/commands/toicmds/config/bootstrap/cmd_test.go index 969aa6463c..9d0ebc014c 100644 --- a/cmds/ocm/commands/toicmds/config/bootstrap/cmd_test.go +++ b/cmds/ocm/commands/toicmds/config/bootstrap/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package bootstrap_test import ( diff --git a/cmds/ocm/commands/toicmds/config/bootstrap/suite_test.go b/cmds/ocm/commands/toicmds/config/bootstrap/suite_test.go index 6ca42b93c2..68b8823c6a 100644 --- a/cmds/ocm/commands/toicmds/config/bootstrap/suite_test.go +++ b/cmds/ocm/commands/toicmds/config/bootstrap/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package bootstrap_test import ( diff --git a/cmds/ocm/commands/toicmds/config/cmd.go b/cmds/ocm/commands/toicmds/config/cmd.go index e1c0475006..cb3d174032 100644 --- a/cmds/ocm/commands/toicmds/config/cmd.go +++ b/cmds/ocm/commands/toicmds/config/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/cmds/ocm/commands/toicmds/names/names.go b/cmds/ocm/commands/toicmds/names/names.go index 911bb187d5..7651b222d5 100644 --- a/cmds/ocm/commands/toicmds/names/names.go +++ b/cmds/ocm/commands/toicmds/names/names.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package names import ( diff --git a/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go b/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go index 3f5c83c0d0..b74e9f5788 100644 --- a/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go +++ b/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package bootstrap import ( diff --git a/cmds/ocm/commands/toicmds/package/cmd.go b/cmds/ocm/commands/toicmds/package/cmd.go index 82f21b6355..4e38640658 100644 --- a/cmds/ocm/commands/toicmds/package/cmd.go +++ b/cmds/ocm/commands/toicmds/package/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package _package import ( diff --git a/cmds/ocm/commands/toicmds/package/describe/cmd.go b/cmds/ocm/commands/toicmds/package/describe/cmd.go index 8d731eceb4..aac0af3958 100644 --- a/cmds/ocm/commands/toicmds/package/describe/cmd.go +++ b/cmds/ocm/commands/toicmds/package/describe/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package describe import ( diff --git a/cmds/ocm/commands/toicmds/verbs/bootstrap/cmd.go b/cmds/ocm/commands/toicmds/verbs/bootstrap/cmd.go index 4160dc3dbf..392e56a582 100644 --- a/cmds/ocm/commands/toicmds/verbs/bootstrap/cmd.go +++ b/cmds/ocm/commands/toicmds/verbs/bootstrap/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package bootstrap import ( diff --git a/cmds/ocm/commands/toicmds/verbs/describe/cmd.go b/cmds/ocm/commands/toicmds/verbs/describe/cmd.go index c7c1f044c0..baa8d8be91 100644 --- a/cmds/ocm/commands/toicmds/verbs/describe/cmd.go +++ b/cmds/ocm/commands/toicmds/verbs/describe/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package describe import ( diff --git a/cmds/ocm/commands/verbs/add/cmd.go b/cmds/ocm/commands/verbs/add/cmd.go index 1a1463eded..edb914aff9 100644 --- a/cmds/ocm/commands/verbs/add/cmd.go +++ b/cmds/ocm/commands/verbs/add/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package add import ( diff --git a/cmds/ocm/commands/verbs/bootstrap/cmd.go b/cmds/ocm/commands/verbs/bootstrap/cmd.go index 8fae1eb054..cc03afb76e 100644 --- a/cmds/ocm/commands/verbs/bootstrap/cmd.go +++ b/cmds/ocm/commands/verbs/bootstrap/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package bootstrap import ( diff --git a/cmds/ocm/commands/verbs/check/cmd.go b/cmds/ocm/commands/verbs/check/cmd.go index 1cc30fffb2..ca7066080d 100644 --- a/cmds/ocm/commands/verbs/check/cmd.go +++ b/cmds/ocm/commands/verbs/check/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package check import ( diff --git a/cmds/ocm/commands/verbs/clean/cmd.go b/cmds/ocm/commands/verbs/clean/cmd.go index 293ae430aa..ffcb815683 100644 --- a/cmds/ocm/commands/verbs/clean/cmd.go +++ b/cmds/ocm/commands/verbs/clean/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package clean import ( diff --git a/cmds/ocm/commands/verbs/controller/cmd.go b/cmds/ocm/commands/verbs/controller/cmd.go index 3575fb9988..3ad8733b2c 100644 --- a/cmds/ocm/commands/verbs/controller/cmd.go +++ b/cmds/ocm/commands/verbs/controller/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package controller import ( diff --git a/cmds/ocm/commands/verbs/create/cmd.go b/cmds/ocm/commands/verbs/create/cmd.go index 2f74878662..0cd77a58da 100644 --- a/cmds/ocm/commands/verbs/create/cmd.go +++ b/cmds/ocm/commands/verbs/create/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package create import ( diff --git a/cmds/ocm/commands/verbs/describe/cmd.go b/cmds/ocm/commands/verbs/describe/cmd.go index 3053da21a0..e3d27ad9f5 100644 --- a/cmds/ocm/commands/verbs/describe/cmd.go +++ b/cmds/ocm/commands/verbs/describe/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package describe import ( diff --git a/cmds/ocm/commands/verbs/download/cmd.go b/cmds/ocm/commands/verbs/download/cmd.go index d2340e34f7..e8803b576e 100644 --- a/cmds/ocm/commands/verbs/download/cmd.go +++ b/cmds/ocm/commands/verbs/download/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download import ( diff --git a/cmds/ocm/commands/verbs/execute/cmd.go b/cmds/ocm/commands/verbs/execute/cmd.go index 7ce8c16998..059aac275b 100644 --- a/cmds/ocm/commands/verbs/execute/cmd.go +++ b/cmds/ocm/commands/verbs/execute/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package execute import ( diff --git a/cmds/ocm/commands/verbs/get/cmd.go b/cmds/ocm/commands/verbs/get/cmd.go index d731963f25..61d22474b1 100644 --- a/cmds/ocm/commands/verbs/get/cmd.go +++ b/cmds/ocm/commands/verbs/get/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get import ( diff --git a/cmds/ocm/commands/verbs/hash/cmd.go b/cmds/ocm/commands/verbs/hash/cmd.go index d5634caaf7..ce3e1a14b8 100644 --- a/cmds/ocm/commands/verbs/hash/cmd.go +++ b/cmds/ocm/commands/verbs/hash/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hash import ( diff --git a/cmds/ocm/commands/verbs/install/cmd.go b/cmds/ocm/commands/verbs/install/cmd.go index d5e1f61cdd..8a33b82318 100644 --- a/cmds/ocm/commands/verbs/install/cmd.go +++ b/cmds/ocm/commands/verbs/install/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install import ( diff --git a/cmds/ocm/commands/verbs/list/cmd.go b/cmds/ocm/commands/verbs/list/cmd.go index 9be99c6001..465ec1a715 100644 --- a/cmds/ocm/commands/verbs/list/cmd.go +++ b/cmds/ocm/commands/verbs/list/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package list import ( diff --git a/cmds/ocm/commands/verbs/show/cmd.go b/cmds/ocm/commands/verbs/show/cmd.go index 4511a8b11b..68269c549d 100644 --- a/cmds/ocm/commands/verbs/show/cmd.go +++ b/cmds/ocm/commands/verbs/show/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package show import ( diff --git a/cmds/ocm/commands/verbs/sign/cmd.go b/cmds/ocm/commands/verbs/sign/cmd.go index 9de900ee40..0dcfb1c2bd 100644 --- a/cmds/ocm/commands/verbs/sign/cmd.go +++ b/cmds/ocm/commands/verbs/sign/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package sign import ( diff --git a/cmds/ocm/commands/verbs/transfer/cmd.go b/cmds/ocm/commands/verbs/transfer/cmd.go index 05ef619866..e65a565486 100644 --- a/cmds/ocm/commands/verbs/transfer/cmd.go +++ b/cmds/ocm/commands/verbs/transfer/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer import ( diff --git a/cmds/ocm/commands/verbs/verbs.go b/cmds/ocm/commands/verbs/verbs.go index 489ae83c91..578e73d313 100644 --- a/cmds/ocm/commands/verbs/verbs.go +++ b/cmds/ocm/commands/verbs/verbs.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package verbs const ( diff --git a/cmds/ocm/commands/verbs/verify/cmd.go b/cmds/ocm/commands/verbs/verify/cmd.go index b1b01a80bc..3e314da437 100644 --- a/cmds/ocm/commands/verbs/verify/cmd.go +++ b/cmds/ocm/commands/verbs/verify/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package verify import ( diff --git a/cmds/ocm/main.go b/cmds/ocm/main.go index 1ab728579f..2514bc96c4 100644 --- a/cmds/ocm/main.go +++ b/cmds/ocm/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/cmds/ocm/pkg/data/convert.go b/cmds/ocm/pkg/data/convert.go index a9047b9c64..86c5a1ae12 100644 --- a/cmds/ocm/pkg/data/convert.go +++ b/cmds/ocm/pkg/data/convert.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package data func Slice(s Iterable) []interface{} { diff --git a/cmds/ocm/pkg/data/dll.go b/cmds/ocm/pkg/data/dll.go index f1b61d6078..6d889468ec 100644 --- a/cmds/ocm/pkg/data/dll.go +++ b/cmds/ocm/pkg/data/dll.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package data import ( diff --git a/cmds/ocm/pkg/data/dll_test.go b/cmds/ocm/pkg/data/dll_test.go index f1a433f793..1e3e5a49eb 100644 --- a/cmds/ocm/pkg/data/dll_test.go +++ b/cmds/ocm/pkg/data/dll_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package data import ( diff --git a/cmds/ocm/pkg/data/indexed.go b/cmds/ocm/pkg/data/indexed.go index da4eb59960..eeb282c1d8 100644 --- a/cmds/ocm/pkg/data/indexed.go +++ b/cmds/ocm/pkg/data/indexed.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package data type IndexedAccess interface { diff --git a/cmds/ocm/pkg/data/indexed_test.go b/cmds/ocm/pkg/data/indexed_test.go index f0478aba32..4ff03d50d8 100644 --- a/cmds/ocm/pkg/data/indexed_test.go +++ b/cmds/ocm/pkg/data/indexed_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package data import ( diff --git a/cmds/ocm/pkg/data/iterator.go b/cmds/ocm/pkg/data/iterator.go index 8d605e03b8..b8ddb5400d 100644 --- a/cmds/ocm/pkg/data/iterator.go +++ b/cmds/ocm/pkg/data/iterator.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package data type Iterable interface { diff --git a/cmds/ocm/pkg/data/list.go b/cmds/ocm/pkg/data/list.go index 44e434b12d..0c39825ee7 100644 --- a/cmds/ocm/pkg/data/list.go +++ b/cmds/ocm/pkg/data/list.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package data type Appender interface { diff --git a/cmds/ocm/pkg/data/list_test.go b/cmds/ocm/pkg/data/list_test.go index a5043ad6a3..b0c749a957 100644 --- a/cmds/ocm/pkg/data/list_test.go +++ b/cmds/ocm/pkg/data/list_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package data import ( diff --git a/cmds/ocm/pkg/data/sort.go b/cmds/ocm/pkg/data/sort.go index 1f0b960227..7ebc5e2da2 100644 --- a/cmds/ocm/pkg/data/sort.go +++ b/cmds/ocm/pkg/data/sort.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package data import ( diff --git a/cmds/ocm/pkg/data/suite_test.go b/cmds/ocm/pkg/data/suite_test.go index 8a6562cbca..3b6ca331cb 100644 --- a/cmds/ocm/pkg/data/suite_test.go +++ b/cmds/ocm/pkg/data/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package data_test import ( diff --git a/cmds/ocm/pkg/options/interfaces.go b/cmds/ocm/pkg/options/interfaces.go index a3f0571920..e6a12a1a59 100644 --- a/cmds/ocm/pkg/options/interfaces.go +++ b/cmds/ocm/pkg/options/interfaces.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package options import ( diff --git a/cmds/ocm/pkg/options/options_test.go b/cmds/ocm/pkg/options/options_test.go index 262ad351c5..24d31ccee2 100644 --- a/cmds/ocm/pkg/options/options_test.go +++ b/cmds/ocm/pkg/options/options_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package options_test import ( diff --git a/cmds/ocm/pkg/options/suite_test.go b/cmds/ocm/pkg/options/suite_test.go index 20e1de5cea..c3faafe4c2 100644 --- a/cmds/ocm/pkg/options/suite_test.go +++ b/cmds/ocm/pkg/options/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package options_test import ( diff --git a/cmds/ocm/pkg/output/attroutput.go b/cmds/ocm/pkg/output/attroutput.go index e9389df70d..4f55074554 100644 --- a/cmds/ocm/pkg/output/attroutput.go +++ b/cmds/ocm/pkg/output/attroutput.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/attrset.go b/cmds/ocm/pkg/output/attrset.go index cfbb95d00c..f38d31691f 100644 --- a/cmds/ocm/pkg/output/attrset.go +++ b/cmds/ocm/pkg/output/attrset.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/chain.go b/cmds/ocm/pkg/output/chain.go index adc7a11c85..bcbca994a1 100644 --- a/cmds/ocm/pkg/output/chain.go +++ b/cmds/ocm/pkg/output/chain.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/complexoutput.go b/cmds/ocm/pkg/output/complexoutput.go index a63bf3ec14..b44f9f8e17 100644 --- a/cmds/ocm/pkg/output/complexoutput.go +++ b/cmds/ocm/pkg/output/complexoutput.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/elementoutput.go b/cmds/ocm/pkg/output/elementoutput.go index 688245b205..0c3adb3338 100644 --- a/cmds/ocm/pkg/output/elementoutput.go +++ b/cmds/ocm/pkg/output/elementoutput.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/funcoutput.go b/cmds/ocm/pkg/output/funcoutput.go index 8247ee04fb..a952f1435c 100644 --- a/cmds/ocm/pkg/output/funcoutput.go +++ b/cmds/ocm/pkg/output/funcoutput.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/options.go b/cmds/ocm/pkg/output/options.go index d10b33ce4c..7b924e7fdc 100644 --- a/cmds/ocm/pkg/output/options.go +++ b/cmds/ocm/pkg/output/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/output.go b/cmds/ocm/pkg/output/output.go index 52f98f6ea1..dc25739d14 100644 --- a/cmds/ocm/pkg/output/output.go +++ b/cmds/ocm/pkg/output/output.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/select.go b/cmds/ocm/pkg/output/select.go index 1a6834f055..314f7f450a 100644 --- a/cmds/ocm/pkg/output/select.go +++ b/cmds/ocm/pkg/output/select.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/singleelemoutput.go b/cmds/ocm/pkg/output/singleelemoutput.go index ebe60596d6..36f847e4f8 100644 --- a/cmds/ocm/pkg/output/singleelemoutput.go +++ b/cmds/ocm/pkg/output/singleelemoutput.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/sort_test.go b/cmds/ocm/pkg/output/sort_test.go index 3738be9d7f..fdb8afa81b 100644 --- a/cmds/ocm/pkg/output/sort_test.go +++ b/cmds/ocm/pkg/output/sort_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/stringoutput.go b/cmds/ocm/pkg/output/stringoutput.go index 4255c24e7f..ee50e1a5ec 100644 --- a/cmds/ocm/pkg/output/stringoutput.go +++ b/cmds/ocm/pkg/output/stringoutput.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/suite_test.go b/cmds/ocm/pkg/output/suite_test.go index 99411761b2..57384d7b80 100644 --- a/cmds/ocm/pkg/output/suite_test.go +++ b/cmds/ocm/pkg/output/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/table.go b/cmds/ocm/pkg/output/table.go index 17641ee593..2641b3a298 100644 --- a/cmds/ocm/pkg/output/table.go +++ b/cmds/ocm/pkg/output/table.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/tableoutput.go b/cmds/ocm/pkg/output/tableoutput.go index 2fadc8218d..95d1ee8e5a 100644 --- a/cmds/ocm/pkg/output/tableoutput.go +++ b/cmds/ocm/pkg/output/tableoutput.go @@ -1,19 +1,15 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( "strings" . "github.com/open-component-model/ocm/cmds/ocm/pkg/processing" - "github.com/open-component-model/ocm/pkg/semverutils" - "github.com/open-component-model/ocm/pkg/utils" "github.com/open-component-model/ocm/cmds/ocm/pkg/data" "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" + "github.com/open-component-model/ocm/pkg/semverutils" + "github.com/open-component-model/ocm/pkg/utils" ) type SortFields interface { diff --git a/cmds/ocm/pkg/output/treeoutput.go b/cmds/ocm/pkg/output/treeoutput.go index 7b947cfcff..02656b8a90 100644 --- a/cmds/ocm/pkg/output/treeoutput.go +++ b/cmds/ocm/pkg/output/treeoutput.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output import ( diff --git a/cmds/ocm/pkg/output/utils.go b/cmds/ocm/pkg/output/utils.go index 96d2c8da50..dbcf1baf4a 100644 --- a/cmds/ocm/pkg/output/utils.go +++ b/cmds/ocm/pkg/output/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package output // Fields composes a (string) field list based on a sequence of strings and or diff --git a/cmds/ocm/pkg/processing/buffer.go b/cmds/ocm/pkg/processing/buffer.go index 3ae7e0fd91..95ef0709c3 100644 --- a/cmds/ocm/pkg/processing/buffer.go +++ b/cmds/ocm/pkg/processing/buffer.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package processing import ( diff --git a/cmds/ocm/pkg/processing/buffer_test.go b/cmds/ocm/pkg/processing/buffer_test.go index a638d6afc6..b3aea9ea6d 100644 --- a/cmds/ocm/pkg/processing/buffer_test.go +++ b/cmds/ocm/pkg/processing/buffer_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package processing import ( diff --git a/cmds/ocm/pkg/processing/chain.go b/cmds/ocm/pkg/processing/chain.go index 054a9a9991..5e1fa86530 100644 --- a/cmds/ocm/pkg/processing/chain.go +++ b/cmds/ocm/pkg/processing/chain.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package processing import ( diff --git a/cmds/ocm/pkg/processing/logging.go b/cmds/ocm/pkg/processing/logging.go index 660907b751..f4abfaec69 100644 --- a/cmds/ocm/pkg/processing/logging.go +++ b/cmds/ocm/pkg/processing/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package processing import ( diff --git a/cmds/ocm/pkg/processing/operation.go b/cmds/ocm/pkg/processing/operation.go index 2cbcf43d21..2a8b33bd00 100644 --- a/cmds/ocm/pkg/processing/operation.go +++ b/cmds/ocm/pkg/processing/operation.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package processing type operation interface { diff --git a/cmds/ocm/pkg/processing/parallel.go b/cmds/ocm/pkg/processing/parallel.go index c8e78a2818..8b2a2b814a 100644 --- a/cmds/ocm/pkg/processing/parallel.go +++ b/cmds/ocm/pkg/processing/parallel.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package processing import ( diff --git a/cmds/ocm/pkg/processing/pool.go b/cmds/ocm/pkg/processing/pool.go index 5db6742ce9..dc5f0fc662 100644 --- a/cmds/ocm/pkg/processing/pool.go +++ b/cmds/ocm/pkg/processing/pool.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package processing import ( diff --git a/cmds/ocm/pkg/processing/processing.go b/cmds/ocm/pkg/processing/processing.go index 51a20e68d4..a01e44bfba 100644 --- a/cmds/ocm/pkg/processing/processing.go +++ b/cmds/ocm/pkg/processing/processing.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package processing import ( diff --git a/cmds/ocm/pkg/processing/processing_test.go b/cmds/ocm/pkg/processing/processing_test.go index 44532a79fd..cd0cfe6e0b 100644 --- a/cmds/ocm/pkg/processing/processing_test.go +++ b/cmds/ocm/pkg/processing/processing_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package processing import ( diff --git a/cmds/ocm/pkg/processing/sequential.go b/cmds/ocm/pkg/processing/sequential.go index 1275fd46bf..8114dedfc6 100644 --- a/cmds/ocm/pkg/processing/sequential.go +++ b/cmds/ocm/pkg/processing/sequential.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package processing import ( diff --git a/cmds/ocm/pkg/processing/suite_test.go b/cmds/ocm/pkg/processing/suite_test.go index 48f3309593..bee54948cf 100644 --- a/cmds/ocm/pkg/processing/suite_test.go +++ b/cmds/ocm/pkg/processing/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package processing_test import ( diff --git a/cmds/ocm/pkg/processing/utils.go b/cmds/ocm/pkg/processing/utils.go index 436c1aa85f..513483aab0 100644 --- a/cmds/ocm/pkg/processing/utils.go +++ b/cmds/ocm/pkg/processing/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package processing func IdentityMapper(e interface{}) interface{} { diff --git a/cmds/ocm/pkg/tree/convert.go b/cmds/ocm/pkg/tree/convert.go index 709f0cdfdb..6c8e9a3dd5 100644 --- a/cmds/ocm/pkg/tree/convert.go +++ b/cmds/ocm/pkg/tree/convert.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tree import ( diff --git a/cmds/ocm/pkg/tree/suite_test.go b/cmds/ocm/pkg/tree/suite_test.go index 6d47a92cc0..de7d71e114 100644 --- a/cmds/ocm/pkg/tree/suite_test.go +++ b/cmds/ocm/pkg/tree/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tree_test import ( diff --git a/cmds/ocm/pkg/tree/tree.go b/cmds/ocm/pkg/tree/tree.go index b5db90ae1f..120455994d 100644 --- a/cmds/ocm/pkg/tree/tree.go +++ b/cmds/ocm/pkg/tree/tree.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tree import ( diff --git a/cmds/ocm/pkg/tree/tree_test.go b/cmds/ocm/pkg/tree/tree_test.go index 1d3d26bc2f..65707d9c24 100644 --- a/cmds/ocm/pkg/tree/tree_test.go +++ b/cmds/ocm/pkg/tree/tree_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tree_test import ( diff --git a/cmds/ocm/pkg/utils/command.go b/cmds/ocm/pkg/utils/command.go index 0435d2f2ba..a6a2675ccf 100644 --- a/cmds/ocm/pkg/utils/command.go +++ b/cmds/ocm/pkg/utils/command.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/cmds/ocm/pkg/utils/fileutils.go b/cmds/ocm/pkg/utils/fileutils.go index cfeabdeb93..f5f46da53a 100644 --- a/cmds/ocm/pkg/utils/fileutils.go +++ b/cmds/ocm/pkg/utils/fileutils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/cmds/ocm/pkg/utils/handling.go b/cmds/ocm/pkg/utils/handling.go index 44b4a76d8f..c17560006b 100644 --- a/cmds/ocm/pkg/utils/handling.go +++ b/cmds/ocm/pkg/utils/handling.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/cmds/ocm/pkg/utils/plural.go b/cmds/ocm/pkg/utils/plural.go index 03f7bbd116..5c3401fdf2 100644 --- a/cmds/ocm/pkg/utils/plural.go +++ b/cmds/ocm/pkg/utils/plural.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/cmds/ocm/pkg/utils/validate.go b/cmds/ocm/pkg/utils/validate.go index 62ef7e8c10..a56bf9e7c4 100644 --- a/cmds/ocm/pkg/utils/validate.go +++ b/cmds/ocm/pkg/utils/validate.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/cmds/ocm/testhelper/env.go b/cmds/ocm/testhelper/env.go index 1a29761c55..1becc71cc1 100644 --- a/cmds/ocm/testhelper/env.go +++ b/cmds/ocm/testhelper/env.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testhelper import ( diff --git a/cmds/ocm/testhelper/forward.go b/cmds/ocm/testhelper/forward.go index 6690542d3c..4ab63e22bd 100644 --- a/cmds/ocm/testhelper/forward.go +++ b/cmds/ocm/testhelper/forward.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testhelper import ( diff --git a/cmds/ocm/testhelper/suite_test.go b/cmds/ocm/testhelper/suite_test.go index cdbf77e16f..24e2abd04f 100644 --- a/cmds/ocm/testhelper/suite_test.go +++ b/cmds/ocm/testhelper/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testhelper import ( diff --git a/cmds/ocm/testhelper/testhelper_test.go b/cmds/ocm/testhelper/testhelper_test.go index 719e0ac4d2..dcb6c18dc2 100644 --- a/cmds/ocm/testhelper/testhelper_test.go +++ b/cmds/ocm/testhelper/testhelper_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testhelper import ( diff --git a/cmds/ocm/topics/common/attributes/topic.go b/cmds/ocm/topics/common/attributes/topic.go index 0e71b2dd2d..02593673b9 100644 --- a/cmds/ocm/topics/common/attributes/topic.go +++ b/cmds/ocm/topics/common/attributes/topic.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package attributes import ( diff --git a/cmds/ocm/topics/common/config/topic.go b/cmds/ocm/topics/common/config/topic.go index 1b2d5b45a6..c246b70620 100644 --- a/cmds/ocm/topics/common/config/topic.go +++ b/cmds/ocm/topics/common/config/topic.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package topicconfig import ( diff --git a/cmds/ocm/topics/common/credentials/topic.go b/cmds/ocm/topics/common/credentials/topic.go index 4c8835656a..1b9136e87c 100644 --- a/cmds/ocm/topics/common/credentials/topic.go +++ b/cmds/ocm/topics/common/credentials/topic.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package attributes import ( diff --git a/cmds/ocm/topics/common/logging/topic.go b/cmds/ocm/topics/common/logging/topic.go index 1398e3a10a..6ef01a8cd5 100644 --- a/cmds/ocm/topics/common/logging/topic.go +++ b/cmds/ocm/topics/common/logging/topic.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package logging import ( diff --git a/cmds/ocm/topics/oci/refs/topic.go b/cmds/ocm/topics/oci/refs/topic.go index 3664c59110..66cba184c3 100644 --- a/cmds/ocm/topics/oci/refs/topic.go +++ b/cmds/ocm/topics/oci/refs/topic.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package topicocirefs import ( diff --git a/cmds/ocm/topics/ocm/accessmethods/topic.go b/cmds/ocm/topics/ocm/accessmethods/topic.go index 063458830f..7d3d95867e 100644 --- a/cmds/ocm/topics/ocm/accessmethods/topic.go +++ b/cmds/ocm/topics/ocm/accessmethods/topic.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package topicocmaccessmethods import ( diff --git a/cmds/ocm/topics/ocm/downloadhandlers/topic.go b/cmds/ocm/topics/ocm/downloadhandlers/topic.go index c66bbffc98..9ea165bb38 100644 --- a/cmds/ocm/topics/ocm/downloadhandlers/topic.go +++ b/cmds/ocm/topics/ocm/downloadhandlers/topic.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package topicocmaccessmethods import ( diff --git a/cmds/ocm/topics/ocm/labels/topic.go b/cmds/ocm/topics/ocm/labels/topic.go index 3ba8d85e3d..1cc9672382 100644 --- a/cmds/ocm/topics/ocm/labels/topic.go +++ b/cmds/ocm/topics/ocm/labels/topic.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package topicocmlabels import ( diff --git a/cmds/ocm/topics/ocm/refs/topic.go b/cmds/ocm/topics/ocm/refs/topic.go index 41cac75876..ea76985b11 100644 --- a/cmds/ocm/topics/ocm/refs/topic.go +++ b/cmds/ocm/topics/ocm/refs/topic.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package topicocmrefs import ( diff --git a/cmds/ocm/topics/ocm/uploadhandlers/topic.go b/cmds/ocm/topics/ocm/uploadhandlers/topic.go index 7fd9d902e0..a706957b4e 100644 --- a/cmds/ocm/topics/ocm/uploadhandlers/topic.go +++ b/cmds/ocm/topics/ocm/uploadhandlers/topic.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package topicocmaccessmethods import ( diff --git a/cmds/ocm/topics/toi/bootstrapping/topic.go b/cmds/ocm/topics/toi/bootstrapping/topic.go index 6d7277b7b6..ae402b7c5b 100644 --- a/cmds/ocm/topics/toi/bootstrapping/topic.go +++ b/cmds/ocm/topics/toi/bootstrapping/topic.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package bootstapping import ( diff --git a/docs/reference/ocm_add_resource-configuration.md b/docs/reference/ocm_add_resource-configuration.md index c94306f90d..fdc3daaee8 100644 --- a/docs/reference/ocm_add_resource-configuration.md +++ b/docs/reference/ocm_add_resource-configuration.md @@ -30,15 +30,20 @@ resource-configuration, resourceconfig, rsccfg, rcfg --accessRepository string repository URL --accessType string type of blob access specification --accessVersion string version for access specification + --body string body of a http request --bucket string bucket name --commit string git commit id --digest string blob digest --globalAccess YAML access specification for global access + --header :,,... http headers (default {}) --hint string (repository) hint for local artifacts --mediaType string media type for artifact blob representation + --noredirect http redirect behavior --reference string reference name --region string region name --size int blob size + --url string artifact or server url + --verb string http request method ``` @@ -473,7 +478,7 @@ with the field type in the input field: This REQUIRED property describes the url from which the resource is to be downloaded. - - **mediaType *string* + - **mediaType** *string* This OPTIONAL property describes the media type of the resource to be downloaded. If omitted, ocm tries to read the mediaType from the Content-Type header @@ -494,7 +499,7 @@ with the field type in the input field: This OPTIONAL property describes the http body to be included in the request. - - **noredirect** *bool* + - **noredirect** *bool* This OPTIONAL property describes whether http redirects should be disabled. If omitted, it is defaulted to false (so, per default, redirects are enabled). @@ -802,6 +807,51 @@ shown below. Options used to configure fields: --accessVersion, --bucket, --mediaType, --reference, --region +- Access type wget + + This method implements access to resources stored on an http server. + + The following versions are supported: + - Version v1 + + The url is the url pointing to the http endpoint from which a resource is + downloaded. The mimeType can be used to specify the MIME type of the + resource. + + This blob type specification supports the following fields: + - **url** *string* + + This REQUIRED property describes the url from which the resource is to be + downloaded. + + - **mediaType** *string* + + This OPTIONAL property describes the media type of the resource to be + downloaded. If omitted, ocm tries to read the mediaType from the Content-Type header + of the http response. If the mediaType cannot be set from the Content-Type header as well, + ocm tries to deduct the mediaType from the URL. If that is not possible either, the default + media type is defaulted to application/octet-stream. + + - **header** *map[string][]string* + + This OPTIONAL property describes the http headers to be set in the http request to the server. + + - **verb** *string* + + This OPTIONAL property describes the http verb (also known as http request method) for the http + request. If omitted, the http verb is defaulted to GET. + + - **body** *[]byte* + + This OPTIONAL property describes the http body to be included in the request. + + - **noredirect** *bool* + + This OPTIONAL property describes whether http redirects should be disabled. If omitted, + it is defaulted to false (so, per default, redirects are enabled). + + Options used to configure fields: --body, --header, --mediaType, --noredirect, --url, --verb + All yaml/json defined resources can be templated. Variables are specified as regular arguments following the syntax <name>=<value>. diff --git a/docs/reference/ocm_add_resources.md b/docs/reference/ocm_add_resources.md index fac8d5cda0..d755180f4e 100644 --- a/docs/reference/ocm_add_resources.md +++ b/docs/reference/ocm_add_resources.md @@ -36,15 +36,20 @@ resources, resource, res, r --accessRepository string repository URL --accessType string type of blob access specification --accessVersion string version for access specification + --body string body of a http request --bucket string bucket name --commit string git commit id --digest string blob digest --globalAccess YAML access specification for global access + --header :,,... http headers (default {}) --hint string (repository) hint for local artifacts --mediaType string media type for artifact blob representation + --noredirect http redirect behavior --reference string reference name --region string region name --size int blob size + --url string artifact or server url + --verb string http request method ``` @@ -483,7 +488,7 @@ with the field type in the input field: This REQUIRED property describes the url from which the resource is to be downloaded. - - **mediaType *string* + - **mediaType** *string* This OPTIONAL property describes the media type of the resource to be downloaded. If omitted, ocm tries to read the mediaType from the Content-Type header @@ -504,7 +509,7 @@ with the field type in the input field: This OPTIONAL property describes the http body to be included in the request. - - **noredirect** *bool* + - **noredirect** *bool* This OPTIONAL property describes whether http redirects should be disabled. If omitted, it is defaulted to false (so, per default, redirects are enabled). @@ -812,6 +817,51 @@ shown below. Options used to configure fields: --accessVersion, --bucket, --mediaType, --reference, --region +- Access type wget + + This method implements access to resources stored on an http server. + + The following versions are supported: + - Version v1 + + The url is the url pointing to the http endpoint from which a resource is + downloaded. The mimeType can be used to specify the MIME type of the + resource. + + This blob type specification supports the following fields: + - **url** *string* + + This REQUIRED property describes the url from which the resource is to be + downloaded. + + - **mediaType** *string* + + This OPTIONAL property describes the media type of the resource to be + downloaded. If omitted, ocm tries to read the mediaType from the Content-Type header + of the http response. If the mediaType cannot be set from the Content-Type header as well, + ocm tries to deduct the mediaType from the URL. If that is not possible either, the default + media type is defaulted to application/octet-stream. + + - **header** *map[string][]string* + + This OPTIONAL property describes the http headers to be set in the http request to the server. + + - **verb** *string* + + This OPTIONAL property describes the http verb (also known as http request method) for the http + request. If omitted, the http verb is defaulted to GET. + + - **body** *[]byte* + + This OPTIONAL property describes the http body to be included in the request. + + - **noredirect** *bool* + + This OPTIONAL property describes whether http redirects should be disabled. If omitted, + it is defaulted to false (so, per default, redirects are enabled). + + Options used to configure fields: --body, --header, --mediaType, --noredirect, --url, --verb + All yaml/json defined resources can be templated. Variables are specified as regular arguments following the syntax <name>=<value>. diff --git a/docs/reference/ocm_add_routingslips.md b/docs/reference/ocm_add_routingslips.md index dd10010bf6..ce8478ffa4 100644 --- a/docs/reference/ocm_add_routingslips.md +++ b/docs/reference/ocm_add_routingslips.md @@ -97,12 +97,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_add_source-configuration.md b/docs/reference/ocm_add_source-configuration.md index 67d3bbcfce..25a8f5f5a0 100644 --- a/docs/reference/ocm_add_source-configuration.md +++ b/docs/reference/ocm_add_source-configuration.md @@ -30,15 +30,20 @@ source-configuration, sourceconfig, srccfg, scfg --accessRepository string repository URL --accessType string type of blob access specification --accessVersion string version for access specification + --body string body of a http request --bucket string bucket name --commit string git commit id --digest string blob digest --globalAccess YAML access specification for global access + --header :,,... http headers (default {}) --hint string (repository) hint for local artifacts --mediaType string media type for artifact blob representation + --noredirect http redirect behavior --reference string reference name --region string region name --size int blob size + --url string artifact or server url + --verb string http request method ``` @@ -473,7 +478,7 @@ with the field type in the input field: This REQUIRED property describes the url from which the resource is to be downloaded. - - **mediaType *string* + - **mediaType** *string* This OPTIONAL property describes the media type of the resource to be downloaded. If omitted, ocm tries to read the mediaType from the Content-Type header @@ -494,7 +499,7 @@ with the field type in the input field: This OPTIONAL property describes the http body to be included in the request. - - **noredirect** *bool* + - **noredirect** *bool* This OPTIONAL property describes whether http redirects should be disabled. If omitted, it is defaulted to false (so, per default, redirects are enabled). @@ -802,6 +807,51 @@ shown below. Options used to configure fields: --accessVersion, --bucket, --mediaType, --reference, --region +- Access type wget + + This method implements access to resources stored on an http server. + + The following versions are supported: + - Version v1 + + The url is the url pointing to the http endpoint from which a resource is + downloaded. The mimeType can be used to specify the MIME type of the + resource. + + This blob type specification supports the following fields: + - **url** *string* + + This REQUIRED property describes the url from which the resource is to be + downloaded. + + - **mediaType** *string* + + This OPTIONAL property describes the media type of the resource to be + downloaded. If omitted, ocm tries to read the mediaType from the Content-Type header + of the http response. If the mediaType cannot be set from the Content-Type header as well, + ocm tries to deduct the mediaType from the URL. If that is not possible either, the default + media type is defaulted to application/octet-stream. + + - **header** *map[string][]string* + + This OPTIONAL property describes the http headers to be set in the http request to the server. + + - **verb** *string* + + This OPTIONAL property describes the http verb (also known as http request method) for the http + request. If omitted, the http verb is defaulted to GET. + + - **body** *[]byte* + + This OPTIONAL property describes the http body to be included in the request. + + - **noredirect** *bool* + + This OPTIONAL property describes whether http redirects should be disabled. If omitted, + it is defaulted to false (so, per default, redirects are enabled). + + Options used to configure fields: --body, --header, --mediaType, --noredirect, --url, --verb + All yaml/json defined resources can be templated. Variables are specified as regular arguments following the syntax <name>=<value>. diff --git a/docs/reference/ocm_add_sources.md b/docs/reference/ocm_add_sources.md index 0270fae913..ed829fb938 100644 --- a/docs/reference/ocm_add_sources.md +++ b/docs/reference/ocm_add_sources.md @@ -35,15 +35,20 @@ sources, source, src, s --accessRepository string repository URL --accessType string type of blob access specification --accessVersion string version for access specification + --body string body of a http request --bucket string bucket name --commit string git commit id --digest string blob digest --globalAccess YAML access specification for global access + --header :,,... http headers (default {}) --hint string (repository) hint for local artifacts --mediaType string media type for artifact blob representation + --noredirect http redirect behavior --reference string reference name --region string region name --size int blob size + --url string artifact or server url + --verb string http request method ``` @@ -481,7 +486,7 @@ with the field type in the input field: This REQUIRED property describes the url from which the resource is to be downloaded. - - **mediaType *string* + - **mediaType** *string* This OPTIONAL property describes the media type of the resource to be downloaded. If omitted, ocm tries to read the mediaType from the Content-Type header @@ -502,7 +507,7 @@ with the field type in the input field: This OPTIONAL property describes the http body to be included in the request. - - **noredirect** *bool* + - **noredirect** *bool* This OPTIONAL property describes whether http redirects should be disabled. If omitted, it is defaulted to false (so, per default, redirects are enabled). @@ -810,6 +815,51 @@ shown below. Options used to configure fields: --accessVersion, --bucket, --mediaType, --reference, --region +- Access type wget + + This method implements access to resources stored on an http server. + + The following versions are supported: + - Version v1 + + The url is the url pointing to the http endpoint from which a resource is + downloaded. The mimeType can be used to specify the MIME type of the + resource. + + This blob type specification supports the following fields: + - **url** *string* + + This REQUIRED property describes the url from which the resource is to be + downloaded. + + - **mediaType** *string* + + This OPTIONAL property describes the media type of the resource to be + downloaded. If omitted, ocm tries to read the mediaType from the Content-Type header + of the http response. If the mediaType cannot be set from the Content-Type header as well, + ocm tries to deduct the mediaType from the URL. If that is not possible either, the default + media type is defaulted to application/octet-stream. + + - **header** *map[string][]string* + + This OPTIONAL property describes the http headers to be set in the http request to the server. + + - **verb** *string* + + This OPTIONAL property describes the http verb (also known as http request method) for the http + request. If omitted, the http verb is defaulted to GET. + + - **body** *[]byte* + + This OPTIONAL property describes the http body to be included in the request. + + - **noredirect** *bool* + + This OPTIONAL property describes whether http redirects should be disabled. If omitted, + it is defaulted to false (so, per default, redirects are enabled). + + Options used to configure fields: --body, --header, --mediaType, --noredirect, --url, --verb + All yaml/json defined resources can be templated. Variables are specified as regular arguments following the syntax <name>=<value>. diff --git a/docs/reference/ocm_bootstrap_configuration.md b/docs/reference/ocm_bootstrap_configuration.md index 142e8d2202..e7609ec4cb 100644 --- a/docs/reference/ocm_bootstrap_configuration.md +++ b/docs/reference/ocm_bootstrap_configuration.md @@ -78,12 +78,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_bootstrap_package.md b/docs/reference/ocm_bootstrap_package.md index bef6e13a14..ed44d538b5 100644 --- a/docs/reference/ocm_bootstrap_package.md +++ b/docs/reference/ocm_bootstrap_package.md @@ -159,12 +159,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_check_componentversions.md b/docs/reference/ocm_check_componentversions.md index db42cf0858..66af32da98 100644 --- a/docs/reference/ocm_check_componentversions.md +++ b/docs/reference/ocm_check_componentversions.md @@ -66,12 +66,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_describe_artifacts.md b/docs/reference/ocm_describe_artifacts.md index 5c5728682a..218a74ba85 100644 --- a/docs/reference/ocm_describe_artifacts.md +++ b/docs/reference/ocm_describe_artifacts.md @@ -60,7 +60,6 @@ linked library can be used: - DockerDaemon: v1 - Empty: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_describe_package.md b/docs/reference/ocm_describe_package.md index 1790bd2a77..60eb15f23a 100644 --- a/docs/reference/ocm_describe_package.md +++ b/docs/reference/ocm_describe_package.md @@ -69,12 +69,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_download_artifacts.md b/docs/reference/ocm_download_artifacts.md index 101dea7314..c2a2e85abe 100644 --- a/docs/reference/ocm_download_artifacts.md +++ b/docs/reference/ocm_download_artifacts.md @@ -62,7 +62,6 @@ linked library can be used: - DockerDaemon: v1 - Empty: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_download_cli.md b/docs/reference/ocm_download_cli.md index 01dc462c08..fc7a0ee462 100644 --- a/docs/reference/ocm_download_cli.md +++ b/docs/reference/ocm_download_cli.md @@ -76,12 +76,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_download_componentversions.md b/docs/reference/ocm_download_componentversions.md index de66681659..82487f63b6 100644 --- a/docs/reference/ocm_download_componentversions.md +++ b/docs/reference/ocm_download_componentversions.md @@ -65,12 +65,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_download_resources.md b/docs/reference/ocm_download_resources.md index 2754454a4f..b48beb3071 100644 --- a/docs/reference/ocm_download_resources.md +++ b/docs/reference/ocm_download_resources.md @@ -101,12 +101,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_get_artifacts.md b/docs/reference/ocm_get_artifacts.md index a1f370c2c9..2eb9447cb9 100644 --- a/docs/reference/ocm_get_artifacts.md +++ b/docs/reference/ocm_get_artifacts.md @@ -60,7 +60,6 @@ linked library can be used: - DockerDaemon: v1 - Empty: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_get_componentversions.md b/docs/reference/ocm_get_componentversions.md index 8d225c75b9..3f33d7d644 100644 --- a/docs/reference/ocm_get_componentversions.md +++ b/docs/reference/ocm_get_componentversions.md @@ -75,12 +75,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_get_references.md b/docs/reference/ocm_get_references.md index 0807414767..aaf24e7728 100644 --- a/docs/reference/ocm_get_references.md +++ b/docs/reference/ocm_get_references.md @@ -76,12 +76,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_get_resources.md b/docs/reference/ocm_get_resources.md index 8abddf2f05..cf9ef134d3 100644 --- a/docs/reference/ocm_get_resources.md +++ b/docs/reference/ocm_get_resources.md @@ -76,12 +76,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_get_routingslips.md b/docs/reference/ocm_get_routingslips.md index d0adb0de32..518d9d3c0c 100644 --- a/docs/reference/ocm_get_routingslips.md +++ b/docs/reference/ocm_get_routingslips.md @@ -75,12 +75,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_get_sources.md b/docs/reference/ocm_get_sources.md index 51b4bfe545..f3bc6f3c1f 100644 --- a/docs/reference/ocm_get_sources.md +++ b/docs/reference/ocm_get_sources.md @@ -76,12 +76,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_hash_componentversions.md b/docs/reference/ocm_hash_componentversions.md index f9fd49fc13..7999825f90 100644 --- a/docs/reference/ocm_hash_componentversions.md +++ b/docs/reference/ocm_hash_componentversions.md @@ -109,12 +109,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_install_plugins.md b/docs/reference/ocm_install_plugins.md index 72777db8db..5e27180a96 100644 --- a/docs/reference/ocm_install_plugins.md +++ b/docs/reference/ocm_install_plugins.md @@ -68,12 +68,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_ocm-accessmethods.md b/docs/reference/ocm_ocm-accessmethods.md index 5d971f5d1e..f94353937d 100644 --- a/docs/reference/ocm_ocm-accessmethods.md +++ b/docs/reference/ocm_ocm-accessmethods.md @@ -310,6 +310,51 @@ shown below. Options used to configure fields: --accessVersion, --bucket, --mediaType, --reference, --region +- Access type wget + + This method implements access to resources stored on an http server. + + The following versions are supported: + - Version v1 + + The url is the url pointing to the http endpoint from which a resource is + downloaded. The mimeType can be used to specify the MIME type of the + resource. + + This blob type specification supports the following fields: + - **url** *string* + + This REQUIRED property describes the url from which the resource is to be + downloaded. + + - **mediaType** *string* + + This OPTIONAL property describes the media type of the resource to be + downloaded. If omitted, ocm tries to read the mediaType from the Content-Type header + of the http response. If the mediaType cannot be set from the Content-Type header as well, + ocm tries to deduct the mediaType from the URL. If that is not possible either, the default + media type is defaulted to application/octet-stream. + + - **header** *map[string][]string* + + This OPTIONAL property describes the http headers to be set in the http request to the server. + + - **verb** *string* + + This OPTIONAL property describes the http verb (also known as http request method) for the http + request. If omitted, the http verb is defaulted to GET. + + - **body** *[]byte* + + This OPTIONAL property describes the http body to be included in the request. + + - **noredirect** *bool* + + This OPTIONAL property describes whether http redirects should be disabled. If omitted, + it is defaulted to false (so, per default, redirects are enabled). + + Options used to configure fields: --body, --header, --mediaType, --noredirect, --url, --verb + ### SEE ALSO diff --git a/docs/reference/ocm_ocm-references.md b/docs/reference/ocm_ocm-references.md index 9b486b596e..7610fa2e14 100644 --- a/docs/reference/ocm_ocm-references.md +++ b/docs/reference/ocm_ocm-references.md @@ -67,6 +67,8 @@ character. The following formats are supported: directory, ta ### Examples ``` +Complete Component Reference Specifications (including all optional arguments): + +ctf+directory::./ocm/ctf//ocm.software/ocmcli:0.7.0 oci::{"baseUrl":"ghcr.io","componentNameMapping":"urlPath","subPath":"open-component-model"}//ocm.software/ocmcli.0.7.0 @@ -74,6 +76,18 @@ oci::{"baseUrl":"ghcr.io","componentNameMapping":"urlPath","subPath":"open-compo oci::https://ghcr.io:443/open-component-model//ocm.software/ocmcli:0.7.0 oci::http://localhost:8080/local-component-repository//ocm.software/ocmcli:0.7.0 + +--- + +Short-Hand Component Reference Specifications (omitting optional arguments): + +./ocm/ctf//ocm.software/ocmcli:0.7.0 + +ghcr.io/open-component-model//ocm.software/ocmcli:0.7.0 + +localhost:8080/local-component-repository//ocm.software/ocmcli:0.7.0 (defaulting to https) + +http://localhost:8080/local-component-repository//ocm.software/ocmcli:0.7.0 ``` ### SEE ALSO diff --git a/docs/reference/ocm_show_tags.md b/docs/reference/ocm_show_tags.md index 3fd0a36d29..886ee7a49f 100644 --- a/docs/reference/ocm_show_tags.md +++ b/docs/reference/ocm_show_tags.md @@ -52,7 +52,6 @@ linked library can be used: - DockerDaemon: v1 - Empty: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_show_versions.md b/docs/reference/ocm_show_versions.md index 309f09b1e0..344a20baff 100644 --- a/docs/reference/ocm_show_versions.md +++ b/docs/reference/ocm_show_versions.md @@ -62,12 +62,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_sign_componentversions.md b/docs/reference/ocm_sign_componentversions.md index a19b73c505..f349615e29 100644 --- a/docs/reference/ocm_sign_componentversions.md +++ b/docs/reference/ocm_sign_componentversions.md @@ -84,12 +84,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_transfer_artifacts.md b/docs/reference/ocm_transfer_artifacts.md index 3a57c7b4f2..b650382015 100644 --- a/docs/reference/ocm_transfer_artifacts.md +++ b/docs/reference/ocm_transfer_artifacts.md @@ -71,7 +71,6 @@ linked library can be used: - DockerDaemon: v1 - Empty: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_transfer_componentversions.md b/docs/reference/ocm_transfer_componentversions.md index 5e75f7db5b..cbbae63fe8 100644 --- a/docs/reference/ocm_transfer_componentversions.md +++ b/docs/reference/ocm_transfer_componentversions.md @@ -87,12 +87,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/docs/reference/ocm_verify_componentversions.md b/docs/reference/ocm_verify_componentversions.md index 08997e38ef..e34ae26685 100644 --- a/docs/reference/ocm_verify_componentversions.md +++ b/docs/reference/ocm_verify_componentversions.md @@ -81,12 +81,10 @@ linked library can be used: Dedicated OCM repository types: - ComponentArchive: v1 - - ca: v1 OCI Repository types (using standard component repository to OCI mapping): - CommonTransportFormat: v1 - OCIRegistry: v1 - - ctf: v1 - oci: v1 - ociRegistry diff --git a/examples/lib/comparison-scenario/00-consumer.go b/examples/lib/comparison-scenario/00-consumer.go index 5a54fb965a..5a781bc7a8 100644 --- a/examples/lib/comparison-scenario/00-consumer.go +++ b/examples/lib/comparison-scenario/00-consumer.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( @@ -9,6 +5,7 @@ import ( "fmt" "github.com/mandelsoft/vfs/pkg/memoryfs" + "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm" diff --git a/examples/lib/comparison-scenario/00-provider.go b/examples/lib/comparison-scenario/00-provider.go index 169f93704b..1217e9b43f 100644 --- a/examples/lib/comparison-scenario/00-provider.go +++ b/examples/lib/comparison-scenario/00-provider.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/comparison-scenario/01-create.go b/examples/lib/comparison-scenario/01-create.go index 57839bfaae..24c3babc09 100644 --- a/examples/lib/comparison-scenario/01-create.go +++ b/examples/lib/comparison-scenario/01-create.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/comparison-scenario/02-sign.go b/examples/lib/comparison-scenario/02-sign.go index e5b14eacdd..0e1af17988 100644 --- a/examples/lib/comparison-scenario/02-sign.go +++ b/examples/lib/comparison-scenario/02-sign.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/comparison-scenario/04-transport.go b/examples/lib/comparison-scenario/04-transport.go index fff4865348..1a78fa8f53 100644 --- a/examples/lib/comparison-scenario/04-transport.go +++ b/examples/lib/comparison-scenario/04-transport.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/comparison-scenario/05-verify.go b/examples/lib/comparison-scenario/05-verify.go index 78faac0745..51f6147886 100644 --- a/examples/lib/comparison-scenario/05-verify.go +++ b/examples/lib/comparison-scenario/05-verify.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/comparison-scenario/06-download.go b/examples/lib/comparison-scenario/06-download.go index 53a6726316..f899fa0a12 100644 --- a/examples/lib/comparison-scenario/06-download.go +++ b/examples/lib/comparison-scenario/06-download.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( @@ -9,6 +5,7 @@ import ( "github.com/mandelsoft/vfs/pkg/memoryfs" "github.com/mandelsoft/vfs/pkg/vfs" + "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/ocm" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" diff --git a/examples/lib/comparison-scenario/07-getref.go b/examples/lib/comparison-scenario/07-getref.go index e12968671c..d9de5d7fbf 100644 --- a/examples/lib/comparison-scenario/07-getref.go +++ b/examples/lib/comparison-scenario/07-getref.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/comparison-scenario/08-deployscript.go b/examples/lib/comparison-scenario/08-deployscript.go index 7813827c56..3ab42c061d 100644 --- a/examples/lib/comparison-scenario/08-deployscript.go +++ b/examples/lib/comparison-scenario/08-deployscript.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/comparison-scenario/09-localize.go b/examples/lib/comparison-scenario/09-localize.go index 0cfe6f3554..596f03fbe5 100644 --- a/examples/lib/comparison-scenario/09-localize.go +++ b/examples/lib/comparison-scenario/09-localize.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( @@ -10,6 +6,9 @@ import ( "github.com/mandelsoft/vfs/pkg/memoryfs" "github.com/mandelsoft/vfs/pkg/vfs" + "helm.sh/helm/v3/pkg/chart" + "sigs.k8s.io/yaml" + "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" @@ -23,8 +22,6 @@ import ( "github.com/open-component-model/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/utils/tarutils" "github.com/open-component-model/ocm/pkg/utils/template" - "helm.sh/helm/v3/pkg/chart" - "sigs.k8s.io/yaml" ) type DeployDescriptor struct { diff --git a/examples/lib/comparison-scenario/main.go b/examples/lib/comparison-scenario/main.go index ca172f17b8..533b186b0c 100644 --- a/examples/lib/comparison-scenario/main.go +++ b/examples/lib/comparison-scenario/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/comparison-scenario/utils.go b/examples/lib/comparison-scenario/utils.go index bf8a6cb09f..d57ac8be8f 100644 --- a/examples/lib/comparison-scenario/utils.go +++ b/examples/lib/comparison-scenario/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( @@ -10,13 +6,14 @@ import ( "io" "os" + "helm.sh/helm/v3/pkg/action" + "helm.sh/helm/v3/pkg/chart" + "helm.sh/helm/v3/pkg/cli" + "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/signingattr" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" - "helm.sh/helm/v3/pkg/action" - "helm.sh/helm/v3/pkg/chart" - "helm.sh/helm/v3/pkg/cli" ) func PrintPublicKey(ctx ocm.Context, name string) { diff --git a/examples/lib/config1/example.go b/examples/lib/config1/example.go index 2eaf591eb3..7c3cfc888e 100644 --- a/examples/lib/config1/example.go +++ b/examples/lib/config1/example.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/config1/main.go b/examples/lib/config1/main.go index 464761e82e..df17820f9c 100644 --- a/examples/lib/config1/main.go +++ b/examples/lib/config1/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/config2/example.go b/examples/lib/config2/example.go index 4db1129da4..051607b797 100644 --- a/examples/lib/config2/example.go +++ b/examples/lib/config2/example.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/config2/main.go b/examples/lib/config2/main.go index 45f1f9b587..c0f372cf9b 100644 --- a/examples/lib/config2/main.go +++ b/examples/lib/config2/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/config3/example.go b/examples/lib/config3/example.go index 74020edf06..0ab06f5a5e 100644 --- a/examples/lib/config3/example.go +++ b/examples/lib/config3/example.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/config3/main.go b/examples/lib/config3/main.go index 464761e82e..df17820f9c 100644 --- a/examples/lib/config3/main.go +++ b/examples/lib/config3/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/cred1/example.go b/examples/lib/cred1/example.go index 67c579a8c5..08f6668ff4 100644 --- a/examples/lib/cred1/example.go +++ b/examples/lib/cred1/example.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/cred1/main.go b/examples/lib/cred1/main.go index 31ed0673b2..bfe9c6414d 100644 --- a/examples/lib/cred1/main.go +++ b/examples/lib/cred1/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/cred2/example.go b/examples/lib/cred2/example.go index b4f93b7a09..73146504fd 100644 --- a/examples/lib/cred2/example.go +++ b/examples/lib/cred2/example.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/cred2/main.go b/examples/lib/cred2/main.go index 31ed0673b2..bfe9c6414d 100644 --- a/examples/lib/cred2/main.go +++ b/examples/lib/cred2/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/cred3/example.go b/examples/lib/cred3/example.go index d15b00db8b..eaf339a104 100644 --- a/examples/lib/cred3/example.go +++ b/examples/lib/cred3/example.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/cred3/main.go b/examples/lib/cred3/main.go index 31ed0673b2..bfe9c6414d 100644 --- a/examples/lib/cred3/main.go +++ b/examples/lib/cred3/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/ctf/example.go b/examples/lib/ctf/example.go index 48e436c5ff..dab2b5f3da 100644 --- a/examples/lib/ctf/example.go +++ b/examples/lib/ctf/example.go @@ -1,13 +1,10 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( "fmt" "github.com/mandelsoft/vfs/pkg/memoryfs" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" diff --git a/examples/lib/ctf/main.go b/examples/lib/ctf/main.go index e1448838b9..539aa3c7b2 100644 --- a/examples/lib/ctf/main.go +++ b/examples/lib/ctf/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/example.go b/examples/lib/example.go index 566ad067d3..798dcac412 100644 --- a/examples/lib/example.go +++ b/examples/lib/example.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/helper/helper.go b/examples/lib/helper/helper.go index 0739fa781c..fc2d601dbf 100644 --- a/examples/lib/helper/helper.go +++ b/examples/lib/helper/helper.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helper import ( diff --git a/examples/lib/main.go b/examples/lib/main.go index ef9ab16d60..e61681f885 100644 --- a/examples/lib/main.go +++ b/examples/lib/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/01-getting-started/README.md b/examples/lib/tour/01-getting-started/README.md index 6f84079274..76423db018 100644 --- a/examples/lib/tour/01-getting-started/README.md +++ b/examples/lib/tour/01-getting-started/README.md @@ -164,20 +164,32 @@ differ, because the code always describes the latest version): ``` resources of the latest version: - version: 0.8.0 + version: 0.9.0 provider: ocm.software 1: name: ocmcli extra identity: "architecture"="amd64","os"="linux" resource type: executable - access: Local blob sha256:6672528b57fd77cefa4c5a3395431b6a5aa14dc3ddad3ffe52343a7a518c2cd3[] + access: Local blob sha256:1de1c90f23d0a3dbb8d8646f09380f1da257f9d10796b42dc4ef85e8df93a135[] 2: name: ocmcli extra identity: "architecture"="arm64","os"="linux" resource type: executable - access: Local blob sha256:9088cb8bbef1593b905d6bd3af6652165ff82cebd0d86540a7be9637324d036b[] - 3: name: ocmcli-image + access: Local blob sha256:ca049bb09399020ce0822fd18c0a534ae0d02c3e0180f05dd4faccf61176a267[] + 3: name: ocmcli + extra identity: "architecture"="arm64","os"="darwin" + resource type: executable + access: Local blob sha256:1e32b3f1a08c72e3187b247f8931ea9d0554240fd452a4df129d6036c62b0476[] + 4: name: ocmcli + extra identity: "architecture"="amd64","os"="darwin" + resource type: executable + access: Local blob sha256:04708d2f9845dd6d52f2b8f94e930f3a74a1a098b7ee401e001307d4b4fcc703[] + 5: name: ocmcli + extra identity: "architecture"="amd64","os"="windows" + resource type: executable + access: Local blob sha256:e8cf5dfd1ab02ab982e6f1a425d426fc1f7dc83e6385d26d0477525a4a66c629[] + 6: name: ocmcli-image extra identity: resource type: ociImage - access: OCI artifact ghcr.io/open-component-model/ocm/ocm.software/ocmcli/ocmcli-image:0.8.0 + access: OCI artifact ghcr.io/open-component-model/ocm/ocm.software/ocmcli/ocmcli-image:0.9.0 ``` Resources have some metadata, like their identity and a resource type. diff --git a/examples/lib/tour/01-getting-started/example.go b/examples/lib/tour/01-getting-started/example.go index 6021d9d7b9..4eeb6941a2 100644 --- a/examples/lib/tour/01-getting-started/example.go +++ b/examples/lib/tour/01-getting-started/example.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/01-getting-started/main.go b/examples/lib/tour/01-getting-started/main.go index 0b551a99c9..a21beded76 100644 --- a/examples/lib/tour/01-getting-started/main.go +++ b/examples/lib/tour/01-getting-started/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/02-composing-a-component-version/01-basic-componentversion-creation.go b/examples/lib/tour/02-composing-a-component-version/01-basic-componentversion-creation.go index 64d46a7eb2..dcfea0a3d5 100644 --- a/examples/lib/tour/02-composing-a-component-version/01-basic-componentversion-creation.go +++ b/examples/lib/tour/02-composing-a-component-version/01-basic-componentversion-creation.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/02-composing-a-component-version/02-composition-version.go b/examples/lib/tour/02-composing-a-component-version/02-composition-version.go index 1820e5b68b..0c7074fc8c 100644 --- a/examples/lib/tour/02-composing-a-component-version/02-composition-version.go +++ b/examples/lib/tour/02-composing-a-component-version/02-composition-version.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/02-composing-a-component-version/main.go b/examples/lib/tour/02-composing-a-component-version/main.go index 074c55e4a0..cb76314235 100644 --- a/examples/lib/tour/02-composing-a-component-version/main.go +++ b/examples/lib/tour/02-composing-a-component-version/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/03-working-with-credentials/01-using-credentials.go b/examples/lib/tour/03-working-with-credentials/01-using-credentials.go index 387aa9e493..ae41377529 100644 --- a/examples/lib/tour/03-working-with-credentials/01-using-credentials.go +++ b/examples/lib/tour/03-working-with-credentials/01-using-credentials.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/03-working-with-credentials/02-basic-credential-management.go b/examples/lib/tour/03-working-with-credentials/02-basic-credential-management.go index fe9b6104e4..e19d3066c8 100644 --- a/examples/lib/tour/03-working-with-credentials/02-basic-credential-management.go +++ b/examples/lib/tour/03-working-with-credentials/02-basic-credential-management.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/03-working-with-credentials/03-credential-repositories.go b/examples/lib/tour/03-working-with-credentials/03-credential-repositories.go index ec1fb57b97..0ef2dfae79 100644 --- a/examples/lib/tour/03-working-with-credentials/03-credential-repositories.go +++ b/examples/lib/tour/03-working-with-credentials/03-credential-repositories.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/03-working-with-credentials/common.go b/examples/lib/tour/03-working-with-credentials/common.go index 503fa71a83..2af4692145 100644 --- a/examples/lib/tour/03-working-with-credentials/common.go +++ b/examples/lib/tour/03-working-with-credentials/common.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/03-working-with-credentials/main.go b/examples/lib/tour/03-working-with-credentials/main.go index a705fa1167..e3fe4a35c4 100644 --- a/examples/lib/tour/03-working-with-credentials/main.go +++ b/examples/lib/tour/03-working-with-credentials/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/04-working-with-config/01-basic-config-management.go b/examples/lib/tour/04-working-with-config/01-basic-config-management.go index 6e8d66533e..2c122c225b 100644 --- a/examples/lib/tour/04-working-with-config/01-basic-config-management.go +++ b/examples/lib/tour/04-working-with-config/01-basic-config-management.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/04-working-with-config/02-handle-arbitrary-config.go b/examples/lib/tour/04-working-with-config/02-handle-arbitrary-config.go index c3c7864f7e..84e176a1c5 100644 --- a/examples/lib/tour/04-working-with-config/02-handle-arbitrary-config.go +++ b/examples/lib/tour/04-working-with-config/02-handle-arbitrary-config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/04-working-with-config/03-using-ocm-config.go b/examples/lib/tour/04-working-with-config/03-using-ocm-config.go index fe1b58e955..82dc1c8314 100644 --- a/examples/lib/tour/04-working-with-config/03-using-ocm-config.go +++ b/examples/lib/tour/04-working-with-config/03-using-ocm-config.go @@ -1,12 +1,10 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( "fmt" + "sigs.k8s.io/yaml" + "github.com/open-component-model/ocm/examples/lib/helper" configcfg "github.com/open-component-model/ocm/pkg/contexts/config/config" "github.com/open-component-model/ocm/pkg/contexts/credentials" @@ -16,7 +14,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" "github.com/open-component-model/ocm/pkg/errors" - "sigs.k8s.io/yaml" ) func HandleOCMConfig(cfg *helper.Config) error { diff --git a/examples/lib/tour/04-working-with-config/04-write-config-type.go b/examples/lib/tour/04-working-with-config/04-write-config-type.go index 7e7404e21a..a74a356976 100644 --- a/examples/lib/tour/04-working-with-config/04-write-config-type.go +++ b/examples/lib/tour/04-working-with-config/04-write-config-type.go @@ -1,13 +1,11 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( "encoding/json" "fmt" + "sigs.k8s.io/yaml" + "github.com/open-component-model/ocm/examples/lib/helper" configcfg "github.com/open-component-model/ocm/pkg/contexts/config/config" "github.com/open-component-model/ocm/pkg/contexts/config/cpi" @@ -17,7 +15,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" - "sigs.k8s.io/yaml" ) // TYPE is the name of our new configuration object type. diff --git a/examples/lib/tour/04-working-with-config/05-write-config-consumer.go b/examples/lib/tour/04-working-with-config/05-write-config-consumer.go index 8bfe5958cd..2848c9c704 100644 --- a/examples/lib/tour/04-working-with-config/05-write-config-consumer.go +++ b/examples/lib/tour/04-working-with-config/05-write-config-consumer.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/04-working-with-config/common.go b/examples/lib/tour/04-working-with-config/common.go index 4957898867..2c08f1d35a 100644 --- a/examples/lib/tour/04-working-with-config/common.go +++ b/examples/lib/tour/04-working-with-config/common.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/04-working-with-config/main.go b/examples/lib/tour/04-working-with-config/main.go index ca59b4738b..1866d33040 100644 --- a/examples/lib/tour/04-working-with-config/main.go +++ b/examples/lib/tour/04-working-with-config/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/05-transporting-component-versions/common.go b/examples/lib/tour/05-transporting-component-versions/common.go index cdc9171da9..24ca1178ea 100644 --- a/examples/lib/tour/05-transporting-component-versions/common.go +++ b/examples/lib/tour/05-transporting-component-versions/common.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/05-transporting-component-versions/example.go b/examples/lib/tour/05-transporting-component-versions/example.go index 34c5713aa5..d6dec77222 100644 --- a/examples/lib/tour/05-transporting-component-versions/example.go +++ b/examples/lib/tour/05-transporting-component-versions/example.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/05-transporting-component-versions/main.go b/examples/lib/tour/05-transporting-component-versions/main.go index a1a4b903e6..6e6ad9b265 100644 --- a/examples/lib/tour/05-transporting-component-versions/main.go +++ b/examples/lib/tour/05-transporting-component-versions/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/06-signing-component-versions/01-basic-signing.go b/examples/lib/tour/06-signing-component-versions/01-basic-signing.go index 055e5d05fa..9240b199b6 100644 --- a/examples/lib/tour/06-signing-component-versions/01-basic-signing.go +++ b/examples/lib/tour/06-signing-component-versions/01-basic-signing.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/06-signing-component-versions/02-using-context-settings.go b/examples/lib/tour/06-signing-component-versions/02-using-context-settings.go index c0e8dd3d0a..b1c6e0c020 100644 --- a/examples/lib/tour/06-signing-component-versions/02-using-context-settings.go +++ b/examples/lib/tour/06-signing-component-versions/02-using-context-settings.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/06-signing-component-versions/common.go b/examples/lib/tour/06-signing-component-versions/common.go index 6181ff3b2d..75377f8ae4 100644 --- a/examples/lib/tour/06-signing-component-versions/common.go +++ b/examples/lib/tour/06-signing-component-versions/common.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/06-signing-component-versions/main.go b/examples/lib/tour/06-signing-component-versions/main.go index d8eb68e55d..2a31e09f1c 100644 --- a/examples/lib/tour/06-signing-component-versions/main.go +++ b/examples/lib/tour/06-signing-component-versions/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/tour/doc.go b/examples/lib/tour/doc.go index 9b7a6be504..d20d8d6dd7 100644 --- a/examples/lib/tour/doc.go +++ b/examples/lib/tour/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:generate mdref --headings --list docsrc . package tour diff --git a/examples/lib/transfer1/example.go b/examples/lib/transfer1/example.go index 76d107afd8..bd7e7fd1fd 100644 --- a/examples/lib/transfer1/example.go +++ b/examples/lib/transfer1/example.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/examples/lib/transfer1/main.go b/examples/lib/transfer1/main.go index 9b8786099c..1e4c5f1784 100644 --- a/examples/lib/transfer1/main.go +++ b/examples/lib/transfer1/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/flake.nix b/flake.nix index 960c788eb3..f27a550d44 100644 --- a/flake.nix +++ b/flake.nix @@ -1,8 +1,3 @@ -/* -SPDX-FileCopyrightText: 2021 SAP SE or an SAP affiliate company and Gardener contributors - -SPDX-License-Identifier: Apache-2.0 -*/ { description = "Nix flake for ocm"; diff --git a/hack/Makefile b/hack/Makefile index 9bf5a73b48..451cf5cc81 100644 --- a/hack/Makefile +++ b/hack/Makefile @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - GOPATH := $(shell go env GOPATH) ifeq ($(OS),Windows_NT) diff --git a/hack/boilerplate.go.txt b/hack/boilerplate.go.txt deleted file mode 100644 index e827261184..0000000000 --- a/hack/boilerplate.go.txt +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 \ No newline at end of file diff --git a/hack/check.sh b/hack/check.sh index 5c6029a582..7f9ad288a7 100755 --- a/hack/check.sh +++ b/hack/check.sh @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - set -e GOLANGCI_LINT_CONFIG_FILE="" diff --git a/hack/cross-build.sh b/hack/cross-build.sh index 4dc83923fa..c6ee228f21 100755 --- a/hack/cross-build.sh +++ b/hack/cross-build.sh @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - set -e CURRENT_DIR=$(dirname $0) diff --git a/hack/format.sh b/hack/format.sh index ad98719c21..c8267b2a16 100755 --- a/hack/format.sh +++ b/hack/format.sh @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - set -e log() { @@ -14,7 +10,7 @@ log() { pkgprefix="github.com/open-component-model/ocm" -log "Format with gci" +log "Format with gci" # gci write --custom-order --skip-generated -s standard -s blank -s dot -s default -s "Prefix(github.com/open-component-model/ocm)" GCIFMT=( -s standard -s blank -s dot -s default -s="prefix(${pkgprefix})" --custom-order ) gci diff --skip-generated "${GCIFMT[@]}" $@ Generate" diff --git a/hack/install-requirements.sh b/hack/install-requirements.sh index fd5b4f764c..ca584ae39e 100755 --- a/hack/install-requirements.sh +++ b/hack/install-requirements.sh @@ -1,9 +1,5 @@ #!/bin/bash -e -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - CURRENT_DIR=$(dirname $0) PROJECT_ROOT="${CURRENT_DIR}"/.. @@ -23,5 +19,3 @@ echo "> Install Registry test binaries" mkdir -p ${PROJECT_ROOT}/tmp/test/bin curl -L "https://storage.googleapis.com/gardener-public/test/oci-registry/registry-$(go env GOOS)-$(go env GOARCH)" --output ${PROJECT_ROOT}/tmp/test/bin/registry chmod +x ${PROJECT_ROOT}/tmp/test/bin/registry - - diff --git a/hack/install.sh b/hack/install.sh index 930679decc..190f6ca181 100755 --- a/hack/install.sh +++ b/hack/install.sh @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - set -e CURRENT_DIR=$(dirname $0) diff --git a/hack/tools.go b/hack/tools.go index 86d7910b51..b76c619e68 100644 --- a/hack/tools.go +++ b/hack/tools.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:build tools // +build tools diff --git a/pkg/blobaccess/blobaccess_test.go b/pkg/blobaccess/blobaccess_test.go index 17993d466a..04957730b0 100644 --- a/pkg/blobaccess/blobaccess_test.go +++ b/pkg/blobaccess/blobaccess_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blobaccess_test import ( diff --git a/pkg/blobaccess/bpi/interface.go b/pkg/blobaccess/bpi/interface.go index 488b926630..2b296218ed 100644 --- a/pkg/blobaccess/bpi/interface.go +++ b/pkg/blobaccess/bpi/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package bpi import ( diff --git a/pkg/blobaccess/bpi/utils.go b/pkg/blobaccess/bpi/utils.go index 2589c17791..8a3f0c1a40 100644 --- a/pkg/blobaccess/bpi/utils.go +++ b/pkg/blobaccess/bpi/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package bpi import ( diff --git a/pkg/blobaccess/bpi/view.go b/pkg/blobaccess/bpi/view.go index 6e56e96c9d..abfc174c54 100644 --- a/pkg/blobaccess/bpi/view.go +++ b/pkg/blobaccess/bpi/view.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package bpi import ( diff --git a/pkg/blobaccess/cached.go b/pkg/blobaccess/cached.go index 7290a051c3..d71748a367 100644 --- a/pkg/blobaccess/cached.go +++ b/pkg/blobaccess/cached.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blobaccess import ( diff --git a/pkg/blobaccess/compress.go b/pkg/blobaccess/compress.go index d246c9391c..2bc9ff6591 100644 --- a/pkg/blobaccess/compress.go +++ b/pkg/blobaccess/compress.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blobaccess import ( diff --git a/pkg/blobaccess/compress_test.go b/pkg/blobaccess/compress_test.go index 9a748d11e8..9face394c2 100644 --- a/pkg/blobaccess/compress_test.go +++ b/pkg/blobaccess/compress_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blobaccess_test import ( diff --git a/pkg/blobaccess/dataaccess.go b/pkg/blobaccess/dataaccess.go index 2ac98460a8..3635723f51 100644 --- a/pkg/blobaccess/dataaccess.go +++ b/pkg/blobaccess/dataaccess.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blobaccess import ( diff --git a/pkg/blobaccess/digest.go b/pkg/blobaccess/digest.go index acefe02a70..d42f952b41 100644 --- a/pkg/blobaccess/digest.go +++ b/pkg/blobaccess/digest.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blobaccess import ( diff --git a/pkg/blobaccess/dirtree/access.go b/pkg/blobaccess/dirtree/access.go index e4cd5642a0..7bc7922df4 100644 --- a/pkg/blobaccess/dirtree/access.go +++ b/pkg/blobaccess/dirtree/access.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtree import ( diff --git a/pkg/blobaccess/dirtree/options.go b/pkg/blobaccess/dirtree/options.go index 060785d269..5793b9e60d 100644 --- a/pkg/blobaccess/dirtree/options.go +++ b/pkg/blobaccess/dirtree/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtree import ( diff --git a/pkg/blobaccess/doc.go b/pkg/blobaccess/doc.go index a58ac4e458..08b20b1e74 100644 --- a/pkg/blobaccess/doc.go +++ b/pkg/blobaccess/doc.go @@ -1,6 +1,2 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package blobaccess provides the basic set of the most commonly needed BlobAccess implementations. package blobaccess diff --git a/pkg/blobaccess/dockerdaemon/access.go b/pkg/blobaccess/dockerdaemon/access.go index 695b83ba24..8a636390c9 100644 --- a/pkg/blobaccess/dockerdaemon/access.go +++ b/pkg/blobaccess/dockerdaemon/access.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockerdaemon import ( diff --git a/pkg/blobaccess/dockerdaemon/options.go b/pkg/blobaccess/dockerdaemon/options.go index 81291b9976..f44bb884fa 100644 --- a/pkg/blobaccess/dockerdaemon/options.go +++ b/pkg/blobaccess/dockerdaemon/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockerdaemon import ( diff --git a/pkg/blobaccess/dockermulti/access.go b/pkg/blobaccess/dockermulti/access.go index 73489dde55..4e09b7b7cb 100644 --- a/pkg/blobaccess/dockermulti/access.go +++ b/pkg/blobaccess/dockermulti/access.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockermulti import ( diff --git a/pkg/blobaccess/dockermulti/options.go b/pkg/blobaccess/dockermulti/options.go index 51c39227cd..309a6c507b 100644 --- a/pkg/blobaccess/dockermulti/options.go +++ b/pkg/blobaccess/dockermulti/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockermulti import ( diff --git a/pkg/blobaccess/helm/options.go b/pkg/blobaccess/helm/options.go index 2f72905de5..39930e06d7 100644 --- a/pkg/blobaccess/helm/options.go +++ b/pkg/blobaccess/helm/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/pkg/blobaccess/helm/resource.go b/pkg/blobaccess/helm/resource.go index 1e5c5189bf..4f00a31a39 100644 --- a/pkg/blobaccess/helm/resource.go +++ b/pkg/blobaccess/helm/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/pkg/blobaccess/interface.go b/pkg/blobaccess/interface.go index 1e31db6fe8..a0c751ac73 100644 --- a/pkg/blobaccess/interface.go +++ b/pkg/blobaccess/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blobaccess import ( diff --git a/pkg/blobaccess/internal/interface.go b/pkg/blobaccess/internal/interface.go index 0c1b33dabe..36cc92b5fd 100644 --- a/pkg/blobaccess/internal/interface.go +++ b/pkg/blobaccess/internal/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/blobaccess/ociartifact/options.go b/pkg/blobaccess/ociartifact/options.go index f305cfdd08..ccc0cd9c92 100644 --- a/pkg/blobaccess/ociartifact/options.go +++ b/pkg/blobaccess/ociartifact/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifact import ( diff --git a/pkg/blobaccess/ociartifact/resource.go b/pkg/blobaccess/ociartifact/resource.go index 3b8990464a..b437c9b96e 100644 --- a/pkg/blobaccess/ociartifact/resource.go +++ b/pkg/blobaccess/ociartifact/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifact import ( diff --git a/pkg/blobaccess/standard.go b/pkg/blobaccess/standard.go index 6856cf0ff8..1283933458 100644 --- a/pkg/blobaccess/standard.go +++ b/pkg/blobaccess/standard.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blobaccess import ( diff --git a/pkg/blobaccess/suite_test.go b/pkg/blobaccess/suite_test.go index 7b565b4525..c57c09d6bb 100644 --- a/pkg/blobaccess/suite_test.go +++ b/pkg/blobaccess/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blobaccess_test import ( diff --git a/pkg/blobaccess/temp_test.go b/pkg/blobaccess/temp_test.go index 41a0f62e43..b467eba1c8 100644 --- a/pkg/blobaccess/temp_test.go +++ b/pkg/blobaccess/temp_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blobaccess_test import ( diff --git a/pkg/blobaccess/utils.go b/pkg/blobaccess/utils.go index 6a0afa8a03..7ce1c0ec66 100644 --- a/pkg/blobaccess/utils.go +++ b/pkg/blobaccess/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blobaccess import ( diff --git a/pkg/blobaccess/wget/access.go b/pkg/blobaccess/wget/access.go index fb2718a6e5..d02c45c0ac 100644 --- a/pkg/blobaccess/wget/access.go +++ b/pkg/blobaccess/wget/access.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wget import ( diff --git a/pkg/blobaccess/wget/logging.go b/pkg/blobaccess/wget/logging.go index 98dc39bdd3..0814553e5e 100644 --- a/pkg/blobaccess/wget/logging.go +++ b/pkg/blobaccess/wget/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wget import ( diff --git a/pkg/blobaccess/wget/options.go b/pkg/blobaccess/wget/options.go index a3c827a4c1..8e6769eabe 100644 --- a/pkg/blobaccess/wget/options.go +++ b/pkg/blobaccess/wget/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wget import ( diff --git a/pkg/clisupport/labels.go b/pkg/clisupport/labels.go index 57bd059200..082be2e83c 100644 --- a/pkg/clisupport/labels.go +++ b/pkg/clisupport/labels.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package clisupport import ( diff --git a/pkg/cobrautils/cleanup_test.go b/pkg/cobrautils/cleanup_test.go index 8870e1fd81..368c28e76b 100644 --- a/pkg/cobrautils/cleanup_test.go +++ b/pkg/cobrautils/cleanup_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cobrautils_test import ( diff --git a/pkg/cobrautils/flag/bytes.go b/pkg/cobrautils/flag/bytes.go index 96627d6348..6080a8827f 100644 --- a/pkg/cobrautils/flag/bytes.go +++ b/pkg/cobrautils/flag/bytes.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag import ( diff --git a/pkg/cobrautils/flag/labelledstring.go b/pkg/cobrautils/flag/labelledstring.go index f90e072a1e..4f026ff492 100644 --- a/pkg/cobrautils/flag/labelledstring.go +++ b/pkg/cobrautils/flag/labelledstring.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag import ( diff --git a/pkg/cobrautils/flag/labelledstring_test.go b/pkg/cobrautils/flag/labelledstring_test.go index 6ba94ad51d..aaa9ee1bf0 100644 --- a/pkg/cobrautils/flag/labelledstring_test.go +++ b/pkg/cobrautils/flag/labelledstring_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag import ( diff --git a/pkg/cobrautils/flag/labelledvalue.go b/pkg/cobrautils/flag/labelledvalue.go index aa1b4de538..e1342ba160 100644 --- a/pkg/cobrautils/flag/labelledvalue.go +++ b/pkg/cobrautils/flag/labelledvalue.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag import ( diff --git a/pkg/cobrautils/flag/labelledvalue_test.go b/pkg/cobrautils/flag/labelledvalue_test.go index 0972a6707c..6edef1e0e0 100644 --- a/pkg/cobrautils/flag/labelledvalue_test.go +++ b/pkg/cobrautils/flag/labelledvalue_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag import ( diff --git a/pkg/cobrautils/flag/semver.go b/pkg/cobrautils/flag/semver.go index 96c33a85ab..7afb041a34 100644 --- a/pkg/cobrautils/flag/semver.go +++ b/pkg/cobrautils/flag/semver.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag import ( diff --git a/pkg/cobrautils/flag/semver_constraint.go b/pkg/cobrautils/flag/semver_constraint.go index 2987e963c0..f541d51e79 100644 --- a/pkg/cobrautils/flag/semver_constraint.go +++ b/pkg/cobrautils/flag/semver_constraint.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag import ( diff --git a/pkg/cobrautils/flag/string_colon_stringslice.go b/pkg/cobrautils/flag/string_colon_stringslice.go index c0e336bc70..1f7c67b6e1 100644 --- a/pkg/cobrautils/flag/string_colon_stringslice.go +++ b/pkg/cobrautils/flag/string_colon_stringslice.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag import ( diff --git a/pkg/cobrautils/flag/string_colon_stringslice_test.go b/pkg/cobrautils/flag/string_colon_stringslice_test.go index 699b617ae5..09f0a5ef1e 100644 --- a/pkg/cobrautils/flag/string_colon_stringslice_test.go +++ b/pkg/cobrautils/flag/string_colon_stringslice_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag_test import ( diff --git a/pkg/cobrautils/flag/string_to_stringslice.go b/pkg/cobrautils/flag/string_to_stringslice.go index cce9cd3603..8d6c3a5dd0 100644 --- a/pkg/cobrautils/flag/string_to_stringslice.go +++ b/pkg/cobrautils/flag/string_to_stringslice.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag import ( diff --git a/pkg/cobrautils/flag/string_to_stringslice_test.go b/pkg/cobrautils/flag/string_to_stringslice_test.go index cea8de65c8..589abb8bf7 100644 --- a/pkg/cobrautils/flag/string_to_stringslice_test.go +++ b/pkg/cobrautils/flag/string_to_stringslice_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag_test import ( diff --git a/pkg/cobrautils/flag/string_to_value.go b/pkg/cobrautils/flag/string_to_value.go index c1e639dae6..1712e56ec9 100644 --- a/pkg/cobrautils/flag/string_to_value.go +++ b/pkg/cobrautils/flag/string_to_value.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag import ( diff --git a/pkg/cobrautils/flag/string_to_value_test.go b/pkg/cobrautils/flag/string_to_value_test.go index a304283a1c..07bf3f7adc 100644 --- a/pkg/cobrautils/flag/string_to_value_test.go +++ b/pkg/cobrautils/flag/string_to_value_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag import ( diff --git a/pkg/cobrautils/flag/suite_test.go b/pkg/cobrautils/flag/suite_test.go index f3f2e05d84..5e7b595953 100644 --- a/pkg/cobrautils/flag/suite_test.go +++ b/pkg/cobrautils/flag/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag import ( diff --git a/pkg/cobrautils/flag/yaml.go b/pkg/cobrautils/flag/yaml.go index 5f73b5b418..b15c95db3a 100644 --- a/pkg/cobrautils/flag/yaml.go +++ b/pkg/cobrautils/flag/yaml.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag import ( diff --git a/pkg/cobrautils/flag/yaml_test.go b/pkg/cobrautils/flag/yaml_test.go index 340b8b9c7b..457cdb207a 100644 --- a/pkg/cobrautils/flag/yaml_test.go +++ b/pkg/cobrautils/flag/yaml_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flag import ( diff --git a/pkg/cobrautils/flagsets/configoptions.go b/pkg/cobrautils/flagsets/configoptions.go index e4c15f7a76..a87d7845c9 100644 --- a/pkg/cobrautils/flagsets/configoptions.go +++ b/pkg/cobrautils/flagsets/configoptions.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flagsets import ( diff --git a/pkg/cobrautils/flagsets/configoptionset.go b/pkg/cobrautils/flagsets/configoptionset.go index 0ae91af40a..fd0bc59a15 100644 --- a/pkg/cobrautils/flagsets/configoptionset.go +++ b/pkg/cobrautils/flagsets/configoptionset.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flagsets import ( diff --git a/pkg/cobrautils/flagsets/configure_test.go b/pkg/cobrautils/flagsets/configure_test.go index ad2f8081f1..c2326b41dd 100644 --- a/pkg/cobrautils/flagsets/configure_test.go +++ b/pkg/cobrautils/flagsets/configure_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flagsets_test import ( diff --git a/pkg/cobrautils/flagsets/filter.go b/pkg/cobrautils/flagsets/filter.go index 1fe454afef..aeab3b5d71 100644 --- a/pkg/cobrautils/flagsets/filter.go +++ b/pkg/cobrautils/flagsets/filter.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flagsets func Not(f Filter) Filter { diff --git a/pkg/cobrautils/flagsets/flags_test.go b/pkg/cobrautils/flagsets/flags_test.go index d2ce6983e9..110ba911a6 100644 --- a/pkg/cobrautils/flagsets/flags_test.go +++ b/pkg/cobrautils/flagsets/flags_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flagsets_test import ( diff --git a/pkg/cobrautils/flagsets/flagsetscheme/doc.go b/pkg/cobrautils/flagsets/flagsetscheme/doc.go index 898f8d56e9..d83cb619db 100644 --- a/pkg/cobrautils/flagsets/flagsetscheme/doc.go +++ b/pkg/cobrautils/flagsets/flagsetscheme/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package flagsetscheme provides a runtime.TypeScheme with support // for command line option sets for the described object types. // Therefore, the object types (VersionTypedObjectType) have to provide diff --git a/pkg/cobrautils/flagsets/flagsetscheme/scheme.go b/pkg/cobrautils/flagsets/flagsetscheme/scheme.go index 327b2ea997..aafc90fd68 100644 --- a/pkg/cobrautils/flagsets/flagsetscheme/scheme.go +++ b/pkg/cobrautils/flagsets/flagsetscheme/scheme.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flagsetscheme import ( diff --git a/pkg/cobrautils/flagsets/flagsetscheme/types.go b/pkg/cobrautils/flagsets/flagsetscheme/types.go index 48b8acb25a..f69af8478b 100644 --- a/pkg/cobrautils/flagsets/flagsetscheme/types.go +++ b/pkg/cobrautils/flagsets/flagsetscheme/types.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flagsetscheme import ( diff --git a/pkg/cobrautils/flagsets/flagsetscheme/types_options.go b/pkg/cobrautils/flagsets/flagsetscheme/types_options.go index 104b76eac9..a04a30f35b 100644 --- a/pkg/cobrautils/flagsets/flagsetscheme/types_options.go +++ b/pkg/cobrautils/flagsets/flagsetscheme/types_options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flagsetscheme import ( diff --git a/pkg/cobrautils/flagsets/handler.go b/pkg/cobrautils/flagsets/handler.go index 0fc015e363..58d1356f72 100644 --- a/pkg/cobrautils/flagsets/handler.go +++ b/pkg/cobrautils/flagsets/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flagsets import ( diff --git a/pkg/cobrautils/flagsets/provider.go b/pkg/cobrautils/flagsets/provider.go index 59df087701..959706d802 100644 --- a/pkg/cobrautils/flagsets/provider.go +++ b/pkg/cobrautils/flagsets/provider.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flagsets import ( diff --git a/pkg/cobrautils/flagsets/suite_test.go b/pkg/cobrautils/flagsets/suite_test.go index 5de6938923..b4ec0a1c63 100644 --- a/pkg/cobrautils/flagsets/suite_test.go +++ b/pkg/cobrautils/flagsets/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flagsets_test import ( diff --git a/pkg/cobrautils/flagsets/typeset_test.go b/pkg/cobrautils/flagsets/typeset_test.go index 6db3d3266b..8bbfa48bf0 100644 --- a/pkg/cobrautils/flagsets/typeset_test.go +++ b/pkg/cobrautils/flagsets/typeset_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flagsets_test import ( diff --git a/pkg/cobrautils/flagsets/utils.go b/pkg/cobrautils/flagsets/utils.go index ae407d185a..74031c7ed4 100644 --- a/pkg/cobrautils/flagsets/utils.go +++ b/pkg/cobrautils/flagsets/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flagsets import ( diff --git a/pkg/cobrautils/flagsets/utils_test.go b/pkg/cobrautils/flagsets/utils_test.go index cf88f9a43e..6112d9b722 100644 --- a/pkg/cobrautils/flagsets/utils_test.go +++ b/pkg/cobrautils/flagsets/utils_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package flagsets_test import ( diff --git a/pkg/cobrautils/funcs.go b/pkg/cobrautils/funcs.go index 47e1065c16..4810e3d5a7 100644 --- a/pkg/cobrautils/funcs.go +++ b/pkg/cobrautils/funcs.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cobrautils import ( diff --git a/pkg/cobrautils/groups/flagusages.go b/pkg/cobrautils/groups/flagusages.go index dad783616b..b6fe2c12ad 100644 --- a/pkg/cobrautils/groups/flagusages.go +++ b/pkg/cobrautils/groups/flagusages.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package groups import ( diff --git a/pkg/cobrautils/links.go b/pkg/cobrautils/links.go index 2257e9dc6f..70ed6f34fa 100644 --- a/pkg/cobrautils/links.go +++ b/pkg/cobrautils/links.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cobrautils import ( diff --git a/pkg/cobrautils/logopts/options.go b/pkg/cobrautils/logopts/options.go index 5af9483f5f..ea39f8beb8 100644 --- a/pkg/cobrautils/logopts/options.go +++ b/pkg/cobrautils/logopts/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package logopts import ( diff --git a/pkg/cobrautils/logopts/options_test.go b/pkg/cobrautils/logopts/options_test.go index 827fe0254f..428f8bef31 100644 --- a/pkg/cobrautils/logopts/options_test.go +++ b/pkg/cobrautils/logopts/options_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package logopts import ( diff --git a/pkg/cobrautils/logopts/suite_test.go b/pkg/cobrautils/logopts/suite_test.go index 9b4c99c009..204541e0ff 100644 --- a/pkg/cobrautils/logopts/suite_test.go +++ b/pkg/cobrautils/logopts/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package logopts import ( diff --git a/pkg/cobrautils/suite_test.go b/pkg/cobrautils/suite_test.go index 3b20aa0acd..4a85061a0a 100644 --- a/pkg/cobrautils/suite_test.go +++ b/pkg/cobrautils/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cobrautils_test import ( diff --git a/pkg/cobrautils/template.go b/pkg/cobrautils/template.go index 1908085ba5..eb84dbfeb0 100644 --- a/pkg/cobrautils/template.go +++ b/pkg/cobrautils/template.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cobrautils const HelpTemplate = "{{.CommandPath}} \u2014 {{title .Short}}" + `{{if .IsAvailableCommand}} diff --git a/pkg/cobrautils/tweak.go b/pkg/cobrautils/tweak.go index 98715c9b70..59948423e0 100644 --- a/pkg/cobrautils/tweak.go +++ b/pkg/cobrautils/tweak.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cobrautils import ( diff --git a/pkg/common/accessio/access.go b/pkg/common/accessio/access.go index 09792ee981..bd181bc771 100644 --- a/pkg/common/accessio/access.go +++ b/pkg/common/accessio/access.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio import ( diff --git a/pkg/common/accessio/cache.go b/pkg/common/accessio/cache.go index c71c147c8b..f6f6552363 100644 --- a/pkg/common/accessio/cache.go +++ b/pkg/common/accessio/cache.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio import ( diff --git a/pkg/common/accessio/cache_test.go b/pkg/common/accessio/cache_test.go index 74965da6bd..9d14bb58d1 100644 --- a/pkg/common/accessio/cache_test.go +++ b/pkg/common/accessio/cache_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio_test import ( diff --git a/pkg/common/accessio/digestreader.go b/pkg/common/accessio/digestreader.go index 05b94e4687..e4df566ac4 100644 --- a/pkg/common/accessio/digestreader.go +++ b/pkg/common/accessio/digestreader.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio import ( diff --git a/pkg/common/accessio/digestwriter.go b/pkg/common/accessio/digestwriter.go index aebd4ca9ab..d2454be130 100644 --- a/pkg/common/accessio/digestwriter.go +++ b/pkg/common/accessio/digestwriter.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio import ( diff --git a/pkg/common/accessio/downloader/downloader.go b/pkg/common/accessio/downloader/downloader.go index 5033683106..46f67f54bf 100644 --- a/pkg/common/accessio/downloader/downloader.go +++ b/pkg/common/accessio/downloader/downloader.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package downloader import "io" diff --git a/pkg/common/accessio/downloader/http/downloader.go b/pkg/common/accessio/downloader/http/downloader.go index 8a2d28800b..484c0989d2 100644 --- a/pkg/common/accessio/downloader/http/downloader.go +++ b/pkg/common/accessio/downloader/http/downloader.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package http import ( diff --git a/pkg/common/accessio/downloader/s3/downloader.go b/pkg/common/accessio/downloader/s3/downloader.go index 9420530801..8577072bfc 100644 --- a/pkg/common/accessio/downloader/s3/downloader.go +++ b/pkg/common/accessio/downloader/s3/downloader.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package s3 import ( diff --git a/pkg/common/accessio/format.go b/pkg/common/accessio/format.go index 8ccb113184..850a568663 100644 --- a/pkg/common/accessio/format.go +++ b/pkg/common/accessio/format.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio import ( diff --git a/pkg/common/accessio/limitwriter.go b/pkg/common/accessio/limitwriter.go index c17136b09f..555f351404 100644 --- a/pkg/common/accessio/limitwriter.go +++ b/pkg/common/accessio/limitwriter.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio import ( diff --git a/pkg/common/accessio/ondemandreader.go b/pkg/common/accessio/ondemandreader.go index 30bd3203a0..3d65826ba4 100644 --- a/pkg/common/accessio/ondemandreader.go +++ b/pkg/common/accessio/ondemandreader.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio import ( diff --git a/pkg/common/accessio/opts.go b/pkg/common/accessio/opts.go index a03ad35f6d..40b3a32e9a 100644 --- a/pkg/common/accessio/opts.go +++ b/pkg/common/accessio/opts.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio import ( diff --git a/pkg/common/accessio/resettablereader.go b/pkg/common/accessio/resettablereader.go index e03e93f486..2f2d601174 100644 --- a/pkg/common/accessio/resettablereader.go +++ b/pkg/common/accessio/resettablereader.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio import ( diff --git a/pkg/common/accessio/resettablereader_test.go b/pkg/common/accessio/resettablereader_test.go index 9619f11691..3f6e646d8d 100644 --- a/pkg/common/accessio/resettablereader_test.go +++ b/pkg/common/accessio/resettablereader_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio import ( diff --git a/pkg/common/accessio/retry_test.go b/pkg/common/accessio/retry_test.go index 5d712edcb4..d643d54b2d 100644 --- a/pkg/common/accessio/retry_test.go +++ b/pkg/common/accessio/retry_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio_test import ( diff --git a/pkg/common/accessio/suite_test.go b/pkg/common/accessio/suite_test.go index 5ed0ad03ba..80b25f1e9c 100644 --- a/pkg/common/accessio/suite_test.go +++ b/pkg/common/accessio/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio_test import ( diff --git a/pkg/common/accessio/utils.go b/pkg/common/accessio/utils.go index 7cfe9a452c..cb68e85fe6 100644 --- a/pkg/common/accessio/utils.go +++ b/pkg/common/accessio/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio import ( diff --git a/pkg/common/accessio/wrapper.go b/pkg/common/accessio/wrapper.go index 23caa30b69..acbd942cb7 100644 --- a/pkg/common/accessio/wrapper.go +++ b/pkg/common/accessio/wrapper.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessio import ( diff --git a/pkg/common/accessobj/accessobject.go b/pkg/common/accessobj/accessobject.go index 12fc35f91a..45f201c1cd 100644 --- a/pkg/common/accessobj/accessobject.go +++ b/pkg/common/accessobj/accessobject.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessobj import ( diff --git a/pkg/common/accessobj/accessstate.go b/pkg/common/accessobj/accessstate.go index 696a761a9e..e9b21decae 100644 --- a/pkg/common/accessobj/accessstate.go +++ b/pkg/common/accessobj/accessstate.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessobj import ( diff --git a/pkg/common/accessobj/cachedblob.go b/pkg/common/accessobj/cachedblob.go index 280e1a3853..5ca6cfbab8 100644 --- a/pkg/common/accessobj/cachedblob.go +++ b/pkg/common/accessobj/cachedblob.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessobj import ( diff --git a/pkg/common/accessobj/cachedblob_test.go b/pkg/common/accessobj/cachedblob_test.go index 4bf670e50b..4a66137bb8 100644 --- a/pkg/common/accessobj/cachedblob_test.go +++ b/pkg/common/accessobj/cachedblob_test.go @@ -3,11 +3,12 @@ package accessobj_test import ( "io" - "github.com/mandelsoft/vfs/pkg/osfs" - "github.com/mandelsoft/vfs/pkg/vfs" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/mandelsoft/vfs/pkg/osfs" + "github.com/mandelsoft/vfs/pkg/vfs" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" diff --git a/pkg/common/accessobj/check.go b/pkg/common/accessobj/check.go index f25109e6a2..a4dfd31086 100644 --- a/pkg/common/accessobj/check.go +++ b/pkg/common/accessobj/check.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessobj import ( diff --git a/pkg/common/accessobj/filesystemaccess.go b/pkg/common/accessobj/filesystemaccess.go index 116c9ea75d..26b43e1bea 100644 --- a/pkg/common/accessobj/filesystemaccess.go +++ b/pkg/common/accessobj/filesystemaccess.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessobj import ( diff --git a/pkg/common/accessobj/format-directory.go b/pkg/common/accessobj/format-directory.go index 07edad78cf..9a5414a79f 100644 --- a/pkg/common/accessobj/format-directory.go +++ b/pkg/common/accessobj/format-directory.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessobj import ( diff --git a/pkg/common/accessobj/format-tar.go b/pkg/common/accessobj/format-tar.go index 52edd539c2..e2d28f7ba0 100644 --- a/pkg/common/accessobj/format-tar.go +++ b/pkg/common/accessobj/format-tar.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessobj import ( diff --git a/pkg/common/accessobj/format-tgz.go b/pkg/common/accessobj/format-tgz.go index e743fb5ae7..c5c348ec77 100644 --- a/pkg/common/accessobj/format-tgz.go +++ b/pkg/common/accessobj/format-tgz.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessobj import ( diff --git a/pkg/common/accessobj/format.go b/pkg/common/accessobj/format.go index fd321ccb5d..23e061b2ab 100644 --- a/pkg/common/accessobj/format.go +++ b/pkg/common/accessobj/format.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessobj import ( diff --git a/pkg/common/accessobj/suite_test.go b/pkg/common/accessobj/suite_test.go index 9309735b18..babcb59f9a 100644 --- a/pkg/common/accessobj/suite_test.go +++ b/pkg/common/accessobj/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessobj_test import ( diff --git a/pkg/common/accessobj/utils.go b/pkg/common/accessobj/utils.go index f0fc63b947..c9a8bc98c5 100644 --- a/pkg/common/accessobj/utils.go +++ b/pkg/common/accessobj/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessobj import ( diff --git a/pkg/common/compression/c_bzip2.go b/pkg/common/compression/c_bzip2.go index 0e4807e29e..902b0b7311 100644 --- a/pkg/common/compression/c_bzip2.go +++ b/pkg/common/compression/c_bzip2.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compression import ( diff --git a/pkg/common/compression/c_gzip.go b/pkg/common/compression/c_gzip.go index 937368675b..2a86370633 100644 --- a/pkg/common/compression/c_gzip.go +++ b/pkg/common/compression/c_gzip.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compression import ( diff --git a/pkg/common/compression/c_xz.go b/pkg/common/compression/c_xz.go index 41a53888e4..0728d57d60 100644 --- a/pkg/common/compression/c_xz.go +++ b/pkg/common/compression/c_xz.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compression import ( diff --git a/pkg/common/compression/c_zstd.go b/pkg/common/compression/c_zstd.go index ac757920da..cdfe436c64 100644 --- a/pkg/common/compression/c_zstd.go +++ b/pkg/common/compression/c_zstd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compression import ( diff --git a/pkg/common/compression/compression.go b/pkg/common/compression/compression.go index 4fd81aa182..e69a02a94e 100644 --- a/pkg/common/compression/compression.go +++ b/pkg/common/compression/compression.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compression import ( diff --git a/pkg/common/compression/compression_test.go b/pkg/common/compression/compression_test.go index 956a1c80df..50094d3563 100644 --- a/pkg/common/compression/compression_test.go +++ b/pkg/common/compression/compression_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compression import ( diff --git a/pkg/common/compression/default.go b/pkg/common/compression/default.go index 7563c59546..9ef8f109d2 100644 --- a/pkg/common/compression/default.go +++ b/pkg/common/compression/default.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compression import ( diff --git a/pkg/common/compression/matchreader.go b/pkg/common/compression/matchreader.go index 6c84bfc908..c4c983db69 100644 --- a/pkg/common/compression/matchreader.go +++ b/pkg/common/compression/matchreader.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compression import ( diff --git a/pkg/common/compression/types.go b/pkg/common/compression/types.go index 9c20383200..ed8f608534 100644 --- a/pkg/common/compression/types.go +++ b/pkg/common/compression/types.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // This package has been initially taken from github.com/containers/image // and modified to be provide a useful simple API based on // an Algorithm interface diff --git a/pkg/common/compression/utils.go b/pkg/common/compression/utils.go index 97de1b8163..163fe3fdf6 100644 --- a/pkg/common/compression/utils.go +++ b/pkg/common/compression/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compression import ( diff --git a/pkg/common/const.go b/pkg/common/const.go index 413a91a62f..7ffc794c2a 100644 --- a/pkg/common/const.go +++ b/pkg/common/const.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common const OCM_TYPE_GROUP_SUFFIX = ".ocm.software" diff --git a/pkg/common/history.go b/pkg/common/history.go index 339563381a..2f2c30f92a 100644 --- a/pkg/common/history.go +++ b/pkg/common/history.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/pkg/common/history_test.go b/pkg/common/history_test.go index 8e163cf776..018a90cb17 100644 --- a/pkg/common/history_test.go +++ b/pkg/common/history_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common_test import ( diff --git a/pkg/common/printer.go b/pkg/common/printer.go index 9f6ecfabc6..946ce2d8b0 100644 --- a/pkg/common/printer.go +++ b/pkg/common/printer.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/pkg/common/printer_test.go b/pkg/common/printer_test.go index 2f57bdf665..b520fc6cb8 100644 --- a/pkg/common/printer_test.go +++ b/pkg/common/printer_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/pkg/common/properties.go b/pkg/common/properties.go index 08904373a9..53981a76fe 100644 --- a/pkg/common/properties.go +++ b/pkg/common/properties.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/pkg/common/suite_test.go b/pkg/common/suite_test.go index 9563128be1..ff272523e3 100644 --- a/pkg/common/suite_test.go +++ b/pkg/common/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common_test import ( diff --git a/pkg/common/types.go b/pkg/common/types.go index 2bba104131..bc7977bfa9 100644 --- a/pkg/common/types.go +++ b/pkg/common/types.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/pkg/common/utils.go b/pkg/common/utils.go index 730e7608a7..3b46dce785 100644 --- a/pkg/common/utils.go +++ b/pkg/common/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/pkg/common/walk.go b/pkg/common/walk.go index 592e5503fa..9707c88e5d 100644 --- a/pkg/common/walk.go +++ b/pkg/common/walk.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/pkg/contexts/clictx/builder.go b/pkg/contexts/clictx/builder.go index 949067b162..c1f5cc7a55 100644 --- a/pkg/contexts/clictx/builder.go +++ b/pkg/contexts/clictx/builder.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package clictx import ( diff --git a/pkg/contexts/clictx/config/config_test.go b/pkg/contexts/clictx/config/config_test.go index a5379c89cc..3d1299df52 100644 --- a/pkg/contexts/clictx/config/config_test.go +++ b/pkg/contexts/clictx/config/config_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/clictx/config/suite_test.go b/pkg/contexts/clictx/config/suite_test.go index 9fcedbee8b..489f78ce48 100644 --- a/pkg/contexts/clictx/config/suite_test.go +++ b/pkg/contexts/clictx/config/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/clictx/config/type.go b/pkg/contexts/clictx/config/type.go index b74c387a53..ec39f96f8c 100644 --- a/pkg/contexts/clictx/config/type.go +++ b/pkg/contexts/clictx/config/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/clictx/interface.go b/pkg/contexts/clictx/interface.go index 7e49075b9e..694a825c25 100644 --- a/pkg/contexts/clictx/interface.go +++ b/pkg/contexts/clictx/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package clictx import ( diff --git a/pkg/contexts/clictx/internal/builder.go b/pkg/contexts/clictx/internal/builder.go index a68397632f..d065c7216e 100644 --- a/pkg/contexts/clictx/internal/builder.go +++ b/pkg/contexts/clictx/internal/builder.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/clictx/internal/context.go b/pkg/contexts/clictx/internal/context.go index d6a3cfa70c..23541b925e 100644 --- a/pkg/contexts/clictx/internal/context.go +++ b/pkg/contexts/clictx/internal/context.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/config/builder.go b/pkg/contexts/config/builder.go index 836e78ab9c..fd618ae8d3 100644 --- a/pkg/contexts/config/builder.go +++ b/pkg/contexts/config/builder.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/config/config/context_test.go b/pkg/contexts/config/config/context_test.go index 7fffc81209..c11385f6a5 100644 --- a/pkg/contexts/config/config/context_test.go +++ b/pkg/contexts/config/config/context_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( @@ -12,14 +8,14 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/generics" + . "github.com/open-component-model/ocm/pkg/testutils" "sigs.k8s.io/yaml" "github.com/open-component-model/ocm/pkg/contexts/config" local "github.com/open-component-model/ocm/pkg/contexts/config/config" - . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" + "github.com/open-component-model/ocm/pkg/generics" ) func CheckRefs(ctx config.Context, n int) { diff --git a/pkg/contexts/config/config/dummy_test.go b/pkg/contexts/config/config/dummy_test.go index 117056a0e6..321c378877 100644 --- a/pkg/contexts/config/config/dummy_test.go +++ b/pkg/contexts/config/config/dummy_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/config/config/suite_test.go b/pkg/contexts/config/config/suite_test.go index 12c902e421..43d81cbbb3 100644 --- a/pkg/contexts/config/config/suite_test.go +++ b/pkg/contexts/config/config/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/config/config/type.go b/pkg/contexts/config/config/type.go index 5549e0da8b..ca289687dd 100644 --- a/pkg/contexts/config/config/type.go +++ b/pkg/contexts/config/config/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/config/context_test.go b/pkg/contexts/config/context_test.go index b1ee3fcb2a..0fbe8e662d 100644 --- a/pkg/contexts/config/context_test.go +++ b/pkg/contexts/config/context_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( @@ -10,9 +6,9 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/config" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/errors" ) diff --git a/pkg/contexts/config/cpi/config.go b/pkg/contexts/config/cpi/config.go index e09718feb8..07c6da4536 100644 --- a/pkg/contexts/config/cpi/config.go +++ b/pkg/contexts/config/cpi/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/config/cpi/content.go b/pkg/contexts/config/cpi/content.go index 9ea147b455..7bf827dbcc 100644 --- a/pkg/contexts/config/cpi/content.go +++ b/pkg/contexts/config/cpi/content.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/config/cpi/interface.go b/pkg/contexts/config/cpi/interface.go index d2ce4d6db2..68b019ba70 100644 --- a/pkg/contexts/config/cpi/interface.go +++ b/pkg/contexts/config/cpi/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi // This is the Context Provider Interface for credential providers diff --git a/pkg/contexts/config/dummy_test.go b/pkg/contexts/config/dummy_test.go index 92ba2b3be9..15ecb8af85 100644 --- a/pkg/contexts/config/dummy_test.go +++ b/pkg/contexts/config/dummy_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/config/gc_test.go b/pkg/contexts/config/gc_test.go index 5644457e72..4cd30b2496 100644 --- a/pkg/contexts/config/gc_test.go +++ b/pkg/contexts/config/gc_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/config/init.go b/pkg/contexts/config/init.go index 57283b0e0f..0e5ec58279 100644 --- a/pkg/contexts/config/init.go +++ b/pkg/contexts/config/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/config/interface.go b/pkg/contexts/config/interface.go index 1371bc919b..e7311f634d 100644 --- a/pkg/contexts/config/interface.go +++ b/pkg/contexts/config/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/config/internal/builder.go b/pkg/contexts/config/internal/builder.go index c99dbeefa7..255fe3912f 100644 --- a/pkg/contexts/config/internal/builder.go +++ b/pkg/contexts/config/internal/builder.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/config/internal/builder_test.go b/pkg/contexts/config/internal/builder_test.go index 2e8fcc2ae5..f7bd7ed4bb 100644 --- a/pkg/contexts/config/internal/builder_test.go +++ b/pkg/contexts/config/internal/builder_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal_test import ( diff --git a/pkg/contexts/config/internal/config.go b/pkg/contexts/config/internal/config.go index 955231a929..97914a3176 100644 --- a/pkg/contexts/config/internal/config.go +++ b/pkg/contexts/config/internal/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/config/internal/configtypes.go b/pkg/contexts/config/internal/configtypes.go index 87f7b108a0..7b5c920b53 100644 --- a/pkg/contexts/config/internal/configtypes.go +++ b/pkg/contexts/config/internal/configtypes.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/config/internal/context.go b/pkg/contexts/config/internal/context.go index ea23e652ac..45f633799e 100644 --- a/pkg/contexts/config/internal/context.go +++ b/pkg/contexts/config/internal/context.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/config/internal/errors.go b/pkg/contexts/config/internal/errors.go index 1061dbda59..aff9fcaca5 100644 --- a/pkg/contexts/config/internal/errors.go +++ b/pkg/contexts/config/internal/errors.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/config/internal/logging.go b/pkg/contexts/config/internal/logging.go index dfae7f2ab9..396e750258 100644 --- a/pkg/contexts/config/internal/logging.go +++ b/pkg/contexts/config/internal/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/config/internal/setup_test.go b/pkg/contexts/config/internal/setup_test.go index ff6c44ff1a..bfe489c86e 100644 --- a/pkg/contexts/config/internal/setup_test.go +++ b/pkg/contexts/config/internal/setup_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal_test import ( diff --git a/pkg/contexts/config/internal/store.go b/pkg/contexts/config/internal/store.go index 2b81982d6b..0b6bd6e48d 100644 --- a/pkg/contexts/config/internal/store.go +++ b/pkg/contexts/config/internal/store.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/config/internal/suite_test.go b/pkg/contexts/config/internal/suite_test.go index 5bf0e3d50e..df5517ba6b 100644 --- a/pkg/contexts/config/internal/suite_test.go +++ b/pkg/contexts/config/internal/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal_test import ( diff --git a/pkg/contexts/config/internal/updater.go b/pkg/contexts/config/internal/updater.go index 170710ca5a..eb372255b6 100644 --- a/pkg/contexts/config/internal/updater.go +++ b/pkg/contexts/config/internal/updater.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/config/logging.go b/pkg/contexts/config/logging.go index 081de27e76..cc39161178 100644 --- a/pkg/contexts/config/logging.go +++ b/pkg/contexts/config/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/config/suite_test.go b/pkg/contexts/config/suite_test.go index be97d5cff5..a00e062bd0 100644 --- a/pkg/contexts/config/suite_test.go +++ b/pkg/contexts/config/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/credentials/area_test.go b/pkg/contexts/credentials/area_test.go index cc6cfb4850..df37deea50 100644 --- a/pkg/contexts/credentials/area_test.go +++ b/pkg/contexts/credentials/area_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package credentials_test import ( diff --git a/pkg/contexts/credentials/builder.go b/pkg/contexts/credentials/builder.go index 7d1e5086e5..fcb4c25683 100644 --- a/pkg/contexts/credentials/builder.go +++ b/pkg/contexts/credentials/builder.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package credentials import ( diff --git a/pkg/contexts/credentials/builtin/github/ghcr.go b/pkg/contexts/credentials/builtin/github/ghcr.go index 478dbf002d..9c664afc77 100644 --- a/pkg/contexts/credentials/builtin/github/ghcr.go +++ b/pkg/contexts/credentials/builtin/github/ghcr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package github import ( diff --git a/pkg/contexts/credentials/builtin/github/github.go b/pkg/contexts/credentials/builtin/github/github.go index 4422c9fc22..733820d04f 100644 --- a/pkg/contexts/credentials/builtin/github/github.go +++ b/pkg/contexts/credentials/builtin/github/github.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package github import ( diff --git a/pkg/contexts/credentials/builtin/github/identity/identity.go b/pkg/contexts/credentials/builtin/github/identity/identity.go index 2d95dd7759..c07a16906a 100644 --- a/pkg/contexts/credentials/builtin/github/identity/identity.go +++ b/pkg/contexts/credentials/builtin/github/identity/identity.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity import ( diff --git a/pkg/contexts/credentials/builtin/helm/identity/identity.go b/pkg/contexts/credentials/builtin/helm/identity/identity.go index 586ab6054e..eac8271257 100644 --- a/pkg/contexts/credentials/builtin/helm/identity/identity.go +++ b/pkg/contexts/credentials/builtin/helm/identity/identity.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity import ( diff --git a/pkg/contexts/credentials/builtin/helm/identity/identity_test.go b/pkg/contexts/credentials/builtin/helm/identity/identity_test.go index b650c9d74e..752637555c 100644 --- a/pkg/contexts/credentials/builtin/helm/identity/identity_test.go +++ b/pkg/contexts/credentials/builtin/helm/identity/identity_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity_test import ( diff --git a/pkg/contexts/credentials/builtin/helm/identity/suite_test.go b/pkg/contexts/credentials/builtin/helm/identity/suite_test.go index 51009f8b81..8bcbf8fecb 100644 --- a/pkg/contexts/credentials/builtin/helm/identity/suite_test.go +++ b/pkg/contexts/credentials/builtin/helm/identity/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity_test import ( diff --git a/pkg/contexts/credentials/builtin/init.go b/pkg/contexts/credentials/builtin/init.go index bb8e53dcfb..7996eab6a6 100644 --- a/pkg/contexts/credentials/builtin/init.go +++ b/pkg/contexts/credentials/builtin/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builtin import ( diff --git a/pkg/contexts/credentials/builtin/oci/identity/creds.go b/pkg/contexts/credentials/builtin/oci/identity/creds.go index 000bcdc27c..972f8cf9cd 100644 --- a/pkg/contexts/credentials/builtin/oci/identity/creds.go +++ b/pkg/contexts/credentials/builtin/oci/identity/creds.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity import ( diff --git a/pkg/contexts/credentials/builtin/oci/identity/id_test.go b/pkg/contexts/credentials/builtin/oci/identity/id_test.go index 24b3c953b6..39e5644086 100644 --- a/pkg/contexts/credentials/builtin/oci/identity/id_test.go +++ b/pkg/contexts/credentials/builtin/oci/identity/id_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity_test import ( diff --git a/pkg/contexts/credentials/builtin/oci/identity/identity.go b/pkg/contexts/credentials/builtin/oci/identity/identity.go index a0bebc60ce..57917f4d04 100644 --- a/pkg/contexts/credentials/builtin/oci/identity/identity.go +++ b/pkg/contexts/credentials/builtin/oci/identity/identity.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity import ( diff --git a/pkg/contexts/credentials/builtin/oci/identity/suite_test.go b/pkg/contexts/credentials/builtin/oci/identity/suite_test.go index 4cb69b40c6..31d86c4202 100644 --- a/pkg/contexts/credentials/builtin/oci/identity/suite_test.go +++ b/pkg/contexts/credentials/builtin/oci/identity/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity_test import ( diff --git a/pkg/contexts/credentials/builtin/wget/identity/identity.go b/pkg/contexts/credentials/builtin/wget/identity/identity.go index 3b8119b53e..feac525e03 100644 --- a/pkg/contexts/credentials/builtin/wget/identity/identity.go +++ b/pkg/contexts/credentials/builtin/wget/identity/identity.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity import ( diff --git a/pkg/contexts/credentials/builtin/wget/identity/identity_test.go b/pkg/contexts/credentials/builtin/wget/identity/identity_test.go index 3545388a5b..56c32c1fcb 100644 --- a/pkg/contexts/credentials/builtin/wget/identity/identity_test.go +++ b/pkg/contexts/credentials/builtin/wget/identity/identity_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity_test import ( diff --git a/pkg/contexts/credentials/builtin/wget/identity/suite_test.go b/pkg/contexts/credentials/builtin/wget/identity/suite_test.go index 4cb69b40c6..31d86c4202 100644 --- a/pkg/contexts/credentials/builtin/wget/identity/suite_test.go +++ b/pkg/contexts/credentials/builtin/wget/identity/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity_test import ( diff --git a/pkg/contexts/credentials/config/config_test.go b/pkg/contexts/credentials/config/config_test.go index 3df35db5cc..6871066ebf 100644 --- a/pkg/contexts/credentials/config/config_test.go +++ b/pkg/contexts/credentials/config/config_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/credentials/config/suite_test.go b/pkg/contexts/credentials/config/suite_test.go index 3774619113..aa11f5a377 100644 --- a/pkg/contexts/credentials/config/suite_test.go +++ b/pkg/contexts/credentials/config/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/credentials/config/type.go b/pkg/contexts/credentials/config/type.go index cfed970ff0..529a27ffd4 100644 --- a/pkg/contexts/credentials/config/type.go +++ b/pkg/contexts/credentials/config/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/credentials/const.go b/pkg/contexts/credentials/const.go index 5d0b30e5c1..13dfe2455e 100644 --- a/pkg/contexts/credentials/const.go +++ b/pkg/contexts/credentials/const.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package credentials import ( diff --git a/pkg/contexts/credentials/cpi/builtin.go b/pkg/contexts/credentials/cpi/builtin.go index d24fe6c582..3384e3dd25 100644 --- a/pkg/contexts/credentials/cpi/builtin.go +++ b/pkg/contexts/credentials/cpi/builtin.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/credentials/cpi/const.go b/pkg/contexts/credentials/cpi/const.go index 7374333381..0c65870f1d 100644 --- a/pkg/contexts/credentials/cpi/const.go +++ b/pkg/contexts/credentials/cpi/const.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/credentials/cpi/interface.go b/pkg/contexts/credentials/cpi/interface.go index 8a50393ab1..982084eea9 100644 --- a/pkg/contexts/credentials/cpi/interface.go +++ b/pkg/contexts/credentials/cpi/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi // This is the Context Provider Interface for credential providers diff --git a/pkg/contexts/credentials/cpi/repotypes.go b/pkg/contexts/credentials/cpi/repotypes.go index 28c5647b35..d79212ce43 100644 --- a/pkg/contexts/credentials/cpi/repotypes.go +++ b/pkg/contexts/credentials/cpi/repotypes.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi // this file is identical for contexts oci and credentials and similar for diff --git a/pkg/contexts/credentials/doc.go b/pkg/contexts/credentials/doc.go index a494f9499c..5865a35395 100644 --- a/pkg/contexts/credentials/doc.go +++ b/pkg/contexts/credentials/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package credentials handles the access to credentials for consumers of // credential sets. // diff --git a/pkg/contexts/credentials/gc_test.go b/pkg/contexts/credentials/gc_test.go index bb04219220..feb41777bf 100644 --- a/pkg/contexts/credentials/gc_test.go +++ b/pkg/contexts/credentials/gc_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package credentials_test import ( diff --git a/pkg/contexts/credentials/identity/hostpath/id_test.go b/pkg/contexts/credentials/identity/hostpath/id_test.go index 852eac72a5..c0b1148372 100644 --- a/pkg/contexts/credentials/identity/hostpath/id_test.go +++ b/pkg/contexts/credentials/identity/hostpath/id_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hostpath_test import ( diff --git a/pkg/contexts/credentials/identity/hostpath/identity.go b/pkg/contexts/credentials/identity/hostpath/identity.go index 612512af50..652e2b9c03 100644 --- a/pkg/contexts/credentials/identity/hostpath/identity.go +++ b/pkg/contexts/credentials/identity/hostpath/identity.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hostpath import ( diff --git a/pkg/contexts/credentials/identity/hostpath/suite_test.go b/pkg/contexts/credentials/identity/hostpath/suite_test.go index 578b48d594..c6c1184e13 100644 --- a/pkg/contexts/credentials/identity/hostpath/suite_test.go +++ b/pkg/contexts/credentials/identity/hostpath/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hostpath_test import ( diff --git a/pkg/contexts/credentials/init.go b/pkg/contexts/credentials/init.go index 512a146dd8..1ee7dbf31a 100644 --- a/pkg/contexts/credentials/init.go +++ b/pkg/contexts/credentials/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package credentials import ( diff --git a/pkg/contexts/credentials/interface.go b/pkg/contexts/credentials/interface.go index c7b9d83b42..34f1e74a50 100644 --- a/pkg/contexts/credentials/interface.go +++ b/pkg/contexts/credentials/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package credentials import ( diff --git a/pkg/contexts/credentials/internal/builder.go b/pkg/contexts/credentials/internal/builder.go index 84586314fc..41cb04c55b 100644 --- a/pkg/contexts/credentials/internal/builder.go +++ b/pkg/contexts/credentials/internal/builder.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/credentials/internal/builder_test.go b/pkg/contexts/credentials/internal/builder_test.go index b128be5a93..a96db96b95 100644 --- a/pkg/contexts/credentials/internal/builder_test.go +++ b/pkg/contexts/credentials/internal/builder_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal_test import ( diff --git a/pkg/contexts/credentials/internal/builtin.go b/pkg/contexts/credentials/internal/builtin.go index 8a38a3a83b..8ad928d8f8 100644 --- a/pkg/contexts/credentials/internal/builtin.go +++ b/pkg/contexts/credentials/internal/builtin.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal const AliasRepositoryType = "Alias" diff --git a/pkg/contexts/credentials/internal/const.go b/pkg/contexts/credentials/internal/const.go index 044e545e4a..cb14b92598 100644 --- a/pkg/contexts/credentials/internal/const.go +++ b/pkg/contexts/credentials/internal/const.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal const ( diff --git a/pkg/contexts/credentials/internal/consumers.go b/pkg/contexts/credentials/internal/consumers.go index e2107382c3..796de292aa 100644 --- a/pkg/contexts/credentials/internal/consumers.go +++ b/pkg/contexts/credentials/internal/consumers.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/credentials/internal/context.go b/pkg/contexts/credentials/internal/context.go index a2d1074437..60db42a925 100644 --- a/pkg/contexts/credentials/internal/context.go +++ b/pkg/contexts/credentials/internal/context.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/credentials/internal/cred_test.go b/pkg/contexts/credentials/internal/cred_test.go index b990ed5af2..26204a9945 100644 --- a/pkg/contexts/credentials/internal/cred_test.go +++ b/pkg/contexts/credentials/internal/cred_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal_test import ( diff --git a/pkg/contexts/credentials/internal/credentials.go b/pkg/contexts/credentials/internal/credentials.go index cee09266a9..e5e4933eb9 100644 --- a/pkg/contexts/credentials/internal/credentials.go +++ b/pkg/contexts/credentials/internal/credentials.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/credentials/internal/credentialsspec.go b/pkg/contexts/credentials/internal/credentialsspec.go index 05d7c81058..f423c50012 100644 --- a/pkg/contexts/credentials/internal/credentialsspec.go +++ b/pkg/contexts/credentials/internal/credentialsspec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/credentials/internal/errors.go b/pkg/contexts/credentials/internal/errors.go index 8a2b337817..bdede17a6b 100644 --- a/pkg/contexts/credentials/internal/errors.go +++ b/pkg/contexts/credentials/internal/errors.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/credentials/internal/identity.go b/pkg/contexts/credentials/internal/identity.go index d82e5c1053..57b8c5f90f 100644 --- a/pkg/contexts/credentials/internal/identity.go +++ b/pkg/contexts/credentials/internal/identity.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/credentials/internal/repository.go b/pkg/contexts/credentials/internal/repository.go index 6af2989b32..6486301251 100644 --- a/pkg/contexts/credentials/internal/repository.go +++ b/pkg/contexts/credentials/internal/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/credentials/internal/repotypes.go b/pkg/contexts/credentials/internal/repotypes.go index 0e96254d71..5c00c00d7b 100644 --- a/pkg/contexts/credentials/internal/repotypes.go +++ b/pkg/contexts/credentials/internal/repotypes.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/credentials/internal/suite_test.go b/pkg/contexts/credentials/internal/suite_test.go index e7dc8b84ac..af089360a5 100644 --- a/pkg/contexts/credentials/internal/suite_test.go +++ b/pkg/contexts/credentials/internal/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal_test import ( diff --git a/pkg/contexts/credentials/internal/utils.go b/pkg/contexts/credentials/internal/utils.go index 469346b7d5..553c4cf4f8 100644 --- a/pkg/contexts/credentials/internal/utils.go +++ b/pkg/contexts/credentials/internal/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/credentials/repositories/aliases/cache.go b/pkg/contexts/credentials/repositories/aliases/cache.go index 5ed2ef3e20..8a9db2441e 100644 --- a/pkg/contexts/credentials/repositories/aliases/cache.go +++ b/pkg/contexts/credentials/repositories/aliases/cache.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package aliases import ( diff --git a/pkg/contexts/credentials/repositories/aliases/repo_test.go b/pkg/contexts/credentials/repositories/aliases/repo_test.go index b2f2d4d92d..326d38dd56 100644 --- a/pkg/contexts/credentials/repositories/aliases/repo_test.go +++ b/pkg/contexts/credentials/repositories/aliases/repo_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package aliases_test import ( diff --git a/pkg/contexts/credentials/repositories/aliases/repository.go b/pkg/contexts/credentials/repositories/aliases/repository.go index 003ea59147..3ed4bb259e 100644 --- a/pkg/contexts/credentials/repositories/aliases/repository.go +++ b/pkg/contexts/credentials/repositories/aliases/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package aliases import ( diff --git a/pkg/contexts/credentials/repositories/aliases/suite_test.go b/pkg/contexts/credentials/repositories/aliases/suite_test.go index 683ec2dac3..17542d55a1 100644 --- a/pkg/contexts/credentials/repositories/aliases/suite_test.go +++ b/pkg/contexts/credentials/repositories/aliases/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package aliases_test import ( diff --git a/pkg/contexts/credentials/repositories/aliases/type.go b/pkg/contexts/credentials/repositories/aliases/type.go index 31eb7ce6db..7b8a90b98f 100644 --- a/pkg/contexts/credentials/repositories/aliases/type.go +++ b/pkg/contexts/credentials/repositories/aliases/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package aliases import ( diff --git a/pkg/contexts/credentials/repositories/directcreds/a_usage.go b/pkg/contexts/credentials/repositories/directcreds/a_usage.go index 705144e3bf..b808e7d9f1 100644 --- a/pkg/contexts/credentials/repositories/directcreds/a_usage.go +++ b/pkg/contexts/credentials/repositories/directcreds/a_usage.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package directcreds import ( diff --git a/pkg/contexts/credentials/repositories/directcreds/credentials.go b/pkg/contexts/credentials/repositories/directcreds/credentials.go index 1ce6655609..48c29b5285 100644 --- a/pkg/contexts/credentials/repositories/directcreds/credentials.go +++ b/pkg/contexts/credentials/repositories/directcreds/credentials.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package directcreds import ( diff --git a/pkg/contexts/credentials/repositories/directcreds/repo_test.go b/pkg/contexts/credentials/repositories/directcreds/repo_test.go index aa5c93d3f0..3694363e89 100644 --- a/pkg/contexts/credentials/repositories/directcreds/repo_test.go +++ b/pkg/contexts/credentials/repositories/directcreds/repo_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package directcreds_test import ( diff --git a/pkg/contexts/credentials/repositories/directcreds/repository.go b/pkg/contexts/credentials/repositories/directcreds/repository.go index 7e860c2a18..ec499a26be 100644 --- a/pkg/contexts/credentials/repositories/directcreds/repository.go +++ b/pkg/contexts/credentials/repositories/directcreds/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package directcreds import ( diff --git a/pkg/contexts/credentials/repositories/directcreds/suite_test.go b/pkg/contexts/credentials/repositories/directcreds/suite_test.go index e133f8421f..152f2c16a9 100644 --- a/pkg/contexts/credentials/repositories/directcreds/suite_test.go +++ b/pkg/contexts/credentials/repositories/directcreds/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package directcreds_test import ( diff --git a/pkg/contexts/credentials/repositories/directcreds/type.go b/pkg/contexts/credentials/repositories/directcreds/type.go index 7fde18b079..bb81cec7b6 100644 --- a/pkg/contexts/credentials/repositories/directcreds/type.go +++ b/pkg/contexts/credentials/repositories/directcreds/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package directcreds import ( diff --git a/pkg/contexts/credentials/repositories/dockerconfig/a_usage.go b/pkg/contexts/credentials/repositories/dockerconfig/a_usage.go index b6f15f95ba..1df556666d 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/a_usage.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/a_usage.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockerconfig import ( diff --git a/pkg/contexts/credentials/repositories/dockerconfig/cache.go b/pkg/contexts/credentials/repositories/dockerconfig/cache.go index a4415258f7..8b82902422 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/cache.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/cache.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockerconfig import ( diff --git a/pkg/contexts/credentials/repositories/dockerconfig/credentials.go b/pkg/contexts/credentials/repositories/dockerconfig/credentials.go index 490078b0be..6cd9ac1487 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/credentials.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/credentials.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockerconfig import ( diff --git a/pkg/contexts/credentials/repositories/dockerconfig/default.go b/pkg/contexts/credentials/repositories/dockerconfig/default.go index 520fcc6c88..4cad158ae8 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/default.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/default.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockerconfig import ( diff --git a/pkg/contexts/credentials/repositories/dockerconfig/logging.go b/pkg/contexts/credentials/repositories/dockerconfig/logging.go index 4f24fc88e7..1902d87bcd 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/logging.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockerconfig import ( diff --git a/pkg/contexts/credentials/repositories/dockerconfig/provider.go b/pkg/contexts/credentials/repositories/dockerconfig/provider.go index b2411aff1f..88335fc3e9 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/provider.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/provider.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockerconfig import ( diff --git a/pkg/contexts/credentials/repositories/dockerconfig/repo_test.go b/pkg/contexts/credentials/repositories/dockerconfig/repo_test.go index 7a42e69f0d..2170d75eb1 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/repo_test.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/repo_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockerconfig_test import ( @@ -13,7 +9,6 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/contexts/datacontext" . "github.com/open-component-model/ocm/pkg/testutils" "github.com/open-component-model/ocm/pkg/common" @@ -21,6 +16,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/oci/identity" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" local "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/dockerconfig" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/finalizer" ) diff --git a/pkg/contexts/credentials/repositories/dockerconfig/repository.go b/pkg/contexts/credentials/repositories/dockerconfig/repository.go index 79d2aea161..4563ab9767 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/repository.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockerconfig import ( diff --git a/pkg/contexts/credentials/repositories/dockerconfig/suite_test.go b/pkg/contexts/credentials/repositories/dockerconfig/suite_test.go index 48eb8f5799..b7ca5eda8c 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/suite_test.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockerconfig_test import ( diff --git a/pkg/contexts/credentials/repositories/dockerconfig/type.go b/pkg/contexts/credentials/repositories/dockerconfig/type.go index 0d01494890..b41dda1cc6 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/type.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockerconfig import ( diff --git a/pkg/contexts/credentials/repositories/gardenerconfig/cache.go b/pkg/contexts/credentials/repositories/gardenerconfig/cache.go index d5c29fa028..43f62e0d20 100644 --- a/pkg/contexts/credentials/repositories/gardenerconfig/cache.go +++ b/pkg/contexts/credentials/repositories/gardenerconfig/cache.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package gardenerconfig import ( diff --git a/pkg/contexts/credentials/repositories/gardenerconfig/cpi/interface.go b/pkg/contexts/credentials/repositories/gardenerconfig/cpi/interface.go index 81d3a5bdbc..1ee6b7ed42 100644 --- a/pkg/contexts/credentials/repositories/gardenerconfig/cpi/interface.go +++ b/pkg/contexts/credentials/repositories/gardenerconfig/cpi/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/credentials/repositories/gardenerconfig/credentials.go b/pkg/contexts/credentials/repositories/gardenerconfig/credentials.go index 97a10307c6..c633b91207 100644 --- a/pkg/contexts/credentials/repositories/gardenerconfig/credentials.go +++ b/pkg/contexts/credentials/repositories/gardenerconfig/credentials.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package gardenerconfig import ( diff --git a/pkg/contexts/credentials/repositories/gardenerconfig/handler/container_registry/credentials.go b/pkg/contexts/credentials/repositories/gardenerconfig/handler/container_registry/credentials.go index 0ccf110249..7ff6695916 100644 --- a/pkg/contexts/credentials/repositories/gardenerconfig/handler/container_registry/credentials.go +++ b/pkg/contexts/credentials/repositories/gardenerconfig/handler/container_registry/credentials.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package container_registry import ( diff --git a/pkg/contexts/credentials/repositories/gardenerconfig/handler/container_registry/handler.go b/pkg/contexts/credentials/repositories/gardenerconfig/handler/container_registry/handler.go index 247e04a212..a065838045 100644 --- a/pkg/contexts/credentials/repositories/gardenerconfig/handler/container_registry/handler.go +++ b/pkg/contexts/credentials/repositories/gardenerconfig/handler/container_registry/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package container_registry import ( diff --git a/pkg/contexts/credentials/repositories/gardenerconfig/identity/identity.go b/pkg/contexts/credentials/repositories/gardenerconfig/identity/identity.go index d6f1a40b43..39ff6d1729 100644 --- a/pkg/contexts/credentials/repositories/gardenerconfig/identity/identity.go +++ b/pkg/contexts/credentials/repositories/gardenerconfig/identity/identity.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity import ( diff --git a/pkg/contexts/credentials/repositories/gardenerconfig/init.go b/pkg/contexts/credentials/repositories/gardenerconfig/init.go index eb4eca1ac4..9b69c3a3a7 100644 --- a/pkg/contexts/credentials/repositories/gardenerconfig/init.go +++ b/pkg/contexts/credentials/repositories/gardenerconfig/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package gardenerconfig import ( diff --git a/pkg/contexts/credentials/repositories/gardenerconfig/repo_test.go b/pkg/contexts/credentials/repositories/gardenerconfig/repo_test.go index dc3b9d8db8..5c51f5ed28 100644 --- a/pkg/contexts/credentials/repositories/gardenerconfig/repo_test.go +++ b/pkg/contexts/credentials/repositories/gardenerconfig/repo_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package gardenerconfig_test import ( diff --git a/pkg/contexts/credentials/repositories/gardenerconfig/repository.go b/pkg/contexts/credentials/repositories/gardenerconfig/repository.go index e9790b3b63..7afc29320f 100644 --- a/pkg/contexts/credentials/repositories/gardenerconfig/repository.go +++ b/pkg/contexts/credentials/repositories/gardenerconfig/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package gardenerconfig import ( diff --git a/pkg/contexts/credentials/repositories/gardenerconfig/suite_test.go b/pkg/contexts/credentials/repositories/gardenerconfig/suite_test.go index 895b209cf8..be4394f779 100644 --- a/pkg/contexts/credentials/repositories/gardenerconfig/suite_test.go +++ b/pkg/contexts/credentials/repositories/gardenerconfig/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package gardenerconfig_test import ( diff --git a/pkg/contexts/credentials/repositories/gardenerconfig/type.go b/pkg/contexts/credentials/repositories/gardenerconfig/type.go index b7421da486..2c16057532 100644 --- a/pkg/contexts/credentials/repositories/gardenerconfig/type.go +++ b/pkg/contexts/credentials/repositories/gardenerconfig/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package gardenerconfig import ( diff --git a/pkg/contexts/credentials/repositories/memory/cache.go b/pkg/contexts/credentials/repositories/memory/cache.go index 39454d4840..aec6fd2b0b 100644 --- a/pkg/contexts/credentials/repositories/memory/cache.go +++ b/pkg/contexts/credentials/repositories/memory/cache.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package memory import ( diff --git a/pkg/contexts/credentials/repositories/memory/config/config_test.go b/pkg/contexts/credentials/repositories/memory/config/config_test.go index d0c9e570be..ff1b2b48be 100644 --- a/pkg/contexts/credentials/repositories/memory/config/config_test.go +++ b/pkg/contexts/credentials/repositories/memory/config/config_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/credentials/repositories/memory/config/suite_test.go b/pkg/contexts/credentials/repositories/memory/config/suite_test.go index 3774619113..aa11f5a377 100644 --- a/pkg/contexts/credentials/repositories/memory/config/suite_test.go +++ b/pkg/contexts/credentials/repositories/memory/config/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/credentials/repositories/memory/config/type.go b/pkg/contexts/credentials/repositories/memory/config/type.go index a0037f7e01..30dadff232 100644 --- a/pkg/contexts/credentials/repositories/memory/config/type.go +++ b/pkg/contexts/credentials/repositories/memory/config/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/credentials/repositories/memory/repo_test.go b/pkg/contexts/credentials/repositories/memory/repo_test.go index 48fa2bd889..58af3b1828 100644 --- a/pkg/contexts/credentials/repositories/memory/repo_test.go +++ b/pkg/contexts/credentials/repositories/memory/repo_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package memory_test import ( diff --git a/pkg/contexts/credentials/repositories/memory/repository.go b/pkg/contexts/credentials/repositories/memory/repository.go index 7eb5abf6c7..5149f79920 100644 --- a/pkg/contexts/credentials/repositories/memory/repository.go +++ b/pkg/contexts/credentials/repositories/memory/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package memory import ( diff --git a/pkg/contexts/credentials/repositories/memory/suite_test.go b/pkg/contexts/credentials/repositories/memory/suite_test.go index 23688dfde3..dc9b714fb1 100644 --- a/pkg/contexts/credentials/repositories/memory/suite_test.go +++ b/pkg/contexts/credentials/repositories/memory/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package memory_test import ( diff --git a/pkg/contexts/credentials/repositories/memory/type.go b/pkg/contexts/credentials/repositories/memory/type.go index 2439ef0213..fd2812d760 100644 --- a/pkg/contexts/credentials/repositories/memory/type.go +++ b/pkg/contexts/credentials/repositories/memory/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package memory import ( diff --git a/pkg/contexts/credentials/repositories/vault/a_usage.go b/pkg/contexts/credentials/repositories/vault/a_usage.go index b772496657..2407385a5c 100644 --- a/pkg/contexts/credentials/repositories/vault/a_usage.go +++ b/pkg/contexts/credentials/repositories/vault/a_usage.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package vault import ( diff --git a/pkg/contexts/credentials/repositories/vault/auth.go b/pkg/contexts/credentials/repositories/vault/auth.go index c646e4c2f5..a8d3386d8f 100644 --- a/pkg/contexts/credentials/repositories/vault/auth.go +++ b/pkg/contexts/credentials/repositories/vault/auth.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package vault import ( diff --git a/pkg/contexts/credentials/repositories/vault/cache.go b/pkg/contexts/credentials/repositories/vault/cache.go index 1b2d700bb5..873e1eb967 100644 --- a/pkg/contexts/credentials/repositories/vault/cache.go +++ b/pkg/contexts/credentials/repositories/vault/cache.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package vault import ( diff --git a/pkg/contexts/credentials/repositories/vault/identity/identity.go b/pkg/contexts/credentials/repositories/vault/identity/identity.go index 79ba43d7eb..6c0ac54b9e 100644 --- a/pkg/contexts/credentials/repositories/vault/identity/identity.go +++ b/pkg/contexts/credentials/repositories/vault/identity/identity.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity import ( diff --git a/pkg/contexts/credentials/repositories/vault/logging.go b/pkg/contexts/credentials/repositories/vault/logging.go index d75d785db6..e5ccfdaeb4 100644 --- a/pkg/contexts/credentials/repositories/vault/logging.go +++ b/pkg/contexts/credentials/repositories/vault/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package vault import ( diff --git a/pkg/contexts/credentials/repositories/vault/options.go b/pkg/contexts/credentials/repositories/vault/options.go index 71031496f1..aeba1f6b3b 100644 --- a/pkg/contexts/credentials/repositories/vault/options.go +++ b/pkg/contexts/credentials/repositories/vault/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package vault import ( diff --git a/pkg/contexts/credentials/repositories/vault/provider.go b/pkg/contexts/credentials/repositories/vault/provider.go index 1d8c9fb4ec..418d3641a4 100644 --- a/pkg/contexts/credentials/repositories/vault/provider.go +++ b/pkg/contexts/credentials/repositories/vault/provider.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package vault import ( diff --git a/pkg/contexts/credentials/repositories/vault/repository.go b/pkg/contexts/credentials/repositories/vault/repository.go index c09ed75bde..0b11262412 100644 --- a/pkg/contexts/credentials/repositories/vault/repository.go +++ b/pkg/contexts/credentials/repositories/vault/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package vault import ( diff --git a/pkg/contexts/credentials/repositories/vault/suite_test.go b/pkg/contexts/credentials/repositories/vault/suite_test.go index 9a64144cc1..74a7d198e9 100644 --- a/pkg/contexts/credentials/repositories/vault/suite_test.go +++ b/pkg/contexts/credentials/repositories/vault/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package vault_test import ( diff --git a/pkg/contexts/credentials/repositories/vault/type.go b/pkg/contexts/credentials/repositories/vault/type.go index f09836af3c..9352544297 100644 --- a/pkg/contexts/credentials/repositories/vault/type.go +++ b/pkg/contexts/credentials/repositories/vault/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package vault import ( diff --git a/pkg/contexts/credentials/suite_test.go b/pkg/contexts/credentials/suite_test.go index 5df0723ffe..5624242f4f 100644 --- a/pkg/contexts/credentials/suite_test.go +++ b/pkg/contexts/credentials/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package credentials_test import ( diff --git a/pkg/contexts/credentials/usage.go b/pkg/contexts/credentials/usage.go index feb9081bef..c2304b939c 100644 --- a/pkg/contexts/credentials/usage.go +++ b/pkg/contexts/credentials/usage.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package credentials func RepositoryUsage(scheme RepositoryTypeScheme) string { diff --git a/pkg/contexts/credentials/utils.go b/pkg/contexts/credentials/utils.go index d7bcde9b9d..117f78508a 100644 --- a/pkg/contexts/credentials/utils.go +++ b/pkg/contexts/credentials/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package credentials import ( diff --git a/pkg/contexts/datacontext/action/api/action_test.go b/pkg/contexts/datacontext/action/api/action_test.go index 9d42354757..d2f0a301ab 100644 --- a/pkg/contexts/datacontext/action/api/action_test.go +++ b/pkg/contexts/datacontext/action/api/action_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package api_test import ( diff --git a/pkg/contexts/datacontext/action/api/interface.go b/pkg/contexts/datacontext/action/api/interface.go index 2e3c4b2ffd..eb3a7928fa 100644 --- a/pkg/contexts/datacontext/action/api/interface.go +++ b/pkg/contexts/datacontext/action/api/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package api import ( diff --git a/pkg/contexts/datacontext/action/api/options.go b/pkg/contexts/datacontext/action/api/options.go index ea8b9a3ee7..7e8dce4065 100644 --- a/pkg/contexts/datacontext/action/api/options.go +++ b/pkg/contexts/datacontext/action/api/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package api func NewOptions(olist ...Option) *Options { diff --git a/pkg/contexts/datacontext/action/api/registry.go b/pkg/contexts/datacontext/action/api/registry.go index e55e7c7ce2..ba2ad44261 100644 --- a/pkg/contexts/datacontext/action/api/registry.go +++ b/pkg/contexts/datacontext/action/api/registry.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package api import ( diff --git a/pkg/contexts/datacontext/action/api/registry_test.go b/pkg/contexts/datacontext/action/api/registry_test.go index 30cddf2620..a4ba5366f2 100644 --- a/pkg/contexts/datacontext/action/api/registry_test.go +++ b/pkg/contexts/datacontext/action/api/registry_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package api_test import ( diff --git a/pkg/contexts/datacontext/action/api/suite_test.go b/pkg/contexts/datacontext/action/api/suite_test.go index 9aae47e16f..5ed06214cd 100644 --- a/pkg/contexts/datacontext/action/api/suite_test.go +++ b/pkg/contexts/datacontext/action/api/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package api_test import ( diff --git a/pkg/contexts/datacontext/action/api/utils.go b/pkg/contexts/datacontext/action/api/utils.go index 22a6009e1f..1652b95684 100644 --- a/pkg/contexts/datacontext/action/api/utils.go +++ b/pkg/contexts/datacontext/action/api/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package api import ( diff --git a/pkg/contexts/datacontext/action/handlers/options.go b/pkg/contexts/datacontext/action/handlers/options.go index 60f38532a3..3bcb9e82ee 100644 --- a/pkg/contexts/datacontext/action/handlers/options.go +++ b/pkg/contexts/datacontext/action/handlers/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package handlers import ( diff --git a/pkg/contexts/datacontext/action/handlers/registry.go b/pkg/contexts/datacontext/action/handlers/registry.go index 208917b4b3..96301a9e0b 100644 --- a/pkg/contexts/datacontext/action/handlers/registry.go +++ b/pkg/contexts/datacontext/action/handlers/registry.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package handlers import ( diff --git a/pkg/contexts/datacontext/action/type.go b/pkg/contexts/datacontext/action/type.go index f4aa80999c..efdcad6d3f 100644 --- a/pkg/contexts/datacontext/action/type.go +++ b/pkg/contexts/datacontext/action/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package action import ( diff --git a/pkg/contexts/datacontext/attrs.go b/pkg/contexts/datacontext/attrs.go index 6d7753c2fe..79524286ba 100644 --- a/pkg/contexts/datacontext/attrs.go +++ b/pkg/contexts/datacontext/attrs.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package datacontext import ( diff --git a/pkg/contexts/datacontext/attrs/init.go b/pkg/contexts/datacontext/attrs/init.go index 17be4463b1..471f9f03f3 100644 --- a/pkg/contexts/datacontext/attrs/init.go +++ b/pkg/contexts/datacontext/attrs/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package attrs import ( diff --git a/pkg/contexts/datacontext/attrs/logforward/attr.go b/pkg/contexts/datacontext/attrs/logforward/attr.go index 7318a98840..998043e527 100644 --- a/pkg/contexts/datacontext/attrs/logforward/attr.go +++ b/pkg/contexts/datacontext/attrs/logforward/attr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package logforward import ( diff --git a/pkg/contexts/datacontext/attrs/rootcertsattr/attr.go b/pkg/contexts/datacontext/attrs/rootcertsattr/attr.go index adecfedb48..865ee28ce3 100644 --- a/pkg/contexts/datacontext/attrs/rootcertsattr/attr.go +++ b/pkg/contexts/datacontext/attrs/rootcertsattr/attr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rootcertsattr import ( diff --git a/pkg/contexts/datacontext/attrs/rootcertsattr/attr_test.go b/pkg/contexts/datacontext/attrs/rootcertsattr/attr_test.go index 0b1cba702e..96a91a6250 100644 --- a/pkg/contexts/datacontext/attrs/rootcertsattr/attr_test.go +++ b/pkg/contexts/datacontext/attrs/rootcertsattr/attr_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rootcertsattr_test import ( diff --git a/pkg/contexts/datacontext/attrs/rootcertsattr/config.go b/pkg/contexts/datacontext/attrs/rootcertsattr/config.go index d562553964..8798128fa6 100644 --- a/pkg/contexts/datacontext/attrs/rootcertsattr/config.go +++ b/pkg/contexts/datacontext/attrs/rootcertsattr/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rootcertsattr import ( diff --git a/pkg/contexts/datacontext/attrs/rootcertsattr/suite_test.go b/pkg/contexts/datacontext/attrs/rootcertsattr/suite_test.go index 1f05b2f5f8..6427d82f5f 100644 --- a/pkg/contexts/datacontext/attrs/rootcertsattr/suite_test.go +++ b/pkg/contexts/datacontext/attrs/rootcertsattr/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rootcertsattr_test import ( diff --git a/pkg/contexts/datacontext/attrs/vfsattr/attr.go b/pkg/contexts/datacontext/attrs/vfsattr/attr.go index d1ea70072c..cc62eb61b2 100644 --- a/pkg/contexts/datacontext/attrs/vfsattr/attr.go +++ b/pkg/contexts/datacontext/attrs/vfsattr/attr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package vfsattr import ( diff --git a/pkg/contexts/datacontext/builder.go b/pkg/contexts/datacontext/builder.go index 03ccb4a7e6..bb6a7ae194 100644 --- a/pkg/contexts/datacontext/builder.go +++ b/pkg/contexts/datacontext/builder.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package datacontext import ( diff --git a/pkg/contexts/datacontext/config/attrs/config_test.go b/pkg/contexts/datacontext/config/attrs/config_test.go index 7a91f7e0fd..c410fd705b 100644 --- a/pkg/contexts/datacontext/config/attrs/config_test.go +++ b/pkg/contexts/datacontext/config/attrs/config_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package attrs_test import ( diff --git a/pkg/contexts/datacontext/config/attrs/suite_test.go b/pkg/contexts/datacontext/config/attrs/suite_test.go index 67d7004341..1ec54ac2ba 100644 --- a/pkg/contexts/datacontext/config/attrs/suite_test.go +++ b/pkg/contexts/datacontext/config/attrs/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package attrs_test import ( diff --git a/pkg/contexts/datacontext/config/attrs/type.go b/pkg/contexts/datacontext/config/attrs/type.go index e431d5bc3b..7481a1126a 100644 --- a/pkg/contexts/datacontext/config/attrs/type.go +++ b/pkg/contexts/datacontext/config/attrs/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package attrs import ( diff --git a/pkg/contexts/datacontext/config/init.go b/pkg/contexts/datacontext/config/init.go index da9b1095f0..3235db34f8 100644 --- a/pkg/contexts/datacontext/config/init.go +++ b/pkg/contexts/datacontext/config/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/datacontext/config/logging/config_test.go b/pkg/contexts/datacontext/config/logging/config_test.go index 7dd9a6b2d9..9ec56b733a 100644 --- a/pkg/contexts/datacontext/config/logging/config_test.go +++ b/pkg/contexts/datacontext/config/logging/config_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package logging_test import ( diff --git a/pkg/contexts/datacontext/config/logging/suite_test.go b/pkg/contexts/datacontext/config/logging/suite_test.go index 9beb467919..aff79142dd 100644 --- a/pkg/contexts/datacontext/config/logging/suite_test.go +++ b/pkg/contexts/datacontext/config/logging/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package logging_test import ( diff --git a/pkg/contexts/datacontext/config/logging/type.go b/pkg/contexts/datacontext/config/logging/type.go index f0aa9f1d70..2b1ef96c8e 100644 --- a/pkg/contexts/datacontext/config/logging/type.go +++ b/pkg/contexts/datacontext/config/logging/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package logging import ( diff --git a/pkg/contexts/datacontext/context.go b/pkg/contexts/datacontext/context.go index 2af9fb34d9..b90b8e1b83 100644 --- a/pkg/contexts/datacontext/context.go +++ b/pkg/contexts/datacontext/context.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package datacontext import ( diff --git a/pkg/contexts/datacontext/context_test.go b/pkg/contexts/datacontext/context_test.go index ecb1593e1d..11e97cf1b0 100644 --- a/pkg/contexts/datacontext/context_test.go +++ b/pkg/contexts/datacontext/context_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package datacontext_test import ( diff --git a/pkg/contexts/datacontext/cpi.go b/pkg/contexts/datacontext/cpi.go index 4d372330ad..be80c6f010 100644 --- a/pkg/contexts/datacontext/cpi.go +++ b/pkg/contexts/datacontext/cpi.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package datacontext import ( diff --git a/pkg/contexts/datacontext/gc_test.go b/pkg/contexts/datacontext/gc_test.go index a3c833961f..952f48e64b 100644 --- a/pkg/contexts/datacontext/gc_test.go +++ b/pkg/contexts/datacontext/gc_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package datacontext_test import ( @@ -10,10 +6,10 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/generics" me "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/finalizer" + "github.com/open-component-model/ocm/pkg/generics" ) var _ = Describe("area test", func() { diff --git a/pkg/contexts/datacontext/logging.go b/pkg/contexts/datacontext/logging.go index ececf32720..4fa21e3ffd 100644 --- a/pkg/contexts/datacontext/logging.go +++ b/pkg/contexts/datacontext/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package datacontext import ( diff --git a/pkg/contexts/datacontext/session.go b/pkg/contexts/datacontext/session.go index b05f8d44d0..4b1a64cc0f 100644 --- a/pkg/contexts/datacontext/session.go +++ b/pkg/contexts/datacontext/session.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package datacontext import ( diff --git a/pkg/contexts/datacontext/setup.go b/pkg/contexts/datacontext/setup.go index 19ba83e7d6..63bad8ddd8 100644 --- a/pkg/contexts/datacontext/setup.go +++ b/pkg/contexts/datacontext/setup.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package datacontext import ( diff --git a/pkg/contexts/datacontext/suite_test.go b/pkg/contexts/datacontext/suite_test.go index 5021e53783..01561a85fc 100644 --- a/pkg/contexts/datacontext/suite_test.go +++ b/pkg/contexts/datacontext/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package datacontext_test import ( diff --git a/pkg/contexts/datacontext/util.go b/pkg/contexts/datacontext/util.go index 749f6f00af..1b22089499 100644 --- a/pkg/contexts/datacontext/util.go +++ b/pkg/contexts/datacontext/util.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package datacontext import ( diff --git a/pkg/contexts/oci/action_test.go b/pkg/contexts/oci/action_test.go index 4d5f9f518b..4b1c6af4cf 100644 --- a/pkg/contexts/oci/action_test.go +++ b/pkg/contexts/oci/action_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package oci_test import ( diff --git a/pkg/contexts/oci/actions/init.go b/pkg/contexts/oci/actions/init.go index e2a7fbdda2..95a51189f7 100644 --- a/pkg/contexts/oci/actions/init.go +++ b/pkg/contexts/oci/actions/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package actions import ( diff --git a/pkg/contexts/oci/actions/oci-repository-prepare/exec.go b/pkg/contexts/oci/actions/oci-repository-prepare/exec.go index 6fae1d6e24..175fcce154 100644 --- a/pkg/contexts/oci/actions/oci-repository-prepare/exec.go +++ b/pkg/contexts/oci/actions/oci-repository-prepare/exec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package oci_repository_prepare import ( diff --git a/pkg/contexts/oci/actions/oci-repository-prepare/type.go b/pkg/contexts/oci/actions/oci-repository-prepare/type.go index f8a23648e3..6637b9cbc2 100644 --- a/pkg/contexts/oci/actions/oci-repository-prepare/type.go +++ b/pkg/contexts/oci/actions/oci-repository-prepare/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package oci_repository_prepare import ( diff --git a/pkg/contexts/oci/annotations/annotations.go b/pkg/contexts/oci/annotations/annotations.go index a8cbbf2812..ed2fc1d6fe 100644 --- a/pkg/contexts/oci/annotations/annotations.go +++ b/pkg/contexts/oci/annotations/annotations.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package annotations import ( diff --git a/pkg/contexts/oci/art_test.go b/pkg/contexts/oci/art_test.go index 8659350abf..c0bf38dfae 100644 --- a/pkg/contexts/oci/art_test.go +++ b/pkg/contexts/oci/art_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package oci_test import ( diff --git a/pkg/contexts/oci/artdesc/artifact.go b/pkg/contexts/oci/artdesc/artifact.go index dda23c3325..07d083500e 100644 --- a/pkg/contexts/oci/artdesc/artifact.go +++ b/pkg/contexts/oci/artdesc/artifact.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artdesc import ( diff --git a/pkg/contexts/oci/artdesc/config.go b/pkg/contexts/oci/artdesc/config.go index 16e78cdc78..03cdd68422 100644 --- a/pkg/contexts/oci/artdesc/config.go +++ b/pkg/contexts/oci/artdesc/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artdesc import ( diff --git a/pkg/contexts/oci/artdesc/helper/generic.go b/pkg/contexts/oci/artdesc/helper/generic.go index 8ea06c21ea..d8ebf35d5e 100644 --- a/pkg/contexts/oci/artdesc/helper/generic.go +++ b/pkg/contexts/oci/artdesc/helper/generic.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helper import ( diff --git a/pkg/contexts/oci/artdesc/index.go b/pkg/contexts/oci/artdesc/index.go index ccc84d3991..ee0e2bc892 100644 --- a/pkg/contexts/oci/artdesc/index.go +++ b/pkg/contexts/oci/artdesc/index.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artdesc import ( diff --git a/pkg/contexts/oci/artdesc/manifest.go b/pkg/contexts/oci/artdesc/manifest.go index cdd91a9c36..46c8fe0248 100644 --- a/pkg/contexts/oci/artdesc/manifest.go +++ b/pkg/contexts/oci/artdesc/manifest.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artdesc import ( diff --git a/pkg/contexts/oci/artdesc/suite_test.go b/pkg/contexts/oci/artdesc/suite_test.go index ea81f9480f..a7082c03d8 100644 --- a/pkg/contexts/oci/artdesc/suite_test.go +++ b/pkg/contexts/oci/artdesc/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artdesc_test import ( diff --git a/pkg/contexts/oci/artdesc/utils.go b/pkg/contexts/oci/artdesc/utils.go index c0f28be42d..cfaa25c7a6 100644 --- a/pkg/contexts/oci/artdesc/utils.go +++ b/pkg/contexts/oci/artdesc/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artdesc import ( diff --git a/pkg/contexts/oci/artdesc/utils_test.go b/pkg/contexts/oci/artdesc/utils_test.go index 88aa0fce47..55a88525ea 100644 --- a/pkg/contexts/oci/artdesc/utils_test.go +++ b/pkg/contexts/oci/artdesc/utils_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artdesc_test import ( diff --git a/pkg/contexts/oci/attrs/cacheattr/attr.go b/pkg/contexts/oci/attrs/cacheattr/attr.go index 9a6fcb2391..b6014602b5 100644 --- a/pkg/contexts/oci/attrs/cacheattr/attr.go +++ b/pkg/contexts/oci/attrs/cacheattr/attr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cacheattr import ( diff --git a/pkg/contexts/oci/attrs/cacheattr/attr_test.go b/pkg/contexts/oci/attrs/cacheattr/attr_test.go index 1caccbf873..0dac071dbb 100644 --- a/pkg/contexts/oci/attrs/cacheattr/attr_test.go +++ b/pkg/contexts/oci/attrs/cacheattr/attr_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cacheattr_test import ( diff --git a/pkg/contexts/oci/attrs/cacheattr/suite_test.go b/pkg/contexts/oci/attrs/cacheattr/suite_test.go index 0acac85902..b1b77a7e4d 100644 --- a/pkg/contexts/oci/attrs/cacheattr/suite_test.go +++ b/pkg/contexts/oci/attrs/cacheattr/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cacheattr_test import ( diff --git a/pkg/contexts/oci/attrs/init.go b/pkg/contexts/oci/attrs/init.go index a6f281962b..42dc1a55a9 100644 --- a/pkg/contexts/oci/attrs/init.go +++ b/pkg/contexts/oci/attrs/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package attrs import ( diff --git a/pkg/contexts/oci/builder.go b/pkg/contexts/oci/builder.go index 424e34c2cd..a6c8f85d56 100644 --- a/pkg/contexts/oci/builder.go +++ b/pkg/contexts/oci/builder.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package oci import ( diff --git a/pkg/contexts/oci/config/config_test.go b/pkg/contexts/oci/config/config_test.go index 6df034a3bc..1a1fa5b3d1 100644 --- a/pkg/contexts/oci/config/config_test.go +++ b/pkg/contexts/oci/config/config_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/oci/config/suite_test.go b/pkg/contexts/oci/config/suite_test.go index 444820e824..75de586aa0 100644 --- a/pkg/contexts/oci/config/suite_test.go +++ b/pkg/contexts/oci/config/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/oci/config/type.go b/pkg/contexts/oci/config/type.go index ff40499c41..ad7fafbb1e 100644 --- a/pkg/contexts/oci/config/type.go +++ b/pkg/contexts/oci/config/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/oci/cpi/interface.go b/pkg/contexts/oci/cpi/interface.go index cd408e983c..f57e92c66f 100644 --- a/pkg/contexts/oci/cpi/interface.go +++ b/pkg/contexts/oci/cpi/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi // This is the Context Provider Interface for credential providers diff --git a/pkg/contexts/oci/cpi/mod.go b/pkg/contexts/oci/cpi/mod.go index b59e11bcfd..7e42781562 100644 --- a/pkg/contexts/oci/cpi/mod.go +++ b/pkg/contexts/oci/cpi/mod.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/oci/cpi/repotypes.go b/pkg/contexts/oci/cpi/repotypes.go index ba33f6bc81..7633e3eb9b 100644 --- a/pkg/contexts/oci/cpi/repotypes.go +++ b/pkg/contexts/oci/cpi/repotypes.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi // this file is identical for contexts oci and credentials and similar for diff --git a/pkg/contexts/oci/cpi/state.go b/pkg/contexts/oci/cpi/state.go index f82522f9a0..1abc4808ad 100644 --- a/pkg/contexts/oci/cpi/state.go +++ b/pkg/contexts/oci/cpi/state.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/oci/cpi/suite_test.go b/pkg/contexts/oci/cpi/suite_test.go index 7479e4ada5..5675655fb9 100644 --- a/pkg/contexts/oci/cpi/suite_test.go +++ b/pkg/contexts/oci/cpi/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi_test import ( diff --git a/pkg/contexts/oci/cpi/support/artifact.go b/pkg/contexts/oci/cpi/support/artifact.go index c339d45b5c..a488dfc086 100644 --- a/pkg/contexts/oci/cpi/support/artifact.go +++ b/pkg/contexts/oci/cpi/support/artifact.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package support import ( diff --git a/pkg/contexts/oci/cpi/support/artifactsetblobaccess.go b/pkg/contexts/oci/cpi/support/artifactsetblobaccess.go index 461b8321ec..55a3132b70 100644 --- a/pkg/contexts/oci/cpi/support/artifactsetblobaccess.go +++ b/pkg/contexts/oci/cpi/support/artifactsetblobaccess.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package support import ( diff --git a/pkg/contexts/oci/cpi/support/base.go b/pkg/contexts/oci/cpi/support/base.go index 3ce937c632..da2f0c7517 100644 --- a/pkg/contexts/oci/cpi/support/base.go +++ b/pkg/contexts/oci/cpi/support/base.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package support import ( diff --git a/pkg/contexts/oci/cpi/support/flavor_index.go b/pkg/contexts/oci/cpi/support/flavor_index.go index 4225e8f325..c392672e88 100644 --- a/pkg/contexts/oci/cpi/support/flavor_index.go +++ b/pkg/contexts/oci/cpi/support/flavor_index.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package support import ( diff --git a/pkg/contexts/oci/cpi/support/flavor_manifest.go b/pkg/contexts/oci/cpi/support/flavor_manifest.go index 14d8a7c6da..b31ac21123 100644 --- a/pkg/contexts/oci/cpi/support/flavor_manifest.go +++ b/pkg/contexts/oci/cpi/support/flavor_manifest.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package support import ( diff --git a/pkg/contexts/oci/cpi/support/namespace.go b/pkg/contexts/oci/cpi/support/namespace.go index 2a5a9f6017..f257939a87 100644 --- a/pkg/contexts/oci/cpi/support/namespace.go +++ b/pkg/contexts/oci/cpi/support/namespace.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package support import ( diff --git a/pkg/contexts/oci/cpi/utils.go b/pkg/contexts/oci/cpi/utils.go index 92172b973f..5eec403f97 100644 --- a/pkg/contexts/oci/cpi/utils.go +++ b/pkg/contexts/oci/cpi/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/oci/cpi/utils_test.go b/pkg/contexts/oci/cpi/utils_test.go index 873b71bb92..e325c5ebcb 100644 --- a/pkg/contexts/oci/cpi/utils_test.go +++ b/pkg/contexts/oci/cpi/utils_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi_test import ( diff --git a/pkg/contexts/oci/cpi/view.go b/pkg/contexts/oci/cpi/view.go index e6c7bcea23..3984648d62 100644 --- a/pkg/contexts/oci/cpi/view.go +++ b/pkg/contexts/oci/cpi/view.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/oci/gc_test.go b/pkg/contexts/oci/gc_test.go index 89fc870c9e..7eb527a0da 100644 --- a/pkg/contexts/oci/gc_test.go +++ b/pkg/contexts/oci/gc_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package oci_test import ( diff --git a/pkg/contexts/oci/grammar/grammar.go b/pkg/contexts/oci/grammar/grammar.go index 09990802b6..97e04b1d62 100644 --- a/pkg/contexts/oci/grammar/grammar.go +++ b/pkg/contexts/oci/grammar/grammar.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package grammar import ( diff --git a/pkg/contexts/oci/grammar/grammar_test.go b/pkg/contexts/oci/grammar/grammar_test.go index 37ed645f21..a6f6e9e25c 100644 --- a/pkg/contexts/oci/grammar/grammar_test.go +++ b/pkg/contexts/oci/grammar/grammar_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package grammar import ( diff --git a/pkg/contexts/oci/identity/creds.go b/pkg/contexts/oci/identity/creds.go index 1799842ce2..6b61c41114 100644 --- a/pkg/contexts/oci/identity/creds.go +++ b/pkg/contexts/oci/identity/creds.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity import ( diff --git a/pkg/contexts/oci/init.go b/pkg/contexts/oci/init.go index 90e8ffe2f8..97dbc0b285 100644 --- a/pkg/contexts/oci/init.go +++ b/pkg/contexts/oci/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package oci import ( diff --git a/pkg/contexts/oci/interface.go b/pkg/contexts/oci/interface.go index c43072ba5a..86e2ecc859 100644 --- a/pkg/contexts/oci/interface.go +++ b/pkg/contexts/oci/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package oci import ( diff --git a/pkg/contexts/oci/internal/builder.go b/pkg/contexts/oci/internal/builder.go index 93b4f5ae5b..c930d7ed5f 100644 --- a/pkg/contexts/oci/internal/builder.go +++ b/pkg/contexts/oci/internal/builder.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/oci/internal/builder_test.go b/pkg/contexts/oci/internal/builder_test.go index 2240f5bd48..a3a4e77b55 100644 --- a/pkg/contexts/oci/internal/builder_test.go +++ b/pkg/contexts/oci/internal/builder_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal_test import ( diff --git a/pkg/contexts/oci/internal/context.go b/pkg/contexts/oci/internal/context.go index 2fd458db76..36f279b163 100644 --- a/pkg/contexts/oci/internal/context.go +++ b/pkg/contexts/oci/internal/context.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/oci/internal/errors.go b/pkg/contexts/oci/internal/errors.go index e02b785ed0..a6375c8fa1 100644 --- a/pkg/contexts/oci/internal/errors.go +++ b/pkg/contexts/oci/internal/errors.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/oci/internal/repository.go b/pkg/contexts/oci/internal/repository.go index 50a8c4f706..27bad551bd 100644 --- a/pkg/contexts/oci/internal/repository.go +++ b/pkg/contexts/oci/internal/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/oci/internal/repotypes.go b/pkg/contexts/oci/internal/repotypes.go index 01887fc8b5..8870753149 100644 --- a/pkg/contexts/oci/internal/repotypes.go +++ b/pkg/contexts/oci/internal/repotypes.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/oci/internal/suite_test.go b/pkg/contexts/oci/internal/suite_test.go index 8ac33abd40..e72a52c290 100644 --- a/pkg/contexts/oci/internal/suite_test.go +++ b/pkg/contexts/oci/internal/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal_test import ( diff --git a/pkg/contexts/oci/internal/uniform.go b/pkg/contexts/oci/internal/uniform.go index ad4a204bb5..1a57a1c5f4 100644 --- a/pkg/contexts/oci/internal/uniform.go +++ b/pkg/contexts/oci/internal/uniform.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/oci/ociutils/handler.go b/pkg/contexts/oci/ociutils/handler.go index 944b60fe1f..05eec8140d 100644 --- a/pkg/contexts/oci/ociutils/handler.go +++ b/pkg/contexts/oci/ociutils/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociutils import ( diff --git a/pkg/contexts/oci/ociutils/helm/art_test.go b/pkg/contexts/oci/ociutils/helm/art_test.go index 54c4e7d2f8..bccd7b7425 100644 --- a/pkg/contexts/oci/ociutils/helm/art_test.go +++ b/pkg/contexts/oci/ociutils/helm/art_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm_test import ( diff --git a/pkg/contexts/oci/ociutils/helm/artifact.go b/pkg/contexts/oci/ociutils/helm/artifact.go index 4a3f5586c1..3f52625f61 100644 --- a/pkg/contexts/oci/ociutils/helm/artifact.go +++ b/pkg/contexts/oci/ociutils/helm/artifact.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/pkg/contexts/oci/ociutils/helm/ignore/doc.go b/pkg/contexts/oci/ociutils/helm/ignore/doc.go index 289d7713fa..7134ea3e05 100644 --- a/pkg/contexts/oci/ociutils/helm/ignore/doc.go +++ b/pkg/contexts/oci/ociutils/helm/ignore/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - /* Package ignore provides tools for writing ignore files (a la .gitignore). diff --git a/pkg/contexts/oci/ociutils/helm/ignore/rules.go b/pkg/contexts/oci/ociutils/helm/ignore/rules.go index 20a61b181b..db5f8bab05 100644 --- a/pkg/contexts/oci/ociutils/helm/ignore/rules.go +++ b/pkg/contexts/oci/ociutils/helm/ignore/rules.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ignore import ( diff --git a/pkg/contexts/oci/ociutils/helm/ignore/rules_test.go b/pkg/contexts/oci/ociutils/helm/ignore/rules_test.go index 03483687c9..648401cc38 100644 --- a/pkg/contexts/oci/ociutils/helm/ignore/rules_test.go +++ b/pkg/contexts/oci/ociutils/helm/ignore/rules_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ignore import ( diff --git a/pkg/contexts/oci/ociutils/helm/suite_test.go b/pkg/contexts/oci/ociutils/helm/suite_test.go index 4cda015725..329867708f 100644 --- a/pkg/contexts/oci/ociutils/helm/suite_test.go +++ b/pkg/contexts/oci/ociutils/helm/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm_test import ( diff --git a/pkg/contexts/oci/ociutils/helm/sympath/walk.go b/pkg/contexts/oci/ociutils/helm/sympath/walk.go index b44d92cdad..f8c51f9fac 100644 --- a/pkg/contexts/oci/ociutils/helm/sympath/walk.go +++ b/pkg/contexts/oci/ociutils/helm/sympath/walk.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package sympath import ( diff --git a/pkg/contexts/oci/ociutils/helm/sympath/walk_test.go b/pkg/contexts/oci/ociutils/helm/sympath/walk_test.go index f5a479c1b8..c27278adcd 100644 --- a/pkg/contexts/oci/ociutils/helm/sympath/walk_test.go +++ b/pkg/contexts/oci/ociutils/helm/sympath/walk_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package sympath import ( diff --git a/pkg/contexts/oci/ociutils/info.go b/pkg/contexts/oci/ociutils/info.go index b9d0836b75..47fef72065 100644 --- a/pkg/contexts/oci/ociutils/info.go +++ b/pkg/contexts/oci/ociutils/info.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociutils import ( diff --git a/pkg/contexts/oci/ociutils/print.go b/pkg/contexts/oci/ociutils/print.go index 48ad88acb8..cea469d98e 100644 --- a/pkg/contexts/oci/ociutils/print.go +++ b/pkg/contexts/oci/ociutils/print.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociutils import ( diff --git a/pkg/contexts/oci/ref.go b/pkg/contexts/oci/ref.go index 764058884a..88482f6820 100644 --- a/pkg/contexts/oci/ref.go +++ b/pkg/contexts/oci/ref.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package oci import ( diff --git a/pkg/contexts/oci/ref_test.go b/pkg/contexts/oci/ref_test.go index b0c8d1977f..f964ceda8d 100644 --- a/pkg/contexts/oci/ref_test.go +++ b/pkg/contexts/oci/ref_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package oci_test import ( diff --git a/pkg/contexts/oci/repositories/artifactset/artifactset.go b/pkg/contexts/oci/repositories/artifactset/artifactset.go index c606f5fc94..7b033eefa0 100644 --- a/pkg/contexts/oci/repositories/artifactset/artifactset.go +++ b/pkg/contexts/oci/repositories/artifactset/artifactset.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifactset import ( diff --git a/pkg/contexts/oci/repositories/artifactset/artifactset_test.go b/pkg/contexts/oci/repositories/artifactset/artifactset_test.go index a888d7c2fa..834dd4a40f 100644 --- a/pkg/contexts/oci/repositories/artifactset/artifactset_test.go +++ b/pkg/contexts/oci/repositories/artifactset/artifactset_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifactset_test import ( diff --git a/pkg/contexts/oci/repositories/artifactset/error.go b/pkg/contexts/oci/repositories/artifactset/error.go index 5b3c670f47..903853457d 100644 --- a/pkg/contexts/oci/repositories/artifactset/error.go +++ b/pkg/contexts/oci/repositories/artifactset/error.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifactset import "fmt" diff --git a/pkg/contexts/oci/repositories/artifactset/filesystemaccess.go b/pkg/contexts/oci/repositories/artifactset/filesystemaccess.go index 6fb1722789..c0a2ea0230 100644 --- a/pkg/contexts/oci/repositories/artifactset/filesystemaccess.go +++ b/pkg/contexts/oci/repositories/artifactset/filesystemaccess.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifactset import ( diff --git a/pkg/contexts/oci/repositories/artifactset/format.go b/pkg/contexts/oci/repositories/artifactset/format.go index deb12c8446..4d4cc6da74 100644 --- a/pkg/contexts/oci/repositories/artifactset/format.go +++ b/pkg/contexts/oci/repositories/artifactset/format.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifactset import ( diff --git a/pkg/contexts/oci/repositories/artifactset/options.go b/pkg/contexts/oci/repositories/artifactset/options.go index d00d978f35..16cc36f688 100644 --- a/pkg/contexts/oci/repositories/artifactset/options.go +++ b/pkg/contexts/oci/repositories/artifactset/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifactset import ( diff --git a/pkg/contexts/oci/repositories/artifactset/repo_test.go b/pkg/contexts/oci/repositories/artifactset/repo_test.go index 05075fd6a5..f32674e6a5 100644 --- a/pkg/contexts/oci/repositories/artifactset/repo_test.go +++ b/pkg/contexts/oci/repositories/artifactset/repo_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifactset_test import ( diff --git a/pkg/contexts/oci/repositories/artifactset/repository.go b/pkg/contexts/oci/repositories/artifactset/repository.go index 7a2923fcc1..b5d5dc4dcf 100644 --- a/pkg/contexts/oci/repositories/artifactset/repository.go +++ b/pkg/contexts/oci/repositories/artifactset/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifactset import ( diff --git a/pkg/contexts/oci/repositories/artifactset/state.go b/pkg/contexts/oci/repositories/artifactset/state.go index c2d67227c9..616af4aa55 100644 --- a/pkg/contexts/oci/repositories/artifactset/state.go +++ b/pkg/contexts/oci/repositories/artifactset/state.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifactset import ( diff --git a/pkg/contexts/oci/repositories/artifactset/suite_test.go b/pkg/contexts/oci/repositories/artifactset/suite_test.go index 4f921ccd64..55b5b83a4a 100644 --- a/pkg/contexts/oci/repositories/artifactset/suite_test.go +++ b/pkg/contexts/oci/repositories/artifactset/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifactset_test import ( diff --git a/pkg/contexts/oci/repositories/artifactset/testhelper/formats.go b/pkg/contexts/oci/repositories/artifactset/testhelper/formats.go index e472a13571..3ac44a18b1 100644 --- a/pkg/contexts/oci/repositories/artifactset/testhelper/formats.go +++ b/pkg/contexts/oci/repositories/artifactset/testhelper/formats.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testhelper import ( diff --git a/pkg/contexts/oci/repositories/artifactset/type.go b/pkg/contexts/oci/repositories/artifactset/type.go index 97cbeba074..83f4937f3e 100644 --- a/pkg/contexts/oci/repositories/artifactset/type.go +++ b/pkg/contexts/oci/repositories/artifactset/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifactset import ( diff --git a/pkg/contexts/oci/repositories/artifactset/uniform.go b/pkg/contexts/oci/repositories/artifactset/uniform.go index 01aef447f5..a624c38e11 100644 --- a/pkg/contexts/oci/repositories/artifactset/uniform.go +++ b/pkg/contexts/oci/repositories/artifactset/uniform.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifactset import ( diff --git a/pkg/contexts/oci/repositories/artifactset/utils_synthesis.go b/pkg/contexts/oci/repositories/artifactset/utils_synthesis.go index b8af51ec13..c4bed9fc58 100644 --- a/pkg/contexts/oci/repositories/artifactset/utils_synthesis.go +++ b/pkg/contexts/oci/repositories/artifactset/utils_synthesis.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifactset import ( diff --git a/pkg/contexts/oci/repositories/ctf/ctf_test.go b/pkg/contexts/oci/repositories/ctf/ctf_test.go index 75fc07d55a..78373764b5 100644 --- a/pkg/contexts/oci/repositories/ctf/ctf_test.go +++ b/pkg/contexts/oci/repositories/ctf/ctf_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf_test import ( diff --git a/pkg/contexts/oci/repositories/ctf/format.go b/pkg/contexts/oci/repositories/ctf/format.go index bc95ac3376..ac88b5d7a9 100644 --- a/pkg/contexts/oci/repositories/ctf/format.go +++ b/pkg/contexts/oci/repositories/ctf/format.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf import ( diff --git a/pkg/contexts/oci/repositories/ctf/format/const.go b/pkg/contexts/oci/repositories/ctf/format/const.go index 83076b6e92..29abf7e66d 100644 --- a/pkg/contexts/oci/repositories/ctf/format/const.go +++ b/pkg/contexts/oci/repositories/ctf/format/const.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package format import ( diff --git a/pkg/contexts/oci/repositories/ctf/index/ctfindex.go b/pkg/contexts/oci/repositories/ctf/index/ctfindex.go index d7f5105551..666d476ad8 100644 --- a/pkg/contexts/oci/repositories/ctf/index/ctfindex.go +++ b/pkg/contexts/oci/repositories/ctf/index/ctfindex.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package index import ( diff --git a/pkg/contexts/oci/repositories/ctf/index/index.go b/pkg/contexts/oci/repositories/ctf/index/index.go index ad5f2af4e4..375ff5c697 100644 --- a/pkg/contexts/oci/repositories/ctf/index/index.go +++ b/pkg/contexts/oci/repositories/ctf/index/index.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package index import ( diff --git a/pkg/contexts/oci/repositories/ctf/index/index_test.go b/pkg/contexts/oci/repositories/ctf/index/index_test.go index e9f570060b..e0a0df01ad 100644 --- a/pkg/contexts/oci/repositories/ctf/index/index_test.go +++ b/pkg/contexts/oci/repositories/ctf/index/index_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package index_test import ( diff --git a/pkg/contexts/oci/repositories/ctf/index/suite_test.go b/pkg/contexts/oci/repositories/ctf/index/suite_test.go index 303a5508dc..f4612555db 100644 --- a/pkg/contexts/oci/repositories/ctf/index/suite_test.go +++ b/pkg/contexts/oci/repositories/ctf/index/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package index_test import ( diff --git a/pkg/contexts/oci/repositories/ctf/namespace.go b/pkg/contexts/oci/repositories/ctf/namespace.go index 993a21e7c2..063ba85d2b 100644 --- a/pkg/contexts/oci/repositories/ctf/namespace.go +++ b/pkg/contexts/oci/repositories/ctf/namespace.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf import ( diff --git a/pkg/contexts/oci/repositories/ctf/repository.go b/pkg/contexts/oci/repositories/ctf/repository.go index c27ea80f1f..d65dfe3e83 100644 --- a/pkg/contexts/oci/repositories/ctf/repository.go +++ b/pkg/contexts/oci/repositories/ctf/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf import ( diff --git a/pkg/contexts/oci/repositories/ctf/state.go b/pkg/contexts/oci/repositories/ctf/state.go index df32af4784..938d4fe8b3 100644 --- a/pkg/contexts/oci/repositories/ctf/state.go +++ b/pkg/contexts/oci/repositories/ctf/state.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf import ( diff --git a/pkg/contexts/oci/repositories/ctf/suite_test.go b/pkg/contexts/oci/repositories/ctf/suite_test.go index cd12e9d42a..76de40450f 100644 --- a/pkg/contexts/oci/repositories/ctf/suite_test.go +++ b/pkg/contexts/oci/repositories/ctf/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf_test import ( diff --git a/pkg/contexts/oci/repositories/ctf/synthesis_test.go b/pkg/contexts/oci/repositories/ctf/synthesis_test.go index 5e9e3b4561..b4277e69cc 100644 --- a/pkg/contexts/oci/repositories/ctf/synthesis_test.go +++ b/pkg/contexts/oci/repositories/ctf/synthesis_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf_test import ( diff --git a/pkg/contexts/oci/repositories/ctf/testhelper/fill.go b/pkg/contexts/oci/repositories/ctf/testhelper/fill.go index 6df8658afe..14e952224e 100644 --- a/pkg/contexts/oci/repositories/ctf/testhelper/fill.go +++ b/pkg/contexts/oci/repositories/ctf/testhelper/fill.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testhelper import ( diff --git a/pkg/contexts/oci/repositories/ctf/type.go b/pkg/contexts/oci/repositories/ctf/type.go index a2bcb67191..779170fe9d 100644 --- a/pkg/contexts/oci/repositories/ctf/type.go +++ b/pkg/contexts/oci/repositories/ctf/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf import ( diff --git a/pkg/contexts/oci/repositories/ctf/uniform.go b/pkg/contexts/oci/repositories/ctf/uniform.go index 2b668addb9..04bd5a1f67 100644 --- a/pkg/contexts/oci/repositories/ctf/uniform.go +++ b/pkg/contexts/oci/repositories/ctf/uniform.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf import ( diff --git a/pkg/contexts/oci/repositories/docker/artifact.go b/pkg/contexts/oci/repositories/docker/artifact.go index 723573fb9a..2b35b1a963 100644 --- a/pkg/contexts/oci/repositories/docker/artifact.go +++ b/pkg/contexts/oci/repositories/docker/artifact.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/contexts/oci/repositories/docker/client.go b/pkg/contexts/oci/repositories/docker/client.go index b3acc71b06..0081c00983 100644 --- a/pkg/contexts/oci/repositories/docker/client.go +++ b/pkg/contexts/oci/repositories/docker/client.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // taken from "github.com/containers/image/v5", unfortunately this is private and cannot be used via import package docker diff --git a/pkg/contexts/oci/repositories/docker/convert.go b/pkg/contexts/oci/repositories/docker/convert.go index 8d60234f2d..24d5acfb1f 100644 --- a/pkg/contexts/oci/repositories/docker/convert.go +++ b/pkg/contexts/oci/repositories/docker/convert.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/contexts/oci/repositories/docker/type.go b/pkg/contexts/oci/repositories/docker/type.go index 8c08a2dc60..b9572b7c7d 100644 --- a/pkg/contexts/oci/repositories/docker/type.go +++ b/pkg/contexts/oci/repositories/docker/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/contexts/oci/repositories/docker/uniform.go b/pkg/contexts/oci/repositories/docker/uniform.go index 6863ead2e9..9d4edd4bb0 100644 --- a/pkg/contexts/oci/repositories/docker/uniform.go +++ b/pkg/contexts/oci/repositories/docker/uniform.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/contexts/oci/repositories/docker/utils.go b/pkg/contexts/oci/repositories/docker/utils.go index f822803d3f..336fd231a8 100644 --- a/pkg/contexts/oci/repositories/docker/utils.go +++ b/pkg/contexts/oci/repositories/docker/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/contexts/oci/repositories/empty/repository.go b/pkg/contexts/oci/repositories/empty/repository.go index 9ae46814ba..94b7d96f02 100644 --- a/pkg/contexts/oci/repositories/empty/repository.go +++ b/pkg/contexts/oci/repositories/empty/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package empty import ( diff --git a/pkg/contexts/oci/repositories/empty/type.go b/pkg/contexts/oci/repositories/empty/type.go index 279b575d3a..910084e532 100644 --- a/pkg/contexts/oci/repositories/empty/type.go +++ b/pkg/contexts/oci/repositories/empty/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package empty import ( diff --git a/pkg/contexts/oci/repositories/empty/uniform.go b/pkg/contexts/oci/repositories/empty/uniform.go index 30bf8cce0d..78d78a0cc4 100644 --- a/pkg/contexts/oci/repositories/empty/uniform.go +++ b/pkg/contexts/oci/repositories/empty/uniform.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package empty import ( diff --git a/pkg/contexts/oci/repositories/init.go b/pkg/contexts/oci/repositories/init.go index c86b176e3d..4ca9540668 100644 --- a/pkg/contexts/oci/repositories/init.go +++ b/pkg/contexts/oci/repositories/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package repositories import ( diff --git a/pkg/contexts/oci/repositories/ocireg/blobs.go b/pkg/contexts/oci/repositories/ocireg/blobs.go index 185532d110..df91f70f8f 100644 --- a/pkg/contexts/oci/repositories/ocireg/blobs.go +++ b/pkg/contexts/oci/repositories/ocireg/blobs.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocireg import ( diff --git a/pkg/contexts/oci/repositories/ocireg/logging.go b/pkg/contexts/oci/repositories/ocireg/logging.go index f489618c6f..b3a4743df7 100644 --- a/pkg/contexts/oci/repositories/ocireg/logging.go +++ b/pkg/contexts/oci/repositories/ocireg/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocireg import ( diff --git a/pkg/contexts/oci/repositories/ocireg/namespace.go b/pkg/contexts/oci/repositories/ocireg/namespace.go index 328320f3ce..a565df262b 100644 --- a/pkg/contexts/oci/repositories/ocireg/namespace.go +++ b/pkg/contexts/oci/repositories/ocireg/namespace.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocireg import ( diff --git a/pkg/contexts/oci/repositories/ocireg/repository.go b/pkg/contexts/oci/repositories/ocireg/repository.go index ed474c4ffa..96590b770a 100644 --- a/pkg/contexts/oci/repositories/ocireg/repository.go +++ b/pkg/contexts/oci/repositories/ocireg/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocireg import ( diff --git a/pkg/contexts/oci/repositories/ocireg/type.go b/pkg/contexts/oci/repositories/ocireg/type.go index d83f9f71b7..53002ae1f3 100644 --- a/pkg/contexts/oci/repositories/ocireg/type.go +++ b/pkg/contexts/oci/repositories/ocireg/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocireg import ( diff --git a/pkg/contexts/oci/repositories/ocireg/uniform.go b/pkg/contexts/oci/repositories/ocireg/uniform.go index 761a772a60..49f78e9778 100644 --- a/pkg/contexts/oci/repositories/ocireg/uniform.go +++ b/pkg/contexts/oci/repositories/ocireg/uniform.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocireg import ( diff --git a/pkg/contexts/oci/repositories/ocireg/utils.go b/pkg/contexts/oci/repositories/ocireg/utils.go index 0e81a18715..e11b2806d0 100644 --- a/pkg/contexts/oci/repositories/ocireg/utils.go +++ b/pkg/contexts/oci/repositories/ocireg/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocireg import ( diff --git a/pkg/contexts/oci/session.go b/pkg/contexts/oci/session.go index b15a9fb9f8..0227a3bfa8 100644 --- a/pkg/contexts/oci/session.go +++ b/pkg/contexts/oci/session.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package oci import ( diff --git a/pkg/contexts/oci/suite_test.go b/pkg/contexts/oci/suite_test.go index 62ea42f6a1..638212fa93 100644 --- a/pkg/contexts/oci/suite_test.go +++ b/pkg/contexts/oci/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package oci_test import ( diff --git a/pkg/contexts/oci/testhelper/manifests.go b/pkg/contexts/oci/testhelper/manifests.go index 7cf8a811fb..ceee04ac82 100644 --- a/pkg/contexts/oci/testhelper/manifests.go +++ b/pkg/contexts/oci/testhelper/manifests.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //nolint:gosec // digests of test manifests package testhelper diff --git a/pkg/contexts/oci/testhelper/oci.go b/pkg/contexts/oci/testhelper/oci.go index f1e1d3d283..caa0d58f22 100644 --- a/pkg/contexts/oci/testhelper/oci.go +++ b/pkg/contexts/oci/testhelper/oci.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testhelper import ( diff --git a/pkg/contexts/oci/transfer/filters/filter.go b/pkg/contexts/oci/transfer/filters/filter.go index 37e9215664..406dc44059 100644 --- a/pkg/contexts/oci/transfer/filters/filter.go +++ b/pkg/contexts/oci/transfer/filters/filter.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package filters import ( diff --git a/pkg/contexts/oci/transfer/suite_test.go b/pkg/contexts/oci/transfer/suite_test.go index ce1d813187..7718dd82f5 100644 --- a/pkg/contexts/oci/transfer/suite_test.go +++ b/pkg/contexts/oci/transfer/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer_test import ( diff --git a/pkg/contexts/oci/transfer/transfer.go b/pkg/contexts/oci/transfer/transfer.go index 7d6c9b56ff..ad4b569038 100644 --- a/pkg/contexts/oci/transfer/transfer.go +++ b/pkg/contexts/oci/transfer/transfer.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer import ( diff --git a/pkg/contexts/oci/transfer/transfer_test.go b/pkg/contexts/oci/transfer/transfer_test.go index cce4531423..c16e1e2164 100644 --- a/pkg/contexts/oci/transfer/transfer_test.go +++ b/pkg/contexts/oci/transfer/transfer_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer_test import ( diff --git a/pkg/contexts/oci/utils.go b/pkg/contexts/oci/utils.go index b1357b358f..5ddefced16 100644 --- a/pkg/contexts/oci/utils.go +++ b/pkg/contexts/oci/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package oci import ( diff --git a/pkg/contexts/ocm/accessmethods/compose/method.go b/pkg/contexts/ocm/accessmethods/compose/method.go index 31ef896445..3811654745 100644 --- a/pkg/contexts/ocm/accessmethods/compose/method.go +++ b/pkg/contexts/ocm/accessmethods/compose/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compose import ( diff --git a/pkg/contexts/ocm/accessmethods/github/cli.go b/pkg/contexts/ocm/accessmethods/github/cli.go index a542c021a7..22e9f538e8 100644 --- a/pkg/contexts/ocm/accessmethods/github/cli.go +++ b/pkg/contexts/ocm/accessmethods/github/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package github import ( diff --git a/pkg/contexts/ocm/accessmethods/github/method.go b/pkg/contexts/ocm/accessmethods/github/method.go index b5862722e0..36de16863f 100644 --- a/pkg/contexts/ocm/accessmethods/github/method.go +++ b/pkg/contexts/ocm/accessmethods/github/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package github import ( diff --git a/pkg/contexts/ocm/accessmethods/github/method_test.go b/pkg/contexts/ocm/accessmethods/github/method_test.go index df6b50e003..bc285b8a41 100644 --- a/pkg/contexts/ocm/accessmethods/github/method_test.go +++ b/pkg/contexts/ocm/accessmethods/github/method_test.go @@ -7,18 +7,20 @@ import ( "net/http" "os" + _ "github.com/open-component-model/ocm/pkg/contexts/datacontext/config" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "github.com/mandelsoft/filepath/pkg/filepath" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/github/identity" "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/tmpcache" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" - _ "github.com/open-component-model/ocm/pkg/contexts/datacontext/config" "github.com/open-component-model/ocm/pkg/contexts/ocm" me "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/github" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" diff --git a/pkg/contexts/ocm/accessmethods/github/suite_test.go b/pkg/contexts/ocm/accessmethods/github/suite_test.go index bfa53a11f3..8a9e1886bc 100644 --- a/pkg/contexts/ocm/accessmethods/github/suite_test.go +++ b/pkg/contexts/ocm/accessmethods/github/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package github_test import ( diff --git a/pkg/contexts/ocm/accessmethods/helm/cli.go b/pkg/contexts/ocm/accessmethods/helm/cli.go index 6432361f5a..16c4a1f1b4 100644 --- a/pkg/contexts/ocm/accessmethods/helm/cli.go +++ b/pkg/contexts/ocm/accessmethods/helm/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/pkg/contexts/ocm/accessmethods/helm/method.go b/pkg/contexts/ocm/accessmethods/helm/method.go index 59c49ea713..4b38325d16 100644 --- a/pkg/contexts/ocm/accessmethods/helm/method.go +++ b/pkg/contexts/ocm/accessmethods/helm/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/pkg/contexts/ocm/accessmethods/helm/method_test.go b/pkg/contexts/ocm/accessmethods/helm/method_test.go index 8533dba300..7f4e2903b8 100644 --- a/pkg/contexts/ocm/accessmethods/helm/method_test.go +++ b/pkg/contexts/ocm/accessmethods/helm/method_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm_test import ( diff --git a/pkg/contexts/ocm/accessmethods/helm/suite_test.go b/pkg/contexts/ocm/accessmethods/helm/suite_test.go index 814f89272b..33b96f4a52 100644 --- a/pkg/contexts/ocm/accessmethods/helm/suite_test.go +++ b/pkg/contexts/ocm/accessmethods/helm/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm_test import ( diff --git a/pkg/contexts/ocm/accessmethods/init.go b/pkg/contexts/ocm/accessmethods/init.go index 11f5e759e2..52052609d6 100644 --- a/pkg/contexts/ocm/accessmethods/init.go +++ b/pkg/contexts/ocm/accessmethods/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessmethods import ( diff --git a/pkg/contexts/ocm/accessmethods/localblob/cli.go b/pkg/contexts/ocm/accessmethods/localblob/cli.go index 56528fae45..9a1d5a0902 100644 --- a/pkg/contexts/ocm/accessmethods/localblob/cli.go +++ b/pkg/contexts/ocm/accessmethods/localblob/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localblob import ( diff --git a/pkg/contexts/ocm/accessmethods/localblob/method.go b/pkg/contexts/ocm/accessmethods/localblob/method.go index 37dc6c9e88..5ebc235261 100644 --- a/pkg/contexts/ocm/accessmethods/localblob/method.go +++ b/pkg/contexts/ocm/accessmethods/localblob/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localblob import ( diff --git a/pkg/contexts/ocm/accessmethods/localblob/method_test.go b/pkg/contexts/ocm/accessmethods/localblob/method_test.go index da69091570..c2b0f52efa 100644 --- a/pkg/contexts/ocm/accessmethods/localblob/method_test.go +++ b/pkg/contexts/ocm/accessmethods/localblob/method_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localblob_test import ( diff --git a/pkg/contexts/ocm/accessmethods/localblob/suite_test.go b/pkg/contexts/ocm/accessmethods/localblob/suite_test.go index 2f9142bc72..27fcf7b2d8 100644 --- a/pkg/contexts/ocm/accessmethods/localblob/suite_test.go +++ b/pkg/contexts/ocm/accessmethods/localblob/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localblob_test import ( diff --git a/pkg/contexts/ocm/accessmethods/localfsblob/method.go b/pkg/contexts/ocm/accessmethods/localfsblob/method.go index c183af8104..ecf9f4b51b 100644 --- a/pkg/contexts/ocm/accessmethods/localfsblob/method.go +++ b/pkg/contexts/ocm/accessmethods/localfsblob/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localfsblob import ( diff --git a/pkg/contexts/ocm/accessmethods/localfsblob/method_test.go b/pkg/contexts/ocm/accessmethods/localfsblob/method_test.go index dbfb7d4689..64d4413217 100644 --- a/pkg/contexts/ocm/accessmethods/localfsblob/method_test.go +++ b/pkg/contexts/ocm/accessmethods/localfsblob/method_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localfsblob_test import ( diff --git a/pkg/contexts/ocm/accessmethods/localfsblob/suite_test.go b/pkg/contexts/ocm/accessmethods/localfsblob/suite_test.go index 2367070898..c6723b40a8 100644 --- a/pkg/contexts/ocm/accessmethods/localfsblob/suite_test.go +++ b/pkg/contexts/ocm/accessmethods/localfsblob/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localfsblob_test import ( diff --git a/pkg/contexts/ocm/accessmethods/localociblob/method.go b/pkg/contexts/ocm/accessmethods/localociblob/method.go index 4323ab9b66..b5165f1639 100644 --- a/pkg/contexts/ocm/accessmethods/localociblob/method.go +++ b/pkg/contexts/ocm/accessmethods/localociblob/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localociblob import ( diff --git a/pkg/contexts/ocm/accessmethods/localociblob/method_test.go b/pkg/contexts/ocm/accessmethods/localociblob/method_test.go index f1431fe5ba..0c4fc97483 100644 --- a/pkg/contexts/ocm/accessmethods/localociblob/method_test.go +++ b/pkg/contexts/ocm/accessmethods/localociblob/method_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localociblob_test import ( diff --git a/pkg/contexts/ocm/accessmethods/localociblob/suite_test.go b/pkg/contexts/ocm/accessmethods/localociblob/suite_test.go index e154bd55d5..f4a3da659a 100644 --- a/pkg/contexts/ocm/accessmethods/localociblob/suite_test.go +++ b/pkg/contexts/ocm/accessmethods/localociblob/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localociblob_test import ( diff --git a/pkg/contexts/ocm/accessmethods/none/method.go b/pkg/contexts/ocm/accessmethods/none/method.go index de69f3f98e..0feef44a51 100644 --- a/pkg/contexts/ocm/accessmethods/none/method.go +++ b/pkg/contexts/ocm/accessmethods/none/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package none import ( diff --git a/pkg/contexts/ocm/accessmethods/npm/cli.go b/pkg/contexts/ocm/accessmethods/npm/cli.go index 12f2582bea..7f15336319 100644 --- a/pkg/contexts/ocm/accessmethods/npm/cli.go +++ b/pkg/contexts/ocm/accessmethods/npm/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package npm import ( diff --git a/pkg/contexts/ocm/accessmethods/npm/method_test.go b/pkg/contexts/ocm/accessmethods/npm/method_test.go index d15e985cb9..dc4dbd2513 100644 --- a/pkg/contexts/ocm/accessmethods/npm/method_test.go +++ b/pkg/contexts/ocm/accessmethods/npm/method_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package npm_test import ( diff --git a/pkg/contexts/ocm/accessmethods/npm/suite_test.go b/pkg/contexts/ocm/accessmethods/npm/suite_test.go index ce7bd39b97..897e72b305 100644 --- a/pkg/contexts/ocm/accessmethods/npm/suite_test.go +++ b/pkg/contexts/ocm/accessmethods/npm/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package npm_test import ( diff --git a/pkg/contexts/ocm/accessmethods/ociartifact/cli.go b/pkg/contexts/ocm/accessmethods/ociartifact/cli.go index d533387071..11eb07b0a1 100644 --- a/pkg/contexts/ocm/accessmethods/ociartifact/cli.go +++ b/pkg/contexts/ocm/accessmethods/ociartifact/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifact import ( diff --git a/pkg/contexts/ocm/accessmethods/ociartifact/logging.go b/pkg/contexts/ocm/accessmethods/ociartifact/logging.go index c88da246f6..9c855da8d0 100644 --- a/pkg/contexts/ocm/accessmethods/ociartifact/logging.go +++ b/pkg/contexts/ocm/accessmethods/ociartifact/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifact import ( diff --git a/pkg/contexts/ocm/accessmethods/ociartifact/method.go b/pkg/contexts/ocm/accessmethods/ociartifact/method.go index e278b6fe74..6e08b7cff1 100644 --- a/pkg/contexts/ocm/accessmethods/ociartifact/method.go +++ b/pkg/contexts/ocm/accessmethods/ociartifact/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifact import ( diff --git a/pkg/contexts/ocm/accessmethods/ociartifact/method_test.go b/pkg/contexts/ocm/accessmethods/ociartifact/method_test.go index 08bf70afb1..e1a97ccd5a 100644 --- a/pkg/contexts/ocm/accessmethods/ociartifact/method_test.go +++ b/pkg/contexts/ocm/accessmethods/ociartifact/method_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifact_test import ( diff --git a/pkg/contexts/ocm/accessmethods/ociartifact/suite_test.go b/pkg/contexts/ocm/accessmethods/ociartifact/suite_test.go index ccd2b0a200..2c73fbbfb4 100644 --- a/pkg/contexts/ocm/accessmethods/ociartifact/suite_test.go +++ b/pkg/contexts/ocm/accessmethods/ociartifact/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifact_test import ( diff --git a/pkg/contexts/ocm/accessmethods/ociartifact/utils.go b/pkg/contexts/ocm/accessmethods/ociartifact/utils.go index d0e847ad3c..d1bb35a05b 100644 --- a/pkg/contexts/ocm/accessmethods/ociartifact/utils.go +++ b/pkg/contexts/ocm/accessmethods/ociartifact/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifact import ( diff --git a/pkg/contexts/ocm/accessmethods/ociblob/cli.go b/pkg/contexts/ocm/accessmethods/ociblob/cli.go index ef14f94f10..e71d693e65 100644 --- a/pkg/contexts/ocm/accessmethods/ociblob/cli.go +++ b/pkg/contexts/ocm/accessmethods/ociblob/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociblob import ( diff --git a/pkg/contexts/ocm/accessmethods/ociblob/method.go b/pkg/contexts/ocm/accessmethods/ociblob/method.go index 97f8e1222b..92741361be 100644 --- a/pkg/contexts/ocm/accessmethods/ociblob/method.go +++ b/pkg/contexts/ocm/accessmethods/ociblob/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociblob import ( diff --git a/pkg/contexts/ocm/accessmethods/ociblob/method_test.go b/pkg/contexts/ocm/accessmethods/ociblob/method_test.go index 784ed23d86..6f8c92eb7d 100644 --- a/pkg/contexts/ocm/accessmethods/ociblob/method_test.go +++ b/pkg/contexts/ocm/accessmethods/ociblob/method_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociblob_test import ( diff --git a/pkg/contexts/ocm/accessmethods/ociblob/suite_test.go b/pkg/contexts/ocm/accessmethods/ociblob/suite_test.go index f60a8d14c8..3707fc8b5a 100644 --- a/pkg/contexts/ocm/accessmethods/ociblob/suite_test.go +++ b/pkg/contexts/ocm/accessmethods/ociblob/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociblob_test import ( diff --git a/pkg/contexts/ocm/accessmethods/options/doc.go b/pkg/contexts/ocm/accessmethods/options/doc.go index 49e3ed80ff..a67931f8fa 100644 --- a/pkg/contexts/ocm/accessmethods/options/doc.go +++ b/pkg/contexts/ocm/accessmethods/options/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package options defines standard options and option types usable // to provide CLI options used to dynamically orchestrate arbitrary // access specifications. These options have a predefined meaning and diff --git a/pkg/contexts/ocm/accessmethods/options/init.go b/pkg/contexts/ocm/accessmethods/options/init.go index 27acd23af5..8de3a5fdd9 100644 --- a/pkg/contexts/ocm/accessmethods/options/init.go +++ b/pkg/contexts/ocm/accessmethods/options/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package options const ( diff --git a/pkg/contexts/ocm/accessmethods/options/registry.go b/pkg/contexts/ocm/accessmethods/options/registry.go index ba6322b1e4..25942474a1 100644 --- a/pkg/contexts/ocm/accessmethods/options/registry.go +++ b/pkg/contexts/ocm/accessmethods/options/registry.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package options import ( diff --git a/pkg/contexts/ocm/accessmethods/options/registry_test.go b/pkg/contexts/ocm/accessmethods/options/registry_test.go index 97ffb3bf88..b31435cf85 100644 --- a/pkg/contexts/ocm/accessmethods/options/registry_test.go +++ b/pkg/contexts/ocm/accessmethods/options/registry_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package options import ( diff --git a/pkg/contexts/ocm/accessmethods/options/standard.go b/pkg/contexts/ocm/accessmethods/options/standard.go index 052f7e73e0..c13b298134 100644 --- a/pkg/contexts/ocm/accessmethods/options/standard.go +++ b/pkg/contexts/ocm/accessmethods/options/standard.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package options // HintOption. diff --git a/pkg/contexts/ocm/accessmethods/options/suite_test.go b/pkg/contexts/ocm/accessmethods/options/suite_test.go index 95a45f13e8..16583ee25c 100644 --- a/pkg/contexts/ocm/accessmethods/options/suite_test.go +++ b/pkg/contexts/ocm/accessmethods/options/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package options_test import ( diff --git a/pkg/contexts/ocm/accessmethods/options/types.go b/pkg/contexts/ocm/accessmethods/options/types.go index 3a9dfe6ed3..96883a564b 100644 --- a/pkg/contexts/ocm/accessmethods/options/types.go +++ b/pkg/contexts/ocm/accessmethods/options/types.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package options import ( diff --git a/pkg/contexts/ocm/accessmethods/plugin/cmd_test.go b/pkg/contexts/ocm/accessmethods/plugin/cmd_test.go index 231ece0f07..48b74f4e02 100644 --- a/pkg/contexts/ocm/accessmethods/plugin/cmd_test.go +++ b/pkg/contexts/ocm/accessmethods/plugin/cmd_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin_test import ( diff --git a/pkg/contexts/ocm/accessmethods/plugin/doc.go b/pkg/contexts/ocm/accessmethods/plugin/doc.go index 5bef8c9885..cd2eaf05dd 100644 --- a/pkg/contexts/ocm/accessmethods/plugin/doc.go +++ b/pkg/contexts/ocm/accessmethods/plugin/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package plugin is an adapter implementation that provides a generic handling of all AccessMethods provided by // plugins. // It includes a generic AccessType object (responsible for un-/marshaling AccessSpec objects), AccessSpec object and diff --git a/pkg/contexts/ocm/accessmethods/plugin/method.go b/pkg/contexts/ocm/accessmethods/plugin/method.go index be5afdf70b..5e329e2b62 100644 --- a/pkg/contexts/ocm/accessmethods/plugin/method.go +++ b/pkg/contexts/ocm/accessmethods/plugin/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/accessmethods/plugin/method_test.go b/pkg/contexts/ocm/accessmethods/plugin/method_test.go index b027178b0d..f8cf71e1bc 100644 --- a/pkg/contexts/ocm/accessmethods/plugin/method_test.go +++ b/pkg/contexts/ocm/accessmethods/plugin/method_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:build unix package plugin_test diff --git a/pkg/contexts/ocm/accessmethods/plugin/plugin.go b/pkg/contexts/ocm/accessmethods/plugin/plugin.go index 87de720d3d..34904569e4 100644 --- a/pkg/contexts/ocm/accessmethods/plugin/plugin.go +++ b/pkg/contexts/ocm/accessmethods/plugin/plugin.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/accessmethods/plugin/suite_test.go b/pkg/contexts/ocm/accessmethods/plugin/suite_test.go index f1ac760593..d63d5e637e 100644 --- a/pkg/contexts/ocm/accessmethods/plugin/suite_test.go +++ b/pkg/contexts/ocm/accessmethods/plugin/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin_test import ( diff --git a/pkg/contexts/ocm/accessmethods/plugin/testdata/test b/pkg/contexts/ocm/accessmethods/plugin/testdata/test index 566e080ff1..71243c2dfc 100755 --- a/pkg/contexts/ocm/accessmethods/plugin/testdata/test +++ b/pkg/contexts/ocm/accessmethods/plugin/testdata/test @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" Error() { diff --git a/pkg/contexts/ocm/accessmethods/plugin/type.go b/pkg/contexts/ocm/accessmethods/plugin/type.go index 645ab7d288..e050a6ae70 100644 --- a/pkg/contexts/ocm/accessmethods/plugin/type.go +++ b/pkg/contexts/ocm/accessmethods/plugin/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/accessmethods/relativeociref/method.go b/pkg/contexts/ocm/accessmethods/relativeociref/method.go index 72e8d687c1..148f25e5f7 100644 --- a/pkg/contexts/ocm/accessmethods/relativeociref/method.go +++ b/pkg/contexts/ocm/accessmethods/relativeociref/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package relativeociref import ( diff --git a/pkg/contexts/ocm/accessmethods/relativeociref/method_test.go b/pkg/contexts/ocm/accessmethods/relativeociref/method_test.go index 90d1a030f6..a0bffd84d3 100644 --- a/pkg/contexts/ocm/accessmethods/relativeociref/method_test.go +++ b/pkg/contexts/ocm/accessmethods/relativeociref/method_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package relativeociref_test import ( diff --git a/pkg/contexts/ocm/accessmethods/relativeociref/suite_test.go b/pkg/contexts/ocm/accessmethods/relativeociref/suite_test.go index b60cd583d9..9f947764cb 100644 --- a/pkg/contexts/ocm/accessmethods/relativeociref/suite_test.go +++ b/pkg/contexts/ocm/accessmethods/relativeociref/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package relativeociref_test import ( diff --git a/pkg/contexts/ocm/accessmethods/relativeociref/transfer_test.go b/pkg/contexts/ocm/accessmethods/relativeociref/transfer_test.go index 8b45e327f2..f99f078ee0 100644 --- a/pkg/contexts/ocm/accessmethods/relativeociref/transfer_test.go +++ b/pkg/contexts/ocm/accessmethods/relativeociref/transfer_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package relativeociref_test import ( diff --git a/pkg/contexts/ocm/accessmethods/s3/cli.go b/pkg/contexts/ocm/accessmethods/s3/cli.go index 4a670c8787..b8d452ab39 100644 --- a/pkg/contexts/ocm/accessmethods/s3/cli.go +++ b/pkg/contexts/ocm/accessmethods/s3/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package s3 import ( diff --git a/pkg/contexts/ocm/accessmethods/s3/identity/identity.go b/pkg/contexts/ocm/accessmethods/s3/identity/identity.go index 9ada72af70..2df1faacdf 100644 --- a/pkg/contexts/ocm/accessmethods/s3/identity/identity.go +++ b/pkg/contexts/ocm/accessmethods/s3/identity/identity.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity import ( diff --git a/pkg/contexts/ocm/accessmethods/s3/ifce_test.go b/pkg/contexts/ocm/accessmethods/s3/ifce_test.go index b00b832071..0a31c93fbc 100644 --- a/pkg/contexts/ocm/accessmethods/s3/ifce_test.go +++ b/pkg/contexts/ocm/accessmethods/s3/ifce_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package s3 import ( diff --git a/pkg/contexts/ocm/accessmethods/s3/method.go b/pkg/contexts/ocm/accessmethods/s3/method.go index cc1aa9a1ef..8a1ffc45a9 100644 --- a/pkg/contexts/ocm/accessmethods/s3/method.go +++ b/pkg/contexts/ocm/accessmethods/s3/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package s3 import ( diff --git a/pkg/contexts/ocm/accessmethods/s3/method_test.go b/pkg/contexts/ocm/accessmethods/s3/method_test.go index e5f5de1dc1..086fd27697 100644 --- a/pkg/contexts/ocm/accessmethods/s3/method_test.go +++ b/pkg/contexts/ocm/accessmethods/s3/method_test.go @@ -7,11 +7,14 @@ import ( "os" "reflect" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/env/builder" + . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/filepath/pkg/filepath" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" "github.com/open-component-model/ocm/pkg/common/accessio/downloader" "github.com/open-component-model/ocm/pkg/contexts/credentials" @@ -22,9 +25,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/s3" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/s3/identity" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - . "github.com/open-component-model/ocm/pkg/env/builder" "github.com/open-component-model/ocm/pkg/generics" - . "github.com/open-component-model/ocm/pkg/testutils" ) type mockDownloader struct { diff --git a/pkg/contexts/ocm/accessmethods/s3/suite_test.go b/pkg/contexts/ocm/accessmethods/s3/suite_test.go index 46f0d71a99..2ddc077d72 100644 --- a/pkg/contexts/ocm/accessmethods/s3/suite_test.go +++ b/pkg/contexts/ocm/accessmethods/s3/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package s3_test import ( diff --git a/pkg/contexts/ocm/accessmethods/s3/v1.go b/pkg/contexts/ocm/accessmethods/s3/v1.go index 7d817748c5..e683e8ceb5 100644 --- a/pkg/contexts/ocm/accessmethods/s3/v1.go +++ b/pkg/contexts/ocm/accessmethods/s3/v1.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package s3 import ( diff --git a/pkg/contexts/ocm/accessmethods/s3/v2.go b/pkg/contexts/ocm/accessmethods/s3/v2.go index 35818382f3..03be159842 100644 --- a/pkg/contexts/ocm/accessmethods/s3/v2.go +++ b/pkg/contexts/ocm/accessmethods/s3/v2.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package s3 import ( diff --git a/pkg/contexts/ocm/accessmethods/wget/cli.go b/pkg/contexts/ocm/accessmethods/wget/cli.go index 77550c0a1e..ed72c4c694 100644 --- a/pkg/contexts/ocm/accessmethods/wget/cli.go +++ b/pkg/contexts/ocm/accessmethods/wget/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wget import ( diff --git a/pkg/contexts/ocm/accessmethods/wget/logging.go b/pkg/contexts/ocm/accessmethods/wget/logging.go index 40329208e3..91d2c768fa 100644 --- a/pkg/contexts/ocm/accessmethods/wget/logging.go +++ b/pkg/contexts/ocm/accessmethods/wget/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wget import ( diff --git a/pkg/contexts/ocm/accessmethods/wget/method.go b/pkg/contexts/ocm/accessmethods/wget/method.go index cf51cb5a55..5b1602f86d 100644 --- a/pkg/contexts/ocm/accessmethods/wget/method.go +++ b/pkg/contexts/ocm/accessmethods/wget/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wget import ( diff --git a/pkg/contexts/ocm/accessmethods/wget/method_test.go b/pkg/contexts/ocm/accessmethods/wget/method_test.go index 2d7e589216..e3cd73d59b 100644 --- a/pkg/contexts/ocm/accessmethods/wget/method_test.go +++ b/pkg/contexts/ocm/accessmethods/wget/method_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wget_test import ( diff --git a/pkg/contexts/ocm/accessmethods/wget/options.go b/pkg/contexts/ocm/accessmethods/wget/options.go index 2cf7ebc37f..4693d6c697 100644 --- a/pkg/contexts/ocm/accessmethods/wget/options.go +++ b/pkg/contexts/ocm/accessmethods/wget/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wget import ( diff --git a/pkg/contexts/ocm/accessmethods/wget/suite_test.go b/pkg/contexts/ocm/accessmethods/wget/suite_test.go index 910d088e07..6d72f6b70d 100644 --- a/pkg/contexts/ocm/accessmethods/wget/suite_test.go +++ b/pkg/contexts/ocm/accessmethods/wget/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wget_test import ( diff --git a/pkg/contexts/ocm/actionhandler/init.go b/pkg/contexts/ocm/actionhandler/init.go index d949717b4e..f22bc94665 100644 --- a/pkg/contexts/ocm/actionhandler/init.go +++ b/pkg/contexts/ocm/actionhandler/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package actionhandler import ( diff --git a/pkg/contexts/ocm/actionhandler/plugin/action_test.go b/pkg/contexts/ocm/actionhandler/plugin/action_test.go index bf2793e003..6ec69b3da8 100644 --- a/pkg/contexts/ocm/actionhandler/plugin/action_test.go +++ b/pkg/contexts/ocm/actionhandler/plugin/action_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:build unix package plugin_test diff --git a/pkg/contexts/ocm/actionhandler/plugin/actionhandler.go b/pkg/contexts/ocm/actionhandler/plugin/actionhandler.go index 2c810a9ab7..a2ce7956b3 100644 --- a/pkg/contexts/ocm/actionhandler/plugin/actionhandler.go +++ b/pkg/contexts/ocm/actionhandler/plugin/actionhandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/actionhandler/plugin/registration.go b/pkg/contexts/ocm/actionhandler/plugin/registration.go index e5b860a456..220dfd9f42 100644 --- a/pkg/contexts/ocm/actionhandler/plugin/registration.go +++ b/pkg/contexts/ocm/actionhandler/plugin/registration.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/actionhandler/plugin/suite_test.go b/pkg/contexts/ocm/actionhandler/plugin/suite_test.go index 2251e0a4c0..64a88460c4 100644 --- a/pkg/contexts/ocm/actionhandler/plugin/suite_test.go +++ b/pkg/contexts/ocm/actionhandler/plugin/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin_test import ( diff --git a/pkg/contexts/ocm/actionhandler/plugin/testdata/action b/pkg/contexts/ocm/actionhandler/plugin/testdata/action index e3816e6d32..55205d8631 100755 --- a/pkg/contexts/ocm/actionhandler/plugin/testdata/action +++ b/pkg/contexts/ocm/actionhandler/plugin/testdata/action @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" Error() { diff --git a/pkg/contexts/ocm/attrs/compatattr/attr.go b/pkg/contexts/ocm/attrs/compatattr/attr.go index 08a4858198..72e21d87e6 100644 --- a/pkg/contexts/ocm/attrs/compatattr/attr.go +++ b/pkg/contexts/ocm/attrs/compatattr/attr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compatattr import ( diff --git a/pkg/contexts/ocm/attrs/compatattr/attr_test.go b/pkg/contexts/ocm/attrs/compatattr/attr_test.go index 5b26e53dc7..cf4b1a4c3b 100644 --- a/pkg/contexts/ocm/attrs/compatattr/attr_test.go +++ b/pkg/contexts/ocm/attrs/compatattr/attr_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compatattr_test import ( diff --git a/pkg/contexts/ocm/attrs/compatattr/suite_test.go b/pkg/contexts/ocm/attrs/compatattr/suite_test.go index e8ecd0c17f..8359be0cab 100644 --- a/pkg/contexts/ocm/attrs/compatattr/suite_test.go +++ b/pkg/contexts/ocm/attrs/compatattr/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compatattr_test import ( diff --git a/pkg/contexts/ocm/attrs/compositionmodeattr/attr.go b/pkg/contexts/ocm/attrs/compositionmodeattr/attr.go index ec13c9a775..903ff856da 100644 --- a/pkg/contexts/ocm/attrs/compositionmodeattr/attr.go +++ b/pkg/contexts/ocm/attrs/compositionmodeattr/attr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compositionmodeattr import ( diff --git a/pkg/contexts/ocm/attrs/compositionmodeattr/attr_test.go b/pkg/contexts/ocm/attrs/compositionmodeattr/attr_test.go index b2576a33a2..a96e036c77 100644 --- a/pkg/contexts/ocm/attrs/compositionmodeattr/attr_test.go +++ b/pkg/contexts/ocm/attrs/compositionmodeattr/attr_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compositionmodeattr_test import ( diff --git a/pkg/contexts/ocm/attrs/compositionmodeattr/suite_test.go b/pkg/contexts/ocm/attrs/compositionmodeattr/suite_test.go index cafab85bd1..cf4d8ee79b 100644 --- a/pkg/contexts/ocm/attrs/compositionmodeattr/suite_test.go +++ b/pkg/contexts/ocm/attrs/compositionmodeattr/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compositionmodeattr_test import ( diff --git a/pkg/contexts/ocm/attrs/hashattr/attr.go b/pkg/contexts/ocm/attrs/hashattr/attr.go index bdfcb28799..7cb90ae4f8 100644 --- a/pkg/contexts/ocm/attrs/hashattr/attr.go +++ b/pkg/contexts/ocm/attrs/hashattr/attr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hashattr import ( diff --git a/pkg/contexts/ocm/attrs/hashattr/attr_test.go b/pkg/contexts/ocm/attrs/hashattr/attr_test.go index fe7d526442..83efe93680 100644 --- a/pkg/contexts/ocm/attrs/hashattr/attr_test.go +++ b/pkg/contexts/ocm/attrs/hashattr/attr_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hashattr_test import ( diff --git a/pkg/contexts/ocm/attrs/hashattr/config.go b/pkg/contexts/ocm/attrs/hashattr/config.go index b8b678f661..a69f04b0ab 100644 --- a/pkg/contexts/ocm/attrs/hashattr/config.go +++ b/pkg/contexts/ocm/attrs/hashattr/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hashattr import ( diff --git a/pkg/contexts/ocm/attrs/hashattr/suite_test.go b/pkg/contexts/ocm/attrs/hashattr/suite_test.go index fbbd6ed2aa..26cf013b03 100644 --- a/pkg/contexts/ocm/attrs/hashattr/suite_test.go +++ b/pkg/contexts/ocm/attrs/hashattr/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hashattr_test import ( diff --git a/pkg/contexts/ocm/attrs/init.go b/pkg/contexts/ocm/attrs/init.go index b9d7364bc8..591dc43bb1 100644 --- a/pkg/contexts/ocm/attrs/init.go +++ b/pkg/contexts/ocm/attrs/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package attrs import ( diff --git a/pkg/contexts/ocm/attrs/keepblobattr/attr.go b/pkg/contexts/ocm/attrs/keepblobattr/attr.go index c5805d6f11..2f2181bb58 100644 --- a/pkg/contexts/ocm/attrs/keepblobattr/attr.go +++ b/pkg/contexts/ocm/attrs/keepblobattr/attr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package keepblobattr import ( diff --git a/pkg/contexts/ocm/attrs/keepblobattr/attr_test.go b/pkg/contexts/ocm/attrs/keepblobattr/attr_test.go index ab700ea831..c46b0943ef 100644 --- a/pkg/contexts/ocm/attrs/keepblobattr/attr_test.go +++ b/pkg/contexts/ocm/attrs/keepblobattr/attr_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package keepblobattr_test import ( diff --git a/pkg/contexts/ocm/attrs/keepblobattr/suite_test.go b/pkg/contexts/ocm/attrs/keepblobattr/suite_test.go index 3f6ca74ee6..15a5a6a60c 100644 --- a/pkg/contexts/ocm/attrs/keepblobattr/suite_test.go +++ b/pkg/contexts/ocm/attrs/keepblobattr/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package keepblobattr_test import ( diff --git a/pkg/contexts/ocm/attrs/mapocirepoattr/attr.go b/pkg/contexts/ocm/attrs/mapocirepoattr/attr.go index cb4c646d34..0800f74ff8 100644 --- a/pkg/contexts/ocm/attrs/mapocirepoattr/attr.go +++ b/pkg/contexts/ocm/attrs/mapocirepoattr/attr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package mapocirepoattr import ( diff --git a/pkg/contexts/ocm/attrs/mapocirepoattr/attr_test.go b/pkg/contexts/ocm/attrs/mapocirepoattr/attr_test.go index 69127b7dd8..8dbef8ffef 100644 --- a/pkg/contexts/ocm/attrs/mapocirepoattr/attr_test.go +++ b/pkg/contexts/ocm/attrs/mapocirepoattr/attr_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package mapocirepoattr_test import ( diff --git a/pkg/contexts/ocm/attrs/mapocirepoattr/suite_test.go b/pkg/contexts/ocm/attrs/mapocirepoattr/suite_test.go index 63b09829f1..393c337d0e 100644 --- a/pkg/contexts/ocm/attrs/mapocirepoattr/suite_test.go +++ b/pkg/contexts/ocm/attrs/mapocirepoattr/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package mapocirepoattr_test import ( diff --git a/pkg/contexts/ocm/attrs/ociuploadattr/attr.go b/pkg/contexts/ocm/attrs/ociuploadattr/attr.go index 1d93d6e850..e72c6aa02c 100644 --- a/pkg/contexts/ocm/attrs/ociuploadattr/attr.go +++ b/pkg/contexts/ocm/attrs/ociuploadattr/attr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociuploadattr import ( diff --git a/pkg/contexts/ocm/attrs/ociuploadattr/attr_test.go b/pkg/contexts/ocm/attrs/ociuploadattr/attr_test.go index 2ae2eb9645..649f0a7e65 100644 --- a/pkg/contexts/ocm/attrs/ociuploadattr/attr_test.go +++ b/pkg/contexts/ocm/attrs/ociuploadattr/attr_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociuploadattr_test import ( diff --git a/pkg/contexts/ocm/attrs/ociuploadattr/suite_test.go b/pkg/contexts/ocm/attrs/ociuploadattr/suite_test.go index 85a3499b17..b6e55ed373 100644 --- a/pkg/contexts/ocm/attrs/ociuploadattr/suite_test.go +++ b/pkg/contexts/ocm/attrs/ociuploadattr/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociuploadattr_test import ( diff --git a/pkg/contexts/ocm/attrs/plugincacheattr/attr.go b/pkg/contexts/ocm/attrs/plugincacheattr/attr.go index ad49116ce3..cb2bd2c8a9 100644 --- a/pkg/contexts/ocm/attrs/plugincacheattr/attr.go +++ b/pkg/contexts/ocm/attrs/plugincacheattr/attr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugincacheattr import ( diff --git a/pkg/contexts/ocm/attrs/plugindirattr/attr_test.go b/pkg/contexts/ocm/attrs/plugindirattr/attr_test.go index b2db4e4993..46518dc7a9 100644 --- a/pkg/contexts/ocm/attrs/plugindirattr/attr_test.go +++ b/pkg/contexts/ocm/attrs/plugindirattr/attr_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugindirattr_test import ( diff --git a/pkg/contexts/ocm/attrs/plugindirattr/suite_test.go b/pkg/contexts/ocm/attrs/plugindirattr/suite_test.go index 9fc799c63d..e3b94aec7a 100644 --- a/pkg/contexts/ocm/attrs/plugindirattr/suite_test.go +++ b/pkg/contexts/ocm/attrs/plugindirattr/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugindirattr_test import ( diff --git a/pkg/contexts/ocm/attrs/signingattr/attr.go b/pkg/contexts/ocm/attrs/signingattr/attr.go index 136bb54c9d..1a86d62185 100644 --- a/pkg/contexts/ocm/attrs/signingattr/attr.go +++ b/pkg/contexts/ocm/attrs/signingattr/attr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signingattr import ( diff --git a/pkg/contexts/ocm/attrs/signingattr/attr_test.go b/pkg/contexts/ocm/attrs/signingattr/attr_test.go index d07e8f60ea..eaad443bb0 100644 --- a/pkg/contexts/ocm/attrs/signingattr/attr_test.go +++ b/pkg/contexts/ocm/attrs/signingattr/attr_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signingattr_test import ( diff --git a/pkg/contexts/ocm/attrs/signingattr/config.go b/pkg/contexts/ocm/attrs/signingattr/config.go index 8eff58ab8b..c6545f2c52 100644 --- a/pkg/contexts/ocm/attrs/signingattr/config.go +++ b/pkg/contexts/ocm/attrs/signingattr/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signingattr import ( diff --git a/pkg/contexts/ocm/attrs/signingattr/setup.go b/pkg/contexts/ocm/attrs/signingattr/setup.go index 074efb208b..66b83ad4e8 100644 --- a/pkg/contexts/ocm/attrs/signingattr/setup.go +++ b/pkg/contexts/ocm/attrs/signingattr/setup.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signingattr import ( diff --git a/pkg/contexts/ocm/attrs/signingattr/suite_test.go b/pkg/contexts/ocm/attrs/signingattr/suite_test.go index 43fb27d571..ff61be3a35 100644 --- a/pkg/contexts/ocm/attrs/signingattr/suite_test.go +++ b/pkg/contexts/ocm/attrs/signingattr/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signingattr_test import ( diff --git a/pkg/contexts/ocm/bind_test.go b/pkg/contexts/ocm/bind_test.go index 84f833d784..10a88e8c68 100644 --- a/pkg/contexts/ocm/bind_test.go +++ b/pkg/contexts/ocm/bind_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm_test import ( diff --git a/pkg/contexts/ocm/blobhandler/config/type.go b/pkg/contexts/ocm/blobhandler/config/type.go index fe9115c4cc..9313384d44 100644 --- a/pkg/contexts/ocm/blobhandler/config/type.go +++ b/pkg/contexts/ocm/blobhandler/config/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/ocm/blobhandler/doc.go b/pkg/contexts/ocm/blobhandler/doc.go index da09619307..d9d0cdec29 100644 --- a/pkg/contexts/ocm/blobhandler/doc.go +++ b/pkg/contexts/ocm/blobhandler/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package blobhandler contains blobhandlers for handling local blobs // for dedicated repository types. It is structured into sub packaged // for all context types, for example the context type oci for diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/publish_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/publish_test.go index 5a771e216a..c15250205d 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/publish_test.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/publish_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package npm import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration.go b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration.go index 0cf00aa30a..ba729fe4e4 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package npm import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration_test.go index 17089f6aa7..89aae1d6e9 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration_test.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package npm_test import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/suite_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/suite_test.go index 24af68d6bc..e4947738d0 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/suite_test.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package npm_test import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/blobhandler.go index 6dd9bc9641..4af29ef562 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/blobhandler.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/blobhandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocirepo import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/registration.go b/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/registration.go index b1b7e3c527..afcd30713b 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/registration.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/registration.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocirepo import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/suite_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/suite_test.go index c5486e90d0..5473371796 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/suite_test.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocirepo_test import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/upload_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/upload_test.go index 730953e857..fa154b1a35 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/upload_test.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/upload_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocirepo_test import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/blobhandler.go index 15bb6b6a6b..05c88206d5 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/blobhandler.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/blobhandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/registration.go b/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/registration.go index 4105fd4974..5b1d40d751 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/registration.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/registration.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/suite_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/suite_test.go index 3b5e0a3609..ee0c47244e 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/suite_test.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin_test import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/testdata/test b/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/testdata/test index 3361dbd2c2..7b08e5d838 100755 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/testdata/test +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/testdata/test @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" Error() { diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/upload_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/upload_test.go index c787b6e57c..783cce1afb 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/upload_test.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/upload_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:build unix package plugin_test diff --git a/pkg/contexts/ocm/blobhandler/handlers/init.go b/pkg/contexts/ocm/blobhandler/handlers/init.go index 433e3338be..d19447156c 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/init.go +++ b/pkg/contexts/ocm/blobhandler/handlers/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package handlers import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/oci/ctx.go b/pkg/contexts/ocm/blobhandler/handlers/oci/ctx.go index 1db19aa926..44c5a7d1b7 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/oci/ctx.go +++ b/pkg/contexts/ocm/blobhandler/handlers/oci/ctx.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package oci import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/oci/doc.go b/pkg/contexts/ocm/blobhandler/handlers/oci/doc.go index 69b6fd2854..4baf32f143 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/oci/doc.go +++ b/pkg/contexts/ocm/blobhandler/handlers/oci/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package oci contains sub packages for blob handler implementations // for dedicated implementations of the oci go binding interface. package oci diff --git a/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/blobhandler.go index 5ce47f72e7..9eaabfa6bf 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/blobhandler.go +++ b/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/blobhandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocirepo import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/handler_test.go b/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/handler_test.go index 9575571b93..8da5991625 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/handler_test.go +++ b/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/handler_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocirepo_test import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/suite_test.go b/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/suite_test.go index 77d9d62b48..81fba5ba20 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/suite_test.go +++ b/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocirepo_test import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/blobhandler.go index aa03af1148..2c7d2b7d1a 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/blobhandler.go +++ b/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/blobhandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comparch import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/blobhandler_test.go b/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/blobhandler_test.go index 75eca547b5..55048390f9 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/blobhandler_test.go +++ b/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/blobhandler_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comparch_test import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/suite_test.go b/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/suite_test.go index 9ee7edfe70..c8b354bbf6 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/suite_test.go +++ b/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comparch import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/ocm/ctx.go b/pkg/contexts/ocm/blobhandler/handlers/ocm/ctx.go index 8b9e211f5d..b51d3eb63a 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/ocm/ctx.go +++ b/pkg/contexts/ocm/blobhandler/handlers/ocm/ctx.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm import ( diff --git a/pkg/contexts/ocm/blobhandler/handlers/ocm/doc.go b/pkg/contexts/ocm/blobhandler/handlers/ocm/doc.go index 9577eec703..3a8872083d 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/ocm/doc.go +++ b/pkg/contexts/ocm/blobhandler/handlers/ocm/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package ocm contains sub packages for blob handler implementations // for dedicated implementations of the default ocm go binding interface. package ocm diff --git a/pkg/contexts/ocm/blobhandler/interface.go b/pkg/contexts/ocm/blobhandler/interface.go index 30c2bd8c0b..dc3694dc26 100644 --- a/pkg/contexts/ocm/blobhandler/interface.go +++ b/pkg/contexts/ocm/blobhandler/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blobhandler import ( diff --git a/pkg/contexts/ocm/blobhandler/registration.go b/pkg/contexts/ocm/blobhandler/registration.go index 940d0063bc..ca354dd691 100644 --- a/pkg/contexts/ocm/blobhandler/registration.go +++ b/pkg/contexts/ocm/blobhandler/registration.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blobhandler import ( diff --git a/pkg/contexts/ocm/builder.go b/pkg/contexts/ocm/builder.go index ab93ad3bed..6a80b8c0b6 100644 --- a/pkg/contexts/ocm/builder.go +++ b/pkg/contexts/ocm/builder.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm import ( diff --git a/pkg/contexts/ocm/compdesc/codecs.go b/pkg/contexts/ocm/compdesc/codecs.go index 3a7ff5c391..9d977521c0 100644 --- a/pkg/contexts/ocm/compdesc/codecs.go +++ b/pkg/contexts/ocm/compdesc/codecs.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc import ( diff --git a/pkg/contexts/ocm/compdesc/compdesc_test.go b/pkg/contexts/ocm/compdesc/compdesc_test.go index 63efc5aeff..4f80c6c2a2 100644 --- a/pkg/contexts/ocm/compdesc/compdesc_test.go +++ b/pkg/contexts/ocm/compdesc/compdesc_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc_test import ( diff --git a/pkg/contexts/ocm/compdesc/componentdescriptor.go b/pkg/contexts/ocm/compdesc/componentdescriptor.go index b25fe36e61..b35b4d9b6d 100644 --- a/pkg/contexts/ocm/compdesc/componentdescriptor.go +++ b/pkg/contexts/ocm/compdesc/componentdescriptor.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc import ( diff --git a/pkg/contexts/ocm/compdesc/copy_test.go b/pkg/contexts/ocm/compdesc/copy_test.go index 19cf899c8e..33aeb5a54b 100644 --- a/pkg/contexts/ocm/compdesc/copy_test.go +++ b/pkg/contexts/ocm/compdesc/copy_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc_test import ( diff --git a/pkg/contexts/ocm/compdesc/default.go b/pkg/contexts/ocm/compdesc/default.go index 347d8ea312..66a83405d1 100644 --- a/pkg/contexts/ocm/compdesc/default.go +++ b/pkg/contexts/ocm/compdesc/default.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc import ( diff --git a/pkg/contexts/ocm/compdesc/equal.go b/pkg/contexts/ocm/compdesc/equal.go index 8141cd540d..ace1a2b163 100644 --- a/pkg/contexts/ocm/compdesc/equal.go +++ b/pkg/contexts/ocm/compdesc/equal.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc import ( diff --git a/pkg/contexts/ocm/compdesc/equal_test.go b/pkg/contexts/ocm/compdesc/equal_test.go index 78b0a22507..9acf26d466 100644 --- a/pkg/contexts/ocm/compdesc/equal_test.go +++ b/pkg/contexts/ocm/compdesc/equal_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc_test import ( diff --git a/pkg/contexts/ocm/compdesc/equivalent/equal.go b/pkg/contexts/ocm/compdesc/equivalent/equal.go index a0442021e3..4758ad5610 100644 --- a/pkg/contexts/ocm/compdesc/equivalent/equal.go +++ b/pkg/contexts/ocm/compdesc/equivalent/equal.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package equivalent // EqualState describes the equivalence state of elements diff --git a/pkg/contexts/ocm/compdesc/equivalent/testhelper/helper.go b/pkg/contexts/ocm/compdesc/equivalent/testhelper/helper.go index b7278a9afc..a639d72c4d 100644 --- a/pkg/contexts/ocm/compdesc/equivalent/testhelper/helper.go +++ b/pkg/contexts/ocm/compdesc/equivalent/testhelper/helper.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testhelper import ( diff --git a/pkg/contexts/ocm/compdesc/helper.go b/pkg/contexts/ocm/compdesc/helper.go index 1696e87054..9821eec90a 100644 --- a/pkg/contexts/ocm/compdesc/helper.go +++ b/pkg/contexts/ocm/compdesc/helper.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc import ( diff --git a/pkg/contexts/ocm/compdesc/helper_test.go b/pkg/contexts/ocm/compdesc/helper_test.go index 897149f171..6e65664530 100644 --- a/pkg/contexts/ocm/compdesc/helper_test.go +++ b/pkg/contexts/ocm/compdesc/helper_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc_test import ( diff --git a/pkg/contexts/ocm/compdesc/init.go b/pkg/contexts/ocm/compdesc/init.go index 648f4bce3b..8bb239f404 100644 --- a/pkg/contexts/ocm/compdesc/init.go +++ b/pkg/contexts/ocm/compdesc/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc import ( diff --git a/pkg/contexts/ocm/compdesc/logging.go b/pkg/contexts/ocm/compdesc/logging.go index fa6c3bc5c7..ea3a6b56e4 100644 --- a/pkg/contexts/ocm/compdesc/logging.go +++ b/pkg/contexts/ocm/compdesc/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc import ( diff --git a/pkg/contexts/ocm/compdesc/logging_test.go b/pkg/contexts/ocm/compdesc/logging_test.go index fe9f6767c0..71d7a2d2c2 100644 --- a/pkg/contexts/ocm/compdesc/logging_test.go +++ b/pkg/contexts/ocm/compdesc/logging_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc_test import ( diff --git a/pkg/contexts/ocm/compdesc/meta.go b/pkg/contexts/ocm/compdesc/meta.go index 9dfddd7ae4..e98f6961de 100644 --- a/pkg/contexts/ocm/compdesc/meta.go +++ b/pkg/contexts/ocm/compdesc/meta.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc import ( diff --git a/pkg/contexts/ocm/compdesc/meta/v1/identity.go b/pkg/contexts/ocm/compdesc/meta/v1/identity.go index ebd78de5a2..efcd5e319c 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/identity.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/identity.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v1 import ( diff --git a/pkg/contexts/ocm/compdesc/meta/v1/identity_test.go b/pkg/contexts/ocm/compdesc/meta/v1/identity_test.go index a44ed3933e..16538a8e29 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/identity_test.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/identity_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v1_test import ( diff --git a/pkg/contexts/ocm/compdesc/meta/v1/labels.go b/pkg/contexts/ocm/compdesc/meta/v1/labels.go index 7e02175288..beba56a072 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/labels.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/labels.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v1 import ( diff --git a/pkg/contexts/ocm/compdesc/meta/v1/labels_test.go b/pkg/contexts/ocm/compdesc/meta/v1/labels_test.go index d8ac61f80f..24478a2302 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/labels_test.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/labels_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v1_test import ( diff --git a/pkg/contexts/ocm/compdesc/meta/v1/resourceref.go b/pkg/contexts/ocm/compdesc/meta/v1/resourceref.go index 4fd557a076..4630ecfab3 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/resourceref.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/resourceref.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v1 // ResourceReference describes re resource identity relative to an (aggregation) diff --git a/pkg/contexts/ocm/compdesc/meta/v1/signature.go b/pkg/contexts/ocm/compdesc/meta/v1/signature.go index 1f53e55cd1..734a9ba381 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/signature.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/signature.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v1 import ( diff --git a/pkg/contexts/ocm/compdesc/meta/v1/stringmap.go b/pkg/contexts/ocm/compdesc/meta/v1/stringmap.go index c9a2a257c0..f48d6ab47a 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/stringmap.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/stringmap.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v1 type StringMap map[string]string diff --git a/pkg/contexts/ocm/compdesc/meta/v1/suite_test.go b/pkg/contexts/ocm/compdesc/meta/v1/suite_test.go index dd8a4460ad..62255595a1 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/suite_test.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v1_test import ( diff --git a/pkg/contexts/ocm/compdesc/meta/v1/types.go b/pkg/contexts/ocm/compdesc/meta/v1/types.go index 863f1167a6..a6e5055da1 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/types.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/types.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v1 import ( diff --git a/pkg/contexts/ocm/compdesc/meta/v1/types_test.go b/pkg/contexts/ocm/compdesc/meta/v1/types_test.go index 4e6179d2da..1693b79c0e 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/types_test.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/types_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v1_test import ( diff --git a/pkg/contexts/ocm/compdesc/meta/v1/utils.go b/pkg/contexts/ocm/compdesc/meta/v1/utils.go index 871312b0c1..0451f17b4d 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/utils.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v1 import ( diff --git a/pkg/contexts/ocm/compdesc/meta/v1/zz_generated.deepcopy.go b/pkg/contexts/ocm/compdesc/meta/v1/zz_generated.deepcopy.go index bd3d75bd51..8947d54acb 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/zz_generated.deepcopy.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/zz_generated.deepcopy.go @@ -1,9 +1,5 @@ //go:build !ignore_autogenerated -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Code generated by controller-gen. DO NOT EDIT. package v1 diff --git a/pkg/contexts/ocm/compdesc/none.go b/pkg/contexts/ocm/compdesc/none.go index 2d232fb4a9..2138407d07 100644 --- a/pkg/contexts/ocm/compdesc/none.go +++ b/pkg/contexts/ocm/compdesc/none.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc // Type is the access type for no blob. diff --git a/pkg/contexts/ocm/compdesc/norm_test.go b/pkg/contexts/ocm/compdesc/norm_test.go index f5f8a8b0d2..a0a7d4547d 100644 --- a/pkg/contexts/ocm/compdesc/norm_test.go +++ b/pkg/contexts/ocm/compdesc/norm_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc_test import ( diff --git a/pkg/contexts/ocm/compdesc/normalization.go b/pkg/contexts/ocm/compdesc/normalization.go index d559fe5f80..34bd6aacd2 100644 --- a/pkg/contexts/ocm/compdesc/normalization.go +++ b/pkg/contexts/ocm/compdesc/normalization.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc import ( diff --git a/pkg/contexts/ocm/compdesc/normalizations/init.go b/pkg/contexts/ocm/compdesc/normalizations/init.go index eb17684ac2..1cd917a1a1 100644 --- a/pkg/contexts/ocm/compdesc/normalizations/init.go +++ b/pkg/contexts/ocm/compdesc/normalizations/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package versions import ( diff --git a/pkg/contexts/ocm/compdesc/normalizations/jsonv1/norm.go b/pkg/contexts/ocm/compdesc/normalizations/jsonv1/norm.go index f79d4dd712..73c86518fe 100644 --- a/pkg/contexts/ocm/compdesc/normalizations/jsonv1/norm.go +++ b/pkg/contexts/ocm/compdesc/normalizations/jsonv1/norm.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package jsonv1 provides a normalization which uses schema specific // normalizations. // It creates the requested schema for the component descriptor diff --git a/pkg/contexts/ocm/compdesc/normalizations/jsonv2/norm.go b/pkg/contexts/ocm/compdesc/normalizations/jsonv2/norm.go index d450f4e10d..67f8809903 100644 --- a/pkg/contexts/ocm/compdesc/normalizations/jsonv2/norm.go +++ b/pkg/contexts/ocm/compdesc/normalizations/jsonv2/norm.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package jsonv2 provides a normalization which is completely based on the // abstract (internal) version of the component descriptor and is therefore // agnostic of the final serialization format. Signatures using this algorithm diff --git a/pkg/contexts/ocm/compdesc/normalizations/rules/compdescrules.go b/pkg/contexts/ocm/compdesc/normalizations/rules/compdescrules.go index c3749da87d..75253e0da8 100644 --- a/pkg/contexts/ocm/compdesc/normalizations/rules/compdescrules.go +++ b/pkg/contexts/ocm/compdesc/normalizations/rules/compdescrules.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rules import ( diff --git a/pkg/contexts/ocm/compdesc/op.go b/pkg/contexts/ocm/compdesc/op.go index b1e1e59325..2e83178f58 100644 --- a/pkg/contexts/ocm/compdesc/op.go +++ b/pkg/contexts/ocm/compdesc/op.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc import ( diff --git a/pkg/contexts/ocm/compdesc/schemes.go b/pkg/contexts/ocm/compdesc/schemes.go index 9ecebd43e1..c38f2a74ba 100644 --- a/pkg/contexts/ocm/compdesc/schemes.go +++ b/pkg/contexts/ocm/compdesc/schemes.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc import ( diff --git a/pkg/contexts/ocm/compdesc/selectors.go b/pkg/contexts/ocm/compdesc/selectors.go index dbc95be427..81c6f60988 100644 --- a/pkg/contexts/ocm/compdesc/selectors.go +++ b/pkg/contexts/ocm/compdesc/selectors.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc import ( diff --git a/pkg/contexts/ocm/compdesc/signing.go b/pkg/contexts/ocm/compdesc/signing.go index 6ce41e7b90..f21ccedc5a 100644 --- a/pkg/contexts/ocm/compdesc/signing.go +++ b/pkg/contexts/ocm/compdesc/signing.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc import ( diff --git a/pkg/contexts/ocm/compdesc/suite_test.go b/pkg/contexts/ocm/compdesc/suite_test.go index 65a7ccca0e..3dc2c54026 100644 --- a/pkg/contexts/ocm/compdesc/suite_test.go +++ b/pkg/contexts/ocm/compdesc/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc_test import ( diff --git a/pkg/contexts/ocm/compdesc/testutils/compnametest.go b/pkg/contexts/ocm/compdesc/testutils/compnametest.go index b0f4f5c34a..0c6fdff42d 100644 --- a/pkg/contexts/ocm/compdesc/testutils/compnametest.go +++ b/pkg/contexts/ocm/compdesc/testutils/compnametest.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testutils import ( diff --git a/pkg/contexts/ocm/compdesc/util.go b/pkg/contexts/ocm/compdesc/util.go index bfb68b0bb8..96421afb38 100644 --- a/pkg/contexts/ocm/compdesc/util.go +++ b/pkg/contexts/ocm/compdesc/util.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compdesc type conversionError struct { diff --git a/pkg/contexts/ocm/compdesc/versions/init.go b/pkg/contexts/ocm/compdesc/versions/init.go index 039dbbe407..bc607a7972 100644 --- a/pkg/contexts/ocm/compdesc/versions/init.go +++ b/pkg/contexts/ocm/compdesc/versions/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package versions import ( diff --git a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/componentdescriptor.go b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/componentdescriptor.go index 50cc3e5ff8..1b8fcb9397 100644 --- a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/componentdescriptor.go +++ b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/componentdescriptor.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v3alpha1 import ( diff --git a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/default.go b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/default.go index 6487824d61..9534ce1f93 100644 --- a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/default.go +++ b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/default.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v3alpha1 import ( diff --git a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/jsonscheme/jsonscheme.go b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/jsonscheme/jsonscheme.go index 01268b2347..707e175734 100644 --- a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/jsonscheme/jsonscheme.go +++ b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/jsonscheme/jsonscheme.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:generate go-bindata -nometadata -pkg jsonscheme ../../../../../../../../resources/component-descriptor-ocm-v3-schema.yaml //go:generate gofmt -s -w bindata.go diff --git a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/signing.go b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/signing.go index bb2b51be83..652621fb31 100644 --- a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/signing.go +++ b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/signing.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v3alpha1 import ( diff --git a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/validation.go b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/validation.go index e727264521..d0a3d81a23 100644 --- a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/validation.go +++ b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/validation.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v3alpha1 import ( diff --git a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/validation_test.go b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/validation_test.go index eaf67dec5a..c466a3cfbf 100644 --- a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/validation_test.go +++ b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/validation_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v3alpha1_test import ( diff --git a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/version.go b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/version.go index 5da06f3ece..c56c80095d 100644 --- a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/version.go +++ b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/version.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v3alpha1 import ( diff --git a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/zz_generated.deepcopy.go b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/zz_generated.deepcopy.go index 6a7a920bdb..7d13ee1ff9 100644 --- a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/zz_generated.deepcopy.go +++ b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/zz_generated.deepcopy.go @@ -1,9 +1,5 @@ //go:build !ignore_autogenerated -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Code generated by controller-gen. DO NOT EDIT. package v3alpha1 diff --git a/pkg/contexts/ocm/compdesc/versions/v2/componentdescriptor.go b/pkg/contexts/ocm/compdesc/versions/v2/componentdescriptor.go index 7b00c325e6..e738959991 100644 --- a/pkg/contexts/ocm/compdesc/versions/v2/componentdescriptor.go +++ b/pkg/contexts/ocm/compdesc/versions/v2/componentdescriptor.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v2 import ( diff --git a/pkg/contexts/ocm/compdesc/versions/v2/default.go b/pkg/contexts/ocm/compdesc/versions/v2/default.go index a899a6b757..4c2c0e1135 100644 --- a/pkg/contexts/ocm/compdesc/versions/v2/default.go +++ b/pkg/contexts/ocm/compdesc/versions/v2/default.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v2 import ( diff --git a/pkg/contexts/ocm/compdesc/versions/v2/jsonscheme/jsonscheme.go b/pkg/contexts/ocm/compdesc/versions/v2/jsonscheme/jsonscheme.go index ef6a412b8a..e7130320ca 100644 --- a/pkg/contexts/ocm/compdesc/versions/v2/jsonscheme/jsonscheme.go +++ b/pkg/contexts/ocm/compdesc/versions/v2/jsonscheme/jsonscheme.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:generate go-bindata -nometadata -pkg jsonscheme ../../../../../../../resources/component-descriptor-v2-schema.yaml //go:generate gofmt -s -w bindata.go diff --git a/pkg/contexts/ocm/compdesc/versions/v2/signing.go b/pkg/contexts/ocm/compdesc/versions/v2/signing.go index bc581ab007..f545a5808a 100644 --- a/pkg/contexts/ocm/compdesc/versions/v2/signing.go +++ b/pkg/contexts/ocm/compdesc/versions/v2/signing.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v2 import ( diff --git a/pkg/contexts/ocm/compdesc/versions/v2/validation.go b/pkg/contexts/ocm/compdesc/versions/v2/validation.go index 9a20e6aff9..f788b8ef21 100644 --- a/pkg/contexts/ocm/compdesc/versions/v2/validation.go +++ b/pkg/contexts/ocm/compdesc/versions/v2/validation.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v2 import ( diff --git a/pkg/contexts/ocm/compdesc/versions/v2/validation_test.go b/pkg/contexts/ocm/compdesc/versions/v2/validation_test.go index 84238a78cd..63d61279a7 100644 --- a/pkg/contexts/ocm/compdesc/versions/v2/validation_test.go +++ b/pkg/contexts/ocm/compdesc/versions/v2/validation_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v2_test import ( diff --git a/pkg/contexts/ocm/compdesc/versions/v2/version.go b/pkg/contexts/ocm/compdesc/versions/v2/version.go index e980f8171c..eb3ff15998 100644 --- a/pkg/contexts/ocm/compdesc/versions/v2/version.go +++ b/pkg/contexts/ocm/compdesc/versions/v2/version.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package v2 import ( diff --git a/pkg/contexts/ocm/compdesc/versions/v2/zz_generated.deepcopy.go b/pkg/contexts/ocm/compdesc/versions/v2/zz_generated.deepcopy.go index bd66eac0f6..da32ccf2e8 100644 --- a/pkg/contexts/ocm/compdesc/versions/v2/zz_generated.deepcopy.go +++ b/pkg/contexts/ocm/compdesc/versions/v2/zz_generated.deepcopy.go @@ -1,9 +1,5 @@ //go:build !ignore_autogenerated -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Code generated by controller-gen. DO NOT EDIT. package v2 diff --git a/pkg/contexts/ocm/config/config_test.go b/pkg/contexts/ocm/config/config_test.go index 4223801bfa..f6ecfc444d 100644 --- a/pkg/contexts/ocm/config/config_test.go +++ b/pkg/contexts/ocm/config/config_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/ocm/config/suite_test.go b/pkg/contexts/ocm/config/suite_test.go index 444820e824..75de586aa0 100644 --- a/pkg/contexts/ocm/config/suite_test.go +++ b/pkg/contexts/ocm/config/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/ocm/config/type.go b/pkg/contexts/ocm/config/type.go index 6d377bd10b..4e69d689da 100644 --- a/pkg/contexts/ocm/config/type.go +++ b/pkg/contexts/ocm/config/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/ocm/consts/extra_identities.go b/pkg/contexts/ocm/consts/extra_identities.go index 870435f0f4..dbb35a4224 100644 --- a/pkg/contexts/ocm/consts/extra_identities.go +++ b/pkg/contexts/ocm/consts/extra_identities.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package consts import ( diff --git a/pkg/contexts/ocm/context/interface.go b/pkg/contexts/ocm/context/interface.go index 09a4dc0b80..1448b63251 100644 --- a/pkg/contexts/ocm/context/interface.go +++ b/pkg/contexts/ocm/context/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package context import ( diff --git a/pkg/contexts/ocm/cpi/accspeccpi/accessspec_options.go b/pkg/contexts/ocm/cpi/accspeccpi/accessspec_options.go index 2864a76114..e9d2cd6132 100644 --- a/pkg/contexts/ocm/cpi/accspeccpi/accessspec_options.go +++ b/pkg/contexts/ocm/cpi/accspeccpi/accessspec_options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accspeccpi import ( diff --git a/pkg/contexts/ocm/cpi/accspeccpi/accesstypes.go b/pkg/contexts/ocm/cpi/accspeccpi/accesstypes.go index 373305745e..21454dffc6 100644 --- a/pkg/contexts/ocm/cpi/accspeccpi/accesstypes.go +++ b/pkg/contexts/ocm/cpi/accspeccpi/accesstypes.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accspeccpi import ( diff --git a/pkg/contexts/ocm/cpi/accspeccpi/interface.go b/pkg/contexts/ocm/cpi/accspeccpi/interface.go index 26b93d58fd..3e541635d3 100644 --- a/pkg/contexts/ocm/cpi/accspeccpi/interface.go +++ b/pkg/contexts/ocm/cpi/accspeccpi/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accspeccpi import ( diff --git a/pkg/contexts/ocm/cpi/accspeccpi/method.go b/pkg/contexts/ocm/cpi/accspeccpi/method.go index 9ed12fd139..ed4de33991 100644 --- a/pkg/contexts/ocm/cpi/accspeccpi/method.go +++ b/pkg/contexts/ocm/cpi/accspeccpi/method.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accspeccpi import ( diff --git a/pkg/contexts/ocm/cpi/accspeccpi/methodview.go b/pkg/contexts/ocm/cpi/accspeccpi/methodview.go index 072773696b..27d5ce9488 100644 --- a/pkg/contexts/ocm/cpi/accspeccpi/methodview.go +++ b/pkg/contexts/ocm/cpi/accspeccpi/methodview.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accspeccpi import ( diff --git a/pkg/contexts/ocm/cpi/compose_test.go b/pkg/contexts/ocm/cpi/compose_test.go index 538c6d5c29..d95194395d 100644 --- a/pkg/contexts/ocm/cpi/compose_test.go +++ b/pkg/contexts/ocm/cpi/compose_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi_test import ( diff --git a/pkg/contexts/ocm/cpi/dummy.go b/pkg/contexts/ocm/cpi/dummy.go index 1e8856b7ca..ef5422b6ba 100644 --- a/pkg/contexts/ocm/cpi/dummy.go +++ b/pkg/contexts/ocm/cpi/dummy.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/ocm/cpi/interface.go b/pkg/contexts/ocm/cpi/interface.go index c17344ad3a..16ea177f7f 100644 --- a/pkg/contexts/ocm/cpi/interface.go +++ b/pkg/contexts/ocm/cpi/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi // This is the Context Provider Interface for credential providers diff --git a/pkg/contexts/ocm/cpi/logging.go b/pkg/contexts/ocm/cpi/logging.go index 7188156da1..57d55024e5 100644 --- a/pkg/contexts/ocm/cpi/logging.go +++ b/pkg/contexts/ocm/cpi/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/ocm/cpi/modopts.go b/pkg/contexts/ocm/cpi/modopts.go index 5b5773f4df..4a768f75a9 100644 --- a/pkg/contexts/ocm/cpi/modopts.go +++ b/pkg/contexts/ocm/cpi/modopts.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/ocm/cpi/ref.go b/pkg/contexts/ocm/cpi/ref.go index b429687b44..c281602374 100644 --- a/pkg/contexts/ocm/cpi/ref.go +++ b/pkg/contexts/ocm/cpi/ref.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/ocm/cpi/repocpi/backend.go b/pkg/contexts/ocm/cpi/repocpi/backend.go index 5b03d33e97..52a4ea982f 100644 --- a/pkg/contexts/ocm/cpi/repocpi/backend.go +++ b/pkg/contexts/ocm/cpi/repocpi/backend.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package repocpi import ( diff --git a/pkg/contexts/ocm/cpi/repocpi/blobcache.go b/pkg/contexts/ocm/cpi/repocpi/blobcache.go index b324c97bd1..3b6881c139 100644 --- a/pkg/contexts/ocm/cpi/repocpi/blobcache.go +++ b/pkg/contexts/ocm/cpi/repocpi/blobcache.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package repocpi import ( diff --git a/pkg/contexts/ocm/cpi/repocpi/bridge_c.go b/pkg/contexts/ocm/cpi/repocpi/bridge_c.go index c552832888..c3508e643a 100644 --- a/pkg/contexts/ocm/cpi/repocpi/bridge_c.go +++ b/pkg/contexts/ocm/cpi/repocpi/bridge_c.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package repocpi import ( diff --git a/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go b/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go index b50611bb05..1cf9eaf2ac 100644 --- a/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go +++ b/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package repocpi import ( diff --git a/pkg/contexts/ocm/cpi/repocpi/bridge_r.go b/pkg/contexts/ocm/cpi/repocpi/bridge_r.go index c59a39fd3b..1fa0f87ce8 100644 --- a/pkg/contexts/ocm/cpi/repocpi/bridge_r.go +++ b/pkg/contexts/ocm/cpi/repocpi/bridge_r.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package repocpi import ( diff --git a/pkg/contexts/ocm/cpi/repocpi/doc.go b/pkg/contexts/ocm/cpi/repocpi/doc.go index 017ad14993..cecff6a738 100644 --- a/pkg/contexts/ocm/cpi/repocpi/doc.go +++ b/pkg/contexts/ocm/cpi/repocpi/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package repocpi contains the implementation support // for repository backends. It offers three methods // to create component version, component and repository diff --git a/pkg/contexts/ocm/cpi/repocpi/helperinterfaces.go b/pkg/contexts/ocm/cpi/repocpi/helperinterfaces.go index aec5b364f0..4322bf2bd7 100644 --- a/pkg/contexts/ocm/cpi/repocpi/helperinterfaces.go +++ b/pkg/contexts/ocm/cpi/repocpi/helperinterfaces.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package repocpi import ( diff --git a/pkg/contexts/ocm/cpi/repocpi/view_c.go b/pkg/contexts/ocm/cpi/repocpi/view_c.go index fa6678c1a7..6bd46e2ec9 100644 --- a/pkg/contexts/ocm/cpi/repocpi/view_c.go +++ b/pkg/contexts/ocm/cpi/repocpi/view_c.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package repocpi import ( diff --git a/pkg/contexts/ocm/cpi/repocpi/view_cv.go b/pkg/contexts/ocm/cpi/repocpi/view_cv.go index 76b4bbe02e..45ea3c3518 100644 --- a/pkg/contexts/ocm/cpi/repocpi/view_cv.go +++ b/pkg/contexts/ocm/cpi/repocpi/view_cv.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package repocpi import ( diff --git a/pkg/contexts/ocm/cpi/repocpi/view_r.go b/pkg/contexts/ocm/cpi/repocpi/view_r.go index a1fcfcbde5..b1eb6af885 100644 --- a/pkg/contexts/ocm/cpi/repocpi/view_r.go +++ b/pkg/contexts/ocm/cpi/repocpi/view_r.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package repocpi import ( diff --git a/pkg/contexts/ocm/cpi/repotypes.go b/pkg/contexts/ocm/cpi/repotypes.go index cc51b8a3b5..8ac6d6f836 100644 --- a/pkg/contexts/ocm/cpi/repotypes.go +++ b/pkg/contexts/ocm/cpi/repotypes.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi // this file is similar to contexts oci. diff --git a/pkg/contexts/ocm/cpi/storagectx.go b/pkg/contexts/ocm/cpi/storagectx.go index e03c46f0d0..9a7e7e7b1b 100644 --- a/pkg/contexts/ocm/cpi/storagectx.go +++ b/pkg/contexts/ocm/cpi/storagectx.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi type DefaultStorageContext struct { diff --git a/pkg/contexts/ocm/cpi/suite_test.go b/pkg/contexts/ocm/cpi/suite_test.go index 7fc7504c2f..15a86283a4 100644 --- a/pkg/contexts/ocm/cpi/suite_test.go +++ b/pkg/contexts/ocm/cpi/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi_test import ( diff --git a/pkg/contexts/ocm/cpi/utils.go b/pkg/contexts/ocm/cpi/utils.go index 76efc5d380..62a71fcfdc 100644 --- a/pkg/contexts/ocm/cpi/utils.go +++ b/pkg/contexts/ocm/cpi/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/ocm/cpi/view_rsc.go b/pkg/contexts/ocm/cpi/view_rsc.go index a88c2a5f40..3e451581e9 100644 --- a/pkg/contexts/ocm/cpi/view_rsc.go +++ b/pkg/contexts/ocm/cpi/view_rsc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cpi import ( diff --git a/pkg/contexts/ocm/digester/digesters/artifact/digester.go b/pkg/contexts/ocm/digester/digesters/artifact/digester.go index 0ad12fb71a..ca576bc622 100644 --- a/pkg/contexts/ocm/digester/digesters/artifact/digester.go +++ b/pkg/contexts/ocm/digester/digesters/artifact/digester.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package artifact import ( diff --git a/pkg/contexts/ocm/digester/digesters/blob/digester.go b/pkg/contexts/ocm/digester/digesters/blob/digester.go index 80b20fbc5d..ec9f64469e 100644 --- a/pkg/contexts/ocm/digester/digesters/blob/digester.go +++ b/pkg/contexts/ocm/digester/digesters/blob/digester.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blob import ( diff --git a/pkg/contexts/ocm/digester/digesters/init.go b/pkg/contexts/ocm/digester/digesters/init.go index 74ccdccdb6..bdd5ed2f47 100644 --- a/pkg/contexts/ocm/digester/digesters/init.go +++ b/pkg/contexts/ocm/digester/digesters/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package digesters import ( diff --git a/pkg/contexts/ocm/download/config/type.go b/pkg/contexts/ocm/download/config/type.go index 5c19e89870..eb75cdd5b8 100644 --- a/pkg/contexts/ocm/download/config/type.go +++ b/pkg/contexts/ocm/download/config/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/ocm/download/doc.go b/pkg/contexts/ocm/download/doc.go index 999c865bec..601947e86c 100644 --- a/pkg/contexts/ocm/download/doc.go +++ b/pkg/contexts/ocm/download/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package download provides an API for resource download handlers. // A download handler is used for downloading resoures. By default the native // blob as provided by the access method is the resukt of a download. diff --git a/pkg/contexts/ocm/download/download.go b/pkg/contexts/ocm/download/download.go index accd538b9d..595590a66a 100644 --- a/pkg/contexts/ocm/download/download.go +++ b/pkg/contexts/ocm/download/download.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download import ( diff --git a/pkg/contexts/ocm/download/handlers/blob/handler.go b/pkg/contexts/ocm/download/handlers/blob/handler.go index 20f54c1d26..bc71026618 100644 --- a/pkg/contexts/ocm/download/handlers/blob/handler.go +++ b/pkg/contexts/ocm/download/handlers/blob/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blob import ( diff --git a/pkg/contexts/ocm/download/handlers/blueprint/blueprint_test.go b/pkg/contexts/ocm/download/handlers/blueprint/blueprint_test.go index 64f39d3aac..82c5caba90 100644 --- a/pkg/contexts/ocm/download/handlers/blueprint/blueprint_test.go +++ b/pkg/contexts/ocm/download/handlers/blueprint/blueprint_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blueprint_test import ( diff --git a/pkg/contexts/ocm/download/handlers/blueprint/extractor.go b/pkg/contexts/ocm/download/handlers/blueprint/extractor.go index 12f2d3b437..7b37837f48 100644 --- a/pkg/contexts/ocm/download/handlers/blueprint/extractor.go +++ b/pkg/contexts/ocm/download/handlers/blueprint/extractor.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blueprint import ( diff --git a/pkg/contexts/ocm/download/handlers/blueprint/handler.go b/pkg/contexts/ocm/download/handlers/blueprint/handler.go index f6ccb40d16..4ff1cd2bcd 100644 --- a/pkg/contexts/ocm/download/handlers/blueprint/handler.go +++ b/pkg/contexts/ocm/download/handlers/blueprint/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blueprint import ( diff --git a/pkg/contexts/ocm/download/handlers/blueprint/registration.go b/pkg/contexts/ocm/download/handlers/blueprint/registration.go index cfd4168e63..1bf5c3318a 100644 --- a/pkg/contexts/ocm/download/handlers/blueprint/registration.go +++ b/pkg/contexts/ocm/download/handlers/blueprint/registration.go @@ -1,6 +1,3 @@ -// // SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// // -// // SPDX-License-Identifier: Apache-2.0 package blueprint import ( diff --git a/pkg/contexts/ocm/download/handlers/blueprint/registration_test.go b/pkg/contexts/ocm/download/handlers/blueprint/registration_test.go index 69e672e367..464f7edac1 100644 --- a/pkg/contexts/ocm/download/handlers/blueprint/registration_test.go +++ b/pkg/contexts/ocm/download/handlers/blueprint/registration_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blueprint_test import ( diff --git a/pkg/contexts/ocm/download/handlers/blueprint/suite_test.go b/pkg/contexts/ocm/download/handlers/blueprint/suite_test.go index 265023d37d..38ef89b0fa 100644 --- a/pkg/contexts/ocm/download/handlers/blueprint/suite_test.go +++ b/pkg/contexts/ocm/download/handlers/blueprint/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package blueprint_test import ( diff --git a/pkg/contexts/ocm/download/handlers/dirtree/dirtree_test.go b/pkg/contexts/ocm/download/handlers/dirtree/dirtree_test.go index e6467272a1..6e2a662be0 100644 --- a/pkg/contexts/ocm/download/handlers/dirtree/dirtree_test.go +++ b/pkg/contexts/ocm/download/handlers/dirtree/dirtree_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtree_test import ( diff --git a/pkg/contexts/ocm/download/handlers/dirtree/handler.go b/pkg/contexts/ocm/download/handlers/dirtree/handler.go index cf061277eb..c6e766372f 100644 --- a/pkg/contexts/ocm/download/handlers/dirtree/handler.go +++ b/pkg/contexts/ocm/download/handlers/dirtree/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtree import ( diff --git a/pkg/contexts/ocm/download/handlers/dirtree/registration.go b/pkg/contexts/ocm/download/handlers/dirtree/registration.go index 68240b74f8..6748bac475 100644 --- a/pkg/contexts/ocm/download/handlers/dirtree/registration.go +++ b/pkg/contexts/ocm/download/handlers/dirtree/registration.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtree import ( diff --git a/pkg/contexts/ocm/download/handlers/dirtree/registration_test.go b/pkg/contexts/ocm/download/handlers/dirtree/registration_test.go index 8edcaaa0e3..ebda2ed63c 100644 --- a/pkg/contexts/ocm/download/handlers/dirtree/registration_test.go +++ b/pkg/contexts/ocm/download/handlers/dirtree/registration_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtree_test import ( diff --git a/pkg/contexts/ocm/download/handlers/dirtree/suite_test.go b/pkg/contexts/ocm/download/handlers/dirtree/suite_test.go index 9327c8368f..5e5322096b 100644 --- a/pkg/contexts/ocm/download/handlers/dirtree/suite_test.go +++ b/pkg/contexts/ocm/download/handlers/dirtree/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtree_test import ( diff --git a/pkg/contexts/ocm/download/handlers/executable/handler.go b/pkg/contexts/ocm/download/handlers/executable/handler.go index 86d3cff70e..5cb93ab340 100644 --- a/pkg/contexts/ocm/download/handlers/executable/handler.go +++ b/pkg/contexts/ocm/download/handlers/executable/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package executable import ( diff --git a/pkg/contexts/ocm/download/handlers/helm/download.go b/pkg/contexts/ocm/download/handlers/helm/download.go index 3f267242da..480e7ddbce 100644 --- a/pkg/contexts/ocm/download/handlers/helm/download.go +++ b/pkg/contexts/ocm/download/handlers/helm/download.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/pkg/contexts/ocm/download/handlers/helm/handler.go b/pkg/contexts/ocm/download/handlers/helm/handler.go index 15524f88ef..cc190dccb3 100644 --- a/pkg/contexts/ocm/download/handlers/helm/handler.go +++ b/pkg/contexts/ocm/download/handlers/helm/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/pkg/contexts/ocm/download/handlers/init.go b/pkg/contexts/ocm/download/handlers/init.go index daaf062dbd..63eb3f4b79 100644 --- a/pkg/contexts/ocm/download/handlers/init.go +++ b/pkg/contexts/ocm/download/handlers/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package handlers import ( diff --git a/pkg/contexts/ocm/download/handlers/ocirepo/handler.go b/pkg/contexts/ocm/download/handlers/ocirepo/handler.go index c72ee5467d..db2f44e55f 100644 --- a/pkg/contexts/ocm/download/handlers/ocirepo/handler.go +++ b/pkg/contexts/ocm/download/handlers/ocirepo/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocirepo import ( diff --git a/pkg/contexts/ocm/download/handlers/ocirepo/registration.go b/pkg/contexts/ocm/download/handlers/ocirepo/registration.go index e9f25f8d11..a98e1930ff 100644 --- a/pkg/contexts/ocm/download/handlers/ocirepo/registration.go +++ b/pkg/contexts/ocm/download/handlers/ocirepo/registration.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocirepo import ( diff --git a/pkg/contexts/ocm/download/handlers/ocirepo/suite_test.go b/pkg/contexts/ocm/download/handlers/ocirepo/suite_test.go index ced21e0d31..c855a66282 100644 --- a/pkg/contexts/ocm/download/handlers/ocirepo/suite_test.go +++ b/pkg/contexts/ocm/download/handlers/ocirepo/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocirepo_test import ( diff --git a/pkg/contexts/ocm/download/handlers/ocirepo/upload_test.go b/pkg/contexts/ocm/download/handlers/ocirepo/upload_test.go index 5f85cd7fee..93a3ea1a0d 100644 --- a/pkg/contexts/ocm/download/handlers/ocirepo/upload_test.go +++ b/pkg/contexts/ocm/download/handlers/ocirepo/upload_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocirepo_test import ( diff --git a/pkg/contexts/ocm/download/handlers/plugin/download_test.go b/pkg/contexts/ocm/download/handlers/plugin/download_test.go index 91fa22bf4a..60e9c3c91f 100644 --- a/pkg/contexts/ocm/download/handlers/plugin/download_test.go +++ b/pkg/contexts/ocm/download/handlers/plugin/download_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:build unix package plugin_test diff --git a/pkg/contexts/ocm/download/handlers/plugin/handler.go b/pkg/contexts/ocm/download/handlers/plugin/handler.go index 8d5790020d..87295cfc77 100644 --- a/pkg/contexts/ocm/download/handlers/plugin/handler.go +++ b/pkg/contexts/ocm/download/handlers/plugin/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/download/handlers/plugin/registration.go b/pkg/contexts/ocm/download/handlers/plugin/registration.go index ea3609054a..7442d5570c 100644 --- a/pkg/contexts/ocm/download/handlers/plugin/registration.go +++ b/pkg/contexts/ocm/download/handlers/plugin/registration.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/download/handlers/plugin/suite_test.go b/pkg/contexts/ocm/download/handlers/plugin/suite_test.go index 8ac9d1af25..736f0d3f64 100644 --- a/pkg/contexts/ocm/download/handlers/plugin/suite_test.go +++ b/pkg/contexts/ocm/download/handlers/plugin/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin_test import ( diff --git a/pkg/contexts/ocm/download/handlers/plugin/testdata/test b/pkg/contexts/ocm/download/handlers/plugin/testdata/test index 71994dc42b..6ad81e0714 100755 --- a/pkg/contexts/ocm/download/handlers/plugin/testdata/test +++ b/pkg/contexts/ocm/download/handlers/plugin/testdata/test @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" Error() { diff --git a/pkg/contexts/ocm/download/logging.go b/pkg/contexts/ocm/download/logging.go index 7f855b2edf..a0f17ad5e1 100644 --- a/pkg/contexts/ocm/download/logging.go +++ b/pkg/contexts/ocm/download/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download import ( diff --git a/pkg/contexts/ocm/download/registration.go b/pkg/contexts/ocm/download/registration.go index 55f08c0732..adcb6ea3d0 100644 --- a/pkg/contexts/ocm/download/registration.go +++ b/pkg/contexts/ocm/download/registration.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download import ( diff --git a/pkg/contexts/ocm/download/registry.go b/pkg/contexts/ocm/download/registry.go index db4faac43d..a1abd91233 100644 --- a/pkg/contexts/ocm/download/registry.go +++ b/pkg/contexts/ocm/download/registry.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download import ( diff --git a/pkg/contexts/ocm/download/setup.go b/pkg/contexts/ocm/download/setup.go index 5c7c2a1f27..7d83a00e22 100644 --- a/pkg/contexts/ocm/download/setup.go +++ b/pkg/contexts/ocm/download/setup.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download import ( diff --git a/pkg/contexts/ocm/elements/artifactaccess/doc.go b/pkg/contexts/ocm/elements/artifactaccess/doc.go index 4dfede7159..43b8d0a456 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/doc.go +++ b/pkg/contexts/ocm/elements/artifactaccess/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package artifactaccess hosts packages for // ResourceAccess and SourceAccess builders used to add // resources and sources referring to content in other repositories diff --git a/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource.go b/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource.go index 6e7f8ad42b..6831d29aa4 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource.go +++ b/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericaccess import ( diff --git a/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource_test.go b/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource_test.go index ad960184f5..5ab081a54d 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource_test.go +++ b/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericaccess_test import ( diff --git a/pkg/contexts/ocm/elements/artifactaccess/genericaccess/suite_test.go b/pkg/contexts/ocm/elements/artifactaccess/genericaccess/suite_test.go index ccc913db65..38b3a2f983 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/genericaccess/suite_test.go +++ b/pkg/contexts/ocm/elements/artifactaccess/genericaccess/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericaccess_test import ( diff --git a/pkg/contexts/ocm/elements/artifactaccess/githubaccess/options.go b/pkg/contexts/ocm/elements/artifactaccess/githubaccess/options.go index 0bb2cdc825..4b8a5ad480 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/githubaccess/options.go +++ b/pkg/contexts/ocm/elements/artifactaccess/githubaccess/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package githubaccess import ( diff --git a/pkg/contexts/ocm/elements/artifactaccess/githubaccess/resource.go b/pkg/contexts/ocm/elements/artifactaccess/githubaccess/resource.go index 8c2dfdb0a5..491d23ed70 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/githubaccess/resource.go +++ b/pkg/contexts/ocm/elements/artifactaccess/githubaccess/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package githubaccess import ( diff --git a/pkg/contexts/ocm/elements/artifactaccess/helmaccess/resource.go b/pkg/contexts/ocm/elements/artifactaccess/helmaccess/resource.go index e7a7b35e29..b5aae98b78 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/helmaccess/resource.go +++ b/pkg/contexts/ocm/elements/artifactaccess/helmaccess/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helmaccess import ( diff --git a/pkg/contexts/ocm/elements/artifactaccess/npmaccess/resource.go b/pkg/contexts/ocm/elements/artifactaccess/npmaccess/resource.go index dd6bc3955b..594d50cadf 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/npmaccess/resource.go +++ b/pkg/contexts/ocm/elements/artifactaccess/npmaccess/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package npmaccess import ( diff --git a/pkg/contexts/ocm/elements/artifactaccess/ociartifactaccess/resource.go b/pkg/contexts/ocm/elements/artifactaccess/ociartifactaccess/resource.go index 40b6086193..1e39c3efa6 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/ociartifactaccess/resource.go +++ b/pkg/contexts/ocm/elements/artifactaccess/ociartifactaccess/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifactaccess import ( diff --git a/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/options.go b/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/options.go index 38f31c7950..06e1e66e0a 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/options.go +++ b/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package github import ( diff --git a/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/resource.go b/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/resource.go index a3c8171646..53ac2d7e7c 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/resource.go +++ b/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package github import ( diff --git a/pkg/contexts/ocm/elements/artifactaccess/s3access/options.go b/pkg/contexts/ocm/elements/artifactaccess/s3access/options.go index 48373cd978..bb7c98fe42 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/s3access/options.go +++ b/pkg/contexts/ocm/elements/artifactaccess/s3access/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package github import ( diff --git a/pkg/contexts/ocm/elements/artifactaccess/s3access/resource.go b/pkg/contexts/ocm/elements/artifactaccess/s3access/resource.go index c78ae899bc..fcd3dc33e6 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/s3access/resource.go +++ b/pkg/contexts/ocm/elements/artifactaccess/s3access/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package github import ( diff --git a/pkg/contexts/ocm/elements/artifactaccess/wgetaccess/options.go b/pkg/contexts/ocm/elements/artifactaccess/wgetaccess/options.go index 102f23a415..25c343671c 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/wgetaccess/options.go +++ b/pkg/contexts/ocm/elements/artifactaccess/wgetaccess/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wgetaccess import ( diff --git a/pkg/contexts/ocm/elements/artifactaccess/wgetaccess/resource.go b/pkg/contexts/ocm/elements/artifactaccess/wgetaccess/resource.go index 0b74633ac5..2018c1afe6 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/wgetaccess/resource.go +++ b/pkg/contexts/ocm/elements/artifactaccess/wgetaccess/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wgetaccess import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/api/options.go b/pkg/contexts/ocm/elements/artifactblob/api/options.go index c9bf857cce..954e07f557 100644 --- a/pkg/contexts/ocm/elements/artifactblob/api/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/api/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package api import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/datablob/options.go b/pkg/contexts/ocm/elements/artifactblob/datablob/options.go index e5156e7862..176cf5bc0c 100644 --- a/pkg/contexts/ocm/elements/artifactblob/datablob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/datablob/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package datablob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/datablob/resource.go b/pkg/contexts/ocm/elements/artifactblob/datablob/resource.go index c481d032d3..44d9445d41 100644 --- a/pkg/contexts/ocm/elements/artifactblob/datablob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/datablob/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package datablob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/options.go b/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/options.go index f4248c6384..47e7479926 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtreeblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource.go index 3fb282dc4b..7b51e50a5a 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtreeblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource_test.go b/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource_test.go index 8717bf7f2b..d18ed8e499 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource_test.go +++ b/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtreeblob_test import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/suite_test.go b/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/suite_test.go index 75204ace34..60da404720 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/suite_test.go +++ b/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtreeblob_test import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/doc.go b/pkg/contexts/ocm/elements/artifactblob/doc.go index 167d66ded7..4fd069ed61 100644 --- a/pkg/contexts/ocm/elements/artifactblob/doc.go +++ b/pkg/contexts/ocm/elements/artifactblob/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package artifactblob hosts packages for // ResourceAccess and SourceAccess builders used to add // resources and sources as local blobs to a component version. diff --git a/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/options.go b/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/options.go index 097eb1d09f..98701fdabe 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockerdaemonblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/resource.go index 280050a058..997ca81815 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockerdaemonblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/options.go b/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/options.go index e0c832ea01..a6412c14f1 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockermultiblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/resource.go index df824cf61a..a14f4fce6a 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dockermultiblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/externalblob/doc.go b/pkg/contexts/ocm/elements/artifactblob/externalblob/doc.go index 6aad2b9201..7a0eabb463 100644 --- a/pkg/contexts/ocm/elements/artifactblob/externalblob/doc.go +++ b/pkg/contexts/ocm/elements/artifactblob/externalblob/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package ociartifact provides a way to provide ResourceAccess and SourceAccess // objects based on external access specification intended to be added as local access. // Those access objects can then directly be used to compose reource and source entries diff --git a/pkg/contexts/ocm/elements/artifactblob/externalblob/options.go b/pkg/contexts/ocm/elements/artifactblob/externalblob/options.go index e70a2c4271..c2a75ab354 100644 --- a/pkg/contexts/ocm/elements/artifactblob/externalblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/externalblob/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package externalblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/externalblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/externalblob/resource.go index 29c039f900..aa9be3aa9d 100644 --- a/pkg/contexts/ocm/elements/artifactblob/externalblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/externalblob/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package externalblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/fileblob/options.go b/pkg/contexts/ocm/elements/artifactblob/fileblob/options.go index cd17e83953..5a1cdc6d37 100644 --- a/pkg/contexts/ocm/elements/artifactblob/fileblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/fileblob/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package fileblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/fileblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/fileblob/resource.go index 73b65fc0d6..ac6be767ae 100644 --- a/pkg/contexts/ocm/elements/artifactblob/fileblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/fileblob/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package fileblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/genericblob/options.go b/pkg/contexts/ocm/elements/artifactblob/genericblob/options.go index 250a57adeb..93105221fe 100644 --- a/pkg/contexts/ocm/elements/artifactblob/genericblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/genericblob/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/genericblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/genericblob/resource.go index ad32222f9c..01bcb8248c 100644 --- a/pkg/contexts/ocm/elements/artifactblob/genericblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/genericblob/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/options.go b/pkg/contexts/ocm/elements/artifactblob/helmblob/options.go index 5ce989d2dd..69450c00cb 100644 --- a/pkg/contexts/ocm/elements/artifactblob/helmblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helmblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/helmblob/resource.go index fa845e9c47..2e201aec31 100644 --- a/pkg/contexts/ocm/elements/artifactblob/helmblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helmblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/options.go b/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/options.go index 36899b6b8c..2a9a36c65a 100644 --- a/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifactblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/resource.go index fb60604e56..9e33434d2d 100644 --- a/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ociartifactblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/textblob/options.go b/pkg/contexts/ocm/elements/artifactblob/textblob/options.go index 1176c6fc60..46e99a0035 100644 --- a/pkg/contexts/ocm/elements/artifactblob/textblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/textblob/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package textblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/textblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/textblob/resource.go index a161365aa2..8683676dce 100644 --- a/pkg/contexts/ocm/elements/artifactblob/textblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/textblob/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package textblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/wgetblob/options.go b/pkg/contexts/ocm/elements/artifactblob/wgetblob/options.go index bb861981f2..ce8427ffb6 100644 --- a/pkg/contexts/ocm/elements/artifactblob/wgetblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/wgetblob/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wgetblob import ( diff --git a/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go index 628ad972b9..e2831194bc 100644 --- a/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package wgetblob import ( diff --git a/pkg/contexts/ocm/elements/artifacts.go b/pkg/contexts/ocm/elements/artifacts.go index 1bc8bdc05f..20c8607cb9 100644 --- a/pkg/contexts/ocm/elements/artifacts.go +++ b/pkg/contexts/ocm/elements/artifacts.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package elements type ArtifactOption interface { diff --git a/pkg/contexts/ocm/elements/common.go b/pkg/contexts/ocm/elements/common.go index 2ef428f00a..c4321bff1f 100644 --- a/pkg/contexts/ocm/elements/common.go +++ b/pkg/contexts/ocm/elements/common.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package elements import ( diff --git a/pkg/contexts/ocm/elements/digests.go b/pkg/contexts/ocm/elements/digests.go index 690d51971c..2a80de0ebc 100644 --- a/pkg/contexts/ocm/elements/digests.go +++ b/pkg/contexts/ocm/elements/digests.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package elements import ( diff --git a/pkg/contexts/ocm/elements/doc.go b/pkg/contexts/ocm/elements/doc.go index 1ef95561e2..3b1c03302e 100644 --- a/pkg/contexts/ocm/elements/doc.go +++ b/pkg/contexts/ocm/elements/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package elements contains builders // for elements of a component version, // aka resources, sources and references. diff --git a/pkg/contexts/ocm/elements/references.go b/pkg/contexts/ocm/elements/references.go index cbdf953354..faac688586 100644 --- a/pkg/contexts/ocm/elements/references.go +++ b/pkg/contexts/ocm/elements/references.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package elements import ( diff --git a/pkg/contexts/ocm/elements/resources.go b/pkg/contexts/ocm/elements/resources.go index dbb329dfb4..e2e1dd0399 100644 --- a/pkg/contexts/ocm/elements/resources.go +++ b/pkg/contexts/ocm/elements/resources.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package elements import ( diff --git a/pkg/contexts/ocm/elements/resources_test.go b/pkg/contexts/ocm/elements/resources_test.go index 6c4a70dbbd..27e13e8184 100644 --- a/pkg/contexts/ocm/elements/resources_test.go +++ b/pkg/contexts/ocm/elements/resources_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package elements_test import ( diff --git a/pkg/contexts/ocm/elements/sources.go b/pkg/contexts/ocm/elements/sources.go index 30080dcc02..0ab8443c5a 100644 --- a/pkg/contexts/ocm/elements/sources.go +++ b/pkg/contexts/ocm/elements/sources.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package elements import ( diff --git a/pkg/contexts/ocm/elements/suite_test.go b/pkg/contexts/ocm/elements/suite_test.go index 79af1da3b6..0e2dc982f4 100644 --- a/pkg/contexts/ocm/elements/suite_test.go +++ b/pkg/contexts/ocm/elements/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package elements_test import ( diff --git a/pkg/contexts/ocm/extraid/extra_identities.go b/pkg/contexts/ocm/extraid/extra_identities.go index 315a03bc40..9a2216769a 100644 --- a/pkg/contexts/ocm/extraid/extra_identities.go +++ b/pkg/contexts/ocm/extraid/extra_identities.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package extraid import ( diff --git a/pkg/contexts/ocm/gc_test.go b/pkg/contexts/ocm/gc_test.go index ee61aa8234..d80a50b476 100644 --- a/pkg/contexts/ocm/gc_test.go +++ b/pkg/contexts/ocm/gc_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm_test import ( diff --git a/pkg/contexts/ocm/grammar/grammar.go b/pkg/contexts/ocm/grammar/grammar.go index d84ac83cf8..d92d177d14 100644 --- a/pkg/contexts/ocm/grammar/grammar.go +++ b/pkg/contexts/ocm/grammar/grammar.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package grammar import ( diff --git a/pkg/contexts/ocm/grammar/grammar_test.go b/pkg/contexts/ocm/grammar/grammar_test.go index 1878e60256..22e1cf4ef0 100644 --- a/pkg/contexts/ocm/grammar/grammar_test.go +++ b/pkg/contexts/ocm/grammar/grammar_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package grammar import ( diff --git a/pkg/contexts/ocm/init.go b/pkg/contexts/ocm/init.go index 68232fefad..8686caeab5 100644 --- a/pkg/contexts/ocm/init.go +++ b/pkg/contexts/ocm/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm import ( diff --git a/pkg/contexts/ocm/interface.go b/pkg/contexts/ocm/interface.go index 92b09eaf02..e9f32736bc 100644 --- a/pkg/contexts/ocm/interface.go +++ b/pkg/contexts/ocm/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm import ( diff --git a/pkg/contexts/ocm/internal/accessspecref.go b/pkg/contexts/ocm/internal/accessspecref.go index c61665b96d..87103a205c 100644 --- a/pkg/contexts/ocm/internal/accessspecref.go +++ b/pkg/contexts/ocm/internal/accessspecref.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/internal/accesstypes.go b/pkg/contexts/ocm/internal/accesstypes.go index 3c8b91373e..e60286a60d 100644 --- a/pkg/contexts/ocm/internal/accesstypes.go +++ b/pkg/contexts/ocm/internal/accesstypes.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/internal/blobhandler.go b/pkg/contexts/ocm/internal/blobhandler.go index d655f6743a..4023e79a82 100644 --- a/pkg/contexts/ocm/internal/blobhandler.go +++ b/pkg/contexts/ocm/internal/blobhandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/internal/blobhandler_test.go b/pkg/contexts/ocm/internal/blobhandler_test.go index ed87a5ea61..21690cfb1f 100644 --- a/pkg/contexts/ocm/internal/blobhandler_test.go +++ b/pkg/contexts/ocm/internal/blobhandler_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal_test import ( diff --git a/pkg/contexts/ocm/internal/builder.go b/pkg/contexts/ocm/internal/builder.go index 5ead7c036c..bfc0cbd52f 100644 --- a/pkg/contexts/ocm/internal/builder.go +++ b/pkg/contexts/ocm/internal/builder.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/internal/builder_test.go b/pkg/contexts/ocm/internal/builder_test.go index 98b133c2c2..ccbe34fac3 100644 --- a/pkg/contexts/ocm/internal/builder_test.go +++ b/pkg/contexts/ocm/internal/builder_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal_test import ( diff --git a/pkg/contexts/ocm/internal/context.go b/pkg/contexts/ocm/internal/context.go index f09de688b8..da863ab5a1 100644 --- a/pkg/contexts/ocm/internal/context.go +++ b/pkg/contexts/ocm/internal/context.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/internal/delegation.go b/pkg/contexts/ocm/internal/delegation.go index 917b3da48d..f95e08c133 100644 --- a/pkg/contexts/ocm/internal/delegation.go +++ b/pkg/contexts/ocm/internal/delegation.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/internal/digesthandler.go b/pkg/contexts/ocm/internal/digesthandler.go index 002dc30a89..c13f6943db 100644 --- a/pkg/contexts/ocm/internal/digesthandler.go +++ b/pkg/contexts/ocm/internal/digesthandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/internal/digesthandler_test.go b/pkg/contexts/ocm/internal/digesthandler_test.go index 9b0342202c..6dbdbd2477 100644 --- a/pkg/contexts/ocm/internal/digesthandler_test.go +++ b/pkg/contexts/ocm/internal/digesthandler_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal_test import ( diff --git a/pkg/contexts/ocm/internal/errors.go b/pkg/contexts/ocm/internal/errors.go index 19e9eb3f9f..63efc0e7ba 100644 --- a/pkg/contexts/ocm/internal/errors.go +++ b/pkg/contexts/ocm/internal/errors.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/internal/hasher.go b/pkg/contexts/ocm/internal/hasher.go index 0ac5e5a976..a170d0c505 100644 --- a/pkg/contexts/ocm/internal/hasher.go +++ b/pkg/contexts/ocm/internal/hasher.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/internal/modopts.go b/pkg/contexts/ocm/internal/modopts.go index c509cbba1c..33ee9c0b98 100644 --- a/pkg/contexts/ocm/internal/modopts.go +++ b/pkg/contexts/ocm/internal/modopts.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/internal/repository.go b/pkg/contexts/ocm/internal/repository.go index 8505db3983..9fa462dcea 100644 --- a/pkg/contexts/ocm/internal/repository.go +++ b/pkg/contexts/ocm/internal/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/internal/repotypes.go b/pkg/contexts/ocm/internal/repotypes.go index 613893f6af..fa641d6171 100644 --- a/pkg/contexts/ocm/internal/repotypes.go +++ b/pkg/contexts/ocm/internal/repotypes.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/internal/resolver.go b/pkg/contexts/ocm/internal/resolver.go index 85665b2855..3bef59e78c 100644 --- a/pkg/contexts/ocm/internal/resolver.go +++ b/pkg/contexts/ocm/internal/resolver.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/internal/suite_test.go b/pkg/contexts/ocm/internal/suite_test.go index a899fda2d2..6a98e1cd34 100644 --- a/pkg/contexts/ocm/internal/suite_test.go +++ b/pkg/contexts/ocm/internal/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal_test import ( diff --git a/pkg/contexts/ocm/internal/uniform.go b/pkg/contexts/ocm/internal/uniform.go index 91bcbbd3b2..511e9e2327 100644 --- a/pkg/contexts/ocm/internal/uniform.go +++ b/pkg/contexts/ocm/internal/uniform.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/internal/uniform_test.go b/pkg/contexts/ocm/internal/uniform_test.go index 7b9a23cd6a..5405070f75 100644 --- a/pkg/contexts/ocm/internal/uniform_test.go +++ b/pkg/contexts/ocm/internal/uniform_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal_test import ( diff --git a/pkg/contexts/ocm/labels/init.go b/pkg/contexts/ocm/labels/init.go index 178501f011..a4af271d86 100644 --- a/pkg/contexts/ocm/labels/init.go +++ b/pkg/contexts/ocm/labels/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package labels import ( diff --git a/pkg/contexts/ocm/labels/routingslip/entry.go b/pkg/contexts/ocm/labels/routingslip/entry.go index 6584a6b0b1..490c365f99 100644 --- a/pkg/contexts/ocm/labels/routingslip/entry.go +++ b/pkg/contexts/ocm/labels/routingslip/entry.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package routingslip import ( diff --git a/pkg/contexts/ocm/labels/routingslip/entrytypes_test.go b/pkg/contexts/ocm/labels/routingslip/entrytypes_test.go index 9ee0ad0deb..db925debb2 100644 --- a/pkg/contexts/ocm/labels/routingslip/entrytypes_test.go +++ b/pkg/contexts/ocm/labels/routingslip/entrytypes_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package routingslip_test import ( diff --git a/pkg/contexts/ocm/labels/routingslip/init.go b/pkg/contexts/ocm/labels/routingslip/init.go index bfbb9e7def..f4d1901774 100644 --- a/pkg/contexts/ocm/labels/routingslip/init.go +++ b/pkg/contexts/ocm/labels/routingslip/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package routingslip import ( diff --git a/pkg/contexts/ocm/labels/routingslip/interface.go b/pkg/contexts/ocm/labels/routingslip/interface.go index 0e24f87ad6..1a97f0c6c5 100644 --- a/pkg/contexts/ocm/labels/routingslip/interface.go +++ b/pkg/contexts/ocm/labels/routingslip/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package routingslip import ( diff --git a/pkg/contexts/ocm/labels/routingslip/internal/attr.go b/pkg/contexts/ocm/labels/routingslip/internal/attr.go index b729adc147..d77cd3f7a5 100644 --- a/pkg/contexts/ocm/labels/routingslip/internal/attr.go +++ b/pkg/contexts/ocm/labels/routingslip/internal/attr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/labels/routingslip/internal/entrytypes.go b/pkg/contexts/ocm/labels/routingslip/internal/entrytypes.go index bf6b232287..e500ce1174 100644 --- a/pkg/contexts/ocm/labels/routingslip/internal/entrytypes.go +++ b/pkg/contexts/ocm/labels/routingslip/internal/entrytypes.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/labels/routingslip/label.go b/pkg/contexts/ocm/labels/routingslip/label.go index 9ab4b93044..d01714c0b3 100644 --- a/pkg/contexts/ocm/labels/routingslip/label.go +++ b/pkg/contexts/ocm/labels/routingslip/label.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package routingslip import ( diff --git a/pkg/contexts/ocm/labels/routingslip/slip.go b/pkg/contexts/ocm/labels/routingslip/slip.go index 2d6e887de6..d6673deede 100644 --- a/pkg/contexts/ocm/labels/routingslip/slip.go +++ b/pkg/contexts/ocm/labels/routingslip/slip.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package routingslip import ( diff --git a/pkg/contexts/ocm/labels/routingslip/slip_test.go b/pkg/contexts/ocm/labels/routingslip/slip_test.go index 16615f87af..8b04c41cac 100644 --- a/pkg/contexts/ocm/labels/routingslip/slip_test.go +++ b/pkg/contexts/ocm/labels/routingslip/slip_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package routingslip_test import ( diff --git a/pkg/contexts/ocm/labels/routingslip/spi/entrytype_options.go b/pkg/contexts/ocm/labels/routingslip/spi/entrytype_options.go index ad727449c7..ce3c8fca09 100644 --- a/pkg/contexts/ocm/labels/routingslip/spi/entrytype_options.go +++ b/pkg/contexts/ocm/labels/routingslip/spi/entrytype_options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spi import ( diff --git a/pkg/contexts/ocm/labels/routingslip/spi/interface.go b/pkg/contexts/ocm/labels/routingslip/spi/interface.go index 9964466a3e..983132175e 100644 --- a/pkg/contexts/ocm/labels/routingslip/spi/interface.go +++ b/pkg/contexts/ocm/labels/routingslip/spi/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spi import ( diff --git a/pkg/contexts/ocm/labels/routingslip/spi/support.go b/pkg/contexts/ocm/labels/routingslip/spi/support.go index 2a0307208b..cd410de50f 100644 --- a/pkg/contexts/ocm/labels/routingslip/spi/support.go +++ b/pkg/contexts/ocm/labels/routingslip/spi/support.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spi import ( diff --git a/pkg/contexts/ocm/labels/routingslip/suite_test.go b/pkg/contexts/ocm/labels/routingslip/suite_test.go index ba4042abc3..2e8959c74b 100644 --- a/pkg/contexts/ocm/labels/routingslip/suite_test.go +++ b/pkg/contexts/ocm/labels/routingslip/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package routingslip_test import ( diff --git a/pkg/contexts/ocm/labels/routingslip/transfer_test.go b/pkg/contexts/ocm/labels/routingslip/transfer_test.go index 097afa9d6b..a222c4c8df 100644 --- a/pkg/contexts/ocm/labels/routingslip/transfer_test.go +++ b/pkg/contexts/ocm/labels/routingslip/transfer_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package routingslip_test import ( diff --git a/pkg/contexts/ocm/labels/routingslip/types/comment/cli.go b/pkg/contexts/ocm/labels/routingslip/types/comment/cli.go index 375e89820a..257d9d0b82 100644 --- a/pkg/contexts/ocm/labels/routingslip/types/comment/cli.go +++ b/pkg/contexts/ocm/labels/routingslip/types/comment/cli.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comment import ( diff --git a/pkg/contexts/ocm/labels/routingslip/types/comment/entry.go b/pkg/contexts/ocm/labels/routingslip/types/comment/entry.go index 984f9ce4b5..740c07fc10 100644 --- a/pkg/contexts/ocm/labels/routingslip/types/comment/entry.go +++ b/pkg/contexts/ocm/labels/routingslip/types/comment/entry.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comment import ( diff --git a/pkg/contexts/ocm/labels/routingslip/types/init.go b/pkg/contexts/ocm/labels/routingslip/types/init.go index 5b1b9ac7b7..fcad65f3b9 100644 --- a/pkg/contexts/ocm/labels/routingslip/types/init.go +++ b/pkg/contexts/ocm/labels/routingslip/types/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package types import ( diff --git a/pkg/contexts/ocm/labels/routingslip/types/plugin/cmd_test.go b/pkg/contexts/ocm/labels/routingslip/types/plugin/cmd_test.go index 4fe6da4742..0302bd62c1 100644 --- a/pkg/contexts/ocm/labels/routingslip/types/plugin/cmd_test.go +++ b/pkg/contexts/ocm/labels/routingslip/types/plugin/cmd_test.go @@ -1,17 +1,13 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin_test import ( - "github.com/mandelsoft/goutils/sliceutils" - "github.com/mandelsoft/goutils/transformer" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/contexts/ocm/registration" . "github.com/open-component-model/ocm/pkg/env" . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/mandelsoft/goutils/sliceutils" + "github.com/mandelsoft/goutils/transformer" "github.com/spf13/pflag" "github.com/open-component-model/ocm/pkg/cobrautils/flagsets" @@ -19,6 +15,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugincacheattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugindirattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/labels/routingslip" + "github.com/open-component-model/ocm/pkg/contexts/ocm/registration" ) const ARCH = "/tmp/ca" diff --git a/pkg/contexts/ocm/labels/routingslip/types/plugin/doc.go b/pkg/contexts/ocm/labels/routingslip/types/plugin/doc.go index b713535635..b0ba47c52d 100644 --- a/pkg/contexts/ocm/labels/routingslip/types/plugin/doc.go +++ b/pkg/contexts/ocm/labels/routingslip/types/plugin/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package plugin is an adapter implementation that provides a generic handling of all ValueSets provided by // plugins. package plugin diff --git a/pkg/contexts/ocm/labels/routingslip/types/plugin/entry.go b/pkg/contexts/ocm/labels/routingslip/types/plugin/entry.go index 41cb3bc3f8..830a56f341 100644 --- a/pkg/contexts/ocm/labels/routingslip/types/plugin/entry.go +++ b/pkg/contexts/ocm/labels/routingslip/types/plugin/entry.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/labels/routingslip/types/plugin/entry_test.go b/pkg/contexts/ocm/labels/routingslip/types/plugin/entry_test.go index 3b2b183ea0..4350c38adf 100644 --- a/pkg/contexts/ocm/labels/routingslip/types/plugin/entry_test.go +++ b/pkg/contexts/ocm/labels/routingslip/types/plugin/entry_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:build unix package plugin_test @@ -9,6 +5,7 @@ package plugin_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/env" . "github.com/open-component-model/ocm/pkg/testutils" "github.com/spf13/pflag" @@ -20,7 +17,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/labels/routingslip/spi" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/plugins" "github.com/open-component-model/ocm/pkg/contexts/ocm/registration" - . "github.com/open-component-model/ocm/pkg/env" ) var _ = Describe("setup plugin cache", func() { diff --git a/pkg/contexts/ocm/labels/routingslip/types/plugin/plugin.go b/pkg/contexts/ocm/labels/routingslip/types/plugin/plugin.go index 966e1589c2..485cf5ba5f 100644 --- a/pkg/contexts/ocm/labels/routingslip/types/plugin/plugin.go +++ b/pkg/contexts/ocm/labels/routingslip/types/plugin/plugin.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/labels/routingslip/types/plugin/suite_test.go b/pkg/contexts/ocm/labels/routingslip/types/plugin/suite_test.go index d968f1e4fa..cc4eb53134 100644 --- a/pkg/contexts/ocm/labels/routingslip/types/plugin/suite_test.go +++ b/pkg/contexts/ocm/labels/routingslip/types/plugin/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin_test import ( diff --git a/pkg/contexts/ocm/labels/routingslip/types/plugin/testdata/test b/pkg/contexts/ocm/labels/routingslip/types/plugin/testdata/test index 3162fb01f3..65d99addb7 100755 --- a/pkg/contexts/ocm/labels/routingslip/types/plugin/testdata/test +++ b/pkg/contexts/ocm/labels/routingslip/types/plugin/testdata/test @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" set -e diff --git a/pkg/contexts/ocm/labels/routingslip/types/plugin/type.go b/pkg/contexts/ocm/labels/routingslip/types/plugin/type.go index 058906307d..135d85b907 100644 --- a/pkg/contexts/ocm/labels/routingslip/types/plugin/type.go +++ b/pkg/contexts/ocm/labels/routingslip/types/plugin/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/labels/routingslip/usage.go b/pkg/contexts/ocm/labels/routingslip/usage.go index 513ce9ea4e..077c5b89e3 100644 --- a/pkg/contexts/ocm/labels/routingslip/usage.go +++ b/pkg/contexts/ocm/labels/routingslip/usage.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package routingslip import ( diff --git a/pkg/contexts/ocm/modopts.go b/pkg/contexts/ocm/modopts.go index a03eba5cc6..8b22858f15 100644 --- a/pkg/contexts/ocm/modopts.go +++ b/pkg/contexts/ocm/modopts.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm import ( diff --git a/pkg/contexts/ocm/plugin/cache/dircache.go b/pkg/contexts/ocm/plugin/cache/dircache.go index 6c0bb52532..06d270d84b 100644 --- a/pkg/contexts/ocm/plugin/cache/dircache.go +++ b/pkg/contexts/ocm/plugin/cache/dircache.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cache import ( diff --git a/pkg/contexts/ocm/plugin/cache/doc.go b/pkg/contexts/ocm/plugin/cache/doc.go index 3204d3ebbc..4760d9b0e7 100644 --- a/pkg/contexts/ocm/plugin/cache/doc.go +++ b/pkg/contexts/ocm/plugin/cache/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package cache implements the plugin cache that contains all loaded plugins. It keeps the metadata for the various // discovered plugins and provides a Go abstraction to call the appropriate commands. package cache diff --git a/pkg/contexts/ocm/plugin/cache/exec.go b/pkg/contexts/ocm/plugin/cache/exec.go index 8b1e1c589d..9573cc4cab 100644 --- a/pkg/contexts/ocm/plugin/cache/exec.go +++ b/pkg/contexts/ocm/plugin/cache/exec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cache import ( diff --git a/pkg/contexts/ocm/plugin/cache/plugin.go b/pkg/contexts/ocm/plugin/cache/plugin.go index 8cac803d48..4547e91614 100644 --- a/pkg/contexts/ocm/plugin/cache/plugin.go +++ b/pkg/contexts/ocm/plugin/cache/plugin.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cache import ( diff --git a/pkg/contexts/ocm/plugin/cache/plugindir.go b/pkg/contexts/ocm/plugin/cache/plugindir.go index ec74289e1b..0186552e46 100644 --- a/pkg/contexts/ocm/plugin/cache/plugindir.go +++ b/pkg/contexts/ocm/plugin/cache/plugindir.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cache import ( diff --git a/pkg/contexts/ocm/plugin/cache/registry.go b/pkg/contexts/ocm/plugin/cache/registry.go index f3071705fe..fabde3799b 100644 --- a/pkg/contexts/ocm/plugin/cache/registry.go +++ b/pkg/contexts/ocm/plugin/cache/registry.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cache import ( diff --git a/pkg/contexts/ocm/plugin/cache/updater.go b/pkg/contexts/ocm/plugin/cache/updater.go index e196517d30..0f65978021 100644 --- a/pkg/contexts/ocm/plugin/cache/updater.go +++ b/pkg/contexts/ocm/plugin/cache/updater.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cache import ( diff --git a/pkg/contexts/ocm/plugin/common/common.go b/pkg/contexts/ocm/plugin/common/common.go index efbf1d3560..e5f89156a1 100644 --- a/pkg/contexts/ocm/plugin/common/common.go +++ b/pkg/contexts/ocm/plugin/common/common.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/pkg/contexts/ocm/plugin/common/describe.go b/pkg/contexts/ocm/plugin/common/describe.go index 429f42e26f..b99b9324d1 100644 --- a/pkg/contexts/ocm/plugin/common/describe.go +++ b/pkg/contexts/ocm/plugin/common/describe.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common import ( diff --git a/pkg/contexts/ocm/plugin/config/type.go b/pkg/contexts/ocm/plugin/config/type.go index fc577561c8..a5d9c12fba 100644 --- a/pkg/contexts/ocm/plugin/config/type.go +++ b/pkg/contexts/ocm/plugin/config/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/ocm/plugin/descriptor/const.go b/pkg/contexts/ocm/plugin/descriptor/const.go index b12d6057c9..0d32dc93cc 100644 --- a/pkg/contexts/ocm/plugin/descriptor/const.go +++ b/pkg/contexts/ocm/plugin/descriptor/const.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package descriptor import ( diff --git a/pkg/contexts/ocm/plugin/descriptor/descriptor.go b/pkg/contexts/ocm/plugin/descriptor/descriptor.go index f254539110..a0c9d01bcf 100644 --- a/pkg/contexts/ocm/plugin/descriptor/descriptor.go +++ b/pkg/contexts/ocm/plugin/descriptor/descriptor.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package descriptor import ( diff --git a/pkg/contexts/ocm/plugin/descriptor/doc.go b/pkg/contexts/ocm/plugin/descriptor/doc.go index fa70e8a992..dd942caa08 100644 --- a/pkg/contexts/ocm/plugin/descriptor/doc.go +++ b/pkg/contexts/ocm/plugin/descriptor/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package descriptor declares several structs that describe the information that formally describes the capabilities // provided by each plugin. The plugin implementation has to provide this information and the plugin user has to // evaluate this information. diff --git a/pkg/contexts/ocm/plugin/descriptor/keys.go b/pkg/contexts/ocm/plugin/descriptor/keys.go index 204c480d15..62b286f473 100644 --- a/pkg/contexts/ocm/plugin/descriptor/keys.go +++ b/pkg/contexts/ocm/plugin/descriptor/keys.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package descriptor import ( diff --git a/pkg/contexts/ocm/plugin/descriptor/suite_test.go b/pkg/contexts/ocm/plugin/descriptor/suite_test.go index f32349491d..67e1367d73 100644 --- a/pkg/contexts/ocm/plugin/descriptor/suite_test.go +++ b/pkg/contexts/ocm/plugin/descriptor/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package descriptor_test import ( diff --git a/pkg/contexts/ocm/plugin/descriptor/utils.go b/pkg/contexts/ocm/plugin/descriptor/utils.go index f4c25166dd..e1f2536f55 100644 --- a/pkg/contexts/ocm/plugin/descriptor/utils.go +++ b/pkg/contexts/ocm/plugin/descriptor/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package descriptor import ( diff --git a/pkg/contexts/ocm/plugin/descriptor/utils_test.go b/pkg/contexts/ocm/plugin/descriptor/utils_test.go index ea0a0f9ba3..22aae84b93 100644 --- a/pkg/contexts/ocm/plugin/descriptor/utils_test.go +++ b/pkg/contexts/ocm/plugin/descriptor/utils_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package descriptor import ( diff --git a/pkg/contexts/ocm/plugin/doc.go b/pkg/contexts/ocm/plugin/doc.go index 30682971c7..efc963c1c0 100644 --- a/pkg/contexts/ocm/plugin/doc.go +++ b/pkg/contexts/ocm/plugin/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package plugin maps a Go plugin interface to a technical command line interface. Thereby, it allows to embed plugins // and their provided functionality into the library. It is the basis for adapter implementations for accessmethods, // downloaders, uploaders, blob handlers, actions, value mergers and label merge specifications. diff --git a/pkg/contexts/ocm/plugin/interface.go b/pkg/contexts/ocm/plugin/interface.go index 0f46cdf259..2745249816 100644 --- a/pkg/contexts/ocm/plugin/interface.go +++ b/pkg/contexts/ocm/plugin/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/plugin/internal/access.go b/pkg/contexts/ocm/plugin/internal/access.go index b53cbae0e7..c78beaa81e 100644 --- a/pkg/contexts/ocm/plugin/internal/access.go +++ b/pkg/contexts/ocm/plugin/internal/access.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/plugin/internal/action.go b/pkg/contexts/ocm/plugin/internal/action.go index 07bd34126d..afdff47264 100644 --- a/pkg/contexts/ocm/plugin/internal/action.go +++ b/pkg/contexts/ocm/plugin/internal/action.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal type ActionSpecInfo struct { diff --git a/pkg/contexts/ocm/plugin/internal/upload.go b/pkg/contexts/ocm/plugin/internal/upload.go index 780b5e94d8..09a0460d45 100644 --- a/pkg/contexts/ocm/plugin/internal/upload.go +++ b/pkg/contexts/ocm/plugin/internal/upload.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/plugin/internal/valueset.go b/pkg/contexts/ocm/plugin/internal/valueset.go index 8b025516b5..575e81e6ce 100644 --- a/pkg/contexts/ocm/plugin/internal/valueset.go +++ b/pkg/contexts/ocm/plugin/internal/valueset.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal type ValueSetInfo struct { diff --git a/pkg/contexts/ocm/plugin/plugin.go b/pkg/contexts/ocm/plugin/plugin.go index e184f8174a..198f8b981b 100644 --- a/pkg/contexts/ocm/plugin/plugin.go +++ b/pkg/contexts/ocm/plugin/plugin.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/plugin/plugin_test.go b/pkg/contexts/ocm/plugin/plugin_test.go index 66350bd124..f8bd1e97c5 100644 --- a/pkg/contexts/ocm/plugin/plugin_test.go +++ b/pkg/contexts/ocm/plugin/plugin_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:build unix package plugin_test diff --git a/pkg/contexts/ocm/plugin/plugins/plugins.go b/pkg/contexts/ocm/plugin/plugins/plugins.go index 5da523245d..7772c610d3 100644 --- a/pkg/contexts/ocm/plugin/plugins/plugins.go +++ b/pkg/contexts/ocm/plugin/plugins/plugins.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugins import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/cmd.go index e314f67d40..223c672231 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package accessmethod import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/compose/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/compose/cmd.go index f5abf52258..fa0ea68c07 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/compose/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/compose/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compose import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/get/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/get/cmd.go index ba7337e697..949b9880a0 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/get/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/get/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package get import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/identity/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/identity/cmd.go index 4611a19027..70818ea163 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/identity/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/identity/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/validate/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/validate/cmd.go index 9647f93fec..f26839d804 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/validate/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/validate/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package validate import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/action/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/action/cmd.go index cd7f8d57dd..e87c563454 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/action/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/action/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package action import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/action/execute/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/action/execute/cmd.go index aded4b62d6..0e563be581 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/action/execute/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/action/execute/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package execute import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/app.go b/pkg/contexts/ocm/plugin/ppi/cmds/app.go index 2283b3c1c2..cc2ebf2d8e 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/app.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/app.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:generate go run -mod=mod ./doc ../../../../../../docs/pluginreference package cmds diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/common/const.go b/pkg/contexts/ocm/plugin/ppi/cmds/common/const.go index 931bfa442a..b4451a419c 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/common/const.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/common/const.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package common const ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/desc.go b/pkg/contexts/ocm/plugin/ppi/cmds/desc.go index 6abad97f9c..e1cde8a42d 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/desc.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/desc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package cmds func Description(name string) string { diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/describe/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/describe/cmd.go index 4447975d4e..a29e05958e 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/describe/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/describe/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package describe import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/doc/generate.go b/pkg/contexts/ocm/plugin/ppi/cmds/doc/generate.go index 8b586a45ed..153aceb7e9 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/doc/generate.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/doc/generate.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/download/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/download/cmd.go index 54f4b50f1f..73f618e4ed 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/download/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/download/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package download import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/info/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/info/cmd.go index b07ea2db1a..b446b381ce 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/info/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/info/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package info import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/mergehandler/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/mergehandler/cmd.go index b7ad7c02e7..54651305f2 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/mergehandler/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/mergehandler/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package mergehandler import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/mergehandler/execute/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/mergehandler/execute/cmd.go index cbfc422ce5..0730cc80a0 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/mergehandler/execute/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/mergehandler/execute/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package execute import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/topics/descriptor/topic.go b/pkg/contexts/ocm/plugin/ppi/cmds/topics/descriptor/topic.go index 23cd9be25b..0f92d562d2 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/topics/descriptor/topic.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/topics/descriptor/topic.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package descriptor import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/upload/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/upload/cmd.go index a7a7b8797e..d6a9e5cd33 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/upload/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/upload/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package upload import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/upload/put/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/upload/put/cmd.go index 01d37fcf64..fe1630a65e 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/upload/put/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/upload/put/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package put import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/upload/validate/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/upload/validate/cmd.go index 3ca2a216b7..fcb8367598 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/upload/validate/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/upload/validate/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package validate import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/valueset/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/valueset/cmd.go index 133c52d471..2652308e7f 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/valueset/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/valueset/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package valueset import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/valueset/compose/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/valueset/compose/cmd.go index e61c3ccf96..9e80623ba6 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/valueset/compose/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/valueset/compose/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package compose import ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/valueset/validate/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/valueset/validate/cmd.go index 4f822de256..4be1f9eccf 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/valueset/validate/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/valueset/validate/cmd.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package validate import ( diff --git a/pkg/contexts/ocm/plugin/ppi/doc.go b/pkg/contexts/ocm/plugin/ppi/doc.go index b79d66be66..e0f9f8051b 100644 --- a/pkg/contexts/ocm/plugin/ppi/doc.go +++ b/pkg/contexts/ocm/plugin/ppi/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package ppi provides the plugin programming interface. // The ppi can be used by plugin developers as support. It reduces the command line interface to a corresponding Go // interface. In other words, if the developer implements this Go plugin interface, the ppi automatically provides a diff --git a/pkg/contexts/ocm/plugin/ppi/interface.go b/pkg/contexts/ocm/plugin/ppi/interface.go index e919828821..5946a078b9 100644 --- a/pkg/contexts/ocm/plugin/ppi/interface.go +++ b/pkg/contexts/ocm/plugin/ppi/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ppi import ( diff --git a/pkg/contexts/ocm/plugin/ppi/options.go b/pkg/contexts/ocm/plugin/ppi/options.go index 5f9057806a..7b7dbe0f53 100644 --- a/pkg/contexts/ocm/plugin/ppi/options.go +++ b/pkg/contexts/ocm/plugin/ppi/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ppi import ( diff --git a/pkg/contexts/ocm/plugin/ppi/plugin.go b/pkg/contexts/ocm/plugin/ppi/plugin.go index 31930d3852..11d9ac60b2 100644 --- a/pkg/contexts/ocm/plugin/ppi/plugin.go +++ b/pkg/contexts/ocm/plugin/ppi/plugin.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ppi import ( diff --git a/pkg/contexts/ocm/plugin/ppi/utils.go b/pkg/contexts/ocm/plugin/ppi/utils.go index afd15577c4..1eb8f9ab57 100644 --- a/pkg/contexts/ocm/plugin/ppi/utils.go +++ b/pkg/contexts/ocm/plugin/ppi/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ppi import ( diff --git a/pkg/contexts/ocm/plugin/suite_test.go b/pkg/contexts/ocm/plugin/suite_test.go index 357349401b..53c8f2894f 100644 --- a/pkg/contexts/ocm/plugin/suite_test.go +++ b/pkg/contexts/ocm/plugin/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin_test import ( diff --git a/pkg/contexts/ocm/plugin/testdata/action b/pkg/contexts/ocm/plugin/testdata/action index 0df59877e0..8443c4c3ec 100755 --- a/pkg/contexts/ocm/plugin/testdata/action +++ b/pkg/contexts/ocm/plugin/testdata/action @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" Error() { diff --git a/pkg/contexts/ocm/plugin/testdata/identity b/pkg/contexts/ocm/plugin/testdata/identity index df0b268374..eaf62d1fdd 100755 --- a/pkg/contexts/ocm/plugin/testdata/identity +++ b/pkg/contexts/ocm/plugin/testdata/identity @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" Error() { diff --git a/pkg/contexts/ocm/plugin/testdata/merge b/pkg/contexts/ocm/plugin/testdata/merge index fce3c0e15d..4e901fcbf9 100755 --- a/pkg/contexts/ocm/plugin/testdata/merge +++ b/pkg/contexts/ocm/plugin/testdata/merge @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" Error() { diff --git a/pkg/contexts/ocm/plugin/testdata/test b/pkg/contexts/ocm/plugin/testdata/test index 2f997edaaa..c8ffdbdf7b 100755 --- a/pkg/contexts/ocm/plugin/testdata/test +++ b/pkg/contexts/ocm/plugin/testdata/test @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" Error() { diff --git a/pkg/contexts/ocm/plugin/utils.go b/pkg/contexts/ocm/plugin/utils.go index 0a3745410d..4573a2ad80 100644 --- a/pkg/contexts/ocm/plugin/utils.go +++ b/pkg/contexts/ocm/plugin/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/ref.go b/pkg/contexts/ocm/ref.go index c630a621a0..5af1d6ffd2 100644 --- a/pkg/contexts/ocm/ref.go +++ b/pkg/contexts/ocm/ref.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm import ( diff --git a/pkg/contexts/ocm/ref_test.go b/pkg/contexts/ocm/ref_test.go index 3501bc4905..0319f2e12f 100644 --- a/pkg/contexts/ocm/ref_test.go +++ b/pkg/contexts/ocm/ref_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm_test import ( diff --git a/pkg/contexts/ocm/registration/logging.go b/pkg/contexts/ocm/registration/logging.go index 0ecf52bafe..56ac8075db 100644 --- a/pkg/contexts/ocm/registration/logging.go +++ b/pkg/contexts/ocm/registration/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package registration import ( diff --git a/pkg/contexts/ocm/registration/registration.go b/pkg/contexts/ocm/registration/registration.go index e8fd3899a6..cf2281eac0 100644 --- a/pkg/contexts/ocm/registration/registration.go +++ b/pkg/contexts/ocm/registration/registration.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package registration import ( diff --git a/pkg/contexts/ocm/repo_test.go b/pkg/contexts/ocm/repo_test.go index cfeb9fb3bc..572567eea5 100644 --- a/pkg/contexts/ocm/repo_test.go +++ b/pkg/contexts/ocm/repo_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm_test import ( diff --git a/pkg/contexts/ocm/repositories/comparch/accessmethod_localfs.go b/pkg/contexts/ocm/repositories/comparch/accessmethod_localfs.go index db622c078d..57eca72ee0 100644 --- a/pkg/contexts/ocm/repositories/comparch/accessmethod_localfs.go +++ b/pkg/contexts/ocm/repositories/comparch/accessmethod_localfs.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comparch import ( diff --git a/pkg/contexts/ocm/repositories/comparch/accessmethod_test.go b/pkg/contexts/ocm/repositories/comparch/accessmethod_test.go index 6245483950..0472e1a0ed 100644 --- a/pkg/contexts/ocm/repositories/comparch/accessmethod_test.go +++ b/pkg/contexts/ocm/repositories/comparch/accessmethod_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comparch_test import ( diff --git a/pkg/contexts/ocm/repositories/comparch/comparch_test.go b/pkg/contexts/ocm/repositories/comparch/comparch_test.go index f0b004b303..628db42bc6 100644 --- a/pkg/contexts/ocm/repositories/comparch/comparch_test.go +++ b/pkg/contexts/ocm/repositories/comparch/comparch_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comparch_test import ( diff --git a/pkg/contexts/ocm/repositories/comparch/componentarchive.go b/pkg/contexts/ocm/repositories/comparch/componentarchive.go index 56f0f5aa23..350e303a22 100644 --- a/pkg/contexts/ocm/repositories/comparch/componentarchive.go +++ b/pkg/contexts/ocm/repositories/comparch/componentarchive.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comparch import ( diff --git a/pkg/contexts/ocm/repositories/comparch/format.go b/pkg/contexts/ocm/repositories/comparch/format.go index f4e7bb653b..08bbbc1d0b 100644 --- a/pkg/contexts/ocm/repositories/comparch/format.go +++ b/pkg/contexts/ocm/repositories/comparch/format.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comparch import ( diff --git a/pkg/contexts/ocm/repositories/comparch/repository.go b/pkg/contexts/ocm/repositories/comparch/repository.go index 5dc9262c4d..a5ee294ada 100644 --- a/pkg/contexts/ocm/repositories/comparch/repository.go +++ b/pkg/contexts/ocm/repositories/comparch/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comparch import ( diff --git a/pkg/contexts/ocm/repositories/comparch/state.go b/pkg/contexts/ocm/repositories/comparch/state.go index f6dbfd68b8..edbdfeaf00 100644 --- a/pkg/contexts/ocm/repositories/comparch/state.go +++ b/pkg/contexts/ocm/repositories/comparch/state.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comparch import ( diff --git a/pkg/contexts/ocm/repositories/comparch/suite_test.go b/pkg/contexts/ocm/repositories/comparch/suite_test.go index e2a50c30b3..eff0bd4c13 100644 --- a/pkg/contexts/ocm/repositories/comparch/suite_test.go +++ b/pkg/contexts/ocm/repositories/comparch/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comparch import ( diff --git a/pkg/contexts/ocm/repositories/comparch/testdata/common/component-descriptor.yaml b/pkg/contexts/ocm/repositories/comparch/testdata/common/component-descriptor.yaml index 07072fb894..2f294aa961 100755 --- a/pkg/contexts/ocm/repositories/comparch/testdata/common/component-descriptor.yaml +++ b/pkg/contexts/ocm/repositories/comparch/testdata/common/component-descriptor.yaml @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2020 SAP SE or an SAP affiliate company and Gardener contributors -# -# SPDX-License-Identifier: Apache-2.0 - meta: schemaVersion: v2 component: diff --git a/pkg/contexts/ocm/repositories/comparch/testdata/directory/component-descriptor.yaml b/pkg/contexts/ocm/repositories/comparch/testdata/directory/component-descriptor.yaml index 4064c96c40..ec40c4441a 100644 --- a/pkg/contexts/ocm/repositories/comparch/testdata/directory/component-descriptor.yaml +++ b/pkg/contexts/ocm/repositories/comparch/testdata/directory/component-descriptor.yaml @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2020 SAP SE or an SAP affiliate company and Gardener contributors -# -# SPDX-License-Identifier: Apache-2.0 - meta: schemaVersion: v2 diff --git a/pkg/contexts/ocm/repositories/comparch/type.go b/pkg/contexts/ocm/repositories/comparch/type.go index 170c5e33cd..d8d3e26343 100644 --- a/pkg/contexts/ocm/repositories/comparch/type.go +++ b/pkg/contexts/ocm/repositories/comparch/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comparch import ( diff --git a/pkg/contexts/ocm/repositories/comparch/uniform.go b/pkg/contexts/ocm/repositories/comparch/uniform.go index 81b679ea43..015277ef5b 100644 --- a/pkg/contexts/ocm/repositories/comparch/uniform.go +++ b/pkg/contexts/ocm/repositories/comparch/uniform.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package comparch import ( diff --git a/pkg/contexts/ocm/repositories/composition/cache.go b/pkg/contexts/ocm/repositories/composition/cache.go index 8f807647cb..90d63d3442 100644 --- a/pkg/contexts/ocm/repositories/composition/cache.go +++ b/pkg/contexts/ocm/repositories/composition/cache.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package composition import ( diff --git a/pkg/contexts/ocm/repositories/composition/close_test.go b/pkg/contexts/ocm/repositories/composition/close_test.go index 6be999d23e..f66bc2bf25 100644 --- a/pkg/contexts/ocm/repositories/composition/close_test.go +++ b/pkg/contexts/ocm/repositories/composition/close_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package composition_test import ( diff --git a/pkg/contexts/ocm/repositories/composition/gc_test.go b/pkg/contexts/ocm/repositories/composition/gc_test.go index d7bc0c6f1d..58e625c6b9 100644 --- a/pkg/contexts/ocm/repositories/composition/gc_test.go +++ b/pkg/contexts/ocm/repositories/composition/gc_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package composition_test import ( diff --git a/pkg/contexts/ocm/repositories/composition/repository.go b/pkg/contexts/ocm/repositories/composition/repository.go index a199ebd4f9..e388b071b2 100644 --- a/pkg/contexts/ocm/repositories/composition/repository.go +++ b/pkg/contexts/ocm/repositories/composition/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package composition import ( diff --git a/pkg/contexts/ocm/repositories/composition/repository_test.go b/pkg/contexts/ocm/repositories/composition/repository_test.go index cefbf5b1d0..f0d8eae07d 100644 --- a/pkg/contexts/ocm/repositories/composition/repository_test.go +++ b/pkg/contexts/ocm/repositories/composition/repository_test.go @@ -1,20 +1,16 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package composition_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/common/accessio" - "github.com/open-component-model/ocm/pkg/common/accessobj" . "github.com/open-component-model/ocm/pkg/testutils" "github.com/mandelsoft/vfs/pkg/memoryfs" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/blobaccess/bpi" + "github.com/open-component-model/ocm/pkg/common/accessio" + "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/ocm" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" me "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/composition" diff --git a/pkg/contexts/ocm/repositories/composition/suite_test.go b/pkg/contexts/ocm/repositories/composition/suite_test.go index 7ec0cf7774..64a032a7df 100644 --- a/pkg/contexts/ocm/repositories/composition/suite_test.go +++ b/pkg/contexts/ocm/repositories/composition/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package composition_test import ( diff --git a/pkg/contexts/ocm/repositories/composition/type.go b/pkg/contexts/ocm/repositories/composition/type.go index e472ada601..8e511a871c 100644 --- a/pkg/contexts/ocm/repositories/composition/type.go +++ b/pkg/contexts/ocm/repositories/composition/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package composition import ( diff --git a/pkg/contexts/ocm/repositories/composition/version.go b/pkg/contexts/ocm/repositories/composition/version.go index 0ebca3cbea..9983b04ef6 100644 --- a/pkg/contexts/ocm/repositories/composition/version.go +++ b/pkg/contexts/ocm/repositories/composition/version.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package composition import ( diff --git a/pkg/contexts/ocm/repositories/composition/version_test.go b/pkg/contexts/ocm/repositories/composition/version_test.go index 30fe2aff0a..1b25605511 100644 --- a/pkg/contexts/ocm/repositories/composition/version_test.go +++ b/pkg/contexts/ocm/repositories/composition/version_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package composition_test import ( diff --git a/pkg/contexts/ocm/repositories/ctf/ctf_test.go b/pkg/contexts/ocm/repositories/ctf/ctf_test.go index 2602c36381..02ea5e0c5f 100644 --- a/pkg/contexts/ocm/repositories/ctf/ctf_test.go +++ b/pkg/contexts/ocm/repositories/ctf/ctf_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf_test import ( diff --git a/pkg/contexts/ocm/repositories/ctf/format.go b/pkg/contexts/ocm/repositories/ctf/format.go index f2bc385214..74bcbca964 100644 --- a/pkg/contexts/ocm/repositories/ctf/format.go +++ b/pkg/contexts/ocm/repositories/ctf/format.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf import ( diff --git a/pkg/contexts/ocm/repositories/ctf/repo_test.go b/pkg/contexts/ocm/repositories/ctf/repo_test.go index c4d3e57734..3205f41c4b 100644 --- a/pkg/contexts/ocm/repositories/ctf/repo_test.go +++ b/pkg/contexts/ocm/repositories/ctf/repo_test.go @@ -1,24 +1,18 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf_test import ( "bytes" - "github.com/mandelsoft/logging" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/genericocireg" . "github.com/open-component-model/ocm/pkg/contexts/ocm/testhelper" . "github.com/open-component-model/ocm/pkg/finalizer" - ocmlog "github.com/open-component-model/ocm/pkg/logging" . "github.com/open-component-model/ocm/pkg/testutils" - "github.com/tonglil/buflogr" + "github.com/mandelsoft/logging" "github.com/mandelsoft/vfs/pkg/memoryfs" "github.com/mandelsoft/vfs/pkg/vfs" + "github.com/tonglil/buflogr" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessio" @@ -27,7 +21,9 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" + "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/genericocireg" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" + ocmlog "github.com/open-component-model/ocm/pkg/logging" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/refmgmt" ) diff --git a/pkg/contexts/ocm/repositories/ctf/suite_test.go b/pkg/contexts/ocm/repositories/ctf/suite_test.go index c34c79baca..b88769b16f 100644 --- a/pkg/contexts/ocm/repositories/ctf/suite_test.go +++ b/pkg/contexts/ocm/repositories/ctf/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf_test import ( diff --git a/pkg/contexts/ocm/repositories/ctf/type.go b/pkg/contexts/ocm/repositories/ctf/type.go index d9ee6cbdd8..1da842ef6e 100644 --- a/pkg/contexts/ocm/repositories/ctf/type.go +++ b/pkg/contexts/ocm/repositories/ctf/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf import ( diff --git a/pkg/contexts/ocm/repositories/ctf/uniform.go b/pkg/contexts/ocm/repositories/ctf/uniform.go index 7183206f47..dec215d464 100644 --- a/pkg/contexts/ocm/repositories/ctf/uniform.go +++ b/pkg/contexts/ocm/repositories/ctf/uniform.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ctf import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/accessmethod_localblob.go b/pkg/contexts/ocm/repositories/genericocireg/accessmethod_localblob.go index 22cb85f0ad..97ee92fc36 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/accessmethod_localblob.go +++ b/pkg/contexts/ocm/repositories/genericocireg/accessmethod_localblob.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/accessmethod_localoclblob.go b/pkg/contexts/ocm/repositories/genericocireg/accessmethod_localoclblob.go index 84ef006905..15a57690ad 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/accessmethod_localoclblob.go +++ b/pkg/contexts/ocm/repositories/genericocireg/accessmethod_localoclblob.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/componentmapping/constants.go b/pkg/contexts/ocm/repositories/genericocireg/componentmapping/constants.go index 5d2d83cfad..31d2374625 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/componentmapping/constants.go +++ b/pkg/contexts/ocm/repositories/genericocireg/componentmapping/constants.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package componentmapping import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/cred_test.go b/pkg/contexts/ocm/repositories/genericocireg/cred_test.go index e978cc545f..69a3de0907 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/cred_test.go +++ b/pkg/contexts/ocm/repositories/genericocireg/cred_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg_test import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/excludes.go b/pkg/contexts/ocm/repositories/genericocireg/excludes.go index 8ecc16acd4..8ce480a1d5 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/excludes.go +++ b/pkg/contexts/ocm/repositories/genericocireg/excludes.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/fallback_test.go b/pkg/contexts/ocm/repositories/genericocireg/fallback_test.go index 737ee10a33..a6e68a7597 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/fallback_test.go +++ b/pkg/contexts/ocm/repositories/genericocireg/fallback_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg_test import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/info.go b/pkg/contexts/ocm/repositories/genericocireg/info.go index c4cf5f5f98..b642014705 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/info.go +++ b/pkg/contexts/ocm/repositories/genericocireg/info.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/logging.go b/pkg/contexts/ocm/repositories/genericocireg/logging.go index 162225750f..21743870ad 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/logging.go +++ b/pkg/contexts/ocm/repositories/genericocireg/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/repo_test.go b/pkg/contexts/ocm/repositories/genericocireg/repo_test.go index 50ab789483..77b1220609 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/repo_test.go +++ b/pkg/contexts/ocm/repositories/genericocireg/repo_test.go @@ -5,10 +5,12 @@ import ( "path" "reflect" - "github.com/mandelsoft/vfs/pkg/osfs" - "github.com/mandelsoft/vfs/pkg/vfs" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/mandelsoft/vfs/pkg/osfs" + "github.com/mandelsoft/vfs/pkg/vfs" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -44,7 +46,6 @@ import ( "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/signing/hasher/sha256" - . "github.com/open-component-model/ocm/pkg/testutils" ) var DefaultContext = ocm.New() diff --git a/pkg/contexts/ocm/repositories/genericocireg/repository.go b/pkg/contexts/ocm/repositories/genericocireg/repository.go index 37c46ae8a7..59b68984d9 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/repository.go +++ b/pkg/contexts/ocm/repositories/genericocireg/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/semver_test.go b/pkg/contexts/ocm/repositories/genericocireg/semver_test.go index 081adf680d..b12da61a98 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/semver_test.go +++ b/pkg/contexts/ocm/repositories/genericocireg/semver_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg_test import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/spec_test.go b/pkg/contexts/ocm/repositories/genericocireg/spec_test.go index 5d33a7e4c4..9d322f693d 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/spec_test.go +++ b/pkg/contexts/ocm/repositories/genericocireg/spec_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg_test import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/specnorm.go b/pkg/contexts/ocm/repositories/genericocireg/specnorm.go index c74f7d2d55..82aa8c3293 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/specnorm.go +++ b/pkg/contexts/ocm/repositories/genericocireg/specnorm.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/state.go b/pkg/contexts/ocm/repositories/genericocireg/state.go index 884ce3aba4..4d3b24e01e 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/state.go +++ b/pkg/contexts/ocm/repositories/genericocireg/state.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/suite_test.go b/pkg/contexts/ocm/repositories/genericocireg/suite_test.go index e0b1e9b5aa..3daa4931bc 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/suite_test.go +++ b/pkg/contexts/ocm/repositories/genericocireg/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg_test import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/type.go b/pkg/contexts/ocm/repositories/genericocireg/type.go index 461fb55692..dff4c1db03 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/type.go +++ b/pkg/contexts/ocm/repositories/genericocireg/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg import ( diff --git a/pkg/contexts/ocm/repositories/genericocireg/uniform.go b/pkg/contexts/ocm/repositories/genericocireg/uniform.go index f6793ededb..72aa019e72 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/uniform.go +++ b/pkg/contexts/ocm/repositories/genericocireg/uniform.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package genericocireg import ( diff --git a/pkg/contexts/ocm/repositories/init.go b/pkg/contexts/ocm/repositories/init.go index 6b931c1307..f813c1ee7d 100644 --- a/pkg/contexts/ocm/repositories/init.go +++ b/pkg/contexts/ocm/repositories/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package repositories import ( diff --git a/pkg/contexts/ocm/repositories/ocireg/specnorm.go b/pkg/contexts/ocm/repositories/ocireg/specnorm.go index babc96c088..7be83b465b 100644 --- a/pkg/contexts/ocm/repositories/ocireg/specnorm.go +++ b/pkg/contexts/ocm/repositories/ocireg/specnorm.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocireg import ( diff --git a/pkg/contexts/ocm/repositories/ocireg/specnorm_test.go b/pkg/contexts/ocm/repositories/ocireg/specnorm_test.go index 8c18bc78ad..91ce6b020b 100644 --- a/pkg/contexts/ocm/repositories/ocireg/specnorm_test.go +++ b/pkg/contexts/ocm/repositories/ocireg/specnorm_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocireg_test import ( diff --git a/pkg/contexts/ocm/repositories/ocireg/suite_test.go b/pkg/contexts/ocm/repositories/ocireg/suite_test.go index bc5da284fd..95a1566969 100644 --- a/pkg/contexts/ocm/repositories/ocireg/suite_test.go +++ b/pkg/contexts/ocm/repositories/ocireg/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocireg_test import ( diff --git a/pkg/contexts/ocm/repositories/ocireg/type.go b/pkg/contexts/ocm/repositories/ocireg/type.go index b8e5bbf839..7a24c59eae 100644 --- a/pkg/contexts/ocm/repositories/ocireg/type.go +++ b/pkg/contexts/ocm/repositories/ocireg/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocireg import ( diff --git a/pkg/contexts/ocm/repositories/virtual/access.go b/pkg/contexts/ocm/repositories/virtual/access.go index 2eca7cb95f..3b8062ddf9 100644 --- a/pkg/contexts/ocm/repositories/virtual/access.go +++ b/pkg/contexts/ocm/repositories/virtual/access.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package virtual import ( diff --git a/pkg/contexts/ocm/repositories/virtual/accessmethod_localblob.go b/pkg/contexts/ocm/repositories/virtual/accessmethod_localblob.go index a3061410ab..4c166fd0c3 100644 --- a/pkg/contexts/ocm/repositories/virtual/accessmethod_localblob.go +++ b/pkg/contexts/ocm/repositories/virtual/accessmethod_localblob.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package virtual import ( diff --git a/pkg/contexts/ocm/repositories/virtual/component.go b/pkg/contexts/ocm/repositories/virtual/component.go index b09ad99ee2..25049af090 100644 --- a/pkg/contexts/ocm/repositories/virtual/component.go +++ b/pkg/contexts/ocm/repositories/virtual/component.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package virtual import ( diff --git a/pkg/contexts/ocm/repositories/virtual/componentversion.go b/pkg/contexts/ocm/repositories/virtual/componentversion.go index 745e13c098..6c12a0672f 100644 --- a/pkg/contexts/ocm/repositories/virtual/componentversion.go +++ b/pkg/contexts/ocm/repositories/virtual/componentversion.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package virtual import ( diff --git a/pkg/contexts/ocm/repositories/virtual/example/doc.go b/pkg/contexts/ocm/repositories/virtual/example/doc.go index 07a1c1ca84..0d2123de9e 100644 --- a/pkg/contexts/ocm/repositories/virtual/example/doc.go +++ b/pkg/contexts/ocm/repositories/virtual/example/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package example contains a simple implementation providing // a virtual OCM repository based on some opinionated // filesystem structure. diff --git a/pkg/contexts/ocm/repositories/virtual/example/example.go b/pkg/contexts/ocm/repositories/virtual/example/example.go index 912956fb53..09fb8a17a9 100644 --- a/pkg/contexts/ocm/repositories/virtual/example/example.go +++ b/pkg/contexts/ocm/repositories/virtual/example/example.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package example import ( diff --git a/pkg/contexts/ocm/repositories/virtual/index.go b/pkg/contexts/ocm/repositories/virtual/index.go index b0a0dc8fb6..f66aec38f1 100644 --- a/pkg/contexts/ocm/repositories/virtual/index.go +++ b/pkg/contexts/ocm/repositories/virtual/index.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package virtual import ( diff --git a/pkg/contexts/ocm/repositories/virtual/repo_test.go b/pkg/contexts/ocm/repositories/virtual/repo_test.go index e8dd0ce36f..0305409e1e 100644 --- a/pkg/contexts/ocm/repositories/virtual/repo_test.go +++ b/pkg/contexts/ocm/repositories/virtual/repo_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package virtual_test import ( diff --git a/pkg/contexts/ocm/repositories/virtual/repository.go b/pkg/contexts/ocm/repositories/virtual/repository.go index dafbe5457d..980abf9d0e 100644 --- a/pkg/contexts/ocm/repositories/virtual/repository.go +++ b/pkg/contexts/ocm/repositories/virtual/repository.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package virtual import ( diff --git a/pkg/contexts/ocm/repositories/virtual/suite_test.go b/pkg/contexts/ocm/repositories/virtual/suite_test.go index 67a2fd712f..d1241c2c4c 100644 --- a/pkg/contexts/ocm/repositories/virtual/suite_test.go +++ b/pkg/contexts/ocm/repositories/virtual/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package virtual_test import ( diff --git a/pkg/contexts/ocm/repositories/virtual/testdata/descriptors/cd1.yaml b/pkg/contexts/ocm/repositories/virtual/testdata/descriptors/cd1.yaml index d721410bcb..bf58e44675 100644 --- a/pkg/contexts/ocm/repositories/virtual/testdata/descriptors/cd1.yaml +++ b/pkg/contexts/ocm/repositories/virtual/testdata/descriptors/cd1.yaml @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - meta: schemaVersion: 'v2' diff --git a/pkg/contexts/ocm/repositories/virtual/testdata/descriptors/cd2.yaml b/pkg/contexts/ocm/repositories/virtual/testdata/descriptors/cd2.yaml index b595109674..6a03fd5ab0 100644 --- a/pkg/contexts/ocm/repositories/virtual/testdata/descriptors/cd2.yaml +++ b/pkg/contexts/ocm/repositories/virtual/testdata/descriptors/cd2.yaml @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - meta: schemaVersion: 'v2' diff --git a/pkg/contexts/ocm/repositories/virtual/type.go b/pkg/contexts/ocm/repositories/virtual/type.go index 72f6698148..a802471b40 100644 --- a/pkg/contexts/ocm/repositories/virtual/type.go +++ b/pkg/contexts/ocm/repositories/virtual/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package virtual import ( diff --git a/pkg/contexts/ocm/resolver.go b/pkg/contexts/ocm/resolver.go index 80fdf347b5..ee78193376 100644 --- a/pkg/contexts/ocm/resolver.go +++ b/pkg/contexts/ocm/resolver.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm import ( diff --git a/pkg/contexts/ocm/resolver_test.go b/pkg/contexts/ocm/resolver_test.go index a8538ef9f0..4289b85987 100644 --- a/pkg/contexts/ocm/resolver_test.go +++ b/pkg/contexts/ocm/resolver_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm_test import ( diff --git a/pkg/contexts/ocm/resourcetypes/const.go b/pkg/contexts/ocm/resourcetypes/const.go index 287d3a3c5e..4c1be2b37b 100644 --- a/pkg/contexts/ocm/resourcetypes/const.go +++ b/pkg/contexts/ocm/resourcetypes/const.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package resourcetypes const ( diff --git a/pkg/contexts/ocm/session.go b/pkg/contexts/ocm/session.go index b257b52953..5557afbfe2 100644 --- a/pkg/contexts/ocm/session.go +++ b/pkg/contexts/ocm/session.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm import ( diff --git a/pkg/contexts/ocm/session_test.go b/pkg/contexts/ocm/session_test.go index 9deeb7ac23..69b865b600 100644 --- a/pkg/contexts/ocm/session_test.go +++ b/pkg/contexts/ocm/session_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm_test import ( diff --git a/pkg/contexts/ocm/signing/convenience.go b/pkg/contexts/ocm/signing/convenience.go index a19013d395..c8491e0825 100644 --- a/pkg/contexts/ocm/signing/convenience.go +++ b/pkg/contexts/ocm/signing/convenience.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing import ( diff --git a/pkg/contexts/ocm/signing/digestctx.go b/pkg/contexts/ocm/signing/digestctx.go index f307dee066..039949dacd 100644 --- a/pkg/contexts/ocm/signing/digestctx.go +++ b/pkg/contexts/ocm/signing/digestctx.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing import ( diff --git a/pkg/contexts/ocm/signing/handle.go b/pkg/contexts/ocm/signing/handle.go index fd1dabc3b6..9513b8eb3a 100644 --- a/pkg/contexts/ocm/signing/handle.go +++ b/pkg/contexts/ocm/signing/handle.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing import ( diff --git a/pkg/contexts/ocm/signing/handler_test.go b/pkg/contexts/ocm/signing/handler_test.go index 2f37054add..cc38a79c67 100644 --- a/pkg/contexts/ocm/signing/handler_test.go +++ b/pkg/contexts/ocm/signing/handler_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing_test import ( diff --git a/pkg/contexts/ocm/signing/options.go b/pkg/contexts/ocm/signing/options.go index fd44ac0204..d286fc0016 100644 --- a/pkg/contexts/ocm/signing/options.go +++ b/pkg/contexts/ocm/signing/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing import ( diff --git a/pkg/contexts/ocm/signing/options_test.go b/pkg/contexts/ocm/signing/options_test.go index dadcc1949d..e4459887ee 100644 --- a/pkg/contexts/ocm/signing/options_test.go +++ b/pkg/contexts/ocm/signing/options_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing_test import ( diff --git a/pkg/contexts/ocm/signing/signing_test.go b/pkg/contexts/ocm/signing/signing_test.go index aeb5ea9bec..43d8a31140 100644 --- a/pkg/contexts/ocm/signing/signing_test.go +++ b/pkg/contexts/ocm/signing/signing_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing_test import ( diff --git a/pkg/contexts/ocm/signing/suite_test.go b/pkg/contexts/ocm/signing/suite_test.go index 75497bfaa1..5007a0ab61 100644 --- a/pkg/contexts/ocm/signing/suite_test.go +++ b/pkg/contexts/ocm/signing/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing_test import ( diff --git a/pkg/contexts/ocm/signing/transport_test.go b/pkg/contexts/ocm/signing/transport_test.go index 894be6ca73..7ced4dd61e 100644 --- a/pkg/contexts/ocm/signing/transport_test.go +++ b/pkg/contexts/ocm/signing/transport_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing_test import ( diff --git a/pkg/contexts/ocm/suite_test.go b/pkg/contexts/ocm/suite_test.go index 188aaa92e5..cdcf94940d 100644 --- a/pkg/contexts/ocm/suite_test.go +++ b/pkg/contexts/ocm/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm_test import ( diff --git a/pkg/contexts/ocm/testhelper/references.go b/pkg/contexts/ocm/testhelper/references.go index b9753b7396..2838193e11 100644 --- a/pkg/contexts/ocm/testhelper/references.go +++ b/pkg/contexts/ocm/testhelper/references.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testhelper import ( diff --git a/pkg/contexts/ocm/testhelper/refmgmt.go b/pkg/contexts/ocm/testhelper/refmgmt.go index d086af3735..3c0ac77832 100644 --- a/pkg/contexts/ocm/testhelper/refmgmt.go +++ b/pkg/contexts/ocm/testhelper/refmgmt.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testhelper import ( diff --git a/pkg/contexts/ocm/testhelper/resources.go b/pkg/contexts/ocm/testhelper/resources.go index b2b24fdb77..c43778bf2c 100644 --- a/pkg/contexts/ocm/testhelper/resources.go +++ b/pkg/contexts/ocm/testhelper/resources.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //nolint:gosec // digests of test manifests package testhelper diff --git a/pkg/contexts/ocm/transfer/autohandler.go b/pkg/contexts/ocm/transfer/autohandler.go index 2083c39d41..77d01bdac3 100644 --- a/pkg/contexts/ocm/transfer/autohandler.go +++ b/pkg/contexts/ocm/transfer/autohandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer import ( diff --git a/pkg/contexts/ocm/transfer/autohandler_test.go b/pkg/contexts/ocm/transfer/autohandler_test.go index 60abf27ba1..7ccee7de85 100644 --- a/pkg/contexts/ocm/transfer/autohandler_test.go +++ b/pkg/contexts/ocm/transfer/autohandler_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer_test import ( diff --git a/pkg/contexts/ocm/transfer/convenience.go b/pkg/contexts/ocm/transfer/convenience.go index 397bdd389a..e30fbd14e9 100644 --- a/pkg/contexts/ocm/transfer/convenience.go +++ b/pkg/contexts/ocm/transfer/convenience.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer import ( diff --git a/pkg/contexts/ocm/transfer/debug.go b/pkg/contexts/ocm/transfer/debug.go index 0a7db1e4ff..65cafbdbd7 100644 --- a/pkg/contexts/ocm/transfer/debug.go +++ b/pkg/contexts/ocm/transfer/debug.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer var Breakpoints = false diff --git a/pkg/contexts/ocm/transfer/init.go b/pkg/contexts/ocm/transfer/init.go index 4ffce5463b..677b703415 100644 --- a/pkg/contexts/ocm/transfer/init.go +++ b/pkg/contexts/ocm/transfer/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer import ( diff --git a/pkg/contexts/ocm/transfer/internal/merge.go b/pkg/contexts/ocm/transfer/internal/merge.go index 9d0d4e007e..0b50eb0322 100644 --- a/pkg/contexts/ocm/transfer/internal/merge.go +++ b/pkg/contexts/ocm/transfer/internal/merge.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/transfer/logging.go b/pkg/contexts/ocm/transfer/logging.go index 0b88e1795f..aec3cdcae7 100644 --- a/pkg/contexts/ocm/transfer/logging.go +++ b/pkg/contexts/ocm/transfer/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer import ( diff --git a/pkg/contexts/ocm/transfer/merge_test.go b/pkg/contexts/ocm/transfer/merge_test.go index a6dcc1a89e..e1fc075248 100644 --- a/pkg/contexts/ocm/transfer/merge_test.go +++ b/pkg/contexts/ocm/transfer/merge_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer_test import ( diff --git a/pkg/contexts/ocm/transfer/needs.go b/pkg/contexts/ocm/transfer/needs.go index a6fe3d30e2..8a31c4a43b 100644 --- a/pkg/contexts/ocm/transfer/needs.go +++ b/pkg/contexts/ocm/transfer/needs.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer import ( diff --git a/pkg/contexts/ocm/transfer/options.go b/pkg/contexts/ocm/transfer/options.go index 3b24d35ec7..679ac3250f 100644 --- a/pkg/contexts/ocm/transfer/options.go +++ b/pkg/contexts/ocm/transfer/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer import ( diff --git a/pkg/contexts/ocm/transfer/suite_test.go b/pkg/contexts/ocm/transfer/suite_test.go index f91d893bd0..66d4341a3a 100644 --- a/pkg/contexts/ocm/transfer/suite_test.go +++ b/pkg/contexts/ocm/transfer/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer_test import ( diff --git a/pkg/contexts/ocm/transfer/transfer.go b/pkg/contexts/ocm/transfer/transfer.go index b14884902f..fd76f7ef1a 100644 --- a/pkg/contexts/ocm/transfer/transfer.go +++ b/pkg/contexts/ocm/transfer/transfer.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer import ( diff --git a/pkg/contexts/ocm/transfer/transferhandler/config/config.go b/pkg/contexts/ocm/transfer/transferhandler/config/config.go index 41b3dfa64f..2a45ba832b 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/config/config.go +++ b/pkg/contexts/ocm/transfer/transferhandler/config/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package scriptoption import ( diff --git a/pkg/contexts/ocm/transfer/transferhandler/doc.go b/pkg/contexts/ocm/transfer/transferhandler/doc.go index b294d57d8d..348ce7a5d1 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/doc.go +++ b/pkg/contexts/ocm/transfer/transferhandler/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package transferhandler provides the API for transfer handlers used // during the transfer process of an OCM component. // There is a common generic transfer functionality in package transfer, diff --git a/pkg/contexts/ocm/transfer/transferhandler/registry.go b/pkg/contexts/ocm/transfer/transferhandler/registry.go index 70d44fa57b..ec67818a26 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/registry.go +++ b/pkg/contexts/ocm/transfer/transferhandler/registry.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transferhandler import ( diff --git a/pkg/contexts/ocm/transfer/transferhandler/spiff/handler.go b/pkg/contexts/ocm/transfer/transferhandler/spiff/handler.go index 34b15c2430..0297c09408 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/spiff/handler.go +++ b/pkg/contexts/ocm/transfer/transferhandler/spiff/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spiff import ( diff --git a/pkg/contexts/ocm/transfer/transferhandler/spiff/handler_test.go b/pkg/contexts/ocm/transfer/transferhandler/spiff/handler_test.go index 729547f236..2b7eca4ea3 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/spiff/handler_test.go +++ b/pkg/contexts/ocm/transfer/transferhandler/spiff/handler_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spiff_test import ( diff --git a/pkg/contexts/ocm/transfer/transferhandler/spiff/options.go b/pkg/contexts/ocm/transfer/transferhandler/spiff/options.go index 990b5c5a1e..db74ca9419 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/spiff/options.go +++ b/pkg/contexts/ocm/transfer/transferhandler/spiff/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spiff import ( diff --git a/pkg/contexts/ocm/transfer/transferhandler/spiff/suite_test.go b/pkg/contexts/ocm/transfer/transferhandler/spiff/suite_test.go index 932c02c42a..d883148df5 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/spiff/suite_test.go +++ b/pkg/contexts/ocm/transfer/transferhandler/spiff/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spiff_test import ( diff --git a/pkg/contexts/ocm/transfer/transferhandler/standard/handler.go b/pkg/contexts/ocm/transfer/transferhandler/standard/handler.go index ce0e18e2e9..36d33566fa 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/standard/handler.go +++ b/pkg/contexts/ocm/transfer/transferhandler/standard/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package standard import ( diff --git a/pkg/contexts/ocm/transfer/transferhandler/standard/handler_test.go b/pkg/contexts/ocm/transfer/transferhandler/standard/handler_test.go index 804a5f0ec3..bc72fbd131 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/standard/handler_test.go +++ b/pkg/contexts/ocm/transfer/transferhandler/standard/handler_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package standard_test import ( diff --git a/pkg/contexts/ocm/transfer/transferhandler/standard/options.go b/pkg/contexts/ocm/transfer/transferhandler/standard/options.go index 5b8d1a734c..5ee687e658 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/standard/options.go +++ b/pkg/contexts/ocm/transfer/transferhandler/standard/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package standard import ( diff --git a/pkg/contexts/ocm/transfer/transferhandler/standard/suite_test.go b/pkg/contexts/ocm/transfer/transferhandler/standard/suite_test.go index 71af742590..1ddd4aa69d 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/standard/suite_test.go +++ b/pkg/contexts/ocm/transfer/transferhandler/standard/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package standard_test import ( diff --git a/pkg/contexts/ocm/transfer/transferhandler/standard/utils.go b/pkg/contexts/ocm/transfer/transferhandler/standard/utils.go index 9941025117..9fb9a53e06 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/standard/utils.go +++ b/pkg/contexts/ocm/transfer/transferhandler/standard/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package standard import ( diff --git a/pkg/contexts/ocm/transfer/transferhandler/standard/utils_test.go b/pkg/contexts/ocm/transfer/transferhandler/standard/utils_test.go index 114eac0512..b181690d9f 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/standard/utils_test.go +++ b/pkg/contexts/ocm/transfer/transferhandler/standard/utils_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package standard_test import ( diff --git a/pkg/contexts/ocm/transfer/transferhandler/transferhandler.go b/pkg/contexts/ocm/transfer/transferhandler/transferhandler.go index 9dc5f1811f..264421e86c 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/transferhandler.go +++ b/pkg/contexts/ocm/transfer/transferhandler/transferhandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transferhandler import ( diff --git a/pkg/contexts/ocm/transfer/transferrepo.go b/pkg/contexts/ocm/transfer/transferrepo.go index 4161d0c930..f60bb1f69a 100644 --- a/pkg/contexts/ocm/transfer/transferrepo.go +++ b/pkg/contexts/ocm/transfer/transferrepo.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package transfer import ( diff --git a/pkg/contexts/ocm/usage.go b/pkg/contexts/ocm/usage.go index 7ed4e0e10b..09f8371dfb 100644 --- a/pkg/contexts/ocm/usage.go +++ b/pkg/contexts/ocm/usage.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm func AccessUsage(scheme AccessTypeScheme, cli bool) string { diff --git a/pkg/contexts/ocm/utils.go b/pkg/contexts/ocm/utils.go index 1518dbab84..2d65083b03 100644 --- a/pkg/contexts/ocm/utils.go +++ b/pkg/contexts/ocm/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm import ( diff --git a/pkg/contexts/ocm/utils/check/check.go b/pkg/contexts/ocm/utils/check/check.go index d2710e3cd0..12124d9b10 100644 --- a/pkg/contexts/ocm/utils/check/check.go +++ b/pkg/contexts/ocm/utils/check/check.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package check import ( diff --git a/pkg/contexts/ocm/utils/check/check_test.go b/pkg/contexts/ocm/utils/check/check_test.go index 259adf82f2..a7407bdeae 100644 --- a/pkg/contexts/ocm/utils/check/check_test.go +++ b/pkg/contexts/ocm/utils/check/check_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package check_test import ( diff --git a/pkg/contexts/ocm/utils/check/options.go b/pkg/contexts/ocm/utils/check/options.go index 8a7eede8c4..d263e693e9 100644 --- a/pkg/contexts/ocm/utils/check/options.go +++ b/pkg/contexts/ocm/utils/check/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package check import ( diff --git a/pkg/contexts/ocm/utils/check/suite_test.go b/pkg/contexts/ocm/utils/check/suite_test.go index 2ecf25801a..7c8ed3056a 100644 --- a/pkg/contexts/ocm/utils/check/suite_test.go +++ b/pkg/contexts/ocm/utils/check/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package check_test import ( diff --git a/pkg/contexts/ocm/utils/defaultconfigregistry/configure.go b/pkg/contexts/ocm/utils/defaultconfigregistry/configure.go index 67f51b24c7..cce4170c7d 100644 --- a/pkg/contexts/ocm/utils/defaultconfigregistry/configure.go +++ b/pkg/contexts/ocm/utils/defaultconfigregistry/configure.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package defaultconfigregistry import ( diff --git a/pkg/contexts/ocm/utils/localize/config.go b/pkg/contexts/ocm/utils/localize/config.go index 6c41c9a198..8ea8d9dbc0 100644 --- a/pkg/contexts/ocm/utils/localize/config.go +++ b/pkg/contexts/ocm/utils/localize/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localize import ( diff --git a/pkg/contexts/ocm/utils/localize/config_test.go b/pkg/contexts/ocm/utils/localize/config_test.go index c09d0ad96d..3b79594285 100644 --- a/pkg/contexts/ocm/utils/localize/config_test.go +++ b/pkg/contexts/ocm/utils/localize/config_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localize_test import ( diff --git a/pkg/contexts/ocm/utils/localize/format.go b/pkg/contexts/ocm/utils/localize/format.go index 4fb91e327e..0fa56defbf 100644 --- a/pkg/contexts/ocm/utils/localize/format.go +++ b/pkg/contexts/ocm/utils/localize/format.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localize import ( diff --git a/pkg/contexts/ocm/utils/localize/instantiate.go b/pkg/contexts/ocm/utils/localize/instantiate.go index 8aca5ffeda..35d66361f9 100644 --- a/pkg/contexts/ocm/utils/localize/instantiate.go +++ b/pkg/contexts/ocm/utils/localize/instantiate.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localize import ( diff --git a/pkg/contexts/ocm/utils/localize/instantiate_test.go b/pkg/contexts/ocm/utils/localize/instantiate_test.go index 09d86e0c27..d60528f22e 100644 --- a/pkg/contexts/ocm/utils/localize/instantiate_test.go +++ b/pkg/contexts/ocm/utils/localize/instantiate_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localize_test import ( diff --git a/pkg/contexts/ocm/utils/localize/localize.go b/pkg/contexts/ocm/utils/localize/localize.go index df68df9620..d4f7e7ac63 100644 --- a/pkg/contexts/ocm/utils/localize/localize.go +++ b/pkg/contexts/ocm/utils/localize/localize.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localize import ( diff --git a/pkg/contexts/ocm/utils/localize/localize_test.go b/pkg/contexts/ocm/utils/localize/localize_test.go index 17bf44ff6c..0d5b261f00 100644 --- a/pkg/contexts/ocm/utils/localize/localize_test.go +++ b/pkg/contexts/ocm/utils/localize/localize_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localize_test import ( diff --git a/pkg/contexts/ocm/utils/localize/subst.go b/pkg/contexts/ocm/utils/localize/subst.go index 10ddb51078..36ec20f681 100644 --- a/pkg/contexts/ocm/utils/localize/subst.go +++ b/pkg/contexts/ocm/utils/localize/subst.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localize import ( diff --git a/pkg/contexts/ocm/utils/localize/subst_test.go b/pkg/contexts/ocm/utils/localize/subst_test.go index 292e3c491c..74b3c6aa2a 100644 --- a/pkg/contexts/ocm/utils/localize/subst_test.go +++ b/pkg/contexts/ocm/utils/localize/subst_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localize_test import ( diff --git a/pkg/contexts/ocm/utils/localize/suite_test.go b/pkg/contexts/ocm/utils/localize/suite_test.go index 320690e345..48145acc88 100644 --- a/pkg/contexts/ocm/utils/localize/suite_test.go +++ b/pkg/contexts/ocm/utils/localize/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localize_test import ( diff --git a/pkg/contexts/ocm/utils/localize/target_test.go b/pkg/contexts/ocm/utils/localize/target_test.go index b22fb86166..c2c048de5d 100644 --- a/pkg/contexts/ocm/utils/localize/target_test.go +++ b/pkg/contexts/ocm/utils/localize/target_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localize_test import ( diff --git a/pkg/contexts/ocm/utils/localize/utils_test.go b/pkg/contexts/ocm/utils/localize/utils_test.go index 939e90bf47..974f496d6f 100644 --- a/pkg/contexts/ocm/utils/localize/utils_test.go +++ b/pkg/contexts/ocm/utils/localize/utils_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package localize_test import ( diff --git a/pkg/contexts/ocm/utils/registry/registry.go b/pkg/contexts/ocm/utils/registry/registry.go index e5fbdd5822..b61741e1f5 100644 --- a/pkg/contexts/ocm/utils/registry/registry.go +++ b/pkg/contexts/ocm/utils/registry/registry.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package registry import ( diff --git a/pkg/contexts/ocm/utils/registry/registry_test.go b/pkg/contexts/ocm/utils/registry/registry_test.go index 841aedffbc..a55f364817 100644 --- a/pkg/contexts/ocm/utils/registry/registry_test.go +++ b/pkg/contexts/ocm/utils/registry/registry_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package registry_test import ( diff --git a/pkg/contexts/ocm/utils/registry/regkey.go b/pkg/contexts/ocm/utils/registry/regkey.go index 858ac6874a..6350f9fab1 100644 --- a/pkg/contexts/ocm/utils/registry/regkey.go +++ b/pkg/contexts/ocm/utils/registry/regkey.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package registry import ( diff --git a/pkg/contexts/ocm/utils/registry/suite_test.go b/pkg/contexts/ocm/utils/registry/suite_test.go index 3759e98ba9..f3d9d46bec 100644 --- a/pkg/contexts/ocm/utils/registry/suite_test.go +++ b/pkg/contexts/ocm/utils/registry/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package registry_test import ( diff --git a/pkg/contexts/ocm/utils/resource.go b/pkg/contexts/ocm/utils/resource.go index 559099f3ed..3fbb771d46 100644 --- a/pkg/contexts/ocm/utils/resource.go +++ b/pkg/contexts/ocm/utils/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/pkg/contexts/ocm/utils/resourceref.go b/pkg/contexts/ocm/utils/resourceref.go index b0c45014c7..7168a40f61 100644 --- a/pkg/contexts/ocm/utils/resourceref.go +++ b/pkg/contexts/ocm/utils/resourceref.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/pkg/contexts/ocm/utils/resourceref_test.go b/pkg/contexts/ocm/utils/resourceref_test.go index 3c76f10ee9..b54450432c 100644 --- a/pkg/contexts/ocm/utils/resourceref_test.go +++ b/pkg/contexts/ocm/utils/resourceref_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils_test import ( diff --git a/pkg/contexts/ocm/utils/suite_test.go b/pkg/contexts/ocm/utils/suite_test.go index b0dd82706c..0a64359a6d 100644 --- a/pkg/contexts/ocm/utils/suite_test.go +++ b/pkg/contexts/ocm/utils/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils_test import ( diff --git a/pkg/contexts/ocm/utils/utils.go b/pkg/contexts/ocm/utils/utils.go index 3b27906978..f86636fbdc 100644 --- a/pkg/contexts/ocm/utils/utils.go +++ b/pkg/contexts/ocm/utils/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/pkg/contexts/ocm/utils/walk.go b/pkg/contexts/ocm/utils/walk.go index 7937e2184e..2330a87aa6 100644 --- a/pkg/contexts/ocm/utils/walk.go +++ b/pkg/contexts/ocm/utils/walk.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/pkg/contexts/ocm/valuemergehandler/config/config_test.go b/pkg/contexts/ocm/valuemergehandler/config/config_test.go index 846ba9cdc8..4c0aabff90 100644 --- a/pkg/contexts/ocm/valuemergehandler/config/config_test.go +++ b/pkg/contexts/ocm/valuemergehandler/config/config_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/ocm/valuemergehandler/config/suite_test.go b/pkg/contexts/ocm/valuemergehandler/config/suite_test.go index 3bb407741d..cacc59bc60 100644 --- a/pkg/contexts/ocm/valuemergehandler/config/suite_test.go +++ b/pkg/contexts/ocm/valuemergehandler/config/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config_test import ( diff --git a/pkg/contexts/ocm/valuemergehandler/config/type.go b/pkg/contexts/ocm/valuemergehandler/config/type.go index d767bf5325..b51f73276a 100644 --- a/pkg/contexts/ocm/valuemergehandler/config/type.go +++ b/pkg/contexts/ocm/valuemergehandler/config/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package config import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/config.go b/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/config.go index f6fa947e81..33f855ada5 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/config.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package defaultmerge import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/handler.go b/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/handler.go index 7ef352cc7e..99d11bf43c 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/handler.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package defaultmerge import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/handler_test.go b/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/handler_test.go index bc029be78e..3c8a0fbd50 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/handler_test.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/handler_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package defaultmerge import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/suite_test.go b/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/suite_test.go index 471c0d8eab..6c1c4bebdf 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/suite_test.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package defaultmerge_test import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/init.go b/pkg/contexts/ocm/valuemergehandler/handlers/init.go index d7894f5a36..fb48f9b568 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/init.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package handlers import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/config.go b/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/config.go index 223dd3bc92..226f192560 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/config.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package maplistmerge import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/handler.go b/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/handler.go index f97c0e4d74..c629ee09cd 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/handler.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package maplistmerge import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/handler_test.go b/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/handler_test.go index b7b2057a23..0051765e86 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/handler_test.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/handler_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package maplistmerge_test import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/suite_test.go b/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/suite_test.go index 5b8ab87991..af70fe2ad2 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/suite_test.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package maplistmerge_test import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/plugin/config.go b/pkg/contexts/ocm/valuemergehandler/handlers/plugin/config.go index 067a48f22e..70f6559e18 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/plugin/config.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/plugin/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/plugin/handler.go b/pkg/contexts/ocm/valuemergehandler/handlers/plugin/handler.go index 27050d2cdf..8f58da2106 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/plugin/handler.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/plugin/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/plugin/handler_test.go b/pkg/contexts/ocm/valuemergehandler/handlers/plugin/handler_test.go index 3e934c722c..f6c57d7a95 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/plugin/handler_test.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/plugin/handler_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:build unix package plugin_test diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/plugin/suite_test.go b/pkg/contexts/ocm/valuemergehandler/handlers/plugin/suite_test.go index aeff7f3c55..1cd3802591 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/plugin/suite_test.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/plugin/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package plugin_test import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/plugin/testdata/merge b/pkg/contexts/ocm/valuemergehandler/handlers/plugin/testdata/merge index 2a607aad86..9aa19add28 100755 --- a/pkg/contexts/ocm/valuemergehandler/handlers/plugin/testdata/merge +++ b/pkg/contexts/ocm/valuemergehandler/handlers/plugin/testdata/merge @@ -1,9 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -# -# SPDX-License-Identifier: Apache-2.0 - NAME="$(basename "$0")" Error() { diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/config.go b/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/config.go index 15e2a7ba4c..78492c28e1 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/config.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package simplelistmerge import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/handler.go b/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/handler.go index e0f38f7cc4..0a30f4524e 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/handler.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package simplelistmerge import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/handler_test.go b/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/handler_test.go index 6bfe97abc8..9b74b44b70 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/handler_test.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/handler_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package simplelistmerge_test import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/suite_test.go b/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/suite_test.go index 3f03aa0854..82f4c1a026 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/suite_test.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/simplelistmerge/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package simplelistmerge_test import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/config.go b/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/config.go index 25ce20bab2..9528370036 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/config.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package simplemapmerge import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/handler.go b/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/handler.go index 8664759c43..03a0b3f278 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/handler.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package simplemapmerge import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/handler_test.go b/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/handler_test.go index 60aee15304..4bd475b681 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/handler_test.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/handler_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package simplemapmerge_test import ( diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/suite_test.go b/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/suite_test.go index b7fcf6fc01..4e398c684e 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/suite_test.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package simplemapmerge_test import ( diff --git a/pkg/contexts/ocm/valuemergehandler/hpi/interface.go b/pkg/contexts/ocm/valuemergehandler/hpi/interface.go index 81ad0fbf5c..5d22bc8b52 100644 --- a/pkg/contexts/ocm/valuemergehandler/hpi/interface.go +++ b/pkg/contexts/ocm/valuemergehandler/hpi/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package hpi contains the Handler Programming Interface for // value merge handlers package hpi diff --git a/pkg/contexts/ocm/valuemergehandler/hpi/logging.go b/pkg/contexts/ocm/valuemergehandler/hpi/logging.go index 5994a150bc..f560651004 100644 --- a/pkg/contexts/ocm/valuemergehandler/hpi/logging.go +++ b/pkg/contexts/ocm/valuemergehandler/hpi/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hpi import ( diff --git a/pkg/contexts/ocm/valuemergehandler/hpi/merge.go b/pkg/contexts/ocm/valuemergehandler/hpi/merge.go index 18e93f76f9..2a31c1bfbb 100644 --- a/pkg/contexts/ocm/valuemergehandler/hpi/merge.go +++ b/pkg/contexts/ocm/valuemergehandler/hpi/merge.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hpi import ( diff --git a/pkg/contexts/ocm/valuemergehandler/hpi/setup.go b/pkg/contexts/ocm/valuemergehandler/hpi/setup.go index 6d98f1dc46..7b15395801 100644 --- a/pkg/contexts/ocm/valuemergehandler/hpi/setup.go +++ b/pkg/contexts/ocm/valuemergehandler/hpi/setup.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hpi import ( diff --git a/pkg/contexts/ocm/valuemergehandler/hpi/support.go b/pkg/contexts/ocm/valuemergehandler/hpi/support.go index 1ec0d136d2..d22f91003c 100644 --- a/pkg/contexts/ocm/valuemergehandler/hpi/support.go +++ b/pkg/contexts/ocm/valuemergehandler/hpi/support.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hpi import ( diff --git a/pkg/contexts/ocm/valuemergehandler/interface.go b/pkg/contexts/ocm/valuemergehandler/interface.go index 806e462e75..13cd3ccda0 100644 --- a/pkg/contexts/ocm/valuemergehandler/interface.go +++ b/pkg/contexts/ocm/valuemergehandler/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package valuemergehandler import ( diff --git a/pkg/contexts/ocm/valuemergehandler/internal/interface.go b/pkg/contexts/ocm/valuemergehandler/internal/interface.go index 49fce576bf..bf118e2c01 100644 --- a/pkg/contexts/ocm/valuemergehandler/internal/interface.go +++ b/pkg/contexts/ocm/valuemergehandler/internal/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/valuemergehandler/internal/support.go b/pkg/contexts/ocm/valuemergehandler/internal/support.go index df88e64fe2..8200b3c603 100644 --- a/pkg/contexts/ocm/valuemergehandler/internal/support.go +++ b/pkg/contexts/ocm/valuemergehandler/internal/support.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/valuemergehandler/internal/valuemergehandler.go b/pkg/contexts/ocm/valuemergehandler/internal/valuemergehandler.go index fb38372738..764821f20a 100644 --- a/pkg/contexts/ocm/valuemergehandler/internal/valuemergehandler.go +++ b/pkg/contexts/ocm/valuemergehandler/internal/valuemergehandler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/ocm/valuemergehandler/merge.go b/pkg/contexts/ocm/valuemergehandler/merge.go index 6260ffa5d5..a08c57ce9b 100644 --- a/pkg/contexts/ocm/valuemergehandler/merge.go +++ b/pkg/contexts/ocm/valuemergehandler/merge.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package valuemergehandler import ( diff --git a/pkg/contexts/ocm/valuemergehandler/usage.go b/pkg/contexts/ocm/valuemergehandler/usage.go index d8fc3bb70f..b8583a2f0d 100644 --- a/pkg/contexts/ocm/valuemergehandler/usage.go +++ b/pkg/contexts/ocm/valuemergehandler/usage.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package valuemergehandler import ( diff --git a/pkg/contexts/options/utils.go b/pkg/contexts/options/utils.go index 2ca1b25a4a..5be48cac2d 100644 --- a/pkg/contexts/options/utils.go +++ b/pkg/contexts/options/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package options import ( diff --git a/pkg/dirtree/context.go b/pkg/dirtree/context.go index 7e6cf5caa6..d31e78086c 100644 --- a/pkg/dirtree/context.go +++ b/pkg/dirtree/context.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtree import ( diff --git a/pkg/dirtree/dirtree.go b/pkg/dirtree/dirtree.go index 1ff632b884..5fba1c09a7 100644 --- a/pkg/dirtree/dirtree.go +++ b/pkg/dirtree/dirtree.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtree import ( diff --git a/pkg/dirtree/suite_test.go b/pkg/dirtree/suite_test.go index 582c79f97c..434381ed9a 100644 --- a/pkg/dirtree/suite_test.go +++ b/pkg/dirtree/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtree_test import ( diff --git a/pkg/dirtree/tar.go b/pkg/dirtree/tar.go index c82f8e6d24..e64b4fa28f 100644 --- a/pkg/dirtree/tar.go +++ b/pkg/dirtree/tar.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtree import ( diff --git a/pkg/dirtree/utils.go b/pkg/dirtree/utils.go index b12720cd03..bf0b076cbc 100644 --- a/pkg/dirtree/utils.go +++ b/pkg/dirtree/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtree import ( diff --git a/pkg/dirtree/vfs.go b/pkg/dirtree/vfs.go index e32d95db13..97b2f04264 100644 --- a/pkg/dirtree/vfs.go +++ b/pkg/dirtree/vfs.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtree import ( diff --git a/pkg/dirtree/vfs_test.go b/pkg/dirtree/vfs_test.go index bee35e6d72..3a9189e7f9 100644 --- a/pkg/dirtree/vfs_test.go +++ b/pkg/dirtree/vfs_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package dirtree_test import ( diff --git a/pkg/docker/fetcher.go b/pkg/docker/fetcher.go index 230b2b9773..6afe946308 100644 --- a/pkg/docker/fetcher.go +++ b/pkg/docker/fetcher.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/docker/handler.go b/pkg/docker/handler.go index 0292af5897..0ff9959ad3 100644 --- a/pkg/docker/handler.go +++ b/pkg/docker/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/docker/httpreadseeker.go b/pkg/docker/httpreadseeker.go index 4949021789..c6b803810b 100644 --- a/pkg/docker/httpreadseeker.go +++ b/pkg/docker/httpreadseeker.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/docker/lister.go b/pkg/docker/lister.go index c0ac5cd8e9..22e9122c34 100644 --- a/pkg/docker/lister.go +++ b/pkg/docker/lister.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/docker/orig.go b/pkg/docker/orig.go index bd0ee0df2f..c9b2468fba 100644 --- a/pkg/docker/orig.go +++ b/pkg/docker/orig.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/docker/pusher.go b/pkg/docker/pusher.go index b1439e38f8..e4bb720328 100644 --- a/pkg/docker/pusher.go +++ b/pkg/docker/pusher.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/docker/registry.go b/pkg/docker/registry.go index 9f2868491f..795dd6e244 100644 --- a/pkg/docker/registry.go +++ b/pkg/docker/registry.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/docker/resolve/interface.go b/pkg/docker/resolve/interface.go index 1dab8e256e..8476000012 100644 --- a/pkg/docker/resolve/interface.go +++ b/pkg/docker/resolve/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package resolve import ( diff --git a/pkg/docker/resolver.go b/pkg/docker/resolver.go index c1a8dc39e6..9776a60294 100644 --- a/pkg/docker/resolver.go +++ b/pkg/docker/resolver.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/encrypt/encrypt.go b/pkg/encrypt/encrypt.go index 5d810d225d..8f3890faa7 100644 --- a/pkg/encrypt/encrypt.go +++ b/pkg/encrypt/encrypt.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package encrypt import ( diff --git a/pkg/env/builder/blob.go b/pkg/env/builder/blob.go index eda656193f..17aa690e22 100644 --- a/pkg/env/builder/blob.go +++ b/pkg/env/builder/blob.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/builder.go b/pkg/env/builder/builder.go index 2eba2f7b86..40dc6efdab 100644 --- a/pkg/env/builder/builder.go +++ b/pkg/env/builder/builder.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/builder_test.go b/pkg/env/builder/builder_test.go index 2fe3677e2c..eb75115391 100644 --- a/pkg/env/builder/builder_test.go +++ b/pkg/env/builder/builder_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( @@ -28,7 +24,7 @@ var _ = Describe("Builder", func() { err := env.Build(func(e *Builder) { e.ExtraIdentity("a", "b") }) - Expect(err).To(MatchError("builder.(*Builder).ExtraIdentity(29): element with metadata required")) + Expect(err).To(MatchError("builder.(*Builder).ExtraIdentity(25): element with metadata required")) }) It("catches explicit error", func() { @@ -42,27 +38,21 @@ var _ = Describe("Builder", func() { err := env.Build(func(e *Builder) { env.Fail("dedicated") }) - Expect(err).To(MatchError("env.(*Environment).Fail(43): dedicated")) + Expect(err).To(MatchError("env.(*Environment).Fail(39): dedicated")) }) It("catches explicit env error", func() { err := env.Build(func(e *Builder) { env.FailOnErr(fmt.Errorf("dedicated"), "context") }) - Expect(err).To(MatchError("env.(*Environment).FailOnErr(50): context: dedicated")) + Expect(err).To(MatchError("env.(*Environment).FailOnErr(46): context: dedicated")) }) It("catches outer error", func() { Expect(Build(func(e *Builder) { e.ExtraIdentity("a", "b") - })).To(MatchError("builder.(*Builder).ExtraIdentity(57): element with metadata required")) + })).To(MatchError("builder.(*Builder).ExtraIdentity(53): element with metadata required")) }) - - /* - It("catches outer error", func() { - NewBuilder().ExtraIdentity("a", "b") - }) - */ }) func Build(funcs ...func(e *Builder)) (err error) { diff --git a/pkg/env/builder/oci_anno.go b/pkg/env/builder/oci_anno.go index e4debcac49..839ec42f20 100644 --- a/pkg/env/builder/oci_anno.go +++ b/pkg/env/builder/oci_anno.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder func (b *Builder) Annotation(name, value string) { diff --git a/pkg/env/builder/oci_artifact.go b/pkg/env/builder/oci_artifact.go index 815162c604..e0c1030284 100644 --- a/pkg/env/builder/oci_artifact.go +++ b/pkg/env/builder/oci_artifact.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/oci_artifactset.go b/pkg/env/builder/oci_artifactset.go index dee90107fa..4ab3aa029c 100644 --- a/pkg/env/builder/oci_artifactset.go +++ b/pkg/env/builder/oci_artifactset.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/oci_config.go b/pkg/env/builder/oci_config.go index 4ea99cbffc..1c10841033 100644 --- a/pkg/env/builder/oci_config.go +++ b/pkg/env/builder/oci_config.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/oci_ctf.go b/pkg/env/builder/oci_ctf.go index bf0d8062c5..86cae80b0a 100644 --- a/pkg/env/builder/oci_ctf.go +++ b/pkg/env/builder/oci_ctf.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/oci_layer.go b/pkg/env/builder/oci_layer.go index bd7713a397..287054885e 100644 --- a/pkg/env/builder/oci_layer.go +++ b/pkg/env/builder/oci_layer.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/oci_namespace.go b/pkg/env/builder/oci_namespace.go index d0ba30df8b..e2d7eaf7c9 100644 --- a/pkg/env/builder/oci_namespace.go +++ b/pkg/env/builder/oci_namespace.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/oci_platform.go b/pkg/env/builder/oci_platform.go index cbfae7e1ee..a4513cd780 100644 --- a/pkg/env/builder/oci_platform.go +++ b/pkg/env/builder/oci_platform.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder const T_OCIPLATFORM = "platform consumer" diff --git a/pkg/env/builder/oci_repo.go b/pkg/env/builder/oci_repo.go index d57f546bd5..3fab3024df 100644 --- a/pkg/env/builder/oci_repo.go +++ b/pkg/env/builder/oci_repo.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/oci_tags.go b/pkg/env/builder/oci_tags.go index 65ce56feb3..d26a929dfe 100644 --- a/pkg/env/builder/oci_tags.go +++ b/pkg/env/builder/oci_tags.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder func (b *Builder) Tags(tags ...string) { diff --git a/pkg/env/builder/ocm_access.go b/pkg/env/builder/ocm_access.go index 8bf65937a5..c08a956e35 100644 --- a/pkg/env/builder/ocm_access.go +++ b/pkg/env/builder/ocm_access.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/ocm_comparch.go b/pkg/env/builder/ocm_comparch.go index 98012e2c12..956ff7865d 100644 --- a/pkg/env/builder/ocm_comparch.go +++ b/pkg/env/builder/ocm_comparch.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/ocm_component.go b/pkg/env/builder/ocm_component.go index 6d9d4a3a66..d2565e6117 100644 --- a/pkg/env/builder/ocm_component.go +++ b/pkg/env/builder/ocm_component.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/ocm_composition.go b/pkg/env/builder/ocm_composition.go index d055c74ab6..db4571cda0 100644 --- a/pkg/env/builder/ocm_composition.go +++ b/pkg/env/builder/ocm_composition.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/ocm_ctf.go b/pkg/env/builder/ocm_ctf.go index 25e9da4322..dfa52a34b1 100644 --- a/pkg/env/builder/ocm_ctf.go +++ b/pkg/env/builder/ocm_ctf.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/ocm_identity.go b/pkg/env/builder/ocm_identity.go index 617dacaba8..f77719a7e3 100644 --- a/pkg/env/builder/ocm_identity.go +++ b/pkg/env/builder/ocm_identity.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder const T_OCMMETA = "element with metadata" diff --git a/pkg/env/builder/ocm_label.go b/pkg/env/builder/ocm_label.go index 200fb50f6e..ff9982b8b1 100644 --- a/pkg/env/builder/ocm_label.go +++ b/pkg/env/builder/ocm_label.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/ocm_provider.go b/pkg/env/builder/ocm_provider.go index d72a26cf18..190052c5ce 100644 --- a/pkg/env/builder/ocm_provider.go +++ b/pkg/env/builder/ocm_provider.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/ocm_reference.go b/pkg/env/builder/ocm_reference.go index 08f2892052..b9b84fa6a0 100644 --- a/pkg/env/builder/ocm_reference.go +++ b/pkg/env/builder/ocm_reference.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/ocm_repo.go b/pkg/env/builder/ocm_repo.go index a991f0bb7c..47f3ca60ba 100644 --- a/pkg/env/builder/ocm_repo.go +++ b/pkg/env/builder/ocm_repo.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/ocm_resource.go b/pkg/env/builder/ocm_resource.go index 78da564678..57351c4752 100644 --- a/pkg/env/builder/ocm_resource.go +++ b/pkg/env/builder/ocm_resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/ocm_source.go b/pkg/env/builder/ocm_source.go index 8c718aa38d..dd788cb473 100644 --- a/pkg/env/builder/ocm_source.go +++ b/pkg/env/builder/ocm_source.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/ocm_version.go b/pkg/env/builder/ocm_version.go index 40bf1a71c3..f23bf0a479 100644 --- a/pkg/env/builder/ocm_version.go +++ b/pkg/env/builder/ocm_version.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/ocm_version_test.go b/pkg/env/builder/ocm_version_test.go index 25509b2b88..8d00a689a1 100644 --- a/pkg/env/builder/ocm_version_test.go +++ b/pkg/env/builder/ocm_version_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder_test import ( diff --git a/pkg/env/builder/rsa_keypair.go b/pkg/env/builder/rsa_keypair.go index 379b1a4c61..10b4452ed7 100644 --- a/pkg/env/builder/rsa_keypair.go +++ b/pkg/env/builder/rsa_keypair.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/builder/suite_test.go b/pkg/env/builder/suite_test.go index bbb33e866b..42a58a2603 100644 --- a/pkg/env/builder/suite_test.go +++ b/pkg/env/builder/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package builder import ( diff --git a/pkg/env/env.go b/pkg/env/env.go index 3990def951..66c1a85cb7 100644 --- a/pkg/env/env.go +++ b/pkg/env/env.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package env import ( diff --git a/pkg/env/env_test.go b/pkg/env/env_test.go index aba133b7be..a0896094ca 100644 --- a/pkg/env/env_test.go +++ b/pkg/env/env_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package env import ( diff --git a/pkg/env/keypair.go b/pkg/env/keypair.go index 5354039001..f1b286b7be 100644 --- a/pkg/env/keypair.go +++ b/pkg/env/keypair.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package env import ( diff --git a/pkg/env/suite_test.go b/pkg/env/suite_test.go index 4ddc2d096c..6fd6b59720 100644 --- a/pkg/env/suite_test.go +++ b/pkg/env/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package env import ( diff --git a/pkg/errors/alreadyexists.go b/pkg/errors/alreadyexists.go index 655ffa22e4..65aa022687 100644 --- a/pkg/errors/alreadyexists.go +++ b/pkg/errors/alreadyexists.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors type AlreadyExistsError struct { diff --git a/pkg/errors/closed.go b/pkg/errors/closed.go index 6153d535c1..0a9d9df21c 100644 --- a/pkg/errors/closed.go +++ b/pkg/errors/closed.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors type ClosedError struct { diff --git a/pkg/errors/error.go b/pkg/errors/error.go index 78124efc71..db20051ea7 100644 --- a/pkg/errors/error.go +++ b/pkg/errors/error.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // //nolint: errorlint // this is the new As method, also handling error lists package errors diff --git a/pkg/errors/error_test.go b/pkg/errors/error_test.go index 97a90dd252..7a8275d455 100644 --- a/pkg/errors/error_test.go +++ b/pkg/errors/error_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors_test import ( diff --git a/pkg/errors/errprop.go b/pkg/errors/errprop.go index b1a3a2047f..8046b27175 100644 --- a/pkg/errors/errprop.go +++ b/pkg/errors/errprop.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors import ( diff --git a/pkg/errors/errprop_test.go b/pkg/errors/errprop_test.go index 0cc1eaa21b..7ceb009fa1 100644 --- a/pkg/errors/errprop_test.go +++ b/pkg/errors/errprop_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors_test import ( diff --git a/pkg/errors/format.go b/pkg/errors/format.go index 15d456cd23..b6cab0145e 100644 --- a/pkg/errors/format.go +++ b/pkg/errors/format.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors type ErrorFormatter interface { diff --git a/pkg/errors/invalid.go b/pkg/errors/invalid.go index 3e85d8acad..065fa65368 100644 --- a/pkg/errors/invalid.go +++ b/pkg/errors/invalid.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors import ( diff --git a/pkg/errors/kinds.go b/pkg/errors/kinds.go index 8d43be0984..9a8a2a3fa9 100644 --- a/pkg/errors/kinds.go +++ b/pkg/errors/kinds.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors const ( diff --git a/pkg/errors/list.go b/pkg/errors/list.go index 699d02a17d..6b589684e6 100644 --- a/pkg/errors/list.go +++ b/pkg/errors/list.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors import ( diff --git a/pkg/errors/list_test.go b/pkg/errors/list_test.go index e3c0b2458a..2b81b325dd 100644 --- a/pkg/errors/list_test.go +++ b/pkg/errors/list_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors import ( diff --git a/pkg/errors/nomatch.go b/pkg/errors/nomatch.go index f3c97a1b4a..0e16a50164 100644 --- a/pkg/errors/nomatch.go +++ b/pkg/errors/nomatch.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors type NoMatchError struct { diff --git a/pkg/errors/notfound.go b/pkg/errors/notfound.go index 79d3546a0a..881fd62744 100644 --- a/pkg/errors/notfound.go +++ b/pkg/errors/notfound.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors type NotFoundError struct { diff --git a/pkg/errors/notimpl.go b/pkg/errors/notimpl.go index 35d8f71f98..a1693f2c2d 100644 --- a/pkg/errors/notimpl.go +++ b/pkg/errors/notimpl.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors type NotImplementedError struct { diff --git a/pkg/errors/notsupported.go b/pkg/errors/notsupported.go index e863abda60..2c2e8402f2 100644 --- a/pkg/errors/notsupported.go +++ b/pkg/errors/notsupported.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors type NotSupportedError struct { diff --git a/pkg/errors/readonly.go b/pkg/errors/readonly.go index 477af5bb35..b3ed211e61 100644 --- a/pkg/errors/readonly.go +++ b/pkg/errors/readonly.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors type ReadOnlyError struct { diff --git a/pkg/errors/recursion.go b/pkg/errors/recursion.go index cb9fb0dc4d..35e5cb0953 100644 --- a/pkg/errors/recursion.go +++ b/pkg/errors/recursion.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors import ( diff --git a/pkg/errors/required.go b/pkg/errors/required.go index cd0239459a..f3c8e62c99 100644 --- a/pkg/errors/required.go +++ b/pkg/errors/required.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors type RequiredError struct { diff --git a/pkg/errors/stillinuse.go b/pkg/errors/stillinuse.go index e747d2d0d8..589b09802f 100644 --- a/pkg/errors/stillinuse.go +++ b/pkg/errors/stillinuse.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors type StillInUseError struct { diff --git a/pkg/errors/suite_test.go b/pkg/errors/suite_test.go index dd393978b4..981f6d4487 100644 --- a/pkg/errors/suite_test.go +++ b/pkg/errors/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors_test import ( diff --git a/pkg/errors/unknown.go b/pkg/errors/unknown.go index 4fcead5065..324d997ef8 100644 --- a/pkg/errors/unknown.go +++ b/pkg/errors/unknown.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors type UnknownError struct { diff --git a/pkg/errors/utils.go b/pkg/errors/utils.go index 27cb1c3b37..77d41f17b2 100644 --- a/pkg/errors/utils.go +++ b/pkg/errors/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errors import ( diff --git a/pkg/exception/exception.go b/pkg/exception/exception.go index dc73f937b0..907937d1ae 100644 --- a/pkg/exception/exception.go +++ b/pkg/exception/exception.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package exception provides a simple exception mechanism // to reduce boilerplate for trivial error forwarding in // a function. diff --git a/pkg/exception/exception_test.go b/pkg/exception/exception_test.go index 8de551471e..5861d55039 100644 --- a/pkg/exception/exception_test.go +++ b/pkg/exception/exception_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package exception_test import ( diff --git a/pkg/exception/suite_test.go b/pkg/exception/suite_test.go index 18232f1c93..32398a9753 100644 --- a/pkg/exception/suite_test.go +++ b/pkg/exception/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package exception_test import ( diff --git a/pkg/finalizer/closer.go b/pkg/finalizer/closer.go index 3910dc8167..774a8aa64c 100644 --- a/pkg/finalizer/closer.go +++ b/pkg/finalizer/closer.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package finalizer import ( diff --git a/pkg/finalizer/finalizer.go b/pkg/finalizer/finalizer.go index 154516d493..629a3e9a15 100644 --- a/pkg/finalizer/finalizer.go +++ b/pkg/finalizer/finalizer.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package finalizer import ( diff --git a/pkg/finalizer/finalizer_test.go b/pkg/finalizer/finalizer_test.go index 9d7261965f..ae8def723c 100644 --- a/pkg/finalizer/finalizer_test.go +++ b/pkg/finalizer/finalizer_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package finalizer_test import ( diff --git a/pkg/finalizer/object.go b/pkg/finalizer/object.go index d092914916..04c37e30e7 100644 --- a/pkg/finalizer/object.go +++ b/pkg/finalizer/object.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package finalizer import ( diff --git a/pkg/finalizer/object_test.go b/pkg/finalizer/object_test.go index 0590242ff6..6223988550 100644 --- a/pkg/finalizer/object_test.go +++ b/pkg/finalizer/object_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package finalizer_test import ( diff --git a/pkg/finalizer/suite_test.go b/pkg/finalizer/suite_test.go index e721838b23..c9a2d906de 100644 --- a/pkg/finalizer/suite_test.go +++ b/pkg/finalizer/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package finalizer_test import ( diff --git a/pkg/generics/cast.go b/pkg/generics/cast.go index 3d6336b759..70b365a27c 100644 --- a/pkg/generics/cast.go +++ b/pkg/generics/cast.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package generics import ( diff --git a/pkg/generics/conditional.go b/pkg/generics/conditional.go index 9289489265..502761d240 100644 --- a/pkg/generics/conditional.go +++ b/pkg/generics/conditional.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package generics func Conditional[T any](cond bool, a, b T) T { diff --git a/pkg/generics/convert.go b/pkg/generics/convert.go index 13ff236dbd..20dcc6c7dd 100644 --- a/pkg/generics/convert.go +++ b/pkg/generics/convert.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package generics // ConvertSlice Converts the element typ of a slice. diff --git a/pkg/generics/map.go b/pkg/generics/map.go index 181cc9191c..b80852b46a 100644 --- a/pkg/generics/map.go +++ b/pkg/generics/map.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package generics func MapKeys[K comparable, V any](m map[K]V) Set[K] { diff --git a/pkg/generics/set.go b/pkg/generics/set.go index 5015bf13e1..6c827d7a4d 100644 --- a/pkg/generics/set.go +++ b/pkg/generics/set.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package generics import ( diff --git a/pkg/generics/slice.go b/pkg/generics/slice.go index 935ca06d63..26ebc8d0da 100644 --- a/pkg/generics/slice.go +++ b/pkg/generics/slice.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package generics import ( diff --git a/pkg/generics/utils.go b/pkg/generics/utils.go index 3ba184a44d..74a45bb666 100644 --- a/pkg/generics/utils.go +++ b/pkg/generics/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package generics func Pointer[T any](t T) *T { diff --git a/pkg/helm/chartaccess.go b/pkg/helm/chartaccess.go index 85ac6ad226..ca62fa1068 100644 --- a/pkg/helm/chartaccess.go +++ b/pkg/helm/chartaccess.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/pkg/helm/downloader.go b/pkg/helm/downloader.go index 9c3850049a..f014f5666b 100644 --- a/pkg/helm/downloader.go +++ b/pkg/helm/downloader.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/pkg/helm/identity/identity.go b/pkg/helm/identity/identity.go index 7a43618dee..6027b39ef2 100644 --- a/pkg/helm/identity/identity.go +++ b/pkg/helm/identity/identity.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package identity import ( diff --git a/pkg/helm/loader/access.go b/pkg/helm/loader/access.go index 75fd13a9a7..28c96f6693 100644 --- a/pkg/helm/loader/access.go +++ b/pkg/helm/loader/access.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package loader import ( diff --git a/pkg/helm/loader/directory.go b/pkg/helm/loader/directory.go index f8d987ea7c..46b99f54f2 100644 --- a/pkg/helm/loader/directory.go +++ b/pkg/helm/loader/directory.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package loader import ( diff --git a/pkg/helm/loader/forward.go b/pkg/helm/loader/forward.go index 2928b76a2d..6c9e236363 100644 --- a/pkg/helm/loader/forward.go +++ b/pkg/helm/loader/forward.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package loader import ( diff --git a/pkg/helm/loader/loader.go b/pkg/helm/loader/loader.go index 65f1a35017..f400f4c247 100644 --- a/pkg/helm/loader/loader.go +++ b/pkg/helm/loader/loader.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package loader import ( diff --git a/pkg/helm/options.go b/pkg/helm/options.go index 9abe82a856..c6bd5a0198 100644 --- a/pkg/helm/options.go +++ b/pkg/helm/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package helm import ( diff --git a/pkg/iotools/countingreader.go b/pkg/iotools/countingreader.go index 64c2249a36..2fe7b93f98 100644 --- a/pkg/iotools/countingreader.go +++ b/pkg/iotools/countingreader.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package iotools import ( diff --git a/pkg/iotools/digestreader.go b/pkg/iotools/digestreader.go index da23c237b9..af1cf0571a 100644 --- a/pkg/iotools/digestreader.go +++ b/pkg/iotools/digestreader.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package iotools import ( diff --git a/pkg/iotools/digestwriter.go b/pkg/iotools/digestwriter.go index bfb51f82a9..b0a824ccb7 100644 --- a/pkg/iotools/digestwriter.go +++ b/pkg/iotools/digestwriter.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package iotools import ( diff --git a/pkg/iotools/files.go b/pkg/iotools/files.go index ef363bb92c..546fae5fde 100644 --- a/pkg/iotools/files.go +++ b/pkg/iotools/files.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package iotools import ( diff --git a/pkg/iotools/readerwriter.go b/pkg/iotools/readerwriter.go index 935f788431..85f404936e 100644 --- a/pkg/iotools/readerwriter.go +++ b/pkg/iotools/readerwriter.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package iotools import ( diff --git a/pkg/iotools/utils.go b/pkg/iotools/utils.go index 563fd7c996..2f6cd8c3ad 100644 --- a/pkg/iotools/utils.go +++ b/pkg/iotools/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package iotools import ( diff --git a/pkg/listformat/listhelp.go b/pkg/listformat/listhelp.go index 4f8f772de3..99ce2d3ade 100644 --- a/pkg/listformat/listhelp.go +++ b/pkg/listformat/listhelp.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package listformat import ( diff --git a/pkg/logging/config_test.go b/pkg/logging/config_test.go index 788e586bcd..2c93704571 100644 --- a/pkg/logging/config_test.go +++ b/pkg/logging/config_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package logging_test import ( diff --git a/pkg/logging/interface.go b/pkg/logging/interface.go index 43097dc484..ffe74c6788 100644 --- a/pkg/logging/interface.go +++ b/pkg/logging/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package logging import ( diff --git a/pkg/logging/logging.go b/pkg/logging/logging.go index cab3549981..02df5b1834 100644 --- a/pkg/logging/logging.go +++ b/pkg/logging/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package logging import ( diff --git a/pkg/logging/stdkeys.go b/pkg/logging/stdkeys.go index 74b36add21..e70b6073a8 100644 --- a/pkg/logging/stdkeys.go +++ b/pkg/logging/stdkeys.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package logging // standard logging value attribute names used in this library. diff --git a/pkg/logging/suite_test.go b/pkg/logging/suite_test.go index 427cc90d20..1b89de7334 100644 --- a/pkg/logging/suite_test.go +++ b/pkg/logging/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package logging_test import ( diff --git a/pkg/logging/testhelper/testhelper.go b/pkg/logging/testhelper/testhelper.go index 04debdfa88..8c29498f99 100644 --- a/pkg/logging/testhelper/testhelper.go +++ b/pkg/logging/testhelper/testhelper.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testhelper import ( diff --git a/pkg/logging/utils.go b/pkg/logging/utils.go index 887dc9e5b0..202602462d 100644 --- a/pkg/logging/utils.go +++ b/pkg/logging/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package logging import ( diff --git a/pkg/mime/types.go b/pkg/mime/types.go index 9a56cac904..020968835e 100644 --- a/pkg/mime/types.go +++ b/pkg/mime/types.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package mime const ( diff --git a/pkg/mime/util.go b/pkg/mime/util.go index 133e7706f6..42f45d52bd 100644 --- a/pkg/mime/util.go +++ b/pkg/mime/util.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package mime import ( diff --git a/pkg/optionutils/nested.go b/pkg/optionutils/nested.go index 04b28605c4..f10b2083b4 100644 --- a/pkg/optionutils/nested.go +++ b/pkg/optionutils/nested.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package optionutils // NestedOptionsProvider is the interface for a diff --git a/pkg/optionutils/options.go b/pkg/optionutils/options.go index 13f6e6402c..e079a390bb 100644 --- a/pkg/optionutils/options.go +++ b/pkg/optionutils/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package optionutils type Option[T any] interface { diff --git a/pkg/optionutils/pointer.go b/pkg/optionutils/pointer.go index 5b3e242902..ea00e2dd24 100644 --- a/pkg/optionutils/pointer.go +++ b/pkg/optionutils/pointer.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package optionutils import ( diff --git a/pkg/optionutils/target.go b/pkg/optionutils/target.go index 003cc69dae..7ffc76f136 100644 --- a/pkg/optionutils/target.go +++ b/pkg/optionutils/target.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package optionutils import ( diff --git a/pkg/out/context.go b/pkg/out/context.go index 674081c0a5..d1707f1995 100644 --- a/pkg/out/context.go +++ b/pkg/out/context.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package out import ( diff --git a/pkg/refmgmt/doc.go b/pkg/refmgmt/doc.go index 7b08c8409b..a9d861f5d7 100644 --- a/pkg/refmgmt/doc.go +++ b/pkg/refmgmt/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package refmgmt provides a simple wrapper, which can be used // to map a closable object type into an interface supporting reference // counting and supporting a Dup() method. diff --git a/pkg/refmgmt/finalized/doc.go b/pkg/refmgmt/finalized/doc.go index 13b1e31d54..fc07108260 100644 --- a/pkg/refmgmt/finalized/doc.go +++ b/pkg/refmgmt/finalized/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package finalized provided a view management for a backend object, // which is based on Go Garbage Collection and runtime finalizers. // Finalization is not possible in Go, if an object is involved in diff --git a/pkg/refmgmt/finalized/finalized_test.go b/pkg/refmgmt/finalized/finalized_test.go index 09d9dce5a9..6fb8a778bd 100644 --- a/pkg/refmgmt/finalized/finalized_test.go +++ b/pkg/refmgmt/finalized/finalized_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package finalized_test import ( diff --git a/pkg/refmgmt/finalized/finalizedref.go b/pkg/refmgmt/finalized/finalizedref.go index c6262fb157..de67f9ad1f 100644 --- a/pkg/refmgmt/finalized/finalizedref.go +++ b/pkg/refmgmt/finalized/finalizedref.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package finalized import ( diff --git a/pkg/refmgmt/finalized/suite_test.go b/pkg/refmgmt/finalized/suite_test.go index 46c70a1d28..86dfc03e11 100644 --- a/pkg/refmgmt/finalized/suite_test.go +++ b/pkg/refmgmt/finalized/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package finalized_test import ( diff --git a/pkg/refmgmt/refcloser.go b/pkg/refmgmt/refcloser.go index 4b1e1fea20..4c1cfdebfc 100644 --- a/pkg/refmgmt/refcloser.go +++ b/pkg/refmgmt/refcloser.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package refmgmt import ( diff --git a/pkg/refmgmt/refmgmt.go b/pkg/refmgmt/refmgmt.go index 211d4b1654..889b6f3de9 100644 --- a/pkg/refmgmt/refmgmt.go +++ b/pkg/refmgmt/refmgmt.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package refmgmt import ( diff --git a/pkg/refmgmt/resource/doc.go b/pkg/refmgmt/resource/doc.go index e28e9a39a6..59a904082e 100644 --- a/pkg/refmgmt/resource/doc.go +++ b/pkg/refmgmt/resource/doc.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package resource provides support to implement // closeable backing resources featuring multiple // separately closeable references. The backing resource diff --git a/pkg/refmgmt/resource/resource.go b/pkg/refmgmt/resource/resource.go index 80626b44b7..1fb81dd2f3 100644 --- a/pkg/refmgmt/resource/resource.go +++ b/pkg/refmgmt/resource/resource.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package resource import ( diff --git a/pkg/refmgmt/resource/resource_test.go b/pkg/refmgmt/resource/resource_test.go index ecd5b38b00..f17639aca3 100644 --- a/pkg/refmgmt/resource/resource_test.go +++ b/pkg/refmgmt/resource/resource_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package resource_test import ( diff --git a/pkg/refmgmt/resource/suite_test.go b/pkg/refmgmt/resource/suite_test.go index 3af476571e..a832c663d7 100644 --- a/pkg/refmgmt/resource/suite_test.go +++ b/pkg/refmgmt/resource/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package resource_test import ( diff --git a/pkg/refmgmt/suite_test.go b/pkg/refmgmt/suite_test.go index b911f4d956..e143a1809d 100644 --- a/pkg/refmgmt/suite_test.go +++ b/pkg/refmgmt/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package refmgmt_test import ( diff --git a/pkg/refmgmt/view.go b/pkg/refmgmt/view.go index 78f89237a4..178db148af 100644 --- a/pkg/refmgmt/view.go +++ b/pkg/refmgmt/view.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package refmgmt import ( diff --git a/pkg/refmgmt/view_test.go b/pkg/refmgmt/view_test.go index 923666767d..f030dc1c96 100644 --- a/pkg/refmgmt/view_test.go +++ b/pkg/refmgmt/view_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package refmgmt_test import ( diff --git a/pkg/regex/regex.go b/pkg/regex/regex.go index e53aa5b218..180e6bbcd4 100644 --- a/pkg/regex/regex.go +++ b/pkg/regex/regex.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package regex import ( diff --git a/pkg/registrations/info.go b/pkg/registrations/info.go index 48e795fea6..98409eac7f 100644 --- a/pkg/registrations/info.go +++ b/pkg/registrations/info.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package registrations import ( diff --git a/pkg/registrations/registrations.go b/pkg/registrations/registrations.go index b9c93481aa..8151edbbde 100644 --- a/pkg/registrations/registrations.go +++ b/pkg/registrations/registrations.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Package registrations provides a hierarchical namespace for // denoting any kind of handlers to be registered on some target. // Handlers are denoted by names evaluated by HandlerRegistrationHandler diff --git a/pkg/registrations/registrations_test.go b/pkg/registrations/registrations_test.go index c7348a60f7..31f34ea9c4 100644 --- a/pkg/registrations/registrations_test.go +++ b/pkg/registrations/registrations_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package registrations_test import ( diff --git a/pkg/registrations/suite_test.go b/pkg/registrations/suite_test.go index e6001860a8..9820acc85f 100644 --- a/pkg/registrations/suite_test.go +++ b/pkg/registrations/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package registrations_test import ( diff --git a/pkg/registrations/utils.go b/pkg/registrations/utils.go index ff1bc08314..1fc56ed9c5 100644 --- a/pkg/registrations/utils.go +++ b/pkg/registrations/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package registrations import ( diff --git a/pkg/runtime/binary.go b/pkg/runtime/binary.go index ccff45fad6..a0014960f9 100644 --- a/pkg/runtime/binary.go +++ b/pkg/runtime/binary.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime import ( diff --git a/pkg/runtime/convert.go b/pkg/runtime/convert.go index 862d1a4ce2..efcc79883e 100644 --- a/pkg/runtime/convert.go +++ b/pkg/runtime/convert.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime import ( diff --git a/pkg/runtime/datatypes.go b/pkg/runtime/datatypes.go index f1c0b6eb03..6daabc07b5 100644 --- a/pkg/runtime/datatypes.go +++ b/pkg/runtime/datatypes.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime import ( diff --git a/pkg/runtime/descriptivetype/options.go b/pkg/runtime/descriptivetype/options.go index 6ed0bd372d..7b067bd62a 100644 --- a/pkg/runtime/descriptivetype/options.go +++ b/pkg/runtime/descriptivetype/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package descriptivetype import ( diff --git a/pkg/runtime/descriptivetype/type.go b/pkg/runtime/descriptivetype/type.go index ff5e3fb637..a1771e2f38 100644 --- a/pkg/runtime/descriptivetype/type.go +++ b/pkg/runtime/descriptivetype/type.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package descriptivetype import ( diff --git a/pkg/runtime/encoding.go b/pkg/runtime/encoding.go index 199bffc3e5..fcc0924766 100644 --- a/pkg/runtime/encoding.go +++ b/pkg/runtime/encoding.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime // github.com/ghodss/yaml diff --git a/pkg/runtime/multi.go b/pkg/runtime/multi.go index 0b11d2c032..d60da8bfc0 100644 --- a/pkg/runtime/multi.go +++ b/pkg/runtime/multi.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime import ( diff --git a/pkg/runtime/multi_test.go b/pkg/runtime/multi_test.go index 66b0af8b1a..e7cd8367a4 100644 --- a/pkg/runtime/multi_test.go +++ b/pkg/runtime/multi_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime_test import ( diff --git a/pkg/runtime/object_test.go b/pkg/runtime/object_test.go index 1b9890a67a..e39a6a55da 100644 --- a/pkg/runtime/object_test.go +++ b/pkg/runtime/object_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime_test import ( diff --git a/pkg/runtime/scheme.go b/pkg/runtime/scheme.go index 3afad936d4..96404ade64 100644 --- a/pkg/runtime/scheme.go +++ b/pkg/runtime/scheme.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime import ( diff --git a/pkg/runtime/scheme_test.go b/pkg/runtime/scheme_test.go index f36291bb47..3b03ee7fed 100644 --- a/pkg/runtime/scheme_test.go +++ b/pkg/runtime/scheme_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime_test import ( diff --git a/pkg/runtime/suite_test.go b/pkg/runtime/suite_test.go index 927626c04d..0175e8621a 100644 --- a/pkg/runtime/suite_test.go +++ b/pkg/runtime/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime_test import ( diff --git a/pkg/runtime/typedobject.go b/pkg/runtime/typedobject.go index 9db5e2eca6..fe06ea6125 100644 --- a/pkg/runtime/typedobject.go +++ b/pkg/runtime/typedobject.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime // ObjectTypedObject is the minimal implementation of a typed object diff --git a/pkg/runtime/unstructured.go b/pkg/runtime/unstructured.go index 3d3f8ddc2d..bcfb665aff 100644 --- a/pkg/runtime/unstructured.go +++ b/pkg/runtime/unstructured.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime import ( diff --git a/pkg/runtime/unstructured_test.go b/pkg/runtime/unstructured_test.go index dccf2c3301..9c982ca79d 100644 --- a/pkg/runtime/unstructured_test.go +++ b/pkg/runtime/unstructured_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime_test import ( diff --git a/pkg/runtime/unstructuredversioned.go b/pkg/runtime/unstructuredversioned.go index c3f6ff42e7..3ba9f37e01 100644 --- a/pkg/runtime/unstructuredversioned.go +++ b/pkg/runtime/unstructuredversioned.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime import ( diff --git a/pkg/runtime/utils.go b/pkg/runtime/utils.go index cbd1360537..0c0a6fd166 100644 --- a/pkg/runtime/utils.go +++ b/pkg/runtime/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime import ( diff --git a/pkg/runtime/validate.go b/pkg/runtime/validate.go index 66ae3efee1..ce806e8298 100644 --- a/pkg/runtime/validate.go +++ b/pkg/runtime/validate.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime import ( diff --git a/pkg/runtime/value.go b/pkg/runtime/value.go index 67c594a9ed..fd9170c64f 100644 --- a/pkg/runtime/value.go +++ b/pkg/runtime/value.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime import ( diff --git a/pkg/runtime/version_test.go b/pkg/runtime/version_test.go index 98fd9e3de0..c248b93fba 100644 --- a/pkg/runtime/version_test.go +++ b/pkg/runtime/version_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime_test import ( diff --git a/pkg/runtime/versionedtype.go b/pkg/runtime/versionedtype.go index 4181b65bd2..c2243883b2 100644 --- a/pkg/runtime/versionedtype.go +++ b/pkg/runtime/versionedtype.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtime import ( diff --git a/pkg/semverutils/sort.go b/pkg/semverutils/sort.go index 895194d3e2..b5f91b7536 100644 --- a/pkg/semverutils/sort.go +++ b/pkg/semverutils/sort.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package semverutils import ( diff --git a/pkg/semverutils/suite_test.go b/pkg/semverutils/suite_test.go index 0bb7fabb25..d0ca58ac43 100644 --- a/pkg/semverutils/suite_test.go +++ b/pkg/semverutils/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package semverutils_test import ( diff --git a/pkg/semverutils/utils.go b/pkg/semverutils/utils.go index 5193173915..4714a8ca29 100644 --- a/pkg/semverutils/utils.go +++ b/pkg/semverutils/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package semverutils import ( diff --git a/pkg/semverutils/utils_test.go b/pkg/semverutils/utils_test.go index 0a60bed042..bdb9b3c8ca 100644 --- a/pkg/semverutils/utils_test.go +++ b/pkg/semverutils/utils_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package semverutils import ( diff --git a/pkg/signing/cert.go b/pkg/signing/cert.go index de1573ada7..4b348ab6e7 100644 --- a/pkg/signing/cert.go +++ b/pkg/signing/cert.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing import ( diff --git a/pkg/signing/cert_test.go b/pkg/signing/cert_test.go index 4b43fb4569..433b03d5af 100644 --- a/pkg/signing/cert_test.go +++ b/pkg/signing/cert_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing_test import ( diff --git a/pkg/signing/deprecated.go b/pkg/signing/deprecated.go index ccfadd1a5c..8bbe888156 100644 --- a/pkg/signing/deprecated.go +++ b/pkg/signing/deprecated.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing import ( diff --git a/pkg/signing/encrypt.go b/pkg/signing/encrypt.go index 5da63f9c55..c44a4cbd79 100644 --- a/pkg/signing/encrypt.go +++ b/pkg/signing/encrypt.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing import ( diff --git a/pkg/signing/handlers/init.go b/pkg/signing/handlers/init.go index 7010b70e49..e9042f9a76 100644 --- a/pkg/signing/handlers/init.go +++ b/pkg/signing/handlers/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package handlers import ( diff --git a/pkg/signing/handlers/rsa-pss-signingservice/handler.go b/pkg/signing/handlers/rsa-pss-signingservice/handler.go index 6f4158ea9d..0225ad2577 100644 --- a/pkg/signing/handlers/rsa-pss-signingservice/handler.go +++ b/pkg/signing/handlers/rsa-pss-signingservice/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rsa_pss_signingservice import ( diff --git a/pkg/signing/handlers/rsa-pss/handler.go b/pkg/signing/handlers/rsa-pss/handler.go index 97f37ef4da..a4e6ddd0d7 100644 --- a/pkg/signing/handlers/rsa-pss/handler.go +++ b/pkg/signing/handlers/rsa-pss/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rsa_pss import ( diff --git a/pkg/signing/handlers/rsa-signingservice/client.go b/pkg/signing/handlers/rsa-signingservice/client.go index 2e89aac218..5a88661420 100644 --- a/pkg/signing/handlers/rsa-signingservice/client.go +++ b/pkg/signing/handlers/rsa-signingservice/client.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rsa_signingservice import ( diff --git a/pkg/signing/handlers/rsa-signingservice/handler.go b/pkg/signing/handlers/rsa-signingservice/handler.go index e6d9c3af0c..a914b22af6 100644 --- a/pkg/signing/handlers/rsa-signingservice/handler.go +++ b/pkg/signing/handlers/rsa-signingservice/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rsa_signingservice import ( diff --git a/pkg/signing/handlers/rsa/certhelper.go b/pkg/signing/handlers/rsa/certhelper.go index 3a3710e8ca..480b37fac0 100644 --- a/pkg/signing/handlers/rsa/certhelper.go +++ b/pkg/signing/handlers/rsa/certhelper.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rsa import ( diff --git a/pkg/signing/handlers/rsa/format.go b/pkg/signing/handlers/rsa/format.go index a518cefe39..9e35b03e57 100644 --- a/pkg/signing/handlers/rsa/format.go +++ b/pkg/signing/handlers/rsa/format.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rsa import ( diff --git a/pkg/signing/handlers/rsa/handler.go b/pkg/signing/handlers/rsa/handler.go index 3f63d81e6e..2c1b5280ba 100644 --- a/pkg/signing/handlers/rsa/handler.go +++ b/pkg/signing/handlers/rsa/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package rsa import ( diff --git a/pkg/signing/handlers/sigstore/attr/attr.go b/pkg/signing/handlers/sigstore/attr/attr.go index 2d0c04af63..a65cbc7214 100644 --- a/pkg/signing/handlers/sigstore/attr/attr.go +++ b/pkg/signing/handlers/sigstore/attr/attr.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package attr import ( diff --git a/pkg/signing/handlers/sigstore/handler.go b/pkg/signing/handlers/sigstore/handler.go index 98b1f2de8a..2402fd6e7f 100644 --- a/pkg/signing/handlers/sigstore/handler.go +++ b/pkg/signing/handlers/sigstore/handler.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package sigstore import ( diff --git a/pkg/signing/hasher/hashfuncs.go b/pkg/signing/hasher/hashfuncs.go index 941cadb9c5..ac090ed591 100644 --- a/pkg/signing/hasher/hashfuncs.go +++ b/pkg/signing/hasher/hashfuncs.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hasher import ( diff --git a/pkg/signing/hasher/init.go b/pkg/signing/hasher/init.go index 02a488f071..24b89a6b03 100644 --- a/pkg/signing/hasher/init.go +++ b/pkg/signing/hasher/init.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package hasher import ( diff --git a/pkg/signing/hasher/nodigest/hasher.go b/pkg/signing/hasher/nodigest/hasher.go index 810d99707c..b319be1aee 100644 --- a/pkg/signing/hasher/nodigest/hasher.go +++ b/pkg/signing/hasher/nodigest/hasher.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package nodigest import ( diff --git a/pkg/signing/hasher/sha256/hasher.go b/pkg/signing/hasher/sha256/hasher.go index 8d133b74f0..0dd2ff9226 100644 --- a/pkg/signing/hasher/sha256/hasher.go +++ b/pkg/signing/hasher/sha256/hasher.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package sha256 import ( diff --git a/pkg/signing/hasher/sha512/hasher.go b/pkg/signing/hasher/sha512/hasher.go index 5896a40189..3ebdd0677a 100644 --- a/pkg/signing/hasher/sha512/hasher.go +++ b/pkg/signing/hasher/sha512/hasher.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package sha512 import ( diff --git a/pkg/signing/hashfuncs.go b/pkg/signing/hashfuncs.go index 46bbb35322..fe0982c532 100644 --- a/pkg/signing/hashfuncs.go +++ b/pkg/signing/hashfuncs.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing import ( diff --git a/pkg/signing/norm/entry/norm.go b/pkg/signing/norm/entry/norm.go index 9173e559ad..d5e14ea82b 100644 --- a/pkg/signing/norm/entry/norm.go +++ b/pkg/signing/norm/entry/norm.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package entry import ( diff --git a/pkg/signing/norm/jcs/norm.go b/pkg/signing/norm/jcs/norm.go index ce9f3ba5ec..5322b23fef 100644 --- a/pkg/signing/norm/jcs/norm.go +++ b/pkg/signing/norm/jcs/norm.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package jcs import ( diff --git a/pkg/signing/normalization.go b/pkg/signing/normalization.go index 2882d4df48..9b34db2013 100644 --- a/pkg/signing/normalization.go +++ b/pkg/signing/normalization.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing import ( diff --git a/pkg/signing/normalization_test.go b/pkg/signing/normalization_test.go index ea4b1f80db..dcfbe90b49 100644 --- a/pkg/signing/normalization_test.go +++ b/pkg/signing/normalization_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing_test import ( diff --git a/pkg/signing/registry.go b/pkg/signing/registry.go index adbcea5d0c..134919117c 100644 --- a/pkg/signing/registry.go +++ b/pkg/signing/registry.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing import ( diff --git a/pkg/signing/rules.go b/pkg/signing/rules.go index 3586dbd85d..e1728f1db2 100644 --- a/pkg/signing/rules.go +++ b/pkg/signing/rules.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing type Normalization interface { diff --git a/pkg/signing/signing_test.go b/pkg/signing/signing_test.go index a0eeb286e2..dbfeb1c3d1 100644 --- a/pkg/signing/signing_test.go +++ b/pkg/signing/signing_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing_test import ( diff --git a/pkg/signing/signutils/certs.go b/pkg/signing/signutils/certs.go index c650f1a3ae..fd6ec858c7 100644 --- a/pkg/signing/signutils/certs.go +++ b/pkg/signing/signutils/certs.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signutils import ( diff --git a/pkg/signing/signutils/certs_test.go b/pkg/signing/signutils/certs_test.go index 8c99817ec1..b0d5d13d71 100644 --- a/pkg/signing/signutils/certs_test.go +++ b/pkg/signing/signutils/certs_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signutils_test import ( diff --git a/pkg/signing/signutils/names.go b/pkg/signing/signutils/names.go index 205a679d48..c05158188a 100644 --- a/pkg/signing/signutils/names.go +++ b/pkg/signing/signutils/names.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signutils import ( diff --git a/pkg/signing/signutils/names_test.go b/pkg/signing/signutils/names_test.go index b4c33b9e05..27e7f8d53d 100644 --- a/pkg/signing/signutils/names_test.go +++ b/pkg/signing/signutils/names_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signutils_test import ( diff --git a/pkg/signing/signutils/signature.go b/pkg/signing/signutils/signature.go index e6438613cf..7f888a8aef 100644 --- a/pkg/signing/signutils/signature.go +++ b/pkg/signing/signutils/signature.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signutils import ( diff --git a/pkg/signing/signutils/suite_test.go b/pkg/signing/signutils/suite_test.go index 1cec31790b..af3f04ccc9 100644 --- a/pkg/signing/signutils/suite_test.go +++ b/pkg/signing/signutils/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signutils_test import ( diff --git a/pkg/signing/signutils/types.go b/pkg/signing/signutils/types.go index e7a50e7e10..a21d56df39 100644 --- a/pkg/signing/signutils/types.go +++ b/pkg/signing/signutils/types.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signutils // These types just indicate the intended use case for diff --git a/pkg/signing/signutils/utils.go b/pkg/signing/signutils/utils.go index c49fb37c5b..cdc9cfcfcd 100644 --- a/pkg/signing/signutils/utils.go +++ b/pkg/signing/signutils/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signutils import ( diff --git a/pkg/signing/suite_test.go b/pkg/signing/suite_test.go index 3610d11981..1f245ca583 100644 --- a/pkg/signing/suite_test.go +++ b/pkg/signing/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing_test import ( diff --git a/pkg/signing/tsa/pem.go b/pkg/signing/tsa/pem.go index 6baac6f307..4bcf8f3ed7 100644 --- a/pkg/signing/tsa/pem.go +++ b/pkg/signing/tsa/pem.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tsa import ( diff --git a/pkg/signing/tsa/tsa.go b/pkg/signing/tsa/tsa.go index 9aa6dde0f1..8e7bbadda1 100644 --- a/pkg/signing/tsa/tsa.go +++ b/pkg/signing/tsa/tsa.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tsa import ( diff --git a/pkg/signing/tsa/types.go b/pkg/signing/tsa/types.go index 8a2b5ba6e2..214b0be1df 100644 --- a/pkg/signing/tsa/types.go +++ b/pkg/signing/tsa/types.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tsa import ( diff --git a/pkg/signing/types.go b/pkg/signing/types.go index 40640d9b32..7875530aeb 100644 --- a/pkg/signing/types.go +++ b/pkg/signing/types.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing import ( diff --git a/pkg/signing/utils.go b/pkg/signing/utils.go index ec75a1a6c5..27354aa8f7 100644 --- a/pkg/signing/utils.go +++ b/pkg/signing/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing import ( diff --git a/pkg/signing/x509_certificate.go b/pkg/signing/x509_certificate.go index 6bde22d3a5..0cf1e69176 100644 --- a/pkg/signing/x509_certificate.go +++ b/pkg/signing/x509_certificate.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package signing import ( diff --git a/pkg/spiff/options.go b/pkg/spiff/options.go index 5808231d93..dcade5d6ee 100644 --- a/pkg/spiff/options.go +++ b/pkg/spiff/options.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spiff import ( diff --git a/pkg/spiff/spiff.go b/pkg/spiff/spiff.go index 5fb2066422..f91dae34e9 100644 --- a/pkg/spiff/spiff.go +++ b/pkg/spiff/spiff.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spiff import ( diff --git a/pkg/spiff/spiff_test.go b/pkg/spiff/spiff_test.go index 37327f64a6..6e0ce20d3f 100644 --- a/pkg/spiff/spiff_test.go +++ b/pkg/spiff/spiff_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spiff_test import ( diff --git a/pkg/spiff/suite_test.go b/pkg/spiff/suite_test.go index 4bd5508de2..de2c84c244 100644 --- a/pkg/spiff/suite_test.go +++ b/pkg/spiff/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spiff_test import ( diff --git a/pkg/spiff/validate.go b/pkg/spiff/validate.go index b2524a00aa..84c6ec6172 100644 --- a/pkg/spiff/validate.go +++ b/pkg/spiff/validate.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package spiff import ( diff --git a/pkg/testutils/object.go b/pkg/testutils/object.go index d8598b0c10..1bdbbe94a9 100644 --- a/pkg/testutils/object.go +++ b/pkg/testutils/object.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testutils import ( diff --git a/pkg/testutils/signing_test.go b/pkg/testutils/signing_test.go index af4e3f4358..d03a40bde0 100644 --- a/pkg/testutils/signing_test.go +++ b/pkg/testutils/signing_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testutils_test import ( diff --git a/pkg/testutils/string.go b/pkg/testutils/string.go index 1423f0e284..df337866ce 100644 --- a/pkg/testutils/string.go +++ b/pkg/testutils/string.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testutils import ( diff --git a/pkg/testutils/suite_test.go b/pkg/testutils/suite_test.go index 3fe7388419..c47f9dd5f9 100644 --- a/pkg/testutils/suite_test.go +++ b/pkg/testutils/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testutils_test import ( diff --git a/pkg/testutils/utils.go b/pkg/testutils/utils.go index 9a36ff8d32..ab71d423db 100644 --- a/pkg/testutils/utils.go +++ b/pkg/testutils/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testutils import ( diff --git a/pkg/testutils/yaml.go b/pkg/testutils/yaml.go index db770f00a6..8af97b75c8 100644 --- a/pkg/testutils/yaml.go +++ b/pkg/testutils/yaml.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package testutils import ( diff --git a/pkg/toi/drivers/default/driver.go b/pkg/toi/drivers/default/driver.go index 583c18681e..f6e9b92d21 100644 --- a/pkg/toi/drivers/default/driver.go +++ b/pkg/toi/drivers/default/driver.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package _default import ( diff --git a/pkg/toi/drivers/docker/client.go b/pkg/toi/drivers/docker/client.go index 9ca0066902..4cec691d6f 100644 --- a/pkg/toi/drivers/docker/client.go +++ b/pkg/toi/drivers/docker/client.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/toi/drivers/docker/opts.go b/pkg/toi/drivers/docker/opts.go index 1a9a4306e6..4589942841 100644 --- a/pkg/toi/drivers/docker/opts.go +++ b/pkg/toi/drivers/docker/opts.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package docker import ( diff --git a/pkg/toi/drivers/filesystem/driver.go b/pkg/toi/drivers/filesystem/driver.go index 0f50e4d86b..6aa46c5eb8 100644 --- a/pkg/toi/drivers/filesystem/driver.go +++ b/pkg/toi/drivers/filesystem/driver.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package filesystem import ( diff --git a/pkg/toi/drivers/mock/driver.go b/pkg/toi/drivers/mock/driver.go index 3998e2150e..a2fb70333f 100644 --- a/pkg/toi/drivers/mock/driver.go +++ b/pkg/toi/drivers/mock/driver.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package mock import ( diff --git a/pkg/toi/install/action.go b/pkg/toi/install/action.go index 5f933e0a85..06b3ea1e62 100644 --- a/pkg/toi/install/action.go +++ b/pkg/toi/install/action.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install import ( diff --git a/pkg/toi/install/action_test.go b/pkg/toi/install/action_test.go index 96d01ece5d..97d6aeb2b8 100644 --- a/pkg/toi/install/action_test.go +++ b/pkg/toi/install/action_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install_test import ( diff --git a/pkg/toi/install/bundle/spec.go b/pkg/toi/install/bundle/spec.go index 163c23e723..835054a4c3 100644 --- a/pkg/toi/install/bundle/spec.go +++ b/pkg/toi/install/bundle/spec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package bundle import ( diff --git a/pkg/toi/install/credentials.go b/pkg/toi/install/credentials.go index 0c4e29190f..f6868dd5e6 100644 --- a/pkg/toi/install/credentials.go +++ b/pkg/toi/install/credentials.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install import ( diff --git a/pkg/toi/install/credentials_test.go b/pkg/toi/install/credentials_test.go index 6b4c33432e..c81a06734f 100644 --- a/pkg/toi/install/credentials_test.go +++ b/pkg/toi/install/credentials_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install_test import ( diff --git a/pkg/toi/install/execute.go b/pkg/toi/install/execute.go index 8cf57cc0c9..ec405370c8 100644 --- a/pkg/toi/install/execute.go +++ b/pkg/toi/install/execute.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install import ( diff --git a/pkg/toi/install/functions.go b/pkg/toi/install/functions.go index e67552187e..bd928ceda7 100644 --- a/pkg/toi/install/functions.go +++ b/pkg/toi/install/functions.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install import ( diff --git a/pkg/toi/install/interface.go b/pkg/toi/install/interface.go index c3bf495124..53fce0dba3 100644 --- a/pkg/toi/install/interface.go +++ b/pkg/toi/install/interface.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install import ( diff --git a/pkg/toi/install/suite_test.go b/pkg/toi/install/suite_test.go index 53ca50870c..44ac79956f 100644 --- a/pkg/toi/install/suite_test.go +++ b/pkg/toi/install/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package install_test import ( diff --git a/pkg/toi/logging.go b/pkg/toi/logging.go index 8ed9785d5d..c24abb05eb 100644 --- a/pkg/toi/logging.go +++ b/pkg/toi/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package toi import ( diff --git a/pkg/toi/spec.go b/pkg/toi/spec.go index d5916c1f8c..e5f4471695 100644 --- a/pkg/toi/spec.go +++ b/pkg/toi/spec.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package toi import ( diff --git a/pkg/toi/support/app.go b/pkg/toi/support/app.go index 0b1886f67e..d1a409e029 100644 --- a/pkg/toi/support/app.go +++ b/pkg/toi/support/app.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package support import ( diff --git a/pkg/toi/support/support.go b/pkg/toi/support/support.go index 57cad73f35..be4ea985dc 100644 --- a/pkg/toi/support/support.go +++ b/pkg/toi/support/support.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package support import ( diff --git a/pkg/tokens/github/main/main.go b/pkg/tokens/github/main/main.go index 8309caf503..dc271eb7a3 100644 --- a/pkg/tokens/github/main/main.go +++ b/pkg/tokens/github/main/main.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/pkg/utils/ctf.go b/pkg/utils/ctf.go index be279dd072..4b8b51bc06 100644 --- a/pkg/utils/ctf.go +++ b/pkg/utils/ctf.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/pkg/utils/key.go b/pkg/utils/key.go index d2abb73e9b..cb8a9f3b2e 100644 --- a/pkg/utils/key.go +++ b/pkg/utils/key.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/pkg/utils/keyinfo.go b/pkg/utils/keyinfo.go index 8f5ef564ff..32e2e1e738 100644 --- a/pkg/utils/keyinfo.go +++ b/pkg/utils/keyinfo.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/pkg/utils/locator.go b/pkg/utils/locator.go index 71f6a0ed90..0acbae5b3a 100644 --- a/pkg/utils/locator.go +++ b/pkg/utils/locator.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/pkg/utils/log.go b/pkg/utils/log.go index 091c00379c..cc3dee16b7 100644 --- a/pkg/utils/log.go +++ b/pkg/utils/log.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/pkg/utils/panics/panics.go b/pkg/utils/panics/panics.go index da386cd081..a235707ab7 100644 --- a/pkg/utils/panics/panics.go +++ b/pkg/utils/panics/panics.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package panics import ( diff --git a/pkg/utils/panics/panics_test.go b/pkg/utils/panics/panics_test.go index 6f14e21e96..5df55a1609 100644 --- a/pkg/utils/panics/panics_test.go +++ b/pkg/utils/panics/panics_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package panics_test import ( diff --git a/pkg/utils/panics/suite_test.go b/pkg/utils/panics/suite_test.go index a7eb26cb8b..00b48089bd 100644 --- a/pkg/utils/panics/suite_test.go +++ b/pkg/utils/panics/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package panics_test import ( diff --git a/pkg/utils/selector/selector.go b/pkg/utils/selector/selector.go index bf67e870a3..723ac33719 100644 --- a/pkg/utils/selector/selector.go +++ b/pkg/utils/selector/selector.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package selector import ( diff --git a/pkg/utils/stringset.go b/pkg/utils/stringset.go index 10200d1352..72887e9291 100644 --- a/pkg/utils/stringset.go +++ b/pkg/utils/stringset.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils type StringSet map[string]struct{} diff --git a/pkg/utils/stringslice.go b/pkg/utils/stringslice.go index 41d21fc43a..b173c65053 100644 --- a/pkg/utils/stringslice.go +++ b/pkg/utils/stringslice.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/pkg/utils/subst/subst.go b/pkg/utils/subst/subst.go index 8eec669dc5..8bcf7af18b 100644 --- a/pkg/utils/subst/subst.go +++ b/pkg/utils/subst/subst.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package subst import ( diff --git a/pkg/utils/subst/subst_test.go b/pkg/utils/subst/subst_test.go index 2cecebb199..2a89ec4ac4 100644 --- a/pkg/utils/subst/subst_test.go +++ b/pkg/utils/subst/subst_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package subst import ( diff --git a/pkg/utils/subst/suite_test.go b/pkg/utils/subst/suite_test.go index 1df31e5688..360ff37521 100644 --- a/pkg/utils/subst/suite_test.go +++ b/pkg/utils/subst/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package subst import ( diff --git a/pkg/utils/suite_test.go b/pkg/utils/suite_test.go index c2ee81ed0b..1f37a6e1c1 100644 --- a/pkg/utils/suite_test.go +++ b/pkg/utils/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils_test import ( diff --git a/pkg/utils/tarutils/compress.go b/pkg/utils/tarutils/compress.go index 54049a5c1e..d9255ca706 100644 --- a/pkg/utils/tarutils/compress.go +++ b/pkg/utils/tarutils/compress.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tarutils import ( diff --git a/pkg/utils/tarutils/extract.go b/pkg/utils/tarutils/extract.go index 280ef9cd43..53b3ce530c 100644 --- a/pkg/utils/tarutils/extract.go +++ b/pkg/utils/tarutils/extract.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tarutils import ( diff --git a/pkg/utils/tarutils/list.go b/pkg/utils/tarutils/list.go index e61ff51e27..e7f0c13857 100644 --- a/pkg/utils/tarutils/list.go +++ b/pkg/utils/tarutils/list.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tarutils import ( diff --git a/pkg/utils/tarutils/pack.go b/pkg/utils/tarutils/pack.go index 1464838319..362271242c 100644 --- a/pkg/utils/tarutils/pack.go +++ b/pkg/utils/tarutils/pack.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tarutils import ( diff --git a/pkg/utils/tarutils/pack_test.go b/pkg/utils/tarutils/pack_test.go index 3ca873cb1e..0ff84d662d 100644 --- a/pkg/utils/tarutils/pack_test.go +++ b/pkg/utils/tarutils/pack_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tarutils_test import ( diff --git a/pkg/utils/tarutils/suite_test.go b/pkg/utils/tarutils/suite_test.go index 972cbfd11c..38166ff09a 100644 --- a/pkg/utils/tarutils/suite_test.go +++ b/pkg/utils/tarutils/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package tarutils_test import ( diff --git a/pkg/utils/template/gotmpl.go b/pkg/utils/template/gotmpl.go index 640e5afd28..e6c0acd11c 100644 --- a/pkg/utils/template/gotmpl.go +++ b/pkg/utils/template/gotmpl.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package template import ( diff --git a/pkg/utils/template/merge.go b/pkg/utils/template/merge.go index db0fe59b4f..7c8da61625 100644 --- a/pkg/utils/template/merge.go +++ b/pkg/utils/template/merge.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package template import ( diff --git a/pkg/utils/template/none.go b/pkg/utils/template/none.go index ab9d1cf270..aeb321d2b8 100644 --- a/pkg/utils/template/none.go +++ b/pkg/utils/template/none.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package template import ( diff --git a/pkg/utils/template/registry.go b/pkg/utils/template/registry.go index 2d4872a2ef..12028cca3b 100644 --- a/pkg/utils/template/registry.go +++ b/pkg/utils/template/registry.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package template import ( diff --git a/pkg/utils/template/spiff.go b/pkg/utils/template/spiff.go index ee2bb80c91..5d303f2bfe 100644 --- a/pkg/utils/template/spiff.go +++ b/pkg/utils/template/spiff.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package template import ( diff --git a/pkg/utils/template/subst.go b/pkg/utils/template/subst.go index 905c2739f8..e8778e0fe4 100644 --- a/pkg/utils/template/subst.go +++ b/pkg/utils/template/subst.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package template import ( diff --git a/pkg/utils/template/template.go b/pkg/utils/template/template.go index ece0fa4f96..eecca9fcb2 100644 --- a/pkg/utils/template/template.go +++ b/pkg/utils/template/template.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package template import ( diff --git a/pkg/utils/template/template_test.go b/pkg/utils/template/template_test.go index 837598c86e..95c9b24929 100644 --- a/pkg/utils/template/template_test.go +++ b/pkg/utils/template/template_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package template_test import ( diff --git a/pkg/utils/time.go b/pkg/utils/time.go index e3df91e05e..13c97048e1 100644 --- a/pkg/utils/time.go +++ b/pkg/utils/time.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/pkg/utils/unwrap.go b/pkg/utils/unwrap.go index 3a95a72c94..f88033ec42 100644 --- a/pkg/utils/unwrap.go +++ b/pkg/utils/unwrap.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils type Unwrappable interface { diff --git a/pkg/utils/url.go b/pkg/utils/url.go index 126f32b4cc..bd920f177c 100644 --- a/pkg/utils/url.go +++ b/pkg/utils/url.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 8ce3548b65..39148ba27c 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/pkg/utils/utils_test.go b/pkg/utils/utils_test.go index ee9c85b2cd..8618c8e871 100644 --- a/pkg/utils/utils_test.go +++ b/pkg/utils/utils_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils_test import ( diff --git a/pkg/utils/validate.go b/pkg/utils/validate.go index 38276250aa..9edb46368d 100644 --- a/pkg/utils/validate.go +++ b/pkg/utils/validate.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package utils import ( diff --git a/pkg/version/generate/release_generate.go b/pkg/version/generate/release_generate.go index cf193fd7b5..3e864c26a9 100644 --- a/pkg/version/generate/release_generate.go +++ b/pkg/version/generate/release_generate.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package main import ( diff --git a/pkg/version/version.go b/pkg/version/version.go index 5a9742f2f1..c764b1a3b0 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package version import ( diff --git a/version.go b/version.go index c22302ad07..7ea730bd12 100644 --- a/version.go +++ b/version.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package ocm import _ "embed" From 850b7850b15b78031d4d3b24d658db4e8b1408f8 Mon Sep 17 00:00:00 2001 From: Gergely Brautigam <182850+Skarlso@users.noreply.github.com> Date: Wed, 8 May 2024 15:27:21 +0200 Subject: [PATCH 60/83] feat: add silent flag and fix dry run with prerequisites (#767) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Closes https://github.com/open-component-model/ocm-project/issues/37 ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Co-authored-by: Hilmar Falkenberg --- cmds/ocm/commands/controllercmds/common/manifests.go | 1 + cmds/ocm/commands/controllercmds/install/cmd.go | 11 ++++++++++- .../controllercmds/install/install_cert_manager.go | 5 +++++ cmds/ocm/commands/controllercmds/uninstall/cmd.go | 11 ++++++++++- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/cmds/ocm/commands/controllercmds/common/manifests.go b/cmds/ocm/commands/controllercmds/common/manifests.go index 2f827f0180..9e603e67ff 100644 --- a/cmds/ocm/commands/controllercmds/common/manifests.go +++ b/cmds/ocm/commands/controllercmds/common/manifests.go @@ -98,6 +98,7 @@ func fetchObjects(ctx context.Context, octx clictx.Context, releaseURL, baseURL, } out.Outf(octx, string(content)) + return nil, nil } out.Outf(octx, "β–Ί applying to cluster...\n") diff --git a/cmds/ocm/commands/controllercmds/install/cmd.go b/cmds/ocm/commands/controllercmds/install/cmd.go index cec957dcbd..873786f0ea 100644 --- a/cmds/ocm/commands/controllercmds/install/cmd.go +++ b/cmds/ocm/commands/controllercmds/install/cmd.go @@ -41,6 +41,7 @@ type Command struct { DryRun bool SkipPreFlightCheck bool InstallPrerequisites bool + Silent bool SM *ssa.ResourceManager } @@ -71,13 +72,21 @@ func (o *Command) AddFlags(set *pflag.FlagSet) { set.BoolVarP(&o.DryRun, "dry-run", "d", false, "if enabled, prints the downloaded manifest file") set.BoolVarP(&o.SkipPreFlightCheck, "skip-pre-flight-check", "s", false, "skip the pre-flight check for clusters") set.BoolVarP(&o.InstallPrerequisites, "install-prerequisites", "i", true, "install prerequisites required by ocm-controller") + set.BoolVarP(&o.Silent, "silent", "l", false, "don't fail on error") } func (o *Command) Complete(args []string) error { return nil } -func (o *Command) Run() error { +func (o *Command) Run() (err error) { + defer func() { + // don't return any errors + if o.Silent { + err = nil + } + }() + kubeconfigArgs := genericclioptions.NewConfigFlags(false) sm, err := NewResourceManager(kubeconfigArgs) if err != nil { diff --git a/cmds/ocm/commands/controllercmds/install/install_cert_manager.go b/cmds/ocm/commands/controllercmds/install/install_cert_manager.go index 4b6be219fd..8fe2a325a1 100644 --- a/cmds/ocm/commands/controllercmds/install/install_cert_manager.go +++ b/cmds/ocm/commands/controllercmds/install/install_cert_manager.go @@ -25,6 +25,11 @@ func (o *Command) installPrerequisites(ctx context.Context) error { } out.Outf(o.Context, "βœ” cert-manager successfully installed\n") + + if o.DryRun { + return nil + } + out.Outf(o.Context, "β–Ί creating certificate for internal registry\n") if err := o.createRegistryCertificate(); err != nil { diff --git a/cmds/ocm/commands/controllercmds/uninstall/cmd.go b/cmds/ocm/commands/controllercmds/uninstall/cmd.go index 699070651e..3c1e497462 100644 --- a/cmds/ocm/commands/controllercmds/uninstall/cmd.go +++ b/cmds/ocm/commands/controllercmds/uninstall/cmd.go @@ -35,6 +35,7 @@ type Command struct { CertManagerVersion string SM *ssa.ResourceManager UninstallPrerequisites bool + Silent bool DryRun bool } @@ -65,13 +66,21 @@ func (o *Command) AddFlags(set *pflag.FlagSet) { set.DurationVarP(&o.Timeout, "timeout", "t", 1*time.Minute, "maximum time to wait for deployment to be ready") set.BoolVarP(&o.UninstallPrerequisites, "uninstall-prerequisites", "p", false, "uninstall prerequisites required by ocm-controller") set.BoolVarP(&o.DryRun, "dry-run", "d", false, "if enabled, prints the downloaded manifest file") + set.BoolVarP(&o.Silent, "silent", "l", false, "don't fail on error") } func (o *Command) Complete(args []string) error { return nil } -func (o *Command) Run() error { +func (o *Command) Run() (err error) { + defer func() { + // don't return any errors + if o.Silent { + err = nil + } + }() + kubeconfigArgs := genericclioptions.NewConfigFlags(false) sm, err := NewResourceManager(kubeconfigArgs) if err != nil { From 7889729f27c719c06d661e03272c339ff50a8d19 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 08:18:00 +0200 Subject: [PATCH 61/83] Bump the go group with 12 updates (#768) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the go group with 12 updates: | Package | From | To | | --- | --- | --- | | [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) | `1.27.11` | `1.27.13` | | [github.com/aws/aws-sdk-go-v2/credentials](https://github.com/aws/aws-sdk-go-v2) | `1.17.11` | `1.17.13` | | [github.com/aws/aws-sdk-go-v2/feature/s3/manager](https://github.com/aws/aws-sdk-go-v2) | `1.16.15` | `1.16.17` | | [github.com/aws/aws-sdk-go-v2/service/ecr](https://github.com/aws/aws-sdk-go-v2) | `1.27.4` | `1.28.0` | | [github.com/aws/aws-sdk-go-v2/service/s3](https://github.com/aws/aws-sdk-go-v2) | `1.53.1` | `1.53.2` | | [github.com/containers/image/v5](https://github.com/containers/image) | `5.30.0` | `5.30.1` | | [github.com/docker/cli](https://github.com/docker/cli) | `26.1.1+incompatible` | `26.1.2+incompatible` | | [github.com/docker/docker](https://github.com/docker/docker) | `26.1.1+incompatible` | `26.1.2+incompatible` | | [github.com/mikefarah/yq/v4](https://github.com/mikefarah/yq) | `4.43.1` | `4.44.1` | | [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) | `2.17.2` | `2.17.3` | | [golang.org/x/net](https://github.com/golang/net) | `0.24.0` | `0.25.0` | | [sigs.k8s.io/controller-runtime](https://github.com/kubernetes-sigs/controller-runtime) | `0.18.1` | `0.18.2` | Updates `github.com/aws/aws-sdk-go-v2/config` from 1.27.11 to 1.27.13
    Commits

    Updates `github.com/aws/aws-sdk-go-v2/credentials` from 1.17.11 to 1.17.13
    Commits

    Updates `github.com/aws/aws-sdk-go-v2/feature/s3/manager` from 1.16.15 to 1.16.17
    Commits

    Updates `github.com/aws/aws-sdk-go-v2/service/ecr` from 1.27.4 to 1.28.0
    Changelog

    Sourced from github.com/aws/aws-sdk-go-v2/service/ecr's changelog.

    Release (2022-10-19)

    General Highlights

    • Dependency Update: Updated to the latest SDK module versions

    Module Highlights

    • github.com/aws/aws-sdk-go-v2/service/chimesdkmessaging: v1.11.6
      • Documentation: Documentation updates for Chime Messaging SDK
    • github.com/aws/aws-sdk-go-v2/service/cloudtrail: v1.19.0
      • Feature: This release includes support for exporting CloudTrail Lake query results to an Amazon S3 bucket.
    • github.com/aws/aws-sdk-go-v2/service/configservice: v1.27.0
      • Feature: This release adds resourceType enums for AppConfig, AppSync, DataSync, EC2, EKS, Glue, GuardDuty, SageMaker, ServiceDiscovery, SES, Route53 types.
    • github.com/aws/aws-sdk-go-v2/service/connect: v1.33.0
      • Feature: This release adds API support for managing phone numbers that can be used across multiple AWS regions through telephony traffic distribution.
    • github.com/aws/aws-sdk-go-v2/service/managedblockchain: v1.13.0
      • Feature: Adding new Accessor APIs for Amazon Managed Blockchain
    • github.com/aws/aws-sdk-go-v2/service/s3: v1.28.0
      • Feature: Updates internal logic for constructing API endpoints. We have added rule-based endpoints and internal model parameters.
    • github.com/aws/aws-sdk-go-v2/service/supportapp: v1.1.0
      • Feature: This release adds the RegisterSlackWorkspaceForOrganization API. You can use the API to register a Slack workspace for an AWS account that is part of an organization.
    • github.com/aws/aws-sdk-go-v2/service/workspacesweb: v1.7.0
      • Feature: WorkSpaces Web now supports user access logging for recording session start, stop, and URL navigation.

    Release (2022-10-18)

    Module Highlights

    • github.com/aws/aws-sdk-go-v2/service/frauddetector: v1.20.10
      • Documentation: Documentation Updates for Amazon Fraud Detector
    • github.com/aws/aws-sdk-go-v2/service/sagemaker: v1.48.0
      • Feature: This change allows customers to enable data capturing while running a batch transform job, and configure monitoring schedule to monitoring the captured data.
    • github.com/aws/aws-sdk-go-v2/service/servicediscovery: v1.18.0
      • Feature: Updated the ListNamespaces API to support the NAME and HTTP_NAME filters, and the BEGINS_WITH filter condition.
    • github.com/aws/aws-sdk-go-v2/service/sesv2: v1.14.0
      • Feature: This release allows subscribers to enable Dedicated IPs (managed) to send email via a fully managed dedicated IP experience. It also adds identities' VerificationStatus in the response of GetEmailIdentity and ListEmailIdentities APIs, and ImportJobs counts in the response of ListImportJobs API.

    Release (2022-10-17)

    Module Highlights

    • github.com/aws/aws-sdk-go-v2/service/greengrass: v1.14.0
      • Feature: This change allows customers to specify FunctionRuntimeOverride in FunctionDefinitionVersion. This configuration can be used if the runtime on the device is different from the AWS Lambda runtime specified for that function.
    • github.com/aws/aws-sdk-go-v2/service/sagemaker: v1.47.0
      • Feature: This release adds support for C7g, C6g, C6gd, C6gn, M6g, M6gd, R6g, and R6gn Graviton instance types in Amazon SageMaker Inference.

    Release (2022-10-14)

    Module Highlights

    • github.com/aws/aws-sdk-go-v2/service/mediaconvert: v1.26.0
      • Feature: MediaConvert now supports specifying the minimum percentage of the HRD buffer available at the end of each encoded video segment.

    Release (2022-10-13)

    ... (truncated)

    Commits

    Updates `github.com/aws/aws-sdk-go-v2/service/s3` from 1.53.1 to 1.53.2
    Commits

    Updates `github.com/containers/image/v5` from 5.30.0 to 5.30.1
    Release notes

    Sourced from github.com/containers/image/v5's releases.

    v5.30.1

    This fixes CVE-2024-3727 .

    Digest values used throughout this library were not always validated. That allowed attackers to trigger, when pulling untrusted images, unexpected authenticated registry accesses on behalf of a victim user.

    In less common uses of this library (using other transports or not using the containers/image/v5/copy.Image API), an attacker could also trigger local path traversals or crashes.

    Commits
    • 56e750a Release 5.30.1
    • 132678b Merge pull request #2404 from mtrmac/digest-unmarshal-5.30
    • b724ee7 Validate the tags returned by a registry
    • a9225e4 Call .Validate() before digest.Digest.String() if necessary
    • 4a3785d Refactor the error handling further
    • a802d65 Refactor the error handling path of saveStream
    • 39e7c91 Call .Validate() before digest.Hex() / digest.Encoded()
    • 2bcb834 Validate digests before using them
    • See full diff in compare view

    Updates `github.com/docker/cli` from 26.1.1+incompatible to 26.1.2+incompatible
    Commits
    • 211e74b Merge pull request #5066 from vvoland/vendor-docker
    • 8beff78 Merge pull request #5065 from vvoland/v26.1-5064
    • e64914c vendor: github.com/docker/docker v26.1.2-dev (ef1912d8b6ae)
    • c1d70d1 update to go1.21.10
    • 53a3f0b Merge pull request #5062 from laurazard/cherry-pick-run-hang
    • 4add46d Add e2e tests for run w/ bad entrypoint
    • ccea7d8 Fix hang when container fails to start
    • See full diff in compare view

    Updates `github.com/docker/docker` from 26.1.1+incompatible to 26.1.2+incompatible
    Release notes

    Sourced from github.com/docker/docker's releases.

    v26.1.2

    26.1.2

    For a full list of pull requests and changes in this release, refer to the relevant GitHub milestones:

    Bug fixes and enhancements

    • Fix issue where the CLI process would sometimes hang when a container failed to start. docker/cli#5062

    Packaging updates

    Commits

    Updates `github.com/mikefarah/yq/v4` from 4.43.1 to 4.44.1
    Release notes

    Sourced from github.com/mikefarah/yq/v4's releases.

    v4.44.1 - min/max/pivot!

    Changelog

    Sourced from github.com/mikefarah/yq/v4's changelog.

    4.44.1:

    Commits

    Updates `github.com/onsi/ginkgo/v2` from 2.17.2 to 2.17.3
    Release notes

    Sourced from github.com/onsi/ginkgo/v2's releases.

    v2.17.3

    2.17.3

    Fixes

    ginkgo watch now ignores hidden files [bde6e00]

    Changelog

    Sourced from github.com/onsi/ginkgo/v2's changelog.

    2.17.3

    Fixes

    ginkgo watch now ignores hidden files [bde6e00]

    Commits

    Updates `golang.org/x/net` from 0.24.0 to 0.25.0
    Commits
    • d27919b go.mod: update golang.org/x dependencies
    • e0324fc http2: use net.ErrClosed
    • b20cd59 quic: initiate key rotation earlier in connections
    • f95a3b3 html: fix typo in package doc
    • 0a24555 http/httpguts: speed up ValidHeaderFieldName
    • ec05fdc http2: don't retry the first request on a connection on GOAWAY error
    • b67a0f0 http2: send correct LastStreamID in stream-caused GOAWAY
    • a130fcc quic: don't consider goroutines running when tests start as leaked
    • See full diff in compare view

    Updates `sigs.k8s.io/controller-runtime` from 0.18.1 to 0.18.2
    Release notes

    Sourced from sigs.k8s.io/controller-runtime's releases.

    v0.18.2

    What's Changed

    Full Changelog: https://github.com/kubernetes-sigs/controller-runtime/compare/v0.18.1...v0.18.2

    Commits
    • 834905b Merge pull request #2817 from k8s-infra-cherrypick-robot/cherry-pick-2813-to-...
    • 6396a49 Reintroduce AddMetricsExtraHandler on manager
    • See full diff in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 38 ++++++++++++++--------------- go.sum | 76 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 57 insertions(+), 57 deletions(-) diff --git a/go.mod b/go.mod index bd365e9b1b..143f82506a 100644 --- a/go.mod +++ b/go.mod @@ -11,18 +11,18 @@ require ( github.com/InfiniteLoopSpace/go_S-MIME v0.0.0-20181221134359-3f58f9a4b2b6 github.com/Masterminds/semver/v3 v3.2.1 github.com/aws/aws-sdk-go-v2 v1.26.1 - github.com/aws/aws-sdk-go-v2/config v1.27.11 - github.com/aws/aws-sdk-go-v2/credentials v1.17.11 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15 - github.com/aws/aws-sdk-go-v2/service/ecr v1.27.4 - github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 + github.com/aws/aws-sdk-go-v2/config v1.27.13 + github.com/aws/aws-sdk-go-v2/credentials v1.17.13 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.17 + github.com/aws/aws-sdk-go-v2/service/ecr v1.28.0 + github.com/aws/aws-sdk-go-v2/service/s3 v1.53.2 github.com/containerd/containerd v1.7.16 github.com/containerd/log v0.1.0 - github.com/containers/image/v5 v5.30.0 + github.com/containers/image/v5 v5.30.1 github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f github.com/distribution/reference v0.6.0 - github.com/docker/cli v26.1.1+incompatible - github.com/docker/docker v26.1.1+incompatible + github.com/docker/cli v26.1.2+incompatible + github.com/docker/docker v26.1.2+incompatible github.com/docker/go-connections v0.5.0 github.com/drone/envsubst v1.0.3 github.com/fluxcd/cli-utils v0.36.0-flux.7 @@ -45,11 +45,11 @@ require ( github.com/mandelsoft/spiff v1.7.0-beta-5 github.com/mandelsoft/vfs v0.4.3 github.com/marstr/guid v1.1.0 - github.com/mikefarah/yq/v4 v4.43.1 + github.com/mikefarah/yq/v4 v4.44.1 github.com/mitchellh/copystructure v1.2.0 github.com/mittwald/go-helm-client v0.12.9 github.com/modern-go/reflect2 v1.0.2 - github.com/onsi/ginkgo/v2 v2.17.2 + github.com/onsi/ginkgo/v2 v2.17.3 github.com/onsi/gomega v1.33.1 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.1.0 @@ -67,7 +67,7 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 - golang.org/x/net v0.24.0 + golang.org/x/net v0.25.0 golang.org/x/oauth2 v0.20.0 golang.org/x/text v0.15.0 gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 @@ -78,7 +78,7 @@ require ( k8s.io/apimachinery v0.30.0 k8s.io/cli-runtime v0.30.0 k8s.io/client-go v0.30.0 - sigs.k8s.io/controller-runtime v0.18.1 + sigs.k8s.io/controller-runtime v0.18.2 sigs.k8s.io/yaml v1.4.0 ) @@ -131,9 +131,9 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.20.6 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.28.7 // indirect github.com/aws/smithy-go v1.20.2 // indirect github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -265,7 +265,7 @@ require ( github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pborman/uuid v1.2.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.2.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.19.0 // indirect @@ -324,11 +324,11 @@ require ( go.step.sm/crypto v0.44.2 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.23.0 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/term v0.20.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.20.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect diff --git a/go.sum b/go.sum index 13c2f428ef..09e32053a4 100644 --- a/go.sum +++ b/go.sum @@ -159,14 +159,14 @@ github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+ github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= -github.com/aws/aws-sdk-go-v2/config v1.27.11 h1:f47rANd2LQEYHda2ddSCKYId18/8BhSRM4BULGmfgNA= -github.com/aws/aws-sdk-go-v2/config v1.27.11/go.mod h1:SMsV78RIOYdve1vf36z8LmnszlRWkwMQtomCAI0/mIE= -github.com/aws/aws-sdk-go-v2/credentials v1.17.11 h1:YuIB1dJNf1Re822rriUOTxopaHHvIq0l/pX3fwO+Tzs= -github.com/aws/aws-sdk-go-v2/credentials v1.17.11/go.mod h1:AQtFPsDH9bI2O+71anW6EKL+NcD7LG3dpKGMV4SShgo= +github.com/aws/aws-sdk-go-v2/config v1.27.13 h1:WbKW8hOzrWoOA/+35S5okqO/2Ap8hkkFUzoW8Hzq24A= +github.com/aws/aws-sdk-go-v2/config v1.27.13/go.mod h1:XLiyiTMnguytjRER7u5RIkhIqS8Nyz41SwAWb4xEjxs= +github.com/aws/aws-sdk-go-v2/credentials v1.17.13 h1:XDCJDzk/u5cN7Aple7D/MiAhx1Rjo/0nueJ0La8mRuE= +github.com/aws/aws-sdk-go-v2/credentials v1.17.13/go.mod h1:FMNcjQrmuBYvOTZDtOLCIu0esmxjF7RuA/89iSXWzQI= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15 h1:7Zwtt/lP3KNRkeZre7soMELMGNoBrutx8nobg1jKWmo= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15/go.mod h1:436h2adoHb57yd+8W+gYPrrA9U/R/SuAuOO42Ushzhw= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.17 h1:9b1Os1s11mF5qTIKLgSsyPG810di2+ySSLIIt9bwe9I= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.17/go.mod h1:9Wp7tDOMhv0+sb/FTRAkbHNQ7abYDnoJRzm5AAtCnTc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= @@ -177,8 +177,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 h1:81KE7vaZzrl7yHBYHVEzYB8sypz11NMOZ40YlWvPxsU= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5/go.mod h1:LIt2rg7Mcgn09Ygbdh/RdIm0rQ+3BNkbP1gyVMFtRK0= -github.com/aws/aws-sdk-go-v2/service/ecr v1.27.4 h1:Qr9W21mzWT3RhfYn9iAux7CeRIdbnTAqmiOlASqQgZI= -github.com/aws/aws-sdk-go-v2/service/ecr v1.27.4/go.mod h1:if7ybzzjOmDB8pat9FE35AHTY6ZxlYSy3YviSmFZv8c= +github.com/aws/aws-sdk-go-v2/service/ecr v1.28.0 h1:rdPrcOZmqT2F+yzmKEImrx5XUs7Hpf4V9Rp6E8mhsxQ= +github.com/aws/aws-sdk-go-v2/service/ecr v1.28.0/go.mod h1:if7ybzzjOmDB8pat9FE35AHTY6ZxlYSy3YviSmFZv8c= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2 h1:PpbXaecV3sLAS6rjQiaKw4/jyq3Z8gNzmoJupHAoBp0= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2/go.mod h1:fUHpGXr4DrXkEDpGAjClPsviWf+Bszeb0daKE0blxv8= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= @@ -191,14 +191,14 @@ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 h1:f9RyWNtS8oH7cZ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5/go.mod h1:h5CoMZV2VF297/VLhRhO1WF+XYWOzXo+4HsObA4HjBQ= github.com/aws/aws-sdk-go-v2/service/kms v1.30.0 h1:yS0JkEdV6h9JOo8sy2JSpjX+i7vsKifU8SIeHrqiDhU= github.com/aws/aws-sdk-go-v2/service/kms v1.30.0/go.mod h1:+I8VUUSVD4p5ISQtzpgSva4I8cJ4SQ4b1dcBcof7O+g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 h1:6cnno47Me9bRykw9AEv9zkXE+5or7jz8TsskTTccbgc= -github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1/go.mod h1:qmdkIIAC+GCLASF7R2whgNrJADz0QZPX+Seiw/i4S3o= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 h1:vN8hEbpRnL7+Hopy9dzmRle1xmDc7o8tmY0klsr175w= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.5/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 h1:Jux+gDDyi1Lruk+KHF91tK2KCuY61kzoCpvtvJJBtOE= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 h1:cwIxeBttqPN3qkaAjcEcsh8NYr8n2HZPkcKgPAi1phU= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.6/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.53.2 h1:rq2hglTQM3yHZvOPVMtNvLS5x6hijx7JvRDgKiTNDGQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.53.2/go.mod h1:qmdkIIAC+GCLASF7R2whgNrJADz0QZPX+Seiw/i4S3o= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.6 h1:o5cTaeunSpfXiLTIBx5xo2enQmiChtu1IBbzXnfU9Hs= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.6/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.0 h1:Qe0r0lVURDDeBQJ4yP+BOrJkvkiCo/3FH/t+wY11dmw= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.0/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.7 h1:et3Ta53gotFR4ERLXXHIHl/Uuk1qYpP5uU7cvNql8ns= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.7/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= @@ -276,8 +276,8 @@ github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/stargz-snapshotter/estargz v0.15.1 h1:eXJjw9RbkLFgioVaTG+G/ZW/0kEe2oEKCdS/ZxIyoCU= github.com/containerd/stargz-snapshotter/estargz v0.15.1/go.mod h1:gr2RNwukQ/S9Nv33Lt6UC7xEx58C+LHRdoqbEKjz1Kk= -github.com/containers/image/v5 v5.30.0 h1:CmHeSwI6W2kTRWnUsxATDFY5TEX4b58gPkaQcEyrLIA= -github.com/containers/image/v5 v5.30.0/go.mod h1:gSD8MVOyqBspc0ynLsuiMR9qmt8UQ4jpVImjmK0uXfk= +github.com/containers/image/v5 v5.30.1 h1:AKrQMgOKI1oKx5FW5eoU2xoNyzACajHGx1O3qxobvFM= +github.com/containers/image/v5 v5.30.1/go.mod h1:gSD8MVOyqBspc0ynLsuiMR9qmt8UQ4jpVImjmK0uXfk= github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 h1:Qzk5C6cYglewc+UyGf6lc8Mj2UaPTHy/iF2De0/77CA= github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY= github.com/containers/ocicrypt v1.1.9 h1:2Csfba4jse85Raxk5HIyEk8OwZNjRvfkhEGijOjIdEM= @@ -315,13 +315,13 @@ github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aB github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2/go.mod h1:WHNsWjnIn2V1LYOrME7e8KxSeKunYHsxEm4am0BUtcI= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v26.1.1+incompatible h1:bE1/uE2tCa08fMv+7ikLR/RDPoCqytwrLtkIkSzxLvw= -github.com/docker/cli v26.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v26.1.2+incompatible h1:/MWZpUMMlr1hCGyquL8QNbL1hbivQ1kLuT3Z9s1Tlpg= +github.com/docker/cli v26.1.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v26.1.1+incompatible h1:oI+4kkAgIwwb54b9OC7Xc3hSgu1RlJA/Lln/DF72djQ= -github.com/docker/docker v26.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v26.1.2+incompatible h1:UVX5ZOrrfTGZZYEP+ZDq3Xn9PdHNXaSYMFPDumMqG2k= +github.com/docker/docker v26.1.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo= github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= @@ -709,8 +709,8 @@ github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WT github.com/miekg/pkcs11 v1.0.3-0.20190429190417-a667d056470f/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mikefarah/yq/v4 v4.43.1 h1:1bCrQwVDhjGnPboQidy30hu6U2TCd8sUQTy1hKCHOGI= -github.com/mikefarah/yq/v4 v4.43.1/go.mod h1:jcSqtyUKbPWvwaa8cNw8Ej4rmPb3iWE8zYvpkTvM7oc= +github.com/mikefarah/yq/v4 v4.44.1 h1:FqnryFyO2MLfxKHYlGbrqpqPA8so7KAyuc7ra9vY+vQ= +github.com/mikefarah/yq/v4 v4.44.1/go.mod h1:mpBUHgdchicbt1rSHO0A3GKDHy6eVON14WXMLfpU3kg= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -773,8 +773,8 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.17.2 h1:7eMhcy3GimbsA3hEnVKdw/PQM9XN9krpKVXsZdph0/g= -github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= +github.com/onsi/ginkgo/v2 v2.17.3 h1:oJcvKpIb7/8uLpDDtnQuf18xVnwKp8DTD7DQ6gTd/MU= +github.com/onsi/ginkgo/v2 v2.17.3/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -799,8 +799,8 @@ github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.2.0 h1:QLgLl2yMN7N+ruc31VynXs1vhMZa7CeHHejIeBAsoHo= -github.com/pelletier/go-toml/v2 v2.2.0/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= @@ -1072,8 +1072,8 @@ golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58 golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= @@ -1121,8 +1121,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= @@ -1173,8 +1173,8 @@ 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.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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= @@ -1184,8 +1184,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -1326,8 +1326,8 @@ k8s.io/utils v0.0.0-20240310230437-4693a0247e57 h1:gbqbevonBh57eILzModw6mrkbwM0g k8s.io/utils v0.0.0-20240310230437-4693a0247e57/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo= -sigs.k8s.io/controller-runtime v0.18.1 h1:RpWbigmuiylbxOCLy0tGnq1cU1qWPwNIQzoJk+QeJx4= -sigs.k8s.io/controller-runtime v0.18.1/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw= +sigs.k8s.io/controller-runtime v0.18.2 h1:RqVW6Kpeaji67CY5nPEfRz6ZfFMk0lWQlNrLqlNpx+Q= +sigs.k8s.io/controller-runtime v0.18.2/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kustomize/api v0.17.1 h1:MYJBOP/yQ3/5tp4/sf6HiiMfNNyO97LmtnirH9SLNr4= From ccbbef572bb7a702397414f642c5a8dfa282d501 Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Thu, 16 May 2024 00:33:08 +0200 Subject: [PATCH 62/83] externalize general go utilities in packages pkg{errors,exceptions,generics,finalizer} (#761) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Some general utility functions so far part of the ocm library are now externalized, and can later be removed from the project. ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [x] πŸŽ‡ Restructuring - [x] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [x] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- cmds/demoplugin/accessmethods/demo.go | 2 +- cmds/demoplugin/uploaders/demo.go | 2 +- cmds/demoplugin/uploaders/writer.go | 2 +- cmds/demoplugin/valuesets/check.go | 13 ++-- cmds/demoplugin/valuesets/check_test.go | 1 + cmds/ecrplugin/actions/action.go | 2 +- cmds/helminstaller/app/config.go | 3 +- cmds/helminstaller/app/execute.go | 6 +- cmds/helminstaller/app/executor.go | 2 +- cmds/ocm/app/app.go | 2 +- cmds/ocm/commands/cachecmds/clean/cmd.go | 2 +- cmds/ocm/commands/cachecmds/describe/cmd.go | 2 +- .../options/failonerroroption/option.go | 2 +- .../common/options/keyoption/option.go | 2 +- .../commands/misccmds/action/execute/cmd.go | 2 +- .../commands/misccmds/credentials/get/cmd.go | 4 +- cmds/ocm/commands/misccmds/hash/sign/cmd.go | 2 +- cmds/ocm/commands/misccmds/rsakeypair/cmd.go | 2 +- .../ocicmds/artifacts/describe/cmd.go | 4 +- .../ocicmds/artifacts/download/cmd.go | 4 +- .../ocicmds/artifacts/transfer/cmd.go | 2 +- .../common/handlers/artifacthdlr/attached.go | 10 ++- .../common/handlers/artifacthdlr/clean.go | 5 +- .../handlers/artifacthdlr/typehandler.go | 3 +- cmds/ocm/commands/ocicmds/ctf/create/cmd.go | 2 +- cmds/ocm/commands/ocicmds/tags/show/cmd.go | 2 +- cmds/ocm/commands/ocmcmds/common/addconfig.go | 9 ++- .../common/addhdlrs/comp/components.go | 16 +++-- .../ocmcmds/common/addhdlrs/comp/elements.go | 9 +-- .../ocmcmds/common/addhdlrs/interface.go | 7 +- .../ocmcmds/common/addhdlrs/rscs/elements.go | 2 +- .../commands/ocmcmds/common/addhdlrs/utils.go | 5 +- .../ocmcmds/common/cmds/signing/cmd.go | 2 +- .../common/handlers/comphdlr/closure.go | 3 +- .../common/handlers/comphdlr/typehandler.go | 2 +- .../ocmcmds/common/handlers/comphdlr/util.go | 3 +- .../common/handlers/pluginhdlr/typehandler.go | 3 +- .../common/handlers/vershdlr/typehandler.go | 2 +- .../ocmcmds/common/inputs/cpi/helper.go | 2 +- .../ocmcmds/common/inputs/inputtype.go | 2 +- .../common/inputs/types/dockermulti/spec.go | 2 +- .../common/inputs/types/file/support.go | 2 +- .../ocmcmds/common/inputs/types/helm/spec.go | 2 +- .../ocmcmds/common/inputs/types/spiff/spec.go | 2 +- .../commands/ocmcmds/common/inputs/utils.go | 2 +- .../options/comppathopt/comppath_test.go | 3 +- .../common/options/hashoption/option.go | 2 +- .../common/options/optutils/registration.go | 2 +- .../common/options/schemaoption/option.go | 5 +- .../common/options/scriptoption/config.go | 2 +- .../common/options/scriptoption/option.go | 2 +- .../common/options/signoption/option.go | 2 +- cmds/ocm/commands/ocmcmds/common/resources.go | 13 ++-- cmds/ocm/commands/ocmcmds/common/settings.go | 2 +- cmds/ocm/commands/ocmcmds/common/utils.go | 3 +- .../ocmcmds/componentarchive/create/cmd.go | 2 +- .../commands/ocmcmds/components/add/cmd.go | 6 +- .../ocmcmds/components/download/cmd.go | 2 +- .../ocmcmds/components/transfer/cmd.go | 6 +- cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go | 2 +- cmds/ocm/commands/ocmcmds/plugins/get/cmd.go | 4 +- .../commands/ocmcmds/plugins/install/cmd.go | 2 +- .../ocmcmds/resources/download/action.go | 2 +- .../ocm/commands/ocmcmds/resources/get/cmd.go | 4 +- .../commands/ocmcmds/routingslips/add/cmd.go | 2 +- .../routingslips/common/typehandler.go | 3 +- .../ocmcmds/routingslips/get/cmd_test.go | 3 +- cmds/ocm/commands/ocmcmds/sources/get/cmd.go | 6 +- .../ocm/commands/ocmcmds/versions/show/cmd.go | 2 +- .../commands/toicmds/config/bootstrap/cmd.go | 2 +- .../commands/toicmds/package/bootstrap/cmd.go | 2 +- .../commands/toicmds/package/describe/cmd.go | 2 +- cmds/ocm/pkg/options/interfaces.go | 4 +- cmds/ocm/pkg/output/attroutput.go | 2 +- cmds/ocm/pkg/output/options.go | 2 +- cmds/ocm/pkg/output/output.go | 2 +- cmds/ocm/pkg/output/singleelemoutput.go | 2 +- cmds/ocm/pkg/output/tableoutput.go | 3 +- cmds/ocm/pkg/utils/command.go | 2 +- cmds/ocm/pkg/utils/handling.go | 2 +- .../lib/comparison-scenario/00-consumer.go | 2 +- .../lib/comparison-scenario/00-provider.go | 2 +- examples/lib/comparison-scenario/01-create.go | 2 +- examples/lib/comparison-scenario/02-sign.go | 2 +- examples/lib/comparison-scenario/03-write.go | 2 +- .../lib/comparison-scenario/04-transport.go | 2 +- examples/lib/comparison-scenario/05-verify.go | 2 +- .../lib/comparison-scenario/06-download.go | 2 +- examples/lib/comparison-scenario/07-getref.go | 2 +- .../comparison-scenario/08-deployscript.go | 2 +- .../lib/comparison-scenario/09-localize.go | 2 +- examples/lib/config1/example.go | 2 +- examples/lib/config2/example.go | 2 +- examples/lib/config3/example.go | 2 +- examples/lib/cred1/example.go | 2 +- examples/lib/cred2/example.go | 2 +- examples/lib/cred3/example.go | 2 +- examples/lib/ctf/example.go | 4 +- examples/lib/helper/helper.go | 2 +- .../lib/tour/01-getting-started/example.go | 2 +- .../01-basic-componentversion-creation.go | 5 +- .../02-composition-version.go | 2 +- .../01-using-credentials.go | 2 +- .../02-basic-credential-management.go | 2 +- .../03-credential-repositories.go | 2 +- .../03-working-with-credentials/common.go | 5 +- .../01-basic-config-management.go | 2 +- .../02-handle-arbitrary-config.go | 2 +- .../03-using-ocm-config.go | 2 +- .../04-write-config-type.go | 2 +- .../05-write-config-consumer.go | 2 +- .../common.go | 5 +- .../example.go | 2 +- .../01-basic-signing.go | 2 +- .../02-using-context-settings.go | 2 +- .../06-signing-component-versions/common.go | 5 +- examples/lib/transfer1/example.go | 4 +- go.mod | 7 +- go.sum | 6 +- pkg/blobaccess/compress.go | 2 +- pkg/blobaccess/dataaccess.go | 2 +- pkg/blobaccess/dirtree/access.go | 2 +- pkg/blobaccess/dockermulti/access.go | 4 +- pkg/blobaccess/helm/resource.go | 2 +- pkg/blobaccess/standard.go | 10 +-- pkg/blobaccess/utils.go | 2 +- pkg/blobaccess/wget/access.go | 3 +- pkg/clisupport/labels.go | 2 +- .../flag/string_colon_stringslice.go | 3 +- pkg/cobrautils/flag/yaml.go | 3 +- pkg/cobrautils/flagsets/configoptionset.go | 3 +- pkg/cobrautils/flagsets/provider.go | 3 +- pkg/cobrautils/flagsets/utils.go | 3 +- pkg/cobrautils/logopts/options.go | 2 +- pkg/common/accessio/access.go | 2 +- pkg/common/accessio/cache.go | 2 +- pkg/common/accessio/format.go | 2 +- pkg/common/accessio/ondemandreader.go | 2 +- pkg/common/accessio/opts.go | 2 +- pkg/common/accessio/resettablereader.go | 3 +- pkg/common/accessio/retry_test.go | 2 +- pkg/common/accessio/utils.go | 6 +- pkg/common/accessio/wrapper.go | 2 +- pkg/common/accessobj/accessobject.go | 2 +- pkg/common/accessobj/accessstate.go | 2 +- pkg/common/accessobj/check.go | 2 +- pkg/common/accessobj/format-directory.go | 2 +- pkg/common/accessobj/format-tar.go | 2 +- pkg/common/accessobj/format.go | 2 +- pkg/common/accessobj/utils.go | 2 +- pkg/common/history.go | 7 +- pkg/common/properties.go | 6 +- pkg/common/types.go | 11 +++- pkg/contexts/clictx/internal/context.go | 6 +- pkg/contexts/config/config/context_test.go | 4 +- pkg/contexts/config/config/type.go | 3 +- pkg/contexts/config/context_test.go | 3 +- pkg/contexts/config/cpi/content.go | 2 +- pkg/contexts/config/gc_test.go | 4 +- pkg/contexts/config/internal/config.go | 3 +- pkg/contexts/config/internal/configtypes.go | 2 +- pkg/contexts/config/internal/context.go | 3 +- pkg/contexts/config/internal/errors.go | 2 +- pkg/contexts/credentials/config/type.go | 3 +- pkg/contexts/credentials/gc_test.go | 4 +- .../credentials/internal/consumers.go | 6 +- pkg/contexts/credentials/internal/context.go | 7 +- .../credentials/internal/credentials.go | 5 +- pkg/contexts/credentials/internal/errors.go | 2 +- .../credentials/internal/repository.go | 7 +- .../credentials/internal/repotypes.go | 6 +- pkg/contexts/credentials/internal/utils.go | 2 +- .../repositories/directcreds/repository.go | 3 +- .../repositories/dockerconfig/credentials.go | 4 +- .../repositories/dockerconfig/default.go | 2 +- .../repositories/dockerconfig/repo_test.go | 4 +- .../repositories/dockerconfig/repository.go | 8 +-- .../repositories/dockerconfig/type.go | 3 +- .../repositories/gardenerconfig/repository.go | 5 +- .../repositories/gardenerconfig/type.go | 3 +- .../repositories/memory/config/type.go | 3 +- .../credentials/repositories/npm/config.go | 3 +- .../credentials/repositories/npm/default.go | 2 +- .../repositories/npm/repository.go | 3 +- .../repositories/npm/repository_test.go | 4 +- .../credentials/repositories/npm/type.go | 3 +- .../credentials/repositories/vault/auth.go | 2 +- .../credentials/repositories/vault/cache.go | 3 +- .../repositories/vault/identity/identity.go | 3 +- .../repositories/vault/provider.go | 2 +- .../repositories/vault/repository.go | 3 +- pkg/contexts/credentials/utils.go | 2 +- .../datacontext/action/api/registry.go | 2 +- .../datacontext/action/handlers/registry.go | 6 +- pkg/contexts/datacontext/attrs.go | 3 +- .../datacontext/attrs/rootcertsattr/attr.go | 3 +- .../datacontext/attrs/rootcertsattr/config.go | 2 +- .../datacontext/attrs/tmpcache/attr.go | 2 +- .../datacontext/attrs/vfsattr/attr.go | 2 +- pkg/contexts/datacontext/config/attrs/type.go | 3 +- pkg/contexts/datacontext/context.go | 11 ++-- pkg/contexts/datacontext/cpi.go | 11 ++-- pkg/contexts/datacontext/gc_test.go | 15 +++-- pkg/contexts/datacontext/session.go | 3 +- .../actions/oci-repository-prepare/exec.go | 5 +- pkg/contexts/oci/artdesc/artifact.go | 2 +- pkg/contexts/oci/artdesc/helper/generic.go | 3 +- pkg/contexts/oci/artdesc/index.go | 2 +- pkg/contexts/oci/artdesc/manifest.go | 2 +- pkg/contexts/oci/attrs/cacheattr/attr.go | 3 +- pkg/contexts/oci/cpi/support/artifact.go | 2 +- pkg/contexts/oci/cpi/support/base.go | 2 +- pkg/contexts/oci/cpi/support/flavor_index.go | 2 +- .../oci/cpi/support/flavor_manifest.go | 2 +- pkg/contexts/oci/cpi/support/namespace.go | 2 +- pkg/contexts/oci/cpi/view.go | 2 +- pkg/contexts/oci/gc_test.go | 4 +- pkg/contexts/oci/internal/errors.go | 3 +- pkg/contexts/oci/internal/repotypes.go | 6 +- pkg/contexts/oci/internal/uniform.go | 2 +- pkg/contexts/oci/ociutils/helm/artifact.go | 2 +- pkg/contexts/oci/ref.go | 2 +- .../repositories/artifactset/artifactset.go | 2 +- .../artifactset/artifactset_test.go | 2 +- .../oci/repositories/artifactset/format.go | 2 +- .../oci/repositories/artifactset/options.go | 3 +- .../repositories/artifactset/repository.go | 3 +- .../artifactset/utils_synthesis.go | 4 +- pkg/contexts/oci/repositories/ctf/ctf_test.go | 4 +- pkg/contexts/oci/repositories/ctf/format.go | 2 +- .../oci/repositories/ctf/namespace.go | 2 +- .../oci/repositories/ctf/synthesis_test.go | 2 +- .../oci/repositories/ctf/testhelper/fill.go | 2 +- .../oci/repositories/docker/namespace.go | 2 +- .../oci/repositories/empty/repository.go | 3 +- pkg/contexts/oci/repositories/ocireg/blobs.go | 2 +- .../oci/repositories/ocireg/namespace.go | 2 +- .../oci/repositories/ocireg/repository.go | 2 +- pkg/contexts/oci/session.go | 3 +- pkg/contexts/oci/transfer/transfer.go | 6 +- pkg/contexts/oci/transfer/transfer_test.go | 3 +- .../ocm/accessmethods/github/method.go | 2 +- pkg/contexts/ocm/accessmethods/helm/method.go | 3 +- .../ocm/accessmethods/localblob/method.go | 2 +- .../ocm/accessmethods/localfsblob/method.go | 2 +- .../ocm/accessmethods/localociblob/method.go | 2 +- pkg/contexts/ocm/accessmethods/none/method.go | 3 +- pkg/contexts/ocm/accessmethods/npm/method.go | 2 +- .../ocm/accessmethods/ociartifact/method.go | 8 +-- .../ocm/accessmethods/ociblob/method.go | 2 +- .../ocm/accessmethods/options/registry.go | 3 +- .../ocm/accessmethods/plugin/method.go | 3 +- .../ocm/accessmethods/plugin/plugin.go | 6 +- .../relativeociref/method_test.go | 3 +- pkg/contexts/ocm/accessmethods/s3/method.go | 2 +- .../ocm/accessmethods/s3/method_test.go | 4 +- pkg/contexts/ocm/accessmethods/s3/v1.go | 2 +- pkg/contexts/ocm/accessmethods/s3/v2.go | 2 +- .../ocm/actionhandler/plugin/actionhandler.go | 3 +- .../ocm/actionhandler/plugin/registration.go | 3 +- pkg/contexts/ocm/attrs/hashattr/config.go | 3 +- pkg/contexts/ocm/attrs/mapocirepoattr/attr.go | 2 +- pkg/contexts/ocm/attrs/ociuploadattr/attr.go | 3 +- pkg/contexts/ocm/attrs/plugindirattr/attr.go | 6 +- pkg/contexts/ocm/attrs/signingattr/attr.go | 3 +- pkg/contexts/ocm/attrs/signingattr/config.go | 2 +- pkg/contexts/ocm/blobhandler/config/type.go | 3 +- .../handlers/generic/npm/registration.go | 3 +- .../handlers/generic/ocirepo/blobhandler.go | 7 +- .../handlers/generic/ocirepo/registration.go | 3 +- .../handlers/generic/plugin/blobhandler.go | 3 +- .../handlers/generic/plugin/registration.go | 3 +- .../handlers/oci/ocirepo/blobhandler.go | 18 ++--- .../handlers/ocm/comparch/blobhandler.go | 2 +- .../ocm/compdesc/componentdescriptor.go | 3 +- pkg/contexts/ocm/compdesc/helper.go | 9 +-- pkg/contexts/ocm/compdesc/meta/v1/labels.go | 2 +- pkg/contexts/ocm/compdesc/meta/v1/types.go | 2 +- pkg/contexts/ocm/compdesc/normalization.go | 2 +- .../compdesc/normalizations/jsonv1/norm.go | 6 +- pkg/contexts/ocm/compdesc/op.go | 6 +- pkg/contexts/ocm/compdesc/schemes.go | 8 ++- pkg/contexts/ocm/compdesc/signing.go | 7 +- .../ocm.software/v3alpha1/validation.go | 2 +- .../versions/ocm.software/v3alpha1/version.go | 3 +- .../ocm/compdesc/versions/v2/validation.go | 2 +- .../ocm/compdesc/versions/v2/version.go | 3 +- pkg/contexts/ocm/cpi/compose_test.go | 2 +- pkg/contexts/ocm/cpi/dummy.go | 3 +- pkg/contexts/ocm/cpi/interface.go | 4 +- pkg/contexts/ocm/cpi/repocpi/backend.go | 3 +- pkg/contexts/ocm/cpi/repocpi/blobcache.go | 3 +- pkg/contexts/ocm/cpi/repocpi/bridge_c.go | 5 +- pkg/contexts/ocm/cpi/repocpi/bridge_cv.go | 10 +-- pkg/contexts/ocm/cpi/repocpi/bridge_r.go | 3 +- pkg/contexts/ocm/cpi/repocpi/view_c.go | 3 +- pkg/contexts/ocm/cpi/repocpi/view_cv.go | 3 +- pkg/contexts/ocm/cpi/repocpi/view_r.go | 3 +- pkg/contexts/ocm/cpi/view_rsc.go | 3 +- .../digester/digesters/artifact/digester.go | 6 +- pkg/contexts/ocm/download/config/type.go | 3 +- .../ocm/download/handlers/blob/handler.go | 2 +- .../download/handlers/blueprint/extractor.go | 2 +- .../download/handlers/blueprint/handler.go | 8 +-- .../handlers/blueprint/registration.go | 2 +- .../ocm/download/handlers/dirtree/handler.go | 14 ++-- .../download/handlers/dirtree/registration.go | 2 +- .../download/handlers/executable/handler.go | 2 +- .../ocm/download/handlers/helm/download.go | 4 +- .../ocm/download/handlers/helm/handler.go | 4 +- .../ocm/download/handlers/ocirepo/handler.go | 8 +-- .../download/handlers/ocirepo/registration.go | 2 +- .../ocm/download/handlers/plugin/handler.go | 4 +- .../download/handlers/plugin/registration.go | 2 +- pkg/contexts/ocm/download/registry.go | 12 ++-- .../artifactaccess/genericaccess/resource.go | 7 +- .../artifactblob/datablob/resource.go | 5 +- .../artifactblob/dirtreeblob/resource.go | 5 +- .../artifactblob/dockerdaemonblob/resource.go | 5 +- .../artifactblob/dockermultiblob/resource.go | 5 +- .../artifactblob/externalblob/resource.go | 7 +- .../artifactblob/fileblob/resource.go | 5 +- .../artifactblob/genericblob/resource.go | 5 +- .../artifactblob/helmblob/resource.go | 5 +- .../artifactblob/ociartifactblob/resource.go | 5 +- .../artifactblob/wgetblob/resource.go | 5 +- pkg/contexts/ocm/elements/references.go | 3 +- pkg/contexts/ocm/elements/resources.go | 3 +- pkg/contexts/ocm/elements/sources.go | 3 +- pkg/contexts/ocm/gc_test.go | 4 +- pkg/contexts/ocm/internal/accesstypes.go | 13 ++-- pkg/contexts/ocm/internal/context.go | 2 +- pkg/contexts/ocm/internal/errors.go | 6 +- pkg/contexts/ocm/internal/repotypes.go | 6 +- pkg/contexts/ocm/internal/resolver.go | 7 +- pkg/contexts/ocm/internal/uniform.go | 6 +- pkg/contexts/ocm/labels/routingslip/entry.go | 2 +- .../labels/routingslip/internal/entrytypes.go | 9 +-- pkg/contexts/ocm/labels/routingslip/slip.go | 10 +-- .../ocm/labels/routingslip/transfer_test.go | 3 +- pkg/contexts/ocm/plugin/cache/plugindir.go | 6 +- pkg/contexts/ocm/plugin/cache/registry.go | 7 +- pkg/contexts/ocm/plugin/cache/updater.go | 2 +- pkg/contexts/ocm/plugin/common/describe.go | 6 +- pkg/contexts/ocm/plugin/descriptor/const.go | 4 +- pkg/contexts/ocm/plugin/descriptor/keys.go | 4 +- pkg/contexts/ocm/plugin/descriptor/utils.go | 5 +- pkg/contexts/ocm/plugin/plugin.go | 3 +- .../ppi/cmds/accessmethod/compose/cmd.go | 5 +- .../plugin/ppi/cmds/accessmethod/get/cmd.go | 2 +- .../ppi/cmds/accessmethod/identity/cmd.go | 2 +- .../ppi/cmds/accessmethod/validate/cmd.go | 5 +- .../ocm/plugin/ppi/cmds/action/execute/cmd.go | 2 +- .../ocm/plugin/ppi/cmds/download/cmd.go | 2 +- .../ppi/cmds/mergehandler/execute/cmd.go | 2 +- .../ocm/plugin/ppi/cmds/upload/put/cmd.go | 2 +- .../plugin/ppi/cmds/upload/validate/cmd.go | 2 +- .../plugin/ppi/cmds/valueset/compose/cmd.go | 2 +- .../plugin/ppi/cmds/valueset/validate/cmd.go | 2 +- pkg/contexts/ocm/plugin/ppi/plugin.go | 5 +- pkg/contexts/ocm/ref.go | 7 +- .../repositories/comparch/comparch_test.go | 2 +- .../repositories/comparch/componentarchive.go | 5 +- .../ocm/repositories/comparch/format.go | 2 +- .../ocm/repositories/comparch/repository.go | 8 ++- .../ocm/repositories/composition/cache.go | 5 +- .../repositories/composition/close_test.go | 3 +- .../repositories/composition/repository.go | 7 +- .../composition/repository_test.go | 2 +- .../repositories/composition/version_test.go | 3 +- .../ocm/repositories/ctf/repo_test.go | 2 +- .../genericocireg/accessmethod_localblob.go | 2 +- .../repositories/genericocireg/component.go | 6 +- .../genericocireg/componentversion.go | 9 +-- .../repositories/genericocireg/cred_test.go | 3 +- .../repositories/genericocireg/repo_test.go | 3 +- .../repositories/genericocireg/repository.go | 7 +- .../ocm/repositories/genericocireg/state.go | 2 +- .../ocm/repositories/genericocireg/type.go | 6 +- .../virtual/accessmethod_localblob.go | 3 +- .../ocm/repositories/virtual/component.go | 7 +- .../repositories/virtual/componentversion.go | 6 +- .../repositories/virtual/example/example.go | 6 +- .../ocm/repositories/virtual/index.go | 3 +- .../ocm/repositories/virtual/repo_test.go | 2 +- pkg/contexts/ocm/resolver.go | 2 +- pkg/contexts/ocm/session.go | 3 +- pkg/contexts/ocm/signing/convenience.go | 3 +- pkg/contexts/ocm/signing/digestctx.go | 3 +- pkg/contexts/ocm/signing/handle.go | 12 ++-- pkg/contexts/ocm/signing/options.go | 5 +- pkg/contexts/ocm/signing/signing_test.go | 2 +- pkg/contexts/ocm/signing/transport_test.go | 3 +- pkg/contexts/ocm/transfer/autohandler.go | 3 +- pkg/contexts/ocm/transfer/autohandler_test.go | 2 +- pkg/contexts/ocm/transfer/transfer.go | 9 +-- .../transfer/transferhandler/spiff/handler.go | 2 +- .../transfer/transferhandler/spiff/options.go | 2 +- .../transferhandler/standard/handler.go | 3 +- .../transferhandler/standard/handler_test.go | 3 +- .../transferhandler/standard/options.go | 66 ++++++++++--------- .../transferhandler/standard/utils.go | 2 +- .../transferhandler/standard/utils_test.go | 3 +- .../transferhandler/transferhandler.go | 3 +- pkg/contexts/ocm/transfer/transferrepo.go | 3 +- pkg/contexts/ocm/utils.go | 2 +- pkg/contexts/ocm/utils/check/check.go | 3 +- pkg/contexts/ocm/utils/configure.go | 2 +- pkg/contexts/ocm/utils/localize/config.go | 8 +-- pkg/contexts/ocm/utils/localize/format.go | 3 +- .../ocm/utils/localize/instantiate.go | 2 +- pkg/contexts/ocm/utils/localize/subst.go | 2 +- pkg/contexts/ocm/utils/registry/registry.go | 6 +- .../ocm/utils/registry/registry_test.go | 9 +-- pkg/contexts/ocm/utils/resourceref.go | 5 +- pkg/contexts/ocm/utils/utils.go | 3 +- pkg/contexts/ocm/utils/walk.go | 3 +- .../handlers/defaultmerge/config.go | 3 +- .../handlers/maplistmerge/handler.go | 3 +- .../handlers/plugin/handler.go | 3 +- .../handlers/simplemapmerge/handler.go | 3 +- .../ocm/valuemergehandler/hpi/merge.go | 3 +- .../ocm/valuemergehandler/internal/support.go | 3 +- pkg/contexts/options/utils.go | 4 +- pkg/dirtree/dirtree.go | 2 +- pkg/dirtree/tar.go | 3 +- pkg/dirtree/vfs.go | 2 +- pkg/encrypt/encrypt.go | 2 +- pkg/env/builder/builder.go | 2 +- pkg/env/builder/builder_test.go | 2 +- pkg/env/builder/oci_artifact.go | 3 +- pkg/env/builder/oci_config.go | 3 +- pkg/env/builder/oci_layer.go | 3 +- pkg/env/builder/ocm_resource.go | 3 +- pkg/env/builder/ocm_source.go | 3 +- pkg/env/builder/ocm_version.go | 3 +- pkg/env/env.go | 2 +- pkg/{errors => errkind}/kinds.go | 6 +- pkg/{errors => errkind}/utils.go | 6 +- pkg/errors/doc.go | 6 ++ pkg/errors/error_test.go | 2 +- pkg/errors/errprop_test.go | 2 +- pkg/exception/doc.go | 6 ++ pkg/exception/exception.go | 2 +- pkg/exception/exception_test.go | 2 +- pkg/finalizer/closer.go | 3 +- pkg/finalizer/doc.go | 6 ++ pkg/finalizer/finalizer.go | 4 +- pkg/finalizer/finalizer_test.go | 3 +- pkg/finalizer/object_test.go | 61 ----------------- pkg/generics/cast.go | 2 +- pkg/generics/doc.go | 6 ++ pkg/helm/downloader.go | 2 +- pkg/helm/loader/loader.go | 2 +- pkg/iotools/digestreader.go | 3 +- pkg/iotools/readerwriter.go | 7 +- pkg/logging/logging.go | 3 +- pkg/mimeutils/type.go | 6 +- pkg/optionutils/pointer.go | 7 ++ pkg/optionutils/target.go | 4 +- pkg/refmgmt/finalized/finalized_test.go | 26 ++++---- pkg/refmgmt/finalized/finalizedref.go | 10 +-- pkg/refmgmt/refcloser.go | 2 +- pkg/refmgmt/refmgmt.go | 3 +- pkg/registrations/info.go | 7 +- pkg/registrations/registrations.go | 9 +-- pkg/registrations/utils.go | 3 +- pkg/runtime/binary.go | 2 +- pkg/runtime/convert.go | 10 +-- pkg/runtime/multi.go | 12 ++-- pkg/runtime/scheme.go | 24 +++---- pkg/runtime/unstructured.go | 9 +-- pkg/runtime/utils.go | 3 +- pkg/runtime/validate.go | 2 +- pkg/runtime/value.go | 2 +- pkg/runtime/versionedtype.go | 2 +- pkg/{finalizer => runtimefinalizer}/object.go | 6 +- pkg/runtimefinalizer/object_test.go | 65 ++++++++++++++++++ pkg/runtimefinalizer/suite_test.go | 17 +++++ pkg/semverutils/utils.go | 3 +- pkg/signing/cert.go | 3 +- pkg/signing/encrypt.go | 3 +- .../handlers/rsa-signingservice/client.go | 3 +- .../handlers/rsa-signingservice/handler.go | 3 +- pkg/signing/handlers/rsa/format.go | 6 +- pkg/signing/handlers/rsa/handler.go | 3 +- pkg/signing/handlers/sigstore/handler.go | 2 +- pkg/signing/norm/jcs/norm.go | 11 ++-- pkg/signing/normalization.go | 2 +- pkg/signing/registry.go | 11 ++-- pkg/signing/signutils/certs.go | 2 +- pkg/signing/signutils/names.go | 2 +- pkg/signing/signutils/utils.go | 2 +- pkg/signing/tsa/pem.go | 3 +- pkg/signing/tsa/tsa.go | 2 +- pkg/signing/utils.go | 2 +- pkg/spiff/options.go | 8 +-- pkg/spiff/spiff.go | 2 +- pkg/spiff/validate.go | 3 +- pkg/testutils/string.go | 3 +- pkg/toi/drivers/docker/driver.go | 6 +- pkg/toi/drivers/filesystem/driver.go | 4 +- pkg/toi/install/action.go | 4 +- pkg/toi/install/credentials.go | 2 +- pkg/toi/install/execute.go | 3 +- pkg/toi/spec.go | 3 +- pkg/toi/support/app.go | 2 +- pkg/toi/support/support.go | 12 ++-- pkg/utils/panics/panics.go | 3 +- pkg/utils/path.go | 3 +- pkg/utils/subst/subst.go | 2 +- pkg/utils/tarutils/extract.go | 2 +- pkg/utils/tarutils/list.go | 2 +- pkg/utils/tarutils/pack.go | 7 +- pkg/utils/template/registry.go | 2 +- pkg/utils/template/template.go | 2 +- pkg/utils/time.go | 6 +- pkg/utils/url.go | 8 ++- 518 files changed, 1197 insertions(+), 949 deletions(-) rename pkg/{errors => errkind}/kinds.go (53%) rename pkg/{errors => errkind}/utils.go (54%) create mode 100644 pkg/errors/doc.go create mode 100644 pkg/exception/doc.go create mode 100644 pkg/finalizer/doc.go delete mode 100644 pkg/finalizer/object_test.go create mode 100644 pkg/generics/doc.go rename pkg/{finalizer => runtimefinalizer}/object.go (93%) create mode 100644 pkg/runtimefinalizer/object_test.go create mode 100644 pkg/runtimefinalizer/suite_test.go diff --git a/cmds/demoplugin/accessmethods/demo.go b/cmds/demoplugin/accessmethods/demo.go index a04089f3b2..83c136c22b 100644 --- a/cmds/demoplugin/accessmethods/demo.go +++ b/cmds/demoplugin/accessmethods/demo.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/demoplugin/common" "github.com/open-component-model/ocm/cmds/demoplugin/config" @@ -16,7 +17,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/options" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/cmds/demoplugin/uploaders/demo.go b/cmds/demoplugin/uploaders/demo.go index 177decd848..5e7654c92b 100644 --- a/cmds/demoplugin/uploaders/demo.go +++ b/cmds/demoplugin/uploaders/demo.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/demoplugin/accessmethods" "github.com/open-component-model/ocm/cmds/demoplugin/common" @@ -15,7 +16,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/oci/identity" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/cmds/demoplugin/uploaders/writer.go b/cmds/demoplugin/uploaders/writer.go index c1cd6b7d8a..465e73e1e0 100644 --- a/cmds/demoplugin/uploaders/writer.go +++ b/cmds/demoplugin/uploaders/writer.go @@ -4,11 +4,11 @@ import ( "os" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/demoplugin/accessmethods" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/iotools" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/cmds/demoplugin/valuesets/check.go b/cmds/demoplugin/valuesets/check.go index 6360af9097..f16b8129cc 100644 --- a/cmds/demoplugin/valuesets/check.go +++ b/cmds/demoplugin/valuesets/check.go @@ -4,12 +4,13 @@ import ( out "fmt" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/set" + "github.com/open-component-model/ocm/pkg/cobrautils/flagsets" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/options" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) @@ -32,7 +33,7 @@ const ( STATUS_SKIPPED = "skipped" ) -var status = generics.Set[string]{}.Add(STATUS_PASSED, STATUS_FAILED, STATUS_SKIPPED) +var status = set.New[string](STATUS_PASSED, STATUS_FAILED, STATUS_SKIPPED) var ( StatusOption = options.NewStringMapOptionType("checkStatus", out.Sprintf("status value for check (%s)", strings.Join(utils.StringMapKeys(status), ", "))) @@ -50,7 +51,7 @@ func New() ppi.ValueSet { The status entry has the following format: - **status *string* status code (passed, failed) -- **message *string* mwssage +- **message *string* message `), } } @@ -62,7 +63,7 @@ func (v ValueSet) Options() []options.OptionType { } } -func (v ValueSet) ValidateSpecification(p ppi.Plugin, spec runtime.TypedObject) (*ppi.ValueSetInfo, error) { +func (v ValueSet) ValidateSpecification(_ ppi.Plugin, spec runtime.TypedObject) (*ppi.ValueSetInfo, error) { var info ppi.ValueSetInfo my := spec.(*Value) @@ -86,7 +87,7 @@ func (v ValueSet) ValidateSpecification(p ppi.Plugin, spec runtime.TypedObject) return &info, nil } -func (v ValueSet) ComposeSpecification(p ppi.Plugin, opts ppi.Config, config ppi.Config) error { +func (v ValueSet) ComposeSpecification(_ ppi.Plugin, opts ppi.Config, config ppi.Config) error { list := errors.ErrListf("configuring options") if v, ok := opts.GetValue(StatusOption.GetName()); ok { diff --git a/cmds/demoplugin/valuesets/check_test.go b/cmds/demoplugin/valuesets/check_test.go index e7ab2e6a0c..174180ff2f 100644 --- a/cmds/demoplugin/valuesets/check_test.go +++ b/cmds/demoplugin/valuesets/check_test.go @@ -79,6 +79,7 @@ var _ = Describe("demoplugin", func() { Expect(registration.RegisterExtensions(env)).To(Succeed()) p := registry.Get("demo") Expect(p).NotTo(BeNil()) + Expect(p.Error()).To(Equal("")) env.OCMCompositionRepository("test", func() { env.ComponentVersion(COMP, VERS, func() { diff --git a/cmds/ecrplugin/actions/action.go b/cmds/ecrplugin/actions/action.go index 9ee7d1f824..46f8b217dd 100644 --- a/cmds/ecrplugin/actions/action.go +++ b/cmds/ecrplugin/actions/action.go @@ -10,12 +10,12 @@ import ( "github.com/aws/aws-sdk-go-v2/credentials" "github.com/aws/aws-sdk-go-v2/service/ecr" "github.com/aws/aws-sdk-go-v2/service/ecr/types" + "github.com/mandelsoft/goutils/errors" ocmcreds "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/oci/actions/oci-repository-prepare" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/s3/identity" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" - "github.com/open-component-model/ocm/pkg/errors" ) type Action struct{} diff --git a/cmds/helminstaller/app/config.go b/cmds/helminstaller/app/config.go index 3df93131d0..c7a0dbf902 100644 --- a/cmds/helminstaller/app/config.go +++ b/cmds/helminstaller/app/config.go @@ -3,9 +3,10 @@ package app import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" + v1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/localize" - "github.com/open-component-model/ocm/pkg/errors" ) type Config struct { diff --git a/cmds/helminstaller/app/execute.go b/cmds/helminstaller/app/execute.go index 7f8ee7872f..2819ca987d 100644 --- a/cmds/helminstaller/app/execute.go +++ b/cmds/helminstaller/app/execute.go @@ -5,10 +5,11 @@ import ( "fmt" "strings" - . "github.com/open-component-model/ocm/pkg/exception" - . "github.com/open-component-model/ocm/pkg/finalizer" + . "github.com/mandelsoft/goutils/exception" + . "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/projectionfs" "github.com/mandelsoft/vfs/pkg/vfs" @@ -19,7 +20,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/download" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/helm/loader" "github.com/open-component-model/ocm/pkg/out" "github.com/open-component-model/ocm/pkg/runtime" diff --git a/cmds/helminstaller/app/executor.go b/cmds/helminstaller/app/executor.go index 70e944a208..e574790798 100644 --- a/cmds/helminstaller/app/executor.go +++ b/cmds/helminstaller/app/executor.go @@ -1,10 +1,10 @@ package app import ( + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/open-component-model/ocm/cmds/helminstaller/app/driver" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/toi/support" ) diff --git a/cmds/ocm/app/app.go b/cmds/ocm/app/app.go index d110f67bf7..35a15c8d05 100644 --- a/cmds/ocm/app/app.go +++ b/cmds/ocm/app/app.go @@ -10,6 +10,7 @@ import ( _ "github.com/open-component-model/ocm/pkg/contexts/clictx/config" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs" + "github.com/mandelsoft/goutils/errors" "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -70,7 +71,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/registration" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/defaultconfigregistry" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/version" diff --git a/cmds/ocm/commands/cachecmds/clean/cmd.go b/cmds/ocm/commands/cachecmds/clean/cmd.go index 583fa8e7ab..25326ef9bc 100644 --- a/cmds/ocm/commands/cachecmds/clean/cmd.go +++ b/cmds/ocm/commands/cachecmds/clean/cmd.go @@ -4,6 +4,7 @@ import ( "fmt" "time" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -14,7 +15,6 @@ import ( "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/oci/attrs/cacheattr" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" utils2 "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/cmds/ocm/commands/cachecmds/describe/cmd.go b/cmds/ocm/commands/cachecmds/describe/cmd.go index 78ba0037d9..8d595bb0e6 100644 --- a/cmds/ocm/commands/cachecmds/describe/cmd.go +++ b/cmds/ocm/commands/cachecmds/describe/cmd.go @@ -1,6 +1,7 @@ package describe import ( + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/open-component-model/ocm/cmds/ocm/commands/cachecmds/names" @@ -9,7 +10,6 @@ import ( "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/oci/attrs/cacheattr" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" ) diff --git a/cmds/ocm/commands/common/options/failonerroroption/option.go b/cmds/ocm/commands/common/options/failonerroroption/option.go index 6616096e3a..bb41ee603d 100644 --- a/cmds/ocm/commands/common/options/failonerroroption/option.go +++ b/cmds/ocm/commands/common/options/failonerroroption/option.go @@ -1,10 +1,10 @@ package failonerroroption import ( + "github.com/mandelsoft/goutils/errors" "github.com/spf13/pflag" "github.com/open-component-model/ocm/cmds/ocm/pkg/options" - "github.com/open-component-model/ocm/pkg/errors" ) func From(o options.OptionSetProvider) *Option { diff --git a/cmds/ocm/commands/common/options/keyoption/option.go b/cmds/ocm/commands/common/options/keyoption/option.go index fd3e41974f..a3102ea969 100644 --- a/cmds/ocm/commands/common/options/keyoption/option.go +++ b/cmds/ocm/commands/common/options/keyoption/option.go @@ -6,12 +6,12 @@ import ( "reflect" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/pflag" "github.com/open-component-model/ocm/cmds/ocm/pkg/options" "github.com/open-component-model/ocm/pkg/contexts/clictx" ocmsign "github.com/open-component-model/ocm/pkg/contexts/ocm/signing" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/signutils" "github.com/open-component-model/ocm/pkg/utils" diff --git a/cmds/ocm/commands/misccmds/action/execute/cmd.go b/cmds/ocm/commands/misccmds/action/execute/cmd.go index 9ce8351b6d..4e2b23e976 100644 --- a/cmds/ocm/commands/misccmds/action/execute/cmd.go +++ b/cmds/ocm/commands/misccmds/action/execute/cmd.go @@ -4,6 +4,7 @@ import ( "encoding/json" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -14,7 +15,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/datacontext/action" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" "github.com/open-component-model/ocm/pkg/runtime" utils2 "github.com/open-component-model/ocm/pkg/utils" diff --git a/cmds/ocm/commands/misccmds/credentials/get/cmd.go b/cmds/ocm/commands/misccmds/credentials/get/cmd.go index 64574dc0ee..48e5f574b4 100644 --- a/cmds/ocm/commands/misccmds/credentials/get/cmd.go +++ b/cmds/ocm/commands/misccmds/credentials/get/cmd.go @@ -4,6 +4,8 @@ import ( "sort" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/listformat" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -13,8 +15,6 @@ import ( "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/credentials" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/listformat" "github.com/open-component-model/ocm/pkg/out" ) diff --git a/cmds/ocm/commands/misccmds/hash/sign/cmd.go b/cmds/ocm/commands/misccmds/hash/sign/cmd.go index eb4d9525e3..9980ed83da 100644 --- a/cmds/ocm/commands/misccmds/hash/sign/cmd.go +++ b/cmds/ocm/commands/misccmds/hash/sign/cmd.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -15,7 +16,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/signingattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" diff --git a/cmds/ocm/commands/misccmds/rsakeypair/cmd.go b/cmds/ocm/commands/misccmds/rsakeypair/cmd.go index 1921f92e48..cbbfb0f294 100644 --- a/cmds/ocm/commands/misccmds/rsakeypair/cmd.go +++ b/cmds/ocm/commands/misccmds/rsakeypair/cmd.go @@ -8,6 +8,7 @@ import ( "strings" "time" + "github.com/mandelsoft/goutils/errors" parse "github.com/mandelsoft/spiff/dynaml/x509" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/cobra" @@ -22,7 +23,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/rootcertsattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/signingattr" "github.com/open-component-model/ocm/pkg/encrypt" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" diff --git a/cmds/ocm/commands/ocicmds/artifacts/describe/cmd.go b/cmds/ocm/commands/ocicmds/artifacts/describe/cmd.go index 96149a5034..7627d4bc45 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/describe/cmd.go +++ b/cmds/ocm/commands/ocicmds/artifacts/describe/cmd.go @@ -3,6 +3,7 @@ package describe import ( "fmt" + "github.com/mandelsoft/goutils/general" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -18,7 +19,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/oci/ociutils" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/out" ) @@ -99,7 +99,7 @@ var outputs = output.NewOutputs(getRegular, output.Outputs{}).AddChainedManifest func getRegular(opts *output.Options) output.Output { return output.NewProcessingFunctionOutput(opts, processing.Chain(opts.LogContext()), - generics.Conditional(From(opts).BlobFiles, outInfoWithFiles, outInfo)) + general.Conditional(From(opts).BlobFiles, outInfoWithFiles, outInfo)) } func infoChain(options *output.Options) processing.ProcessChain { diff --git a/cmds/ocm/commands/ocicmds/artifacts/download/cmd.go b/cmds/ocm/commands/ocicmds/artifacts/download/cmd.go index 66f5f4edf0..86fcd685d5 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/download/cmd.go +++ b/cmds/ocm/commands/ocicmds/artifacts/download/cmd.go @@ -5,6 +5,8 @@ import ( "io" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/vfs/pkg/projectionfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/cobra" @@ -25,8 +27,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/artifactset" "github.com/open-component-model/ocm/pkg/contexts/ocm/download/handlers/dirtree" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/out" "github.com/open-component-model/ocm/pkg/utils/tarutils" ) diff --git a/cmds/ocm/commands/ocicmds/artifacts/transfer/cmd.go b/cmds/ocm/commands/ocicmds/artifacts/transfer/cmd.go index 90ca43d55f..8b54aed92b 100644 --- a/cmds/ocm/commands/ocicmds/artifacts/transfer/cmd.go +++ b/cmds/ocm/commands/ocicmds/artifacts/transfer/cmd.go @@ -4,6 +4,7 @@ import ( "fmt" "path" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -18,7 +19,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ctf" "github.com/open-component-model/ocm/pkg/contexts/oci/transfer" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" ) diff --git a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/attached.go b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/attached.go index bdcc759956..1479361e32 100644 --- a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/attached.go +++ b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/attached.go @@ -3,13 +3,13 @@ package artifacthdlr import ( "strings" + "github.com/mandelsoft/goutils/sliceutils" "github.com/mandelsoft/logging" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/cmds/ocm/pkg/output" "github.com/open-component-model/ocm/cmds/ocm/pkg/processing" "github.com/open-component-model/ocm/pkg/common" - "github.com/open-component-model/ocm/pkg/generics" ) func Attachment(d digest.Digest, suffix string) string { @@ -19,10 +19,8 @@ func Attachment(d digest.Digest, suffix string) string { var ExplodeAttached = processing.Explode(explodeAttached) func explodeAttached(o interface{}) []interface{} { - obj, ok := o.(*Object) - if !ok { - return nil - } + // internal function must be called correctly, otherwise early panic + obj := o.(*Object) result := []interface{}{o} blob, err := obj.Artifact.Blob() if err != nil { @@ -33,7 +31,7 @@ func explodeAttached(o interface{}) []interface{} { dig := blob.Digest() prefix := Attachment(dig, "") list, err := obj.Namespace.ListTags() - hist := generics.AppendedSlice(obj.History, common.NewNameVersion("", dig.String())) + hist := sliceutils.CopyAppend(obj.History, common.NewNameVersion("", dig.String())) if err == nil { for _, l := range list { if strings.HasPrefix(l, prefix) { diff --git a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/clean.go b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/clean.go index bd9f8f2099..77d7fa00f8 100644 --- a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/clean.go +++ b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/clean.go @@ -44,12 +44,11 @@ func clean(iterable data.Iterable) data.Iterable { output.Print(data, "clean in") for i := 0; i < len(data); i++ { - e, ok := data[i].(*Object) - if !ok { + if data[i] == nil { // ignore if we don't have an object and continue cleaning the rest - continue } + e := data[i].(*Object) // internal function is called only on *Object, if not, panic early to indicate misuse l := len(e.History) blob, _ := e.Artifact.Blob() dig := blob.Digest() diff --git a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/typehandler.go b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/typehandler.go index 451f77c746..ae611292f6 100644 --- a/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/typehandler.go +++ b/cmds/ocm/commands/ocicmds/common/handlers/artifacthdlr/typehandler.go @@ -4,7 +4,9 @@ import ( "fmt" "os" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/logging" + "github.com/open-component-model/ocm/cmds/ocm/pkg/output" "github.com/open-component-model/ocm/cmds/ocm/pkg/tree" "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" @@ -12,7 +14,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" - "github.com/open-component-model/ocm/pkg/errors" ) func Elem(e interface{}) oci.ArtifactAccess { diff --git a/cmds/ocm/commands/ocicmds/ctf/create/cmd.go b/cmds/ocm/commands/ocicmds/ctf/create/cmd.go index 6f119b6d35..32a7d18e22 100644 --- a/cmds/ocm/commands/ocicmds/ctf/create/cmd.go +++ b/cmds/ocm/commands/ocicmds/ctf/create/cmd.go @@ -1,6 +1,7 @@ package create import ( + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -13,7 +14,6 @@ import ( "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ctf" - "github.com/open-component-model/ocm/pkg/errors" ) var ( diff --git a/cmds/ocm/commands/ocicmds/tags/show/cmd.go b/cmds/ocm/commands/ocicmds/tags/show/cmd.go index ff03887ea7..11816e9b0f 100644 --- a/cmds/ocm/commands/ocicmds/tags/show/cmd.go +++ b/cmds/ocm/commands/ocicmds/tags/show/cmd.go @@ -4,6 +4,7 @@ import ( "sort" "github.com/Masterminds/semver/v3" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -14,7 +15,6 @@ import ( "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/oci" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" utils2 "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/cmds/ocm/commands/ocmcmds/common/addconfig.go b/cmds/ocm/commands/ocmcmds/common/addconfig.go index cf8c412052..8f391b31ef 100644 --- a/cmds/ocm/commands/ocmcmds/common/addconfig.go +++ b/cmds/ocm/commands/ocmcmds/common/addconfig.go @@ -4,6 +4,8 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/sliceutils" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/pflag" "sigs.k8s.io/yaml" @@ -14,10 +16,7 @@ import ( "github.com/open-component-model/ocm/cmds/ocm/pkg/options" "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/common" - "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/contexts/clictx" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" utils2 "github.com/open-component-model/ocm/pkg/utils" ) @@ -29,7 +28,7 @@ type ModifiedResourceSpecificationsFile struct { func NewModifiedResourceSpecificationsFile(data string, path string, fss ...vfs.FileSystem) addhdlrs.ElementSource { return &ModifiedResourceSpecificationsFile{ ElementFileSource: ElementFileSource{ - filesystem: accessio.FileSystem(fss...), + filesystem: utils2.FileSystem(fss...), path: addhdlrs.NewSourceInfo(path), }, modified: data, @@ -55,7 +54,7 @@ type ResourceConfigAdderCommand struct { // NewCommand creates a new ctf command. func NewResourceConfigAdderCommand(ctx clictx.Context, adder ElementSpecificationsProvider, opts ...options.Options) ResourceConfigAdderCommand { return ResourceConfigAdderCommand{ - BaseCommand: utils.NewBaseCommand(ctx, generics.AppendedSlice[options.Options](opts, templateroption.New("none"))...), + BaseCommand: utils.NewBaseCommand(ctx, sliceutils.CopyAppend[options.Options](opts, templateroption.New("none"))...), Adder: adder, } } diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/components.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/components.go index aa92ad3c4f..29f513a0d8 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/components.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/components.go @@ -1,6 +1,11 @@ package comp import ( + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/set" + "github.com/mandelsoft/goutils/sliceutils" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/addhdlrs" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs" "github.com/open-component-model/ocm/pkg/common" @@ -8,9 +13,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/out" ) @@ -19,16 +21,16 @@ func ProcessComponents(ctx clictx.Context, ictx inputs.Context, repo ocm.Reposit for _, elem := range elems { if r, ok := elem.Spec().(*ResourceSpec); ok { - list.Add(addhdlrs.ValidateElementSpecIdentities("resource", elem.Source().String(), generics.ConvertSliceTo[addhdlrs.ElementSpec](r.Resources))) - list.Add(addhdlrs.ValidateElementSpecIdentities("source", elem.Source().String(), generics.ConvertSliceTo[addhdlrs.ElementSpec](r.Sources))) - list.Add(addhdlrs.ValidateElementSpecIdentities("reference", elem.Source().String(), generics.ConvertSliceTo[addhdlrs.ElementSpec](r.References))) + list.Add(addhdlrs.ValidateElementSpecIdentities("resource", elem.Source().String(), sliceutils.Convert[addhdlrs.ElementSpec](r.Resources))) + list.Add(addhdlrs.ValidateElementSpecIdentities("source", elem.Source().String(), sliceutils.Convert[addhdlrs.ElementSpec](r.Sources))) + list.Add(addhdlrs.ValidateElementSpecIdentities("reference", elem.Source().String(), sliceutils.Convert[addhdlrs.ElementSpec](r.References))) } } if err := list.Result(); err != nil { return err } - index := generics.Set[common.NameVersion]{} + index := set.New[common.NameVersion]() for _, elem := range elems { if r, ok := elem.Spec().(*ResourceSpec); ok { index.Add(common.NewNameVersion(r.Name, r.Version)) diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/elements.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/elements.go index 9a6b1bcdcc..c1072fdae9 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/elements.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/comp/elements.go @@ -3,8 +3,9 @@ package comp import ( "fmt" - . "github.com/open-component-model/ocm/pkg/finalizer" + . "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/pflag" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" @@ -20,7 +21,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/compatattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/errkind" "github.com/open-component-model/ocm/pkg/runtime" ) @@ -81,7 +82,7 @@ func (h *ResourceSpecHandler) Add(ctx clictx.Context, ictx inputs.Context, elem } comp, err := repo.LookupComponent(r.Name) if err != nil { - return errors.ErrNotFound(errors.KIND_COMPONENT, r.Name) + return errors.ErrNotFound(errkind.KIND_COMPONENT, r.Name) } final.Close(comp) @@ -99,7 +100,7 @@ func (h *ResourceSpecHandler) Add(ctx clictx.Context, ictx inputs.Context, elem } if schema != "" { if compdesc.DefaultSchemes[schema] == nil { - return errors.ErrUnknown(errors.KIND_SCHEMAVERSION, schema) + return errors.ErrUnknown(errkind.KIND_SCHEMAVERSION, schema) } cd.Metadata.ConfiguredVersion = schema } diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/interface.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/interface.go index cbe8315404..cf4cc2ecac 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/interface.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/interface.go @@ -4,12 +4,13 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/sliceutils" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs" "github.com/open-component-model/ocm/pkg/contexts/clictx" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" ) // ResourceInput describe the source for the content of @@ -60,7 +61,7 @@ func (s *sourceInfo) Sub(indices ...interface{}) SourceInfo { } return &sourceInfo{ origin: s.origin, - indices: generics.AppendedSlice(s.indices, indices...), + indices: sliceutils.CopyAppend(s.indices, indices...), } } diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/rscs/elements.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/rscs/elements.go index ee6a7ea46c..51692fa2fe 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/rscs/elements.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/rscs/elements.go @@ -3,6 +3,7 @@ package rscs import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/pflag" "k8s.io/apimachinery/pkg/util/validation/field" @@ -15,7 +16,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" compdescv2 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/versions/v2" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go index 2b9393fad8..08ee455eb0 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go @@ -6,7 +6,9 @@ import ( "fmt" "io" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" + "github.com/open-component-model/ocm/pkg/errkind" "gopkg.in/yaml.v3" "k8s.io/apimachinery/pkg/util/validation/field" @@ -16,7 +18,6 @@ import ( "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" utils2 "github.com/open-component-model/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/utils/template" @@ -260,7 +261,7 @@ func Validate(r *ResourceInput, ctx inputs.Context, inputFilePath string) error if err != nil { if errors.IsErrUnknown(err) { //nolint: errorlint // No way I can untagle this. - err.(errors.Kinded).SetKind(errors.KIND_ACCESSMETHOD) + err.(errors.Kinded).SetKind(errkind.KIND_ACCESSMETHOD) } raw, _ := r.Access.GetRaw() allErrs = append(allErrs, field.Invalid(fldPath.Child("access"), string(raw), err.Error())) diff --git a/cmds/ocm/commands/ocmcmds/common/cmds/signing/cmd.go b/cmds/ocm/commands/ocmcmds/common/cmds/signing/cmd.go index 23f60897d8..3c215a3cdb 100644 --- a/cmds/ocm/commands/ocmcmds/common/cmds/signing/cmd.go +++ b/cmds/ocm/commands/ocmcmds/common/cmds/signing/cmd.go @@ -3,6 +3,7 @@ package signing import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" @@ -19,7 +20,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/signing" - "github.com/open-component-model/ocm/pkg/errors" ) type SignatureCommand struct { diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/closure.go b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/closure.go index 1f91984234..4560c93b84 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/closure.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/closure.go @@ -1,11 +1,12 @@ package comphdlr import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/lookupoption" "github.com/open-component-model/ocm/cmds/ocm/pkg/output" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" ) diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go index f0c5ba9512..36870c7997 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/typehandler.go @@ -6,6 +6,7 @@ import ( "sort" "github.com/Masterminds/semver/v3" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/ocm/pkg/output" "github.com/open-component-model/ocm/cmds/ocm/pkg/tree" @@ -15,7 +16,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/semverutils" ) diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/util.go b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/util.go index 89f11f6856..21932a2ac7 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/util.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr/util.go @@ -1,12 +1,13 @@ package comphdlr import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/closureoption" "github.com/open-component-model/ocm/cmds/ocm/pkg/output" "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/errors" ) func Evaluate(octx clictx.OCM, session ocm.Session, repobase ocm.Repository, compspecs []string, oopts *output.Options, opts ...Option) (Objects, error) { diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr/typehandler.go b/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr/typehandler.go index 5d53a59a3a..4ba9f91550 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr/typehandler.go @@ -3,6 +3,8 @@ package pluginhdlr import ( "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/cmds/ocm/pkg/output" "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/contexts/clictx" @@ -10,7 +12,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/plugins" - "github.com/open-component-model/ocm/pkg/errors" ) func Elem(e interface{}) plugin.Plugin { diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go index ebf79b7263..875da9e575 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go @@ -7,11 +7,11 @@ import ( "github.com/Masterminds/semver/v3" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/ocm/pkg/output" "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/semverutils" ) diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/cpi/helper.go b/cmds/ocm/commands/ocmcmds/common/inputs/cpi/helper.go index a1d86c03b5..ae596e25e3 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/cpi/helper.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/cpi/helper.go @@ -6,6 +6,7 @@ import ( "io" "os" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "k8s.io/apimachinery/pkg/util/validation/field" @@ -14,7 +15,6 @@ import ( "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/cobrautils/flagsets" "github.com/open-component-model/ocm/pkg/contexts/clictx" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/inputtype.go b/cmds/ocm/commands/ocmcmds/common/inputs/inputtype.go index dbe7a2b065..c0f9b085c9 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/inputtype.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/inputtype.go @@ -6,6 +6,7 @@ import ( "reflect" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/modern-go/reflect2" "k8s.io/apimachinery/pkg/util/validation/field" @@ -14,7 +15,6 @@ import ( "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/spec.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/spec.go index 0ab9e15e6f..58941c122b 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/spec.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti/spec.go @@ -3,7 +3,7 @@ package dockermulti import ( "fmt" - . "github.com/open-component-model/ocm/pkg/finalizer" + . "github.com/mandelsoft/goutils/finalizer" "k8s.io/apimachinery/pkg/util/validation/field" diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/file/support.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/file/support.go index 23c10ccb30..237cf40330 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/file/support.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/file/support.go @@ -6,12 +6,12 @@ import ( "fmt" "io" + "github.com/mandelsoft/goutils/errors" "k8s.io/apimachinery/pkg/util/validation/field" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs/cpi" "github.com/open-component-model/ocm/pkg/blobaccess" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/mime" ) diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/spec.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/spec.go index 848611a522..18fdcd9f8c 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/spec.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/helm/spec.go @@ -1,6 +1,7 @@ package helm import ( + "github.com/mandelsoft/goutils/errors" "k8s.io/apimachinery/pkg/util/validation/field" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs" @@ -8,7 +9,6 @@ import ( "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/blobaccess/helm" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/ociartifact" - "github.com/open-component-model/ocm/pkg/errors" ) type Spec struct { diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/spec.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/spec.go index b79f6d8a29..444b97a1c9 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/spec.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff/spec.go @@ -3,6 +3,7 @@ package spiff import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/spiff/features" "github.com/mandelsoft/spiff/spiffing" "github.com/mandelsoft/vfs/pkg/cwdfs" @@ -12,7 +13,6 @@ import ( "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs/cpi" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs/types/file" "github.com/open-component-model/ocm/pkg/blobaccess" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/utils.go b/cmds/ocm/commands/ocmcmds/common/inputs/utils.go index 973b4424ba..b1ee922cf2 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/utils.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/utils.go @@ -4,10 +4,10 @@ import ( "fmt" "os" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/contexts/clictx" - "github.com/open-component-model/ocm/pkg/errors" ) func FileInfo(ctx clictx.Context, path string, inputFilePath string) (os.FileInfo, string, error) { diff --git a/cmds/ocm/commands/ocmcmds/common/options/comppathopt/comppath_test.go b/cmds/ocm/commands/ocmcmds/common/options/comppathopt/comppath_test.go index cf823a156e..7ad6e31b51 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/comppathopt/comppath_test.go +++ b/cmds/ocm/commands/ocmcmds/common/options/comppathopt/comppath_test.go @@ -6,9 +6,10 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/comppathopt" v1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" ) func TestConfig(t *testing.T) { diff --git a/cmds/ocm/commands/ocmcmds/common/options/hashoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/hashoption/option.go index 072eb58368..f9bb38401e 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/hashoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/hashoption/option.go @@ -1,6 +1,7 @@ package hashoption import ( + "github.com/mandelsoft/goutils/errors" "github.com/spf13/pflag" "github.com/open-component-model/ocm/cmds/ocm/pkg/options" @@ -9,7 +10,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/normalizations/jsonv1" ocmsign "github.com/open-component-model/ocm/pkg/contexts/ocm/signing" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/listformat" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/hasher/sha256" diff --git a/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go b/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go index 36d8033669..ce1566e96a 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go +++ b/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go @@ -5,12 +5,12 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/pflag" "sigs.k8s.io/yaml" "github.com/open-component-model/ocm/pkg/cobrautils/flag" "github.com/open-component-model/ocm/pkg/contexts/clictx" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/cmds/ocm/commands/ocmcmds/common/options/schemaoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/schemaoption/option.go index a3a20354f8..46df9fc6ab 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/schemaoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/schemaoption/option.go @@ -1,12 +1,13 @@ package schemaoption import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/errkind" "github.com/spf13/pflag" "github.com/open-component-model/ocm/cmds/ocm/pkg/options" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/listformat" utils2 "github.com/open-component-model/ocm/pkg/utils" ) @@ -45,7 +46,7 @@ func (o *Option) Complete() error { } } if s == nil { - return errors.ErrUnknown(errors.KIND_SCHEMAVERSION, o.Schema) + return errors.ErrUnknown(errkind.KIND_SCHEMAVERSION, o.Schema) } } } diff --git a/cmds/ocm/commands/ocmcmds/common/options/scriptoption/config.go b/cmds/ocm/commands/ocmcmds/common/options/scriptoption/config.go index dab1b7fe02..b25e56c8c4 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/scriptoption/config.go +++ b/cmds/ocm/commands/ocmcmds/common/options/scriptoption/config.go @@ -3,11 +3,11 @@ package scriptoption import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common/accessio" cfgcpi "github.com/open-component-model/ocm/pkg/contexts/config/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/cmds/ocm/commands/ocmcmds/common/options/scriptoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/scriptoption/option.go index 077ea33919..a6d493e316 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/scriptoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/scriptoption/option.go @@ -1,6 +1,7 @@ package scriptoption import ( + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/pflag" @@ -9,7 +10,6 @@ import ( cfgcpi "github.com/open-component-model/ocm/pkg/contexts/config/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/spiff" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/cmds/ocm/commands/ocmcmds/common/options/signoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/signoption/option.go index 2840390e71..1bbe9d0597 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/signoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/signoption/option.go @@ -4,6 +4,7 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/pflag" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/keyoption" @@ -14,7 +15,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/normalizations/jsonv1" ocmsign "github.com/open-component-model/ocm/pkg/contexts/ocm/signing" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/listformat" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" diff --git a/cmds/ocm/commands/ocmcmds/common/resources.go b/cmds/ocm/commands/ocmcmds/common/resources.go index 45c5d60d88..d64c52e427 100644 --- a/cmds/ocm/commands/ocmcmds/common/resources.go +++ b/cmds/ocm/commands/ocmcmds/common/resources.go @@ -4,8 +4,11 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/sliceutils" _ "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs/types" + utils2 "github.com/open-component-model/ocm/pkg/utils" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/pflag" "golang.org/x/text/cases" @@ -28,8 +31,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" v1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/comparch" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/logging" "github.com/open-component-model/ocm/pkg/mime" ) @@ -99,7 +100,7 @@ type ElementFileSource struct { func NewElementFileSource(path string, fss ...vfs.FileSystem) addhdlrs.ElementSource { return &ElementFileSource{ - filesystem: accessio.FileSystem(fss...), + filesystem: utils2.FileSystem(fss...), path: addhdlrs.NewSourceInfo(path), } } @@ -136,7 +137,7 @@ type ElementMetaDataSpecificationsProvider struct { func NewElementMetaDataSpecificationsProvider(name string, adder flagsets.ConfigAdder, types ...flagsets.ConfigOptionType) *ElementMetaDataSpecificationsProvider { meta := flagsets.NewPlainConfigProvider(name, flagsets.ComposedAdder(addMeta(name), adder), - generics.AppendedSlice(types, + sliceutils.CopyAppend(types, flagsets.NewYAMLOptionType(name, fmt.Sprintf("%s meta data (yaml)", name)), flagsets.NewStringOptionType("name", fmt.Sprintf("%s name", name)), flagsets.NewStringOptionType("version", fmt.Sprintf("%s version", name)), @@ -234,7 +235,7 @@ func NewContentResourceSpecificationProvider(ctx clictx.Context, name string, ad DefaultType: deftype, ctx: ctx, ElementMetaDataSpecificationsProvider: NewElementMetaDataSpecificationsProvider(name, flagsets.ComposedAdder(addContentMeta, adder), - generics.AppendedSlice(types, + sliceutils.CopyAppend(types, flagsets.NewStringOptionType("type", fmt.Sprintf("%s type", name)), )..., ), @@ -385,7 +386,7 @@ func NewResourceAdderCommand(ctx clictx.Context, h ResourceSpecHandler, provider opts = append(opts, o) } return ResourceAdderCommand{ - BaseCommand: utils.NewBaseCommand(ctx, generics.AppendedSlice[options.Options](opts, + BaseCommand: utils.NewBaseCommand(ctx, sliceutils.CopyAppend[options.Options](opts, fileoption.NewCompArch(), dryrunoption.New(fmt.Sprintf("evaluate and print %s specifications", h.Key()), true), templateroption.New(""), diff --git a/cmds/ocm/commands/ocmcmds/common/settings.go b/cmds/ocm/commands/ocmcmds/common/settings.go index d96564edcb..01894ce9ea 100644 --- a/cmds/ocm/commands/ocmcmds/common/settings.go +++ b/cmds/ocm/commands/ocmcmds/common/settings.go @@ -3,7 +3,7 @@ package common import ( "strings" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) func ParseSettings(args []string, kinds ...string) (map[string]string, error) { diff --git a/cmds/ocm/commands/ocmcmds/common/utils.go b/cmds/ocm/commands/ocmcmds/common/utils.go index 8c237db5da..27df8f52f2 100644 --- a/cmds/ocm/commands/ocmcmds/common/utils.go +++ b/cmds/ocm/commands/ocmcmds/common/utils.go @@ -4,12 +4,13 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/cmds/ocm/pkg/options" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" utils2 "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd.go b/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd.go index 2a4464fff1..8f0c5e8ce5 100644 --- a/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd.go +++ b/cmds/ocm/commands/ocmcmds/componentarchive/create/cmd.go @@ -4,6 +4,7 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -22,7 +23,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/comparch" - "github.com/open-component-model/ocm/pkg/errors" ) var ( diff --git a/cmds/ocm/commands/ocmcmds/components/add/cmd.go b/cmds/ocm/commands/ocmcmds/components/add/cmd.go index 58a6f3f161..cce645da04 100644 --- a/cmds/ocm/commands/ocmcmds/components/add/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/add/cmd.go @@ -3,10 +3,12 @@ package add import ( "fmt" + "github.com/mandelsoft/goutils/general" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/formatoption" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/addhdlrs" @@ -29,8 +31,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" ) var ( @@ -238,7 +238,7 @@ func (o *Command) Run() error { } if err == nil { - err = comp.ProcessComponents(o.Context, ictx, repo, generics.Conditional(o.Closure, lookupoption.From(o).Resolver, nil), thdlr, h, elems) + err = comp.ProcessComponents(o.Context, ictx, repo, general.Conditional(o.Closure, lookupoption.From(o).Resolver, nil), thdlr, h, elems) cerr := repo.Close() if err == nil { err = cerr diff --git a/cmds/ocm/commands/ocmcmds/components/download/cmd.go b/cmds/ocm/commands/ocmcmds/components/download/cmd.go index 57af5f531f..76759a6bb2 100644 --- a/cmds/ocm/commands/ocmcmds/components/download/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/download/cmd.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/cobra" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/destoption" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/formatoption" ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" @@ -22,7 +23,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/comparch" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" ) diff --git a/cmds/ocm/commands/ocmcmds/components/transfer/cmd.go b/cmds/ocm/commands/ocmcmds/components/transfer/cmd.go index 3f2a77b7cc..81c577ae13 100644 --- a/cmds/ocm/commands/ocmcmds/components/transfer/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/transfer/cmd.go @@ -4,10 +4,12 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/maputils" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/closureoption" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/formatoption" ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" @@ -34,8 +36,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/spiff" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/out" ) @@ -192,7 +192,7 @@ func (a *action) Out() error { if a.cmd.BOMFile != "" { bom := BOM{} - for _, nv := range generics.KeyList(a.closure) { + for _, nv := range maputils.Keys(a.closure, common.CompareNameVersion) { bom.List = append(bom.List, BomEntry{ Component: nv.GetName(), Version: nv.GetVersion(), diff --git a/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go b/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go index 415dde9f9b..beb4daa7e7 100644 --- a/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go +++ b/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go @@ -3,6 +3,7 @@ package transfer import ( "github.com/spf13/cobra" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/closureoption" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/formatoption" ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" @@ -27,7 +28,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/spiff" - "github.com/open-component-model/ocm/pkg/errors" ) var ( diff --git a/cmds/ocm/commands/ocmcmds/plugins/get/cmd.go b/cmds/ocm/commands/ocmcmds/plugins/get/cmd.go index 1347dc1e73..b3bcf92cd8 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/get/cmd.go +++ b/cmds/ocm/commands/ocmcmds/plugins/get/cmd.go @@ -5,6 +5,7 @@ import ( "sort" "strings" + "github.com/mandelsoft/goutils/set" "github.com/spf13/cobra" handler "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr" @@ -16,7 +17,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/common" - "github.com/open-component-model/ocm/pkg/generics" utils2 "github.com/open-component-model/ocm/pkg/utils" ) @@ -150,7 +150,7 @@ func mapGetWideOutput(e interface{}) interface{} { } } - actions := generics.Set[string]{} + actions := set.New[string]() for _, a := range d.Actions { actions.Add(a.Name) } diff --git a/cmds/ocm/commands/ocmcmds/plugins/install/cmd.go b/cmds/ocm/commands/ocmcmds/plugins/install/cmd.go index 2f9ebd987f..d5b4182cdb 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/install/cmd.go +++ b/cmds/ocm/commands/ocmcmds/plugins/install/cmd.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/mandelsoft/goutils/errors" ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/repooption" @@ -18,7 +19,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugincacheattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/cache" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" ) diff --git a/cmds/ocm/commands/ocmcmds/resources/download/action.go b/cmds/ocm/commands/ocmcmds/resources/download/action.go index 7d543716bd..98f1464e4e 100644 --- a/cmds/ocm/commands/ocmcmds/resources/download/action.go +++ b/cmds/ocm/commands/ocmcmds/resources/download/action.go @@ -6,6 +6,7 @@ import ( "path" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/destoption" @@ -17,7 +18,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm" v1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/download" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" ) diff --git a/cmds/ocm/commands/ocmcmds/resources/get/cmd.go b/cmds/ocm/commands/ocmcmds/resources/get/cmd.go index 4877b52fa5..f5985d2719 100644 --- a/cmds/ocm/commands/ocmcmds/resources/get/cmd.go +++ b/cmds/ocm/commands/ocmcmds/resources/get/cmd.go @@ -1,6 +1,7 @@ package get import ( + "github.com/mandelsoft/goutils/sliceutils" "github.com/spf13/cobra" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/closureoption" @@ -18,7 +19,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/ocm" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/generics" ) var ( @@ -116,7 +116,7 @@ func getTreewide(opts *output.Options) output.Output { func mapGetRegularOutput(e interface{}) interface{} { r := common.Elem(e) - return generics.AppendedSlice(elemhdlr.MapMetaOutput(e), r.Type, string(r.Relation)) + return sliceutils.CopyAppend(elemhdlr.MapMetaOutput(e), r.Type, string(r.Relation)) } func mapGetWideOutput(e interface{}) interface{} { diff --git a/cmds/ocm/commands/ocmcmds/routingslips/add/cmd.go b/cmds/ocm/commands/ocmcmds/routingslips/add/cmd.go index 2b7c2cb1f7..a3759af129 100644 --- a/cmds/ocm/commands/ocmcmds/routingslips/add/cmd.go +++ b/cmds/ocm/commands/ocmcmds/routingslips/add/cmd.go @@ -4,6 +4,7 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -21,7 +22,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/labels/routingslip" "github.com/open-component-model/ocm/pkg/contexts/ocm/labels/routingslip/spi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" ) diff --git a/cmds/ocm/commands/ocmcmds/routingslips/common/typehandler.go b/cmds/ocm/commands/ocmcmds/routingslips/common/typehandler.go index b1051ea700..27f73da584 100644 --- a/cmds/ocm/commands/ocmcmds/routingslips/common/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/routingslips/common/typehandler.go @@ -3,13 +3,14 @@ package common import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr" "github.com/open-component-model/ocm/cmds/ocm/pkg/output" "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/labels/routingslip" - "github.com/open-component-model/ocm/pkg/errors" utils2 "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/cmds/ocm/commands/ocmcmds/routingslips/get/cmd_test.go b/cmds/ocm/commands/ocmcmds/routingslips/get/cmd_test.go index 72326b0e3e..b9f18d28d4 100644 --- a/cmds/ocm/commands/ocmcmds/routingslips/get/cmd_test.go +++ b/cmds/ocm/commands/ocmcmds/routingslips/get/cmd_test.go @@ -9,12 +9,13 @@ import ( . "github.com/open-component-model/ocm/cmds/ocm/testhelper" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/ocm/labels/routingslip" "github.com/open-component-model/ocm/pkg/contexts/ocm/labels/routingslip/types/comment" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" ) diff --git a/cmds/ocm/commands/ocmcmds/sources/get/cmd.go b/cmds/ocm/commands/ocmcmds/sources/get/cmd.go index 4b119d8ff1..b0ce07a938 100644 --- a/cmds/ocm/commands/ocmcmds/sources/get/cmd.go +++ b/cmds/ocm/commands/ocmcmds/sources/get/cmd.go @@ -1,6 +1,7 @@ package get import ( + "github.com/mandelsoft/goutils/sliceutils" "github.com/spf13/cobra" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/closureoption" @@ -18,7 +19,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/ocm" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/generics" ) var ( @@ -111,9 +111,9 @@ func getTree(opts *output.Options) output.Output { func mapGetRegularOutput(e interface{}) interface{} { r := common.Elem(e) - return generics.AppendedSlice(elemhdlr.MapMetaOutput(e), r.Type) + return sliceutils.CopyAppend(elemhdlr.MapMetaOutput(e), r.Type) } func mapGetWideOutput(e interface{}) interface{} { - return generics.AppendedSlice(mapGetRegularOutput(e).([]string), elemhdlr.MapAccessOutput(common.Elem(e).Access)...) + return sliceutils.CopyAppend(mapGetRegularOutput(e).([]string), elemhdlr.MapAccessOutput(common.Elem(e).Access)...) } diff --git a/cmds/ocm/commands/ocmcmds/versions/show/cmd.go b/cmds/ocm/commands/ocmcmds/versions/show/cmd.go index c5394ecddd..0045375c05 100644 --- a/cmds/ocm/commands/ocmcmds/versions/show/cmd.go +++ b/cmds/ocm/commands/ocmcmds/versions/show/cmd.go @@ -2,6 +2,7 @@ package show import ( "github.com/Masterminds/semver/v3" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -12,7 +13,6 @@ import ( "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" "github.com/open-component-model/ocm/pkg/semverutils" ) diff --git a/cmds/ocm/commands/toicmds/config/bootstrap/cmd.go b/cmds/ocm/commands/toicmds/config/bootstrap/cmd.go index 910f3c7c02..f5b9d6aadc 100644 --- a/cmds/ocm/commands/toicmds/config/bootstrap/cmd.go +++ b/cmds/ocm/commands/toicmds/config/bootstrap/cmd.go @@ -5,6 +5,7 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -27,7 +28,6 @@ import ( metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/download" utils2 "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/toi" diff --git a/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go b/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go index b74e9f5788..96554e0287 100644 --- a/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go +++ b/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go @@ -7,6 +7,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/mandelsoft/goutils/errors" ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/lookupoption" @@ -22,7 +23,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ocireg" "github.com/open-component-model/ocm/pkg/contexts/ocm" v1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/listformat" "github.com/open-component-model/ocm/pkg/out" "github.com/open-component-model/ocm/pkg/runtime" diff --git a/cmds/ocm/commands/toicmds/package/describe/cmd.go b/cmds/ocm/commands/toicmds/package/describe/cmd.go index aac0af3958..994570c0c7 100644 --- a/cmds/ocm/commands/toicmds/package/describe/cmd.go +++ b/cmds/ocm/commands/toicmds/package/describe/cmd.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/cobra" + "github.com/mandelsoft/goutils/errors" ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/lookupoption" @@ -23,7 +24,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/ociuploadattr" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" utils2 "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" "github.com/open-component-model/ocm/pkg/toi" "github.com/open-component-model/ocm/pkg/toi/install" diff --git a/cmds/ocm/pkg/options/interfaces.go b/cmds/ocm/pkg/options/interfaces.go index e6a12a1a59..368918510a 100644 --- a/cmds/ocm/pkg/options/interfaces.go +++ b/cmds/ocm/pkg/options/interfaces.go @@ -3,10 +3,10 @@ package options import ( "reflect" + "github.com/mandelsoft/goutils/generics" "github.com/spf13/pflag" "github.com/open-component-model/ocm/pkg/contexts/clictx" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/out" ) @@ -104,7 +104,7 @@ func FindOptions[T any](s OptionSetProvider) []T { t := generics.TypeOf[T]() for _, o := range s.AsOptionSet() { if reflect.TypeOf(o).AssignableTo(t) { - found = append(found, generics.As[T](o)) + found = append(found, generics.Cast[T](o)) } if set, ok := o.(OptionSetProvider); ok { found = append(found, FindOptions[T](set)...) diff --git a/cmds/ocm/pkg/output/attroutput.go b/cmds/ocm/pkg/output/attroutput.go index 4f55074554..356ea84a59 100644 --- a/cmds/ocm/pkg/output/attroutput.go +++ b/cmds/ocm/pkg/output/attroutput.go @@ -4,7 +4,7 @@ import ( . "github.com/open-component-model/ocm/cmds/ocm/pkg/processing" . "github.com/open-component-model/ocm/pkg/out" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) type AttrProcessingOutput struct { diff --git a/cmds/ocm/pkg/output/options.go b/cmds/ocm/pkg/output/options.go index 7b924e7fdc..3d682e422d 100644 --- a/cmds/ocm/pkg/output/options.go +++ b/cmds/ocm/pkg/output/options.go @@ -4,13 +4,13 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/logging" "github.com/spf13/pflag" "github.com/open-component-model/ocm/cmds/ocm/pkg/options" "github.com/open-component-model/ocm/cmds/ocm/pkg/processing" "github.com/open-component-model/ocm/pkg/contexts/clictx" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/listformat" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/cmds/ocm/pkg/output/output.go b/cmds/ocm/pkg/output/output.go index dc25739d14..7ee771334d 100644 --- a/cmds/ocm/pkg/output/output.go +++ b/cmds/ocm/pkg/output/output.go @@ -7,10 +7,10 @@ import ( . "github.com/open-component-model/ocm/pkg/out" + "github.com/mandelsoft/goutils/errors" "sigs.k8s.io/yaml" "github.com/open-component-model/ocm/cmds/ocm/pkg/processing" - "github.com/open-component-model/ocm/pkg/errors" ) type Object = interface{} diff --git a/cmds/ocm/pkg/output/singleelemoutput.go b/cmds/ocm/pkg/output/singleelemoutput.go index 36f847e4f8..346398f37e 100644 --- a/cmds/ocm/pkg/output/singleelemoutput.go +++ b/cmds/ocm/pkg/output/singleelemoutput.go @@ -1,7 +1,7 @@ package output import ( - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) type SingleElementOutput struct { diff --git a/cmds/ocm/pkg/output/tableoutput.go b/cmds/ocm/pkg/output/tableoutput.go index 95d1ee8e5a..10924953c4 100644 --- a/cmds/ocm/pkg/output/tableoutput.go +++ b/cmds/ocm/pkg/output/tableoutput.go @@ -5,8 +5,9 @@ import ( . "github.com/open-component-model/ocm/cmds/ocm/pkg/processing" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/cmds/ocm/pkg/data" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" "github.com/open-component-model/ocm/pkg/semverutils" "github.com/open-component-model/ocm/pkg/utils" diff --git a/cmds/ocm/pkg/utils/command.go b/cmds/ocm/pkg/utils/command.go index a6a2675ccf..aec015928b 100644 --- a/cmds/ocm/pkg/utils/command.go +++ b/cmds/ocm/pkg/utils/command.go @@ -7,10 +7,10 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/ocm/pkg/options" "github.com/open-component-model/ocm/pkg/cobrautils" "github.com/open-component-model/ocm/pkg/contexts/clictx" - "github.com/open-component-model/ocm/pkg/errors" ) // OCMCommand is a command pattern, that can be instantiated for a dediated diff --git a/cmds/ocm/pkg/utils/handling.go b/cmds/ocm/pkg/utils/handling.go index c17560006b..d0592950c1 100644 --- a/cmds/ocm/pkg/utils/handling.go +++ b/cmds/ocm/pkg/utils/handling.go @@ -5,8 +5,8 @@ import ( "os" "reflect" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/ocm/pkg/output" - "github.com/open-component-model/ocm/pkg/errors" ) type ElemSpec interface { diff --git a/examples/lib/comparison-scenario/00-consumer.go b/examples/lib/comparison-scenario/00-consumer.go index 5a781bc7a8..db4a1d547c 100644 --- a/examples/lib/comparison-scenario/00-consumer.go +++ b/examples/lib/comparison-scenario/00-consumer.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/memoryfs" "github.com/open-component-model/ocm/examples/lib/helper" @@ -16,7 +17,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" ocmutils "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils/tarutils" ) diff --git a/examples/lib/comparison-scenario/00-provider.go b/examples/lib/comparison-scenario/00-provider.go index 1217e9b43f..d9df96b2f1 100644 --- a/examples/lib/comparison-scenario/00-provider.go +++ b/examples/lib/comparison-scenario/00-provider.go @@ -3,12 +3,12 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ocireg" "github.com/open-component-model/ocm/pkg/contexts/ocm/signing" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" ) func ReadConfiguration(ctx ocm.Context, cfg *helper.Config) error { diff --git a/examples/lib/comparison-scenario/01-create.go b/examples/lib/comparison-scenario/01-create.go index 24c3babc09..5fbf4b1443 100644 --- a/examples/lib/comparison-scenario/01-create.go +++ b/examples/lib/comparison-scenario/01-create.go @@ -3,6 +3,7 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/ocm" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" @@ -12,7 +13,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/fileblob" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/composition" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/mime" ) diff --git a/examples/lib/comparison-scenario/02-sign.go b/examples/lib/comparison-scenario/02-sign.go index 0e1af17988..839c29aa97 100644 --- a/examples/lib/comparison-scenario/02-sign.go +++ b/examples/lib/comparison-scenario/02-sign.go @@ -3,11 +3,11 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/signingattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/signing" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" ) diff --git a/examples/lib/comparison-scenario/03-write.go b/examples/lib/comparison-scenario/03-write.go index a857a2323d..89330589af 100644 --- a/examples/lib/comparison-scenario/03-write.go +++ b/examples/lib/comparison-scenario/03-write.go @@ -5,13 +5,13 @@ import ( "os" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" ociidentity "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/oci/identity" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/signingattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ocireg" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" ) diff --git a/examples/lib/comparison-scenario/04-transport.go b/examples/lib/comparison-scenario/04-transport.go index 1a78fa8f53..5b799170f5 100644 --- a/examples/lib/comparison-scenario/04-transport.go +++ b/examples/lib/comparison-scenario/04-transport.go @@ -3,13 +3,13 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ocireg" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" - "github.com/open-component-model/ocm/pkg/errors" ) func Transport(cfg *helper.Config) error { diff --git a/examples/lib/comparison-scenario/05-verify.go b/examples/lib/comparison-scenario/05-verify.go index 51f6147886..9441a96bea 100644 --- a/examples/lib/comparison-scenario/05-verify.go +++ b/examples/lib/comparison-scenario/05-verify.go @@ -3,10 +3,10 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/signing" - "github.com/open-component-model/ocm/pkg/errors" ) func Verify(cfg *helper.Config) error { diff --git a/examples/lib/comparison-scenario/06-download.go b/examples/lib/comparison-scenario/06-download.go index f899fa0a12..9deea201dd 100644 --- a/examples/lib/comparison-scenario/06-download.go +++ b/examples/lib/comparison-scenario/06-download.go @@ -3,6 +3,7 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/memoryfs" "github.com/mandelsoft/vfs/pkg/vfs" @@ -10,7 +11,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/download" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/utils/tarutils" ) diff --git a/examples/lib/comparison-scenario/07-getref.go b/examples/lib/comparison-scenario/07-getref.go index d9de5d7fbf..f4980c8f96 100644 --- a/examples/lib/comparison-scenario/07-getref.go +++ b/examples/lib/comparison-scenario/07-getref.go @@ -4,11 +4,11 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/ocm" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" ) func GetRef(cfg *helper.Config) error { diff --git a/examples/lib/comparison-scenario/08-deployscript.go b/examples/lib/comparison-scenario/08-deployscript.go index 3ab42c061d..83699ab17c 100644 --- a/examples/lib/comparison-scenario/08-deployscript.go +++ b/examples/lib/comparison-scenario/08-deployscript.go @@ -3,11 +3,11 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/ocm" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" ) func GetDeployScript(cfg *helper.Config) error { diff --git a/examples/lib/comparison-scenario/09-localize.go b/examples/lib/comparison-scenario/09-localize.go index 596f03fbe5..400d1bb62b 100644 --- a/examples/lib/comparison-scenario/09-localize.go +++ b/examples/lib/comparison-scenario/09-localize.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/memoryfs" "github.com/mandelsoft/vfs/pkg/vfs" "helm.sh/helm/v3/pkg/chart" @@ -16,7 +17,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/download" ocmutils "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/localize" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/helm/loader" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" diff --git a/examples/lib/config1/example.go b/examples/lib/config1/example.go index 7c3cfc888e..8ccbd92c74 100644 --- a/examples/lib/config1/example.go +++ b/examples/lib/config1/example.go @@ -3,13 +3,13 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/credentials" ociid "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/oci/identity" ccfg "github.com/open-component-model/ocm/pkg/contexts/credentials/config" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/directcreds" "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/errors" ) func UsingConfigs() error { diff --git a/examples/lib/config2/example.go b/examples/lib/config2/example.go index 051607b797..6f71bb9fa8 100644 --- a/examples/lib/config2/example.go +++ b/examples/lib/config2/example.go @@ -4,10 +4,10 @@ import ( "fmt" "io/ioutil" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/pkg/contexts/credentials" ociid "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/oci/identity" "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/examples/lib/config3/example.go b/examples/lib/config3/example.go index 0ab06f5a5e..320d923b37 100644 --- a/examples/lib/config3/example.go +++ b/examples/lib/config3/example.go @@ -4,9 +4,9 @@ import ( "fmt" "io/ioutil" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/pkg/contexts/config" "github.com/open-component-model/ocm/pkg/contexts/config/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/examples/lib/cred1/example.go b/examples/lib/cred1/example.go index 08f6668ff4..3469dfc034 100644 --- a/examples/lib/cred1/example.go +++ b/examples/lib/cred1/example.go @@ -3,6 +3,7 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm" @@ -10,7 +11,6 @@ import ( metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ocireg" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/mime" ) diff --git a/examples/lib/cred2/example.go b/examples/lib/cred2/example.go index 73146504fd..cbe2e1af81 100644 --- a/examples/lib/cred2/example.go +++ b/examples/lib/cred2/example.go @@ -3,6 +3,7 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/credentials" @@ -13,7 +14,6 @@ import ( metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ocireg" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/mime" ) diff --git a/examples/lib/cred3/example.go b/examples/lib/cred3/example.go index eaf339a104..fc88a75427 100644 --- a/examples/lib/cred3/example.go +++ b/examples/lib/cred3/example.go @@ -3,6 +3,7 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/dockerconfig" @@ -11,7 +12,6 @@ import ( metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ocireg" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/mime" ) diff --git a/examples/lib/ctf/example.go b/examples/lib/ctf/example.go index dab2b5f3da..c00d1a6e7d 100644 --- a/examples/lib/ctf/example.go +++ b/examples/lib/ctf/example.go @@ -3,6 +3,8 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/vfs/pkg/memoryfs" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -13,8 +15,6 @@ import ( metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" ) diff --git a/examples/lib/helper/helper.go b/examples/lib/helper/helper.go index fc2d601dbf..e51ec34ec7 100644 --- a/examples/lib/helper/helper.go +++ b/examples/lib/helper/helper.go @@ -4,9 +4,9 @@ import ( "encoding/json" "io/ioutil" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/oci/identity" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/examples/lib/tour/01-getting-started/example.go b/examples/lib/tour/01-getting-started/example.go index 4eeb6941a2..767c7fc19f 100644 --- a/examples/lib/tour/01-getting-started/example.go +++ b/examples/lib/tour/01-getting-started/example.go @@ -7,6 +7,7 @@ import ( "runtime" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" @@ -14,7 +15,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/extraid" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ocireg" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/semverutils" ) diff --git a/examples/lib/tour/02-composing-a-component-version/01-basic-componentversion-creation.go b/examples/lib/tour/02-composing-a-component-version/01-basic-componentversion-creation.go index dcfea0a3d5..7284bcc274 100644 --- a/examples/lib/tour/02-composing-a-component-version/01-basic-componentversion-creation.go +++ b/examples/lib/tour/02-composing-a-component-version/01-basic-componentversion-creation.go @@ -4,6 +4,9 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm" @@ -14,8 +17,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/textblob" ctfocm "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/semverutils" ) diff --git a/examples/lib/tour/02-composing-a-component-version/02-composition-version.go b/examples/lib/tour/02-composing-a-component-version/02-composition-version.go index 0c7074fc8c..bf935462b0 100644 --- a/examples/lib/tour/02-composing-a-component-version/02-composition-version.go +++ b/examples/lib/tour/02-composing-a-component-version/02-composition-version.go @@ -3,9 +3,9 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/composition" - "github.com/open-component-model/ocm/pkg/errors" ) func ComposingAComponentVersionB() error { diff --git a/examples/lib/tour/03-working-with-credentials/01-using-credentials.go b/examples/lib/tour/03-working-with-credentials/01-using-credentials.go index ae41377529..0539fddda9 100644 --- a/examples/lib/tour/03-working-with-credentials/01-using-credentials.go +++ b/examples/lib/tour/03-working-with-credentials/01-using-credentials.go @@ -1,11 +1,11 @@ package main import ( + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" ociidentity "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/oci/identity" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ocireg" - "github.com/open-component-model/ocm/pkg/errors" ) func UsingCredentialsA(cfg *helper.Config) error { diff --git a/examples/lib/tour/03-working-with-credentials/02-basic-credential-management.go b/examples/lib/tour/03-working-with-credentials/02-basic-credential-management.go index e19d3066c8..f3b6c01e7b 100644 --- a/examples/lib/tour/03-working-with-credentials/02-basic-credential-management.go +++ b/examples/lib/tour/03-working-with-credentials/02-basic-credential-management.go @@ -5,13 +5,13 @@ import ( "io" "os" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/credentials" ociidentity "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/oci/identity" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ocireg" - "github.com/open-component-model/ocm/pkg/errors" ) func UsingCredentialsB(cfg *helper.Config, create bool) error { diff --git a/examples/lib/tour/03-working-with-credentials/03-credential-repositories.go b/examples/lib/tour/03-working-with-credentials/03-credential-repositories.go index 0ef2dfae79..d6e3271ceb 100644 --- a/examples/lib/tour/03-working-with-credentials/03-credential-repositories.go +++ b/examples/lib/tour/03-working-with-credentials/03-credential-repositories.go @@ -3,13 +3,13 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/credentials" ociidentity "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/oci/identity" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/dockerconfig" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/errors" ) func UsingCredentialsRepositories(cfg *helper.Config) error { diff --git a/examples/lib/tour/03-working-with-credentials/common.go b/examples/lib/tour/03-working-with-credentials/common.go index 2af4692145..27aa3149db 100644 --- a/examples/lib/tour/03-working-with-credentials/common.go +++ b/examples/lib/tour/03-working-with-credentials/common.go @@ -4,6 +4,9 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials" @@ -14,8 +17,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/dockermultiblob" "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/textblob" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/semverutils" ) diff --git a/examples/lib/tour/04-working-with-config/01-basic-config-management.go b/examples/lib/tour/04-working-with-config/01-basic-config-management.go index 2c122c225b..129afe2997 100644 --- a/examples/lib/tour/04-working-with-config/01-basic-config-management.go +++ b/examples/lib/tour/04-working-with-config/01-basic-config-management.go @@ -6,13 +6,13 @@ import ( "github.com/go-test/deep" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/config" "github.com/open-component-model/ocm/pkg/contexts/credentials" credcfg "github.com/open-component-model/ocm/pkg/contexts/credentials/config" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/directcreds" "github.com/open-component-model/ocm/pkg/contexts/oci" - "github.com/open-component-model/ocm/pkg/errors" ) func BasicConfigurationHandling(cfg *helper.Config) error { diff --git a/examples/lib/tour/04-working-with-config/02-handle-arbitrary-config.go b/examples/lib/tour/04-working-with-config/02-handle-arbitrary-config.go index 84e176a1c5..306c3122c9 100644 --- a/examples/lib/tour/04-working-with-config/02-handle-arbitrary-config.go +++ b/examples/lib/tour/04-working-with-config/02-handle-arbitrary-config.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/config" configcfg "github.com/open-component-model/ocm/pkg/contexts/config/config" @@ -11,7 +12,6 @@ import ( credcfg "github.com/open-component-model/ocm/pkg/contexts/credentials/config" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/directcreds" "github.com/open-component-model/ocm/pkg/contexts/oci" - "github.com/open-component-model/ocm/pkg/errors" ) func credConfig(cfg *helper.Config) (config.Config, error) { diff --git a/examples/lib/tour/04-working-with-config/03-using-ocm-config.go b/examples/lib/tour/04-working-with-config/03-using-ocm-config.go index 82dc1c8314..a4ee8e8fb6 100644 --- a/examples/lib/tour/04-working-with-config/03-using-ocm-config.go +++ b/examples/lib/tour/04-working-with-config/03-using-ocm-config.go @@ -3,6 +3,7 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "sigs.k8s.io/yaml" "github.com/open-component-model/ocm/examples/lib/helper" @@ -13,7 +14,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" ) func HandleOCMConfig(cfg *helper.Config) error { diff --git a/examples/lib/tour/04-working-with-config/04-write-config-type.go b/examples/lib/tour/04-working-with-config/04-write-config-type.go index a74a356976..24c439cc55 100644 --- a/examples/lib/tour/04-working-with-config/04-write-config-type.go +++ b/examples/lib/tour/04-working-with-config/04-write-config-type.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/errors" "sigs.k8s.io/yaml" "github.com/open-component-model/ocm/examples/lib/helper" @@ -13,7 +14,6 @@ import ( ociidentity "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/oci/identity" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/examples/lib/tour/04-working-with-config/05-write-config-consumer.go b/examples/lib/tour/04-working-with-config/05-write-config-consumer.go index 2848c9c704..67ca452ff1 100644 --- a/examples/lib/tour/04-working-with-config/05-write-config-consumer.go +++ b/examples/lib/tour/04-working-with-config/05-write-config-consumer.go @@ -4,12 +4,12 @@ import ( "fmt" "sync" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/config/cpi" "github.com/open-component-model/ocm/pkg/contexts/credentials" ociidentity "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/oci/identity" "github.com/open-component-model/ocm/pkg/contexts/oci" - "github.com/open-component-model/ocm/pkg/errors" ) // we already have our new acme.org config object type, diff --git a/examples/lib/tour/05-transporting-component-versions/common.go b/examples/lib/tour/05-transporting-component-versions/common.go index 24ca1178ea..e170b62eec 100644 --- a/examples/lib/tour/05-transporting-component-versions/common.go +++ b/examples/lib/tour/05-transporting-component-versions/common.go @@ -4,6 +4,9 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm" @@ -13,8 +16,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/dockermultiblob" "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/textblob" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/semverutils" ) diff --git a/examples/lib/tour/05-transporting-component-versions/example.go b/examples/lib/tour/05-transporting-component-versions/example.go index d6dec77222..2c1540b289 100644 --- a/examples/lib/tour/05-transporting-component-versions/example.go +++ b/examples/lib/tour/05-transporting-component-versions/example.go @@ -3,6 +3,7 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" ociidentity "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/oci/identity" "github.com/open-component-model/ocm/pkg/contexts/oci" @@ -11,7 +12,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" ) // --- begin read config --- diff --git a/examples/lib/tour/06-signing-component-versions/01-basic-signing.go b/examples/lib/tour/06-signing-component-versions/01-basic-signing.go index 9240b199b6..0d40a7013c 100644 --- a/examples/lib/tour/06-signing-component-versions/01-basic-signing.go +++ b/examples/lib/tour/06-signing-component-versions/01-basic-signing.go @@ -3,11 +3,11 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/composition" "github.com/open-component-model/ocm/pkg/contexts/ocm/signing" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" ) diff --git a/examples/lib/tour/06-signing-component-versions/02-using-context-settings.go b/examples/lib/tour/06-signing-component-versions/02-using-context-settings.go index b1c6e0c020..64b34cc251 100644 --- a/examples/lib/tour/06-signing-component-versions/02-using-context-settings.go +++ b/examples/lib/tour/06-signing-component-versions/02-using-context-settings.go @@ -3,13 +3,13 @@ package main import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" configcfg "github.com/open-component-model/ocm/pkg/contexts/config/config" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/signingattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/composition" "github.com/open-component-model/ocm/pkg/contexts/ocm/signing" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" "github.com/open-component-model/ocm/pkg/signing/signutils" diff --git a/examples/lib/tour/06-signing-component-versions/common.go b/examples/lib/tour/06-signing-component-versions/common.go index 75377f8ae4..094ae6c094 100644 --- a/examples/lib/tour/06-signing-component-versions/common.go +++ b/examples/lib/tour/06-signing-component-versions/common.go @@ -6,6 +6,9 @@ import ( "os" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" @@ -18,8 +21,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/textblob" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/semverutils" "github.com/open-component-model/ocm/pkg/signing/signutils" diff --git a/examples/lib/transfer1/example.go b/examples/lib/transfer1/example.go index bd7e7fd1fd..ff534fc62b 100644 --- a/examples/lib/transfer1/example.go +++ b/examples/lib/transfer1/example.go @@ -5,9 +5,11 @@ import ( "os" // "github.com/mandelsoft/vfs/pkg/memoryfs" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/examples/lib/helper" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" @@ -21,8 +23,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" ) diff --git a/go.mod b/go.mod index 143f82506a..7f7515bba9 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,6 @@ module github.com/open-component-model/ocm -go 1.22.0 - -toolchain go1.22.2 +go 1.22.1 replace github.com/spf13/cobra => github.com/open-component-model/cobra v0.0.0-20230329075350-b1fd876abfb9 @@ -40,7 +38,7 @@ require ( github.com/klauspost/compress v1.17.8 github.com/klauspost/pgzip v1.2.6 github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3 - github.com/mandelsoft/goutils v0.0.0-20240422120338-5e35748a0391 + github.com/mandelsoft/goutils v0.0.0-20240510154642-0f1a031c54cb github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf github.com/mandelsoft/spiff v1.7.0-beta-5 github.com/mandelsoft/vfs v0.4.3 @@ -214,6 +212,7 @@ require ( github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.1 // indirect github.com/gosuri/uitable v0.0.4 // indirect + github.com/gowebpki/jcs v1.0.1 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect diff --git a/go.sum b/go.sum index 09e32053a4..decd37aade 100644 --- a/go.sum +++ b/go.sum @@ -557,6 +557,8 @@ github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/ github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= +github.com/gowebpki/jcs v1.0.1 h1:Qjzg8EOkrOTuWP7DqQ1FbYtcpEbeTzUoTN9bptp8FOU= +github.com/gowebpki/jcs v1.0.1/go.mod h1:CID1cNZ+sHp1CCpAR8mPf6QRtagFBgPJE0FCUQ6+BrI= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= @@ -680,8 +682,8 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3 h1:oo9nIgnyiBgYPbcZslRT4y29siuL5EoNJ/t1tr0xEVQ= github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3/go.mod h1:LxhqC7khDoRENwooP6f/vWvia9ivj6TqLYrR39zqkN0= -github.com/mandelsoft/goutils v0.0.0-20240422120338-5e35748a0391 h1:6etBMMPXMD4ti9OJbyNyH45qm6NvnzIOoGzZnkIRiD4= -github.com/mandelsoft/goutils v0.0.0-20240422120338-5e35748a0391/go.mod h1:EbNqk9JceSMq7MJuALB/vlOpoD4MAGE0TenM9TR+C0o= +github.com/mandelsoft/goutils v0.0.0-20240510154642-0f1a031c54cb h1:1d3Xxk4rkdKcIFP1AcRlPxUhcBhnFCTqrMhXztB1r5E= +github.com/mandelsoft/goutils v0.0.0-20240510154642-0f1a031c54cb/go.mod h1:EbNqk9JceSMq7MJuALB/vlOpoD4MAGE0TenM9TR+C0o= github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf h1:WEmgzeArDbp6Aw34jmziMIE5ygo2zpl/atXRq3D7lSw= github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf/go.mod h1:uO460C1lIB3IOOgrbXhAlz3AKsOv4T2K6ALBn3PwuSg= github.com/mandelsoft/spiff v1.7.0-beta-5 h1:3kC10nTviDQhL8diSxp7i4IC2iSiDg6KPbH1CAq7Lfw= diff --git a/pkg/blobaccess/compress.go b/pkg/blobaccess/compress.go index 2bc9ff6591..f8c5c67b07 100644 --- a/pkg/blobaccess/compress.go +++ b/pkg/blobaccess/compress.go @@ -6,11 +6,11 @@ import ( "io" "sync" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess/bpi" compression2 "github.com/open-component-model/ocm/pkg/common/compression" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/mime" ) diff --git a/pkg/blobaccess/dataaccess.go b/pkg/blobaccess/dataaccess.go index 3635723f51..89811f16f9 100644 --- a/pkg/blobaccess/dataaccess.go +++ b/pkg/blobaccess/dataaccess.go @@ -5,9 +5,9 @@ import ( "io" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/iotools" ) diff --git a/pkg/blobaccess/dirtree/access.go b/pkg/blobaccess/dirtree/access.go index 7bc7922df4..460225f61f 100644 --- a/pkg/blobaccess/dirtree/access.go +++ b/pkg/blobaccess/dirtree/access.go @@ -4,11 +4,11 @@ import ( "compress/gzip" "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/blobaccess/bpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/utils" diff --git a/pkg/blobaccess/dockermulti/access.go b/pkg/blobaccess/dockermulti/access.go index 4e09b7b7cb..59a6f8e798 100644 --- a/pkg/blobaccess/dockermulti/access.go +++ b/pkg/blobaccess/dockermulti/access.go @@ -3,8 +3,9 @@ package dockermulti import ( "fmt" - . "github.com/open-component-model/ocm/pkg/finalizer" + . "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -15,7 +16,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/artifactset" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/docker" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/optionutils" ) diff --git a/pkg/blobaccess/helm/resource.go b/pkg/blobaccess/helm/resource.go index 4f00a31a39..16452dd3cb 100644 --- a/pkg/blobaccess/helm/resource.go +++ b/pkg/blobaccess/helm/resource.go @@ -3,6 +3,7 @@ package helm import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -11,7 +12,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/helm/identity" "github.com/open-component-model/ocm/pkg/contexts/oci" ocihelm "github.com/open-component-model/ocm/pkg/contexts/oci/ociutils/helm" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/helm" "github.com/open-component-model/ocm/pkg/helm/loader" "github.com/open-component-model/ocm/pkg/optionutils" diff --git a/pkg/blobaccess/standard.go b/pkg/blobaccess/standard.go index 1283933458..ea8379cdf6 100644 --- a/pkg/blobaccess/standard.go +++ b/pkg/blobaccess/standard.go @@ -4,14 +4,14 @@ import ( "io" "sync" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess/bpi" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/refmgmt" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" "github.com/open-component-model/ocm/pkg/utils" ) @@ -218,7 +218,7 @@ type AnnotatedBlobAccess[T DataAccess] interface { type annotatedBlobAccessView[T DataAccess] struct { _blobAccess - id finalizer.ObjectIdentity + id runtimefinalizer.ObjectIdentity annotation T } @@ -232,7 +232,7 @@ func (a *annotatedBlobAccessView[T]) Dup() (BlobAccess, error) { return nil, err } return &annotatedBlobAccessView[T]{ - id: finalizer.NewObjectIdentity(a.id.String()), + id: runtimefinalizer.NewObjectIdentity(a.id.String()), _blobAccess: b, annotation: a.annotation, }, nil @@ -250,7 +250,7 @@ func ForDataAccess[T DataAccess](digest digest.Digest, size int64, mimeType stri a := bpi.BaseAccessForDataAccessAndMeta(mimeType, access, digest, size) return &annotatedBlobAccessView[T]{ - id: finalizer.NewObjectIdentity("annotatedBlobAccess"), + id: runtimefinalizer.NewObjectIdentity("annotatedBlobAccess"), _blobAccess: bpi.NewBlobAccessForBase(a), annotation: access, } diff --git a/pkg/blobaccess/utils.go b/pkg/blobaccess/utils.go index 7ce1c0ec66..69822b7a98 100644 --- a/pkg/blobaccess/utils.go +++ b/pkg/blobaccess/utils.go @@ -5,10 +5,10 @@ import ( "io" "sync" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/blobaccess/bpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/iotools" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/blobaccess/wget/access.go b/pkg/blobaccess/wget/access.go index d02c45c0ac..d2611910c3 100644 --- a/pkg/blobaccess/wget/access.go +++ b/pkg/blobaccess/wget/access.go @@ -8,12 +8,13 @@ import ( "mime" "net/http" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/blobaccess/bpi" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/wget/identity" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" ocmmime "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/mimeutils" "github.com/open-component-model/ocm/pkg/optionutils" diff --git a/pkg/clisupport/labels.go b/pkg/clisupport/labels.go index 082be2e83c..574bbd1e9c 100644 --- a/pkg/clisupport/labels.go +++ b/pkg/clisupport/labels.go @@ -4,12 +4,12 @@ import ( "encoding/json" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "sigs.k8s.io/yaml" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/cobrautils/flag/string_colon_stringslice.go b/pkg/cobrautils/flag/string_colon_stringslice.go index 1f7c67b6e1..568429b5e3 100644 --- a/pkg/cobrautils/flag/string_colon_stringslice.go +++ b/pkg/cobrautils/flag/string_colon_stringslice.go @@ -5,9 +5,8 @@ import ( "encoding/csv" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/pflag" - - "github.com/open-component-model/ocm/pkg/errors" ) type stringColonStringSliceValue[T ~map[string][]string] struct { diff --git a/pkg/cobrautils/flag/yaml.go b/pkg/cobrautils/flag/yaml.go index b15c95db3a..c936a04905 100644 --- a/pkg/cobrautils/flag/yaml.go +++ b/pkg/cobrautils/flag/yaml.go @@ -4,10 +4,9 @@ import ( "encoding/json" "reflect" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/pflag" "sigs.k8s.io/yaml" - - "github.com/open-component-model/ocm/pkg/errors" ) type YAMLValue[T any] struct { diff --git a/pkg/cobrautils/flagsets/configoptionset.go b/pkg/cobrautils/flagsets/configoptionset.go index fd0bc59a15..fe8c078318 100644 --- a/pkg/cobrautils/flagsets/configoptionset.go +++ b/pkg/cobrautils/flagsets/configoptionset.go @@ -4,7 +4,8 @@ import ( "fmt" "sync" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/cobrautils/flagsets/provider.go b/pkg/cobrautils/flagsets/provider.go index 959706d802..2f96f5cced 100644 --- a/pkg/cobrautils/flagsets/provider.go +++ b/pkg/cobrautils/flagsets/provider.go @@ -4,7 +4,8 @@ import ( "fmt" "strings" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/cobrautils/flagsets/utils.go b/pkg/cobrautils/flagsets/utils.go index 74031c7ed4..f371383c14 100644 --- a/pkg/cobrautils/flagsets/utils.go +++ b/pkg/cobrautils/flagsets/utils.go @@ -4,9 +4,8 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/pflag" - - "github.com/open-component-model/ocm/pkg/errors" ) func OptionString(option ConfigOptionType) string { diff --git a/pkg/cobrautils/logopts/options.go b/pkg/cobrautils/logopts/options.go index ea39f8beb8..c848194fcf 100644 --- a/pkg/cobrautils/logopts/options.go +++ b/pkg/cobrautils/logopts/options.go @@ -3,6 +3,7 @@ package logopts import ( "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/logging" "github.com/mandelsoft/logging/config" "github.com/mandelsoft/logging/logrusr" @@ -13,7 +14,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/logforward" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/common/accessio/access.go b/pkg/common/accessio/access.go index bd181bc771..9b9aeaf619 100644 --- a/pkg/common/accessio/access.go +++ b/pkg/common/accessio/access.go @@ -5,11 +5,11 @@ import ( "math/rand" "time" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/iotools" "github.com/open-component-model/ocm/pkg/refmgmt" ) diff --git a/pkg/common/accessio/cache.go b/pkg/common/accessio/cache.go index f6f6552363..720d4135df 100644 --- a/pkg/common/accessio/cache.go +++ b/pkg/common/accessio/cache.go @@ -8,6 +8,7 @@ import ( "sync" "time" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/projectionfs" "github.com/mandelsoft/vfs/pkg/vfs" @@ -16,7 +17,6 @@ import ( "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/iotools" "github.com/open-component-model/ocm/pkg/refmgmt" ) diff --git a/pkg/common/accessio/format.go b/pkg/common/accessio/format.go index 850a568663..9ef0d43f37 100644 --- a/pkg/common/accessio/format.go +++ b/pkg/common/accessio/format.go @@ -7,10 +7,10 @@ import ( "sort" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common/compression" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils/tarutils" ) diff --git a/pkg/common/accessio/ondemandreader.go b/pkg/common/accessio/ondemandreader.go index 3d65826ba4..2c0a2287a9 100644 --- a/pkg/common/accessio/ondemandreader.go +++ b/pkg/common/accessio/ondemandreader.go @@ -4,7 +4,7 @@ import ( "io" "sync" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) type ReaderProvider interface { diff --git a/pkg/common/accessio/opts.go b/pkg/common/accessio/opts.go index 40b3a32e9a..c5d625bfed 100644 --- a/pkg/common/accessio/opts.go +++ b/pkg/common/accessio/opts.go @@ -3,11 +3,11 @@ package accessio import ( "io" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common/compression" - "github.com/open-component-model/ocm/pkg/errors" ) type Options interface { diff --git a/pkg/common/accessio/resettablereader.go b/pkg/common/accessio/resettablereader.go index 2f2d601174..d6e14fd8ea 100644 --- a/pkg/common/accessio/resettablereader.go +++ b/pkg/common/accessio/resettablereader.go @@ -6,9 +6,8 @@ import ( "os" "sync" + "github.com/mandelsoft/goutils/errors" "github.com/sirupsen/logrus" - - "github.com/open-component-model/ocm/pkg/errors" ) type ResettableReader struct { diff --git a/pkg/common/accessio/retry_test.go b/pkg/common/accessio/retry_test.go index d643d54b2d..73d764ff19 100644 --- a/pkg/common/accessio/retry_test.go +++ b/pkg/common/accessio/retry_test.go @@ -8,8 +8,8 @@ import ( . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/pkg/common/accessio" - "github.com/open-component-model/ocm/pkg/errors" ) var Retry = accessio.Retry diff --git a/pkg/common/accessio/utils.go b/pkg/common/accessio/utils.go index cb68e85fe6..954de1125e 100644 --- a/pkg/common/accessio/utils.go +++ b/pkg/common/accessio/utils.go @@ -4,12 +4,12 @@ import ( "fmt" "io" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/sliceutils" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/compression" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/iotools" "github.com/open-component-model/ocm/pkg/utils" ) @@ -40,7 +40,7 @@ func NopWriteCloser(w io.Writer) io.WriteCloser { // Deprecated: use iotools.BlobData. func AddCloser(reader io.ReadCloser, closer io.Closer, msg ...string) io.ReadCloser { - return iotools.AddReaderCloser(reader, closer, generics.ConvertSliceTo[any](msg)...) + return iotools.AddReaderCloser(reader, closer, sliceutils.AsAny(msg)...) } //////////////////////////////////////////////////////////////////////////////// diff --git a/pkg/common/accessio/wrapper.go b/pkg/common/accessio/wrapper.go index acbd942cb7..7d477f46b2 100644 --- a/pkg/common/accessio/wrapper.go +++ b/pkg/common/accessio/wrapper.go @@ -3,10 +3,10 @@ package accessio import ( "io" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/iotools" ) diff --git a/pkg/common/accessobj/accessobject.go b/pkg/common/accessobj/accessobject.go index 45f201c1cd..0a1380b9ca 100644 --- a/pkg/common/accessobj/accessobject.go +++ b/pkg/common/accessobj/accessobject.go @@ -4,10 +4,10 @@ import ( "fmt" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common/accessio" - "github.com/open-component-model/ocm/pkg/errors" ) type DescriptorHandlerFactory func(fs vfs.FileSystem) StateHandler diff --git a/pkg/common/accessobj/accessstate.go b/pkg/common/accessobj/accessstate.go index e9b21decae..871d54de4f 100644 --- a/pkg/common/accessobj/accessstate.go +++ b/pkg/common/accessobj/accessstate.go @@ -4,13 +4,13 @@ import ( "fmt" "sync" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/modern-go/reflect2" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessio" - "github.com/open-component-model/ocm/pkg/errors" ) // These objects deal with descriptor based state descriptions diff --git a/pkg/common/accessobj/check.go b/pkg/common/accessobj/check.go index a4dfd31086..0bd554aa23 100644 --- a/pkg/common/accessobj/check.go +++ b/pkg/common/accessobj/check.go @@ -5,10 +5,10 @@ import ( "io" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common/compression" - "github.com/open-component-model/ocm/pkg/errors" ) func mapErr(forced bool, err error) (bool, bool, error) { diff --git a/pkg/common/accessobj/format-directory.go b/pkg/common/accessobj/format-directory.go index 9a5414a79f..dd99c25a3e 100644 --- a/pkg/common/accessobj/format-directory.go +++ b/pkg/common/accessobj/format-directory.go @@ -5,11 +5,11 @@ import ( "io" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/projectionfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common/accessio" - "github.com/open-component-model/ocm/pkg/errors" ) var FormatDirectory = DirectoryHandler{} diff --git a/pkg/common/accessobj/format-tar.go b/pkg/common/accessobj/format-tar.go index e2d28f7ba0..d57302833b 100644 --- a/pkg/common/accessobj/format-tar.go +++ b/pkg/common/accessobj/format-tar.go @@ -6,11 +6,11 @@ import ( "io" "os" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/compression" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils/tarutils" ) diff --git a/pkg/common/accessobj/format.go b/pkg/common/accessobj/format.go index 23e061b2ab..bb9055c8a8 100644 --- a/pkg/common/accessobj/format.go +++ b/pkg/common/accessobj/format.go @@ -6,10 +6,10 @@ import ( "sync" "time" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common/accessio" - "github.com/open-component-model/ocm/pkg/errors" ) const KIND_FILEFORMAT = accessio.KIND_FILEFORMAT diff --git a/pkg/common/accessobj/utils.go b/pkg/common/accessobj/utils.go index c9a8bc98c5..308c46c0c0 100644 --- a/pkg/common/accessobj/utils.go +++ b/pkg/common/accessobj/utils.go @@ -1,11 +1,11 @@ package accessobj import ( + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common/accessio" - "github.com/open-component-model/ocm/pkg/errors" ) type FilesystemSetup func(fs vfs.FileSystem, mode vfs.FileMode) error diff --git a/pkg/common/history.go b/pkg/common/history.go index 2f2c30f92a..c79ef438af 100644 --- a/pkg/common/history.go +++ b/pkg/common/history.go @@ -5,10 +5,9 @@ import ( "reflect" "sort" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/sliceutils" "golang.org/x/exp/slices" - - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" ) //////////////////////////////////////////////////////////////////////////////// @@ -79,7 +78,7 @@ func (h *History) Add(kind string, nv NameVersion) error { // Append provides a new extended history without cycle check. func (h History) Append(nv ...NameVersion) History { - return generics.AppendedSlice(h, nv...) + return sliceutils.CopyAppend(h, nv...) } func (h History) Copy() History { diff --git a/pkg/common/properties.go b/pkg/common/properties.go index 53981a76fe..06ab19694d 100644 --- a/pkg/common/properties.go +++ b/pkg/common/properties.go @@ -4,7 +4,7 @@ import ( "encoding/json" "fmt" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/mandelsoft/goutils/set" ) // Properties describes a set of name/value pairs. @@ -50,8 +50,8 @@ func (p Properties) Match(obj map[string]string) (bool, error) { } // Names returns the set of property names. -func (c Properties) Names() generics.Set[string] { - return generics.KeySet(c) +func (c Properties) Names() set.Set[string] { + return set.KeySet(c) } // String returns a string representation. diff --git a/pkg/common/types.go b/pkg/common/types.go index bc7977bfa9..170a65f7ed 100644 --- a/pkg/common/types.go +++ b/pkg/common/types.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/semverutils" ) @@ -75,3 +76,11 @@ func ParseNameVersion(s string) (NameVersion, error) { } return NewNameVersion(strings.TrimSpace(a[0]), strings.TrimSpace(a[1])), nil } + +func CompareNameVersion(a, b NameVersion) int { + d := strings.Compare(a.name, b.name) + if d == 0 { + d = strings.Compare(a.version, b.version) + } + return d +} diff --git a/pkg/contexts/clictx/internal/context.go b/pkg/contexts/clictx/internal/context.go index 23541b925e..f0230b7a0f 100644 --- a/pkg/contexts/clictx/internal/context.go +++ b/pkg/contexts/clictx/internal/context.go @@ -5,6 +5,8 @@ import ( "io" "reflect" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common/accessio" @@ -18,9 +20,7 @@ import ( ctfoci "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ctf" "github.com/open-component-model/ocm/pkg/contexts/ocm" ctfocm "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" - "github.com/open-component-model/ocm/pkg/utils" ) const CONTEXT_TYPE = "ocm.cmd" + datacontext.OCM_CONTEXT_SUFFIX @@ -120,7 +120,7 @@ type gcWrapper struct { } func newView(c *_context, ref ...bool) Context { - if utils.Optional(ref...) { + if general.Optional(ref...) { return datacontext.FinalizedContext[gcWrapper](c) } return c diff --git a/pkg/contexts/config/config/context_test.go b/pkg/contexts/config/config/context_test.go index c11385f6a5..61dee16573 100644 --- a/pkg/contexts/config/config/context_test.go +++ b/pkg/contexts/config/config/context_test.go @@ -10,12 +10,12 @@ import ( . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/general" "sigs.k8s.io/yaml" "github.com/open-component-model/ocm/pkg/contexts/config" local "github.com/open-component-model/ocm/pkg/contexts/config/config" "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/generics" ) func CheckRefs(ctx config.Context, n int) { @@ -174,7 +174,7 @@ var _ = Describe("generic config handling", func() { Expect(target.used).NotTo(BeNil()) Expect(target.used.GetId()).To(Equal(cfgctx.GetId())) - CheckRefs(cfgctx, generics.Conditional(datacontext.MULTI_REF, 2, 1)) // config context stored in target with separate ref + CheckRefs(cfgctx, general.Conditional(datacontext.MULTI_REF, 2, 1)) // config context stored in target with separate ref target.used.GetId() }) }) diff --git a/pkg/contexts/config/config/type.go b/pkg/contexts/config/config/type.go index ca289687dd..c5451db452 100644 --- a/pkg/contexts/config/config/type.go +++ b/pkg/contexts/config/config/type.go @@ -3,8 +3,9 @@ package config import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/config/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/config/context_test.go b/pkg/contexts/config/context_test.go index 0fbe8e662d..7bc1de1ec1 100644 --- a/pkg/contexts/config/context_test.go +++ b/pkg/contexts/config/context_test.go @@ -7,9 +7,10 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/config" "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/errors" ) var _ = Describe("config handling", func() { diff --git a/pkg/contexts/config/cpi/content.go b/pkg/contexts/config/cpi/content.go index 7bf827dbcc..c0ad9b6cad 100644 --- a/pkg/contexts/config/cpi/content.go +++ b/pkg/contexts/config/cpi/content.go @@ -4,11 +4,11 @@ import ( "encoding/base64" "encoding/json" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/blobaccess" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/config/gc_test.go b/pkg/contexts/config/gc_test.go index 4cd30b2496..79e38c2974 100644 --- a/pkg/contexts/config/gc_test.go +++ b/pkg/contexts/config/gc_test.go @@ -6,16 +6,16 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" me "github.com/open-component-model/ocm/pkg/contexts/config" - "github.com/open-component-model/ocm/pkg/finalizer" ) var _ = Describe("area test", func() { It("can be garbage collected", func() { ctx := me.New() - r := finalizer.GetRuntimeFinalizationRecorder(ctx) + r := runtimefinalizer.GetRuntimeFinalizationRecorder(ctx) Expect(r).NotTo(BeNil()) runtime.GC() diff --git a/pkg/contexts/config/internal/config.go b/pkg/contexts/config/internal/config.go index 97914a3176..0b8923ec8d 100644 --- a/pkg/contexts/config/internal/config.go +++ b/pkg/contexts/config/internal/config.go @@ -3,7 +3,8 @@ package internal import ( "fmt" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/config/internal/configtypes.go b/pkg/contexts/config/internal/configtypes.go index 7b5c920b53..14422d3128 100644 --- a/pkg/contexts/config/internal/configtypes.go +++ b/pkg/contexts/config/internal/configtypes.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/modern-go/reflect2" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/config/internal/context.go b/pkg/contexts/config/internal/context.go index 45f633799e..b34f223221 100644 --- a/pkg/contexts/config/internal/context.go +++ b/pkg/contexts/config/internal/context.go @@ -4,9 +4,10 @@ import ( "context" "reflect" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/config/internal/errors.go b/pkg/contexts/config/internal/errors.go index aff9fcaca5..6321e3cf48 100644 --- a/pkg/contexts/config/internal/errors.go +++ b/pkg/contexts/config/internal/errors.go @@ -3,7 +3,7 @@ package internal import ( "fmt" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) const KIND_CONFIGTYPE = "config type" diff --git a/pkg/contexts/credentials/config/type.go b/pkg/contexts/credentials/config/type.go index 529a27ffd4..9f3fe9ca33 100644 --- a/pkg/contexts/credentials/config/type.go +++ b/pkg/contexts/credentials/config/type.go @@ -3,9 +3,10 @@ package config import ( "fmt" + "github.com/mandelsoft/goutils/errors" + cfgcpi "github.com/open-component-model/ocm/pkg/contexts/config/cpi" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/credentials/gc_test.go b/pkg/contexts/credentials/gc_test.go index feb41777bf..648e9a9e9c 100644 --- a/pkg/contexts/credentials/gc_test.go +++ b/pkg/contexts/credentials/gc_test.go @@ -6,16 +6,16 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" me "github.com/open-component-model/ocm/pkg/contexts/credentials" - "github.com/open-component-model/ocm/pkg/finalizer" ) var _ = Describe("area test", func() { It("can be garbage collected", func() { ctx := me.New() - r := finalizer.GetRuntimeFinalizationRecorder(ctx) + r := runtimefinalizer.GetRuntimeFinalizationRecorder(ctx) Expect(r).NotTo(BeNil()) runtime.GC() diff --git a/pkg/contexts/credentials/internal/consumers.go b/pkg/contexts/credentials/internal/consumers.go index 796de292aa..145c43270a 100644 --- a/pkg/contexts/credentials/internal/consumers.go +++ b/pkg/contexts/credentials/internal/consumers.go @@ -4,7 +4,7 @@ import ( "sort" "sync" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/mandelsoft/goutils/maputils" ) // UsageContext descibes a dediacetd type specific @@ -151,7 +151,7 @@ func (p *consumerProviderRegistry) Register(id ProviderIdentity, c ConsumerProvi p.unregister(id) p.providers[id] = c - p.ordered = generics.MapValues(p.providers) + p.ordered = maputils.OrderedValues(p.providers) sort.Slice(p.ordered, func(a, b int) bool { return priority(p.ordered[a]) < priority(p.ordered[b]) }) @@ -167,7 +167,7 @@ func (p *consumerProviderRegistry) unregister(id ProviderIdentity) { p.explicit.Unregister(id) if _, ok := p.providers[id]; ok { delete(p.providers, id) - p.ordered = generics.MapValues(p.providers) + p.ordered = maputils.OrderedValues(p.providers) sort.Slice(p.ordered, func(a, b int) bool { return priority(p.ordered[a]) < priority(p.ordered[b]) }) diff --git a/pkg/contexts/credentials/internal/context.go b/pkg/contexts/credentials/internal/context.go index 60db42a925..9976029323 100644 --- a/pkg/contexts/credentials/internal/context.go +++ b/pkg/contexts/credentials/internal/context.go @@ -4,12 +4,13 @@ import ( "context" "reflect" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/config" cfgcpi "github.com/open-component-model/ocm/pkg/contexts/config/cpi" "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/runtime" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" "github.com/open-component-model/ocm/pkg/utils" ) @@ -20,7 +21,7 @@ const CONTEXT_TYPE = "credentials" + datacontext.OCM_CONTEXT_SUFFIX // for a configured consumer id. If non-empty it // must start with a DNSname identifying the origin of the // provider followed by a slash and a local arbitrary identity. -type ProviderIdentity = finalizer.ObjectIdentity +type ProviderIdentity = runtimefinalizer.ObjectIdentity type ContextProvider interface { CredentialsContext() Context diff --git a/pkg/contexts/credentials/internal/credentials.go b/pkg/contexts/credentials/internal/credentials.go index e5e4933eb9..fabd9056cf 100644 --- a/pkg/contexts/credentials/internal/credentials.go +++ b/pkg/contexts/credentials/internal/credentials.go @@ -1,9 +1,8 @@ package internal import ( + "github.com/mandelsoft/goutils/sliceutils" "github.com/modern-go/reflect2" - - "github.com/open-component-model/ocm/pkg/generics" ) // CredentialsSource is a factory for effective credentials. @@ -25,5 +24,5 @@ func (c CredentialsChain) Credentials(ctx Context, creds ...CredentialsSource) ( if len(creds) == 0 { return c[0].Credentials(ctx, c[1:]...) } - return c[0].Credentials(ctx, generics.AppendedSlice(c[1:], creds...)...) + return c[0].Credentials(ctx, sliceutils.CopyAppend(c[1:], creds...)...) } diff --git a/pkg/contexts/credentials/internal/errors.go b/pkg/contexts/credentials/internal/errors.go index bdede17a6b..5bcf19706a 100644 --- a/pkg/contexts/credentials/internal/errors.go +++ b/pkg/contexts/credentials/internal/errors.go @@ -1,7 +1,7 @@ package internal import ( - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) const ( diff --git a/pkg/contexts/credentials/internal/repository.go b/pkg/contexts/credentials/internal/repository.go index 6486301251..171477ceac 100644 --- a/pkg/contexts/credentials/internal/repository.go +++ b/pkg/contexts/credentials/internal/repository.go @@ -1,8 +1,9 @@ package internal import ( + "github.com/mandelsoft/goutils/set" + "github.com/open-component-model/ocm/pkg/common" - "github.com/open-component-model/ocm/pkg/generics" ) type Repository interface { @@ -15,7 +16,7 @@ type Credentials interface { CredentialsSource ExistsProperty(name string) bool GetProperty(name string) string - PropertyNames() generics.Set[string] + PropertyNames() set.Set[string] Properties() common.Properties } @@ -41,7 +42,7 @@ func (c DirectCredentials) GetProperty(name string) string { return c[name] } -func (c DirectCredentials) PropertyNames() generics.Set[string] { +func (c DirectCredentials) PropertyNames() set.Set[string] { return common.Properties(c).Names() } diff --git a/pkg/contexts/credentials/internal/repotypes.go b/pkg/contexts/credentials/internal/repotypes.go index 5c00c00d7b..37d3f94df6 100644 --- a/pkg/contexts/credentials/internal/repotypes.go +++ b/pkg/contexts/credentials/internal/repotypes.go @@ -3,10 +3,10 @@ package internal import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/generics" "github.com/modern-go/reflect2" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/runtime/descriptivetype" "github.com/open-component-model/ocm/pkg/utils" @@ -104,7 +104,7 @@ func ToGenericRepositorySpec(spec RepositorySpec) (*GenericRepositorySpec, error } func NewGenericRepositorySpec(data []byte, unmarshaler runtime.Unmarshaler) (RepositorySpec, error) { - return generics.AsE[RepositorySpec](newGenericRepositorySpec(data, unmarshaler)) + return generics.CastPointerR[RepositorySpec](newGenericRepositorySpec(data, unmarshaler)) } func newGenericRepositorySpec(data []byte, unmarshaler runtime.Unmarshaler) (*GenericRepositorySpec, error) { diff --git a/pkg/contexts/credentials/internal/utils.go b/pkg/contexts/credentials/internal/utils.go index 553c4cf4f8..58192a65ce 100644 --- a/pkg/contexts/credentials/internal/utils.go +++ b/pkg/contexts/credentials/internal/utils.go @@ -1,7 +1,7 @@ package internal import ( - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) func CredentialsForConsumer(ctx ContextProvider, id ConsumerIdentity, unknownAsError bool, matchers ...IdentityMatcher) (Credentials, error) { diff --git a/pkg/contexts/credentials/repositories/directcreds/repository.go b/pkg/contexts/credentials/repositories/directcreds/repository.go index ec499a26be..6a58b16e36 100644 --- a/pkg/contexts/credentials/repositories/directcreds/repository.go +++ b/pkg/contexts/credentials/repositories/directcreds/repository.go @@ -1,8 +1,9 @@ package directcreds import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" - "github.com/open-component-model/ocm/pkg/errors" ) type Repository struct { diff --git a/pkg/contexts/credentials/repositories/dockerconfig/credentials.go b/pkg/contexts/credentials/repositories/dockerconfig/credentials.go index 6cd9ac1487..a6a38f829d 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/credentials.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/credentials.go @@ -4,10 +4,10 @@ import ( "github.com/docker/cli/cli/config/configfile" dockercred "github.com/docker/cli/cli/config/credentials" "github.com/docker/cli/cli/config/types" + "github.com/mandelsoft/goutils/set" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" - "github.com/open-component-model/ocm/pkg/generics" ) type Credentials struct { @@ -58,7 +58,7 @@ func (c *Credentials) GetProperty(name string) string { return c.get()[name] } -func (c *Credentials) PropertyNames() generics.Set[string] { +func (c *Credentials) PropertyNames() set.Set[string] { return c.get().Names() } diff --git a/pkg/contexts/credentials/repositories/dockerconfig/default.go b/pkg/contexts/credentials/repositories/dockerconfig/default.go index 4cad158ae8..54e763d8ec 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/default.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/default.go @@ -3,13 +3,13 @@ package dockerconfig import ( dockercli "github.com/docker/cli/cli/config" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/contexts/config" credcfg "github.com/open-component-model/ocm/pkg/contexts/credentials/config" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/defaultconfigregistry" - "github.com/open-component-model/ocm/pkg/errors" ) func init() { diff --git a/pkg/contexts/credentials/repositories/dockerconfig/repo_test.go b/pkg/contexts/credentials/repositories/dockerconfig/repo_test.go index 2170d75eb1..6945a809ae 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/repo_test.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/repo_test.go @@ -17,7 +17,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" local "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/dockerconfig" "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/finalizer" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" ) var _ = Describe("docker config", func() { @@ -152,7 +152,7 @@ var _ = Describe("docker config", func() { It("can access the default context", func() { ctx := credentials.New() - r := finalizer.GetRuntimeFinalizationRecorder(ctx) + r := runtimefinalizer.GetRuntimeFinalizationRecorder(ctx) Expect(r).NotTo(BeNil()) Must(ctx.RepositoryForConfig([]byte(specdata), nil)) diff --git a/pkg/contexts/credentials/repositories/dockerconfig/repository.go b/pkg/contexts/credentials/repositories/dockerconfig/repository.go index 4563ab9767..108494feae 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/repository.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/repository.go @@ -10,12 +10,12 @@ import ( "github.com/docker/cli/cli/config" "github.com/docker/cli/cli/config/configfile" "github.com/docker/cli/cli/config/types" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" "github.com/open-component-model/ocm/pkg/utils" ) @@ -84,7 +84,7 @@ func (r *Repository) Read(force bool) error { var ( data []byte err error - id finalizer.ObjectIdentity + id runtimefinalizer.ObjectIdentity ) if r.path != "" { path, err := utils.ResolvePath(r.path) @@ -98,7 +98,7 @@ func (r *Repository) Read(force bool) error { id = cpi.ProviderIdentity(PROVIDER + "/" + path) } else if len(r.data) > 0 { data = r.data - id = finalizer.NewObjectIdentity(PROVIDER) + id = runtimefinalizer.NewObjectIdentity(PROVIDER) } cfg, err := config.LoadFromReader(bytes.NewBuffer(data)) diff --git a/pkg/contexts/credentials/repositories/dockerconfig/type.go b/pkg/contexts/credentials/repositories/dockerconfig/type.go index b41dda1cc6..d18cd7f26d 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/type.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/type.go @@ -4,8 +4,9 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/credentials/repositories/gardenerconfig/repository.go b/pkg/contexts/credentials/repositories/gardenerconfig/repository.go index 7afc29320f..70fc7606b7 100644 --- a/pkg/contexts/credentials/repositories/gardenerconfig/repository.go +++ b/pkg/contexts/credentials/repositories/gardenerconfig/repository.go @@ -11,6 +11,7 @@ import ( "net/url" "sync" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" @@ -18,7 +19,7 @@ import ( gardenercfgcpi "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/gardenerconfig/cpi" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/gardenerconfig/identity" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/errkind" ) type Cipher string @@ -170,7 +171,7 @@ func (r *Repository) getRawConfig() (io.ReadCloser, error) { // the secret server might be temporarily not available. // for these situations we should allow a retry at a later point in time // while keeping the old data for the moment. - if errors.IsRetryable(err) { + if errkind.IsRetryable(err) { // TODO: log error return nil, nil } diff --git a/pkg/contexts/credentials/repositories/gardenerconfig/type.go b/pkg/contexts/credentials/repositories/gardenerconfig/type.go index 2c16057532..9824dcab63 100644 --- a/pkg/contexts/credentials/repositories/gardenerconfig/type.go +++ b/pkg/contexts/credentials/repositories/gardenerconfig/type.go @@ -3,11 +3,12 @@ package gardenerconfig import ( "fmt" + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/credentials/internal" gardenercfgcpi "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/gardenerconfig/cpi" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/gardenerconfig/identity" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/credentials/repositories/memory/config/type.go b/pkg/contexts/credentials/repositories/memory/config/type.go index 30dadff232..3e1b5aecd3 100644 --- a/pkg/contexts/credentials/repositories/memory/config/type.go +++ b/pkg/contexts/credentials/repositories/memory/config/type.go @@ -3,11 +3,12 @@ package config import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common" cfgcpi "github.com/open-component-model/ocm/pkg/contexts/config/cpi" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/memory" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/credentials/repositories/npm/config.go b/pkg/contexts/credentials/repositories/npm/config.go index b6b750b9ea..d61cb00d43 100644 --- a/pkg/contexts/credentials/repositories/npm/config.go +++ b/pkg/contexts/credentials/repositories/npm/config.go @@ -5,7 +5,8 @@ import ( "os" "strings" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/credentials/repositories/npm/default.go b/pkg/contexts/credentials/repositories/npm/default.go index 14c569f842..aaf6ad3053 100644 --- a/pkg/contexts/credentials/repositories/npm/default.go +++ b/pkg/contexts/credentials/repositories/npm/default.go @@ -5,13 +5,13 @@ import ( "os" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/contexts/config" credcfg "github.com/open-component-model/ocm/pkg/contexts/credentials/config" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/defaultconfigregistry" - "github.com/open-component-model/ocm/pkg/errors" ) const ( diff --git a/pkg/contexts/credentials/repositories/npm/repository.go b/pkg/contexts/credentials/repositories/npm/repository.go index c02d7d5971..87c4d326c5 100644 --- a/pkg/contexts/credentials/repositories/npm/repository.go +++ b/pkg/contexts/credentials/repositories/npm/repository.go @@ -3,10 +3,11 @@ package npm import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common" npmCredentials "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/npm/identity" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/credentials/repositories/npm/repository_test.go b/pkg/contexts/credentials/repositories/npm/repository_test.go index b628c82ce7..e7fd29cfa6 100644 --- a/pkg/contexts/credentials/repositories/npm/repository_test.go +++ b/pkg/contexts/credentials/repositories/npm/repository_test.go @@ -6,6 +6,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" . "github.com/open-component-model/ocm/pkg/testutils" "github.com/open-component-model/ocm/pkg/common" @@ -13,7 +14,6 @@ import ( npmCredentials "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/npm/identity" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" local "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/npm" - "github.com/open-component-model/ocm/pkg/finalizer" ) var _ = Describe("NPM config - .npmrc", func() { @@ -64,7 +64,7 @@ var _ = Describe("NPM config - .npmrc", func() { It("can access the default context", func() { ctx := credentials.New() - r := finalizer.GetRuntimeFinalizationRecorder(ctx) + r := runtimefinalizer.GetRuntimeFinalizationRecorder(ctx) Expect(r).NotTo(BeNil()) Must(ctx.RepositoryForConfig([]byte(specdata), nil)) diff --git a/pkg/contexts/credentials/repositories/npm/type.go b/pkg/contexts/credentials/repositories/npm/type.go index 32cf05b2f6..d2b6958512 100644 --- a/pkg/contexts/credentials/repositories/npm/type.go +++ b/pkg/contexts/credentials/repositories/npm/type.go @@ -3,8 +3,9 @@ package npm import ( "fmt" + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/credentials/repositories/vault/auth.go b/pkg/contexts/credentials/repositories/vault/auth.go index a8d3386d8f..6df7355dc2 100644 --- a/pkg/contexts/credentials/repositories/vault/auth.go +++ b/pkg/contexts/credentials/repositories/vault/auth.go @@ -7,11 +7,11 @@ import ( "github.com/hashicorp/vault-client-go" "github.com/hashicorp/vault-client-go/schema" + "github.com/mandelsoft/goutils/errors" "golang.org/x/exp/maps" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault/identity" - "github.com/open-component-model/ocm/pkg/errors" ) type AuthMethod interface { diff --git a/pkg/contexts/credentials/repositories/vault/cache.go b/pkg/contexts/credentials/repositories/vault/cache.go index 873e1eb967..12638d4d87 100644 --- a/pkg/contexts/credentials/repositories/vault/cache.go +++ b/pkg/contexts/credentials/repositories/vault/cache.go @@ -3,9 +3,10 @@ package vault import ( "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/errors" ) const ATTR_REPOS = "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault" diff --git a/pkg/contexts/credentials/repositories/vault/identity/identity.go b/pkg/contexts/credentials/repositories/vault/identity/identity.go index 6c0ac54b9e..fc01e52d7d 100644 --- a/pkg/contexts/credentials/repositories/vault/identity/identity.go +++ b/pkg/contexts/credentials/repositories/vault/identity/identity.go @@ -5,9 +5,10 @@ import ( "net/url" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/credentials/identity/hostpath" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/listformat" ) diff --git a/pkg/contexts/credentials/repositories/vault/provider.go b/pkg/contexts/credentials/repositories/vault/provider.go index 418d3641a4..fefc3c34f2 100644 --- a/pkg/contexts/credentials/repositories/vault/provider.go +++ b/pkg/contexts/credentials/repositories/vault/provider.go @@ -9,12 +9,12 @@ import ( "time" "github.com/hashicorp/vault-client-go" + "github.com/mandelsoft/goutils/errors" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault/identity" - "github.com/open-component-model/ocm/pkg/errors" ) const PROVIDER = "ocm.software/credentialprovider/" + Type diff --git a/pkg/contexts/credentials/repositories/vault/repository.go b/pkg/contexts/credentials/repositories/vault/repository.go index 0b11262412..cd736718ba 100644 --- a/pkg/contexts/credentials/repositories/vault/repository.go +++ b/pkg/contexts/credentials/repositories/vault/repository.go @@ -1,10 +1,11 @@ package vault import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/credentials/internal" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault/identity" - "github.com/open-component-model/ocm/pkg/errors" ) type Repository struct { diff --git a/pkg/contexts/credentials/utils.go b/pkg/contexts/credentials/utils.go index 117f78508a..e33477a366 100644 --- a/pkg/contexts/credentials/utils.go +++ b/pkg/contexts/credentials/utils.go @@ -5,11 +5,11 @@ import ( "crypto/x509" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/texttheater/golang-levenshtein/levenshtein" "github.com/open-component-model/ocm/pkg/contexts/credentials/internal" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/rootcertsattr" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/datacontext/action/api/registry.go b/pkg/contexts/datacontext/action/api/registry.go index ba2ad44261..40b9af6ad3 100644 --- a/pkg/contexts/datacontext/action/api/registry.go +++ b/pkg/contexts/datacontext/action/api/registry.go @@ -4,9 +4,9 @@ import ( "fmt" "sync" + "github.com/mandelsoft/goutils/errors" "golang.org/x/exp/slices" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/datacontext/action/handlers/registry.go b/pkg/contexts/datacontext/action/handlers/registry.go index 96301a9e0b..ef8061a751 100644 --- a/pkg/contexts/datacontext/action/handlers/registry.go +++ b/pkg/contexts/datacontext/action/handlers/registry.go @@ -7,12 +7,12 @@ import ( "strings" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/datacontext/action/api" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/registrations" "github.com/open-component-model/ocm/pkg/semverutils" "github.com/open-component-model/ocm/pkg/utils" @@ -147,7 +147,7 @@ func (r *registry) Register(h ActionHandler, olist ...Option) error { reg := ®istration{ handler: h, versions: versions, - priority: generics.Conditional(opts.Priority >= 0, opts.Priority, 10), + priority: general.Conditional(opts.Priority >= 0, opts.Priority, 10), } for _, s := range opts.Selectors { diff --git a/pkg/contexts/datacontext/attrs.go b/pkg/contexts/datacontext/attrs.go index 79524286ba..a68503c64a 100644 --- a/pkg/contexts/datacontext/attrs.go +++ b/pkg/contexts/datacontext/attrs.go @@ -4,8 +4,9 @@ import ( "sort" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/datacontext/attrs/rootcertsattr/attr.go b/pkg/contexts/datacontext/attrs/rootcertsattr/attr.go index 865ee28ce3..21080d59dc 100644 --- a/pkg/contexts/datacontext/attrs/rootcertsattr/attr.go +++ b/pkg/contexts/datacontext/attrs/rootcertsattr/attr.go @@ -5,8 +5,9 @@ import ( "encoding/json" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/signing/signutils" ) diff --git a/pkg/contexts/datacontext/attrs/rootcertsattr/config.go b/pkg/contexts/datacontext/attrs/rootcertsattr/config.go index 8798128fa6..4516793c54 100644 --- a/pkg/contexts/datacontext/attrs/rootcertsattr/config.go +++ b/pkg/contexts/datacontext/attrs/rootcertsattr/config.go @@ -3,10 +3,10 @@ package rootcertsattr import ( "sync" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" cfgcpi "github.com/open-component-model/ocm/pkg/contexts/config/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/signing/signutils" "github.com/open-component-model/ocm/pkg/utils" diff --git a/pkg/contexts/datacontext/attrs/tmpcache/attr.go b/pkg/contexts/datacontext/attrs/tmpcache/attr.go index 7c4164ed7f..b71abfe230 100644 --- a/pkg/contexts/datacontext/attrs/tmpcache/attr.go +++ b/pkg/contexts/datacontext/attrs/tmpcache/attr.go @@ -3,11 +3,11 @@ package tmpcache import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/datacontext/attrs/vfsattr/attr.go b/pkg/contexts/datacontext/attrs/vfsattr/attr.go index cc62eb61b2..c0b8858d23 100644 --- a/pkg/contexts/datacontext/attrs/vfsattr/attr.go +++ b/pkg/contexts/datacontext/attrs/vfsattr/attr.go @@ -3,11 +3,11 @@ package vfsattr import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/datacontext/config/attrs/type.go b/pkg/contexts/datacontext/config/attrs/type.go index 7481a1126a..3e8f3eeb66 100644 --- a/pkg/contexts/datacontext/config/attrs/type.go +++ b/pkg/contexts/datacontext/config/attrs/type.go @@ -3,9 +3,10 @@ package attrs import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" + cfgcpi "github.com/open-component-model/ocm/pkg/contexts/config/cpi" "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/datacontext/context.go b/pkg/contexts/datacontext/context.go index b90b8e1b83..d12eedbb7c 100644 --- a/pkg/contexts/datacontext/context.go +++ b/pkg/contexts/datacontext/context.go @@ -7,15 +7,16 @@ import ( "reflect" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/logging" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/datacontext/action/handlers" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" ocmlog "github.com/open-component-model/ocm/pkg/logging" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/runtime" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" "github.com/open-component-model/ocm/pkg/utils" ) @@ -66,7 +67,7 @@ func Mode(m ...BuilderMode) BuilderMode { return utils.OptionalDefaulted(MODE_EXTENDED, m...) } -type ContextIdentity = finalizer.ObjectIdentity +type ContextIdentity = runtimefinalizer.ObjectIdentity type ContextProvider interface { // AttributesContext returns the shared attributes @@ -135,7 +136,7 @@ type Context interface { type InternalContext interface { Context - finalizer.RecorderProvider + runtimefinalizer.RecorderProvider GetKey() interface{} GetAllocatable() refmgmt.Allocatable } @@ -287,7 +288,7 @@ func (c *_context) Logger(messageContext ...logging.MessageContext) logging.Logg //////////////////////////////////////////////////////////////////////////////// -var contextrange, attrsrange = finalizer.NumberRange{}, finalizer.NumberRange{} +var contextrange, attrsrange = runtimefinalizer.NumberRange{}, runtimefinalizer.NumberRange{} type _attributes struct { sync.RWMutex diff --git a/pkg/contexts/datacontext/cpi.go b/pkg/contexts/datacontext/cpi.go index be80c6f010..4598e0781d 100644 --- a/pkg/contexts/datacontext/cpi.go +++ b/pkg/contexts/datacontext/cpi.go @@ -4,14 +4,15 @@ import ( "context" "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/logging" "github.com/modern-go/reflect2" "github.com/open-component-model/ocm/pkg/contexts/datacontext/action/handlers" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/refmgmt/finalized" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" ) // NewContextBase creates a context base implementation supporting @@ -192,13 +193,13 @@ type contextBase struct { delegates finalizer *finalizer.Finalizer - recorder *finalizer.RuntimeFinalizationRecoder + recorder *runtimefinalizer.RuntimeFinalizationRecoder } var _ Context = (*contextBase)(nil) func newContextBase(eff Context, typ string, key interface{}, parentAttrs Attributes, updater *Updater, delegates Delegates) *contextBase { - recorder := &finalizer.RuntimeFinalizationRecoder{} + recorder := &runtimefinalizer.RuntimeFinalizationRecoder{} id := ContextIdentity(fmt.Sprintf("%s/%d", typ, contextrange.NextId())) c := &contextBase{ ctxtype: typ, @@ -250,7 +251,7 @@ func (c *contextBase) GetAttributes() Attributes { return c.attributes } -func (c *contextBase) GetRecorder() *finalizer.RuntimeFinalizationRecoder { +func (c *contextBase) GetRecorder() *runtimefinalizer.RuntimeFinalizationRecoder { return c.recorder } diff --git a/pkg/contexts/datacontext/gc_test.go b/pkg/contexts/datacontext/gc_test.go index 952f48e64b..1caad0c1f0 100644 --- a/pkg/contexts/datacontext/gc_test.go +++ b/pkg/contexts/datacontext/gc_test.go @@ -7,15 +7,16 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/mandelsoft/goutils/general" + me "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/finalizer" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" ) var _ = Describe("area test", func() { - It("can be garbage collectede", func() { + It("can be garbage collected", func() { ctx := me.New() - r := finalizer.GetRuntimeFinalizationRecorder(ctx) + r := runtimefinalizer.GetRuntimeFinalizationRecorder(ctx) id := ctx.GetId() Expect(me.GetContextRefCount(ctx)).To(Equal(1)) ctx = nil @@ -27,7 +28,7 @@ var _ = Describe("area test", func() { It("provides second reference", func() { // ocmlog.Context().AddRule(logging.NewConditionRule(logging.DebugLevel, me.Realm)) - multiRefs := generics.Conditional(me.MULTI_REF, 2, 1) + multiRefs := general.Conditional(me.MULTI_REF, 2, 1) ctx := me.New() Expect(me.GetContextRefCount(ctx)).To(Equal(1)) @@ -35,7 +36,7 @@ var _ = Describe("area test", func() { actx := ctx.AttributesContext() Expect(me.GetContextRefCount(ctx)).To(Equal(multiRefs)) - r := finalizer.GetRuntimeFinalizationRecorder(ctx) + r := runtimefinalizer.GetRuntimeFinalizationRecorder(ctx) Expect(r).NotTo(BeNil()) runtime.GC() @@ -62,7 +63,7 @@ var _ = Describe("area test", func() { It("creates views", func() { ctx := me.New() - r := finalizer.GetRuntimeFinalizationRecorder(ctx) + r := runtimefinalizer.GetRuntimeFinalizationRecorder(ctx) Expect(me.GetContextRefCount(ctx)).To(Equal(1)) Expect(me.IsPersistentContextRef(ctx)).To(BeTrue()) diff --git a/pkg/contexts/datacontext/session.go b/pkg/contexts/datacontext/session.go index 4b1a64cc0f..a56434cc1a 100644 --- a/pkg/contexts/datacontext/session.go +++ b/pkg/contexts/datacontext/session.go @@ -4,8 +4,9 @@ import ( "io" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common/accessio" - "github.com/open-component-model/ocm/pkg/errors" ) // Session is a context keeping track of objects requiring a close diff --git a/pkg/contexts/oci/actions/oci-repository-prepare/exec.go b/pkg/contexts/oci/actions/oci-repository-prepare/exec.go index 175fcce154..450abfaadc 100644 --- a/pkg/contexts/oci/actions/oci-repository-prepare/exec.go +++ b/pkg/contexts/oci/actions/oci-repository-prepare/exec.go @@ -1,11 +1,12 @@ package oci_repository_prepare import ( + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/datacontext/action/handlers" - "github.com/open-component-model/ocm/pkg/generics" ) func Execute(hdlrs handlers.Registry, host, repo string, creds common.Properties) (*ActionResult, error) { - return generics.AsE[*ActionResult](hdlrs.Execute(Spec(host, repo), creds)) + return generics.CastR[*ActionResult](hdlrs.Execute(Spec(host, repo), creds)) } diff --git a/pkg/contexts/oci/artdesc/artifact.go b/pkg/contexts/oci/artdesc/artifact.go index 07d083500e..857c61b7e7 100644 --- a/pkg/contexts/oci/artdesc/artifact.go +++ b/pkg/contexts/oci/artdesc/artifact.go @@ -5,12 +5,12 @@ import ( out "fmt" "github.com/containerd/containerd/images" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" ociv1 "github.com/opencontainers/image-spec/specs-go/v1" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc/helper" - "github.com/open-component-model/ocm/pkg/errors" ) const SchemeVersion = helper.SchemeVersion diff --git a/pkg/contexts/oci/artdesc/helper/generic.go b/pkg/contexts/oci/artdesc/helper/generic.go index d8ebf35d5e..46e919178f 100644 --- a/pkg/contexts/oci/artdesc/helper/generic.go +++ b/pkg/contexts/oci/artdesc/helper/generic.go @@ -4,9 +4,8 @@ import ( "fmt" "github.com/containerd/containerd/images" + "github.com/mandelsoft/goutils/errors" ociv1 "github.com/opencontainers/image-spec/specs-go/v1" - - "github.com/open-component-model/ocm/pkg/errors" ) const SchemeVersion = 2 diff --git a/pkg/contexts/oci/artdesc/index.go b/pkg/contexts/oci/artdesc/index.go index ee0e2bc892..fd18b7fbd9 100644 --- a/pkg/contexts/oci/artdesc/index.go +++ b/pkg/contexts/oci/artdesc/index.go @@ -3,12 +3,12 @@ package artdesc import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/opencontainers/image-spec/specs-go" ociv1 "github.com/opencontainers/image-spec/specs-go/v1" "github.com/open-component-model/ocm/pkg/blobaccess" - "github.com/open-component-model/ocm/pkg/errors" ) type Index ociv1.Index diff --git a/pkg/contexts/oci/artdesc/manifest.go b/pkg/contexts/oci/artdesc/manifest.go index 46c8fe0248..67f136cbc3 100644 --- a/pkg/contexts/oci/artdesc/manifest.go +++ b/pkg/contexts/oci/artdesc/manifest.go @@ -3,12 +3,12 @@ package artdesc import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/opencontainers/image-spec/specs-go" ociv1 "github.com/opencontainers/image-spec/specs-go/v1" "github.com/open-component-model/ocm/pkg/blobaccess" - "github.com/open-component-model/ocm/pkg/errors" ) type Manifest ociv1.Manifest diff --git a/pkg/contexts/oci/attrs/cacheattr/attr.go b/pkg/contexts/oci/attrs/cacheattr/attr.go index b6014602b5..1bea28b5fc 100644 --- a/pkg/contexts/oci/attrs/cacheattr/attr.go +++ b/pkg/contexts/oci/attrs/cacheattr/attr.go @@ -4,9 +4,10 @@ import ( "fmt" "os" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/oci/cpi/support/artifact.go b/pkg/contexts/oci/cpi/support/artifact.go index a488dfc086..50aeecea09 100644 --- a/pkg/contexts/oci/cpi/support/artifact.go +++ b/pkg/contexts/oci/cpi/support/artifact.go @@ -5,6 +5,7 @@ import ( "fmt" "io" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -13,7 +14,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/oci/internal" - "github.com/open-component-model/ocm/pkg/errors" ) var ErrNoIndex = errors.New("manifest does not support access to subsequent artifacts") diff --git a/pkg/contexts/oci/cpi/support/base.go b/pkg/contexts/oci/cpi/support/base.go index da2f0c7517..407f4ce84d 100644 --- a/pkg/contexts/oci/cpi/support/base.go +++ b/pkg/contexts/oci/cpi/support/base.go @@ -4,13 +4,13 @@ import ( "fmt" "sync" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" - "github.com/open-component-model/ocm/pkg/errors" ) type artifactBase struct { diff --git a/pkg/contexts/oci/cpi/support/flavor_index.go b/pkg/contexts/oci/cpi/support/flavor_index.go index c392672e88..535422bb49 100644 --- a/pkg/contexts/oci/cpi/support/flavor_index.go +++ b/pkg/contexts/oci/cpi/support/flavor_index.go @@ -1,6 +1,7 @@ package support import ( + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -8,7 +9,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/oci/internal" - "github.com/open-component-model/ocm/pkg/errors" ) type IndexAccess struct { diff --git a/pkg/contexts/oci/cpi/support/flavor_manifest.go b/pkg/contexts/oci/cpi/support/flavor_manifest.go index b31ac21123..02603de879 100644 --- a/pkg/contexts/oci/cpi/support/flavor_manifest.go +++ b/pkg/contexts/oci/cpi/support/flavor_manifest.go @@ -3,12 +3,12 @@ package support import ( "compress/gzip" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" - "github.com/open-component-model/ocm/pkg/errors" ) type ManifestAccess struct { diff --git a/pkg/contexts/oci/cpi/support/namespace.go b/pkg/contexts/oci/cpi/support/namespace.go index f257939a87..0055903b52 100644 --- a/pkg/contexts/oci/cpi/support/namespace.go +++ b/pkg/contexts/oci/cpi/support/namespace.go @@ -1,12 +1,12 @@ package support import ( + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/refmgmt" ) diff --git a/pkg/contexts/oci/cpi/view.go b/pkg/contexts/oci/cpi/view.go index 3984648d62..4c7bccc266 100644 --- a/pkg/contexts/oci/cpi/view.go +++ b/pkg/contexts/oci/cpi/view.go @@ -4,12 +4,12 @@ import ( "fmt" "io" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" "github.com/open-component-model/ocm/pkg/contexts/oci/internal" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/refmgmt/resource" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/oci/gc_test.go b/pkg/contexts/oci/gc_test.go index 7eb527a0da..404dbad31e 100644 --- a/pkg/contexts/oci/gc_test.go +++ b/pkg/contexts/oci/gc_test.go @@ -6,16 +6,16 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" me "github.com/open-component-model/ocm/pkg/contexts/oci" - "github.com/open-component-model/ocm/pkg/finalizer" ) var _ = Describe("area test", func() { It("can be garbage collected", func() { ctx := me.New() - r := finalizer.GetRuntimeFinalizationRecorder(ctx) + r := runtimefinalizer.GetRuntimeFinalizationRecorder(ctx) Expect(r).NotTo(BeNil()) runtime.GC() diff --git a/pkg/contexts/oci/internal/errors.go b/pkg/contexts/oci/internal/errors.go index a6375c8fa1..3b790e669c 100644 --- a/pkg/contexts/oci/internal/errors.go +++ b/pkg/contexts/oci/internal/errors.go @@ -3,8 +3,9 @@ package internal import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/blobaccess" - "github.com/open-component-model/ocm/pkg/errors" ) const ( diff --git a/pkg/contexts/oci/internal/repotypes.go b/pkg/contexts/oci/internal/repotypes.go index 8870753149..550e0d4fd6 100644 --- a/pkg/contexts/oci/internal/repotypes.go +++ b/pkg/contexts/oci/internal/repotypes.go @@ -3,11 +3,11 @@ package internal import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/generics" "github.com/modern-go/reflect2" "github.com/open-component-model/ocm/pkg/contexts/credentials" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) @@ -118,7 +118,7 @@ func ToGenericRepositorySpec(spec RepositorySpec) (*GenericRepositorySpec, error } func NewGenericRepositorySpec(data []byte, unmarshaler runtime.Unmarshaler) (RepositorySpec, error) { - return generics.AsE[RepositorySpec](newGenericRepositorySpec(data, unmarshaler)) + return generics.CastPointerR[RepositorySpec](newGenericRepositorySpec(data, unmarshaler)) } func newGenericRepositorySpec(data []byte, unmarshaler runtime.Unmarshaler) (*GenericRepositorySpec, error) { diff --git a/pkg/contexts/oci/internal/uniform.go b/pkg/contexts/oci/internal/uniform.go index 1a57a1c5f4..d3ab3e2969 100644 --- a/pkg/contexts/oci/internal/uniform.go +++ b/pkg/contexts/oci/internal/uniform.go @@ -8,11 +8,11 @@ import ( "sync" "github.com/containerd/containerd/reference" + "github.com/mandelsoft/goutils/errors" "github.com/sirupsen/logrus" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/contexts/oci/grammar" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/oci/ociutils/helm/artifact.go b/pkg/contexts/oci/ociutils/helm/artifact.go index 3f52625f61..e0aa054cbc 100644 --- a/pkg/contexts/oci/ociutils/helm/artifact.go +++ b/pkg/contexts/oci/ociutils/helm/artifact.go @@ -5,6 +5,7 @@ import ( "fmt" "os" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/chartutil" @@ -14,7 +15,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/artifactset" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/helm/loader" ) diff --git a/pkg/contexts/oci/ref.go b/pkg/contexts/oci/ref.go index 88482f6820..553af5a8a8 100644 --- a/pkg/contexts/oci/ref.go +++ b/pkg/contexts/oci/ref.go @@ -4,10 +4,10 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/contexts/oci/grammar" - "github.com/open-component-model/ocm/pkg/errors" ) // to find a suitable secret for images on Docker Hub, we need its two domains to do matching. diff --git a/pkg/contexts/oci/repositories/artifactset/artifactset.go b/pkg/contexts/oci/repositories/artifactset/artifactset.go index 7b033eefa0..612b21c5a3 100644 --- a/pkg/contexts/oci/repositories/artifactset/artifactset.go +++ b/pkg/contexts/oci/repositories/artifactset/artifactset.go @@ -3,6 +3,7 @@ package artifactset import ( "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/opencontainers/go-digest" @@ -12,7 +13,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi/support" - "github.com/open-component-model/ocm/pkg/errors" ) const ( diff --git a/pkg/contexts/oci/repositories/artifactset/artifactset_test.go b/pkg/contexts/oci/repositories/artifactset/artifactset_test.go index 834dd4a40f..f299ab38c7 100644 --- a/pkg/contexts/oci/repositories/artifactset/artifactset_test.go +++ b/pkg/contexts/oci/repositories/artifactset/artifactset_test.go @@ -11,13 +11,13 @@ import ( . "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ctf/testhelper" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/artifactset" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" ) diff --git a/pkg/contexts/oci/repositories/artifactset/format.go b/pkg/contexts/oci/repositories/artifactset/format.go index 4d4cc6da74..ae4c67aec7 100644 --- a/pkg/contexts/oci/repositories/artifactset/format.go +++ b/pkg/contexts/oci/repositories/artifactset/format.go @@ -3,12 +3,12 @@ package artifactset import ( "sync" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" - "github.com/open-component-model/ocm/pkg/errors" mime2 "github.com/open-component-model/ocm/pkg/mime" ) diff --git a/pkg/contexts/oci/repositories/artifactset/options.go b/pkg/contexts/oci/repositories/artifactset/options.go index 16cc36f688..d75ed56a73 100644 --- a/pkg/contexts/oci/repositories/artifactset/options.go +++ b/pkg/contexts/oci/repositories/artifactset/options.go @@ -1,8 +1,9 @@ package artifactset import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common/accessio" - "github.com/open-component-model/ocm/pkg/errors" ) type Options struct { diff --git a/pkg/contexts/oci/repositories/artifactset/repository.go b/pkg/contexts/oci/repositories/artifactset/repository.go index b5d5dc4dcf..c0167c9aa3 100644 --- a/pkg/contexts/oci/repositories/artifactset/repository.go +++ b/pkg/contexts/oci/repositories/artifactset/repository.go @@ -1,10 +1,11 @@ package artifactset import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" - "github.com/open-component-model/ocm/pkg/errors" ) type RepositoryImpl struct { diff --git a/pkg/contexts/oci/repositories/artifactset/utils_synthesis.go b/pkg/contexts/oci/repositories/artifactset/utils_synthesis.go index c4bed9fc58..52df2f528a 100644 --- a/pkg/contexts/oci/repositories/artifactset/utils_synthesis.go +++ b/pkg/contexts/oci/repositories/artifactset/utils_synthesis.go @@ -3,8 +3,9 @@ package artifactset import ( "fmt" - . "github.com/open-component-model/ocm/pkg/finalizer" + . "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/opencontainers/go-digest" @@ -15,7 +16,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/oci/transfer" "github.com/open-component-model/ocm/pkg/contexts/oci/transfer/filters" - "github.com/open-component-model/ocm/pkg/errors" ) const SynthesizedBlobFormat = "+tar+gzip" diff --git a/pkg/contexts/oci/repositories/ctf/ctf_test.go b/pkg/contexts/oci/repositories/ctf/ctf_test.go index 78373764b5..34aa84669f 100644 --- a/pkg/contexts/oci/repositories/ctf/ctf_test.go +++ b/pkg/contexts/oci/repositories/ctf/ctf_test.go @@ -10,11 +10,13 @@ import ( . "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ctf/testhelper" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/logging" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/opencontainers/go-digest" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" @@ -22,8 +24,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/artifactset" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ctf" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" ocmlog "github.com/open-component-model/ocm/pkg/logging" "github.com/open-component-model/ocm/pkg/refmgmt" ) diff --git a/pkg/contexts/oci/repositories/ctf/format.go b/pkg/contexts/oci/repositories/ctf/format.go index ac88b5d7a9..f77d0da8fd 100644 --- a/pkg/contexts/oci/repositories/ctf/format.go +++ b/pkg/contexts/oci/repositories/ctf/format.go @@ -5,6 +5,7 @@ import ( "strings" "sync" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -12,7 +13,6 @@ import ( "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ctf/format" - "github.com/open-component-model/ocm/pkg/errors" ) const ( diff --git a/pkg/contexts/oci/repositories/ctf/namespace.go b/pkg/contexts/oci/repositories/ctf/namespace.go index 063ba85d2b..e8ec28dfb4 100644 --- a/pkg/contexts/oci/repositories/ctf/namespace.go +++ b/pkg/contexts/oci/repositories/ctf/namespace.go @@ -1,6 +1,7 @@ package ctf import ( + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -8,7 +9,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi/support" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ctf/index" - "github.com/open-component-model/ocm/pkg/errors" ) func NewNamespace(repo *RepositoryImpl, name string) (cpi.NamespaceAccess, error) { diff --git a/pkg/contexts/oci/repositories/ctf/synthesis_test.go b/pkg/contexts/oci/repositories/ctf/synthesis_test.go index b4277e69cc..ecc253e0bf 100644 --- a/pkg/contexts/oci/repositories/ctf/synthesis_test.go +++ b/pkg/contexts/oci/repositories/ctf/synthesis_test.go @@ -7,6 +7,7 @@ import ( . "github.com/open-component-model/ocm/pkg/testutils" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/opencontainers/go-digest" @@ -23,7 +24,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/digester/digesters/artifact" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/hasher/sha256" diff --git a/pkg/contexts/oci/repositories/ctf/testhelper/fill.go b/pkg/contexts/oci/repositories/ctf/testhelper/fill.go index 14e952224e..3a5ad7782b 100644 --- a/pkg/contexts/oci/repositories/ctf/testhelper/fill.go +++ b/pkg/contexts/oci/repositories/ctf/testhelper/fill.go @@ -3,13 +3,13 @@ package testhelper import ( . "github.com/onsi/gomega" + "github.com/mandelsoft/goutils/finalizer" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/testutils" ) diff --git a/pkg/contexts/oci/repositories/docker/namespace.go b/pkg/contexts/oci/repositories/docker/namespace.go index 8790054c12..f5367f01ad 100644 --- a/pkg/contexts/oci/repositories/docker/namespace.go +++ b/pkg/contexts/oci/repositories/docker/namespace.go @@ -8,6 +8,7 @@ import ( "github.com/containers/image/v5/image" "github.com/containers/image/v5/types" dockertypes "github.com/docker/docker/api/types/image" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/logging" "github.com/opencontainers/go-digest" @@ -17,7 +18,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi/support" "github.com/open-component-model/ocm/pkg/contexts/oci/internal" - "github.com/open-component-model/ocm/pkg/errors" ) type blobHandler struct { diff --git a/pkg/contexts/oci/repositories/empty/repository.go b/pkg/contexts/oci/repositories/empty/repository.go index 94b7d96f02..8ccbba5b28 100644 --- a/pkg/contexts/oci/repositories/empty/repository.go +++ b/pkg/contexts/oci/repositories/empty/repository.go @@ -1,8 +1,9 @@ package empty import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" - "github.com/open-component-model/ocm/pkg/errors" ) type Repository struct { diff --git a/pkg/contexts/oci/repositories/ocireg/blobs.go b/pkg/contexts/oci/repositories/ocireg/blobs.go index df91f70f8f..40f773576c 100644 --- a/pkg/contexts/oci/repositories/ocireg/blobs.go +++ b/pkg/contexts/oci/repositories/ocireg/blobs.go @@ -4,6 +4,7 @@ import ( "sync" "github.com/containerd/containerd/remotes" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/sirupsen/logrus" @@ -11,7 +12,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/attrs/cacheattr" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/docker/resolve" - "github.com/open-component-model/ocm/pkg/errors" ) type BlobContainer interface { diff --git a/pkg/contexts/oci/repositories/ocireg/namespace.go b/pkg/contexts/oci/repositories/ocireg/namespace.go index a565df262b..cab9245d2f 100644 --- a/pkg/contexts/oci/repositories/ocireg/namespace.go +++ b/pkg/contexts/oci/repositories/ocireg/namespace.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/containerd/containerd/errdefs" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -15,7 +16,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi/support" "github.com/open-component-model/ocm/pkg/docker/resolve" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/logging" ) diff --git a/pkg/contexts/oci/repositories/ocireg/repository.go b/pkg/contexts/oci/repositories/ocireg/repository.go index 96590b770a..a967d1940d 100644 --- a/pkg/contexts/oci/repositories/ocireg/repository.go +++ b/pkg/contexts/oci/repositories/ocireg/repository.go @@ -9,6 +9,7 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/remotes/docker/config" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/logging" "github.com/open-component-model/ocm/pkg/contexts/credentials" @@ -18,7 +19,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/docker" "github.com/open-component-model/ocm/pkg/docker/resolve" - "github.com/open-component-model/ocm/pkg/errors" ocmlog "github.com/open-component-model/ocm/pkg/logging" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/utils" diff --git a/pkg/contexts/oci/session.go b/pkg/contexts/oci/session.go index 0227a3bfa8..1ef40a75c6 100644 --- a/pkg/contexts/oci/session.go +++ b/pkg/contexts/oci/session.go @@ -4,8 +4,9 @@ import ( "encoding/json" "reflect" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/errors" ) type NamespaceContainer interface { diff --git a/pkg/contexts/oci/transfer/transfer.go b/pkg/contexts/oci/transfer/transfer.go index ad4b569038..de7d1bf608 100644 --- a/pkg/contexts/oci/transfer/transfer.go +++ b/pkg/contexts/oci/transfer/transfer.go @@ -1,13 +1,13 @@ package transfer import ( + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/generics" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/oci/transfer/filters" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/logging" ) diff --git a/pkg/contexts/oci/transfer/transfer_test.go b/pkg/contexts/oci/transfer/transfer_test.go index c16e1e2164..80e00627c8 100644 --- a/pkg/contexts/oci/transfer/transfer_test.go +++ b/pkg/contexts/oci/transfer/transfer_test.go @@ -7,13 +7,14 @@ import ( . "github.com/open-component-model/ocm/pkg/env/builder" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ctf" "github.com/open-component-model/ocm/pkg/contexts/oci/transfer" "github.com/open-component-model/ocm/pkg/contexts/oci/transfer/filters" - "github.com/open-component-model/ocm/pkg/finalizer" ) const OUT = "/tmp/res" diff --git a/pkg/contexts/ocm/accessmethods/github/method.go b/pkg/contexts/ocm/accessmethods/github/method.go index 36de16863f..08fc0cbc6e 100644 --- a/pkg/contexts/ocm/accessmethods/github/method.go +++ b/pkg/contexts/ocm/accessmethods/github/method.go @@ -11,6 +11,7 @@ import ( "unicode" "github.com/google/go-github/v45/github" + "github.com/mandelsoft/goutils/errors" "golang.org/x/oauth2" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -21,7 +22,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/github/identity" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/accessmethods/helm/method.go b/pkg/contexts/ocm/accessmethods/helm/method.go index 4b38325d16..a1cc57e7ac 100644 --- a/pkg/contexts/ocm/accessmethods/helm/method.go +++ b/pkg/contexts/ocm/accessmethods/helm/method.go @@ -6,12 +6,13 @@ import ( "strings" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/helm/identity" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/helm" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/accessmethods/localblob/method.go b/pkg/contexts/ocm/accessmethods/localblob/method.go index 5ebc235261..363a7a8b1f 100644 --- a/pkg/contexts/ocm/accessmethods/localblob/method.go +++ b/pkg/contexts/ocm/accessmethods/localblob/method.go @@ -4,7 +4,7 @@ import ( "encoding/json" "fmt" - . "github.com/open-component-model/ocm/pkg/exception" + . "github.com/mandelsoft/goutils/exception" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/mime" diff --git a/pkg/contexts/ocm/accessmethods/localfsblob/method.go b/pkg/contexts/ocm/accessmethods/localfsblob/method.go index ecf9f4b51b..ae0bdf838a 100644 --- a/pkg/contexts/ocm/accessmethods/localfsblob/method.go +++ b/pkg/contexts/ocm/accessmethods/localfsblob/method.go @@ -1,7 +1,7 @@ package localfsblob import ( - . "github.com/open-component-model/ocm/pkg/exception" + . "github.com/mandelsoft/goutils/exception" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localblob" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" diff --git a/pkg/contexts/ocm/accessmethods/localociblob/method.go b/pkg/contexts/ocm/accessmethods/localociblob/method.go index b5165f1639..8ea9e3ef10 100644 --- a/pkg/contexts/ocm/accessmethods/localociblob/method.go +++ b/pkg/contexts/ocm/accessmethods/localociblob/method.go @@ -1,7 +1,7 @@ package localociblob import ( - . "github.com/open-component-model/ocm/pkg/exception" + . "github.com/mandelsoft/goutils/exception" "github.com/opencontainers/go-digest" diff --git a/pkg/contexts/ocm/accessmethods/none/method.go b/pkg/contexts/ocm/accessmethods/none/method.go index 0feef44a51..f86dd441be 100644 --- a/pkg/contexts/ocm/accessmethods/none/method.go +++ b/pkg/contexts/ocm/accessmethods/none/method.go @@ -3,9 +3,10 @@ package none import ( "io" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/accessmethods/npm/method.go b/pkg/contexts/ocm/accessmethods/npm/method.go index 7a940eade1..fcf60cc67b 100644 --- a/pkg/contexts/ocm/accessmethods/npm/method.go +++ b/pkg/contexts/ocm/accessmethods/npm/method.go @@ -11,6 +11,7 @@ import ( "path" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -19,7 +20,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/iotools" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/npm" diff --git a/pkg/contexts/ocm/accessmethods/ociartifact/method.go b/pkg/contexts/ocm/accessmethods/ociartifact/method.go index 6e08b7cff1..16e6c90991 100644 --- a/pkg/contexts/ocm/accessmethods/ociartifact/method.go +++ b/pkg/contexts/ocm/accessmethods/ociartifact/method.go @@ -6,8 +6,10 @@ import ( "strings" "sync" - . "github.com/open-component-model/ocm/pkg/finalizer" + . "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -20,10 +22,8 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ocireg" ocmcpi "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/logging" "github.com/open-component-model/ocm/pkg/runtime" - "github.com/open-component-model/ocm/pkg/utils" ) // Type is the access type of a oci registry. @@ -172,7 +172,7 @@ func NewMethod(ctx accspeccpi.ContextProvider, a accspeccpi.AccessSpec, ref stri reference: ref, ctx: ctx.OCMContext(), } - return accspeccpi.AccessMethodForImplementation(m, m.eval(utils.Optional(repo...))) + return accspeccpi.AccessMethodForImplementation(m, m.eval(general.Optional(repo...))) } func (_ *accessMethod) IsLocal() bool { diff --git a/pkg/contexts/ocm/accessmethods/ociblob/method.go b/pkg/contexts/ocm/accessmethods/ociblob/method.go index 92741361be..81fa19c623 100644 --- a/pkg/contexts/ocm/accessmethods/ociblob/method.go +++ b/pkg/contexts/ocm/accessmethods/ociblob/method.go @@ -5,6 +5,7 @@ import ( "io" "sync" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -13,7 +14,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ocireg" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/accessmethods/options/registry.go b/pkg/contexts/ocm/accessmethods/options/registry.go index 25942474a1..7020df0a4e 100644 --- a/pkg/contexts/ocm/accessmethods/options/registry.go +++ b/pkg/contexts/ocm/accessmethods/options/registry.go @@ -3,7 +3,8 @@ package options import ( "sync" - errors "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/ocm/accessmethods/plugin/method.go b/pkg/contexts/ocm/accessmethods/plugin/method.go index 5e329e2b62..0958040bc2 100644 --- a/pkg/contexts/ocm/accessmethods/plugin/method.go +++ b/pkg/contexts/ocm/accessmethods/plugin/method.go @@ -5,6 +5,8 @@ import ( "io" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/credentials" @@ -13,7 +15,6 @@ import ( cpi "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/accessmethods/plugin/plugin.go b/pkg/contexts/ocm/accessmethods/plugin/plugin.go index 34904569e4..366f794abf 100644 --- a/pkg/contexts/ocm/accessmethods/plugin/plugin.go +++ b/pkg/contexts/ocm/accessmethods/plugin/plugin.go @@ -4,6 +4,8 @@ import ( "bytes" "encoding/json" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/credentials/identity/hostpath" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" @@ -11,7 +13,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/errkind" ) type plug = plugin.Plugin @@ -48,7 +50,7 @@ func (p *PluginHandler) Info(spec *AccessSpec) (*ppi.AccessSpecInfo, error) { func (p *PluginHandler) AccessMethod(spec *AccessSpec, cv cpi.ComponentVersionAccess) (cpi.AccessMethod, error) { mspec := p.GetAccessMethodDescriptor(spec.GetKind(), spec.GetVersion()) if mspec == nil { - return nil, errors.ErrNotFound(errors.KIND_ACCESSMETHOD, spec.GetType(), descriptor.KIND_PLUGIN, p.Name()) + return nil, errors.ErrNotFound(errkind.KIND_ACCESSMETHOD, spec.GetType(), descriptor.KIND_PLUGIN, p.Name()) } creddata, err := p.getCredentialData(spec, cv) diff --git a/pkg/contexts/ocm/accessmethods/relativeociref/method_test.go b/pkg/contexts/ocm/accessmethods/relativeociref/method_test.go index a0bffd84d3..3a6fe0412a 100644 --- a/pkg/contexts/ocm/accessmethods/relativeociref/method_test.go +++ b/pkg/contexts/ocm/accessmethods/relativeociref/method_test.go @@ -7,6 +7,8 @@ import ( . "github.com/open-component-model/ocm/pkg/env/builder" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" @@ -15,7 +17,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/finalizer" ) const OCIPATH = "/tmp/oci" diff --git a/pkg/contexts/ocm/accessmethods/s3/method.go b/pkg/contexts/ocm/accessmethods/s3/method.go index 8a1ffc45a9..91cb1db275 100644 --- a/pkg/contexts/ocm/accessmethods/s3/method.go +++ b/pkg/contexts/ocm/accessmethods/s3/method.go @@ -3,7 +3,7 @@ package s3 import ( "fmt" - . "github.com/open-component-model/ocm/pkg/exception" + . "github.com/mandelsoft/goutils/exception" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessio" diff --git a/pkg/contexts/ocm/accessmethods/s3/method_test.go b/pkg/contexts/ocm/accessmethods/s3/method_test.go index 086fd27697..42679b3910 100644 --- a/pkg/contexts/ocm/accessmethods/s3/method_test.go +++ b/pkg/contexts/ocm/accessmethods/s3/method_test.go @@ -13,6 +13,7 @@ import ( . "github.com/open-component-model/ocm/pkg/testutils" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/general" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" @@ -25,7 +26,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/s3" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/s3/identity" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/generics" ) type mockDownloader struct { @@ -49,7 +49,7 @@ func checkMarshal(spec *s3.AccessSpec, typ string, fmt string) { n := MustWithOffset(1, Calling(ocm.DefaultContext().AccessSpecForConfig(data, nil))) Expect(reflect.TypeOf(n)).To(Equal(reflect.TypeOf(spec))) - Expect(n.GetType()).To(Equal(generics.Conditional(typ == "", s3.Type, typ))) + Expect(n.GetType()).To(Equal(general.Conditional(typ == "", s3.Type, typ))) data2 := Must(json.Marshal(n)) ExpectWithOffset(1, string(data2)).To(StringEqualWithContext(string(data))) } diff --git a/pkg/contexts/ocm/accessmethods/s3/v1.go b/pkg/contexts/ocm/accessmethods/s3/v1.go index e683e8ceb5..174c9a520a 100644 --- a/pkg/contexts/ocm/accessmethods/s3/v1.go +++ b/pkg/contexts/ocm/accessmethods/s3/v1.go @@ -1,7 +1,7 @@ package s3 import ( - . "github.com/open-component-model/ocm/pkg/exception" + . "github.com/mandelsoft/goutils/exception" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" diff --git a/pkg/contexts/ocm/accessmethods/s3/v2.go b/pkg/contexts/ocm/accessmethods/s3/v2.go index 03be159842..84a377d689 100644 --- a/pkg/contexts/ocm/accessmethods/s3/v2.go +++ b/pkg/contexts/ocm/accessmethods/s3/v2.go @@ -1,7 +1,7 @@ package s3 import ( - . "github.com/open-component-model/ocm/pkg/exception" + . "github.com/mandelsoft/goutils/exception" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" diff --git a/pkg/contexts/ocm/actionhandler/plugin/actionhandler.go b/pkg/contexts/ocm/actionhandler/plugin/actionhandler.go index a2ce7956b3..453137c5e1 100644 --- a/pkg/contexts/ocm/actionhandler/plugin/actionhandler.go +++ b/pkg/contexts/ocm/actionhandler/plugin/actionhandler.go @@ -3,11 +3,12 @@ package plugin import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/datacontext/action" "github.com/open-component-model/ocm/pkg/contexts/datacontext/action/handlers" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin" - "github.com/open-component-model/ocm/pkg/errors" ) // pluginHandler delegates action to a plugin based handler. diff --git a/pkg/contexts/ocm/actionhandler/plugin/registration.go b/pkg/contexts/ocm/actionhandler/plugin/registration.go index 220dfd9f42..a9facaec6f 100644 --- a/pkg/contexts/ocm/actionhandler/plugin/registration.go +++ b/pkg/contexts/ocm/actionhandler/plugin/registration.go @@ -3,12 +3,13 @@ package plugin import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/datacontext/action/handlers" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugincacheattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/registrations" ) diff --git a/pkg/contexts/ocm/attrs/hashattr/config.go b/pkg/contexts/ocm/attrs/hashattr/config.go index a69f04b0ab..53b517095a 100644 --- a/pkg/contexts/ocm/attrs/hashattr/config.go +++ b/pkg/contexts/ocm/attrs/hashattr/config.go @@ -1,8 +1,9 @@ package hashattr import ( + "github.com/mandelsoft/goutils/errors" + cfgcpi "github.com/open-component-model/ocm/pkg/contexts/config/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/listformat" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/signing" diff --git a/pkg/contexts/ocm/attrs/mapocirepoattr/attr.go b/pkg/contexts/ocm/attrs/mapocirepoattr/attr.go index 0800f74ff8..d4babcc18d 100644 --- a/pkg/contexts/ocm/attrs/mapocirepoattr/attr.go +++ b/pkg/contexts/ocm/attrs/mapocirepoattr/attr.go @@ -6,11 +6,11 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" "golang.org/x/exp/maps" "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/oci/grammar" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/ocm/attrs/ociuploadattr/attr.go b/pkg/contexts/ocm/attrs/ociuploadattr/attr.go index e72c6aa02c..4fcf6dfeb3 100644 --- a/pkg/contexts/ocm/attrs/ociuploadattr/attr.go +++ b/pkg/contexts/ocm/attrs/ociuploadattr/attr.go @@ -6,11 +6,12 @@ import ( "strings" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/oci" ocicpi "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/attrs/plugindirattr/attr.go b/pkg/contexts/ocm/attrs/plugindirattr/attr.go index 1b2615fa89..5dbaf7edef 100644 --- a/pkg/contexts/ocm/attrs/plugindirattr/attr.go +++ b/pkg/contexts/ocm/attrs/plugindirattr/attr.go @@ -26,11 +26,7 @@ func init() { } func DefaultDir(fs vfs.FileSystem) string { - home, err := os.UserHomeDir() - if err != nil { - return "" - } - + home, _ := os.UserHomeDir() // use home if provided if home != "" { dir := filepath.Join(home, DEFAULT_PLUGIN_DIR) if ok, err := vfs.DirExists(fs, dir); ok && err == nil { diff --git a/pkg/contexts/ocm/attrs/signingattr/attr.go b/pkg/contexts/ocm/attrs/signingattr/attr.go index 1a86d62185..d6fe339e3e 100644 --- a/pkg/contexts/ocm/attrs/signingattr/attr.go +++ b/pkg/contexts/ocm/attrs/signingattr/attr.go @@ -1,9 +1,10 @@ package signingattr import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" ocm "github.com/open-component-model/ocm/pkg/contexts/ocm/context" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/signing" ) diff --git a/pkg/contexts/ocm/attrs/signingattr/config.go b/pkg/contexts/ocm/attrs/signingattr/config.go index c6545f2c52..60d85c7482 100644 --- a/pkg/contexts/ocm/attrs/signingattr/config.go +++ b/pkg/contexts/ocm/attrs/signingattr/config.go @@ -6,13 +6,13 @@ import ( "encoding/json" "encoding/pem" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "golang.org/x/exp/slices" cfgcpi "github.com/open-component-model/ocm/pkg/contexts/config/cpi" "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/rootcertsattr" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/signutils" diff --git a/pkg/contexts/ocm/blobhandler/config/type.go b/pkg/contexts/ocm/blobhandler/config/type.go index 9313384d44..12a8f4bfc7 100644 --- a/pkg/contexts/ocm/blobhandler/config/type.go +++ b/pkg/contexts/ocm/blobhandler/config/type.go @@ -3,12 +3,13 @@ package config import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/config" cfgcpi "github.com/open-component-model/ocm/pkg/contexts/config/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/download" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration.go b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration.go index ba729fe4e4..40027a509e 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration.go @@ -4,9 +4,10 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/registrations" ) diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/blobhandler.go index 4af29ef562..56555c5f5b 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/blobhandler.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/blobhandler.go @@ -5,6 +5,9 @@ import ( "path" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/sliceutils" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/oci" @@ -13,8 +16,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/ociartifact" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/ociuploadattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/utils" ) @@ -71,7 +72,7 @@ func (b *artifactHandler) StoreBlob(blob cpi.BlobAccess, artType, hint string, g if m, ok := blob.(blobaccess.AnnotatedBlobAccess[cpi.AccessMethod]); ok { // prepare for optimized point to point implementation cpi.BlobHandlerLogger(ctx.GetContext()).Debug("oci generic artifact handler with ocm access source", - generics.AppendedSlice[any](values, "sourcetype", m.Source().AccessSpec().GetType())..., + sliceutils.CopyAppend[any](values, "sourcetype", m.Source().AccessSpec().GetType())..., ) } else { cpi.BlobHandlerLogger(ctx.GetContext()).Debug("oci generic artifact handler", values...) diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/registration.go b/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/registration.go index afcd30713b..2b79358162 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/registration.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo/registration.go @@ -3,10 +3,11 @@ package ocirepo import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/ociuploadattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/listformat" "github.com/open-component-model/ocm/pkg/registrations" ) diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/blobhandler.go index 05c88206d5..dd259c4f04 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/blobhandler.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/blobhandler.go @@ -3,13 +3,14 @@ package plugin import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/credentials/identity/hostpath" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" - "github.com/open-component-model/ocm/pkg/errors" ) // pluginHandler delegates storage of blobs to a plugin based handler. diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/registration.go b/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/registration.go index 5b1d40d751..4379f4906f 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/registration.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/plugin/registration.go @@ -5,11 +5,12 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugincacheattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/registrations" ) diff --git a/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/blobhandler.go index 9eaabfa6bf..f9da21dd45 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/blobhandler.go +++ b/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo/blobhandler.go @@ -5,8 +5,10 @@ import ( "path" "strings" - . "github.com/open-component-model/ocm/pkg/finalizer" + . "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/sliceutils" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -27,8 +29,6 @@ import ( storagecontext "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/oci" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" ) func init() { @@ -89,7 +89,7 @@ func (b *blobHandler) StoreBlob(blob cpi.BlobAccess, artType, hint string, globa } if m, ok := blob.(blobaccess.AnnotatedBlobAccess[accspeccpi.AccessMethodView]); ok { cpi.BlobHandlerLogger(ctx.GetContext()).Debug("oci blob handler with ocm access source", - generics.AppendedSlice[any](values, "sourcetype", m.Source().AccessSpec().GetType())..., + sliceutils.CopyAppend[any](values, "sourcetype", m.Source().AccessSpec().GetType())..., ) } else { cpi.BlobHandlerLogger(ctx.GetContext()).Debug("oci blob handler", values...) @@ -182,11 +182,11 @@ func (b *artifactHandler) CheckBlob(blob cpi.BlobAccess, artType, hint string, g name = path.Join(prefix, mapped) if mapped == orig { log.Debug("namespace derived from hint", - generics.AppendedSlice[any](values, "namespace", name), + sliceutils.CopyAppend[any](values, "namespace", name), ) } else { log.Debug("mapped namespace derived from hint", - generics.AppendedSlice[any](values, "namespace", name), + sliceutils.CopyAppend[any](values, "namespace", name), ) } @@ -231,7 +231,7 @@ func (b *artifactHandler) StoreBlob(blob cpi.BlobAccess, artType, hint string, g if m, ok := blob.(blobaccess.AnnotatedBlobAccess[accspeccpi.AccessMethodView]); ok { // prepare for optimized point to point implementation log.Debug("oci artifact handler with ocm access source", - generics.AppendedSlice[any](values, "sourcetype", m.Source().AccessSpec().GetType())..., + sliceutils.CopyAppend[any](values, "sourcetype", m.Source().AccessSpec().GetType())..., ) if ocimeth, ok := m.Source().Unwrap().(ociartifact.AccessMethodImpl); !keep && ok { art, _, err = ocimeth.GetArtifact() @@ -283,11 +283,11 @@ func (b *artifactHandler) StoreBlob(blob cpi.BlobAccess, artType, hint string, g name = path.Join(prefix, mapped) if mapped == orig { log.Debug("namespace derived from hint", - generics.AppendedSlice[any](values, "namespace", name), + sliceutils.CopyAppend[any](values, "namespace", name), ) } else { log.Debug("mapped namespace derived from hint", - generics.AppendedSlice[any](values, "namespace", name), + sliceutils.CopyAppend[any](values, "namespace", name), ) } diff --git a/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/blobhandler.go index 2c7d2b7d1a..69de1eb504 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/blobhandler.go +++ b/pkg/contexts/ocm/blobhandler/handlers/ocm/comparch/blobhandler.go @@ -3,6 +3,7 @@ package comparch import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/common" @@ -12,7 +13,6 @@ import ( storagecontext "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/comparch" - "github.com/open-component-model/ocm/pkg/errors" ) func init() { diff --git a/pkg/contexts/ocm/compdesc/componentdescriptor.go b/pkg/contexts/ocm/compdesc/componentdescriptor.go index b35b4d9b6d..8f6ddf7a7d 100644 --- a/pkg/contexts/ocm/compdesc/componentdescriptor.go +++ b/pkg/contexts/ocm/compdesc/componentdescriptor.go @@ -5,9 +5,10 @@ import ( "reflect" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/equivalent" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/semverutils" ) diff --git a/pkg/contexts/ocm/compdesc/helper.go b/pkg/contexts/ocm/compdesc/helper.go index 9821eec90a..277395f7a0 100644 --- a/pkg/contexts/ocm/compdesc/helper.go +++ b/pkg/contexts/ocm/compdesc/helper.go @@ -4,9 +4,10 @@ import ( "bytes" "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/sliceutils" + v1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils/selector" ) @@ -213,7 +214,7 @@ func (cd *ComponentDescriptor) GetResourcesByType(rtype string, selectors ...Ide // GetResourcesByName returns all local and external resources with a name. func (cd *ComponentDescriptor) GetResourcesByName(name string, selectors ...IdentitySelector) (Resources, error) { return cd.GetResourcesBySelectors( - generics.AppendedSlice[IdentitySelector](selectors, ByName(name)), + sliceutils.CopyAppend[IdentitySelector](selectors, ByName(name)), nil) } @@ -340,7 +341,7 @@ func (cd *ComponentDescriptor) GetReferenceIndexByIdentity(id v1.Identity) int { // GetReferencesByName returns references that match the given name. func (cd *ComponentDescriptor) GetReferencesByName(name string, selectors ...IdentitySelector) (References, error) { return cd.GetReferencesBySelectors( - generics.AppendedSlice[IdentitySelector](selectors, ByName(name)), + sliceutils.CopyAppend[IdentitySelector](selectors, ByName(name)), nil) } diff --git a/pkg/contexts/ocm/compdesc/meta/v1/labels.go b/pkg/contexts/ocm/compdesc/meta/v1/labels.go index beba56a072..765bd5a2a2 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/labels.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/labels.go @@ -5,10 +5,10 @@ import ( "reflect" "regexp" + "github.com/mandelsoft/goutils/errors" "k8s.io/apimachinery/pkg/util/validation/field" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/equivalent" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/listformat" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/compdesc/meta/v1/types.go b/pkg/contexts/ocm/compdesc/meta/v1/types.go index a6e5055da1..11ee47c3fa 100644 --- a/pkg/contexts/ocm/compdesc/meta/v1/types.go +++ b/pkg/contexts/ocm/compdesc/meta/v1/types.go @@ -4,11 +4,11 @@ import ( "reflect" "time" + "github.com/mandelsoft/goutils/errors" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/validation/field" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/equivalent" - "github.com/open-component-model/ocm/pkg/errors" ) // These constants describe identity attributes predefined by the diff --git a/pkg/contexts/ocm/compdesc/normalization.go b/pkg/contexts/ocm/compdesc/normalization.go index 34bd6aacd2..5084f1ca89 100644 --- a/pkg/contexts/ocm/compdesc/normalization.go +++ b/pkg/contexts/ocm/compdesc/normalization.go @@ -4,7 +4,7 @@ import ( "sort" "sync" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) // NormalisationAlgorithm types and versions the algorithm used for digest generation. diff --git a/pkg/contexts/ocm/compdesc/normalizations/jsonv1/norm.go b/pkg/contexts/ocm/compdesc/normalizations/jsonv1/norm.go index 73c86518fe..e13971dba3 100644 --- a/pkg/contexts/ocm/compdesc/normalizations/jsonv1/norm.go +++ b/pkg/contexts/ocm/compdesc/normalizations/jsonv1/norm.go @@ -5,8 +5,10 @@ package jsonv1 import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/errkind" ) const Algorithm = compdesc.JsonNormalisationV1 @@ -21,7 +23,7 @@ func (m normalization) Normalize(cd *compdesc.ComponentDescriptor) ([]byte, erro cv := compdesc.DefaultSchemes[cd.SchemaVersion()] if cv == nil { if cv == nil { - return nil, errors.ErrNotSupported(errors.KIND_SCHEMAVERSION, cd.SchemaVersion()) + return nil, errors.ErrNotSupported(errkind.KIND_SCHEMAVERSION, cd.SchemaVersion()) } } v, err := cv.ConvertFrom(cd) diff --git a/pkg/contexts/ocm/compdesc/op.go b/pkg/contexts/ocm/compdesc/op.go index 2e83178f58..6289e4e5a5 100644 --- a/pkg/contexts/ocm/compdesc/op.go +++ b/pkg/contexts/ocm/compdesc/op.go @@ -3,7 +3,7 @@ package compdesc import ( "reflect" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/mandelsoft/goutils/sliceutils" ) // unfortunately this does not work as expected in Go, because result parameters @@ -13,13 +13,13 @@ import ( func And[T any](sel ...any) T { var r T h := selhandler[reflect.TypeOf(r)].(handler[T]) - return h.And(generics.ConvertSliceTo[T](sel)...) + return h.And(sliceutils.Convert[T](sel)...) } func Or[T any](sel ...any) T { var r T h := selhandler[reflect.TypeOf(r)].(handler[T]) - return h.Or(generics.ConvertSliceTo[T](sel)...) + return h.Or(sliceutils.Convert[T](sel)...) } func Not[T any](sel any) T { diff --git a/pkg/contexts/ocm/compdesc/schemes.go b/pkg/contexts/ocm/compdesc/schemes.go index c38f2a74ba..10f3865ee9 100644 --- a/pkg/contexts/ocm/compdesc/schemes.go +++ b/pkg/contexts/ocm/compdesc/schemes.go @@ -3,8 +3,10 @@ package compdesc import ( "sort" + "github.com/mandelsoft/goutils/errors" + metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/errkind" ) const DefaultSchemeVersion = "v2" @@ -70,7 +72,7 @@ func Decode(data []byte, opts ...DecodeOption) (*ComponentDescriptor, error) { } version := DefaultSchemes[scheme] if version == nil { - return nil, errors.ErrNotSupported(errors.KIND_SCHEMAVERSION, scheme) + return nil, errors.ErrNotSupported(errkind.KIND_SCHEMAVERSION, scheme) } versioned, err := version.Decode(data, o) @@ -160,7 +162,7 @@ func Convert(obj *ComponentDescriptor, opts ...EncodeOption) (ComponentDescripto cv := DefaultSchemes[o.SchemaVersion] if cv == nil { if cv == nil { - return nil, errors.ErrNotSupported(errors.KIND_SCHEMAVERSION, o.SchemaVersion) + return nil, errors.ErrNotSupported(errkind.KIND_SCHEMAVERSION, o.SchemaVersion) } } return cv.ConvertFrom(obj) diff --git a/pkg/contexts/ocm/compdesc/signing.go b/pkg/contexts/ocm/compdesc/signing.go index f21ccedc5a..9b9a50da3b 100644 --- a/pkg/contexts/ocm/compdesc/signing.go +++ b/pkg/contexts/ocm/compdesc/signing.go @@ -5,12 +5,13 @@ import ( "fmt" "hash" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" + "github.com/open-component-model/ocm/pkg/contexts/credentials" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/signutils" - "github.com/open-component-model/ocm/pkg/utils" ) const ( @@ -206,7 +207,7 @@ func Verify(cd *ComponentDescriptor, registry signing.Registry, signatureName st sctx := &signing.DefaultSigningContext{ Hash: hasher.Crypto(), PublicKey: publicKey, - RootCerts: utils.Optional(rootCA), + RootCerts: general.Optional(rootCA), Issuer: registry.GetIssuer(signatureName), } err := verifier.Verify(matchingSignature.Digest.Value, matchingSignature.ConvertToSigning(), sctx) diff --git a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/validation.go b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/validation.go index d0a3d81a23..cec517bfdb 100644 --- a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/validation.go +++ b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/validation.go @@ -3,11 +3,11 @@ package v3alpha1 import ( "fmt" + "github.com/mandelsoft/goutils/errors" "k8s.io/apimachinery/pkg/util/validation/field" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" ) // Validate validates a parsed v2 component descriptor. diff --git a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/version.go b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/version.go index c56c80095d..c86f35853c 100644 --- a/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/version.go +++ b/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/version.go @@ -1,10 +1,11 @@ package v3alpha1 import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/versions/ocm.software/v3alpha1/jsonscheme" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/compdesc/versions/v2/validation.go b/pkg/contexts/ocm/compdesc/versions/v2/validation.go index f788b8ef21..a8cceb784b 100644 --- a/pkg/contexts/ocm/compdesc/versions/v2/validation.go +++ b/pkg/contexts/ocm/compdesc/versions/v2/validation.go @@ -3,11 +3,11 @@ package v2 import ( "fmt" + "github.com/mandelsoft/goutils/errors" "k8s.io/apimachinery/pkg/util/validation/field" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" v1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" ) // Validate validates a parsed v2 component descriptor. diff --git a/pkg/contexts/ocm/compdesc/versions/v2/version.go b/pkg/contexts/ocm/compdesc/versions/v2/version.go index eb3ff15998..8ce8d94c74 100644 --- a/pkg/contexts/ocm/compdesc/versions/v2/version.go +++ b/pkg/contexts/ocm/compdesc/versions/v2/version.go @@ -3,10 +3,11 @@ package v2 import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/versions/v2/jsonscheme" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/cpi/compose_test.go b/pkg/contexts/ocm/cpi/compose_test.go index d95194395d..4e06b16a73 100644 --- a/pkg/contexts/ocm/cpi/compose_test.go +++ b/pkg/contexts/ocm/cpi/compose_test.go @@ -1,10 +1,10 @@ package cpi_test import ( + . "github.com/mandelsoft/goutils/finalizer" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/contexts/ocm/testhelper" - . "github.com/open-component-model/ocm/pkg/finalizer" . "github.com/open-component-model/ocm/pkg/testutils" "github.com/mandelsoft/vfs/pkg/memoryfs" diff --git a/pkg/contexts/ocm/cpi/dummy.go b/pkg/contexts/ocm/cpi/dummy.go index ef5422b6ba..6645d93e04 100644 --- a/pkg/contexts/ocm/cpi/dummy.go +++ b/pkg/contexts/ocm/cpi/dummy.go @@ -3,10 +3,11 @@ package cpi import ( "strconv" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/internal" - "github.com/open-component-model/ocm/pkg/errors" ) type DummyComponentVersionAccess struct { diff --git a/pkg/contexts/ocm/cpi/interface.go b/pkg/contexts/ocm/cpi/interface.go index 16ea177f7f..1e62109d1b 100644 --- a/pkg/contexts/ocm/cpi/interface.go +++ b/pkg/contexts/ocm/cpi/interface.go @@ -5,12 +5,12 @@ package cpi import ( _ "unsafe" + "github.com/mandelsoft/goutils/sliceutils" "github.com/mandelsoft/logging" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/internal" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/registrations" "github.com/open-component-model/ocm/pkg/runtime" ) @@ -23,7 +23,7 @@ var TAG_BLOBHANDLER = logging.DefineTag("blobhandler", "execution of blob handle func BlobHandlerLogger(ctx Context, messageContext ...logging.MessageContext) logging.Logger { if len(messageContext) > 0 { - messageContext = generics.AppendedSlice[logging.MessageContext](messageContext, TAG_BLOBHANDLER) + messageContext = sliceutils.CopyAppend[logging.MessageContext](messageContext, TAG_BLOBHANDLER) return ctx.Logger(messageContext...) } else { return ctx.Logger(TAG_BLOBHANDLER) diff --git a/pkg/contexts/ocm/cpi/repocpi/backend.go b/pkg/contexts/ocm/cpi/repocpi/backend.go index 52a4ea982f..380199473c 100644 --- a/pkg/contexts/ocm/cpi/repocpi/backend.go +++ b/pkg/contexts/ocm/cpi/repocpi/backend.go @@ -4,10 +4,11 @@ import ( "io" "sync/atomic" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/ocm/cpi/repocpi/blobcache.go b/pkg/contexts/ocm/cpi/repocpi/blobcache.go index 3b6881c139..63bc8b9513 100644 --- a/pkg/contexts/ocm/cpi/repocpi/blobcache.go +++ b/pkg/contexts/ocm/cpi/repocpi/blobcache.go @@ -3,8 +3,9 @@ package repocpi import ( "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/blobaccess" - "github.com/open-component-model/ocm/pkg/errors" ) type ( diff --git a/pkg/contexts/ocm/cpi/repocpi/bridge_c.go b/pkg/contexts/ocm/cpi/repocpi/bridge_c.go index c3508e643a..0a874218b4 100644 --- a/pkg/contexts/ocm/cpi/repocpi/bridge_c.go +++ b/pkg/contexts/ocm/cpi/repocpi/bridge_c.go @@ -3,12 +3,13 @@ package repocpi import ( "io" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/compositionmodeattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/refmgmt/resource" diff --git a/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go b/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go index 1cf9eaf2ac..d05e18fea1 100644 --- a/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go +++ b/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go @@ -6,6 +6,9 @@ import ( "io" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/common/accessio" @@ -16,11 +19,10 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/internal" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/refmgmt/resource" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" "github.com/open-component-model/ocm/pkg/utils" ) @@ -57,7 +59,7 @@ type _componentVersionAccessBridgeBase = resource.ResourceImplBase[cpi.Component // implement provider-agnostic parts of the ComponentVersionAccess API. type componentVersionAccessBridge struct { lock sync.Mutex - id finalizer.ObjectIdentity + id runtimefinalizer.ObjectIdentity *_componentVersionAccessBridgeBase ctx cpi.Context @@ -84,7 +86,7 @@ func newComponentVersionAccessBridge(name, version string, impl ComponentVersion } b := &componentVersionAccessBridge{ _componentVersionAccessBridgeBase: base, - id: finalizer.NewObjectIdentity(fmt.Sprintf("%s:%s", name, version)), + id: runtimefinalizer.NewObjectIdentity(fmt.Sprintf("%s:%s", name, version)), ctx: impl.GetContext(), name: name, version: version, diff --git a/pkg/contexts/ocm/cpi/repocpi/bridge_r.go b/pkg/contexts/ocm/cpi/repocpi/bridge_r.go index 1fa0f87ce8..127f14da78 100644 --- a/pkg/contexts/ocm/cpi/repocpi/bridge_r.go +++ b/pkg/contexts/ocm/cpi/repocpi/bridge_r.go @@ -3,8 +3,9 @@ package repocpi import ( "io" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/refmgmt/resource" "github.com/open-component-model/ocm/pkg/utils" diff --git a/pkg/contexts/ocm/cpi/repocpi/view_c.go b/pkg/contexts/ocm/cpi/repocpi/view_c.go index 6bd46e2ec9..a35db654fd 100644 --- a/pkg/contexts/ocm/cpi/repocpi/view_c.go +++ b/pkg/contexts/ocm/cpi/repocpi/view_c.go @@ -4,9 +4,10 @@ import ( "fmt" "io" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/refmgmt/resource" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/ocm/cpi/repocpi/view_cv.go b/pkg/contexts/ocm/cpi/repocpi/view_cv.go index 45ea3c3518..7b5aa395c7 100644 --- a/pkg/contexts/ocm/cpi/repocpi/view_cv.go +++ b/pkg/contexts/ocm/cpi/repocpi/view_cv.go @@ -5,6 +5,8 @@ import ( "io" "strconv" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/common/accessio" @@ -15,7 +17,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/internal" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/refmgmt/resource" "github.com/open-component-model/ocm/pkg/utils" diff --git a/pkg/contexts/ocm/cpi/repocpi/view_r.go b/pkg/contexts/ocm/cpi/repocpi/view_r.go index b1eb6af885..65d067f6b1 100644 --- a/pkg/contexts/ocm/cpi/repocpi/view_r.go +++ b/pkg/contexts/ocm/cpi/repocpi/view_r.go @@ -4,9 +4,10 @@ import ( "fmt" "io" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/refmgmt/resource" "github.com/open-component-model/ocm/pkg/utils" diff --git a/pkg/contexts/ocm/cpi/view_rsc.go b/pkg/contexts/ocm/cpi/view_rsc.go index 3e451581e9..c4e83044a4 100644 --- a/pkg/contexts/ocm/cpi/view_rsc.go +++ b/pkg/contexts/ocm/cpi/view_rsc.go @@ -3,6 +3,8 @@ package cpi import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" @@ -10,7 +12,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" cpi "github.com/open-component-model/ocm/pkg/contexts/ocm/internal" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" - "github.com/open-component-model/ocm/pkg/errors" ) //////////////////////////////////////////////////////////////////////////////// diff --git a/pkg/contexts/ocm/digester/digesters/artifact/digester.go b/pkg/contexts/ocm/digester/digesters/artifact/digester.go index ca576bc622..40c67dc4d8 100644 --- a/pkg/contexts/ocm/digester/digesters/artifact/digester.go +++ b/pkg/contexts/ocm/digester/digesters/artifact/digester.go @@ -5,6 +5,8 @@ import ( "fmt" "io" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -14,11 +16,9 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/ociartifact" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/hasher/sha256" "github.com/open-component-model/ocm/pkg/signing/hasher/sha512" - "github.com/open-component-model/ocm/pkg/utils" ) const OciArtifactDigestV1 string = "ociArtifactDigest/v1" @@ -38,7 +38,7 @@ func init() { } func New(algo string, ts ...string) cpi.BlobDigester { - norm := utils.OptionalDefaulted(OciArtifactDigestV1, ts...) + norm := general.OptionalDefaulted(OciArtifactDigestV1, ts...) return &Digester{ cpi.DigesterType{ HashAlgorithm: algo, diff --git a/pkg/contexts/ocm/download/config/type.go b/pkg/contexts/ocm/download/config/type.go index eb75cdd5b8..c13f390f38 100644 --- a/pkg/contexts/ocm/download/config/type.go +++ b/pkg/contexts/ocm/download/config/type.go @@ -3,11 +3,12 @@ package config import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/config" cfgcpi "github.com/open-component-model/ocm/pkg/contexts/config/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/download" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/download/handlers/blob/handler.go b/pkg/contexts/ocm/download/handlers/blob/handler.go index bc71026618..f18080fd96 100644 --- a/pkg/contexts/ocm/download/handlers/blob/handler.go +++ b/pkg/contexts/ocm/download/handlers/blob/handler.go @@ -3,12 +3,12 @@ package blob import ( "io" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/download" - "github.com/open-component-model/ocm/pkg/errors" ) type Handler struct{} diff --git a/pkg/contexts/ocm/download/handlers/blueprint/extractor.go b/pkg/contexts/ocm/download/handlers/blueprint/extractor.go index 7b37837f48..f31a355469 100644 --- a/pkg/contexts/ocm/download/handlers/blueprint/extractor.go +++ b/pkg/contexts/ocm/download/handlers/blueprint/extractor.go @@ -1,6 +1,7 @@ package blueprint import ( + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/vfs/pkg/projectionfs" "github.com/mandelsoft/vfs/pkg/vfs" @@ -10,7 +11,6 @@ import ( "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/common/compression" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/artifactset" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/utils/tarutils" ) diff --git a/pkg/contexts/ocm/download/handlers/blueprint/handler.go b/pkg/contexts/ocm/download/handlers/blueprint/handler.go index 4ff1cd2bcd..afe36ffe04 100644 --- a/pkg/contexts/ocm/download/handlers/blueprint/handler.go +++ b/pkg/contexts/ocm/download/handlers/blueprint/handler.go @@ -1,6 +1,8 @@ package blueprint import ( + "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/set" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -9,8 +11,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" registry "github.com/open-component-model/ocm/pkg/contexts/ocm/download" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/finalizer" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/utils" ) @@ -29,7 +29,7 @@ var ( ) type Handler struct { - ociConfigMimeTypes generics.Set[string] + ociConfigMimeTypes set.Set[string] } func init() { @@ -58,7 +58,7 @@ func New(configmimetypes ...string) *Handler { configmimetypes = []string{CONFIG_MIME_TYPE} } return &Handler{ - ociConfigMimeTypes: generics.NewSet[string](configmimetypes...), + ociConfigMimeTypes: set.New[string](configmimetypes...), } } diff --git a/pkg/contexts/ocm/download/handlers/blueprint/registration.go b/pkg/contexts/ocm/download/handlers/blueprint/registration.go index 1bf5c3318a..903f029ea9 100644 --- a/pkg/contexts/ocm/download/handlers/blueprint/registration.go +++ b/pkg/contexts/ocm/download/handlers/blueprint/registration.go @@ -4,11 +4,11 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/download" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/listformat" "github.com/open-component-model/ocm/pkg/registrations" "github.com/open-component-model/ocm/pkg/utils" diff --git a/pkg/contexts/ocm/download/handlers/dirtree/handler.go b/pkg/contexts/ocm/download/handlers/dirtree/handler.go index c6e766372f..616c3fe579 100644 --- a/pkg/contexts/ocm/download/handlers/dirtree/handler.go +++ b/pkg/contexts/ocm/download/handlers/dirtree/handler.go @@ -5,6 +5,10 @@ import ( "io" "os" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/general" + "github.com/mandelsoft/goutils/set" "github.com/mandelsoft/vfs/pkg/layerfs" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/projectionfs" @@ -21,12 +25,8 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/download" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/iotools" "github.com/open-component-model/ocm/pkg/mime" - "github.com/open-component-model/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/utils/tarutils" ) @@ -45,16 +45,16 @@ func SupportedMimeTypes() []string { } type Handler struct { - ociConfigtypes generics.Set[string] + ociConfigtypes set.Set[string] archive bool } func New(mimetypes ...string) *Handler { - if len(mimetypes) == 0 || utils.Optional(mimetypes...) == "" { + if len(mimetypes) == 0 || general.Optional(mimetypes...) == "" { mimetypes = []string{artdesc.MediaTypeImageConfig} } return &Handler{ - ociConfigtypes: generics.NewSet[string](mimetypes...), + ociConfigtypes: set.New[string](mimetypes...), } } diff --git a/pkg/contexts/ocm/download/handlers/dirtree/registration.go b/pkg/contexts/ocm/download/handlers/dirtree/registration.go index 6748bac475..9a0f84c20b 100644 --- a/pkg/contexts/ocm/download/handlers/dirtree/registration.go +++ b/pkg/contexts/ocm/download/handlers/dirtree/registration.go @@ -3,12 +3,12 @@ package dirtree import ( "fmt" + "github.com/mandelsoft/goutils/errors" ociv1 "github.com/opencontainers/image-spec/specs-go/v1" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/download" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/listformat" "github.com/open-component-model/ocm/pkg/registrations" ) diff --git a/pkg/contexts/ocm/download/handlers/executable/handler.go b/pkg/contexts/ocm/download/handlers/executable/handler.go index 5cb93ab340..3384bbd730 100644 --- a/pkg/contexts/ocm/download/handlers/executable/handler.go +++ b/pkg/contexts/ocm/download/handlers/executable/handler.go @@ -3,6 +3,7 @@ package executable import ( "io" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common" @@ -10,7 +11,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/download" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/mime" ) diff --git a/pkg/contexts/ocm/download/handlers/helm/download.go b/pkg/contexts/ocm/download/handlers/helm/download.go index 480e7ddbce..c8fd341e0b 100644 --- a/pkg/contexts/ocm/download/handlers/helm/download.go +++ b/pkg/contexts/ocm/download/handlers/helm/download.go @@ -3,6 +3,8 @@ package helm import ( "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common" @@ -11,8 +13,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/artifactset" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" ) func Download(p common.Printer, ctx oci.Context, ref string, path string, fs vfs.FileSystem, creds ...credentials.CredentialsSource) error { diff --git a/pkg/contexts/ocm/download/handlers/helm/handler.go b/pkg/contexts/ocm/download/handlers/helm/handler.go index cc190dccb3..cc6a83ca50 100644 --- a/pkg/contexts/ocm/download/handlers/helm/handler.go +++ b/pkg/contexts/ocm/download/handlers/helm/handler.go @@ -4,6 +4,8 @@ import ( "io" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/vfs/pkg/vfs" helmregistry "helm.sh/helm/v3/pkg/registry" @@ -17,8 +19,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" registry "github.com/open-component-model/ocm/pkg/contexts/ocm/download" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" ) diff --git a/pkg/contexts/ocm/download/handlers/ocirepo/handler.go b/pkg/contexts/ocm/download/handlers/ocirepo/handler.go index db2f44e55f..d5f12b7642 100644 --- a/pkg/contexts/ocm/download/handlers/ocirepo/handler.go +++ b/pkg/contexts/ocm/download/handlers/ocirepo/handler.go @@ -4,6 +4,9 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/general" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common" @@ -19,9 +22,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/download" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" - "github.com/open-component-model/ocm/pkg/utils" ) //////////////////////////////////////////////////////////////////////////////// @@ -31,7 +31,7 @@ type handler struct { } func New(repospec ...*ociuploadattr.Attribute) download.Handler { - return &handler{spec: utils.Optional(repospec...)} + return &handler{spec: general.Optional(repospec...)} } func (h *handler) Download(p common.Printer, racc cpi.ResourceAccess, path string, fs vfs.FileSystem) (accepted bool, target string, err error) { diff --git a/pkg/contexts/ocm/download/handlers/ocirepo/registration.go b/pkg/contexts/ocm/download/handlers/ocirepo/registration.go index a98e1930ff..acf396ba7c 100644 --- a/pkg/contexts/ocm/download/handlers/ocirepo/registration.go +++ b/pkg/contexts/ocm/download/handlers/ocirepo/registration.go @@ -3,6 +3,7 @@ package ocirepo import ( "fmt" + "github.com/mandelsoft/goutils/errors" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" @@ -10,7 +11,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/ociuploadattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/download" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/listformat" "github.com/open-component-model/ocm/pkg/registrations" ) diff --git a/pkg/contexts/ocm/download/handlers/plugin/handler.go b/pkg/contexts/ocm/download/handlers/plugin/handler.go index 87295cfc77..220e56ea8a 100644 --- a/pkg/contexts/ocm/download/handlers/plugin/handler.go +++ b/pkg/contexts/ocm/download/handlers/plugin/handler.go @@ -1,6 +1,8 @@ package plugin import ( + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common" @@ -9,8 +11,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/download" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" ) // pluginHandler delegates download format of artifacts to a plugin based handler. diff --git a/pkg/contexts/ocm/download/handlers/plugin/registration.go b/pkg/contexts/ocm/download/handlers/plugin/registration.go index 7442d5570c..d5394568e3 100644 --- a/pkg/contexts/ocm/download/handlers/plugin/registration.go +++ b/pkg/contexts/ocm/download/handlers/plugin/registration.go @@ -5,13 +5,13 @@ import ( "fmt" "github.com/ghodss/yaml" + "github.com/mandelsoft/goutils/errors" "github.com/xeipuuv/gojsonschema" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/plugincacheattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/download" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/registrations" ) diff --git a/pkg/contexts/ocm/download/registry.go b/pkg/contexts/ocm/download/registry.go index a1abd91233..62a3ba8391 100644 --- a/pkg/contexts/ocm/download/registry.go +++ b/pkg/contexts/ocm/download/registry.go @@ -4,16 +4,16 @@ import ( "sort" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/registry" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/registrations" - "github.com/open-component-model/ocm/pkg/utils" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" ) const ALL = "*" @@ -89,16 +89,16 @@ func AsHandlerRegistrationRegistry(r Registry) registrations.HandlerRegistration type _registry struct { registrations.HandlerRegistrationRegistry[Target, HandlerOption] - id finalizer.ObjectIdentity + id runtimefinalizer.ObjectIdentity lock sync.RWMutex base Registry handlers *registry.Registry[Handler, registry.RegistrationKey] } func NewRegistry(base ...Registry) Registry { - b := utils.Optional(base...) + b := general.Optional(base...) return &_registry{ - id: finalizer.NewObjectIdentity("downloader.registry.ocm.software"), + id: runtimefinalizer.NewObjectIdentity("downloader.registry.ocm.software"), base: b, HandlerRegistrationRegistry: NewHandlerRegistrationRegistry(AsHandlerRegistrationRegistry(b)), handlers: registry.NewRegistry[Handler, registry.RegistrationKey](), diff --git a/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource.go b/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource.go index 6831d29aa4..1aa4c341cf 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource.go +++ b/pkg/contexts/ocm/elements/artifactaccess/genericaccess/resource.go @@ -1,11 +1,12 @@ package genericaccess import ( + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" ) func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, access ocm.AccessSpec) (cpi.ArtifactAccess[M], error) { @@ -13,7 +14,7 @@ func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, a if err != nil { return nil, errors.Wrapf(err, "invalid external access method %q", access.GetKind()) } - return cpi.NewArtifactAccessForProvider(generics.As[*M](meta), prov), nil + return cpi.NewArtifactAccessForProvider(generics.Cast[*M](meta), prov), nil } func MustAccess[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, access ocm.AccessSpec) cpi.ArtifactAccess[M] { diff --git a/pkg/contexts/ocm/elements/artifactblob/datablob/resource.go b/pkg/contexts/ocm/elements/artifactblob/datablob/resource.go index 44d9445d41..5fa761bb64 100644 --- a/pkg/contexts/ocm/elements/artifactblob/datablob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/datablob/resource.go @@ -1,11 +1,12 @@ package datablob import ( + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/optionutils" ) @@ -36,7 +37,7 @@ func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, b accprov := cpi.NewAccessProviderForBlobAccessProvider(ctx, blobprov, eff.Hint, eff.Global) // strange type cast is required by Go compiler, meta has the correct type. - return cpi.NewArtifactAccessForProvider(generics.As[*M](meta), accprov) + return cpi.NewArtifactAccessForProvider(generics.Cast[*M](meta), accprov) } func ResourceAccess(ctx ocm.Context, media string, meta *ocm.ResourceMeta, blob []byte, opts ...Option) cpi.ResourceAccess { diff --git a/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource.go index 7b51e50a5a..fd4aa9e138 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource.go @@ -1,12 +1,13 @@ package dirtreeblob import ( + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/blobaccess/dirtree" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/optionutils" ) @@ -20,7 +21,7 @@ func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, p blobprov := dirtree.BlobAccessProviderForDirTree(path, &eff.Blob) accprov := cpi.NewAccessProviderForBlobAccessProvider(ctx, blobprov, eff.Hint, eff.Global) // strange type cast is required by Go compiler, meta has the correct type. - return cpi.NewArtifactAccessForProvider(generics.As[*M](meta), accprov) + return cpi.NewArtifactAccessForProvider(generics.Cast[*M](meta), accprov) } func ResourceAccess(ctx ocm.Context, meta *cpi.ResourceMeta, path string, opts ...Option) cpi.ResourceAccess { diff --git a/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/resource.go index 997ca81815..fda40a0d1a 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/resource.go @@ -1,13 +1,14 @@ package dockerdaemonblob import ( + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/blobaccess/dockerdaemon" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/ociartifact" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/optionutils" ) @@ -27,7 +28,7 @@ func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, n blobprov := dockerdaemon.BlobAccessProviderForImageFromDockerDaemon(name, &eff.Blob) accprov := cpi.NewAccessProviderForBlobAccessProvider(ctx, blobprov, hint, eff.Global) // strange type cast is required by Go compiler, meta has the correct type. - return cpi.NewArtifactAccessForProvider(generics.As[*M](meta), accprov) + return cpi.NewArtifactAccessForProvider(generics.Cast[*M](meta), accprov) } func ResourceAccess(ctx ocm.Context, meta *cpi.ResourceMeta, path string, opts ...Option) cpi.ResourceAccess { diff --git a/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/resource.go index a14f4fce6a..c6b5b6d4c9 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/resource.go @@ -1,12 +1,13 @@ package dockermultiblob import ( + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/blobaccess/dockermulti" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/optionutils" ) @@ -22,7 +23,7 @@ func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, o blobprov := dockermulti.BlobAccessProviderForMultiImageFromDockerDaemon(&eff.Blob) accprov := cpi.NewAccessProviderForBlobAccessProvider(ctx, blobprov, eff.Hint, eff.Global) // strange type cast is required by Go compiler, meta has the correct type. - return cpi.NewArtifactAccessForProvider(generics.As[*M](meta), accprov) + return cpi.NewArtifactAccessForProvider(generics.Cast[*M](meta), accprov) } func ResourceAccess(ctx ocm.Context, meta *cpi.ResourceMeta, opts ...Option) cpi.ResourceAccess { diff --git a/pkg/contexts/ocm/elements/artifactblob/externalblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/externalblob/resource.go index aa9be3aa9d..cb6f5813b2 100644 --- a/pkg/contexts/ocm/elements/artifactblob/externalblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/externalblob/resource.go @@ -1,11 +1,12 @@ package externalblob import ( + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/optionutils" ) @@ -25,7 +26,7 @@ func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, a if err != nil { return nil, errors.Wrapf(err, "invalid external access method %q", access.GetKind()) } - return cpi.NewArtifactAccessForProvider(generics.As[*M](meta), newAccessProvider(prov, hint, global)), nil + return cpi.NewArtifactAccessForProvider(generics.Cast[*M](meta), newAccessProvider(prov, hint, global)), nil } type _accessProvider = cpi.AccessProvider diff --git a/pkg/contexts/ocm/elements/artifactblob/fileblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/fileblob/resource.go index ac6be767ae..6cacce1098 100644 --- a/pkg/contexts/ocm/elements/artifactblob/fileblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/fileblob/resource.go @@ -1,11 +1,12 @@ package fileblob import ( + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/optionutils" ) @@ -40,7 +41,7 @@ func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, media str accprov := cpi.NewAccessProviderForBlobAccessProvider(ctx, blobprov, eff.Hint, eff.Global) // strange type cast is required by Go compiler, meta has the correct type. - return cpi.NewArtifactAccessForProvider(generics.As[*M](meta), accprov) + return cpi.NewArtifactAccessForProvider(generics.Cast[*M](meta), accprov) } func ResourceAccess(ctx ocm.Context, media string, meta *ocm.ResourceMeta, path string, opts ...Option) cpi.ResourceAccess { diff --git a/pkg/contexts/ocm/elements/artifactblob/genericblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/genericblob/resource.go index 01bcb8248c..bbd01ff01c 100644 --- a/pkg/contexts/ocm/elements/artifactblob/genericblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/genericblob/resource.go @@ -1,10 +1,11 @@ package genericblob import ( + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/optionutils" ) @@ -12,7 +13,7 @@ func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx cpi.Context, meta P, b eff := optionutils.EvalOptions(opts...) accprov := cpi.NewAccessProviderForBlobAccessProvider(ctx, blob, eff.Hint, eff.Global) // strange type cast is required by Go compiler, meta has the correct type. - return cpi.NewArtifactAccessForProvider(generics.As[*M](meta), accprov) + return cpi.NewArtifactAccessForProvider(generics.Cast[*M](meta), accprov) } func ResourceAccess(ctx cpi.Context, media string, meta *cpi.ResourceMeta, blob blobaccess.BlobAccessProvider, opts ...Option) cpi.ResourceAccess { diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/helmblob/resource.go index 2e201aec31..21c1e48537 100644 --- a/pkg/contexts/ocm/elements/artifactblob/helmblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/resource.go @@ -1,12 +1,13 @@ package helmblob import ( + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/blobaccess/helm" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/optionutils" ) @@ -21,7 +22,7 @@ func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, p blobprov := helm.BlobAccessProviderForHelmChart(path, &eff.Blob) accprov := cpi.NewAccessProviderForBlobAccessProvider(ctx, blobprov, hint, eff.Global) // strange type cast is required by Go compiler, meta has the correct type. - return cpi.NewArtifactAccessForProvider(generics.As[*M](meta), accprov) + return cpi.NewArtifactAccessForProvider(generics.Cast[*M](meta), accprov) } func ResourceAccess(ctx ocm.Context, meta *cpi.ResourceMeta, path string, opts ...Option) cpi.ResourceAccess { diff --git a/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/resource.go index 9e33434d2d..105ad0a4b7 100644 --- a/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/resource.go @@ -1,13 +1,14 @@ package ociartifactblob import ( + "github.com/mandelsoft/goutils/generics" + blob "github.com/open-component-model/ocm/pkg/blobaccess/ociartifact" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/optionutils" ) @@ -30,7 +31,7 @@ func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, r blobprov := blob.BlobAccessProviderForOCIArtifact(refname, &eff.Blob) accprov := cpi.NewAccessProviderForBlobAccessProvider(ctx, blobprov, hint, eff.Global) // strange type cast is required by Go compiler, meta has the correct type. - return cpi.NewArtifactAccessForProvider(generics.As[*M](meta), accprov) + return cpi.NewArtifactAccessForProvider(generics.Cast[*M](meta), accprov) } func ResourceAccess(ctx ocm.Context, meta *cpi.ResourceMeta, path string, opts ...Option) cpi.ResourceAccess { diff --git a/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go index e2831194bc..976b4648aa 100644 --- a/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go @@ -1,12 +1,13 @@ package wgetblob import ( + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/blobaccess/wget" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/optionutils" ) @@ -22,7 +23,7 @@ func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, u blobprov := wget.BlobAccessProviderForWget(url, &eff.Blob) accprov := cpi.NewAccessProviderForBlobAccessProvider(ctx, blobprov, eff.Hint, eff.Global) // strange type cast is required by Go compiler, meta has the correct type. - return cpi.NewArtifactAccessForProvider(generics.As[*M](meta), accprov) + return cpi.NewArtifactAccessForProvider(generics.Cast[*M](meta), accprov) } func ResourceAccess(ctx ocm.Context, meta *ocm.ResourceMeta, url string, opts ...Option) cpi.ResourceAccess { diff --git a/pkg/contexts/ocm/elements/references.go b/pkg/contexts/ocm/elements/references.go index faac688586..e5f40ebce1 100644 --- a/pkg/contexts/ocm/elements/references.go +++ b/pkg/contexts/ocm/elements/references.go @@ -1,8 +1,9 @@ package elements import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" - "github.com/open-component-model/ocm/pkg/errors" ) type ReferenceOption interface { diff --git a/pkg/contexts/ocm/elements/resources.go b/pkg/contexts/ocm/elements/resources.go index e2e1dd0399..a0dda588ab 100644 --- a/pkg/contexts/ocm/elements/resources.go +++ b/pkg/contexts/ocm/elements/resources.go @@ -1,9 +1,10 @@ package elements import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/ocm/elements/sources.go b/pkg/contexts/ocm/elements/sources.go index 0ab8443c5a..22f7e12924 100644 --- a/pkg/contexts/ocm/elements/sources.go +++ b/pkg/contexts/ocm/elements/sources.go @@ -1,8 +1,9 @@ package elements import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" - "github.com/open-component-model/ocm/pkg/errors" ) type SourceMetaOption interface { diff --git a/pkg/contexts/ocm/gc_test.go b/pkg/contexts/ocm/gc_test.go index d80a50b476..2896ae9406 100644 --- a/pkg/contexts/ocm/gc_test.go +++ b/pkg/contexts/ocm/gc_test.go @@ -6,16 +6,16 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" me "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/finalizer" ) var _ = Describe("area test", func() { It("can be garbage collected", func() { ctx := me.New() - r := finalizer.GetRuntimeFinalizationRecorder(ctx) + r := runtimefinalizer.GetRuntimeFinalizationRecorder(ctx) Expect(r).NotTo(BeNil()) runtime.GC() diff --git a/pkg/contexts/ocm/internal/accesstypes.go b/pkg/contexts/ocm/internal/accesstypes.go index e60286a60d..10518c46be 100644 --- a/pkg/contexts/ocm/internal/accesstypes.go +++ b/pkg/contexts/ocm/internal/accesstypes.go @@ -5,15 +5,16 @@ import ( "fmt" "io" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" + "github.com/mandelsoft/goutils/generics" "github.com/modern-go/reflect2" "github.com/open-component-model/ocm/pkg/cobrautils/flagsets/flagsetscheme" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/open-component-model/ocm/pkg/errkind" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/runtime" - "github.com/open-component-model/ocm/pkg/utils" ) type AccessType flagsetscheme.VersionTypedObjectType[AccessSpec] @@ -136,7 +137,7 @@ func (_ *UnknownAccessSpec) IsUnknown() bool { } func (s *UnknownAccessSpec) AccessMethod(ComponentVersionAccess) (AccessMethod, error) { - return nil, errors.ErrUnknown(errors.KIND_ACCESSMETHOD, s.GetType()) + return nil, errors.ErrUnknown(errkind.KIND_ACCESSMETHOD, s.GetType()) } func (s *UnknownAccessSpec) GetInexpensiveContentVersionIdentity(ComponentVersionAccess) string { @@ -185,7 +186,7 @@ func ToGenericAccessSpec(spec AccessSpec) (*GenericAccessSpec, error) { } func NewGenericAccessSpec(data []byte, unmarshaler ...runtime.Unmarshaler) (AccessSpec, error) { - return generics.AsE[AccessSpec](newGenericAccessSpec(data, utils.Optional(unmarshaler...))) + return generics.CastPointerR[AccessSpec](newGenericAccessSpec(data, general.Optional(unmarshaler...))) } func newGenericAccessSpec(data []byte, unmarshaler runtime.Unmarshaler) (*GenericAccessSpec, error) { @@ -222,7 +223,7 @@ func (s *GenericAccessSpec) AccessMethod(acc ComponentVersionAccess) (AccessMeth return nil, err } if _, ok := spec.(*GenericAccessSpec); ok { - return nil, errors.ErrUnknown(errors.KIND_ACCESSMETHOD, s.GetType()) + return nil, errors.ErrUnknown(errkind.KIND_ACCESSMETHOD, s.GetType()) } return spec.AccessMethod(acc) } diff --git a/pkg/contexts/ocm/internal/context.go b/pkg/contexts/ocm/internal/context.go index da863ab5a1..60269ba46e 100644 --- a/pkg/contexts/ocm/internal/context.go +++ b/pkg/contexts/ocm/internal/context.go @@ -5,7 +5,7 @@ import ( "reflect" "strings" - . "github.com/open-component-model/ocm/pkg/finalizer" + . "github.com/mandelsoft/goutils/finalizer" "github.com/modern-go/reflect2" diff --git a/pkg/contexts/ocm/internal/errors.go b/pkg/contexts/ocm/internal/errors.go index 63efc0e7ba..ed08739d2a 100644 --- a/pkg/contexts/ocm/internal/errors.go +++ b/pkg/contexts/ocm/internal/errors.go @@ -3,12 +3,14 @@ package internal import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/errkind" ) const ( - KIND_COMPONENT = errors.KIND_COMPONENT + KIND_COMPONENT = errkind.KIND_COMPONENT KIND_COMPONENTVERSION = "component version" KIND_RESOURCE = "component resource" KIND_SOURCE = "component source" diff --git a/pkg/contexts/ocm/internal/repotypes.go b/pkg/contexts/ocm/internal/repotypes.go index fa641d6171..1b2b3b8f1f 100644 --- a/pkg/contexts/ocm/internal/repotypes.go +++ b/pkg/contexts/ocm/internal/repotypes.go @@ -3,12 +3,12 @@ package internal import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/generics" "github.com/modern-go/reflect2" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/oci" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) @@ -116,7 +116,7 @@ func ToGenericRepositorySpec(spec RepositorySpec) (*GenericRepositorySpec, error } func NewGenericRepositorySpec(data []byte, unmarshaler runtime.Unmarshaler) (RepositorySpec, error) { - return generics.AsE[RepositorySpec](newGenericRepositorySpec(data, unmarshaler)) + return generics.CastPointerR[RepositorySpec](newGenericRepositorySpec(data, unmarshaler)) } func newGenericRepositorySpec(data []byte, unmarshaler runtime.Unmarshaler) (*GenericRepositorySpec, error) { diff --git a/pkg/contexts/ocm/internal/resolver.go b/pkg/contexts/ocm/internal/resolver.go index 3bef59e78c..f08e0e6cfa 100644 --- a/pkg/contexts/ocm/internal/resolver.go +++ b/pkg/contexts/ocm/internal/resolver.go @@ -4,12 +4,13 @@ import ( "strings" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/general" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/datacontext" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/registrations" "github.com/open-component-model/ocm/pkg/utils" @@ -92,7 +93,7 @@ func NewResolverRule(prefix string, spec RepositorySpec, prio ...int) *ResolverR prefix: prefix, path: p, spec: spec, - prio: utils.OptionalDefaulted(10, prio...), + prio: general.OptionalDefaulted(10, prio...), } } diff --git a/pkg/contexts/ocm/internal/uniform.go b/pkg/contexts/ocm/internal/uniform.go index 511e9e2327..0d77a7902b 100644 --- a/pkg/contexts/ocm/internal/uniform.go +++ b/pkg/contexts/ocm/internal/uniform.go @@ -5,12 +5,12 @@ import ( "fmt" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/maputils" "github.com/sirupsen/logrus" "golang.org/x/exp/slices" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" - "github.com/open-component-model/ocm/pkg/utils" ) const ( @@ -128,7 +128,7 @@ func (s *specHandlers) KnownTypeNames() []string { s.lock.RLock() defer s.lock.RUnlock() - return utils.StringMapKeys(s.handlers) + return maputils.OrderedKeys(s.handlers) } func (s *specHandlers) GetHandlers(typ string) []RepositorySpecHandler { diff --git a/pkg/contexts/ocm/labels/routingslip/entry.go b/pkg/contexts/ocm/labels/routingslip/entry.go index 490c365f99..33f71a8686 100644 --- a/pkg/contexts/ocm/labels/routingslip/entry.go +++ b/pkg/contexts/ocm/labels/routingslip/entry.go @@ -4,11 +4,11 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/labels/routingslip/internal" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/norm/jcs" diff --git a/pkg/contexts/ocm/labels/routingslip/internal/entrytypes.go b/pkg/contexts/ocm/labels/routingslip/internal/entrytypes.go index e500ce1174..319d2bc616 100644 --- a/pkg/contexts/ocm/labels/routingslip/internal/entrytypes.go +++ b/pkg/contexts/ocm/labels/routingslip/internal/entrytypes.go @@ -6,14 +6,15 @@ import ( "reflect" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/maputils" "github.com/mandelsoft/goutils/sliceutils" "github.com/modern-go/reflect2" "github.com/open-component-model/ocm/pkg/cobrautils/flagsets" "github.com/open-component-model/ocm/pkg/cobrautils/flagsets/flagsetscheme" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) @@ -74,7 +75,7 @@ func (_ *UnknownEntry) IsUnknown() bool { } func (u *UnknownEntry) Describe(ctx Context) string { - keys := utils.StringMapKeys(u.Object) + keys := maputils.OrderedKeys(u.Object) cnt := 0 desc := []string{} delta := 0 @@ -144,7 +145,7 @@ func ToGenericEntry(spec Entry) (*GenericEntry, error) { } func NewGenericEntry(data []byte, unmarshaler ...runtime.Unmarshaler) (Entry, error) { - return generics.AsE[Entry](newGenericEntry(data, utils.Optional(unmarshaler...))) + return generics.CastPointerR[Entry](newGenericEntry(data, utils.Optional(unmarshaler...))) } func newGenericEntry(data []byte, unmarshaler runtime.Unmarshaler) (*GenericEntry, error) { diff --git a/pkg/contexts/ocm/labels/routingslip/slip.go b/pkg/contexts/ocm/labels/routingslip/slip.go index d6673deede..cceb6a24b3 100644 --- a/pkg/contexts/ocm/labels/routingslip/slip.go +++ b/pkg/contexts/ocm/labels/routingslip/slip.go @@ -4,6 +4,8 @@ import ( "crypto/x509/pkix" "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/set" "github.com/opencontainers/go-digest" "golang.org/x/exp/slices" @@ -11,8 +13,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/hasher/sha256" "github.com/open-component-model/ocm/pkg/signing/signutils" @@ -27,7 +27,7 @@ const ( type RoutingSlipIndex map[digest.Digest]*HistoryEntry func (s RoutingSlipIndex) Leaves() []digest.Digest { - found := generics.Set[digest.Digest]{} + found := set.Set[digest.Digest]{} for _, e := range s { found.Add(e.Digest) } @@ -76,14 +76,14 @@ func (s RoutingSlipIndex) Verify(ctx Context, name string, issuer *pkix.Name, si } } - found := generics.Set[digest.Digest]{} + found := set.Set[digest.Digest]{} for _, id := range leaves { s.verify(ctx, name, id, acc, found) } return nil } -func (s RoutingSlipIndex) verify(ctx Context, name string, id digest.Digest, acc SlipAccess, found generics.Set[digest.Digest]) error { +func (s RoutingSlipIndex) verify(ctx Context, name string, id digest.Digest, acc SlipAccess, found set.Set[digest.Digest]) error { cur := s[id] if cur == nil { return errors.ErrNotFound(KIND_ENTRY, id.String(), name) diff --git a/pkg/contexts/ocm/labels/routingslip/transfer_test.go b/pkg/contexts/ocm/labels/routingslip/transfer_test.go index a222c4c8df..d24714271e 100644 --- a/pkg/contexts/ocm/labels/routingslip/transfer_test.go +++ b/pkg/contexts/ocm/labels/routingslip/transfer_test.go @@ -7,6 +7,8 @@ import ( . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/compositionmodeattr" @@ -16,7 +18,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" "github.com/open-component-model/ocm/pkg/env/builder" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" ) diff --git a/pkg/contexts/ocm/plugin/cache/plugindir.go b/pkg/contexts/ocm/plugin/cache/plugindir.go index 0186552e46..374bf4ceac 100644 --- a/pkg/contexts/ocm/plugin/cache/plugindir.go +++ b/pkg/contexts/ocm/plugin/cache/plugindir.go @@ -6,13 +6,13 @@ import ( "sync" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/maputils" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi/cmds/info" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/utils" ) type PluginDir = *pluginDirImpl @@ -37,7 +37,7 @@ func (c *pluginDirImpl) PluginNames() []string { c.lock.RLock() defer c.lock.RUnlock() - return utils.StringMapKeys(c.plugins) + return maputils.OrderedKeys(c.plugins) } func (c *pluginDirImpl) Get(name string) Plugin { diff --git a/pkg/contexts/ocm/plugin/cache/registry.go b/pkg/contexts/ocm/plugin/cache/registry.go index fabde3799b..d6d2e2c2a4 100644 --- a/pkg/contexts/ocm/plugin/cache/registry.go +++ b/pkg/contexts/ocm/plugin/cache/registry.go @@ -1,9 +1,10 @@ package cache import ( + "github.com/mandelsoft/goutils/set" + "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/registry" - "github.com/open-component-model/ocm/pkg/generics" ) type ConstraintRegistry[T any, K registry.Key[K]] struct { @@ -15,7 +16,7 @@ func (r *ConstraintRegistry[T, K]) Lookup(key K) []*T { return r.mapping.LookupHandler(key) } -func (r *ConstraintRegistry[T, K]) LookupKeys(key K) generics.Set[K] { +func (r *ConstraintRegistry[T, K]) LookupKeys(key K) set.Set[K] { return r.mapping.LookupKeys(key) } @@ -30,7 +31,7 @@ func (r *ConstraintRegistry[T, K]) LookupFor(name string, key K) []*T { return m.LookupHandler(key) } -func (r *ConstraintRegistry[T, K]) LookupKeysFor(name string, key K) generics.Set[K] { +func (r *ConstraintRegistry[T, K]) LookupKeysFor(name string, key K) set.Set[K] { if name == "" { return r.LookupKeys(key) } diff --git a/pkg/contexts/ocm/plugin/cache/updater.go b/pkg/contexts/ocm/plugin/cache/updater.go index 0f65978021..0f28269d02 100644 --- a/pkg/contexts/ocm/plugin/cache/updater.go +++ b/pkg/contexts/ocm/plugin/cache/updater.go @@ -9,6 +9,7 @@ import ( "github.com/Masterminds/semver/v3" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "sigs.k8s.io/yaml" @@ -19,7 +20,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/download" "github.com/open-component-model/ocm/pkg/contexts/ocm/extraid" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/semverutils" utils2 "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/ocm/plugin/common/describe.go b/pkg/contexts/ocm/plugin/common/describe.go index b99b9324d1..2352d7ed6e 100644 --- a/pkg/contexts/ocm/plugin/common/describe.go +++ b/pkg/contexts/ocm/plugin/common/describe.go @@ -5,13 +5,13 @@ import ( "strings" "github.com/Masterminds/semver/v3" + "github.com/mandelsoft/goutils/set" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/datacontext/action/api" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/options" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/semverutils" utils2 "github.com/open-component-model/ocm/pkg/utils" ) @@ -299,7 +299,7 @@ func DescribeLabelMergeSpecifications(d *descriptor.Descriptor, out common.Print type ValueSetInfo struct { Name string Description string - Purposes generics.Set[string] + Purposes set.Set[string] Versions map[string]*ValueSetVersion } @@ -318,7 +318,7 @@ func GetValueSetInfo(valuesets []descriptor.ValueSetDescriptor) map[string]*Valu Name: m.Name, Description: m.Description, Versions: map[string]*ValueSetVersion{}, - Purposes: generics.NewSet(m.Purposes...), + Purposes: set.New(m.Purposes...), } found[m.Name] = i } else { diff --git a/pkg/contexts/ocm/plugin/descriptor/const.go b/pkg/contexts/ocm/plugin/descriptor/const.go index 0d32dc93cc..8174569b46 100644 --- a/pkg/contexts/ocm/plugin/descriptor/const.go +++ b/pkg/contexts/ocm/plugin/descriptor/const.go @@ -2,7 +2,7 @@ package descriptor import ( "github.com/open-component-model/ocm/pkg/contexts/datacontext/action" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/errkind" ocmlog "github.com/open-component-model/ocm/pkg/logging" ) @@ -10,7 +10,7 @@ const ( KIND_PLUGIN = "plugin" KIND_DOWNLOADER = "downloader" KIND_UPLOADER = "uploader" - KIND_ACCESSMETHOD = errors.KIND_ACCESSMETHOD + KIND_ACCESSMETHOD = errkind.KIND_ACCESSMETHOD KIND_ACTION = action.KIND_ACTION KIND_VALUESET = "value set" KIND_PURPOSE = "purposet" diff --git a/pkg/contexts/ocm/plugin/descriptor/keys.go b/pkg/contexts/ocm/plugin/descriptor/keys.go index 62b286f473..e4288213ca 100644 --- a/pkg/contexts/ocm/plugin/descriptor/keys.go +++ b/pkg/contexts/ocm/plugin/descriptor/keys.go @@ -3,7 +3,7 @@ package descriptor import ( "fmt" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/mandelsoft/goutils/set" ) type RepositoryContext struct { @@ -93,4 +93,4 @@ func (k UploaderKey) SetRepo(contexttype, repotype string) UploaderKey { return k } -type UploaderKeySet = generics.Set[UploaderKey] +type UploaderKeySet = set.Set[UploaderKey] diff --git a/pkg/contexts/ocm/plugin/descriptor/utils.go b/pkg/contexts/ocm/plugin/descriptor/utils.go index e1f2536f55..87692d2559 100644 --- a/pkg/contexts/ocm/plugin/descriptor/utils.go +++ b/pkg/contexts/ocm/plugin/descriptor/utils.go @@ -3,8 +3,9 @@ package descriptor import ( "sort" + "github.com/mandelsoft/goutils/sliceutils" + "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/registry" - "github.com/open-component-model/ocm/pkg/generics" ) type Named interface { @@ -53,5 +54,5 @@ next: } list = append(list, e) } - return generics.AppendedSlice(l, list...) + return sliceutils.CopyAppend(l, list...) } diff --git a/pkg/contexts/ocm/plugin/plugin.go b/pkg/contexts/ocm/plugin/plugin.go index 198f8b981b..f90f693ec0 100644 --- a/pkg/contexts/ocm/plugin/plugin.go +++ b/pkg/contexts/ocm/plugin/plugin.go @@ -8,6 +8,8 @@ import ( "strings" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/cobrautils/flagsets" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" @@ -32,7 +34,6 @@ import ( vscompose "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi/cmds/valueset/compose" vsval "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi/cmds/valueset/validate" "github.com/open-component-model/ocm/pkg/contexts/ocm/valuemergehandler" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/compose/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/compose/cmd.go index fa0ea68c07..8e7fd31ab6 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/compose/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/compose/cmd.go @@ -3,12 +3,13 @@ package compose import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/options" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/errkind" "github.com/open-component-model/ocm/pkg/runtime" ) @@ -74,7 +75,7 @@ func Command(p ppi.Plugin, cmd *cobra.Command, opts *Options) error { k, v := runtime.KindVersion(opts.Name) m := p.GetAccessMethod(k, v) if m == nil { - return errors.ErrUnknown(errors.KIND_ACCESSMETHOD, opts.Name) + return errors.ErrUnknown(errkind.KIND_ACCESSMETHOD, opts.Name) } err := opts.Options.ConvertFor(m.Options()...) if err != nil { diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/get/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/get/cmd.go index 949b9880a0..53cf12c2b6 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/get/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/get/cmd.go @@ -6,6 +6,7 @@ import ( "io" "os" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -14,7 +15,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" commonppi "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi/cmds/common" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/identity/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/identity/cmd.go index 70818ea163..fa2a89f4de 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/identity/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/identity/cmd.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -12,7 +13,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" commonppi "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi/cmds/common" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/validate/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/validate/cmd.go index f26839d804..8e6f3a7413 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/validate/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/accessmethod/validate/cmd.go @@ -3,12 +3,13 @@ package validate import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/errkind" "github.com/open-component-model/ocm/pkg/runtime" ) @@ -88,7 +89,7 @@ func Command(p ppi.Plugin, cmd *cobra.Command, opts *Options) error { m := p.GetAccessMethod(runtime.KindVersion(spec.GetType())) if m == nil { - return errors.ErrUnknown(errors.KIND_ACCESSMETHOD, spec.GetType()) + return errors.ErrUnknown(errkind.KIND_ACCESSMETHOD, spec.GetType()) } info, err := m.ValidateSpecification(p, spec) if err != nil { diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/action/execute/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/action/execute/cmd.go index 0e563be581..5c7b46be3d 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/action/execute/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/action/execute/cmd.go @@ -3,6 +3,7 @@ package execute import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -12,7 +13,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/datacontext/action/api" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi/cmds/common" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/download/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/download/cmd.go index 73f618e4ed..077a8e8286 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/download/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/download/cmd.go @@ -6,13 +6,13 @@ import ( "io" "os" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi/cmds/common" - "github.com/open-component-model/ocm/pkg/errors" ) const ( diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/mergehandler/execute/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/mergehandler/execute/cmd.go index 0730cc80a0..176cc46672 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/mergehandler/execute/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/mergehandler/execute/cmd.go @@ -6,12 +6,12 @@ import ( "io" "os" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" "github.com/open-component-model/ocm/pkg/contexts/ocm/valuemergehandler/hpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/upload/put/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/upload/put/cmd.go index fe1630a65e..b5e1f1a0d3 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/upload/put/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/upload/put/cmd.go @@ -6,6 +6,7 @@ import ( "io" "os" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -14,7 +15,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi/cmds/common" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/upload/validate/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/upload/validate/cmd.go index fcb8367598..a26e75b14f 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/upload/validate/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/upload/validate/cmd.go @@ -3,6 +3,7 @@ package validate import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -10,7 +11,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi/cmds/common" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/valueset/compose/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/valueset/compose/cmd.go index 9e80623ba6..a9f3ec09fc 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/valueset/compose/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/valueset/compose/cmd.go @@ -3,13 +3,13 @@ package compose import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/options" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/plugin/ppi/cmds/valueset/validate/cmd.go b/pkg/contexts/ocm/plugin/ppi/cmds/valueset/validate/cmd.go index 4be1f9eccf..8b9adcbee3 100644 --- a/pkg/contexts/ocm/plugin/ppi/cmds/valueset/validate/cmd.go +++ b/pkg/contexts/ocm/plugin/ppi/cmds/valueset/validate/cmd.go @@ -3,12 +3,12 @@ package validate import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/ppi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/plugin/ppi/plugin.go b/pkg/contexts/ocm/plugin/ppi/plugin.go index 11d9ac60b2..aa6c5687fe 100644 --- a/pkg/contexts/ocm/plugin/ppi/plugin.go +++ b/pkg/contexts/ocm/plugin/ppi/plugin.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/errors" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/contexts/datacontext/action" @@ -11,7 +12,7 @@ import ( metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/registry" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/errkind" "github.com/open-component-model/ocm/pkg/runtime" ) @@ -249,7 +250,7 @@ func (p *plugin) RegisterAccessMethod(m AccessMethod) error { if m.Version() != "" { n += runtime.VersionSeparator + m.Version() } - return errors.ErrAlreadyExists(errors.KIND_ACCESSMETHOD, n) + return errors.ErrAlreadyExists(errkind.KIND_ACCESSMETHOD, n) } var optlist []CLIOption diff --git a/pkg/contexts/ocm/ref.go b/pkg/contexts/ocm/ref.go index 5af1d6ffd2..7d4fdf55dd 100644 --- a/pkg/contexts/ocm/ref.go +++ b/pkg/contexts/ocm/ref.go @@ -4,11 +4,12 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/grammar" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/utils" ) const ( @@ -90,7 +91,7 @@ func ParseRepoToSpec(ctx Context, ref string, create ...bool) (RepositorySpec, e return nil, errors.ErrInvalidWrap(err, KIND_REPOSITORYSPEC, ref) } if !uni.CreateIfMissing { - uni.CreateIfMissing = utils.Optional(create...) + uni.CreateIfMissing = general.Optional(create...) } repoSpec, err := ctx.MapUniformRepositorySpec(&uni) if err != nil { diff --git a/pkg/contexts/ocm/repositories/comparch/comparch_test.go b/pkg/contexts/ocm/repositories/comparch/comparch_test.go index 628db42bc6..b3f77b9794 100644 --- a/pkg/contexts/ocm/repositories/comparch/comparch_test.go +++ b/pkg/contexts/ocm/repositories/comparch/comparch_test.go @@ -9,6 +9,7 @@ import ( . "github.com/open-component-model/ocm/pkg/testutils" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/vfs/pkg/memoryfs" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" @@ -23,7 +24,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/comparch" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" "github.com/open-component-model/ocm/pkg/env" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/signing/hasher/sha256" diff --git a/pkg/contexts/ocm/repositories/comparch/componentarchive.go b/pkg/contexts/ocm/repositories/comparch/componentarchive.go index 350e303a22..e3c48085e4 100644 --- a/pkg/contexts/ocm/repositories/comparch/componentarchive.go +++ b/pkg/contexts/ocm/repositories/comparch/componentarchive.go @@ -1,6 +1,7 @@ package comparch import ( + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -13,7 +14,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/repocpi" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/errkind" "github.com/open-component-model/ocm/pkg/refmgmt" ) @@ -199,7 +200,7 @@ func (c *componentArchiveContainer) AccessMethod(a cpi.AccessSpec, cv refmgmt.Ex } return newLocalFilesystemBlobAccessMethod(accessSpec.(*localblob.AccessSpec), c, cv) } - return nil, errors.ErrNotSupported(errors.KIND_ACCESSMETHOD, a.GetType(), "component archive") + return nil, errors.ErrNotSupported(errkind.KIND_ACCESSMETHOD, a.GetType(), "component archive") } func (c *componentArchiveContainer) GetInexpensiveContentVersionIdentity(a cpi.AccessSpec, cv refmgmt.ExtendedAllocatable) string { diff --git a/pkg/contexts/ocm/repositories/comparch/format.go b/pkg/contexts/ocm/repositories/comparch/format.go index 08bbbc1d0b..774e536aac 100644 --- a/pkg/contexts/ocm/repositories/comparch/format.go +++ b/pkg/contexts/ocm/repositories/comparch/format.go @@ -3,13 +3,13 @@ package comparch import ( "sync" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" ) // ComponentDescriptorFileName is the name of the component-descriptor file. diff --git a/pkg/contexts/ocm/repositories/comparch/repository.go b/pkg/contexts/ocm/repositories/comparch/repository.go index a5ee294ada..1433505a9b 100644 --- a/pkg/contexts/ocm/repositories/comparch/repository.go +++ b/pkg/contexts/ocm/repositories/comparch/repository.go @@ -5,6 +5,8 @@ import ( "strings" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/common/accessio" @@ -16,7 +18,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/repocpi" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/errkind" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/utils" ) @@ -141,7 +143,7 @@ func (r *RepositoryImpl) LookupComponent(name string) (*repocpi.ComponentAccessI return nil, accessio.ErrClosed } if r.arch.GetName() != name { - return nil, errors.ErrNotFound(errors.KIND_COMPONENT, name, Type) + return nil, errors.ErrNotFound(errkind.KIND_COMPONENT, name, Type) } return newComponentAccess(r) } @@ -308,7 +310,7 @@ func (c *ComponentVersionContainer) AccessMethod(a cpi.AccessSpec, cv refmgmt.Ex } return newLocalFilesystemBlobAccessMethod(accessSpec.(*localblob.AccessSpec), c, cv) } - return nil, errors.ErrNotSupported(errors.KIND_ACCESSMETHOD, a.GetType(), "component archive") + return nil, errors.ErrNotSupported(errkind.KIND_ACCESSMETHOD, a.GetType(), "component archive") } func (c *ComponentVersionContainer) GetInexpensiveContentVersionIdentity(a cpi.AccessSpec, cv refmgmt.ExtendedAllocatable) string { diff --git a/pkg/contexts/ocm/repositories/composition/cache.go b/pkg/contexts/ocm/repositories/composition/cache.go index 90d63d3442..61db49f33f 100644 --- a/pkg/contexts/ocm/repositories/composition/cache.go +++ b/pkg/contexts/ocm/repositories/composition/cache.go @@ -3,10 +3,11 @@ package composition import ( "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/refmgmt" ) diff --git a/pkg/contexts/ocm/repositories/composition/close_test.go b/pkg/contexts/ocm/repositories/composition/close_test.go index f66bc2bf25..b2fbf76642 100644 --- a/pkg/contexts/ocm/repositories/composition/close_test.go +++ b/pkg/contexts/ocm/repositories/composition/close_test.go @@ -6,6 +6,8 @@ import ( . "github.com/open-component-model/ocm/pkg/contexts/oci/testhelper" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/relativeociref" @@ -14,7 +16,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/composition" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" "github.com/open-component-model/ocm/pkg/env/builder" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/refmgmt" ) diff --git a/pkg/contexts/ocm/repositories/composition/repository.go b/pkg/contexts/ocm/repositories/composition/repository.go index e388b071b2..64c3aaf293 100644 --- a/pkg/contexts/ocm/repositories/composition/repository.go +++ b/pkg/contexts/ocm/repositories/composition/repository.go @@ -5,6 +5,9 @@ import ( "reflect" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/common/accessio" @@ -13,8 +16,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/virtual" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/utils" ) //////////////////////////////////////////////////////////////////////////////// @@ -23,7 +24,7 @@ func NewRepository(ctxp cpi.ContextProvider, names ...string) cpi.Repository { var repositories *Repositories ctx := datacontext.InternalContextRef(ctxp.OCMContext()) - name := utils.Optional(names...) + name := general.Optional(names...) if name != "" { repositories = ctx.GetAttributes().GetOrCreateAttribute(ATTR_REPOS, newRepositories).(*Repositories) if repo := repositories.GetRepository(name); repo != nil { diff --git a/pkg/contexts/ocm/repositories/composition/repository_test.go b/pkg/contexts/ocm/repositories/composition/repository_test.go index f0d8eae07d..054b9c8125 100644 --- a/pkg/contexts/ocm/repositories/composition/repository_test.go +++ b/pkg/contexts/ocm/repositories/composition/repository_test.go @@ -5,6 +5,7 @@ import ( . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/vfs/pkg/memoryfs" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -18,7 +19,6 @@ import ( ocmutils "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" "github.com/open-component-model/ocm/pkg/env" "github.com/open-component-model/ocm/pkg/env/builder" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/refmgmt" ) diff --git a/pkg/contexts/ocm/repositories/composition/version_test.go b/pkg/contexts/ocm/repositories/composition/version_test.go index 1b25605511..a20d0eeb32 100644 --- a/pkg/contexts/ocm/repositories/composition/version_test.go +++ b/pkg/contexts/ocm/repositories/composition/version_test.go @@ -5,6 +5,8 @@ import ( . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/blobaccess/bpi" "github.com/open-component-model/ocm/pkg/contexts/ocm" @@ -12,7 +14,6 @@ import ( me "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/composition" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" ocmutils "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/refmgmt" ) diff --git a/pkg/contexts/ocm/repositories/ctf/repo_test.go b/pkg/contexts/ocm/repositories/ctf/repo_test.go index 3205f41c4b..6bf9b09f62 100644 --- a/pkg/contexts/ocm/repositories/ctf/repo_test.go +++ b/pkg/contexts/ocm/repositories/ctf/repo_test.go @@ -3,10 +3,10 @@ package ctf_test import ( "bytes" + . "github.com/mandelsoft/goutils/finalizer" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/contexts/ocm/testhelper" - . "github.com/open-component-model/ocm/pkg/finalizer" . "github.com/open-component-model/ocm/pkg/testutils" "github.com/mandelsoft/logging" diff --git a/pkg/contexts/ocm/repositories/genericocireg/accessmethod_localblob.go b/pkg/contexts/ocm/repositories/genericocireg/accessmethod_localblob.go index 97ee92fc36..3bf2dd6202 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/accessmethod_localblob.go +++ b/pkg/contexts/ocm/repositories/genericocireg/accessmethod_localblob.go @@ -4,6 +4,7 @@ import ( "io" "sync" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -11,7 +12,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localblob" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/refmgmt" ) diff --git a/pkg/contexts/ocm/repositories/genericocireg/component.go b/pkg/contexts/ocm/repositories/genericocireg/component.go index 75c9e9b0e0..d433cccdba 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/component.go +++ b/pkg/contexts/ocm/repositories/genericocireg/component.go @@ -4,6 +4,8 @@ import ( "strings" "github.com/Masterminds/semver/v3" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" @@ -11,9 +13,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/repocpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/refmgmt" - "github.com/open-component-model/ocm/pkg/utils" ) const META_SEPARATOR = ".build-" @@ -150,7 +150,7 @@ func (c *componentAccessImpl) NewVersion(version string, overrides ...bool) (*re if c.IsReadOnly() { return nil, accessio.ErrReadOnly } - override := utils.Optional(overrides...) + override := general.Optional(overrides...) tag, err := toTag(version) if err != nil { return nil, err diff --git a/pkg/contexts/ocm/repositories/genericocireg/componentversion.go b/pkg/contexts/ocm/repositories/genericocireg/componentversion.go index 0cebe286ab..fda494b82f 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/componentversion.go +++ b/pkg/contexts/ocm/repositories/genericocireg/componentversion.go @@ -5,6 +5,8 @@ import ( "path" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/set" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/common" @@ -23,8 +25,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/repocpi" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/open-component-model/ocm/pkg/errkind" "github.com/open-component-model/ocm/pkg/refmgmt" ) @@ -137,7 +138,7 @@ func (c *ComponentVersionContainer) AccessMethod(a cpi.AccessSpec, cv refmgmt.Ex return m, err } - return nil, errors.ErrNotSupported(errors.KIND_ACCESSMETHOD, a.GetType(), "oci registry") + return nil, errors.ErrNotSupported(errkind.KIND_ACCESSMETHOD, a.GetType(), "oci registry") } func (c *ComponentVersionContainer) GetInexpensiveContentVersionIdentity(a cpi.AccessSpec, cv refmgmt.ExtendedAllocatable) string { @@ -177,7 +178,7 @@ func (c *ComponentVersionContainer) Update() error { if c.state.HasChanged() { logger.Debug("update component version") desc := c.GetDescriptor() - layers := generics.Set[int]{} + layers := set.Set[int]{} for i := range c.manifest.GetDescriptor().Layers { layers.Add(i) } diff --git a/pkg/contexts/ocm/repositories/genericocireg/cred_test.go b/pkg/contexts/ocm/repositories/genericocireg/cred_test.go index 69a3de0907..30d68fccad 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/cred_test.go +++ b/pkg/contexts/ocm/repositories/genericocireg/cred_test.go @@ -5,13 +5,14 @@ import ( . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials" ociidentity "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/oci/identity" "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ocireg" - "github.com/open-component-model/ocm/pkg/finalizer" ) var _ = Describe("consumer id handling", func() { diff --git a/pkg/contexts/ocm/repositories/genericocireg/repo_test.go b/pkg/contexts/ocm/repositories/genericocireg/repo_test.go index 77b1220609..29347bb13c 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/repo_test.go +++ b/pkg/contexts/ocm/repositories/genericocireg/repo_test.go @@ -13,6 +13,8 @@ import ( "github.com/mandelsoft/vfs/pkg/vfs" "github.com/opencontainers/go-digest" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" @@ -43,7 +45,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" ocmtesthelper "github.com/open-component-model/ocm/pkg/contexts/ocm/testhelper" ocmutils "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/signing/hasher/sha256" ) diff --git a/pkg/contexts/ocm/repositories/genericocireg/repository.go b/pkg/contexts/ocm/repositories/genericocireg/repository.go index 59b68984d9..574442ff80 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/repository.go +++ b/pkg/contexts/ocm/repositories/genericocireg/repository.go @@ -7,6 +7,9 @@ import ( "path" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" + "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/oci" @@ -14,8 +17,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/repocpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/genericocireg/componentmapping" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/utils" ) type OCIBasedRepository interface { @@ -84,7 +85,7 @@ func (r *RepositoryImpl) GetContext() cpi.Context { func (r *RepositoryImpl) GetConsumerId(uctx ...credentials.UsageContext) credentials.ConsumerIdentity { prefix := r.meta.SubPath - if c, ok := utils.Optional(uctx...).(credentials.StringUsageContext); ok { + if c, ok := general.Optional(uctx...).(credentials.StringUsageContext); ok { prefix = path.Join(prefix, componentmapping.ComponentDescriptorNamespace, c.String()) } if p, ok := r.ocirepo.(credentials.ConsumerIdentityProvider); ok { diff --git a/pkg/contexts/ocm/repositories/genericocireg/state.go b/pkg/contexts/ocm/repositories/genericocireg/state.go index 4d3b24e01e..eabc479bdc 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/state.go +++ b/pkg/contexts/ocm/repositories/genericocireg/state.go @@ -10,6 +10,7 @@ import ( "strings" "github.com/go-test/deep" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/logging" "github.com/opencontainers/go-digest" ociv1 "github.com/opencontainers/image-spec/specs-go/v1" @@ -22,7 +23,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/genericocireg/componentmapping" - "github.com/open-component-model/ocm/pkg/errors" ocmlog "github.com/open-component-model/ocm/pkg/logging" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/ocm/repositories/genericocireg/type.go b/pkg/contexts/ocm/repositories/genericocireg/type.go index dff4c1db03..49c796ee1c 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/type.go +++ b/pkg/contexts/ocm/repositories/genericocireg/type.go @@ -4,6 +4,8 @@ import ( "encoding/json" "path" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" "github.com/sirupsen/logrus" "github.com/open-component-model/ocm/pkg/contexts/credentials" @@ -11,9 +13,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ocireg" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/genericocireg/componentmapping" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" - "github.com/open-component-model/ocm/pkg/utils" ) // ComponentNameMapping describes the method that is used to map the "Component Name", "Component Version"-tuples @@ -170,7 +170,7 @@ func (s *RepositorySpec) Repository(ctx cpi.Context, creds credentials.Credentia func (s *RepositorySpec) GetConsumerId(uctx ...credentials.UsageContext) credentials.ConsumerIdentity { prefix := s.SubPath - if c, ok := utils.Optional(uctx...).(credentials.StringUsageContext); ok { + if c, ok := general.Optional(uctx...).(credentials.StringUsageContext); ok { prefix = path.Join(prefix, componentmapping.ComponentDescriptorNamespace, c.String()) } return credentials.GetProvidedConsumerId(s.RepositorySpec, credentials.StringUsageContext(prefix)) diff --git a/pkg/contexts/ocm/repositories/virtual/accessmethod_localblob.go b/pkg/contexts/ocm/repositories/virtual/accessmethod_localblob.go index 4c166fd0c3..0ed379c0c1 100644 --- a/pkg/contexts/ocm/repositories/virtual/accessmethod_localblob.go +++ b/pkg/contexts/ocm/repositories/virtual/accessmethod_localblob.go @@ -4,10 +4,11 @@ import ( "io" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localblob" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" - "github.com/open-component-model/ocm/pkg/errors" ) type localBlobAccessMethod struct { diff --git a/pkg/contexts/ocm/repositories/virtual/component.go b/pkg/contexts/ocm/repositories/virtual/component.go index 25049af090..634c248c0f 100644 --- a/pkg/contexts/ocm/repositories/virtual/component.go +++ b/pkg/contexts/ocm/repositories/virtual/component.go @@ -1,10 +1,11 @@ package virtual import ( + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/repocpi" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/utils" ) type componentAccessImpl struct { @@ -68,7 +69,7 @@ func (c *componentAccessImpl) LookupVersion(version string) (*repocpi.ComponentV } func (c *componentAccessImpl) NewVersion(version string, overrides ...bool) (*repocpi.ComponentVersionAccessInfo, error) { - override := utils.Optional(overrides...) + override := general.Optional(overrides...) ok, err := c.HasVersion(version) if err == nil && ok { if override { diff --git a/pkg/contexts/ocm/repositories/virtual/componentversion.go b/pkg/contexts/ocm/repositories/virtual/componentversion.go index 6c12a0672f..17cadef4f8 100644 --- a/pkg/contexts/ocm/repositories/virtual/componentversion.go +++ b/pkg/contexts/ocm/repositories/virtual/componentversion.go @@ -1,6 +1,8 @@ package virtual import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localblob" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localfsblob" @@ -9,7 +11,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/repocpi" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/errkind" "github.com/open-component-model/ocm/pkg/refmgmt" ) @@ -111,7 +113,7 @@ func (c *ComponentVersionContainer) AccessMethod(a cpi.AccessSpec, cv refmgmt.Ex return accspeccpi.AccessMethodForImplementation(newLocalBlobAccessMethod(accessSpec.(*localblob.AccessSpec), blob)) } - return nil, errors.ErrNotSupported(errors.KIND_ACCESSMETHOD, a.GetType(), "virtual registry") + return nil, errors.ErrNotSupported(errkind.KIND_ACCESSMETHOD, a.GetType(), "virtual registry") } func (c *ComponentVersionContainer) GetInexpensiveContentVersionIdentity(a cpi.AccessSpec, cv refmgmt.ExtendedAllocatable) string { diff --git a/pkg/contexts/ocm/repositories/virtual/example/example.go b/pkg/contexts/ocm/repositories/virtual/example/example.go index 09fb8a17a9..11262932e0 100644 --- a/pkg/contexts/ocm/repositories/virtual/example/example.go +++ b/pkg/contexts/ocm/repositories/virtual/example/example.go @@ -8,6 +8,8 @@ import ( "reflect" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" "github.com/mandelsoft/vfs/pkg/projectionfs" "github.com/mandelsoft/vfs/pkg/vfs" @@ -18,8 +20,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/virtual" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/utils" ) //////////////////////////////////////////////////////////////////////////////// @@ -27,7 +27,7 @@ import ( func NewRepository(ctx cpi.ContextProvider, fs vfs.FileSystem, readonly bool, path ...string) (cpi.Repository, error) { var err error - p := utils.Optional(path...) + p := general.Optional(path...) if p != "" && p != "/" { fs, err = projectionfs.New(fs, p) if err != nil { diff --git a/pkg/contexts/ocm/repositories/virtual/index.go b/pkg/contexts/ocm/repositories/virtual/index.go index f66aec38f1..264d4b6b29 100644 --- a/pkg/contexts/ocm/repositories/virtual/index.go +++ b/pkg/contexts/ocm/repositories/virtual/index.go @@ -3,11 +3,12 @@ package virtual import ( "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common" ocicpi "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/ocm/repositories/virtual/repo_test.go b/pkg/contexts/ocm/repositories/virtual/repo_test.go index 0305409e1e..b7e247cae0 100644 --- a/pkg/contexts/ocm/repositories/virtual/repo_test.go +++ b/pkg/contexts/ocm/repositories/virtual/repo_test.go @@ -7,6 +7,7 @@ import ( . "github.com/open-component-model/ocm/pkg/env/builder" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/vfs/pkg/layerfs" "github.com/mandelsoft/vfs/pkg/memoryfs" "github.com/mandelsoft/vfs/pkg/projectionfs" @@ -22,7 +23,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/virtual/example" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" ocmutils "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" ) diff --git a/pkg/contexts/ocm/resolver.go b/pkg/contexts/ocm/resolver.go index ee78193376..29fd65e3cc 100644 --- a/pkg/contexts/ocm/resolver.go +++ b/pkg/contexts/ocm/resolver.go @@ -3,11 +3,11 @@ package ocm import ( "sync" + "github.com/mandelsoft/goutils/errors" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm/internal" - "github.com/open-component-model/ocm/pkg/errors" ) type DedicatedResolver []ComponentVersionAccess diff --git a/pkg/contexts/ocm/session.go b/pkg/contexts/ocm/session.go index 5557afbfe2..d9a1cd8d77 100644 --- a/pkg/contexts/ocm/session.go +++ b/pkg/contexts/ocm/session.go @@ -4,10 +4,11 @@ import ( "fmt" "reflect" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/ocm/internal" - "github.com/open-component-model/ocm/pkg/errors" ) type ComponentContainer interface { diff --git a/pkg/contexts/ocm/signing/convenience.go b/pkg/contexts/ocm/signing/convenience.go index c8491e0825..542eb8c521 100644 --- a/pkg/contexts/ocm/signing/convenience.go +++ b/pkg/contexts/ocm/signing/convenience.go @@ -1,10 +1,11 @@ package signing import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/signingattr" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" ) diff --git a/pkg/contexts/ocm/signing/digestctx.go b/pkg/contexts/ocm/signing/digestctx.go index 039949dacd..5fa01a20fa 100644 --- a/pkg/contexts/ocm/signing/digestctx.go +++ b/pkg/contexts/ocm/signing/digestctx.go @@ -3,11 +3,12 @@ package signing import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/signutils" "github.com/open-component-model/ocm/pkg/utils" diff --git a/pkg/contexts/ocm/signing/handle.go b/pkg/contexts/ocm/signing/handle.go index 9513b8eb3a..f7b4723e0b 100644 --- a/pkg/contexts/ocm/signing/handle.go +++ b/pkg/contexts/ocm/signing/handle.go @@ -7,6 +7,10 @@ import ( "reflect" "time" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/general" + "github.com/mandelsoft/goutils/generics" "github.com/mandelsoft/logging" "github.com/open-component-model/ocm/pkg/common" @@ -14,13 +18,9 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/none" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/signutils" "github.com/open-component-model/ocm/pkg/signing/tsa" - "github.com/open-component-model/ocm/pkg/utils" ) var REALM = logging.NewRealm("signing") @@ -109,7 +109,7 @@ func Apply(printer common.Printer, state *WalkingState, cv ocm.ComponentVersionA s := NewWalkingState(cv.GetContext().LoggingContext().WithContext(REALM)) state = &s } - dc, err := apply(*state, cv, opts, utils.Optional(closecv...)) + dc, err := apply(*state, cv, opts, general.Optional(closecv...)) if err != nil { return nil, err } @@ -702,5 +702,5 @@ func GetDigestMode(cd *compdesc.ComponentDescriptor, def ...string) string { return DIGESTMODE_LOCAL } } - return utils.Optional(def...) + return general.Optional(def...) } diff --git a/pkg/contexts/ocm/signing/options.go b/pkg/contexts/ocm/signing/options.go index d286fc0016..0384d9afa9 100644 --- a/pkg/contexts/ocm/signing/options.go +++ b/pkg/contexts/ocm/signing/options.go @@ -5,13 +5,14 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/generics" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/rootcertsattr" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/signingattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/hasher/sha256" "github.com/open-component-model/ocm/pkg/signing/signutils" diff --git a/pkg/contexts/ocm/signing/signing_test.go b/pkg/contexts/ocm/signing/signing_test.go index 43d8a31140..4ec44fc1a7 100644 --- a/pkg/contexts/ocm/signing/signing_test.go +++ b/pkg/contexts/ocm/signing/signing_test.go @@ -5,13 +5,13 @@ import ( "fmt" "time" + . "github.com/mandelsoft/goutils/finalizer" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/contexts/oci/testhelper" . "github.com/open-component-model/ocm/pkg/contexts/ocm/signing" . "github.com/open-component-model/ocm/pkg/contexts/ocm/testhelper" . "github.com/open-component-model/ocm/pkg/env/builder" - . "github.com/open-component-model/ocm/pkg/finalizer" . "github.com/open-component-model/ocm/pkg/testutils" "github.com/open-component-model/ocm/pkg/common" diff --git a/pkg/contexts/ocm/signing/transport_test.go b/pkg/contexts/ocm/signing/transport_test.go index 7ced4dd61e..bd71aa80b3 100644 --- a/pkg/contexts/ocm/signing/transport_test.go +++ b/pkg/contexts/ocm/signing/transport_test.go @@ -11,6 +11,8 @@ import ( . "github.com/open-component-model/ocm/pkg/env/builder" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" @@ -23,7 +25,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/signing" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" ) diff --git a/pkg/contexts/ocm/transfer/autohandler.go b/pkg/contexts/ocm/transfer/autohandler.go index 77d01bdac3..f559c951b7 100644 --- a/pkg/contexts/ocm/transfer/autohandler.go +++ b/pkg/contexts/ocm/transfer/autohandler.go @@ -3,9 +3,10 @@ package transfer import ( "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" - "github.com/open-component-model/ocm/pkg/errors" ) func init() { diff --git a/pkg/contexts/ocm/transfer/autohandler_test.go b/pkg/contexts/ocm/transfer/autohandler_test.go index 7ccee7de85..2370e26828 100644 --- a/pkg/contexts/ocm/transfer/autohandler_test.go +++ b/pkg/contexts/ocm/transfer/autohandler_test.go @@ -5,11 +5,11 @@ import ( . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/spiff" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" - "github.com/open-component-model/ocm/pkg/errors" ) type errorOption struct { diff --git a/pkg/contexts/ocm/transfer/transfer.go b/pkg/contexts/ocm/transfer/transfer.go index fd76f7ef1a..2033d4e9a8 100644 --- a/pkg/contexts/ocm/transfer/transfer.go +++ b/pkg/contexts/ocm/transfer/transfer.go @@ -3,6 +3,8 @@ package transfer import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/logging" "github.com/open-component-model/ocm/pkg/common" @@ -12,8 +14,7 @@ import ( ocmcpi "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/internal" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" + "github.com/open-component-model/ocm/pkg/errkind" "github.com/open-component-model/ocm/pkg/runtime" ) @@ -279,7 +280,7 @@ func copyVersion(printer common.Printer, log logging.Logger, hist common.History } } if err != nil { - if !errors.IsErrUnknownKind(err, errors.KIND_ACCESSMETHOD) { + if !errors.IsErrUnknownKind(err, errkind.KIND_ACCESSMETHOD) { return errors.Wrapf(err, "%s: transferring resource %d", hist, i) } printer.Printf("WARN: %s: transferring resource %d: %s (enforce transport by reference)\n", hist, i, err) @@ -317,7 +318,7 @@ func copyVersion(printer common.Printer, log logging.Logger, hist common.History err = errors.Join(err, m.Close()) } if err != nil { - if !errors.IsErrUnknownKind(err, errors.KIND_ACCESSMETHOD) { + if !errors.IsErrUnknownKind(err, errkind.KIND_ACCESSMETHOD) { return errors.Wrapf(err, "%s: transferring source %d", hist, i) } printer.Printf("WARN: %s: transferring source %d: %s (enforce transport by reference)\n", hist, i, err) diff --git a/pkg/contexts/ocm/transfer/transferhandler/spiff/handler.go b/pkg/contexts/ocm/transfer/transferhandler/spiff/handler.go index 0297c09408..d06f8a9469 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/spiff/handler.go +++ b/pkg/contexts/ocm/transfer/transferhandler/spiff/handler.go @@ -4,6 +4,7 @@ import ( "encoding/json" "strconv" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/spiff/dynaml" "github.com/mandelsoft/spiff/features" "github.com/mandelsoft/spiff/spiffing" @@ -14,7 +15,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/transfer/transferhandler/spiff/options.go b/pkg/contexts/ocm/transfer/transferhandler/spiff/options.go index db74ca9419..ae395dbb0e 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/spiff/options.go +++ b/pkg/contexts/ocm/transfer/transferhandler/spiff/options.go @@ -1,12 +1,12 @@ package spiff import ( + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/spiff/spiffing" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/ocm/transfer/transferhandler/standard/handler.go b/pkg/contexts/ocm/transfer/transferhandler/standard/handler.go index 36d33566fa..24965f3873 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/standard/handler.go +++ b/pkg/contexts/ocm/transfer/transferhandler/standard/handler.go @@ -3,6 +3,8 @@ package standard import ( "time" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" @@ -10,7 +12,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler" - "github.com/open-component-model/ocm/pkg/errors" ) type Handler struct { diff --git a/pkg/contexts/ocm/transfer/transferhandler/standard/handler_test.go b/pkg/contexts/ocm/transfer/transferhandler/standard/handler_test.go index bc72fbd131..76415cc4c9 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/standard/handler_test.go +++ b/pkg/contexts/ocm/transfer/transferhandler/standard/handler_test.go @@ -11,6 +11,8 @@ import ( . "github.com/open-component-model/ocm/pkg/env/builder" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/finalizer" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/common/accessio" @@ -31,7 +33,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" diff --git a/pkg/contexts/ocm/transfer/transferhandler/standard/options.go b/pkg/contexts/ocm/transfer/transferhandler/standard/options.go index 5ee687e658..080c59743a 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/standard/options.go +++ b/pkg/contexts/ocm/transfer/transferhandler/standard/options.go @@ -1,14 +1,16 @@ package standard import ( + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/maputils" + "github.com/mandelsoft/goutils/set" + "github.com/mandelsoft/goutils/sliceutils" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/runtime" - "github.com/open-component-model/ocm/pkg/utils" ) func init() { @@ -26,8 +28,8 @@ type Options struct { enforceTransport *bool overwrite *bool skipUpdate *bool - omitAccessTypes utils.StringSet - omitArtifactTypes utils.StringSet + omitAccessTypes set.Set[string] + omitArtifactTypes set.Set[string] resolver ocm.ComponentVersionResolver } @@ -111,12 +113,12 @@ func (o *Options) ApplyTransferOption(target transferhandler.TransferOptions) er } if o.omitAccessTypes != nil { if opts, ok := target.(OmitAccessTypesOption); ok { - opts.SetOmittedAccessTypes(utils.StringMapKeys(o.omitAccessTypes)...) + opts.SetOmittedAccessTypes(maputils.OrderedKeys(o.omitAccessTypes)...) } } if o.omitArtifactTypes != nil { if opts, ok := target.(OmitArtifactTypesOption); ok { - opts.SetOmittedArtifactTypes(utils.StringMapKeys(o.omitAccessTypes)...) + opts.SetOmittedArtifactTypes(maputils.OrderedKeys(o.omitAccessTypes)...) } } if o.resolver != nil { @@ -136,7 +138,7 @@ func (o *Options) SetEnforceTransport(enforce bool) { } func (o *Options) IsTransportEnforced() bool { - return utils.AsBool(o.enforceTransport) + return optionutils.AsBool(o.enforceTransport) } func (o *Options) SetOverwrite(overwrite bool) { @@ -144,7 +146,7 @@ func (o *Options) SetOverwrite(overwrite bool) { } func (o *Options) IsOverwrite() bool { - return utils.AsBool(o.overwrite) + return optionutils.AsBool(o.overwrite) } func (o *Options) SetSkipUpdate(skipupdate bool) { @@ -152,7 +154,7 @@ func (o *Options) SetSkipUpdate(skipupdate bool) { } func (o *Options) IsSkipUpdate() bool { - return utils.AsBool(o.skipUpdate) + return optionutils.AsBool(o.skipUpdate) } func (o *Options) SetRecursive(recursive bool) { @@ -160,7 +162,7 @@ func (o *Options) SetRecursive(recursive bool) { } func (o *Options) IsRecursive() bool { - return utils.AsBool(o.recursive) + return optionutils.AsBool(o.recursive) } func (o *Options) SetResourcesByValue(resourcesByValue bool) { @@ -168,7 +170,7 @@ func (o *Options) SetResourcesByValue(resourcesByValue bool) { } func (o *Options) IsResourcesByValue() bool { - return utils.AsBool(o.resourcesByValue) + return optionutils.AsBool(o.resourcesByValue) } func (o *Options) SetLocalResourcesByValue(resourcesByValue bool) { @@ -176,7 +178,7 @@ func (o *Options) SetLocalResourcesByValue(resourcesByValue bool) { } func (o *Options) IsLocalResourcesByValue() bool { - return utils.AsBool(o.localByValue) + return optionutils.AsBool(o.localByValue) } func (o *Options) SetSourcesByValue(sourcesByValue bool) { @@ -184,7 +186,7 @@ func (o *Options) SetSourcesByValue(sourcesByValue bool) { } func (o *Options) IsSourcesByValue() bool { - return utils.AsBool(o.sourcesByValue) + return optionutils.AsBool(o.sourcesByValue) } func (o *Options) SetKeepGlobalAccess(keepGlobalAccess bool) { @@ -192,7 +194,7 @@ func (o *Options) SetKeepGlobalAccess(keepGlobalAccess bool) { } func (o *Options) IsKeepGlobalAccess() bool { - return utils.AsBool(o.keepGlobalAccess) + return optionutils.AsBool(o.keepGlobalAccess) } func (o *Options) SetRetries(retries int) { @@ -219,11 +221,11 @@ func (o *Options) SetStopOnExistingVersion(stopOnExistingVersion bool) { } func (o *Options) IsStopOnExistingVersion() bool { - return utils.AsBool(o.stopOnExisting) + return optionutils.AsBool(o.stopOnExisting) } func (o *Options) SetOmittedAccessTypes(list ...string) { - o.omitAccessTypes = utils.StringSet{} + o.omitAccessTypes = set.New[string]() for _, t := range list { o.omitAccessTypes.Add(t) } @@ -231,7 +233,7 @@ func (o *Options) SetOmittedAccessTypes(list ...string) { func (o *Options) AddOmittedAccessTypes(list ...string) { if o.omitAccessTypes == nil { - o.omitAccessTypes = utils.StringSet{} + o.omitAccessTypes = set.New[string]() } for _, t := range list { o.omitAccessTypes.Add(t) @@ -242,7 +244,7 @@ func (o *Options) GetOmittedAccessTypes() []string { if o.omitAccessTypes == nil { return nil } - return utils.StringMapKeys(o.omitAccessTypes) + return maputils.OrderedKeys(o.omitAccessTypes) } func (o *Options) IsAccessTypeOmitted(t string) bool { @@ -257,7 +259,7 @@ func (o *Options) IsAccessTypeOmitted(t string) bool { } func (o *Options) SetOmittedArtifactTypes(list ...string) { - o.omitArtifactTypes = utils.StringSet{} + o.omitArtifactTypes = set.New[string]() for _, t := range list { o.omitArtifactTypes.Add(t) } @@ -265,7 +267,7 @@ func (o *Options) SetOmittedArtifactTypes(list ...string) { func (o *Options) AddOmittedArtifactTypes(list ...string) { if o.omitArtifactTypes == nil { - o.omitArtifactTypes = utils.StringSet{} + o.omitArtifactTypes = set.New[string]() } for _, t := range list { o.omitArtifactTypes.Add(t) @@ -276,7 +278,7 @@ func (o *Options) GetOmittedArtifactTypes() []string { if o.omitArtifactTypes == nil { return nil } - return utils.StringMapKeys(o.omitArtifactTypes) + return maputils.OrderedKeys(o.omitArtifactTypes) } func (o *Options) IsArtifactTypeOmitted(t string) bool { @@ -315,7 +317,7 @@ func (o *enforceTransportOption) ApplyTransferOption(to transferhandler.Transfer // as if the component version were not present at the destination. func EnforceTransport(args ...bool) transferhandler.TransferOption { return &enforceTransportOption{ - enforce: utils.GetOptionFlag(args...), + enforce: optionutils.GetOptionFlag(args...), } } @@ -343,7 +345,7 @@ func (o *overwriteOption) ApplyTransferOption(to transferhandler.TransferOptions // Overwrite enables the modification of digest relevant information in a component version. func Overwrite(args ...bool) transferhandler.TransferOption { return &overwriteOption{ - overwrite: utils.GetOptionFlag(args...), + overwrite: optionutils.GetOptionFlag(args...), } } @@ -367,7 +369,7 @@ func (o skipUpdateOption) ApplyTransferOption(to transferhandler.TransferOptions // SkipUpdate enables the modification of non-digest (volatile) relevant information in a component version. func SkipUpdate(args ...bool) transferhandler.TransferOption { - return skipUpdateOption(utils.GetOptionFlag(args...)) + return skipUpdateOption(optionutils.GetOptionFlag(args...)) } /////////////////////////////////////////////////////////////////////////////// @@ -419,7 +421,7 @@ func (o *recursiveOption) ApplyTransferOption(to transferhandler.TransferOptions // Recursive enables the transport of the reference closure of a component version. func Recursive(args ...bool) transferhandler.TransferOption { - return &recursiveOption{flag: utils.GetOptionFlag(args...)} + return &recursiveOption{flag: optionutils.GetOptionFlag(args...)} } /////////////////////////////////////////////////////////////////////////////// @@ -445,7 +447,7 @@ func (o *resourcesByValueOption) ApplyTransferOption(to transferhandler.Transfer // ResourcesByValue enables the transport a resources by values instead of by-reference. func ResourcesByValue(args ...bool) transferhandler.TransferOption { - return &resourcesByValueOption{flag: utils.GetOptionFlag(args...)} + return &resourcesByValueOption{flag: optionutils.GetOptionFlag(args...)} } /////////////////////////////////////////////////////////////////////////////// @@ -471,7 +473,7 @@ func (o *intrscsByValueOption) ApplyTransferOption(to transferhandler.TransferOp // LocalResourcesByValue enables the transport a local (relation) resources by values instead of by-reference. func LocalResourcesByValue(args ...bool) transferhandler.TransferOption { - return &intrscsByValueOption{flag: utils.GetOptionFlag(args...)} + return &intrscsByValueOption{flag: optionutils.GetOptionFlag(args...)} } /////////////////////////////////////////////////////////////////////////////// @@ -497,7 +499,7 @@ func (o *sourcesByValueOption) ApplyTransferOption(to transferhandler.TransferOp // SourcesByValue enables the transport a sources by values instead of by-reference. func SourcesByValue(args ...bool) transferhandler.TransferOption { - return &sourcesByValueOption{flag: utils.GetOptionFlag(args...)} + return &sourcesByValueOption{flag: optionutils.GetOptionFlag(args...)} } /////////////////////////////////////////////////////////////////////////////// @@ -551,7 +553,7 @@ func (o *keepGlobalOption) ApplyTransferOption(to transferhandler.TransferOption // KeepGlobalAccess enables to keep local blobs if uploaders are used to upload imported blobs. func KeepGlobalAccess(args ...bool) transferhandler.TransferOption { - return &keepGlobalOption{flag: utils.GetOptionFlag(args...)} + return &keepGlobalOption{flag: optionutils.GetOptionFlag(args...)} } /////////////////////////////////////////////////////////////////////////////// @@ -577,7 +579,7 @@ func (o *stopOnExistingVersionOption) ApplyTransferOption(to transferhandler.Tra // StopOnExistingVersion stops the recursion on component versions already present in target. func StopOnExistingVersion(args ...bool) transferhandler.TransferOption { - return &stopOnExistingVersionOption{flag: utils.GetOptionFlag(args...)} + return &stopOnExistingVersionOption{flag: optionutils.GetOptionFlag(args...)} } /////////////////////////////////////////////////////////////////////////////// @@ -596,7 +598,7 @@ type omitAccessTypesOption struct { func (o *omitAccessTypesOption) ApplyTransferOption(to transferhandler.TransferOptions) error { if eff, ok := to.(OmitAccessTypesOption); ok { if o.add { - eff.SetOmittedAccessTypes(generics.AppendedSlice(eff.GetOmittedAccessTypes(), o.list...)...) + eff.SetOmittedAccessTypes(sliceutils.CopyAppend(eff.GetOmittedAccessTypes(), o.list...)...) } else { eff.SetOmittedAccessTypes(o.list...) } diff --git a/pkg/contexts/ocm/transfer/transferhandler/standard/utils.go b/pkg/contexts/ocm/transfer/transferhandler/standard/utils.go index 9fb9a53e06..d3404dd424 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/standard/utils.go +++ b/pkg/contexts/ocm/transfer/transferhandler/standard/utils.go @@ -4,7 +4,7 @@ import ( "reflect" "strings" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/mandelsoft/goutils/generics" ) // HandleOption handles an option value (O) to be transferred to an diff --git a/pkg/contexts/ocm/transfer/transferhandler/standard/utils_test.go b/pkg/contexts/ocm/transfer/transferhandler/standard/utils_test.go index b181690d9f..ea7cc35038 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/standard/utils_test.go +++ b/pkg/contexts/ocm/transfer/transferhandler/standard/utils_test.go @@ -4,8 +4,9 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/mandelsoft/goutils/generics" + me "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" - "github.com/open-component-model/ocm/pkg/generics" ) type Target struct { diff --git a/pkg/contexts/ocm/transfer/transferhandler/transferhandler.go b/pkg/contexts/ocm/transfer/transferhandler/transferhandler.go index 264421e86c..c1c1b8f131 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/transferhandler.go +++ b/pkg/contexts/ocm/transfer/transferhandler/transferhandler.go @@ -1,11 +1,12 @@ package transferhandler import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/config" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" ) const KIND_TRANSFEROPTION = "transfer option" diff --git a/pkg/contexts/ocm/transfer/transferrepo.go b/pkg/contexts/ocm/transfer/transferrepo.go index f60bb1f69a..422b7339b2 100644 --- a/pkg/contexts/ocm/transfer/transferrepo.go +++ b/pkg/contexts/ocm/transfer/transferrepo.go @@ -1,11 +1,12 @@ package transfer import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" - "github.com/open-component-model/ocm/pkg/errors" ) func TransferComponents(printer common.Printer, closure TransportClosure, repo ocm.Repository, prefix string, all bool, tgt ocm.Repository, handler TransferHandler) error { diff --git a/pkg/contexts/ocm/utils.go b/pkg/contexts/ocm/utils.go index 2d65083b03..6eefbd60e3 100644 --- a/pkg/contexts/ocm/utils.go +++ b/pkg/contexts/ocm/utils.go @@ -5,6 +5,7 @@ import ( "io" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common" @@ -14,7 +15,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/internal" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/ocm/utils/check/check.go b/pkg/contexts/ocm/utils/check/check.go index 12124d9b10..989ae2a84a 100644 --- a/pkg/contexts/ocm/utils/check/check.go +++ b/pkg/contexts/ocm/utils/check/check.go @@ -3,11 +3,12 @@ package check import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/optionutils" ) diff --git a/pkg/contexts/ocm/utils/configure.go b/pkg/contexts/ocm/utils/configure.go index aedbbad5fe..574eaab037 100644 --- a/pkg/contexts/ocm/utils/configure.go +++ b/pkg/contexts/ocm/utils/configure.go @@ -5,6 +5,7 @@ import ( "os" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/spiff/features" "github.com/mandelsoft/spiff/spiffing" "github.com/mandelsoft/vfs/pkg/vfs" @@ -12,7 +13,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/config" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/defaultconfigregistry" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/ocm/utils/localize/config.go b/pkg/contexts/ocm/utils/localize/config.go index 8ea8d9dbc0..e98346c42d 100644 --- a/pkg/contexts/ocm/utils/localize/config.go +++ b/pkg/contexts/ocm/utils/localize/config.go @@ -3,13 +3,13 @@ package localize import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/sliceutils" "github.com/mandelsoft/spiff/spiffing" "github.com/open-component-model/ocm/pkg/contexts/ocm" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/spiff" ) @@ -98,7 +98,7 @@ func Configure( if l, ok := cur.([]interface{}); !ok { return nil, errors.Newf("node 'configRules' in template must be a list of configuration requests") } else { - temp["configRules"] = generics.AppendedSlice(l, cfglist...) + temp["configRules"] = sliceutils.CopyAppend(l, cfglist...) } } else { temp["configRules"] = cfglist @@ -125,5 +125,5 @@ func Configure( ConfigRules Substitutions `json:"configRules,omitempty"` } err = runtime.DefaultYAMLEncoding.Unmarshal(config, &subst) - return generics.AppendedSlice(subst.Adjustments, subst.ConfigRules...), err + return sliceutils.CopyAppend(subst.Adjustments, subst.ConfigRules...), err } diff --git a/pkg/contexts/ocm/utils/localize/format.go b/pkg/contexts/ocm/utils/localize/format.go index 0fa56defbf..5f2a487d13 100644 --- a/pkg/contexts/ocm/utils/localize/format.go +++ b/pkg/contexts/ocm/utils/localize/format.go @@ -5,10 +5,11 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm" v1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/utils/localize/instantiate.go b/pkg/contexts/ocm/utils/localize/instantiate.go index 35d66361f9..8792cc1759 100644 --- a/pkg/contexts/ocm/utils/localize/instantiate.go +++ b/pkg/contexts/ocm/utils/localize/instantiate.go @@ -1,6 +1,7 @@ package localize import ( + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common" @@ -8,7 +9,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/download" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" ) func Instantiate(rules *InstantiationRules, cv ocm.ComponentVersionAccess, resolver ocm.ComponentVersionResolver, config []byte, fs vfs.FileSystem, types ...string) error { diff --git a/pkg/contexts/ocm/utils/localize/subst.go b/pkg/contexts/ocm/utils/localize/subst.go index 36ec20f681..cbe35c0c8b 100644 --- a/pkg/contexts/ocm/utils/localize/subst.go +++ b/pkg/contexts/ocm/utils/localize/subst.go @@ -1,9 +1,9 @@ package localize import ( + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils/subst" ) diff --git a/pkg/contexts/ocm/utils/registry/registry.go b/pkg/contexts/ocm/utils/registry/registry.go index b61741e1f5..ca11703a0f 100644 --- a/pkg/contexts/ocm/utils/registry/registry.go +++ b/pkg/contexts/ocm/utils/registry/registry.go @@ -3,9 +3,9 @@ package registry import ( "strings" + "github.com/mandelsoft/goutils/set" "golang.org/x/exp/slices" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/mime" ) @@ -76,8 +76,8 @@ func (p *Registry[H, K]) LookupHandler(key K) []H { return p.lookupMedia(key.SetArtifact("", mediatype)) } -func (p *Registry[H, K]) LookupKeys(key K) generics.Set[K] { - found := generics.Set[K]{} +func (p *Registry[H, K]) LookupKeys(key K) set.Set[K] { + found := set.New[K]() if len(p.LookupHandler(key)) > 0 { found.Add(key) diff --git a/pkg/contexts/ocm/utils/registry/registry_test.go b/pkg/contexts/ocm/utils/registry/registry_test.go index a55f364817..3dfd2dd514 100644 --- a/pkg/contexts/ocm/utils/registry/registry_test.go +++ b/pkg/contexts/ocm/utils/registry/registry_test.go @@ -4,8 +4,9 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/mandelsoft/goutils/set" + "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/registry" - "github.com/open-component-model/ocm/pkg/generics" ) var aKey = registry.RegistrationKey{}.SetArtifact("a", "") @@ -85,7 +86,7 @@ var _ = Describe("lookup", func() { reg.Register(registry.RegistrationKey{}.SetArtifact("a1", "m"), "testa") keys := reg.LookupKeys(aKey) - Expect(keys).To(Equal(generics.NewSet(amKey, am1Key))) + Expect(keys).To(Equal(set.New(amKey, am1Key))) }) It("fills missing", func() { @@ -94,7 +95,7 @@ var _ = Describe("lookup", func() { reg.Register(registry.RegistrationKey{}.SetArtifact("a1", "m"), "testa") keys := reg.LookupKeys(mKey) - Expect(keys).To(Equal(generics.NewSet(a1mKey))) + Expect(keys).To(Equal(set.New(a1mKey))) }) It("fills more specific media", func() { reg.Register(registry.RegistrationKey{}.SetArtifact("a", "m+tar"), "test") @@ -102,7 +103,7 @@ var _ = Describe("lookup", func() { reg.Register(registry.RegistrationKey{}.SetArtifact("a1", "m"), "testa") keys := reg.LookupKeys(amKey) - Expect(keys).To(Equal(generics.NewSet(amtarKey))) + Expect(keys).To(Equal(set.New(amtarKey))) }) }) }) diff --git a/pkg/contexts/ocm/utils/resourceref.go b/pkg/contexts/ocm/utils/resourceref.go index 7168a40f61..a567b2cace 100644 --- a/pkg/contexts/ocm/utils/resourceref.go +++ b/pkg/contexts/ocm/utils/resourceref.go @@ -3,12 +3,13 @@ package utils import ( "fmt" - . "github.com/open-component-model/ocm/pkg/finalizer" + . "github.com/mandelsoft/goutils/finalizer" + + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" ) func ResolveReferencePath(cv ocm.ComponentVersionAccess, path []metav1.Identity, resolver ocm.ComponentVersionResolver) (ocm.ComponentVersionAccess, error) { diff --git a/pkg/contexts/ocm/utils/utils.go b/pkg/contexts/ocm/utils/utils.go index f86636fbdc..ce6d936329 100644 --- a/pkg/contexts/ocm/utils/utils.go +++ b/pkg/contexts/ocm/utils/utils.go @@ -1,10 +1,11 @@ package utils import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/ociartifact" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" ) func GetOCIArtifactRef(ctxp ocm.ContextProvider, r ocm.ResourceAccess) (string, error) { diff --git a/pkg/contexts/ocm/utils/walk.go b/pkg/contexts/ocm/utils/walk.go index 2330a87aa6..30809fc6b6 100644 --- a/pkg/contexts/ocm/utils/walk.go +++ b/pkg/contexts/ocm/utils/walk.go @@ -1,9 +1,10 @@ package utils import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/errors" ) // WalkingStep is used to process a component version during graph traversal. diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/config.go b/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/config.go index 33f855ada5..5288ead628 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/config.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge/config.go @@ -2,8 +2,9 @@ package defaultmerge import ( // special case to resolve dependency cycles. + "github.com/mandelsoft/goutils/errors" + hpi "github.com/open-component-model/ocm/pkg/contexts/ocm/valuemergehandler/internal" - "github.com/open-component-model/ocm/pkg/errors" ) type Mode string diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/handler.go b/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/handler.go index c629ee09cd..a22c163b58 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/handler.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/maplistmerge/handler.go @@ -4,9 +4,10 @@ import ( "fmt" "reflect" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/valuemergehandler/hpi" - "github.com/open-component-model/ocm/pkg/errors" ) const ALGORITHM = "mapListMerge" diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/plugin/handler.go b/pkg/contexts/ocm/valuemergehandler/handlers/plugin/handler.go index 8f58da2106..03cdbefcbd 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/plugin/handler.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/plugin/handler.go @@ -3,10 +3,11 @@ package plugin import ( "encoding/json" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin" "github.com/open-component-model/ocm/pkg/contexts/ocm/plugin/descriptor" "github.com/open-component-model/ocm/pkg/contexts/ocm/valuemergehandler/hpi" - "github.com/open-component-model/ocm/pkg/errors" ) // pluginHandler delegates action to a plugin based handler. diff --git a/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/handler.go b/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/handler.go index 03a0b3f278..b44e147fbb 100644 --- a/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/handler.go +++ b/pkg/contexts/ocm/valuemergehandler/handlers/simplemapmerge/handler.go @@ -4,8 +4,9 @@ import ( "fmt" "reflect" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/valuemergehandler/hpi" - "github.com/open-component-model/ocm/pkg/errors" ) const ALGORITHM = "simpleMapMerge" diff --git a/pkg/contexts/ocm/valuemergehandler/hpi/merge.go b/pkg/contexts/ocm/valuemergehandler/hpi/merge.go index 2a31c1bfbb..528d9959d9 100644 --- a/pkg/contexts/ocm/valuemergehandler/hpi/merge.go +++ b/pkg/contexts/ocm/valuemergehandler/hpi/merge.go @@ -3,8 +3,9 @@ package hpi import ( "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/valuemergehandler/handlers/defaultmerge" - "github.com/open-component-model/ocm/pkg/errors" ) func AsValue(v interface{}) (*Value, error) { diff --git a/pkg/contexts/ocm/valuemergehandler/internal/support.go b/pkg/contexts/ocm/valuemergehandler/internal/support.go index 8200b3c603..bc4dfdc494 100644 --- a/pkg/contexts/ocm/valuemergehandler/internal/support.go +++ b/pkg/contexts/ocm/valuemergehandler/internal/support.go @@ -3,7 +3,8 @@ package internal import ( "fmt" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/options/utils.go b/pkg/contexts/options/utils.go index 5be48cac2d..96702b11f2 100644 --- a/pkg/contexts/options/utils.go +++ b/pkg/contexts/options/utils.go @@ -3,7 +3,7 @@ package options import ( "reflect" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/mandelsoft/goutils/generics" ) func FilterOptions[T any, O any](opts []O) []T { @@ -12,7 +12,7 @@ func FilterOptions[T any, O any](opts []O) []T { t := generics.TypeOf[T]() for _, o := range opts { if reflect.TypeOf(o).AssignableTo(t) { - found = append(found, generics.As[T](o)) + found = append(found, generics.Cast[T](o)) } } return found diff --git a/pkg/dirtree/dirtree.go b/pkg/dirtree/dirtree.go index 5fba1c09a7..ff78c0fefb 100644 --- a/pkg/dirtree/dirtree.go +++ b/pkg/dirtree/dirtree.go @@ -8,10 +8,10 @@ import ( "sort" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/logging" "github.com/mandelsoft/vfs/pkg/vfs" - "github.com/open-component-model/ocm/pkg/errors" ocmlog "github.com/open-component-model/ocm/pkg/logging" ) diff --git a/pkg/dirtree/tar.go b/pkg/dirtree/tar.go index e64b4fa28f..5a223ae068 100644 --- a/pkg/dirtree/tar.go +++ b/pkg/dirtree/tar.go @@ -6,9 +6,8 @@ import ( "io" "path" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" - - "github.com/open-component-model/ocm/pkg/errors" ) func NewTarDirNode(ctx Context, tr *tar.Reader) (*DirNode, error) { diff --git a/pkg/dirtree/vfs.go b/pkg/dirtree/vfs.go index 97b2f04264..bfe0bb453d 100644 --- a/pkg/dirtree/vfs.go +++ b/pkg/dirtree/vfs.go @@ -5,9 +5,9 @@ import ( "os" "path" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/encrypt/encrypt.go b/pkg/encrypt/encrypt.go index 8f3890faa7..2bbb223475 100644 --- a/pkg/encrypt/encrypt.go +++ b/pkg/encrypt/encrypt.go @@ -7,9 +7,9 @@ import ( "encoding/pem" "io" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/env/builder/builder.go b/pkg/env/builder/builder.go index 40dc6efdab..9e1a8d14fa 100644 --- a/pkg/env/builder/builder.go +++ b/pkg/env/builder/builder.go @@ -1,6 +1,7 @@ package builder import ( + "github.com/mandelsoft/goutils/exception" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/modern-go/reflect2" "github.com/onsi/ginkgo/v2" @@ -13,7 +14,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/env" - "github.com/open-component-model/ocm/pkg/exception" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/env/builder/builder_test.go b/pkg/env/builder/builder_test.go index eb75115391..2620ff9e66 100644 --- a/pkg/env/builder/builder_test.go +++ b/pkg/env/builder/builder_test.go @@ -6,7 +6,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/exception" + "github.com/mandelsoft/goutils/exception" ) var _ = Describe("Builder", func() { diff --git a/pkg/env/builder/oci_artifact.go b/pkg/env/builder/oci_artifact.go index e0c1030284..7f03e7f843 100644 --- a/pkg/env/builder/oci_artifact.go +++ b/pkg/env/builder/oci_artifact.go @@ -1,10 +1,11 @@ package builder import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" - "github.com/open-component-model/ocm/pkg/errors" ) const ( diff --git a/pkg/env/builder/oci_config.go b/pkg/env/builder/oci_config.go index 1c10841033..71c9cfd742 100644 --- a/pkg/env/builder/oci_config.go +++ b/pkg/env/builder/oci_config.go @@ -1,9 +1,10 @@ package builder import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" - "github.com/open-component-model/ocm/pkg/errors" ) const T_OCICONFIG = "oci config" diff --git a/pkg/env/builder/oci_layer.go b/pkg/env/builder/oci_layer.go index 287054885e..2fa1ebef81 100644 --- a/pkg/env/builder/oci_layer.go +++ b/pkg/env/builder/oci_layer.go @@ -1,9 +1,10 @@ package builder import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/oci/artdesc" - "github.com/open-component-model/ocm/pkg/errors" ) const T_OCILAYER = "oci layer" diff --git a/pkg/env/builder/ocm_resource.go b/pkg/env/builder/ocm_resource.go index 57351c4752..97807b86b6 100644 --- a/pkg/env/builder/ocm_resource.go +++ b/pkg/env/builder/ocm_resource.go @@ -1,11 +1,12 @@ package builder import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/errors" ) type ocmResource struct { diff --git a/pkg/env/builder/ocm_source.go b/pkg/env/builder/ocm_source.go index dd788cb473..62b3f8bb5d 100644 --- a/pkg/env/builder/ocm_source.go +++ b/pkg/env/builder/ocm_source.go @@ -1,9 +1,10 @@ package builder import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" - "github.com/open-component-model/ocm/pkg/errors" ) type ocmSource struct { diff --git a/pkg/env/builder/ocm_version.go b/pkg/env/builder/ocm_version.go index f23bf0a479..204d202dac 100644 --- a/pkg/env/builder/ocm_version.go +++ b/pkg/env/builder/ocm_version.go @@ -1,9 +1,10 @@ package builder import ( + "github.com/mandelsoft/goutils/errors" + metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/errors" ) const T_OCMVERSION = "component version" diff --git a/pkg/env/env.go b/pkg/env/env.go index 66c1a85cb7..ffbabb5de9 100644 --- a/pkg/env/env.go +++ b/pkg/env/env.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/DataDog/gostackparse" + "github.com/mandelsoft/goutils/exception" "github.com/mandelsoft/vfs/pkg/composefs" "github.com/mandelsoft/vfs/pkg/layerfs" "github.com/mandelsoft/vfs/pkg/memoryfs" @@ -21,7 +22,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/exception" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/errors/kinds.go b/pkg/errkind/kinds.go similarity index 53% rename from pkg/errors/kinds.go rename to pkg/errkind/kinds.go index 9a8a2a3fa9..8f5b75d022 100644 --- a/pkg/errors/kinds.go +++ b/pkg/errkind/kinds.go @@ -1,4 +1,8 @@ -package errors +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package errkind const ( KIND_FUNCTION = "function" diff --git a/pkg/errors/utils.go b/pkg/errkind/utils.go similarity index 54% rename from pkg/errors/utils.go rename to pkg/errkind/utils.go index 77d41f17b2..63f28e2235 100644 --- a/pkg/errors/utils.go +++ b/pkg/errkind/utils.go @@ -1,4 +1,8 @@ -package errors +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package errkind import ( "errors" diff --git a/pkg/errors/doc.go b/pkg/errors/doc.go new file mode 100644 index 0000000000..5209583143 --- /dev/null +++ b/pkg/errors/doc.go @@ -0,0 +1,6 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +// Deprectated: use github.com/mandelsoft/goutils/errors +package errors diff --git a/pkg/errors/error_test.go b/pkg/errors/error_test.go index 7a8275d455..3080551a8e 100644 --- a/pkg/errors/error_test.go +++ b/pkg/errors/error_test.go @@ -4,7 +4,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) var _ = Describe("errors", func() { diff --git a/pkg/errors/errprop_test.go b/pkg/errors/errprop_test.go index 7ceb009fa1..0809e0b62f 100644 --- a/pkg/errors/errprop_test.go +++ b/pkg/errors/errprop_test.go @@ -6,7 +6,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) func errfunc(succeed bool) func() error { diff --git a/pkg/exception/doc.go b/pkg/exception/doc.go new file mode 100644 index 0000000000..aa618166d8 --- /dev/null +++ b/pkg/exception/doc.go @@ -0,0 +1,6 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +// Deprecated: use github.com/mandelsoft/goutils/exception +package exception diff --git a/pkg/exception/exception.go b/pkg/exception/exception.go index 907937d1ae..92b9112888 100644 --- a/pkg/exception/exception.go +++ b/pkg/exception/exception.go @@ -22,7 +22,7 @@ package exception import ( - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) type Matcher func(err error) bool diff --git a/pkg/exception/exception_test.go b/pkg/exception/exception_test.go index 5861d55039..33e95ccda5 100644 --- a/pkg/exception/exception_test.go +++ b/pkg/exception/exception_test.go @@ -6,7 +6,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/pkg/exception" ) diff --git a/pkg/finalizer/closer.go b/pkg/finalizer/closer.go index 774a8aa64c..bab54cfdf1 100644 --- a/pkg/finalizer/closer.go +++ b/pkg/finalizer/closer.go @@ -3,8 +3,9 @@ package finalizer import ( "io" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common" - "github.com/open-component-model/ocm/pkg/errors" ) type readcloser = io.ReadCloser diff --git a/pkg/finalizer/doc.go b/pkg/finalizer/doc.go new file mode 100644 index 0000000000..969beb562b --- /dev/null +++ b/pkg/finalizer/doc.go @@ -0,0 +1,6 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +// Deprecated: use github.com/mandelsoft/goutils/finalizer +package finalizer diff --git a/pkg/finalizer/finalizer.go b/pkg/finalizer/finalizer.go index 629a3e9a15..89e054d297 100644 --- a/pkg/finalizer/finalizer.go +++ b/pkg/finalizer/finalizer.go @@ -6,8 +6,8 @@ import ( "strings" "sync" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/exception" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/exception" ) type Finalizable interface { diff --git a/pkg/finalizer/finalizer_test.go b/pkg/finalizer/finalizer_test.go index ae8def723c..4bd328271c 100644 --- a/pkg/finalizer/finalizer_test.go +++ b/pkg/finalizer/finalizer_test.go @@ -8,7 +8,8 @@ import ( . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/testutils" - "github.com/open-component-model/ocm/pkg/exception" + "github.com/mandelsoft/goutils/exception" + "github.com/open-component-model/ocm/pkg/finalizer" ) diff --git a/pkg/finalizer/object_test.go b/pkg/finalizer/object_test.go deleted file mode 100644 index 6223988550..0000000000 --- a/pkg/finalizer/object_test.go +++ /dev/null @@ -1,61 +0,0 @@ -package finalizer_test - -import ( - "fmt" - "runtime" - "time" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - - "github.com/open-component-model/ocm/pkg/finalizer" -) - -type ObjectType struct { - kind string - id finalizer.ObjectIdentity - fi *finalizer.RuntimeFinalizer -} - -func NewOType(kind string, r *finalizer.RuntimeFinalizationRecoder) *ObjectType { - id := finalizer.NewObjectIdentity(kind) - o := &ObjectType{ - kind: kind, - id: id, - fi: finalizer.NewRuntimeFinalizer(id, r), - } - return o -} - -func (o *ObjectType) Id() finalizer.ObjectIdentity { - return o.id -} - -var _ = Describe("runtime finalizer", func() { - It("finalize with arbitrary method", func() { - r := &finalizer.RuntimeFinalizationRecoder{} - - o1 := NewOType("test1", r) - o2 := NewOType("test1", r) - - id1 := o1.Id() - id2 := o2.Id() - - runtime.GC() - time.Sleep(time.Second) - - fmt.Printf("still used (%s,%s)\n", o1.Id(), o2.Id()) - Expect(len(r.Get())).To(Equal(0)) - - o1 = nil - runtime.GC() - time.Sleep(time.Second) - fmt.Printf("still used (%s)\n", o2.Id()) - Expect(r.Get()).To(Equal([]finalizer.ObjectIdentity{id1})) - - o2 = nil - runtime.GC() - time.Sleep(time.Second) - Expect(r.Get()).To(Equal([]finalizer.ObjectIdentity{id1, id2})) - }) -}) diff --git a/pkg/generics/cast.go b/pkg/generics/cast.go index 70b365a27c..6a1c023e64 100644 --- a/pkg/generics/cast.go +++ b/pkg/generics/cast.go @@ -4,7 +4,7 @@ import ( "fmt" "reflect" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) // TypeOf returns the reflect.Type object for a formal Go type diff --git a/pkg/generics/doc.go b/pkg/generics/doc.go new file mode 100644 index 0000000000..8c5374c670 --- /dev/null +++ b/pkg/generics/doc.go @@ -0,0 +1,6 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +// Deprecated: use appropriate sub packages in github.com/mandelsoft/goutils +package generics diff --git a/pkg/helm/downloader.go b/pkg/helm/downloader.go index f014f5666b..75db7e7494 100644 --- a/pkg/helm/downloader.go +++ b/pkg/helm/downloader.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "helm.sh/helm/v3/pkg/cli" @@ -19,7 +20,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/directcreds" "github.com/open-component-model/ocm/pkg/contexts/oci" ocihelm "github.com/open-component-model/ocm/pkg/contexts/ocm/download/handlers/helm" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/helm/loader/loader.go b/pkg/helm/loader/loader.go index f400f4c247..8658e0ffb6 100644 --- a/pkg/helm/loader/loader.go +++ b/pkg/helm/loader/loader.go @@ -1,12 +1,12 @@ package loader import ( + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/chart/loader" "github.com/open-component-model/ocm/pkg/blobaccess" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/helm" "github.com/open-component-model/ocm/pkg/iotools" "github.com/open-component-model/ocm/pkg/utils" diff --git a/pkg/iotools/digestreader.go b/pkg/iotools/digestreader.go index af1cf0571a..e04f28892f 100644 --- a/pkg/iotools/digestreader.go +++ b/pkg/iotools/digestreader.go @@ -5,9 +5,8 @@ import ( "hash" "io" + "github.com/mandelsoft/goutils/errors" "github.com/opencontainers/go-digest" - - "github.com/open-component-model/ocm/pkg/errors" ) // wow. digest does support a map with supported digesters. Unfortunately this one does not diff --git a/pkg/iotools/readerwriter.go b/pkg/iotools/readerwriter.go index 85f404936e..893fb4e0e6 100644 --- a/pkg/iotools/readerwriter.go +++ b/pkg/iotools/readerwriter.go @@ -3,8 +3,9 @@ package iotools import ( "io" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/sliceutils" ) //////////////////////////////////////////////////////////////////////////////// @@ -53,7 +54,7 @@ var _ io.ReadCloser = (*readCloser)(nil) // Deprecated: use AddReaderCloser . func AddCloser(reader io.ReadCloser, closer io.Closer, msg ...string) io.ReadCloser { - return AddReaderCloser(reader, closer, generics.ConvertSliceTo[any](msg)...) + return AddReaderCloser(reader, closer, sliceutils.Convert[any](msg)...) } func ReadCloser(r io.Reader) io.ReadCloser { diff --git a/pkg/logging/logging.go b/pkg/logging/logging.go index 02df5b1834..525290efc7 100644 --- a/pkg/logging/logging.go +++ b/pkg/logging/logging.go @@ -4,11 +4,10 @@ import ( "encoding/json" "sync" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/logging" logcfg "github.com/mandelsoft/logging/config" "github.com/opencontainers/go-digest" - - "github.com/open-component-model/ocm/pkg/errors" ) // REALM is used to tag all logging done by this library with the ocm tag. diff --git a/pkg/mimeutils/type.go b/pkg/mimeutils/type.go index 080e7f1aab..e7c4b97463 100644 --- a/pkg/mimeutils/type.go +++ b/pkg/mimeutils/type.go @@ -140,7 +140,8 @@ func TypeByExtension(ext string) string { if c >= utf8RuneSelf { // Slow path. si, _ := mimeTypesLower.Load(strings.ToLower(ext)) - return si.(string) + s, _ := si.(string) // handle nil pointer!!!! + return s } if 'A' <= c && c <= 'Z' { lower = append(lower, c+('a'-'A')) @@ -149,7 +150,8 @@ func TypeByExtension(ext string) string { } } si, _ := mimeTypesLower.Load(string(lower)) - return si.(string) + s, _ := si.(string) // handle nil pointer!!!! + return s } // ExtensionsByType returns the extensions known to be associated with the MIME diff --git a/pkg/optionutils/pointer.go b/pkg/optionutils/pointer.go index ea00e2dd24..0c43c9c4c2 100644 --- a/pkg/optionutils/pointer.go +++ b/pkg/optionutils/pointer.go @@ -26,3 +26,10 @@ func ApplyOption[T any](opt *T, tgt **T) { *tgt = opt } } + +// GetOptionFlag returns the flag value used to set a bool option +// based on optionally specified explicit value(s). +// The default value is to enable the option (true). +func GetOptionFlag(list ...bool) bool { + return utils.OptionalDefaultedBool(true, list...) +} diff --git a/pkg/optionutils/target.go b/pkg/optionutils/target.go index 7ffc76f136..8f025358f2 100644 --- a/pkg/optionutils/target.go +++ b/pkg/optionutils/target.go @@ -1,7 +1,7 @@ package optionutils import ( - "github.com/open-component-model/ocm/pkg/generics" + "github.com/mandelsoft/goutils/generics" ) /////////////////////////////////////////////////////////////////////////////(// @@ -21,7 +21,7 @@ type targetInterfaceWrapper[B any, W any /*B*/] struct { } func (w *targetInterfaceWrapper[B, W]) ApplyTo(opts W) { - w.option.ApplyTo(generics.As[B](opts)) + w.option.ApplyTo(generics.Cast[B](opts)) } // MapOptionTarget maps the option target interface from diff --git a/pkg/refmgmt/finalized/finalized_test.go b/pkg/refmgmt/finalized/finalized_test.go index 6fb8a778bd..7bf4640cb5 100644 --- a/pkg/refmgmt/finalized/finalized_test.go +++ b/pkg/refmgmt/finalized/finalized_test.go @@ -6,26 +6,26 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/refmgmt/finalized" ) type Interface interface { - GetId() finalizer.ObjectIdentity + GetId() runtimefinalizer.ObjectIdentity GetSelf() Interface - GetRefId() finalizer.ObjectIdentity + GetRefId() runtimefinalizer.ObjectIdentity } type object struct { refmgmt.Allocatable - recorder *finalizer.RuntimeFinalizationRecoder - name finalizer.ObjectIdentity + recorder *runtimefinalizer.RuntimeFinalizationRecoder + name runtimefinalizer.ObjectIdentity } -func (o *object) GetId() finalizer.ObjectIdentity { +func (o *object) GetId() runtimefinalizer.ObjectIdentity { return o.name } @@ -35,7 +35,7 @@ func (o *object) GetSelf() Interface { } func (o *object) cleanup() error { - o.recorder.Record(finalizer.ObjectIdentity(o.name)) + o.recorder.Record(runtimefinalizer.ObjectIdentity(o.name)) return nil } @@ -47,7 +47,7 @@ type view struct { var _ Interface = (*view)(nil) func newView(o *object) (Interface, error) { - ref, err := finalized.NewFinalizedView(o.Allocatable, finalizer.NewObjectIdentity("test"), o.recorder) + ref, err := finalized.NewFinalizedView(o.Allocatable, runtimefinalizer.NewObjectIdentity("test"), o.recorder) if err != nil { return nil, err } @@ -57,13 +57,13 @@ func newView(o *object) (Interface, error) { }, nil } -func (v *view) GetRefId() finalizer.ObjectIdentity { +func (v *view) GetRefId() runtimefinalizer.ObjectIdentity { return v.ref.GetRefId() } -func New(name string, rec *finalizer.RuntimeFinalizationRecoder) Interface { +func New(name string, rec *runtimefinalizer.RuntimeFinalizationRecoder) Interface { o := &object{ - name: finalizer.ObjectIdentity(name), + name: runtimefinalizer.ObjectIdentity(name), recorder: rec, } o.Allocatable = refmgmt.NewAllocatable(o.cleanup, true) @@ -75,10 +75,10 @@ func New(name string, rec *finalizer.RuntimeFinalizationRecoder) Interface { //////////////////////////////////////////////////////////////////////////////// var _ = Describe("finalized ref", func() { - var rec *finalizer.RuntimeFinalizationRecoder + var rec *runtimefinalizer.RuntimeFinalizationRecoder BeforeEach(func() { - rec = &finalizer.RuntimeFinalizationRecoder{} + rec = &runtimefinalizer.RuntimeFinalizationRecoder{} }) It("cleanup ref and object", func() { diff --git a/pkg/refmgmt/finalized/finalizedref.go b/pkg/refmgmt/finalized/finalizedref.go index de67f9ad1f..c9d32b8a4d 100644 --- a/pkg/refmgmt/finalized/finalizedref.go +++ b/pkg/refmgmt/finalized/finalizedref.go @@ -3,21 +3,21 @@ package finalized import ( "runtime" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/refmgmt" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" ) type FinalizedRef struct { allocatable refmgmt.Allocatable - id finalizer.ObjectIdentity - recorder *finalizer.RuntimeFinalizationRecoder + id runtimefinalizer.ObjectIdentity + recorder *runtimefinalizer.RuntimeFinalizationRecoder } func NewPlainFinalizedView(allocatable refmgmt.Allocatable) (*FinalizedRef, error) { return NewFinalizedView(allocatable, "", nil) } -func NewFinalizedView(allocatable refmgmt.Allocatable, id finalizer.ObjectIdentity, rec *finalizer.RuntimeFinalizationRecoder) (*FinalizedRef, error) { +func NewFinalizedView(allocatable refmgmt.Allocatable, id runtimefinalizer.ObjectIdentity, rec *runtimefinalizer.RuntimeFinalizationRecoder) (*FinalizedRef, error) { err := allocatable.Ref() if err != nil { return nil, err @@ -32,7 +32,7 @@ func (v *FinalizedRef) GetAllocatable() refmgmt.Allocatable { return v.allocatable } -func (v *FinalizedRef) GetRefId() finalizer.ObjectIdentity { +func (v *FinalizedRef) GetRefId() runtimefinalizer.ObjectIdentity { return v.id } diff --git a/pkg/refmgmt/refcloser.go b/pkg/refmgmt/refcloser.go index 4c1cfdebfc..75581ea403 100644 --- a/pkg/refmgmt/refcloser.go +++ b/pkg/refmgmt/refcloser.go @@ -5,7 +5,7 @@ import ( "sync" "sync/atomic" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) var ErrClosed = errors.ErrClosed() diff --git a/pkg/refmgmt/refmgmt.go b/pkg/refmgmt/refmgmt.go index 889b6f3de9..c62e60af48 100644 --- a/pkg/refmgmt/refmgmt.go +++ b/pkg/refmgmt/refmgmt.go @@ -4,7 +4,8 @@ import ( "fmt" "sync" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/logging" ) diff --git a/pkg/registrations/info.go b/pkg/registrations/info.go index 98409eac7f..601d523641 100644 --- a/pkg/registrations/info.go +++ b/pkg/registrations/info.go @@ -3,7 +3,8 @@ package registrations import ( "strings" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/mandelsoft/goutils/general" + "github.com/open-component-model/ocm/pkg/listformat" ) @@ -23,11 +24,11 @@ func (h HandlerInfos) Description(i int) string { var desc string if h[i].Node { - desc = "[" + generics.Conditional(h[i].ShortDesc == "", "intermediate", strings.Trim(h[i].ShortDesc, "\n")) + "]" + desc = "[" + general.Conditional(h[i].ShortDesc == "", "intermediate", strings.Trim(h[i].ShortDesc, "\n")) + "]" } else { desc = h[i].ShortDesc } - return desc + generics.Conditional(h[i].Description == "", "", "\n\n"+strings.Trim(h[i].Description, "\n")) + return desc + general.Conditional(h[i].Description == "", "", "\n\n"+strings.Trim(h[i].Description, "\n")) } type HandlerInfo struct { diff --git a/pkg/registrations/registrations.go b/pkg/registrations/registrations.go index 8151edbbde..e920f6c07c 100644 --- a/pkg/registrations/registrations.go +++ b/pkg/registrations/registrations.go @@ -10,10 +10,11 @@ import ( "strings" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" + "github.com/mandelsoft/goutils/set" "golang.org/x/exp/slices" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/utils" ) @@ -101,7 +102,7 @@ func (i *RegistrationHandlerInfo[T, O]) GetHandlers(target T) HandlerInfos { prefix := i.prefix.String() if prefix != "" { for i := range infos { - infos[i].Name = prefix + generics.Conditional(infos[i].Name == "", "", "/"+infos[i].Name) + infos[i].Name = prefix + general.Conditional(infos[i].Name == "", "", "/"+infos[i].Name) } } } @@ -207,7 +208,7 @@ func (c *handlerRegistrationRegistry[T, O]) GetHandlers(target T) HandlerInfos { infos = append(infos, c.base.GetHandlers(target)...) } - set := generics.Set[string]{} + set := set.New[string]() i := 0 for i < len(infos) { if set.Contains(infos[i].Name) { diff --git a/pkg/registrations/utils.go b/pkg/registrations/utils.go index 1fc56ed9c5..0daf51ab1e 100644 --- a/pkg/registrations/utils.go +++ b/pkg/registrations/utils.go @@ -3,7 +3,8 @@ package registrations import ( "encoding/json" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/runtime/binary.go b/pkg/runtime/binary.go index a0014960f9..8f037e014d 100644 --- a/pkg/runtime/binary.go +++ b/pkg/runtime/binary.go @@ -5,7 +5,7 @@ import ( "encoding/json" "strings" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) // Binary holds binary data which will be marshaled diff --git a/pkg/runtime/convert.go b/pkg/runtime/convert.go index efcc79883e..ded7a29279 100644 --- a/pkg/runtime/convert.go +++ b/pkg/runtime/convert.go @@ -4,8 +4,8 @@ import ( "fmt" "reflect" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/generics" ) type Converter[T VersionedTypedObject, V TypedObject] interface { @@ -46,7 +46,7 @@ type formatVersion[T VersionedTypedObject, I VersionedTypedObject, V TypedObject } func (c *formatVersion[T, I, V]) Encode(object T, marshaler Marshaler) ([]byte, error) { - i, err := generics.Cast[I](object) + i, err := generics.TryCastE[I](object) if err != nil { return nil, err } @@ -70,7 +70,7 @@ func (c *formatVersion[T, I, V]) Decode(data []byte, unmarshaler Unmarshaler) (T if err != nil { return _nil, err } - return generics.Cast[T](i) + return generics.TryCastE[T](i) } // caster applies an implementation to interface upcast for a format version, @@ -113,7 +113,7 @@ var _ FormatVersion[VersionedTypedObject] = (*caster[VersionedTypedObject, imple func NewSimpleVersion[T VersionedTypedObject, I VersionedTypedObject]() FormatVersion[T] { var proto I // first time use of typed structure nil pointers - _, err := generics.Cast[T](proto) + _, err := generics.TryCastE[T](proto) if err != nil { var t *T panic(fmt.Errorf("invalid type %T: does not implement required interface %s", proto, reflect.TypeOf(t).Elem())) diff --git a/pkg/runtime/multi.go b/pkg/runtime/multi.go index d60da8bfc0..3fc51bebec 100644 --- a/pkg/runtime/multi.go +++ b/pkg/runtime/multi.go @@ -5,7 +5,9 @@ import ( "reflect" "sync" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" + + "github.com/open-component-model/ocm/pkg/errkind" "github.com/open-component-model/ocm/pkg/utils" ) @@ -67,7 +69,7 @@ func (m *multiFormatVersion[T]) Decode(data []byte, unmarshaler Unmarshaler) (T, } if u.GetType() != u.GetKind() || m.formats.GetFormat(u.GetType()) == nil { - return _nil, errors.ErrUnknown(errors.KIND_OBJECTTYPE, u.GetType()) + return _nil, errors.ErrUnknown(errkind.KIND_OBJECTTYPE, u.GetType()) } var def T @@ -104,7 +106,7 @@ func (m *multiFormatVersion[T]) Decode(data []byte, unmarshaler Unmarshaler) (T, if found { return def, defErr } - return _nil, errors.ErrUnknown(errors.KIND_OBJECTTYPE, u.GetType()) + return _nil, errors.ErrUnknown(errkind.KIND_OBJECTTYPE, u.GetType()) } //////////////////////////////////////////////////////////////////////////////// @@ -187,7 +189,7 @@ func (r *formatVersionRegistry[I]) Decode(data []byte, unmarshaler Unmarshaler) if fmt := r.formats[u.GetType()]; fmt != nil { return fmt.Decode(data, unmarshaler) } - return _nil, errors.ErrNotSupported(errors.KIND_OBJECTTYPE, u.GetType()) + return _nil, errors.ErrNotSupported(errkind.KIND_OBJECTTYPE, u.GetType()) } func (r *formatVersionRegistry[I]) Encode(obj I, marshaler Marshaler) ([]byte, error) { @@ -200,7 +202,7 @@ func (r *formatVersionRegistry[I]) Encode(obj I, marshaler Marshaler) ([]byte, e if fmt := r.formats[obj.GetType()]; fmt != nil { return fmt.Encode(obj, marshaler) } - return nil, errors.ErrNotSupported(errors.KIND_OBJECTTYPE, obj.GetType()) + return nil, errors.ErrNotSupported(errkind.KIND_OBJECTTYPE, obj.GetType()) } func (r *formatVersionRegistry[I]) KnownFormats() map[string]FormatVersion[I] { diff --git a/pkg/runtime/scheme.go b/pkg/runtime/scheme.go index 96404ade64..fbe1fb4f3f 100644 --- a/pkg/runtime/scheme.go +++ b/pkg/runtime/scheme.go @@ -7,10 +7,12 @@ import ( "sort" "sync" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" + "github.com/mandelsoft/goutils/generics" "github.com/modern-go/reflect2" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/open-component-model/ocm/pkg/errkind" "github.com/open-component-model/ocm/pkg/utils" ) @@ -329,14 +331,14 @@ func (d *defaultScheme[T, R]) Decode(data []byte, unmarshal Unmarshaler) (T, err if !reflect2.IsNil(o) { return o, nil } - } else if !errors.IsErrUnknownKind(err, errors.KIND_OBJECTTYPE) { + } else if !errors.IsErrUnknownKind(err, errkind.KIND_OBJECTTYPE) { return _nil, err } } if d.acceptUnknown { return un, nil } - return _nil, errors.ErrUnknown(errors.KIND_OBJECTTYPE, to.GetType()) + return _nil, errors.ErrUnknown(errkind.KIND_OBJECTTYPE, to.GetType()) } return decoder.Decode(data, unmarshal) } @@ -365,14 +367,14 @@ func (d *defaultScheme[T, R]) EnforceDecode(data []byte, unmarshal Unmarshaler) if err == nil { return o, nil } - if !errors.IsErrUnknownKind(err, errors.KIND_OBJECTTYPE) { + if !errors.IsErrUnknownKind(err, errkind.KIND_OBJECTTYPE) { return un, err } } if d.acceptUnknown { return un, nil } - return un, errors.ErrUnknown(errors.KIND_OBJECTTYPE, un.GetType()) + return un, errors.ErrUnknown(errkind.KIND_OBJECTTYPE, un.GetType()) } o, err := decoder.Decode(data, unmarshal) if err != nil { @@ -411,11 +413,11 @@ func (d *defaultScheme[T, R]) Convert(o TypedObject) (T, error) { if err == nil { return object, nil } - if !errors.IsErrUnknownKind(err, errors.KIND_OBJECTTYPE) { + if !errors.IsErrUnknownKind(err, errkind.KIND_OBJECTTYPE) { return _nil, err } } - return _nil, errors.ErrUnknown(errors.KIND_OBJECTTYPE, o.GetType()) + return _nil, errors.ErrUnknown(errkind.KIND_OBJECTTYPE, o.GetType()) } r, err := decoder.Decode(data, DefaultJSONEncoding) if err != nil { @@ -446,12 +448,12 @@ func MustNewDefaultTypeScheme[T TypedObject, R TypedObjectType[T]](protoUnstr Un } func NewTypeScheme[T TypedObject, R TypedObjectType[T]](base ...TypeScheme[T, R]) TypeScheme[T, R] { - s, _ := NewDefaultTypeScheme[T](nil, false, nil, generics.ConvertSlice[TypeScheme[T, R], TypeScheme[T, R]](base...)...) + s, _ := NewDefaultTypeScheme[T](nil, false, nil, base...) return s } func NewDefaultTypeScheme[T TypedObject, R TypedObjectType[T]](protoUnstr Unstructured, acceptUnknown bool, defaultdecoder TypedObjectDecoder[T], base ...TypeScheme[T, R]) (TypeScheme[T, R], error) { - s, err := NewDefaultScheme[T](protoUnstr, acceptUnknown, defaultdecoder, generics.ConvertSlice[TypeScheme[T, R], Scheme[T, R]](base...)...) + s, err := NewDefaultScheme[T](protoUnstr, acceptUnknown, defaultdecoder, generics.Cast[Scheme[T, R]](general.Optional(base...))) if err != nil { return nil, err } @@ -463,5 +465,5 @@ func (s *defaultTypeScheme[T, R]) Register(t R) { } func (s *defaultTypeScheme[T, R]) GetType(name string) R { - return generics.As[R](s.GetDecoder(name)) + return generics.Cast[R](s.GetDecoder(name)) } diff --git a/pkg/runtime/unstructured.go b/pkg/runtime/unstructured.go index bcfb665aff..2e5020a8e0 100644 --- a/pkg/runtime/unstructured.go +++ b/pkg/runtime/unstructured.go @@ -6,10 +6,11 @@ import ( "fmt" "reflect" + "github.com/mandelsoft/goutils/errors" "github.com/modern-go/reflect2" "github.com/sirupsen/logrus" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/errkind" ) const ATTR_TYPE = "type" @@ -18,9 +19,9 @@ const ATTR_TYPE = "type" // field together with the default struct marshalling with the // great json marshallers. // Anonymous inline struct fields are always marshaled by the default struct -// marshales in a depth first manner without observing the Marshal interface!!!! +// marshals in a depth first manner without observing the Marshal interface!!!! // -// Therefore all structs in this module deriving from UnstructuedTypedObject +// Therefore, all structs in this module deriving from UnstructuedTypedObject // are explicitly implementing the marshal/unmarshal interface. // // Side Fact: Marshaling a map[interface{}] filled by unmarshaling a marshaled @@ -251,7 +252,7 @@ func EvaluateUnstructured[T TypedObject, R TypedObjectDecoder[T]](u *Unstructure decoder = types.GetDecoder(u.GetType()) } if decoder == nil { - return zero, errors.ErrUnknown(errors.KIND_OBJECTTYPE, u.GetType()) + return zero, errors.ErrUnknown(errkind.KIND_OBJECTTYPE, u.GetType()) } if obj, err := decoder.Decode(data, DefaultJSONEncoding); err != nil { diff --git a/pkg/runtime/utils.go b/pkg/runtime/utils.go index 0c0a6fd166..4dfcc7d35f 100644 --- a/pkg/runtime/utils.go +++ b/pkg/runtime/utils.go @@ -6,9 +6,8 @@ import ( "sort" "strings" + "github.com/mandelsoft/goutils/errors" "sigs.k8s.io/yaml" - - "github.com/open-component-model/ocm/pkg/errors" ) func MustProtoType(proto interface{}) reflect.Type { diff --git a/pkg/runtime/validate.go b/pkg/runtime/validate.go index ce806e8298..91efdd7671 100644 --- a/pkg/runtime/validate.go +++ b/pkg/runtime/validate.go @@ -1,7 +1,7 @@ package runtime import ( - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) type Validater interface { diff --git a/pkg/runtime/value.go b/pkg/runtime/value.go index fd9170c64f..502b2981f9 100644 --- a/pkg/runtime/value.go +++ b/pkg/runtime/value.go @@ -4,7 +4,7 @@ import ( "encoding/json" "reflect" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) // RawValue is a json-encoded representation of a value object like diff --git a/pkg/runtime/versionedtype.go b/pkg/runtime/versionedtype.go index c2243883b2..e04dd0b010 100644 --- a/pkg/runtime/versionedtype.go +++ b/pkg/runtime/versionedtype.go @@ -3,9 +3,9 @@ package runtime import ( "strings" + "github.com/mandelsoft/goutils/errors" "golang.org/x/exp/slices" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/finalizer/object.go b/pkg/runtimefinalizer/object.go similarity index 93% rename from pkg/finalizer/object.go rename to pkg/runtimefinalizer/object.go index 04c37e30e7..98679ae3c8 100644 --- a/pkg/finalizer/object.go +++ b/pkg/runtimefinalizer/object.go @@ -1,4 +1,8 @@ -package finalizer +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package runtimefinalizer import ( "fmt" diff --git a/pkg/runtimefinalizer/object_test.go b/pkg/runtimefinalizer/object_test.go new file mode 100644 index 0000000000..a66abd3a27 --- /dev/null +++ b/pkg/runtimefinalizer/object_test.go @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package runtimefinalizer_test + +import ( + "fmt" + "runtime" + "time" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/open-component-model/ocm/pkg/runtimefinalizer" +) + +type ObjectType struct { + kind string + id runtimefinalizer.ObjectIdentity + fi *runtimefinalizer.RuntimeFinalizer +} + +func NewOType(kind string, r *runtimefinalizer.RuntimeFinalizationRecoder) *ObjectType { + id := runtimefinalizer.NewObjectIdentity(kind) + o := &ObjectType{ + kind: kind, + id: id, + fi: runtimefinalizer.NewRuntimeFinalizer(id, r), + } + return o +} + +func (o *ObjectType) Id() runtimefinalizer.ObjectIdentity { + return o.id +} + +var _ = Describe("runtime finalizer", func() { + It("finalize with arbitrary method", func() { + r := &runtimefinalizer.RuntimeFinalizationRecoder{} + + o1 := NewOType("test1", r) + o2 := NewOType("test1", r) + + id1 := o1.Id() + id2 := o2.Id() + + runtime.GC() + time.Sleep(time.Second) + + fmt.Printf("still used (%s,%s)\n", o1.Id(), o2.Id()) + Expect(len(r.Get())).To(Equal(0)) + + o1 = nil + runtime.GC() + time.Sleep(time.Second) + fmt.Printf("still used (%s)\n", o2.Id()) + Expect(r.Get()).To(Equal([]runtimefinalizer.ObjectIdentity{id1})) + + o2 = nil + runtime.GC() + time.Sleep(time.Second) + Expect(r.Get()).To(Equal([]runtimefinalizer.ObjectIdentity{id1, id2})) + }) +}) diff --git a/pkg/runtimefinalizer/suite_test.go b/pkg/runtimefinalizer/suite_test.go new file mode 100644 index 0000000000..f7a627fc42 --- /dev/null +++ b/pkg/runtimefinalizer/suite_test.go @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package runtimefinalizer_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Runtime Finalizer Test Suite") +} diff --git a/pkg/semverutils/utils.go b/pkg/semverutils/utils.go index 4714a8ca29..a325ed3e89 100644 --- a/pkg/semverutils/utils.go +++ b/pkg/semverutils/utils.go @@ -5,8 +5,7 @@ import ( "sort" "github.com/Masterminds/semver/v3" - - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) // MatchVersionStrings returns an ordered list of versions filtered by the given diff --git a/pkg/signing/cert.go b/pkg/signing/cert.go index 4b348ab6e7..c85920b2b5 100644 --- a/pkg/signing/cert.go +++ b/pkg/signing/cert.go @@ -5,7 +5,8 @@ import ( "crypto/x509/pkix" "time" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/signing/signutils" ) diff --git a/pkg/signing/encrypt.go b/pkg/signing/encrypt.go index c44a4cbd79..d6da62cd7a 100644 --- a/pkg/signing/encrypt.go +++ b/pkg/signing/encrypt.go @@ -1,8 +1,9 @@ package signing import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/encrypt" - "github.com/open-component-model/ocm/pkg/errors" ) const DECRYPTION_PREFIX = "decrypt:" diff --git a/pkg/signing/handlers/rsa-signingservice/client.go b/pkg/signing/handlers/rsa-signingservice/client.go index 5a88661420..025447a0a3 100644 --- a/pkg/signing/handlers/rsa-signingservice/client.go +++ b/pkg/signing/handlers/rsa-signingservice/client.go @@ -13,9 +13,10 @@ import ( "net/url" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/credentials/identity/hostpath" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/signutils" ) diff --git a/pkg/signing/handlers/rsa-signingservice/handler.go b/pkg/signing/handlers/rsa-signingservice/handler.go index a914b22af6..ea6bd7711a 100644 --- a/pkg/signing/handlers/rsa-signingservice/handler.go +++ b/pkg/signing/handlers/rsa-signingservice/handler.go @@ -3,8 +3,9 @@ package rsa_signingservice import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/credentials" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" diff --git a/pkg/signing/handlers/rsa/format.go b/pkg/signing/handlers/rsa/format.go index 9e35b03e57..da9cbbb676 100644 --- a/pkg/signing/handlers/rsa/format.go +++ b/pkg/signing/handlers/rsa/format.go @@ -9,8 +9,8 @@ import ( "fmt" "io" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/utils" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" ) func GetPublicKey(key interface{}) (*rsa.PublicKey, *pkix.Name, error) { @@ -73,7 +73,7 @@ func KeyData(key interface{}) ([]byte, error) { func PemBlockForKey(priv interface{}, gen ...bool) (*pem.Block, error) { switch k := priv.(type) { case *rsa.PublicKey: - if utils.Optional(gen...) { + if general.Optional(gen...) { bytes, err := x509.MarshalPKIXPublicKey(k) if err != nil { panic(err) diff --git a/pkg/signing/handlers/rsa/handler.go b/pkg/signing/handlers/rsa/handler.go index 2c1b5280ba..7092b654f6 100644 --- a/pkg/signing/handlers/rsa/handler.go +++ b/pkg/signing/handlers/rsa/handler.go @@ -8,8 +8,9 @@ import ( "fmt" "io" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/credentials" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/signutils" ) diff --git a/pkg/signing/handlers/sigstore/handler.go b/pkg/signing/handlers/sigstore/handler.go index 2402fd6e7f..0ed7e91657 100644 --- a/pkg/signing/handlers/sigstore/handler.go +++ b/pkg/signing/handlers/sigstore/handler.go @@ -13,6 +13,7 @@ import ( "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" + "github.com/mandelsoft/goutils/errors" "github.com/sigstore/cosign/v2/cmd/cosign/cli/fulcio" "github.com/sigstore/cosign/v2/cmd/cosign/cli/options" "github.com/sigstore/cosign/v2/pkg/cosign" @@ -25,7 +26,6 @@ import ( signatureoptions "github.com/sigstore/sigstore/pkg/signature/options" "github.com/open-component-model/ocm/pkg/contexts/credentials" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/handlers/sigstore/attr" ) diff --git a/pkg/signing/norm/jcs/norm.go b/pkg/signing/norm/jcs/norm.go index 5322b23fef..21bdf01ff4 100644 --- a/pkg/signing/norm/jcs/norm.go +++ b/pkg/signing/norm/jcs/norm.go @@ -7,10 +7,11 @@ import ( "strconv" "github.com/cyberphone/json-canonicalization/go/src/webpki.org/jsoncanonicalizer" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" + "github.com/mandelsoft/goutils/maputils" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/signing" - "github.com/open-component-model/ocm/pkg/utils" ) var Type = normalization{} @@ -70,11 +71,11 @@ func (n *normalized) ToString(gap string) string { } func (l *normalized) String() string { - return string(utils.Must(json.Marshal(l.value))) + return string(general.Must(json.Marshal(l.value))) } func (l *normalized) Formatted() string { - return string(utils.Must(json.MarshalIndent(l.value, "", " "))) + return string(general.Must(json.MarshalIndent(l.value, "", " "))) } func (n *normalized) Marshal(gap string) ([]byte, error) { @@ -106,7 +107,7 @@ func toString(v interface{}, gap string) string { ngap := gap + " " s := "{" sep := "" - keys := utils.StringMapKeys(castIn) + keys := maputils.OrderedKeys(castIn) for _, n := range keys { v := castIn[n] //nolint: govet // yes sep = "\n" + gap diff --git a/pkg/signing/normalization.go b/pkg/signing/normalization.go index 9b34db2013..4e6cd82c35 100644 --- a/pkg/signing/normalization.go +++ b/pkg/signing/normalization.go @@ -3,7 +3,7 @@ package signing import ( "encoding/json" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) type null struct{} diff --git a/pkg/signing/registry.go b/pkg/signing/registry.go index 134919117c..7fddb87ce7 100644 --- a/pkg/signing/registry.go +++ b/pkg/signing/registry.go @@ -5,10 +5,11 @@ import ( "sort" "sync" + "github.com/mandelsoft/goutils/set" + "github.com/mandelsoft/goutils/sliceutils" "golang.org/x/exp/maps" "golang.org/x/exp/slices" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/signing/signutils" ) @@ -125,8 +126,8 @@ var _ HandlerRegistry = (*handlerRegistry)(nil) func NewHandlerRegistry(parents ...HandlerRegistry) HandlerRegistry { return &handlerRegistry{ - _hasherRegistry: NewHasherRegistry(generics.ConvertSliceWith(toHasherRegistry, parents)...), - _signerRegistry: NewSignerRegistry(generics.ConvertSliceWith(toSignerRegistry, parents)...), + _hasherRegistry: NewHasherRegistry(sliceutils.ConvertWith(parents, toHasherRegistry)...), + _signerRegistry: NewSignerRegistry(sliceutils.ConvertWith(parents, toSignerRegistry)...), } } @@ -206,7 +207,7 @@ func (r *signerRegistry) SignerNames() []string { r.lock.Lock() defer r.lock.Unlock() - names := generics.Set[string]{} + names := set.Set[string]{} for n := range r.signers { names.Add(n) } @@ -304,7 +305,7 @@ func (r *hasherRegistry) HasherNames() []string { r.lock.Lock() defer r.lock.Unlock() - names := generics.Set[string]{} + names := set.New[string]() for n := range r.hasher { names.Add(n) } diff --git a/pkg/signing/signutils/certs.go b/pkg/signing/signutils/certs.go index fd6ec858c7..e64cabaade 100644 --- a/pkg/signing/signutils/certs.go +++ b/pkg/signing/signutils/certs.go @@ -12,9 +12,9 @@ import ( "reflect" "time" + "github.com/mandelsoft/goutils/errors" "github.com/modern-go/reflect2" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/signing/signutils/names.go b/pkg/signing/signutils/names.go index c05158188a..64f45f5b7d 100644 --- a/pkg/signing/signutils/names.go +++ b/pkg/signing/signutils/names.go @@ -6,7 +6,7 @@ import ( "sort" "strings" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) func CommonName(n string) *pkix.Name { diff --git a/pkg/signing/signutils/utils.go b/pkg/signing/signutils/utils.go index cdc9cfcfcd..6f2f02a0e7 100644 --- a/pkg/signing/signutils/utils.go +++ b/pkg/signing/signutils/utils.go @@ -14,12 +14,12 @@ import ( "strings" "time" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/modern-go/reflect2" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/blobaccess" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/signing/tsa/pem.go b/pkg/signing/tsa/pem.go index 4bcf8f3ed7..4cfcd97cd9 100644 --- a/pkg/signing/tsa/pem.go +++ b/pkg/signing/tsa/pem.go @@ -5,8 +5,7 @@ import ( "github.com/InfiniteLoopSpace/go_S-MIME/asn1" cms "github.com/InfiniteLoopSpace/go_S-MIME/cms/protocol" - - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) const PRM_BLOCK_TYPE = "TIMESTAMP INFO" diff --git a/pkg/signing/tsa/tsa.go b/pkg/signing/tsa/tsa.go index 8e7bbadda1..7684bb95fc 100644 --- a/pkg/signing/tsa/tsa.go +++ b/pkg/signing/tsa/tsa.go @@ -10,8 +10,8 @@ import ( "github.com/InfiniteLoopSpace/go_S-MIME/oid" tsa "github.com/InfiniteLoopSpace/go_S-MIME/timestamp" "github.com/go-test/deep" + "github.com/mandelsoft/goutils/errors" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/signing/signutils" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/signing/utils.go b/pkg/signing/utils.go index 27354aa8f7..6f537faeed 100644 --- a/pkg/signing/utils.go +++ b/pkg/signing/utils.go @@ -4,7 +4,7 @@ import ( "encoding/hex" "hash" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) func Hash(hash hash.Hash, data []byte) (string, error) { diff --git a/pkg/spiff/options.go b/pkg/spiff/options.go index dcade5d6ee..48d8d6a53b 100644 --- a/pkg/spiff/options.go +++ b/pkg/spiff/options.go @@ -3,14 +3,14 @@ package spiff import ( "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/sliceutils" "github.com/mandelsoft/spiff/spiffing" "github.com/mandelsoft/vfs/pkg/cwdfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/contexts/datacontext" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/utils" ) @@ -107,14 +107,14 @@ func TemplateData(name string, data []byte) OptionFunction { func StubFile(path string, fss ...vfs.FileSystem) OptionFunction { return func(r *Request) error { - r.Stubs = append(r.Stubs, spiffing.NewSourceFile(path, utils.FileSystem(generics.AppendedSlice(fss, r.FileSystem)...))) + r.Stubs = append(r.Stubs, spiffing.NewSourceFile(path, utils.FileSystem(sliceutils.CopyAppend(fss, r.FileSystem)...))) return nil } } func TemplateFile(path string, fss ...vfs.FileSystem) OptionFunction { return func(r *Request) error { - r.Template = spiffing.NewSourceFile(path, utils.FileSystem(generics.AppendedSlice(fss, r.FileSystem)...)) + r.Template = spiffing.NewSourceFile(path, utils.FileSystem(sliceutils.CopyAppend(fss, r.FileSystem)...)) return nil } } diff --git a/pkg/spiff/spiff.go b/pkg/spiff/spiff.go index f91dae34e9..14821ee408 100644 --- a/pkg/spiff/spiff.go +++ b/pkg/spiff/spiff.go @@ -5,12 +5,12 @@ import ( "fmt" "github.com/ghodss/yaml" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/spiff/features" "github.com/mandelsoft/spiff/spiffing" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/modern-go/reflect2" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/spiff/validate.go b/pkg/spiff/validate.go index 84c6ec6172..09386e2dd0 100644 --- a/pkg/spiff/validate.go +++ b/pkg/spiff/validate.go @@ -3,11 +3,10 @@ package spiff import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/spiff/spiffing" "github.com/xeipuuv/gojsonschema" "sigs.k8s.io/yaml" - - "github.com/open-component-model/ocm/pkg/errors" ) func ValidateSourceByScheme(src spiffing.Source, schemedata []byte) error { diff --git a/pkg/testutils/string.go b/pkg/testutils/string.go index df337866ce..b8af087548 100644 --- a/pkg/testutils/string.go +++ b/pkg/testutils/string.go @@ -7,10 +7,9 @@ import ( "strings" "github.com/drone/envsubst" + "github.com/mandelsoft/goutils/errors" "github.com/onsi/gomega/format" "github.com/onsi/gomega/types" - - "github.com/open-component-model/ocm/pkg/errors" ) type Substitutions = map[string]string diff --git a/pkg/toi/drivers/docker/driver.go b/pkg/toi/drivers/docker/driver.go index 354e0fa0d7..d35d71f380 100644 --- a/pkg/toi/drivers/docker/driver.go +++ b/pkg/toi/drivers/docker/driver.go @@ -21,11 +21,11 @@ import ( "github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/stdcopy" "github.com/docker/docker/registry" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/set" "github.com/mitchellh/copystructure" "github.com/open-component-model/ocm/pkg/blobaccess" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" "github.com/open-component-model/ocm/pkg/toi" "github.com/open-component-model/ocm/pkg/toi/install" ) @@ -44,7 +44,7 @@ const ( falseAsString = "false" ) -var Options = generics.NewSet[string]( +var Options = set.New[string]( OptionQuiet, OptionCleanup, OptionPullPolicy, diff --git a/pkg/toi/drivers/filesystem/driver.go b/pkg/toi/drivers/filesystem/driver.go index 6aa46c5eb8..7abd658042 100644 --- a/pkg/toi/drivers/filesystem/driver.go +++ b/pkg/toi/drivers/filesystem/driver.go @@ -3,12 +3,12 @@ package filesystem import ( "io" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "sigs.k8s.io/yaml" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/finalizer" "github.com/open-component-model/ocm/pkg/toi/install" ) diff --git a/pkg/toi/install/action.go b/pkg/toi/install/action.go index 06b3ea1e62..f1f1952b42 100644 --- a/pkg/toi/install/action.go +++ b/pkg/toi/install/action.go @@ -5,9 +5,10 @@ import ( "fmt" "sort" - . "github.com/open-component-model/ocm/pkg/finalizer" + . "github.com/mandelsoft/goutils/finalizer" "github.com/ghodss/yaml" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/xeipuuv/gojsonschema" @@ -27,7 +28,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/standard" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/spiff" diff --git a/pkg/toi/install/credentials.go b/pkg/toi/install/credentials.go index f6868dd5e6..a3d20d7219 100644 --- a/pkg/toi/install/credentials.go +++ b/pkg/toi/install/credentials.go @@ -1,6 +1,7 @@ package install import ( + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/spiff/features" "github.com/mandelsoft/spiff/spiffing" @@ -11,7 +12,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/directcreds" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/memory" memorycfg "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/memory/config" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/toi" "github.com/open-component-model/ocm/pkg/utils" diff --git a/pkg/toi/install/execute.go b/pkg/toi/install/execute.go index ec405370c8..8fecf1bc9b 100644 --- a/pkg/toi/install/execute.go +++ b/pkg/toi/install/execute.go @@ -1,12 +1,13 @@ package install import ( + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/toi" ) diff --git a/pkg/toi/spec.go b/pkg/toi/spec.go index e5f4471695..d6a177d01f 100644 --- a/pkg/toi/spec.go +++ b/pkg/toi/spec.go @@ -4,12 +4,13 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" ) const ( diff --git a/pkg/toi/support/app.go b/pkg/toi/support/app.go index d1a409e029..2409f88930 100644 --- a/pkg/toi/support/app.go +++ b/pkg/toi/support/app.go @@ -6,6 +6,7 @@ import ( _ "github.com/open-component-model/ocm/pkg/contexts/clictx/config" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -18,7 +19,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" datactg "github.com/open-component-model/ocm/pkg/contexts/datacontext/config/attrs" "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" "github.com/open-component-model/ocm/pkg/toi" "github.com/open-component-model/ocm/pkg/toi/install" diff --git a/pkg/toi/support/support.go b/pkg/toi/support/support.go index be4ea985dc..cadb2835b2 100644 --- a/pkg/toi/support/support.go +++ b/pkg/toi/support/support.go @@ -4,6 +4,7 @@ import ( "fmt" "io" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/logging" "github.com/mandelsoft/vfs/pkg/vfs" @@ -16,10 +17,9 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" ocmutils "github.com/open-component-model/ocm/pkg/contexts/ocm/utils" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/out" "github.com/open-component-model/ocm/pkg/toi/install" - utils2 "github.com/open-component-model/ocm/pkg/utils" + "github.com/open-component-model/ocm/pkg/utils" ) type ExecutorOptions struct { @@ -88,14 +88,14 @@ func (o *ExecutorOptions) Complete() error { } if o.Config != "" && o.ConfigData == nil { - o.ConfigData, err = utils2.ReadFile(o.Config, o.FileSystem()) + o.ConfigData, err = utils.ReadFile(o.Config, o.FileSystem()) if err != nil { return errors.Wrapf(err, "cannot read config %q", o.Config) } } if o.OCMConfig == "" { - cfg, err := utils2.ResolvePath(o.Inputs + "/" + install.InputOCMConfig) + cfg, err := utils.ResolvePath(o.Inputs + "/" + install.InputOCMConfig) if err != nil { return errors.Wrapf(err, "cannot resolve OCM config %q", o.Inputs) } @@ -110,7 +110,7 @@ func (o *ExecutorOptions) Complete() error { } if o.Parameters == "" { - p, err := utils2.ResolvePath(o.Inputs + "/" + install.InputParameters) + p, err := utils.ResolvePath(o.Inputs + "/" + install.InputParameters) if err != nil { return errors.Wrapf(err, "cannot resolve path %q", o.Inputs) } @@ -120,7 +120,7 @@ func (o *ExecutorOptions) Complete() error { } if o.Parameters != "" && o.ParameterData == nil { - o.ParameterData, err = utils2.ReadFile(o.Parameters, o.FileSystem()) + o.ParameterData, err = utils.ReadFile(o.Parameters, o.FileSystem()) if err != nil { return errors.Wrapf(err, "cannot read parameters %q", o.Config) } diff --git a/pkg/utils/panics/panics.go b/pkg/utils/panics/panics.go index a235707ab7..4555136ee1 100644 --- a/pkg/utils/panics/panics.go +++ b/pkg/utils/panics/panics.go @@ -5,7 +5,8 @@ import ( "runtime" "strings" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/logging" ) diff --git a/pkg/utils/path.go b/pkg/utils/path.go index 1f1c14f724..7732931763 100644 --- a/pkg/utils/path.go +++ b/pkg/utils/path.go @@ -6,10 +6,9 @@ import ( "os" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" - - "github.com/open-component-model/ocm/pkg/errors" ) // ResolvePath handles the ~ notation for the home directory. diff --git a/pkg/utils/subst/subst.go b/pkg/utils/subst/subst.go index 8bcf7af18b..b7ea397263 100644 --- a/pkg/utils/subst/subst.go +++ b/pkg/utils/subst/subst.go @@ -5,13 +5,13 @@ import ( "container/list" "sync" + "github.com/mandelsoft/goutils/errors" mlog "github.com/mandelsoft/logging" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/mikefarah/yq/v4/pkg/yqlib" glog "gopkg.in/op/go-logging.v1" "gopkg.in/yaml.v3" - "github.com/open-component-model/ocm/pkg/errors" ocmlog "github.com/open-component-model/ocm/pkg/logging" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" diff --git a/pkg/utils/tarutils/extract.go b/pkg/utils/tarutils/extract.go index 53b3ce530c..b310685d8c 100644 --- a/pkg/utils/tarutils/extract.go +++ b/pkg/utils/tarutils/extract.go @@ -5,11 +5,11 @@ import ( "fmt" "io" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common/compression" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/utils/tarutils/list.go b/pkg/utils/tarutils/list.go index e7f0c13857..a88be13409 100644 --- a/pkg/utils/tarutils/list.go +++ b/pkg/utils/tarutils/list.go @@ -4,11 +4,11 @@ import ( "archive/tar" "io" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common/compression" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/utils/tarutils/pack.go b/pkg/utils/tarutils/pack.go index 362271242c..584308a434 100644 --- a/pkg/utils/tarutils/pack.go +++ b/pkg/utils/tarutils/pack.go @@ -8,18 +8,17 @@ import ( "strings" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/general" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" - - "github.com/open-component-model/ocm/pkg/finalizer" - "github.com/open-component-model/ocm/pkg/utils" ) func CreateTarFromFs(fs vfs.FileSystem, path string, compress func(w io.Writer) io.WriteCloser, fss ...vfs.FileSystem) (err error) { var finalize finalizer.Finalizer defer finalize.FinalizeWithErrorPropagation(&err) - tfs := utils.OptionalDefaulted(osfs.New(), fss...) + tfs := general.OptionalDefaulted(osfs.New(), fss...) f, err := tfs.OpenFile(path, vfs.O_CREATE|vfs.O_TRUNC|vfs.O_WRONLY, 0o600) if err != nil { diff --git a/pkg/utils/template/registry.go b/pkg/utils/template/registry.go index 12028cca3b..697a4be860 100644 --- a/pkg/utils/template/registry.go +++ b/pkg/utils/template/registry.go @@ -5,9 +5,9 @@ import ( "strings" "sync" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/utils/template/template.go b/pkg/utils/template/template.go index eecca9fcb2..069bf6daab 100644 --- a/pkg/utils/template/template.go +++ b/pkg/utils/template/template.go @@ -8,11 +8,11 @@ import ( "os" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/pflag" "gopkg.in/yaml.v3" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" utils2 "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/utils/time.go b/pkg/utils/time.go index 13c97048e1..6de00519b3 100644 --- a/pkg/utils/time.go +++ b/pkg/utils/time.go @@ -4,8 +4,8 @@ import ( "strconv" "time" - "github.com/open-component-model/ocm/pkg/errors" - "github.com/open-component-model/ocm/pkg/generics" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" ) // ParseDeltaTime parses a time diff relative to the actual @@ -13,7 +13,7 @@ import ( func ParseDeltaTime(s string, past bool) (time.Time, error) { var t time.Time - f := int64(generics.Conditional(past, -1, 1)) + f := int64(general.Conditional(past, -1, 1)) if len(s) < 2 { return t, errors.Newf("invalid time diff %q", s) diff --git a/pkg/utils/url.go b/pkg/utils/url.go index bd920f177c..0817b38a49 100644 --- a/pkg/utils/url.go +++ b/pkg/utils/url.go @@ -2,9 +2,10 @@ package utils import ( "net/url" + "path" "strings" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) func ParseURL(urlToParse string) (*url.URL, error) { @@ -27,9 +28,10 @@ func GetFileExtensionFromUrl(url string) (string, error) { if err != nil { return "", err } - pos := strings.LastIndex(u.Path, ".") + s := path.Base(u.Path) + pos := strings.LastIndex(s, ".") if pos == -1 { return "", errors.New("failed to deduct file extension from url") } - return u.Path[pos:len(u.Path)], nil + return s[pos:], nil } From 9a9be0b6025fc266a5aa4dc732273fb53c4ec469 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 13:51:57 +0000 Subject: [PATCH 63/83] ReleaseNotes for v0.10.0 --- docs/releasenotes/v0.10.0.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 docs/releasenotes/v0.10.0.md diff --git a/docs/releasenotes/v0.10.0.md b/docs/releasenotes/v0.10.0.md new file mode 100644 index 0000000000..f1f50c8800 --- /dev/null +++ b/docs/releasenotes/v0.10.0.md @@ -0,0 +1,19 @@ +Release v0.10.0 + +- externalize general go utilities in packages pkg{errors,exceptions,generics,finalizer} (#761) +- Bump the go group with 12 updates (#768) +- feat: add silent flag and fix dry run with prerequisites (#767) +- let's get rid of reuse PendingDeprecationWarning (#765) +- fix: stop ignoring most of the errors (#745) +- feat: add uninstall command to the controller (#766) +- Create codeql.yml (#764) +- Npm/auth access (#757) +- Bump the go group with 7 updates (#763) +- Bump the ci group with 2 updates (#762) +- Fix ocm issue 179, block in config yields invalid yaml (#734) +- add cleanup to action for self hosted runner (#760) +- add negative test for non-semver version (#759) +- Don't Panik! (#758) +- Bump the go group with 3 updates (#751) +- Bump github.com/fluxcd/cli-utils from 0.36.0-flux.6 to 0.36.0-flux.7 (#752) + From b8fea7247d035920a237c4a9d3c4f3606bcef7f7 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 13:51:58 +0000 Subject: [PATCH 64/83] Release v0.10.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 29b2d3ea50..2774f8587f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.10.0-dev +0.10.0 \ No newline at end of file From 70f15885bc1539aeb185af5aa24f11938385201d Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 14:09:56 +0000 Subject: [PATCH 65/83] Update version file to 0.11.0-dev --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 2774f8587f..eb1336c84d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.10.0 \ No newline at end of file +0.11.0-dev From 93c6bad8977344484280c9afa607bb07edb68ab2 Mon Sep 17 00:00:00 2001 From: Fabian Burth Date: Tue, 21 May 2024 13:42:21 +0200 Subject: [PATCH 66/83] Vault tests (#749) ## Description Implement integration tests with vault. It also fixes a bug where getting the credentials for a consumer provider lead to a deadlock or potentially an infinite recursion since we attempt to retrieve credentials to access the credential provider from the credential provider itself. Introduces an additional make target called `make test-all`. This runs all test including the ones tagged with `go:build integration`. --- .github/workflows/lint_and_test.yaml | 2 +- .gitignore | 1 + Makefile | 7 +- docs/reference/ocm_controller.md | 1 + docs/reference/ocm_controller_uninstall.md | 32 ++ docs/reference/ocm_credential-handling.md | 8 +- docs/reference/ocm_get_credentials.md | 3 +- examples/lib/tour/doc.go | 2 +- go.mod | 3 +- go.sum | 4 +- hack/Makefile | 30 +- pkg/contexts/credentials/cpi/interface.go | 13 + .../credentials/internal/consumers.go | 88 ++- pkg/contexts/credentials/internal/context.go | 54 +- pkg/contexts/credentials/internal/identity.go | 4 + pkg/contexts/credentials/internal/logging.go | 14 + .../repositories/dockerconfig/provider.go | 2 +- .../credentials/repositories/npm/provider.go | 2 +- .../credentials/repositories/vault/a_usage.go | 2 +- .../repositories/vault/identity/identity.go | 27 +- .../credentials/repositories/vault/options.go | 16 +- .../repositories/vault/provider.go | 102 ++-- .../repositories/vault/repo_int_test.go | 513 ++++++++++++++++++ .../repositories/vault/repo_test.go | 74 +++ .../repositories/vault/repository.go | 2 +- .../credentials/repositories/vault/type.go | 6 +- 26 files changed, 926 insertions(+), 86 deletions(-) create mode 100644 docs/reference/ocm_controller_uninstall.md create mode 100644 pkg/contexts/credentials/internal/logging.go create mode 100644 pkg/contexts/credentials/repositories/vault/repo_int_test.go create mode 100644 pkg/contexts/credentials/repositories/vault/repo_test.go diff --git a/.github/workflows/lint_and_test.yaml b/.github/workflows/lint_and_test.yaml index 73434107be..b99f28c56e 100644 --- a/.github/workflows/lint_and_test.yaml +++ b/.github/workflows/lint_and_test.yaml @@ -38,7 +38,7 @@ jobs: - name: Unit test run: | PATH=$PATH:$(go env GOPATH)/bin make build - PATH=$PATH:$(go env GOPATH)/bin make test + PATH=$PATH:$(go env GOPATH)/bin make test-all lint: name: Lint diff --git a/.gitignore b/.gitignore index 2a9bec21b3..2bbcc71a08 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ bin/ go.mod.bak dist/ .cache_ggshield +.DS_Store diff --git a/Makefile b/Makefile index 78a0609f3b..da70c94a05 100644 --- a/Makefile +++ b/Makefile @@ -60,9 +60,14 @@ force-test: .PHONY: test test: - @echo "> Test" + @echo "> Run Unit Tests" @go test ./examples/lib/... $(REPO_ROOT)/cmds/ocm/... $(REPO_ROOT)/cmds/demoplugin/... $(REPO_ROOT)/pkg/... +.PHONY: test-all +test-all: install-requirements + @echo "> Run All Tests" + @go test --tags=integration ./examples/lib/... $(REPO_ROOT)/cmds/ocm/... $(REPO_ROOT)/cmds/demoplugin/... $(REPO_ROOT)/pkg/... + .PHONY: generate generate: @$(REPO_ROOT)/hack/generate.sh $(REPO_ROOT)/pkg... $(REPO_ROOT)/cmds/ocm/... $(REPO_ROOT)/cmds/helminstaller/... $(REPO_ROOT)/examples/... diff --git a/docs/reference/ocm_controller.md b/docs/reference/ocm_controller.md index 38c7c859a5..e74255bbaa 100644 --- a/docs/reference/ocm_controller.md +++ b/docs/reference/ocm_controller.md @@ -22,4 +22,5 @@ ocm controller [] ... ##### Sub Commands * [ocm controller install](ocm_controller_install.md) — Install either a specific or latest version of the ocm-controller. Optionally install prerequisites required by the controller. +* [ocm controller uninstall](ocm_controller_uninstall.md) — Uninstalls the ocm-controller and all of its dependencies diff --git a/docs/reference/ocm_controller_uninstall.md b/docs/reference/ocm_controller_uninstall.md new file mode 100644 index 0000000000..2d4c0f1734 --- /dev/null +++ b/docs/reference/ocm_controller_uninstall.md @@ -0,0 +1,32 @@ +## ocm controller uninstall — Uninstalls The Ocm-Controller And All Of Its Dependencies + +### Synopsis + +``` +ocm controller uninstall controller +``` + +### Options + +``` + -u, --base-url string the base url to the ocm-controller's release page (default "https://github.com/open-component-model/ocm-controller/releases") + --cert-manager-base-url string the base url to the cert-manager's release page (default "https://github.com/cert-manager/cert-manager/releases") + --cert-manager-release-api-url string the base url to the cert-manager's API release page (default "https://api.github.com/repos/cert-manager/cert-manager/releases") + --cert-manager-version string version for cert-manager (default "v1.13.2") + -c, --controller-name string name of the controller that's used for status check (default "ocm-controller") + -d, --dry-run if enabled, prints the downloaded manifest file + -h, --help help for uninstall + -n, --namespace string the namespace into which the controller is installed (default "ocm-system") + -a, --release-api-url string the base url to the ocm-controller's API release page (default "https://api.github.com/repos/open-component-model/ocm-controller/releases") + -t, --timeout duration maximum time to wait for deployment to be ready (default 1m0s) + -p, --uninstall-prerequisites uninstall prerequisites required by ocm-controller + -v, --version string the version of the controller to install (default "latest") +``` + +### SEE ALSO + +##### Parents + +* [ocm controller](ocm_controller.md) — Commands acting on the ocm-controller +* [ocm](ocm.md) — Open Component Model command line client + diff --git a/docs/reference/ocm_credential-handling.md b/docs/reference/ocm_credential-handling.md index 998d942fda..fdf51d3363 100644 --- a/docs/reference/ocm_credential-handling.md +++ b/docs/reference/ocm_credential-handling.md @@ -128,7 +128,7 @@ The following credential consumer types are used/supported: - scheme: (optional) URL scheme - port: (optional) server port - namespace: vault namespace - - secretEngine: secret engine + - mountPath: mount path - pathprefix: path prefix for secret @@ -138,7 +138,6 @@ The following credential consumer types are used/supported: - token: vault token - roleid: applrole role id - secretid: applrole secret id - - secretid: applrole secret id The only supported auth methods, so far, are token and approle. @@ -315,7 +314,7 @@ The following types are currently available: - scheme: (optional) URL scheme - port: (optional) server port - namespace: vault namespace - - secretEngine: secret engine + - mountPath: mount path - pathprefix: path prefix for secret @@ -325,7 +324,6 @@ The following types are currently available: - token: vault token - roleid: applrole role id - secretid: applrole secret id - - secretid: applrole secret id The only supported auth methods, so far, are token and approle. @@ -335,7 +333,7 @@ The following types are currently available: The repository specification supports the following fields: - serverURL: *string* (required): the URL of the vault instance - namespace: *string* (optional): the namespace used to evaluate secrets - - secretsEngine: *string* (optional): the secrets engine to use (default: secrets) + - mountPath: *string* (optional): the mount path to use (default: secrets) - path: *string* (optional): the path prefix used to lookup secrets - secrets: *[]string* (optional): list of secrets - propagateConsumerIdentity: *bool*(optional): evaluate metadata for consumer id propagation diff --git a/docs/reference/ocm_get_credentials.md b/docs/reference/ocm_get_credentials.md index b33dcb9eb2..cf3d1cbc4d 100644 --- a/docs/reference/ocm_get_credentials.md +++ b/docs/reference/ocm_get_credentials.md @@ -54,7 +54,7 @@ Matchers exist for the following usage contexts or consumer types: - scheme: (optional) URL scheme - port: (optional) server port - namespace: vault namespace - - secretEngine: secret engine + - mountPath: mount path - pathprefix: path prefix for secret @@ -64,7 +64,6 @@ Matchers exist for the following usage contexts or consumer types: - token: vault token - roleid: applrole role id - secretid: applrole secret id - - secretid: applrole secret id The only supported auth methods, so far, are token and approle. diff --git a/examples/lib/tour/doc.go b/examples/lib/tour/doc.go index d20d8d6dd7..1ec6e0514f 100644 --- a/examples/lib/tour/doc.go +++ b/examples/lib/tour/doc.go @@ -1,3 +1,3 @@ -//go:generate mdref --headings --list docsrc . +//go:generate mdref --headings docsrc . package tour diff --git a/go.mod b/go.mod index 7f7515bba9..d0c13944d7 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/open-component-model/ocm -go 1.22.1 +go 1.22.2 replace github.com/spf13/cobra => github.com/open-component-model/cobra v0.0.0-20230329075350-b1fd876abfb9 @@ -222,6 +222,7 @@ require ( github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect github.com/hashicorp/hcl v1.0.1-vault-5 // indirect + github.com/hashicorp/vault/api v1.13.0 // indirect github.com/huandu/xstrings v1.4.0 // indirect github.com/in-toto/in-toto-golang v0.9.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect diff --git a/go.sum b/go.sum index decd37aade..de4bf148a7 100644 --- a/go.sum +++ b/go.sum @@ -591,8 +591,8 @@ github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31 github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= github.com/hashicorp/vault-client-go v0.4.3 h1:zG7STGVgn/VK6rnZc0k8PGbfv2x/sJExRKHSUg3ljWc= github.com/hashicorp/vault-client-go v0.4.3/go.mod h1:4tDw7Uhq5XOxS1fO+oMtotHL7j4sB9cp0T7U6m4FzDY= -github.com/hashicorp/vault/api v1.12.2 h1:7YkCTE5Ni90TcmYHDBExdt4WGJxhpzaHqR6uGbQb/rE= -github.com/hashicorp/vault/api v1.12.2/go.mod h1:LSGf1NGT1BnvFFnKVtnvcaLBM2Lz+gJdpL6HUYed8KE= +github.com/hashicorp/vault/api v1.13.0 h1:RTCGpE2Rgkn9jyPcFlc7YmNocomda44k5ck8FKMH41Y= +github.com/hashicorp/vault/api v1.13.0/go.mod h1:0cb/uZUv1w2cVu9DIvuW1SMlXXC6qtATJt+LXJRx+kg= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef h1:A9HsByNhogrvm9cWb28sjiS3i7tcKCkflWFEkHfuAgM= diff --git a/hack/Makefile b/hack/Makefile index 451cf5cc81..aeab22f85b 100644 --- a/hack/Makefile +++ b/hack/Makefile @@ -1,4 +1,8 @@ GOPATH := $(shell go env GOPATH) +LOCALBIN := $(shell pwd)/../bin +OS := $(shell go env GOOS 2>/dev/null || sh -c 'uname -o' | sed 's/.*/\L&/' ) +ARCH := $(shell go env GOARCH 2>/dev/null || sh -c 'uname -m' | sed 's/.*/\L&/' ) +OS_ARCH := $(OS)_$(ARCH) ifeq ($(OS),Windows_NT) detected_OS := Windows @@ -39,6 +43,16 @@ GO_BINDATA := $(shell (go-bindata -version 2>/dev/null || echo 0.0.0) | head -n ifneq ("v$(GO_BINDATA)",$(GO_BINDATA_VERSION)) deps += go-bindata endif +VAULT_VERSION := 1.16.2 +VAULT := $(shell ($(LOCALBIN)/vault --version 2>/dev/null || echo 0.0) | sed 's/.*Vault v\([0-9\.]*\).*/\1/') +ifeq ($(VAULT), $(VAULT_VERSION)) + deps += vault +endif +OCI_REGISTRY_VERSION := 3.0.0-alpha.1 +OCI_REGISTRY := $(shell (registry --version 2>/dev/null || echo 0.0) | sed 's/.* v\([0-9a-z\.\-]*\).*/\1/') +ifeq ($(OCI_REGISTRY), $(OCI_REGISTRY_VERSION)) + deps += oci-registry +endif .PHONY: install-requirements install-requirements: $(deps) $(GOPATH)/bin/goimports mdref @@ -58,6 +72,21 @@ golangci-lint-version: go-bindata: go install -v github.com/go-bindata/go-bindata/v3/...@$(GO_BINDATA_VERSION) +.PHONY: vault +vault: + @if [ "$(VAULT)" != "$(VAULT_VERSION)" ]; then \ + curl -o $(LOCALBIN)/vault.zip https://releases.hashicorp.com/vault/$(VAULT_VERSION)/vault_$(VAULT_VERSION)_$(OS_ARCH).zip; \ + unzip -o $(LOCALBIN)/vault.zip -d $(LOCALBIN); \ + rm $(LOCALBIN)/vault.zip; \ + chmod a+x $(LOCALBIN)/vault;\ + fi + +.PHONY: oci-registry +oci-registry: + @if [ "$(OCI_REGISTRY)" != "$(OCI_REGISTRY_VERSION)" ]; then \ + go install -v github.com/distribution/distribution/v3/cmd/registry@v3.0.0-alpha.1; \ + fi + $(GOPATH)/bin/goimports: go install -v golang.org/x/tools/cmd/goimports@latest @@ -65,7 +94,6 @@ $(GOPATH)/bin/goimports: mdref: go install -v github.com/mandelsoft/mdref@master - Linux_jq: $(info -> jq is missing) $(info - sudo apt-get install jq / sudo dnf install jq / sudo zypper install jq / sudo pacman -S jq) diff --git a/pkg/contexts/credentials/cpi/interface.go b/pkg/contexts/credentials/cpi/interface.go index 982084eea9..2499903c1c 100644 --- a/pkg/contexts/credentials/cpi/interface.go +++ b/pkg/contexts/credentials/cpi/interface.go @@ -30,6 +30,7 @@ type ( GenericRepositorySpec = internal.GenericRepositorySpec GenericCredentialsSpec = internal.GenericCredentialsSpec DirectCredentials = internal.DirectCredentials + EvaluationContext = internal.EvaluationContext ) type ( @@ -102,6 +103,18 @@ func RequiredCredentialsForConsumer(ctx ContextProvider, id ConsumerIdentity, ma return internal.CredentialsForConsumer(ctx, id, true, matchers...) } +func GetCredentialsForConsumer(ctx Context, ectx EvaluationContext, identity ConsumerIdentity, matchers ...IdentityMatcher) (CredentialsSource, error) { + return internal.GetCredentialsForConsumer(ctx, ectx, identity, matchers...) +} + +func GetEvaluationContextFor[T any](ectx EvaluationContext) T { + return internal.GetEvaluationContextFor[T](ectx) +} + +func SetEvaluationContextFor(ectx EvaluationContext, e any) { + internal.SetEvaluationContextFor(ectx, e) +} + var ( CompleteMatch = internal.CompleteMatch NoMatch = internal.NoMatch diff --git a/pkg/contexts/credentials/internal/consumers.go b/pkg/contexts/credentials/internal/consumers.go index 145c43270a..f7ebfbc3bc 100644 --- a/pkg/contexts/credentials/internal/consumers.go +++ b/pkg/contexts/credentials/internal/consumers.go @@ -1,13 +1,33 @@ package internal import ( + "fmt" + "slices" "sort" "sync" + "github.com/mandelsoft/goutils/exception" + "github.com/mandelsoft/goutils/general" "github.com/mandelsoft/goutils/maputils" + "github.com/mandelsoft/goutils/sliceutils" + "github.com/mandelsoft/goutils/stringutils" ) -// UsageContext descibes a dediacetd type specific +type CredentialRecursion []ConsumerIdentity + +func (c CredentialRecursion) String() string { + return stringutils.Join(c) +} + +func (c CredentialRecursion) Contains(identity ConsumerIdentity) bool { + return slices.ContainsFunc(c, general.ContainsFuncFor(identity)) +} + +func (c CredentialRecursion) Append(identity ConsumerIdentity) CredentialRecursion { + return sliceutils.CopyAppendUniqueFunc(c, general.EqualsFuncFor[ConsumerIdentity](), identity) +} + +// UsageContext describes a dedicated type specific // sub usage kinds for an object requiring credentials. // For example, for an object providing a hierarchical // namespace this might be a namespace prefix for @@ -73,7 +93,7 @@ func (c *_consumers) Get(id ConsumerIdentity) (CredentialsSource, bool) { // Match matches a given request (pattern) against configured // identities. -func (c *_consumers) Match(pattern ConsumerIdentity, cur ConsumerIdentity, m IdentityMatcher) (CredentialsSource, ConsumerIdentity) { +func (c *_consumers) Match(ectx EvaluationContext, pattern ConsumerIdentity, cur ConsumerIdentity, m IdentityMatcher) (CredentialsSource, ConsumerIdentity) { var found *_consumer for _, s := range c.data { if m(pattern, cur, s.identity) { @@ -195,18 +215,72 @@ func (p *consumerProviderRegistry) Get(id ConsumerIdentity) (CredentialsSource, return nil, false } -func (p *consumerProviderRegistry) Match(pattern ConsumerIdentity, cur ConsumerIdentity, m IdentityMatcher) (CredentialsSource, ConsumerIdentity) { - p.lock.Lock() - defer p.lock.Unlock() +func (p *consumerProviderRegistry) checkHandleProvider(ectx EvaluationContext, prov ConsumerProvider, pattern ConsumerIdentity) (rctx EvaluationContext, useprov bool, usestack bool) { + if pr, ok := prov.(ConsumerIdentityProvider); ok { + r := GetEvaluationContextFor[CredentialRecursion](ectx) + if r == nil { + r = CredentialRecursion{} + } + if r.Contains(pr.GetConsumerId()) { + return ectx, false, true + } + r = r.Append(pr.GetConsumerId()) + ectx = SetEvaluationContextFor(ectx, r) + } + return ectx, true, true +} - credsrc, cur := p.explicit.Match(pattern, cur, m) +type UnwindStack struct { + error +} + +func (u *UnwindStack) Unwrap() error { + return u.error +} + +func (p *consumerProviderRegistry) catchedMatch(ectx EvaluationContext, sub ConsumerProvider, pattern ConsumerIdentity, cur ConsumerIdentity, m IdentityMatcher) (cs CredentialsSource, ci ConsumerIdentity) { + defer exception.CatchError(func(err error) { + log.Trace("caught unwind stack error: {{error}}", "error", err) + cs = nil + ci = cur + }, exception.ByPrototypes(&UnwindStack{})) + log.Trace("pattern: {{pattern}}\ncontext: {{context}}\nprovider: {{provider}}", + "pattern", pattern, "context", ectx, "provider", sub) + ectx, useprov, _ := p.checkHandleProvider(ectx, sub, pattern) + if !useprov { + return nil, cur + } + log.Trace("attempt match with provider: {{provider}}", "provider", sub) + return sub.Match(ectx, pattern, cur, m) +} + +func (p *consumerProviderRegistry) Match(ectx EvaluationContext, pattern ConsumerIdentity, cur ConsumerIdentity, m IdentityMatcher) (CredentialsSource, ConsumerIdentity) { + p.lock.RLock() + defer p.lock.RUnlock() + + credsrc, cur := p.explicit.Match(ectx, pattern, cur, m) for _, sub := range p.providers { var f CredentialsSource - f, cur = sub.Match(pattern, cur, m) + f, cur = p.catchedMatch(ectx, sub, pattern, cur, m) if f != nil { credsrc = f } } + // If this is the case, we are in a situation where we have excluded all providers (since they are all in the stack). + // If we would simply return with no credentials, the follow-up coding would assume, that it should query the + // credential repository without any credentials, since none have been found. + // INSTEAD, we have to step down to the previous recursion level and check the other potentially available providers + // for credentials. + // BUT in case we have explicit credentials, then we should use those. + if credsrc == nil { + r := GetEvaluationContextFor[CredentialRecursion](ectx) + // unwind the stack only makes sense when we are in a recursive call, thus we have at least one provider on the + // credential recursion stack + if len(r) > 0 && len(r) == len(p.providers) { + exception.Throw(&UnwindStack{fmt.Errorf("impossible credential recursion detected - unwind stack")}) + } + } + log.Trace("return credential source") return credsrc, cur } diff --git a/pkg/contexts/credentials/internal/context.go b/pkg/contexts/credentials/internal/context.go index 9976029323..09c6e297e4 100644 --- a/pkg/contexts/credentials/internal/context.go +++ b/pkg/contexts/credentials/internal/context.go @@ -2,9 +2,13 @@ package internal import ( "context" + "fmt" "reflect" "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/maputils" + "golang.org/x/exp/maps" "github.com/open-component-model/ocm/pkg/contexts/config" cfgcpi "github.com/open-component-model/ocm/pkg/contexts/config/cpi" @@ -30,7 +34,36 @@ type ContextProvider interface { type ConsumerProvider interface { Unregister(id ProviderIdentity) Get(id ConsumerIdentity) (CredentialsSource, bool) - Match(id ConsumerIdentity, cur ConsumerIdentity, matcher IdentityMatcher) (CredentialsSource, ConsumerIdentity) + Match(ectx EvaluationContext, id ConsumerIdentity, cur ConsumerIdentity, matcher IdentityMatcher) (CredentialsSource, ConsumerIdentity) +} + +type EvaluationContext *evaluationContext + +type evaluationContext struct { + data map[reflect.Type]interface{} +} + +func (e evaluationContext) String() string { + return fmt.Sprintf("%v", maputils.Transform(e.data, func(k reflect.Type, v interface{}) (string, string) { + return k.Name(), fmt.Sprintf("%v", v) + })) +} + +func GetEvaluationContextFor[T any](ectx EvaluationContext) T { + var _nil T + if ectx.data == nil { + return _nil + } + return generics.Cast[T](ectx.data[generics.TypeOf[T]()]) +} + +func SetEvaluationContextFor(ectx EvaluationContext, e any) EvaluationContext { + if ectx.data == nil { + ectx.data = map[reflect.Type]interface{}{} + } + n := &evaluationContext{maps.Clone(ectx.data)} + n.data[reflect.TypeOf(e)] = e + return n } type Context interface { @@ -53,6 +86,7 @@ type Context interface { UnregisterConsumerProvider(id ProviderIdentity) GetCredentialsForConsumer(ConsumerIdentity, ...IdentityMatcher) (CredentialsSource, error) + getCredentialsForConsumer(EvaluationContext, ConsumerIdentity, ...IdentityMatcher) (CredentialsSource, error) SetCredentialsForConsumer(identity ConsumerIdentity, creds CredentialsSource) SetCredentialsForConsumerWithProvider(pid ProviderIdentity, identity ConsumerIdentity, creds CredentialsSource) @@ -208,17 +242,24 @@ func (c *_context) CredentialsForConfig(data []byte, unmarshaler runtime.Unmarsh var emptyIdentity = ConsumerIdentity{} func (c *_context) GetCredentialsForConsumer(identity ConsumerIdentity, matchers ...IdentityMatcher) (CredentialsSource, error) { + return c.getCredentialsForConsumer(nil, identity, matchers...) +} + +func (c *_context) getCredentialsForConsumer(ectx EvaluationContext, identity ConsumerIdentity, matchers ...IdentityMatcher) (CredentialsSource, error) { err := c.Update() if err != nil { return nil, err } + if ectx == nil { + ectx = &evaluationContext{} + } m := c.defaultMatcher(identity, matchers...) var credsrc CredentialsSource if m == nil { credsrc, _ = c.consumerProviders.Get(identity) } else { - credsrc, _ = c.consumerProviders.Match(identity, nil, m) + credsrc, _ = c.consumerProviders.Match(ectx, identity, nil, m) } if credsrc == nil { credsrc, _ = c.consumerProviders.Get(emptyIdentity) @@ -270,3 +311,12 @@ func (c *_context) RegisterConsumerProvider(id ProviderIdentity, provider Consum func (c *_context) UnregisterConsumerProvider(id ProviderIdentity) { c.consumerProviders.Unregister(id) } + +/////////////////////////////////////// + +func GetCredentialsForConsumer(ctx Context, ectx EvaluationContext, identity ConsumerIdentity, matchers ...IdentityMatcher) (CredentialsSource, error) { + if ectx == nil { + ectx = &evaluationContext{} + } + return ctx.getCredentialsForConsumer(ectx, identity, matchers...) +} diff --git a/pkg/contexts/credentials/internal/identity.go b/pkg/contexts/credentials/internal/identity.go index 57b8c5f90f..36cf4f36cb 100644 --- a/pkg/contexts/credentials/internal/identity.go +++ b/pkg/contexts/credentials/internal/identity.go @@ -103,6 +103,10 @@ func NewConsumerIdentity(typ string, attrs ...string) ConsumerIdentity { return r } +func ConsumerIdentityEqual(a, b ConsumerIdentity) bool { + return a.Equals(b) +} + // IsSet checks whether an identity is given. func (i ConsumerIdentity) IsSet() bool { return len(i) != 0 diff --git a/pkg/contexts/credentials/internal/logging.go b/pkg/contexts/credentials/internal/logging.go new file mode 100644 index 0000000000..c80cfbbdc8 --- /dev/null +++ b/pkg/contexts/credentials/internal/logging.go @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package internal + +import ( + ocmlog "github.com/open-component-model/ocm/pkg/logging" +) + +var ( + REALM = ocmlog.DefineSubRealm("Credentials", "credentials") + log = ocmlog.DynamicLogger(REALM) +) diff --git a/pkg/contexts/credentials/repositories/dockerconfig/provider.go b/pkg/contexts/credentials/repositories/dockerconfig/provider.go index 88335fc3e9..1ac017391e 100644 --- a/pkg/contexts/credentials/repositories/dockerconfig/provider.go +++ b/pkg/contexts/credentials/repositories/dockerconfig/provider.go @@ -20,7 +20,7 @@ var _ cpi.ConsumerProvider = (*ConsumerProvider)(nil) func (p *ConsumerProvider) Unregister(id cpi.ProviderIdentity) { } -func (p *ConsumerProvider) Match(req cpi.ConsumerIdentity, cur cpi.ConsumerIdentity, m cpi.IdentityMatcher) (cpi.CredentialsSource, cpi.ConsumerIdentity) { +func (p *ConsumerProvider) Match(ectx cpi.EvaluationContext, req cpi.ConsumerIdentity, cur cpi.ConsumerIdentity, m cpi.IdentityMatcher) (cpi.CredentialsSource, cpi.ConsumerIdentity) { return p.get(req, cur, m) } diff --git a/pkg/contexts/credentials/repositories/npm/provider.go b/pkg/contexts/credentials/repositories/npm/provider.go index 010dd12ac5..2268ff5faf 100644 --- a/pkg/contexts/credentials/repositories/npm/provider.go +++ b/pkg/contexts/credentials/repositories/npm/provider.go @@ -15,7 +15,7 @@ var _ cpi.ConsumerProvider = (*ConsumerProvider)(nil) func (p *ConsumerProvider) Unregister(_ cpi.ProviderIdentity) { } -func (p *ConsumerProvider) Match(req cpi.ConsumerIdentity, cur cpi.ConsumerIdentity, m cpi.IdentityMatcher) (cpi.CredentialsSource, cpi.ConsumerIdentity) { +func (p *ConsumerProvider) Match(ectx cpi.EvaluationContext, req cpi.ConsumerIdentity, cur cpi.ConsumerIdentity, m cpi.IdentityMatcher) (cpi.CredentialsSource, cpi.ConsumerIdentity) { return p.get(req, cur, m) } diff --git a/pkg/contexts/credentials/repositories/vault/a_usage.go b/pkg/contexts/credentials/repositories/vault/a_usage.go index 2407385a5c..5c165c063a 100644 --- a/pkg/contexts/credentials/repositories/vault/a_usage.go +++ b/pkg/contexts/credentials/repositories/vault/a_usage.go @@ -46,7 +46,7 @@ The repository specification supports the following fields: ` + listformat.FormatListElements("", listformat.StringElementDescriptionList{ "serverURL", "*string* (required): the URL of the vault instance", "namespace", "*string* (optional): the namespace used to evaluate secrets", - "secretsEngine", "*string* (optional): the secrets engine to use (default: secrets)", + "mountPath", "*string* (optional): the mount path to use (default: secrets)", "path", "*string* (optional): the path prefix used to lookup secrets", "secrets", "*[]string* (optional): list of secrets", "propagateConsumerIdentity", "*bool*(optional): evaluate metadata for consumer id propagation", diff --git a/pkg/contexts/credentials/repositories/vault/identity/identity.go b/pkg/contexts/credentials/repositories/vault/identity/identity.go index fc01e52d7d..4cae7c00f0 100644 --- a/pkg/contexts/credentials/repositories/vault/identity/identity.go +++ b/pkg/contexts/credentials/repositories/vault/identity/identity.go @@ -16,12 +16,12 @@ const CONSUMER_TYPE = "HashiCorpVault" // identity properties. const ( - ID_HOSTNAME = hostpath.ID_HOSTNAME - ID_SCHEMA = hostpath.ID_SCHEME - ID_PORT = hostpath.ID_PORT - ID_PATHPREFIX = hostpath.ID_PATHPREFIX - ID_SECRETENGINE = "secretEngine" - ID_NAMESPACE = "namespace" + ID_HOSTNAME = hostpath.ID_HOSTNAME + ID_SCHEMA = hostpath.ID_SCHEME + ID_PORT = hostpath.ID_PORT + ID_PATHPREFIX = hostpath.ID_PATHPREFIX + ID_MOUNTPATH = "mountPath" + ID_NAMESPACE = "namespace" ) // credential properties. @@ -43,7 +43,7 @@ func IdentityMatcher(request, cur, id cpi.ConsumerIdentity) bool { if id[ID_NAMESPACE] != request[ID_NAMESPACE] { return false } - if id[ID_SECRETENGINE] != "" && id[ID_SECRETENGINE] != request[ID_SECRETENGINE] { + if id[ID_MOUNTPATH] != "" && id[ID_MOUNTPATH] != request[ID_MOUNTPATH] { return false } return identityMatcher(request, cur, id) @@ -55,14 +55,13 @@ func init() { ATTR_TOKEN, "vault token", ATTR_ROLEID, "applrole role id", ATTR_SECRETID, "applrole secret id", - ATTR_SECRETID, "applrole secret id", }) ids := listformat.FormatListElements("", listformat.StringElementDescriptionList{ ID_HOSTNAME, "vault server host", ID_SCHEMA, "(optional) URL scheme", ID_PORT, "(optional) server port", ID_NAMESPACE, "vault namespace", - ID_SECRETENGINE, "secret engine", + ID_MOUNTPATH, "mount path", ID_PATHPREFIX, "path prefix for secret", }) cpi.RegisterStandardIdentity(CONSUMER_TYPE, identityMatcher, @@ -76,7 +75,7 @@ The only supported auth methods, so far, are token and approl `) } -func GetConsumerId(serverurl string, namespace string, secretengine string, secretpath string) (cpi.ConsumerIdentity, error) { +func GetConsumerId(serverurl string, namespace string, mountpath string, secretpath string) (cpi.ConsumerIdentity, error) { if serverurl == "" { return nil, errors.Newf("server address must be given") } @@ -106,8 +105,8 @@ func GetConsumerId(serverurl string, namespace string, secretengine string, secr if namespace != "" { id[ID_NAMESPACE] = namespace } - if secretengine != "" { - id[ID_SECRETENGINE] = secretengine + if mountpath != "" { + id[ID_MOUNTPATH] = mountpath } if secretpath != "" { @@ -116,8 +115,8 @@ func GetConsumerId(serverurl string, namespace string, secretengine string, secr return id, nil } -func GetCredentials(ctx cpi.ContextProvider, serverurl, namespace string, secretengine, secretpath string) (cpi.Credentials, error) { - id, err := GetConsumerId(serverurl, namespace, secretengine, secretpath) +func GetCredentials(ctx cpi.ContextProvider, serverurl, namespace string, mountpath, secretpath string) (cpi.Credentials, error) { + id, err := GetConsumerId(serverurl, namespace, mountpath, secretpath) if err != nil { return nil, err } diff --git a/pkg/contexts/credentials/repositories/vault/options.go b/pkg/contexts/credentials/repositories/vault/options.go index aeba1f6b3b..e78cf0dfac 100644 --- a/pkg/contexts/credentials/repositories/vault/options.go +++ b/pkg/contexts/credentials/repositories/vault/options.go @@ -11,7 +11,7 @@ type Option = optionutils.Option[*Options] type Options struct { Namespace string `json:"namespace,omitempty"` - SecretsEngine string `json:"secretsEngine,omitempty"` + MountPath string `json:"mountPath,omitempty"` Path string `json:"path,omitempty"` Secrets []string `json:"secrets,omitempty"` PropgateConsumerIdentity bool `json:"propagateConsumerIdentity,omitempty"` @@ -23,8 +23,8 @@ func (o *Options) ApplyTo(opts *Options) { if o.Namespace != "" { opts.Namespace = o.Namespace } - if o.SecretsEngine != "" { - opts.SecretsEngine = o.SecretsEngine + if o.MountPath != "" { + opts.MountPath = o.MountPath } if o.Path != "" { opts.Path = o.Path @@ -49,14 +49,14 @@ func WithNamespace(s string) Option { //////////////////////////////////////////////////////////////////////////////// -type se string +type m string -func (o se) ApplyTo(opts *Options) { - opts.SecretsEngine = string(o) +func (o m) ApplyTo(opts *Options) { + opts.MountPath = string(o) } -func WithSecretsEngine(s string) Option { - return se(s) +func WithMountPath(s string) Option { + return m(s) } //////////////////////////////////////////////////////////////////////////////// diff --git a/pkg/contexts/credentials/repositories/vault/provider.go b/pkg/contexts/credentials/repositories/vault/provider.go index fefc3c34f2..12d1a13d1e 100644 --- a/pkg/contexts/credentials/repositories/vault/provider.go +++ b/pkg/contexts/credentials/repositories/vault/provider.go @@ -3,6 +3,7 @@ package vault import ( "context" "encoding/json" + "net/http" "path" "strings" "sync" @@ -14,6 +15,7 @@ import ( "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" + "github.com/open-component-model/ocm/pkg/contexts/credentials/internal" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault/identity" ) @@ -29,17 +31,31 @@ type mapping struct { Name string } -type ConsumerProvider struct { - lock sync.Mutex - credentials map[string]cpi.DirectCredentials - repository *Repository +type credentialCache struct { creds cpi.CredentialsSource + credentials map[string]cpi.DirectCredentials consumer []*mapping +} + +func newCredentialCache(creds cpi.CredentialsSource) *credentialCache { + return &credentialCache{ + creds: creds, + credentials: map[string]cpi.DirectCredentials{}, + } +} + +type ConsumerProvider struct { + lock sync.Mutex + repository *Repository + cache *credentialCache updated bool } -var _ cpi.ConsumerProvider = (*ConsumerProvider)(nil) +var ( + _ cpi.ConsumerProvider = (*ConsumerProvider)(nil) + _ cpi.ConsumerIdentityProvider = (*ConsumerProvider)(nil) +) func NewConsumerProvider(repo *Repository) (*ConsumerProvider, error) { src, err := repo.ctx.GetCredentialsForConsumer(repo.id) @@ -47,25 +63,32 @@ func NewConsumerProvider(repo *Repository) (*ConsumerProvider, error) { return nil, err } return &ConsumerProvider{ - creds: src, - repository: repo, - credentials: map[string]cpi.DirectCredentials{}, + cache: newCredentialCache(src), + repository: repo, }, nil } -func (p *ConsumerProvider) update() error { - var err error +func (p *ConsumerProvider) String() string { + return p.repository.id.String() +} + +func (p *ConsumerProvider) GetConsumerId(uctx ...internal.UsageContext) internal.ConsumerIdentity { + return p.repository.GetConsumerId() +} + +func (p *ConsumerProvider) GetIdentityMatcher() string { + return p.repository.GetIdentityMatcher() +} +func (p *ConsumerProvider) update(ectx cpi.EvaluationContext) error { if p.updated { return nil } - p.updated = true - - p.creds, err = p.repository.ctx.GetCredentialsForConsumer(p.repository.id, identity.IdentityMatcher) + credsrc, err := cpi.GetCredentialsForConsumer(p.repository.ctx, ectx, p.repository.id, identity.IdentityMatcher) if err != nil { return err } - creds, err := p.creds.Credentials(p.repository.ctx) + creds, err := credsrc.Credentials(p.repository.ctx) if err != nil { return err } @@ -74,9 +97,6 @@ func (p *ConsumerProvider) update() error { return err } - p.credentials = map[string]cpi.DirectCredentials{} - p.consumer = nil - ctx := context.Background() client, err := vault.New( @@ -100,12 +120,15 @@ func (p *ConsumerProvider) update() error { return err } + cache := newCredentialCache(credsrc) + // TODO: support for pure path based access for other secret engine types secrets := slices.Clone(p.repository.spec.Secrets) if len(secrets) == 0 { s, err := client.Secrets.KvV2List(ctx, p.repository.spec.Path, - vault.WithMountPath(p.repository.spec.SecretsEngine)) + vault.WithMountPath(p.repository.spec.MountPath)) if err != nil { + p.error(err, "error listing secrets", "") return err } for _, k := range s.Data.Keys { @@ -125,16 +148,18 @@ func (p *ConsumerProvider) update() error { } } if len(id) > 0 { - p.consumer = append(p.consumer, &mapping{ + cache.consumer = append(cache.consumer, &mapping{ Id: cpi.ConsumerIdentity(id), Name: n, }) } if len(creds) > 0 { - p.credentials[n] = cpi.DirectCredentials(creds) + cache.credentials[n] = cpi.DirectCredentials(creds) } } } + p.cache = cache + p.updated = true return nil } @@ -159,10 +184,15 @@ func (p *ConsumerProvider) error(err error, msg string, secret string, keypairs if err == nil { return } - log.Error(msg, append(keypairs, + f := log.Info + var v *vault.ResponseError + if errors.As(err, &v) && v.StatusCode != http.StatusNotFound { + f = log.Error + } + f(msg, append(keypairs, "server", p.repository.spec.ServerURL, "namespace", p.repository.spec.Namespace, - "engine", p.repository.spec.SecretsEngine, + "engine", p.repository.spec.MountPath, "path", path.Join(p.repository.spec.Path, secret), "error", err.Error(), )..., @@ -174,7 +204,7 @@ func (p *ConsumerProvider) read(ctx context.Context, client *vault.Client, secre secret = path.Join(p.repository.spec.Path, secret) s, err := client.Secrets.KvV2Read(ctx, secret, - vault.WithMountPath(p.repository.spec.SecretsEngine)) + vault.WithMountPath(p.repository.spec.MountPath)) if err != nil { return nil, nil, nil, err } @@ -226,16 +256,16 @@ func getProps(data map[string]interface{}) common.Properties { func (p *ConsumerProvider) Unregister(id cpi.ProviderIdentity) { } -func (p *ConsumerProvider) Match(req cpi.ConsumerIdentity, cur cpi.ConsumerIdentity, m cpi.IdentityMatcher) (cpi.CredentialsSource, cpi.ConsumerIdentity) { - return p.get(req, cur, m) +func (p *ConsumerProvider) Match(ectx cpi.EvaluationContext, req cpi.ConsumerIdentity, cur cpi.ConsumerIdentity, m cpi.IdentityMatcher) (cpi.CredentialsSource, cpi.ConsumerIdentity) { + return p.get(ectx, req, cur, m) } func (p *ConsumerProvider) Get(req cpi.ConsumerIdentity) (cpi.CredentialsSource, bool) { - creds, _ := p.get(req, nil, cpi.CompleteMatch) + creds, _ := p.get(nil, req, nil, cpi.CompleteMatch) return creds, creds != nil } -func (p *ConsumerProvider) get(req cpi.ConsumerIdentity, cur cpi.ConsumerIdentity, m cpi.IdentityMatcher) (cpi.CredentialsSource, cpi.ConsumerIdentity) { +func (p *ConsumerProvider) get(ectx cpi.EvaluationContext, req cpi.ConsumerIdentity, cur cpi.ConsumerIdentity, m cpi.IdentityMatcher) (cpi.CredentialsSource, cpi.ConsumerIdentity) { if req.Equals(p.repository.id) { return nil, cur } @@ -243,13 +273,17 @@ func (p *ConsumerProvider) get(req cpi.ConsumerIdentity, cur cpi.ConsumerIdentit p.lock.Lock() defer p.lock.Unlock() - p.update() + err := p.update(ectx) + if err != nil { + log.Info("error accessing credentials provider", "error", err) + } + var creds cpi.CredentialsSource - for _, a := range p.consumer { + for _, a := range p.cache.consumer { if m(req, cur, a.Id) { cur = a.Id - creds = p.credentials[a.Name] + creds = p.cache.credentials[a.Name] } } return creds, cur @@ -262,11 +296,11 @@ func (c *ConsumerProvider) ExistsCredentials(name string) (bool, error) { c.lock.Lock() defer c.lock.Unlock() - err := c.update() + err := c.update(nil) if err != nil { return false, err } - _, ok := c.credentials[name] + _, ok := c.cache.credentials[name] return ok, nil } @@ -274,11 +308,11 @@ func (c *ConsumerProvider) LookupCredentials(name string) (cpi.Credentials, erro c.lock.Lock() defer c.lock.Unlock() - err := c.update() + err := c.update(nil) if err != nil { return nil, err } - src, ok := c.credentials[name] + src, ok := c.cache.credentials[name] if ok { return src, nil } diff --git a/pkg/contexts/credentials/repositories/vault/repo_int_test.go b/pkg/contexts/credentials/repositories/vault/repo_int_test.go new file mode 100644 index 0000000000..49105706dd --- /dev/null +++ b/pkg/contexts/credentials/repositories/vault/repo_int_test.go @@ -0,0 +1,513 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +//go:build integration + +package vault_test + +import ( + "context" + "fmt" + "net" + "os" + "os/exec" + "time" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/hashicorp/vault-client-go" + "github.com/hashicorp/vault-client-go/schema" + + "github.com/open-component-model/ocm/pkg/common" + "github.com/open-component-model/ocm/pkg/contexts/credentials" + "github.com/open-component-model/ocm/pkg/contexts/credentials/identity/hostpath" + me "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault" + "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault/identity" + "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/runtime" +) + +type vaultMode string + +const ( + HTTP vaultMode = "dev" + HTTPS vaultMode = "dev-tls" +) + +const ( + VAULT_APP_ROLE = "ocmrole" + VAULT_APP_ROLE1 = "ocmrole1" + VAULT_SECRET = "mysecret" + VAULT_CUSTOM_SECRETS = "secret-list" + VAULT_SECRET_2 = "mysecret2" + + VAULT_POLICY_NAME = "ocm" + VAULT_POLICY_NAME1 = "ocm1" + + VAULT_ROOT_TOKEN = "toorl" + VAULT_TLS_DIR = "./vault-tls" +) + +const ( + VAULT_POLICY_RULE = ` +path "secret/*" +{ + capabilities = ["read","list"] +} +` + VAULT_INSUFFICIENT_POLICY_RULE = ` +path "secret/notmysecret" +{ + capabilities = ["read", "list"] +} +` +) + +var _ = Describe("vault config", func() { + var DefaultContext credentials.Context + var cancelFunc context.CancelFunc + var vaultClient *vault.Client + var cmd *exec.Cmd + + ctx := context.Background() + + BeforeEach(func() { + cmd, vaultClient, cancelFunc = Must3(StartVaultServer(HTTP, VAULT_ROOT_TOKEN, VAULT_ADDRESS)) + DefaultContext = credentials.New() + }) + + AfterEach(func() { + cancelFunc() + _ = cmd.Wait() + Expect(os.RemoveAll(VAULT_TLS_DIR)).To(Succeed()) + }) + + Context("authentication to vault and reading secrets", func() { + + spec := me.NewRepositorySpec("http://"+VAULT_ADDRESS, me.WithPath(VAULT_PATH_REPO1), me.WithMountPath("secret")) + spec1 := me.NewRepositorySpec("http://"+VAULT_ADDRESS, me.WithPath(VAULT_PATH_REPO2), me.WithMountPath("secret")) + + It("authenticate with token and retrieve credentials", func() { + data := map[string]any{ + "password1": "ocm-password-1", + "password2": "ocm-password-2", + } + _ = Must(vaultClient.Secrets.KvV2Write(ctx, + VAULT_PATH_REPO1+"/"+VAULT_SECRET, + schema.KvV2WriteRequest{Data: data}, + vault.WithMountPath("secret"), + )) + + consumerId := Must(identity.GetConsumerId(vaultClient.Configuration().Address, + "", "secret", VAULT_PATH_REPO1)) + creds := credentials.NewCredentials(common.Properties{ + identity.ATTR_AUTHMETH: identity.AUTH_TOKEN, + identity.ATTR_TOKEN: VAULT_ROOT_TOKEN, + }) + DefaultContext.SetCredentialsForConsumer(consumerId, creds) + + repo := Must(DefaultContext.RepositoryForSpec(spec, nil)) + Expect(repo).ToNot(BeNil()) + + c, err := repo.LookupCredentials(VAULT_SECRET) + Expect(c.Properties()).To(YAMLEqual(data)) + Expect(err).To(BeNil()) + }) + + It("authenticate with approle and retrieve credentials", func() { + SetUpVaultAccess(ctx, DefaultContext, vaultClient, VAULT_POLICY_RULE) + + data := map[string]any{ + "password1": "ocm-password-1", + "password2": "ocm-password-2", + } + _ = Must(vaultClient.Secrets.KvV2Write(ctx, VAULT_PATH_REPO1+"/"+VAULT_SECRET, + schema.KvV2WriteRequest{Data: data}, + vault.WithMountPath("secret"), + )) + + repo := Must(DefaultContext.RepositoryForSpec(spec, nil)) + Expect(repo).ToNot(BeNil()) + + c, err := repo.LookupCredentials(VAULT_SECRET) + Expect(c.Properties()).To(YAMLEqual(data)) + Expect(err).To(BeNil()) + }) + + It("authenticate with approle with unsufficient authorizations and fail to retrieve credentials", func() { + SetUpVaultAccess(ctx, DefaultContext, vaultClient, VAULT_INSUFFICIENT_POLICY_RULE) + + _ = Must(vaultClient.Secrets.KvV2Write(ctx, VAULT_PATH_REPO1+"/"+VAULT_SECRET, schema.KvV2WriteRequest{ + Data: map[string]any{ + "password1": "ocm-password-1", + "password2": "ocm-password-2", + }}, + vault.WithMountPath("secret"), + )) + + repo := Must(DefaultContext.RepositoryForSpec(spec, nil)) + Expect(repo).ToNot(BeNil()) + + c, err := repo.LookupCredentials(VAULT_SECRET) + Expect(err).To(HaveOccurred()) + Expect(c).To(BeNil()) + }) + + It("authenticate with approle and specify a subset of secrets at the specified path in the repository spec", func() { + SetUpVaultAccess(ctx, DefaultContext, vaultClient, VAULT_POLICY_RULE) + + data := map[string]any{ + "password1": "ocm-password-1", + } + _ = Must(vaultClient.Secrets.KvV2Write(ctx, VAULT_PATH_REPO1+"/"+VAULT_SECRET, + schema.KvV2WriteRequest{Data: data}, + vault.WithMountPath("secret"), + )) + + _ = Must(vaultClient.Secrets.KvV2Write(ctx, VAULT_PATH_REPO1+"/"+VAULT_SECRET_2, schema.KvV2WriteRequest{ + Data: map[string]any{ + "password2": "ocm-password-2", + }}, + vault.WithMountPath("secret"), + )) + + // This is how we restrict the secrets accessible through the respository + spec.Secrets = append(spec.Secrets, VAULT_SECRET) + repo := Must(DefaultContext.RepositoryForSpec(spec, nil)) + Expect(repo).ToNot(BeNil()) + + c, err := repo.LookupCredentials(VAULT_SECRET) + Expect(c).To(YAMLEqual(data)) + Expect(err).ToNot(HaveOccurred()) + + c, err = repo.LookupCredentials(VAULT_SECRET_2) + Expect(err).To(BeNil()) + Expect(c).To(BeNil()) + }) + + It("authenticate with approle and specify a subset of secrets at the specified path in a dedicated secret", func() { + SetUpVaultAccess(ctx, DefaultContext, vaultClient, VAULT_POLICY_RULE) + + data := map[string]any{ + "password1": "ocm-password-1", + } + _ = Must(vaultClient.Secrets.KvV2Write(ctx, VAULT_PATH_REPO1+"/"+VAULT_SECRET, + schema.KvV2WriteRequest{Data: data}, + vault.WithMountPath("secret"), + )) + + _ = Must(vaultClient.Secrets.KvV2Write(ctx, VAULT_PATH_REPO1+"/"+VAULT_SECRET_2, schema.KvV2WriteRequest{ + Data: map[string]any{ + "password2": "ocm-password-2", + }}, + vault.WithMountPath("secret"), + )) + + // You have to specify a value, but it is essentially a placeholder here + _ = Must(vaultClient.Secrets.KvV2Write(ctx, VAULT_PATH_REPO1+"/"+VAULT_CUSTOM_SECRETS, schema.KvV2WriteRequest{ + Data: map[string]any{ + "description": "specify a list in the metadata", + }, + }, + vault.WithMountPath("secret"), + )) + metadata := map[string]any{ + me.CUSTOM_SECRETS: VAULT_SECRET, + } + _ = Must(vaultClient.Secrets.KvV2WriteMetadata(ctx, VAULT_PATH_REPO1+"/"+VAULT_CUSTOM_SECRETS, + schema.KvV2WriteMetadataRequest{CustomMetadata: metadata}, + vault.WithMountPath("secret"), + )) + + // This is how we restrict the secrets accessible through the respository + spec.Secrets = append(spec.Secrets, VAULT_CUSTOM_SECRETS) + repo := Must(DefaultContext.RepositoryForSpec(spec, nil)) + Expect(repo).ToNot(BeNil()) + + c, err := repo.LookupCredentials(VAULT_SECRET) + Expect(c).To(YAMLEqual(data)) + Expect(err).ToNot(HaveOccurred()) + + c, err = repo.LookupCredentials(VAULT_SECRET_2) + Expect(err).To(BeNil()) + Expect(c).To(BeNil()) + }) + + It("authenticate with approle and consume secrets with a consumer id from the provider", func() { + SetUpVaultAccess(ctx, DefaultContext, vaultClient, VAULT_POLICY_RULE) + + data := map[string]any{ + "password1": "ocm-password-1", + } + _ = Must(vaultClient.Secrets.KvV2Write(ctx, VAULT_PATH_REPO1+"/"+VAULT_SECRET, + schema.KvV2WriteRequest{Data: data}, + vault.WithMountPath("secret"), + )) + cid := hostpath.GetConsumerIdentity(hostpath.IDENTITY_TYPE, "https://test-url.com") + cidData := Must(runtime.DefaultJSONEncoding.Marshal(cid)) + metadata := map[string]any{ + me.CUSTOM_CONSUMERID: string(cidData), + } + _ = Must(vaultClient.Secrets.KvV2WriteMetadata(ctx, VAULT_PATH_REPO1+"/"+VAULT_SECRET, + schema.KvV2WriteMetadataRequest{CustomMetadata: metadata}, + vault.WithMountPath("secret"), + )) + + _ = Must(vaultClient.Secrets.KvV2Write(ctx, VAULT_PATH_REPO1+"/"+VAULT_SECRET_2, schema.KvV2WriteRequest{ + Data: map[string]any{ + "password2": "ocm-password-2", + }}, + vault.WithMountPath("secret"), + )) + + repo := Must(me.NewRepository(DefaultContext, spec)) + Expect(repo).ToNot(BeNil()) + provider := Must(me.NewConsumerProvider(repo)) + c, ok := provider.Get(cid) + Expect(ok).To(BeTrue()) + Expect(c).ToNot(BeNil()) + }) + + It("authenticate with approle and consume secrets with a consumer id from the credential context", func() { + SetUpVaultAccess(ctx, DefaultContext, vaultClient, VAULT_POLICY_RULE) + + data := map[string]any{ + "password1": "ocm-password-1", + } + _ = Must(vaultClient.Secrets.KvV2Write(ctx, VAULT_PATH_REPO1+"/"+VAULT_SECRET, + schema.KvV2WriteRequest{Data: data}, + vault.WithMountPath("secret"), + )) + cid := hostpath.GetConsumerIdentity(hostpath.IDENTITY_TYPE, "https://test-url.com") + cidData := Must(runtime.DefaultJSONEncoding.Marshal(cid)) + metadata := map[string]any{ + me.CUSTOM_CONSUMERID: string(cidData), + } + _ = Must(vaultClient.Secrets.KvV2WriteMetadata(ctx, VAULT_PATH_REPO1+"/"+VAULT_SECRET, + schema.KvV2WriteMetadataRequest{CustomMetadata: metadata}, + vault.WithMountPath("secret"), + )) + + _ = Must(vaultClient.Secrets.KvV2Write(ctx, VAULT_PATH_REPO1+"/"+VAULT_SECRET_2, schema.KvV2WriteRequest{ + Data: map[string]any{ + "password2": "ocm-password-2", + }}, + vault.WithMountPath("secret"), + )) + + spec.PropgateConsumerIdentity = true + repo := Must(DefaultContext.RepositoryForSpec(spec)) + Expect(repo).ToNot(BeNil()) + + c := Must(DefaultContext.GetCredentialsForConsumer(cid)) + Expect(c).To(YAMLEqual(data)) + }) + + It("recursive authentication", func() { + SetUpVaultAccess(ctx, DefaultContext, vaultClient, fmt.Sprintf(` +path "secret/data/%s/*" +{ + capabilities = ["read"] +} +path "secret/metadata/%s/*" +{ + capabilities = ["list"] +} +`, VAULT_PATH_REPO1, VAULT_PATH_REPO1)) + + _ = Must(vaultClient.System.PoliciesWriteAclPolicy(ctx, VAULT_POLICY_NAME1, schema.PoliciesWriteAclPolicyRequest{Policy: fmt.Sprintf(` +path "secret/data/%s/*" +{ + capabilities = ["read"] +} +path "secret/metadata/%s/*" +{ + capabilities = ["list"] +} +`, VAULT_PATH_REPO2, VAULT_PATH_REPO2)})) + _ = Must(vaultClient.Auth.AppRoleWriteRole(ctx, VAULT_APP_ROLE1, schema.AppRoleWriteRoleRequest{TokenType: "batch", SecretIdTtl: "10m", TokenTtl: "20m", TokenMaxTtl: "30m", SecretIdNumUses: 40, TokenPolicies: []string{VAULT_POLICY_NAME1}})) + + role := Must(vaultClient.Auth.AppRoleReadRoleId(ctx, VAULT_APP_ROLE1)) + roleid := role.Data.RoleId + // Unfortunately, this function is currently bugged, therefore we fall back to the generic function + //secretid := Must(client.Auth.AppRoleWriteSecretId(ctx, VAULT_APP_ROLE, schema.AppRoleWriteSecretIdRequest{})) + secret := Must(vaultClient.Write(ctx, fmt.Sprintf("/v1/auth/approle/role/%s/secret-id", VAULT_APP_ROLE1), map[string]interface{}{})) + secretid := secret.Data["secret_id"].(string) + + // Write a secret with the credentials for vault repo 2 (VAULT_PATH_REPO2) into vault repo 1 and write the + // consumer id of vault repo 2 into the secrets metadata + consumerId := Must(identity.GetConsumerId(VAULT_HTTP_URL, "", "secret", VAULT_PATH_REPO2)) + data := map[string]any{ + identity.ATTR_AUTHMETH: identity.AUTH_APPROLE, + identity.ATTR_ROLEID: roleid, + identity.ATTR_SECRETID: secretid, + } + _ = Must(vaultClient.Secrets.KvV2Write(ctx, VAULT_PATH_REPO1+"/"+VAULT_SECRET, + schema.KvV2WriteRequest{Data: data}, + vault.WithMountPath("secret"), + )) + consumerIdData := Must(runtime.DefaultJSONEncoding.Marshal(consumerId)) + metadata := map[string]any{ + me.CUSTOM_CONSUMERID: string(consumerIdData), + } + _ = Must(vaultClient.Secrets.KvV2WriteMetadata(ctx, VAULT_PATH_REPO1+"/"+VAULT_SECRET, + schema.KvV2WriteMetadataRequest{CustomMetadata: metadata}, + vault.WithMountPath("secret"), + )) + + // Write a secret with arbitrary data into vault repo 2 + data = map[string]any{ + "password1": "ocm-password-1", + } + _ = Must(vaultClient.Secrets.KvV2Write(ctx, VAULT_PATH_REPO2+"/"+VAULT_SECRET, + schema.KvV2WriteRequest{Data: data}, + vault.WithMountPath("secret"), + )) + consumerId = hostpath.GetConsumerIdentity(hostpath.IDENTITY_TYPE, "https://test-url.com") + consumerIdData = Must(runtime.DefaultJSONEncoding.Marshal(consumerId)) + metadata = map[string]any{ + me.CUSTOM_CONSUMERID: string(consumerIdData), + } + _ = Must(vaultClient.Secrets.KvV2WriteMetadata(ctx, VAULT_PATH_REPO2+"/"+VAULT_SECRET, + schema.KvV2WriteMetadataRequest{CustomMetadata: metadata}, + vault.WithMountPath("secret"), + )) + + spec.PropgateConsumerIdentity = true + repo := Must(DefaultContext.RepositoryForSpec(spec)) + Expect(repo).ToNot(BeNil()) + + fmt.Println("***add second provider:") + spec1.PropgateConsumerIdentity = true + repo = Must(DefaultContext.RepositoryForSpec(spec1)) + Expect(repo).ToNot(BeNil()) + + fmt.Println("***query credential:") + c := Must(DefaultContext.GetCredentialsForConsumer(consumerId)) + Expect(c).To(YAMLEqual(data)) + }) + + //D(irect): + // - has general credentials matching parent path of P2 + // - has credentials for P1 + //P1: + // - has specialized credentials for P2 + //P2: + // - has credentials for C + // + // + //query C: + //- D: -> nothing + //- P1: query P1 + // - D: -> found + // - P1: omit (recursion) + // - P2: query P2 + // - D: -> found + // - P1: omit (recursion) + // - P2: omit (recursion) + // explore, whether an additional attempt with P1 BUT only with credentialless providers / direct creds + // would work as a general solution. + // -> select D(P2) WRONG (a1) + //- P2: query P2 + // - D: -> found + // - P1: query P1 + // - D: found + // - P1: omit (recursion) + // - P2: omit (recursion) + // -> select D(P1) CORRECT (b) + // -> found + // - P2: omit (recursion) + // -> select P1(P2) CORRECT (a2) + // -> found + //-> select P2(C) + // + // The Problem here is, that the case a1 and case b are formally indistinguishable. While a2 and b lead to the + // correct result, we would fail in a1. + It("recursive authentication with overlapping credentials", func() { + //TODO + }) + }) +}) + +func StartVaultServer(mode vaultMode, rootToken, address string) (*exec.Cmd, *vault.Client, context.CancelFunc, error) { + cmdctx, cancelFunc := context.WithCancel(context.Background()) + if mode == "" { + mode = HTTP + } + url := address + switch mode { + case HTTP: + url = "http://" + url + case HTTPS: + url = "https://" + url + } + + cmd := exec.CommandContext(cmdctx, "../../../../../bin/vault", "server", "-"+string(mode), fmt.Sprintf("-dev-root-token-id=%s", rootToken), fmt.Sprintf("-dev-listen-address=%s", address)) + //cmd.Stdout = os.Stdout + //cmd.Stderr = os.Stderr + + vaultClient, err := vault.New( + vault.WithAddress(url), + vault.WithRequestTimeout(30*time.Second), + ) + if err != nil { + return nil, nil, cancelFunc, err + } + + // authenticate with root token + err = vaultClient.SetToken(rootToken) + if err != nil { + return nil, nil, cancelFunc, err + } + + err = cmd.Start() + if err == nil { + err = WaitForTCPServer(address, time.Minute) + } + return cmd, vaultClient, cancelFunc, err +} + +func WaitForTCPServer(address string, dur time.Duration) error { + var conn net.Conn + var d net.Dialer + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + + end := time.Now().Add(dur) + err := errors.New("timed out waiting for server to start") + for time.Now().Before(end) { + conn, err = d.DialContext(ctx, "tcp", address) + if err != nil { + time.Sleep(time.Second) + continue + } + conn.Close() + break + } + return err +} + +func SetUpVaultAccess(ctx context.Context, credctx credentials.Context, client *vault.Client, policy string) { + _ = Must(client.System.AuthEnableMethod(ctx, "approle", schema.AuthEnableMethodRequest{Type: "approle"})) + _ = Must(client.System.PoliciesWriteAclPolicy(ctx, VAULT_POLICY_NAME, schema.PoliciesWriteAclPolicyRequest{Policy: policy})) + _ = Must(client.Auth.AppRoleWriteRole(ctx, VAULT_APP_ROLE, schema.AppRoleWriteRoleRequest{TokenType: "batch", SecretIdTtl: "10m", TokenTtl: "20m", TokenMaxTtl: "30m", SecretIdNumUses: 40, TokenPolicies: []string{VAULT_POLICY_NAME}})) + + role := Must(client.Auth.AppRoleReadRoleId(ctx, VAULT_APP_ROLE)) + roleid := role.Data.RoleId + // Unfortunately, this function is currently bugged, therefore we fall back to the generic function + //secretid := Must(client.Auth.AppRoleWriteSecretId(ctx, VAULT_APP_ROLE, schema.AppRoleWriteSecretIdRequest{})) + secret := Must(client.Write(ctx, fmt.Sprintf("/v1/auth/approle/role/%s/secret-id", VAULT_APP_ROLE), map[string]interface{}{})) + secretid := secret.Data["secret_id"].(string) + + consumerId := Must(identity.GetConsumerId(client.Configuration().Address, "", "secret", VAULT_PATH_REPO1)) + creds := credentials.NewCredentials(common.Properties{ + identity.ATTR_AUTHMETH: identity.AUTH_APPROLE, + identity.ATTR_ROLEID: roleid, + identity.ATTR_SECRETID: secretid, + }) + credctx.SetCredentialsForConsumer(consumerId, creds) +} diff --git a/pkg/contexts/credentials/repositories/vault/repo_test.go b/pkg/contexts/credentials/repositories/vault/repo_test.go new file mode 100644 index 0000000000..7c9e5044d4 --- /dev/null +++ b/pkg/contexts/credentials/repositories/vault/repo_test.go @@ -0,0 +1,74 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. +// +// SPDX-License-Identifier: Apache-2.0 + +package vault_test + +import ( + "encoding/json" + "fmt" + "reflect" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/open-component-model/ocm/pkg/common" + "github.com/open-component-model/ocm/pkg/contexts/credentials" + me "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault" + "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault/identity" +) + +const ( + VAULT_ADDRESS = "127.0.0.1:8200" + VAULT_HTTP_URL = "http://" + VAULT_ADDRESS + VAULT_NAMESPACE = "test-namespace" + VAULT_MOUNT_PATH = "secret" + VAULT_PATH_REPO1 = "mysecrets/repo1" + VAULT_PATH_REPO2 = "mysecrets/repo2" +) + +var _ = Describe("", func() { + Context("serialization and deserialization", func() { + DefaultContext := credentials.New() + + specdata := fmt.Sprintf("{\"type\": %q, \"serverURL\": %q, \"namespace\": %q, \"mountPath\": %q, \"path\": %q, \"secrets\": [\"secret1\", \"secret2\", \"secret3\"], \"propagateConsumerIdentity\": true }", me.Type, "http://"+VAULT_ADDRESS, VAULT_NAMESPACE, VAULT_MOUNT_PATH, VAULT_PATH_REPO1) + spec := me.NewRepositorySpec("http://"+VAULT_ADDRESS, me.WithNamespace(VAULT_NAMESPACE), me.WithMountPath(VAULT_MOUNT_PATH), me.WithPath(VAULT_PATH_REPO1), me.WithSecrets("secret1", "secret2", "secret3"), me.WithPropagation()) + + specdata2 := fmt.Sprintf("{\"type\": %q, \"serverURL\": %q }", me.Type, "http://"+VAULT_ADDRESS) + spec2 := me.NewRepositorySpec("http://" + VAULT_ADDRESS) + + It("serializes repo spec", func() { + data := Must(json.Marshal(spec)) + Expect(data).To(YAMLEqual([]byte(specdata))) + + data = Must(json.Marshal(spec2)) + Expect(data).To(YAMLEqual([]byte(specdata2))) + }) + + It("deserializes repo spec", func() { + localspec := Must(DefaultContext.RepositorySpecForConfig([]byte(specdata), nil)) + Expect(reflect.TypeOf(localspec).String()).To(Equal("*vault.RepositorySpec")) + Expect(localspec).To(Equal(spec)) + + localspec = Must(DefaultContext.RepositorySpecForConfig([]byte(specdata2), nil)) + Expect(reflect.TypeOf(localspec).String()).To(Equal("*vault.RepositorySpec")) + Expect(localspec).To(Equal(spec2)) + }) + + It("resolves repository", func() { + // Since vault always requires credentials to be accessed, RepositoryForConfig checks whether credentials + // for a corresponding consumer exist. Thus, creating such credentials is required to test the method even + // though they are not used + consumerId := Must(identity.GetConsumerId(VAULT_HTTP_URL, VAULT_NAMESPACE, VAULT_MOUNT_PATH, VAULT_PATH_REPO1)) + creds := credentials.NewCredentials(common.Properties{ + identity.ATTR_AUTHMETH: identity.AUTH_TOKEN, + identity.ATTR_TOKEN: "token", + }) + DefaultContext.SetCredentialsForConsumer(consumerId, creds) + + repo := Must(DefaultContext.RepositoryForConfig([]byte(specdata), nil)) + Expect(repo).ToNot(BeNil()) + }) + }) +}) diff --git a/pkg/contexts/credentials/repositories/vault/repository.go b/pkg/contexts/credentials/repositories/vault/repository.go index cd736718ba..449db5667a 100644 --- a/pkg/contexts/credentials/repositories/vault/repository.go +++ b/pkg/contexts/credentials/repositories/vault/repository.go @@ -21,7 +21,7 @@ var ( ) func NewRepository(ctx cpi.Context, spec *RepositorySpec) (*Repository, error) { - id, err := identity.GetConsumerId(spec.ServerURL, spec.Namespace, spec.SecretsEngine, spec.Path) + id, err := identity.GetConsumerId(spec.ServerURL, spec.Namespace, spec.MountPath, spec.Path) if err != nil { return nil, err } diff --git a/pkg/contexts/credentials/repositories/vault/type.go b/pkg/contexts/credentials/repositories/vault/type.go index 9352544297..2e00632427 100644 --- a/pkg/contexts/credentials/repositories/vault/type.go +++ b/pkg/contexts/credentials/repositories/vault/type.go @@ -53,8 +53,8 @@ func (a *RepositorySpec) Repository(ctx cpi.Context, creds cpi.Credentials) (cpi } spec := *a spec.Secrets = slices.Clone(a.Secrets) - if spec.SecretsEngine == "" { - spec.SecretsEngine = "secrets" + if spec.MountPath == "" { + spec.MountPath = "secret" } return repos.GetRepository(ctx, &spec) } @@ -70,7 +70,7 @@ func (a *RepositorySpec) GetKey() cpi.ProviderIdentity { } func (a *RepositorySpec) GetConsumerId(uctx ...internal.UsageContext) internal.ConsumerIdentity { - id, err := identity.GetConsumerId(a.ServerURL, a.Namespace, a.SecretsEngine, a.Path) + id, err := identity.GetConsumerId(a.ServerURL, a.Namespace, a.MountPath, a.Path) if err != nil { return nil } From 93412ff3e1b601c9feb4ebb33f006c944281538a Mon Sep 17 00:00:00 2001 From: Hilmar Falkenberg Date: Tue, 21 May 2024 16:55:28 +0200 Subject: [PATCH 67/83] Maven/access2 (#731) ## Description Let's assume you have the following `component-constructor.yaml`: ```yaml name: acme.org/foo/bar version: 0.0.1 provider: name: acme.org resources: - name: java-sap-vcap-services type: mvnArtifact # new TYPE! version: 0.0.1 access: type: mvn # new TYPE! repository: https://repo1.maven.org/maven2 groupId: com.sap.cloud.environment.servicebinding artifactId: java-sap-vcap-services version: 0.10.4 # (optional) classifier classifier: '' # (optional) extension extension: jar ``` Then you can now create a component version: ```bash ocm add componentversions --create -F ./ctf component-constructor.yaml ``` And you can transfer it to any other Maven repository: ```bash ocm transfer cv -V ./ctf ./target --uploader 'ocm/mvnArtifact="Url":"https://my.maven.repository.acme.org/artifactory/ocm-mvn-test"}' ``` You might need to configure proper credentials in your `~/.ocmconfig`: ```yaml type: generic.config.ocm.software/v1 configurations: - type: credentials.config.ocm.software consumers: - identity: type: Repository.maven.apache.org hostname: int.repositories.cloud.sap path: artifactory/ocm-mvn-test credentials: - type: Credentials properties: username: 'my-user' password: 'top-secret' ``` --- .reuse/dep5 | 4 - LICENSES/BSD-3-Clause.txt | 11 - .../plugin_accessmethod_compose.md | 3 + docs/pluginreference/plugin_descriptor.md | 3 + .../plugin_valueset_compose.md | 3 + .../ocm_add_resource-configuration.md | 38 ++ docs/reference/ocm_add_resources.md | 38 ++ .../reference/ocm_add_source-configuration.md | 38 ++ docs/reference/ocm_add_sources.md | 38 ++ docs/reference/ocm_controller_install.md | 1 + docs/reference/ocm_controller_uninstall.md | 1 + docs/reference/ocm_credential-handling.md | 27 +- docs/reference/ocm_get_credentials.md | 27 +- docs/reference/ocm_logging.md | 3 +- docs/reference/ocm_ocm-accessmethods.md | 35 ++ docs/reference/ocm_ocm-uploadhandlers.md | 17 +- .../ocm_transfer_commontransportarchive.md | 17 +- .../ocm_transfer_componentversions.md | 17 +- hack/Makefile | 4 +- hack/tools.go | 1 - pkg/blobaccess/wget/access.go | 3 +- pkg/cobrautils/flag/path_array_test.go | 1 - pkg/cobrautils/flag/path_array_win_test.go | 1 - pkg/cobrautils/flag/path_test.go | 1 - pkg/cobrautils/flag/path_win_test.go | 1 - .../builtin/mvn/identity/identity.go | 82 ++++ .../builtin/npm/identity/identity.go | 4 +- pkg/contexts/ocm/accessmethods/init.go | 1 + pkg/contexts/ocm/accessmethods/mvn/README.md | 119 +++++ pkg/contexts/ocm/accessmethods/mvn/cli.go | 62 +++ .../ocm/accessmethods/mvn/coordinates.go | 144 ++++++ .../ocm/accessmethods/mvn/coordinates_test.go | 55 +++ .../ocm/accessmethods/mvn/integration_test.go | 98 ++++ pkg/contexts/ocm/accessmethods/mvn/method.go | 444 ++++++++++++++++++ .../ocm/accessmethods/mvn/method_test.go | 87 ++++ .../ocm/accessmethods/mvn/suite_test.go | 13 + .../5.7.0/sdk-modules-bom-5.7.0.pom | 210 +++++++++ .../5.7.0/sdk-modules-bom-5.7.0.pom.sha1 | 1 + .../fail/test/repository/42/repository-42.pom | 14 + .../test/repository/42/repository-42.pom.sha1 | 1 + .../ocm/accessmethods/options/standard.go | 11 +- .../handlers/generic/mvn/blobhandler.go | 180 +++++++ .../handlers/generic/mvn/blobhandler_test.go | 43 ++ .../handlers/generic/mvn/registration.go | 74 +++ .../handlers/generic/mvn/registration_test.go | 23 + .../handlers/generic/mvn/suite_test.go | 13 + pkg/contexts/ocm/blobhandler/handlers/init.go | 1 + .../artifactaccess/mvnaccess/resource.go | 30 ++ pkg/contexts/ocm/internal/blobhandler.go | 4 +- pkg/contexts/ocm/resourcetypes/const.go | 7 +- pkg/iotools/hashReaderWriter.go | 152 ++++++ pkg/iotools/hashReaderWriter_test.go | 79 ++++ pkg/iotools/suite_test.go | 13 + pkg/mime/types.go | 32 ++ pkg/mimeutils/type.go | 215 --------- pkg/utils/tarutils/extract.go | 27 +- pkg/utils/tarutils/pack.go | 98 ++++ pkg/utils/tarutils/pack_test.go | 21 +- pkg/version/generate/release_generate.go | 2 + pkg/version/version.go | 10 + 60 files changed, 2423 insertions(+), 280 deletions(-) delete mode 100644 LICENSES/BSD-3-Clause.txt create mode 100644 pkg/contexts/credentials/builtin/mvn/identity/identity.go create mode 100644 pkg/contexts/ocm/accessmethods/mvn/README.md create mode 100644 pkg/contexts/ocm/accessmethods/mvn/cli.go create mode 100644 pkg/contexts/ocm/accessmethods/mvn/coordinates.go create mode 100644 pkg/contexts/ocm/accessmethods/mvn/coordinates_test.go create mode 100644 pkg/contexts/ocm/accessmethods/mvn/integration_test.go create mode 100644 pkg/contexts/ocm/accessmethods/mvn/method.go create mode 100644 pkg/contexts/ocm/accessmethods/mvn/method_test.go create mode 100644 pkg/contexts/ocm/accessmethods/mvn/suite_test.go create mode 100644 pkg/contexts/ocm/accessmethods/mvn/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0.pom create mode 100644 pkg/contexts/ocm/accessmethods/mvn/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0.pom.sha1 create mode 100644 pkg/contexts/ocm/accessmethods/mvn/testdata/fail/test/repository/42/repository-42.pom create mode 100644 pkg/contexts/ocm/accessmethods/mvn/testdata/fail/test/repository/42/repository-42.pom.sha1 create mode 100644 pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler.go create mode 100644 pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler_test.go create mode 100644 pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration.go create mode 100644 pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration_test.go create mode 100644 pkg/contexts/ocm/blobhandler/handlers/generic/mvn/suite_test.go create mode 100644 pkg/contexts/ocm/elements/artifactaccess/mvnaccess/resource.go create mode 100644 pkg/iotools/hashReaderWriter.go create mode 100644 pkg/iotools/hashReaderWriter_test.go create mode 100644 pkg/iotools/suite_test.go delete mode 100644 pkg/mimeutils/type.go diff --git a/.reuse/dep5 b/.reuse/dep5 index 30a2631ec6..e75df02db4 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -28,10 +28,6 @@ Files: ** Copyright: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors License: Apache-2.0 -Files: pkg/mimeutils/* -Copyright: Copyright 2010 The Go Authors. All rights reserved. -License: BSD-3-Clause - Files: pkg/contexts/ocm/blobhandler/handlers/generic/npm/publish.go Copyright: Copyright 2021 - cloverstd License: MIT diff --git a/LICENSES/BSD-3-Clause.txt b/LICENSES/BSD-3-Clause.txt deleted file mode 100644 index ea890afbc7..0000000000 --- a/LICENSES/BSD-3-Clause.txt +++ /dev/null @@ -1,11 +0,0 @@ -Copyright (c) . - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/docs/pluginreference/plugin_accessmethod_compose.md b/docs/pluginreference/plugin_accessmethod_compose.md index 5ffbea5834..d9c0455651 100644 --- a/docs/pluginreference/plugin_accessmethod_compose.md +++ b/docs/pluginreference/plugin_accessmethod_compose.md @@ -35,6 +35,9 @@ by the plugin name. The following predefined option types can be used: + - accessClassifier: [*string*] mvn classifier + - accessExtension: [*string*] mvn extension name + - accessGroup: [*string*] GroupID or namespace - accessHostname: [*string*] hostname used for access - accessPackage: [*string*] package or object name - accessRegistry: [*string*] registry base URL diff --git a/docs/pluginreference/plugin_descriptor.md b/docs/pluginreference/plugin_descriptor.md index f04a2169f4..c3ecbdd8a4 100644 --- a/docs/pluginreference/plugin_descriptor.md +++ b/docs/pluginreference/plugin_descriptor.md @@ -120,6 +120,9 @@ It uses the following fields: The following predefined option types can be used: + - accessClassifier: [*string*] mvn classifier + - accessExtension: [*string*] mvn extension name + - accessGroup: [*string*] GroupID or namespace - accessHostname: [*string*] hostname used for access - accessPackage: [*string*] package or object name - accessRegistry: [*string*] registry base URL diff --git a/docs/pluginreference/plugin_valueset_compose.md b/docs/pluginreference/plugin_valueset_compose.md index 0ad1025ed4..09bf007037 100644 --- a/docs/pluginreference/plugin_valueset_compose.md +++ b/docs/pluginreference/plugin_valueset_compose.md @@ -35,6 +35,9 @@ by the plugin name. The following predefined option types can be used: + - accessClassifier: [*string*] mvn classifier + - accessExtension: [*string*] mvn extension name + - accessGroup: [*string*] GroupID or namespace - accessHostname: [*string*] hostname used for access - accessPackage: [*string*] package or object name - accessRegistry: [*string*] registry base URL diff --git a/docs/reference/ocm_add_resource-configuration.md b/docs/reference/ocm_add_resource-configuration.md index fdc3daaee8..679bcc2f27 100644 --- a/docs/reference/ocm_add_resource-configuration.md +++ b/docs/reference/ocm_add_resource-configuration.md @@ -24,6 +24,9 @@ resource-configuration, resourceconfig, rsccfg, rcfg ``` --access YAML blob access specification (YAML) + --accessClassifier string mvn classifier + --accessExtension string mvn extension name + --accessGroup string GroupID or namespace --accessHostname string hostname used for access --accessPackage string package or object name --accessRegistry string registry base URL @@ -680,6 +683,41 @@ shown below. Options used to configure fields: --globalAccess, --hint, --mediaType, --reference +- Access type mvn + + This method implements the access of a Maven (mvn) artifact in a Maven repository. + + The following versions are supported: + - Version v1 + + The type specific specification fields are: + + - **repository** *string* + + Base URL of the Maven (mvn) repository + + - **groupId** *string* + + The groupId of the Maven (mvn) artifact + + - **artifactId** *string* + + The artifactId of the Maven (mvn) artifact + + - **version** *string* + + The version name of the Maven (mvn) artifact + + - **classifier** *string* + + The optional classifier of the Maven (mvn) artifact + + - **extension** *string* + + The optional extension of the Maven (mvn) artifact + + Options used to configure fields: --accessClassifier, --accessExtension, --accessGroup, --accessPackage, --accessRepository, --accessVersion + - Access type none dummy resource with no access diff --git a/docs/reference/ocm_add_resources.md b/docs/reference/ocm_add_resources.md index d755180f4e..9e8878f8e8 100644 --- a/docs/reference/ocm_add_resources.md +++ b/docs/reference/ocm_add_resources.md @@ -30,6 +30,9 @@ resources, resource, res, r ``` --access YAML blob access specification (YAML) + --accessClassifier string mvn classifier + --accessExtension string mvn extension name + --accessGroup string GroupID or namespace --accessHostname string hostname used for access --accessPackage string package or object name --accessRegistry string registry base URL @@ -690,6 +693,41 @@ shown below. Options used to configure fields: --globalAccess, --hint, --mediaType, --reference +- Access type mvn + + This method implements the access of a Maven (mvn) artifact in a Maven repository. + + The following versions are supported: + - Version v1 + + The type specific specification fields are: + + - **repository** *string* + + Base URL of the Maven (mvn) repository + + - **groupId** *string* + + The groupId of the Maven (mvn) artifact + + - **artifactId** *string* + + The artifactId of the Maven (mvn) artifact + + - **version** *string* + + The version name of the Maven (mvn) artifact + + - **classifier** *string* + + The optional classifier of the Maven (mvn) artifact + + - **extension** *string* + + The optional extension of the Maven (mvn) artifact + + Options used to configure fields: --accessClassifier, --accessExtension, --accessGroup, --accessPackage, --accessRepository, --accessVersion + - Access type none dummy resource with no access diff --git a/docs/reference/ocm_add_source-configuration.md b/docs/reference/ocm_add_source-configuration.md index 25a8f5f5a0..f7d2b4fc32 100644 --- a/docs/reference/ocm_add_source-configuration.md +++ b/docs/reference/ocm_add_source-configuration.md @@ -24,6 +24,9 @@ source-configuration, sourceconfig, srccfg, scfg ``` --access YAML blob access specification (YAML) + --accessClassifier string mvn classifier + --accessExtension string mvn extension name + --accessGroup string GroupID or namespace --accessHostname string hostname used for access --accessPackage string package or object name --accessRegistry string registry base URL @@ -680,6 +683,41 @@ shown below. Options used to configure fields: --globalAccess, --hint, --mediaType, --reference +- Access type mvn + + This method implements the access of a Maven (mvn) artifact in a Maven repository. + + The following versions are supported: + - Version v1 + + The type specific specification fields are: + + - **repository** *string* + + Base URL of the Maven (mvn) repository + + - **groupId** *string* + + The groupId of the Maven (mvn) artifact + + - **artifactId** *string* + + The artifactId of the Maven (mvn) artifact + + - **version** *string* + + The version name of the Maven (mvn) artifact + + - **classifier** *string* + + The optional classifier of the Maven (mvn) artifact + + - **extension** *string* + + The optional extension of the Maven (mvn) artifact + + Options used to configure fields: --accessClassifier, --accessExtension, --accessGroup, --accessPackage, --accessRepository, --accessVersion + - Access type none dummy resource with no access diff --git a/docs/reference/ocm_add_sources.md b/docs/reference/ocm_add_sources.md index ed829fb938..746d02c5ee 100644 --- a/docs/reference/ocm_add_sources.md +++ b/docs/reference/ocm_add_sources.md @@ -29,6 +29,9 @@ sources, source, src, s ``` --access YAML blob access specification (YAML) + --accessClassifier string mvn classifier + --accessExtension string mvn extension name + --accessGroup string GroupID or namespace --accessHostname string hostname used for access --accessPackage string package or object name --accessRegistry string registry base URL @@ -688,6 +691,41 @@ shown below. Options used to configure fields: --globalAccess, --hint, --mediaType, --reference +- Access type mvn + + This method implements the access of a Maven (mvn) artifact in a Maven repository. + + The following versions are supported: + - Version v1 + + The type specific specification fields are: + + - **repository** *string* + + Base URL of the Maven (mvn) repository + + - **groupId** *string* + + The groupId of the Maven (mvn) artifact + + - **artifactId** *string* + + The artifactId of the Maven (mvn) artifact + + - **version** *string* + + The version name of the Maven (mvn) artifact + + - **classifier** *string* + + The optional classifier of the Maven (mvn) artifact + + - **extension** *string* + + The optional extension of the Maven (mvn) artifact + + Options used to configure fields: --accessClassifier, --accessExtension, --accessGroup, --accessPackage, --accessRepository, --accessVersion + - Access type none dummy resource with no access diff --git a/docs/reference/ocm_controller_install.md b/docs/reference/ocm_controller_install.md index 701fd35056..8ed8c1c02c 100644 --- a/docs/reference/ocm_controller_install.md +++ b/docs/reference/ocm_controller_install.md @@ -19,6 +19,7 @@ ocm controller install controller {--version v0.0.1} -i, --install-prerequisites install prerequisites required by ocm-controller (default true) -n, --namespace string the namespace into which the controller is installed (default "ocm-system") -a, --release-api-url string the base url to the ocm-controller's API release page (default "https://api.github.com/repos/open-component-model/ocm-controller/releases") + -l, --silent don't fail on error -s, --skip-pre-flight-check skip the pre-flight check for clusters -t, --timeout duration maximum time to wait for deployment to be ready (default 1m0s) -v, --version string the version of the controller to install (default "latest") diff --git a/docs/reference/ocm_controller_uninstall.md b/docs/reference/ocm_controller_uninstall.md index 2d4c0f1734..e13c34927c 100644 --- a/docs/reference/ocm_controller_uninstall.md +++ b/docs/reference/ocm_controller_uninstall.md @@ -18,6 +18,7 @@ ocm controller uninstall controller -h, --help help for uninstall -n, --namespace string the namespace into which the controller is installed (default "ocm-system") -a, --release-api-url string the base url to the ocm-controller's API release page (default "https://api.github.com/repos/open-component-model/ocm-controller/releases") + -l, --silent don't fail on error -t, --timeout duration maximum time to wait for deployment to be ready (default 1m0s) -p, --uninstall-prerequisites uninstall prerequisites required by ocm-controller -v, --version string the version of the controller to install (default "latest") diff --git a/docs/reference/ocm_credential-handling.md b/docs/reference/ocm_credential-handling.md index fdf51d3363..28e70c6c12 100644 --- a/docs/reference/ocm_credential-handling.md +++ b/docs/reference/ocm_credential-handling.md @@ -156,25 +156,23 @@ The following credential consumer types are used/supported: - certificateAuthority: TLS certificate authority - - OCIRegistry: OCI registry credential matcher + - MavenRepository: MVN repository - It matches the OCIRegistry consumer type and additionally acts like + It matches the MavenRepository consumer type and additionally acts like the hostpath type. - Credential consumers of the consumer type OCIRegistry evaluate the following credential properties: + Credential consumers of the consumer type MavenRepository evaluate the following credential properties: - username: the basic auth user name - password: the basic auth password - - identityToken: the bearer token used for non-basic auth authorization - - certificateAuthority: the certificate authority certificate used to verify certificates - - Registry.npmjs.com: NPM repository + - NpmRegistry: NPM repository - It matches the Registry.npmjs.com consumer type and additionally acts like + It matches the NpmRegistry consumer type and additionally acts like the hostpath type. - Credential consumers of the consumer type Registry.npmjs.com evaluate the following credential properties: + Credential consumers of the consumer type NpmRegistry evaluate the following credential properties: - username: the basic auth user name - password: the basic auth password @@ -182,6 +180,19 @@ The following credential consumer types are used/supported: - token: the token attribute. May exist after login at any npm registry. Check your .npmrc file! + - OCIRegistry: OCI registry credential matcher + + It matches the OCIRegistry consumer type and additionally acts like + the hostpath type. + + Credential consumers of the consumer type OCIRegistry evaluate the following credential properties: + + - username: the basic auth user name + - password: the basic auth password + - identityToken: the bearer token used for non-basic auth authorization + - certificateAuthority: the certificate authority certificate used to verify certificates + + - S3: S3 credential matcher This matcher is a hostpath matcher. diff --git a/docs/reference/ocm_get_credentials.md b/docs/reference/ocm_get_credentials.md index cf3d1cbc4d..c97d24bb06 100644 --- a/docs/reference/ocm_get_credentials.md +++ b/docs/reference/ocm_get_credentials.md @@ -82,25 +82,23 @@ Matchers exist for the following usage contexts or consumer types: - certificateAuthority: TLS certificate authority - - OCIRegistry: OCI registry credential matcher + - MavenRepository: MVN repository - It matches the OCIRegistry consumer type and additionally acts like + It matches the MavenRepository consumer type and additionally acts like the hostpath type. - Credential consumers of the consumer type OCIRegistry evaluate the following credential properties: + Credential consumers of the consumer type MavenRepository evaluate the following credential properties: - username: the basic auth user name - password: the basic auth password - - identityToken: the bearer token used for non-basic auth authorization - - certificateAuthority: the certificate authority certificate used to verify certificates - - Registry.npmjs.com: NPM repository + - NpmRegistry: NPM repository - It matches the Registry.npmjs.com consumer type and additionally acts like + It matches the NpmRegistry consumer type and additionally acts like the hostpath type. - Credential consumers of the consumer type Registry.npmjs.com evaluate the following credential properties: + Credential consumers of the consumer type NpmRegistry evaluate the following credential properties: - username: the basic auth user name - password: the basic auth password @@ -108,6 +106,19 @@ Matchers exist for the following usage contexts or consumer types: - token: the token attribute. May exist after login at any npm registry. Check your .npmrc file! + - OCIRegistry: OCI registry credential matcher + + It matches the OCIRegistry consumer type and additionally acts like + the hostpath type. + + Credential consumers of the consumer type OCIRegistry evaluate the following credential properties: + + - username: the basic auth user name + - password: the basic auth password + - identityToken: the bearer token used for non-basic auth authorization + - certificateAuthority: the certificate authority certificate used to verify certificates + + - S3: S3 credential matcher This matcher is a hostpath matcher. diff --git a/docs/reference/ocm_logging.md b/docs/reference/ocm_logging.md index 08a6292a2c..f72d0b3fcb 100644 --- a/docs/reference/ocm_logging.md +++ b/docs/reference/ocm_logging.md @@ -18,7 +18,6 @@ The following *tags* are used by the command line tool: The following *realms* are used by the command line tool: - ocm: general realm used for the ocm go library. - - ocm/NPM: NPM registry - ocm/accessmethod/ociartifact: access method ociArtifact - ocm/accessmethod/wget: access method for wget - ocm/blobaccess/wget: blob access for wget @@ -28,6 +27,8 @@ The following *realms* are used by the command line tool: - ocm/credentials/dockerconfig: docker config handling as credential repository - ocm/credentials/vault: HashiCorp Vault Access - ocm/downloader: Downloaders + - ocm/mvn: Maven repository + - ocm/npm: NPM registry - ocm/oci/mapping: OCM to OCI Registry Mapping - ocm/oci/ocireg: OCI repository handling - ocm/plugins: OCM plugin handling diff --git a/docs/reference/ocm_ocm-accessmethods.md b/docs/reference/ocm_ocm-accessmethods.md index f94353937d..1c02801075 100644 --- a/docs/reference/ocm_ocm-accessmethods.md +++ b/docs/reference/ocm_ocm-accessmethods.md @@ -183,6 +183,41 @@ shown below. Options used to configure fields: --globalAccess, --hint, --mediaType, --reference +- Access type mvn + + This method implements the access of a Maven (mvn) artifact in a Maven repository. + + The following versions are supported: + - Version v1 + + The type specific specification fields are: + + - **repository** *string* + + Base URL of the Maven (mvn) repository + + - **groupId** *string* + + The groupId of the Maven (mvn) artifact + + - **artifactId** *string* + + The artifactId of the Maven (mvn) artifact + + - **version** *string* + + The version name of the Maven (mvn) artifact + + - **classifier** *string* + + The optional classifier of the Maven (mvn) artifact + + - **extension** *string* + + The optional extension of the Maven (mvn) artifact + + Options used to configure fields: --accessClassifier, --accessExtension, --accessGroup, --accessPackage, --accessRepository, --accessVersion + - Access type none dummy resource with no access diff --git a/docs/reference/ocm_ocm-uploadhandlers.md b/docs/reference/ocm_ocm-uploadhandlers.md index 767da82a6d..d3b3219957 100644 --- a/docs/reference/ocm_ocm-uploadhandlers.md +++ b/docs/reference/ocm_ocm-uploadhandlers.md @@ -60,10 +60,6 @@ The following handler names are possible: Alternatively, a single string value can be given representing an OCI repository reference. - - plugin: [downloaders provided by plugins] - - sub namespace of the form <plugin name>/<handler> - - ocm/npmPackage: uploading npm artifacts The ocm/npmPackage uploader is able to upload npm artifacts @@ -73,6 +69,19 @@ The following handler names are possible: It accepts a plain string for the URL or a config with the following field: 'url': the URL of the npm repository. + - plugin: [downloaders provided by plugins] + + sub namespace of the form <plugin name>/<handler> + + - ocm/mvnArtifact: uploading mvn artifacts + + The ocm/mvnArtifact uploader is able to upload mvn artifacts (whole GAV only!) + as artifact archive according to the mvn artifact spec. + If registered the default mime type is: application/x-tgz + + It accepts a plain string for the URL or a config with the following field: + 'url': the URL of the mvn repository. + See [ocm ocm-uploadhandlers](ocm_ocm-uploadhandlers.md) for further details on using diff --git a/docs/reference/ocm_transfer_commontransportarchive.md b/docs/reference/ocm_transfer_commontransportarchive.md index faa7bfe6a1..c3f6c2d20a 100644 --- a/docs/reference/ocm_transfer_commontransportarchive.md +++ b/docs/reference/ocm_transfer_commontransportarchive.md @@ -134,10 +134,6 @@ The uploader name may be a path expression with the following possibilities: Alternatively, a single string value can be given representing an OCI repository reference. - - plugin: [downloaders provided by plugins] - - sub namespace of the form <plugin name>/<handler> - - ocm/npmPackage: uploading npm artifacts The ocm/npmPackage uploader is able to upload npm artifacts @@ -147,6 +143,19 @@ The uploader name may be a path expression with the following possibilities: It accepts a plain string for the URL or a config with the following field: 'url': the URL of the npm repository. + - plugin: [downloaders provided by plugins] + + sub namespace of the form <plugin name>/<handler> + + - ocm/mvnArtifact: uploading mvn artifacts + + The ocm/mvnArtifact uploader is able to upload mvn artifacts (whole GAV only!) + as artifact archive according to the mvn artifact spec. + If registered the default mime type is: application/x-tgz + + It accepts a plain string for the URL or a config with the following field: + 'url': the URL of the mvn repository. + See [ocm ocm-uploadhandlers](ocm_ocm-uploadhandlers.md) for further details on using diff --git a/docs/reference/ocm_transfer_componentversions.md b/docs/reference/ocm_transfer_componentversions.md index cbbae63fe8..f251617d44 100644 --- a/docs/reference/ocm_transfer_componentversions.md +++ b/docs/reference/ocm_transfer_componentversions.md @@ -191,10 +191,6 @@ The uploader name may be a path expression with the following possibilities: Alternatively, a single string value can be given representing an OCI repository reference. - - plugin: [downloaders provided by plugins] - - sub namespace of the form <plugin name>/<handler> - - ocm/npmPackage: uploading npm artifacts The ocm/npmPackage uploader is able to upload npm artifacts @@ -204,6 +200,19 @@ The uploader name may be a path expression with the following possibilities: It accepts a plain string for the URL or a config with the following field: 'url': the URL of the npm repository. + - plugin: [downloaders provided by plugins] + + sub namespace of the form <plugin name>/<handler> + + - ocm/mvnArtifact: uploading mvn artifacts + + The ocm/mvnArtifact uploader is able to upload mvn artifacts (whole GAV only!) + as artifact archive according to the mvn artifact spec. + If registered the default mime type is: application/x-tgz + + It accepts a plain string for the URL or a config with the following field: + 'url': the URL of the mvn repository. + See [ocm ocm-uploadhandlers](ocm_ocm-uploadhandlers.md) for further details on using diff --git a/hack/Makefile b/hack/Makefile index aeab22f85b..d2de231042 100644 --- a/hack/Makefile +++ b/hack/Makefile @@ -45,12 +45,12 @@ ifneq ("v$(GO_BINDATA)",$(GO_BINDATA_VERSION)) endif VAULT_VERSION := 1.16.2 VAULT := $(shell ($(LOCALBIN)/vault --version 2>/dev/null || echo 0.0) | sed 's/.*Vault v\([0-9\.]*\).*/\1/') -ifeq ($(VAULT), $(VAULT_VERSION)) +ifneq ($(VAULT), $(VAULT_VERSION)) deps += vault endif OCI_REGISTRY_VERSION := 3.0.0-alpha.1 OCI_REGISTRY := $(shell (registry --version 2>/dev/null || echo 0.0) | sed 's/.* v\([0-9a-z\.\-]*\).*/\1/') -ifeq ($(OCI_REGISTRY), $(OCI_REGISTRY_VERSION)) +ifneq ($(OCI_REGISTRY), $(OCI_REGISTRY_VERSION)) deps += oci-registry endif diff --git a/hack/tools.go b/hack/tools.go index b76c619e68..5b15c7ab40 100644 --- a/hack/tools.go +++ b/hack/tools.go @@ -1,5 +1,4 @@ //go:build tools -// +build tools package tools diff --git a/pkg/blobaccess/wget/access.go b/pkg/blobaccess/wget/access.go index d2611910c3..fcd2b22552 100644 --- a/pkg/blobaccess/wget/access.go +++ b/pkg/blobaccess/wget/access.go @@ -16,7 +16,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/wget/identity" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" ocmmime "github.com/open-component-model/ocm/pkg/mime" - "github.com/open-component-model/ocm/pkg/mimeutils" "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/utils" ) @@ -133,7 +132,7 @@ func BlobAccessForWget(url string, opts ...Option) (_ blobaccess.BlobAccess, rer "extract mime type from url") ext, err := utils.GetFileExtensionFromUrl(url) if err == nil && ext != "" { - eff.MimeType = mimeutils.TypeByExtension(ext) + eff.MimeType = mime.TypeByExtension(ext) } else if err != nil { log.Debug(err.Error()) } diff --git a/pkg/cobrautils/flag/path_array_test.go b/pkg/cobrautils/flag/path_array_test.go index 79bc5352bc..c403dc7b67 100644 --- a/pkg/cobrautils/flag/path_array_test.go +++ b/pkg/cobrautils/flag/path_array_test.go @@ -1,5 +1,4 @@ //go:build !windows -// +build !windows package flag_test diff --git a/pkg/cobrautils/flag/path_array_win_test.go b/pkg/cobrautils/flag/path_array_win_test.go index a0fd2bf1ad..888954e4a9 100644 --- a/pkg/cobrautils/flag/path_array_win_test.go +++ b/pkg/cobrautils/flag/path_array_win_test.go @@ -1,5 +1,4 @@ //go:build windows -// +build windows package flag_test diff --git a/pkg/cobrautils/flag/path_test.go b/pkg/cobrautils/flag/path_test.go index 8440a9ce96..1de8cecc33 100644 --- a/pkg/cobrautils/flag/path_test.go +++ b/pkg/cobrautils/flag/path_test.go @@ -1,5 +1,4 @@ //go:build !windows -// +build !windows package flag_test diff --git a/pkg/cobrautils/flag/path_win_test.go b/pkg/cobrautils/flag/path_win_test.go index 4220aa270c..bea185436b 100644 --- a/pkg/cobrautils/flag/path_win_test.go +++ b/pkg/cobrautils/flag/path_win_test.go @@ -1,5 +1,4 @@ //go:build windows -// +build windows package flag_test diff --git a/pkg/contexts/credentials/builtin/mvn/identity/identity.go b/pkg/contexts/credentials/builtin/mvn/identity/identity.go new file mode 100644 index 0000000000..0a5bf6fc74 --- /dev/null +++ b/pkg/contexts/credentials/builtin/mvn/identity/identity.go @@ -0,0 +1,82 @@ +package identity + +import ( + "errors" + "net/http" + + . "net/url" + + "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" + "github.com/open-component-model/ocm/pkg/contexts/credentials/identity/hostpath" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" + "github.com/open-component-model/ocm/pkg/listformat" + "github.com/open-component-model/ocm/pkg/logging" +) + +const ( + // CONSUMER_TYPE is the mvn repository type. + CONSUMER_TYPE = "MavenRepository" + + // ATTR_USERNAME is the username attribute. Required for login at any mvn registry. + ATTR_USERNAME = cpi.ATTR_USERNAME + // ATTR_PASSWORD is the password attribute. Required for login at any mvn registry. + ATTR_PASSWORD = cpi.ATTR_PASSWORD +) + +// REALM the logging realm / prefix. +var REALM = logging.DefineSubRealm("Maven repository", "mvn") + +func init() { + attrs := listformat.FormatListElements("", listformat.StringElementDescriptionList{ + ATTR_USERNAME, "the basic auth user name", + ATTR_PASSWORD, "the basic auth password", + }) + + cpi.RegisterStandardIdentity(CONSUMER_TYPE, hostpath.IdentityMatcher(CONSUMER_TYPE), `MVN repository + +It matches the `+CONSUMER_TYPE+` consumer type and additionally acts like +the `+hostpath.IDENTITY_TYPE+` type.`, + attrs) +} + +var identityMatcher = hostpath.IdentityMatcher(CONSUMER_TYPE) + +func IdentityMatcher(pattern, cur, id cpi.ConsumerIdentity) bool { + return identityMatcher(pattern, cur, id) +} + +func GetConsumerId(rawURL, groupId string) (cpi.ConsumerIdentity, error) { + url, err := JoinPath(rawURL, groupId) + if err != nil { + return nil, err + } + return hostpath.GetConsumerIdentity(CONSUMER_TYPE, url), nil +} + +func GetCredentials(ctx cpi.ContextProvider, repoUrl, groupId string) (cpi.Credentials, error) { + id, err := GetConsumerId(repoUrl, groupId) + if err != nil { + return nil, err + } + if id == nil { + logging.DynamicLogger(REALM).Debug("No consumer identity found.", "url", repoUrl, "groupId", groupId) + return nil, nil + } + return cpi.CredentialsForConsumer(ctx.CredentialsContext(), id) +} + +func BasicAuth(req *http.Request, ctx accspeccpi.Context, repoUrl, groupId string) (err error) { + credentials, err := GetCredentials(ctx, repoUrl, groupId) + if err != nil { + return err + } + if credentials == nil { + logging.DynamicLogger(REALM).Debug("No credentials found. BasicAuth not required?", "url", repoUrl, "groupId", groupId) + return nil + } + if !credentials.ExistsProperty(ATTR_USERNAME) || !credentials.ExistsProperty(ATTR_PASSWORD) { + return errors.New("missing username or password in credentials") + } + req.SetBasicAuth(credentials.GetProperty(ATTR_USERNAME), credentials.GetProperty(ATTR_PASSWORD)) + return +} diff --git a/pkg/contexts/credentials/builtin/npm/identity/identity.go b/pkg/contexts/credentials/builtin/npm/identity/identity.go index 32f9a16e8c..308cf8d299 100644 --- a/pkg/contexts/credentials/builtin/npm/identity/identity.go +++ b/pkg/contexts/credentials/builtin/npm/identity/identity.go @@ -14,7 +14,7 @@ import ( const ( // CONSUMER_TYPE is the npm repository type. - CONSUMER_TYPE = "Registry.npmjs.com" + CONSUMER_TYPE = "NpmRegistry" // ATTR_USERNAME is the username attribute. Required for login at any npm registry. ATTR_USERNAME = cpi.ATTR_USERNAME @@ -27,7 +27,7 @@ const ( ) // Logging Realm. -var REALM = logging.DefineSubRealm("NPM registry", "NPM") +var REALM = logging.DefineSubRealm("NPM registry", "npm") func init() { attrs := listformat.FormatListElements("", listformat.StringElementDescriptionList{ diff --git a/pkg/contexts/ocm/accessmethods/init.go b/pkg/contexts/ocm/accessmethods/init.go index 52052609d6..f0a70ce7dd 100644 --- a/pkg/contexts/ocm/accessmethods/init.go +++ b/pkg/contexts/ocm/accessmethods/init.go @@ -6,6 +6,7 @@ import ( _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localblob" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localfsblob" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localociblob" + _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/mvn" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/none" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/npm" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/ociartifact" diff --git a/pkg/contexts/ocm/accessmethods/mvn/README.md b/pkg/contexts/ocm/accessmethods/mvn/README.md new file mode 100644 index 0000000000..ecb696d7a6 --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/mvn/README.md @@ -0,0 +1,119 @@ +# `mvn` - Maven artifacts (Java packages, jars) in a Maven (mvn) repository (e.g. mvnrepository.com) + +### Synopsis +``` +type: mvn/v1 +``` + +Provided blobs use the following media type: `application/x-tgz` + +### Description + +This method implements the access of a resource hosted by a maven repository or a +complete resource set denoted by a GAV (GroupId, ArtifactId, Version). + +### Specification Versions + +Supported specification version is `v1` + +#### Version `v1` + +The type specific specification fields are: + +- **`repository`** *string* + + Base URL of the Maven (mvn) repository + +- **`groupId`** *string* + + The groupId of the Maven (mvn) artifact + +- **`artifactId`** *string* + + The artifactId of the Maven (mvn) artifact + +- **`version`** *string* + + The version name of the Maven (mvn) artifact + +- **`classifier`** *string* + + The optional classifier of the Maven (mvn) artifact + +- **`extension`** *string* + + The optional extension of the Maven (mvn) artifact + +If classifier/extension is given a dedicated resource is described, +otherwise the complete resource set described by a GAV. +Only complete resource sets can be uploaded again to a Maven repository. + +#### Examples + +##### Complete resource set denoted by a GAV + +```yaml +name: acme.org/complete/gav +version: 0.0.1 +provider: + name: acme.org +resources: + - name: java-sap-vcap-services + type: mvnArtifact + version: 0.0.1 + access: + type: mvn + repository: https://repo1.maven.org/maven2 + groupId: com.sap.cloud.environment.servicebinding + artifactId: java-sap-vcap-services + version: 0.10.4 +``` + +##### Single pom.xml file + +This can't be uploaded again into a Maven repository, but it can be used to describe the dependencies of a project. +The mime type will be `application/xml`. + +```yaml +name: acme.org/single/pom +version: 0.0.1 +provider: + name: acme.org +resources: + - name: sap-cloud-sdk + type: pom + version: 0.0.1 + access: + type: mvn + repository: https://repo1.maven.org/maven2 + groupId: com.sap.cloud.sdk + artifactId: sdk-modules-bom + version: 5.7.0 + classifier: '' + extension: pom +``` + +##### Single binary file + +In case you want to download and install maven itself, you can use the following example. +This can't be uploaded again into a Maven repository. +The mime type will be `application/gzip`. + +```yaml +name: acme.org/bin/zip +version: 0.0.1 +provider: + name: acme.org +resources: + - name: maven + type: bin + version: 0.0.1 + access: + type: mvn + repository: https://repo1.maven.org/maven2 + groupId: org.apache.maven + artifactId: apache-maven + version: 3.9.6 + classifier: bin + extension: zip +``` diff --git a/pkg/contexts/ocm/accessmethods/mvn/cli.go b/pkg/contexts/ocm/accessmethods/mvn/cli.go new file mode 100644 index 0000000000..dd81479a6b --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/mvn/cli.go @@ -0,0 +1,62 @@ +package mvn + +import ( + "github.com/open-component-model/ocm/pkg/cobrautils/flagsets" + "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/options" +) + +func ConfigHandler() flagsets.ConfigOptionTypeSetHandler { + return flagsets.NewConfigOptionTypeSetHandler( + Type, AddConfig, + options.RepositoryOption, + options.GroupOption, + options.PackageOption, + options.VersionOption, + // optional + options.ClassifierOption, + options.ExtensionOption, + ) +} + +func AddConfig(opts flagsets.ConfigOptions, config flagsets.Config) error { + flagsets.AddFieldByOptionP(opts, options.RepositoryOption, config, "repository") + flagsets.AddFieldByOptionP(opts, options.GroupOption, config, "groupId") + flagsets.AddFieldByOptionP(opts, options.PackageOption, config, "artifactId") + flagsets.AddFieldByOptionP(opts, options.VersionOption, config, "version") + // optional + flagsets.AddFieldByOptionP(opts, options.ClassifierOption, config, "classifier") + flagsets.AddFieldByOptionP(opts, options.ExtensionOption, config, "extension") + return nil +} + +var usage = ` +This method implements the access of a Maven (mvn) artifact in a Maven repository. +` + +var formatV1 = ` +The type specific specification fields are: + +- **repository** *string* + + Base URL of the Maven (mvn) repository + +- **groupId** *string* + + The groupId of the Maven (mvn) artifact + +- **artifactId** *string* + + The artifactId of the Maven (mvn) artifact + +- **version** *string* + + The version name of the Maven (mvn) artifact + +- **classifier** *string* + + The optional classifier of the Maven (mvn) artifact + +- **extension** *string* + + The optional extension of the Maven (mvn) artifact +` diff --git a/pkg/contexts/ocm/accessmethods/mvn/coordinates.go b/pkg/contexts/ocm/accessmethods/mvn/coordinates.go new file mode 100644 index 0000000000..d39e09c2e5 --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/mvn/coordinates.go @@ -0,0 +1,144 @@ +package mvn + +import ( + "fmt" + "mime" + "path" + "path/filepath" + "strings" + + ocmmime "github.com/open-component-model/ocm/pkg/mime" +) + +// Coordinates holds the typical Maven coordinates groupId, artifactId, version. Optional also classifier and extension. +// https://maven.apache.org/ref/3.9.6/maven-core/artifact-handlers.html +type Coordinates struct { + // GroupId of the Maven (mvn) artifact. + GroupId string `json:"groupId"` + // ArtifactId of the Maven (mvn) artifact. + ArtifactId string `json:"artifactId"` + // Version of the Maven (mvn) artifact. + Version string `json:"version"` + // Classifier of the Maven (mvn) artifact. + Classifier string `json:"classifier"` + // Extension of the Maven (mvn) artifact. + Extension string `json:"extension"` +} + +// GAV returns the GAV coordinates of the Maven Coordinates. +func (c *Coordinates) GAV() string { + return c.GroupId + ":" + c.ArtifactId + ":" + c.Version +} + +// String returns the Coordinates as a string (GroupId:ArtifactId:Version:Classifier:Extension). +func (c *Coordinates) String() string { + return c.GroupId + ":" + c.ArtifactId + ":" + c.Version + ":" + c.Classifier + ":" + c.Extension +} + +// GavPath returns the Maven repository path. +func (c *Coordinates) GavPath() string { + return c.GroupPath() + "/" + c.ArtifactId + "/" + c.Version +} + +// FilePath returns the Maven Coordinates's GAV-name with classifier and extension. +// Which is equal to the URL-path of the artifact in the repository. +// Default extension is jar. +func (c *Coordinates) FilePath() string { + path := c.GavPath() + "/" + c.FileNamePrefix() + if c.Classifier != "" { + path += "-" + c.Classifier + } + if c.Extension != "" { + path += "." + c.Extension + } else { + path += ".jar" + } + return path +} + +func (c *Coordinates) Url(baseUrl string) string { + return baseUrl + "/" + c.FilePath() +} + +// GroupPath returns GroupId with `/` instead of `.`. +func (c *Coordinates) GroupPath() string { + return strings.ReplaceAll(c.GroupId, ".", "/") +} + +func (c *Coordinates) FileNamePrefix() string { + return c.ArtifactId + "-" + c.Version +} + +// Purl returns the Package URL of the Maven Coordinates. +func (c *Coordinates) Purl() string { + return "pkg:maven/" + c.GroupId + "/" + c.ArtifactId + "@" + c.Version +} + +// SetClassifierExtensionBy extracts the classifier and extension from the filename (without any path prefix). +func (c *Coordinates) SetClassifierExtensionBy(filename string) error { + s := strings.TrimPrefix(path.Base(filename), c.FileNamePrefix()) + if strings.HasPrefix(s, "-") { + s = strings.TrimPrefix(s, "-") + i := strings.Index(s, ".") + if i < 0 { + return fmt.Errorf("no extension after classifier found in filename: %s", filename) + } + c.Classifier = s[:i] + s = strings.TrimPrefix(s, c.Classifier) + } else { + c.Classifier = "" + } + c.Extension = strings.TrimPrefix(s, ".") + return nil +} + +// MimeType returns the MIME type of the Maven Coordinates based on the file extension. +// Default is application/x-tgz. +func (c *Coordinates) MimeType() string { + m := mime.TypeByExtension("." + c.Extension) + if m != "" { + return m + } + return ocmmime.MIME_TGZ +} + +// Copy creates a new Coordinates with the same values. +func (c *Coordinates) Copy() *Coordinates { + return &Coordinates{ + GroupId: c.GroupId, + ArtifactId: c.ArtifactId, + Version: c.Version, + Classifier: c.Classifier, + Extension: c.Extension, + } +} + +// Parse creates an Coordinates from it's serialized form (see Coordinates.String). +func Parse(serializedArtifact string) (*Coordinates, error) { + parts := strings.Split(serializedArtifact, ":") + if len(parts) < 3 { + return nil, fmt.Errorf("invalid artifact string: %s", serializedArtifact) + } + artifact := &Coordinates{ + GroupId: parts[0], + ArtifactId: parts[1], + Version: parts[2], + } + if len(parts) >= 4 { + artifact.Classifier = parts[3] + } + if len(parts) >= 5 { + artifact.Extension = parts[4] + } + return artifact, nil +} + +// IsResource returns true if the filename is not a checksum or signature file. +func IsResource(fileName string) bool { + switch filepath.Ext(fileName) { + case ".asc", ".md5", ".sha1", ".sha256", ".sha512": + return false + default: + return true + } +} diff --git a/pkg/contexts/ocm/accessmethods/mvn/coordinates_test.go b/pkg/contexts/ocm/accessmethods/mvn/coordinates_test.go new file mode 100644 index 0000000000..63df1268ae --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/mvn/coordinates_test.go @@ -0,0 +1,55 @@ +package mvn + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("Maven Test Environment", func() { + + It("GAV, GroupPath, FilePath", func() { + artifact := &Coordinates{ + GroupId: "ocm.software", + ArtifactId: "hello-ocm", + Version: "0.0.1", + Extension: "jar", + } + Expect(artifact.GAV()).To(Equal("ocm.software:hello-ocm:0.0.1")) + Expect(artifact.GroupPath()).To(Equal("ocm/software")) + Expect(artifact.FilePath()).To(Equal("ocm/software/hello-ocm/0.0.1/hello-ocm-0.0.1.jar")) + }) + + It("SetClassifierExtensionBy", func() { + artifact := &Coordinates{ + GroupId: "ocm.software", + ArtifactId: "hello-ocm", + Version: "0.0.1", + } + artifact.SetClassifierExtensionBy("hello-ocm-0.0.1.pom") + Expect(artifact.Classifier).To(Equal("")) + Expect(artifact.Extension).To(Equal("pom")) + + artifact.SetClassifierExtensionBy("hello-ocm-0.0.1-tests.jar") + Expect(artifact.Classifier).To(Equal("tests")) + Expect(artifact.Extension).To(Equal("jar")) + + artifact.ArtifactId = "apache-maven" + artifact.Version = "3.9.6" + artifact.SetClassifierExtensionBy("apache-maven-3.9.6-bin.tar.gz") + Expect(artifact.Classifier).To(Equal("bin")) + Expect(artifact.Extension).To(Equal("tar.gz")) + }) + + It("parse GAV", func() { + gav := "org.apache.commons:commons-compress:1.26.1:cyclonedx:xml" + artifact, err := Parse(gav) + Expect(err).To(BeNil()) + Expect(artifact.String()).To(Equal(gav)) + Expect(artifact.GroupId).To(Equal("org.apache.commons")) + Expect(artifact.ArtifactId).To(Equal("commons-compress")) + Expect(artifact.Version).To(Equal("1.26.1")) + Expect(artifact.Classifier).To(Equal("cyclonedx")) + Expect(artifact.Extension).To(Equal("xml")) + Expect(artifact.FilePath()).To(Equal("org/apache/commons/commons-compress/1.26.1/commons-compress-1.26.1-cyclonedx.xml")) + }) +}) diff --git a/pkg/contexts/ocm/accessmethods/mvn/integration_test.go b/pkg/contexts/ocm/accessmethods/mvn/integration_test.go new file mode 100644 index 0000000000..b2eca2b1d0 --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/mvn/integration_test.go @@ -0,0 +1,98 @@ +//go:build integration + +package mvn_test + +import ( + "crypto" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/open-component-model/ocm/pkg/contexts/ocm" + "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/mvn" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + . "github.com/open-component-model/ocm/pkg/env" + . "github.com/open-component-model/ocm/pkg/env/builder" + "github.com/open-component-model/ocm/pkg/mime" + . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/open-component-model/ocm/pkg/utils/tarutils" +) + +var _ = Describe("online accessmethods.mvn.AccessSpec integration tests", func() { + var env *Builder + var cv ocm.ComponentVersionAccess + + BeforeEach(func() { + env = NewBuilder(TestData()) + cv = &cpi.DummyComponentVersionAccess{env.OCMContext()} + }) + + AfterEach(func() { + env.Cleanup() + }) + + // https://repo1.maven.org/maven2/com/sap/cloud/sdk/sdk-modules-bom/5.7.0 + It("one single pom only", func() { + acc := mvn.New("https://repo1.maven.org/maven2", "com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0") + files, err := acc.GavFiles(cv.GetContext()) + Expect(err).ToNot(HaveOccurred()) + Expect(files).To(HaveLen(1)) + Expect(files["sdk-modules-bom-5.7.0.pom"]).To(Equal(crypto.SHA1)) + }) + It("GetPackageMeta - com.sap.cloud.sdk", func() { + acc := mvn.New("https://repo1.maven.org/maven2", "com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0") + meta, err := acc.GetPackageMeta(ocm.DefaultContext()) + Expect(err).ToNot(HaveOccurred()) + Expect(meta.Bin).To(HavePrefix("file://")) + Expect(meta.Bin).To(ContainSubstring("mvn-sdk-modules-bom-5.7.0-")) + Expect(meta.Bin).To(HaveSuffix(".tar.gz")) + Expect(meta.Hash).To(Equal("345fe2e640663c3cd6ac87b7afb92e1c934f665f75ddcb9555bc33e1813ef00b")) + Expect(meta.HashType).To(Equal(crypto.SHA256)) + }) + + // https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.6 + It("apache-maven, with bin + tar.gz etc.", func() { + acc := mvn.New("https://repo1.maven.org/maven2", "org.apache.maven", "apache-maven", "3.9.6") + Expect(acc).ToNot(BeNil()) + Expect(acc.BaseUrl()).To(Equal("https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.6")) + files, err := acc.GavFiles(cv.GetContext()) + Expect(err).ToNot(HaveOccurred()) + Expect(files).To(HaveLen(8)) + Expect(files["apache-maven-3.9.6-src.zip"]).To(Equal(crypto.SHA512)) + Expect(files["apache-maven-3.9.6.pom"]).To(Equal(crypto.SHA1)) + }) + + // https://repo1.maven.org/maven2/com/sap/cloud/environment/servicebinding/java-sap-vcap-services/0.10.4 + It("accesses local artifact", func() { + acc := mvn.New("https://repo1.maven.org/maven2", "com.sap.cloud.environment.servicebinding", "java-sap-vcap-services", "0.10.4") + meta, err := acc.GetPackageMeta(ocm.DefaultContext()) + Expect(err).ToNot(HaveOccurred()) + Expect(meta.Bin).To(HavePrefix("file://")) + m := Must(acc.AccessMethod(cv)) + defer m.Close() + Expect(m.MimeType()).To(Equal(mime.MIME_TGZ)) + /* manually also tested with repos: + - https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.26.1/ // cyclonedx + - https://repo1.maven.org/maven2/cn/afternode/commons/commons/1.6/ // gradle module! + */ + }) + + // https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.6 + It("apache-maven, 'bin' zip + tar.gz only!", func() { + acc := mvn.New("https://repo1.maven.org/maven2", "org.apache.maven", "apache-maven", "3.9.6", mvn.WithClassifier("bin")) + Expect(acc).ToNot(BeNil()) + Expect(acc.BaseUrl()).To(Equal("https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.6")) + files, err := acc.GavFiles(cv.GetContext()) + Expect(err).ToNot(HaveOccurred()) + Expect(files).To(HaveLen(8)) // the repo contains 8 files... + m := Must(acc.AccessMethod(cv)) + defer m.Close() + Expect(err).ToNot(HaveOccurred()) + Expect(m.MimeType()).To(Equal(mime.MIME_TGZ)) + r := Must(m.Reader()) + defer r.Close() + list, err := tarutils.ListArchiveContentFromReader(r) + Expect(err).ToNot(HaveOccurred()) + Expect(list).To(HaveLen(2)) // ...but with the classifier set, we're interested only in two! + }) +}) diff --git a/pkg/contexts/ocm/accessmethods/mvn/method.go b/pkg/contexts/ocm/accessmethods/mvn/method.go new file mode 100644 index 0000000000..55da45fe0b --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/mvn/method.go @@ -0,0 +1,444 @@ +package mvn + +import ( + "bytes" + "context" + "crypto" + "fmt" + "io" + "net/http" + "path" + "sort" + "strings" + + "github.com/mandelsoft/vfs/pkg/osfs" + "github.com/mandelsoft/vfs/pkg/vfs" + "github.com/opencontainers/go-digest" + "golang.org/x/exp/slices" + "golang.org/x/net/html" + + "github.com/open-component-model/ocm/pkg/blobaccess" + "github.com/open-component-model/ocm/pkg/common/accessio" + "github.com/open-component-model/ocm/pkg/common/accessobj" + "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/mvn/identity" + "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" + "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/iotools" + "github.com/open-component-model/ocm/pkg/logging" + "github.com/open-component-model/ocm/pkg/mime" + "github.com/open-component-model/ocm/pkg/optionutils" + "github.com/open-component-model/ocm/pkg/runtime" + "github.com/open-component-model/ocm/pkg/utils" + "github.com/open-component-model/ocm/pkg/utils/tarutils" +) + +// Type is the access type of Maven (mvn) repository. +const ( + Type = "mvn" + TypeV1 = Type + runtime.VersionSeparator + "v1" +) + +func init() { + accspeccpi.RegisterAccessType(accspeccpi.NewAccessSpecType[*AccessSpec](Type, accspeccpi.WithDescription(usage))) + accspeccpi.RegisterAccessType(accspeccpi.NewAccessSpecType[*AccessSpec](TypeV1, accspeccpi.WithFormatSpec(formatV1), accspeccpi.WithConfigHandler(ConfigHandler()))) +} + +// AccessSpec describes the access for a Maven (mvn) artifact. +type AccessSpec struct { + runtime.ObjectVersionedType `json:",inline"` + + // Repository is the base URL of the Maven (mvn) repository. + Repository string `json:"repository"` + + Coordinates `json:",inline"` +} + +// Option defines the interface function "ApplyTo()". +type Option = optionutils.Option[*AccessSpec] + +var _ accspeccpi.AccessSpec = (*AccessSpec)(nil) + +var log = logging.DynamicLogger(identity.REALM) + +// New creates a new Maven (mvn) repository access spec version v1. +func New(repository, groupId, artifactId, version string, options ...Option) *AccessSpec { + accessSpec := &AccessSpec{ + ObjectVersionedType: runtime.NewVersionedTypedObject(Type), + Repository: repository, + Coordinates: Coordinates{ + GroupId: groupId, + ArtifactId: artifactId, + Version: version, + Classifier: "", + Extension: "", + }, + } + optionutils.ApplyOptions(accessSpec, options...) + return accessSpec +} + +// classifier Option for Maven (mvn) Coordinates. +type classifier string + +func (c classifier) ApplyTo(a *AccessSpec) { + a.Classifier = string(c) +} + +// WithClassifier sets the classifier of the Maven (mvn) artifact. +func WithClassifier(c string) Option { + return classifier(c) +} + +// extension Option for Maven (mvn) Coordinates. +type extension string + +func (e extension) ApplyTo(a *AccessSpec) { + a.Extension = string(e) +} + +// WithExtension sets the extension of the Maven (mvn) artifact. +func WithExtension(e string) Option { + return extension(e) +} + +func (a *AccessSpec) Describe(_ accspeccpi.Context) string { + return fmt.Sprintf("Maven (mvn) package '%s' in repository '%s' path '%s'", a.Coordinates.String(), a.Repository, a.Coordinates.FilePath()) +} + +func (_ *AccessSpec) IsLocal(accspeccpi.Context) bool { + return false +} + +func (a *AccessSpec) GlobalAccessSpec(_ accspeccpi.Context) accspeccpi.AccessSpec { + return a +} + +// GetReferenceHint returns the reference hint for the Maven (mvn) artifact. +func (a *AccessSpec) GetReferenceHint(_ accspeccpi.ComponentVersionAccess) string { + return a.String() +} + +func (_ *AccessSpec) GetType() string { + return Type +} + +func (a *AccessSpec) AccessMethod(c accspeccpi.ComponentVersionAccess) (accspeccpi.AccessMethod, error) { + return accspeccpi.AccessMethodForImplementation(newMethod(c, a)) +} + +func (a *AccessSpec) GetInexpensiveContentVersionIdentity(access accspeccpi.ComponentVersionAccess) string { + meta, _ := a.GetPackageMeta(access.GetContext()) + if meta != nil { + return meta.Hash + } + return "" +} + +func (a *AccessSpec) BaseUrl() string { + return a.Repository + "/" + a.GavPath() +} + +func (a *AccessSpec) ArtifactUrl() string { + return a.Url(a.Repository) +} + +func (a *AccessSpec) NewArtifact() *Coordinates { + return a.Coordinates.Copy() +} + +type meta struct { + MimeType string `json:"packaging"` + HashType crypto.Hash `json:"hashType"` + Hash string `json:"hash"` + Bin string `json:"bin"` +} + +func update(a *AccessSpec, file string, hash crypto.Hash, metadata *meta, ctx accspeccpi.Context, fs vfs.FileSystem) error { + artifact := a.NewArtifact() + err := artifact.SetClassifierExtensionBy(file) + if err != nil { + return err + } + metadata.Bin = artifact.Url(a.Repository) + log := log.WithValues("file", metadata.Bin) + log.Debug("processing") + metadata.MimeType = artifact.MimeType() + if hash > 0 { + metadata.HashType = hash + metadata.Hash, err = getStringData(ctx, metadata.Bin+hashUrlExt(hash), fs) + if err != nil { + return errors.Wrapf(err, "cannot read %s digest of: %s", hash, metadata.Bin) + } + } else { + log.Warn("no digest available") + } + return nil +} + +func (a *AccessSpec) GetPackageMeta(ctx accspeccpi.Context) (*meta, error) { + fs := vfsattr.Get(ctx) + + log := log.WithValues("BaseUrl", a.BaseUrl()) + fileMap, err := a.GavFiles(ctx, fs) + if err != nil { + return nil, err + } + + if a.Classifier != "" { + fileMap = filterByClassifier(fileMap, a.Classifier) + } + + switch l := len(fileMap); { + case l <= 0: + return nil, errors.New("no maven artifact files found") + case l == 1 && (a.Extension != "" || a.Classifier != ""): + metadata := meta{} + for file, hash := range fileMap { + update(a, file, hash, &metadata, ctx, fs) + } + return &metadata, nil + // default: continue below with: create tempFs where all files can be downloaded to and packed together as tar.gz + } + + if (a.Extension == "") != (a.Classifier == "") { // XOR + log.Warn("Either classifier or extension have been specified, which results in an incomplete GAV!") + } + tempFs, err := osfs.NewTempFileSystem() + if err != nil { + return nil, err + } + defer vfs.Cleanup(tempFs) + + metadata := meta{} + for file, hash := range fileMap { + update(a, file, hash, &metadata, ctx, fs) + + // download the artifact into the temporary file system + e := func() error { + out, err := tempFs.Create(file) + if err != nil { + return err + } + defer out.Close() + reader, err := getReader(ctx, metadata.Bin, fs) + if err != nil { + return err + } + defer reader.Close() + if hash > 0 { + dreader := iotools.NewDigestReaderWithHash(hash, reader) + _, err = io.Copy(out, dreader) + if err != nil { + return err + } + sum := dreader.Digest().Encoded() + if metadata.Hash != sum { + return errors.Newf("%s digest mismatch: expected %s, found %s", metadata.HashType, metadata.Hash, sum) + } + } else { + _, err = io.Copy(out, reader) + return err + } + return err + }() + if e != nil { + return nil, e + } + } + + // pack all downloaded files into a tar.gz file + tgz, err := vfs.TempFile(fs, "", Type+"-"+a.NewArtifact().FileNamePrefix()+"-*.tar.gz") + if err != nil { + return nil, err + } + defer tgz.Close() + + dw := iotools.NewDigestWriterWith(digest.SHA256, tgz) + defer dw.Close() + err = tarutils.TgzFs(tempFs, dw) + if err != nil { + return nil, err + } + + metadata.Bin = "file://" + tgz.Name() + metadata.MimeType = mime.MIME_TGZ + metadata.Hash = dw.Digest().Encoded() + metadata.HashType = crypto.SHA256 + log.Debug("created", "file", metadata.Bin) + + return &metadata, nil +} + +func filterByClassifier(fileMap map[string]crypto.Hash, classifier string) map[string]crypto.Hash { + for file := range fileMap { + if !strings.Contains(file, "-"+classifier+".") { + delete(fileMap, file) + } + } + return fileMap +} + +func (a *AccessSpec) GavFiles(ctx accspeccpi.Context, fs ...vfs.FileSystem) (map[string]crypto.Hash, error) { + if strings.HasPrefix(a.Repository, "file://") { + dir := path.Join(a.Repository[7:], a.GavPath()) + return gavFilesFromDisk(utils.FileSystem(fs...), dir) + } + return a.gavOnlineFiles(ctx) +} + +func gavFilesFromDisk(fs vfs.FileSystem, dir string) (map[string]crypto.Hash, error) { + files, err := tarutils.ListSortedFilesInDir(fs, dir, true) + if err != nil { + return nil, err + } + return filesAndHashes(files), nil +} + +// gavOnlineFiles returns the files of the Maven (mvn) artifact in the repository and their available digests. +func (a *AccessSpec) gavOnlineFiles(ctx accspeccpi.Context) (map[string]crypto.Hash, error) { + log := log.WithValues("BaseUrl", a.BaseUrl()) + log.Debug("gavOnlineFiles") + + reader, err := getReader(ctx, a.BaseUrl(), nil) + if err != nil { + return nil, err + } + defer reader.Close() + + // Which files are listed in the repository? + log.Debug("parse-html") + htmlDoc, err := html.Parse(reader) + if err != nil { + return nil, err + } + var fileList []string + var process func(*html.Node) + prefix := a.FileNamePrefix() + process = func(node *html.Node) { + // check if the node is an element node and the tag is "" + if node.Type == html.ElementNode && node.Data == "a" { + for _, attribute := range node.Attr { + if attribute.Key == "href" { + // check if the href starts with artifactId-version + if strings.HasPrefix(attribute.Val, prefix) { + fileList = append(fileList, attribute.Val) + } + } + } + } + for nextChild := node.FirstChild; nextChild != nil; nextChild = nextChild.NextSibling { + process(nextChild) // recursive call! + } + } + process(htmlDoc) + + return filesAndHashes(fileList), nil +} + +func filesAndHashes(fileList []string) map[string]crypto.Hash { + // Sort the list of files, to ensure always the same results for e.g. identical tar.gz files. + sort.Strings(fileList) + + // Which hash files are available? + result := make(map[string]crypto.Hash, len(fileList)/2) + for _, file := range fileList { + if IsResource(file) { + result[file] = bestAvailableHash(fileList, file) + log.Debug("found", "file", file) + } + } + return result +} + +// bestAvailableHash returns the best available hash for the given file. +// It first checks for SHA-512, then SHA-256, SHA-1, and finally MD5. If nothing is found, it returns 0. +func bestAvailableHash(list []string, filename string) crypto.Hash { + hashes := [5]crypto.Hash{crypto.SHA512, crypto.SHA256, crypto.SHA1, crypto.MD5} + for _, hash := range hashes { + if slices.Contains(list, filename+hashUrlExt(hash)) { + return hash + } + } + return 0 +} + +//////////////////////////////////////////////////////////////////////////////// + +// getStringData reads all data from the given URL and returns it as a string. +func getStringData(ctx accspeccpi.Context, url string, fs vfs.FileSystem) (string, error) { + r, err := getReader(ctx, url, fs) + if err != nil { + return "", err + } + defer r.Close() + b, err := io.ReadAll(r) + if err != nil { + return "", err + } + return string(b), nil +} + +// hashUrlExt returns the 'maven' hash extension for the given hash. +// Maven usually uses sha1, sha256, sha512, md5 instead of SHA-1, SHA-256, SHA-512, MD5. +func hashUrlExt(h crypto.Hash) string { + return "." + strings.ReplaceAll(strings.ToLower(h.String()), "-", "") +} + +func newMethod(c accspeccpi.ComponentVersionAccess, a *AccessSpec) (accspeccpi.AccessMethodImpl, error) { + factory := func() (blobaccess.BlobAccess, error) { + meta, err := a.GetPackageMeta(c.GetContext()) + if err != nil { + return nil, err + } + + reader := func() (io.ReadCloser, error) { + return getReader(c.GetContext(), meta.Bin, vfsattr.Get(c.GetContext())) + } + if meta.Hash != "" { + getreader := reader + reader = func() (io.ReadCloser, error) { + readCloser, err := getreader() + if err != nil { + return nil, err + } + return iotools.VerifyingReaderWithHash(readCloser, meta.HashType, meta.Hash), nil + } + } + acc := blobaccess.DataAccessForReaderFunction(reader, meta.Bin) + return accessobj.CachedBlobAccessForWriter(c.GetContext(), a.MimeType(), accessio.NewDataAccessWriter(acc)), nil + } + // FIXME add Digest! + return accspeccpi.NewDefaultMethodImpl(c, a, "", a.MimeType(), factory), nil +} + +func getReader(ctx accspeccpi.Context, url string, fs vfs.FileSystem) (io.ReadCloser, error) { + if strings.HasPrefix(url, "file://") { + path := url[7:] + return fs.OpenFile(path, vfs.O_RDONLY, 0o600) + } + + req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, url, nil) + if err != nil { + return nil, err + } + err = identity.BasicAuth(req, ctx, url, "") + if err != nil { + return nil, err + } + httpClient := &http.Client{} + resp, err := httpClient.Do(req) + if err != nil { + return nil, err + } + if resp.StatusCode != http.StatusOK { + defer resp.Body.Close() + buf := &bytes.Buffer{} + _, err = io.Copy(buf, io.LimitReader(resp.Body, 2000)) + if err == nil { + log.Error("http", "code", resp.Status, "url", url, "body", buf.String()) + } + return nil, errors.Newf("http %s error - %s", resp.Status, url) + } + return resp.Body, nil +} diff --git a/pkg/contexts/ocm/accessmethods/mvn/method_test.go b/pkg/contexts/ocm/accessmethods/mvn/method_test.go new file mode 100644 index 0000000000..7b4ca85a80 --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/mvn/method_test.go @@ -0,0 +1,87 @@ +package mvn_test + +import ( + "crypto" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/open-component-model/ocm/pkg/contexts/ocm" + "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/mvn" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + . "github.com/open-component-model/ocm/pkg/env" + . "github.com/open-component-model/ocm/pkg/env/builder" + "github.com/open-component-model/ocm/pkg/iotools" + "github.com/open-component-model/ocm/pkg/mime" + . "github.com/open-component-model/ocm/pkg/testutils" +) + +const ( + mvnPATH = "/testdata/.m2/repository" + FAILPATH = "/testdata/fail" +) + +var _ = Describe("local accessmethods.mvn.AccessSpec tests", func() { + var env *Builder + var cv ocm.ComponentVersionAccess + + BeforeEach(func() { + env = NewBuilder(TestData()) + cv = &cpi.DummyComponentVersionAccess{env.OCMContext()} + }) + + AfterEach(func() { + env.Cleanup() + }) + + It("accesses local artifact", func() { + acc := mvn.New("file://"+mvnPATH, "com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0") + m := Must(acc.AccessMethod(cv)) + defer m.Close() + Expect(m.MimeType()).To(Equal(mime.MIME_TGZ)) + r := Must(m.Reader()) + defer r.Close() + dr := iotools.NewDigestReaderWithHash(crypto.SHA1, r) + for { + var buf [8096]byte + _, err := dr.Read(buf[:]) + if err != nil { + break + } + } + Expect(dr.Size()).To(Equal(int64(1109))) + Expect(dr.Digest().String()).To(Equal("SHA-1:4ee125ffe4f7690588833f1217a13cc741e4df5f")) + }) + + It("accesses local artifact with extension", func() { + acc := mvn.New("file://"+mvnPATH, "com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0", mvn.WithExtension("pom")) + m := Must(acc.AccessMethod(cv)) + defer m.Close() + Expect(m.MimeType()).To(Equal(mime.MIME_XML)) + r := Must(m.Reader()) + defer r.Close() + dr := iotools.NewDigestReaderWithHash(crypto.SHA1, r) + for { + var buf [8096]byte + _, err := dr.Read(buf[:]) + if err != nil { + break + } + } + Expect(dr.Size()).To(Equal(int64(7153))) + Expect(dr.Digest().String()).To(Equal("SHA-1:34ccdeb9c008f8aaef90873fc636b09d3ae5c709")) + }) + + It("Describe", func() { + acc := mvn.New("file://"+FAILPATH, "test", "repository", "42", mvn.WithExtension("pom")) + Expect(acc.Describe(nil)).To(Equal("Maven (mvn) package 'test:repository:42::pom' in repository 'file:///testdata/fail' path 'test/repository/42/repository-42.pom'")) + }) + + It("detects digests mismatch", func() { + acc := mvn.New("file://"+FAILPATH, "test", "repository", "42", mvn.WithExtension("pom")) + m := Must(acc.AccessMethod(cv)) + defer m.Close() + _, err := m.Reader() + Expect(err).To(MatchError(ContainSubstring("SHA-1 digest mismatch: expected 44a77645201d1a8fc5213ace787c220eabbd0967, found b3242b8c31f8ce14f729b8fd132ac77bc4bc5bf7"))) + }) +}) diff --git a/pkg/contexts/ocm/accessmethods/mvn/suite_test.go b/pkg/contexts/ocm/accessmethods/mvn/suite_test.go new file mode 100644 index 0000000000..c62cadc7b0 --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/mvn/suite_test.go @@ -0,0 +1,13 @@ +package mvn_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Maven (mvn) Test Suite") +} diff --git a/pkg/contexts/ocm/accessmethods/mvn/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0.pom b/pkg/contexts/ocm/accessmethods/mvn/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0.pom new file mode 100644 index 0000000000..b3baaee32f --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/mvn/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0.pom @@ -0,0 +1,210 @@ + + + 4.0.0 + com.sap.cloud.sdk + sdk-modules-bom + 5.7.0 + pom + SAP Cloud SDK - Modules BOM + Bill of Materials (BOM) of the SAP Cloud SDK modules. + https://sap.github.io/cloud-sdk/docs/java/getting-started + + SAP SE + https://www.sap.com + + + + The Apache Software License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0.txt + + + + + SAP + cloudsdk@sap.com + SAP SE + https://www.sap.com + + + + + + + + UTF-8 + Public + Stable + + 5.7.0 + + + + + com.sap.cloud.sdk + sdk-core + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + scp-cf + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + dwc-cf + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + cloudplatform-core + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + caching + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + cloudplatform-connectivity + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + connectivity-apache-httpclient4 + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + connectivity-apache-httpclient5 + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + cloudplatform-connectivity-scp-cf + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + connectivity-destination-service + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + connectivity-oauth + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + connectivity-dwc + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + connectivity-ztis + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + resilience + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + resilience-api + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + resilience4j + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + security + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + servlet-jakarta + ${sdk.version} + + + com.sap.cloud.sdk.cloudplatform + tenant + ${sdk.version} + + + com.sap.cloud.sdk.s4hana + s4hana-core + ${sdk.version} + + + com.sap.cloud.sdk.s4hana + s4hana-connectivity + ${sdk.version} + + + com.sap.cloud.sdk.s4hana + rfc + ${sdk.version} + + + com.sap.cloud.sdk.datamodel + datamodel-metadata-generator + ${sdk.version} + + + com.sap.cloud.sdk.datamodel + odata-generator-utility + ${sdk.version} + + + com.sap.cloud.sdk.datamodel + odata-client + ${sdk.version} + + + com.sap.cloud.sdk.datamodel + odata-core + ${sdk.version} + + + com.sap.cloud.sdk.datamodel + odata-v4-core + ${sdk.version} + + + com.sap.cloud.sdk.datamodel + odata-generator + ${sdk.version} + + + com.sap.cloud.sdk.datamodel + odata-v4-generator + ${sdk.version} + + + com.sap.cloud.sdk.datamodel + openapi-core + ${sdk.version} + + + com.sap.cloud.sdk.datamodel + openapi-generator + ${sdk.version} + + + com.sap.cloud.sdk.datamodel + fluent-result + ${sdk.version} + + + com.sap.cloud.sdk.datamodel + + soap + ${sdk.version} + + + + diff --git a/pkg/contexts/ocm/accessmethods/mvn/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0.pom.sha1 b/pkg/contexts/ocm/accessmethods/mvn/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0.pom.sha1 new file mode 100644 index 0000000000..35f63a2e1f --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/mvn/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0.pom.sha1 @@ -0,0 +1 @@ +34ccdeb9c008f8aaef90873fc636b09d3ae5c709 \ No newline at end of file diff --git a/pkg/contexts/ocm/accessmethods/mvn/testdata/fail/test/repository/42/repository-42.pom b/pkg/contexts/ocm/accessmethods/mvn/testdata/fail/test/repository/42/repository-42.pom new file mode 100644 index 0000000000..218894d775 --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/mvn/testdata/fail/test/repository/42/repository-42.pom @@ -0,0 +1,14 @@ + + + 4.0.0 + fail + repository + 42 + pom + ocm + test + + SAP SE + https://www.sap.com + + diff --git a/pkg/contexts/ocm/accessmethods/mvn/testdata/fail/test/repository/42/repository-42.pom.sha1 b/pkg/contexts/ocm/accessmethods/mvn/testdata/fail/test/repository/42/repository-42.pom.sha1 new file mode 100644 index 0000000000..3d6c52fe9e --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/mvn/testdata/fail/test/repository/42/repository-42.pom.sha1 @@ -0,0 +1 @@ +44a77645201d1a8fc5213ace787c220eabbd0967 \ No newline at end of file diff --git a/pkg/contexts/ocm/accessmethods/options/standard.go b/pkg/contexts/ocm/accessmethods/options/standard.go index c13b298134..7e8680f12b 100644 --- a/pkg/contexts/ocm/accessmethods/options/standard.go +++ b/pkg/contexts/ocm/accessmethods/options/standard.go @@ -18,6 +18,9 @@ var ReferenceOption = RegisterOption(NewStringOptionType("reference", "reference // PackageOption. var PackageOption = RegisterOption(NewStringOptionType("accessPackage", "package or object name")) +// GroupOption. +var GroupOption = RegisterOption(NewStringOptionType("accessGroup", "GroupID or namespace")) + // RepositoryOption. var RepositoryOption = RegisterOption(NewStringOptionType("accessRepository", "repository URL")) @@ -53,7 +56,11 @@ var HTTPBodyOption = RegisterOption(NewStringOptionType("body", "body of a http var HTTPRedirectOption = RegisterOption(NewBoolOptionType("noredirect", "http redirect behavior")) -//////////////////////////////////////////////////////////////////////////////// - // CommentOption. var CommentOption = RegisterOption(NewStringOptionType("comment", "comment field value")) + +// ClassifierOption the optional classifier of a maven resource. +var ClassifierOption = RegisterOption(NewStringOptionType("accessClassifier", "mvn classifier")) + +// ExtensionOption the optional extension of a maven resource. +var ExtensionOption = RegisterOption(NewStringOptionType("accessExtension", "mvn extension name")) diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler.go new file mode 100644 index 0000000000..1e27561d32 --- /dev/null +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler.go @@ -0,0 +1,180 @@ +package mvn + +import ( + "context" + "crypto" + "encoding/json" + "fmt" + "io" + "net/http" + "strings" + + "github.com/mandelsoft/vfs/pkg/vfs" + + "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/mvn/identity" + "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/mvn" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" + "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" + "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/iotools" + "github.com/open-component-model/ocm/pkg/logging" + "github.com/open-component-model/ocm/pkg/mime" + "github.com/open-component-model/ocm/pkg/utils/tarutils" +) + +const BlobHandlerName = "ocm/" + resourcetypes.MVN_ARTIFACT + +type artifactHandler struct { + spec *Config +} + +func NewArtifactHandler(repospec *Config) cpi.BlobHandler { + return &artifactHandler{repospec} +} + +var log = logging.DynamicLogger(identity.REALM) + +func (b *artifactHandler) StoreBlob(blob cpi.BlobAccess, resourceType string, hint string, _ cpi.AccessSpec, ctx cpi.StorageContext) (cpi.AccessSpec, error) { + // check conditions + if b.spec == nil { + return nil, nil + } + mimeType := blob.MimeType() + if resourcetypes.MVN_ARTIFACT != resourceType { + log.Debug("not a MVN artifact", "resourceType", resourceType) + return nil, nil + } + if mime.MIME_TGZ != mimeType { + log.Debug("not a tarball, can't be a complete mvn GAV", "mimeType", mimeType) + return nil, nil + } + if b.spec.Url == "" { + return nil, errors.New("MVN repository url not provided") + } + + // setup logger + log := log.WithValues("repository", b.spec.Url) + // identify artifact + artifact, err := mvn.Parse(hint) + if err != nil { + return nil, err + } + log = log.WithValues("groupId", artifact.GroupId, "artifactId", artifact.ArtifactId, "version", artifact.Version) + log.Debug("identified") + + blobReader, err := blob.Reader() + if err != nil { + return nil, err + } + defer blobReader.Close() + tempFs, err := tarutils.ExtractTgzToTempFs(blobReader) + if err != nil { + return nil, err + } + defer vfs.Cleanup(tempFs) + files, err := tarutils.ListSortedFilesInDir(tempFs, "", false) + if err != nil { + return nil, err + } + for _, file := range files { + e := func() (err error) { + log.Debug("uploading", "file", file) + err = artifact.SetClassifierExtensionBy(file) + if err != nil { + return + } + readHash, err := tempFs.Open(file) + if err != nil { + return + } + defer readHash.Close() + // MD5 + SHA1 are still the most used ones in the mvn context + hr := iotools.NewHashReader(readHash, crypto.SHA256, crypto.SHA1, crypto.MD5) + _, err = hr.CalcHashes() + if err != nil { + return + } + reader, err := tempFs.Open(file) + if err != nil { + return + } + defer reader.Close() + err = deploy(artifact, b.spec.Url, reader, ctx.GetContext(), hr) + return + }() + if e != nil { + return nil, e + } + } + + log.Debug("done", "artifact", artifact) + return mvn.New(b.spec.Url, artifact.GroupId, artifact.ArtifactId, artifact.Version, mvn.WithClassifier(artifact.Classifier), mvn.WithExtension(artifact.Extension)), nil +} + +// deploy an artifact to the specified destination. See https://jfrog.com/help/r/jfrog-rest-apis/deploy-artifact +func deploy(artifact *mvn.Coordinates, url string, reader io.ReadCloser, ctx accspeccpi.Context, hashes *iotools.HashReader) (err error) { + req, err := http.NewRequestWithContext(context.Background(), http.MethodPut, artifact.Url(url), reader) + if err != nil { + return + } + err = identity.BasicAuth(req, ctx, url, artifact.GroupPath()) + if err != nil { + return + } + // give the remote server a chance to decide based upon the checksum policy + for k, v := range hashes.HttpHeader() { + req.Header.Set(k, v) + } + + // Execute the request + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return + } + defer resp.Body.Close() + + // Check the response + if resp.StatusCode != http.StatusCreated { + all, e := io.ReadAll(resp.Body) + if e != nil { + return e + } + return fmt.Errorf("http (%d) - failed to upload artifact: %s", resp.StatusCode, string(all)) + } + log.Debug("uploaded", "artifact", artifact, "extension", artifact.Extension, "classifier", artifact.Classifier) + + // Validate the response - especially the hash values with the ones we've tried to send + respBody, err := io.ReadAll(resp.Body) + if err != nil { + return + } + var artifactBody Body + err = json.Unmarshal(respBody, &artifactBody) + if err != nil { + return + } + + // let's check only SHA256 for now + digest := hashes.GetString(crypto.SHA256) + remoteDigest := artifactBody.Checksums[strings.ReplaceAll(strings.ToLower(crypto.SHA256.String()), "-", "")] + if remoteDigest == "" { + log.Warn("no checksum found for algorithm, we can't guarantee that the artifact has been uploaded correctly", "algorithm", crypto.SHA256) + } else if remoteDigest != digest { + return errors.New("failed to upload artifact: checksums do not match") + } + log.Debug("digests are ok", "remoteDigest", remoteDigest, "digest", digest) + return +} + +// Body is the response struct of a deployment from the MVN repository (JFrog Artifactory). +type Body struct { + Repo string `json:"repo"` + Path string `json:"path"` + DownloadUri string `json:"downloadUri"` + Uri string `json:"uri"` + MimeType string `json:"mimeType"` + Size string `json:"size"` + Checksums map[string]string `json:"checksums"` +} diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler_test.go new file mode 100644 index 0000000000..a632ace444 --- /dev/null +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler_test.go @@ -0,0 +1,43 @@ +package mvn_test + +import ( + "encoding/json" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/generic/mvn" +) + +var _ = Describe("blobhandler generic mvn tests", func() { + + It("Unmarshal deploy response Body", func() { + resp := `{ "repo" : "ocm-mvn-test", + "path" : "/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar", + "created" : "2024-04-11T15:09:28.920Z", + "createdBy" : "john.doe", + "downloadUri" : "https://ocm.sofware/repository/ocm-mvn-test/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar", + "mimeType" : "application/java-archive", + "size" : "1792", + "checksums" : { + "sha1" : "99d9acac1ff93ac3d52229edec910091af1bc40a", + "md5" : "6cb7520b65d820b3b35773a8daa8368e", + "sha256" : "b19dcd275f72a0cbdead1e5abacb0ef25a0cb55ff36252ef44b1178eeedf9c30" }, + "originalChecksums" : { + "sha256" : "b19dcd275f72a0cbdead1e5abacb0ef25a0cb55ff36252ef44b1178eeedf9c30" }, + "uri" : "https://ocm.sofware/repository/ocm-mvn-test/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar" }` + var body mvn.Body + err := json.Unmarshal([]byte(resp), &body) + Expect(err).To(BeNil()) + Expect(body.Repo).To(Equal("ocm-mvn-test")) + Expect(body.DownloadUri).To(Equal("https://ocm.sofware/repository/ocm-mvn-test/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar")) + Expect(body.Uri).To(Equal("https://ocm.sofware/repository/ocm-mvn-test/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar")) + Expect(body.MimeType).To(Equal("application/java-archive")) + Expect(body.Size).To(Equal("1792")) + Expect(body.Checksums["md5"]).To(Equal("6cb7520b65d820b3b35773a8daa8368e")) + Expect(body.Checksums["sha1"]).To(Equal("99d9acac1ff93ac3d52229edec910091af1bc40a")) + Expect(body.Checksums["sha256"]).To(Equal("b19dcd275f72a0cbdead1e5abacb0ef25a0cb55ff36252ef44b1178eeedf9c30")) + Expect(body.Checksums["sha512"]).To(Equal("")) + }) + +}) diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration.go b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration.go new file mode 100644 index 0000000000..7fc5ffb8f9 --- /dev/null +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration.go @@ -0,0 +1,74 @@ +package mvn + +import ( + "encoding/json" + "fmt" + + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" + "github.com/open-component-model/ocm/pkg/errors" + "github.com/open-component-model/ocm/pkg/mime" + "github.com/open-component-model/ocm/pkg/registrations" +) + +type Config struct { + Url string `json:"url"` +} + +type rawConfig Config + +func (c *Config) UnmarshalJSON(data []byte) error { + err := json.Unmarshal(data, &c.Url) + if err == nil { + return nil + } + var raw rawConfig + err = json.Unmarshal(data, &raw) + if err != nil { + return err + } + *c = Config(raw) + + return nil +} + +func init() { + cpi.RegisterBlobHandlerRegistrationHandler(BlobHandlerName, &RegistrationHandler{}) +} + +type RegistrationHandler struct{} + +var _ cpi.BlobHandlerRegistrationHandler = (*RegistrationHandler)(nil) + +func (r *RegistrationHandler) RegisterByName(handler string, ctx cpi.Context, config cpi.BlobHandlerConfig, olist ...cpi.BlobHandlerOption) (bool, error) { + if handler != "" { + return true, fmt.Errorf("invalid %s handler %q", resourcetypes.MVN_ARTIFACT, handler) + } + if config == nil { + return true, fmt.Errorf("mvn target specification required") + } + cfg, err := registrations.DecodeConfig[Config](config) + if err != nil { + return true, errors.Wrapf(err, "blob handler configuration") + } + + ctx.BlobHandlers().Register(NewArtifactHandler(cfg), + cpi.ForArtifactType(resourcetypes.MVN_ARTIFACT), + cpi.ForMimeType(mime.MIME_TGZ), + cpi.NewBlobHandlerOptions(olist...), + ) + + return true, nil +} + +func (r *RegistrationHandler) GetHandlers(_ cpi.Context) registrations.HandlerInfos { + return registrations.NewLeafHandlerInfo("uploading mvn artifacts", ` +The `+BlobHandlerName+` uploader is able to upload mvn artifacts (whole GAV only!) +as artifact archive according to the mvn artifact spec. +If registered the default mime type is: `+mime.MIME_TGZ+` + +It accepts a plain string for the URL or a config with the following field: +'url': the URL of the mvn repository. +`, + ) +} diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration_test.go new file mode 100644 index 0000000000..c64b3e13bb --- /dev/null +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration_test.go @@ -0,0 +1,23 @@ +package mvn_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/generic/mvn" + "github.com/open-component-model/ocm/pkg/registrations" +) + +var _ = Describe("Config deserialization Test Environment", func() { + + It("deserializes string", func() { + cfg := Must(registrations.DecodeConfig[mvn.Config]("test")) + Expect(cfg).To(Equal(&mvn.Config{Url: "test"})) + }) + + It("deserializes struct", func() { + cfg := Must(registrations.DecodeConfig[mvn.Config](`{"Url":"test"}`)) + Expect(cfg).To(Equal(&mvn.Config{Url: "test"})) + }) +}) diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/suite_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/suite_test.go new file mode 100644 index 0000000000..c62cadc7b0 --- /dev/null +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/suite_test.go @@ -0,0 +1,13 @@ +package mvn_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Maven (mvn) Test Suite") +} diff --git a/pkg/contexts/ocm/blobhandler/handlers/init.go b/pkg/contexts/ocm/blobhandler/handlers/init.go index d19447156c..b318fe2c9e 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/init.go +++ b/pkg/contexts/ocm/blobhandler/handlers/init.go @@ -1,6 +1,7 @@ package handlers import ( + _ "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/generic/mvn" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/generic/npm" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo" diff --git a/pkg/contexts/ocm/elements/artifactaccess/mvnaccess/resource.go b/pkg/contexts/ocm/elements/artifactaccess/mvnaccess/resource.go new file mode 100644 index 0000000000..6c90b396a9 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactaccess/mvnaccess/resource.go @@ -0,0 +1,30 @@ +package mvnaccess + +import ( + "github.com/open-component-model/ocm/pkg/contexts/ocm" + access "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/mvn" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactaccess/genericaccess" + "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" +) + +const TYPE = resourcetypes.MVN_ARTIFACT + +func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, repository, groupId, artifactId, version string) cpi.ArtifactAccess[M] { + if meta.GetType() == "" { + meta.SetType(TYPE) + } + + spec := access.New(repository, groupId, artifactId, version) + // is global access, must work, otherwise there is an error in the lib. + return genericaccess.MustAccess(ctx, meta, spec) +} + +func ResourceAccess(ctx ocm.Context, meta *cpi.ResourceMeta, repository, groupId, artifactId, version string) cpi.ResourceAccess { + return Access(ctx, meta, repository, groupId, artifactId, version) +} + +func SourceAccess(ctx ocm.Context, meta *cpi.SourceMeta, repository, groupId, artifactId, version string) cpi.SourceAccess { + return Access(ctx, meta, repository, groupId, artifactId, version) +} diff --git a/pkg/contexts/ocm/internal/blobhandler.go b/pkg/contexts/ocm/internal/blobhandler.go index 4023e79a82..e12aed3eb0 100644 --- a/pkg/contexts/ocm/internal/blobhandler.go +++ b/pkg/contexts/ocm/internal/blobhandler.go @@ -33,9 +33,9 @@ type StorageContext interface { GetImplementationRepositoryType() ImplementationRepositoryType } -// BlobHandler s the interface for a dedicated handling of storing blobs +// BlobHandler is the interface for a dedicated handling of storing blobs // for the LocalBlob access method in a dedicated kind of repository. -// with the possibility of access by an external distribution spec. +// With the possibility of access by an external distribution spec // (besides of the blob storage as part of a component version). // The technical repository to use should be derivable from the chosen // component directory or passed together with the storage context. diff --git a/pkg/contexts/ocm/resourcetypes/const.go b/pkg/contexts/ocm/resourcetypes/const.go index 4c1be2b37b..6c0dc78650 100644 --- a/pkg/contexts/ocm/resourcetypes/const.go +++ b/pkg/contexts/ocm/resourcetypes/const.go @@ -14,16 +14,19 @@ const ( // HELM_CHART describes a helm chart, either stored as OCI artifact or as tar // blob (tar media type). HELM_CHART = "helmChart" - // NPM_PACKAGE describes an NPM package. + // NPM_PACKAGE describes a Node.js (npm) package. NPM_PACKAGE = "npmPackage" + // MVN_ARTIFACT describes a Maven artifact (jar). + MVN_ARTIFACT = "mvnArtifact" // BLUEPRINT describes a Gardener Landscaper blueprint which is an artifact used in its installations describing // how to deploy a software component. BLUEPRINT = "landscaper.gardener.cloud/blueprint" BLUEPRINT_LEGACY = "blueprint" // BLOB describes any anonymous untyped blob data. BLOB = "blob" + // DIRECTORY_TREE describes a directory structure. + DIRECTORY_TREE = "directoryTree" // FILESYSTEM describes a directory structure stored as archive (tar, tgz). - DIRECTORY_TREE = "directoryTree" FILESYSTEM = DIRECTORY_TREE FILESYSTEM_LEGACY = "filesystem" // EXECUTABLE describes an OS executable. diff --git a/pkg/iotools/hashReaderWriter.go b/pkg/iotools/hashReaderWriter.go new file mode 100644 index 0000000000..675cdb68c0 --- /dev/null +++ b/pkg/iotools/hashReaderWriter.go @@ -0,0 +1,152 @@ +package iotools + +import ( + "crypto" + "fmt" + "hash" + "io" + "strings" + + "github.com/open-component-model/ocm/pkg/errors" +) + +type HashReader struct { + reader io.Reader + hashMap map[crypto.Hash]hash.Hash +} + +func NewHashReader(delegate io.Reader, algorithms ...crypto.Hash) *HashReader { + newInstance := HashReader{ + reader: delegate, + hashMap: initMap(algorithms), + } + return &newInstance +} + +func (h *HashReader) Read(buf []byte) (int, error) { + c, err := h.reader.Read(buf) + return write(h, c, buf, err) +} + +func (h *HashReader) GetString(algorithm crypto.Hash) string { + return getString(h, algorithm) +} + +func (h *HashReader) GetBytes(algorithm crypto.Hash) []byte { + return getBytes(h, algorithm) +} + +func (h *HashReader) HttpHeader() map[string]string { + return httpHeader(h) +} + +func (h *HashReader) hashes() map[crypto.Hash]hash.Hash { + return h.hashMap +} + +func (h *HashReader) ReadAll() ([]byte, error) { + return io.ReadAll(h.reader) +} + +// CalcHashes returns the total number of bytes read and an error if any besides EOF. +func (h *HashReader) CalcHashes() (int64, error) { + b := make([]byte, 0, 512) + cnt := int64(0) + for { + n, err := h.Read(b[0:cap(b)]) // read a chunk, always from the beginning + b = b[:n] // reset slice to the actual read bytes + cnt += int64(n) + if err != nil { + if errors.Is(err, io.EOF) { + err = nil + } + return cnt, err + } + } +} + +//////////////////////////////////////////////////////////////////////////////// + +type HashWriter struct { + writer io.Writer + hashMap map[crypto.Hash]hash.Hash +} + +func NewHashWriter(w io.Writer, algorithms ...crypto.Hash) *HashWriter { + newInstance := HashWriter{ + writer: w, + hashMap: initMap(algorithms), + } + return &newInstance +} + +func (h *HashWriter) Write(buf []byte) (int, error) { + c, err := h.writer.Write(buf) + return write(h, c, buf, err) +} + +func (h *HashWriter) GetString(algorithm crypto.Hash) string { + return getString(h, algorithm) +} + +func (h *HashWriter) GetBytes(algorithm crypto.Hash) []byte { + return getBytes(h, algorithm) +} + +func (h *HashWriter) HttpHeader() map[string]string { + return httpHeader(h) +} + +func (h *HashWriter) hashes() map[crypto.Hash]hash.Hash { + return h.hashMap +} + +//////////////////////////////////////////////////////////////////////////////// + +type hashes interface { + hashes() map[crypto.Hash]hash.Hash +} + +func getString(h hashes, algorithm crypto.Hash) string { + return fmt.Sprintf("%x", getBytes(h, algorithm)) +} + +func getBytes(h hashes, algorithm crypto.Hash) []byte { + hash := h.hashes()[algorithm] + if hash != nil { + return hash.Sum(nil) + } + return nil +} + +func httpHeader(h hashes) map[string]string { + headers := make(map[string]string, len(h.hashes())) + for algorithm := range h.hashes() { + headers[headerName(algorithm)] = getString(h, algorithm) + } + return headers +} + +func initMap(algorithms []crypto.Hash) map[crypto.Hash]hash.Hash { + hashMap := make(map[crypto.Hash]hash.Hash, len(algorithms)) + for _, algorithm := range algorithms { + hashMap[algorithm] = algorithm.New() + } + return hashMap +} + +func write(h hashes, c int, buf []byte, err error) (int, error) { + if err == nil && c > 0 { + for _, hash := range h.hashes() { + hash.Write(buf[:c]) + } + } + return c, err +} + +//////////////////////////////////////////////////////////////////////////////// + +func headerName(hash crypto.Hash) string { + a := strings.ReplaceAll(hash.String(), "-", "") + return "X-Checksum-" + a[:1] + strings.ToLower(a[1:]) +} diff --git a/pkg/iotools/hashReaderWriter_test.go b/pkg/iotools/hashReaderWriter_test.go new file mode 100644 index 0000000000..bda2a6fc3d --- /dev/null +++ b/pkg/iotools/hashReaderWriter_test.go @@ -0,0 +1,79 @@ +package iotools_test + +import ( + "bytes" + "crypto" + "io" + "strings" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/open-component-model/ocm/pkg/iotools" +) + +var _ = Describe("Hash Reader Writer tests", func() { + It("Ensure interface implementation", func() { + var _ io.Reader = &iotools.HashReader{} + var _ io.Reader = (*iotools.HashReader)(nil) + var _ io.Reader = new(iotools.HashReader) + + var _ io.Writer = &iotools.HashWriter{} + var _ io.Writer = (*iotools.HashWriter)(nil) + var _ io.Writer = new(iotools.HashWriter) + }) + + It("test HashWriter", func() { + s := "Hello Hash!" + var b bytes.Buffer + hr := iotools.NewHashWriter(io.Writer(&b)) + hr.Write([]byte(s)) + Expect(b.String()).To(Equal(s)) + Expect(hr.GetBytes(0)).To(BeNil()) + b.Reset() + + w := io.Writer(&b) + hr = iotools.NewHashWriter(w, crypto.SHA1) + hr.Write([]byte(s)) + Expect(b.String()).To(Equal(s)) + Expect(hr.GetBytes(0)).To(BeNil()) + Expect(hr.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) + b.Reset() + + hr = iotools.NewHashWriter(io.Writer(&b), crypto.SHA1, crypto.MD5) + hr.Write([]byte(s)) + Expect(b.String()).To(Equal(s)) + Expect(hr.GetBytes(0)).To(BeNil()) + Expect(hr.GetString(crypto.MD5)).To(Equal("c10e8df2e378a1584359b0e546cf0149")) + Expect(hr.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) + }) + + It("test HashReader", func() { + s := "Hello Hash!" + hr := iotools.NewHashReader(strings.NewReader(s)) + buf := make([]byte, len(s)) + hr.Read(buf) + Expect(hr.GetBytes(0)).To(BeNil()) + Expect(string(buf)).To(Equal(s)) + + hr = iotools.NewHashReader(strings.NewReader(s), crypto.SHA1) + hr.Read(buf) + Expect(hr.GetBytes(0)).To(BeNil()) + Expect(hr.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) + + hr = iotools.NewHashReader(strings.NewReader(s), crypto.SHA1) + cnt, err := hr.CalcHashes() + Expect(err).To(BeNil()) + Expect(cnt).To(Equal(int64(len(s)))) + Expect(hr.GetBytes(0)).To(BeNil()) + Expect(hr.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) + + hr = iotools.NewHashReader(strings.NewReader(s), crypto.SHA1, crypto.MD5) + hr.Read(buf) + Expect(hr.GetBytes(crypto.SHA256)).To(BeNil()) + Expect(hr.GetString(crypto.MD5)).To(Equal("c10e8df2e378a1584359b0e546cf0149")) + Expect(hr.GetString(crypto.MD5)).To(Equal("c10e8df2e378a1584359b0e546cf0149")) + Expect(hr.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) + Expect(hr.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) + }) +}) diff --git a/pkg/iotools/suite_test.go b/pkg/iotools/suite_test.go new file mode 100644 index 0000000000..f2c3e11709 --- /dev/null +++ b/pkg/iotools/suite_test.go @@ -0,0 +1,13 @@ +package iotools_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "iotools Test Suite") +} diff --git a/pkg/mime/types.go b/pkg/mime/types.go index 020968835e..715f6845b2 100644 --- a/pkg/mime/types.go +++ b/pkg/mime/types.go @@ -1,5 +1,11 @@ package mime +import ( + "mime" + + "github.com/open-component-model/ocm/pkg/logging" +) + const ( MIME_TEXT = "text/plain" MIME_OCTET = "application/octet-stream" @@ -7,6 +13,7 @@ const ( MIME_JSON = "application/x-json" MIME_JSON_ALT = "text/json" // no utf8 MIME_JSON_OFFICIAL = "application/json" + MIME_XML = "application/xml" MIME_YAML = "application/x-yaml" MIME_YAML_ALT = "text/yaml" // no utf8 MIME_YAML_OFFICIAL = "application/yaml" @@ -15,4 +22,29 @@ const ( MIME_TAR = "application/x-tar" MIME_TGZ = "application/x-tgz" MIME_TGZ_ALT = MIME_TAR + "+gzip" + + MIME_JAR = "application/x-jar" ) + +func init() { + ocmTypes := map[string]string{ + // added entries + ".txt": MIME_TEXT, + ".yaml": MIME_YAML_OFFICIAL, + ".gzip": MIME_GZIP, + ".tar": MIME_TAR, + ".tgz": MIME_TGZ, + ".tar.gz": MIME_TGZ, + ".pom": MIME_XML, + ".zip": MIME_GZIP, + ".jar": MIME_JAR, + ".module": MIME_JSON, // gradle module metadata + } + + for k, v := range ocmTypes { + err := mime.AddExtensionType(k, v) + if err != nil { + logging.DynamicLogger(logging.DefineSubRealm("mimeutils")).Error("failed to add extension type", "extension", k, "type", v, "error", err) + } + } +} diff --git a/pkg/mimeutils/type.go b/pkg/mimeutils/type.go deleted file mode 100644 index e7c4b97463..0000000000 --- a/pkg/mimeutils/type.go +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Modifications Copyright 2024 SAP SE or an SAP affiliate company. - -// Package mimeutils implements parts of the MIME spec. -// Copied from mime to achieve a platform independent reproducible list of -// known mime types. -package mimeutils - -import ( - "fmt" - "mime" - "sort" - "strings" - "sync" - - ocmmime "github.com/open-component-model/ocm/pkg/mime" -) - -var ( - mimeTypes sync.Map // map[string]string; ".Z" => "application/x-compress" - mimeTypesLower sync.Map // map[string]string; ".z" => "application/x-compress" - - // extensions maps from MIME type to list of lowercase file - // extensions: "image/jpeg" => [".jpg", ".jpeg"] - extensionsMu sync.Mutex // Guards stores (but not loads) on extensions. - extensions sync.Map // map[string][]string; slice values are append-only. -) - -func clearSyncMap(m *sync.Map) { - m.Range(func(k, _ any) bool { - m.Delete(k) - return true - }) -} - -// setMimeTypes is used by initMime's non-test path, and by tests. -func setMimeTypes(lowerExt, mixExt map[string]string) { - clearSyncMap(&mimeTypes) - clearSyncMap(&mimeTypesLower) - clearSyncMap(&extensions) - - for k, v := range lowerExt { - mimeTypesLower.Store(k, v) - } - for k, v := range mixExt { - mimeTypes.Store(k, v) - } - - extensionsMu.Lock() - defer extensionsMu.Unlock() - for k, v := range lowerExt { - justType, _, err := mime.ParseMediaType(v) - if err != nil { - panic(err) - } - var exts []string - if ei, ok := extensions.Load(justType); ok { - exts = ei.([]string) - } - extensions.Store(justType, append(exts, k)) - } -} - -var builtinTypesLower = map[string]string{ - // default list - ".avif": "image/avif", - ".css": "text/css; charset=utf-8", - ".gif": "image/gif", - ".htm": "text/html; charset=utf-8", - ".html": "text/html; charset=utf-8", - ".jpeg": "image/jpeg", - ".jpg": "image/jpeg", - ".js": "text/javascript; charset=utf-8", - ".json": "application/json", - ".mjs": "text/javascript; charset=utf-8", - ".pdf": "application/pdf", - ".png": "image/png", - ".svg": "image/svg+xml", - ".wasm": "application/wasm", - ".webp": "image/webp", - ".xml": "text/xml; charset=utf-8", - // added entries - ".txt": ocmmime.MIME_TEXT, - ".yaml": ocmmime.MIME_YAML_OFFICIAL, - ".gzip": ocmmime.MIME_GZIP, - ".tar": ocmmime.MIME_TAR, - ".tgz": ocmmime.MIME_TGZ, -} - -var once sync.Once // guards initMime - -var testInitMime func() - -func initMime() { - if fn := testInitMime; fn != nil { - fn() - } else { - setMimeTypes(builtinTypesLower, builtinTypesLower) - } -} - -// TypeByExtension returns the MIME type associated with the file extension ext. -// The extension ext should begin with a leading dot, as in ".html". -// When ext has no associated type, TypeByExtension returns "". -// -// Extensions are looked up first case-sensitively, then case-insensitively. -// -// The built-in table is small but on unix it is augmented by the local -// system's MIME-info database or mime.types file(s) if available under one or -// more of these names: -// -// /usr/local/share/mime/globs2 -// /usr/share/mime/globs2 -// /etc/mime.types -// /etc/apache2/mime.types -// /etc/apache/mime.types -// -// On Windows, MIME types are extracted from the registry. -// -// Text types have the charset parameter set to "utf-8" by default. -func TypeByExtension(ext string) string { - once.Do(initMime) - - // Case-sensitive lookup. - if v, ok := mimeTypes.Load(ext); ok { - return v.(string) - } - - // Case-insensitive lookup. - // Optimistically assume a short ASCII extension and be - // allocation-free in that case. - var buf [10]byte - lower := buf[:0] - const utf8RuneSelf = 0x80 // from utf8 package, but not importing it. - for i := 0; i < len(ext); i++ { - c := ext[i] - if c >= utf8RuneSelf { - // Slow path. - si, _ := mimeTypesLower.Load(strings.ToLower(ext)) - s, _ := si.(string) // handle nil pointer!!!! - return s - } - if 'A' <= c && c <= 'Z' { - lower = append(lower, c+('a'-'A')) - } else { - lower = append(lower, c) - } - } - si, _ := mimeTypesLower.Load(string(lower)) - s, _ := si.(string) // handle nil pointer!!!! - return s -} - -// ExtensionsByType returns the extensions known to be associated with the MIME -// type typ. The returned extensions will each begin with a leading dot, as in -// ".html". When typ has no associated extensions, ExtensionsByType returns an -// nil slice. -func ExtensionsByType(typ string) ([]string, error) { - justType, _, err := mime.ParseMediaType(typ) - if err != nil { - return nil, err - } - - once.Do(initMime) - s, ok := extensions.Load(justType) - if !ok { - return nil, nil - } - ret := append([]string(nil), s.([]string)...) - sort.Strings(ret) - return ret, nil -} - -// AddExtensionType sets the MIME type associated with -// the extension ext to typ. The extension should begin with -// a leading dot, as in ".html". -func AddExtensionType(ext, typ string) error { - if !strings.HasPrefix(ext, ".") { - return fmt.Errorf("mime: extension %q missing leading dot", ext) - } - once.Do(initMime) - return setExtensionType(ext, typ) -} - -func setExtensionType(extension, mimeType string) error { - justType, param, err := mime.ParseMediaType(mimeType) - if err != nil { - return err - } - if strings.HasPrefix(mimeType, "text/") && param["charset"] == "" { - param["charset"] = "utf-8" - mimeType = mime.FormatMediaType(mimeType, param) - } - extLower := strings.ToLower(extension) - - mimeTypes.Store(extension, mimeType) - mimeTypesLower.Store(extLower, mimeType) - - extensionsMu.Lock() - defer extensionsMu.Unlock() - var exts []string - if ei, ok := extensions.Load(justType); ok { - exts = ei.([]string) - } - for _, v := range exts { - if v == extLower { - return nil - } - } - extensions.Store(justType, append(exts, extLower)) - return nil -} diff --git a/pkg/utils/tarutils/extract.go b/pkg/utils/tarutils/extract.go index b310685d8c..4a6b300a22 100644 --- a/pkg/utils/tarutils/extract.go +++ b/pkg/utils/tarutils/extract.go @@ -29,7 +29,7 @@ func ExtractArchiveToFs(fs vfs.FileSystem, path string, fss ...vfs.FileSystem) e return ExtractTarToFs(fs, r) } -// ExtractArchiveToFsWithInfo wunpacks an archive to a filesystem. +// ExtractArchiveToFsWithInfo unpacks an archive to a filesystem. func ExtractArchiveToFsWithInfo(fs vfs.FileSystem, path string, fss ...vfs.FileSystem) (int64, int64, error) { sfs := utils.OptionalDefaulted(osfs.New(), fss...) @@ -51,6 +51,31 @@ func ExtractTarToFs(fs vfs.FileSystem, in io.Reader) error { return err } +// UnzipTarToFs tries to decompress the input stream and then writes the tar stream to a filesystem. +func UnzipTarToFs(fs vfs.FileSystem, in io.Reader) error { + r, _, err := compression.AutoDecompress(in) + if err != nil { + return err + } + defer r.Close() + err = ExtractTarToFs(fs, r) + if err != nil { + return err + } + return err +} + +// ExtractTgzToTempFs extracts a tar.gz archive to a temporary filesystem. +// You should call vfs.Cleanup on the returned filesystem to clean up the temporary files. +func ExtractTgzToTempFs(in io.Reader) (vfs.FileSystem, error) { + fs, err := osfs.NewTempFileSystem() + if err != nil { + return nil, err + } + + return fs, UnzipTarToFs(fs, in) +} + func ExtractTarToFsWithInfo(fs vfs.FileSystem, in io.Reader) (fcnt int64, bcnt int64, err error) { tr := tar.NewReader(in) for { diff --git a/pkg/utils/tarutils/pack.go b/pkg/utils/tarutils/pack.go index 584308a434..c65ce25a78 100644 --- a/pkg/utils/tarutils/pack.go +++ b/pkg/utils/tarutils/pack.go @@ -2,10 +2,14 @@ package tarutils import ( "archive/tar" + "compress/gzip" "fmt" "io" + "io/fs" pathutil "path" + "sort" "strings" + "time" "github.com/mandelsoft/filepath/pkg/filepath" "github.com/mandelsoft/goutils/finalizer" @@ -184,3 +188,97 @@ func addFileToTar(fs vfs.FileSystem, tw *tar.Writer, path string, realPath strin return fmt.Errorf("unsupported file type %s in %s", info.Mode().String(), path) } } + +func Epoch() time.Time { + return time.Unix(0, 0) +} + +func SimpleTarHeader(fs vfs.FileSystem, filepath string) (*tar.Header, error) { + info, err := fs.Lstat(filepath) + if err != nil { + return nil, err + } + return RegularFileInfoHeader(info), nil +} + +// RegularFileInfoHeader creates a tar header for a regular file (`tar.TypeReg`). +// Besides name and size, the other header fields are set to default values (`fs.ModePerm`, 0, "", `time.Unix(0,0)`). +func RegularFileInfoHeader(fi fs.FileInfo) *tar.Header { + h := &tar.Header{ + Typeflag: tar.TypeReg, + Name: fi.Name(), + Size: fi.Size(), + Mode: int64(fs.ModePerm), + Uid: 0, + Gid: 0, + Uname: "", + Gname: "", + ModTime: Epoch(), + AccessTime: Epoch(), + ChangeTime: Epoch(), + } + return h +} + +// ListSortedFilesInDir returns a list of files in a directory sorted by name. +// Attention: If 'flat == true', files with same name but in different sub-paths, will be listed only once!!! +func ListSortedFilesInDir(fs vfs.FileSystem, root string, flat bool) ([]string, error) { + var files []string + err := vfs.Walk(fs, root, func(path string, info vfs.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() { + pathOrName := path + if flat { + pathOrName = info.Name() + } + files = append(files, pathOrName) + } + return nil + }) + sort.Strings(files) + return files, err +} + +// TgzFs creates a tar.gz archive from a filesystem with all files being in the root of the zipped archive. +// The writer is closed after the archive is written. The TAR-headers are normalized, see RegularFileInfoHeader. +func TgzFs(fs vfs.FileSystem, writer io.Writer) error { + zip := gzip.NewWriter(writer) + err := TarFlatFs(fs, zip) + if err != nil { + return err + } + return zip.Close() +} + +func TarFlatFs(fs vfs.FileSystem, writer io.Writer) error { + tw := tar.NewWriter(writer) + files, err := ListSortedFilesInDir(fs, "", true) + if err != nil { + return err + } + + for _, fileName := range files { + header, err := SimpleTarHeader(fs, fileName) + if err != nil { + return err + } + if err := tw.WriteHeader(header); err != nil { + return fmt.Errorf("unable to write header for %q: %w", fileName, err) + } + file, err := fs.OpenFile(fileName, vfs.O_RDONLY, vfs.ModePerm) + if err != nil { + return fmt.Errorf("unable to open file %q: %w", fileName, err) + } + if _, err := io.Copy(tw, file); err != nil { + _ = file.Close() + return fmt.Errorf("unable to add file to tar %q: %w", fileName, err) + } + if err := file.Close(); err != nil { + return fmt.Errorf("unable to close file %q: %w", fileName, err) + } + } + + return tw.Close() +} diff --git a/pkg/utils/tarutils/pack_test.go b/pkg/utils/tarutils/pack_test.go index 0ff84d662d..2487913a61 100644 --- a/pkg/utils/tarutils/pack_test.go +++ b/pkg/utils/tarutils/pack_test.go @@ -1,14 +1,16 @@ package tarutils_test import ( + "io/fs" "os" + "runtime" + "github.com/mandelsoft/vfs/pkg/osfs" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/open-component-model/ocm/pkg/testutils" - - "github.com/mandelsoft/vfs/pkg/osfs" + "github.com/open-component-model/ocm/pkg/errors" + . "github.com/open-component-model/ocm/pkg/testutils" "github.com/open-component-model/ocm/pkg/utils/tarutils" ) @@ -40,4 +42,17 @@ var _ = Describe("tar utils mapping", func() { list := Must(tarutils.ListArchiveContent(file.Name())) Expect(list).To(ConsistOf("dir", "dir/dirlink", "dir/link", "dir/regular", "dir/subdir", "dir/subdir/file", "dir2", "dir2/file2", "file", "dir/dirlink/file2")) }) + + It("test ListSortedFilesInDir with non existing path", func() { + files, err := tarutils.ListSortedFilesInDir(osfs.New(), "/path/doesn't/exist!", true) + Expect(err).To(HaveOccurred()) + Expect(files).To(BeNil()) + Expect(errors.Is(err, fs.ErrNotExist)).To(BeTrue()) + if runtime.GOOS == "windows" { + Expect(err.Error()).To(ContainSubstring("The system cannot find the path specified.")) + } else { + Expect(err.Error()).To(ContainSubstring("no such file or directory")) + } + }) + }) diff --git a/pkg/version/generate/release_generate.go b/pkg/version/generate/release_generate.go index 3e864c26a9..d93f2c6a6c 100644 --- a/pkg/version/generate/release_generate.go +++ b/pkg/version/generate/release_generate.go @@ -82,6 +82,8 @@ func main() { //nolint:forbidigo // Logger not needed for this command. switch cmd { + case "print-semver": + fmt.Print(nonpre) case "print-version": fmt.Print(v) case "print-rc-version": diff --git a/pkg/version/version.go b/pkg/version/version.go index c764b1a3b0..1c7ef18fcf 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -45,6 +45,16 @@ func (info Info) String() string { return info.GitVersion } +// String returns info as a short semantic version string (0.8.15). +func (info Info) SemVer() string { + return info.Major + "." + info.Minor + "." + info.Patch +} + +// String returns current Release version. +func Current() string { + return Get().SemVer() +} + // GetInterface returns the overall codebase version. It's for detecting // what code a binary was built from. // These variables typically come from -ldflags settings and in From de169445b4565e087c51acb9cad79a21102abb28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 May 2024 11:11:58 +0200 Subject: [PATCH 68/83] Bump the go group with 15 updates (#770) Bumps the go group with 15 updates: | Package | From | To | | --- | --- | --- | | [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) | `1.26.1` | `1.27.0` | | [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) | `1.27.13` | `1.27.15` | | [github.com/aws/aws-sdk-go-v2/credentials](https://github.com/aws/aws-sdk-go-v2) | `1.17.13` | `1.17.15` | | [github.com/aws/aws-sdk-go-v2/feature/s3/manager](https://github.com/aws/aws-sdk-go-v2) | `1.16.17` | `1.16.20` | | [github.com/aws/aws-sdk-go-v2/service/ecr](https://github.com/aws/aws-sdk-go-v2) | `1.28.0` | `1.28.2` | | [github.com/aws/aws-sdk-go-v2/service/s3](https://github.com/aws/aws-sdk-go-v2) | `1.53.2` | `1.54.2` | | [github.com/containerd/containerd](https://github.com/containerd/containerd) | `1.7.16` | `1.7.17` | | [github.com/docker/cli](https://github.com/docker/cli) | `26.1.2+incompatible` | `26.1.3+incompatible` | | [github.com/docker/docker](https://github.com/docker/docker) | `26.1.2+incompatible` | `26.1.3+incompatible` | | [helm.sh/helm/v3](https://github.com/helm/helm) | `3.14.4` | `3.15.0` | | [k8s.io/api](https://github.com/kubernetes/api) | `0.30.0` | `0.30.1` | | [k8s.io/apiextensions-apiserver](https://github.com/kubernetes/apiextensions-apiserver) | `0.30.0` | `0.30.1` | | [k8s.io/apimachinery](https://github.com/kubernetes/apimachinery) | `0.30.0` | `0.30.1` | | [k8s.io/cli-runtime](https://github.com/kubernetes/cli-runtime) | `0.30.0` | `0.30.1` | | [k8s.io/client-go](https://github.com/kubernetes/client-go) | `0.30.0` | `0.30.1` | --- go.mod | 58 ++++++++++++++--------------- go.sum | 116 ++++++++++++++++++++++++++++----------------------------- 2 files changed, 87 insertions(+), 87 deletions(-) diff --git a/go.mod b/go.mod index d0c13944d7..a2b3c429fa 100644 --- a/go.mod +++ b/go.mod @@ -8,19 +8,19 @@ require ( github.com/DataDog/gostackparse v0.7.0 github.com/InfiniteLoopSpace/go_S-MIME v0.0.0-20181221134359-3f58f9a4b2b6 github.com/Masterminds/semver/v3 v3.2.1 - github.com/aws/aws-sdk-go-v2 v1.26.1 - github.com/aws/aws-sdk-go-v2/config v1.27.13 - github.com/aws/aws-sdk-go-v2/credentials v1.17.13 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.17 - github.com/aws/aws-sdk-go-v2/service/ecr v1.28.0 - github.com/aws/aws-sdk-go-v2/service/s3 v1.53.2 - github.com/containerd/containerd v1.7.16 + github.com/aws/aws-sdk-go-v2 v1.27.0 + github.com/aws/aws-sdk-go-v2/config v1.27.15 + github.com/aws/aws-sdk-go-v2/credentials v1.17.15 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.20 + github.com/aws/aws-sdk-go-v2/service/ecr v1.28.2 + github.com/aws/aws-sdk-go-v2/service/s3 v1.54.2 + github.com/containerd/containerd v1.7.17 github.com/containerd/log v0.1.0 github.com/containers/image/v5 v5.30.1 github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f github.com/distribution/reference v0.6.0 - github.com/docker/cli v26.1.2+incompatible - github.com/docker/docker v26.1.2+incompatible + github.com/docker/cli v26.1.3+incompatible + github.com/docker/docker v26.1.3+incompatible github.com/docker/go-connections v0.5.0 github.com/drone/envsubst v1.0.3 github.com/fluxcd/cli-utils v0.36.0-flux.7 @@ -70,12 +70,12 @@ require ( golang.org/x/text v0.15.0 gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 gopkg.in/yaml.v3 v3.0.1 - helm.sh/helm/v3 v3.14.4 - k8s.io/api v0.30.0 - k8s.io/apiextensions-apiserver v0.30.0 - k8s.io/apimachinery v0.30.0 - k8s.io/cli-runtime v0.30.0 - k8s.io/client-go v0.30.0 + helm.sh/helm/v3 v3.15.0 + k8s.io/api v0.30.1 + k8s.io/apiextensions-apiserver v0.30.1 + k8s.io/apimachinery v0.30.1 + k8s.io/cli-runtime v0.30.1 + k8s.io/client-go v0.30.1 sigs.k8s.io/controller-runtime v0.18.2 sigs.k8s.io/yaml v1.4.0 ) @@ -100,7 +100,7 @@ require ( github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/Masterminds/squirrel v1.5.4 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Microsoft/hcsshim v0.12.0-rc.3 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect github.com/ThalesIgnite/crypto11 v1.2.5 // indirect @@ -119,19 +119,19 @@ require ( github.com/aliyun/credentials-go v1.3.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7 // indirect github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.9 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.20.8 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.28.9 // indirect github.com/aws/smithy-go v1.20.2 // indirect github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -149,7 +149,7 @@ require ( github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect github.com/containerd/stargz-snapshotter/estargz v0.15.1 // indirect github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 // indirect - github.com/containers/ocicrypt v1.1.9 // indirect + github.com/containers/ocicrypt v1.1.10 // indirect github.com/containers/storage v1.53.0 // indirect github.com/coreos/go-oidc/v3 v3.10.0 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect @@ -342,8 +342,8 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiserver v0.30.0 // indirect - k8s.io/component-base v0.30.0 // indirect + k8s.io/apiserver v0.30.1 // indirect + k8s.io/component-base v0.30.1 // indirect k8s.io/klog/v2 v2.120.1 // indirect k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect k8s.io/kubectl v0.30.0 // indirect diff --git a/go.sum b/go.sum index de4bf148a7..be2792f419 100644 --- a/go.sum +++ b/go.sum @@ -77,8 +77,8 @@ github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Microsoft/hcsshim v0.12.0-rc.3 h1:5GNGrobGs/sN/0nFO21W9k4lFn+iXXZAE8fCZbmdRak= github.com/Microsoft/hcsshim v0.12.0-rc.3/go.mod h1:WuNfcaYNaw+KpCEsZCIM6HCEmu0c5HfXpi+dDSmveP0= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= @@ -155,50 +155,50 @@ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:W github.com/aws/aws-sdk-go v1.51.6 h1:Ld36dn9r7P9IjU8WZSaswQ8Y/XUCRpewim5980DwYiU= github.com/aws/aws-sdk-go v1.51.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= -github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= +github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgiLlo= +github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= -github.com/aws/aws-sdk-go-v2/config v1.27.13 h1:WbKW8hOzrWoOA/+35S5okqO/2Ap8hkkFUzoW8Hzq24A= -github.com/aws/aws-sdk-go-v2/config v1.27.13/go.mod h1:XLiyiTMnguytjRER7u5RIkhIqS8Nyz41SwAWb4xEjxs= -github.com/aws/aws-sdk-go-v2/credentials v1.17.13 h1:XDCJDzk/u5cN7Aple7D/MiAhx1Rjo/0nueJ0La8mRuE= -github.com/aws/aws-sdk-go-v2/credentials v1.17.13/go.mod h1:FMNcjQrmuBYvOTZDtOLCIu0esmxjF7RuA/89iSXWzQI= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.17 h1:9b1Os1s11mF5qTIKLgSsyPG810di2+ySSLIIt9bwe9I= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.17/go.mod h1:9Wp7tDOMhv0+sb/FTRAkbHNQ7abYDnoJRzm5AAtCnTc= +github.com/aws/aws-sdk-go-v2/config v1.27.15 h1:uNnGLZ+DutuNEkuPh6fwqK7LpEiPmzb7MIMA1mNWEUc= +github.com/aws/aws-sdk-go-v2/config v1.27.15/go.mod h1:7j7Kxx9/7kTmL7z4LlhwQe63MYEE5vkVV6nWg4ZAI8M= +github.com/aws/aws-sdk-go-v2/credentials v1.17.15 h1:YDexlvDRCA8ems2T5IP1xkMtOZ1uLJOCJdTr0igs5zo= +github.com/aws/aws-sdk-go-v2/credentials v1.17.15/go.mod h1:vxHggqW6hFNaeNC0WyXS3VdyjcV0a4KMUY4dKJ96buU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 h1:dQLK4TjtnlRGb0czOht2CevZ5l6RSyRWAnKeGd7VAFE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3/go.mod h1:TL79f2P6+8Q7dTsILpiVST+AL9lkF6PPGI167Ny0Cjw= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.20 h1:NCM9wYaJCmlIWZSO/JwUEveKf0NCvsSgo9V9BwOAolo= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.20/go.mod h1:dmxIx3qriuepxqZgFeFMitFuftWPB94+MZv/6Btpth4= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 h1:lf/8VTF2cM+N4SLzaYJERKEWAXq8MOMpZfU6wEPWsPk= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7/go.mod h1:4SjkU7QiqK2M9oozyMzfZ/23LmUY+h3oFqhdeP5OMiI= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 h1:4OYVp0705xu8yjdyoWix0r9wPIRXnIzzOoUpQVHIJ/g= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7/go.mod h1:vd7ESTEvI76T2Na050gODNmNU7+OyKrIKroYTu4ABiI= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 h1:81KE7vaZzrl7yHBYHVEzYB8sypz11NMOZ40YlWvPxsU= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5/go.mod h1:LIt2rg7Mcgn09Ygbdh/RdIm0rQ+3BNkbP1gyVMFtRK0= -github.com/aws/aws-sdk-go-v2/service/ecr v1.28.0 h1:rdPrcOZmqT2F+yzmKEImrx5XUs7Hpf4V9Rp6E8mhsxQ= -github.com/aws/aws-sdk-go-v2/service/ecr v1.28.0/go.mod h1:if7ybzzjOmDB8pat9FE35AHTY6ZxlYSy3YviSmFZv8c= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7 h1:/FUtT3xsoHO3cfh+I/kCbcMCN98QZRsiFet/V8QkWSs= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7/go.mod h1:MaCAgWpGooQoCWZnMur97rGn5dp350w2+CeiV5406wE= +github.com/aws/aws-sdk-go-v2/service/ecr v1.28.2 h1:xUpMnRZonKfrHaNLC77IMpWZSUMRRXIi6IU5EhAPsrM= +github.com/aws/aws-sdk-go-v2/service/ecr v1.28.2/go.mod h1:X52zjAVRaXklEU1TE/wO8kyyJSr9cJx9ZsqliWbyRys= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2 h1:PpbXaecV3sLAS6rjQiaKw4/jyq3Z8gNzmoJupHAoBp0= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2/go.mod h1:fUHpGXr4DrXkEDpGAjClPsviWf+Bszeb0daKE0blxv8= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 h1:ZMeFZ5yk+Ek+jNr1+uwCd2tG89t6oTS5yVWpa6yy2es= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7/go.mod h1:mxV05U+4JiHqIpGqqYXOHLPKUC6bDXC44bsUhNjOEwY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 h1:ogRAwT1/gxJBcSWDMZlgyFUM962F51A5CRhDLbxLdmo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7/go.mod h1:YCsIZhXfRPLFFCl5xxY+1T9RKzOKjCut+28JSX2DnAk= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 h1:f9RyWNtS8oH7cZlbn+/JNPpjUk5+5fLd5lM9M0i49Ys= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5/go.mod h1:h5CoMZV2VF297/VLhRhO1WF+XYWOzXo+4HsObA4HjBQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.9 h1:UXqEWQI0n+q0QixzU0yUUQBZXRd5037qdInTIHFTl98= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.9/go.mod h1:xP6Gq6fzGZT8w/ZN+XvGMZ2RU1LeEs7b2yUP5DN8NY4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 h1:Wx0rlZoEJR7JwlSZcHnEa7CNjrSIyVxMFWGAaXy4fJY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9/go.mod h1:aVMHdE0aHO3v+f/iw01fmXV/5DbfQ3Bi9nN7nd9bE9Y= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7 h1:uO5XR6QGBcmPyo2gxofYJLFkcVQ4izOoGDNenlZhTEk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7/go.mod h1:feeeAYfAcwTReM6vbwjEyDmiGho+YgBhaFULuXDW8kc= github.com/aws/aws-sdk-go-v2/service/kms v1.30.0 h1:yS0JkEdV6h9JOo8sy2JSpjX+i7vsKifU8SIeHrqiDhU= github.com/aws/aws-sdk-go-v2/service/kms v1.30.0/go.mod h1:+I8VUUSVD4p5ISQtzpgSva4I8cJ4SQ4b1dcBcof7O+g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.53.2 h1:rq2hglTQM3yHZvOPVMtNvLS5x6hijx7JvRDgKiTNDGQ= -github.com/aws/aws-sdk-go-v2/service/s3 v1.53.2/go.mod h1:qmdkIIAC+GCLASF7R2whgNrJADz0QZPX+Seiw/i4S3o= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.6 h1:o5cTaeunSpfXiLTIBx5xo2enQmiChtu1IBbzXnfU9Hs= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.6/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.0 h1:Qe0r0lVURDDeBQJ4yP+BOrJkvkiCo/3FH/t+wY11dmw= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.0/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.7 h1:et3Ta53gotFR4ERLXXHIHl/Uuk1qYpP5uU7cvNql8ns= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.7/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.54.2 h1:gYSJhNiOF6J9xaYxu2NFNstoiNELwt0T9w29FxSfN+Y= +github.com/aws/aws-sdk-go-v2/service/s3 v1.54.2/go.mod h1:739CllldowZiPPsDFcJHNF4FXrVxaSGVnZ9Ez9Iz9hc= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.8 h1:Kv1hwNG6jHC/sxMTe5saMjH6t6ZLkgfvVxyEjfWL1ks= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.8/go.mod h1:c1qtZUWtygI6ZdvKppzCSXsDOq5I4luJPZ0Ud3juFCA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.2 h1:nWBZ1xHCF+A7vv9sDzJOq4NWIdzFYm0kH7Pr4OjHYsQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.2/go.mod h1:9lmoVDVLz/yUZwLaQ676TK02fhCu4+PgRSmMaKR1ozk= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.9 h1:Qp6Boy0cGDloOE3zI6XhNLNZgjNS8YmiFQFHe71SaW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.9/go.mod h1:0Aqn1MnEuitqfsCNyKsdKLhDUOr4txD/g19EfiUqgws= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= @@ -266,8 +266,8 @@ github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups/v3 v3.0.2 h1:f5WFqIVSgo5IZmtTT3qVBo6TzI1ON6sycSBKkymb9L0= github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE= -github.com/containerd/containerd v1.7.16 h1:7Zsfe8Fkj4Wi2My6DXGQ87hiqIrmOXolm72ZEkFU5Mg= -github.com/containerd/containerd v1.7.16/go.mod h1:NL49g7A/Fui7ccmxV6zkBWwqMgmMxFWzujYCc+JLt7k= +github.com/containerd/containerd v1.7.17 h1:KjNnn0+tAVQHAoaWRjmdak9WlvnFR/8rU1CHHy8Rm2A= +github.com/containerd/containerd v1.7.17/go.mod h1:vK+hhT4TIv2uejlcDlbVIc8+h/BqtKLIyNrtCZol8lI= github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/containerd/errdefs v0.1.0 h1:m0wCRBiu1WJT/Fr+iOoQHMQS/eP5myQ8lCv4Dz5ZURM= @@ -280,8 +280,8 @@ github.com/containers/image/v5 v5.30.1 h1:AKrQMgOKI1oKx5FW5eoU2xoNyzACajHGx1O3qx github.com/containers/image/v5 v5.30.1/go.mod h1:gSD8MVOyqBspc0ynLsuiMR9qmt8UQ4jpVImjmK0uXfk= github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 h1:Qzk5C6cYglewc+UyGf6lc8Mj2UaPTHy/iF2De0/77CA= github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY= -github.com/containers/ocicrypt v1.1.9 h1:2Csfba4jse85Raxk5HIyEk8OwZNjRvfkhEGijOjIdEM= -github.com/containers/ocicrypt v1.1.9/go.mod h1:dTKx1918d8TDkxXvarscpNVY+lyPakPNFN4jwA9GBys= +github.com/containers/ocicrypt v1.1.10 h1:r7UR6o8+lyhkEywetubUUgcKFjOWOaWz8cEBrCPX0ic= +github.com/containers/ocicrypt v1.1.10/go.mod h1:YfzSSr06PTHQwSTUKqDSjish9BeW1E4HUmreluQcMd8= github.com/containers/storage v1.53.0 h1:VSES3C/u1pxjTJIXvLrSmyP7OBtDky04oGu07UvdTEA= github.com/containers/storage v1.53.0/go.mod h1:pujcoOSc+upx15Jirdkebhtd8uJiLwbSd/mYT6zDJK8= github.com/coreos/go-oidc/v3 v3.10.0 h1:tDnXHnLyiTVyT/2zLDGj09pFPkhND8Gl8lnTRhoEaJU= @@ -315,13 +315,13 @@ github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aB github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2/go.mod h1:WHNsWjnIn2V1LYOrME7e8KxSeKunYHsxEm4am0BUtcI= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v26.1.2+incompatible h1:/MWZpUMMlr1hCGyquL8QNbL1hbivQ1kLuT3Z9s1Tlpg= -github.com/docker/cli v26.1.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v26.1.3+incompatible h1:bUpXT/N0kDE3VUHI2r5VMsYQgi38kYuoC0oL9yt3lqc= +github.com/docker/cli v26.1.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v26.1.2+incompatible h1:UVX5ZOrrfTGZZYEP+ZDq3Xn9PdHNXaSYMFPDumMqG2k= -github.com/docker/docker v26.1.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v26.1.3+incompatible h1:lLCzRbrVZrljpVNobJu1J2FHk8V0s4BawoZippkc+xo= +github.com/docker/docker v26.1.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo= github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= @@ -1300,24 +1300,24 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -helm.sh/helm/v3 v3.14.4 h1:6FSpEfqyDalHq3kUr4gOMThhgY55kXUEjdQoyODYnrM= -helm.sh/helm/v3 v3.14.4/go.mod h1:Tje7LL4gprZpuBNTbG34d1Xn5NmRT3OWfBRwpOSer9I= +helm.sh/helm/v3 v3.15.0 h1:gcLxHeFp0Hfo7lYi6KIZ84ZyvlAnfFRSJ8lTL3zvG5U= +helm.sh/helm/v3 v3.15.0/go.mod h1:fvfoRcB8UKRUV5jrIfOTaN/pG1TPhuqSb56fjYdTKXg= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.30.0 h1:siWhRq7cNjy2iHssOB9SCGNCl2spiF1dO3dABqZ8niA= -k8s.io/api v0.30.0/go.mod h1:OPlaYhoHs8EQ1ql0R/TsUgaRPhpKNxIMrKQfWUp8QSE= -k8s.io/apiextensions-apiserver v0.30.0 h1:jcZFKMqnICJfRxTgnC4E+Hpcq8UEhT8B2lhBcQ+6uAs= -k8s.io/apiextensions-apiserver v0.30.0/go.mod h1:N9ogQFGcrbWqAY9p2mUAL5mGxsLqwgtUce127VtRX5Y= -k8s.io/apimachinery v0.30.0 h1:qxVPsyDM5XS96NIh9Oj6LavoVFYff/Pon9cZeDIkHHA= -k8s.io/apimachinery v0.30.0/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= -k8s.io/apiserver v0.30.0 h1:QCec+U72tMQ+9tR6A0sMBB5Vh6ImCEkoKkTDRABWq6M= -k8s.io/apiserver v0.30.0/go.mod h1:smOIBq8t0MbKZi7O7SyIpjPsiKJ8qa+llcFCluKyqiY= -k8s.io/cli-runtime v0.30.0 h1:0vn6/XhOvn1RJ2KJOC6IRR2CGqrpT6QQF4+8pYpWQ48= -k8s.io/cli-runtime v0.30.0/go.mod h1:vATpDMATVTMA79sZ0YUCzlMelf6rUjoBzlp+RnoM+cg= -k8s.io/client-go v0.30.0 h1:sB1AGGlhY/o7KCyCEQ0bPWzYDL0pwOZO4vAtTSh/gJQ= -k8s.io/client-go v0.30.0/go.mod h1:g7li5O5256qe6TYdAMyX/otJqMhIiGgTapdLchhmOaY= -k8s.io/component-base v0.30.0 h1:cj6bp38g0ainlfYtaOQuRELh5KSYjhKxM+io7AUIk4o= -k8s.io/component-base v0.30.0/go.mod h1:V9x/0ePFNaKeKYA3bOvIbrNoluTSG+fSJKjLdjOoeXQ= +k8s.io/api v0.30.1 h1:kCm/6mADMdbAxmIh0LBjS54nQBE+U4KmbCfIkF5CpJY= +k8s.io/api v0.30.1/go.mod h1:ddbN2C0+0DIiPntan/bye3SW3PdwLa11/0yqwvuRrJM= +k8s.io/apiextensions-apiserver v0.30.1 h1:4fAJZ9985BmpJG6PkoxVRpXv9vmPUOVzl614xarePws= +k8s.io/apiextensions-apiserver v0.30.1/go.mod h1:R4GuSrlhgq43oRY9sF2IToFh7PVlF1JjfWdoG3pixk4= +k8s.io/apimachinery v0.30.1 h1:ZQStsEfo4n65yAdlGTfP/uSHMQSoYzU/oeEbkmF7P2U= +k8s.io/apimachinery v0.30.1/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= +k8s.io/apiserver v0.30.1 h1:BEWEe8bzS12nMtDKXzCF5Q5ovp6LjjYkSp8qOPk8LZ8= +k8s.io/apiserver v0.30.1/go.mod h1:i87ZnQ+/PGAmSbD/iEKM68bm1D5reX8fO4Ito4B01mo= +k8s.io/cli-runtime v0.30.1 h1:kSBBpfrJGS6lllc24KeniI9JN7ckOOJKnmFYH1RpTOw= +k8s.io/cli-runtime v0.30.1/go.mod h1:zhHgbqI4J00pxb6gM3gJPVf2ysDjhQmQtnTxnMScab8= +k8s.io/client-go v0.30.1 h1:uC/Ir6A3R46wdkgCV3vbLyNOYyCJ8oZnjtJGKfytl/Q= +k8s.io/client-go v0.30.1/go.mod h1:wrAqLNs2trwiCH/wxxmT/x3hKVH9PuV0GGW0oDoHVqc= +k8s.io/component-base v0.30.1 h1:bvAtlPh1UrdaZL20D9+sWxsJljMi0QZ3Lmw+kmZAaxQ= +k8s.io/component-base v0.30.1/go.mod h1:e/X9kDiOebwlI41AvBHuWdqFriSRrX50CdwA9TFaHLI= k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= From 075c42ee19d3290d9bedbe065d0c639d4f4c8f63 Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Wed, 22 May 2024 11:21:32 +0200 Subject: [PATCH 69/83] fix pss signing server signing (#774) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description The signing server adapter always uses the PKCS1-V1_5 Algorithm constant to call the signing server instead of using the configured algorithm. Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change. ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [x] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- pkg/signing/handlers/rsa-signingservice/handler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/signing/handlers/rsa-signingservice/handler.go b/pkg/signing/handlers/rsa-signingservice/handler.go index ea6bd7711a..8e2ae87c6b 100644 --- a/pkg/signing/handlers/rsa-signingservice/handler.go +++ b/pkg/signing/handlers/rsa-signingservice/handler.go @@ -43,7 +43,7 @@ func NewHandler() signing.Signer { } func (h *Handler) Algorithm() string { - return Algorithm + return h.algo } func (h *Handler) Sign(cctx credentials.Context, digest string, sctx signing.SigningContext) (signature *signing.Signature, err error) { From c29184fe5426af2488d70354439615a6d8cd148a Mon Sep 17 00:00:00 2001 From: Gergely Brautigam <182850+Skarlso@users.noreply.github.com> Date: Wed, 22 May 2024 11:33:50 +0200 Subject: [PATCH 70/83] fix: use sync.OnceFunc instead of the struct package local value (#772) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Closes https://github.com/open-component-model/ocm/issues/771 ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- pkg/utils/subst/subst.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pkg/utils/subst/subst.go b/pkg/utils/subst/subst.go index b7ea397263..38205312e5 100644 --- a/pkg/utils/subst/subst.go +++ b/pkg/utils/subst/subst.go @@ -38,10 +38,8 @@ func ParseFile(file string, fss ...vfs.FileSystem) (SubstitutionTarget, error) { return s, nil } -var yqLibLogInit sync.Once - func Parse(data []byte) (SubstitutionTarget, error) { - yqLibLogInit.Do(func() { + sync.OnceFunc(func() { var lvl glog.Level switch ocmlog.Context().GetDefaultLevel() { case mlog.None: @@ -58,7 +56,7 @@ func Parse(data []byte) (SubstitutionTarget, error) { lvl = glog.DEBUG } glog.SetLevel(lvl, "yq-lib") - }) + })() var ( err error From 55c022cd4dd487f982fc21745090c765ca5110f3 Mon Sep 17 00:00:00 2001 From: Gergely Brautigam <182850+Skarlso@users.noreply.github.com> Date: Wed, 22 May 2024 11:45:11 +0200 Subject: [PATCH 71/83] fix: make sure that format of replacement matches file format (#773) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Fix for issues in https://github.com/open-component-model/ocm-controller/pull/425 ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Hilmar Falkenberg --- pkg/utils/subst/subst.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/pkg/utils/subst/subst.go b/pkg/utils/subst/subst.go index 38205312e5..610bce4596 100644 --- a/pkg/utils/subst/subst.go +++ b/pkg/utils/subst/subst.go @@ -121,8 +121,21 @@ func (f *fileinfo) Content() ([]byte, error) { } func (f *fileinfo) SubstituteByData(path string, value []byte) error { + var node interface{} + err := runtime.DefaultYAMLEncoding.Unmarshal(value, &node) + if err != nil { + return err + } + if f.json { + value, err = runtime.DefaultJSONEncoding.Marshal(node) + } else { + value, err = runtime.DefaultYAMLEncoding.Marshal(node) + } + if err != nil { + return err + } m := &yaml.Node{} - err := yaml.Unmarshal(value, m) + err = yaml.Unmarshal(value, m) if err != nil { return err } From edaf5ea83b12bc43788a766fdb0294dec66f3b9d Mon Sep 17 00:00:00 2001 From: Hilmar Falkenberg Date: Thu, 23 May 2024 17:18:26 +0200 Subject: [PATCH 72/83] remove SPDX Header (#776) --- pkg/contexts/credentials/internal/logging.go | 4 ---- .../credentials/repositories/vault/repo_int_test.go | 11 +++-------- .../credentials/repositories/vault/repo_test.go | 6 +----- pkg/errkind/kinds.go | 4 ---- pkg/errkind/utils.go | 4 ---- pkg/errors/doc.go | 4 ---- pkg/exception/doc.go | 4 ---- pkg/finalizer/doc.go | 4 ---- pkg/generics/doc.go | 4 ---- pkg/runtimefinalizer/object.go | 4 ---- pkg/runtimefinalizer/object_test.go | 4 ---- pkg/runtimefinalizer/suite_test.go | 4 ---- 12 files changed, 4 insertions(+), 53 deletions(-) diff --git a/pkg/contexts/credentials/internal/logging.go b/pkg/contexts/credentials/internal/logging.go index c80cfbbdc8..6934cbe1ea 100644 --- a/pkg/contexts/credentials/internal/logging.go +++ b/pkg/contexts/credentials/internal/logging.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package internal import ( diff --git a/pkg/contexts/credentials/repositories/vault/repo_int_test.go b/pkg/contexts/credentials/repositories/vault/repo_int_test.go index 49105706dd..3001d7c65b 100644 --- a/pkg/contexts/credentials/repositories/vault/repo_int_test.go +++ b/pkg/contexts/credentials/repositories/vault/repo_int_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - //go:build integration package vault_test @@ -14,12 +10,10 @@ import ( "os/exec" "time" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - . "github.com/open-component-model/ocm/pkg/testutils" - "github.com/hashicorp/vault-client-go" "github.com/hashicorp/vault-client-go/schema" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials" @@ -28,6 +22,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault/identity" "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" + . "github.com/open-component-model/ocm/pkg/testutils" ) type vaultMode string diff --git a/pkg/contexts/credentials/repositories/vault/repo_test.go b/pkg/contexts/credentials/repositories/vault/repo_test.go index 7c9e5044d4..5eb7bdc748 100644 --- a/pkg/contexts/credentials/repositories/vault/repo_test.go +++ b/pkg/contexts/credentials/repositories/vault/repo_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package vault_test import ( @@ -11,12 +7,12 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/open-component-model/ocm/pkg/testutils" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials" me "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault/identity" + . "github.com/open-component-model/ocm/pkg/testutils" ) const ( diff --git a/pkg/errkind/kinds.go b/pkg/errkind/kinds.go index 8f5b75d022..a04cdd9864 100644 --- a/pkg/errkind/kinds.go +++ b/pkg/errkind/kinds.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errkind const ( diff --git a/pkg/errkind/utils.go b/pkg/errkind/utils.go index 63f28e2235..b6e8c5d8d1 100644 --- a/pkg/errkind/utils.go +++ b/pkg/errkind/utils.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package errkind import ( diff --git a/pkg/errors/doc.go b/pkg/errors/doc.go index 5209583143..3e2b1b2489 100644 --- a/pkg/errors/doc.go +++ b/pkg/errors/doc.go @@ -1,6 +1,2 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Deprectated: use github.com/mandelsoft/goutils/errors package errors diff --git a/pkg/exception/doc.go b/pkg/exception/doc.go index aa618166d8..8f4d87c314 100644 --- a/pkg/exception/doc.go +++ b/pkg/exception/doc.go @@ -1,6 +1,2 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Deprecated: use github.com/mandelsoft/goutils/exception package exception diff --git a/pkg/finalizer/doc.go b/pkg/finalizer/doc.go index 969beb562b..7d460fc2d0 100644 --- a/pkg/finalizer/doc.go +++ b/pkg/finalizer/doc.go @@ -1,6 +1,2 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Deprecated: use github.com/mandelsoft/goutils/finalizer package finalizer diff --git a/pkg/generics/doc.go b/pkg/generics/doc.go index 8c5374c670..1ccf181c0b 100644 --- a/pkg/generics/doc.go +++ b/pkg/generics/doc.go @@ -1,6 +1,2 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - // Deprecated: use appropriate sub packages in github.com/mandelsoft/goutils package generics diff --git a/pkg/runtimefinalizer/object.go b/pkg/runtimefinalizer/object.go index 98679ae3c8..701ee5b276 100644 --- a/pkg/runtimefinalizer/object.go +++ b/pkg/runtimefinalizer/object.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtimefinalizer import ( diff --git a/pkg/runtimefinalizer/object_test.go b/pkg/runtimefinalizer/object_test.go index a66abd3a27..9e3cdc09db 100644 --- a/pkg/runtimefinalizer/object_test.go +++ b/pkg/runtimefinalizer/object_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtimefinalizer_test import ( diff --git a/pkg/runtimefinalizer/suite_test.go b/pkg/runtimefinalizer/suite_test.go index f7a627fc42..53c3041d6b 100644 --- a/pkg/runtimefinalizer/suite_test.go +++ b/pkg/runtimefinalizer/suite_test.go @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Open Component Model contributors. -// -// SPDX-License-Identifier: Apache-2.0 - package runtimefinalizer_test import ( From 84b9231805d321cdb805cc5b5ade82af3b72a47a Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Mon, 27 May 2024 09:26:15 +0200 Subject: [PATCH 73/83] extract optionutils + fix new usages of moved packages (#775) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change. ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Hilmar Falkenberg --- .../commands/ocmcmds/components/check/cmd.go | 2 +- .../ocmcmds/components/check/options.go | 2 +- go.mod | 2 +- go.sum | 2 ++ pkg/blobaccess/dirtree/access.go | 2 +- pkg/blobaccess/dirtree/options.go | 2 +- pkg/blobaccess/dockerdaemon/access.go | 3 +- pkg/blobaccess/dockerdaemon/options.go | 3 +- pkg/blobaccess/dockermulti/access.go | 2 +- pkg/blobaccess/dockermulti/options.go | 2 +- pkg/blobaccess/helm/options.go | 2 +- pkg/blobaccess/helm/resource.go | 2 +- pkg/blobaccess/ociartifact/options.go | 3 +- pkg/blobaccess/ociartifact/resource.go | 3 +- pkg/blobaccess/wget/access.go | 2 +- pkg/blobaccess/wget/options.go | 2 +- .../flagsets/flagsetscheme/types.go | 3 +- .../flagsets/flagsetscheme/types_options.go | 3 +- .../credentials/repositories/vault/options.go | 2 +- .../repositories/vault/repo_int_test.go | 29 ++++++++++--------- .../credentials/repositories/vault/type.go | 2 +- pkg/contexts/oci/grammar/grammar.go | 2 +- pkg/contexts/oci/grammar/grammar_test.go | 2 +- .../oci/repositories/ocireg/uniform.go | 3 +- pkg/contexts/ocm/accessmethods/mvn/method.go | 4 +-- pkg/contexts/ocm/accessmethods/wget/method.go | 3 +- .../handlers/generic/mvn/blobhandler.go | 2 +- .../handlers/generic/mvn/registration.go | 3 +- pkg/contexts/ocm/cpi/repocpi/bridge_c.go | 2 +- pkg/contexts/ocm/cpi/repocpi/bridge_cv.go | 2 +- pkg/contexts/ocm/download/download.go | 2 +- .../artifactaccess/githubaccess/options.go | 2 +- .../artifactaccess/githubaccess/resource.go | 3 +- .../artifactaccess/ociblobaccess/options.go | 2 +- .../artifactaccess/ociblobaccess/resource.go | 2 +- .../artifactaccess/s3access/options.go | 2 +- .../artifactaccess/s3access/resource.go | 3 +- .../ocm/elements/artifactblob/api/options.go | 3 +- .../elements/artifactblob/datablob/options.go | 3 +- .../artifactblob/datablob/resource.go | 2 +- .../artifactblob/dirtreeblob/options.go | 2 +- .../artifactblob/dirtreeblob/resource.go | 2 +- .../artifactblob/dockerdaemonblob/options.go | 3 +- .../artifactblob/dockerdaemonblob/resource.go | 2 +- .../artifactblob/dockermultiblob/options.go | 3 +- .../artifactblob/dockermultiblob/resource.go | 2 +- .../artifactblob/externalblob/resource.go | 2 +- .../elements/artifactblob/fileblob/options.go | 2 +- .../artifactblob/fileblob/resource.go | 2 +- .../artifactblob/genericblob/resource.go | 2 +- .../elements/artifactblob/helmblob/options.go | 2 +- .../artifactblob/helmblob/resource.go | 2 +- .../artifactblob/ociartifactblob/options.go | 3 +- .../artifactblob/ociartifactblob/resource.go | 2 +- .../artifactblob/textblob/resource.go | 3 +- .../elements/artifactblob/wgetblob/options.go | 2 +- .../artifactblob/wgetblob/resource.go | 2 +- pkg/contexts/ocm/grammar/grammar.go | 2 +- pkg/contexts/ocm/grammar/grammar_test.go | 2 +- pkg/contexts/ocm/internal/modopts.go | 3 +- .../transferhandler/standard/options.go | 2 +- pkg/contexts/ocm/utils/check/check.go | 2 +- pkg/contexts/ocm/utils/check/options.go | 3 +- pkg/iotools/hashReaderWriter.go | 2 +- pkg/optionutils/doc.go | 2 ++ pkg/runtime/descriptivetype/options.go | 3 +- pkg/utils/tarutils/pack_test.go | 7 +++-- 67 files changed, 107 insertions(+), 81 deletions(-) create mode 100644 pkg/optionutils/doc.go diff --git a/cmds/ocm/commands/ocmcmds/components/check/cmd.go b/cmds/ocm/commands/ocmcmds/components/check/cmd.go index f2bd233fbc..3fed9536b6 100644 --- a/cmds/ocm/commands/ocmcmds/components/check/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/check/cmd.go @@ -3,6 +3,7 @@ package check import ( "fmt" + "github.com/mandelsoft/goutils/optionutils" "github.com/spf13/cobra" "k8s.io/apimachinery/pkg/util/json" @@ -19,7 +20,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/check" - "github.com/open-component-model/ocm/pkg/optionutils" utils2 "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/cmds/ocm/commands/ocmcmds/components/check/options.go b/cmds/ocm/commands/ocmcmds/components/check/options.go index 55a1c6d12f..18f8b6c1cd 100644 --- a/cmds/ocm/commands/ocmcmds/components/check/options.go +++ b/cmds/ocm/commands/ocmcmds/components/check/options.go @@ -1,11 +1,11 @@ package check import ( + "github.com/mandelsoft/goutils/optionutils" "github.com/spf13/pflag" "github.com/open-component-model/ocm/cmds/ocm/pkg/options" "github.com/open-component-model/ocm/pkg/contexts/ocm/utils/check" - "github.com/open-component-model/ocm/pkg/optionutils" ) func From(o options.OptionSetProvider) *Option { diff --git a/go.mod b/go.mod index a2b3c429fa..b4a7f4688a 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/klauspost/compress v1.17.8 github.com/klauspost/pgzip v1.2.6 github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3 - github.com/mandelsoft/goutils v0.0.0-20240510154642-0f1a031c54cb + github.com/mandelsoft/goutils v0.0.0-20240523093855-5385ed52b460 github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf github.com/mandelsoft/spiff v1.7.0-beta-5 github.com/mandelsoft/vfs v0.4.3 diff --git a/go.sum b/go.sum index be2792f419..e06f85114e 100644 --- a/go.sum +++ b/go.sum @@ -684,6 +684,8 @@ github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3 h1:oo9nIgnyiBg github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3/go.mod h1:LxhqC7khDoRENwooP6f/vWvia9ivj6TqLYrR39zqkN0= github.com/mandelsoft/goutils v0.0.0-20240510154642-0f1a031c54cb h1:1d3Xxk4rkdKcIFP1AcRlPxUhcBhnFCTqrMhXztB1r5E= github.com/mandelsoft/goutils v0.0.0-20240510154642-0f1a031c54cb/go.mod h1:EbNqk9JceSMq7MJuALB/vlOpoD4MAGE0TenM9TR+C0o= +github.com/mandelsoft/goutils v0.0.0-20240523093855-5385ed52b460 h1:q44fRqo/PC3eTexd8Q3pO2BTHTABVXsW6DBXRUhC97E= +github.com/mandelsoft/goutils v0.0.0-20240523093855-5385ed52b460/go.mod h1:EbNqk9JceSMq7MJuALB/vlOpoD4MAGE0TenM9TR+C0o= github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf h1:WEmgzeArDbp6Aw34jmziMIE5ygo2zpl/atXRq3D7lSw= github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf/go.mod h1:uO460C1lIB3IOOgrbXhAlz3AKsOv4T2K6ALBn3PwuSg= github.com/mandelsoft/spiff v1.7.0-beta-5 h1:3kC10nTviDQhL8diSxp7i4IC2iSiDg6KPbH1CAq7Lfw= diff --git a/pkg/blobaccess/dirtree/access.go b/pkg/blobaccess/dirtree/access.go index 460225f61f..9b861cbd7c 100644 --- a/pkg/blobaccess/dirtree/access.go +++ b/pkg/blobaccess/dirtree/access.go @@ -5,12 +5,12 @@ import ( "fmt" "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/optionutils" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/blobaccess/bpi" "github.com/open-component-model/ocm/pkg/mime" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/utils/tarutils" ) diff --git a/pkg/blobaccess/dirtree/options.go b/pkg/blobaccess/dirtree/options.go index 5793b9e60d..3eba40a116 100644 --- a/pkg/blobaccess/dirtree/options.go +++ b/pkg/blobaccess/dirtree/options.go @@ -1,10 +1,10 @@ package dirtree import ( + "github.com/mandelsoft/goutils/optionutils" "github.com/mandelsoft/vfs/pkg/vfs" "golang.org/x/exp/slices" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/blobaccess/dockerdaemon/access.go b/pkg/blobaccess/dockerdaemon/access.go index 8a636390c9..a832f6d084 100644 --- a/pkg/blobaccess/dockerdaemon/access.go +++ b/pkg/blobaccess/dockerdaemon/access.go @@ -3,13 +3,14 @@ package dockerdaemon import ( "fmt" + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/blobaccess/bpi" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/oci/annotations" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/artifactset" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/docker" - "github.com/open-component-model/ocm/pkg/optionutils" ) func (o *Options) OCIContext() oci.Context { diff --git a/pkg/blobaccess/dockerdaemon/options.go b/pkg/blobaccess/dockerdaemon/options.go index f44bb884fa..60703913c1 100644 --- a/pkg/blobaccess/dockerdaemon/options.go +++ b/pkg/blobaccess/dockerdaemon/options.go @@ -1,9 +1,10 @@ package dockerdaemon import ( + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/oci" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/blobaccess/dockermulti/access.go b/pkg/blobaccess/dockermulti/access.go index 59a6f8e798..6b1300c890 100644 --- a/pkg/blobaccess/dockermulti/access.go +++ b/pkg/blobaccess/dockermulti/access.go @@ -6,6 +6,7 @@ import ( . "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/optionutils" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -16,7 +17,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/artifactset" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/docker" - "github.com/open-component-model/ocm/pkg/optionutils" ) func (o *Options) OCIContext() oci.Context { diff --git a/pkg/blobaccess/dockermulti/options.go b/pkg/blobaccess/dockermulti/options.go index 309a6c507b..4b93db782e 100644 --- a/pkg/blobaccess/dockermulti/options.go +++ b/pkg/blobaccess/dockermulti/options.go @@ -1,11 +1,11 @@ package dockermulti import ( + "github.com/mandelsoft/goutils/optionutils" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/oci" - "github.com/open-component-model/ocm/pkg/optionutils" ) type Option = optionutils.Option[*Options] diff --git a/pkg/blobaccess/helm/options.go b/pkg/blobaccess/helm/options.go index 39930e06d7..afb45f0c54 100644 --- a/pkg/blobaccess/helm/options.go +++ b/pkg/blobaccess/helm/options.go @@ -1,11 +1,11 @@ package helm import ( + "github.com/mandelsoft/goutils/optionutils" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/oci" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/blobaccess/helm/resource.go b/pkg/blobaccess/helm/resource.go index 16452dd3cb..4c1c40737f 100644 --- a/pkg/blobaccess/helm/resource.go +++ b/pkg/blobaccess/helm/resource.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/optionutils" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/blobaccess" @@ -14,7 +15,6 @@ import ( ocihelm "github.com/open-component-model/ocm/pkg/contexts/oci/ociutils/helm" "github.com/open-component-model/ocm/pkg/helm" "github.com/open-component-model/ocm/pkg/helm/loader" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/blobaccess/ociartifact/options.go b/pkg/blobaccess/ociartifact/options.go index ccc0cd9c92..6e3469306e 100644 --- a/pkg/blobaccess/ociartifact/options.go +++ b/pkg/blobaccess/ociartifact/options.go @@ -1,10 +1,11 @@ package ociartifact import ( + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/oci/transfer/filters" - "github.com/open-component-model/ocm/pkg/optionutils" ) type Option = optionutils.Option[*Options] diff --git a/pkg/blobaccess/ociartifact/resource.go b/pkg/blobaccess/ociartifact/resource.go index b437c9b96e..1f468d889d 100644 --- a/pkg/blobaccess/ociartifact/resource.go +++ b/pkg/blobaccess/ociartifact/resource.go @@ -3,11 +3,12 @@ package ociartifact import ( "fmt" + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/blobaccess/bpi" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/artifactset" - "github.com/open-component-model/ocm/pkg/optionutils" ) func BlobAccessForOCIArtifact(refname string, opts ...Option) (blobaccess.BlobAccess, string, error) { diff --git a/pkg/blobaccess/wget/access.go b/pkg/blobaccess/wget/access.go index fcd2b22552..c3e1666bb8 100644 --- a/pkg/blobaccess/wget/access.go +++ b/pkg/blobaccess/wget/access.go @@ -9,6 +9,7 @@ import ( "net/http" "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/optionutils" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/blobaccess/bpi" @@ -16,7 +17,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/wget/identity" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" ocmmime "github.com/open-component-model/ocm/pkg/mime" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/blobaccess/wget/options.go b/pkg/blobaccess/wget/options.go index 8e6769eabe..a14fb5614f 100644 --- a/pkg/blobaccess/wget/options.go +++ b/pkg/blobaccess/wget/options.go @@ -4,12 +4,12 @@ import ( "io" "net/http" + "github.com/mandelsoft/goutils/optionutils" "github.com/mandelsoft/logging" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/wget/identity" ocmlog "github.com/open-component-model/ocm/pkg/logging" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/cobrautils/flagsets/flagsetscheme/types.go b/pkg/cobrautils/flagsets/flagsetscheme/types.go index f69af8478b..2e9c3483d0 100644 --- a/pkg/cobrautils/flagsets/flagsetscheme/types.go +++ b/pkg/cobrautils/flagsets/flagsetscheme/types.go @@ -1,8 +1,9 @@ package flagsetscheme import ( + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/cobrautils/flagsets" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/runtime/descriptivetype" ) diff --git a/pkg/cobrautils/flagsets/flagsetscheme/types_options.go b/pkg/cobrautils/flagsets/flagsetscheme/types_options.go index a04a30f35b..1e84507b4a 100644 --- a/pkg/cobrautils/flagsets/flagsetscheme/types_options.go +++ b/pkg/cobrautils/flagsets/flagsetscheme/types_options.go @@ -1,8 +1,9 @@ package flagsetscheme import ( + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/cobrautils/flagsets" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/runtime/descriptivetype" ) diff --git a/pkg/contexts/credentials/repositories/vault/options.go b/pkg/contexts/credentials/repositories/vault/options.go index e78cf0dfac..59d2925835 100644 --- a/pkg/contexts/credentials/repositories/vault/options.go +++ b/pkg/contexts/credentials/repositories/vault/options.go @@ -1,9 +1,9 @@ package vault import ( + "github.com/mandelsoft/goutils/optionutils" "golang.org/x/exp/slices" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/credentials/repositories/vault/repo_int_test.go b/pkg/contexts/credentials/repositories/vault/repo_int_test.go index 3001d7c65b..13456f8f36 100644 --- a/pkg/contexts/credentials/repositories/vault/repo_int_test.go +++ b/pkg/contexts/credentials/repositories/vault/repo_int_test.go @@ -12,6 +12,8 @@ import ( "github.com/hashicorp/vault-client-go" "github.com/hashicorp/vault-client-go/schema" + "github.com/mandelsoft/goutils/errors" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -20,7 +22,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials/identity/hostpath" me "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault/identity" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/runtime" . "github.com/open-component-model/ocm/pkg/testutils" ) @@ -328,7 +329,7 @@ path "secret/metadata/%s/*" role := Must(vaultClient.Auth.AppRoleReadRoleId(ctx, VAULT_APP_ROLE1)) roleid := role.Data.RoleId // Unfortunately, this function is currently bugged, therefore we fall back to the generic function - //secretid := Must(client.Auth.AppRoleWriteSecretId(ctx, VAULT_APP_ROLE, schema.AppRoleWriteSecretIdRequest{})) + // secretid := Must(client.Auth.AppRoleWriteSecretId(ctx, VAULT_APP_ROLE, schema.AppRoleWriteSecretIdRequest{})) secret := Must(vaultClient.Write(ctx, fmt.Sprintf("/v1/auth/approle/role/%s/secret-id", VAULT_APP_ROLE1), map[string]interface{}{})) secretid := secret.Data["secret_id"].(string) @@ -385,18 +386,18 @@ path "secret/metadata/%s/*" Expect(c).To(YAMLEqual(data)) }) - //D(irect): + // D(irect): // - has general credentials matching parent path of P2 // - has credentials for P1 - //P1: + // P1: // - has specialized credentials for P2 - //P2: + // P2: // - has credentials for C // // - //query C: - //- D: -> nothing - //- P1: query P1 + // query C: + // - D: -> nothing + // - P1: query P1 // - D: -> found // - P1: omit (recursion) // - P2: query P2 @@ -406,7 +407,7 @@ path "secret/metadata/%s/*" // explore, whether an additional attempt with P1 BUT only with credentialless providers / direct creds // would work as a general solution. // -> select D(P2) WRONG (a1) - //- P2: query P2 + // - P2: query P2 // - D: -> found // - P1: query P1 // - D: found @@ -417,12 +418,12 @@ path "secret/metadata/%s/*" // - P2: omit (recursion) // -> select P1(P2) CORRECT (a2) // -> found - //-> select P2(C) + // -> select P2(C) // // The Problem here is, that the case a1 and case b are formally indistinguishable. While a2 and b lead to the // correct result, we would fail in a1. It("recursive authentication with overlapping credentials", func() { - //TODO + // TODO }) }) }) @@ -441,8 +442,8 @@ func StartVaultServer(mode vaultMode, rootToken, address string) (*exec.Cmd, *va } cmd := exec.CommandContext(cmdctx, "../../../../../bin/vault", "server", "-"+string(mode), fmt.Sprintf("-dev-root-token-id=%s", rootToken), fmt.Sprintf("-dev-listen-address=%s", address)) - //cmd.Stdout = os.Stdout - //cmd.Stderr = os.Stderr + // cmd.Stdout = os.Stdout + // cmd.Stderr = os.Stderr vaultClient, err := vault.New( vault.WithAddress(url), @@ -494,7 +495,7 @@ func SetUpVaultAccess(ctx context.Context, credctx credentials.Context, client * role := Must(client.Auth.AppRoleReadRoleId(ctx, VAULT_APP_ROLE)) roleid := role.Data.RoleId // Unfortunately, this function is currently bugged, therefore we fall back to the generic function - //secretid := Must(client.Auth.AppRoleWriteSecretId(ctx, VAULT_APP_ROLE, schema.AppRoleWriteSecretIdRequest{})) + // secretid := Must(client.Auth.AppRoleWriteSecretId(ctx, VAULT_APP_ROLE, schema.AppRoleWriteSecretIdRequest{})) secret := Must(client.Write(ctx, fmt.Sprintf("/v1/auth/approle/role/%s/secret-id", VAULT_APP_ROLE), map[string]interface{}{})) secretid := secret.Data["secret_id"].(string) diff --git a/pkg/contexts/credentials/repositories/vault/type.go b/pkg/contexts/credentials/repositories/vault/type.go index 2e00632427..aa78f2b933 100644 --- a/pkg/contexts/credentials/repositories/vault/type.go +++ b/pkg/contexts/credentials/repositories/vault/type.go @@ -4,12 +4,12 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/optionutils" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/credentials/internal" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault/identity" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/oci/grammar/grammar.go b/pkg/contexts/oci/grammar/grammar.go index 97e04b1d62..fa39baa2df 100644 --- a/pkg/contexts/oci/grammar/grammar.go +++ b/pkg/contexts/oci/grammar/grammar.go @@ -3,7 +3,7 @@ package grammar import ( "strings" - . "github.com/open-component-model/ocm/pkg/regex" + . "github.com/mandelsoft/goutils/regexutils" ) const ( diff --git a/pkg/contexts/oci/grammar/grammar_test.go b/pkg/contexts/oci/grammar/grammar_test.go index a6f6e9e25c..4b6172f1b2 100644 --- a/pkg/contexts/oci/grammar/grammar_test.go +++ b/pkg/contexts/oci/grammar/grammar_test.go @@ -7,7 +7,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - tool "github.com/open-component-model/ocm/pkg/regex" + tool "github.com/mandelsoft/goutils/regexutils" ) func TestConfig(t *testing.T) { diff --git a/pkg/contexts/oci/repositories/ocireg/uniform.go b/pkg/contexts/oci/repositories/ocireg/uniform.go index 49f78e9778..5a85243e39 100644 --- a/pkg/contexts/oci/repositories/ocireg/uniform.go +++ b/pkg/contexts/oci/repositories/ocireg/uniform.go @@ -1,9 +1,10 @@ package ocireg import ( + regex "github.com/mandelsoft/goutils/regexutils" + "github.com/open-component-model/ocm/pkg/contexts/oci/cpi" "github.com/open-component-model/ocm/pkg/contexts/oci/grammar" - "github.com/open-component-model/ocm/pkg/regex" ) func init() { diff --git a/pkg/contexts/ocm/accessmethods/mvn/method.go b/pkg/contexts/ocm/accessmethods/mvn/method.go index 55da45fe0b..d430b774c2 100644 --- a/pkg/contexts/ocm/accessmethods/mvn/method.go +++ b/pkg/contexts/ocm/accessmethods/mvn/method.go @@ -11,6 +11,8 @@ import ( "sort" "strings" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/optionutils" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/opencontainers/go-digest" @@ -23,11 +25,9 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/mvn/identity" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/iotools" "github.com/open-component-model/ocm/pkg/logging" "github.com/open-component-model/ocm/pkg/mime" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/runtime" "github.com/open-component-model/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/utils/tarutils" diff --git a/pkg/contexts/ocm/accessmethods/wget/method.go b/pkg/contexts/ocm/accessmethods/wget/method.go index 5b1602f86d..168c1baace 100644 --- a/pkg/contexts/ocm/accessmethods/wget/method.go +++ b/pkg/contexts/ocm/accessmethods/wget/method.go @@ -5,13 +5,14 @@ import ( "io" "sync" + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/blobaccess/wget" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/wget/identity" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/mime" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler.go index 1e27561d32..0a11fcc96f 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler.go @@ -9,6 +9,7 @@ import ( "net/http" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/mvn/identity" @@ -16,7 +17,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/iotools" "github.com/open-component-model/ocm/pkg/logging" "github.com/open-component-model/ocm/pkg/mime" diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration.go b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration.go index 7fc5ffb8f9..be1436b455 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration.go @@ -4,9 +4,10 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/errors" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/registrations" ) diff --git a/pkg/contexts/ocm/cpi/repocpi/bridge_c.go b/pkg/contexts/ocm/cpi/repocpi/bridge_c.go index 0a874218b4..322daef9a6 100644 --- a/pkg/contexts/ocm/cpi/repocpi/bridge_c.go +++ b/pkg/contexts/ocm/cpi/repocpi/bridge_c.go @@ -5,12 +5,12 @@ import ( "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/optionutils" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm/attrs/compositionmodeattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/refmgmt/resource" ) diff --git a/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go b/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go index d05e18fea1..4de83f7d4c 100644 --- a/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go +++ b/pkg/contexts/ocm/cpi/repocpi/bridge_cv.go @@ -8,6 +8,7 @@ import ( "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/optionutils" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common" @@ -19,7 +20,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/internal" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/refmgmt" "github.com/open-component-model/ocm/pkg/refmgmt/resource" "github.com/open-component-model/ocm/pkg/runtimefinalizer" diff --git a/pkg/contexts/ocm/download/download.go b/pkg/contexts/ocm/download/download.go index 595590a66a..e536bb6460 100644 --- a/pkg/contexts/ocm/download/download.go +++ b/pkg/contexts/ocm/download/download.go @@ -1,11 +1,11 @@ package download import ( + "github.com/mandelsoft/goutils/optionutils" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/ocm/elements/artifactaccess/githubaccess/options.go b/pkg/contexts/ocm/elements/artifactaccess/githubaccess/options.go index 4b8a5ad480..12ff0a9017 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/githubaccess/options.go +++ b/pkg/contexts/ocm/elements/artifactaccess/githubaccess/options.go @@ -1,7 +1,7 @@ package githubaccess import ( - "github.com/open-component-model/ocm/pkg/optionutils" + "github.com/mandelsoft/goutils/optionutils" ) type Option = optionutils.Option[*Options] diff --git a/pkg/contexts/ocm/elements/artifactaccess/githubaccess/resource.go b/pkg/contexts/ocm/elements/artifactaccess/githubaccess/resource.go index 491d23ed70..4a1f7b282e 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/githubaccess/resource.go +++ b/pkg/contexts/ocm/elements/artifactaccess/githubaccess/resource.go @@ -1,13 +1,14 @@ package githubaccess import ( + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/contexts/ocm" access "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/github" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactaccess/genericaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/optionutils" ) const TYPE = resourcetypes.DIRECTORY_TREE diff --git a/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/options.go b/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/options.go index 06e1e66e0a..216c44b3f3 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/options.go +++ b/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/options.go @@ -1,7 +1,7 @@ package github import ( - "github.com/open-component-model/ocm/pkg/optionutils" + "github.com/mandelsoft/goutils/optionutils" ) type Option = optionutils.Option[*Options] diff --git a/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/resource.go b/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/resource.go index 53ac2d7e7c..b2b9363f81 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/resource.go +++ b/pkg/contexts/ocm/elements/artifactaccess/ociblobaccess/resource.go @@ -1,6 +1,7 @@ package github import ( + "github.com/mandelsoft/goutils/optionutils" "github.com/opencontainers/go-digest" "github.com/open-component-model/ocm/pkg/contexts/ocm" @@ -10,7 +11,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactaccess/genericaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" "github.com/open-component-model/ocm/pkg/mime" - "github.com/open-component-model/ocm/pkg/optionutils" ) const TYPE = resourcetypes.BLOB diff --git a/pkg/contexts/ocm/elements/artifactaccess/s3access/options.go b/pkg/contexts/ocm/elements/artifactaccess/s3access/options.go index bb7c98fe42..e52fc719cd 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/s3access/options.go +++ b/pkg/contexts/ocm/elements/artifactaccess/s3access/options.go @@ -1,7 +1,7 @@ package github import ( - "github.com/open-component-model/ocm/pkg/optionutils" + "github.com/mandelsoft/goutils/optionutils" ) type Option = optionutils.Option[*Options] diff --git a/pkg/contexts/ocm/elements/artifactaccess/s3access/resource.go b/pkg/contexts/ocm/elements/artifactaccess/s3access/resource.go index fcd3dc33e6..45f551bc55 100644 --- a/pkg/contexts/ocm/elements/artifactaccess/s3access/resource.go +++ b/pkg/contexts/ocm/elements/artifactaccess/s3access/resource.go @@ -1,6 +1,8 @@ package github import ( + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/contexts/ocm" access "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/s3" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" @@ -8,7 +10,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactaccess/genericaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" "github.com/open-component-model/ocm/pkg/mime" - "github.com/open-component-model/ocm/pkg/optionutils" ) const TYPE = resourcetypes.BLOB diff --git a/pkg/contexts/ocm/elements/artifactblob/api/options.go b/pkg/contexts/ocm/elements/artifactblob/api/options.go index 954e07f557..245023d1c6 100644 --- a/pkg/contexts/ocm/elements/artifactblob/api/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/api/options.go @@ -1,8 +1,9 @@ package api import ( + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/optionutils" ) type ( diff --git a/pkg/contexts/ocm/elements/artifactblob/datablob/options.go b/pkg/contexts/ocm/elements/artifactblob/datablob/options.go index 176cf5bc0c..d22d5d607b 100644 --- a/pkg/contexts/ocm/elements/artifactblob/datablob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/datablob/options.go @@ -1,9 +1,10 @@ package datablob import ( + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/api" - "github.com/open-component-model/ocm/pkg/optionutils" ) type Option = optionutils.Option[*Options] diff --git a/pkg/contexts/ocm/elements/artifactblob/datablob/resource.go b/pkg/contexts/ocm/elements/artifactblob/datablob/resource.go index 5fa761bb64..4b0e64b2f3 100644 --- a/pkg/contexts/ocm/elements/artifactblob/datablob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/datablob/resource.go @@ -2,13 +2,13 @@ package datablob import ( "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/optionutils" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/mime" - "github.com/open-component-model/ocm/pkg/optionutils" ) func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, blob []byte, opts ...Option) cpi.ArtifactAccess[M] { diff --git a/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/options.go b/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/options.go index 47e7479926..fdffe16d10 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/options.go @@ -1,12 +1,12 @@ package dirtreeblob import ( + "github.com/mandelsoft/goutils/optionutils" "github.com/mandelsoft/vfs/pkg/vfs" base "github.com/open-component-model/ocm/pkg/blobaccess/dirtree" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/api" - "github.com/open-component-model/ocm/pkg/optionutils" ) type Option = optionutils.Option[*Options] diff --git a/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource.go index fd4aa9e138..62304ff052 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/dirtreeblob/resource.go @@ -2,13 +2,13 @@ package dirtreeblob import ( "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/optionutils" "github.com/open-component-model/ocm/pkg/blobaccess/dirtree" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/optionutils" ) const TYPE = resourcetypes.DIRECTORY_TREE diff --git a/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/options.go b/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/options.go index 98701fdabe..60c4f35d50 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/options.go @@ -1,11 +1,12 @@ package dockerdaemonblob import ( + "github.com/mandelsoft/goutils/optionutils" + base "github.com/open-component-model/ocm/pkg/blobaccess/dockerdaemon" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/api" - "github.com/open-component-model/ocm/pkg/optionutils" ) type Option = optionutils.Option[*Options] diff --git a/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/resource.go index fda40a0d1a..f18ae7c4b2 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/dockerdaemonblob/resource.go @@ -2,6 +2,7 @@ package dockerdaemonblob import ( "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/optionutils" "github.com/open-component-model/ocm/pkg/blobaccess/dockerdaemon" "github.com/open-component-model/ocm/pkg/contexts/ocm" @@ -9,7 +10,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/optionutils" ) const TYPE = resourcetypes.OCI_IMAGE diff --git a/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/options.go b/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/options.go index a6412c14f1..451904c13f 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/options.go @@ -1,11 +1,12 @@ package dockermultiblob import ( + "github.com/mandelsoft/goutils/optionutils" + base "github.com/open-component-model/ocm/pkg/blobaccess/dockermulti" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/api" - "github.com/open-component-model/ocm/pkg/optionutils" ) type Option = optionutils.Option[*Options] diff --git a/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/resource.go index c6b5b6d4c9..b8c2b5726b 100644 --- a/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/dockermultiblob/resource.go @@ -2,13 +2,13 @@ package dockermultiblob import ( "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/optionutils" "github.com/open-component-model/ocm/pkg/blobaccess/dockermulti" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/optionutils" ) const TYPE = resourcetypes.OCI_IMAGE diff --git a/pkg/contexts/ocm/elements/artifactblob/externalblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/externalblob/resource.go index cb6f5813b2..47d8584402 100644 --- a/pkg/contexts/ocm/elements/artifactblob/externalblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/externalblob/resource.go @@ -3,11 +3,11 @@ package externalblob import ( "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/optionutils" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/optionutils" ) func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, access ocm.AccessSpec, opts ...Option) (cpi.ArtifactAccess[M], error) { diff --git a/pkg/contexts/ocm/elements/artifactblob/fileblob/options.go b/pkg/contexts/ocm/elements/artifactblob/fileblob/options.go index 5a1cdc6d37..99b1faa92d 100644 --- a/pkg/contexts/ocm/elements/artifactblob/fileblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/fileblob/options.go @@ -1,11 +1,11 @@ package fileblob import ( + "github.com/mandelsoft/goutils/optionutils" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/api" - "github.com/open-component-model/ocm/pkg/optionutils" ) type Option = optionutils.Option[*Options] diff --git a/pkg/contexts/ocm/elements/artifactblob/fileblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/fileblob/resource.go index 6cacce1098..7c779e1578 100644 --- a/pkg/contexts/ocm/elements/artifactblob/fileblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/fileblob/resource.go @@ -2,13 +2,13 @@ package fileblob import ( "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/optionutils" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/mime" - "github.com/open-component-model/ocm/pkg/optionutils" ) const TYPE = "blob" diff --git a/pkg/contexts/ocm/elements/artifactblob/genericblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/genericblob/resource.go index bbd01ff01c..8c6f8fbcde 100644 --- a/pkg/contexts/ocm/elements/artifactblob/genericblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/genericblob/resource.go @@ -2,11 +2,11 @@ package genericblob import ( "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/optionutils" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/optionutils" ) func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx cpi.Context, meta P, blob blobaccess.BlobAccessProvider, opts ...Option) cpi.ArtifactAccess[M] { diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/options.go b/pkg/contexts/ocm/elements/artifactblob/helmblob/options.go index 69450c00cb..725ffb40ca 100644 --- a/pkg/contexts/ocm/elements/artifactblob/helmblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/options.go @@ -1,6 +1,7 @@ package helmblob import ( + "github.com/mandelsoft/goutils/optionutils" "github.com/mandelsoft/vfs/pkg/vfs" base "github.com/open-component-model/ocm/pkg/blobaccess/helm" @@ -8,7 +9,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/api" - "github.com/open-component-model/ocm/pkg/optionutils" ) type Option = optionutils.Option[*Options] diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/helmblob/resource.go index 21c1e48537..22b0be16d5 100644 --- a/pkg/contexts/ocm/elements/artifactblob/helmblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/resource.go @@ -2,13 +2,13 @@ package helmblob import ( "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/optionutils" "github.com/open-component-model/ocm/pkg/blobaccess/helm" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/optionutils" ) const TYPE = resourcetypes.HELM_CHART diff --git a/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/options.go b/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/options.go index 2a9a36c65a..2f03a9424a 100644 --- a/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/options.go @@ -1,12 +1,13 @@ package ociartifactblob import ( + "github.com/mandelsoft/goutils/optionutils" + base "github.com/open-component-model/ocm/pkg/blobaccess/ociartifact" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/oci" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/api" - "github.com/open-component-model/ocm/pkg/optionutils" ) type Option = optionutils.Option[*Options] diff --git a/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/resource.go index 105ad0a4b7..3cb30ee21e 100644 --- a/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/ociartifactblob/resource.go @@ -2,6 +2,7 @@ package ociartifactblob import ( "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/optionutils" blob "github.com/open-component-model/ocm/pkg/blobaccess/ociartifact" "github.com/open-component-model/ocm/pkg/contexts/oci" @@ -9,7 +10,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/optionutils" ) const TYPE = resourcetypes.OCI_IMAGE diff --git a/pkg/contexts/ocm/elements/artifactblob/textblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/textblob/resource.go index 8683676dce..a38e26f074 100644 --- a/pkg/contexts/ocm/elements/artifactblob/textblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/textblob/resource.go @@ -1,12 +1,13 @@ package textblob import ( + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/datablob" "github.com/open-component-model/ocm/pkg/mime" - "github.com/open-component-model/ocm/pkg/optionutils" ) func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, blob string, opts ...Option) cpi.ArtifactAccess[M] { diff --git a/pkg/contexts/ocm/elements/artifactblob/wgetblob/options.go b/pkg/contexts/ocm/elements/artifactblob/wgetblob/options.go index ce8427ffb6..ea29ff9b1d 100644 --- a/pkg/contexts/ocm/elements/artifactblob/wgetblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/wgetblob/options.go @@ -4,6 +4,7 @@ import ( "io" "net/http" + "github.com/mandelsoft/goutils/optionutils" "github.com/mandelsoft/logging" base "github.com/open-component-model/ocm/pkg/blobaccess/wget" @@ -11,7 +12,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/wget" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/api" - "github.com/open-component-model/ocm/pkg/optionutils" ) type Option = optionutils.Option[*Options] diff --git a/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go index 976b4648aa..3045c59bef 100644 --- a/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go @@ -2,13 +2,13 @@ package wgetblob import ( "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/optionutils" "github.com/open-component-model/ocm/pkg/blobaccess/wget" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/optionutils" ) const TYPE = resourcetypes.BLOB diff --git a/pkg/contexts/ocm/grammar/grammar.go b/pkg/contexts/ocm/grammar/grammar.go index d92d177d14..ca5e8ddb87 100644 --- a/pkg/contexts/ocm/grammar/grammar.go +++ b/pkg/contexts/ocm/grammar/grammar.go @@ -1,7 +1,7 @@ package grammar import ( - . "github.com/open-component-model/ocm/pkg/regex" + . "github.com/mandelsoft/goutils/regexutils" "github.com/open-component-model/ocm/pkg/contexts/oci/grammar" ) diff --git a/pkg/contexts/ocm/grammar/grammar_test.go b/pkg/contexts/ocm/grammar/grammar_test.go index 22e1cf4ef0..5649bd1511 100644 --- a/pkg/contexts/ocm/grammar/grammar_test.go +++ b/pkg/contexts/ocm/grammar/grammar_test.go @@ -7,7 +7,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - gr "github.com/open-component-model/ocm/pkg/regex" + gr "github.com/mandelsoft/goutils/regexutils" ) func TestConfig(t *testing.T) { diff --git a/pkg/contexts/ocm/internal/modopts.go b/pkg/contexts/ocm/internal/modopts.go index 33ee9c0b98..268170e32a 100644 --- a/pkg/contexts/ocm/internal/modopts.go +++ b/pkg/contexts/ocm/internal/modopts.go @@ -1,7 +1,8 @@ package internal import ( - "github.com/open-component-model/ocm/pkg/optionutils" + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/contexts/ocm/transfer/transferhandler/standard/options.go b/pkg/contexts/ocm/transfer/transferhandler/standard/options.go index 080c59743a..c22a972dd3 100644 --- a/pkg/contexts/ocm/transfer/transferhandler/standard/options.go +++ b/pkg/contexts/ocm/transfer/transferhandler/standard/options.go @@ -3,13 +3,13 @@ package standard import ( "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/goutils/maputils" + "github.com/mandelsoft/goutils/optionutils" "github.com/mandelsoft/goutils/set" "github.com/mandelsoft/goutils/sliceutils" "golang.org/x/exp/slices" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler" - "github.com/open-component-model/ocm/pkg/optionutils" "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/contexts/ocm/utils/check/check.go b/pkg/contexts/ocm/utils/check/check.go index 989ae2a84a..7eef618a25 100644 --- a/pkg/contexts/ocm/utils/check/check.go +++ b/pkg/contexts/ocm/utils/check/check.go @@ -4,12 +4,12 @@ import ( "encoding/json" "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/optionutils" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" - "github.com/open-component-model/ocm/pkg/optionutils" ) type Result struct { diff --git a/pkg/contexts/ocm/utils/check/options.go b/pkg/contexts/ocm/utils/check/options.go index d263e693e9..055ae93c43 100644 --- a/pkg/contexts/ocm/utils/check/options.go +++ b/pkg/contexts/ocm/utils/check/options.go @@ -1,7 +1,8 @@ package check import ( - "github.com/open-component-model/ocm/pkg/optionutils" + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/pkg/iotools/hashReaderWriter.go b/pkg/iotools/hashReaderWriter.go index 675cdb68c0..b74863f7e7 100644 --- a/pkg/iotools/hashReaderWriter.go +++ b/pkg/iotools/hashReaderWriter.go @@ -7,7 +7,7 @@ import ( "io" "strings" - "github.com/open-component-model/ocm/pkg/errors" + "github.com/mandelsoft/goutils/errors" ) type HashReader struct { diff --git a/pkg/optionutils/doc.go b/pkg/optionutils/doc.go new file mode 100644 index 0000000000..25ffab3e77 --- /dev/null +++ b/pkg/optionutils/doc.go @@ -0,0 +1,2 @@ +// Deprecated: use github.com/mandelsoft/goutils/optionutils +package optionutils diff --git a/pkg/runtime/descriptivetype/options.go b/pkg/runtime/descriptivetype/options.go index 7b067bd62a..42a8c637b5 100644 --- a/pkg/runtime/descriptivetype/options.go +++ b/pkg/runtime/descriptivetype/options.go @@ -1,7 +1,8 @@ package descriptivetype import ( - "github.com/open-component-model/ocm/pkg/optionutils" + "github.com/mandelsoft/goutils/optionutils" + "github.com/open-component-model/ocm/pkg/runtime" ) diff --git a/pkg/utils/tarutils/pack_test.go b/pkg/utils/tarutils/pack_test.go index 2487913a61..50b28df7d8 100644 --- a/pkg/utils/tarutils/pack_test.go +++ b/pkg/utils/tarutils/pack_test.go @@ -5,12 +5,13 @@ import ( "os" "runtime" - "github.com/mandelsoft/vfs/pkg/osfs" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - - "github.com/open-component-model/ocm/pkg/errors" . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/vfs/pkg/osfs" + "github.com/open-component-model/ocm/pkg/utils/tarutils" ) From 5d36b1eb6729e78943ca8704cdb5b43fdac19084 Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Mon, 27 May 2024 10:18:15 +0200 Subject: [PATCH 74/83] early CD validation for AddVersion (#779) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description When adding a CV to a component, the CD validation is done deep in the call chain when updating the CV on the persistence layer. This typically happens during closing a CV which provides strange error messages. To provider a better error message the validation is now done directly in the add call. ## What type of PR is this? (check all applicable) - [x] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [x] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- pkg/contexts/ocm/cpi/repocpi/bridge_c.go | 5 +++++ .../ocm/repositories/composition/repository_test.go | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/pkg/contexts/ocm/cpi/repocpi/bridge_c.go b/pkg/contexts/ocm/cpi/repocpi/bridge_c.go index 322daef9a6..c4734c439c 100644 --- a/pkg/contexts/ocm/cpi/repocpi/bridge_c.go +++ b/pkg/contexts/ocm/cpi/repocpi/bridge_c.go @@ -134,6 +134,11 @@ func (c *componentAccessBridge) AddVersion(cv cpi.ComponentVersionAccess, opts * return err } + err = compdesc.Validate(cv.GetDescriptor()) + if err != nil { + return err + } + forcestore := c.IsOwned(cv) if !forcestore { eff, err := c.NewVersion(cv.GetVersion(), optionutils.AsValue(opts.Overwrite)) diff --git a/pkg/contexts/ocm/repositories/composition/repository_test.go b/pkg/contexts/ocm/repositories/composition/repository_test.go index 054b9c8125..9746088d6b 100644 --- a/pkg/contexts/ocm/repositories/composition/repository_test.go +++ b/pkg/contexts/ocm/repositories/composition/repository_test.go @@ -130,4 +130,10 @@ var _ = Describe("repository", func() { cv.GetDescriptor().Provider.Name = "acme.org" ExpectError(cl.Close()).To(MatchError(accessobj.ErrReadOnly)) }) + + It("provides early error", func() { + repo := me.NewRepository(ctx) + cv := me.NewComponentVersion(ctx, "a", "1.0") + ExpectError(repo.AddComponentVersion(cv)).To(MatchError("component.name: Does not match pattern '^[a-z][-a-z0-9]*([.][a-z][-a-z0-9]*)*[.][a-z]{2,}(/[a-z][-a-z0-9_]*([.][a-z][-a-z0-9_]*)*)+$'")) + }) }) From 0c499cf271c21bca7fe2c7a1c1982d2038e07edb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 08:36:19 +0000 Subject: [PATCH 75/83] Bump anchore/sbom-action from 0.15.11 to 0.16.0 in the ci group (#777) Bumps the ci group with 1 update: [anchore/sbom-action](https://github.com/anchore/sbom-action). Updates `anchore/sbom-action` from 0.15.11 to 0.16.0
    Release notes

    Sourced from anchore/sbom-action's releases.

    v0.16

    Changes in v0.16.0

    • Update Syft to v1.4.1 (#465)
    • Update GitHub artifact client (#463) [kzantow]

    NOTE: if you are using this action within a matrix build and see failures attempting to upload artifacts with duplicate names, you will need to set the artifact-name to be unique based on the matrix properties (an example here). This is due to a change to use a newer GitHub API which no longer allows artifacts with duplicate names.

    Commits
    • e8d2a69 chore(deps): update Syft to v1.4.1 (#465)
    • 610bea4 chore: update GitHub artifact client (#463)
    • 0445e23 chore(deps): bump actions/checkout from 4.1.4 to 4.1.5 (#464)
    • a66e2f3 chore(deps): bump actions/checkout from 4.1.2 to 4.1.4 (#461)
    • 1abd786 chore(deps): bump peter-evans/create-pull-request from 6.0.2 to 6.0.5 (#462)
    • See full diff in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=anchore/sbom-action&package-manager=github_actions&previous-version=0.15.11&new-version=0.16.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Hilmar Falkenberg --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index d44be89180..ad2af17518 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -142,7 +142,7 @@ jobs: go-version-file: '${{ github.workspace }}/go.mod' - name: Setup Syft - uses: anchore/sbom-action/download-syft@7ccf588e3cf3cc2611714c2eeae48550fbc17552 # v0.15.11 + uses: anchore/sbom-action/download-syft@e8d2a6937ecead383dfe75190d104edd1f9c5751 # v0.16.0 - name: Setup Cosign uses: sigstore/cosign-installer@v3.5.0 From b835e96c0b62f47b9b3f42a99f26aa32a05f4866 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 08:45:49 +0000 Subject: [PATCH 76/83] Bump the go group with 11 updates (#778) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the go group with 11 updates: | Package | From | To | | --- | --- | --- | | [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) | `1.27.15` | `1.27.16` | | [github.com/aws/aws-sdk-go-v2/credentials](https://github.com/aws/aws-sdk-go-v2) | `1.17.15` | `1.17.16` | | [github.com/aws/aws-sdk-go-v2/feature/s3/manager](https://github.com/aws/aws-sdk-go-v2) | `1.16.20` | `1.16.21` | | [github.com/aws/aws-sdk-go-v2/service/ecr](https://github.com/aws/aws-sdk-go-v2) | `1.28.2` | `1.28.3` | | [github.com/aws/aws-sdk-go-v2/service/s3](https://github.com/aws/aws-sdk-go-v2) | `1.54.2` | `1.54.3` | | [github.com/containers/image/v5](https://github.com/containers/image) | `5.30.1` | `5.31.0` | | [github.com/go-logr/logr](https://github.com/go-logr/logr) | `1.4.1` | `1.4.2` | | [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) | `2.17.3` | `2.19.0` | | [golang.org/x/exp](https://github.com/golang/exp) | `0.0.0-20240222234643-814bf88cf225` | `0.0.0-20240506185415-9bf2ced13842` | | [helm.sh/helm/v3](https://github.com/helm/helm) | `3.15.0` | `3.15.1` | | [sigs.k8s.io/controller-runtime](https://github.com/kubernetes-sigs/controller-runtime) | `0.18.2` | `0.18.3` | Updates `github.com/aws/aws-sdk-go-v2/config` from 1.27.15 to 1.27.16
    Commits

    Updates `github.com/aws/aws-sdk-go-v2/credentials` from 1.17.15 to 1.17.16
    Commits

    Updates `github.com/aws/aws-sdk-go-v2/feature/s3/manager` from 1.16.20 to 1.16.21
    Commits

    Updates `github.com/aws/aws-sdk-go-v2/service/ecr` from 1.28.2 to 1.28.3
    Commits

    Updates `github.com/aws/aws-sdk-go-v2/service/s3` from 1.54.2 to 1.54.3
    Commits

    Updates `github.com/containers/image/v5` from 5.30.1 to 5.31.0
    Release notes

    Sourced from github.com/containers/image/v5's releases.

    v5.31.0

    What's Changed

    ... (truncated)

    Commits
    • b5a7587 Bump c/image to v5.31.0
    • 21ac79b Merge pull request #2428 from mtrmac/als-toc-fixes
    • 45f4f23 Don't completely ignore already-computed image size if we see an ALS layer
    • 27516f3 Don't modify a storage.Layer returned by c/storage
    • c2327e4 Don't unnecessarily trust the ALS FUSE server about the TOC digest
    • db02dee Merge pull request #2426 from containers/renovate/github.com-containers-stora...
    • 6db27e1 fix(deps): update module github.com/containers/storage to v1.54.0
    • cf26b3c Merge pull request #2416 from ktock/store-tocdigest-id
    • 52101a0 getSize: allow unknown uncompressed size
    • ebbd025 Enable to pass TOCDigest to Additional Layer Store
    • Additional commits viewable in compare view

    Updates `github.com/go-logr/logr` from 1.4.1 to 1.4.2
    Release notes

    Sourced from github.com/go-logr/logr's releases.

    v1.4.2

    What's Changed

    Dependencies:

    Full Changelog: https://github.com/go-logr/logr/compare/v1.4.1...v1.4.2

    Commits
    • 1205f42 Merge pull request #295 from go-logr/dependabot/github_actions/actions/checko...
    • ccedcbd Merge pull request #294 from go-logr/dependabot/github_actions/github/codeql-...
    • bead577 build(deps): bump actions/checkout from 4.1.5 to 4.1.6
    • a492d95 build(deps): bump github/codeql-action from 3.25.4 to 3.25.5
    • 19ad07c build(deps): bump ossf/scorecard-action from 2.3.1 to 2.3.3
    • 1c97a21 build(deps): bump actions/checkout from 4.1.4 to 4.1.5
    • f70c5b5 build(deps): bump github/codeql-action from 3.25.3 to 3.25.4
    • 4ade8d3 build(deps): bump golangci/golangci-lint-action from 5.3.0 to 6.0.1
    • 88d98bd Merge pull request #289 from go-logr/dependabot/github_actions/golangci/golan...
    • 432cd86 Merge pull request #288 from go-logr/dependabot/github_actions/actions/setup-...
    • Additional commits viewable in compare view

    Updates `github.com/onsi/ginkgo/v2` from 2.17.3 to 2.19.0
    Release notes

    Sourced from github.com/onsi/ginkgo/v2's releases.

    v2.19.0

    2.19.0

    Features

    Label Sets allow for more expressive and flexible label filtering.

    v2.18.0

    2.18.0

    Features

    • Add --slience-skips and --force-newlines [f010b65]
    • fail when no tests were run and --fail-on-empty was set [d80eebe]

    Fixes

    • Fix table entry context edge case [42013d6]

    Maintenance

    • Bump golang.org/x/tools from 0.20.0 to 0.21.0 (#1406) [fcf1fd7]
    • Bump github.com/onsi/gomega from 1.33.0 to 1.33.1 (#1399) [8bb14fd]
    • Bump golang.org/x/net from 0.24.0 to 0.25.0 (#1407) [04bfad7]
    Changelog

    Sourced from github.com/onsi/ginkgo/v2's changelog.

    2.19.0

    Features

    Label Sets allow for more expressive and flexible label filtering.

    2.18.0

    Features

    • Add --slience-skips and --force-newlines [f010b65]
    • fail when no tests were run and --fail-on-empty was set [d80eebe]

    Fixes

    • Fix table entry context edge case [42013d6]

    Maintenance

    • Bump golang.org/x/tools from 0.20.0 to 0.21.0 (#1406) [fcf1fd7]
    • Bump github.com/onsi/gomega from 1.33.0 to 1.33.1 (#1399) [8bb14fd]
    • Bump golang.org/x/net from 0.24.0 to 0.25.0 (#1407) [04bfad7]
    Commits
    • 28fb5d6 v2.19.0
    • e31f03a fix another typo
    • 966a28c Fix typos in label sets docs
    • cd231fd Label sets allow for more expressive label filtering
    • eb27ca8 v2.18.0
    • f010b65 Add --slience-skips and --force-newlines
    • 42013d6 Fix table entry context edge case
    • 9e234ea always rebuild and run ginkgo in makefile
    • 5ce8355 add --fail-on-empty to recommended CI flags in docs
    • 3ffbf8b add makefile
    • Additional commits viewable in compare view

    Updates `golang.org/x/exp` from 0.0.0-20240222234643-814bf88cf225 to 0.0.0-20240506185415-9bf2ced13842
    Commits

    Updates `helm.sh/helm/v3` from 3.15.0 to 3.15.1
    Release notes

    Sourced from helm.sh/helm/v3's releases.

    Helm v3.15.1 is a patch release. The Helm application source is the same as 3.15.0. The 3.15.0 builds stated the wrong version when running helm version. Instead of the release number it had the release candidate version which pointed to the same revision of the source.

    The community keeps growing, and we'd love to see you there!

    • Join the discussion in Kubernetes Slack:
      • for questions and just to hang out
      • for discussing PRs, code, and bugs
    • Hang out at the Public Developer Call: Thursday, 9:30 Pacific via Zoom
    • Test, debug, and contribute charts: ArtifactHub/packages

    Installation and Upgrading

    Download Helm v3.15.1. The common platform binaries are here:

    This release was signed with 672C 657B E06B 4B30 969C 4A57 4614 49C2 5E36 B98E and can be found at @​mattfarina keybase account. Please use the attached signatures for verifying this release using gpg.

    The Quickstart Guide will get you going from there. For upgrade instructions or detailed installation notes, check the install guide. You can also use a script to install on any system with bash.

    What's Next

    • 3.15.2 is the next patch release and will be on June 12, 2024.
    • 3.16.0 is the next feature release and will be on September 11, 2024.

    Changelog

    • Fixing build issue where wrong version is used e211f2aa62992bd72586b395de50979e31231829 (Matt Farina)
    Commits

    Updates `sigs.k8s.io/controller-runtime` from 0.18.2 to 0.18.3
    Release notes

    Sourced from sigs.k8s.io/controller-runtime's releases.

    v0.18.3

    What's Changed

    Full Changelog: https://github.com/kubernetes-sigs/controller-runtime/compare/v0.18.2...v0.18.3

    Commits
    • be2f383 Merge pull request #2840 from sbueringer/pr-bump-k8s
    • 4720d17 Bump k8s.io/* to v0.30.1
    • aa9ed14 Merge pull request #2837 from sbueringer/pr-setup-envtest-ct-rel-0.18
    • 35d7bbd default --use-deprecated-gcs to true
    • ce4e4f5 some more deprecations
    • 56dcc14 setup-envtest: allow downloading envtest binaries from controller-tools
    • See full diff in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 40 ++++++++++++------------- go.sum | 95 ++++++++++++++++++++++++++++------------------------------ 2 files changed, 66 insertions(+), 69 deletions(-) diff --git a/go.mod b/go.mod index b4a7f4688a..df7787db42 100644 --- a/go.mod +++ b/go.mod @@ -9,14 +9,14 @@ require ( github.com/InfiniteLoopSpace/go_S-MIME v0.0.0-20181221134359-3f58f9a4b2b6 github.com/Masterminds/semver/v3 v3.2.1 github.com/aws/aws-sdk-go-v2 v1.27.0 - github.com/aws/aws-sdk-go-v2/config v1.27.15 - github.com/aws/aws-sdk-go-v2/credentials v1.17.15 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.20 - github.com/aws/aws-sdk-go-v2/service/ecr v1.28.2 - github.com/aws/aws-sdk-go-v2/service/s3 v1.54.2 + github.com/aws/aws-sdk-go-v2/config v1.27.16 + github.com/aws/aws-sdk-go-v2/credentials v1.17.16 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.21 + github.com/aws/aws-sdk-go-v2/service/ecr v1.28.3 + github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3 github.com/containerd/containerd v1.7.17 github.com/containerd/log v0.1.0 - github.com/containers/image/v5 v5.30.1 + github.com/containers/image/v5 v5.31.0 github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f github.com/distribution/reference v0.6.0 github.com/docker/cli v26.1.3+incompatible @@ -27,7 +27,7 @@ require ( github.com/fluxcd/pkg/ssa v0.39.1 github.com/gertd/go-pluralize v0.2.1 github.com/ghodss/yaml v1.0.0 - github.com/go-logr/logr v1.4.1 + github.com/go-logr/logr v1.4.2 github.com/go-openapi/strfmt v0.23.0 github.com/go-openapi/swag v0.23.0 github.com/go-test/deep v1.1.0 @@ -47,7 +47,7 @@ require ( github.com/mitchellh/copystructure v1.2.0 github.com/mittwald/go-helm-client v0.12.9 github.com/modern-go/reflect2 v1.0.2 - github.com/onsi/ginkgo/v2 v2.17.3 + github.com/onsi/ginkgo/v2 v2.19.0 github.com/onsi/gomega v1.33.1 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.1.0 @@ -63,20 +63,20 @@ require ( github.com/tonglil/buflogr v1.1.1 github.com/ulikunitz/xz v0.5.12 github.com/xeipuuv/gojsonschema v1.2.0 - golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 golang.org/x/net v0.25.0 golang.org/x/oauth2 v0.20.0 golang.org/x/text v0.15.0 gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 gopkg.in/yaml.v3 v3.0.1 - helm.sh/helm/v3 v3.15.0 + helm.sh/helm/v3 v3.15.1 k8s.io/api v0.30.1 k8s.io/apiextensions-apiserver v0.30.1 k8s.io/apimachinery v0.30.1 k8s.io/cli-runtime v0.30.1 k8s.io/client-go v0.30.1 - sigs.k8s.io/controller-runtime v0.18.2 + sigs.k8s.io/controller-runtime v0.18.3 sigs.k8s.io/yaml v1.4.0 ) @@ -101,7 +101,7 @@ require ( github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/Masterminds/squirrel v1.5.4 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/Microsoft/hcsshim v0.12.0-rc.3 // indirect + github.com/Microsoft/hcsshim v0.12.3 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect github.com/ThalesIgnite/crypto11 v1.2.5 // indirect github.com/a8m/envsubst v1.4.2 // indirect @@ -129,9 +129,9 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.9 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.8 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.9 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 // indirect github.com/aws/smithy-go v1.20.2 // indirect github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -150,9 +150,9 @@ require ( github.com/containerd/stargz-snapshotter/estargz v0.15.1 // indirect github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 // indirect github.com/containers/ocicrypt v1.1.10 // indirect - github.com/containers/storage v1.53.0 // indirect + github.com/containers/storage v1.54.0 // indirect github.com/coreos/go-oidc/v3 v3.10.0 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/cyphar/filepath-securejoin v0.2.5 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 // indirect github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7 // indirect @@ -218,7 +218,7 @@ require ( github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.5 // indirect + github.com/hashicorp/go-retryablehttp v0.7.6 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect github.com/hashicorp/hcl v1.0.1-vault-5 // indirect @@ -272,7 +272,7 @@ require ( github.com/prometheus/client_model v0.6.0 // indirect github.com/prometheus/common v0.51.1 // indirect github.com/prometheus/procfs v0.12.0 // indirect - github.com/rivo/uniseg v0.4.4 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/rubenv/sql-migrate v1.6.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect @@ -330,7 +330,7 @@ require ( golang.org/x/sys v0.20.0 // indirect golang.org/x/term v0.20.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.20.0 // indirect + golang.org/x/tools v0.21.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/api v0.172.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240311173647-c811ad7063a7 // indirect diff --git a/go.sum b/go.sum index e06f85114e..8708b4b5d7 100644 --- a/go.sum +++ b/go.sum @@ -79,8 +79,8 @@ github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8 github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/Microsoft/hcsshim v0.12.0-rc.3 h1:5GNGrobGs/sN/0nFO21W9k4lFn+iXXZAE8fCZbmdRak= -github.com/Microsoft/hcsshim v0.12.0-rc.3/go.mod h1:WuNfcaYNaw+KpCEsZCIM6HCEmu0c5HfXpi+dDSmveP0= +github.com/Microsoft/hcsshim v0.12.3 h1:LS9NXqXhMoqNCplK1ApmVSfB4UnVLRDWRapB6EIlxE0= +github.com/Microsoft/hcsshim v0.12.3/go.mod h1:Iyl1WVpZzr+UkzjekHZbV8o5Z9ZkxNGx6CtY2Qg/JVQ= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c h1:kMFnB0vCcX7IL/m9Y5LO+KQYv+t1CQOiFe6+SV2J7bE= @@ -159,14 +159,14 @@ github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgi github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= -github.com/aws/aws-sdk-go-v2/config v1.27.15 h1:uNnGLZ+DutuNEkuPh6fwqK7LpEiPmzb7MIMA1mNWEUc= -github.com/aws/aws-sdk-go-v2/config v1.27.15/go.mod h1:7j7Kxx9/7kTmL7z4LlhwQe63MYEE5vkVV6nWg4ZAI8M= -github.com/aws/aws-sdk-go-v2/credentials v1.17.15 h1:YDexlvDRCA8ems2T5IP1xkMtOZ1uLJOCJdTr0igs5zo= -github.com/aws/aws-sdk-go-v2/credentials v1.17.15/go.mod h1:vxHggqW6hFNaeNC0WyXS3VdyjcV0a4KMUY4dKJ96buU= +github.com/aws/aws-sdk-go-v2/config v1.27.16 h1:knpCuH7laFVGYTNd99Ns5t+8PuRjDn4HnnZK48csipM= +github.com/aws/aws-sdk-go-v2/config v1.27.16/go.mod h1:vutqgRhDUktwSge3hrC3nkuirzkJ4E/mLj5GvI0BQas= +github.com/aws/aws-sdk-go-v2/credentials v1.17.16 h1:7d2QxY83uYl0l58ceyiSpxg9bSbStqBC6BeEeHEchwo= +github.com/aws/aws-sdk-go-v2/credentials v1.17.16/go.mod h1:Ae6li/6Yc6eMzysRL2BXlPYvnrLLBg3D11/AmOjw50k= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 h1:dQLK4TjtnlRGb0czOht2CevZ5l6RSyRWAnKeGd7VAFE= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3/go.mod h1:TL79f2P6+8Q7dTsILpiVST+AL9lkF6PPGI167Ny0Cjw= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.20 h1:NCM9wYaJCmlIWZSO/JwUEveKf0NCvsSgo9V9BwOAolo= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.20/go.mod h1:dmxIx3qriuepxqZgFeFMitFuftWPB94+MZv/6Btpth4= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.21 h1:1v8Ii0MRVGYB/sdhkbxrtolCA7Tp+lGh+5OJTs5vmZ8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.21/go.mod h1:cxdd1rc8yxCjKz28hi30XN1jDXr2DxZvD44vLxTz/bg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 h1:lf/8VTF2cM+N4SLzaYJERKEWAXq8MOMpZfU6wEPWsPk= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7/go.mod h1:4SjkU7QiqK2M9oozyMzfZ/23LmUY+h3oFqhdeP5OMiI= @@ -177,8 +177,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7 h1:/FUtT3xsoHO3cfh+I/kCbcMCN98QZRsiFet/V8QkWSs= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7/go.mod h1:MaCAgWpGooQoCWZnMur97rGn5dp350w2+CeiV5406wE= -github.com/aws/aws-sdk-go-v2/service/ecr v1.28.2 h1:xUpMnRZonKfrHaNLC77IMpWZSUMRRXIi6IU5EhAPsrM= -github.com/aws/aws-sdk-go-v2/service/ecr v1.28.2/go.mod h1:X52zjAVRaXklEU1TE/wO8kyyJSr9cJx9ZsqliWbyRys= +github.com/aws/aws-sdk-go-v2/service/ecr v1.28.3 h1:NsP8PA4Kw1sA6UKl3ZFRIcA9dWomePbmoRIvfOl+HKs= +github.com/aws/aws-sdk-go-v2/service/ecr v1.28.3/go.mod h1:X52zjAVRaXklEU1TE/wO8kyyJSr9cJx9ZsqliWbyRys= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2 h1:PpbXaecV3sLAS6rjQiaKw4/jyq3Z8gNzmoJupHAoBp0= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2/go.mod h1:fUHpGXr4DrXkEDpGAjClPsviWf+Bszeb0daKE0blxv8= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= @@ -191,14 +191,14 @@ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7 h1:uO5XR6QGBcmPyo github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7/go.mod h1:feeeAYfAcwTReM6vbwjEyDmiGho+YgBhaFULuXDW8kc= github.com/aws/aws-sdk-go-v2/service/kms v1.30.0 h1:yS0JkEdV6h9JOo8sy2JSpjX+i7vsKifU8SIeHrqiDhU= github.com/aws/aws-sdk-go-v2/service/kms v1.30.0/go.mod h1:+I8VUUSVD4p5ISQtzpgSva4I8cJ4SQ4b1dcBcof7O+g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.54.2 h1:gYSJhNiOF6J9xaYxu2NFNstoiNELwt0T9w29FxSfN+Y= -github.com/aws/aws-sdk-go-v2/service/s3 v1.54.2/go.mod h1:739CllldowZiPPsDFcJHNF4FXrVxaSGVnZ9Ez9Iz9hc= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.8 h1:Kv1hwNG6jHC/sxMTe5saMjH6t6ZLkgfvVxyEjfWL1ks= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.8/go.mod h1:c1qtZUWtygI6ZdvKppzCSXsDOq5I4luJPZ0Ud3juFCA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.2 h1:nWBZ1xHCF+A7vv9sDzJOq4NWIdzFYm0kH7Pr4OjHYsQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.2/go.mod h1:9lmoVDVLz/yUZwLaQ676TK02fhCu4+PgRSmMaKR1ozk= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.9 h1:Qp6Boy0cGDloOE3zI6XhNLNZgjNS8YmiFQFHe71SaW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.9/go.mod h1:0Aqn1MnEuitqfsCNyKsdKLhDUOr4txD/g19EfiUqgws= +github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3 h1:57NtjG+WLims0TxIQbjTqebZUKDM03DfM11ANAekW0s= +github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3/go.mod h1:739CllldowZiPPsDFcJHNF4FXrVxaSGVnZ9Ez9Iz9hc= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 h1:aD7AGQhvPuAxlSUfo0CWU7s6FpkbyykMhGYMvlqTjVs= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.9/go.mod h1:c1qtZUWtygI6ZdvKppzCSXsDOq5I4luJPZ0Ud3juFCA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 h1:Pav5q3cA260Zqez42T9UhIlsd9QeypszRPwC9LdSSsQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3/go.mod h1:9lmoVDVLz/yUZwLaQ676TK02fhCu4+PgRSmMaKR1ozk= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 h1:69tpbPED7jKPyzMcrwSvhWcJ9bPnZsZs18NT40JwM0g= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.10/go.mod h1:0Aqn1MnEuitqfsCNyKsdKLhDUOr4txD/g19EfiUqgws= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= @@ -264,8 +264,8 @@ github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AX github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= -github.com/containerd/cgroups/v3 v3.0.2 h1:f5WFqIVSgo5IZmtTT3qVBo6TzI1ON6sycSBKkymb9L0= -github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE= +github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= +github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= github.com/containerd/containerd v1.7.17 h1:KjNnn0+tAVQHAoaWRjmdak9WlvnFR/8rU1CHHy8Rm2A= github.com/containerd/containerd v1.7.17/go.mod h1:vK+hhT4TIv2uejlcDlbVIc8+h/BqtKLIyNrtCZol8lI= github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= @@ -276,14 +276,14 @@ github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/stargz-snapshotter/estargz v0.15.1 h1:eXJjw9RbkLFgioVaTG+G/ZW/0kEe2oEKCdS/ZxIyoCU= github.com/containerd/stargz-snapshotter/estargz v0.15.1/go.mod h1:gr2RNwukQ/S9Nv33Lt6UC7xEx58C+LHRdoqbEKjz1Kk= -github.com/containers/image/v5 v5.30.1 h1:AKrQMgOKI1oKx5FW5eoU2xoNyzACajHGx1O3qxobvFM= -github.com/containers/image/v5 v5.30.1/go.mod h1:gSD8MVOyqBspc0ynLsuiMR9qmt8UQ4jpVImjmK0uXfk= +github.com/containers/image/v5 v5.31.0 h1:eDFVlz5XaYICxe9dXpf23htEKvyosgkl62mJlIATXE4= +github.com/containers/image/v5 v5.31.0/go.mod h1:5QfOqSackPkSbF7Qxc1DnVNnPJKQ+KWLkfEfDpK590Q= github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 h1:Qzk5C6cYglewc+UyGf6lc8Mj2UaPTHy/iF2De0/77CA= github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY= github.com/containers/ocicrypt v1.1.10 h1:r7UR6o8+lyhkEywetubUUgcKFjOWOaWz8cEBrCPX0ic= github.com/containers/ocicrypt v1.1.10/go.mod h1:YfzSSr06PTHQwSTUKqDSjish9BeW1E4HUmreluQcMd8= -github.com/containers/storage v1.53.0 h1:VSES3C/u1pxjTJIXvLrSmyP7OBtDky04oGu07UvdTEA= -github.com/containers/storage v1.53.0/go.mod h1:pujcoOSc+upx15Jirdkebhtd8uJiLwbSd/mYT6zDJK8= +github.com/containers/storage v1.54.0 h1:xwYAlf6n9OnIlURQLLg3FYHbO74fQ/2W2N6EtQEUM4I= +github.com/containers/storage v1.54.0/go.mod h1:PlMOoinRrBSnhYODLxt4EXl0nmJt+X0kjG0Xdt9fMTw= github.com/coreos/go-oidc/v3 v3.10.0 h1:tDnXHnLyiTVyT/2zLDGj09pFPkhND8Gl8lnTRhoEaJU= github.com/coreos/go-oidc/v3 v3.10.0/go.mod h1:5j11xcw0D3+SGxn6Z/WFADsgcWVMyNAlSQupk0KK3ac= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -292,8 +292,8 @@ github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f h1:eHnXnuK47UlSTOQexbzxAZfekVz6i+LKRdj1CU5DPaM= github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo= +github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/danieljoos/wincred v1.2.1 h1:dl9cBrupW8+r5250DYkYxocLeZ1Y4vB1kxgtjxw8GQs= github.com/danieljoos/wincred v1.2.1/go.mod h1:uGaFL9fDn3OLTvzCGulzE+SzjEe5NGlh5FdCcyfPwps= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -401,8 +401,8 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= @@ -570,13 +570,12 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= -github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-retryablehttp v0.7.6 h1:TwRYfx2z2C4cLbXmT8I5PgP/xmuqASDyiVuGYfs9GZM= +github.com/hashicorp/go-retryablehttp v0.7.6/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 h1:UpiO20jno/eV1eVZcxqWnUohyKRe1g8FPV/xH1s/2qs= @@ -682,8 +681,6 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3 h1:oo9nIgnyiBgYPbcZslRT4y29siuL5EoNJ/t1tr0xEVQ= github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3/go.mod h1:LxhqC7khDoRENwooP6f/vWvia9ivj6TqLYrR39zqkN0= -github.com/mandelsoft/goutils v0.0.0-20240510154642-0f1a031c54cb h1:1d3Xxk4rkdKcIFP1AcRlPxUhcBhnFCTqrMhXztB1r5E= -github.com/mandelsoft/goutils v0.0.0-20240510154642-0f1a031c54cb/go.mod h1:EbNqk9JceSMq7MJuALB/vlOpoD4MAGE0TenM9TR+C0o= github.com/mandelsoft/goutils v0.0.0-20240523093855-5385ed52b460 h1:q44fRqo/PC3eTexd8Q3pO2BTHTABVXsW6DBXRUhC97E= github.com/mandelsoft/goutils v0.0.0-20240523093855-5385ed52b460/go.mod h1:EbNqk9JceSMq7MJuALB/vlOpoD4MAGE0TenM9TR+C0o= github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf h1:WEmgzeArDbp6Aw34jmziMIE5ygo2zpl/atXRq3D7lSw= @@ -777,8 +774,8 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.17.3 h1:oJcvKpIb7/8uLpDDtnQuf18xVnwKp8DTD7DQ6gTd/MU= -github.com/onsi/ginkgo/v2 v2.17.3/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -850,8 +847,8 @@ github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf/go.mod h1 github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rubenv/sql-migrate v1.6.0 h1:IZpcTlAx/VKXphWEpwWJ7BaMq05tYtE80zYz+8a5Il8= @@ -1034,8 +1031,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0 h1:9M3+rhx7kZCIQQhQRYa go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0/go.mod h1:noq80iT8rrHP1SfybmPiRGc9dc5M8RPmGvtwo7Oo7tc= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.22.0 h1:H2JFgRcGiyHg7H7bwcwaQJYrNFqCqrbTQ8K4p1OvDu8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.22.0/go.mod h1:WfCWp1bGoYK8MeULtI15MmQVczfR+bFkk0DF3h06QmQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= go.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA= go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s= go.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo= @@ -1079,8 +1076,8 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -1220,8 +1217,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= -golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= +golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= +golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1302,8 +1299,8 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -helm.sh/helm/v3 v3.15.0 h1:gcLxHeFp0Hfo7lYi6KIZ84ZyvlAnfFRSJ8lTL3zvG5U= -helm.sh/helm/v3 v3.15.0/go.mod h1:fvfoRcB8UKRUV5jrIfOTaN/pG1TPhuqSb56fjYdTKXg= +helm.sh/helm/v3 v3.15.1 h1:22ztacHz4gMqhXNqCQ9NAg6BFWoRUryNLvnkz6OVyw0= +helm.sh/helm/v3 v3.15.1/go.mod h1:fvfoRcB8UKRUV5jrIfOTaN/pG1TPhuqSb56fjYdTKXg= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/api v0.30.1 h1:kCm/6mADMdbAxmIh0LBjS54nQBE+U4KmbCfIkF5CpJY= @@ -1330,8 +1327,8 @@ k8s.io/utils v0.0.0-20240310230437-4693a0247e57 h1:gbqbevonBh57eILzModw6mrkbwM0g k8s.io/utils v0.0.0-20240310230437-4693a0247e57/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo= -sigs.k8s.io/controller-runtime v0.18.2 h1:RqVW6Kpeaji67CY5nPEfRz6ZfFMk0lWQlNrLqlNpx+Q= -sigs.k8s.io/controller-runtime v0.18.2/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw= +sigs.k8s.io/controller-runtime v0.18.3 h1:B5Wmmo8WMWK7izei+2LlXLVDGzMwAHBNLX68lwtlSR4= +sigs.k8s.io/controller-runtime v0.18.3/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kustomize/api v0.17.1 h1:MYJBOP/yQ3/5tp4/sf6HiiMfNNyO97LmtnirH9SLNr4= From ab463b22515b7829a39b2701876c58a7ad1efa46 Mon Sep 17 00:00:00 2001 From: Gergely Brautigam <182850+Skarlso@users.noreply.github.com> Date: Mon, 27 May 2024 16:48:46 +0200 Subject: [PATCH 77/83] fix: only have yaml out put on stdout if dryrun is enabled (#780) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description https://github.com/open-component-model/ocm-project/issues/67 ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Related Issue # (issue) - Closes # (issue) - Fixes # (issue) > Remove if not applicable ## Screenshots ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- .../ocm/commands/controllercmds/common/log.go | 19 +++++++++++++++++++ .../controllercmds/common/manifests.go | 10 +++++----- .../commands/controllercmds/install/cmd.go | 11 +++++------ .../controllercmds/install/cmd_test.go | 11 ++--------- .../install/install_cert_manager.go | 7 +++---- .../controllercmds/uninstall/cmd_test.go | 5 ++--- 6 files changed, 36 insertions(+), 27 deletions(-) create mode 100644 cmds/ocm/commands/controllercmds/common/log.go diff --git a/cmds/ocm/commands/controllercmds/common/log.go b/cmds/ocm/commands/controllercmds/common/log.go new file mode 100644 index 0000000000..7793b26cdc --- /dev/null +++ b/cmds/ocm/commands/controllercmds/common/log.go @@ -0,0 +1,19 @@ +package common + +import ( + "fmt" + + "github.com/open-component-model/ocm/pkg/out" +) + +func Outf(ctx out.Context, dryRun bool, msg string, args ...any) (int, error) { + if dryRun { + return -1, nil + } + + if len(args) == 0 { + return fmt.Fprint(ctx.StdOut(), msg) + } + + return fmt.Fprintf(ctx.StdOut(), msg, args...) +} diff --git a/cmds/ocm/commands/controllercmds/common/manifests.go b/cmds/ocm/commands/controllercmds/common/manifests.go index 9e603e67ff..bf1a5b07d9 100644 --- a/cmds/ocm/commands/controllercmds/common/manifests.go +++ b/cmds/ocm/commands/controllercmds/common/manifests.go @@ -27,7 +27,7 @@ func Install(ctx context.Context, octx clictx.Context, sm *ssa.ResourceManager, return fmt.Errorf("βœ— failed to apply manifests: %w", err) } - out.Outf(octx, "β–Ί waiting for ocm deployment to be ready\n") + Outf(octx, dryRun, "β–Ί waiting for ocm deployment to be ready\n") if err = sm.Wait(objects, ssa.DefaultWaitOptions()); err != nil { return fmt.Errorf("βœ— failed to wait for objects to be ready: %w", err) } @@ -50,7 +50,7 @@ func Uninstall(ctx context.Context, octx clictx.Context, sm *ssa.ResourceManager return fmt.Errorf("βœ— failed to delete manifests: %w", err) } - out.Outf(octx, "β–Ί waiting for ocm deployment to be deleted\n") + Outf(octx, dryRun, "β–Ί waiting for ocm deployment to be deleted\n") if err = sm.WaitForTermination(objects, ssa.DefaultWaitOptions()); err != nil { return fmt.Errorf("βœ— failed to wait for objects to be deleted: %w", err) } @@ -64,7 +64,7 @@ func fetchObjects(ctx context.Context, octx clictx.Context, releaseURL, baseURL, if err != nil { return nil, fmt.Errorf("βœ— failed to retrieve latest version for %s: %w", manifest, err) } - out.Outf(octx, "β–Ί got latest version %q\n", latest) + Outf(octx, dryRun, "β–Ί got latest version %q\n", latest) version = latest } else { exists, err := existingVersion(ctx, releaseURL, version) @@ -90,7 +90,7 @@ func fetchObjects(ctx context.Context, octx clictx.Context, releaseURL, baseURL, if _, err := os.Stat(path); os.IsNotExist(err) { return nil, fmt.Errorf("βœ— failed to find %s file at location: %w", filename, err) } - out.Outf(octx, "βœ” successfully fetched install file\n") + Outf(octx, dryRun, "βœ” successfully fetched install file\n") if dryRun { content, err := os.ReadFile(path) if err != nil { @@ -101,7 +101,7 @@ func fetchObjects(ctx context.Context, octx clictx.Context, releaseURL, baseURL, return nil, nil } - out.Outf(octx, "β–Ί applying to cluster...\n") + Outf(octx, dryRun, "β–Ί applying to cluster...\n") objects, err := ReadObjects(path) if err != nil { diff --git a/cmds/ocm/commands/controllercmds/install/cmd.go b/cmds/ocm/commands/controllercmds/install/cmd.go index 873786f0ea..5d5a5b8bea 100644 --- a/cmds/ocm/commands/controllercmds/install/cmd.go +++ b/cmds/ocm/commands/controllercmds/install/cmd.go @@ -19,7 +19,6 @@ import ( "github.com/open-component-model/ocm/cmds/ocm/commands/verbs" "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/contexts/clictx" - "github.com/open-component-model/ocm/pkg/out" ) var ( @@ -97,22 +96,22 @@ func (o *Command) Run() (err error) { ctx := context.Background() if !o.SkipPreFlightCheck { - out.Outf(o.Context, "β–Ί running pre-install check\n") + common.Outf(o.Context, o.DryRun, "β–Ί running pre-install check\n") if err := o.RunPreFlightCheck(ctx); err != nil { if o.InstallPrerequisites { - out.Outf(o.Context, "β–Ί installing prerequisites\n") + common.Outf(o.Context, o.DryRun, "β–Ί installing prerequisites\n") if err := o.installPrerequisites(ctx); err != nil { return err } - out.Outf(o.Context, "βœ” successfully installed prerequisites\n") + common.Outf(o.Context, o.DryRun, "βœ” successfully installed prerequisites\n") } else { return fmt.Errorf("βœ— failed to run pre-flight check: %w\n", err) } } } - out.Outf(o.Context, "β–Ί installing ocm-controller with version %s\n", o.Version) + common.Outf(o.Context, o.DryRun, "β–Ί installing ocm-controller with version %s\n", o.Version) version := o.Version if err := common.Install( ctx, @@ -128,7 +127,7 @@ func (o *Command) Run() (err error) { return err } - out.Outf(o.Context, "βœ” ocm-controller successfully installed\n") + common.Outf(o.Context, o.DryRun, "βœ” ocm-controller successfully installed\n") return nil } diff --git a/cmds/ocm/commands/controllercmds/install/cmd_test.go b/cmds/ocm/commands/controllercmds/install/cmd_test.go index 9b8f5a31e3..dae47175a0 100644 --- a/cmds/ocm/commands/controllercmds/install/cmd_test.go +++ b/cmds/ocm/commands/controllercmds/install/cmd_test.go @@ -50,21 +50,14 @@ var _ = Describe("Test Environment", func() { It("install latest version", func() { buf := bytes.NewBuffer(nil) Expect(env.CatchOutput(buf).Execute("controller", "install", "-d", "-s", "-u", testServer.URL, "-a", testServer.URL)).To(Succeed()) - Expect(buf.String()).To(StringEqualTrimmedWithContext(`β–Ί installing ocm-controller with version latest -β–Ί got latest version "v0.0.1-test" -βœ” successfully fetched install file -test: content -βœ” ocm-controller successfully installed + Expect(buf.String()).To(StringEqualTrimmedWithContext(`test: content `)) }) It("install specific version", func() { buf := bytes.NewBuffer(nil) Expect(env.CatchOutput(buf).Execute("controller", "install", "-d", "-s", "-u", testServer.URL, "-a", testServer.URL, "-v", "v0.1.0-test-2")).To(Succeed()) - Expect(buf.String()).To(StringEqualTrimmedWithContext(`β–Ί installing ocm-controller with version v0.1.0-test-2 -βœ” successfully fetched install file -test: content -βœ” ocm-controller successfully installed + Expect(buf.String()).To(StringEqualTrimmedWithContext(`test: content `)) }) }) diff --git a/cmds/ocm/commands/controllercmds/install/install_cert_manager.go b/cmds/ocm/commands/controllercmds/install/install_cert_manager.go index 8fe2a325a1..089ec79fc0 100644 --- a/cmds/ocm/commands/controllercmds/install/install_cert_manager.go +++ b/cmds/ocm/commands/controllercmds/install/install_cert_manager.go @@ -11,26 +11,25 @@ import ( "github.com/mandelsoft/filepath/pkg/filepath" "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/common" - "github.com/open-component-model/ocm/pkg/out" ) //go:embed issuer/registry_certificate.yaml var issuer []byte func (o *Command) installPrerequisites(ctx context.Context) error { - out.Outf(o.Context, "β–Ί installing cert-manager with version %s\n", o.CertManagerVersion) + common.Outf(o.Context, o.DryRun, "β–Ί installing cert-manager with version %s\n", o.CertManagerVersion) if err := common.Install(ctx, o.Context, o.SM, o.CertManagerReleaseAPIURL, o.CertManagerBaseURL, "cert-manager", "cert-manager.yaml", o.CertManagerVersion, o.DryRun); err != nil { return err } - out.Outf(o.Context, "βœ” cert-manager successfully installed\n") + common.Outf(o.Context, o.DryRun, "βœ” cert-manager successfully installed\n") if o.DryRun { return nil } - out.Outf(o.Context, "β–Ί creating certificate for internal registry\n") + common.Outf(o.Context, o.DryRun, "β–Ί creating certificate for internal registry\n") if err := o.createRegistryCertificate(); err != nil { return fmt.Errorf("βœ— failed to create registry certificate: %w", err) diff --git a/cmds/ocm/commands/controllercmds/uninstall/cmd_test.go b/cmds/ocm/commands/controllercmds/uninstall/cmd_test.go index a9559d69ba..d6316b5894 100644 --- a/cmds/ocm/commands/controllercmds/uninstall/cmd_test.go +++ b/cmds/ocm/commands/controllercmds/uninstall/cmd_test.go @@ -50,9 +50,8 @@ var _ = Describe("Test Environment", func() { It("uninstall latest version", func() { buf := bytes.NewBuffer(nil) Expect(env.CatchOutput(buf).Execute("controller", "uninstall", "-d", "-u", testServer.URL, "-a", testServer.URL)).To(Succeed()) + fmt.Println(buf.String()) Expect(buf.String()).To(StringEqualTrimmedWithContext(`β–Ί uninstalling ocm-controller with version latest -β–Ί got latest version "v0.0.1-test" -βœ” successfully fetched install file test: content βœ” ocm-controller successfully uninstalled `)) @@ -61,8 +60,8 @@ test: content It("uninstall specific version", func() { buf := bytes.NewBuffer(nil) Expect(env.CatchOutput(buf).Execute("controller", "uninstall", "-d", "-u", testServer.URL, "-a", testServer.URL, "-v", "v0.1.0-test-2")).To(Succeed()) + fmt.Println(buf.String()) Expect(buf.String()).To(StringEqualTrimmedWithContext(`β–Ί uninstalling ocm-controller with version v0.1.0-test-2 -βœ” successfully fetched install file test: content βœ” ocm-controller successfully uninstalled `)) From 509ba8913fb4ee6382226b1ce5fbe8179812f848 Mon Sep 17 00:00:00 2001 From: Fabian Burth Date: Tue, 28 May 2024 19:37:05 +0200 Subject: [PATCH 78/83] Follow Up To Maven Access (#781) ## Description This Pull Request is a follow up to the [Pull Request](https://github.com/open-component-model/ocm/pull/731) adding a Maven Access Method. This Pull Request adds a corresponding input type, a blob access and corresponding helper methods in the elements package (and therefore makes several adjustments). --- .golangci.yaml | 3 + .../controllercmds/common/manifests.go | 3 +- .../commands/controllercmds/install/cmd.go | 2 +- .../commands/controllercmds/uninstall/cmd.go | 7 +- .../uninstall/uninstall_cert_manager.go | 4 +- .../commands/misccmds/credentials/get/cmd.go | 2 +- .../commands/ocmcmds/common/addhdlrs/utils.go | 2 +- .../common/handlers/pluginhdlr/typehandler.go | 2 +- .../common/handlers/vershdlr/typehandler.go | 2 +- .../ocmcmds/common/inputs/options/standard.go | 11 +- .../ocmcmds/common/inputs/types/init.go | 1 + .../ocmcmds/common/inputs/types/maven/cli.go | 32 ++ .../common/inputs/types/maven/input_test.go | 96 ++++ .../ocmcmds/common/inputs/types/maven/spec.go | 99 ++++ .../common/inputs/types/maven}/suite_test.go | 4 +- .../types/maven/testdata/resources1.yaml | 8 + .../ocmcmds/common/inputs/types/maven/type.go | 43 ++ .../common/options/schemaoption/option.go | 2 +- cmds/ocm/commands/ocmcmds/common/resources.go | 4 +- cmds/ocm/commands/ocmcmds/common/utils.go | 2 +- .../commands/ocmcmds/components/add/cmd.go | 2 +- .../ocmcmds/components/download/cmd.go | 2 +- .../ocmcmds/components/transfer/cmd.go | 2 +- cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go | 2 +- .../commands/ocmcmds/plugins/install/cmd.go | 2 +- .../commands/toicmds/package/bootstrap/cmd.go | 2 +- .../commands/toicmds/package/describe/cmd.go | 2 +- cmds/ocm/commands/verbs/controller/cmd.go | 2 +- cmds/ocm/pkg/utils/command.go | 2 +- cmds/ocm/pkg/utils/handling.go | 1 + .../plugin_accessmethod_compose.md | 7 +- docs/pluginreference/plugin_descriptor.md | 7 +- .../plugin_valueset_compose.md | 7 +- .../ocm_add_resource-configuration.md | 65 ++- docs/reference/ocm_add_resources.md | 65 ++- .../reference/ocm_add_source-configuration.md | 65 ++- docs/reference/ocm_add_sources.md | 65 ++- docs/reference/ocm_logging.md | 3 +- docs/reference/ocm_ocm-accessmethods.md | 20 +- docs/reference/ocm_ocm-uploadhandlers.md | 8 +- .../ocm_transfer_commontransportarchive.md | 8 +- .../ocm_transfer_componentversions.md | 8 +- .../lib/tour/01-getting-started/README.md | 14 +- .../01-basic-componentversion-creation.go | 2 +- .../README.md | 2 +- .../03-working-with-credentials/common.go | 2 +- .../common.go | 2 +- .../06-signing-component-versions/common.go | 2 +- go.mod | 3 +- go.sum | 4 +- pkg/blobaccess/maven/access.go | 38 ++ pkg/blobaccess/maven/access_test.go | 125 +++++ pkg/blobaccess/maven/maven.go | 36 ++ pkg/blobaccess/maven/options.go | 204 ++++++++ pkg/blobaccess/maven/suite_test.go | 13 + pkg/blobaccess/maven/utils.go | 167 +++++++ pkg/blobaccess/standard.go | 17 + pkg/blobaccess/wget/options.go | 3 + pkg/common/accessio/retry_test.go | 1 + pkg/common/accessobj/cachedblob.go | 6 +- pkg/contexts/config/gc_test.go | 2 +- .../{mvn => maven}/identity/identity.go | 28 +- pkg/contexts/credentials/gc_test.go | 2 +- .../repositories/npm/repository_test.go | 2 +- .../repositories/vault/repo_int_test.go | 33 +- .../repositories/vault/repo_test.go | 2 +- .../datacontext/attrs/tmpcache/attr.go | 18 +- .../datacontext/attrs/vfsattr/attr.go | 2 +- pkg/contexts/oci/gc_test.go | 2 +- pkg/contexts/oci/repositories/ctf/ctf_test.go | 2 +- pkg/contexts/ocm/accessmethods/init.go | 2 +- .../accessmethods/{mvn => maven}/README.md | 0 .../ocm/accessmethods/{mvn => maven}/cli.go | 22 +- .../ocm/accessmethods/maven/method.go | 159 +++++++ .../ocm/accessmethods/maven/method_test.go | 133 ++++++ .../mvn => accessmethods/maven}/suite_test.go | 4 +- .../ocm/accessmethods/mvn/coordinates.go | 144 ------ .../ocm/accessmethods/mvn/coordinates_test.go | 55 --- .../ocm/accessmethods/mvn/integration_test.go | 98 ---- pkg/contexts/ocm/accessmethods/mvn/method.go | 444 ------------------ .../ocm/accessmethods/mvn/method_test.go | 87 ---- .../ocm/accessmethods/options/standard.go | 9 +- .../ocm/accessmethods/wget/options.go | 15 - .../handlers/generic/maven/blobhandler.go | 126 +++++ .../generic/maven/blobhandler_test.go | 101 ++++ .../generic/{mvn => maven}/registration.go | 60 ++- .../{mvn => maven}/registration_test.go | 12 +- .../handlers/generic/maven/suite_test.go | 13 + .../handlers/generic/mvn/blobhandler.go | 180 ------- .../handlers/generic/mvn/blobhandler_test.go | 43 -- .../handlers/generic/npm/registration_test.go | 2 +- pkg/contexts/ocm/blobhandler/handlers/init.go | 2 +- pkg/contexts/ocm/cpi/builder.go | 50 ++ pkg/contexts/ocm/cpi/interface.go | 4 - .../artifactaccess/mavenaccess/options.go | 20 + .../artifactaccess/mavenaccess/resource.go | 39 ++ .../artifactaccess/mvnaccess/resource.go | 30 -- .../artifactblob/helmblob/helmblob_test.go | 37 ++ .../artifactblob/helmblob/suite_test.go | 13 + .../helmblob/testdata/testchart1/.helmignore | 23 + .../testdata/testchart1/.idea/somefile | 0 .../helmblob/testdata/testchart1/Chart.yaml | 24 + .../testdata/testchart1/templates/NOTES.txt | 22 + .../testchart1/templates/_helpers.tpl | 62 +++ .../testchart1/templates/deployment.yaml | 61 +++ .../testdata/testchart1/templates/hpa.yaml | 28 ++ .../testchart1/templates/ingress.yaml | 61 +++ .../testchart1/templates/service.yaml | 15 + .../testchart1/templates/serviceaccount.yaml | 12 + .../templates/tests/test-connection.yaml | 15 + .../helmblob/testdata/testchart1/values.yaml | 81 ++++ .../helmblob/testdata/testchart2/.helmignore | 23 + .../testdata/testchart2/.idea/somefile | 0 .../helmblob/testdata/testchart2/Chart.yaml | 24 + .../testdata/testchart2/templates/NOTES.txt | 22 + .../testchart2/templates/_helpers.tpl | 62 +++ .../testchart2/templates/deployment.yaml | 61 +++ .../testdata/testchart2/templates/hpa.yaml | 28 ++ .../testchart2/templates/ingress.yaml | 61 +++ .../testchart2/templates/service.yaml | 15 + .../testchart2/templates/serviceaccount.yaml | 12 + .../templates/tests/test-connection.yaml | 15 + .../helmblob/testdata/testchart2/values.yaml | 81 ++++ .../artifactblob/mavenblob/access_test.go | 61 +++ .../artifactblob/mavenblob/options.go | 96 ++++ .../artifactblob/mavenblob/resource.go | 43 ++ .../artifactblob/mavenblob/suite_test.go | 13 + .../elements/artifactblob/textblob/options.go | 2 +- .../artifactblob/wgetblob/resource.go | 2 +- pkg/contexts/ocm/gc_test.go | 2 +- pkg/contexts/ocm/plugin/cache/updater.go | 2 +- .../repositories/genericocireg/repo_test.go | 3 +- pkg/contexts/ocm/resourcetypes/const.go | 4 +- pkg/contexts/ocm/transfer/autohandler_test.go | 1 + pkg/contexts/ocm/utils/localize/format.go | 2 +- pkg/env/env.go | 96 +++- pkg/exception/exception_test.go | 1 + pkg/iotools/hashReaderWriter.go | 140 +++--- pkg/iotools/hashReaderWriter_test.go | 49 +- pkg/maven/access.go | 407 ++++++++++++++++ pkg/maven/access_test.go | 132 ++++++ pkg/maven/coordinates.go | 218 +++++++++ pkg/maven/coordinates_test.go | 52 ++ pkg/maven/logging.go | 7 + pkg/maven/maventest/testdata.go | 9 + .../fail/test/repository/42/repository-42.pom | 0 .../test/repository/42/repository-42.pom.sha1 | 0 .../sdk-modules-bom-5.7.0-random-content.json | 1 + ...modules-bom-5.7.0-random-content.json.sha1 | 1 + .../sdk-modules-bom-5.7.0-random-content.txt | 1 + ...-modules-bom-5.7.0-random-content.txt.sha1 | 1 + .../5.7.0/sdk-modules-bom-5.7.0-sources.jar | Bin 0 -> 595 bytes .../sdk-modules-bom-5.7.0-sources.jar.sha1 | 1 + .../5.7.0/sdk-modules-bom-5.7.0.jar | Bin 0 -> 595 bytes .../5.7.0/sdk-modules-bom-5.7.0.jar.sha1 | 1 + .../5.7.0/sdk-modules-bom-5.7.0.pom | 0 .../5.7.0/sdk-modules-bom-5.7.0.pom.sha1 | 0 pkg/maven/suite_test.go | 13 + pkg/maven/utils.go | 37 ++ pkg/optionutils/utils.go | 7 + pkg/refmgmt/finalized/finalized_test.go | 2 +- pkg/testutils/tcp.go | 30 ++ pkg/utils/package.go | 44 ++ 163 files changed, 4145 insertions(+), 1458 deletions(-) create mode 100644 cmds/ocm/commands/ocmcmds/common/inputs/types/maven/cli.go create mode 100644 cmds/ocm/commands/ocmcmds/common/inputs/types/maven/input_test.go create mode 100644 cmds/ocm/commands/ocmcmds/common/inputs/types/maven/spec.go rename {pkg/contexts/ocm/accessmethods/mvn => cmds/ocm/commands/ocmcmds/common/inputs/types/maven}/suite_test.go (72%) create mode 100644 cmds/ocm/commands/ocmcmds/common/inputs/types/maven/testdata/resources1.yaml create mode 100644 cmds/ocm/commands/ocmcmds/common/inputs/types/maven/type.go create mode 100644 pkg/blobaccess/maven/access.go create mode 100644 pkg/blobaccess/maven/access_test.go create mode 100644 pkg/blobaccess/maven/maven.go create mode 100644 pkg/blobaccess/maven/options.go create mode 100644 pkg/blobaccess/maven/suite_test.go create mode 100644 pkg/blobaccess/maven/utils.go rename pkg/contexts/credentials/builtin/{mvn => maven}/identity/identity.go (67%) rename pkg/contexts/ocm/accessmethods/{mvn => maven}/README.md (100%) rename pkg/contexts/ocm/accessmethods/{mvn => maven}/cli.go (73%) create mode 100644 pkg/contexts/ocm/accessmethods/maven/method.go create mode 100644 pkg/contexts/ocm/accessmethods/maven/method_test.go rename pkg/contexts/ocm/{blobhandler/handlers/generic/mvn => accessmethods/maven}/suite_test.go (72%) delete mode 100644 pkg/contexts/ocm/accessmethods/mvn/coordinates.go delete mode 100644 pkg/contexts/ocm/accessmethods/mvn/coordinates_test.go delete mode 100644 pkg/contexts/ocm/accessmethods/mvn/integration_test.go delete mode 100644 pkg/contexts/ocm/accessmethods/mvn/method.go delete mode 100644 pkg/contexts/ocm/accessmethods/mvn/method_test.go create mode 100644 pkg/contexts/ocm/blobhandler/handlers/generic/maven/blobhandler.go create mode 100644 pkg/contexts/ocm/blobhandler/handlers/generic/maven/blobhandler_test.go rename pkg/contexts/ocm/blobhandler/handlers/generic/{mvn => maven}/registration.go (51%) rename pkg/contexts/ocm/blobhandler/handlers/generic/{mvn => maven}/registration_test.go (58%) create mode 100644 pkg/contexts/ocm/blobhandler/handlers/generic/maven/suite_test.go delete mode 100644 pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler.go delete mode 100644 pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler_test.go create mode 100644 pkg/contexts/ocm/cpi/builder.go create mode 100644 pkg/contexts/ocm/elements/artifactaccess/mavenaccess/options.go create mode 100644 pkg/contexts/ocm/elements/artifactaccess/mavenaccess/resource.go delete mode 100644 pkg/contexts/ocm/elements/artifactaccess/mvnaccess/resource.go create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/helmblob_test.go create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/suite_test.go create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/.helmignore create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/.idea/somefile create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/Chart.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/NOTES.txt create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/_helpers.tpl create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/deployment.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/hpa.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/ingress.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/service.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/serviceaccount.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/tests/test-connection.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/values.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/.helmignore create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/.idea/somefile create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/Chart.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/NOTES.txt create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/_helpers.tpl create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/deployment.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/hpa.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/ingress.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/service.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/serviceaccount.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/tests/test-connection.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/values.yaml create mode 100644 pkg/contexts/ocm/elements/artifactblob/mavenblob/access_test.go create mode 100644 pkg/contexts/ocm/elements/artifactblob/mavenblob/options.go create mode 100644 pkg/contexts/ocm/elements/artifactblob/mavenblob/resource.go create mode 100644 pkg/contexts/ocm/elements/artifactblob/mavenblob/suite_test.go create mode 100644 pkg/maven/access.go create mode 100644 pkg/maven/access_test.go create mode 100644 pkg/maven/coordinates.go create mode 100644 pkg/maven/coordinates_test.go create mode 100644 pkg/maven/logging.go create mode 100644 pkg/maven/maventest/testdata.go rename pkg/{contexts/ocm/accessmethods/mvn/testdata => maven/maventest/testdata/.m2}/fail/test/repository/42/repository-42.pom (100%) rename pkg/{contexts/ocm/accessmethods/mvn/testdata => maven/maventest/testdata/.m2}/fail/test/repository/42/repository-42.pom.sha1 (100%) create mode 100644 pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.json create mode 100644 pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.json.sha1 create mode 100644 pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.txt create mode 100644 pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.txt.sha1 create mode 100644 pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-sources.jar create mode 100644 pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-sources.jar.sha1 create mode 100644 pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0.jar create mode 100644 pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0.jar.sha1 rename pkg/{contexts/ocm/accessmethods/mvn => maven/maventest}/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0.pom (100%) rename pkg/{contexts/ocm/accessmethods/mvn => maven/maventest}/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0.pom.sha1 (100%) create mode 100644 pkg/maven/suite_test.go create mode 100644 pkg/maven/utils.go create mode 100644 pkg/optionutils/utils.go create mode 100644 pkg/testutils/tcp.go create mode 100644 pkg/utils/package.go diff --git a/.golangci.yaml b/.golangci.yaml index 8a105b4382..9e4ab89249 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -134,6 +134,9 @@ linters-settings: line-length: 120 gosec: exclude-generated: true + gocritic: + disabled-checks: + - elseif issues: exclude: diff --git a/cmds/ocm/commands/controllercmds/common/manifests.go b/cmds/ocm/commands/controllercmds/common/manifests.go index bf1a5b07d9..c54bc5a7c6 100644 --- a/cmds/ocm/commands/controllercmds/common/manifests.go +++ b/cmds/ocm/commands/controllercmds/common/manifests.go @@ -7,9 +7,10 @@ import ( "path/filepath" "github.com/fluxcd/pkg/ssa" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/out" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" ) func Install(ctx context.Context, octx clictx.Context, sm *ssa.ResourceManager, releaseURL, baseURL, manifest, filename, version string, dryRun bool) error { diff --git a/cmds/ocm/commands/controllercmds/install/cmd.go b/cmds/ocm/commands/controllercmds/install/cmd.go index 5d5a5b8bea..25427a1ba5 100644 --- a/cmds/ocm/commands/controllercmds/install/cmd.go +++ b/cmds/ocm/commands/controllercmds/install/cmd.go @@ -6,7 +6,6 @@ import ( "time" "github.com/fluxcd/pkg/ssa" - "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/common" "github.com/spf13/cobra" "github.com/spf13/pflag" corev1 "k8s.io/api/core/v1" @@ -15,6 +14,7 @@ import ( "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" + "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/common" "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/names" "github.com/open-component-model/ocm/cmds/ocm/commands/verbs" "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" diff --git a/cmds/ocm/commands/controllercmds/uninstall/cmd.go b/cmds/ocm/commands/controllercmds/uninstall/cmd.go index 3c1e497462..47c06530c4 100644 --- a/cmds/ocm/commands/controllercmds/uninstall/cmd.go +++ b/cmds/ocm/commands/controllercmds/uninstall/cmd.go @@ -6,15 +6,16 @@ import ( "time" "github.com/fluxcd/pkg/ssa" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "k8s.io/cli-runtime/pkg/genericclioptions" + "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/common" "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/names" "github.com/open-component-model/ocm/cmds/ocm/commands/verbs" "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/out" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "k8s.io/cli-runtime/pkg/genericclioptions" ) var ( diff --git a/cmds/ocm/commands/controllercmds/uninstall/uninstall_cert_manager.go b/cmds/ocm/commands/controllercmds/uninstall/uninstall_cert_manager.go index 944c881eb0..e0380e264b 100644 --- a/cmds/ocm/commands/controllercmds/uninstall/uninstall_cert_manager.go +++ b/cmds/ocm/commands/controllercmds/uninstall/uninstall_cert_manager.go @@ -2,12 +2,14 @@ package uninstall import ( "context" - _ "embed" "fmt" "os" + _ "embed" + "github.com/fluxcd/pkg/ssa" "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/common" "github.com/open-component-model/ocm/pkg/out" ) diff --git a/cmds/ocm/commands/misccmds/credentials/get/cmd.go b/cmds/ocm/commands/misccmds/credentials/get/cmd.go index 48e5f574b4..a634692cb9 100644 --- a/cmds/ocm/commands/misccmds/credentials/get/cmd.go +++ b/cmds/ocm/commands/misccmds/credentials/get/cmd.go @@ -5,7 +5,6 @@ import ( "strings" "github.com/mandelsoft/goutils/errors" - "github.com/open-component-model/ocm/pkg/listformat" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -15,6 +14,7 @@ import ( "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/credentials" + "github.com/open-component-model/ocm/pkg/listformat" "github.com/open-component-model/ocm/pkg/out" ) diff --git a/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go b/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go index 08ee455eb0..53743e4521 100644 --- a/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go +++ b/cmds/ocm/commands/ocmcmds/common/addhdlrs/utils.go @@ -8,7 +8,6 @@ import ( "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" - "github.com/open-component-model/ocm/pkg/errkind" "gopkg.in/yaml.v3" "k8s.io/apimachinery/pkg/util/validation/field" @@ -18,6 +17,7 @@ import ( "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/ocm" + "github.com/open-component-model/ocm/pkg/errkind" "github.com/open-component-model/ocm/pkg/runtime" utils2 "github.com/open-component-model/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/utils/template" diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr/typehandler.go b/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr/typehandler.go index 4ba9f91550..b24da832ed 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr/typehandler.go @@ -4,7 +4,7 @@ import ( "strings" "github.com/mandelsoft/goutils/errors" - + "github.com/open-component-model/ocm/cmds/ocm/pkg/output" "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/contexts/clictx" diff --git a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go index 875da9e575..83967edd1e 100644 --- a/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go +++ b/cmds/ocm/commands/ocmcmds/common/handlers/vershdlr/typehandler.go @@ -6,8 +6,8 @@ import ( "sort" "github.com/Masterminds/semver/v3" - "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/cmds/ocm/pkg/output" "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/contexts/clictx" diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/options/standard.go b/cmds/ocm/commands/ocmcmds/common/inputs/options/standard.go index c43f18f318..74a22ddc28 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/options/standard.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/options/standard.go @@ -6,13 +6,20 @@ import ( ) var ( - HintOption = options.HintOption - MediaTypeOption = options.MediatypeOption + HintOption = options.HintOption + MediaTypeOption = options.MediatypeOption + URLOption = options.URLOption HTTPHeaderOption = options.HTTPHeaderOption HTTPVerbOption = options.HTTPVerbOption HTTPBodyOption = options.HTTPBodyOption HTTPRedirectOption = options.HTTPRedirectOption + + RepositoryOption = options.RepositoryOption + GroupOption = options.GroupOption + ArtifactOption = options.ArtifactOption + ClassifierOption = options.ClassifierOption + ExtensionOption = options.ExtensionOption ) // string options diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/init.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/init.go index ccf3c66649..8c42a5781a 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/init.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/init.go @@ -7,6 +7,7 @@ import ( _ "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs/types/dockermulti" _ "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs/types/file" _ "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs/types/helm" + _ "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs/types/maven" _ "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs/types/ociartifact" _ "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs/types/spiff" _ "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs/types/utf8" diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/cli.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/cli.go new file mode 100644 index 0000000000..88b6fcbc63 --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/cli.go @@ -0,0 +1,32 @@ +package maven + +import ( + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs/options" + "github.com/open-component-model/ocm/pkg/cobrautils/flagsets" +) + +func ConfigHandler() flagsets.ConfigOptionTypeSetHandler { + return flagsets.NewConfigOptionTypeSetHandler( + TYPE, AddConfig, + options.URLOption, + options.PathOption, + options.GroupOption, + options.ArtifactOption, + options.VersionOption, + // optional + options.ClassifierOption, + options.ExtensionOption, + ) +} + +func AddConfig(opts flagsets.ConfigOptions, config flagsets.Config) error { + flagsets.AddFieldByOptionP(opts, options.URLOption, config, "repoUrl") + flagsets.AddFieldByOptionP(opts, options.PathOption, config, "path") + flagsets.AddFieldByOptionP(opts, options.GroupOption, config, "groupId") + flagsets.AddFieldByOptionP(opts, options.ArtifactOption, config, "artifactId") + flagsets.AddFieldByOptionP(opts, options.VersionOption, config, "version") + // optional + flagsets.AddFieldByOptionP(opts, options.ClassifierOption, config, "classifier") + flagsets.AddFieldByOptionP(opts, options.ExtensionOption, config, "extension") + return nil +} diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/input_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/input_test.go new file mode 100644 index 0000000000..7731e45ac5 --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/input_test.go @@ -0,0 +1,96 @@ +package maven_test + +import ( + "crypto" + "github.com/open-component-model/ocm/pkg/maven/maventest" + + . "github.com/mandelsoft/goutils/testutils" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/cmds/ocm/testhelper" + + "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localblob" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" + "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/comparch" + "github.com/open-component-model/ocm/pkg/mime" + "github.com/open-component-model/ocm/pkg/utils/tarutils" +) + +const ( + ARCH = "test.ca" + VERSION = "v1" +) + +var _ = Describe("Test Environment", func() { + var env *TestEnv + + BeforeEach(func() { + env = NewTestEnv(TestData(), maventest.TestData("/maven/testdata")) + + Expect(env.Execute("create", "ca", "-ft", "directory", "test.de/x", VERSION, "--provider", "mandelsoft", "--file", ARCH)).To(Succeed()) + }) + + AfterEach(func() { + env.Cleanup() + }) + + It("add maven from file system described by resources.yaml", func() { + Expect(env.Execute("add", "resources", "--file", ARCH, "/testdata/resources1.yaml")).To(Succeed()) + data, err := env.ReadFile(env.Join(ARCH, comparch.ComponentDescriptorFileName)) + Expect(err).To(Succeed()) + cd, err := compdesc.Decode(data) + Expect(err).To(Succeed()) + Expect(len(cd.Resources)).To(Equal(1)) + access := Must(env.Context.OCMContext().AccessSpecForSpec(cd.Resources[0].Access)).(*localblob.AccessSpec) + Expect(access.MediaType).To(Equal(mime.MIME_TGZ)) + fi := Must(env.FileSystem().Stat(env.Join(ARCH, "blobs", access.LocalReference))) + Expect(fi.Size()).To(Equal(int64(1570))) + li := Must(tarutils.ListArchiveContent(env.Join(ARCH, "blobs", access.LocalReference), env.FileSystem())) + Expect(li).To(ConsistOf( + "sdk-modules-bom-5.7.0-random-content.json", + "sdk-modules-bom-5.7.0-random-content.txt", + "sdk-modules-bom-5.7.0-sources.jar", + "sdk-modules-bom-5.7.0.jar", + "sdk-modules-bom-5.7.0.pom")) + Expect(cd.Resources[0].Digest.HashAlgorithm).To(Equal(crypto.SHA256.String())) + Expect(cd.Resources[0].Digest.Value).To(Equal("16cfb5ced0ea7688dba14aeb0d3aa76ad46e4661bfcc556ffd7287de3b2f7152")) + }) + + It("add maven from file system described by cli options", func() { + meta := ` +name: testdata +type: mavenArtifact +` + Expect(env.Execute("add", "resources", "--file", ARCH, "--resource", meta, "--inputType", "maven", + "--inputPath", "/maven/testdata/.m2/repository", "--groupId", "com.sap.cloud.sdk", "--artifactId", "sdk-modules-bom", + "--inputVersion", "5.7.0", "--classifier", "", "--extension", "pom")).To(Succeed()) + data, err := env.ReadFile(env.Join(ARCH, comparch.ComponentDescriptorFileName)) + Expect(err).To(Succeed()) + cd, err := compdesc.Decode(data) + Expect(err).To(Succeed()) + Expect(len(cd.Resources)).To(Equal(1)) + access := Must(env.Context.OCMContext().AccessSpecForSpec(cd.Resources[0].Access)).(*localblob.AccessSpec) + Expect(access.MediaType).To(Equal(mime.MIME_XML)) + fi := Must(env.FileSystem().Stat(env.Join(ARCH, "blobs", access.LocalReference))) + Expect(fi.Size()).To(Equal(int64(7153))) + }) + + It("add maven file from file system described by cli options", func() { + meta := ` +name: testdata +type: mavenArtifact +` + Expect(env.Execute("add", "resources", "--file", ARCH, "--resource", meta, "--inputType", "maven", + "--inputPath", "/maven/testdata/.m2/repository", "--groupId", "com.sap.cloud.sdk", "--artifactId", "sdk-modules-bom", + "--inputVersion", "5.7.0", "--extension", "pom")).To(Succeed()) + data, err := env.ReadFile(env.Join(ARCH, comparch.ComponentDescriptorFileName)) + Expect(err).To(Succeed()) + cd, err := compdesc.Decode(data) + Expect(err).To(Succeed()) + Expect(len(cd.Resources)).To(Equal(1)) + access := Must(env.Context.OCMContext().AccessSpecForSpec(cd.Resources[0].Access)).(*localblob.AccessSpec) + Expect(access.MediaType).To(Equal(mime.MIME_TGZ)) + fi := Must(env.FileSystem().Stat(env.Join(ARCH, "blobs", access.LocalReference))) + Expect(fi.Size()).To(Equal(int64(1109))) + }) +}) diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/spec.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/spec.go new file mode 100644 index 0000000000..b07c924979 --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/spec.go @@ -0,0 +1,99 @@ +package maven + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/util/validation/field" + + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs" + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs/cpi" + "github.com/open-component-model/ocm/pkg/blobaccess" + mavenblob "github.com/open-component-model/ocm/pkg/blobaccess/maven" + "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" + "github.com/open-component-model/ocm/pkg/maven" +) + +type Spec struct { + cpi.PathSpec `json:",inline"` + // RepoUrl defines the url from which the artifact is downloaded. + RepoUrl string `json:"repoUrl,omitempty"` + + maven.Coordinates `json:",inline"` +} + +var _ inputs.InputSpec = (*Spec)(nil) + +func New(repoUrl, groupId, artifactId, version string, classifier, extension *string) *Spec { + return &Spec{ + PathSpec: cpi.NewPathSpec(TYPE, ""), + RepoUrl: repoUrl, + Coordinates: *maven.NewCoordinates(groupId, artifactId, version, + maven.WithOptionalClassifier(classifier), + maven.WithOptionalExtension(extension)), + } +} + +func NewForFilePath(filePath, groupId, artifactId, version string, classifier, extension *string) *Spec { + return &Spec{ + PathSpec: cpi.NewPathSpec(TYPE, filePath), + RepoUrl: "", + Coordinates: *maven.NewCoordinates(groupId, artifactId, version, + maven.WithOptionalClassifier(classifier), + maven.WithOptionalExtension(extension)), + } +} + +func (s *Spec) Validate(fldPath *field.Path, ctx inputs.Context, inputFilePath string) field.ErrorList { + var allErrs field.ErrorList + if s.RepoUrl == "" { + allErrs = s.PathSpec.Validate(fldPath, ctx, inputFilePath) + } else { + if s.Path != "" { + pathField := fldPath.Child("path") + allErrs = append(allErrs, field.Forbidden(pathField, "only path or repoUrl can be specified, not both")) + } + } + if s.ArtifactId == "" { + pathField := fldPath.Child("artifactId") + allErrs = append(allErrs, field.Invalid(pathField, s.ArtifactId, "no artifact id")) + } + if s.GroupId == "" { + pathField := fldPath.Child("groupId") + allErrs = append(allErrs, field.Invalid(pathField, s.GroupId, "no group id")) + } + if s.Version == "" { + pathField := fldPath.Child("version") + allErrs = append(allErrs, field.Invalid(pathField, s.GroupId, "no group id")) + } + + return allErrs +} + +func (s *Spec) GetBlob(ctx inputs.Context, info inputs.InputResourceInfo) (blobaccess.BlobAccess, string, error) { + var repo *maven.Repository + var err error + + fs := ctx.FileSystem() + if s.Path != "" { + inputInfo, inputPath, err := inputs.FileInfo(ctx, s.Path, info.InputFilePath) + if err != nil { + return nil, "", err + } + if !inputInfo.IsDir() { + return nil, "", fmt.Errorf("maven file repository must be a directory") + } + repo = maven.NewFileRepository(inputPath, fs) + } else { + repo, err = maven.NewUrlRepository(s.RepoUrl, fs) + if err != nil { + return nil, "", err + } + } + access, err := mavenblob.BlobAccessForMavenCoords(repo, &s.Coordinates, + mavenblob.WithCredentialContext(ctx), + mavenblob.WithLoggingContext(ctx), + mavenblob.WithCachingFileSystem(vfsattr.Get(ctx)), + ) + + return access, "", err +} diff --git a/pkg/contexts/ocm/accessmethods/mvn/suite_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/suite_test.go similarity index 72% rename from pkg/contexts/ocm/accessmethods/mvn/suite_test.go rename to cmds/ocm/commands/ocmcmds/common/inputs/types/maven/suite_test.go index c62cadc7b0..c3662b31b0 100644 --- a/pkg/contexts/ocm/accessmethods/mvn/suite_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/suite_test.go @@ -1,4 +1,4 @@ -package mvn_test +package maven_test import ( "testing" @@ -9,5 +9,5 @@ import ( func TestConfig(t *testing.T) { RegisterFailHandler(Fail) - RunSpecs(t, "Maven (mvn) Test Suite") + RunSpecs(t, "Input Type maven") } diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/testdata/resources1.yaml b/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/testdata/resources1.yaml new file mode 100644 index 0000000000..161a29b424 --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/testdata/resources1.yaml @@ -0,0 +1,8 @@ +name: myblob +type: mavenArtifact +input: + type: maven + path: ../maven/testdata/.m2/repository + groupId: com.sap.cloud.sdk + artifactId: sdk-modules-bom + version: 5.7.0 \ No newline at end of file diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/type.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/type.go new file mode 100644 index 0000000000..7c80db8e33 --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/type.go @@ -0,0 +1,43 @@ +package maven + +import ( + "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs" +) + +const TYPE = "maven" + +func init() { + inputs.DefaultInputTypeScheme.Register(inputs.NewInputType(TYPE, &Spec{}, usage, ConfigHandler())) +} + +const usage = ` +The repoUrl is the url pointing either to the http endpoint of a maven +repository (e.g. https://repo.maven.apache.org/maven2/) or to a file system based +maven repository (e.g. file://local/directory). + +This blob type specification supports the following fields: +- **repoUrl** *string* + + This REQUIRED property describes the url from which the resource is to be + accessed. + +- **groupId** *string* + + This REQUIRED property describes the groupId of a maven artifact. + +- **artifactId** *string* + + This REQUIRED property describes artifactId of a maven artifact. + +- **version** *string* + + This REQUIRED property describes the version of a maven artifact. + +- **classifier** *string* + + This OPTIONAL property describes the classifier of a maven artifact. + +- **extension** *string* + + This OPTIONAL property describes the extension of a maven artifact. +` diff --git a/cmds/ocm/commands/ocmcmds/common/options/schemaoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/schemaoption/option.go index 46df9fc6ab..5e463f0058 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/schemaoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/schemaoption/option.go @@ -2,12 +2,12 @@ package schemaoption import ( "github.com/mandelsoft/goutils/errors" - "github.com/open-component-model/ocm/pkg/errkind" "github.com/spf13/pflag" "github.com/open-component-model/ocm/cmds/ocm/pkg/options" "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" + "github.com/open-component-model/ocm/pkg/errkind" "github.com/open-component-model/ocm/pkg/listformat" utils2 "github.com/open-component-model/ocm/pkg/utils" ) diff --git a/cmds/ocm/commands/ocmcmds/common/resources.go b/cmds/ocm/commands/ocmcmds/common/resources.go index d64c52e427..db8b5697b6 100644 --- a/cmds/ocm/commands/ocmcmds/common/resources.go +++ b/cmds/ocm/commands/ocmcmds/common/resources.go @@ -4,11 +4,10 @@ import ( "encoding/json" "fmt" - "github.com/mandelsoft/goutils/sliceutils" _ "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/inputs/types" - utils2 "github.com/open-component-model/ocm/pkg/utils" "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/sliceutils" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/pflag" "golang.org/x/text/cases" @@ -33,6 +32,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/comparch" "github.com/open-component-model/ocm/pkg/logging" "github.com/open-component-model/ocm/pkg/mime" + utils2 "github.com/open-component-model/ocm/pkg/utils" ) const ComponentVersionTag = "" diff --git a/cmds/ocm/commands/ocmcmds/common/utils.go b/cmds/ocm/commands/ocmcmds/common/utils.go index 27df8f52f2..5985d94681 100644 --- a/cmds/ocm/commands/ocmcmds/common/utils.go +++ b/cmds/ocm/commands/ocmcmds/common/utils.go @@ -5,7 +5,7 @@ import ( "strings" "github.com/mandelsoft/goutils/errors" - + "github.com/open-component-model/ocm/cmds/ocm/pkg/options" "github.com/open-component-model/ocm/pkg/contexts/clictx" "github.com/open-component-model/ocm/pkg/contexts/ocm" diff --git a/cmds/ocm/commands/ocmcmds/components/add/cmd.go b/cmds/ocm/commands/ocmcmds/components/add/cmd.go index cce645da04..648babe18a 100644 --- a/cmds/ocm/commands/ocmcmds/components/add/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/add/cmd.go @@ -3,12 +3,12 @@ package add import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/goutils/general" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/cobra" "github.com/spf13/pflag" - "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/formatoption" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/addhdlrs" diff --git a/cmds/ocm/commands/ocmcmds/components/download/cmd.go b/cmds/ocm/commands/ocmcmds/components/download/cmd.go index 76759a6bb2..1735291dad 100644 --- a/cmds/ocm/commands/ocmcmds/components/download/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/download/cmd.go @@ -4,9 +4,9 @@ import ( "path" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" - "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/destoption" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/formatoption" ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" diff --git a/cmds/ocm/commands/ocmcmds/components/transfer/cmd.go b/cmds/ocm/commands/ocmcmds/components/transfer/cmd.go index 81c577ae13..f91a39b22d 100644 --- a/cmds/ocm/commands/ocmcmds/components/transfer/cmd.go +++ b/cmds/ocm/commands/ocmcmds/components/transfer/cmd.go @@ -4,12 +4,12 @@ import ( "encoding/json" "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/goutils/maputils" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/cobra" "github.com/spf13/pflag" - "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/closureoption" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/formatoption" ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" diff --git a/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go b/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go index beb4daa7e7..d57aefdaeb 100644 --- a/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go +++ b/cmds/ocm/commands/ocmcmds/ctf/transfer/cmd.go @@ -1,9 +1,9 @@ package transfer import ( + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" - "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/closureoption" "github.com/open-component-model/ocm/cmds/ocm/commands/common/options/formatoption" ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" diff --git a/cmds/ocm/commands/ocmcmds/plugins/install/cmd.go b/cmds/ocm/commands/ocmcmds/plugins/install/cmd.go index d5b4182cdb..2462191b93 100644 --- a/cmds/ocm/commands/ocmcmds/plugins/install/cmd.go +++ b/cmds/ocm/commands/ocmcmds/plugins/install/cmd.go @@ -3,10 +3,10 @@ package install import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" - "github.com/mandelsoft/goutils/errors" ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/handlers/pluginhdlr" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/repooption" diff --git a/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go b/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go index 96554e0287..8555d8bdde 100644 --- a/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go +++ b/cmds/ocm/commands/toicmds/package/bootstrap/cmd.go @@ -3,11 +3,11 @@ package bootstrap import ( "fmt" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/spf13/cobra" "github.com/spf13/pflag" - "github.com/mandelsoft/goutils/errors" ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/lookupoption" diff --git a/cmds/ocm/commands/toicmds/package/describe/cmd.go b/cmds/ocm/commands/toicmds/package/describe/cmd.go index 994570c0c7..cccf87782c 100644 --- a/cmds/ocm/commands/toicmds/package/describe/cmd.go +++ b/cmds/ocm/commands/toicmds/package/describe/cmd.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" - "github.com/mandelsoft/goutils/errors" ocmcommon "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/handlers/comphdlr" "github.com/open-component-model/ocm/cmds/ocm/commands/ocmcmds/common/options/lookupoption" diff --git a/cmds/ocm/commands/verbs/controller/cmd.go b/cmds/ocm/commands/verbs/controller/cmd.go index 3ad8733b2c..a79e2741f7 100644 --- a/cmds/ocm/commands/verbs/controller/cmd.go +++ b/cmds/ocm/commands/verbs/controller/cmd.go @@ -1,11 +1,11 @@ package controller import ( - "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/uninstall" "github.com/spf13/cobra" "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/install" "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/names" + "github.com/open-component-model/ocm/cmds/ocm/commands/controllercmds/uninstall" "github.com/open-component-model/ocm/cmds/ocm/pkg/utils" "github.com/open-component-model/ocm/pkg/contexts/clictx" ) diff --git a/cmds/ocm/pkg/utils/command.go b/cmds/ocm/pkg/utils/command.go index aec015928b..212cd13c7d 100644 --- a/cmds/ocm/pkg/utils/command.go +++ b/cmds/ocm/pkg/utils/command.go @@ -4,10 +4,10 @@ import ( "reflect" "strings" + "github.com/mandelsoft/goutils/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" - "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/cmds/ocm/pkg/options" "github.com/open-component-model/ocm/pkg/cobrautils" "github.com/open-component-model/ocm/pkg/contexts/clictx" diff --git a/cmds/ocm/pkg/utils/handling.go b/cmds/ocm/pkg/utils/handling.go index d0592950c1..ba2d2193a1 100644 --- a/cmds/ocm/pkg/utils/handling.go +++ b/cmds/ocm/pkg/utils/handling.go @@ -6,6 +6,7 @@ import ( "reflect" "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/cmds/ocm/pkg/output" ) diff --git a/docs/pluginreference/plugin_accessmethod_compose.md b/docs/pluginreference/plugin_accessmethod_compose.md index d9c0455651..e451f8f7c7 100644 --- a/docs/pluginreference/plugin_accessmethod_compose.md +++ b/docs/pluginreference/plugin_accessmethod_compose.md @@ -35,20 +35,21 @@ by the plugin name. The following predefined option types can be used: - - accessClassifier: [*string*] mvn classifier - - accessExtension: [*string*] mvn extension name - - accessGroup: [*string*] GroupID or namespace - accessHostname: [*string*] hostname used for access - accessPackage: [*string*] package or object name - accessRegistry: [*string*] registry base URL - accessRepository: [*string*] repository URL - accessVersion: [*string*] version for access specification + - artifactId: [*string*] maven artifact id - body: [*string*] body of a http request - bucket: [*string*] bucket name + - classifier: [*string*] maven classifier - comment: [*string*] comment field value - commit: [*string*] git commit id - digest: [*string*] blob digest + - extension: [*string*] maven extension name - globalAccess: [*map[string]YAML*] access specification for global access + - groupId: [*string*] maven group id - header: [*string:string,string*] http headers - hint: [*string*] (repository) hint for local artifacts - mediaType: [*string*] media type for artifact blob representation diff --git a/docs/pluginreference/plugin_descriptor.md b/docs/pluginreference/plugin_descriptor.md index c3ecbdd8a4..e2c05f2bae 100644 --- a/docs/pluginreference/plugin_descriptor.md +++ b/docs/pluginreference/plugin_descriptor.md @@ -120,20 +120,21 @@ It uses the following fields: The following predefined option types can be used: - - accessClassifier: [*string*] mvn classifier - - accessExtension: [*string*] mvn extension name - - accessGroup: [*string*] GroupID or namespace - accessHostname: [*string*] hostname used for access - accessPackage: [*string*] package or object name - accessRegistry: [*string*] registry base URL - accessRepository: [*string*] repository URL - accessVersion: [*string*] version for access specification + - artifactId: [*string*] maven artifact id - body: [*string*] body of a http request - bucket: [*string*] bucket name + - classifier: [*string*] maven classifier - comment: [*string*] comment field value - commit: [*string*] git commit id - digest: [*string*] blob digest + - extension: [*string*] maven extension name - globalAccess: [*map[string]YAML*] access specification for global access + - groupId: [*string*] maven group id - header: [*string:string,string*] http headers - hint: [*string*] (repository) hint for local artifacts - mediaType: [*string*] media type for artifact blob representation diff --git a/docs/pluginreference/plugin_valueset_compose.md b/docs/pluginreference/plugin_valueset_compose.md index 09bf007037..f7513c805b 100644 --- a/docs/pluginreference/plugin_valueset_compose.md +++ b/docs/pluginreference/plugin_valueset_compose.md @@ -35,20 +35,21 @@ by the plugin name. The following predefined option types can be used: - - accessClassifier: [*string*] mvn classifier - - accessExtension: [*string*] mvn extension name - - accessGroup: [*string*] GroupID or namespace - accessHostname: [*string*] hostname used for access - accessPackage: [*string*] package or object name - accessRegistry: [*string*] registry base URL - accessRepository: [*string*] repository URL - accessVersion: [*string*] version for access specification + - artifactId: [*string*] maven artifact id - body: [*string*] body of a http request - bucket: [*string*] bucket name + - classifier: [*string*] maven classifier - comment: [*string*] comment field value - commit: [*string*] git commit id - digest: [*string*] blob digest + - extension: [*string*] maven extension name - globalAccess: [*map[string]YAML*] access specification for global access + - groupId: [*string*] maven group id - header: [*string:string,string*] http headers - hint: [*string*] (repository) hint for local artifacts - mediaType: [*string*] media type for artifact blob representation diff --git a/docs/reference/ocm_add_resource-configuration.md b/docs/reference/ocm_add_resource-configuration.md index 679bcc2f27..533a494438 100644 --- a/docs/reference/ocm_add_resource-configuration.md +++ b/docs/reference/ocm_add_resource-configuration.md @@ -24,20 +24,21 @@ resource-configuration, resourceconfig, rsccfg, rcfg ``` --access YAML blob access specification (YAML) - --accessClassifier string mvn classifier - --accessExtension string mvn extension name - --accessGroup string GroupID or namespace --accessHostname string hostname used for access --accessPackage string package or object name --accessRegistry string registry base URL --accessRepository string repository URL --accessType string type of blob access specification --accessVersion string version for access specification + --artifactId string maven artifact id --body string body of a http request --bucket string bucket name + --classifier string maven classifier --commit string git commit id --digest string blob digest + --extension string maven extension name --globalAccess YAML access specification for global access + --groupId string maven group id --header :,,... http headers (default {}) --hint string (repository) hint for local artifacts --mediaType string media type for artifact blob representation @@ -53,7 +54,11 @@ resource-configuration, resourceconfig, rsccfg, rcfg #### Input Specification Options ``` + --artifactId string maven artifact id --body string body of a http request + --classifier string maven classifier + --extension string maven extension name + --groupId string maven group id --header :,,... http headers (default {}) --hint string (repository) hint for local artifacts --input YAML blob input specification (YAML) @@ -368,6 +373,40 @@ with the field type in the input field: Options used to configure fields: --hint, --inputCompress, --inputHelmRepository, --inputPath, --inputVersion, --mediaType +- Input type maven + + The repoUrl is the url pointing either to the http endpoint of a maven + repository (e.g. https://repo.maven.apache.org/maven2/) or to a file system based + maven repository (e.g. file://local/directory). + + This blob type specification supports the following fields: + - **repoUrl** *string* + + This REQUIRED property describes the url from which the resource is to be + accessed. + + - **groupId** *string* + + This REQUIRED property describes the groupId of a maven artifact. + + - **artifactId** *string* + + This REQUIRED property describes artifactId of a maven artifact. + + - **version** *string* + + This REQUIRED property describes the version of a maven artifact. + + - **classifier** *string* + + This OPTIONAL property describes the classifier of a maven artifact. + + - **extension** *string* + + This OPTIONAL property describes the extension of a maven artifact. + + Options used to configure fields: --artifactId, --classifier, --extension, --groupId, --inputPath, --inputVersion, --url + - Input type ociArtifact The path must denote an OCI image reference. @@ -683,40 +722,40 @@ shown below. Options used to configure fields: --globalAccess, --hint, --mediaType, --reference -- Access type mvn +- Access type maven - This method implements the access of a Maven (mvn) artifact in a Maven repository. + This method implements the access of a Maven artifact in a Maven repository. The following versions are supported: - Version v1 The type specific specification fields are: - - **repository** *string* + - **repoUrl** *string* - Base URL of the Maven (mvn) repository + URL of the Maven repository - **groupId** *string* - The groupId of the Maven (mvn) artifact + The groupId of the Maven artifact - **artifactId** *string* - The artifactId of the Maven (mvn) artifact + The artifactId of the Maven artifact - **version** *string* - The version name of the Maven (mvn) artifact + The version name of the Maven artifact - **classifier** *string* - The optional classifier of the Maven (mvn) artifact + The optional classifier of the Maven artifact - **extension** *string* - The optional extension of the Maven (mvn) artifact + The optional extension of the Maven artifact - Options used to configure fields: --accessClassifier, --accessExtension, --accessGroup, --accessPackage, --accessRepository, --accessVersion + Options used to configure fields: --accessRepository, --accessVersion, --artifactId, --classifier, --extension, --groupId - Access type none diff --git a/docs/reference/ocm_add_resources.md b/docs/reference/ocm_add_resources.md index 9e8878f8e8..944f87bf64 100644 --- a/docs/reference/ocm_add_resources.md +++ b/docs/reference/ocm_add_resources.md @@ -30,20 +30,21 @@ resources, resource, res, r ``` --access YAML blob access specification (YAML) - --accessClassifier string mvn classifier - --accessExtension string mvn extension name - --accessGroup string GroupID or namespace --accessHostname string hostname used for access --accessPackage string package or object name --accessRegistry string registry base URL --accessRepository string repository URL --accessType string type of blob access specification --accessVersion string version for access specification + --artifactId string maven artifact id --body string body of a http request --bucket string bucket name + --classifier string maven classifier --commit string git commit id --digest string blob digest + --extension string maven extension name --globalAccess YAML access specification for global access + --groupId string maven group id --header :,,... http headers (default {}) --hint string (repository) hint for local artifacts --mediaType string media type for artifact blob representation @@ -59,7 +60,11 @@ resources, resource, res, r #### Input Specification Options ``` + --artifactId string maven artifact id --body string body of a http request + --classifier string maven classifier + --extension string maven extension name + --groupId string maven group id --header :,,... http headers (default {}) --hint string (repository) hint for local artifacts --input YAML blob input specification (YAML) @@ -378,6 +383,40 @@ with the field type in the input field: Options used to configure fields: --hint, --inputCompress, --inputHelmRepository, --inputPath, --inputVersion, --mediaType +- Input type maven + + The repoUrl is the url pointing either to the http endpoint of a maven + repository (e.g. https://repo.maven.apache.org/maven2/) or to a file system based + maven repository (e.g. file://local/directory). + + This blob type specification supports the following fields: + - **repoUrl** *string* + + This REQUIRED property describes the url from which the resource is to be + accessed. + + - **groupId** *string* + + This REQUIRED property describes the groupId of a maven artifact. + + - **artifactId** *string* + + This REQUIRED property describes artifactId of a maven artifact. + + - **version** *string* + + This REQUIRED property describes the version of a maven artifact. + + - **classifier** *string* + + This OPTIONAL property describes the classifier of a maven artifact. + + - **extension** *string* + + This OPTIONAL property describes the extension of a maven artifact. + + Options used to configure fields: --artifactId, --classifier, --extension, --groupId, --inputPath, --inputVersion, --url + - Input type ociArtifact The path must denote an OCI image reference. @@ -693,40 +732,40 @@ shown below. Options used to configure fields: --globalAccess, --hint, --mediaType, --reference -- Access type mvn +- Access type maven - This method implements the access of a Maven (mvn) artifact in a Maven repository. + This method implements the access of a Maven artifact in a Maven repository. The following versions are supported: - Version v1 The type specific specification fields are: - - **repository** *string* + - **repoUrl** *string* - Base URL of the Maven (mvn) repository + URL of the Maven repository - **groupId** *string* - The groupId of the Maven (mvn) artifact + The groupId of the Maven artifact - **artifactId** *string* - The artifactId of the Maven (mvn) artifact + The artifactId of the Maven artifact - **version** *string* - The version name of the Maven (mvn) artifact + The version name of the Maven artifact - **classifier** *string* - The optional classifier of the Maven (mvn) artifact + The optional classifier of the Maven artifact - **extension** *string* - The optional extension of the Maven (mvn) artifact + The optional extension of the Maven artifact - Options used to configure fields: --accessClassifier, --accessExtension, --accessGroup, --accessPackage, --accessRepository, --accessVersion + Options used to configure fields: --accessRepository, --accessVersion, --artifactId, --classifier, --extension, --groupId - Access type none diff --git a/docs/reference/ocm_add_source-configuration.md b/docs/reference/ocm_add_source-configuration.md index f7d2b4fc32..7ebe3f1241 100644 --- a/docs/reference/ocm_add_source-configuration.md +++ b/docs/reference/ocm_add_source-configuration.md @@ -24,20 +24,21 @@ source-configuration, sourceconfig, srccfg, scfg ``` --access YAML blob access specification (YAML) - --accessClassifier string mvn classifier - --accessExtension string mvn extension name - --accessGroup string GroupID or namespace --accessHostname string hostname used for access --accessPackage string package or object name --accessRegistry string registry base URL --accessRepository string repository URL --accessType string type of blob access specification --accessVersion string version for access specification + --artifactId string maven artifact id --body string body of a http request --bucket string bucket name + --classifier string maven classifier --commit string git commit id --digest string blob digest + --extension string maven extension name --globalAccess YAML access specification for global access + --groupId string maven group id --header :,,... http headers (default {}) --hint string (repository) hint for local artifacts --mediaType string media type for artifact blob representation @@ -53,7 +54,11 @@ source-configuration, sourceconfig, srccfg, scfg #### Input Specification Options ``` + --artifactId string maven artifact id --body string body of a http request + --classifier string maven classifier + --extension string maven extension name + --groupId string maven group id --header :,,... http headers (default {}) --hint string (repository) hint for local artifacts --input YAML blob input specification (YAML) @@ -368,6 +373,40 @@ with the field type in the input field: Options used to configure fields: --hint, --inputCompress, --inputHelmRepository, --inputPath, --inputVersion, --mediaType +- Input type maven + + The repoUrl is the url pointing either to the http endpoint of a maven + repository (e.g. https://repo.maven.apache.org/maven2/) or to a file system based + maven repository (e.g. file://local/directory). + + This blob type specification supports the following fields: + - **repoUrl** *string* + + This REQUIRED property describes the url from which the resource is to be + accessed. + + - **groupId** *string* + + This REQUIRED property describes the groupId of a maven artifact. + + - **artifactId** *string* + + This REQUIRED property describes artifactId of a maven artifact. + + - **version** *string* + + This REQUIRED property describes the version of a maven artifact. + + - **classifier** *string* + + This OPTIONAL property describes the classifier of a maven artifact. + + - **extension** *string* + + This OPTIONAL property describes the extension of a maven artifact. + + Options used to configure fields: --artifactId, --classifier, --extension, --groupId, --inputPath, --inputVersion, --url + - Input type ociArtifact The path must denote an OCI image reference. @@ -683,40 +722,40 @@ shown below. Options used to configure fields: --globalAccess, --hint, --mediaType, --reference -- Access type mvn +- Access type maven - This method implements the access of a Maven (mvn) artifact in a Maven repository. + This method implements the access of a Maven artifact in a Maven repository. The following versions are supported: - Version v1 The type specific specification fields are: - - **repository** *string* + - **repoUrl** *string* - Base URL of the Maven (mvn) repository + URL of the Maven repository - **groupId** *string* - The groupId of the Maven (mvn) artifact + The groupId of the Maven artifact - **artifactId** *string* - The artifactId of the Maven (mvn) artifact + The artifactId of the Maven artifact - **version** *string* - The version name of the Maven (mvn) artifact + The version name of the Maven artifact - **classifier** *string* - The optional classifier of the Maven (mvn) artifact + The optional classifier of the Maven artifact - **extension** *string* - The optional extension of the Maven (mvn) artifact + The optional extension of the Maven artifact - Options used to configure fields: --accessClassifier, --accessExtension, --accessGroup, --accessPackage, --accessRepository, --accessVersion + Options used to configure fields: --accessRepository, --accessVersion, --artifactId, --classifier, --extension, --groupId - Access type none diff --git a/docs/reference/ocm_add_sources.md b/docs/reference/ocm_add_sources.md index 746d02c5ee..d2120df821 100644 --- a/docs/reference/ocm_add_sources.md +++ b/docs/reference/ocm_add_sources.md @@ -29,20 +29,21 @@ sources, source, src, s ``` --access YAML blob access specification (YAML) - --accessClassifier string mvn classifier - --accessExtension string mvn extension name - --accessGroup string GroupID or namespace --accessHostname string hostname used for access --accessPackage string package or object name --accessRegistry string registry base URL --accessRepository string repository URL --accessType string type of blob access specification --accessVersion string version for access specification + --artifactId string maven artifact id --body string body of a http request --bucket string bucket name + --classifier string maven classifier --commit string git commit id --digest string blob digest + --extension string maven extension name --globalAccess YAML access specification for global access + --groupId string maven group id --header :,,... http headers (default {}) --hint string (repository) hint for local artifacts --mediaType string media type for artifact blob representation @@ -58,7 +59,11 @@ sources, source, src, s #### Input Specification Options ``` + --artifactId string maven artifact id --body string body of a http request + --classifier string maven classifier + --extension string maven extension name + --groupId string maven group id --header :,,... http headers (default {}) --hint string (repository) hint for local artifacts --input YAML blob input specification (YAML) @@ -376,6 +381,40 @@ with the field type in the input field: Options used to configure fields: --hint, --inputCompress, --inputHelmRepository, --inputPath, --inputVersion, --mediaType +- Input type maven + + The repoUrl is the url pointing either to the http endpoint of a maven + repository (e.g. https://repo.maven.apache.org/maven2/) or to a file system based + maven repository (e.g. file://local/directory). + + This blob type specification supports the following fields: + - **repoUrl** *string* + + This REQUIRED property describes the url from which the resource is to be + accessed. + + - **groupId** *string* + + This REQUIRED property describes the groupId of a maven artifact. + + - **artifactId** *string* + + This REQUIRED property describes artifactId of a maven artifact. + + - **version** *string* + + This REQUIRED property describes the version of a maven artifact. + + - **classifier** *string* + + This OPTIONAL property describes the classifier of a maven artifact. + + - **extension** *string* + + This OPTIONAL property describes the extension of a maven artifact. + + Options used to configure fields: --artifactId, --classifier, --extension, --groupId, --inputPath, --inputVersion, --url + - Input type ociArtifact The path must denote an OCI image reference. @@ -691,40 +730,40 @@ shown below. Options used to configure fields: --globalAccess, --hint, --mediaType, --reference -- Access type mvn +- Access type maven - This method implements the access of a Maven (mvn) artifact in a Maven repository. + This method implements the access of a Maven artifact in a Maven repository. The following versions are supported: - Version v1 The type specific specification fields are: - - **repository** *string* + - **repoUrl** *string* - Base URL of the Maven (mvn) repository + URL of the Maven repository - **groupId** *string* - The groupId of the Maven (mvn) artifact + The groupId of the Maven artifact - **artifactId** *string* - The artifactId of the Maven (mvn) artifact + The artifactId of the Maven artifact - **version** *string* - The version name of the Maven (mvn) artifact + The version name of the Maven artifact - **classifier** *string* - The optional classifier of the Maven (mvn) artifact + The optional classifier of the Maven artifact - **extension** *string* - The optional extension of the Maven (mvn) artifact + The optional extension of the Maven artifact - Options used to configure fields: --accessClassifier, --accessExtension, --accessGroup, --accessPackage, --accessRepository, --accessVersion + Options used to configure fields: --accessRepository, --accessVersion, --artifactId, --classifier, --extension, --groupId - Access type none diff --git a/docs/reference/ocm_logging.md b/docs/reference/ocm_logging.md index f72d0b3fcb..1f6b89b152 100644 --- a/docs/reference/ocm_logging.md +++ b/docs/reference/ocm_logging.md @@ -24,10 +24,11 @@ The following *realms* are used by the command line tool: - ocm/compdesc: component descriptor handling - ocm/config: configuration management - ocm/context: context lifecycle + - ocm/credentials: Credentials - ocm/credentials/dockerconfig: docker config handling as credential repository - ocm/credentials/vault: HashiCorp Vault Access - ocm/downloader: Downloaders - - ocm/mvn: Maven repository + - ocm/maven: Maven repository - ocm/npm: NPM registry - ocm/oci/mapping: OCM to OCI Registry Mapping - ocm/oci/ocireg: OCI repository handling diff --git a/docs/reference/ocm_ocm-accessmethods.md b/docs/reference/ocm_ocm-accessmethods.md index 1c02801075..8ae09db829 100644 --- a/docs/reference/ocm_ocm-accessmethods.md +++ b/docs/reference/ocm_ocm-accessmethods.md @@ -183,40 +183,40 @@ shown below. Options used to configure fields: --globalAccess, --hint, --mediaType, --reference -- Access type mvn +- Access type maven - This method implements the access of a Maven (mvn) artifact in a Maven repository. + This method implements the access of a Maven artifact in a Maven repository. The following versions are supported: - Version v1 The type specific specification fields are: - - **repository** *string* + - **repoUrl** *string* - Base URL of the Maven (mvn) repository + URL of the Maven repository - **groupId** *string* - The groupId of the Maven (mvn) artifact + The groupId of the Maven artifact - **artifactId** *string* - The artifactId of the Maven (mvn) artifact + The artifactId of the Maven artifact - **version** *string* - The version name of the Maven (mvn) artifact + The version name of the Maven artifact - **classifier** *string* - The optional classifier of the Maven (mvn) artifact + The optional classifier of the Maven artifact - **extension** *string* - The optional extension of the Maven (mvn) artifact + The optional extension of the Maven artifact - Options used to configure fields: --accessClassifier, --accessExtension, --accessGroup, --accessPackage, --accessRepository, --accessVersion + Options used to configure fields: --accessRepository, --accessVersion, --artifactId, --classifier, --extension, --groupId - Access type none diff --git a/docs/reference/ocm_ocm-uploadhandlers.md b/docs/reference/ocm_ocm-uploadhandlers.md index d3b3219957..5c6ac57448 100644 --- a/docs/reference/ocm_ocm-uploadhandlers.md +++ b/docs/reference/ocm_ocm-uploadhandlers.md @@ -73,14 +73,14 @@ The following handler names are possible: sub namespace of the form <plugin name>/<handler> - - ocm/mvnArtifact: uploading mvn artifacts + - ocm/mavenArtifact: uploading maven artifacts - The ocm/mvnArtifact uploader is able to upload mvn artifacts (whole GAV only!) - as artifact archive according to the mvn artifact spec. + The ocm/mavenArtifact uploader is able to upload maven artifacts (whole GAV only!) + as artifact archive according to the maven artifact spec. If registered the default mime type is: application/x-tgz It accepts a plain string for the URL or a config with the following field: - 'url': the URL of the mvn repository. + 'url': the URL of the maven repository. diff --git a/docs/reference/ocm_transfer_commontransportarchive.md b/docs/reference/ocm_transfer_commontransportarchive.md index c3f6c2d20a..eaa4b1f1fb 100644 --- a/docs/reference/ocm_transfer_commontransportarchive.md +++ b/docs/reference/ocm_transfer_commontransportarchive.md @@ -147,14 +147,14 @@ The uploader name may be a path expression with the following possibilities: sub namespace of the form <plugin name>/<handler> - - ocm/mvnArtifact: uploading mvn artifacts + - ocm/mavenArtifact: uploading maven artifacts - The ocm/mvnArtifact uploader is able to upload mvn artifacts (whole GAV only!) - as artifact archive according to the mvn artifact spec. + The ocm/mavenArtifact uploader is able to upload maven artifacts (whole GAV only!) + as artifact archive according to the maven artifact spec. If registered the default mime type is: application/x-tgz It accepts a plain string for the URL or a config with the following field: - 'url': the URL of the mvn repository. + 'url': the URL of the maven repository. diff --git a/docs/reference/ocm_transfer_componentversions.md b/docs/reference/ocm_transfer_componentversions.md index f251617d44..b58c17b15f 100644 --- a/docs/reference/ocm_transfer_componentversions.md +++ b/docs/reference/ocm_transfer_componentversions.md @@ -204,14 +204,14 @@ The uploader name may be a path expression with the following possibilities: sub namespace of the form <plugin name>/<handler> - - ocm/mvnArtifact: uploading mvn artifacts + - ocm/mavenArtifact: uploading maven artifacts - The ocm/mvnArtifact uploader is able to upload mvn artifacts (whole GAV only!) - as artifact archive according to the mvn artifact spec. + The ocm/mavenArtifact uploader is able to upload maven artifacts (whole GAV only!) + as artifact archive according to the maven artifact spec. If registered the default mime type is: application/x-tgz It accepts a plain string for the URL or a config with the following field: - 'url': the URL of the mvn repository. + 'url': the URL of the maven repository. diff --git a/examples/lib/tour/01-getting-started/README.md b/examples/lib/tour/01-getting-started/README.md index 76423db018..5f807a67f3 100644 --- a/examples/lib/tour/01-getting-started/README.md +++ b/examples/lib/tour/01-getting-started/README.md @@ -164,32 +164,32 @@ differ, because the code always describes the latest version): ``` resources of the latest version: - version: 0.9.0 + version: 0.10.0 provider: ocm.software 1: name: ocmcli extra identity: "architecture"="amd64","os"="linux" resource type: executable - access: Local blob sha256:1de1c90f23d0a3dbb8d8646f09380f1da257f9d10796b42dc4ef85e8df93a135[] + access: Local blob sha256:e2d8f578083e9317bd199b3f374b7ea60e7f28cf989e8d39ae0ea54ac4fa8847[] 2: name: ocmcli extra identity: "architecture"="arm64","os"="linux" resource type: executable - access: Local blob sha256:ca049bb09399020ce0822fd18c0a534ae0d02c3e0180f05dd4faccf61176a267[] + access: Local blob sha256:2acef3da732a6674fb047f3d60f0dabcbb60ffeb8dd362a169df97c4dc4489a8[] 3: name: ocmcli extra identity: "architecture"="arm64","os"="darwin" resource type: executable - access: Local blob sha256:1e32b3f1a08c72e3187b247f8931ea9d0554240fd452a4df129d6036c62b0476[] + access: Local blob sha256:b05fbc5e8aaa3622e2ecc39ead7f066030fd183c625b0dc202dbac8131f06d1d[] 4: name: ocmcli extra identity: "architecture"="amd64","os"="darwin" resource type: executable - access: Local blob sha256:04708d2f9845dd6d52f2b8f94e930f3a74a1a098b7ee401e001307d4b4fcc703[] + access: Local blob sha256:aec88249f7e5a395eaa18ac6017831b275c7de90d3c10f0cd9e572027ad6c6e9[] 5: name: ocmcli extra identity: "architecture"="amd64","os"="windows" resource type: executable - access: Local blob sha256:e8cf5dfd1ab02ab982e6f1a425d426fc1f7dc83e6385d26d0477525a4a66c629[] + access: Local blob sha256:cdbac49bd004aa2a8b89fafb9e845f45bfcfaab2df402296f55b403b9b1035a2[] 6: name: ocmcli-image extra identity: resource type: ociImage - access: OCI artifact ghcr.io/open-component-model/ocm/ocm.software/ocmcli/ocmcli-image:0.9.0 + access: OCI artifact ghcr.io/open-component-model/ocm/ocm.software/ocmcli/ocmcli-image:0.10.0 ``` Resources have some metadata, like their identity and a resource type. diff --git a/examples/lib/tour/02-composing-a-component-version/01-basic-componentversion-creation.go b/examples/lib/tour/02-composing-a-component-version/01-basic-componentversion-creation.go index 7284bcc274..da13cdc0bb 100644 --- a/examples/lib/tour/02-composing-a-component-version/01-basic-componentversion-creation.go +++ b/examples/lib/tour/02-composing-a-component-version/01-basic-componentversion-creation.go @@ -173,7 +173,7 @@ data: some very important data required to understand this component // The above case could also be written as follows: // --- begin setup by access --- res := textblob.ResourceAccess(cv.GetContext(), meta, yamldata, - textblob.WithimeType(mime.MIME_YAML)) + textblob.WithMimeType(mime.MIME_YAML)) err = cv.SetResourceAccess(res) if err != nil { return errors.Wrapf(err, "cannot add yaml document") diff --git a/examples/lib/tour/02-composing-a-component-version/README.md b/examples/lib/tour/02-composing-a-component-version/README.md index 74953c7385..effd262404 100644 --- a/examples/lib/tour/02-composing-a-component-version/README.md +++ b/examples/lib/tour/02-composing-a-component-version/README.md @@ -212,7 +212,7 @@ The above case could also be written as follows: ```go res := textblob.ResourceAccess(cv.GetContext(), meta, yamldata, - textblob.WithimeType(mime.MIME_YAML)) + textblob.WithMimeType(mime.MIME_YAML)) err = cv.SetResourceAccess(res) if err != nil { return errors.Wrapf(err, "cannot add yaml document") diff --git a/examples/lib/tour/03-working-with-credentials/common.go b/examples/lib/tour/03-working-with-credentials/common.go index 27aa3149db..86151feab0 100644 --- a/examples/lib/tour/03-working-with-credentials/common.go +++ b/examples/lib/tour/03-working-with-credentials/common.go @@ -136,7 +136,7 @@ data: some very important data required to understand this component // component version. // The above case could be written as follows, also: res := textblob.ResourceAccess(cv.GetContext(), meta, yamldata, - textblob.WithimeType(mime.MIME_YAML)) + textblob.WithMimeType(mime.MIME_YAML)) err = cv.SetResourceAccess(res) if err != nil { return errors.Wrapf(err, "cannot add yaml document") diff --git a/examples/lib/tour/05-transporting-component-versions/common.go b/examples/lib/tour/05-transporting-component-versions/common.go index e170b62eec..81fdab6c30 100644 --- a/examples/lib/tour/05-transporting-component-versions/common.go +++ b/examples/lib/tour/05-transporting-component-versions/common.go @@ -135,7 +135,7 @@ data: some very important data required to understand this component // component version. // The above case could be written as follows, also: res := textblob.ResourceAccess(cv.GetContext(), meta, yamldata, - textblob.WithimeType(mime.MIME_YAML)) + textblob.WithMimeType(mime.MIME_YAML)) err = cv.SetResourceAccess(res) if err != nil { return errors.Wrapf(err, "cannot add yaml document") diff --git a/examples/lib/tour/06-signing-component-versions/common.go b/examples/lib/tour/06-signing-component-versions/common.go index 094ae6c094..f0d013f572 100644 --- a/examples/lib/tour/06-signing-component-versions/common.go +++ b/examples/lib/tour/06-signing-component-versions/common.go @@ -141,7 +141,7 @@ data: some very important data required to understand this component // component version. // The above case could be written as follows, also: res := textblob.ResourceAccess(cv.GetContext(), meta, yamldata, - textblob.WithimeType(mime.MIME_YAML)) + textblob.WithMimeType(mime.MIME_YAML)) err = cv.SetResourceAccess(res) if err != nil { return errors.Wrapf(err, "cannot add yaml document") diff --git a/go.mod b/go.mod index df7787db42..84a8c9eeed 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,7 @@ require ( github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.21 github.com/aws/aws-sdk-go-v2/service/ecr v1.28.3 github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3 + github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 github.com/containerd/containerd v1.7.17 github.com/containerd/log v0.1.0 github.com/containers/image/v5 v5.31.0 @@ -38,7 +39,7 @@ require ( github.com/klauspost/compress v1.17.8 github.com/klauspost/pgzip v1.2.6 github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3 - github.com/mandelsoft/goutils v0.0.0-20240523093855-5385ed52b460 + github.com/mandelsoft/goutils v0.0.0-20240527090454-525d51156f92 github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf github.com/mandelsoft/spiff v1.7.0-beta-5 github.com/mandelsoft/vfs v0.4.3 diff --git a/go.sum b/go.sum index 8708b4b5d7..f635f11af8 100644 --- a/go.sum +++ b/go.sum @@ -681,8 +681,8 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3 h1:oo9nIgnyiBgYPbcZslRT4y29siuL5EoNJ/t1tr0xEVQ= github.com/mandelsoft/filepath v0.0.0-20240223090642-3e2777258aa3/go.mod h1:LxhqC7khDoRENwooP6f/vWvia9ivj6TqLYrR39zqkN0= -github.com/mandelsoft/goutils v0.0.0-20240523093855-5385ed52b460 h1:q44fRqo/PC3eTexd8Q3pO2BTHTABVXsW6DBXRUhC97E= -github.com/mandelsoft/goutils v0.0.0-20240523093855-5385ed52b460/go.mod h1:EbNqk9JceSMq7MJuALB/vlOpoD4MAGE0TenM9TR+C0o= +github.com/mandelsoft/goutils v0.0.0-20240527090454-525d51156f92 h1:JKHpPtPpkCA7AVRv5trXmqAcncjbfkjiv4x7wGSJnEc= +github.com/mandelsoft/goutils v0.0.0-20240527090454-525d51156f92/go.mod h1:EbNqk9JceSMq7MJuALB/vlOpoD4MAGE0TenM9TR+C0o= github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf h1:WEmgzeArDbp6Aw34jmziMIE5ygo2zpl/atXRq3D7lSw= github.com/mandelsoft/logging v0.0.0-20240201091719-67180059d6bf/go.mod h1:uO460C1lIB3IOOgrbXhAlz3AKsOv4T2K6ALBn3PwuSg= github.com/mandelsoft/spiff v1.7.0-beta-5 h1:3kC10nTviDQhL8diSxp7i4IC2iSiDg6KPbH1CAq7Lfw= diff --git a/pkg/blobaccess/maven/access.go b/pkg/blobaccess/maven/access.go new file mode 100644 index 0000000000..b9b963f5d9 --- /dev/null +++ b/pkg/blobaccess/maven/access.go @@ -0,0 +1,38 @@ +package maven + +import ( + "github.com/mandelsoft/goutils/optionutils" + + "github.com/open-component-model/ocm/pkg/blobaccess" + "github.com/open-component-model/ocm/pkg/blobaccess/bpi" + "github.com/open-component-model/ocm/pkg/maven" +) + +func DataAccessForMaven(repo *maven.Repository, groupId, artifactId, version string, opts ...Option) (blobaccess.DataAccess, error) { + return BlobAccessForMaven(repo, groupId, artifactId, version, opts...) +} + +func BlobAccessForMaven(repo *maven.Repository, groupId, artifactId, version string, opts ...Option) (blobaccess.BlobAccess, error) { + eff := optionutils.EvalOptions(opts...) + s := &spec{ + coords: maven.NewCoordinates(groupId, artifactId, version, maven.WithOptionalClassifier(eff.Classifier), maven.WithOptionalExtension(eff.Extension)), + repo: repo, + options: eff, + } + return s.getBlobAccess() +} + +func BlobAccessForMavenCoords(repo *maven.Repository, coords *maven.Coordinates, opts ...Option) (blobaccess.BlobAccess, error) { + return BlobAccessForMaven(repo, coords.GroupId, coords.ArtifactId, coords.Version, optionutils.WithDefaults(opts, WithOptionalClassifier(coords.Classifier), WithOptionalExtension(coords.Extension))...) +} + +func BlobAccessProviderForMaven(repo *maven.Repository, groupId, artifactId, version string, opts ...Option) bpi.BlobAccessProvider { + return bpi.BlobAccessProviderFunction(func() (bpi.BlobAccess, error) { + b, err := BlobAccessForMaven(repo, groupId, artifactId, version, opts...) + return b, err + }) +} + +func BlobAccessProviderForMavenCoords(repo *maven.Repository, coords *maven.Coordinates, opts ...Option) bpi.BlobAccessProvider { + return BlobAccessProviderForMaven(repo, coords.GroupId, coords.ArtifactId, coords.Version, optionutils.WithDefaults(opts, WithOptionalClassifier(coords.Classifier), WithOptionalExtension(coords.Extension))...) +} diff --git a/pkg/blobaccess/maven/access_test.go b/pkg/blobaccess/maven/access_test.go new file mode 100644 index 0000000000..e2e10c96df --- /dev/null +++ b/pkg/blobaccess/maven/access_test.go @@ -0,0 +1,125 @@ +package maven_test + +import ( + "github.com/open-component-model/ocm/pkg/maven/maventest" + "time" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/env/builder" + . "github.com/open-component-model/ocm/pkg/testutils" + + me "github.com/open-component-model/ocm/pkg/blobaccess/maven" + "github.com/open-component-model/ocm/pkg/maven" + "github.com/open-component-model/ocm/pkg/utils/tarutils" +) + +const ( + MAVEN_PATH = "/testdata/.m2/repository" + FAIL_PATH = "/testdata/.m2/fail" + MAVEN_CENTRAL_ADDRESS = "repo.maven.apache.org:443" + MAVEN_CENTRAL = "https://repo.maven.apache.org/maven2/" + MAVEN_GROUP_ID = "maven" + MAVEN_ARTIFACT_ID = "maven" + MAVEN_VERSION = "1.1" +) + +var _ = Describe("blobaccess for maven", func() { + + Context("maven filesystem repository", func() { + var env *Builder + var repo *maven.Repository + + BeforeEach(func() { + env = NewBuilder(maventest.TestData()) + repo = maven.NewFileRepository(MAVEN_PATH, env.FileSystem()) + }) + + AfterEach(func() { + MustBeSuccessful(env.Cleanup()) + }) + + It("blobaccess for gav", func() { + coords := maven.NewCoordinates("com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0") + + b := Must(me.BlobAccessForMaven(repo, coords.GroupId, coords.ArtifactId, coords.Version, me.WithCachingFileSystem(env.FileSystem()))) + defer Close(b, "blobaccess") + files := Must(tarutils.ListArchiveContentFromReader(Must(b.Reader()))) + Expect(files).To(ConsistOf("sdk-modules-bom-5.7.0.pom", "sdk-modules-bom-5.7.0.jar", "sdk-modules-bom-5.7.0-random-content.txt", + "sdk-modules-bom-5.7.0-random-content.json", "sdk-modules-bom-5.7.0-sources.jar")) + }) + + It("blobaccess for files with the same classifier", func() { + coords := maven.NewCoordinates("com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0", + maven.WithClassifier("random-content")) + + b := Must(me.BlobAccessForMavenCoords(repo, coords, me.WithCachingFileSystem(env.FileSystem()))) + defer Close(b, "blobaccess") + files := Must(tarutils.ListArchiveContentFromReader(Must(b.Reader()))) + Expect(files).To(ConsistOf("sdk-modules-bom-5.7.0-random-content.txt", + "sdk-modules-bom-5.7.0-random-content.json")) + }) + + It("blobaccess for files with empty classifier", func() { + coords := maven.NewCoordinates("com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0", + maven.WithClassifier("")) + + b := Must(me.BlobAccessForMavenCoords(repo, coords, me.WithCachingFileSystem(env.FileSystem()))) + defer Close(b, "blobaccess") + files := Must(tarutils.ListArchiveContentFromReader(Must(b.Reader()))) + Expect(files).To(ConsistOf("sdk-modules-bom-5.7.0.pom", + "sdk-modules-bom-5.7.0.jar")) + }) + + It("blobaccess for files with extension", func() { + coords := maven.NewCoordinates("com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0", + maven.WithExtension("jar")) + + b := Must(me.BlobAccessForMavenCoords(repo, coords, me.WithCachingFileSystem(env.FileSystem()))) + defer Close(b, "blobaccess") + files := Must(tarutils.ListArchiveContentFromReader(Must(b.Reader()))) + Expect(files).To(ConsistOf("sdk-modules-bom-5.7.0-sources.jar", + "sdk-modules-bom-5.7.0.jar")) + }) + + It("blobaccess for files with extension", func() { + coords := maven.NewCoordinates("com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0", + maven.WithExtension("txt")) + + b := Must(me.BlobAccessForMavenCoords(repo, coords, me.WithCachingFileSystem(env.FileSystem()))) + defer Close(b, "blobaccess") + files := Must(tarutils.ListArchiveContentFromReader(Must(b.Reader()))) + Expect(files).To(ConsistOf("sdk-modules-bom-5.7.0-random-content.txt")) + }) + + It("blobaccess for a single file with classifier and extension", func() { + coords := maven.NewCoordinates("com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0", + maven.WithClassifier("random-content"), maven.WithExtension("json")) + + b := Must(me.BlobAccessForMavenCoords(repo, coords, me.WithCachingFileSystem(env.FileSystem()))) + defer Close(b, "blobaccess") + Expect(string(Must(b.Get()))).To(Equal(`{"some": "test content"}`)) + }) + }) + + Context("maven http repository", func() { + if PingTCPServer(MAVEN_CENTRAL_ADDRESS, time.Second) == nil { + var coords *maven.Coordinates + BeforeEach(func() { + coords = maven.NewCoordinates(MAVEN_GROUP_ID, MAVEN_ARTIFACT_ID, MAVEN_VERSION) + }) + It("blobaccess for gav", func() { + repo := Must(maven.NewUrlRepository(MAVEN_CENTRAL)) + b := Must(me.BlobAccessForMavenCoords(repo, coords)) + defer Close(b, "blobaccess") + files := Must(tarutils.ListArchiveContentFromReader(Must(b.Reader()))) + Expect(files).To(ConsistOf( + "maven-1.1-RC1.javadoc.javadoc.jar", + "maven-1.1-sources.jar", + "maven-1.1.jar", + "maven-1.1.pom", + )) + }) + } + }) +}) diff --git a/pkg/blobaccess/maven/maven.go b/pkg/blobaccess/maven/maven.go new file mode 100644 index 0000000000..5d334937bb --- /dev/null +++ b/pkg/blobaccess/maven/maven.go @@ -0,0 +1,36 @@ +package maven + +import ( + "github.com/mandelsoft/goutils/optionutils" + "github.com/mandelsoft/vfs/pkg/vfs" + + "github.com/open-component-model/ocm/pkg/maven" +) + +type ( + BlobMeta = maven.FileMeta + Repository = maven.Repository + Coordinates = maven.Coordinates +) + +func NewFileRepository(path string, fss ...vfs.FileSystem) *Repository { + return maven.NewFileRepository(path, fss...) +} + +func NewUrlRepository(repoUrl string, fss ...vfs.FileSystem) (*Repository, error) { + return maven.NewUrlRepository(repoUrl, fss...) +} + +type optionwrapper struct { + options *Options +} + +func (o *optionwrapper) ApplyTo(opts *Coordinates) { + maven.WithOptionalExtension(o.options.Extension).ApplyTo(opts) + maven.WithOptionalClassifier(o.options.Classifier).ApplyTo(opts) +} + +func NewCoordinates(groupId, artifactId, version string, opts ...Option) *Coordinates { + eff := optionutils.EvalOptions(opts...) + return maven.NewCoordinates(groupId, artifactId, version, &optionwrapper{eff}) +} diff --git a/pkg/blobaccess/maven/options.go b/pkg/blobaccess/maven/options.go new file mode 100644 index 0000000000..8ceae8c2ea --- /dev/null +++ b/pkg/blobaccess/maven/options.go @@ -0,0 +1,204 @@ +package maven + +import ( + "github.com/mandelsoft/goutils/optionutils" + "github.com/mandelsoft/logging" + "github.com/mandelsoft/vfs/pkg/vfs" + + "github.com/open-component-model/ocm/pkg/contexts/credentials" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" + "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/tmpcache" + ocmlog "github.com/open-component-model/ocm/pkg/logging" + "github.com/open-component-model/ocm/pkg/maven" +) + +type Option = optionutils.Option[*Options] + +type Options struct { + CredentialContext credentials.Context + LoggingContext logging.Context + CachingContext datacontext.Context + CachingFileSystem vfs.FileSystem + CachingPath string + // Credentials allows to pass credentials and certificates for the http communication + Credentials credentials.Credentials + // Classifier defines the classifier of the maven file coordinates + Classifier *string + // Extension defines the extension of the maven file coordinates + Extension *string +} + +func (o *Options) Logger(keyValuePairs ...interface{}) logging.Logger { + return ocmlog.LogContext(o.LoggingContext, o.CredentialContext).Logger(maven.REALM).WithValues(keyValuePairs...) +} + +func (o *Options) Cache() *tmpcache.Attribute { + if o.CachingPath != "" { + return tmpcache.New(o.CachingPath, o.CachingFileSystem) + } + if o.CachingContext == nil { + return tmpcache.Get(o.CredentialContext) + } + return tmpcache.Get(o.CachingContext) +} + +func (o *Options) GetCredentials(repo *maven.Repository, groupId string) (maven.Credentials, error) { + if repo.IsFileSystem() { + return nil, nil + } + + switch { + case o.Credentials != nil: + return MapCredentials(o.Credentials), nil + case o.CredentialContext != nil: + return GetCredentials(o.CredentialContext, repo, groupId) + default: + return nil, nil + } +} + +func (o *Options) ApplyTo(opts *Options) { + if opts == nil { + return + } + if o.CredentialContext != nil { + opts.CredentialContext = o.CredentialContext + } + if o.LoggingContext != nil { + opts.LoggingContext = o.LoggingContext + } + if o.CachingFileSystem != nil { + opts.CachingFileSystem = o.CachingFileSystem + } + if o.Credentials != nil { + opts.Credentials = o.Credentials + } + if o.Classifier != nil { + opts.Classifier = o.Classifier + } + if o.Extension != nil { + opts.Extension = o.Extension + } +} + +//////////////////////////////////////////////////////////////////////////////// + +type context struct { + credentials.Context +} + +func (o context) ApplyTo(opts *Options) { + opts.CredentialContext = o +} + +func WithCredentialContext(ctx credentials.ContextProvider) Option { + return context{ctx.CredentialsContext()} +} + +//////////////////////////////////////////////////////////////////////////////// + +type loggingContext struct { + logging.Context +} + +func (o loggingContext) ApplyTo(opts *Options) { + opts.LoggingContext = o +} + +func WithLoggingContext(ctx logging.ContextProvider) Option { + return loggingContext{ctx.LoggingContext()} +} + +//////////////////////////////////////////////////////////////////////////////// + +type cachingContext struct { + datacontext.Context +} + +func (o cachingContext) ApplyTo(opts *Options) { + opts.CachingContext = o +} + +func WithCachingContext(ctx datacontext.Context) Option { + return cachingContext{ctx} +} + +//////////////////////////////////////////////////////////////////////////////// + +type cachingFileSystem struct { + fs vfs.FileSystem +} + +func (o *cachingFileSystem) ApplyTo(opts *Options) { + opts.CachingFileSystem = o.fs +} + +func WithCachingFileSystem(fs vfs.FileSystem) Option { + return &cachingFileSystem{fs: fs} +} + +//////////////////////////////////////////////////////////////////////////////// + +type cachingPath string + +func (o cachingPath) ApplyTo(opts *Options) { + opts.CachingPath = string(o) +} + +func WithCachingPath(p string) Option { + return cachingPath(p) +} + +/////////////////////////////////////////////////////////////////////////////// + +type creds struct { + credentials.Credentials +} + +func (o creds) ApplyTo(opts *Options) { + opts.Credentials = o.Credentials +} + +func WithCredentials(c credentials.Credentials) Option { + return creds{c} +} + +//////////////////////////////////////////////////////////////////////////////// + +type classifier string + +func (o classifier) ApplyTo(opts *Options) { + opts.Classifier = optionutils.PointerTo(string(o)) +} + +func WithClassifier(c string) Option { + return classifier(c) +} + +func WithOptionalClassifier(c *string) Option { + if c != nil { + return WithClassifier(*c) + } + return nil +} + +//////////////////////////////////////////////////////////////////////////////// + +type extension string + +func (o extension) ApplyTo(opts *Options) { + opts.Extension = optionutils.PointerTo(string(o)) +} + +func WithExtension(e string) Option { + return extension(e) +} + +func WithOptionalExtension(e *string) Option { + if e != nil { + return WithExtension(*e) + } + return nil +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/pkg/blobaccess/maven/suite_test.go b/pkg/blobaccess/maven/suite_test.go new file mode 100644 index 0000000000..b69187676e --- /dev/null +++ b/pkg/blobaccess/maven/suite_test.go @@ -0,0 +1,13 @@ +package maven_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Maven Blob Access Test Suite") +} diff --git a/pkg/blobaccess/maven/utils.go b/pkg/blobaccess/maven/utils.go new file mode 100644 index 0000000000..b1f4d774ba --- /dev/null +++ b/pkg/blobaccess/maven/utils.go @@ -0,0 +1,167 @@ +package maven + +import ( + "io" + + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/optionutils" + "github.com/mandelsoft/vfs/pkg/osfs" + "github.com/mandelsoft/vfs/pkg/vfs" + "github.com/opencontainers/go-digest" + + "github.com/open-component-model/ocm/pkg/blobaccess" + "github.com/open-component-model/ocm/pkg/blobaccess/bpi" + "github.com/open-component-model/ocm/pkg/common/accessio" + "github.com/open-component-model/ocm/pkg/common/accessobj" + "github.com/open-component-model/ocm/pkg/contexts/credentials" + "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/maven/identity" + "github.com/open-component-model/ocm/pkg/iotools" + "github.com/open-component-model/ocm/pkg/maven" + "github.com/open-component-model/ocm/pkg/mime" + "github.com/open-component-model/ocm/pkg/utils" + "github.com/open-component-model/ocm/pkg/utils/tarutils" +) + +type coords = *maven.Coordinates + +type spec struct { + coords + repo *maven.Repository + options *Options +} + +func (s *spec) getBlobAccess() (_ bpi.BlobAccess, rerr error) { + var finalize finalizer.Finalizer + defer finalize.FinalizeWithErrorPropagation(&rerr) + + log := s.options.Logger("RepoUrl", s.repo.String()) + creds, err := s.options.GetCredentials(s.repo, s.GroupId) + if err != nil { + return nil, err + } + fileMap, err := s.repo.GavFiles(s.coords, creds) + if err != nil { + return nil, err + } + + fileMap = s.coords.FilterFileMap(fileMap) + + switch l := len(fileMap); { + case l <= 0: + return nil, errors.New("no maven artifact files found") + case l == 1 && optionutils.AsValue(s.Extension) != "" && s.Classifier != nil: + for file, hash := range fileMap { + metadata, err := s.repo.GetFileMeta(s.coords, file, hash, creds) + if err != nil { + return nil, err + } + return blobAccessForRepositoryAccess(metadata, creds, s.options) + } + // default: continue below with: create tmpfs where all files can be downloaded to and packed together as tar.gz + } + + tmpfs, err := osfs.NewTempFileSystem() + if err != nil { + return nil, err + } + finalize.With(func() error { + return vfs.Cleanup(tmpfs) + }) + + for file, hash := range fileMap { + loop := finalize.Nested() + metadata, err := s.repo.GetFileMeta(s.coords, file, hash, creds) + if err != nil { + return nil, err + } + + // download the artifact into the temporary file system + out, err := tmpfs.Create(file) + if err != nil { + return nil, err + } + loop.Close(out) + + reader, err := metadata.Location.GetReader(creds) + if err != nil { + return nil, err + } + loop.Close(reader) + if hash > 0 { + dreader := iotools.NewDigestReaderWithHash(hash, reader) + _, err = io.Copy(out, dreader) + if err != nil { + return nil, err + } + sum := dreader.Digest().Encoded() + if metadata.Hash != sum { + return nil, errors.Newf("%s digest mismatch: expected %s, found %s", metadata.HashType, metadata.Hash, sum) + } + } else { + _, err = io.Copy(out, reader) + return nil, err + } + err = loop.Finalize() + if err != nil { + return nil, err + } + } + + // pack all downloaded files into a tar.gz file + fs := utils.FileSystem(s.options.CachingFileSystem) + tgz, err := vfs.TempFile(fs, "", "maven-"+s.coords.FileNamePrefix()+"-*.tar.gz") + if err != nil { + return nil, err + } + + dw := iotools.NewDigestWriterWith(digest.SHA256, tgz) + finalize.Close(dw) + + err = tarutils.TgzFs(tmpfs, dw) + if err != nil { + return nil, err + } + log.Debug("created", "file", tgz.Name()) + return blobaccess.ForTemporaryFilePathWithMeta(mime.MIME_TGZ, dw.Digest(), dw.Size(), tgz.Name(), fs), nil +} + +func blobAccessForRepositoryAccess(meta *BlobMeta, creds maven.Credentials, opts *Options) (bpi.BlobAccess, error) { + reader := func() (io.ReadCloser, error) { + return meta.Location.GetReader(creds) + } + if meta.Hash != "" { + getreader := reader + reader = func() (io.ReadCloser, error) { + readCloser, err := getreader() + if err != nil { + return nil, err + } + return iotools.VerifyingReaderWithHash(readCloser, meta.HashType, meta.Hash), nil + } + } + acc := blobaccess.DataAccessForReaderFunction(reader, meta.Location.String()) + return accessobj.CachedBlobAccessForWriterWithCache(opts.Cache(), meta.MimeType, accessio.NewDataAccessWriter(acc)), nil +} + +func MapCredentials(creds credentials.Credentials) maven.Credentials { + if creds == nil || (!creds.ExistsProperty(identity.ATTR_USERNAME) && !creds.ExistsProperty(identity.ATTR_PASSWORD)) { + return nil + } + return &maven.BasicAuthCredentials{ + Username: creds.GetProperty(identity.ATTR_USERNAME), + Password: creds.GetProperty(identity.ATTR_PASSWORD), + } +} + +func GetCredentials(ctx credentials.ContextProvider, repo *Repository, groupId string) (maven.Credentials, error) { + consumerid, err := identity.GetConsumerId(repo.String(), groupId) + if err != nil { + return nil, err + } + creds, err := credentials.CredentialsForConsumer(ctx, consumerid, identity.IdentityMatcher) + if err != nil { + return nil, err + } + return MapCredentials(creds), nil +} diff --git a/pkg/blobaccess/standard.go b/pkg/blobaccess/standard.go index ea8379cdf6..7555ac3114 100644 --- a/pkg/blobaccess/standard.go +++ b/pkg/blobaccess/standard.go @@ -321,6 +321,15 @@ func ForTemporaryFile(mime string, temp vfs.File, fss ...vfs.FileSystem) BlobAcc }) } +func ForTemporaryFileWithMeta(mime string, digest digest.Digest, size int64, temp vfs.File, fss ...vfs.FileSystem) BlobAccess { + return bpi.NewBlobAccessForBase(bpi.BaseAccessForDataAccessAndMeta(mime, &temporaryFileBlob{ + _blobAccess: ForFile(mime, temp.Name(), fss...), + filesystem: utils.FileSystem(fss...), + path: temp.Name(), + file: temp, + }, digest, size)) +} + func ForTemporaryFilePath(mime string, temp string, fss ...vfs.FileSystem) BlobAccess { return bpi.NewBlobAccessForBase(&temporaryFileBlob{ _blobAccess: ForFile(mime, temp, fss...), @@ -329,6 +338,14 @@ func ForTemporaryFilePath(mime string, temp string, fss ...vfs.FileSystem) BlobA }) } +func ForTemporaryFilePathWithMeta(mime string, digest digest.Digest, size int64, temp string, fss ...vfs.FileSystem) BlobAccess { + return bpi.NewBlobAccessForBase(bpi.BaseAccessForDataAccessAndMeta(mime, &temporaryFileBlob{ + _blobAccess: ForFile(mime, temp, fss...), + filesystem: utils.FileSystem(fss...), + path: temp, + }, digest, size)) +} + //////////////////////////////////////////////////////////////////////////////// type mimeBlob struct { diff --git a/pkg/blobaccess/wget/options.go b/pkg/blobaccess/wget/options.go index a14fb5614f..a808e4545c 100644 --- a/pkg/blobaccess/wget/options.go +++ b/pkg/blobaccess/wget/options.go @@ -64,6 +64,9 @@ func (o *Options) ApplyTo(opts *Options) { if o.LoggingContext != nil { opts.LoggingContext = o.LoggingContext } + if o.Credentials != nil { + opts.Credentials = o.Credentials + } if o.Header != nil { opts.Header = o.Header } diff --git a/pkg/common/accessio/retry_test.go b/pkg/common/accessio/retry_test.go index 73d764ff19..e67df7cf49 100644 --- a/pkg/common/accessio/retry_test.go +++ b/pkg/common/accessio/retry_test.go @@ -9,6 +9,7 @@ import ( . "github.com/open-component-model/ocm/pkg/testutils" "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/common/accessio" ) diff --git a/pkg/common/accessobj/cachedblob.go b/pkg/common/accessobj/cachedblob.go index 5ca6cfbab8..4e08c175ef 100644 --- a/pkg/common/accessobj/cachedblob.go +++ b/pkg/common/accessobj/cachedblob.go @@ -29,10 +29,14 @@ type CachedBlobAccess struct { var _ bpi.BlobAccessBase = (*CachedBlobAccess)(nil) func CachedBlobAccessForWriter(ctx datacontext.Context, mime string, src accessio.DataWriter) blobaccess.BlobAccess { + return CachedBlobAccessForWriterWithCache(tmpcache.Get(ctx), mime, src) +} + +func CachedBlobAccessForWriterWithCache(cache *tmpcache.Attribute, mime string, src accessio.DataWriter) blobaccess.BlobAccess { return bpi.NewBlobAccessForBase(&CachedBlobAccess{ source: src, mime: mime, - cache: tmpcache.Get(ctx), + cache: cache, }) } diff --git a/pkg/contexts/config/gc_test.go b/pkg/contexts/config/gc_test.go index 79e38c2974..996cb23388 100644 --- a/pkg/contexts/config/gc_test.go +++ b/pkg/contexts/config/gc_test.go @@ -6,9 +6,9 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/runtimefinalizer" me "github.com/open-component-model/ocm/pkg/contexts/config" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" ) var _ = Describe("area test", func() { diff --git a/pkg/contexts/credentials/builtin/mvn/identity/identity.go b/pkg/contexts/credentials/builtin/maven/identity/identity.go similarity index 67% rename from pkg/contexts/credentials/builtin/mvn/identity/identity.go rename to pkg/contexts/credentials/builtin/maven/identity/identity.go index 0a5bf6fc74..491e38b453 100644 --- a/pkg/contexts/credentials/builtin/mvn/identity/identity.go +++ b/pkg/contexts/credentials/builtin/maven/identity/identity.go @@ -1,30 +1,26 @@ package identity import ( - "errors" - "net/http" - . "net/url" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/credentials/identity/hostpath" - "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" "github.com/open-component-model/ocm/pkg/listformat" "github.com/open-component-model/ocm/pkg/logging" ) const ( - // CONSUMER_TYPE is the mvn repository type. + // CONSUMER_TYPE is the maven repository type. CONSUMER_TYPE = "MavenRepository" - // ATTR_USERNAME is the username attribute. Required for login at any mvn registry. + // ATTR_USERNAME is the username attribute. Required for login at any maven registry. ATTR_USERNAME = cpi.ATTR_USERNAME - // ATTR_PASSWORD is the password attribute. Required for login at any mvn registry. + // ATTR_PASSWORD is the password attribute. Required for login at any maven registry. ATTR_PASSWORD = cpi.ATTR_PASSWORD ) // REALM the logging realm / prefix. -var REALM = logging.DefineSubRealm("Maven repository", "mvn") +var REALM = logging.DefineSubRealm("Maven repository", "maven") func init() { attrs := listformat.FormatListElements("", listformat.StringElementDescriptionList{ @@ -64,19 +60,3 @@ func GetCredentials(ctx cpi.ContextProvider, repoUrl, groupId string) (cpi.Crede } return cpi.CredentialsForConsumer(ctx.CredentialsContext(), id) } - -func BasicAuth(req *http.Request, ctx accspeccpi.Context, repoUrl, groupId string) (err error) { - credentials, err := GetCredentials(ctx, repoUrl, groupId) - if err != nil { - return err - } - if credentials == nil { - logging.DynamicLogger(REALM).Debug("No credentials found. BasicAuth not required?", "url", repoUrl, "groupId", groupId) - return nil - } - if !credentials.ExistsProperty(ATTR_USERNAME) || !credentials.ExistsProperty(ATTR_PASSWORD) { - return errors.New("missing username or password in credentials") - } - req.SetBasicAuth(credentials.GetProperty(ATTR_USERNAME), credentials.GetProperty(ATTR_PASSWORD)) - return -} diff --git a/pkg/contexts/credentials/gc_test.go b/pkg/contexts/credentials/gc_test.go index 648e9a9e9c..c96f94c418 100644 --- a/pkg/contexts/credentials/gc_test.go +++ b/pkg/contexts/credentials/gc_test.go @@ -6,9 +6,9 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/runtimefinalizer" me "github.com/open-component-model/ocm/pkg/contexts/credentials" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" ) var _ = Describe("area test", func() { diff --git a/pkg/contexts/credentials/repositories/npm/repository_test.go b/pkg/contexts/credentials/repositories/npm/repository_test.go index e7fd29cfa6..82694bcc48 100644 --- a/pkg/contexts/credentials/repositories/npm/repository_test.go +++ b/pkg/contexts/credentials/repositories/npm/repository_test.go @@ -6,7 +6,6 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/runtimefinalizer" . "github.com/open-component-model/ocm/pkg/testutils" "github.com/open-component-model/ocm/pkg/common" @@ -14,6 +13,7 @@ import ( npmCredentials "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/npm/identity" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" local "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/npm" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" ) var _ = Describe("NPM config - .npmrc", func() { diff --git a/pkg/contexts/credentials/repositories/vault/repo_int_test.go b/pkg/contexts/credentials/repositories/vault/repo_int_test.go index 13456f8f36..3109660a3e 100644 --- a/pkg/contexts/credentials/repositories/vault/repo_int_test.go +++ b/pkg/contexts/credentials/repositories/vault/repo_int_test.go @@ -5,17 +5,16 @@ package vault_test import ( "context" "fmt" - "net" "os" "os/exec" "time" - "github.com/hashicorp/vault-client-go" - "github.com/hashicorp/vault-client-go/schema" - "github.com/mandelsoft/goutils/errors" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/hashicorp/vault-client-go" + "github.com/hashicorp/vault-client-go/schema" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials" @@ -23,7 +22,6 @@ import ( me "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault/identity" "github.com/open-component-model/ocm/pkg/runtime" - . "github.com/open-component-model/ocm/pkg/testutils" ) type vaultMode string @@ -461,32 +459,11 @@ func StartVaultServer(mode vaultMode, rootToken, address string) (*exec.Cmd, *va err = cmd.Start() if err == nil { - err = WaitForTCPServer(address, time.Minute) + err = PingTCPServer(address, time.Minute) } return cmd, vaultClient, cancelFunc, err } -func WaitForTCPServer(address string, dur time.Duration) error { - var conn net.Conn - var d net.Dialer - - ctx, cancel := context.WithTimeout(context.Background(), time.Minute) - defer cancel() - - end := time.Now().Add(dur) - err := errors.New("timed out waiting for server to start") - for time.Now().Before(end) { - conn, err = d.DialContext(ctx, "tcp", address) - if err != nil { - time.Sleep(time.Second) - continue - } - conn.Close() - break - } - return err -} - func SetUpVaultAccess(ctx context.Context, credctx credentials.Context, client *vault.Client, policy string) { _ = Must(client.System.AuthEnableMethod(ctx, "approle", schema.AuthEnableMethodRequest{Type: "approle"})) _ = Must(client.System.PoliciesWriteAclPolicy(ctx, VAULT_POLICY_NAME, schema.PoliciesWriteAclPolicyRequest{Policy: policy})) diff --git a/pkg/contexts/credentials/repositories/vault/repo_test.go b/pkg/contexts/credentials/repositories/vault/repo_test.go index 5eb7bdc748..72e3ee2d5c 100644 --- a/pkg/contexts/credentials/repositories/vault/repo_test.go +++ b/pkg/contexts/credentials/repositories/vault/repo_test.go @@ -7,12 +7,12 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/testutils" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials" me "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/vault/identity" - . "github.com/open-component-model/ocm/pkg/testutils" ) const ( diff --git a/pkg/contexts/datacontext/attrs/tmpcache/attr.go b/pkg/contexts/datacontext/attrs/tmpcache/attr.go index b71abfe230..bbe00a818f 100644 --- a/pkg/contexts/datacontext/attrs/tmpcache/attr.go +++ b/pkg/contexts/datacontext/attrs/tmpcache/attr.go @@ -62,6 +62,13 @@ type Attribute struct { Filesystem vfs.FileSystem } +func New(path string, fss ...vfs.FileSystem) *Attribute { + return &Attribute{ + Path: path, + Filesystem: utils.FileSystem(fss...), + } +} + func (a *Attribute) CreateTempFile(pat string) (vfs.File, error) { err := a.Filesystem.MkdirAll(a.Path, 0o777) if err != nil { @@ -73,8 +80,15 @@ func (a *Attribute) CreateTempFile(pat string) (vfs.File, error) { //////////////////////////////////////////////////////////////////////////////// func Get(ctx datacontext.Context) *Attribute { - v := ctx.GetAttributes().GetAttribute(ATTR_KEY) - fs := utils.FileSystem(vfsattr.Get(ctx)) + var v interface{} + var fs vfs.FileSystem + + if ctx != nil { + v = ctx.GetAttributes().GetAttribute(ATTR_KEY) + fs = utils.FileSystem(vfsattr.Get(ctx)) + } + fs = utils.FileSystem(fs) + if v != nil { a := v.(*Attribute) if a.Filesystem == nil { diff --git a/pkg/contexts/datacontext/attrs/vfsattr/attr.go b/pkg/contexts/datacontext/attrs/vfsattr/attr.go index c0b8858d23..5ba3ef9645 100644 --- a/pkg/contexts/datacontext/attrs/vfsattr/attr.go +++ b/pkg/contexts/datacontext/attrs/vfsattr/attr.go @@ -35,7 +35,7 @@ Virtual filesystem to use for command line context. func (a AttributeType) Encode(v interface{}, marshaller runtime.Marshaler) ([]byte, error) { if _, ok := v.(vfs.FileSystem); !ok { - return nil, fmt.Errorf("vfs.FileSystem required") + return nil, fmt.Errorf("vfs.CachingFileSystem required") } return nil, nil } diff --git a/pkg/contexts/oci/gc_test.go b/pkg/contexts/oci/gc_test.go index 404dbad31e..bc48501b92 100644 --- a/pkg/contexts/oci/gc_test.go +++ b/pkg/contexts/oci/gc_test.go @@ -6,9 +6,9 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/runtimefinalizer" me "github.com/open-component-model/ocm/pkg/contexts/oci" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" ) var _ = Describe("area test", func() { diff --git a/pkg/contexts/oci/repositories/ctf/ctf_test.go b/pkg/contexts/oci/repositories/ctf/ctf_test.go index 34aa84669f..5ca0cd470c 100644 --- a/pkg/contexts/oci/repositories/ctf/ctf_test.go +++ b/pkg/contexts/oci/repositories/ctf/ctf_test.go @@ -10,13 +10,13 @@ import ( . "github.com/open-component-model/ocm/pkg/contexts/oci/repositories/ctf/testhelper" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/errors" "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/logging" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/opencontainers/go-digest" - "github.com/mandelsoft/goutils/errors" "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" diff --git a/pkg/contexts/ocm/accessmethods/init.go b/pkg/contexts/ocm/accessmethods/init.go index f0a70ce7dd..55ffe41be8 100644 --- a/pkg/contexts/ocm/accessmethods/init.go +++ b/pkg/contexts/ocm/accessmethods/init.go @@ -6,7 +6,7 @@ import ( _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localblob" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localfsblob" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/localociblob" - _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/mvn" + _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/maven" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/none" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/npm" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/ociartifact" diff --git a/pkg/contexts/ocm/accessmethods/mvn/README.md b/pkg/contexts/ocm/accessmethods/maven/README.md similarity index 100% rename from pkg/contexts/ocm/accessmethods/mvn/README.md rename to pkg/contexts/ocm/accessmethods/maven/README.md diff --git a/pkg/contexts/ocm/accessmethods/mvn/cli.go b/pkg/contexts/ocm/accessmethods/maven/cli.go similarity index 73% rename from pkg/contexts/ocm/accessmethods/mvn/cli.go rename to pkg/contexts/ocm/accessmethods/maven/cli.go index dd81479a6b..db82b8a8b9 100644 --- a/pkg/contexts/ocm/accessmethods/mvn/cli.go +++ b/pkg/contexts/ocm/accessmethods/maven/cli.go @@ -1,4 +1,4 @@ -package mvn +package maven import ( "github.com/open-component-model/ocm/pkg/cobrautils/flagsets" @@ -10,7 +10,7 @@ func ConfigHandler() flagsets.ConfigOptionTypeSetHandler { Type, AddConfig, options.RepositoryOption, options.GroupOption, - options.PackageOption, + options.ArtifactOption, options.VersionOption, // optional options.ClassifierOption, @@ -19,7 +19,7 @@ func ConfigHandler() flagsets.ConfigOptionTypeSetHandler { } func AddConfig(opts flagsets.ConfigOptions, config flagsets.Config) error { - flagsets.AddFieldByOptionP(opts, options.RepositoryOption, config, "repository") + flagsets.AddFieldByOptionP(opts, options.RepositoryOption, config, "repoUrl") flagsets.AddFieldByOptionP(opts, options.GroupOption, config, "groupId") flagsets.AddFieldByOptionP(opts, options.PackageOption, config, "artifactId") flagsets.AddFieldByOptionP(opts, options.VersionOption, config, "version") @@ -30,33 +30,33 @@ func AddConfig(opts flagsets.ConfigOptions, config flagsets.Config) error { } var usage = ` -This method implements the access of a Maven (mvn) artifact in a Maven repository. +This method implements the access of a Maven artifact in a Maven repository. ` var formatV1 = ` The type specific specification fields are: -- **repository** *string* +- **repoUrl** *string* - Base URL of the Maven (mvn) repository + URL of the Maven repository - **groupId** *string* - The groupId of the Maven (mvn) artifact + The groupId of the Maven artifact - **artifactId** *string* - The artifactId of the Maven (mvn) artifact + The artifactId of the Maven artifact - **version** *string* - The version name of the Maven (mvn) artifact + The version name of the Maven artifact - **classifier** *string* - The optional classifier of the Maven (mvn) artifact + The optional classifier of the Maven artifact - **extension** *string* - The optional extension of the Maven (mvn) artifact + The optional extension of the Maven artifact ` diff --git a/pkg/contexts/ocm/accessmethods/maven/method.go b/pkg/contexts/ocm/accessmethods/maven/method.go new file mode 100644 index 0000000000..d377c884fd --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/maven/method.go @@ -0,0 +1,159 @@ +package maven + +import ( + "fmt" + + "github.com/mandelsoft/goutils/optionutils" + + "github.com/open-component-model/ocm/pkg/blobaccess" + mavenblob "github.com/open-component-model/ocm/pkg/blobaccess/maven" + "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/maven/identity" + "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" + "github.com/open-component-model/ocm/pkg/maven" + "github.com/open-component-model/ocm/pkg/runtime" +) + +// Type is the access type of Maven repository. +const ( + Type = "maven" + TypeV1 = Type + runtime.VersionSeparator + "v1" +) + +func init() { + accspeccpi.RegisterAccessType(accspeccpi.NewAccessSpecType[*AccessSpec](Type, accspeccpi.WithDescription(usage))) + accspeccpi.RegisterAccessType(accspeccpi.NewAccessSpecType[*AccessSpec](TypeV1, accspeccpi.WithFormatSpec(formatV1), accspeccpi.WithConfigHandler(ConfigHandler()))) +} + +// AccessSpec describes the access for a Maven artifact. +type AccessSpec struct { + runtime.ObjectVersionedType `json:",inline"` + + // RepoUrl is the base URL of the Maven repository. + RepoUrl string `json:"repoUrl"` + + maven.Coordinates `json:",inline"` +} + +// Option defines the interface function "ApplyTo()". +type Option = maven.CoordinateOption + +type WithClassifier = maven.WithClassifier + +func WithOptionalClassifier(c *string) Option { + return maven.WithOptionalClassifier(c) +} + +type WithExtension = maven.WithExtension + +func WithOptionalExtension(e *string) Option { + return maven.WithOptionalExtension(e) +} + +/////////////////////////////////////////////////////////////////////////////// + +var _ accspeccpi.AccessSpec = (*AccessSpec)(nil) + +// New creates a new Maven repository access spec version v1. +func New(repository, groupId, artifactId, version string, opts ...Option) *AccessSpec { + accessSpec := &AccessSpec{ + ObjectVersionedType: runtime.NewVersionedTypedObject(Type), + RepoUrl: repository, + Coordinates: *maven.NewCoordinates(groupId, artifactId, version, opts...), + } + return accessSpec +} + +// NewForCoordinates creates a new Maven repository access spec version v1. +func NewForCoordinates(repository string, coords *maven.Coordinates, opts ...Option) *AccessSpec { + optionutils.ApplyOptions(coords, opts...) + accessSpec := &AccessSpec{ + ObjectVersionedType: runtime.NewVersionedTypedObject(Type), + RepoUrl: repository, + Coordinates: *coords, + } + return accessSpec +} + +func (a *AccessSpec) Describe(_ accspeccpi.Context) string { + return fmt.Sprintf("Maven package '%s' in repository '%s' path '%s'", a.Coordinates.String(), a.RepoUrl, a.Coordinates.FilePath()) +} + +func (_ *AccessSpec) IsLocal(accspeccpi.Context) bool { + return false +} + +func (a *AccessSpec) GlobalAccessSpec(_ accspeccpi.Context) accspeccpi.AccessSpec { + return a +} + +// GetReferenceHint returns the reference hint for the Maven (mvn) artifact. +func (a *AccessSpec) GetReferenceHint(_ accspeccpi.ComponentVersionAccess) string { + return a.String() +} + +func (_ *AccessSpec) GetType() string { + return Type +} + +func (a *AccessSpec) AccessMethod(cv accspeccpi.ComponentVersionAccess) (accspeccpi.AccessMethod, error) { + octx := cv.GetContext() + + repo, err := maven.NewUrlRepository(a.RepoUrl, vfsattr.Get(cv.GetContext())) + if err != nil { + return nil, err + } + + factory := func() (blobaccess.BlobAccess, error) { + return mavenblob.BlobAccessForMavenCoords(repo, &a.Coordinates, + mavenblob.WithCredentialContext(octx), + mavenblob.WithLoggingContext(octx), + mavenblob.WithCachingFileSystem(vfsattr.Get(octx))) + } + return accspeccpi.AccessMethodForImplementation(accspeccpi.NewDefaultMethodImpl(cv, a, "", a.MimeType(), factory), nil) +} + +func (a *AccessSpec) GetInexpensiveContentVersionIdentity(cv accspeccpi.ComponentVersionAccess) string { + creds, err := identity.GetCredentials(cv.GetContext(), a.RepoUrl, a.GroupId) + if err != nil { + return "" + } + mvncreds := mavenblob.MapCredentials(creds) + fs := vfsattr.Get(cv.GetContext()) + repo, err := maven.NewUrlRepository(a.RepoUrl, fs) + if err != nil { + return "" + } + files, err := repo.GavFiles(&a.Coordinates, mvncreds) + if err != nil { + return "" + } + files = a.Coordinates.FilterFileMap(files) + if len(files) != 1 { + return "" + } + if optionutils.AsValue(a.Extension) == "" { + return "" + } + for _, h := range files { + id, _ := a.Location(repo).GetHash(mvncreds, h) + return id + } + return "" +} + +func (a *AccessSpec) BaseUrl() string { + return a.RepoUrl + "/" + a.GavPath() +} + +func (a *AccessSpec) ArtifactUrl() string { + repo, err := maven.NewUrlRepository(a.RepoUrl) + if err != nil { + return "" + } + return a.Location(repo).String() +} + +func (a *AccessSpec) GetCoordinates() *maven.Coordinates { + return a.Coordinates.Copy() +} diff --git a/pkg/contexts/ocm/accessmethods/maven/method_test.go b/pkg/contexts/ocm/accessmethods/maven/method_test.go new file mode 100644 index 0000000000..20310c92d0 --- /dev/null +++ b/pkg/contexts/ocm/accessmethods/maven/method_test.go @@ -0,0 +1,133 @@ +package maven_test + +import ( + "crypto" + "github.com/open-component-model/ocm/pkg/maven/maventest" + "time" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/env/builder" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/open-component-model/ocm/pkg/contexts/ocm" + me "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/maven" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + "github.com/open-component-model/ocm/pkg/iotools" + "github.com/open-component-model/ocm/pkg/mime" + "github.com/open-component-model/ocm/pkg/utils/tarutils" +) + +const ( + MAVEN_PATH = "/testdata/.m2/repository" + FAILPATH = "/testdata/.m2/fail" + MAVEN_CENTRAL = "https://repo.maven.apache.org/maven2/" + MAVEN_CENTRAL_ADDRESS = "repo.maven.apache.org:443" + MAVEN_GROUP_ID = "maven" + MAVEN_ARTIFACT_ID = "maven" + MAVEN_VERSION = "1.1" +) + +var _ = Describe("local accessmethods.maven.AccessSpec tests", func() { + var env *Builder + var cv ocm.ComponentVersionAccess + + BeforeEach(func() { + env = NewBuilder(maventest.TestData()) + cv = &cpi.DummyComponentVersionAccess{env.OCMContext()} + }) + + AfterEach(func() { + env.Cleanup() + }) + + It("accesses local artifact", func() { + acc := me.New("file://"+MAVEN_PATH, "com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0") + m := Must(acc.AccessMethod(cv)) + defer Close(m) + Expect(m.MimeType()).To(Equal(mime.MIME_TGZ)) + r := Must(m.Reader()) + defer Close(r) + dr := iotools.NewDigestReaderWithHash(crypto.SHA1, r) + for { + var buf [8096]byte + _, err := dr.Read(buf[:]) + if err != nil { + break + } + } + Expect(dr.Size()).To(Equal(int64(1570))) + Expect(dr.Digest().String()).To(Equal("SHA-1:359d02795bcc737e81c7f2f0ac32f49351d41867")) + }) + + It("accesses local artifact with empty classifier and with extension", func() { + acc := me.New("file://"+MAVEN_PATH, "com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0", me.WithClassifier(""), me.WithExtension("pom")) + m := Must(acc.AccessMethod(cv)) + defer Close(m) + Expect(m.MimeType()).To(Equal(mime.MIME_XML)) + r := Must(m.Reader()) + defer Close(r) + + dr := iotools.NewDigestReaderWithHash(crypto.SHA1, r) + for { + var buf [8096]byte + _, err := dr.Read(buf[:]) + if err != nil { + break + } + } + + Expect(dr.Size()).To(Equal(int64(7153))) + Expect(dr.Digest().String()).To(Equal("SHA-1:34ccdeb9c008f8aaef90873fc636b09d3ae5c709")) + }) + + It("accesses local artifact with extension", func() { + acc := me.New("file://"+MAVEN_PATH, "com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0", me.WithExtension("pom")) + m := Must(acc.AccessMethod(cv)) + defer Close(m) + Expect(m.MimeType()).To(Equal(mime.MIME_TGZ)) + r := Must(m.Reader()) + defer Close(r) + dr := iotools.NewDigestReaderWithHash(crypto.SHA1, r) + list := Must(tarutils.ListArchiveContentFromReader(dr)) + Expect(list).To(ConsistOf("sdk-modules-bom-5.7.0.pom")) + + Expect(dr.Size()).To(Equal(int64(1109))) + Expect(dr.Digest().String()).To(Equal("SHA-1:4ee125ffe4f7690588833f1217a13cc741e4df5f")) + }) + + It("Describe", func() { + acc := me.New("file://"+FAILPATH, "test", "repository", "42", me.WithExtension("pom")) + Expect(acc.Describe(nil)).To(Equal("Maven package 'test:repository:42::pom' in repository 'file:///testdata/.m2/fail' path 'test/repository/42/repository-42.pom'")) + }) + + It("detects digests mismatch", func() { + acc := me.New("file://"+FAILPATH, "test", "repository", "42", me.WithExtension("pom")) + m := Must(acc.AccessMethod(cv)) + defer Close(m) + _, err := m.Reader() + Expect(err).To(MatchError(ContainSubstring("SHA-1 digest mismatch: expected 44a77645201d1a8fc5213ace787c220eabbd0967, found b3242b8c31f8ce14f729b8fd132ac77bc4bc5bf7"))) + }) + + Context("me http repository", func() { + if PingTCPServer(MAVEN_CENTRAL_ADDRESS, time.Second) == nil { + It("blobaccess for gav", func() { + acc := me.New(MAVEN_CENTRAL, MAVEN_GROUP_ID, MAVEN_ARTIFACT_ID, MAVEN_VERSION) + m := Must(acc.AccessMethod(cv)) + defer Close(m) + files := Must(tarutils.ListArchiveContentFromReader(Must(m.Reader()))) + Expect(files).To(ConsistOf( + "maven-1.1-RC1.javadoc.javadoc.jar", + "maven-1.1-sources.jar", + "maven-1.1.jar", + "maven-1.1.pom", + )) + }) + + It("inexpensive id", func() { + acc := me.New(MAVEN_CENTRAL, MAVEN_GROUP_ID, MAVEN_ARTIFACT_ID, MAVEN_VERSION, me.WithClassifier(""), me.WithExtension("pom")) + Expect(acc.GetInexpensiveContentVersionIdentity(cv)).To(Equal("4fb753e1a4ab7acebc39557f1aa292052775b0d8")) + }) + } + }) +}) diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/suite_test.go b/pkg/contexts/ocm/accessmethods/maven/suite_test.go similarity index 72% rename from pkg/contexts/ocm/blobhandler/handlers/generic/mvn/suite_test.go rename to pkg/contexts/ocm/accessmethods/maven/suite_test.go index c62cadc7b0..d43b2dbd6b 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/suite_test.go +++ b/pkg/contexts/ocm/accessmethods/maven/suite_test.go @@ -1,4 +1,4 @@ -package mvn_test +package maven_test import ( "testing" @@ -9,5 +9,5 @@ import ( func TestConfig(t *testing.T) { RegisterFailHandler(Fail) - RunSpecs(t, "Maven (mvn) Test Suite") + RunSpecs(t, "Maven Test Suite") } diff --git a/pkg/contexts/ocm/accessmethods/mvn/coordinates.go b/pkg/contexts/ocm/accessmethods/mvn/coordinates.go deleted file mode 100644 index d39e09c2e5..0000000000 --- a/pkg/contexts/ocm/accessmethods/mvn/coordinates.go +++ /dev/null @@ -1,144 +0,0 @@ -package mvn - -import ( - "fmt" - "mime" - "path" - "path/filepath" - "strings" - - ocmmime "github.com/open-component-model/ocm/pkg/mime" -) - -// Coordinates holds the typical Maven coordinates groupId, artifactId, version. Optional also classifier and extension. -// https://maven.apache.org/ref/3.9.6/maven-core/artifact-handlers.html -type Coordinates struct { - // GroupId of the Maven (mvn) artifact. - GroupId string `json:"groupId"` - // ArtifactId of the Maven (mvn) artifact. - ArtifactId string `json:"artifactId"` - // Version of the Maven (mvn) artifact. - Version string `json:"version"` - // Classifier of the Maven (mvn) artifact. - Classifier string `json:"classifier"` - // Extension of the Maven (mvn) artifact. - Extension string `json:"extension"` -} - -// GAV returns the GAV coordinates of the Maven Coordinates. -func (c *Coordinates) GAV() string { - return c.GroupId + ":" + c.ArtifactId + ":" + c.Version -} - -// String returns the Coordinates as a string (GroupId:ArtifactId:Version:Classifier:Extension). -func (c *Coordinates) String() string { - return c.GroupId + ":" + c.ArtifactId + ":" + c.Version + ":" + c.Classifier + ":" + c.Extension -} - -// GavPath returns the Maven repository path. -func (c *Coordinates) GavPath() string { - return c.GroupPath() + "/" + c.ArtifactId + "/" + c.Version -} - -// FilePath returns the Maven Coordinates's GAV-name with classifier and extension. -// Which is equal to the URL-path of the artifact in the repository. -// Default extension is jar. -func (c *Coordinates) FilePath() string { - path := c.GavPath() + "/" + c.FileNamePrefix() - if c.Classifier != "" { - path += "-" + c.Classifier - } - if c.Extension != "" { - path += "." + c.Extension - } else { - path += ".jar" - } - return path -} - -func (c *Coordinates) Url(baseUrl string) string { - return baseUrl + "/" + c.FilePath() -} - -// GroupPath returns GroupId with `/` instead of `.`. -func (c *Coordinates) GroupPath() string { - return strings.ReplaceAll(c.GroupId, ".", "/") -} - -func (c *Coordinates) FileNamePrefix() string { - return c.ArtifactId + "-" + c.Version -} - -// Purl returns the Package URL of the Maven Coordinates. -func (c *Coordinates) Purl() string { - return "pkg:maven/" + c.GroupId + "/" + c.ArtifactId + "@" + c.Version -} - -// SetClassifierExtensionBy extracts the classifier and extension from the filename (without any path prefix). -func (c *Coordinates) SetClassifierExtensionBy(filename string) error { - s := strings.TrimPrefix(path.Base(filename), c.FileNamePrefix()) - if strings.HasPrefix(s, "-") { - s = strings.TrimPrefix(s, "-") - i := strings.Index(s, ".") - if i < 0 { - return fmt.Errorf("no extension after classifier found in filename: %s", filename) - } - c.Classifier = s[:i] - s = strings.TrimPrefix(s, c.Classifier) - } else { - c.Classifier = "" - } - c.Extension = strings.TrimPrefix(s, ".") - return nil -} - -// MimeType returns the MIME type of the Maven Coordinates based on the file extension. -// Default is application/x-tgz. -func (c *Coordinates) MimeType() string { - m := mime.TypeByExtension("." + c.Extension) - if m != "" { - return m - } - return ocmmime.MIME_TGZ -} - -// Copy creates a new Coordinates with the same values. -func (c *Coordinates) Copy() *Coordinates { - return &Coordinates{ - GroupId: c.GroupId, - ArtifactId: c.ArtifactId, - Version: c.Version, - Classifier: c.Classifier, - Extension: c.Extension, - } -} - -// Parse creates an Coordinates from it's serialized form (see Coordinates.String). -func Parse(serializedArtifact string) (*Coordinates, error) { - parts := strings.Split(serializedArtifact, ":") - if len(parts) < 3 { - return nil, fmt.Errorf("invalid artifact string: %s", serializedArtifact) - } - artifact := &Coordinates{ - GroupId: parts[0], - ArtifactId: parts[1], - Version: parts[2], - } - if len(parts) >= 4 { - artifact.Classifier = parts[3] - } - if len(parts) >= 5 { - artifact.Extension = parts[4] - } - return artifact, nil -} - -// IsResource returns true if the filename is not a checksum or signature file. -func IsResource(fileName string) bool { - switch filepath.Ext(fileName) { - case ".asc", ".md5", ".sha1", ".sha256", ".sha512": - return false - default: - return true - } -} diff --git a/pkg/contexts/ocm/accessmethods/mvn/coordinates_test.go b/pkg/contexts/ocm/accessmethods/mvn/coordinates_test.go deleted file mode 100644 index 63df1268ae..0000000000 --- a/pkg/contexts/ocm/accessmethods/mvn/coordinates_test.go +++ /dev/null @@ -1,55 +0,0 @@ -package mvn - -import ( - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("Maven Test Environment", func() { - - It("GAV, GroupPath, FilePath", func() { - artifact := &Coordinates{ - GroupId: "ocm.software", - ArtifactId: "hello-ocm", - Version: "0.0.1", - Extension: "jar", - } - Expect(artifact.GAV()).To(Equal("ocm.software:hello-ocm:0.0.1")) - Expect(artifact.GroupPath()).To(Equal("ocm/software")) - Expect(artifact.FilePath()).To(Equal("ocm/software/hello-ocm/0.0.1/hello-ocm-0.0.1.jar")) - }) - - It("SetClassifierExtensionBy", func() { - artifact := &Coordinates{ - GroupId: "ocm.software", - ArtifactId: "hello-ocm", - Version: "0.0.1", - } - artifact.SetClassifierExtensionBy("hello-ocm-0.0.1.pom") - Expect(artifact.Classifier).To(Equal("")) - Expect(artifact.Extension).To(Equal("pom")) - - artifact.SetClassifierExtensionBy("hello-ocm-0.0.1-tests.jar") - Expect(artifact.Classifier).To(Equal("tests")) - Expect(artifact.Extension).To(Equal("jar")) - - artifact.ArtifactId = "apache-maven" - artifact.Version = "3.9.6" - artifact.SetClassifierExtensionBy("apache-maven-3.9.6-bin.tar.gz") - Expect(artifact.Classifier).To(Equal("bin")) - Expect(artifact.Extension).To(Equal("tar.gz")) - }) - - It("parse GAV", func() { - gav := "org.apache.commons:commons-compress:1.26.1:cyclonedx:xml" - artifact, err := Parse(gav) - Expect(err).To(BeNil()) - Expect(artifact.String()).To(Equal(gav)) - Expect(artifact.GroupId).To(Equal("org.apache.commons")) - Expect(artifact.ArtifactId).To(Equal("commons-compress")) - Expect(artifact.Version).To(Equal("1.26.1")) - Expect(artifact.Classifier).To(Equal("cyclonedx")) - Expect(artifact.Extension).To(Equal("xml")) - Expect(artifact.FilePath()).To(Equal("org/apache/commons/commons-compress/1.26.1/commons-compress-1.26.1-cyclonedx.xml")) - }) -}) diff --git a/pkg/contexts/ocm/accessmethods/mvn/integration_test.go b/pkg/contexts/ocm/accessmethods/mvn/integration_test.go deleted file mode 100644 index b2eca2b1d0..0000000000 --- a/pkg/contexts/ocm/accessmethods/mvn/integration_test.go +++ /dev/null @@ -1,98 +0,0 @@ -//go:build integration - -package mvn_test - -import ( - "crypto" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - - "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/mvn" - "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - . "github.com/open-component-model/ocm/pkg/env" - . "github.com/open-component-model/ocm/pkg/env/builder" - "github.com/open-component-model/ocm/pkg/mime" - . "github.com/open-component-model/ocm/pkg/testutils" - "github.com/open-component-model/ocm/pkg/utils/tarutils" -) - -var _ = Describe("online accessmethods.mvn.AccessSpec integration tests", func() { - var env *Builder - var cv ocm.ComponentVersionAccess - - BeforeEach(func() { - env = NewBuilder(TestData()) - cv = &cpi.DummyComponentVersionAccess{env.OCMContext()} - }) - - AfterEach(func() { - env.Cleanup() - }) - - // https://repo1.maven.org/maven2/com/sap/cloud/sdk/sdk-modules-bom/5.7.0 - It("one single pom only", func() { - acc := mvn.New("https://repo1.maven.org/maven2", "com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0") - files, err := acc.GavFiles(cv.GetContext()) - Expect(err).ToNot(HaveOccurred()) - Expect(files).To(HaveLen(1)) - Expect(files["sdk-modules-bom-5.7.0.pom"]).To(Equal(crypto.SHA1)) - }) - It("GetPackageMeta - com.sap.cloud.sdk", func() { - acc := mvn.New("https://repo1.maven.org/maven2", "com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0") - meta, err := acc.GetPackageMeta(ocm.DefaultContext()) - Expect(err).ToNot(HaveOccurred()) - Expect(meta.Bin).To(HavePrefix("file://")) - Expect(meta.Bin).To(ContainSubstring("mvn-sdk-modules-bom-5.7.0-")) - Expect(meta.Bin).To(HaveSuffix(".tar.gz")) - Expect(meta.Hash).To(Equal("345fe2e640663c3cd6ac87b7afb92e1c934f665f75ddcb9555bc33e1813ef00b")) - Expect(meta.HashType).To(Equal(crypto.SHA256)) - }) - - // https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.6 - It("apache-maven, with bin + tar.gz etc.", func() { - acc := mvn.New("https://repo1.maven.org/maven2", "org.apache.maven", "apache-maven", "3.9.6") - Expect(acc).ToNot(BeNil()) - Expect(acc.BaseUrl()).To(Equal("https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.6")) - files, err := acc.GavFiles(cv.GetContext()) - Expect(err).ToNot(HaveOccurred()) - Expect(files).To(HaveLen(8)) - Expect(files["apache-maven-3.9.6-src.zip"]).To(Equal(crypto.SHA512)) - Expect(files["apache-maven-3.9.6.pom"]).To(Equal(crypto.SHA1)) - }) - - // https://repo1.maven.org/maven2/com/sap/cloud/environment/servicebinding/java-sap-vcap-services/0.10.4 - It("accesses local artifact", func() { - acc := mvn.New("https://repo1.maven.org/maven2", "com.sap.cloud.environment.servicebinding", "java-sap-vcap-services", "0.10.4") - meta, err := acc.GetPackageMeta(ocm.DefaultContext()) - Expect(err).ToNot(HaveOccurred()) - Expect(meta.Bin).To(HavePrefix("file://")) - m := Must(acc.AccessMethod(cv)) - defer m.Close() - Expect(m.MimeType()).To(Equal(mime.MIME_TGZ)) - /* manually also tested with repos: - - https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.26.1/ // cyclonedx - - https://repo1.maven.org/maven2/cn/afternode/commons/commons/1.6/ // gradle module! - */ - }) - - // https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.6 - It("apache-maven, 'bin' zip + tar.gz only!", func() { - acc := mvn.New("https://repo1.maven.org/maven2", "org.apache.maven", "apache-maven", "3.9.6", mvn.WithClassifier("bin")) - Expect(acc).ToNot(BeNil()) - Expect(acc.BaseUrl()).To(Equal("https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.6")) - files, err := acc.GavFiles(cv.GetContext()) - Expect(err).ToNot(HaveOccurred()) - Expect(files).To(HaveLen(8)) // the repo contains 8 files... - m := Must(acc.AccessMethod(cv)) - defer m.Close() - Expect(err).ToNot(HaveOccurred()) - Expect(m.MimeType()).To(Equal(mime.MIME_TGZ)) - r := Must(m.Reader()) - defer r.Close() - list, err := tarutils.ListArchiveContentFromReader(r) - Expect(err).ToNot(HaveOccurred()) - Expect(list).To(HaveLen(2)) // ...but with the classifier set, we're interested only in two! - }) -}) diff --git a/pkg/contexts/ocm/accessmethods/mvn/method.go b/pkg/contexts/ocm/accessmethods/mvn/method.go deleted file mode 100644 index d430b774c2..0000000000 --- a/pkg/contexts/ocm/accessmethods/mvn/method.go +++ /dev/null @@ -1,444 +0,0 @@ -package mvn - -import ( - "bytes" - "context" - "crypto" - "fmt" - "io" - "net/http" - "path" - "sort" - "strings" - - "github.com/mandelsoft/goutils/errors" - "github.com/mandelsoft/goutils/optionutils" - "github.com/mandelsoft/vfs/pkg/osfs" - "github.com/mandelsoft/vfs/pkg/vfs" - "github.com/opencontainers/go-digest" - "golang.org/x/exp/slices" - "golang.org/x/net/html" - - "github.com/open-component-model/ocm/pkg/blobaccess" - "github.com/open-component-model/ocm/pkg/common/accessio" - "github.com/open-component-model/ocm/pkg/common/accessobj" - "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/mvn/identity" - "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" - "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" - "github.com/open-component-model/ocm/pkg/iotools" - "github.com/open-component-model/ocm/pkg/logging" - "github.com/open-component-model/ocm/pkg/mime" - "github.com/open-component-model/ocm/pkg/runtime" - "github.com/open-component-model/ocm/pkg/utils" - "github.com/open-component-model/ocm/pkg/utils/tarutils" -) - -// Type is the access type of Maven (mvn) repository. -const ( - Type = "mvn" - TypeV1 = Type + runtime.VersionSeparator + "v1" -) - -func init() { - accspeccpi.RegisterAccessType(accspeccpi.NewAccessSpecType[*AccessSpec](Type, accspeccpi.WithDescription(usage))) - accspeccpi.RegisterAccessType(accspeccpi.NewAccessSpecType[*AccessSpec](TypeV1, accspeccpi.WithFormatSpec(formatV1), accspeccpi.WithConfigHandler(ConfigHandler()))) -} - -// AccessSpec describes the access for a Maven (mvn) artifact. -type AccessSpec struct { - runtime.ObjectVersionedType `json:",inline"` - - // Repository is the base URL of the Maven (mvn) repository. - Repository string `json:"repository"` - - Coordinates `json:",inline"` -} - -// Option defines the interface function "ApplyTo()". -type Option = optionutils.Option[*AccessSpec] - -var _ accspeccpi.AccessSpec = (*AccessSpec)(nil) - -var log = logging.DynamicLogger(identity.REALM) - -// New creates a new Maven (mvn) repository access spec version v1. -func New(repository, groupId, artifactId, version string, options ...Option) *AccessSpec { - accessSpec := &AccessSpec{ - ObjectVersionedType: runtime.NewVersionedTypedObject(Type), - Repository: repository, - Coordinates: Coordinates{ - GroupId: groupId, - ArtifactId: artifactId, - Version: version, - Classifier: "", - Extension: "", - }, - } - optionutils.ApplyOptions(accessSpec, options...) - return accessSpec -} - -// classifier Option for Maven (mvn) Coordinates. -type classifier string - -func (c classifier) ApplyTo(a *AccessSpec) { - a.Classifier = string(c) -} - -// WithClassifier sets the classifier of the Maven (mvn) artifact. -func WithClassifier(c string) Option { - return classifier(c) -} - -// extension Option for Maven (mvn) Coordinates. -type extension string - -func (e extension) ApplyTo(a *AccessSpec) { - a.Extension = string(e) -} - -// WithExtension sets the extension of the Maven (mvn) artifact. -func WithExtension(e string) Option { - return extension(e) -} - -func (a *AccessSpec) Describe(_ accspeccpi.Context) string { - return fmt.Sprintf("Maven (mvn) package '%s' in repository '%s' path '%s'", a.Coordinates.String(), a.Repository, a.Coordinates.FilePath()) -} - -func (_ *AccessSpec) IsLocal(accspeccpi.Context) bool { - return false -} - -func (a *AccessSpec) GlobalAccessSpec(_ accspeccpi.Context) accspeccpi.AccessSpec { - return a -} - -// GetReferenceHint returns the reference hint for the Maven (mvn) artifact. -func (a *AccessSpec) GetReferenceHint(_ accspeccpi.ComponentVersionAccess) string { - return a.String() -} - -func (_ *AccessSpec) GetType() string { - return Type -} - -func (a *AccessSpec) AccessMethod(c accspeccpi.ComponentVersionAccess) (accspeccpi.AccessMethod, error) { - return accspeccpi.AccessMethodForImplementation(newMethod(c, a)) -} - -func (a *AccessSpec) GetInexpensiveContentVersionIdentity(access accspeccpi.ComponentVersionAccess) string { - meta, _ := a.GetPackageMeta(access.GetContext()) - if meta != nil { - return meta.Hash - } - return "" -} - -func (a *AccessSpec) BaseUrl() string { - return a.Repository + "/" + a.GavPath() -} - -func (a *AccessSpec) ArtifactUrl() string { - return a.Url(a.Repository) -} - -func (a *AccessSpec) NewArtifact() *Coordinates { - return a.Coordinates.Copy() -} - -type meta struct { - MimeType string `json:"packaging"` - HashType crypto.Hash `json:"hashType"` - Hash string `json:"hash"` - Bin string `json:"bin"` -} - -func update(a *AccessSpec, file string, hash crypto.Hash, metadata *meta, ctx accspeccpi.Context, fs vfs.FileSystem) error { - artifact := a.NewArtifact() - err := artifact.SetClassifierExtensionBy(file) - if err != nil { - return err - } - metadata.Bin = artifact.Url(a.Repository) - log := log.WithValues("file", metadata.Bin) - log.Debug("processing") - metadata.MimeType = artifact.MimeType() - if hash > 0 { - metadata.HashType = hash - metadata.Hash, err = getStringData(ctx, metadata.Bin+hashUrlExt(hash), fs) - if err != nil { - return errors.Wrapf(err, "cannot read %s digest of: %s", hash, metadata.Bin) - } - } else { - log.Warn("no digest available") - } - return nil -} - -func (a *AccessSpec) GetPackageMeta(ctx accspeccpi.Context) (*meta, error) { - fs := vfsattr.Get(ctx) - - log := log.WithValues("BaseUrl", a.BaseUrl()) - fileMap, err := a.GavFiles(ctx, fs) - if err != nil { - return nil, err - } - - if a.Classifier != "" { - fileMap = filterByClassifier(fileMap, a.Classifier) - } - - switch l := len(fileMap); { - case l <= 0: - return nil, errors.New("no maven artifact files found") - case l == 1 && (a.Extension != "" || a.Classifier != ""): - metadata := meta{} - for file, hash := range fileMap { - update(a, file, hash, &metadata, ctx, fs) - } - return &metadata, nil - // default: continue below with: create tempFs where all files can be downloaded to and packed together as tar.gz - } - - if (a.Extension == "") != (a.Classifier == "") { // XOR - log.Warn("Either classifier or extension have been specified, which results in an incomplete GAV!") - } - tempFs, err := osfs.NewTempFileSystem() - if err != nil { - return nil, err - } - defer vfs.Cleanup(tempFs) - - metadata := meta{} - for file, hash := range fileMap { - update(a, file, hash, &metadata, ctx, fs) - - // download the artifact into the temporary file system - e := func() error { - out, err := tempFs.Create(file) - if err != nil { - return err - } - defer out.Close() - reader, err := getReader(ctx, metadata.Bin, fs) - if err != nil { - return err - } - defer reader.Close() - if hash > 0 { - dreader := iotools.NewDigestReaderWithHash(hash, reader) - _, err = io.Copy(out, dreader) - if err != nil { - return err - } - sum := dreader.Digest().Encoded() - if metadata.Hash != sum { - return errors.Newf("%s digest mismatch: expected %s, found %s", metadata.HashType, metadata.Hash, sum) - } - } else { - _, err = io.Copy(out, reader) - return err - } - return err - }() - if e != nil { - return nil, e - } - } - - // pack all downloaded files into a tar.gz file - tgz, err := vfs.TempFile(fs, "", Type+"-"+a.NewArtifact().FileNamePrefix()+"-*.tar.gz") - if err != nil { - return nil, err - } - defer tgz.Close() - - dw := iotools.NewDigestWriterWith(digest.SHA256, tgz) - defer dw.Close() - err = tarutils.TgzFs(tempFs, dw) - if err != nil { - return nil, err - } - - metadata.Bin = "file://" + tgz.Name() - metadata.MimeType = mime.MIME_TGZ - metadata.Hash = dw.Digest().Encoded() - metadata.HashType = crypto.SHA256 - log.Debug("created", "file", metadata.Bin) - - return &metadata, nil -} - -func filterByClassifier(fileMap map[string]crypto.Hash, classifier string) map[string]crypto.Hash { - for file := range fileMap { - if !strings.Contains(file, "-"+classifier+".") { - delete(fileMap, file) - } - } - return fileMap -} - -func (a *AccessSpec) GavFiles(ctx accspeccpi.Context, fs ...vfs.FileSystem) (map[string]crypto.Hash, error) { - if strings.HasPrefix(a.Repository, "file://") { - dir := path.Join(a.Repository[7:], a.GavPath()) - return gavFilesFromDisk(utils.FileSystem(fs...), dir) - } - return a.gavOnlineFiles(ctx) -} - -func gavFilesFromDisk(fs vfs.FileSystem, dir string) (map[string]crypto.Hash, error) { - files, err := tarutils.ListSortedFilesInDir(fs, dir, true) - if err != nil { - return nil, err - } - return filesAndHashes(files), nil -} - -// gavOnlineFiles returns the files of the Maven (mvn) artifact in the repository and their available digests. -func (a *AccessSpec) gavOnlineFiles(ctx accspeccpi.Context) (map[string]crypto.Hash, error) { - log := log.WithValues("BaseUrl", a.BaseUrl()) - log.Debug("gavOnlineFiles") - - reader, err := getReader(ctx, a.BaseUrl(), nil) - if err != nil { - return nil, err - } - defer reader.Close() - - // Which files are listed in the repository? - log.Debug("parse-html") - htmlDoc, err := html.Parse(reader) - if err != nil { - return nil, err - } - var fileList []string - var process func(*html.Node) - prefix := a.FileNamePrefix() - process = func(node *html.Node) { - // check if the node is an element node and the tag is "" - if node.Type == html.ElementNode && node.Data == "a" { - for _, attribute := range node.Attr { - if attribute.Key == "href" { - // check if the href starts with artifactId-version - if strings.HasPrefix(attribute.Val, prefix) { - fileList = append(fileList, attribute.Val) - } - } - } - } - for nextChild := node.FirstChild; nextChild != nil; nextChild = nextChild.NextSibling { - process(nextChild) // recursive call! - } - } - process(htmlDoc) - - return filesAndHashes(fileList), nil -} - -func filesAndHashes(fileList []string) map[string]crypto.Hash { - // Sort the list of files, to ensure always the same results for e.g. identical tar.gz files. - sort.Strings(fileList) - - // Which hash files are available? - result := make(map[string]crypto.Hash, len(fileList)/2) - for _, file := range fileList { - if IsResource(file) { - result[file] = bestAvailableHash(fileList, file) - log.Debug("found", "file", file) - } - } - return result -} - -// bestAvailableHash returns the best available hash for the given file. -// It first checks for SHA-512, then SHA-256, SHA-1, and finally MD5. If nothing is found, it returns 0. -func bestAvailableHash(list []string, filename string) crypto.Hash { - hashes := [5]crypto.Hash{crypto.SHA512, crypto.SHA256, crypto.SHA1, crypto.MD5} - for _, hash := range hashes { - if slices.Contains(list, filename+hashUrlExt(hash)) { - return hash - } - } - return 0 -} - -//////////////////////////////////////////////////////////////////////////////// - -// getStringData reads all data from the given URL and returns it as a string. -func getStringData(ctx accspeccpi.Context, url string, fs vfs.FileSystem) (string, error) { - r, err := getReader(ctx, url, fs) - if err != nil { - return "", err - } - defer r.Close() - b, err := io.ReadAll(r) - if err != nil { - return "", err - } - return string(b), nil -} - -// hashUrlExt returns the 'maven' hash extension for the given hash. -// Maven usually uses sha1, sha256, sha512, md5 instead of SHA-1, SHA-256, SHA-512, MD5. -func hashUrlExt(h crypto.Hash) string { - return "." + strings.ReplaceAll(strings.ToLower(h.String()), "-", "") -} - -func newMethod(c accspeccpi.ComponentVersionAccess, a *AccessSpec) (accspeccpi.AccessMethodImpl, error) { - factory := func() (blobaccess.BlobAccess, error) { - meta, err := a.GetPackageMeta(c.GetContext()) - if err != nil { - return nil, err - } - - reader := func() (io.ReadCloser, error) { - return getReader(c.GetContext(), meta.Bin, vfsattr.Get(c.GetContext())) - } - if meta.Hash != "" { - getreader := reader - reader = func() (io.ReadCloser, error) { - readCloser, err := getreader() - if err != nil { - return nil, err - } - return iotools.VerifyingReaderWithHash(readCloser, meta.HashType, meta.Hash), nil - } - } - acc := blobaccess.DataAccessForReaderFunction(reader, meta.Bin) - return accessobj.CachedBlobAccessForWriter(c.GetContext(), a.MimeType(), accessio.NewDataAccessWriter(acc)), nil - } - // FIXME add Digest! - return accspeccpi.NewDefaultMethodImpl(c, a, "", a.MimeType(), factory), nil -} - -func getReader(ctx accspeccpi.Context, url string, fs vfs.FileSystem) (io.ReadCloser, error) { - if strings.HasPrefix(url, "file://") { - path := url[7:] - return fs.OpenFile(path, vfs.O_RDONLY, 0o600) - } - - req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, url, nil) - if err != nil { - return nil, err - } - err = identity.BasicAuth(req, ctx, url, "") - if err != nil { - return nil, err - } - httpClient := &http.Client{} - resp, err := httpClient.Do(req) - if err != nil { - return nil, err - } - if resp.StatusCode != http.StatusOK { - defer resp.Body.Close() - buf := &bytes.Buffer{} - _, err = io.Copy(buf, io.LimitReader(resp.Body, 2000)) - if err == nil { - log.Error("http", "code", resp.Status, "url", url, "body", buf.String()) - } - return nil, errors.Newf("http %s error - %s", resp.Status, url) - } - return resp.Body, nil -} diff --git a/pkg/contexts/ocm/accessmethods/mvn/method_test.go b/pkg/contexts/ocm/accessmethods/mvn/method_test.go deleted file mode 100644 index 7b4ca85a80..0000000000 --- a/pkg/contexts/ocm/accessmethods/mvn/method_test.go +++ /dev/null @@ -1,87 +0,0 @@ -package mvn_test - -import ( - "crypto" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - - "github.com/open-component-model/ocm/pkg/contexts/ocm" - "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/mvn" - "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - . "github.com/open-component-model/ocm/pkg/env" - . "github.com/open-component-model/ocm/pkg/env/builder" - "github.com/open-component-model/ocm/pkg/iotools" - "github.com/open-component-model/ocm/pkg/mime" - . "github.com/open-component-model/ocm/pkg/testutils" -) - -const ( - mvnPATH = "/testdata/.m2/repository" - FAILPATH = "/testdata/fail" -) - -var _ = Describe("local accessmethods.mvn.AccessSpec tests", func() { - var env *Builder - var cv ocm.ComponentVersionAccess - - BeforeEach(func() { - env = NewBuilder(TestData()) - cv = &cpi.DummyComponentVersionAccess{env.OCMContext()} - }) - - AfterEach(func() { - env.Cleanup() - }) - - It("accesses local artifact", func() { - acc := mvn.New("file://"+mvnPATH, "com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0") - m := Must(acc.AccessMethod(cv)) - defer m.Close() - Expect(m.MimeType()).To(Equal(mime.MIME_TGZ)) - r := Must(m.Reader()) - defer r.Close() - dr := iotools.NewDigestReaderWithHash(crypto.SHA1, r) - for { - var buf [8096]byte - _, err := dr.Read(buf[:]) - if err != nil { - break - } - } - Expect(dr.Size()).To(Equal(int64(1109))) - Expect(dr.Digest().String()).To(Equal("SHA-1:4ee125ffe4f7690588833f1217a13cc741e4df5f")) - }) - - It("accesses local artifact with extension", func() { - acc := mvn.New("file://"+mvnPATH, "com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0", mvn.WithExtension("pom")) - m := Must(acc.AccessMethod(cv)) - defer m.Close() - Expect(m.MimeType()).To(Equal(mime.MIME_XML)) - r := Must(m.Reader()) - defer r.Close() - dr := iotools.NewDigestReaderWithHash(crypto.SHA1, r) - for { - var buf [8096]byte - _, err := dr.Read(buf[:]) - if err != nil { - break - } - } - Expect(dr.Size()).To(Equal(int64(7153))) - Expect(dr.Digest().String()).To(Equal("SHA-1:34ccdeb9c008f8aaef90873fc636b09d3ae5c709")) - }) - - It("Describe", func() { - acc := mvn.New("file://"+FAILPATH, "test", "repository", "42", mvn.WithExtension("pom")) - Expect(acc.Describe(nil)).To(Equal("Maven (mvn) package 'test:repository:42::pom' in repository 'file:///testdata/fail' path 'test/repository/42/repository-42.pom'")) - }) - - It("detects digests mismatch", func() { - acc := mvn.New("file://"+FAILPATH, "test", "repository", "42", mvn.WithExtension("pom")) - m := Must(acc.AccessMethod(cv)) - defer m.Close() - _, err := m.Reader() - Expect(err).To(MatchError(ContainSubstring("SHA-1 digest mismatch: expected 44a77645201d1a8fc5213ace787c220eabbd0967, found b3242b8c31f8ce14f729b8fd132ac77bc4bc5bf7"))) - }) -}) diff --git a/pkg/contexts/ocm/accessmethods/options/standard.go b/pkg/contexts/ocm/accessmethods/options/standard.go index 7e8680f12b..cc666b3ecc 100644 --- a/pkg/contexts/ocm/accessmethods/options/standard.go +++ b/pkg/contexts/ocm/accessmethods/options/standard.go @@ -18,8 +18,11 @@ var ReferenceOption = RegisterOption(NewStringOptionType("reference", "reference // PackageOption. var PackageOption = RegisterOption(NewStringOptionType("accessPackage", "package or object name")) +// ArtifactOption. +var ArtifactOption = RegisterOption(NewStringOptionType("artifactId", "maven artifact id")) + // GroupOption. -var GroupOption = RegisterOption(NewStringOptionType("accessGroup", "GroupID or namespace")) +var GroupOption = RegisterOption(NewStringOptionType("groupId", "maven group id")) // RepositoryOption. var RepositoryOption = RegisterOption(NewStringOptionType("accessRepository", "repository URL")) @@ -60,7 +63,7 @@ var HTTPRedirectOption = RegisterOption(NewBoolOptionType("noredirect", "http re var CommentOption = RegisterOption(NewStringOptionType("comment", "comment field value")) // ClassifierOption the optional classifier of a maven resource. -var ClassifierOption = RegisterOption(NewStringOptionType("accessClassifier", "mvn classifier")) +var ClassifierOption = RegisterOption(NewStringOptionType("classifier", "maven classifier")) // ExtensionOption the optional extension of a maven resource. -var ExtensionOption = RegisterOption(NewStringOptionType("accessExtension", "mvn extension name")) +var ExtensionOption = RegisterOption(NewStringOptionType("extension", "maven extension name")) diff --git a/pkg/contexts/ocm/accessmethods/wget/options.go b/pkg/contexts/ocm/accessmethods/wget/options.go index 4693d6c697..fcf667661f 100644 --- a/pkg/contexts/ocm/accessmethods/wget/options.go +++ b/pkg/contexts/ocm/accessmethods/wget/options.go @@ -4,10 +4,7 @@ import ( "io" "net/http" - "github.com/mandelsoft/logging" - "github.com/open-component-model/ocm/pkg/blobaccess/wget" - "github.com/open-component-model/ocm/pkg/contexts/credentials" ) type ( @@ -15,22 +12,10 @@ type ( Option = wget.Option ) -func WithCredentialContext(ctx credentials.ContextProvider) Option { - return wget.WithCredentialContext(ctx) -} - -func WithLoggingContext(ctx logging.ContextProvider) Option { - return wget.WithLoggingContext(ctx) -} - func WithMimeType(mime string) Option { return wget.WithMimeType(mime) } -func WithCredentials(c credentials.Credentials) Option { - return wget.WithCredentials(c) -} - func WithHeader(h http.Header) Option { return wget.WithHeader(h) } diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/maven/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/generic/maven/blobhandler.go new file mode 100644 index 0000000000..76dd8689bc --- /dev/null +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/maven/blobhandler.go @@ -0,0 +1,126 @@ +package maven + +import ( + "crypto" + + "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/vfs/pkg/vfs" + + mavenblob "github.com/open-component-model/ocm/pkg/blobaccess/maven" + "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/maven/identity" + access "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/maven" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" + "github.com/open-component-model/ocm/pkg/iotools" + "github.com/open-component-model/ocm/pkg/logging" + "github.com/open-component-model/ocm/pkg/maven" + "github.com/open-component-model/ocm/pkg/mime" + "github.com/open-component-model/ocm/pkg/utils/tarutils" +) + +const BlobHandlerName = "ocm/" + resourcetypes.MAVEN_ARTIFACT + +type artifactHandler struct { + spec *Config +} + +func NewArtifactHandler(repospec *Config) cpi.BlobHandler { + return &artifactHandler{repospec} +} + +var log = logging.DynamicLogger(identity.REALM) + +func (b *artifactHandler) StoreBlob(blob cpi.BlobAccess, resourceType string, hint string, _ cpi.AccessSpec, ctx cpi.StorageContext) (_ cpi.AccessSpec, rerr error) { + var finalize finalizer.Finalizer + defer finalize.FinalizeWithErrorPropagation(&rerr) + + // check conditions + if b.spec == nil { + return nil, nil + } + mimeType := blob.MimeType() + if resourcetypes.MAVEN_ARTIFACT != resourceType { + log.Debug("not a MVN artifact", "resourceType", resourceType) + return nil, nil + } + if mime.MIME_TGZ != mimeType { + log.Debug("not a tarball, can't be a complete maven GAV", "mimeType", mimeType) + return nil, nil + } + + repo, err := b.spec.GetRepository(ctx.GetContext()) + if err != nil { + return nil, err + } + + // setup logger + log := log.WithValues("repository", repo.String()) + // identify artifact + coords, err := maven.Parse(hint) + if err != nil { + return nil, err + } + if coords.Classifier != nil || coords.Extension != nil { + return nil, nil + } + log = log.WithValues("groupId", coords.GroupId, "artifactId", coords.ArtifactId, "version", coords.Version) + log.Debug("identified") + + blobReader, err := blob.Reader() + if err != nil { + return nil, err + } + finalize.Close(blobReader) + tempFs, err := tarutils.ExtractTgzToTempFs(blobReader) + if err != nil { + return nil, err + } + finalize.With(func() error { return vfs.Cleanup(tempFs) }) + files, err := tarutils.ListSortedFilesInDir(tempFs, "", false) + if err != nil { + return nil, err + } + for _, file := range files { + loop := finalize.Nested() + log.Debug("uploading", "file", file) + err := coords.SetClassifierExtensionBy(file) + if err != nil { + return nil, err + } + readHash, err := tempFs.Open(file) + if err != nil { + return nil, err + } + loop.Close(readHash) + // MD5 + SHA1 are still the most used ones in the maven context + hr := iotools.NewHashReader(readHash, crypto.SHA256, crypto.SHA1, crypto.MD5) + _, err = hr.CalcHashes() + if err != nil { + return nil, err + } + reader, err := tempFs.Open(file) + if err != nil { + return nil, err + } + loop.Close(reader) + creds, err := mavenblob.GetCredentials(ctx.GetContext(), repo, coords.GroupId) + if err != nil { + return nil, err + } + err = repo.Upload(coords, reader, creds, hr.Hashes()) + if err != nil { + return nil, err + } + err = loop.Finalize() + if err != nil { + return nil, err + } + } + + log.Debug("done", "artifact", coords) + url, err := repo.Url() + if err != nil { + return nil, err + } + return access.New(url, coords.GroupId, coords.ArtifactId, coords.Version), nil +} diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/maven/blobhandler_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/maven/blobhandler_test.go new file mode 100644 index 0000000000..76532ed6bf --- /dev/null +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/maven/blobhandler_test.go @@ -0,0 +1,101 @@ +package maven_test + +import ( + "encoding/json" + "github.com/open-component-model/ocm/pkg/maven/maventest" + "os" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/env/builder" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/mandelsoft/goutils/sliceutils" + "github.com/mandelsoft/vfs/pkg/vfs" + + mavenblob "github.com/open-component-model/ocm/pkg/blobaccess/maven" + me "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/generic/maven" + "github.com/open-component-model/ocm/pkg/contexts/ocm/elements" + "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/composition" + "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" + "github.com/open-component-model/ocm/pkg/maven" +) + +const MAVEN_PATH = "/testdata/.m2/repository" + +var _ = Describe("blobhandler generic maven tests", func() { + var env *Builder + var repo *maven.Repository + + BeforeEach(func() { + env = NewBuilder(maventest.TestData()) + repo = maven.NewFileRepository(MAVEN_PATH, env.FileSystem()) + }) + + It("Unmarshal upload response Body", func() { + resp := `{ "repo" : "ocm-mvn-test", + "path" : "/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar", + "created" : "2024-04-11T15:09:28.920Z", + "createdBy" : "john.doe", + "downloadUri" : "https://ocm.sofware/repository/ocm-mvn-test/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar", + "mimeType" : "application/java-archive", + "size" : "1792", + "checksums" : { + "sha1" : "99d9acac1ff93ac3d52229edec910091af1bc40a", + "md5" : "6cb7520b65d820b3b35773a8daa8368e", + "sha256" : "b19dcd275f72a0cbdead1e5abacb0ef25a0cb55ff36252ef44b1178eeedf9c30" }, + "originalChecksums" : { + "sha256" : "b19dcd275f72a0cbdead1e5abacb0ef25a0cb55ff36252ef44b1178eeedf9c30" }, + "uri" : "https://ocm.sofware/repository/ocm-mvn-test/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar" }` + var body maven.Body + err := json.Unmarshal([]byte(resp), &body) + Expect(err).To(BeNil()) + Expect(body.Repo).To(Equal("ocm-mvn-test")) + Expect(body.DownloadUri).To(Equal("https://ocm.sofware/repository/ocm-mvn-test/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar")) + Expect(body.Uri).To(Equal("https://ocm.sofware/repository/ocm-mvn-test/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar")) + Expect(body.MimeType).To(Equal("application/java-archive")) + Expect(body.Size).To(Equal("1792")) + Expect(body.Checksums["md5"]).To(Equal("6cb7520b65d820b3b35773a8daa8368e")) + Expect(body.Checksums["sha1"]).To(Equal("99d9acac1ff93ac3d52229edec910091af1bc40a")) + Expect(body.Checksums["sha256"]).To(Equal("b19dcd275f72a0cbdead1e5abacb0ef25a0cb55ff36252ef44b1178eeedf9c30")) + Expect(body.Checksums["sha512"]).To(Equal("")) + }) + + It("Upload artifact to file system", func() { + env.OCMContext().BlobHandlers().Register(me.NewArtifactHandler(me.NewFileConfig("target", env.FileSystem()))) + coords := maven.NewCoordinates("com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0") + bacc := Must(mavenblob.BlobAccessForMavenCoords(repo, coords, mavenblob.WithCachingFileSystem(env.FileSystem()))) + defer Close(bacc) + ocmrepo := composition.NewRepository(env) + defer Close(ocmrepo) + cv := composition.NewComponentVersion(env, "acme.org/test", "1.0.0") + MustBeSuccessful(cv.SetResourceBlob(Must(elements.ResourceMeta("test", resourcetypes.MAVEN_ARTIFACT)), bacc, coords.GAV(), nil)) + MustBeSuccessful(ocmrepo.AddComponentVersion(cv)) + l := sliceutils.Transform(Must(vfs.ReadDir(env.FileSystem(), "target/com/sap/cloud/sdk/sdk-modules-bom/5.7.0")), + func(info os.FileInfo) string { + return info.Name() + }) + Expect(l).To(ConsistOf( + "sdk-modules-bom-5.7.0-random-content.json", + "sdk-modules-bom-5.7.0-random-content.json.md5", + "sdk-modules-bom-5.7.0-random-content.json.sha1", + "sdk-modules-bom-5.7.0-random-content.json.sha256", + "sdk-modules-bom-5.7.0-random-content.txt", + "sdk-modules-bom-5.7.0-random-content.txt.md5", + "sdk-modules-bom-5.7.0-random-content.txt.sha1", + "sdk-modules-bom-5.7.0-random-content.txt.sha256", + "sdk-modules-bom-5.7.0-sources.jar", + "sdk-modules-bom-5.7.0-sources.jar.md5", + "sdk-modules-bom-5.7.0-sources.jar.sha1", + "sdk-modules-bom-5.7.0-sources.jar.sha256", + "sdk-modules-bom-5.7.0.jar", + "sdk-modules-bom-5.7.0.jar.md5", + "sdk-modules-bom-5.7.0.jar.sha1", + "sdk-modules-bom-5.7.0.jar.sha256", + "sdk-modules-bom-5.7.0.pom", + "sdk-modules-bom-5.7.0.pom.md5", + "sdk-modules-bom-5.7.0.pom.sha1", + "sdk-modules-bom-5.7.0.pom.sha256")) + }) + +}) diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration.go b/pkg/contexts/ocm/blobhandler/handlers/generic/maven/registration.go similarity index 51% rename from pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration.go rename to pkg/contexts/ocm/blobhandler/handlers/generic/maven/registration.go index be1436b455..f6024503c2 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/maven/registration.go @@ -1,23 +1,61 @@ -package mvn +package maven import ( "encoding/json" "fmt" "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/general" + "github.com/mandelsoft/vfs/pkg/vfs" + "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" + "github.com/open-component-model/ocm/pkg/maven" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/registrations" + "github.com/open-component-model/ocm/pkg/utils" ) +func init() { + cpi.RegisterBlobHandlerRegistrationHandler(BlobHandlerName, &RegistrationHandler{}) +} + type Config struct { - Url string `json:"url"` + Url string `json:"url"` + Path string `json:"path"` + FileSystem vfs.FileSystem `json:"-"` +} + +func NewFileConfig(path string, fss ...vfs.FileSystem) *Config { + return &Config{ + Path: path, + FileSystem: utils.FileSystem(fss...), + } +} + +func NewUrlConfig(url string, fss ...vfs.FileSystem) *Config { + return &Config{ + Url: url, + FileSystem: utils.FileSystem(fss...), + } } type rawConfig Config +func (c *Config) GetRepository(ctx cpi.ContextProvider) (*maven.Repository, error) { + if c.Url != "" && c.Path != "" { + return nil, fmt.Errorf("cannot specify both url and path") + } + if c.Url != "" { + return maven.NewUrlRepository(c.Url, general.OptionalDefaulted(vfsattr.Get(ctx.OCMContext()), c.FileSystem)) + } + if c.Path != "" { + return maven.NewFileRepository(c.Path, general.OptionalDefaulted(vfsattr.Get(ctx.OCMContext()), c.FileSystem)), nil + } + return nil, fmt.Errorf("must specify either url or path") +} + func (c *Config) UnmarshalJSON(data []byte) error { err := json.Unmarshal(data, &c.Url) if err == nil { @@ -33,20 +71,16 @@ func (c *Config) UnmarshalJSON(data []byte) error { return nil } -func init() { - cpi.RegisterBlobHandlerRegistrationHandler(BlobHandlerName, &RegistrationHandler{}) -} - type RegistrationHandler struct{} var _ cpi.BlobHandlerRegistrationHandler = (*RegistrationHandler)(nil) func (r *RegistrationHandler) RegisterByName(handler string, ctx cpi.Context, config cpi.BlobHandlerConfig, olist ...cpi.BlobHandlerOption) (bool, error) { if handler != "" { - return true, fmt.Errorf("invalid %s handler %q", resourcetypes.MVN_ARTIFACT, handler) + return true, fmt.Errorf("invalid %s handler %q", resourcetypes.MAVEN_ARTIFACT, handler) } if config == nil { - return true, fmt.Errorf("mvn target specification required") + return true, fmt.Errorf("maven target specification required") } cfg, err := registrations.DecodeConfig[Config](config) if err != nil { @@ -54,7 +88,7 @@ func (r *RegistrationHandler) RegisterByName(handler string, ctx cpi.Context, co } ctx.BlobHandlers().Register(NewArtifactHandler(cfg), - cpi.ForArtifactType(resourcetypes.MVN_ARTIFACT), + cpi.ForArtifactType(resourcetypes.MAVEN_ARTIFACT), cpi.ForMimeType(mime.MIME_TGZ), cpi.NewBlobHandlerOptions(olist...), ) @@ -63,13 +97,13 @@ func (r *RegistrationHandler) RegisterByName(handler string, ctx cpi.Context, co } func (r *RegistrationHandler) GetHandlers(_ cpi.Context) registrations.HandlerInfos { - return registrations.NewLeafHandlerInfo("uploading mvn artifacts", ` -The `+BlobHandlerName+` uploader is able to upload mvn artifacts (whole GAV only!) -as artifact archive according to the mvn artifact spec. + return registrations.NewLeafHandlerInfo("uploading maven artifacts", ` +The `+BlobHandlerName+` uploader is able to upload maven artifacts (whole GAV only!) +as artifact archive according to the maven artifact spec. If registered the default mime type is: `+mime.MIME_TGZ+` It accepts a plain string for the URL or a config with the following field: -'url': the URL of the mvn repository. +'url': the URL of the maven repository. `, ) } diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/maven/registration_test.go similarity index 58% rename from pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration_test.go rename to pkg/contexts/ocm/blobhandler/handlers/generic/maven/registration_test.go index c64b3e13bb..e64514fbc6 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/registration_test.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/maven/registration_test.go @@ -1,23 +1,23 @@ -package mvn_test +package maven_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/testutils" - "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/generic/mvn" + "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/generic/maven" "github.com/open-component-model/ocm/pkg/registrations" ) var _ = Describe("Config deserialization Test Environment", func() { It("deserializes string", func() { - cfg := Must(registrations.DecodeConfig[mvn.Config]("test")) - Expect(cfg).To(Equal(&mvn.Config{Url: "test"})) + cfg := Must(registrations.DecodeConfig[maven.Config]("test")) + Expect(cfg).To(Equal(&maven.Config{Url: "test"})) }) It("deserializes struct", func() { - cfg := Must(registrations.DecodeConfig[mvn.Config](`{"Url":"test"}`)) - Expect(cfg).To(Equal(&mvn.Config{Url: "test"})) + cfg := Must(registrations.DecodeConfig[maven.Config](`{"url":"test"}`)) + Expect(cfg).To(Equal(&maven.Config{Url: "test"})) }) }) diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/maven/suite_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/maven/suite_test.go new file mode 100644 index 0000000000..d43b2dbd6b --- /dev/null +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/maven/suite_test.go @@ -0,0 +1,13 @@ +package maven_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Maven Test Suite") +} diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler.go deleted file mode 100644 index 0a11fcc96f..0000000000 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler.go +++ /dev/null @@ -1,180 +0,0 @@ -package mvn - -import ( - "context" - "crypto" - "encoding/json" - "fmt" - "io" - "net/http" - "strings" - - "github.com/mandelsoft/goutils/errors" - "github.com/mandelsoft/vfs/pkg/vfs" - - "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/mvn/identity" - "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/mvn" - "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi/accspeccpi" - "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - "github.com/open-component-model/ocm/pkg/iotools" - "github.com/open-component-model/ocm/pkg/logging" - "github.com/open-component-model/ocm/pkg/mime" - "github.com/open-component-model/ocm/pkg/utils/tarutils" -) - -const BlobHandlerName = "ocm/" + resourcetypes.MVN_ARTIFACT - -type artifactHandler struct { - spec *Config -} - -func NewArtifactHandler(repospec *Config) cpi.BlobHandler { - return &artifactHandler{repospec} -} - -var log = logging.DynamicLogger(identity.REALM) - -func (b *artifactHandler) StoreBlob(blob cpi.BlobAccess, resourceType string, hint string, _ cpi.AccessSpec, ctx cpi.StorageContext) (cpi.AccessSpec, error) { - // check conditions - if b.spec == nil { - return nil, nil - } - mimeType := blob.MimeType() - if resourcetypes.MVN_ARTIFACT != resourceType { - log.Debug("not a MVN artifact", "resourceType", resourceType) - return nil, nil - } - if mime.MIME_TGZ != mimeType { - log.Debug("not a tarball, can't be a complete mvn GAV", "mimeType", mimeType) - return nil, nil - } - if b.spec.Url == "" { - return nil, errors.New("MVN repository url not provided") - } - - // setup logger - log := log.WithValues("repository", b.spec.Url) - // identify artifact - artifact, err := mvn.Parse(hint) - if err != nil { - return nil, err - } - log = log.WithValues("groupId", artifact.GroupId, "artifactId", artifact.ArtifactId, "version", artifact.Version) - log.Debug("identified") - - blobReader, err := blob.Reader() - if err != nil { - return nil, err - } - defer blobReader.Close() - tempFs, err := tarutils.ExtractTgzToTempFs(blobReader) - if err != nil { - return nil, err - } - defer vfs.Cleanup(tempFs) - files, err := tarutils.ListSortedFilesInDir(tempFs, "", false) - if err != nil { - return nil, err - } - for _, file := range files { - e := func() (err error) { - log.Debug("uploading", "file", file) - err = artifact.SetClassifierExtensionBy(file) - if err != nil { - return - } - readHash, err := tempFs.Open(file) - if err != nil { - return - } - defer readHash.Close() - // MD5 + SHA1 are still the most used ones in the mvn context - hr := iotools.NewHashReader(readHash, crypto.SHA256, crypto.SHA1, crypto.MD5) - _, err = hr.CalcHashes() - if err != nil { - return - } - reader, err := tempFs.Open(file) - if err != nil { - return - } - defer reader.Close() - err = deploy(artifact, b.spec.Url, reader, ctx.GetContext(), hr) - return - }() - if e != nil { - return nil, e - } - } - - log.Debug("done", "artifact", artifact) - return mvn.New(b.spec.Url, artifact.GroupId, artifact.ArtifactId, artifact.Version, mvn.WithClassifier(artifact.Classifier), mvn.WithExtension(artifact.Extension)), nil -} - -// deploy an artifact to the specified destination. See https://jfrog.com/help/r/jfrog-rest-apis/deploy-artifact -func deploy(artifact *mvn.Coordinates, url string, reader io.ReadCloser, ctx accspeccpi.Context, hashes *iotools.HashReader) (err error) { - req, err := http.NewRequestWithContext(context.Background(), http.MethodPut, artifact.Url(url), reader) - if err != nil { - return - } - err = identity.BasicAuth(req, ctx, url, artifact.GroupPath()) - if err != nil { - return - } - // give the remote server a chance to decide based upon the checksum policy - for k, v := range hashes.HttpHeader() { - req.Header.Set(k, v) - } - - // Execute the request - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - return - } - defer resp.Body.Close() - - // Check the response - if resp.StatusCode != http.StatusCreated { - all, e := io.ReadAll(resp.Body) - if e != nil { - return e - } - return fmt.Errorf("http (%d) - failed to upload artifact: %s", resp.StatusCode, string(all)) - } - log.Debug("uploaded", "artifact", artifact, "extension", artifact.Extension, "classifier", artifact.Classifier) - - // Validate the response - especially the hash values with the ones we've tried to send - respBody, err := io.ReadAll(resp.Body) - if err != nil { - return - } - var artifactBody Body - err = json.Unmarshal(respBody, &artifactBody) - if err != nil { - return - } - - // let's check only SHA256 for now - digest := hashes.GetString(crypto.SHA256) - remoteDigest := artifactBody.Checksums[strings.ReplaceAll(strings.ToLower(crypto.SHA256.String()), "-", "")] - if remoteDigest == "" { - log.Warn("no checksum found for algorithm, we can't guarantee that the artifact has been uploaded correctly", "algorithm", crypto.SHA256) - } else if remoteDigest != digest { - return errors.New("failed to upload artifact: checksums do not match") - } - log.Debug("digests are ok", "remoteDigest", remoteDigest, "digest", digest) - return -} - -// Body is the response struct of a deployment from the MVN repository (JFrog Artifactory). -type Body struct { - Repo string `json:"repo"` - Path string `json:"path"` - DownloadUri string `json:"downloadUri"` - Uri string `json:"uri"` - MimeType string `json:"mimeType"` - Size string `json:"size"` - Checksums map[string]string `json:"checksums"` -} diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler_test.go deleted file mode 100644 index a632ace444..0000000000 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/mvn/blobhandler_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package mvn_test - -import ( - "encoding/json" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - - "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/generic/mvn" -) - -var _ = Describe("blobhandler generic mvn tests", func() { - - It("Unmarshal deploy response Body", func() { - resp := `{ "repo" : "ocm-mvn-test", - "path" : "/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar", - "created" : "2024-04-11T15:09:28.920Z", - "createdBy" : "john.doe", - "downloadUri" : "https://ocm.sofware/repository/ocm-mvn-test/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar", - "mimeType" : "application/java-archive", - "size" : "1792", - "checksums" : { - "sha1" : "99d9acac1ff93ac3d52229edec910091af1bc40a", - "md5" : "6cb7520b65d820b3b35773a8daa8368e", - "sha256" : "b19dcd275f72a0cbdead1e5abacb0ef25a0cb55ff36252ef44b1178eeedf9c30" }, - "originalChecksums" : { - "sha256" : "b19dcd275f72a0cbdead1e5abacb0ef25a0cb55ff36252ef44b1178eeedf9c30" }, - "uri" : "https://ocm.sofware/repository/ocm-mvn-test/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar" }` - var body mvn.Body - err := json.Unmarshal([]byte(resp), &body) - Expect(err).To(BeNil()) - Expect(body.Repo).To(Equal("ocm-mvn-test")) - Expect(body.DownloadUri).To(Equal("https://ocm.sofware/repository/ocm-mvn-test/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar")) - Expect(body.Uri).To(Equal("https://ocm.sofware/repository/ocm-mvn-test/open-component-model/hello-ocm/0.0.2/hello-ocm-0.0.2.jar")) - Expect(body.MimeType).To(Equal("application/java-archive")) - Expect(body.Size).To(Equal("1792")) - Expect(body.Checksums["md5"]).To(Equal("6cb7520b65d820b3b35773a8daa8368e")) - Expect(body.Checksums["sha1"]).To(Equal("99d9acac1ff93ac3d52229edec910091af1bc40a")) - Expect(body.Checksums["sha256"]).To(Equal("b19dcd275f72a0cbdead1e5abacb0ef25a0cb55ff36252ef44b1178eeedf9c30")) - Expect(body.Checksums["sha512"]).To(Equal("")) - }) - -}) diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration_test.go b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration_test.go index 89aae1d6e9..e254dd1ede 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration_test.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/registration_test.go @@ -17,7 +17,7 @@ var _ = Describe("Config deserialization Test Environment", func() { }) It("deserializes struct", func() { - cfg := Must(registrations.DecodeConfig[npm.Config](`{"Url":"test"}`)) + cfg := Must(registrations.DecodeConfig[npm.Config](`{"url":"test"}`)) Expect(cfg).To(Equal(&npm.Config{Url: "test"})) }) }) diff --git a/pkg/contexts/ocm/blobhandler/handlers/init.go b/pkg/contexts/ocm/blobhandler/handlers/init.go index b318fe2c9e..3fd4df2811 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/init.go +++ b/pkg/contexts/ocm/blobhandler/handlers/init.go @@ -1,7 +1,7 @@ package handlers import ( - _ "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/generic/mvn" + _ "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/generic/maven" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/generic/npm" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/generic/ocirepo" _ "github.com/open-component-model/ocm/pkg/contexts/ocm/blobhandler/handlers/oci/ocirepo" diff --git a/pkg/contexts/ocm/cpi/builder.go b/pkg/contexts/ocm/cpi/builder.go new file mode 100644 index 0000000000..ea045d4983 --- /dev/null +++ b/pkg/contexts/ocm/cpi/builder.go @@ -0,0 +1,50 @@ +package cpi + +import ( + "context" + + "github.com/open-component-model/ocm/pkg/contexts/credentials" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" + "github.com/open-component-model/ocm/pkg/contexts/oci" + "github.com/open-component-model/ocm/pkg/contexts/ocm/internal" +) + +func WithContext(ctx context.Context) internal.Builder { + return internal.Builder{}.WithContext(ctx) +} + +func WithCredentials(ctx credentials.Context) internal.Builder { + return internal.Builder{}.WithCredentials(ctx) +} + +func WithOCIRepositories(ctx oci.Context) internal.Builder { + return internal.Builder{}.WithOCIRepositories(ctx) +} + +func WithRepositoyTypeScheme(scheme RepositoryTypeScheme) internal.Builder { + return internal.Builder{}.WithRepositoyTypeScheme(scheme) +} + +func WithRepositoryDelegation(reg RepositoryDelegationRegistry) internal.Builder { + return internal.Builder{}.WithRepositoryDelegation(reg) +} + +func WithAccessypeScheme(scheme AccessTypeScheme) internal.Builder { + return internal.Builder{}.WithAccessTypeScheme(scheme) +} + +func WithRepositorySpecHandlers(reg RepositorySpecHandlers) internal.Builder { + return internal.Builder{}.WithRepositorySpecHandlers(reg) +} + +func WithBlobHandlers(reg BlobHandlerRegistry) internal.Builder { + return internal.Builder{}.WithBlobHandlers(reg) +} + +func WithBlobDigesters(reg BlobDigesterRegistry) internal.Builder { + return internal.Builder{}.WithBlobDigesters(reg) +} + +func New(mode ...datacontext.BuilderMode) Context { + return internal.Builder{}.New(mode...) +} diff --git a/pkg/contexts/ocm/cpi/interface.go b/pkg/contexts/ocm/cpi/interface.go index 1e62109d1b..8b605836ea 100644 --- a/pkg/contexts/ocm/cpi/interface.go +++ b/pkg/contexts/ocm/cpi/interface.go @@ -110,10 +110,6 @@ func DefaultBlobHandlerProvider(ctx Context) BlobHandlerProvider { return internal.DefaultBlobHandlerProvider(ctx) } -func New() Context { - return internal.Builder{}.New() -} - func NewResourceMeta(name string, typ string, relation metav1.ResourceRelation) *ResourceMeta { return compdesc.NewResourceMeta(name, typ, relation) } diff --git a/pkg/contexts/ocm/elements/artifactaccess/mavenaccess/options.go b/pkg/contexts/ocm/elements/artifactaccess/mavenaccess/options.go new file mode 100644 index 0000000000..8a965b6958 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactaccess/mavenaccess/options.go @@ -0,0 +1,20 @@ +package mavenaccess + +import "github.com/open-component-model/ocm/pkg/maven" + +type ( + Options = maven.Coordinates + Option = maven.CoordinateOption +) + +type WithClassifier = maven.WithClassifier + +func WithOptionalClassifier(c *string) Option { + return maven.WithOptionalClassifier(c) +} + +type WithExtension = maven.WithExtension + +func WithOptionalExtension(e *string) Option { + return maven.WithOptionalExtension(e) +} diff --git a/pkg/contexts/ocm/elements/artifactaccess/mavenaccess/resource.go b/pkg/contexts/ocm/elements/artifactaccess/mavenaccess/resource.go new file mode 100644 index 0000000000..d2a1d2b21e --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactaccess/mavenaccess/resource.go @@ -0,0 +1,39 @@ +package mavenaccess + +import ( + "github.com/open-component-model/ocm/pkg/contexts/ocm" + access "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/maven" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactaccess/genericaccess" + "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" + "github.com/open-component-model/ocm/pkg/maven" +) + +const TYPE = resourcetypes.MAVEN_ARTIFACT + +func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, repoUrl, groupId, artifactId, version string, opts ...Option) cpi.ArtifactAccess[M] { + if meta.GetType() == "" { + meta.SetType(TYPE) + } + + spec := access.New(repoUrl, groupId, artifactId, version, opts...) + // is global access, must work, otherwise there is an error in the lib. + return genericaccess.MustAccess(ctx, meta, spec) +} + +func ResourceAccess(ctx ocm.Context, meta *cpi.ResourceMeta, repoUrl, groupId, artifactId, version string, opts ...Option) cpi.ResourceAccess { + return Access(ctx, meta, repoUrl, groupId, artifactId, version, opts...) +} + +func ResourceAccessForMavenCoords(ctx ocm.Context, meta *cpi.ResourceMeta, repoUrl string, coords *maven.Coordinates) cpi.ResourceAccess { + return Access(ctx, meta, repoUrl, coords.GroupId, coords.ArtifactId, coords.Version, WithOptionalClassifier(coords.Classifier), WithOptionalExtension(coords.Extension)) +} + +func SourceAccess(ctx ocm.Context, meta *cpi.SourceMeta, repoUrl, groupId, artifactId, version string, opts ...Option) cpi.SourceAccess { + return Access(ctx, meta, repoUrl, groupId, artifactId, version, opts...) +} + +func SourceAccessForMavenCoords(ctx ocm.Context, meta *cpi.SourceMeta, repoUrl string, coords *maven.Coordinates) cpi.SourceAccess { + return Access(ctx, meta, repoUrl, coords.GroupId, coords.ArtifactId, coords.Version, WithOptionalClassifier(coords.Classifier), WithOptionalExtension(coords.Extension)) +} diff --git a/pkg/contexts/ocm/elements/artifactaccess/mvnaccess/resource.go b/pkg/contexts/ocm/elements/artifactaccess/mvnaccess/resource.go deleted file mode 100644 index 6c90b396a9..0000000000 --- a/pkg/contexts/ocm/elements/artifactaccess/mvnaccess/resource.go +++ /dev/null @@ -1,30 +0,0 @@ -package mvnaccess - -import ( - "github.com/open-component-model/ocm/pkg/contexts/ocm" - access "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/mvn" - "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" - "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" - "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactaccess/genericaccess" - "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" -) - -const TYPE = resourcetypes.MVN_ARTIFACT - -func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, repository, groupId, artifactId, version string) cpi.ArtifactAccess[M] { - if meta.GetType() == "" { - meta.SetType(TYPE) - } - - spec := access.New(repository, groupId, artifactId, version) - // is global access, must work, otherwise there is an error in the lib. - return genericaccess.MustAccess(ctx, meta, spec) -} - -func ResourceAccess(ctx ocm.Context, meta *cpi.ResourceMeta, repository, groupId, artifactId, version string) cpi.ResourceAccess { - return Access(ctx, meta, repository, groupId, artifactId, version) -} - -func SourceAccess(ctx ocm.Context, meta *cpi.SourceMeta, repository, groupId, artifactId, version string) cpi.SourceAccess { - return Access(ctx, meta, repository, groupId, artifactId, version) -} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/helmblob_test.go b/pkg/contexts/ocm/elements/artifactblob/helmblob/helmblob_test.go new file mode 100644 index 0000000000..1889da3ee4 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/helmblob_test.go @@ -0,0 +1,37 @@ +package helmblob_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/open-component-model/ocm/pkg/env/builder" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/open-component-model/ocm/pkg/common/accessobj" + metav1 "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc/meta/v1" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + me "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/helmblob" + ctfocm "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" + "github.com/open-component-model/ocm/pkg/env" +) + +var _ = Describe("", func() { + var e *Builder + + BeforeEach(func() { + e = NewBuilder(env.TestData()) + + }) + + AfterEach(func() { + MustBeSuccessful(e.Cleanup()) + }) + + It("", func() { + ctf := Must(ctfocm.Open(e, accessobj.ACC_CREATE, "/repo", 0o700, e, ctfocm.FormatDirectory)) + defer Close(ctf) + cv := Must(ctf.NewComponentVersion("ocm.software/test-component", "1.0.0")) + defer Close(cv) + MustBeSuccessful(cv.SetResourceAccess(me.ResourceAccess(e.OCMContext(), cpi.NewResourceMeta("helm1", "blob", metav1.LocalRelation), "/testdata/testchart1", me.WithFileSystem(e.FileSystem())))) + MustBeSuccessful(cv.SetResourceAccess(me.ResourceAccess(e.OCMContext(), cpi.NewResourceMeta("helm2", "blob", metav1.LocalRelation), "/testdata/testchart2", me.WithFileSystem(e.FileSystem())))) + MustBeSuccessful(ctf.AddComponentVersion(cv, true)) + }) +}) diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/suite_test.go b/pkg/contexts/ocm/elements/artifactblob/helmblob/suite_test.go new file mode 100644 index 0000000000..451b4150bc --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/suite_test.go @@ -0,0 +1,13 @@ +package helmblob_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Helm Blob Test Suite") +} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/.helmignore b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/.helmignore new file mode 100644 index 0000000000..0e8a0eb36f --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/.idea/somefile b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/.idea/somefile new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/Chart.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/Chart.yaml new file mode 100644 index 0000000000..01328a81ce --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/Chart.yaml @@ -0,0 +1,24 @@ +apiVersion: v2 +name: testchart1 +description: A Helm chart for Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "1.16.0" diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/NOTES.txt b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/NOTES.txt new file mode 100644 index 0000000000..45e51670a8 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/NOTES.txt @@ -0,0 +1,22 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "testchart.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "testchart.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "testchart.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "testchart.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/_helpers.tpl b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/_helpers.tpl new file mode 100644 index 0000000000..4b0db05bf5 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "testchart.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "testchart.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "testchart.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "testchart.labels" -}} +helm.sh/chart: {{ include "testchart.chart" . }} +{{ include "testchart.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "testchart.selectorLabels" -}} +app.kubernetes.io/name: {{ include "testchart.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "testchart.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "testchart.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/deployment.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/deployment.yaml new file mode 100644 index 0000000000..69b8e08feb --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/deployment.yaml @@ -0,0 +1,61 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "testchart.fullname" . }} + labels: + {{- include "testchart.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "testchart.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "testchart.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "testchart.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: 8080 + protocol: TCP + livenessProbe: + httpGet: + path: / + port: http + readinessProbe: + httpGet: + path: / + port: http + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/hpa.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/hpa.yaml new file mode 100644 index 0000000000..51734471d4 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/hpa.yaml @@ -0,0 +1,28 @@ +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "testchart.fullname" . }} + labels: + {{- include "testchart.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "testchart.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/ingress.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/ingress.yaml new file mode 100644 index 0000000000..9732d2a24a --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/ingress.yaml @@ -0,0 +1,61 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "testchart.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "testchart.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/service.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/service.yaml new file mode 100644 index 0000000000..86baf14821 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "testchart.fullname" . }} + labels: + {{- include "testchart.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "testchart.selectorLabels" . | nindent 4 }} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/serviceaccount.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/serviceaccount.yaml new file mode 100644 index 0000000000..f728deb2a6 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "testchart.serviceAccountName" . }} + labels: + {{- include "testchart.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/tests/test-connection.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/tests/test-connection.yaml new file mode 100644 index 0000000000..a391ef1c46 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/templates/tests/test-connection.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "testchart.fullname" . }}-test-connection" + labels: + {{- include "testchart.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "testchart.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/values.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/values.yaml new file mode 100644 index 0000000000..b598adba92 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart1/values.yaml @@ -0,0 +1,81 @@ +# Default values for testchart. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: gcr.io/google_containers/echoserver + pullPolicy: IfNotPresent + tag: "1.0" + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: {} + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 80 + +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: chart-example.local + paths: + - path: / + pathType: ImplementationSpecific + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/.helmignore b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/.helmignore new file mode 100644 index 0000000000..0e8a0eb36f --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/.idea/somefile b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/.idea/somefile new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/Chart.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/Chart.yaml new file mode 100644 index 0000000000..8f4b7146ce --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/Chart.yaml @@ -0,0 +1,24 @@ +apiVersion: v2 +name: testchart2 +description: A Helm chart for Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "1.16.0" diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/NOTES.txt b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/NOTES.txt new file mode 100644 index 0000000000..45e51670a8 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/NOTES.txt @@ -0,0 +1,22 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "testchart.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "testchart.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "testchart.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "testchart.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/_helpers.tpl b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/_helpers.tpl new file mode 100644 index 0000000000..4b0db05bf5 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "testchart.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "testchart.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "testchart.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "testchart.labels" -}} +helm.sh/chart: {{ include "testchart.chart" . }} +{{ include "testchart.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "testchart.selectorLabels" -}} +app.kubernetes.io/name: {{ include "testchart.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "testchart.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "testchart.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/deployment.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/deployment.yaml new file mode 100644 index 0000000000..69b8e08feb --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/deployment.yaml @@ -0,0 +1,61 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "testchart.fullname" . }} + labels: + {{- include "testchart.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "testchart.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "testchart.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "testchart.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: 8080 + protocol: TCP + livenessProbe: + httpGet: + path: / + port: http + readinessProbe: + httpGet: + path: / + port: http + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/hpa.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/hpa.yaml new file mode 100644 index 0000000000..51734471d4 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/hpa.yaml @@ -0,0 +1,28 @@ +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "testchart.fullname" . }} + labels: + {{- include "testchart.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "testchart.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/ingress.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/ingress.yaml new file mode 100644 index 0000000000..9732d2a24a --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/ingress.yaml @@ -0,0 +1,61 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "testchart.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "testchart.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/service.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/service.yaml new file mode 100644 index 0000000000..86baf14821 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "testchart.fullname" . }} + labels: + {{- include "testchart.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "testchart.selectorLabels" . | nindent 4 }} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/serviceaccount.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/serviceaccount.yaml new file mode 100644 index 0000000000..f728deb2a6 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "testchart.serviceAccountName" . }} + labels: + {{- include "testchart.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/tests/test-connection.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/tests/test-connection.yaml new file mode 100644 index 0000000000..a391ef1c46 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/templates/tests/test-connection.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "testchart.fullname" . }}-test-connection" + labels: + {{- include "testchart.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "testchart.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never diff --git a/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/values.yaml b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/values.yaml new file mode 100644 index 0000000000..b598adba92 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/helmblob/testdata/testchart2/values.yaml @@ -0,0 +1,81 @@ +# Default values for testchart. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: gcr.io/google_containers/echoserver + pullPolicy: IfNotPresent + tag: "1.0" + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: {} + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 80 + +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: chart-example.local + paths: + - path: / + pathType: ImplementationSpecific + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/pkg/contexts/ocm/elements/artifactblob/mavenblob/access_test.go b/pkg/contexts/ocm/elements/artifactblob/mavenblob/access_test.go new file mode 100644 index 0000000000..8bf2b4fdd9 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/mavenblob/access_test.go @@ -0,0 +1,61 @@ +package mavenblob_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/env/builder" + "github.com/open-component-model/ocm/pkg/maven/maventest" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/open-component-model/ocm/pkg/contexts/ocm/elements" + me "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/mavenblob" + "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/composition" + "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" + "github.com/open-component-model/ocm/pkg/maven" +) + +const ( + MAVEN_PATH = "/testdata/.m2/repository" + FAIL_PATH = "/testdata/.m2/fail" + MAVEN_CENTRAL_ADDRESS = "repo.maven.apache.org:443" + MAVEN_CENTRAL = "https://repo.maven.apache.org/maven2/" + MAVEN_GROUP_ID = "maven" + MAVEN_ARTIFACT_ID = "maven" + MAVEN_VERSION = "1.1" +) + +var _ = Describe("blobaccess for maven", func() { + + Context("maven filesystem repository", func() { + var env *Builder + var repo *maven.Repository + + BeforeEach(func() { + env = NewBuilder(maventest.TestData()) + repo = maven.NewFileRepository(MAVEN_PATH, env.FileSystem()) + }) + + AfterEach(func() { + MustBeSuccessful(env.Cleanup()) + }) + + It("blobaccess for a single file with classifier and extension", func() { + cv := composition.NewComponentVersion(env.OCMContext(), "acme.org/test", "1.0.0") + defer Close(cv) + + coords := maven.NewCoordinates("com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0", + maven.WithClassifier("random-content"), maven.WithExtension("json")) + + a := me.ResourceAccessForMavenCoords(env.OCMContext(), Must(elements.ResourceMeta("mavenblob", resourcetypes.OCM_JSON, elements.WithLocalRelation())), repo, coords, me.WithCachingFileSystem(env.FileSystem())) + b := Must(a.BlobAccess()) + defer Close(b) + Expect(string(Must(b.Get()))).To(Equal(`{"some": "test content"}`)) + + MustBeSuccessful(cv.SetResourceAccess(a)) + r := Must(cv.GetResourceByIndex(0)) + m := Must(r.AccessMethod()) + defer Close(m) + Expect(string(Must(m.Get()))).To(Equal(`{"some": "test content"}`)) + }) + }) +}) diff --git a/pkg/contexts/ocm/elements/artifactblob/mavenblob/options.go b/pkg/contexts/ocm/elements/artifactblob/mavenblob/options.go new file mode 100644 index 0000000000..6bc448da74 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/mavenblob/options.go @@ -0,0 +1,96 @@ +package mavenblob + +import ( + "github.com/mandelsoft/goutils/optionutils" + "github.com/mandelsoft/logging" + "github.com/mandelsoft/vfs/pkg/vfs" + + base "github.com/open-component-model/ocm/pkg/blobaccess/maven" + "github.com/open-component-model/ocm/pkg/contexts/credentials" + "github.com/open-component-model/ocm/pkg/contexts/datacontext" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + "github.com/open-component-model/ocm/pkg/contexts/ocm/elements/artifactblob/api" +) + +type Option = optionutils.Option[*Options] + +type Options struct { + api.Options + Blob base.Options +} + +var ( + _ api.GeneralOptionsProvider = (*Options)(nil) + _ Option = (*Options)(nil) +) + +func (o *Options) ApplyTo(opts *Options) { + o.Options.ApplyTo(&opts.Options) + o.Blob.ApplyTo(&opts.Blob) +} + +func (o *Options) Apply(opts ...Option) { + optionutils.ApplyOptions(o, opts...) +} + +//////////////////////////////////////////////////////////////////////////////// +// General Options + +func WithHint(h string) Option { + return api.WrapHint[Options](h) +} + +func WithGlobalAccess(a cpi.AccessSpec) Option { + return api.WrapGlobalAccess[Options](a) +} + +//////////////////////////////////////////////////////////////////////////////// +// Local Options + +func mapBaseOption(opts *Options) *base.Options { + return &opts.Blob +} + +func wrapBase(o base.Option) Option { + return optionutils.OptionWrapperFunc[*base.Options, *Options](o, mapBaseOption) +} + +func WithCredentialContext(credctx credentials.ContextProvider) Option { + return wrapBase(base.WithCredentialContext(credctx)) +} + +func WithLoggingContext(logctx logging.ContextProvider) Option { + return wrapBase(base.WithLoggingContext(logctx)) +} + +func WithCachingContext(cachectx datacontext.Context) Option { + return wrapBase(base.WithCachingContext(cachectx)) +} + +func WithCachingFileSystem(fs vfs.FileSystem) Option { + return wrapBase(base.WithCachingFileSystem(fs)) +} + +func WithCachingPath(p string) Option { + return wrapBase(base.WithCachingPath(p)) +} + +func WithCredentials(c credentials.Credentials) Option { + return wrapBase(base.WithCredentials(c)) +} + +func WithClassifier(c string) Option { + return wrapBase(base.WithClassifier(c)) +} + +func WithOptionalClassifier(c *string) Option { + return wrapBase(base.WithOptionalClassifier(c)) +} + +func WithExtension(e string) Option { + return wrapBase(base.WithExtension(e)) +} + +func WithOptionalExtension(e *string) Option { + return wrapBase(base.WithOptionalExtension(e)) +} diff --git a/pkg/contexts/ocm/elements/artifactblob/mavenblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/mavenblob/resource.go new file mode 100644 index 0000000000..c977c55ad0 --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/mavenblob/resource.go @@ -0,0 +1,43 @@ +package mavenblob + +import ( + "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/optionutils" + + "github.com/open-component-model/ocm/pkg/blobaccess/maven" + "github.com/open-component-model/ocm/pkg/contexts/ocm" + "github.com/open-component-model/ocm/pkg/contexts/ocm/compdesc" + "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" +) + +const TYPE = resourcetypes.MAVEN_ARTIFACT + +func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, repo *maven.Repository, groupId, artifactId, version string, opts ...Option) cpi.ArtifactAccess[M] { + eff := optionutils.EvalOptions(optionutils.WithDefaults(opts, WithCredentialContext(ctx))...) + + if meta.GetType() == "" { + meta.SetType(TYPE) + } + + blobprov := maven.BlobAccessProviderForMaven(repo, groupId, artifactId, version, &eff.Blob) + accprov := cpi.NewAccessProviderForBlobAccessProvider(ctx, blobprov, eff.Hint, eff.Global) + // strange type cast is required by Go compiler, meta has the correct type. + return cpi.NewArtifactAccessForProvider(generics.Cast[*M](meta), accprov) +} + +func ResourceAccess(ctx ocm.Context, meta *ocm.ResourceMeta, repo *maven.Repository, groupId, artifactId, version string, opts ...Option) cpi.ResourceAccess { + return Access(ctx, meta, repo, groupId, artifactId, version, opts...) +} + +func ResourceAccessForMavenCoords(ctx ocm.Context, meta *ocm.ResourceMeta, repo *maven.Repository, coords *maven.Coordinates, opts ...Option) cpi.ResourceAccess { + return Access(ctx, meta, repo, coords.GroupId, coords.ArtifactId, coords.Version, optionutils.WithDefaults(opts, WithOptionalClassifier(coords.Classifier), WithOptionalExtension(coords.Extension))...) +} + +func SourceAccess(ctx ocm.Context, meta *ocm.SourceMeta, repo *maven.Repository, groupId, artifactId, version string, opts ...Option) cpi.SourceAccess { + return Access(ctx, meta, repo, groupId, artifactId, version, opts...) +} + +func SourceAccessForMavenCoords(ctx ocm.Context, meta *ocm.SourceMeta, repo *maven.Repository, coords *maven.Coordinates, opts ...Option) cpi.SourceAccess { + return Access(ctx, meta, repo, coords.GroupId, coords.ArtifactId, coords.Version, optionutils.WithDefaults(opts, WithOptionalClassifier(coords.Classifier), WithOptionalExtension(coords.Extension))...) +} diff --git a/pkg/contexts/ocm/elements/artifactblob/mavenblob/suite_test.go b/pkg/contexts/ocm/elements/artifactblob/mavenblob/suite_test.go new file mode 100644 index 0000000000..a083b2234c --- /dev/null +++ b/pkg/contexts/ocm/elements/artifactblob/mavenblob/suite_test.go @@ -0,0 +1,13 @@ +package mavenblob_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Maven Blob Access Test Suite") +} diff --git a/pkg/contexts/ocm/elements/artifactblob/textblob/options.go b/pkg/contexts/ocm/elements/artifactblob/textblob/options.go index 46e99a0035..ab1d01c966 100644 --- a/pkg/contexts/ocm/elements/artifactblob/textblob/options.go +++ b/pkg/contexts/ocm/elements/artifactblob/textblob/options.go @@ -30,7 +30,7 @@ func WithGlobalAccess(a cpi.AccessSpec) Option { //////////////////////////////////////////////////////////////////////////////// // Local Options -func WithimeType(mime string) Option { +func WithMimeType(mime string) Option { return datablob.WithMimeType(mime) } diff --git a/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go b/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go index 3045c59bef..ef9273b23a 100644 --- a/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go +++ b/pkg/contexts/ocm/elements/artifactblob/wgetblob/resource.go @@ -14,7 +14,7 @@ import ( const TYPE = resourcetypes.BLOB func Access[M any, P compdesc.ArtifactMetaPointer[M]](ctx ocm.Context, meta P, url string, opts ...Option) cpi.ArtifactAccess[M] { - eff := optionutils.EvalOptions(append([]Option{WithCredentialContext(ctx), WithLoggingContext(ctx)}, opts...)...) + eff := optionutils.EvalOptions(optionutils.WithDefaults(opts, WithCredentialContext(ctx))...) if meta.GetType() == "" { meta.SetType(TYPE) diff --git a/pkg/contexts/ocm/gc_test.go b/pkg/contexts/ocm/gc_test.go index 2896ae9406..a4ad5f81a7 100644 --- a/pkg/contexts/ocm/gc_test.go +++ b/pkg/contexts/ocm/gc_test.go @@ -6,9 +6,9 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/open-component-model/ocm/pkg/runtimefinalizer" me "github.com/open-component-model/ocm/pkg/contexts/ocm" + "github.com/open-component-model/ocm/pkg/runtimefinalizer" ) var _ = Describe("area test", func() { diff --git a/pkg/contexts/ocm/plugin/cache/updater.go b/pkg/contexts/ocm/plugin/cache/updater.go index 0f28269d02..cde2925a3a 100644 --- a/pkg/contexts/ocm/plugin/cache/updater.go +++ b/pkg/contexts/ocm/plugin/cache/updater.go @@ -194,7 +194,7 @@ func (o *PluginUpdater) download(session ocm.Session, cv ocm.ComponentVersionAcc break } wrong = r - } else { //nolint: gocritic // yes + } else { if name != "" { wrong = r } diff --git a/pkg/contexts/ocm/repositories/genericocireg/repo_test.go b/pkg/contexts/ocm/repositories/genericocireg/repo_test.go index 29347bb13c..206e0d8464 100644 --- a/pkg/contexts/ocm/repositories/genericocireg/repo_test.go +++ b/pkg/contexts/ocm/repositories/genericocireg/repo_test.go @@ -9,12 +9,11 @@ import ( . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/testutils" + "github.com/mandelsoft/goutils/finalizer" "github.com/mandelsoft/vfs/pkg/osfs" "github.com/mandelsoft/vfs/pkg/vfs" "github.com/opencontainers/go-digest" - "github.com/mandelsoft/goutils/finalizer" - "github.com/open-component-model/ocm/pkg/blobaccess" "github.com/open-component-model/ocm/pkg/common/accessio" "github.com/open-component-model/ocm/pkg/common/accessobj" diff --git a/pkg/contexts/ocm/resourcetypes/const.go b/pkg/contexts/ocm/resourcetypes/const.go index 6c0dc78650..40ee9453e8 100644 --- a/pkg/contexts/ocm/resourcetypes/const.go +++ b/pkg/contexts/ocm/resourcetypes/const.go @@ -16,8 +16,8 @@ const ( HELM_CHART = "helmChart" // NPM_PACKAGE describes a Node.js (npm) package. NPM_PACKAGE = "npmPackage" - // MVN_ARTIFACT describes a Maven artifact (jar). - MVN_ARTIFACT = "mvnArtifact" + // MAVEN_ARTIFACT describes a Maven artifact (jar). + MAVEN_ARTIFACT = "mavenArtifact" // BLUEPRINT describes a Gardener Landscaper blueprint which is an artifact used in its installations describing // how to deploy a software component. BLUEPRINT = "landscaper.gardener.cloud/blueprint" diff --git a/pkg/contexts/ocm/transfer/autohandler_test.go b/pkg/contexts/ocm/transfer/autohandler_test.go index 2370e26828..92bdcea68c 100644 --- a/pkg/contexts/ocm/transfer/autohandler_test.go +++ b/pkg/contexts/ocm/transfer/autohandler_test.go @@ -6,6 +6,7 @@ import ( . "github.com/open-component-model/ocm/pkg/testutils" "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler" "github.com/open-component-model/ocm/pkg/contexts/ocm/transfer/transferhandler/spiff" diff --git a/pkg/contexts/ocm/utils/localize/format.go b/pkg/contexts/ocm/utils/localize/format.go index 5f2a487d13..da1018ad3e 100644 --- a/pkg/contexts/ocm/utils/localize/format.go +++ b/pkg/contexts/ocm/utils/localize/format.go @@ -48,7 +48,7 @@ func (m *ImageMapping) Evaluate(idx int, cv ocm.ComponentVersionAccess, resolver name := "image mapping" if m.Name != "" { name = fmt.Sprintf("%s %q", name, m.Name) - } else { //nolint: gocritic // yes + } else { if idx >= 0 { name = fmt.Sprintf("%s %d", name, idx+1) } diff --git a/pkg/env/env.go b/pkg/env/env.go index ffbabb5de9..2f4da4b7e3 100644 --- a/pkg/env/env.go +++ b/pkg/env/env.go @@ -3,11 +3,14 @@ package env import ( "bytes" "fmt" + "runtime" "runtime/debug" "strings" "github.com/DataDog/gostackparse" + "github.com/mandelsoft/filepath/pkg/filepath" "github.com/mandelsoft/goutils/exception" + "github.com/mandelsoft/goutils/general" "github.com/mandelsoft/vfs/pkg/composefs" "github.com/mandelsoft/vfs/pkg/layerfs" "github.com/mandelsoft/vfs/pkg/memoryfs" @@ -21,7 +24,7 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" "github.com/open-component-model/ocm/pkg/contexts/oci" - "github.com/open-component-model/ocm/pkg/contexts/ocm" + ocm "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/utils" ) @@ -199,7 +202,7 @@ type tdOpt struct { modifiable bool } -func TestData(paths ...string) tdOpt { +func testData(modifiable bool, paths ...string) tdOpt { path := "/testdata" source := "testdata" @@ -214,30 +217,85 @@ func TestData(paths ...string) tdOpt { panic("invalid number of arguments") } return tdOpt{ - path: path, - source: source, + path: path, + source: source, + modifiable: modifiable, } } +func TestData(paths ...string) tdOpt { + return testData(false, paths...) +} + func ModifiableTestData(paths ...string) tdOpt { - path := "/testdata" - source := "testdata" + return testData(true, paths...) +} + +func projectTestData(modifiable bool, source string, dest ...string) Option { + path := "." + for count := 0; count < 20; count++ { + if ok, err := vfs.FileExists(osfs.OsFs, filepath.Join(path, "go.mod")); err != nil || ok { + if err != nil { + panic(err) + } + path = filepath.Join(path, source) + break + } + if count == 19 { + panic("could not find go.mod (within 20 steps)") + } - switch len(paths) { - case 0: - case 1: - source = paths[0] - case 2: - source = paths[0] - path = paths[1] - default: - panic("invalid number of arguments") + path = filepath.Join(path, "..") } - return tdOpt{ - path: path, - source: source, - modifiable: true, + + return testData(modifiable, path, general.OptionalDefaulted("/testdata", dest...)) +} + +func ProjectTestData(source string, dest ...string) Option { + return projectTestData(false, source, dest...) +} + +func ModifiableProjectTestData(source string, dest ...string) Option { + return projectTestData(true, source, dest...) +} + +func projectTestDataForCaller(modifiable bool, dest ...string) Option { + pc, _, _, ok := runtime.Caller(2) + if !ok { + panic("unable to find caller") + } + + // Get the function details from the program counter + caller := runtime.FuncForPC(pc) + if caller == nil { + panic("unable to find caller") } + + fullFuncName := caller.Name() + + // Split the name to extract the package path + // Assuming the format: "package/path.functionName" + lastSlashIndex := strings.LastIndex(fullFuncName, "/") + if lastSlashIndex == -1 { + panic("unable to find package name") + } + + funcIndex := strings.Index(fullFuncName[lastSlashIndex:], ".") + packagePath := fullFuncName[:lastSlashIndex+funcIndex] + path, ok := strings.CutPrefix(packagePath, "github.com/open-component-model/ocm/") + if !ok { + panic("unable to find package name") + } + + return projectTestData(modifiable, filepath.Join(path, "testdata"), dest...) +} + +func ProjectTestDataForCaller(dest ...string) Option { + return projectTestDataForCaller(false, dest...) +} + +func ModifiableProjectTestDataForCaller(dest ...string) Option { + return projectTestDataForCaller(true, dest...) } func (o tdOpt) OptionHandler() OptionHandler { diff --git a/pkg/exception/exception_test.go b/pkg/exception/exception_test.go index 33e95ccda5..b6bdf5e9d0 100644 --- a/pkg/exception/exception_test.go +++ b/pkg/exception/exception_test.go @@ -7,6 +7,7 @@ import ( . "github.com/onsi/gomega" "github.com/mandelsoft/goutils/errors" + "github.com/open-component-model/ocm/pkg/exception" ) diff --git a/pkg/iotools/hashReaderWriter.go b/pkg/iotools/hashReaderWriter.go index b74863f7e7..f36d74b58d 100644 --- a/pkg/iotools/hashReaderWriter.go +++ b/pkg/iotools/hashReaderWriter.go @@ -5,42 +5,79 @@ import ( "fmt" "hash" "io" + "net/http" "strings" "github.com/mandelsoft/goutils/errors" ) +type Hashes map[crypto.Hash]hash.Hash + +func NewHashes(algorithms ...crypto.Hash) Hashes { + hashMap := make(Hashes, len(algorithms)) + for _, algorithm := range algorithms { + hashMap[algorithm] = algorithm.New() + } + return hashMap +} + +func (h Hashes) Write(c int, buf []byte) { + if c > 0 { + for _, hash := range h { + hash.Write(buf[:c]) + } + } +} + +func (h Hashes) AsHttpHeader() http.Header { + headers := make(http.Header, len(h)) + for algorithm := range h { + headers.Set(headerName(algorithm), h.GetString(algorithm)) + } + return headers +} + +func (h Hashes) GetBytes(algorithm crypto.Hash) []byte { + hash := h[algorithm] + if hash != nil { + return hash.Sum(nil) + } + return nil +} + +func (h Hashes) GetString(algorithm crypto.Hash) string { + return fmt.Sprintf("%x", h.GetBytes(algorithm)) +} + +func headerName(algorithm crypto.Hash) string { + a := strings.ReplaceAll(algorithm.String(), "-", "") + return "X-Checksum-" + a[:1] + strings.ToLower(a[1:]) +} + +//////////////////////////////////////////////////////////////////////////////// + type HashReader struct { reader io.Reader - hashMap map[crypto.Hash]hash.Hash + hashMap Hashes } func NewHashReader(delegate io.Reader, algorithms ...crypto.Hash) *HashReader { newInstance := HashReader{ reader: delegate, - hashMap: initMap(algorithms), + hashMap: NewHashes(algorithms...), } return &newInstance } func (h *HashReader) Read(buf []byte) (int, error) { c, err := h.reader.Read(buf) - return write(h, c, buf, err) -} - -func (h *HashReader) GetString(algorithm crypto.Hash) string { - return getString(h, algorithm) -} - -func (h *HashReader) GetBytes(algorithm crypto.Hash) []byte { - return getBytes(h, algorithm) -} - -func (h *HashReader) HttpHeader() map[string]string { - return httpHeader(h) + if err == nil { + h.hashMap.Write(c, buf) + } + return c, err } -func (h *HashReader) hashes() map[crypto.Hash]hash.Hash { +func (h *HashReader) Hashes() Hashes { return h.hashMap } @@ -69,84 +106,25 @@ func (h *HashReader) CalcHashes() (int64, error) { type HashWriter struct { writer io.Writer - hashMap map[crypto.Hash]hash.Hash + hashMap Hashes } func NewHashWriter(w io.Writer, algorithms ...crypto.Hash) *HashWriter { newInstance := HashWriter{ writer: w, - hashMap: initMap(algorithms), + hashMap: NewHashes(algorithms...), } return &newInstance } func (h *HashWriter) Write(buf []byte) (int, error) { c, err := h.writer.Write(buf) - return write(h, c, buf, err) -} - -func (h *HashWriter) GetString(algorithm crypto.Hash) string { - return getString(h, algorithm) -} - -func (h *HashWriter) GetBytes(algorithm crypto.Hash) []byte { - return getBytes(h, algorithm) -} - -func (h *HashWriter) HttpHeader() map[string]string { - return httpHeader(h) -} - -func (h *HashWriter) hashes() map[crypto.Hash]hash.Hash { - return h.hashMap -} - -//////////////////////////////////////////////////////////////////////////////// - -type hashes interface { - hashes() map[crypto.Hash]hash.Hash -} - -func getString(h hashes, algorithm crypto.Hash) string { - return fmt.Sprintf("%x", getBytes(h, algorithm)) -} - -func getBytes(h hashes, algorithm crypto.Hash) []byte { - hash := h.hashes()[algorithm] - if hash != nil { - return hash.Sum(nil) - } - return nil -} - -func httpHeader(h hashes) map[string]string { - headers := make(map[string]string, len(h.hashes())) - for algorithm := range h.hashes() { - headers[headerName(algorithm)] = getString(h, algorithm) - } - return headers -} - -func initMap(algorithms []crypto.Hash) map[crypto.Hash]hash.Hash { - hashMap := make(map[crypto.Hash]hash.Hash, len(algorithms)) - for _, algorithm := range algorithms { - hashMap[algorithm] = algorithm.New() - } - return hashMap -} - -func write(h hashes, c int, buf []byte, err error) (int, error) { - if err == nil && c > 0 { - for _, hash := range h.hashes() { - hash.Write(buf[:c]) - } + if err == nil { + h.hashMap.Write(c, buf) } return c, err } -//////////////////////////////////////////////////////////////////////////////// - -func headerName(hash crypto.Hash) string { - a := strings.ReplaceAll(hash.String(), "-", "") - return "X-Checksum-" + a[:1] + strings.ToLower(a[1:]) +func (h *HashWriter) Hashes() Hashes { + return h.hashMap } diff --git a/pkg/iotools/hashReaderWriter_test.go b/pkg/iotools/hashReaderWriter_test.go index bda2a6fc3d..457fa15342 100644 --- a/pkg/iotools/hashReaderWriter_test.go +++ b/pkg/iotools/hashReaderWriter_test.go @@ -26,26 +26,29 @@ var _ = Describe("Hash Reader Writer tests", func() { It("test HashWriter", func() { s := "Hello Hash!" var b bytes.Buffer - hr := iotools.NewHashWriter(io.Writer(&b)) - hr.Write([]byte(s)) + hw := iotools.NewHashWriter(io.Writer(&b)) + hw.Write([]byte(s)) + hashes := hw.Hashes() Expect(b.String()).To(Equal(s)) - Expect(hr.GetBytes(0)).To(BeNil()) + Expect(hashes.GetBytes(0)).To(BeNil()) b.Reset() w := io.Writer(&b) - hr = iotools.NewHashWriter(w, crypto.SHA1) - hr.Write([]byte(s)) + hw = iotools.NewHashWriter(w, crypto.SHA1) + hw.Write([]byte(s)) + hashes = hw.Hashes() Expect(b.String()).To(Equal(s)) - Expect(hr.GetBytes(0)).To(BeNil()) - Expect(hr.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) + Expect(hashes.GetBytes(0)).To(BeNil()) + Expect(hashes.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) b.Reset() - hr = iotools.NewHashWriter(io.Writer(&b), crypto.SHA1, crypto.MD5) - hr.Write([]byte(s)) + hw = iotools.NewHashWriter(io.Writer(&b), crypto.SHA1, crypto.MD5) + hw.Write([]byte(s)) + hashes = hw.Hashes() Expect(b.String()).To(Equal(s)) - Expect(hr.GetBytes(0)).To(BeNil()) - Expect(hr.GetString(crypto.MD5)).To(Equal("c10e8df2e378a1584359b0e546cf0149")) - Expect(hr.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) + Expect(hashes.GetBytes(0)).To(BeNil()) + Expect(hashes.GetString(crypto.MD5)).To(Equal("c10e8df2e378a1584359b0e546cf0149")) + Expect(hashes.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) }) It("test HashReader", func() { @@ -53,27 +56,29 @@ var _ = Describe("Hash Reader Writer tests", func() { hr := iotools.NewHashReader(strings.NewReader(s)) buf := make([]byte, len(s)) hr.Read(buf) - Expect(hr.GetBytes(0)).To(BeNil()) + hashes := hr.Hashes() + Expect(hashes.GetBytes(0)).To(BeNil()) Expect(string(buf)).To(Equal(s)) hr = iotools.NewHashReader(strings.NewReader(s), crypto.SHA1) hr.Read(buf) - Expect(hr.GetBytes(0)).To(BeNil()) - Expect(hr.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) + hashes = hr.Hashes() + Expect(hashes.GetBytes(0)).To(BeNil()) + Expect(hashes.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) hr = iotools.NewHashReader(strings.NewReader(s), crypto.SHA1) cnt, err := hr.CalcHashes() + hashes = hr.Hashes() Expect(err).To(BeNil()) Expect(cnt).To(Equal(int64(len(s)))) - Expect(hr.GetBytes(0)).To(BeNil()) - Expect(hr.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) + Expect(hashes.GetBytes(0)).To(BeNil()) + Expect(hashes.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) hr = iotools.NewHashReader(strings.NewReader(s), crypto.SHA1, crypto.MD5) hr.Read(buf) - Expect(hr.GetBytes(crypto.SHA256)).To(BeNil()) - Expect(hr.GetString(crypto.MD5)).To(Equal("c10e8df2e378a1584359b0e546cf0149")) - Expect(hr.GetString(crypto.MD5)).To(Equal("c10e8df2e378a1584359b0e546cf0149")) - Expect(hr.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) - Expect(hr.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) + hashes = hr.Hashes() + Expect(hashes.GetBytes(crypto.SHA256)).To(BeNil()) + Expect(hashes.GetString(crypto.MD5)).To(Equal("c10e8df2e378a1584359b0e546cf0149")) + Expect(hashes.GetString(crypto.SHA1)).To(Equal("5c075ed604db0adc524edd3516e8f0258ca6e58d")) }) }) diff --git a/pkg/maven/access.go b/pkg/maven/access.go new file mode 100644 index 0000000000..3fc972b83e --- /dev/null +++ b/pkg/maven/access.go @@ -0,0 +1,407 @@ +package maven + +import ( + "bytes" + "context" + "crypto" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strings" + + "github.com/cloudflare/cfssl/log" + "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/finalizer" + "github.com/mandelsoft/goutils/general" + "github.com/mandelsoft/vfs/pkg/vfs" + "golang.org/x/exp/maps" + "golang.org/x/net/html" + + "github.com/open-component-model/ocm/pkg/iotools" + "github.com/open-component-model/ocm/pkg/utils" + "github.com/open-component-model/ocm/pkg/utils/tarutils" +) + +type FileMeta struct { + MimeType string + HashType crypto.Hash + Hash string + Location *Location +} + +type Repository struct { + Location +} + +func NewFileRepository(path string, fss ...vfs.FileSystem) *Repository { + return &Repository{Location{ + path: path, + fs: utils.FileSystem(fss...), + }} +} + +func NewUrlRepository(repoUrl string, fss ...vfs.FileSystem) (*Repository, error) { + u, err := url.Parse(repoUrl) + if err != nil { + return nil, err + } + if u.Scheme == "file" { + if u.Host != "" && u.Host != "localhost" { + return nil, errors.Newf("named host not supported for url file scheme: %q", repoUrl) + } + return NewFileRepository(u.Path, fss...), nil + } + return &Repository{Location{ + url: repoUrl, + }}, nil +} + +func (r *Repository) Url() (string, error) { + if r.url != "" { + return r.url, nil + } + p, err := vfs.Canonical(r.fs, r.path, false) + if err != nil { + return "", err + } + return "file://localhost" + p, nil +} + +// Body is the response struct of a deployment from the MVN repository (JFrog Artifactory). +type Body struct { + Repo string `json:"repo"` + Path string `json:"path"` + DownloadUri string `json:"downloadUri"` + Uri string `json:"uri"` + MimeType string `json:"mimeType"` + Size string `json:"size"` + Checksums map[string]string `json:"checksums"` +} + +func (r *Repository) Download(coords *Coordinates, creds Credentials, enforceVerification ...bool) (io.ReadCloser, error) { + files, err := r.GavFiles(coords, creds) + if err != nil { + return nil, err + } + algorithm, ok := files[coords.FileName()] + if !ok { + return nil, errors.ErrNotFound("file", coords.FileName(), coords.GAV()) + } + + var digest string + loc := coords.Location(r) + if algorithm != 0 { + digestFile := loc.AddExtension(HashExt(algorithm)) + reader, err := digestFile.GetReader(creds) + if err != nil { + return nil, err + } + digestData, err := io.ReadAll(reader) + if err != nil { + return nil, err + } + digest = string(digestData) + } else { + if general.Optional(enforceVerification...) { + return nil, fmt.Errorf("unable to verify, no digest available in target repository") + } + } + + reader, err := loc.GetReader(creds) + if err != nil { + return nil, err + } + if algorithm != 0 { + reader = iotools.VerifyingReaderWithHash(reader, algorithm, digest) + } + return reader, nil +} + +func (r *Repository) Upload(coords *Coordinates, reader io.ReadCloser, creds Credentials, hashes iotools.Hashes) (rerr error) { + finalize := finalizer.Finalizer{} + defer finalize.FinalizeWithErrorPropagation(&rerr) + + loc := coords.Location(r) + if r.IsFileSystem() { + err := loc.fs.MkdirAll(vfs.Dir(loc.fs, loc.path), 0o755) + if err != nil { + return err + } + f, err := loc.fs.OpenFile(loc.path, vfs.O_WRONLY|vfs.O_CREATE|vfs.O_TRUNC, 0o644) + if err != nil { + return err + } + finalize.Close(f) + + _, err = io.Copy(f, reader) + if err != nil { + return err + } + + for algorithm := range hashes { + digest := hashes.GetString(algorithm) + p := loc.path + "." + HashExt(algorithm) + err = vfs.WriteFile(loc.fs, p, []byte(digest), 0o644) + if err != nil { + return err + } + } + return nil + } + + req, err := http.NewRequestWithContext(context.Background(), http.MethodPut, loc.String(), reader) + if err != nil { + return err + } + if creds != nil { + err = creds.SetForRequest(req) + if err != nil { + return err + } + } + // give the remote server a chance to decide based upon the checksum policy + for k, v := range hashes.AsHttpHeader() { + req.Header[k] = v + } + + // Execute the request + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return err + } + finalize.Close(resp.Body) + + // Check the response + if resp.StatusCode != http.StatusCreated { + all, e := io.ReadAll(resp.Body) + if e != nil { + return e + } + return fmt.Errorf("http (%d) - failed to upload coords: %s", resp.StatusCode, string(all)) + } + Log.Debug("uploaded", "coords", coords, "extension", coords.Extension, "classifier", coords.Classifier) + + // Validate the response - especially the hash values with the ones we've tried to send + respBody, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + var artifactBody Body + err = json.Unmarshal(respBody, &artifactBody) + if err != nil { + return err + } + + algorithm := bestAvailableHash(maps.Keys(hashes)) + digest := hashes.GetString(algorithm) + remoteDigest := artifactBody.Checksums[strings.ReplaceAll(strings.ToLower(algorithm.String()), "-", "")] + if remoteDigest == "" { + Log.Warn("no checksum found for algorithm, we can't guarantee that the coords has been uploaded correctly", "algorithm", algorithm.String()) + } else if remoteDigest != digest { + return errors.New("failed to upload coords: checksums do not match") + } + Log.Debug("digests are ok", "remoteDigest", remoteDigest, "digest", digest) + return err +} + +func (r *Repository) GetFileMeta(c *Coordinates, file string, hash crypto.Hash, creds Credentials) (*FileMeta, error) { + coords := c.Copy() + err := coords.SetClassifierExtensionBy(file) + if err != nil { + return nil, err + } + metadata := &FileMeta{ + Location: coords.Location(r), + MimeType: coords.MimeType(), + } + log := Log.WithValues("file", metadata.Location.String()) + log.Debug("processing") + if hash > 0 { + metadata.HashType = hash + metadata.Hash, err = metadata.Location.GetHash(creds, hash) + if err != nil { + return nil, errors.Wrapf(err, "cannot read %s digest of: %s", hash, metadata.Location) + } + } else { + log.Warn("no digest available") + } + return metadata, nil +} + +func (r *Repository) GavFiles(coords *Coordinates, creds Credentials) (map[string]crypto.Hash, error) { + if r.path != "" { + return gavFilesFromDisk(r.fs, coords.GavLocation(r).path) + } + return gavOnlineFiles(r, coords, creds) +} + +func gavFilesFromDisk(fs vfs.FileSystem, dir string) (map[string]crypto.Hash, error) { + files, err := tarutils.ListSortedFilesInDir(fs, dir, true) + if err != nil { + return nil, err + } + return filesAndHashes(files), nil +} + +// gavOnlineFiles returns the files of the Maven artifact in the repository and their available digests. +func gavOnlineFiles(repo *Repository, coords *Coordinates, creds Credentials) (map[string]crypto.Hash, error) { + log := Log.WithValues("RepoUrl", repo.String(), "GAV", coords.GavPath()) + log.Debug("gavOnlineFiles") + + reader, err := coords.GavLocation(repo).GetReader(creds) + if err != nil { + return nil, err + } + defer reader.Close() + + // Which files are listed in the repository? + log.Debug("parse-html") + htmlDoc, err := html.Parse(reader) + if err != nil { + return nil, err + } + var fileList []string + var process func(*html.Node) + prefix := coords.FileNamePrefix() + process = func(node *html.Node) { + // check if the node is an element node and the tag is "" + if node.Type == html.ElementNode && node.Data == "a" { + for _, attribute := range node.Attr { + if attribute.Key == "href" { + // check if the href starts with artifactId-version + if strings.HasPrefix(attribute.Val, prefix) { + fileList = append(fileList, attribute.Val) + } + } + } + } + for nextChild := node.FirstChild; nextChild != nil; nextChild = nextChild.NextSibling { + process(nextChild) // recursive call! + } + } + process(htmlDoc) + + return filesAndHashes(fileList), nil +} + +func filesAndHashes(fileList []string) map[string]crypto.Hash { + // Which hash files are available? + result := make(map[string]crypto.Hash, len(fileList)/2) + for _, file := range fileList { + if IsResource(file) { + result[file] = bestAvailableHashForFile(fileList, file) + log.Debug("found", "file", file) + } + } + return result +} + +type Location struct { + url string + path string + fs vfs.FileSystem +} + +func (l *Location) MarshalJSON() ([]byte, error) { + return json.Marshal(l.String()) +} + +func (l *Location) IsFileSystem() bool { + return l.path != "" +} + +func (l *Location) AddPath(path string) *Location { + result := *l + var p *string + if result.url != "" { + p = &result.url + } else { + p = &result.path + } + + if !strings.HasSuffix(*p, "/") { + *p += "/" + } + *p += path + return &result +} + +func (l *Location) AddExtension(ext string) *Location { + result := *l + var p *string + if result.url != "" { + p = &result.url + } else { + p = &result.path + } + + *p += "." + ext + return &result +} + +func (l *Location) String() string { + return general.Conditional(l.path != "", l.path, l.url) +} + +func (l *Location) GetHash(creds Credentials, hash crypto.Hash) (string, error) { + // getStringData reads all data from the given URL and returns it as a string. + r, err := l.AddExtension(HashExt(hash)).GetReader(creds) + if err != nil { + return "", err + } + defer r.Close() + b, err := io.ReadAll(r) + if err != nil { + return "", err + } + return string(b), nil +} + +func (l *Location) GetReader(creds Credentials) (io.ReadCloser, error) { + if l.path != "" { + return l.fs.OpenFile(l.path, vfs.O_RDONLY, 0o600) + } + + req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, l.url, nil) + if err != nil { + return nil, err + } + if creds != nil { + err = creds.SetForRequest(req) + if err != nil { + return nil, err + } + } + httpClient := &http.Client{} + resp, err := httpClient.Do(req) + if err != nil { + return nil, err + } + if resp.StatusCode != http.StatusOK { + defer resp.Body.Close() + buf := &bytes.Buffer{} + _, err = io.Copy(buf, io.LimitReader(resp.Body, 2000)) + if err == nil { + Log.Error("http", "code", resp.Status, "repo", l.url, "body", buf.String()) + } + return nil, errors.Newf("http %s error - %s", resp.Status, l.url) + } + return resp.Body, nil +} + +type Credentials interface { + SetForRequest(req *http.Request) error +} + +type BasicAuthCredentials struct { + Username string + Password string +} + +func (b *BasicAuthCredentials) SetForRequest(req *http.Request) error { + req.SetBasicAuth(b.Username, b.Password) + return nil +} diff --git a/pkg/maven/access_test.go b/pkg/maven/access_test.go new file mode 100644 index 0000000000..4696286597 --- /dev/null +++ b/pkg/maven/access_test.go @@ -0,0 +1,132 @@ +package maven_test + +import ( + "crypto" + "io" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/env/builder" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/mandelsoft/goutils/optionutils" + + me "github.com/open-component-model/ocm/pkg/maven" + "github.com/open-component-model/ocm/pkg/maven/maventest" +) + +const ( + MAVEN_PATH = "/testdata/.m2/repository" + FAIL_PATH = "/testdata/.m2/fail" +) + +var _ = Describe("local accessmethods.me.AccessSpec tests", func() { + var env *Builder + var repo *me.Repository + + BeforeEach(func() { + env = NewBuilder(maventest.TestData()) + repo = me.NewFileRepository(MAVEN_PATH, env.FileSystem()) + }) + + AfterEach(func() { + env.Cleanup() + }) + + It("accesses local artifact file", func() { + coords := me.NewCoordinates("com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0") + files := Must(repo.GavFiles(coords, nil)) + Expect(files).To(YAMLEqual(` +sdk-modules-bom-5.7.0-random-content.json: 3 +sdk-modules-bom-5.7.0-random-content.txt: 3 +sdk-modules-bom-5.7.0-sources.jar: 3 +sdk-modules-bom-5.7.0.jar: 3 +sdk-modules-bom-5.7.0.pom: 3 +`)) + }) + + It("accesses local artifact file with extension", func() { + coords := me.NewCoordinates("com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0", me.WithClassifier(""), me.WithExtension("pom")) + hash := Must(coords.Location(repo).GetHash(nil, crypto.SHA1)) + Expect(hash).To(Equal("34ccdeb9c008f8aaef90873fc636b09d3ae5c709")) + }) + + It("access dedicated file", func() { + coords := me.NewCoordinates("com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0", me.WithClassifier(""), me.WithExtension("pom")) + meta := Must(repo.GetFileMeta(coords, "sdk-modules-bom-5.7.0.pom", crypto.SHA1, nil)) + Expect(meta).To(YAMLEqual(` + Hash: 34ccdeb9c008f8aaef90873fc636b09d3ae5c709 + HashType: 3 + MimeType: application/xml + Location: /testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0.pom +`)) + }) + + Context("filtering", func() { + var ( + files map[string]crypto.Hash + coords *me.Coordinates + ) + BeforeEach(func() { + coords = me.NewCoordinates("com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0") + files = Must(repo.GavFiles(coords, nil)) + }) + + It("filters nothing", func() { + Expect(coords.FilterFileMap(files)).To(Equal(files)) + }) + It("filter by empty classifier", func() { + coords.Classifier = optionutils.PointerTo("") + Expect(coords.FilterFileMap(files)).To(YAMLEqual(` +sdk-modules-bom-5.7.0.jar: 3 +sdk-modules-bom-5.7.0.pom: 3 +`)) + }) + It("filter by non-empty classifier", func() { + coords.Classifier = optionutils.PointerTo("random-content") + Expect(coords.FilterFileMap(files)).To(YAMLEqual(` +sdk-modules-bom-5.7.0-random-content.json: 3 +sdk-modules-bom-5.7.0-random-content.txt: 3 +`)) + }) + It("filter by extension", func() { + coords.Extension = optionutils.PointerTo("jar") + Expect(coords.FilterFileMap(files)).To(YAMLEqual(` +sdk-modules-bom-5.7.0-sources.jar: 3 +sdk-modules-bom-5.7.0.jar: 3 +`)) + }) + + It("filter by empty classifier and extension", func() { + coords.Classifier = optionutils.PointerTo("") + coords.Extension = optionutils.PointerTo("jar") + Expect(coords.FilterFileMap(files)).To(YAMLEqual(` +sdk-modules-bom-5.7.0.jar: 3 +`)) + }) + + It("filter by non-empty classifier and extension", func() { + coords.Classifier = optionutils.PointerTo("sources") + coords.Extension = optionutils.PointerTo("jar") + Expect(coords.FilterFileMap(files)).To(YAMLEqual(` +sdk-modules-bom-5.7.0-sources.jar: 3 +`)) + }) + + It("download dedicated file", func() { + coords := me.NewCoordinates("com.sap.cloud.sdk", "sdk-modules-bom", "5.7.0", me.WithClassifier(""), me.WithExtension("pom")) + reader := Must(repo.Download(coords, nil, true)) + data := Must(io.ReadAll(reader)) + Expect(len(data)).To(Equal(7153)) + MustBeSuccessful(reader.Close()) + }) + + It("download dedicated file with filed digest verification", func() { + coords := me.NewCoordinates("test", "repository", "42", me.WithClassifier(""), me.WithExtension("pom")) + repo := me.NewFileRepository(FAIL_PATH, env) + reader := Must(repo.Download(coords, nil, true)) + _ = Must(io.ReadAll(reader)) + Expect(reader.Close()).To(MatchError("SHA-1 digest mismatch: expected 44a77645201d1a8fc5213ace787c220eabbd0967, found b3242b8c31f8ce14f729b8fd132ac77bc4bc5bf7")) + }) + }) +}) diff --git a/pkg/maven/coordinates.go b/pkg/maven/coordinates.go new file mode 100644 index 0000000000..fa1767ba4e --- /dev/null +++ b/pkg/maven/coordinates.go @@ -0,0 +1,218 @@ +package maven + +import ( + "crypto" + "fmt" + "mime" + "path" + "path/filepath" + "strings" + + . "github.com/mandelsoft/goutils/regexutils" + + "github.com/mandelsoft/goutils/generics" + "github.com/mandelsoft/goutils/optionutils" + + ocmmime "github.com/open-component-model/ocm/pkg/mime" +) + +type CoordinateOption = optionutils.Option[*Coordinates] + +type WithClassifier string + +func WithOptionalClassifier(c *string) CoordinateOption { + if c != nil { + return WithClassifier(*c) + } + return nil +} + +func (o WithClassifier) ApplyTo(c *Coordinates) { + c.Classifier = optionutils.PointerTo(string(o)) +} + +type WithExtension string + +func WithOptionalExtension(e *string) CoordinateOption { + if e != nil { + return WithExtension(*e) + } + return nil +} + +func (o WithExtension) ApplyTo(c *Coordinates) { + c.Extension = optionutils.PointerTo(string(o)) +} + +// Coordinates holds the typical Maven coordinates groupId, artifactId, version. Optional also classifier and extension. +// https://maven.apache.org/ref/3.9.6/maven-core/artifact-handlers.html +type Coordinates struct { + // GroupId of the Maven artifact. + GroupId string `json:"groupId"` + // ArtifactId of the Maven artifact. + ArtifactId string `json:"artifactId"` + // Version of the Maven artifact. + Version string `json:"version"` + // Classifier of the Maven artifact. + Classifier *string `json:"classifier,omitempty"` + // Extension of the Maven artifact. + Extension *string `json:"extension,omitempty"` +} + +func NewCoordinates(groupId, artifactId, version string, opts ...CoordinateOption) *Coordinates { + c := &Coordinates{ + GroupId: groupId, + ArtifactId: artifactId, + Version: version, + } + optionutils.ApplyOptions(c, opts...) + return c +} + +// GAV returns the GAV coordinates of the Maven Coordinates. +func (c *Coordinates) GAV() string { + return c.GroupId + ":" + c.ArtifactId + ":" + c.Version +} + +// String returns the Coordinates as a string (GroupId:ArtifactId:Version:WithClassifier:WithExtension). +func (c *Coordinates) String() string { + return c.GroupId + ":" + c.ArtifactId + ":" + c.Version + ":" + optionutils.AsValue(c.Classifier) + ":" + optionutils.AsValue(c.Extension) +} + +// GavPath returns the Maven repository path. +func (c *Coordinates) GavPath() string { + return c.GroupPath() + "/" + c.ArtifactId + "/" + c.Version +} + +func (c *Coordinates) GavLocation(repo *Repository) *Location { + return repo.AddPath(c.GavPath()) +} + +func (c *Coordinates) FileName() string { + file := c.FileNamePrefix() + if optionutils.AsValue(c.Classifier) != "" { + file += "-" + *c.Classifier + } + if optionutils.AsValue(c.Extension) != "" { + file += "." + *c.Extension + } else { + file += ".jar" + } + return file +} + +// FilePath returns the Maven Coordinates's GAV-name with classifier and extension. +// Which is equal to the URL-path of the artifact in the repository. +// Default extension is jar. +func (c *Coordinates) FilePath() string { + return c.GavPath() + "/" + c.FileName() +} + +func (c *Coordinates) Location(repo *Repository) *Location { + return repo.AddPath(c.FilePath()) +} + +// GroupPath returns GroupId with `/` instead of `.`. +func (c *Coordinates) GroupPath() string { + return strings.ReplaceAll(c.GroupId, ".", "/") +} + +func (c *Coordinates) FileNamePrefix() string { + return c.ArtifactId + "-" + c.Version +} + +// Purl returns the Package URL of the Maven Coordinates. +func (c *Coordinates) Purl() string { + return "pkg:maven/" + c.GroupId + "/" + c.ArtifactId + "@" + c.Version +} + +// SetClassifierExtensionBy extracts the classifier and extension from the filename (without any path prefix). +func (c *Coordinates) SetClassifierExtensionBy(filename string) error { + s := strings.TrimPrefix(path.Base(filename), c.FileNamePrefix()) + if strings.HasPrefix(s, "-") { + s = strings.TrimPrefix(s, "-") + i := strings.Index(s, ".") + if i < 0 { + return fmt.Errorf("no extension after classifier found in filename: %s", filename) + } + c.Classifier = optionutils.PointerTo(s[:i]) + s = strings.TrimPrefix(s, optionutils.AsValue(c.Classifier)) + } else { + c.Classifier = optionutils.PointerTo("") + } + c.Extension = optionutils.PointerTo(strings.TrimPrefix(s, ".")) + return nil +} + +// MimeType returns the MIME type of the Maven Coordinates based on the file extension. +// Default is application/x-tgz. +func (c *Coordinates) MimeType() string { + if c.Extension != nil && c.Classifier != nil { + m := mime.TypeByExtension("." + optionutils.AsValue(c.Extension)) + if m != "" { + return m + } + return ocmmime.MIME_OCTET + } + return ocmmime.MIME_TGZ +} + +// Copy creates a new Coordinates with the same values. +func (c *Coordinates) Copy() *Coordinates { + return generics.Pointer(*c) +} + +func (c *Coordinates) FilterFileMap(fileMap map[string]crypto.Hash) map[string]crypto.Hash { + if c.Classifier == nil && c.Extension == nil { + return fileMap + } + exp := Literal(c.ArtifactId + "-" + c.Version) + if optionutils.AsValue(c.Classifier) != "" { + exp = Sequence(exp, Literal("-"+*c.Classifier)) + } + if optionutils.AsValue(c.Extension) != "" { + if c.Classifier == nil { + exp = Sequence(exp, Optional(Literal("-"), Match(".+"))) + } + exp = Sequence(exp, Literal("."+*c.Extension)) + } else { + exp = Sequence(exp, Literal("."), Match(".*")) + } + exp = Anchored(exp) + for file := range fileMap { + if !exp.MatchString(file) { + delete(fileMap, file) + } + } + return fileMap +} + +// Parse creates a Coordinates from it's serialized form (see Coordinates.String). +func Parse(serializedArtifact string) (*Coordinates, error) { + parts := strings.Split(serializedArtifact, ":") + if len(parts) < 3 { + return nil, fmt.Errorf("invalid coordination string: %s", serializedArtifact) + } + coords := &Coordinates{ + GroupId: parts[0], + ArtifactId: parts[1], + Version: parts[2], + } + if len(parts) >= 4 { + coords.Classifier = optionutils.PointerTo(parts[3]) + } + if len(parts) >= 5 { + coords.Extension = optionutils.PointerTo(parts[4]) + } + return coords, nil +} + +// IsResource returns true if the filename is not a checksum or signature file. +func IsResource(fileName string) bool { + switch filepath.Ext(fileName) { + case ".asc", ".md5", ".sha1", ".sha256", ".sha512": + return false + default: + return true + } +} diff --git a/pkg/maven/coordinates_test.go b/pkg/maven/coordinates_test.go new file mode 100644 index 0000000000..9a7aa6300a --- /dev/null +++ b/pkg/maven/coordinates_test.go @@ -0,0 +1,52 @@ +package maven_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/testutils" + + "github.com/mandelsoft/goutils/optionutils" + + me "github.com/open-component-model/ocm/pkg/maven" +) + +var _ = Describe("Maven Test Environment", func() { + + It("GAV, GroupPath, FilePath", func() { + coords := me.NewCoordinates("ocm.software", "hello-ocm", "0.0.1", me.WithExtension("jar")) + Expect(coords.GAV()).To(Equal("ocm.software:hello-ocm:0.0.1")) + Expect(coords.GroupPath()).To(Equal("ocm/software")) + Expect(coords.FilePath()).To(Equal("ocm/software/hello-ocm/0.0.1/hello-ocm-0.0.1.jar")) + }) + + It("SetClassifierExtensionBy", func() { + coords := me.NewCoordinates("ocm.software", "hello-ocm", "0.0.1") + MustBeSuccessful(coords.SetClassifierExtensionBy("hello-ocm-0.0.1.pom")) + Expect(coords.Classifier).ToNot(BeNil()) + Expect(optionutils.AsValue(coords.Classifier)).To(Equal("")) + Expect(optionutils.AsValue(coords.Extension)).To(Equal("pom")) + + MustBeSuccessful(coords.SetClassifierExtensionBy("hello-ocm-0.0.1-tests.jar")) + Expect(optionutils.AsValue(coords.Classifier)).To(Equal("tests")) + Expect(optionutils.AsValue(coords.Extension)).To(Equal("jar")) + + coords.ArtifactId = "apache-me" + coords.Version = "3.9.6" + MustBeSuccessful(coords.SetClassifierExtensionBy("apache-me-3.9.6-bin.tar.gz")) + Expect(optionutils.AsValue(coords.Classifier)).To(Equal("bin")) + Expect(optionutils.AsValue(coords.Extension)).To(Equal("tar.gz")) + }) + + It("parse GAV", func() { + gav := "org.apache.commons:commons-compress:1.26.1:cyclonedx:xml" + coords, err := me.Parse(gav) + Expect(err).To(BeNil()) + Expect(coords.String()).To(Equal(gav)) + Expect(coords.GroupId).To(Equal("org.apache.commons")) + Expect(coords.ArtifactId).To(Equal("commons-compress")) + Expect(coords.Version).To(Equal("1.26.1")) + Expect(optionutils.AsValue(coords.Classifier)).To(Equal("cyclonedx")) + Expect(optionutils.AsValue(coords.Extension)).To(Equal("xml")) + Expect(coords.FilePath()).To(Equal("org/apache/commons/commons-compress/1.26.1/commons-compress-1.26.1-cyclonedx.xml")) + }) +}) diff --git a/pkg/maven/logging.go b/pkg/maven/logging.go new file mode 100644 index 0000000000..17bfd5df54 --- /dev/null +++ b/pkg/maven/logging.go @@ -0,0 +1,7 @@ +package maven + +import "github.com/open-component-model/ocm/pkg/logging" + +var REALM = logging.DefineSubRealm("Maven repository", "maven") + +var Log = logging.DynamicLogger(REALM) diff --git a/pkg/maven/maventest/testdata.go b/pkg/maven/maventest/testdata.go new file mode 100644 index 0000000000..64f0c103e8 --- /dev/null +++ b/pkg/maven/maventest/testdata.go @@ -0,0 +1,9 @@ +package maventest + +import ( + "github.com/open-component-model/ocm/pkg/env" +) + +func TestData(dest ...string) env.Option { + return env.ProjectTestDataForCaller(dest...) +} diff --git a/pkg/contexts/ocm/accessmethods/mvn/testdata/fail/test/repository/42/repository-42.pom b/pkg/maven/maventest/testdata/.m2/fail/test/repository/42/repository-42.pom similarity index 100% rename from pkg/contexts/ocm/accessmethods/mvn/testdata/fail/test/repository/42/repository-42.pom rename to pkg/maven/maventest/testdata/.m2/fail/test/repository/42/repository-42.pom diff --git a/pkg/contexts/ocm/accessmethods/mvn/testdata/fail/test/repository/42/repository-42.pom.sha1 b/pkg/maven/maventest/testdata/.m2/fail/test/repository/42/repository-42.pom.sha1 similarity index 100% rename from pkg/contexts/ocm/accessmethods/mvn/testdata/fail/test/repository/42/repository-42.pom.sha1 rename to pkg/maven/maventest/testdata/.m2/fail/test/repository/42/repository-42.pom.sha1 diff --git a/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.json b/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.json new file mode 100644 index 0000000000..2f1fc35fdc --- /dev/null +++ b/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.json @@ -0,0 +1 @@ +{"some": "test content"} \ No newline at end of file diff --git a/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.json.sha1 b/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.json.sha1 new file mode 100644 index 0000000000..d6836aeaa0 --- /dev/null +++ b/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.json.sha1 @@ -0,0 +1 @@ +f0763ff4add043560aa3827cea06bf9335b87f73 \ No newline at end of file diff --git a/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.txt b/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.txt new file mode 100644 index 0000000000..b4af84697f --- /dev/null +++ b/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.txt @@ -0,0 +1 @@ +some test content \ No newline at end of file diff --git a/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.txt.sha1 b/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.txt.sha1 new file mode 100644 index 0000000000..55eceeb992 --- /dev/null +++ b/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-random-content.txt.sha1 @@ -0,0 +1 @@ +dbabd43828eccd27e3a109b58454e4ff43c8673e \ No newline at end of file diff --git a/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-sources.jar b/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-sources.jar new file mode 100644 index 0000000000000000000000000000000000000000..8564f0addae8de5525417df8294d13c0c2a3a7c0 GIT binary patch literal 595 zcmWIWW@h1HVBlb2I6ZY+1OpP_WME~0p0C?y-!rFuymj?1@_OrPojY@WbCAIm;|EWR^t^m^Jbf>guG$i0z|{3Z zQZu9C$@67uqD!Y`e=7P|#0a#Cor7naNwg)65ZVVl++yk z{N!Byg6wqtq@4Vu#N_1E;$r>W#In>p{gTw;l9a@fME%s^D&0A%HfJ3D=4gl*pE23j>4+%YaO}g$OGf$YN$76k=px&<0`# F1^|3_lo~0p0C?y-!rFuymj?1@_OrPojY@WbCAIm;|EWR^t^m^Jbf>guG$i0z|{3Z zQZu9C$@67uqD!Y`e=7P|#0a#Cor7naNwg)65ZVVl++yk z{N!Byg6wqtq@4Vu#N_1E;$r>W#In>p{gTw;l9a@fME%s^D&0A%HfJ3D=4gl*pE23j>4+%YaO}g$OGf$YN$76k=px&<0`# F1^|3_lo Date: Wed, 29 May 2024 14:47:50 +0200 Subject: [PATCH 79/83] utility function to get module name (#783) ## Description This Pull Request provides a utility function to get the module's name. --- pkg/env/env.go | 50 +++------- pkg/testutils/package.go | 78 +++++++++++++++ pkg/testutils/package_test.go | 15 +++ pkg/utils/package.go | 44 --------- pkg/utils/pkgutils/package.go | 102 ++++++++++++++++++++ pkg/utils/pkgutils/package_test.go | 32 ++++++ pkg/utils/pkgutils/suite_test.go | 13 +++ pkg/utils/pkgutils/testpackage/testtypes.go | 21 ++++ 8 files changed, 275 insertions(+), 80 deletions(-) create mode 100644 pkg/testutils/package.go create mode 100644 pkg/testutils/package_test.go delete mode 100644 pkg/utils/package.go create mode 100644 pkg/utils/pkgutils/package.go create mode 100644 pkg/utils/pkgutils/package_test.go create mode 100644 pkg/utils/pkgutils/suite_test.go create mode 100644 pkg/utils/pkgutils/testpackage/testtypes.go diff --git a/pkg/env/env.go b/pkg/env/env.go index 2f4da4b7e3..431b44e174 100644 --- a/pkg/env/env.go +++ b/pkg/env/env.go @@ -3,7 +3,6 @@ package env import ( "bytes" "fmt" - "runtime" "runtime/debug" "strings" @@ -25,7 +24,9 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/datacontext/attrs/vfsattr" "github.com/open-component-model/ocm/pkg/contexts/oci" ocm "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + "github.com/open-component-model/ocm/pkg/testutils" "github.com/open-component-model/ocm/pkg/utils" + "github.com/open-component-model/ocm/pkg/utils/pkgutils" ) //////////////////////////////////////////////////////////////////////////////// @@ -232,23 +233,13 @@ func ModifiableTestData(paths ...string) tdOpt { } func projectTestData(modifiable bool, source string, dest ...string) Option { - path := "." - for count := 0; count < 20; count++ { - if ok, err := vfs.FileExists(osfs.OsFs, filepath.Join(path, "go.mod")); err != nil || ok { - if err != nil { - panic(err) - } - path = filepath.Join(path, source) - break - } - if count == 19 { - panic("could not find go.mod (within 20 steps)") - } - - path = filepath.Join(path, "..") + pathToRoot, err := testutils.GetRelativePathToProjectRoot() + if err != nil { + panic(err) } + pathToTestdata := filepath.Join(pathToRoot, source) - return testData(modifiable, path, general.OptionalDefaulted("/testdata", dest...)) + return testData(modifiable, pathToTestdata, general.OptionalDefaulted("/testdata", dest...)) } func ProjectTestData(source string, dest ...string) Option { @@ -260,29 +251,16 @@ func ModifiableProjectTestData(source string, dest ...string) Option { } func projectTestDataForCaller(modifiable bool, dest ...string) Option { - pc, _, _, ok := runtime.Caller(2) - if !ok { - panic("unable to find caller") - } - - // Get the function details from the program counter - caller := runtime.FuncForPC(pc) - if caller == nil { - panic("unable to find caller") + packagePath, err := pkgutils.GetPackageName(2) + if err != nil { + panic(err) } - fullFuncName := caller.Name() - - // Split the name to extract the package path - // Assuming the format: "package/path.functionName" - lastSlashIndex := strings.LastIndex(fullFuncName, "/") - if lastSlashIndex == -1 { - panic("unable to find package name") + moduleName, err := testutils.GetModuleName() + if err != nil { + panic(err) } - - funcIndex := strings.Index(fullFuncName[lastSlashIndex:], ".") - packagePath := fullFuncName[:lastSlashIndex+funcIndex] - path, ok := strings.CutPrefix(packagePath, "github.com/open-component-model/ocm/") + path, ok := strings.CutPrefix(packagePath, moduleName+"/") if !ok { panic("unable to find package name") } diff --git a/pkg/testutils/package.go b/pkg/testutils/package.go new file mode 100644 index 0000000000..2e2925195d --- /dev/null +++ b/pkg/testutils/package.go @@ -0,0 +1,78 @@ +package testutils + +import ( + "fmt" + "strings" + + "github.com/mandelsoft/filepath/pkg/filepath" + "github.com/mandelsoft/goutils/general" + "github.com/mandelsoft/vfs/pkg/osfs" + "github.com/mandelsoft/vfs/pkg/vfs" + "golang.org/x/mod/modfile" + + "github.com/open-component-model/ocm/pkg/utils/pkgutils" +) + +const GO_MOD = "go.mod" + +func GetPackagePathFromProjectRoot(i ...interface{}) (string, error) { + pkg, err := pkgutils.GetPackageName(i...) + if err != nil { + return "", err + } + mod, err := GetModuleName() + if err != nil { + return "", err + } + path, ok := strings.CutPrefix(pkg, mod+"/") + if !ok { + return "", fmt.Errorf("prefix %q not found in %q", mod, pkg) + } + return path, nil +} + +// GetModuleName returns a go modules module name by finding and parsing the go.mod file. +func GetModuleName() (string, error) { + pathToRoot, err := GetRelativePathToProjectRoot() + if err != nil { + return "", err + } + pathToGoMod := filepath.Join(pathToRoot, GO_MOD) + // Read the content of the go.mod file + data, err := vfs.ReadFile(osfs.OsFs, pathToGoMod) + if err != nil { + return "", err + } + + // Parse the go.mod file + modFile, err := modfile.Parse(GO_MOD, data, nil) + if err != nil { + return "", fmt.Errorf("error parsing %s file: %w", GO_MOD, err) + } + + // Print the module path + return modFile.Module.Mod.Path, nil +} + +// GetRelativePathToProjectRoot calculates the relative path to a go projects root directory. +// It therefore assumes that the project root is the directory containing the go.mod file. +// The optional parameter i determines how many directories the function will step up through, attempting to find a +// go.mod file. If it cannot find a directory with a go.mod file within i iterations, the function throws an error. +func GetRelativePathToProjectRoot(i ...int) (string, error) { + iterations := general.OptionalDefaulted(20, i...) + + path := "." + for count := 0; count < iterations; count++ { + if ok, err := vfs.FileExists(osfs.OsFs, filepath.Join(path, GO_MOD)); err != nil || ok { + if err != nil { + return "", fmt.Errorf("failed to check if %s exists: %w", GO_MOD, err) + } + return path, nil + } + if count == iterations { + return "", fmt.Errorf("could not find %s (within %d steps)", GO_MOD, iterations) + } + path = filepath.Join(path, "..") + } + return "", nil +} diff --git a/pkg/testutils/package_test.go b/pkg/testutils/package_test.go new file mode 100644 index 0000000000..8e5805c70a --- /dev/null +++ b/pkg/testutils/package_test.go @@ -0,0 +1,15 @@ +package testutils_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + me "github.com/open-component-model/ocm/pkg/testutils" +) + +var _ = Describe("package tests", func() { + It("go module name", func() { + mod := me.Must(me.GetModuleName()) + Expect(mod).To(Equal("github.com/open-component-model/ocm")) + }) +}) diff --git a/pkg/utils/package.go b/pkg/utils/package.go deleted file mode 100644 index 932a765982..0000000000 --- a/pkg/utils/package.go +++ /dev/null @@ -1,44 +0,0 @@ -package utils - -import ( - "fmt" - "reflect" - "runtime" - "strings" -) - -const MODULE_PATH = "github.com/open-component-model/ocm" - -func GetPackageNameForFunc(i interface{}) (string, error) { - // Get the function's pointer - ptr := reflect.ValueOf(i).Pointer() - // Retrieve the function's runtime information - funcForPC := runtime.FuncForPC(ptr) - if funcForPC == nil { - return "", fmt.Errorf("could not determine package name") - } - // Get the full name of the function, including the package path - fullFuncName := funcForPC.Name() - - // Split the name to extract the package path - // Assuming the format: "package/path.functionName" - lastSlashIndex := strings.LastIndex(fullFuncName, "/") - if lastSlashIndex == -1 { - return "", fmt.Errorf("could not determine package name") - } - - packagePath := fullFuncName[:lastSlashIndex] - return packagePath, nil -} - -func GetPackagePathFromProjectRootForFunc(i interface{}) (string, error) { - pkg, err := GetPackageNameForFunc(i) - if err != nil { - return "", err - } - path, ok := strings.CutPrefix(pkg, "github.com/open-component-model/ocm/") - if !ok { - return "", fmt.Errorf("prefix %q not found in %q", MODULE_PATH, pkg) - } - return path, nil -} diff --git a/pkg/utils/pkgutils/package.go b/pkg/utils/pkgutils/package.go new file mode 100644 index 0000000000..857ca195f5 --- /dev/null +++ b/pkg/utils/pkgutils/package.go @@ -0,0 +1,102 @@ +package pkgutils + +import ( + "fmt" + "reflect" + "runtime" + "strings" +) + +// GetPackageName gets the package name for an object, a type, a function or a caller offset. +// +// Examples: +// +// GetPackageName(1) +// GetPackageName(&MyStruct{}) +// GetPackageName(GetPackageName) +// GetPackageName(generics.TypeOf[MyStruct]()) +func GetPackageName(i ...interface{}) (string, error) { + if len(i) == 0 { + i = []interface{}{0} + } + if t, ok := i[0].(reflect.Type); ok { + pkgpath := t.PkgPath() + if pkgpath == "" { + return "", fmt.Errorf("unable to determine package name") + } + return pkgpath, nil + } + v := reflect.ValueOf(i[0]) + for v.Kind() == reflect.Ptr { + v = v.Elem() + } + switch v.Kind() { + case reflect.Func: + return getPackageNameForFuncPC(v.Pointer()) + case reflect.Struct, reflect.Chan, reflect.Map, reflect.Slice, reflect.Array: + pkgpath := v.Type().PkgPath() + if pkgpath == "" { + return "", fmt.Errorf("unable to determine package name") + } + return pkgpath, nil + default: + offset, err := CastInt(v.Interface()) + if err != nil { + return "", err + } + pc, _, _, ok := runtime.Caller(offset + 1) + if !ok { + return "", fmt.Errorf("unable to find caller") + } + return getPackageNameForFuncPC(pc) + } +} + +func getPackageNameForFuncPC(pc uintptr) (string, error) { + // Retrieve the function's runtime information + funcForPC := runtime.FuncForPC(pc) + if funcForPC == nil { + return "", fmt.Errorf("could not determine package name") + } + // Get the full name of the function, including the package path + fullFuncName := funcForPC.Name() + + // Split the name to extract the package path + // Assuming the format: "package/path.functionName" + lastSlashIndex := strings.LastIndex(fullFuncName, "/") + if lastSlashIndex == -1 { + panic("unable to find package name") + } + + funcIndex := strings.Index(fullFuncName[lastSlashIndex:], ".") + packagePath := fullFuncName[:lastSlashIndex+funcIndex] + + return packagePath, nil +} + +func CastInt(i interface{}) (int, error) { + switch v := i.(type) { + case int: + return v, nil + case int8: + return int(v), nil + case int16: + return int(v), nil + case int32: + return int(v), nil + case int64: + return int(v), nil + case uint: + return int(v), nil + case uint8: + return int(v), nil + case uint16: + return int(v), nil + case uint32: + return int(v), nil + case uint64: + return int(v), nil + default: + return 0, fmt.Errorf("unable to cast %T into int", i) + } +} diff --git a/pkg/utils/pkgutils/package_test.go b/pkg/utils/pkgutils/package_test.go new file mode 100644 index 0000000000..b7ed7f1331 --- /dev/null +++ b/pkg/utils/pkgutils/package_test.go @@ -0,0 +1,32 @@ +package pkgutils_test + +import ( + "github.com/mandelsoft/goutils/generics" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/open-component-model/ocm/pkg/testutils" + me "github.com/open-component-model/ocm/pkg/utils/pkgutils" + "github.com/open-component-model/ocm/pkg/utils/pkgutils/testpackage" + "reflect" +) + +type typ struct{} + +var _ = Describe("package tests", func() { + DescribeTable("determine package type for ", func(typ interface{}) { + Expect(Must(me.GetPackageName(typ))).To(Equal(reflect.TypeOf(testpackage.MyStruct{}).PkgPath())) + }, + Entry("struct", &testpackage.MyStruct{}), + Entry("array", &testpackage.MyArray{}), + Entry("list", &testpackage.MyList{}), + Entry("map", &testpackage.MyMap{}), + Entry("chan", make(testpackage.MyChan)), + Entry("func", testpackage.MyFunc), + Entry("func type", generics.TypeOf[testpackage.MyFuncType]()), + Entry("struct type", generics.TypeOf[testpackage.MyStruct]()), + ) + It("determine package for caller func", func() { + Expect(Must(testpackage.MyFunc())).To(Equal(reflect.TypeOf(testpackage.MyStruct{}).PkgPath())) + Expect(Must(testpackage.MyFunc(1))).To(Equal(reflect.TypeOf(typ{}).PkgPath())) + }) +}) diff --git a/pkg/utils/pkgutils/suite_test.go b/pkg/utils/pkgutils/suite_test.go new file mode 100644 index 0000000000..2946fa4d3b --- /dev/null +++ b/pkg/utils/pkgutils/suite_test.go @@ -0,0 +1,13 @@ +package pkgutils_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Package Utils Test Suite") +} diff --git a/pkg/utils/pkgutils/testpackage/testtypes.go b/pkg/utils/pkgutils/testpackage/testtypes.go new file mode 100644 index 0000000000..057497e57a --- /dev/null +++ b/pkg/utils/pkgutils/testpackage/testtypes.go @@ -0,0 +1,21 @@ +package testpackage + +import ( + "github.com/mandelsoft/goutils/sliceutils" + + "github.com/open-component-model/ocm/pkg/utils/pkgutils" +) + +type ( + MyStruct struct{} + + MyList []int + MyArray [3]int + MyMap map[int]int + MyChan chan int + MyFuncType func() +) + +func MyFunc(i ...int) (string, error) { + return pkgutils.GetPackageName(sliceutils.Convert[interface{}](i)...) +} From 862458c1dc8b515770b0ca6004fcff94bee93322 Mon Sep 17 00:00:00 2001 From: Hilmar Falkenberg Date: Wed, 29 May 2024 15:26:59 +0200 Subject: [PATCH 80/83] sonatype nexus - quirks modes (#782) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Two step token auth doesn't work with Nexus and the REST endpoint for a dedicated version doesn't exist. With this PR, Read-Access is done only via Basic-Auth and in case the specified version endpoint is not found, it will now try to load the complete package description from one level above. That should contain ALL existing versions, incl. the requested one. ## What type of PR is this? (check all applicable) - [ ] πŸ• Feature - [ ] πŸŽ‡ Restructuring - [ ] πŸ› Bug Fix - [ ] πŸ“ Documentation Update - [ ] 🎨 Style - [ ] πŸ§‘β€πŸ’» Code Refactor - [ ] πŸ”₯ Performance Improvements - [ ] βœ… Test - [ ] πŸ€– Build - [ ] πŸ” CI - [ ] πŸ“¦ Chore (Release) - [ ] ⏩ Revert ## Related Tickets & Documents - Fixes #753 and #769 ## Added tests? - [ ] πŸ‘ yes - [ ] πŸ™… no, because they aren't needed - [ ] πŸ™‹ no, because I need help - [ ] Separate ticket for tests # (issue/pr) Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration ## Added to documentation? - [ ] πŸ“œ README.md - [ ] πŸ™… no documentation needed ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- docs/reference/ocm_credential-handling.md | 2 +- docs/reference/ocm_get_credentials.md | 2 +- .../builtin/npm/identity/identity.go | 39 +++---- .../repositories/npm/config_test.go | 9 +- .../credentials/repositories/npm/provider.go | 8 +- .../repositories/npm/repository.go | 2 +- pkg/contexts/ocm/accessmethods/npm/method.go | 100 +++++++++++++----- .../ocm/accessmethods/npm/method_test.go | 22 +++- .../handlers/generic/npm/blobhandler.go | 23 ++-- pkg/iotools/digests.go | 21 ++++ pkg/iotools/digests_test.go | 39 +++++++ pkg/npm/login.go | 53 +++++++--- pkg/npm/structs.go | 18 ++++ 13 files changed, 254 insertions(+), 84 deletions(-) create mode 100644 pkg/iotools/digests.go create mode 100644 pkg/iotools/digests_test.go create mode 100644 pkg/npm/structs.go diff --git a/docs/reference/ocm_credential-handling.md b/docs/reference/ocm_credential-handling.md index 28e70c6c12..32dc2e39f8 100644 --- a/docs/reference/ocm_credential-handling.md +++ b/docs/reference/ocm_credential-handling.md @@ -167,7 +167,7 @@ The following credential consumer types are used/supported: - password: the basic auth password - - NpmRegistry: NPM repository + - NpmRegistry: NPM registry It matches the NpmRegistry consumer type and additionally acts like the hostpath type. diff --git a/docs/reference/ocm_get_credentials.md b/docs/reference/ocm_get_credentials.md index c97d24bb06..1a7205d394 100644 --- a/docs/reference/ocm_get_credentials.md +++ b/docs/reference/ocm_get_credentials.md @@ -93,7 +93,7 @@ Matchers exist for the following usage contexts or consumer types: - password: the basic auth password - - NpmRegistry: NPM repository + - NpmRegistry: NPM registry It matches the NpmRegistry consumer type and additionally acts like the hostpath type. diff --git a/pkg/contexts/credentials/builtin/npm/identity/identity.go b/pkg/contexts/credentials/builtin/npm/identity/identity.go index 308cf8d299..dd90ef107d 100644 --- a/pkg/contexts/credentials/builtin/npm/identity/identity.go +++ b/pkg/contexts/credentials/builtin/npm/identity/identity.go @@ -1,11 +1,8 @@ package identity import ( - "path" + "net/url" - . "net/url" - - "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/credentials/identity/hostpath" "github.com/open-component-model/ocm/pkg/listformat" @@ -37,31 +34,35 @@ func init() { ATTR_TOKEN, "the token attribute. May exist after login at any npm registry. Check your .npmrc file!", }) - cpi.RegisterStandardIdentity(CONSUMER_TYPE, hostpath.IdentityMatcher(CONSUMER_TYPE), `NPM repository + cpi.RegisterStandardIdentity(CONSUMER_TYPE, hostpath.IdentityMatcher(CONSUMER_TYPE), `NPM registry It matches the `+CONSUMER_TYPE+` consumer type and additionally acts like the `+hostpath.IDENTITY_TYPE+` type.`, attrs) } -func GetConsumerId(rawURL string, pkgName string) cpi.ConsumerIdentity { - url, err := Parse(rawURL) +var identityMatcher = hostpath.IdentityMatcher(CONSUMER_TYPE) + +func IdentityMatcher(pattern, cur, id cpi.ConsumerIdentity) bool { + return identityMatcher(pattern, cur, id) +} + +func GetConsumerId(rawURL, groupId string) (cpi.ConsumerIdentity, error) { + _url, err := url.JoinPath(rawURL, groupId) if err != nil { - return nil + return nil, err } - - url.Path = path.Join(url.Path, pkgName) - return hostpath.GetConsumerIdentity(CONSUMER_TYPE, url.String()) + return hostpath.GetConsumerIdentity(CONSUMER_TYPE, _url), nil } -func GetCredentials(ctx cpi.ContextProvider, repoUrl string, pkgName string) common.Properties { - id := GetConsumerId(repoUrl, pkgName) - if id == nil { - return nil +func GetCredentials(ctx cpi.ContextProvider, repoUrl string, pkgName string) (cpi.Credentials, error) { + id, err := GetConsumerId(repoUrl, pkgName) + if err != nil { + return nil, err } - credentials, err := cpi.CredentialsForConsumer(ctx.CredentialsContext(), id) - if credentials == nil || err != nil { - return nil + if id == nil { + logging.DynamicLogger(REALM).Debug("No consumer identity found.", "url", repoUrl, "groupId", pkgName) + return nil, nil } - return credentials.Properties() + return cpi.CredentialsForConsumer(ctx.CredentialsContext(), id) } diff --git a/pkg/contexts/credentials/repositories/npm/config_test.go b/pkg/contexts/credentials/repositories/npm/config_test.go index e2c2fcfea9..d0ed58df86 100644 --- a/pkg/contexts/credentials/repositories/npm/config_test.go +++ b/pkg/contexts/credentials/repositories/npm/config_test.go @@ -3,18 +3,17 @@ package npm_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/open-component-model/ocm/pkg/testutils" "github.com/open-component-model/ocm/pkg/common" "github.com/open-component-model/ocm/pkg/contexts/credentials" "github.com/open-component-model/ocm/pkg/contexts/credentials/builtin/npm/identity" "github.com/open-component-model/ocm/pkg/contexts/credentials/repositories/npm" + . "github.com/open-component-model/ocm/pkg/testutils" ) var _ = Describe("Config deserialization Test Environment", func() { It("read .npmrc", func() { ctx := credentials.New() - repo := Must(npm.NewRepository(ctx, "testdata/.npmrc")) Expect(Must(repo.LookupCredentials("registry.npmjs.org")).Properties()).To(Equal(common.Properties{identity.ATTR_TOKEN: "npm_TOKEN"})) Expect(Must(repo.LookupCredentials("npm.registry.acme.com/api/npm")).Properties()).To(Equal(common.Properties{identity.ATTR_TOKEN: "bearer_TOKEN"})) @@ -22,12 +21,9 @@ var _ = Describe("Config deserialization Test Environment", func() { It("propagates credentials", func() { ctx := credentials.New() - spec := npm.NewRepositorySpec("testdata/.npmrc") - _ = Must(ctx.RepositoryForSpec(spec)) - id := identity.GetConsumerId("registry.npmjs.org", "pkg") - + id := Must(identity.GetConsumerId("registry.npmjs.org", "pkg")) creds := Must(credentials.CredentialsForConsumer(ctx, id)) Expect(creds).NotTo(BeNil()) Expect(creds.GetProperty(identity.ATTR_TOKEN)).To(Equal("npm_TOKEN")) @@ -39,5 +35,4 @@ var _ = Describe("Config deserialization Test Environment", func() { Expect(t).NotTo(BeNil()) Expect(t.Description()).NotTo(Equal("")) }) - }) diff --git a/pkg/contexts/credentials/repositories/npm/provider.go b/pkg/contexts/credentials/repositories/npm/provider.go index 2268ff5faf..a605204371 100644 --- a/pkg/contexts/credentials/repositories/npm/provider.go +++ b/pkg/contexts/credentials/repositories/npm/provider.go @@ -35,8 +35,12 @@ func (p *ConsumerProvider) get(requested cpi.ConsumerIdentity, currentFound cpi. var creds cpi.CredentialsSource for key, value := range all { - id := npm.GetConsumerId("https://"+key, "") - + id, err := npm.GetConsumerId("https://"+key, "") + if err != nil { + log := logging.Context().Logger(npm.REALM) + log.LogError(err, "Failed to get consumer id", "key", key, "value", value) + return nil, nil + } if m(requested, currentFound, id) { creds = newCredentials(value) currentFound = id diff --git a/pkg/contexts/credentials/repositories/npm/repository.go b/pkg/contexts/credentials/repositories/npm/repository.go index 87c4d326c5..0cd48ffa4f 100644 --- a/pkg/contexts/credentials/repositories/npm/repository.go +++ b/pkg/contexts/credentials/repositories/npm/repository.go @@ -65,7 +65,7 @@ func (r *Repository) Read(force bool) error { } if r.path == "" { - return fmt.Errorf("npmrc path not provided") + return errors.New("npmrc path not provided") } cfg, path, err := readNpmConfigFile(r.path) if err != nil { diff --git a/pkg/contexts/ocm/accessmethods/npm/method.go b/pkg/contexts/ocm/accessmethods/npm/method.go index fcf60cc67b..7d70ecb217 100644 --- a/pkg/contexts/ocm/accessmethods/npm/method.go +++ b/pkg/contexts/ocm/accessmethods/npm/method.go @@ -86,7 +86,7 @@ func (a *AccessSpec) AccessMethod(c accspeccpi.ComponentVersionAccess) (accspecc } func (a *AccessSpec) GetInexpensiveContentVersionIdentity(access accspeccpi.ComponentVersionAccess) string { - meta, err := a.getPackageMeta(access.GetContext()) + meta, err := a.GetPackageVersion(access.GetContext()) if err != nil { return "" } @@ -96,36 +96,49 @@ func (a *AccessSpec) GetInexpensiveContentVersionIdentity(access accspeccpi.Comp return "" } -// PackageUrl returns the URL of the NPM package (Registry/Package/Version). +// PackageUrl returns the URL of the NPM package (Registry/Package). func (a *AccessSpec) PackageUrl() string { - return a.Registry + path.Join("/", a.Package, a.Version) + return strings.TrimSuffix(a.Registry, "/") + path.Join("/", a.Package) } -func (a *AccessSpec) getPackageMeta(ctx accspeccpi.Context) (*meta, error) { +// PackageVersionUrl returns the URL of the NPM package-version (Registry/Package/Version). +func (a *AccessSpec) PackageVersionUrl() string { + return strings.TrimSuffix(a.Registry, "/") + path.Join("/", a.Package, a.Version) +} + +func (a *AccessSpec) GetPackageVersion(ctx accspeccpi.Context) (*npm.Version, error) { r, err := reader(a, vfsattr.Get(ctx), ctx) if err != nil { return nil, err } - buf := &bytes.Buffer{} - _, err = io.Copy(buf, io.LimitReader(r, 200000)) + defer r.Close() + buf, err := io.ReadAll(r) if err != nil { - return nil, errors.Wrapf(err, "cannot get version metadata for %s", a.PackageUrl()) + return nil, errors.Wrapf(err, "cannot get version metadata for %s", a.PackageVersionUrl()) } - - var metadata meta - - err = json.Unmarshal(buf.Bytes(), &metadata) - if err != nil { - return nil, errors.Wrapf(err, "cannot unmarshal version metadata for %s", a.PackageUrl()) + var version npm.Version + err = json.Unmarshal(buf, &version) + if err != nil || version.Dist.Tarball == "" { + // ugly fallback as workaround for https://github.com/sonatype/nexus-public/issues/224 + var project npm.Project + err = json.Unmarshal(buf, &project) // parse the complete project + if err != nil { + return nil, errors.Wrapf(err, "cannot unmarshal version metadata for %s", a.PackageVersionUrl()) + } + v, ok := project.Version[a.Version] // and pick only the specified version + if !ok { + return nil, errors.Newf("version '%s' doesn't exist", a.Version) + } + version = v } - return &metadata, nil + return &version, nil } //////////////////////////////////////////////////////////////////////////////// func newMethod(c accspeccpi.ComponentVersionAccess, a *AccessSpec) (accspeccpi.AccessMethodImpl, error) { factory := func() (blobaccess.BlobAccess, error) { - meta, err := a.getPackageMeta(c.GetContext()) + meta, err := a.GetPackageVersion(c.GetContext()) if err != nil { return nil, err } @@ -133,6 +146,20 @@ func newMethod(c accspeccpi.ComponentVersionAccess, a *AccessSpec) (accspeccpi.A f := func() (io.ReadCloser, error) { return reader(a, vfsattr.Get(c.GetContext()), c.GetContext(), meta.Dist.Tarball) } + if meta.Dist.Integrity != "" { + tf := f + f = func() (io.ReadCloser, error) { + r, err := tf() + if err != nil { + return nil, err + } + digest, err := iotools.DecodeBase64ToHex(meta.Dist.Integrity) + if err != nil { + return nil, err + } + return iotools.VerifyingReaderWithHash(r, crypto.SHA512, digest), nil + } + } if meta.Dist.Shasum != "" { tf := f f = func() (io.ReadCloser, error) { @@ -149,15 +176,8 @@ func newMethod(c accspeccpi.ComponentVersionAccess, a *AccessSpec) (accspeccpi.A return accspeccpi.NewDefaultMethodImpl(c, a, "", mime.MIME_TGZ, factory), nil } -type meta struct { - Dist struct { - Shasum string `json:"shasum"` - Tarball string `json:"tarball"` - } `json:"dist"` -} - func reader(a *AccessSpec, fs vfs.FileSystem, ctx cpi.ContextProvider, tar ...string) (io.ReadCloser, error) { - url := a.PackageUrl() + url := a.PackageVersionUrl() if len(tar) > 0 { url = tar[0] } @@ -170,12 +190,38 @@ func reader(a *AccessSpec, fs vfs.FileSystem, ctx cpi.ContextProvider, tar ...st if err != nil { return nil, err } - npm.Authorize(req, ctx, a.Registry, a.Package) + err = npm.BasicAuth(req, ctx, a.Registry, a.Package) + if err != nil { + return nil, err + } c := &http.Client{} resp, err := c.Do(req) if err != nil { return nil, err } + defer resp.Body.Close() + if resp.StatusCode == http.StatusNotFound { + // maybe it's stupid Nexus - https://github.com/sonatype/nexus-public/issues/224? + url = a.PackageUrl() + req, err = http.NewRequestWithContext(context.Background(), http.MethodGet, url, nil) + if err != nil { + return nil, err + } + err = npm.BasicAuth(req, ctx, a.Registry, a.Package) + if err != nil { + return nil, err + } + + // close body before overwriting to close any pending connections + resp.Body.Close() + resp, err = c.Do(req) + if err != nil { + return nil, err + } + + defer resp.Body.Close() + } + if resp.StatusCode != http.StatusOK { defer resp.Body.Close() buf := &bytes.Buffer{} @@ -185,5 +231,9 @@ func reader(a *AccessSpec, fs vfs.FileSystem, ctx cpi.ContextProvider, tar ...st } return nil, errors.Newf("version meta data request %s provides %s: %s", url, resp.Status, buf.String()) } - return resp.Body, nil + content, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + return io.NopCloser(bytes.NewBuffer(content)), nil } diff --git a/pkg/contexts/ocm/accessmethods/npm/method_test.go b/pkg/contexts/ocm/accessmethods/npm/method_test.go index dc4dbd2513..97c8ec7630 100644 --- a/pkg/contexts/ocm/accessmethods/npm/method_test.go +++ b/pkg/contexts/ocm/accessmethods/npm/method_test.go @@ -5,15 +5,15 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/open-component-model/ocm/pkg/env" - . "github.com/open-component-model/ocm/pkg/env/builder" - . "github.com/open-component-model/ocm/pkg/testutils" "github.com/open-component-model/ocm/pkg/contexts/ocm" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/npm" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" + . "github.com/open-component-model/ocm/pkg/env" + . "github.com/open-component-model/ocm/pkg/env/builder" "github.com/open-component-model/ocm/pkg/iotools" "github.com/open-component-model/ocm/pkg/mime" + . "github.com/open-component-model/ocm/pkg/testutils" ) const NPMPATH = "/testdata/registry" @@ -62,4 +62,20 @@ var _ = Describe("Method", func() { _, err := m.Reader() Expect(err).To(MatchError(ContainSubstring("SHA-1 digest mismatch: expected 44a77645201d1a8fc5213ace787c220eabbd0967, found 34a77645201d1a8fc5213ace787c220eabbd0967"))) }) + + It("PackageUrl()", func() { + packageUrl := "https://registry.npmjs.org/yargs" + acc := npm.New("https://registry.npmjs.org", "yargs", "17.7.1") + Expect(acc.PackageUrl()).To(Equal(packageUrl)) + acc = npm.New("https://registry.npmjs.org/", "yargs", "17.7.1") + Expect(acc.PackageUrl()).To(Equal(packageUrl)) + }) + + It("PackageVersionUrl()", func() { + packageVersionUrl := "https://registry.npmjs.org/yargs/17.7.1" + acc := npm.New("https://registry.npmjs.org", "yargs", "17.7.1") + Expect(acc.PackageVersionUrl()).To(Equal(packageVersionUrl)) + acc = npm.New("https://registry.npmjs.org/", "yargs", "17.7.1") + Expect(acc.PackageVersionUrl()).To(Equal(packageVersionUrl)) + }) }) diff --git a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/blobhandler.go b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/blobhandler.go index 76032ffca3..526b1f3dc2 100644 --- a/pkg/contexts/ocm/blobhandler/handlers/generic/npm/blobhandler.go +++ b/pkg/contexts/ocm/blobhandler/handlers/generic/npm/blobhandler.go @@ -9,6 +9,7 @@ import ( "net/http" "net/url" + crds "github.com/open-component-model/ocm/pkg/contexts/credentials/cpi" "github.com/open-component-model/ocm/pkg/contexts/ocm/accessmethods/npm" "github.com/open-component-model/ocm/pkg/contexts/ocm/cpi" "github.com/open-component-model/ocm/pkg/logging" @@ -64,14 +65,8 @@ func (b *artifactHandler) StoreBlob(blob cpi.BlobAccess, _ string, _ string, _ c log = log.WithValues("package", pkg.Name, "version", pkg.Version) log.Debug("identified") - token, err := npmLogin.BearerToken(ctx.GetContext(), b.spec.Url, pkg.Name) - if err != nil { - // we assume, it's not possible to publish anonymous - without token - return nil, err - } - // check if package exists - exists, err := packageExists(b.spec.Url, *pkg, token) + exists, err := packageExists(b.spec.Url, *pkg, ctx.GetContext()) if err != nil { return nil, err } @@ -104,8 +99,11 @@ func (b *artifactHandler) StoreBlob(blob cpi.BlobAccess, _ string, _ string, _ c if err != nil { return nil, err } - req.Header.Set("authorization", "Bearer "+token) - req.Header.Set("content-type", "application/json") + err = npmLogin.Authorize(req, ctx.GetContext(), b.spec.Url, pkg.Name) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") // send PUT request - upload tgz client := http.Client{} @@ -127,13 +125,16 @@ func (b *artifactHandler) StoreBlob(blob cpi.BlobAccess, _ string, _ string, _ c } // Check if package already exists in npm registry. If it does, checks if it's the same. -func packageExists(repoUrl string, pkg Package, token string) (bool, error) { +func packageExists(repoUrl string, pkg Package, ctx crds.ContextProvider) (bool, error) { client := http.Client{} req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, repoUrl+"/"+url.PathEscape(pkg.Name)+"/"+url.PathEscape(pkg.Version), nil) if err != nil { return false, err } - req.Header.Set("authorization", "Bearer "+token) + err = npmLogin.Authorize(req, ctx, repoUrl, pkg.Name) + if err != nil { + return false, err + } resp, err := client.Do(req) if err != nil { return false, err diff --git a/pkg/iotools/digests.go b/pkg/iotools/digests.go new file mode 100644 index 0000000000..ab52988499 --- /dev/null +++ b/pkg/iotools/digests.go @@ -0,0 +1,21 @@ +package iotools + +import ( + "encoding/base64" + "encoding/hex" + "regexp" +) + +// Regular expression matching: e.g. 'sha512-', 'SHA-1:', 'Sha-256:', 'sHA42-',. +var re = regexp.MustCompile(`(?i)^sha(\d+-|\-\d+:)`) + +// DecodeBase64ToHex decodes a base64 encoded string and returns the hex representation. +// Any prefix like 'sha512-' or 'SHA-256:' or 'Sha1-' is removed. +func DecodeBase64ToHex(b64encoded string) (string, error) { + b64encoded = re.ReplaceAllString(b64encoded, "") + digest, err := base64.StdEncoding.DecodeString(b64encoded) + if err != nil { + return "", err + } + return hex.EncodeToString(digest), nil +} diff --git a/pkg/iotools/digests_test.go b/pkg/iotools/digests_test.go new file mode 100644 index 0000000000..980472223a --- /dev/null +++ b/pkg/iotools/digests_test.go @@ -0,0 +1,39 @@ +package iotools_test + +import ( + "crypto" + "encoding/base64" + "encoding/hex" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/open-component-model/ocm/pkg/iotools" +) + +var _ = Describe("digests.go tests", func() { + It("DecodeBase64ToHex", func() { + hx, err := iotools.DecodeBase64ToHex("04cXMnFlKzgudf//lH/VqGUtFkplvGv0BCmPREEJsVYTJrxyiBFlsOiZIrjPENBkHWPnK6kOG53VTiqtsILNgw==") + Expect(err).To(BeNil()) + Expect(hx).To(Equal("d387173271652b382e75ffff947fd5a8652d164a65bc6bf404298f444109b1561326bc72881165b0e89922b8cf10d0641d63e72ba90e1b9dd54e2aadb082cd83")) + + hx, err = iotools.DecodeBase64ToHex("sha512-04cXMnFlKzgudf//lH/VqGUtFkplvGv0BCmPREEJsVYTJrxyiBFlsOiZIrjPENBkHWPnK6kOG53VTiqtsILNgw==") + Expect(err).To(BeNil()) + Expect(hx).To(Equal("d387173271652b382e75ffff947fd5a8652d164a65bc6bf404298f444109b1561326bc72881165b0e89922b8cf10d0641d63e72ba90e1b9dd54e2aadb082cd83")) + + hx, err = iotools.DecodeBase64ToHex("SHA512-04cXMnFlKzgudf//lH/VqGUtFkplvGv0BCmPREEJsVYTJrxyiBFlsOiZIrjPENBkHWPnK6kOG53VTiqtsILNgw==") + Expect(err).To(BeNil()) + Expect(hx).To(Equal("d387173271652b382e75ffff947fd5a8652d164a65bc6bf404298f444109b1561326bc72881165b0e89922b8cf10d0641d63e72ba90e1b9dd54e2aadb082cd83")) + + hx, err = iotools.DecodeBase64ToHex("Sha-512:04cXMnFlKzgudf//lH/VqGUtFkplvGv0BCmPREEJsVYTJrxyiBFlsOiZIrjPENBkHWPnK6kOG53VTiqtsILNgw==") + Expect(err).To(BeNil()) + Expect(hx).To(Equal("d387173271652b382e75ffff947fd5a8652d164a65bc6bf404298f444109b1561326bc72881165b0e89922b8cf10d0641d63e72ba90e1b9dd54e2aadb082cd83")) + + s1 := crypto.SHA1.New() + s1.Write([]byte("hello")) + sum := s1.Sum(nil) + hx, err = iotools.DecodeBase64ToHex("sHa-1:" + base64.StdEncoding.EncodeToString(sum)) + Expect(err).To(BeNil()) + Expect(hx).To(Equal(hex.EncodeToString(sum))) + }) +}) diff --git a/pkg/npm/login.go b/pkg/npm/login.go index 17f45b0298..955750cdf3 100644 --- a/pkg/npm/login.go +++ b/pkg/npm/login.go @@ -54,46 +54,71 @@ func Login(registry string, username string, password string, email string) (str return token.Token, nil } +func GetCredentials(ctx cpi.ContextProvider, repoUrl string, pkgName string) (string, string, error) { + credentials, err := identity.GetCredentials(ctx, repoUrl, pkgName) + if err != nil { + return "", "", err + } + if credentials == nil { + return "", "", fmt.Errorf("no credentials found for %s. Couldn't access '%s'", repoUrl, pkgName) + } + return credentials.GetProperty(identity.ATTR_USERNAME), credentials.GetProperty(identity.ATTR_PASSWORD), nil +} + // BearerToken retrieves the bearer token for the given repository URL and package name. // Either it's setup in the credentials or it will login to the registry and retrieve it. func BearerToken(ctx cpi.ContextProvider, repoUrl string, pkgName string) (string, error) { // get credentials and TODO cache it - cred := identity.GetCredentials(ctx, repoUrl, pkgName) - if cred == nil { - return "", fmt.Errorf("no credentials found for %s. Couldn't upload '%s'", repoUrl, pkgName) + credentials, err := identity.GetCredentials(ctx, repoUrl, pkgName) + if err != nil { + return "", err + } + if credentials == nil { + return "", fmt.Errorf("no credentials found for %s. Couldn't access '%s'", repoUrl, pkgName) } log := logging.Context().Logger(identity.REALM) log.Debug("found credentials") // check if token exists, if not login and retrieve token - token := cred[identity.ATTR_TOKEN] + token := credentials.GetProperty(identity.ATTR_TOKEN) if token != "" { log.Debug("token found, skipping login") return token, nil } // use user+pass+mail from credentials to login and retrieve bearer token - username := cred[identity.ATTR_USERNAME] - password := cred[identity.ATTR_PASSWORD] - email := cred[identity.ATTR_EMAIL] + username := credentials.GetProperty(identity.ATTR_USERNAME) + password := credentials.GetProperty(identity.ATTR_PASSWORD) + email := credentials.GetProperty(identity.ATTR_EMAIL) if username == "" || password == "" || email == "" { return "", fmt.Errorf("credentials for %s are invalid. Username, password or email missing! Couldn't upload '%s'", repoUrl, pkgName) } - log = log.WithValues("user", username, "repo", repoUrl) - log.Debug("login") + log.Debug("login", "user", username, "repo", repoUrl) // TODO: check different kinds of .npmrc content - return Login(repoUrl, username, password, email) + token, err = Login(repoUrl, username, password, email) + return token, err } // Authorize the given request with the bearer token for the given repository URL and package name. // If the token is empty (login failed or credentials not found), it will not be set. -func Authorize(req *http.Request, ctx cpi.ContextProvider, repoUrl string, pkgName string) { +func Authorize(req *http.Request, ctx cpi.ContextProvider, repoUrl string, pkgName string) error { token, err := BearerToken(ctx, repoUrl, pkgName) if err != nil { - log := logging.Context().Logger(identity.REALM) - log.Debug("Couldn't authorize", "error", err.Error(), "repo", repoUrl, "package", pkgName) + return err } else if token != "" { - req.Header.Set("authorization", "Bearer "+token) + req.Header.Set("Authorization", "Bearer "+token) + } + return nil +} + +func BasicAuth(req *http.Request, ctx cpi.ContextProvider, repoUrl string, pkgName string) error { + username, password, err := GetCredentials(ctx, repoUrl, pkgName) + if err != nil { + return err + } + if username != "" && password != "" { + req.SetBasicAuth(username, password) } + return nil } diff --git a/pkg/npm/structs.go b/pkg/npm/structs.go new file mode 100644 index 0000000000..e3c52c6af6 --- /dev/null +++ b/pkg/npm/structs.go @@ -0,0 +1,18 @@ +package npm + +type Dist struct { + Integrity string `json:"integrity"` + Shasum string `json:"shasum"` + Tarball string `json:"tarball"` +} + +type Version struct { + Name string `json:"name"` + Version string `json:"version"` + Dist Dist `json:"dist"` +} + +type Project struct { + Name string `json:"name"` + Version map[string]Version `json:"versions"` +} From 89b6e9608cf50df2b0700636dcaf1d7a4761ff6a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 09:37:03 +0200 Subject: [PATCH 81/83] Bump github.com/sigstore/sigstore from 1.8.3 to 1.8.4 in the go group (#786) Bumps the go group with 1 update: [github.com/sigstore/sigstore](https://github.com/sigstore/sigstore). Updates `github.com/sigstore/sigstore` from 1.8.3 to 1.8.4 - [Release notes](https://github.com/sigstore/sigstore/releases) - [Commits](https://github.com/sigstore/sigstore/compare/v1.8.3...v1.8.4) --- updated-dependencies: - dependency-name: github.com/sigstore/sigstore dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 84a8c9eeed..51d0888ad3 100644 --- a/go.mod +++ b/go.mod @@ -55,7 +55,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/sigstore/cosign/v2 v2.2.4 github.com/sigstore/rekor v1.3.6 - github.com/sigstore/sigstore v1.8.3 + github.com/sigstore/sigstore v1.8.4 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 @@ -66,6 +66,7 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 + golang.org/x/mod v0.17.0 golang.org/x/net v0.25.0 golang.org/x/oauth2 v0.20.0 golang.org/x/text v0.15.0 @@ -326,7 +327,6 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/crypto v0.23.0 // indirect - golang.org/x/mod v0.17.0 // indirect golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.20.0 // indirect golang.org/x/term v0.20.0 // indirect diff --git a/go.sum b/go.sum index f635f11af8..7ed03f182c 100644 --- a/go.sum +++ b/go.sum @@ -435,8 +435,8 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.18.0 h1:BvolUXjp4zuvkZ5YN5t7ebzbhlUtPsPm2S9NAZ5nl9U= github.com/go-playground/validator/v10 v10.18.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= -github.com/go-rod/rod v0.114.7 h1:h4pimzSOUnw7Eo41zdJA788XsawzHjJMyzCE3BrBww0= -github.com/go-rod/rod v0.114.7/go.mod h1:aiedSEFg5DwG/fnNbUOTPMTTWX3MRj6vIs/a684Mthw= +github.com/go-rod/rod v0.116.0 h1:ypRryjTys3EnqHskJ/TdgodFMvXV0EHvmy4bSkKZgHM= +github.com/go-rod/rod v0.116.0/go.mod h1:aiedSEFg5DwG/fnNbUOTPMTTWX3MRj6vIs/a684Mthw= github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -882,8 +882,8 @@ github.com/sigstore/fulcio v1.4.5 h1:WWNnrOknD0DbruuZWCbN+86WRROpEl3Xts+WT2Ek1yc github.com/sigstore/fulcio v1.4.5/go.mod h1:oz3Qwlma8dWcSS/IENR/6SjbW4ipN0cxpRVfgdsjMU8= github.com/sigstore/rekor v1.3.6 h1:QvpMMJVWAp69a3CHzdrLelqEqpTM3ByQRt5B5Kspbi8= github.com/sigstore/rekor v1.3.6/go.mod h1:JDTSNNMdQ/PxdsS49DJkJ+pRJCO/83nbR5p3aZQteXc= -github.com/sigstore/sigstore v1.8.3 h1:G7LVXqL+ekgYtYdksBks9B38dPoIsbscjQJX/MGWkA4= -github.com/sigstore/sigstore v1.8.3/go.mod h1:mqbTEariiGA94cn6G3xnDiV6BD8eSLdL/eA7bvJ0fVs= +github.com/sigstore/sigstore v1.8.4 h1:g4ICNpiENFnWxjmBzBDWUn62rNFeny/P77HUC8da32w= +github.com/sigstore/sigstore v1.8.4/go.mod h1:1jIKtkTFEeISen7en+ZPWdDHazqhxco/+v9CNjc7oNg= github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.3 h1:LTfPadUAo+PDRUbbdqbeSl2OuoFQwUFTnJ4stu+nwWw= github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.3/go.mod h1:QV/Lxlxm0POyhfyBtIbTWxNeF18clMlkkyL9mu45y18= github.com/sigstore/sigstore/pkg/signature/kms/azure v1.8.3 h1:xgbPRCr2npmmsuVVteJqi/ERw9+I13Wou7kq0Yk4D8g= From 165edcc4c8e800aed37f0345bed834f9d7313f5c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 07:46:48 +0000 Subject: [PATCH 82/83] Bump github.com/cloudflare/cfssl from 0.0.0-20180223231731-4e2dcbde5004 to 1.6.5 (#787) Bump github.com/cloudflare/cfssl Bumps [github.com/cloudflare/cfssl](https://github.com/cloudflare/cfssl) from 0.0.0-20180223231731-4e2dcbde5004 to 1.6.5. - [Release notes](https://github.com/cloudflare/cfssl/releases) - [Changelog](https://github.com/cloudflare/cfssl/blob/master/CHANGELOG) - [Commits](https://github.com/cloudflare/cfssl/commits/v1.6.5) --- updated-dependencies: - dependency-name: github.com/cloudflare/cfssl dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 51d0888ad3..9c9602d284 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.21 github.com/aws/aws-sdk-go-v2/service/ecr v1.28.3 github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3 - github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 + github.com/cloudflare/cfssl v1.6.5 github.com/containerd/containerd v1.7.17 github.com/containerd/log v0.1.0 github.com/containers/image/v5 v5.31.0 diff --git a/go.sum b/go.sum index 7ed03f182c..6555a0c94f 100644 --- a/go.sum +++ b/go.sum @@ -249,8 +249,9 @@ github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ= github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= +github.com/cloudflare/cfssl v1.6.5 h1:46zpNkm6dlNkMZH/wMW22ejih6gIaJbzL2du6vD7ZeI= +github.com/cloudflare/cfssl v1.6.5/go.mod h1:Bk1si7sq8h2+yVEDrFJiz3d7Aw+pfjjJSZVaD+Taky4= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= @@ -975,6 +976,8 @@ github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQ github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vbatts/tar-split v0.11.5 h1:3bHCTIheBm1qFTcgh9oPu+nNBtX+XJIupG/vacinCts= github.com/vbatts/tar-split v0.11.5/go.mod h1:yZbwRsSeGjusneWgA781EKej9HF8vme8okylkAeNKLk= +github.com/weppos/publicsuffix-go v0.30.1-0.20230620154423-38c92ad2d5c6 h1:kNn7cjQYeNjKUflvFFCxFeyS7ENcDdfPmkhFpgd0G/A= +github.com/weppos/publicsuffix-go v0.30.1-0.20230620154423-38c92ad2d5c6/go.mod h1:wdMq89hDN07Zqr0yqYAXIBTJXl4MEELx+HYHOZdf5gM= github.com/xanzy/go-gitlab v0.102.0 h1:ExHuJ1OTQ2yt25zBMMj0G96ChBirGYv8U7HyUiYkZ+4= github.com/xanzy/go-gitlab v0.102.0/go.mod h1:ETg8tcj4OhrB84UEgeE8dSuV/0h4BBL1uOV/qK0vlyI= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -1015,6 +1018,10 @@ github.com/zalando/go-keyring v0.2.3 h1:v9CUu9phlABObO4LPWycf+zwMG7nlbb3t/B5wa97 github.com/zalando/go-keyring v0.2.3/go.mod h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk= github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs= github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= +github.com/zmap/zcrypto v0.0.0-20230310154051-c8b263fd8300 h1:DZH5n7L3L8RxKdSyJHZt7WePgwdhHnPhQFdQSJaHF+o= +github.com/zmap/zcrypto v0.0.0-20230310154051-c8b263fd8300/go.mod h1:mOd4yUMgn2fe2nV9KXsa9AyQBFZGzygVPovsZR+Rl5w= +github.com/zmap/zlint/v3 v3.5.0 h1:Eh2B5t6VKgVH0DFmTwOqE50POvyDhUaU9T2mJOe1vfQ= +github.com/zmap/zlint/v3 v3.5.0/go.mod h1:JkNSrsDJ8F4VRtBZcYUQSvnWFL7utcjDIn+FE64mlBI= go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= From 7a913dc51ebc2f8db714d99a8e061017ee71ae01 Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Mon, 3 Jun 2024 09:59:34 +0200 Subject: [PATCH 83/83] various fixes/improvements for tests and paths to prepare migration (#788) Co-authored-by: Hilmar Falkenberg --- .../commands/misccmds/hash/sign/cmd_test.go | 3 ++- .../common/inputs/types/maven/input_test.go | 5 ++-- .../lib/tour/04-working-with-config/README.md | 2 +- .../docsrc/04-working-with-config/README.md | 2 +- pkg/blobaccess/maven/access_test.go | 11 +++++--- .../ocm/accessmethods/maven/method_test.go | 25 +++++++++--------- .../ocm/accessmethods/ociartifact/README.md | 2 +- .../accessmethods/relativeociref/README.md | 4 +-- pkg/contexts/ocm/repositories/ctf/README.md | 2 +- .../ocm/repositories/ocireg/README.md | 2 +- pkg/contexts/ocm/signing/signing_test.go | 4 +-- .../ocm/signing/signingtest/testdata.go | 13 +++++++++ ...425f502dd6518e40eaa3ac7d24023d4c73d55dc12e | 0 .../component-descriptor.yaml | 0 .../testdata/compat/rsa.priv | 0 .../{ => signingtest}/testdata/compat/rsa.pub | 0 pkg/maven/maventest/const.go | 8 ++++++ pkg/maven/maventest/testdata.go | 4 +++ .../5.7.0/sdk-modules-bom-5.7.0-sources.jar | Bin 595 -> 424 bytes .../sdk-modules-bom-5.7.0-sources.jar.sha1 | 2 +- .../5.7.0/sdk-modules-bom-5.7.0.jar | Bin 595 -> 424 bytes .../5.7.0/sdk-modules-bom-5.7.0.jar.sha1 | 2 +- 22 files changed, 62 insertions(+), 29 deletions(-) create mode 100644 pkg/contexts/ocm/signing/signingtest/testdata.go rename pkg/contexts/ocm/signing/{ => signingtest}/testdata/compat/component-archive/blobs/sha256.c893900c1106f13d55648a425f502dd6518e40eaa3ac7d24023d4c73d55dc12e (100%) rename pkg/contexts/ocm/signing/{ => signingtest}/testdata/compat/component-archive/component-descriptor.yaml (100%) rename pkg/contexts/ocm/signing/{ => signingtest}/testdata/compat/rsa.priv (100%) rename pkg/contexts/ocm/signing/{ => signingtest}/testdata/compat/rsa.pub (100%) create mode 100644 pkg/maven/maventest/const.go diff --git a/cmds/ocm/commands/misccmds/hash/sign/cmd_test.go b/cmds/ocm/commands/misccmds/hash/sign/cmd_test.go index 0c542f75ab..faf7dd8bfc 100644 --- a/cmds/ocm/commands/misccmds/hash/sign/cmd_test.go +++ b/cmds/ocm/commands/misccmds/hash/sign/cmd_test.go @@ -6,6 +6,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/cmds/ocm/testhelper" + "github.com/open-component-model/ocm/pkg/contexts/ocm/signing/signingtest" . "github.com/open-component-model/ocm/pkg/testutils" ) @@ -15,7 +16,7 @@ var _ = Describe("Test Environment", func() { var env *TestEnv BeforeEach(func() { - env = NewTestEnv(TestData("../../../../../../pkg/contexts/ocm/signing/testdata")) + env = NewTestEnv(signingtest.TestData()) }) AfterEach(func() { diff --git a/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/input_test.go b/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/input_test.go index 7731e45ac5..ea833e53e8 100644 --- a/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/input_test.go +++ b/cmds/ocm/commands/ocmcmds/common/inputs/types/maven/input_test.go @@ -2,6 +2,7 @@ package maven_test import ( "crypto" + "github.com/open-component-model/ocm/pkg/maven/maventest" . "github.com/mandelsoft/goutils/testutils" @@ -44,7 +45,7 @@ var _ = Describe("Test Environment", func() { access := Must(env.Context.OCMContext().AccessSpecForSpec(cd.Resources[0].Access)).(*localblob.AccessSpec) Expect(access.MediaType).To(Equal(mime.MIME_TGZ)) fi := Must(env.FileSystem().Stat(env.Join(ARCH, "blobs", access.LocalReference))) - Expect(fi.Size()).To(Equal(int64(1570))) + Expect(fi.Size()).To(Equal(int64(maventest.ARTIFACT_SIZE))) li := Must(tarutils.ListArchiveContent(env.Join(ARCH, "blobs", access.LocalReference), env.FileSystem())) Expect(li).To(ConsistOf( "sdk-modules-bom-5.7.0-random-content.json", @@ -53,7 +54,7 @@ var _ = Describe("Test Environment", func() { "sdk-modules-bom-5.7.0.jar", "sdk-modules-bom-5.7.0.pom")) Expect(cd.Resources[0].Digest.HashAlgorithm).To(Equal(crypto.SHA256.String())) - Expect(cd.Resources[0].Digest.Value).To(Equal("16cfb5ced0ea7688dba14aeb0d3aa76ad46e4661bfcc556ffd7287de3b2f7152")) + Expect(cd.Resources[0].Digest.Value).To(Equal(maventest.ARTIFACT_DIGEST)) }) It("add maven from file system described by cli options", func() { diff --git a/examples/lib/tour/04-working-with-config/README.md b/examples/lib/tour/04-working-with-config/README.md index 2b156dc19a..0ec8a67c0c 100644 --- a/examples/lib/tour/04-working-with-config/README.md +++ b/examples/lib/tour/04-working-with-config/README.md @@ -115,7 +115,7 @@ settings for the given object and calls the appropriate methods on this object (after a type cast). Here is the code snippet from the apply method of the credential -config object ([.../pkg/contexts/credentials/config/type.go](../../../../../pkg/contexts/credentials/config/type.go)): +config object ([.../pkg/contexts/credentials/config/type.go](../../../../pkg/contexts/credentials/config/type.go)): ```go diff --git a/examples/lib/tour/docsrc/04-working-with-config/README.md b/examples/lib/tour/docsrc/04-working-with-config/README.md index 74572d52bb..bd0cf2a5bd 100644 --- a/examples/lib/tour/docsrc/04-working-with-config/README.md +++ b/examples/lib/tour/docsrc/04-working-with-config/README.md @@ -90,7 +90,7 @@ settings for the given object and calls the appropriate methods on this object (after a type cast). Here is the code snippet from the apply method of the credential -config object ([.../pkg/contexts/credentials/config/type.go](../../../../../pkg/contexts/credentials/config/type.go)): +config object ([.../pkg/contexts/credentials/config/type.go](../../../../pkg/contexts/credentials/config/type.go)): ```go {{include}{../../../../../pkg/contexts/credentials/config/type.go}{apply}} diff --git a/pkg/blobaccess/maven/access_test.go b/pkg/blobaccess/maven/access_test.go index e2e10c96df..de275eae53 100644 --- a/pkg/blobaccess/maven/access_test.go +++ b/pkg/blobaccess/maven/access_test.go @@ -1,9 +1,10 @@ package maven_test import ( - "github.com/open-component-model/ocm/pkg/maven/maventest" "time" + "github.com/open-component-model/ocm/pkg/maven/maventest" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/env/builder" @@ -45,8 +46,12 @@ var _ = Describe("blobaccess for maven", func() { b := Must(me.BlobAccessForMaven(repo, coords.GroupId, coords.ArtifactId, coords.Version, me.WithCachingFileSystem(env.FileSystem()))) defer Close(b, "blobaccess") files := Must(tarutils.ListArchiveContentFromReader(Must(b.Reader()))) - Expect(files).To(ConsistOf("sdk-modules-bom-5.7.0.pom", "sdk-modules-bom-5.7.0.jar", "sdk-modules-bom-5.7.0-random-content.txt", - "sdk-modules-bom-5.7.0-random-content.json", "sdk-modules-bom-5.7.0-sources.jar")) + Expect(files).To(ConsistOf( + "sdk-modules-bom-5.7.0.pom", + "sdk-modules-bom-5.7.0.jar", + "sdk-modules-bom-5.7.0-random-content.txt", + "sdk-modules-bom-5.7.0-random-content.json", + "sdk-modules-bom-5.7.0-sources.jar")) }) It("blobaccess for files with the same classifier", func() { diff --git a/pkg/contexts/ocm/accessmethods/maven/method_test.go b/pkg/contexts/ocm/accessmethods/maven/method_test.go index 20310c92d0..bfd7a43103 100644 --- a/pkg/contexts/ocm/accessmethods/maven/method_test.go +++ b/pkg/contexts/ocm/accessmethods/maven/method_test.go @@ -2,9 +2,10 @@ package maven_test import ( "crypto" - "github.com/open-component-model/ocm/pkg/maven/maventest" "time" + "github.com/open-component-model/ocm/pkg/maven/maventest" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/env/builder" @@ -48,16 +49,16 @@ var _ = Describe("local accessmethods.maven.AccessSpec tests", func() { Expect(m.MimeType()).To(Equal(mime.MIME_TGZ)) r := Must(m.Reader()) defer Close(r) - dr := iotools.NewDigestReaderWithHash(crypto.SHA1, r) - for { - var buf [8096]byte - _, err := dr.Read(buf[:]) - if err != nil { - break - } - } - Expect(dr.Size()).To(Equal(int64(1570))) - Expect(dr.Digest().String()).To(Equal("SHA-1:359d02795bcc737e81c7f2f0ac32f49351d41867")) + dr := iotools.NewDigestReaderWithHash(crypto.SHA256, r) + li := Must(tarutils.ListArchiveContentFromReader(dr)) + Expect(li).To(ConsistOf( + "sdk-modules-bom-5.7.0-random-content.json", + "sdk-modules-bom-5.7.0-random-content.txt", + "sdk-modules-bom-5.7.0-sources.jar", + "sdk-modules-bom-5.7.0.jar", + "sdk-modules-bom-5.7.0.pom")) + Expect(dr.Size()).To(Equal(int64(maventest.ARTIFACT_SIZE))) + Expect(dr.Digest().String()).To(Equal("SHA-256:" + maventest.ARTIFACT_DIGEST)) }) It("accesses local artifact with empty classifier and with extension", func() { @@ -78,7 +79,7 @@ var _ = Describe("local accessmethods.maven.AccessSpec tests", func() { } Expect(dr.Size()).To(Equal(int64(7153))) - Expect(dr.Digest().String()).To(Equal("SHA-1:34ccdeb9c008f8aaef90873fc636b09d3ae5c709")) + Expect(dr.Digest().String()).To(Equal(maventest.POM_SHA1)) }) It("accesses local artifact with extension", func() { diff --git a/pkg/contexts/ocm/accessmethods/ociartifact/README.md b/pkg/contexts/ocm/accessmethods/ociartifact/README.md index fa818f6525..5b3b14b547 100644 --- a/pkg/contexts/ocm/accessmethods/ociartifact/README.md +++ b/pkg/contexts/ocm/accessmethods/ociartifact/README.md @@ -15,7 +15,7 @@ Provided blobs use the following media type: Depending on the repository appropriate docker legacy types might be used. -The artifact content is provided in the [Artifact Set Format](../../../oci/repositories/ctf/README.md#artifact-set-archive-format). +The artifact content is provided in the [Artifact Set Format](../../../../../pkg/contexts/oci/repositories/ctf/formatspec.md#artifact-set-archive-format). The tag is provided as annotation. ### Description diff --git a/pkg/contexts/ocm/accessmethods/relativeociref/README.md b/pkg/contexts/ocm/accessmethods/relativeociref/README.md index c174d43a8e..a08466d4f5 100644 --- a/pkg/contexts/ocm/accessmethods/relativeociref/README.md +++ b/pkg/contexts/ocm/accessmethods/relativeociref/README.md @@ -15,7 +15,7 @@ Provided blobs use the following media type: Depending on the repository appropriate docker legacy types might be used. -The artifact content is provided in the [Artifact Set Format](../../../oci/repositories/ctf/formatspec.md#artifact-set-archive-format). +The artifact content is provided in the [Artifact Set Format](../../../../../pkg/contexts/oci/repositories/ctf/formatspec.md#artifact-set-archive-format). The tag is provided as annotation. ### Description @@ -23,7 +23,7 @@ The tag is provided as annotation. This method implements the access of an OCI artifact stored in an OCI registry, which is used to host the OCM repository the component version is retrieved from. -It works similar to the [`ociArtifact`](../ociartifact/README.md) access method, +It works similar to the [`ociArtifact`](../../../../../pkg/contexts/ocm/accessmethods/ociartifact/README.md) access method, but the used reference does not contain the OCI registry host, which is taken from the OCI registry used to host the component version containing the access specification. diff --git a/pkg/contexts/ocm/repositories/ctf/README.md b/pkg/contexts/ocm/repositories/ctf/README.md index 0907d9ae08..22bd5f73ed 100644 --- a/pkg/contexts/ocm/repositories/ctf/README.md +++ b/pkg/contexts/ocm/repositories/ctf/README.md @@ -34,4 +34,4 @@ The type specific specification fields are: ### Go Bindings -The Go binding can be found [here](../../../oci/repositories/ctf/type.go). +The Go binding can be found [here](../../../../../pkg/contexts/oci/repositories/ctf/type.go). diff --git a/pkg/contexts/ocm/repositories/ocireg/README.md b/pkg/contexts/ocm/repositories/ocireg/README.md index f832cbfe2a..e7df056359 100644 --- a/pkg/contexts/ocm/repositories/ocireg/README.md +++ b/pkg/contexts/ocm/repositories/ocireg/README.md @@ -40,4 +40,4 @@ The type specific specification fields are: ### Go Bindings -The Go binding can be found [here](../../../oci/repositories/ocireg/type.go). +The Go binding can be found [here](../../../../../pkg/contexts/oci/repositories/ocireg/type.go). diff --git a/pkg/contexts/ocm/signing/signing_test.go b/pkg/contexts/ocm/signing/signing_test.go index 4ec44fc1a7..1abe817506 100644 --- a/pkg/contexts/ocm/signing/signing_test.go +++ b/pkg/contexts/ocm/signing/signing_test.go @@ -10,6 +10,7 @@ import ( . "github.com/onsi/gomega" . "github.com/open-component-model/ocm/pkg/contexts/oci/testhelper" . "github.com/open-component-model/ocm/pkg/contexts/ocm/signing" + "github.com/open-component-model/ocm/pkg/contexts/ocm/signing/signingtest" . "github.com/open-component-model/ocm/pkg/contexts/ocm/testhelper" . "github.com/open-component-model/ocm/pkg/env/builder" . "github.com/open-component-model/ocm/pkg/testutils" @@ -29,7 +30,6 @@ import ( "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/composition" "github.com/open-component-model/ocm/pkg/contexts/ocm/repositories/ctf" "github.com/open-component-model/ocm/pkg/contexts/ocm/resourcetypes" - tenv "github.com/open-component-model/ocm/pkg/env" "github.com/open-component-model/ocm/pkg/mime" "github.com/open-component-model/ocm/pkg/signing" "github.com/open-component-model/ocm/pkg/signing/handlers/rsa" @@ -59,7 +59,7 @@ var _ = Describe("access method", func() { var env *Builder BeforeEach(func() { - env = NewBuilder(tenv.ModifiableTestData()) + env = NewBuilder(signingtest.ModifiableTestData()) env.RSAKeyPair(SIGNATURE, SIGNATURE2) }) diff --git a/pkg/contexts/ocm/signing/signingtest/testdata.go b/pkg/contexts/ocm/signing/signingtest/testdata.go new file mode 100644 index 0000000000..ea51fa190b --- /dev/null +++ b/pkg/contexts/ocm/signing/signingtest/testdata.go @@ -0,0 +1,13 @@ +package signingtest + +import ( + "github.com/open-component-model/ocm/pkg/env" +) + +func TestData(dest ...string) env.Option { + return env.ProjectTestDataForCaller(dest...) +} + +func ModifiableTestData(dest ...string) env.Option { + return env.ModifiableProjectTestDataForCaller(dest...) +} diff --git a/pkg/contexts/ocm/signing/testdata/compat/component-archive/blobs/sha256.c893900c1106f13d55648a425f502dd6518e40eaa3ac7d24023d4c73d55dc12e b/pkg/contexts/ocm/signing/signingtest/testdata/compat/component-archive/blobs/sha256.c893900c1106f13d55648a425f502dd6518e40eaa3ac7d24023d4c73d55dc12e similarity index 100% rename from pkg/contexts/ocm/signing/testdata/compat/component-archive/blobs/sha256.c893900c1106f13d55648a425f502dd6518e40eaa3ac7d24023d4c73d55dc12e rename to pkg/contexts/ocm/signing/signingtest/testdata/compat/component-archive/blobs/sha256.c893900c1106f13d55648a425f502dd6518e40eaa3ac7d24023d4c73d55dc12e diff --git a/pkg/contexts/ocm/signing/testdata/compat/component-archive/component-descriptor.yaml b/pkg/contexts/ocm/signing/signingtest/testdata/compat/component-archive/component-descriptor.yaml similarity index 100% rename from pkg/contexts/ocm/signing/testdata/compat/component-archive/component-descriptor.yaml rename to pkg/contexts/ocm/signing/signingtest/testdata/compat/component-archive/component-descriptor.yaml diff --git a/pkg/contexts/ocm/signing/testdata/compat/rsa.priv b/pkg/contexts/ocm/signing/signingtest/testdata/compat/rsa.priv similarity index 100% rename from pkg/contexts/ocm/signing/testdata/compat/rsa.priv rename to pkg/contexts/ocm/signing/signingtest/testdata/compat/rsa.priv diff --git a/pkg/contexts/ocm/signing/testdata/compat/rsa.pub b/pkg/contexts/ocm/signing/signingtest/testdata/compat/rsa.pub similarity index 100% rename from pkg/contexts/ocm/signing/testdata/compat/rsa.pub rename to pkg/contexts/ocm/signing/signingtest/testdata/compat/rsa.pub diff --git a/pkg/maven/maventest/const.go b/pkg/maven/maventest/const.go new file mode 100644 index 0000000000..1e80a4db00 --- /dev/null +++ b/pkg/maven/maventest/const.go @@ -0,0 +1,8 @@ +package maventest + +const ( + ARTIFACT_SIZE = 1504 + ARTIFACT_DIGEST = "dc5b38b58fd18cb0336c2e0deebeb5d2277c34312ae7024074812f34acfebc65" //nolint: gosec // yes +) + +const POM_SHA1 = "SHA-1:34ccdeb9c008f8aaef90873fc636b09d3ae5c709" diff --git a/pkg/maven/maventest/testdata.go b/pkg/maven/maventest/testdata.go index 64f0c103e8..efd26ff62a 100644 --- a/pkg/maven/maventest/testdata.go +++ b/pkg/maven/maventest/testdata.go @@ -7,3 +7,7 @@ import ( func TestData(dest ...string) env.Option { return env.ProjectTestDataForCaller(dest...) } + +func ModifiableTestData(dest ...string) env.Option { + return env.ModifiableProjectTestDataForCaller(dest...) +} diff --git a/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-sources.jar b/pkg/maven/maventest/testdata/.m2/repository/com/sap/cloud/sdk/sdk-modules-bom/5.7.0/sdk-modules-bom-5.7.0-sources.jar index 8564f0addae8de5525417df8294d13c0c2a3a7c0..1d5cd83128edaf5e6980edcf4344fc8e1701b0a1 100644 GIT binary patch literal 424 zcmWIWW@Zs#;Nak3V2L>t!GHuf8CV#6T|*poJ^kGD|D9rBU}gyLX6FE@V1g=~? literal 595 zcmWIWW@h1HVBlb2I6ZY+1OpP_WME~0p0C?y-!rFuymj?1@_OrPojY@WbCAIm;|EWR^t^m^Jbf>guG$i0z|{3Z zQZu9C$@67uqD!Y`e=7P|#0a#Cor7naNwg)65ZVVl++yk z{N!Byg6wqtq@4Vu#N_1E;$r>W#In>p{gTw;l9a@fME%s^D&0A%HfJ3D=4gl*pE23j>4+%YaO}g$OGf$YN$76k=px&<0`# F1^|3_lot!GHuf8CV#6T|*poJ^kGD|D9rBU}gyLX6FE@V1g=~? literal 595 zcmWIWW@h1HVBlb2I6ZY+1OpP_WME~0p0C?y-!rFuymj?1@_OrPojY@WbCAIm;|EWR^t^m^Jbf>guG$i0z|{3Z zQZu9C$@67uqD!Y`e=7P|#0a#Cor7naNwg)65ZVVl++yk z{N!Byg6wqtq@4Vu#N_1E;$r>W#In>p{gTw;l9a@fME%s^D&0A%HfJ3D=4gl*pE23j>4+%YaO}g$OGf$YN$76k=px&<0`# F1^|3_lo
    Release notes

    Sourced from github.com/docker/docker's releases.

    v26.1.0

    26.1.0

    For a full list of pull requests and changes in this release, refer to the relevant GitHub milestones:

    New

    Bug fixes and enhancements

    • Native Windows containers are configured with an internal DNS server for container name resolution, and external DNS servers for other lookups. Not all resolvers, including nslookup, fall back to the external resolvers when they get a SERVFAIL answer from the internal server. So, the internal DNS server can now be configured to forward requests to the external resolvers, by setting "features": {"windows-dns-proxy": true } in the daemon.json file. moby/moby#47584

    [!NOTE] This will be the new default behavior in Docker Engine 27.0.

    [!WARNING] The windows-dns-proxy feature flag will be removed in a future release.

    • Swarm: Fix Subpath not being passed to the container config. moby/moby#47711
    • Classic builder: Fix cache miss on WORKDIR <directory>/ build step (directory with a trailing slash). moby/moby#47723
    • containerd image store: Fix docker images failing when any image in the store has unexpected target. moby/moby#47738

    v26.0.2

    26.0.2

    For a full list of pull requests and changes in this release, refer to the relevant GitHub milestones:

    Security

    This release contains a security fix for CVE-2024-32473, an unexpected configuration of IPv6 on IPv4-only interfaces.

    Bug fixes and enhancements

    v26.0.1

    ... (truncated)

    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 z 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 diff --git a/docs/ocm/ocmspecstruct.png b/docs/ocm/ocmspecstruct.png deleted file mode 100755 index b63fbcb884a9426817bae9a34fb1cb791708cbb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342795 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 n^J)L!dYB}n)1~AD1 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%0A?l{{bLe*q);O0Ku- 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 L=5XhkRr}xb(cH&t=p8a2?WMJtyZvZrUa)Pw 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.GetMediaType(RepositoryContext, ComponentVersion, AccessSpecification) (string, error)`** - - Provide the media type of the described artifact. It might explicitly be stored - as part of the access speficatio, or implicitly provided by the access method. - -- **`.GetStream(RepositoryContext, ComponentVersion, AccessSpecification) (Byte Stream, error)`** - - Provide access to the blob content described by a dedicated access - specification. diff --git a/docs/ocm/plugins.md b/docs/ocm/plugins.md deleted file mode 100644 index 5220604162..0000000000 --- a/docs/ocm/plugins.md +++ /dev/null @@ -1,39 +0,0 @@ -# Extending the Library by Plugins - -The library has several extension points,which can be used by a registration -mechanism to add further variants, like repository types, backend technologies, -access methods, blob downloaders and uploaders. - -This requires Go coding, which is feasible for additional standard -implementations. Nevertheless, it is useful to provide a more dynamic -way to enrich the functionality of the library and the OCM command line -tool. - -This can be achieved by the experimental *plugin* concept. It allows -to implement functionality in separate executables (the plugins) and -register them for any main program based on this library. - -## Commands - -A plugin must provide a set of commands to implement the intended extension. -There is a set of commands for every extension point, which is supported -by the plugin. - -The following extension points are generally possible to be -extended by a plugin: - -- **access methods**: describe access to resource locations in foreign repositories. -- **blob uploaders**: export uploaded local blobs to foreign repositories. -- **blob downloaders**: transform downloaded resources to an applicable file system representation. - - -The documentation of the plugin commands can be found [here](../pluginreference/plugin.md). - -## Implementation support - -This library provides a command frame in package `pkg/contexts/ocm/plugin/ppi`. -It implements all the required command based on some interfaces, which must be -implemented by a plugin. These implementations are registered at a -*Plugin*, which can then be passed to the standard implementation. - -An example can be found in [`cmds/demoplugin`](https://github.com/open-component-model/ocm/tree/main/cmds/demoplugin). \ No newline at end of file From 5c67d9f1303cd33cb1aff8c29ef38aff7a78b08f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Apr 2024 07:06:40 +0000 Subject: [PATCH 16/83] Bump the ci group with 3 updates (#713) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the ci group with 3 updates: [mercedesbenzio/detect-action](https://github.com/mercedesbenzio/detect-action), [myrotvorets/trigger-repository-dispatch-action](https://github.com/myrotvorets/trigger-repository-dispatch-action) and [anchore/sbom-action](https://github.com/anchore/sbom-action). Updates `mercedesbenzio/detect-action` from 1 to 2