Refactor the API and controller to use the `meta.Artifact` type

Signed-off-by: Stefan Prodan <stefan.prodan@gmail.com>
This commit is contained in:
Stefan Prodan 2025-09-03 20:57:45 +03:00
parent 46516fd54f
commit c9a5e76d24
No known key found for this signature in database
GPG Key ID: 3299AEB0E4085BAF
40 changed files with 371 additions and 576 deletions

View File

@ -4,7 +4,7 @@ go 1.25.0
require ( require (
github.com/fluxcd/pkg/apis/acl v0.9.0 github.com/fluxcd/pkg/apis/acl v0.9.0
github.com/fluxcd/pkg/apis/meta v1.20.0 github.com/fluxcd/pkg/apis/meta v1.21.0
k8s.io/apimachinery v0.34.0 k8s.io/apimachinery v0.34.0
sigs.k8s.io/controller-runtime v0.22.0 sigs.k8s.io/controller-runtime v0.22.0
) )

View File

@ -4,8 +4,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fluxcd/pkg/apis/acl v0.9.0 h1:wBpgsKT+jcyZEcM//OmZr9RiF8klL3ebrDp2u2ThsnA= github.com/fluxcd/pkg/apis/acl v0.9.0 h1:wBpgsKT+jcyZEcM//OmZr9RiF8klL3ebrDp2u2ThsnA=
github.com/fluxcd/pkg/apis/acl v0.9.0/go.mod h1:TttNS+gocsGLwnvmgVi3/Yscwqrjc17+vhgYfqkfrV4= github.com/fluxcd/pkg/apis/acl v0.9.0/go.mod h1:TttNS+gocsGLwnvmgVi3/Yscwqrjc17+vhgYfqkfrV4=
github.com/fluxcd/pkg/apis/meta v1.20.0 h1:l9h0kWoDZTcYV0WJkFMgDXq6Q4tSojrJ+bHpFJSsaW0= github.com/fluxcd/pkg/apis/meta v1.21.0 h1:R+bN02chcs0HUmyVDQhqe/FHmYLjipVDMLnyYfNX850=
github.com/fluxcd/pkg/apis/meta v1.20.0/go.mod h1:XUAEUgT4gkWDAEN79E141tmL+v4SV50tVZ/Ojpc/ueg= github.com/fluxcd/pkg/apis/meta v1.21.0/go.mod h1:XUAEUgT4gkWDAEN79E141tmL+v4SV50tVZ/Ojpc/ueg=
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=

View File

@ -1,93 +0,0 @@
/*
Copyright 2023 The Flux authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package v1
import (
"path"
"strings"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// Artifact represents the output of a Source reconciliation.
type Artifact struct {
// Path is the relative file path of the Artifact. It can be used to locate
// the file in the root of the Artifact storage on the local file system of
// the controller managing the Source.
// +required
Path string `json:"path"`
// URL is the HTTP address of the Artifact as exposed by the controller
// managing the Source. It can be used to retrieve the Artifact for
// consumption, e.g. by another controller applying the Artifact contents.
// +required
URL string `json:"url"`
// Revision is a human-readable identifier traceable in the origin source
// system. It can be a Git commit SHA, Git tag, a Helm chart version, etc.
// +required
Revision string `json:"revision"`
// Digest is the digest of the file in the form of '<algorithm>:<checksum>'.
// +optional
// +kubebuilder:validation:Pattern="^[a-z0-9]+(?:[.+_-][a-z0-9]+)*:[a-zA-Z0-9=_-]+$"
Digest string `json:"digest,omitempty"`
// LastUpdateTime is the timestamp corresponding to the last update of the
// Artifact.
// +required
LastUpdateTime metav1.Time `json:"lastUpdateTime"`
// Size is the number of bytes in the file.
// +optional
Size *int64 `json:"size,omitempty"`
// Metadata holds upstream information such as OCI annotations.
// +optional
Metadata map[string]string `json:"metadata,omitempty"`
}
// HasRevision returns if the given revision matches the current Revision of
// the Artifact.
func (in *Artifact) HasRevision(revision string) bool {
if in == nil {
return false
}
return in.Revision == revision
}
// HasDigest returns if the given digest matches the current Digest of the
// Artifact.
func (in *Artifact) HasDigest(digest string) bool {
if in == nil {
return false
}
return in.Digest == digest
}
// ArtifactDir returns the artifact dir path in the form of
// '<kind>/<namespace>/<name>'.
func ArtifactDir(kind, namespace, name string) string {
kind = strings.ToLower(kind)
return path.Join(kind, namespace, name)
}
// ArtifactPath returns the artifact path in the form of
// '<kind>/<namespace>/name>/<filename>'.
func ArtifactPath(kind, namespace, name, filename string) string {
return path.Join(ArtifactDir(kind, namespace, name), filename)
}

View File

@ -209,7 +209,7 @@ type BucketStatus struct {
// Artifact represents the last successful Bucket reconciliation. // Artifact represents the last successful Bucket reconciliation.
// +optional // +optional
Artifact *Artifact `json:"artifact,omitempty"` Artifact *meta.Artifact `json:"artifact,omitempty"`
// ObservedIgnore is the observed exclusion patterns used for constructing // ObservedIgnore is the observed exclusion patterns used for constructing
// the source artifact. // the source artifact.
@ -245,7 +245,7 @@ func (in *Bucket) GetRequeueAfter() time.Duration {
} }
// GetArtifact returns the latest artifact from the source if present in the status sub-resource. // GetArtifact returns the latest artifact from the source if present in the status sub-resource.
func (in *Bucket) GetArtifact() *Artifact { func (in *Bucket) GetArtifact() *meta.Artifact {
return in.Status.Artifact return in.Status.Artifact
} }

View File

@ -256,12 +256,12 @@ type GitRepositoryStatus struct {
// Artifact represents the last successful GitRepository reconciliation. // Artifact represents the last successful GitRepository reconciliation.
// +optional // +optional
Artifact *Artifact `json:"artifact,omitempty"` Artifact *meta.Artifact `json:"artifact,omitempty"`
// IncludedArtifacts contains a list of the last successfully included // IncludedArtifacts contains a list of the last successfully included
// Artifacts as instructed by GitRepositorySpec.Include. // Artifacts as instructed by GitRepositorySpec.Include.
// +optional // +optional
IncludedArtifacts []*Artifact `json:"includedArtifacts,omitempty"` IncludedArtifacts []*meta.Artifact `json:"includedArtifacts,omitempty"`
// ObservedIgnore is the observed exclusion patterns used for constructing // ObservedIgnore is the observed exclusion patterns used for constructing
// the source artifact. // the source artifact.
@ -319,7 +319,7 @@ func (in GitRepository) GetRequeueAfter() time.Duration {
// GetArtifact returns the latest Artifact from the GitRepository if present in // GetArtifact returns the latest Artifact from the GitRepository if present in
// the status sub-resource. // the status sub-resource.
func (in *GitRepository) GetArtifact() *Artifact { func (in *GitRepository) GetArtifact() *meta.Artifact {
return in.Status.Artifact return in.Status.Artifact
} }

View File

@ -149,7 +149,7 @@ type HelmChartStatus struct {
// Artifact represents the output of the last successful reconciliation. // Artifact represents the output of the last successful reconciliation.
// +optional // +optional
Artifact *Artifact `json:"artifact,omitempty"` Artifact *meta.Artifact `json:"artifact,omitempty"`
meta.ReconcileRequestStatus `json:",inline"` meta.ReconcileRequestStatus `json:",inline"`
} }
@ -182,7 +182,7 @@ func (in HelmChart) GetRequeueAfter() time.Duration {
// GetArtifact returns the latest artifact from the source if present in the // GetArtifact returns the latest artifact from the source if present in the
// status sub-resource. // status sub-resource.
func (in *HelmChart) GetArtifact() *Artifact { func (in *HelmChart) GetArtifact() *meta.Artifact {
return in.Status.Artifact return in.Status.Artifact
} }

View File

@ -150,7 +150,7 @@ type HelmRepositoryStatus struct {
// Artifact represents the last successful HelmRepository reconciliation. // Artifact represents the last successful HelmRepository reconciliation.
// +optional // +optional
Artifact *Artifact `json:"artifact,omitempty"` Artifact *meta.Artifact `json:"artifact,omitempty"`
meta.ReconcileRequestStatus `json:",inline"` meta.ReconcileRequestStatus `json:",inline"`
} }
@ -191,7 +191,7 @@ func (in HelmRepository) GetTimeout() time.Duration {
// GetArtifact returns the latest artifact from the source if present in the // GetArtifact returns the latest artifact from the source if present in the
// status sub-resource. // status sub-resource.
func (in *HelmRepository) GetArtifact() *Artifact { func (in *HelmRepository) GetArtifact() *meta.Artifact {
return in.Status.Artifact return in.Status.Artifact
} }

View File

@ -200,7 +200,7 @@ type OCIRepositoryStatus struct {
// Artifact represents the output of the last successful OCI Repository sync. // Artifact represents the output of the last successful OCI Repository sync.
// +optional // +optional
Artifact *Artifact `json:"artifact,omitempty"` Artifact *meta.Artifact `json:"artifact,omitempty"`
// ObservedIgnore is the observed exclusion patterns used for constructing // ObservedIgnore is the observed exclusion patterns used for constructing
// the source artifact. // the source artifact.
@ -241,7 +241,7 @@ func (in OCIRepository) GetRequeueAfter() time.Duration {
// GetArtifact returns the latest Artifact from the OCIRepository if present in // GetArtifact returns the latest Artifact from the OCIRepository if present in
// the status sub-resource. // the status sub-resource.
func (in *OCIRepository) GetArtifact() *Artifact { func (in *OCIRepository) GetArtifact() *meta.Artifact {
return in.Status.Artifact return in.Status.Artifact
} }

View File

@ -20,6 +20,8 @@ import (
"time" "time"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"github.com/fluxcd/pkg/apis/meta"
) )
const ( const (
@ -41,5 +43,5 @@ type Source interface {
GetRequeueAfter() time.Duration GetRequeueAfter() time.Duration
// GetArtifact returns the latest artifact from the source if present in // GetArtifact returns the latest artifact from the source if present in
// the status sub-resource. // the status sub-resource.
GetArtifact() *Artifact GetArtifact() *meta.Artifact
} }

View File

@ -27,34 +27,6 @@ import (
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
) )
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Artifact) DeepCopyInto(out *Artifact) {
*out = *in
in.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime)
if in.Size != nil {
in, out := &in.Size, &out.Size
*out = new(int64)
**out = **in
}
if in.Metadata != nil {
in, out := &in.Metadata, &out.Metadata
*out = make(map[string]string, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Artifact.
func (in *Artifact) DeepCopy() *Artifact {
if in == nil {
return nil
}
out := new(Artifact)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Bucket) DeepCopyInto(out *Bucket) { func (in *Bucket) DeepCopyInto(out *Bucket) {
*out = *in *out = *in
@ -197,7 +169,7 @@ func (in *BucketStatus) DeepCopyInto(out *BucketStatus) {
} }
if in.Artifact != nil { if in.Artifact != nil {
in, out := &in.Artifact, &out.Artifact in, out := &in.Artifact, &out.Artifact
*out = new(Artifact) *out = new(meta.Artifact)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
if in.ObservedIgnore != nil { if in.ObservedIgnore != nil {
@ -376,16 +348,16 @@ func (in *GitRepositoryStatus) DeepCopyInto(out *GitRepositoryStatus) {
} }
if in.Artifact != nil { if in.Artifact != nil {
in, out := &in.Artifact, &out.Artifact in, out := &in.Artifact, &out.Artifact
*out = new(Artifact) *out = new(meta.Artifact)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
if in.IncludedArtifacts != nil { if in.IncludedArtifacts != nil {
in, out := &in.IncludedArtifacts, &out.IncludedArtifacts in, out := &in.IncludedArtifacts, &out.IncludedArtifacts
*out = make([]*Artifact, len(*in)) *out = make([]*meta.Artifact, len(*in))
for i := range *in { for i := range *in {
if (*in)[i] != nil { if (*in)[i] != nil {
in, out := &(*in)[i], &(*out)[i] in, out := &(*in)[i], &(*out)[i]
*out = new(Artifact) *out = new(meta.Artifact)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
} }
@ -542,7 +514,7 @@ func (in *HelmChartStatus) DeepCopyInto(out *HelmChartStatus) {
} }
if in.Artifact != nil { if in.Artifact != nil {
in, out := &in.Artifact, &out.Artifact in, out := &in.Artifact, &out.Artifact
*out = new(Artifact) *out = new(meta.Artifact)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
out.ReconcileRequestStatus = in.ReconcileRequestStatus out.ReconcileRequestStatus = in.ReconcileRequestStatus
@ -665,7 +637,7 @@ func (in *HelmRepositoryStatus) DeepCopyInto(out *HelmRepositoryStatus) {
} }
if in.Artifact != nil { if in.Artifact != nil {
in, out := &in.Artifact, &out.Artifact in, out := &in.Artifact, &out.Artifact
*out = new(Artifact) *out = new(meta.Artifact)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
out.ReconcileRequestStatus = in.ReconcileRequestStatus out.ReconcileRequestStatus = in.ReconcileRequestStatus
@ -853,7 +825,7 @@ func (in *OCIRepositoryStatus) DeepCopyInto(out *OCIRepositoryStatus) {
} }
if in.Artifact != nil { if in.Artifact != nil {
in, out := &in.Artifact, &out.Artifact in, out := &in.Artifact, &out.Artifact
*out = new(Artifact) *out = new(meta.Artifact)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
if in.ObservedIgnore != nil { if in.ObservedIgnore != nil {

View File

@ -229,7 +229,7 @@ type BucketStatus struct {
// Artifact represents the last successful Bucket reconciliation. // Artifact represents the last successful Bucket reconciliation.
// +optional // +optional
Artifact *apiv1.Artifact `json:"artifact,omitempty"` Artifact *meta.Artifact `json:"artifact,omitempty"`
// ObservedIgnore is the observed exclusion patterns used for constructing // ObservedIgnore is the observed exclusion patterns used for constructing
// the source artifact. // the source artifact.
@ -265,7 +265,7 @@ func (in Bucket) GetRequeueAfter() time.Duration {
} }
// GetArtifact returns the latest artifact from the source if present in the status sub-resource. // GetArtifact returns the latest artifact from the source if present in the status sub-resource.
func (in *Bucket) GetArtifact() *apiv1.Artifact { func (in *Bucket) GetArtifact() *meta.Artifact {
return in.Status.Artifact return in.Status.Artifact
} }

View File

@ -23,8 +23,6 @@ import (
"github.com/fluxcd/pkg/apis/acl" "github.com/fluxcd/pkg/apis/acl"
"github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/apis/meta"
apiv1 "github.com/fluxcd/source-controller/api/v1"
) )
const ( const (
@ -214,12 +212,12 @@ type GitRepositoryStatus struct {
// Artifact represents the last successful GitRepository reconciliation. // Artifact represents the last successful GitRepository reconciliation.
// +optional // +optional
Artifact *apiv1.Artifact `json:"artifact,omitempty"` Artifact *meta.Artifact `json:"artifact,omitempty"`
// IncludedArtifacts contains a list of the last successfully included // IncludedArtifacts contains a list of the last successfully included
// Artifacts as instructed by GitRepositorySpec.Include. // Artifacts as instructed by GitRepositorySpec.Include.
// +optional // +optional
IncludedArtifacts []*apiv1.Artifact `json:"includedArtifacts,omitempty"` IncludedArtifacts []*meta.Artifact `json:"includedArtifacts,omitempty"`
// ContentConfigChecksum is a checksum of all the configurations related to // ContentConfigChecksum is a checksum of all the configurations related to
// the content of the source artifact: // the content of the source artifact:
@ -282,7 +280,7 @@ func (in GitRepository) GetRequeueAfter() time.Duration {
// GetArtifact returns the latest Artifact from the GitRepository if present in // GetArtifact returns the latest Artifact from the GitRepository if present in
// the status sub-resource. // the status sub-resource.
func (in *GitRepository) GetArtifact() *apiv1.Artifact { func (in *GitRepository) GetArtifact() *meta.Artifact {
return in.Status.Artifact return in.Status.Artifact
} }

View File

@ -166,7 +166,7 @@ type HelmChartStatus struct {
// Artifact represents the output of the last successful reconciliation. // Artifact represents the output of the last successful reconciliation.
// +optional // +optional
Artifact *apiv1.Artifact `json:"artifact,omitempty"` Artifact *meta.Artifact `json:"artifact,omitempty"`
meta.ReconcileRequestStatus `json:",inline"` meta.ReconcileRequestStatus `json:",inline"`
} }
@ -199,7 +199,7 @@ func (in HelmChart) GetRequeueAfter() time.Duration {
// GetArtifact returns the latest artifact from the source if present in the // GetArtifact returns the latest artifact from the source if present in the
// status sub-resource. // status sub-resource.
func (in *HelmChart) GetArtifact() *apiv1.Artifact { func (in *HelmChart) GetArtifact() *meta.Artifact {
return in.Status.Artifact return in.Status.Artifact
} }

View File

@ -23,8 +23,6 @@ import (
"github.com/fluxcd/pkg/apis/acl" "github.com/fluxcd/pkg/apis/acl"
"github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/apis/meta"
apiv1 "github.com/fluxcd/source-controller/api/v1"
) )
const ( const (
@ -152,7 +150,7 @@ type HelmRepositoryStatus struct {
// Artifact represents the last successful HelmRepository reconciliation. // Artifact represents the last successful HelmRepository reconciliation.
// +optional // +optional
Artifact *apiv1.Artifact `json:"artifact,omitempty"` Artifact *meta.Artifact `json:"artifact,omitempty"`
meta.ReconcileRequestStatus `json:",inline"` meta.ReconcileRequestStatus `json:",inline"`
} }
@ -193,7 +191,7 @@ func (in HelmRepository) GetTimeout() time.Duration {
// GetArtifact returns the latest artifact from the source if present in the // GetArtifact returns the latest artifact from the source if present in the
// status sub-resource. // status sub-resource.
func (in *HelmRepository) GetArtifact() *apiv1.Artifact { func (in *HelmRepository) GetArtifact() *meta.Artifact {
return in.Status.Artifact return in.Status.Artifact
} }

View File

@ -205,7 +205,7 @@ type OCIRepositoryStatus struct {
// Artifact represents the output of the last successful OCI Repository sync. // Artifact represents the output of the last successful OCI Repository sync.
// +optional // +optional
Artifact *apiv1.Artifact `json:"artifact,omitempty"` Artifact *meta.Artifact `json:"artifact,omitempty"`
// ContentConfigChecksum is a checksum of all the configurations related to // ContentConfigChecksum is a checksum of all the configurations related to
// the content of the source artifact: // the content of the source artifact:
@ -260,7 +260,7 @@ func (in OCIRepository) GetRequeueAfter() time.Duration {
// GetArtifact returns the latest Artifact from the OCIRepository if present in // GetArtifact returns the latest Artifact from the OCIRepository if present in
// the status sub-resource. // the status sub-resource.
func (in *OCIRepository) GetArtifact() *apiv1.Artifact { func (in *OCIRepository) GetArtifact() *meta.Artifact {
return in.Status.Artifact return in.Status.Artifact
} }

View File

@ -203,7 +203,7 @@ func (in *BucketStatus) DeepCopyInto(out *BucketStatus) {
} }
if in.Artifact != nil { if in.Artifact != nil {
in, out := &in.Artifact, &out.Artifact in, out := &in.Artifact, &out.Artifact
*out = new(apiv1.Artifact) *out = new(meta.Artifact)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
if in.ObservedIgnore != nil { if in.ObservedIgnore != nil {
@ -377,16 +377,16 @@ func (in *GitRepositoryStatus) DeepCopyInto(out *GitRepositoryStatus) {
} }
if in.Artifact != nil { if in.Artifact != nil {
in, out := &in.Artifact, &out.Artifact in, out := &in.Artifact, &out.Artifact
*out = new(apiv1.Artifact) *out = new(meta.Artifact)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
if in.IncludedArtifacts != nil { if in.IncludedArtifacts != nil {
in, out := &in.IncludedArtifacts, &out.IncludedArtifacts in, out := &in.IncludedArtifacts, &out.IncludedArtifacts
*out = make([]*apiv1.Artifact, len(*in)) *out = make([]*meta.Artifact, len(*in))
for i := range *in { for i := range *in {
if (*in)[i] != nil { if (*in)[i] != nil {
in, out := &(*in)[i], &(*out)[i] in, out := &(*in)[i], &(*out)[i]
*out = new(apiv1.Artifact) *out = new(meta.Artifact)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
} }
@ -538,7 +538,7 @@ func (in *HelmChartStatus) DeepCopyInto(out *HelmChartStatus) {
} }
if in.Artifact != nil { if in.Artifact != nil {
in, out := &in.Artifact, &out.Artifact in, out := &in.Artifact, &out.Artifact
*out = new(apiv1.Artifact) *out = new(meta.Artifact)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
out.ReconcileRequestStatus = in.ReconcileRequestStatus out.ReconcileRequestStatus = in.ReconcileRequestStatus
@ -661,7 +661,7 @@ func (in *HelmRepositoryStatus) DeepCopyInto(out *HelmRepositoryStatus) {
} }
if in.Artifact != nil { if in.Artifact != nil {
in, out := &in.Artifact, &out.Artifact in, out := &in.Artifact, &out.Artifact
*out = new(apiv1.Artifact) *out = new(meta.Artifact)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
out.ReconcileRequestStatus = in.ReconcileRequestStatus out.ReconcileRequestStatus = in.ReconcileRequestStatus
@ -849,7 +849,7 @@ func (in *OCIRepositoryStatus) DeepCopyInto(out *OCIRepositoryStatus) {
} }
if in.Artifact != nil { if in.Artifact != nil {
in, out := &in.Artifact, &out.Artifact in, out := &in.Artifact, &out.Artifact
*out = new(apiv1.Artifact) *out = new(meta.Artifact)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
if in.ObservedIgnore != nil { if in.ObservedIgnore != nil {

View File

@ -289,6 +289,7 @@ spec:
consumption, e.g. by another controller applying the Artifact contents. consumption, e.g. by another controller applying the Artifact contents.
type: string type: string
required: required:
- digest
- lastUpdateTime - lastUpdateTime
- path - path
- revision - revision
@ -672,6 +673,7 @@ spec:
consumption, e.g. by another controller applying the Artifact contents. consumption, e.g. by another controller applying the Artifact contents.
type: string type: string
required: required:
- digest
- lastUpdateTime - lastUpdateTime
- path - path
- revision - revision

View File

@ -290,6 +290,7 @@ spec:
consumption, e.g. by another controller applying the Artifact contents. consumption, e.g. by another controller applying the Artifact contents.
type: string type: string
required: required:
- digest
- lastUpdateTime - lastUpdateTime
- path - path
- revision - revision
@ -398,6 +399,7 @@ spec:
consumption, e.g. by another controller applying the Artifact contents. consumption, e.g. by another controller applying the Artifact contents.
type: string type: string
required: required:
- digest
- lastUpdateTime - lastUpdateTime
- path - path
- revision - revision
@ -746,6 +748,7 @@ spec:
consumption, e.g. by another controller applying the Artifact contents. consumption, e.g. by another controller applying the Artifact contents.
type: string type: string
required: required:
- digest
- lastUpdateTime - lastUpdateTime
- path - path
- revision - revision
@ -869,6 +872,7 @@ spec:
consumption, e.g. by another controller applying the Artifact contents. consumption, e.g. by another controller applying the Artifact contents.
type: string type: string
required: required:
- digest
- lastUpdateTime - lastUpdateTime
- path - path
- revision - revision

View File

@ -244,6 +244,7 @@ spec:
consumption, e.g. by another controller applying the Artifact contents. consumption, e.g. by another controller applying the Artifact contents.
type: string type: string
required: required:
- digest
- lastUpdateTime - lastUpdateTime
- path - path
- revision - revision
@ -613,6 +614,7 @@ spec:
consumption, e.g. by another controller applying the Artifact contents. consumption, e.g. by another controller applying the Artifact contents.
type: string type: string
required: required:
- digest
- lastUpdateTime - lastUpdateTime
- path - path
- revision - revision

View File

@ -232,6 +232,7 @@ spec:
consumption, e.g. by another controller applying the Artifact contents. consumption, e.g. by another controller applying the Artifact contents.
type: string type: string
required: required:
- digest
- lastUpdateTime - lastUpdateTime
- path - path
- revision - revision
@ -536,6 +537,7 @@ spec:
consumption, e.g. by another controller applying the Artifact contents. consumption, e.g. by another controller applying the Artifact contents.
type: string type: string
required: required:
- digest
- lastUpdateTime - lastUpdateTime
- path - path
- revision - revision

View File

@ -299,6 +299,7 @@ spec:
consumption, e.g. by another controller applying the Artifact contents. consumption, e.g. by another controller applying the Artifact contents.
type: string type: string
required: required:
- digest
- lastUpdateTime - lastUpdateTime
- path - path
- revision - revision
@ -696,6 +697,7 @@ spec:
consumption, e.g. by another controller applying the Artifact contents. consumption, e.g. by another controller applying the Artifact contents.
type: string type: string
required: required:
- digest
- lastUpdateTime - lastUpdateTime
- path - path
- revision - revision

View File

@ -1327,119 +1327,6 @@ OCIRepositoryStatus
</table> </table>
</div> </div>
</div> </div>
<h3 id="source.toolkit.fluxcd.io/v1.Artifact">Artifact
</h3>
<p>
(<em>Appears on:</em>
<a href="#source.toolkit.fluxcd.io/v1.BucketStatus">BucketStatus</a>,
<a href="#source.toolkit.fluxcd.io/v1.GitRepositoryStatus">GitRepositoryStatus</a>,
<a href="#source.toolkit.fluxcd.io/v1.HelmChartStatus">HelmChartStatus</a>,
<a href="#source.toolkit.fluxcd.io/v1.HelmRepositoryStatus">HelmRepositoryStatus</a>,
<a href="#source.toolkit.fluxcd.io/v1.OCIRepositoryStatus">OCIRepositoryStatus</a>)
</p>
<p>Artifact represents the output of a Source reconciliation.</p>
<div class="md-typeset__scrollwrap">
<div class="md-typeset__table">
<table>
<thead>
<tr>
<th>Field</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>path</code><br>
<em>
string
</em>
</td>
<td>
<p>Path is the relative file path of the Artifact. It can be used to locate
the file in the root of the Artifact storage on the local file system of
the controller managing the Source.</p>
</td>
</tr>
<tr>
<td>
<code>url</code><br>
<em>
string
</em>
</td>
<td>
<p>URL is the HTTP address of the Artifact as exposed by the controller
managing the Source. It can be used to retrieve the Artifact for
consumption, e.g. by another controller applying the Artifact contents.</p>
</td>
</tr>
<tr>
<td>
<code>revision</code><br>
<em>
string
</em>
</td>
<td>
<p>Revision is a human-readable identifier traceable in the origin source
system. It can be a Git commit SHA, Git tag, a Helm chart version, etc.</p>
</td>
</tr>
<tr>
<td>
<code>digest</code><br>
<em>
string
</em>
</td>
<td>
<em>(Optional)</em>
<p>Digest is the digest of the file in the form of &lsquo;<algorithm>:<checksum>&rsquo;.</p>
</td>
</tr>
<tr>
<td>
<code>lastUpdateTime</code><br>
<em>
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/#time-v1-meta">
Kubernetes meta/v1.Time
</a>
</em>
</td>
<td>
<p>LastUpdateTime is the timestamp corresponding to the last update of the
Artifact.</p>
</td>
</tr>
<tr>
<td>
<code>size</code><br>
<em>
int64
</em>
</td>
<td>
<em>(Optional)</em>
<p>Size is the number of bytes in the file.</p>
</td>
</tr>
<tr>
<td>
<code>metadata</code><br>
<em>
map[string]string
</em>
</td>
<td>
<em>(Optional)</em>
<p>Metadata holds upstream information such as OCI annotations.</p>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<h3 id="source.toolkit.fluxcd.io/v1.BucketSTSSpec">BucketSTSSpec <h3 id="source.toolkit.fluxcd.io/v1.BucketSTSSpec">BucketSTSSpec
</h3> </h3>
<p> <p>
@ -1827,8 +1714,8 @@ BucketStatus.Artifact data is recommended.</p>
<td> <td>
<code>artifact</code><br> <code>artifact</code><br>
<em> <em>
<a href="#source.toolkit.fluxcd.io/v1.Artifact"> <a href="https://pkg.go.dev/github.com/fluxcd/pkg/apis/meta#Artifact">
Artifact github.com/fluxcd/pkg/apis/meta.Artifact
</a> </a>
</em> </em>
</td> </td>
@ -2286,8 +2173,8 @@ object.</p>
<td> <td>
<code>artifact</code><br> <code>artifact</code><br>
<em> <em>
<a href="#source.toolkit.fluxcd.io/v1.Artifact"> <a href="https://pkg.go.dev/github.com/fluxcd/pkg/apis/meta#Artifact">
Artifact github.com/fluxcd/pkg/apis/meta.Artifact
</a> </a>
</em> </em>
</td> </td>
@ -2300,8 +2187,8 @@ Artifact
<td> <td>
<code>includedArtifacts</code><br> <code>includedArtifacts</code><br>
<em> <em>
<a href="#source.toolkit.fluxcd.io/v1.Artifact"> <a href="https://pkg.go.dev/github.com/fluxcd/pkg/apis/meta#Artifact">
[]Artifact []github.com/fluxcd/pkg/apis/meta.Artifact
</a> </a>
</em> </em>
</td> </td>
@ -2711,8 +2598,8 @@ BucketStatus.Artifact data is recommended.</p>
<td> <td>
<code>artifact</code><br> <code>artifact</code><br>
<em> <em>
<a href="#source.toolkit.fluxcd.io/v1.Artifact"> <a href="https://pkg.go.dev/github.com/fluxcd/pkg/apis/meta#Artifact">
Artifact github.com/fluxcd/pkg/apis/meta.Artifact
</a> </a>
</em> </em>
</td> </td>
@ -3001,8 +2888,8 @@ HelmRepositoryStatus.Artifact data is recommended.</p>
<td> <td>
<code>artifact</code><br> <code>artifact</code><br>
<em> <em>
<a href="#source.toolkit.fluxcd.io/v1.Artifact"> <a href="https://pkg.go.dev/github.com/fluxcd/pkg/apis/meta#Artifact">
Artifact github.com/fluxcd/pkg/apis/meta.Artifact
</a> </a>
</em> </em>
</td> </td>
@ -3497,8 +3384,8 @@ string
<td> <td>
<code>artifact</code><br> <code>artifact</code><br>
<em> <em>
<a href="#source.toolkit.fluxcd.io/v1.Artifact"> <a href="https://pkg.go.dev/github.com/fluxcd/pkg/apis/meta#Artifact">
Artifact github.com/fluxcd/pkg/apis/meta.Artifact
</a> </a>
</em> </em>
</td> </td>

4
go.mod
View File

@ -23,8 +23,8 @@ require (
github.com/elazarl/goproxy v1.7.2 github.com/elazarl/goproxy v1.7.2
github.com/fluxcd/cli-utils v0.36.0-flux.15 github.com/fluxcd/cli-utils v0.36.0-flux.15
github.com/fluxcd/pkg/apis/event v0.19.0 github.com/fluxcd/pkg/apis/event v0.19.0
github.com/fluxcd/pkg/apis/meta v1.20.0 github.com/fluxcd/pkg/apis/meta v1.21.0
github.com/fluxcd/pkg/auth v0.29.0 github.com/fluxcd/pkg/auth v0.30.0
github.com/fluxcd/pkg/cache v0.11.0 github.com/fluxcd/pkg/cache v0.11.0
github.com/fluxcd/pkg/git v0.36.0 github.com/fluxcd/pkg/git v0.36.0
github.com/fluxcd/pkg/git/gogit v0.40.0 github.com/fluxcd/pkg/git/gogit v0.40.0

8
go.sum
View File

@ -376,10 +376,10 @@ github.com/fluxcd/pkg/apis/acl v0.9.0 h1:wBpgsKT+jcyZEcM//OmZr9RiF8klL3ebrDp2u2T
github.com/fluxcd/pkg/apis/acl v0.9.0/go.mod h1:TttNS+gocsGLwnvmgVi3/Yscwqrjc17+vhgYfqkfrV4= github.com/fluxcd/pkg/apis/acl v0.9.0/go.mod h1:TttNS+gocsGLwnvmgVi3/Yscwqrjc17+vhgYfqkfrV4=
github.com/fluxcd/pkg/apis/event v0.19.0 h1:ZJU2voontkzp5rNYA4JMOu40S4tRcrWi4Do59EnyFwg= github.com/fluxcd/pkg/apis/event v0.19.0 h1:ZJU2voontkzp5rNYA4JMOu40S4tRcrWi4Do59EnyFwg=
github.com/fluxcd/pkg/apis/event v0.19.0/go.mod h1:deuIyUb6lh+Z1Ccvwwxhm1wNM3kpSo+vF1IgRnpaZfQ= github.com/fluxcd/pkg/apis/event v0.19.0/go.mod h1:deuIyUb6lh+Z1Ccvwwxhm1wNM3kpSo+vF1IgRnpaZfQ=
github.com/fluxcd/pkg/apis/meta v1.20.0 h1:l9h0kWoDZTcYV0WJkFMgDXq6Q4tSojrJ+bHpFJSsaW0= github.com/fluxcd/pkg/apis/meta v1.21.0 h1:R+bN02chcs0HUmyVDQhqe/FHmYLjipVDMLnyYfNX850=
github.com/fluxcd/pkg/apis/meta v1.20.0/go.mod h1:XUAEUgT4gkWDAEN79E141tmL+v4SV50tVZ/Ojpc/ueg= github.com/fluxcd/pkg/apis/meta v1.21.0/go.mod h1:XUAEUgT4gkWDAEN79E141tmL+v4SV50tVZ/Ojpc/ueg=
github.com/fluxcd/pkg/auth v0.29.0 h1:lLc63zjodqIqg5ydlU/Kp3Qa+wvh6G2khjop5MHALvk= github.com/fluxcd/pkg/auth v0.30.0 h1:7JMnY1ClArvOsadt6hOxceu8Q2hLsYHFMt0DV3BQl4Q=
github.com/fluxcd/pkg/auth v0.29.0/go.mod h1:bjZ+6RMSGgsQQK+aPfVP8HWuBbb+FLlFxMiqd8ywzik= github.com/fluxcd/pkg/auth v0.30.0/go.mod h1:me38o1nDfSLw6YvnkT9Ce/zqJZICZSA7j5pNMR3JUbc=
github.com/fluxcd/pkg/cache v0.11.0 h1:fsE8S+una21fSNw4MDXGUIf0Gf1J+pqa4RbsVKf2aTI= github.com/fluxcd/pkg/cache v0.11.0 h1:fsE8S+una21fSNw4MDXGUIf0Gf1J+pqa4RbsVKf2aTI=
github.com/fluxcd/pkg/cache v0.11.0/go.mod h1:2RTIU6PsJniHmfnllQWFEo7fa5V8KQlnMgn4o0sme40= github.com/fluxcd/pkg/cache v0.11.0/go.mod h1:2RTIU6PsJniHmfnllQWFEo7fa5V8KQlnMgn4o0sme40=
github.com/fluxcd/pkg/git v0.36.0 h1:oakFKxTX5yiLcFzCS1SaV+mMXaODaF1Ic6/oCLfIe7I= github.com/fluxcd/pkg/git v0.36.0 h1:oakFKxTX5yiLcFzCS1SaV+mMXaODaF1Ic6/oCLfIe7I=

View File

@ -16,9 +16,11 @@ limitations under the License.
package controller package controller
import sourcev1 "github.com/fluxcd/source-controller/api/v1" import (
"github.com/fluxcd/pkg/apis/meta"
)
type artifactSet []*sourcev1.Artifact type artifactSet []*meta.Artifact
// Diff returns true if any of the revisions in the artifactSet does not match any of the given artifacts. // Diff returns true if any of the revisions in the artifactSet does not match any of the given artifacts.
func (s artifactSet) Diff(set artifactSet) bool { func (s artifactSet) Diff(set artifactSet) bool {

View File

@ -19,24 +19,25 @@ package controller
import ( import (
"fmt" "fmt"
sourcev1 "github.com/fluxcd/source-controller/api/v1"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"github.com/onsi/gomega/types" "github.com/onsi/gomega/types"
"github.com/fluxcd/pkg/apis/meta"
) )
// MatchArtifact returns a custom matcher to check equality of a v1beta1.Artifact, the timestamp and URL are ignored. // MatchArtifact returns a custom matcher to check equality of a v1beta1.Artifact, the timestamp and URL are ignored.
func MatchArtifact(expected *sourcev1.Artifact) types.GomegaMatcher { func MatchArtifact(expected *meta.Artifact) types.GomegaMatcher {
return &matchArtifact{ return &matchArtifact{
expected: expected, expected: expected,
} }
} }
type matchArtifact struct { type matchArtifact struct {
expected *sourcev1.Artifact expected *meta.Artifact
} }
func (m matchArtifact) Match(actual interface{}) (success bool, err error) { func (m matchArtifact) Match(actual interface{}) (success bool, err error) {
actualArtifact, ok := actual.(*sourcev1.Artifact) actualArtifact, ok := actual.(*meta.Artifact)
if !ok { if !ok {
return false, fmt.Errorf("actual should be a pointer to an Artifact") return false, fmt.Errorf("actual should be a pointer to an Artifact")
} }

View File

@ -201,7 +201,7 @@ func TestBucketReconciler_reconcileStorage(t *testing.T) {
beforeFunc func(obj *sourcev1.Bucket, storage *storage.Storage) error beforeFunc func(obj *sourcev1.Bucket, storage *storage.Storage) error
want sreconcile.Result want sreconcile.Result
wantErr bool wantErr bool
assertArtifact *sourcev1.Artifact assertArtifact *meta.Artifact
assertConditions []metav1.Condition assertConditions []metav1.Condition
assertPaths []string assertPaths []string
}{ }{
@ -211,7 +211,7 @@ func TestBucketReconciler_reconcileStorage(t *testing.T) {
revisions := []string{"a", "b", "c", "d"} revisions := []string{"a", "b", "c", "d"}
for n := range revisions { for n := range revisions {
v := revisions[n] v := revisions[n]
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/reconcile-storage/%s.txt", v), Path: fmt.Sprintf("/reconcile-storage/%s.txt", v),
Revision: v, Revision: v,
} }
@ -229,7 +229,7 @@ func TestBucketReconciler_reconcileStorage(t *testing.T) {
conditions.MarkTrue(obj, meta.ReadyCondition, "foo", "bar") conditions.MarkTrue(obj, meta.ReadyCondition, "foo", "bar")
return nil return nil
}, },
assertArtifact: &sourcev1.Artifact{ assertArtifact: &meta.Artifact{
Path: "/reconcile-storage/d.txt", Path: "/reconcile-storage/d.txt",
Revision: "d", Revision: "d",
Digest: "sha256:18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4", Digest: "sha256:18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4",
@ -258,7 +258,7 @@ func TestBucketReconciler_reconcileStorage(t *testing.T) {
{ {
name: "notices missing artifact in storage", name: "notices missing artifact in storage",
beforeFunc: func(obj *sourcev1.Bucket, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.Bucket, storage *storage.Storage) error {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "/reconcile-storage/invalid.txt", Path: "/reconcile-storage/invalid.txt",
Revision: "d", Revision: "d",
} }
@ -279,7 +279,7 @@ func TestBucketReconciler_reconcileStorage(t *testing.T) {
beforeFunc: func(obj *sourcev1.Bucket, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.Bucket, storage *storage.Storage) error {
f := "empty-digest.txt" f := "empty-digest.txt"
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/reconcile-storage/%s.txt", f), Path: fmt.Sprintf("/reconcile-storage/%s.txt", f),
Revision: "fake", Revision: "fake",
} }
@ -310,7 +310,7 @@ func TestBucketReconciler_reconcileStorage(t *testing.T) {
beforeFunc: func(obj *sourcev1.Bucket, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.Bucket, storage *storage.Storage) error {
f := "digest-mismatch.txt" f := "digest-mismatch.txt"
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/reconcile-storage/%s.txt", f), Path: fmt.Sprintf("/reconcile-storage/%s.txt", f),
Revision: "fake", Revision: "fake",
} }
@ -339,7 +339,7 @@ func TestBucketReconciler_reconcileStorage(t *testing.T) {
{ {
name: "updates hostname on diff from current", name: "updates hostname on diff from current",
beforeFunc: func(obj *sourcev1.Bucket, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.Bucket, storage *storage.Storage) error {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "/reconcile-storage/hostname.txt", Path: "/reconcile-storage/hostname.txt",
Revision: "f", Revision: "f",
Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80", Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80",
@ -358,7 +358,7 @@ func TestBucketReconciler_reconcileStorage(t *testing.T) {
assertPaths: []string{ assertPaths: []string{
"/reconcile-storage/hostname.txt", "/reconcile-storage/hostname.txt",
}, },
assertArtifact: &sourcev1.Artifact{ assertArtifact: &meta.Artifact{
Path: "/reconcile-storage/hostname.txt", Path: "/reconcile-storage/hostname.txt",
Revision: "f", Revision: "f",
Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80", Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80",
@ -827,7 +827,7 @@ func TestBucketReconciler_reconcileSource_generic(t *testing.T) {
name: "Up-to-date artifact", name: "Up-to-date artifact",
bucketName: "dummy", bucketName: "dummy",
beforeFunc: func(obj *sourcev1.Bucket) { beforeFunc: func(obj *sourcev1.Bucket) {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Revision: "sha256:b4c2a60ce44b67f5b659a95ce4e4cc9e2a86baf13afb72bd397c5384cbc0e479", Revision: "sha256:b4c2a60ce44b67f5b659a95ce4e4cc9e2a86baf13afb72bd397c5384cbc0e479",
} }
conditions.MarkReconciling(obj, meta.ProgressingReason, "foo") conditions.MarkReconciling(obj, meta.ProgressingReason, "foo")
@ -885,7 +885,7 @@ func TestBucketReconciler_reconcileSource_generic(t *testing.T) {
}, },
}, },
beforeFunc: func(obj *sourcev1.Bucket) { beforeFunc: func(obj *sourcev1.Bucket) {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "some-path", Path: "some-path",
Revision: "some-rev", Revision: "some-rev",
} }
@ -1219,7 +1219,7 @@ func TestBucketReconciler_reconcileSource_gcs(t *testing.T) {
name: "Up-to-date artifact", name: "Up-to-date artifact",
bucketName: "dummy", bucketName: "dummy",
beforeFunc: func(obj *sourcev1.Bucket) { beforeFunc: func(obj *sourcev1.Bucket) {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Revision: "sha256:b4c2a60ce44b67f5b659a95ce4e4cc9e2a86baf13afb72bd397c5384cbc0e479", Revision: "sha256:b4c2a60ce44b67f5b659a95ce4e4cc9e2a86baf13afb72bd397c5384cbc0e479",
} }
conditions.MarkReconciling(obj, meta.ProgressingReason, "foo") conditions.MarkReconciling(obj, meta.ProgressingReason, "foo")
@ -1277,7 +1277,7 @@ func TestBucketReconciler_reconcileSource_gcs(t *testing.T) {
}, },
}, },
beforeFunc: func(obj *sourcev1.Bucket) { beforeFunc: func(obj *sourcev1.Bucket) {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "some-path", Path: "some-path",
Revision: "some-rev", Revision: "some-rev",
} }
@ -1488,7 +1488,7 @@ func TestBucketReconciler_reconcileArtifact(t *testing.T) {
revision := index.Digest(intdigest.Canonical) revision := index.Digest(intdigest.Canonical)
obj.Spec.Interval = metav1.Duration{Duration: interval} obj.Spec.Interval = metav1.Duration{Duration: interval}
// Incomplete artifact // Incomplete artifact
obj.Status.Artifact = &sourcev1.Artifact{Revision: revision.String()} obj.Status.Artifact = &meta.Artifact{Revision: revision.String()}
conditions.MarkReconciling(obj, meta.ProgressingReason, "foo") conditions.MarkReconciling(obj, meta.ProgressingReason, "foo")
conditions.MarkUnknown(obj, meta.ReadyCondition, "foo", "bar") conditions.MarkUnknown(obj, meta.ReadyCondition, "foo", "bar")
}, },
@ -1751,7 +1751,7 @@ func TestBucketReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
newObjBeforeFunc: func(obj *sourcev1.Bucket) { newObjBeforeFunc: func(obj *sourcev1.Bucket) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
}, },
wantEvent: "Normal NewArtifact stored artifact with 2 fetched files from", wantEvent: "Normal NewArtifact stored artifact with 2 fetched files from",
}, },
@ -1760,12 +1760,12 @@ func TestBucketReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.Bucket) { oldObjBeforeFunc: func(obj *sourcev1.Bucket) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail") conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail")
conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo") conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo")
}, },
newObjBeforeFunc: func(obj *sourcev1.Bucket) { newObjBeforeFunc: func(obj *sourcev1.Bucket) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
wantEvent: "Normal Succeeded stored artifact with 2 fetched files from", wantEvent: "Normal Succeeded stored artifact with 2 fetched files from",
@ -1775,12 +1775,12 @@ func TestBucketReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.Bucket) { oldObjBeforeFunc: func(obj *sourcev1.Bucket) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail") conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail")
conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo") conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo")
}, },
newObjBeforeFunc: func(obj *sourcev1.Bucket) { newObjBeforeFunc: func(obj *sourcev1.Bucket) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "aaa", Digest: "bbb"} obj.Status.Artifact = &meta.Artifact{Revision: "aaa", Digest: "bbb"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
wantEvent: "Normal NewArtifact stored artifact with 2 fetched files from", wantEvent: "Normal NewArtifact stored artifact with 2 fetched files from",
@ -1790,11 +1790,11 @@ func TestBucketReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.Bucket) { oldObjBeforeFunc: func(obj *sourcev1.Bucket) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
newObjBeforeFunc: func(obj *sourcev1.Bucket) { newObjBeforeFunc: func(obj *sourcev1.Bucket) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
}, },

View File

@ -938,7 +938,7 @@ func (r *GitRepositoryReconciler) reconcileInclude(ctx context.Context, sp *patc
// such that the index of artifactSet matches with the index of Include. // such that the index of artifactSet matches with the index of Include.
// Hence, index is used here to pick the associated artifact from // Hence, index is used here to pick the associated artifact from
// includes. // includes.
var artifact *sourcev1.Artifact var artifact *meta.Artifact
for j, art := range *includes { for j, art := range *includes {
if i == j { if i == j {
artifact = art artifact = art
@ -1271,7 +1271,7 @@ func gitContentConfigChanged(obj *sourcev1.GitRepository, includes *artifactSet)
// Convert artifactSet to index addressable artifacts and ensure that it and // Convert artifactSet to index addressable artifacts and ensure that it and
// the included artifacts include all the include from the spec. // the included artifacts include all the include from the spec.
artifacts := []*sourcev1.Artifact(*includes) artifacts := []*meta.Artifact(*includes)
if len(obj.Spec.Include) != len(artifacts) { if len(obj.Spec.Include) != len(artifacts) {
return true return true
} }

View File

@ -699,7 +699,7 @@ func TestGitRepositoryReconciler_reconcileSource_authStrategy(t *testing.T) {
beforeFunc: func(obj *sourcev1.GitRepository) { beforeFunc: func(obj *sourcev1.GitRepository) {
obj.Spec.SecretRef = &meta.LocalObjectReference{Name: "basic-auth"} obj.Spec.SecretRef = &meta.LocalObjectReference{Name: "basic-auth"}
obj.Status = sourcev1.GitRepositoryStatus{ obj.Status = sourcev1.GitRepositoryStatus{
Artifact: &sourcev1.Artifact{ Artifact: &meta.Artifact{
Revision: "staging/some-revision", Revision: "staging/some-revision",
Path: randStringRunes(10), Path: randStringRunes(10),
}, },
@ -1166,7 +1166,7 @@ func TestGitRepositoryReconciler_reconcileSource_checkoutStrategy(t *testing.T)
}, },
beforeFunc: func(obj *sourcev1.GitRepository, latestRev string) { beforeFunc: func(obj *sourcev1.GitRepository, latestRev string) {
obj.Status = sourcev1.GitRepositoryStatus{ obj.Status = sourcev1.GitRepositoryStatus{
Artifact: &sourcev1.Artifact{ Artifact: &meta.Artifact{
Revision: "staging/some-revision", Revision: "staging/some-revision",
Path: randStringRunes(10), Path: randStringRunes(10),
}, },
@ -1187,7 +1187,7 @@ func TestGitRepositoryReconciler_reconcileSource_checkoutStrategy(t *testing.T)
beforeFunc: func(obj *sourcev1.GitRepository, latestRev string) { beforeFunc: func(obj *sourcev1.GitRepository, latestRev string) {
// Add existing artifact on the object and storage. // Add existing artifact on the object and storage.
obj.Status = sourcev1.GitRepositoryStatus{ obj.Status = sourcev1.GitRepositoryStatus{
Artifact: &sourcev1.Artifact{ Artifact: &meta.Artifact{
Revision: "staging@sha1:" + latestRev, Revision: "staging@sha1:" + latestRev,
Path: randStringRunes(10), Path: randStringRunes(10),
}, },
@ -1210,7 +1210,7 @@ func TestGitRepositoryReconciler_reconcileSource_checkoutStrategy(t *testing.T)
obj.Spec.Ignore = ptr.To("foo") obj.Spec.Ignore = ptr.To("foo")
// Add existing artifact on the object and storage. // Add existing artifact on the object and storage.
obj.Status = sourcev1.GitRepositoryStatus{ obj.Status = sourcev1.GitRepositoryStatus{
Artifact: &sourcev1.Artifact{ Artifact: &meta.Artifact{
Revision: "staging@sha1:" + latestRev, Revision: "staging@sha1:" + latestRev,
Path: randStringRunes(10), Path: randStringRunes(10),
}, },
@ -1341,7 +1341,7 @@ func TestGitRepositoryReconciler_reconcileArtifact(t *testing.T) {
{ {
name: "Archiving artifact to storage with includes makes ArtifactInStorage=True", name: "Archiving artifact to storage with includes makes ArtifactInStorage=True",
dir: "testdata/git/repository", dir: "testdata/git/repository",
includes: artifactSet{&sourcev1.Artifact{Revision: "main@sha1:b9b3feadba509cb9b22e968a5d27e96c2bc2ff91"}}, includes: artifactSet{&meta.Artifact{Revision: "main@sha1:b9b3feadba509cb9b22e968a5d27e96c2bc2ff91"}},
beforeFunc: func(obj *sourcev1.GitRepository) { beforeFunc: func(obj *sourcev1.GitRepository) {
obj.Spec.Interval = metav1.Duration{Duration: interval} obj.Spec.Interval = metav1.Duration{Duration: interval}
obj.Spec.Include = []sourcev1.GitRepositoryInclude{ obj.Spec.Include = []sourcev1.GitRepositoryInclude{
@ -1361,14 +1361,14 @@ func TestGitRepositoryReconciler_reconcileArtifact(t *testing.T) {
{ {
name: "Up-to-date artifact should not update status", name: "Up-to-date artifact should not update status",
dir: "testdata/git/repository", dir: "testdata/git/repository",
includes: artifactSet{&sourcev1.Artifact{Revision: "main@sha1:b9b3feadba509cb9b22e968a5d27e96c2bc2ff91", Digest: "some-checksum"}}, includes: artifactSet{&meta.Artifact{Revision: "main@sha1:b9b3feadba509cb9b22e968a5d27e96c2bc2ff91", Digest: "some-checksum"}},
beforeFunc: func(obj *sourcev1.GitRepository) { beforeFunc: func(obj *sourcev1.GitRepository) {
obj.Spec.Interval = metav1.Duration{Duration: interval} obj.Spec.Interval = metav1.Duration{Duration: interval}
obj.Spec.Include = []sourcev1.GitRepositoryInclude{ obj.Spec.Include = []sourcev1.GitRepositoryInclude{
{GitRepositoryRef: meta.LocalObjectReference{Name: "foo"}}, {GitRepositoryRef: meta.LocalObjectReference{Name: "foo"}},
} }
obj.Status.Artifact = &sourcev1.Artifact{Revision: "main@sha1:b9b3feadba509cb9b22e968a5d27e96c2bc2ff91"} obj.Status.Artifact = &meta.Artifact{Revision: "main@sha1:b9b3feadba509cb9b22e968a5d27e96c2bc2ff91"}
obj.Status.IncludedArtifacts = []*sourcev1.Artifact{{Revision: "main@sha1:b9b3feadba509cb9b22e968a5d27e96c2bc2ff91", Digest: "some-checksum"}} obj.Status.IncludedArtifacts = []*meta.Artifact{{Revision: "main@sha1:b9b3feadba509cb9b22e968a5d27e96c2bc2ff91", Digest: "some-checksum"}}
obj.Status.ObservedInclude = obj.Spec.Include obj.Status.ObservedInclude = obj.Spec.Include
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
@ -1587,7 +1587,7 @@ func TestGitRepositoryReconciler_reconcileInclude(t *testing.T) {
}, },
} }
if d.withArtifact { if d.withArtifact {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: d.name + ".tar.gz", Path: d.name + ".tar.gz",
Revision: d.name, Revision: d.name,
LastUpdateTime: metav1.Now(), LastUpdateTime: metav1.Now(),
@ -1682,7 +1682,7 @@ func TestGitRepositoryReconciler_reconcileStorage(t *testing.T) {
beforeFunc func(obj *sourcev1.GitRepository, storage *storage.Storage) error beforeFunc func(obj *sourcev1.GitRepository, storage *storage.Storage) error
want sreconcile.Result want sreconcile.Result
wantErr bool wantErr bool
assertArtifact *sourcev1.Artifact assertArtifact *meta.Artifact
assertConditions []metav1.Condition assertConditions []metav1.Condition
assertPaths []string assertPaths []string
}{ }{
@ -1692,7 +1692,7 @@ func TestGitRepositoryReconciler_reconcileStorage(t *testing.T) {
revisions := []string{"a", "b", "c", "d"} revisions := []string{"a", "b", "c", "d"}
for n := range revisions { for n := range revisions {
v := revisions[n] v := revisions[n]
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/reconcile-storage/%s.txt", v), Path: fmt.Sprintf("/reconcile-storage/%s.txt", v),
Revision: v, Revision: v,
} }
@ -1710,7 +1710,7 @@ func TestGitRepositoryReconciler_reconcileStorage(t *testing.T) {
conditions.MarkTrue(obj, meta.ReadyCondition, "foo", "bar") conditions.MarkTrue(obj, meta.ReadyCondition, "foo", "bar")
return nil return nil
}, },
assertArtifact: &sourcev1.Artifact{ assertArtifact: &meta.Artifact{
Path: "/reconcile-storage/d.txt", Path: "/reconcile-storage/d.txt",
Revision: "d", Revision: "d",
Digest: "sha256:18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4", Digest: "sha256:18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4",
@ -1739,7 +1739,7 @@ func TestGitRepositoryReconciler_reconcileStorage(t *testing.T) {
{ {
name: "notices missing artifact in storage", name: "notices missing artifact in storage",
beforeFunc: func(obj *sourcev1.GitRepository, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.GitRepository, storage *storage.Storage) error {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "/reconcile-storage/invalid.txt", Path: "/reconcile-storage/invalid.txt",
Revision: "e", Revision: "e",
} }
@ -1760,7 +1760,7 @@ func TestGitRepositoryReconciler_reconcileStorage(t *testing.T) {
beforeFunc: func(obj *sourcev1.GitRepository, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.GitRepository, storage *storage.Storage) error {
f := "empty-digest.txt" f := "empty-digest.txt"
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/reconcile-storage/%s.txt", f), Path: fmt.Sprintf("/reconcile-storage/%s.txt", f),
Revision: "fake", Revision: "fake",
} }
@ -1791,7 +1791,7 @@ func TestGitRepositoryReconciler_reconcileStorage(t *testing.T) {
beforeFunc: func(obj *sourcev1.GitRepository, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.GitRepository, storage *storage.Storage) error {
f := "digest-mismatch.txt" f := "digest-mismatch.txt"
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/reconcile-storage/%s.txt", f), Path: fmt.Sprintf("/reconcile-storage/%s.txt", f),
Revision: "fake", Revision: "fake",
} }
@ -1820,7 +1820,7 @@ func TestGitRepositoryReconciler_reconcileStorage(t *testing.T) {
{ {
name: "updates hostname on diff from current", name: "updates hostname on diff from current",
beforeFunc: func(obj *sourcev1.GitRepository, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.GitRepository, storage *storage.Storage) error {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "/reconcile-storage/hostname.txt", Path: "/reconcile-storage/hostname.txt",
Revision: "f", Revision: "f",
Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80", Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80",
@ -1839,7 +1839,7 @@ func TestGitRepositoryReconciler_reconcileStorage(t *testing.T) {
assertPaths: []string{ assertPaths: []string{
"/reconcile-storage/hostname.txt", "/reconcile-storage/hostname.txt",
}, },
assertArtifact: &sourcev1.Artifact{ assertArtifact: &meta.Artifact{
Path: "/reconcile-storage/hostname.txt", Path: "/reconcile-storage/hostname.txt",
Revision: "f", Revision: "f",
Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80", Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80",
@ -2799,7 +2799,7 @@ func TestGitRepositoryReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
newObjBeforeFunc: func(obj *sourcev1.GitRepository) { newObjBeforeFunc: func(obj *sourcev1.GitRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
}, },
commit: concreteCommit, commit: concreteCommit,
wantEvent: "Normal NewArtifact stored artifact for commit 'test commit'", wantEvent: "Normal NewArtifact stored artifact for commit 'test commit'",
@ -2809,12 +2809,12 @@ func TestGitRepositoryReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.GitRepository) { oldObjBeforeFunc: func(obj *sourcev1.GitRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail") conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail")
conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo") conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo")
}, },
newObjBeforeFunc: func(obj *sourcev1.GitRepository) { newObjBeforeFunc: func(obj *sourcev1.GitRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
commit: concreteCommit, commit: concreteCommit,
@ -2825,12 +2825,12 @@ func TestGitRepositoryReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.GitRepository) { oldObjBeforeFunc: func(obj *sourcev1.GitRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail") conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail")
conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo") conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo")
}, },
newObjBeforeFunc: func(obj *sourcev1.GitRepository) { newObjBeforeFunc: func(obj *sourcev1.GitRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "aaa", Digest: "bbb"} obj.Status.Artifact = &meta.Artifact{Revision: "aaa", Digest: "bbb"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
commit: concreteCommit, commit: concreteCommit,
@ -2841,11 +2841,11 @@ func TestGitRepositoryReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.GitRepository) { oldObjBeforeFunc: func(obj *sourcev1.GitRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
newObjBeforeFunc: func(obj *sourcev1.GitRepository) { newObjBeforeFunc: func(obj *sourcev1.GitRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
}, },
@ -2854,12 +2854,12 @@ func TestGitRepositoryReconciler_notify(t *testing.T) {
res: sreconcile.ResultEmpty, res: sreconcile.ResultEmpty,
resErr: noopErr, resErr: noopErr,
oldObjBeforeFunc: func(obj *sourcev1.GitRepository) { oldObjBeforeFunc: func(obj *sourcev1.GitRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail") conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail")
conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo") conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo")
}, },
newObjBeforeFunc: func(obj *sourcev1.GitRepository) { newObjBeforeFunc: func(obj *sourcev1.GitRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
commit: partialCommit, // no-op will always result in partial commit. commit: partialCommit, // no-op will always result in partial commit.
@ -2950,7 +2950,7 @@ func TestGitRepositoryReconciler_fetchIncludes(t *testing.T) {
{name: "b", toPath: "b/", shouldExist: true}, {name: "b", toPath: "b/", shouldExist: true},
}, },
wantErr: false, wantErr: false,
wantArtifactSet: []*sourcev1.Artifact{ wantArtifactSet: []*meta.Artifact{
{Revision: "a"}, {Revision: "a"},
{Revision: "b"}, {Revision: "b"},
}, },
@ -3008,7 +3008,7 @@ func TestGitRepositoryReconciler_fetchIncludes(t *testing.T) {
}, },
} }
if d.withArtifact { if d.withArtifact {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: d.name + ".tar.gz", Path: d.name + ".tar.gz",
Revision: d.name, Revision: d.name,
LastUpdateTime: metav1.Now(), LastUpdateTime: metav1.Now(),
@ -3166,7 +3166,7 @@ func TestGitContentConfigChanged(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
obj sourcev1.GitRepository obj sourcev1.GitRepository
artifacts []*sourcev1.Artifact artifacts []*meta.Artifact
want bool want bool
}{ }{
{ {
@ -3266,10 +3266,10 @@ func TestGitContentConfigChanged(t *testing.T) {
ToPath: "baz", ToPath: "baz",
}, },
}, },
IncludedArtifacts: []*sourcev1.Artifact{{Revision: "aaa", Digest: "bbb"}}, IncludedArtifacts: []*meta.Artifact{{Revision: "aaa", Digest: "bbb"}},
}, },
}, },
artifacts: []*sourcev1.Artifact{ artifacts: []*meta.Artifact{
{Revision: "aaa", Digest: "bbb"}, {Revision: "aaa", Digest: "bbb"},
}, },
want: false, want: false,
@ -3294,10 +3294,10 @@ func TestGitContentConfigChanged(t *testing.T) {
ToPath: "baz", ToPath: "baz",
}, },
}, },
IncludedArtifacts: []*sourcev1.Artifact{{Revision: "aaa", Digest: "bbb"}}, IncludedArtifacts: []*meta.Artifact{{Revision: "aaa", Digest: "bbb"}},
}, },
}, },
artifacts: []*sourcev1.Artifact{ artifacts: []*meta.Artifact{
{Revision: "ccc", Digest: "bbb"}, {Revision: "ccc", Digest: "bbb"},
}, },
want: true, want: true,
@ -3322,10 +3322,10 @@ func TestGitContentConfigChanged(t *testing.T) {
ToPath: "baz", ToPath: "baz",
}, },
}, },
IncludedArtifacts: []*sourcev1.Artifact{{Revision: "aaa", Digest: "bbb"}}, IncludedArtifacts: []*meta.Artifact{{Revision: "aaa", Digest: "bbb"}},
}, },
}, },
artifacts: []*sourcev1.Artifact{ artifacts: []*meta.Artifact{
{Revision: "aaa", Digest: "ddd"}, {Revision: "aaa", Digest: "ddd"},
}, },
want: true, want: true,
@ -3350,10 +3350,10 @@ func TestGitContentConfigChanged(t *testing.T) {
ToPath: "baz", ToPath: "baz",
}, },
}, },
IncludedArtifacts: []*sourcev1.Artifact{{Revision: "aaa", Digest: "bbb"}}, IncludedArtifacts: []*meta.Artifact{{Revision: "aaa", Digest: "bbb"}},
}, },
}, },
artifacts: []*sourcev1.Artifact{ artifacts: []*meta.Artifact{
{Revision: "aaa", Digest: "bbb"}, {Revision: "aaa", Digest: "bbb"},
}, },
want: true, want: true,
@ -3376,13 +3376,13 @@ func TestGitContentConfigChanged(t *testing.T) {
}, },
}, },
Status: sourcev1.GitRepositoryStatus{ Status: sourcev1.GitRepositoryStatus{
IncludedArtifacts: []*sourcev1.Artifact{ IncludedArtifacts: []*meta.Artifact{
{Revision: "aaa", Digest: "bbb"}, {Revision: "aaa", Digest: "bbb"},
{Revision: "ccc", Digest: "ccc"}, {Revision: "ccc", Digest: "ccc"},
}, },
}, },
}, },
artifacts: []*sourcev1.Artifact{ artifacts: []*meta.Artifact{
{Revision: "aaa", Digest: "bbb"}, {Revision: "aaa", Digest: "bbb"},
{Revision: "ccc", Digest: "ddd"}, {Revision: "ccc", Digest: "ddd"},
}, },
@ -3418,13 +3418,13 @@ func TestGitContentConfigChanged(t *testing.T) {
ToPath: "baz", ToPath: "baz",
}, },
}, },
IncludedArtifacts: []*sourcev1.Artifact{ IncludedArtifacts: []*meta.Artifact{
{Revision: "aaa", Digest: "bbb"}, {Revision: "aaa", Digest: "bbb"},
{Revision: "ccc", Digest: "ccc"}, {Revision: "ccc", Digest: "ccc"},
}, },
}, },
}, },
artifacts: []*sourcev1.Artifact{ artifacts: []*meta.Artifact{
{Revision: "aaa", Digest: "bbb"}, {Revision: "aaa", Digest: "bbb"},
}, },
want: true, want: true,
@ -3459,12 +3459,12 @@ func TestGitContentConfigChanged(t *testing.T) {
ToPath: "baz", ToPath: "baz",
}, },
}, },
IncludedArtifacts: []*sourcev1.Artifact{ IncludedArtifacts: []*meta.Artifact{
{Revision: "aaa", Digest: "bbb"}, {Revision: "aaa", Digest: "bbb"},
}, },
}, },
}, },
artifacts: []*sourcev1.Artifact{ artifacts: []*meta.Artifact{
{Revision: "aaa", Digest: "bbb"}, {Revision: "aaa", Digest: "bbb"},
{Revision: "ccc", Digest: "ccc"}, {Revision: "ccc", Digest: "ccc"},
}, },

View File

@ -697,7 +697,7 @@ func (r *HelmChartReconciler) buildFromHelmRepository(ctx context.Context, obj *
// v1.Artifact. // v1.Artifact.
// In case of a failure it records v1.FetchFailedCondition on the chart // In case of a failure it records v1.FetchFailedCondition on the chart
// object, and returns early. // object, and returns early.
func (r *HelmChartReconciler) buildFromTarballArtifact(ctx context.Context, obj *sourcev1.HelmChart, source sourcev1.Artifact, b *chart.Build) (sreconcile.Result, error) { func (r *HelmChartReconciler) buildFromTarballArtifact(ctx context.Context, obj *sourcev1.HelmChart, source meta.Artifact, b *chart.Build) (sreconcile.Result, error) {
// Create temporary working directory // Create temporary working directory
tmpDir, err := util.TempDirForObj("", obj) tmpDir, err := util.TempDirForObj("", obj)
if err != nil { if err != nil {

View File

@ -336,7 +336,7 @@ func TestHelmChartReconciler_reconcileStorage(t *testing.T) {
beforeFunc func(obj *sourcev1.HelmChart, storage *storage.Storage) error beforeFunc func(obj *sourcev1.HelmChart, storage *storage.Storage) error
want sreconcile.Result want sreconcile.Result
wantErr bool wantErr bool
assertArtifact *sourcev1.Artifact assertArtifact *meta.Artifact
assertConditions []metav1.Condition assertConditions []metav1.Condition
assertPaths []string assertPaths []string
}{ }{
@ -346,7 +346,7 @@ func TestHelmChartReconciler_reconcileStorage(t *testing.T) {
revisions := []string{"a", "b", "c", "d"} revisions := []string{"a", "b", "c", "d"}
for n := range revisions { for n := range revisions {
v := revisions[n] v := revisions[n]
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/reconcile-storage/%s.txt", v), Path: fmt.Sprintf("/reconcile-storage/%s.txt", v),
Revision: v, Revision: v,
} }
@ -364,7 +364,7 @@ func TestHelmChartReconciler_reconcileStorage(t *testing.T) {
conditions.MarkTrue(obj, meta.ReadyCondition, "foo", "bar") conditions.MarkTrue(obj, meta.ReadyCondition, "foo", "bar")
return nil return nil
}, },
assertArtifact: &sourcev1.Artifact{ assertArtifact: &meta.Artifact{
Path: "/reconcile-storage/d.txt", Path: "/reconcile-storage/d.txt",
Revision: "d", Revision: "d",
Digest: "sha256:18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4", Digest: "sha256:18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4",
@ -393,7 +393,7 @@ func TestHelmChartReconciler_reconcileStorage(t *testing.T) {
{ {
name: "notices missing artifact in storage", name: "notices missing artifact in storage",
beforeFunc: func(obj *sourcev1.HelmChart, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.HelmChart, storage *storage.Storage) error {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "/reconcile-storage/invalid.txt", Path: "/reconcile-storage/invalid.txt",
Revision: "d", Revision: "d",
} }
@ -414,7 +414,7 @@ func TestHelmChartReconciler_reconcileStorage(t *testing.T) {
beforeFunc: func(obj *sourcev1.HelmChart, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.HelmChart, storage *storage.Storage) error {
f := "empty-digest.txt" f := "empty-digest.txt"
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/reconcile-storage/%s.txt", f), Path: fmt.Sprintf("/reconcile-storage/%s.txt", f),
Revision: "fake", Revision: "fake",
} }
@ -445,7 +445,7 @@ func TestHelmChartReconciler_reconcileStorage(t *testing.T) {
beforeFunc: func(obj *sourcev1.HelmChart, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.HelmChart, storage *storage.Storage) error {
f := "digest-mismatch.txt" f := "digest-mismatch.txt"
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/reconcile-storage/%s.txt", f), Path: fmt.Sprintf("/reconcile-storage/%s.txt", f),
Revision: "fake", Revision: "fake",
} }
@ -474,7 +474,7 @@ func TestHelmChartReconciler_reconcileStorage(t *testing.T) {
{ {
name: "updates hostname on diff from current", name: "updates hostname on diff from current",
beforeFunc: func(obj *sourcev1.HelmChart, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.HelmChart, storage *storage.Storage) error {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "/reconcile-storage/hostname.txt", Path: "/reconcile-storage/hostname.txt",
Revision: "f", Revision: "f",
Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80", Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80",
@ -493,7 +493,7 @@ func TestHelmChartReconciler_reconcileStorage(t *testing.T) {
assertPaths: []string{ assertPaths: []string{
"/reconcile-storage/hostname.txt", "/reconcile-storage/hostname.txt",
}, },
assertArtifact: &sourcev1.Artifact{ assertArtifact: &meta.Artifact{
Path: "/reconcile-storage/hostname.txt", Path: "/reconcile-storage/hostname.txt",
Revision: "f", Revision: "f",
Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80", Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80",
@ -574,7 +574,7 @@ func TestHelmChartReconciler_reconcileSource(t *testing.T) {
storage, err := storage.New(tmpDir, "example.com", retentionTTL, retentionRecords) storage, err := storage.New(tmpDir, "example.com", retentionTTL, retentionRecords)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
gitArtifact := &sourcev1.Artifact{ gitArtifact := &meta.Artifact{
Revision: "mock-ref/abcdefg12345678", Revision: "mock-ref/abcdefg12345678",
Path: "mock.tgz", Path: "mock.tgz",
} }
@ -641,7 +641,7 @@ func TestHelmChartReconciler_reconcileSource(t *testing.T) {
Name: "gitrepository", Name: "gitrepository",
Kind: sourcev1.GitRepositoryKind, Kind: sourcev1.GitRepositoryKind,
} }
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "some-path", Path: "some-path",
Revision: "some-rev", Revision: "some-rev",
} }
@ -919,7 +919,7 @@ func TestHelmChartReconciler_buildFromHelmRepository(t *testing.T) {
beforeFunc: func(obj *sourcev1.HelmChart, repository *sourcev1.HelmRepository) { beforeFunc: func(obj *sourcev1.HelmChart, repository *sourcev1.HelmRepository) {
obj.Spec.Chart = chartName obj.Spec.Chart = chartName
obj.Spec.Version = chartVersion obj.Spec.Version = chartVersion
obj.Status.Artifact = &sourcev1.Artifact{Path: chartName + "-" + chartVersion + ".tgz"} obj.Status.Artifact = &meta.Artifact{Path: chartName + "-" + chartVersion + ".tgz"}
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
assertFunc: func(g *WithT, obj *sourcev1.HelmChart, build chart.Build) { assertFunc: func(g *WithT, obj *sourcev1.HelmChart, build chart.Build) {
@ -934,7 +934,7 @@ func TestHelmChartReconciler_buildFromHelmRepository(t *testing.T) {
beforeFunc: func(obj *sourcev1.HelmChart, repository *sourcev1.HelmRepository) { beforeFunc: func(obj *sourcev1.HelmChart, repository *sourcev1.HelmRepository) {
obj.Spec.Chart = chartName obj.Spec.Chart = chartName
obj.Spec.Version = chartVersion obj.Spec.Version = chartVersion
obj.Status.Artifact = &sourcev1.Artifact{Path: chartName + "-" + chartVersion + ".tgz"} obj.Status.Artifact = &meta.Artifact{Path: chartName + "-" + chartVersion + ".tgz"}
obj.Status.ObservedValuesFiles = []string{"values.yaml", "override.yaml"} obj.Status.ObservedValuesFiles = []string{"values.yaml", "override.yaml"}
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
@ -1017,7 +1017,7 @@ func TestHelmChartReconciler_buildFromHelmRepository(t *testing.T) {
obj.Spec.Version = chartVersion obj.Spec.Version = chartVersion
obj.Status.ObservedGeneration = 2 obj.Status.ObservedGeneration = 2
obj.Status.Artifact = &sourcev1.Artifact{Path: chartName + "-" + chartVersion + ".tgz"} obj.Status.Artifact = &meta.Artifact{Path: chartName + "-" + chartVersion + ".tgz"}
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
assertFunc: func(g *WithT, obj *sourcev1.HelmChart, build chart.Build) { assertFunc: func(g *WithT, obj *sourcev1.HelmChart, build chart.Build) {
@ -1135,7 +1135,7 @@ func TestHelmChartReconciler_buildFromHelmRepository(t *testing.T) {
Timeout: &metav1.Duration{Duration: timeout}, Timeout: &metav1.Duration{Duration: timeout},
}, },
Status: sourcev1.HelmRepositoryStatus{ Status: sourcev1.HelmRepositoryStatus{
Artifact: &sourcev1.Artifact{ Artifact: &meta.Artifact{
Path: "index.yaml", Path: "index.yaml",
}, },
}, },
@ -1191,7 +1191,7 @@ func TestHelmChartReconciler_buildFromOCIHelmRepository(t *testing.T) {
storage, err := storage.New(tmpDir, "example.com", retentionTTL, retentionRecords) storage, err := storage.New(tmpDir, "example.com", retentionTTL, retentionRecords)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
cachedArtifact := &sourcev1.Artifact{ cachedArtifact := &meta.Artifact{
Revision: "0.1.0", Revision: "0.1.0",
Path: metadata.Name + "-" + metadata.Version + ".tgz", Path: metadata.Name + "-" + metadata.Version + ".tgz",
} }
@ -1267,7 +1267,7 @@ func TestHelmChartReconciler_buildFromOCIHelmRepository(t *testing.T) {
beforeFunc: func(obj *sourcev1.HelmChart, repository *sourcev1.HelmRepository) { beforeFunc: func(obj *sourcev1.HelmChart, repository *sourcev1.HelmRepository) {
obj.Spec.Chart = metadata.Name obj.Spec.Chart = metadata.Name
obj.Spec.Version = metadata.Version obj.Spec.Version = metadata.Version
obj.Status.Artifact = &sourcev1.Artifact{Path: metadata.Name + "-" + metadata.Version + ".tgz"} obj.Status.Artifact = &meta.Artifact{Path: metadata.Name + "-" + metadata.Version + ".tgz"}
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
assertFunc: func(g *WithT, obj *sourcev1.HelmChart, build chart.Build) { assertFunc: func(g *WithT, obj *sourcev1.HelmChart, build chart.Build) {
@ -1286,7 +1286,7 @@ func TestHelmChartReconciler_buildFromOCIHelmRepository(t *testing.T) {
obj.Spec.Version = metadata.Version obj.Spec.Version = metadata.Version
obj.Status.ObservedGeneration = 2 obj.Status.ObservedGeneration = 2
obj.Status.Artifact = &sourcev1.Artifact{Path: metadata.Name + "-" + metadata.Version + ".tgz"} obj.Status.Artifact = &meta.Artifact{Path: metadata.Name + "-" + metadata.Version + ".tgz"}
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
assertFunc: func(g *WithT, obj *sourcev1.HelmChart, build chart.Build) { assertFunc: func(g *WithT, obj *sourcev1.HelmChart, build chart.Build) {
@ -1414,17 +1414,17 @@ func TestHelmChartReconciler_buildFromTarballArtifact(t *testing.T) {
storage, err := storage.New(tmpDir, "example.com", retentionTTL, retentionRecords) storage, err := storage.New(tmpDir, "example.com", retentionTTL, retentionRecords)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
chartsArtifact := &sourcev1.Artifact{ chartsArtifact := &meta.Artifact{
Revision: "mock-ref/abcdefg12345678", Revision: "mock-ref/abcdefg12345678",
Path: "mock.tgz", Path: "mock.tgz",
} }
g.Expect(storage.Archive(chartsArtifact, "testdata/charts", nil)).To(Succeed()) g.Expect(storage.Archive(chartsArtifact, "testdata/charts", nil)).To(Succeed())
yamlArtifact := &sourcev1.Artifact{ yamlArtifact := &meta.Artifact{
Revision: "9876abcd", Revision: "9876abcd",
Path: "values.yaml", Path: "values.yaml",
} }
g.Expect(storage.CopyFromPath(yamlArtifact, "testdata/charts/helmchart/values.yaml")).To(Succeed()) g.Expect(storage.CopyFromPath(yamlArtifact, "testdata/charts/helmchart/values.yaml")).To(Succeed())
cachedArtifact := &sourcev1.Artifact{ cachedArtifact := &meta.Artifact{
Revision: "0.1.0", Revision: "0.1.0",
Path: "cached.tgz", Path: "cached.tgz",
} }
@ -1432,7 +1432,7 @@ func TestHelmChartReconciler_buildFromTarballArtifact(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
source sourcev1.Artifact source meta.Artifact
beforeFunc func(obj *sourcev1.HelmChart) beforeFunc func(obj *sourcev1.HelmChart)
want sreconcile.Result want sreconcile.Result
wantErr error wantErr error
@ -1563,7 +1563,7 @@ func TestHelmChartReconciler_buildFromTarballArtifact(t *testing.T) {
}, },
{ {
name: "Empty source artifact", name: "Empty source artifact",
source: sourcev1.Artifact{}, source: meta.Artifact{},
want: sreconcile.ResultEmpty, want: sreconcile.ResultEmpty,
wantErr: &serror.Generic{Err: errors.New("no such file or directory")}, wantErr: &serror.Generic{Err: errors.New("no such file or directory")},
assertFunc: func(g *WithT, build chart.Build) { assertFunc: func(g *WithT, build chart.Build) {
@ -1678,7 +1678,7 @@ func TestHelmChartReconciler_reconcileArtifact(t *testing.T) {
Path: filepath.Join(testStorage.BasePath, "testdata/charts/helmchart-0.1.0.tgz"), Path: filepath.Join(testStorage.BasePath, "testdata/charts/helmchart-0.1.0.tgz"),
}, },
beforeFunc: func(obj *sourcev1.HelmChart) { beforeFunc: func(obj *sourcev1.HelmChart) {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "testdata/charts/helmchart-0.1.0.tgz", Path: "testdata/charts/helmchart-0.1.0.tgz",
} }
}, },
@ -1700,7 +1700,7 @@ func TestHelmChartReconciler_reconcileArtifact(t *testing.T) {
}, },
beforeFunc: func(obj *sourcev1.HelmChart) { beforeFunc: func(obj *sourcev1.HelmChart) {
obj.Status.ObservedChartName = "helmchart" obj.Status.ObservedChartName = "helmchart"
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Revision: "0.1.0", Revision: "0.1.0",
Path: "testdata/charts/helmchart-0.1.0.tgz", Path: "testdata/charts/helmchart-0.1.0.tgz",
} }
@ -2298,7 +2298,7 @@ func TestHelmChartReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
newObjBeforeFunc: func(obj *sourcev1.HelmChart) { newObjBeforeFunc: func(obj *sourcev1.HelmChart) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
}, },
wantEvent: "Normal ChartPackageSucceeded packaged", wantEvent: "Normal ChartPackageSucceeded packaged",
}, },
@ -2307,12 +2307,12 @@ func TestHelmChartReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.HelmChart) { oldObjBeforeFunc: func(obj *sourcev1.HelmChart) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail") conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail")
conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo") conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo")
}, },
newObjBeforeFunc: func(obj *sourcev1.HelmChart) { newObjBeforeFunc: func(obj *sourcev1.HelmChart) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
wantEvent: "Normal ChartPackageSucceeded packaged", wantEvent: "Normal ChartPackageSucceeded packaged",
@ -2322,12 +2322,12 @@ func TestHelmChartReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.HelmChart) { oldObjBeforeFunc: func(obj *sourcev1.HelmChart) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail") conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail")
conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo") conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo")
}, },
newObjBeforeFunc: func(obj *sourcev1.HelmChart) { newObjBeforeFunc: func(obj *sourcev1.HelmChart) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "aaa", Digest: "bbb"} obj.Status.Artifact = &meta.Artifact{Revision: "aaa", Digest: "bbb"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
wantEvent: "Normal ChartPackageSucceeded packaged", wantEvent: "Normal ChartPackageSucceeded packaged",
@ -2337,11 +2337,11 @@ func TestHelmChartReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.HelmChart) { oldObjBeforeFunc: func(obj *sourcev1.HelmChart) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
newObjBeforeFunc: func(obj *sourcev1.HelmChart) { newObjBeforeFunc: func(obj *sourcev1.HelmChart) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
}, },
@ -2901,7 +2901,7 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_verifySignatureNotation(t *t
storage, err := storage.New(tmpDir, server.registryHost, retentionTTL, retentionRecords) storage, err := storage.New(tmpDir, server.registryHost, retentionTTL, retentionRecords)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
cachedArtifact := &sourcev1.Artifact{ cachedArtifact := &meta.Artifact{
Revision: "0.1.0", Revision: "0.1.0",
Path: metadata.Name + "-" + metadata.Version + ".tgz", Path: metadata.Name + "-" + metadata.Version + ".tgz",
} }
@ -3006,7 +3006,7 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_verifySignatureNotation(t *t
obj.Spec.Version = metadata.Version obj.Spec.Version = metadata.Version
obj.Spec.Verify = nil obj.Spec.Verify = nil
conditions.MarkFalse(obj, sourcev1.SourceVerifiedCondition, "VerifyFailed", "fail msg") conditions.MarkFalse(obj, sourcev1.SourceVerifiedCondition, "VerifyFailed", "fail msg")
obj.Status.Artifact = &sourcev1.Artifact{Path: metadata.Name + "-" + metadata.Version + ".tgz"} obj.Status.Artifact = &meta.Artifact{Path: metadata.Name + "-" + metadata.Version + ".tgz"}
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
assertConditions: []metav1.Condition{ assertConditions: []metav1.Condition{
@ -3225,7 +3225,7 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_verifySignatureCosign(t *tes
storage, err := storage.New(tmpDir, server.registryHost, retentionTTL, retentionRecords) storage, err := storage.New(tmpDir, server.registryHost, retentionTTL, retentionRecords)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
cachedArtifact := &sourcev1.Artifact{ cachedArtifact := &meta.Artifact{
Revision: "0.1.0", Revision: "0.1.0",
Path: metadata.Name + "-" + metadata.Version + ".tgz", Path: metadata.Name + "-" + metadata.Version + ".tgz",
} }
@ -3318,7 +3318,7 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_verifySignatureCosign(t *tes
obj.Spec.Version = metadata.Version obj.Spec.Version = metadata.Version
obj.Spec.Verify = nil obj.Spec.Verify = nil
conditions.MarkFalse(obj, sourcev1.SourceVerifiedCondition, "VerifyFailed", "fail msg") conditions.MarkFalse(obj, sourcev1.SourceVerifiedCondition, "VerifyFailed", "fail msg")
obj.Status.Artifact = &sourcev1.Artifact{Path: metadata.Name + "-" + metadata.Version + ".tgz"} obj.Status.Artifact = &meta.Artifact{Path: metadata.Name + "-" + metadata.Version + ".tgz"}
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
assertConditions: []metav1.Condition{ assertConditions: []metav1.Condition{

View File

@ -128,7 +128,7 @@ type HelmRepositoryReconcilerOptions struct {
// v1.HelmRepository (sub)reconcile functions. The type implementations // v1.HelmRepository (sub)reconcile functions. The type implementations
// are grouped and executed serially to perform the complete reconcile of the // are grouped and executed serially to perform the complete reconcile of the
// object. // object.
type helmRepositoryReconcileFunc func(ctx context.Context, sp *patch.SerialPatcher, obj *sourcev1.HelmRepository, artifact *sourcev1.Artifact, repo *repository.ChartRepository) (sreconcile.Result, error) type helmRepositoryReconcileFunc func(ctx context.Context, sp *patch.SerialPatcher, obj *sourcev1.HelmRepository, artifact *meta.Artifact, repo *repository.ChartRepository) (sreconcile.Result, error)
func (r *HelmRepositoryReconciler) SetupWithManager(mgr ctrl.Manager) error { func (r *HelmRepositoryReconciler) SetupWithManager(mgr ctrl.Manager) error {
return r.SetupWithManagerAndOptions(mgr, HelmRepositoryReconcilerOptions{}) return r.SetupWithManagerAndOptions(mgr, HelmRepositoryReconcilerOptions{})
@ -258,7 +258,7 @@ func (r *HelmRepositoryReconciler) reconcile(ctx context.Context, sp *patch.Seri
} }
var chartRepo repository.ChartRepository var chartRepo repository.ChartRepository
var artifact sourcev1.Artifact var artifact meta.Artifact
// Run the sub-reconcilers and build the result of reconciliation. // Run the sub-reconcilers and build the result of reconciliation.
var res sreconcile.Result var res sreconcile.Result
@ -330,7 +330,7 @@ func (r *HelmRepositoryReconciler) notify(ctx context.Context, oldObj, newObj *s
// The hostname of any URL in the Status of the object are updated, to ensure // The hostname of any URL in the Status of the object are updated, to ensure
// they match the Storage server hostname of current runtime. // they match the Storage server hostname of current runtime.
func (r *HelmRepositoryReconciler) reconcileStorage(ctx context.Context, sp *patch.SerialPatcher, func (r *HelmRepositoryReconciler) reconcileStorage(ctx context.Context, sp *patch.SerialPatcher,
obj *sourcev1.HelmRepository, _ *sourcev1.Artifact, _ *repository.ChartRepository) (sreconcile.Result, error) { obj *sourcev1.HelmRepository, _ *meta.Artifact, _ *repository.ChartRepository) (sreconcile.Result, error) {
// Garbage collect previous advertised artifact(s) from storage // Garbage collect previous advertised artifact(s) from storage
_ = r.garbageCollect(ctx, obj) _ = r.garbageCollect(ctx, obj)
@ -393,7 +393,7 @@ func (r *HelmRepositoryReconciler) reconcileStorage(ctx context.Context, sp *pat
// v1.FetchFailedCondition is removed, and the repository.ChartRepository // v1.FetchFailedCondition is removed, and the repository.ChartRepository
// pointer is set to the newly fetched index. // pointer is set to the newly fetched index.
func (r *HelmRepositoryReconciler) reconcileSource(ctx context.Context, sp *patch.SerialPatcher, func (r *HelmRepositoryReconciler) reconcileSource(ctx context.Context, sp *patch.SerialPatcher,
obj *sourcev1.HelmRepository, artifact *sourcev1.Artifact, chartRepo *repository.ChartRepository) (sreconcile.Result, error) { obj *sourcev1.HelmRepository, artifact *meta.Artifact, chartRepo *repository.ChartRepository) (sreconcile.Result, error) {
// Ensure it's not an OCI URL. API validation ensures that only // Ensure it's not an OCI URL. API validation ensures that only
// http/https/oci scheme are allowed. // http/https/oci scheme are allowed.
if strings.HasPrefix(obj.Spec.URL, helmreg.OCIScheme) { if strings.HasPrefix(obj.Spec.URL, helmreg.OCIScheme) {
@ -530,7 +530,7 @@ func (r *HelmRepositoryReconciler) reconcileSource(ctx context.Context, sp *patc
// early. // early.
// On a successful archive, the Artifact in the Status of the object is set, // On a successful archive, the Artifact in the Status of the object is set,
// and the symlink in the Storage is updated to its path. // and the symlink in the Storage is updated to its path.
func (r *HelmRepositoryReconciler) reconcileArtifact(ctx context.Context, sp *patch.SerialPatcher, obj *sourcev1.HelmRepository, artifact *sourcev1.Artifact, chartRepo *repository.ChartRepository) (sreconcile.Result, error) { func (r *HelmRepositoryReconciler) reconcileArtifact(ctx context.Context, sp *patch.SerialPatcher, obj *sourcev1.HelmRepository, artifact *meta.Artifact, chartRepo *repository.ChartRepository) (sreconcile.Result, error) {
// Set the ArtifactInStorageCondition if there's no drift. // Set the ArtifactInStorageCondition if there's no drift.
defer func() { defer func() {
if obj.GetArtifact().HasRevision(artifact.Revision) { if obj.GetArtifact().HasRevision(artifact.Revision) {

View File

@ -176,7 +176,7 @@ func TestHelmRepositoryReconciler_reconcileStorage(t *testing.T) {
beforeFunc func(obj *sourcev1.HelmRepository, storage *storage.Storage) error beforeFunc func(obj *sourcev1.HelmRepository, storage *storage.Storage) error
want sreconcile.Result want sreconcile.Result
wantErr bool wantErr bool
assertArtifact *sourcev1.Artifact assertArtifact *meta.Artifact
assertConditions []metav1.Condition assertConditions []metav1.Condition
assertPaths []string assertPaths []string
}{ }{
@ -186,7 +186,7 @@ func TestHelmRepositoryReconciler_reconcileStorage(t *testing.T) {
revisions := []string{"a", "b", "c", "d"} revisions := []string{"a", "b", "c", "d"}
for n := range revisions { for n := range revisions {
v := revisions[n] v := revisions[n]
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/reconcile-storage/%s.txt", v), Path: fmt.Sprintf("/reconcile-storage/%s.txt", v),
Revision: v, Revision: v,
} }
@ -204,7 +204,7 @@ func TestHelmRepositoryReconciler_reconcileStorage(t *testing.T) {
conditions.MarkTrue(obj, meta.ReadyCondition, "foo", "bar") conditions.MarkTrue(obj, meta.ReadyCondition, "foo", "bar")
return nil return nil
}, },
assertArtifact: &sourcev1.Artifact{ assertArtifact: &meta.Artifact{
Path: "/reconcile-storage/d.txt", Path: "/reconcile-storage/d.txt",
Revision: "d", Revision: "d",
Digest: "sha256:18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4", Digest: "sha256:18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4",
@ -233,7 +233,7 @@ func TestHelmRepositoryReconciler_reconcileStorage(t *testing.T) {
{ {
name: "notices missing artifact in storage", name: "notices missing artifact in storage",
beforeFunc: func(obj *sourcev1.HelmRepository, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.HelmRepository, storage *storage.Storage) error {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "/reconcile-storage/invalid.txt", Path: "/reconcile-storage/invalid.txt",
Revision: "d", Revision: "d",
} }
@ -254,7 +254,7 @@ func TestHelmRepositoryReconciler_reconcileStorage(t *testing.T) {
beforeFunc: func(obj *sourcev1.HelmRepository, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.HelmRepository, storage *storage.Storage) error {
f := "empty-digest.txt" f := "empty-digest.txt"
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/reconcile-storage/%s.txt", f), Path: fmt.Sprintf("/reconcile-storage/%s.txt", f),
Revision: "fake", Revision: "fake",
} }
@ -285,7 +285,7 @@ func TestHelmRepositoryReconciler_reconcileStorage(t *testing.T) {
beforeFunc: func(obj *sourcev1.HelmRepository, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.HelmRepository, storage *storage.Storage) error {
f := "digest-mismatch.txt" f := "digest-mismatch.txt"
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/reconcile-storage/%s.txt", f), Path: fmt.Sprintf("/reconcile-storage/%s.txt", f),
Revision: "fake", Revision: "fake",
} }
@ -314,7 +314,7 @@ func TestHelmRepositoryReconciler_reconcileStorage(t *testing.T) {
{ {
name: "updates hostname on diff from current", name: "updates hostname on diff from current",
beforeFunc: func(obj *sourcev1.HelmRepository, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.HelmRepository, storage *storage.Storage) error {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "/reconcile-storage/hostname.txt", Path: "/reconcile-storage/hostname.txt",
Revision: "f", Revision: "f",
Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80", Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80",
@ -333,7 +333,7 @@ func TestHelmRepositoryReconciler_reconcileStorage(t *testing.T) {
assertPaths: []string{ assertPaths: []string{
"/reconcile-storage/hostname.txt", "/reconcile-storage/hostname.txt",
}, },
assertArtifact: &sourcev1.Artifact{ assertArtifact: &meta.Artifact{
Path: "/reconcile-storage/hostname.txt", Path: "/reconcile-storage/hostname.txt",
Revision: "f", Revision: "f",
Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80", Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80",
@ -375,7 +375,7 @@ func TestHelmRepositoryReconciler_reconcileStorage(t *testing.T) {
}() }()
var chartRepo repository.ChartRepository var chartRepo repository.ChartRepository
var artifact sourcev1.Artifact var artifact meta.Artifact
sp := patch.NewSerialPatcher(obj, r.Client) sp := patch.NewSerialPatcher(obj, r.Client)
got, err := r.reconcileStorage(context.TODO(), sp, obj, &artifact, &chartRepo) got, err := r.reconcileStorage(context.TODO(), sp, obj, &artifact, &chartRepo)
@ -421,7 +421,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
secret *corev1.Secret secret *corev1.Secret
beforeFunc func(t *WithT, obj *sourcev1.HelmRepository) beforeFunc func(t *WithT, obj *sourcev1.HelmRepository)
revFunc func(t *WithT, server *helmtestserver.HelmServer, secret *corev1.Secret) digest.Digest revFunc func(t *WithT, server *helmtestserver.HelmServer, secret *corev1.Secret) digest.Digest
afterFunc func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, chartRepo *repository.ChartRepository) afterFunc func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, chartRepo *repository.ChartRepository)
want sreconcile.Result want sreconcile.Result
wantErr bool wantErr bool
assertConditions []metav1.Condition assertConditions []metav1.Condition
@ -495,7 +495,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: new index revision"), *conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: new index revision"),
*conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: new index revision"), *conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: new index revision"),
}, },
afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, chartRepo *repository.ChartRepository) { afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, chartRepo *repository.ChartRepository) {
t.Expect(chartRepo.Path).ToNot(BeEmpty()) t.Expect(chartRepo.Path).ToNot(BeEmpty())
t.Expect(chartRepo.Index).ToNot(BeNil()) t.Expect(chartRepo.Index).ToNot(BeNil())
t.Expect(artifact.Revision).ToNot(BeEmpty()) t.Expect(artifact.Revision).ToNot(BeEmpty())
@ -547,7 +547,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: new index revision"), *conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: new index revision"),
*conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: new index revision"), *conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: new index revision"),
}, },
afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, chartRepo *repository.ChartRepository) { afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, chartRepo *repository.ChartRepository) {
t.Expect(chartRepo.Path).ToNot(BeEmpty()) t.Expect(chartRepo.Path).ToNot(BeEmpty())
t.Expect(chartRepo.Index).ToNot(BeNil()) t.Expect(chartRepo.Index).ToNot(BeNil())
t.Expect(artifact.Revision).ToNot(BeEmpty()) t.Expect(artifact.Revision).ToNot(BeEmpty())
@ -601,7 +601,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: new index revision"), *conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: new index revision"),
*conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: new index revision"), *conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: new index revision"),
}, },
afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, chartRepo *repository.ChartRepository) { afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, chartRepo *repository.ChartRepository) {
t.Expect(chartRepo.Path).ToNot(BeEmpty()) t.Expect(chartRepo.Path).ToNot(BeEmpty())
t.Expect(chartRepo.Index).ToNot(BeNil()) t.Expect(chartRepo.Index).ToNot(BeNil())
t.Expect(artifact.Revision).ToNot(BeEmpty()) t.Expect(artifact.Revision).ToNot(BeEmpty())
@ -633,7 +633,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: new index revision"), *conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: new index revision"),
*conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: new index revision"), *conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: new index revision"),
}, },
afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, chartRepo *repository.ChartRepository) { afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, chartRepo *repository.ChartRepository) {
t.Expect(chartRepo.Path).ToNot(BeEmpty()) t.Expect(chartRepo.Path).ToNot(BeEmpty())
t.Expect(chartRepo.Index).ToNot(BeNil()) t.Expect(chartRepo.Index).ToNot(BeNil())
t.Expect(artifact.Revision).ToNot(BeEmpty()) t.Expect(artifact.Revision).ToNot(BeEmpty())
@ -686,7 +686,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: new index revision"), *conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: new index revision"),
*conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: new index revision"), *conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: new index revision"),
}, },
afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, chartRepo *repository.ChartRepository) { afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, chartRepo *repository.ChartRepository) {
t.Expect(chartRepo.Path).ToNot(BeEmpty()) t.Expect(chartRepo.Path).ToNot(BeEmpty())
t.Expect(chartRepo.Index).ToNot(BeNil()) t.Expect(chartRepo.Index).ToNot(BeNil())
t.Expect(artifact.Revision).ToNot(BeEmpty()) t.Expect(artifact.Revision).ToNot(BeEmpty())
@ -741,7 +741,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: new index revision"), *conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: new index revision"),
*conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: new index revision"), *conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: new index revision"),
}, },
afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, chartRepo *repository.ChartRepository) { afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, chartRepo *repository.ChartRepository) {
t.Expect(chartRepo.Path).ToNot(BeEmpty()) t.Expect(chartRepo.Path).ToNot(BeEmpty())
t.Expect(chartRepo.Index).ToNot(BeNil()) t.Expect(chartRepo.Index).ToNot(BeNil())
t.Expect(artifact.Revision).ToNot(BeEmpty()) t.Expect(artifact.Revision).ToNot(BeEmpty())
@ -775,7 +775,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "foo"), *conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "foo"),
*conditions.UnknownCondition(meta.ReadyCondition, "foo", "bar"), *conditions.UnknownCondition(meta.ReadyCondition, "foo", "bar"),
}, },
afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, chartRepo *repository.ChartRepository) { afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, chartRepo *repository.ChartRepository) {
// No repo index due to fetch fail. // No repo index due to fetch fail.
t.Expect(chartRepo.Path).To(BeEmpty()) t.Expect(chartRepo.Path).To(BeEmpty())
t.Expect(chartRepo.Index).To(BeNil()) t.Expect(chartRepo.Index).To(BeNil())
@ -797,7 +797,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "foo"), *conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "foo"),
*conditions.UnknownCondition(meta.ReadyCondition, "foo", "bar"), *conditions.UnknownCondition(meta.ReadyCondition, "foo", "bar"),
}, },
afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, chartRepo *repository.ChartRepository) { afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, chartRepo *repository.ChartRepository) {
// No repo index due to fetch fail. // No repo index due to fetch fail.
t.Expect(chartRepo.Path).To(BeEmpty()) t.Expect(chartRepo.Path).To(BeEmpty())
t.Expect(chartRepo.Index).To(BeNil()) t.Expect(chartRepo.Index).To(BeNil())
@ -819,7 +819,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "foo"), *conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "foo"),
*conditions.UnknownCondition(meta.ReadyCondition, "foo", "bar"), *conditions.UnknownCondition(meta.ReadyCondition, "foo", "bar"),
}, },
afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, chartRepo *repository.ChartRepository) { afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, chartRepo *repository.ChartRepository) {
// No repo index due to fetch fail. // No repo index due to fetch fail.
t.Expect(chartRepo.Path).To(BeEmpty()) t.Expect(chartRepo.Path).To(BeEmpty())
t.Expect(chartRepo.Index).To(BeNil()) t.Expect(chartRepo.Index).To(BeNil())
@ -840,7 +840,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "foo"), *conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "foo"),
*conditions.UnknownCondition(meta.ReadyCondition, "foo", "bar"), *conditions.UnknownCondition(meta.ReadyCondition, "foo", "bar"),
}, },
afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, chartRepo *repository.ChartRepository) { afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, chartRepo *repository.ChartRepository) {
// No repo index due to fetch fail. // No repo index due to fetch fail.
t.Expect(chartRepo.Path).To(BeEmpty()) t.Expect(chartRepo.Path).To(BeEmpty())
t.Expect(chartRepo.Index).To(BeNil()) t.Expect(chartRepo.Index).To(BeNil())
@ -870,7 +870,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "foo"), *conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "foo"),
*conditions.UnknownCondition(meta.ReadyCondition, "foo", "bar"), *conditions.UnknownCondition(meta.ReadyCondition, "foo", "bar"),
}, },
afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, chartRepo *repository.ChartRepository) { afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, chartRepo *repository.ChartRepository) {
// No repo index due to fetch fail. // No repo index due to fetch fail.
t.Expect(chartRepo.Path).To(BeEmpty()) t.Expect(chartRepo.Path).To(BeEmpty())
t.Expect(chartRepo.Index).To(BeNil()) t.Expect(chartRepo.Index).To(BeNil())
@ -907,7 +907,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "foo"), *conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "foo"),
*conditions.UnknownCondition(meta.ReadyCondition, "foo", "bar"), *conditions.UnknownCondition(meta.ReadyCondition, "foo", "bar"),
}, },
afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, chartRepo *repository.ChartRepository) { afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, chartRepo *repository.ChartRepository) {
t.Expect(chartRepo.Path).ToNot(BeEmpty()) t.Expect(chartRepo.Path).ToNot(BeEmpty())
t.Expect(chartRepo.Index).To(BeNil()) t.Expect(chartRepo.Index).To(BeNil())
@ -919,7 +919,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
name: "Stored index with different revision", name: "Stored index with different revision",
protocol: "http", protocol: "http",
beforeFunc: func(t *WithT, obj *sourcev1.HelmRepository) { beforeFunc: func(t *WithT, obj *sourcev1.HelmRepository) {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Revision: "80bb3dd67c63095d985850459834ea727603727a370079de90d221191d375a86", Revision: "80bb3dd67c63095d985850459834ea727603727a370079de90d221191d375a86",
} }
conditions.MarkReconciling(obj, meta.ProgressingReason, "foo") conditions.MarkReconciling(obj, meta.ProgressingReason, "foo")
@ -931,7 +931,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: new index revision"), *conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: new index revision"),
*conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: new index revision"), *conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: new index revision"),
}, },
afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, chartRepo *repository.ChartRepository) { afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, chartRepo *repository.ChartRepository) {
t.Expect(chartRepo.Path).ToNot(BeEmpty()) t.Expect(chartRepo.Path).ToNot(BeEmpty())
t.Expect(chartRepo.Index).ToNot(BeNil()) t.Expect(chartRepo.Index).ToNot(BeNil())
@ -944,7 +944,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
name: "Existing artifact makes ArtifactOutdated=True", name: "Existing artifact makes ArtifactOutdated=True",
protocol: "http", protocol: "http",
beforeFunc: func(t *WithT, obj *sourcev1.HelmRepository) { beforeFunc: func(t *WithT, obj *sourcev1.HelmRepository) {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "some-path", Path: "some-path",
Revision: "some-rev", Revision: "some-rev",
} }
@ -1040,7 +1040,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
// Special handling for tests that need to set revision after calculation // Special handling for tests that need to set revision after calculation
if tt.name == "Stored index with same revision" && rev != "" { if tt.name == "Stored index with same revision" && rev != "" {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Revision: rev.String(), Revision: rev.String(),
} }
} }
@ -1051,7 +1051,7 @@ func TestHelmRepositoryReconciler_reconcileSource(t *testing.T) {
}() }()
var chartRepo repository.ChartRepository var chartRepo repository.ChartRepository
var artifact sourcev1.Artifact var artifact meta.Artifact
sp := patch.NewSerialPatcher(obj, r.Client) sp := patch.NewSerialPatcher(obj, r.Client)
got, err := r.reconcileSource(context.TODO(), sp, obj, &artifact, &chartRepo) got, err := r.reconcileSource(context.TODO(), sp, obj, &artifact, &chartRepo)
@ -1076,7 +1076,7 @@ func TestHelmRepositoryReconciler_reconcileArtifact(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
cache *cache.Cache cache *cache.Cache
beforeFunc func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, index *repository.ChartRepository) beforeFunc func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, index *repository.ChartRepository)
afterFunc func(t *WithT, obj *sourcev1.HelmRepository, cache *cache.Cache) afterFunc func(t *WithT, obj *sourcev1.HelmRepository, cache *cache.Cache)
want sreconcile.Result want sreconcile.Result
wantErr bool wantErr bool
@ -1084,7 +1084,7 @@ func TestHelmRepositoryReconciler_reconcileArtifact(t *testing.T) {
}{ }{
{ {
name: "Archiving artifact to storage makes ArtifactInStorage=True and artifact is stored as JSON", name: "Archiving artifact to storage makes ArtifactInStorage=True and artifact is stored as JSON",
beforeFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, index *repository.ChartRepository) { beforeFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, index *repository.ChartRepository) {
obj.Spec.Interval = metav1.Duration{Duration: interval} obj.Spec.Interval = metav1.Duration{Duration: interval}
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
@ -1101,7 +1101,7 @@ func TestHelmRepositoryReconciler_reconcileArtifact(t *testing.T) {
{ {
name: "Archiving (loaded) artifact to storage adds to cache", name: "Archiving (loaded) artifact to storage adds to cache",
cache: cache.New(10, time.Minute), cache: cache.New(10, time.Minute),
beforeFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, index *repository.ChartRepository) { beforeFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, index *repository.ChartRepository) {
index.Index = &repo.IndexFile{ index.Index = &repo.IndexFile{
APIVersion: "v1", APIVersion: "v1",
Generated: time.Now(), Generated: time.Now(),
@ -1120,7 +1120,7 @@ func TestHelmRepositoryReconciler_reconcileArtifact(t *testing.T) {
}, },
{ {
name: "Up-to-date artifact should not update status", name: "Up-to-date artifact should not update status",
beforeFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, index *repository.ChartRepository) { beforeFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, index *repository.ChartRepository) {
obj.Spec.Interval = metav1.Duration{Duration: interval} obj.Spec.Interval = metav1.Duration{Duration: interval}
obj.Status.Artifact = artifact.DeepCopy() obj.Status.Artifact = artifact.DeepCopy()
}, },
@ -1134,7 +1134,7 @@ func TestHelmRepositoryReconciler_reconcileArtifact(t *testing.T) {
}, },
{ {
name: "Removes ArtifactOutdatedCondition after creating a new artifact", name: "Removes ArtifactOutdatedCondition after creating a new artifact",
beforeFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, index *repository.ChartRepository) { beforeFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, index *repository.ChartRepository) {
obj.Spec.Interval = metav1.Duration{Duration: interval} obj.Spec.Interval = metav1.Duration{Duration: interval}
conditions.MarkTrue(obj, sourcev1.ArtifactOutdatedCondition, "Foo", "") conditions.MarkTrue(obj, sourcev1.ArtifactOutdatedCondition, "Foo", "")
}, },
@ -1145,7 +1145,7 @@ func TestHelmRepositoryReconciler_reconcileArtifact(t *testing.T) {
}, },
{ {
name: "Creates latest symlink to the created artifact", name: "Creates latest symlink to the created artifact",
beforeFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact sourcev1.Artifact, index *repository.ChartRepository) { beforeFunc: func(t *WithT, obj *sourcev1.HelmRepository, artifact meta.Artifact, index *repository.ChartRepository) {
obj.Spec.Interval = metav1.Duration{Duration: interval} obj.Spec.Interval = metav1.Duration{Duration: interval}
}, },
afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, _ *cache.Cache) { afterFunc: func(t *WithT, obj *sourcev1.HelmRepository, _ *cache.Cache) {
@ -1227,7 +1227,7 @@ func TestHelmRepositoryReconciler_reconcileArtifact(t *testing.T) {
func TestHelmRepositoryReconciler_reconcileSubRecs(t *testing.T) { func TestHelmRepositoryReconciler_reconcileSubRecs(t *testing.T) {
// Helper to build simple helmRepositoryReconcileFunc with result and error. // Helper to build simple helmRepositoryReconcileFunc with result and error.
buildReconcileFuncs := func(r sreconcile.Result, e error) helmRepositoryReconcileFunc { buildReconcileFuncs := func(r sreconcile.Result, e error) helmRepositoryReconcileFunc {
return func(ctx context.Context, sp *patch.SerialPatcher, obj *sourcev1.HelmRepository, artifact *sourcev1.Artifact, repo *repository.ChartRepository) (sreconcile.Result, error) { return func(ctx context.Context, sp *patch.SerialPatcher, obj *sourcev1.HelmRepository, artifact *meta.Artifact, repo *repository.ChartRepository) (sreconcile.Result, error) {
return r, e return r, e
} }
} }
@ -1282,11 +1282,11 @@ func TestHelmRepositoryReconciler_reconcileSubRecs(t *testing.T) {
{ {
name: "multiple object status conditions mutations", name: "multiple object status conditions mutations",
reconcileFuncs: []helmRepositoryReconcileFunc{ reconcileFuncs: []helmRepositoryReconcileFunc{
func(ctx context.Context, sp *patch.SerialPatcher, obj *sourcev1.HelmRepository, artifact *sourcev1.Artifact, repo *repository.ChartRepository) (sreconcile.Result, error) { func(ctx context.Context, sp *patch.SerialPatcher, obj *sourcev1.HelmRepository, artifact *meta.Artifact, repo *repository.ChartRepository) (sreconcile.Result, error) {
conditions.MarkTrue(obj, sourcev1.ArtifactOutdatedCondition, "NewRevision", "new index revision") conditions.MarkTrue(obj, sourcev1.ArtifactOutdatedCondition, "NewRevision", "new index revision")
return sreconcile.ResultSuccess, nil return sreconcile.ResultSuccess, nil
}, },
func(ctx context.Context, sp *patch.SerialPatcher, obj *sourcev1.HelmRepository, artifact *sourcev1.Artifact, repo *repository.ChartRepository) (sreconcile.Result, error) { func(ctx context.Context, sp *patch.SerialPatcher, obj *sourcev1.HelmRepository, artifact *meta.Artifact, repo *repository.ChartRepository) (sreconcile.Result, error) {
conditions.MarkTrue(obj, meta.ReconcilingCondition, meta.ProgressingReason, "creating artifact") conditions.MarkTrue(obj, meta.ReconcilingCondition, meta.ProgressingReason, "creating artifact")
return sreconcile.ResultSuccess, nil return sreconcile.ResultSuccess, nil
}, },
@ -1481,7 +1481,7 @@ func TestHelmRepositoryReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
newObjBeforeFunc: func(obj *sourcev1.HelmRepository) { newObjBeforeFunc: func(obj *sourcev1.HelmRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy", Size: nil} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy", Size: nil}
}, },
wantEvent: "Normal NewArtifact stored fetched index of unknown size", wantEvent: "Normal NewArtifact stored fetched index of unknown size",
}, },
@ -1490,7 +1490,7 @@ func TestHelmRepositoryReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
newObjBeforeFunc: func(obj *sourcev1.HelmRepository) { newObjBeforeFunc: func(obj *sourcev1.HelmRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy", Size: &aSize} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy", Size: &aSize}
}, },
wantEvent: "Normal NewArtifact stored fetched index of size", wantEvent: "Normal NewArtifact stored fetched index of size",
}, },
@ -1499,12 +1499,12 @@ func TestHelmRepositoryReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.HelmRepository) { oldObjBeforeFunc: func(obj *sourcev1.HelmRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy", Size: &aSize} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy", Size: &aSize}
conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail") conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail")
conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo") conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo")
}, },
newObjBeforeFunc: func(obj *sourcev1.HelmRepository) { newObjBeforeFunc: func(obj *sourcev1.HelmRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy", Size: &aSize} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy", Size: &aSize}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
wantEvent: "Normal Succeeded stored fetched index of size", wantEvent: "Normal Succeeded stored fetched index of size",
@ -1514,12 +1514,12 @@ func TestHelmRepositoryReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.HelmRepository) { oldObjBeforeFunc: func(obj *sourcev1.HelmRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy", Size: &aSize} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy", Size: &aSize}
conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail") conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.GitOperationFailedReason, "fail")
conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo") conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo")
}, },
newObjBeforeFunc: func(obj *sourcev1.HelmRepository) { newObjBeforeFunc: func(obj *sourcev1.HelmRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "aaa", Digest: "bbb", Size: &aSize} obj.Status.Artifact = &meta.Artifact{Revision: "aaa", Digest: "bbb", Size: &aSize}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
wantEvent: "Normal NewArtifact stored fetched index of size", wantEvent: "Normal NewArtifact stored fetched index of size",
@ -1529,11 +1529,11 @@ func TestHelmRepositoryReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.HelmRepository) { oldObjBeforeFunc: func(obj *sourcev1.HelmRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy", Size: &aSize} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy", Size: &aSize}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
newObjBeforeFunc: func(obj *sourcev1.HelmRepository) { newObjBeforeFunc: func(obj *sourcev1.HelmRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy", Size: &aSize} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy", Size: &aSize}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
}, },

View File

@ -132,7 +132,7 @@ func (e invalidOCIURLError) Error() string {
// ociRepositoryReconcileFunc is the function type for all the v1.OCIRepository // ociRepositoryReconcileFunc is the function type for all the v1.OCIRepository
// (sub)reconcile functions. The type implementations are grouped and // (sub)reconcile functions. The type implementations are grouped and
// executed serially to perform the complete reconcile of the object. // executed serially to perform the complete reconcile of the object.
type ociRepositoryReconcileFunc func(ctx context.Context, sp *patch.SerialPatcher, obj *sourcev1.OCIRepository, metadata *sourcev1.Artifact, dir string) (sreconcile.Result, error) type ociRepositoryReconcileFunc func(ctx context.Context, sp *patch.SerialPatcher, obj *sourcev1.OCIRepository, metadata *meta.Artifact, dir string) (sreconcile.Result, error)
// OCIRepositoryReconciler reconciles a v1.OCIRepository object // OCIRepositoryReconciler reconciles a v1.OCIRepository object
type OCIRepositoryReconciler struct { type OCIRepositoryReconciler struct {
@ -301,7 +301,7 @@ func (r *OCIRepositoryReconciler) reconcile(ctx context.Context, sp *patch.Seria
var ( var (
res sreconcile.Result res sreconcile.Result
resErr error resErr error
metadata = sourcev1.Artifact{} metadata = meta.Artifact{}
) )
// Run the sub-reconcilers and build the result of reconciliation. // Run the sub-reconcilers and build the result of reconciliation.
@ -330,7 +330,7 @@ func (r *OCIRepositoryReconciler) reconcile(ctx context.Context, sp *patch.Seria
// reconcileSource fetches the upstream OCI artifact metadata and content. // reconcileSource fetches the upstream OCI artifact metadata and content.
// If this fails, it records v1.FetchFailedCondition=True on the object and returns early. // If this fails, it records v1.FetchFailedCondition=True on the object and returns early.
func (r *OCIRepositoryReconciler) reconcileSource(ctx context.Context, sp *patch.SerialPatcher, func (r *OCIRepositoryReconciler) reconcileSource(ctx context.Context, sp *patch.SerialPatcher,
obj *sourcev1.OCIRepository, metadata *sourcev1.Artifact, dir string) (sreconcile.Result, error) { obj *sourcev1.OCIRepository, metadata *meta.Artifact, dir string) (sreconcile.Result, error) {
var authenticator authn.Authenticator var authenticator authn.Authenticator
ctxTimeout, cancel := context.WithTimeout(ctx, obj.Spec.Timeout.Duration) ctxTimeout, cancel := context.WithTimeout(ctx, obj.Spec.Timeout.Duration)
@ -455,7 +455,7 @@ func (r *OCIRepositoryReconciler) reconcileSource(ctx context.Context, sp *patch
conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, e.Reason, "%s", e) conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, e.Reason, "%s", e)
return sreconcile.ResultEmpty, e return sreconcile.ResultEmpty, e
} }
metaArtifact := &sourcev1.Artifact{Revision: revision} metaArtifact := &meta.Artifact{Revision: revision}
metaArtifact.DeepCopyInto(metadata) metaArtifact.DeepCopyInto(metadata)
// Mark observations about the revision on the object // Mark observations about the revision on the object
@ -1024,7 +1024,7 @@ func (r *OCIRepositoryReconciler) getTLSConfig(ctx context.Context, obj *sourcev
// The hostname of any URL in the Status of the object are updated, to ensure // The hostname of any URL in the Status of the object are updated, to ensure
// they match the Storage server hostname of current runtime. // they match the Storage server hostname of current runtime.
func (r *OCIRepositoryReconciler) reconcileStorage(ctx context.Context, sp *patch.SerialPatcher, func (r *OCIRepositoryReconciler) reconcileStorage(ctx context.Context, sp *patch.SerialPatcher,
obj *sourcev1.OCIRepository, _ *sourcev1.Artifact, _ string) (sreconcile.Result, error) { obj *sourcev1.OCIRepository, _ *meta.Artifact, _ string) (sreconcile.Result, error) {
// Garbage collect previous advertised artifact(s) from storage // Garbage collect previous advertised artifact(s) from storage
_ = r.garbageCollect(ctx, obj) _ = r.garbageCollect(ctx, obj)
@ -1087,7 +1087,7 @@ func (r *OCIRepositoryReconciler) reconcileStorage(ctx context.Context, sp *patc
// On a successful archive, the Artifact in the Status of the object is set, // On a successful archive, the Artifact in the Status of the object is set,
// and the symlink in the Storage is updated to its path. // and the symlink in the Storage is updated to its path.
func (r *OCIRepositoryReconciler) reconcileArtifact(ctx context.Context, sp *patch.SerialPatcher, func (r *OCIRepositoryReconciler) reconcileArtifact(ctx context.Context, sp *patch.SerialPatcher,
obj *sourcev1.OCIRepository, metadata *sourcev1.Artifact, dir string) (sreconcile.Result, error) { obj *sourcev1.OCIRepository, metadata *meta.Artifact, dir string) (sreconcile.Result, error) {
// Create artifact // Create artifact
artifact := r.Storage.NewArtifactFor(obj.Kind, obj, metadata.Revision, artifact := r.Storage.NewArtifactFor(obj.Kind, obj, metadata.Revision,
fmt.Sprintf("%s.tar.gz", r.digestFromRevision(metadata.Revision))) fmt.Sprintf("%s.tar.gz", r.digestFromRevision(metadata.Revision)))

View File

@ -822,7 +822,7 @@ func TestOCIRepository_reconcileSource_authStrategy(t *testing.T) {
sp := patch.NewSerialPatcher(obj, r.Client) sp := patch.NewSerialPatcher(obj, r.Client)
tmpDir := t.TempDir() tmpDir := t.TempDir()
got, err := r.reconcileSource(ctx, sp, obj, &sourcev1.Artifact{}, tmpDir) got, err := r.reconcileSource(ctx, sp, obj, &meta.Artifact{}, tmpDir)
if tt.wantErr { if tt.wantErr {
g.Expect(err).ToNot(BeNil()) g.Expect(err).ToNot(BeNil())
} else { } else {
@ -1289,7 +1289,7 @@ func TestOCIRepository_reconcileSource_remoteReference(t *testing.T) {
sp := patch.NewSerialPatcher(obj, r.Client) sp := patch.NewSerialPatcher(obj, r.Client)
artifact := &sourcev1.Artifact{} artifact := &meta.Artifact{}
tmpDir := t.TempDir() tmpDir := t.TempDir()
got, err := r.reconcileSource(ctx, sp, obj, artifact, tmpDir) got, err := r.reconcileSource(ctx, sp, obj, artifact, tmpDir)
if tt.wantErr { if tt.wantErr {
@ -1356,7 +1356,7 @@ func TestOCIRepository_reconcileSource_verifyOCISourceSignatureNotation(t *testi
beforeFunc: func(obj *sourcev1.OCIRepository, tag, revision string) { beforeFunc: func(obj *sourcev1.OCIRepository, tag, revision string) {
conditions.MarkFalse(obj, sourcev1.SourceVerifiedCondition, "VerifyFailed", "fail msg") conditions.MarkFalse(obj, sourcev1.SourceVerifiedCondition, "VerifyFailed", "fail msg")
obj.Spec.Verify = nil obj.Spec.Verify = nil
obj.Status.Artifact = &sourcev1.Artifact{Revision: fmt.Sprintf("%s@%s", tag, revision)} obj.Status.Artifact = &meta.Artifact{Revision: fmt.Sprintf("%s@%s", tag, revision)}
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
}, },
@ -1365,7 +1365,7 @@ func TestOCIRepository_reconcileSource_verifyOCISourceSignatureNotation(t *testi
reference: &sourcev1.OCIRepositoryRef{Tag: "6.1.4"}, reference: &sourcev1.OCIRepositoryRef{Tag: "6.1.4"},
shouldSign: true, shouldSign: true,
beforeFunc: func(obj *sourcev1.OCIRepository, tag, revision string) { beforeFunc: func(obj *sourcev1.OCIRepository, tag, revision string) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: fmt.Sprintf("%s@%s", tag, revision)} obj.Status.Artifact = &meta.Artifact{Revision: fmt.Sprintf("%s@%s", tag, revision)}
// Set Verified with old observed generation and different reason/message. // Set Verified with old observed generation and different reason/message.
conditions.MarkTrue(obj, sourcev1.SourceVerifiedCondition, "Verified", "verified") conditions.MarkTrue(obj, sourcev1.SourceVerifiedCondition, "Verified", "verified")
// Set new object generation. // Set new object generation.
@ -1382,7 +1382,7 @@ func TestOCIRepository_reconcileSource_verifyOCISourceSignatureNotation(t *testi
shouldSign: true, shouldSign: true,
beforeFunc: func(obj *sourcev1.OCIRepository, tag, revision string) { beforeFunc: func(obj *sourcev1.OCIRepository, tag, revision string) {
// Artifact present and custom verified condition reason/message. // Artifact present and custom verified condition reason/message.
obj.Status.Artifact = &sourcev1.Artifact{Revision: fmt.Sprintf("%s@%s", tag, revision)} obj.Status.Artifact = &meta.Artifact{Revision: fmt.Sprintf("%s@%s", tag, revision)}
conditions.MarkTrue(obj, sourcev1.SourceVerifiedCondition, "Verified", "verified") conditions.MarkTrue(obj, sourcev1.SourceVerifiedCondition, "Verified", "verified")
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
@ -1630,7 +1630,7 @@ func TestOCIRepository_reconcileSource_verifyOCISourceSignatureNotation(t *testi
sp := patch.NewSerialPatcher(obj, r.Client) sp := patch.NewSerialPatcher(obj, r.Client)
artifact := &sourcev1.Artifact{} artifact := &meta.Artifact{}
got, err := r.reconcileSource(ctx, sp, obj, artifact, tmpDir) got, err := r.reconcileSource(ctx, sp, obj, artifact, tmpDir)
if tt.wantErr { if tt.wantErr {
tt.wantErrMsg = strings.ReplaceAll(tt.wantErrMsg, "<url>", artifactRef.String()) tt.wantErrMsg = strings.ReplaceAll(tt.wantErrMsg, "<url>", artifactRef.String())
@ -1969,7 +1969,7 @@ func TestOCIRepository_reconcileSource_verifyOCISourceTrustPolicyNotation(t *tes
sp := patch.NewSerialPatcher(obj, r.Client) sp := patch.NewSerialPatcher(obj, r.Client)
artifact := &sourcev1.Artifact{} artifact := &meta.Artifact{}
got, err := r.reconcileSource(ctx, sp, obj, artifact, tmpDir) got, err := r.reconcileSource(ctx, sp, obj, artifact, tmpDir)
g.Expect(r.Delete(ctx, secret)).NotTo(HaveOccurred()) g.Expect(r.Delete(ctx, secret)).NotTo(HaveOccurred())
if tt.wantErr { if tt.wantErr {
@ -2050,7 +2050,7 @@ func TestOCIRepository_reconcileSource_verifyOCISourceSignatureCosign(t *testing
beforeFunc: func(obj *sourcev1.OCIRepository, tag, revision string) { beforeFunc: func(obj *sourcev1.OCIRepository, tag, revision string) {
conditions.MarkFalse(obj, sourcev1.SourceVerifiedCondition, "VerifyFailed", "fail msg") conditions.MarkFalse(obj, sourcev1.SourceVerifiedCondition, "VerifyFailed", "fail msg")
obj.Spec.Verify = nil obj.Spec.Verify = nil
obj.Status.Artifact = &sourcev1.Artifact{Revision: fmt.Sprintf("%s@%s", tag, revision)} obj.Status.Artifact = &meta.Artifact{Revision: fmt.Sprintf("%s@%s", tag, revision)}
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
}, },
@ -2059,7 +2059,7 @@ func TestOCIRepository_reconcileSource_verifyOCISourceSignatureCosign(t *testing
reference: &sourcev1.OCIRepositoryRef{Tag: "6.1.4"}, reference: &sourcev1.OCIRepositoryRef{Tag: "6.1.4"},
shouldSign: true, shouldSign: true,
beforeFunc: func(obj *sourcev1.OCIRepository, tag, revision string) { beforeFunc: func(obj *sourcev1.OCIRepository, tag, revision string) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: fmt.Sprintf("%s@%s", tag, revision)} obj.Status.Artifact = &meta.Artifact{Revision: fmt.Sprintf("%s@%s", tag, revision)}
// Set Verified with old observed generation and different reason/message. // Set Verified with old observed generation and different reason/message.
conditions.MarkTrue(obj, sourcev1.SourceVerifiedCondition, "Verified", "verified") conditions.MarkTrue(obj, sourcev1.SourceVerifiedCondition, "Verified", "verified")
// Set new object generation. // Set new object generation.
@ -2076,7 +2076,7 @@ func TestOCIRepository_reconcileSource_verifyOCISourceSignatureCosign(t *testing
shouldSign: true, shouldSign: true,
beforeFunc: func(obj *sourcev1.OCIRepository, tag, revision string) { beforeFunc: func(obj *sourcev1.OCIRepository, tag, revision string) {
// Artifact present and custom verified condition reason/message. // Artifact present and custom verified condition reason/message.
obj.Status.Artifact = &sourcev1.Artifact{Revision: fmt.Sprintf("%s@%s", tag, revision)} obj.Status.Artifact = &meta.Artifact{Revision: fmt.Sprintf("%s@%s", tag, revision)}
conditions.MarkTrue(obj, sourcev1.SourceVerifiedCondition, "Verified", "verified") conditions.MarkTrue(obj, sourcev1.SourceVerifiedCondition, "Verified", "verified")
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
@ -2241,7 +2241,7 @@ func TestOCIRepository_reconcileSource_verifyOCISourceSignatureCosign(t *testing
sp := patch.NewSerialPatcher(obj, r.Client) sp := patch.NewSerialPatcher(obj, r.Client)
artifact := &sourcev1.Artifact{} artifact := &meta.Artifact{}
got, err := r.reconcileSource(ctx, sp, obj, artifact, tmpDir) got, err := r.reconcileSource(ctx, sp, obj, artifact, tmpDir)
if tt.wantErr { if tt.wantErr {
tt.wantErrMsg = strings.ReplaceAll(tt.wantErrMsg, "<url>", artifactRef.String()) tt.wantErrMsg = strings.ReplaceAll(tt.wantErrMsg, "<url>", artifactRef.String())
@ -2416,7 +2416,7 @@ func TestOCIRepository_reconcileSource_verifyOCISourceSignature_keyless(t *testi
sp := patch.NewSerialPatcher(obj, r.Client) sp := patch.NewSerialPatcher(obj, r.Client)
artifact := &sourcev1.Artifact{} artifact := &meta.Artifact{}
got, err := r.reconcileSource(ctx, sp, obj, artifact, t.TempDir()) got, err := r.reconcileSource(ctx, sp, obj, artifact, t.TempDir())
if tt.wantErr { if tt.wantErr {
g.Expect(err).To(HaveOccurred()) g.Expect(err).To(HaveOccurred())
@ -2452,22 +2452,22 @@ func TestOCIRepository_reconcileSource_noop(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
beforeFunc func(obj *sourcev1.OCIRepository) beforeFunc func(obj *sourcev1.OCIRepository)
afterFunc func(g *WithT, artifact *sourcev1.Artifact) afterFunc func(g *WithT, artifact *meta.Artifact)
}{ }{
{ {
name: "full reconcile - no existing artifact", name: "full reconcile - no existing artifact",
afterFunc: func(g *WithT, artifact *sourcev1.Artifact) { afterFunc: func(g *WithT, artifact *meta.Artifact) {
g.Expect(artifact.Metadata).ToNot(BeEmpty()) g.Expect(artifact.Metadata).ToNot(BeEmpty())
}, },
}, },
{ {
name: "noop - artifact revisions match", name: "noop - artifact revisions match",
beforeFunc: func(obj *sourcev1.OCIRepository) { beforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Revision: testRevision, Revision: testRevision,
} }
}, },
afterFunc: func(g *WithT, artifact *sourcev1.Artifact) { afterFunc: func(g *WithT, artifact *meta.Artifact) {
g.Expect(artifact.Metadata).To(BeEmpty()) g.Expect(artifact.Metadata).To(BeEmpty())
}, },
}, },
@ -2475,11 +2475,11 @@ func TestOCIRepository_reconcileSource_noop(t *testing.T) {
name: "full reconcile - same rev, unobserved ignore", name: "full reconcile - same rev, unobserved ignore",
beforeFunc: func(obj *sourcev1.OCIRepository) { beforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Status.ObservedIgnore = ptr.To("aaa") obj.Status.ObservedIgnore = ptr.To("aaa")
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Revision: testRevision, Revision: testRevision,
} }
}, },
afterFunc: func(g *WithT, artifact *sourcev1.Artifact) { afterFunc: func(g *WithT, artifact *meta.Artifact) {
g.Expect(artifact.Metadata).ToNot(BeEmpty()) g.Expect(artifact.Metadata).ToNot(BeEmpty())
}, },
}, },
@ -2488,11 +2488,11 @@ func TestOCIRepository_reconcileSource_noop(t *testing.T) {
beforeFunc: func(obj *sourcev1.OCIRepository) { beforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Spec.Ignore = ptr.To("aaa") obj.Spec.Ignore = ptr.To("aaa")
obj.Status.ObservedIgnore = ptr.To("aaa") obj.Status.ObservedIgnore = ptr.To("aaa")
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Revision: testRevision, Revision: testRevision,
} }
}, },
afterFunc: func(g *WithT, artifact *sourcev1.Artifact) { afterFunc: func(g *WithT, artifact *meta.Artifact) {
g.Expect(artifact.Metadata).To(BeEmpty()) g.Expect(artifact.Metadata).To(BeEmpty())
}, },
}, },
@ -2503,11 +2503,11 @@ func TestOCIRepository_reconcileSource_noop(t *testing.T) {
MediaType: "application/vnd.docker.image.rootfs.diff.tar.gzip", MediaType: "application/vnd.docker.image.rootfs.diff.tar.gzip",
Operation: sourcev1.OCILayerCopy, Operation: sourcev1.OCILayerCopy,
} }
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Revision: testRevision, Revision: testRevision,
} }
}, },
afterFunc: func(g *WithT, artifact *sourcev1.Artifact) { afterFunc: func(g *WithT, artifact *meta.Artifact) {
g.Expect(artifact.Metadata).ToNot(BeEmpty()) g.Expect(artifact.Metadata).ToNot(BeEmpty())
}, },
}, },
@ -2522,11 +2522,11 @@ func TestOCIRepository_reconcileSource_noop(t *testing.T) {
MediaType: "application/vnd.docker.image.rootfs.diff.tar.gzip", MediaType: "application/vnd.docker.image.rootfs.diff.tar.gzip",
Operation: sourcev1.OCILayerCopy, Operation: sourcev1.OCILayerCopy,
} }
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Revision: testRevision, Revision: testRevision,
} }
}, },
afterFunc: func(g *WithT, artifact *sourcev1.Artifact) { afterFunc: func(g *WithT, artifact *meta.Artifact) {
g.Expect(artifact.Metadata).To(BeEmpty()) g.Expect(artifact.Metadata).To(BeEmpty())
}, },
}, },
@ -2541,11 +2541,11 @@ func TestOCIRepository_reconcileSource_noop(t *testing.T) {
MediaType: "application/vnd.docker.image.rootfs.diff.tar.gzip", MediaType: "application/vnd.docker.image.rootfs.diff.tar.gzip",
Operation: sourcev1.OCILayerCopy, Operation: sourcev1.OCILayerCopy,
} }
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Revision: testRevision, Revision: testRevision,
} }
}, },
afterFunc: func(g *WithT, artifact *sourcev1.Artifact) { afterFunc: func(g *WithT, artifact *meta.Artifact) {
g.Expect(artifact.Metadata).ToNot(BeEmpty()) g.Expect(artifact.Metadata).ToNot(BeEmpty())
}, },
}, },
@ -2591,7 +2591,7 @@ func TestOCIRepository_reconcileSource_noop(t *testing.T) {
sp := patch.NewSerialPatcher(obj, r.Client) sp := patch.NewSerialPatcher(obj, r.Client)
artifact := &sourcev1.Artifact{} artifact := &meta.Artifact{}
tmpDir := t.TempDir() tmpDir := t.TempDir()
got, err := r.reconcileSource(ctx, sp, obj, artifact, tmpDir) got, err := r.reconcileSource(ctx, sp, obj, artifact, tmpDir)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
@ -2608,11 +2608,11 @@ func TestOCIRepository_reconcileArtifact(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
targetPath string targetPath string
artifact *sourcev1.Artifact artifact *meta.Artifact
beforeFunc func(obj *sourcev1.OCIRepository) beforeFunc func(obj *sourcev1.OCIRepository)
want sreconcile.Result want sreconcile.Result
wantErr bool wantErr bool
assertArtifact *sourcev1.Artifact assertArtifact *meta.Artifact
assertPaths []string assertPaths []string
assertConditions []metav1.Condition assertConditions []metav1.Condition
afterFunc func(g *WithT, obj *sourcev1.OCIRepository) afterFunc func(g *WithT, obj *sourcev1.OCIRepository)
@ -2620,7 +2620,7 @@ func TestOCIRepository_reconcileArtifact(t *testing.T) {
{ {
name: "Archiving Artifact creates correct files and condition", name: "Archiving Artifact creates correct files and condition",
targetPath: "testdata/oci/repository", targetPath: "testdata/oci/repository",
artifact: &sourcev1.Artifact{ artifact: &meta.Artifact{
Revision: "revision", Revision: "revision",
}, },
beforeFunc: func(obj *sourcev1.OCIRepository) { beforeFunc: func(obj *sourcev1.OCIRepository) {
@ -2640,7 +2640,7 @@ func TestOCIRepository_reconcileArtifact(t *testing.T) {
{ {
name: "Artifact with source ignore", name: "Artifact with source ignore",
targetPath: "testdata/oci/repository", targetPath: "testdata/oci/repository",
artifact: &sourcev1.Artifact{Revision: "revision"}, artifact: &meta.Artifact{Revision: "revision"},
beforeFunc: func(obj *sourcev1.OCIRepository) { beforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Spec.Ignore = ptr.To("foo.txt") obj.Spec.Ignore = ptr.To("foo.txt")
}, },
@ -2657,17 +2657,17 @@ func TestOCIRepository_reconcileArtifact(t *testing.T) {
}, },
{ {
name: "No status changes if artifact is already present", name: "No status changes if artifact is already present",
artifact: &sourcev1.Artifact{ artifact: &meta.Artifact{
Revision: "revision", Revision: "revision",
}, },
targetPath: "testdata/oci/repository", targetPath: "testdata/oci/repository",
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
beforeFunc: func(obj *sourcev1.OCIRepository) { beforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Revision: "revision", Revision: "revision",
} }
}, },
assertArtifact: &sourcev1.Artifact{ assertArtifact: &meta.Artifact{
Revision: "revision", Revision: "revision",
}, },
assertConditions: []metav1.Condition{ assertConditions: []metav1.Condition{
@ -2677,11 +2677,11 @@ func TestOCIRepository_reconcileArtifact(t *testing.T) {
{ {
name: "Artifact already present, unobserved ignore, rebuild artifact", name: "Artifact already present, unobserved ignore, rebuild artifact",
targetPath: "testdata/oci/repository", targetPath: "testdata/oci/repository",
artifact: &sourcev1.Artifact{ artifact: &meta.Artifact{
Revision: "revision", Revision: "revision",
}, },
beforeFunc: func(obj *sourcev1.OCIRepository) { beforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "revision"} obj.Status.Artifact = &meta.Artifact{Revision: "revision"}
obj.Spec.Ignore = ptr.To("aaa") obj.Spec.Ignore = ptr.To("aaa")
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
@ -2698,12 +2698,12 @@ func TestOCIRepository_reconcileArtifact(t *testing.T) {
{ {
name: "Artifact already present, unobserved layer selector, rebuild artifact", name: "Artifact already present, unobserved layer selector, rebuild artifact",
targetPath: "testdata/oci/repository", targetPath: "testdata/oci/repository",
artifact: &sourcev1.Artifact{ artifact: &meta.Artifact{
Revision: "revision", Revision: "revision",
}, },
beforeFunc: func(obj *sourcev1.OCIRepository) { beforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Spec.LayerSelector = &sourcev1.OCILayerSelector{MediaType: "foo"} obj.Spec.LayerSelector = &sourcev1.OCILayerSelector{MediaType: "foo"}
obj.Status.Artifact = &sourcev1.Artifact{Revision: "revision"} obj.Status.Artifact = &meta.Artifact{Revision: "revision"}
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
assertPaths: []string{ assertPaths: []string{
@ -2719,7 +2719,7 @@ func TestOCIRepository_reconcileArtifact(t *testing.T) {
{ {
name: "Artifact already present, observed layer selector changed, rebuild artifact", name: "Artifact already present, observed layer selector changed, rebuild artifact",
targetPath: "testdata/oci/repository", targetPath: "testdata/oci/repository",
artifact: &sourcev1.Artifact{ artifact: &meta.Artifact{
Revision: "revision", Revision: "revision",
Path: "foo.txt", Path: "foo.txt",
}, },
@ -2728,7 +2728,7 @@ func TestOCIRepository_reconcileArtifact(t *testing.T) {
MediaType: "foo", MediaType: "foo",
Operation: sourcev1.OCILayerCopy, Operation: sourcev1.OCILayerCopy,
} }
obj.Status.Artifact = &sourcev1.Artifact{Revision: "revision"} obj.Status.Artifact = &meta.Artifact{Revision: "revision"}
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
assertPaths: []string{ assertPaths: []string{
@ -2745,18 +2745,18 @@ func TestOCIRepository_reconcileArtifact(t *testing.T) {
{ {
name: "Artifact already present, observed ignore and layer selector, up-to-date", name: "Artifact already present, observed ignore and layer selector, up-to-date",
targetPath: "testdata/oci/repository", targetPath: "testdata/oci/repository",
artifact: &sourcev1.Artifact{ artifact: &meta.Artifact{
Revision: "revision", Revision: "revision",
}, },
beforeFunc: func(obj *sourcev1.OCIRepository) { beforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Spec.Ignore = ptr.To("aaa") obj.Spec.Ignore = ptr.To("aaa")
obj.Spec.LayerSelector = &sourcev1.OCILayerSelector{MediaType: "foo"} obj.Spec.LayerSelector = &sourcev1.OCILayerSelector{MediaType: "foo"}
obj.Status.Artifact = &sourcev1.Artifact{Revision: "revision"} obj.Status.Artifact = &meta.Artifact{Revision: "revision"}
obj.Status.ObservedIgnore = ptr.To("aaa") obj.Status.ObservedIgnore = ptr.To("aaa")
obj.Status.ObservedLayerSelector = &sourcev1.OCILayerSelector{MediaType: "foo"} obj.Status.ObservedLayerSelector = &sourcev1.OCILayerSelector{MediaType: "foo"}
}, },
want: sreconcile.ResultSuccess, want: sreconcile.ResultSuccess,
assertArtifact: &sourcev1.Artifact{ assertArtifact: &meta.Artifact{
Revision: "revision", Revision: "revision",
}, },
assertConditions: []metav1.Condition{ assertConditions: []metav1.Condition{
@ -2810,7 +2810,7 @@ func TestOCIRepository_reconcileArtifact(t *testing.T) {
tt.beforeFunc(obj) tt.beforeFunc(obj)
} }
artifact := &sourcev1.Artifact{} artifact := &meta.Artifact{}
if tt.artifact != nil { if tt.artifact != nil {
artifact = tt.artifact artifact = tt.artifact
} }
@ -3089,7 +3089,7 @@ func TestOCIRepository_reconcileStorage(t *testing.T) {
want sreconcile.Result want sreconcile.Result
wantErr bool wantErr bool
assertConditions []metav1.Condition assertConditions []metav1.Condition
assertArtifact *sourcev1.Artifact assertArtifact *meta.Artifact
assertPaths []string assertPaths []string
}{ }{
{ {
@ -3099,7 +3099,7 @@ func TestOCIRepository_reconcileStorage(t *testing.T) {
for n := range revisions { for n := range revisions {
v := revisions[n] v := revisions[n]
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/oci-reconcile-storage/%s.txt", v), Path: fmt.Sprintf("/oci-reconcile-storage/%s.txt", v),
Revision: v, Revision: v,
} }
@ -3120,7 +3120,7 @@ func TestOCIRepository_reconcileStorage(t *testing.T) {
conditions.MarkTrue(obj, meta.ReadyCondition, "foo", "bar") conditions.MarkTrue(obj, meta.ReadyCondition, "foo", "bar")
return nil return nil
}, },
assertArtifact: &sourcev1.Artifact{ assertArtifact: &meta.Artifact{
Path: "/oci-reconcile-storage/d.txt", Path: "/oci-reconcile-storage/d.txt",
Revision: "d", Revision: "d",
Digest: "sha256:18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4", Digest: "sha256:18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4",
@ -3149,7 +3149,7 @@ func TestOCIRepository_reconcileStorage(t *testing.T) {
{ {
name: "notices missing artifact in storage", name: "notices missing artifact in storage",
beforeFunc: func(obj *sourcev1.OCIRepository, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.OCIRepository, storage *storage.Storage) error {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "/oci-reconcile-storage/invalid.txt", Path: "/oci-reconcile-storage/invalid.txt",
Revision: "e", Revision: "e",
} }
@ -3170,7 +3170,7 @@ func TestOCIRepository_reconcileStorage(t *testing.T) {
beforeFunc: func(obj *sourcev1.OCIRepository, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.OCIRepository, storage *storage.Storage) error {
f := "empty-digest.txt" f := "empty-digest.txt"
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/oci-reconcile-storage/%s.txt", f), Path: fmt.Sprintf("/oci-reconcile-storage/%s.txt", f),
Revision: "fake", Revision: "fake",
} }
@ -3201,7 +3201,7 @@ func TestOCIRepository_reconcileStorage(t *testing.T) {
beforeFunc: func(obj *sourcev1.OCIRepository, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.OCIRepository, storage *storage.Storage) error {
f := "digest-mismatch.txt" f := "digest-mismatch.txt"
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: fmt.Sprintf("/oci-reconcile-storage/%s.txt", f), Path: fmt.Sprintf("/oci-reconcile-storage/%s.txt", f),
Revision: "fake", Revision: "fake",
} }
@ -3230,7 +3230,7 @@ func TestOCIRepository_reconcileStorage(t *testing.T) {
{ {
name: "updates hostname on diff from current", name: "updates hostname on diff from current",
beforeFunc: func(obj *sourcev1.OCIRepository, storage *storage.Storage) error { beforeFunc: func(obj *sourcev1.OCIRepository, storage *storage.Storage) error {
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Path: "/oci-reconcile-storage/hostname.txt", Path: "/oci-reconcile-storage/hostname.txt",
Revision: "f", Revision: "f",
Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80", Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80",
@ -3249,7 +3249,7 @@ func TestOCIRepository_reconcileStorage(t *testing.T) {
assertPaths: []string{ assertPaths: []string{
"/oci-reconcile-storage/hostname.txt", "/oci-reconcile-storage/hostname.txt",
}, },
assertArtifact: &sourcev1.Artifact{ assertArtifact: &meta.Artifact{
Path: "/oci-reconcile-storage/hostname.txt", Path: "/oci-reconcile-storage/hostname.txt",
Revision: "f", Revision: "f",
Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80", Digest: "sha256:3b9c358f36f0a31b6ad3e14f309c7cf198ac9246e8316f9ce543d5b19ac02b80",
@ -3295,7 +3295,7 @@ func TestOCIRepository_reconcileStorage(t *testing.T) {
sp := patch.NewSerialPatcher(obj, r.Client) sp := patch.NewSerialPatcher(obj, r.Client)
got, err := r.reconcileStorage(ctx, sp, obj, &sourcev1.Artifact{}, "") got, err := r.reconcileStorage(ctx, sp, obj, &meta.Artifact{}, "")
if tt.wantErr { if tt.wantErr {
g.Expect(err).To(HaveOccurred()) g.Expect(err).To(HaveOccurred())
} else { } else {
@ -3382,7 +3382,7 @@ func TestOCIRepositoryReconciler_notify(t *testing.T) {
resErr: nil, resErr: nil,
newObjBeforeFunc: func(obj *sourcev1.OCIRepository) { newObjBeforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Spec.URL = "oci://newurl.io" obj.Spec.URL = "oci://newurl.io"
obj.Status.Artifact = &sourcev1.Artifact{ obj.Status.Artifact = &meta.Artifact{
Revision: "xxx", Revision: "xxx",
Digest: "yyy", Digest: "yyy",
Metadata: map[string]string{ Metadata: map[string]string{
@ -3398,13 +3398,13 @@ func TestOCIRepositoryReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.OCIRepository) { oldObjBeforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.ReadOperationFailedReason, "fail") conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.ReadOperationFailedReason, "fail")
conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo") conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo")
}, },
newObjBeforeFunc: func(obj *sourcev1.OCIRepository) { newObjBeforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Spec.URL = "oci://newurl.io" obj.Spec.URL = "oci://newurl.io"
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
wantEvent: "Normal Succeeded stored artifact with revision 'xxx' from 'oci://newurl.io'", wantEvent: "Normal Succeeded stored artifact with revision 'xxx' from 'oci://newurl.io'",
@ -3414,13 +3414,13 @@ func TestOCIRepositoryReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.OCIRepository) { oldObjBeforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.ReadOperationFailedReason, "fail") conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.ReadOperationFailedReason, "fail")
conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo") conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "foo")
}, },
newObjBeforeFunc: func(obj *sourcev1.OCIRepository) { newObjBeforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Spec.URL = "oci://newurl.io" obj.Spec.URL = "oci://newurl.io"
obj.Status.Artifact = &sourcev1.Artifact{Revision: "aaa", Digest: "bbb"} obj.Status.Artifact = &meta.Artifact{Revision: "aaa", Digest: "bbb"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
wantEvent: "Normal NewArtifact stored artifact with revision 'aaa' from 'oci://newurl.io'", wantEvent: "Normal NewArtifact stored artifact with revision 'aaa' from 'oci://newurl.io'",
@ -3430,11 +3430,11 @@ func TestOCIRepositoryReconciler_notify(t *testing.T) {
res: sreconcile.ResultSuccess, res: sreconcile.ResultSuccess,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.OCIRepository) { oldObjBeforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
newObjBeforeFunc: func(obj *sourcev1.OCIRepository) { newObjBeforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready") conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
}, },
}, },
@ -3443,7 +3443,7 @@ func TestOCIRepositoryReconciler_notify(t *testing.T) {
res: sreconcile.ResultRequeue, res: sreconcile.ResultRequeue,
resErr: nil, resErr: nil,
oldObjBeforeFunc: func(obj *sourcev1.OCIRepository) { oldObjBeforeFunc: func(obj *sourcev1.OCIRepository) {
obj.Status.Artifact = &sourcev1.Artifact{Revision: "xxx", Digest: "yyy"} obj.Status.Artifact = &meta.Artifact{Revision: "xxx", Digest: "yyy"}
conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.URLInvalidReason, "ready") conditions.MarkTrue(obj, sourcev1.FetchFailedCondition, sourcev1.URLInvalidReason, "ready")
}, },
}, },

View File

@ -24,7 +24,7 @@ import (
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
sourcev1 "github.com/fluxcd/source-controller/api/v1" "github.com/fluxcd/pkg/apis/meta"
) )
var ( var (
@ -148,7 +148,7 @@ func SetSuspend(obj runtime.Object, val bool) error {
} }
// GetArtifact returns the status.artifact of a given runtime object. // GetArtifact returns the status.artifact of a given runtime object.
func GetArtifact(obj runtime.Object) (*sourcev1.Artifact, error) { func GetArtifact(obj runtime.Object) (*meta.Artifact, error) {
u, err := toUnstructured(obj) u, err := toUnstructured(obj)
if err != nil { if err != nil {
return nil, err return nil, err
@ -165,7 +165,7 @@ func GetArtifact(obj runtime.Object) (*sourcev1.Artifact, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
outArtifact := &sourcev1.Artifact{} outArtifact := &meta.Artifact{}
if err := json.Unmarshal(enc, outArtifact); err != nil { if err := json.Unmarshal(enc, outArtifact); err != nil {
return nil, err return nil, err
} }

View File

@ -24,6 +24,8 @@ import (
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fluxcd/pkg/apis/meta"
sourcev1 "github.com/fluxcd/source-controller/api/v1" sourcev1 "github.com/fluxcd/source-controller/api/v1"
) )
@ -127,7 +129,7 @@ func TestGetArtifact(t *testing.T) {
g.Expect(artifact).To(BeNil()) g.Expect(artifact).To(BeNil())
// Get set artifact value. // Get set artifact value.
obj.Status.Artifact = &sourcev1.Artifact{Path: "aaa", Revision: "zzz"} obj.Status.Artifact = &meta.Artifact{Path: "aaa", Revision: "zzz"}
artifact, err = GetArtifact(obj) artifact, err = GetArtifact(obj)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
g.Expect(artifact).ToNot(BeNil()) g.Expect(artifact).ToNot(BeNil())

View File

@ -160,7 +160,7 @@ func TestHelmRepositoryOCIMigrationPredicate_Update(t *testing.T) {
Type: sourcev1.HelmRepositoryTypeDefault, Type: sourcev1.HelmRepositoryTypeDefault,
} }
oldObj.Status = sourcev1.HelmRepositoryStatus{ oldObj.Status = sourcev1.HelmRepositoryStatus{
Artifact: &sourcev1.Artifact{}, Artifact: &meta.Artifact{},
URL: "http://some-address", URL: "http://some-address",
ObservedGeneration: 3, ObservedGeneration: 3,
} }

View File

@ -25,12 +25,14 @@ import (
"io/fs" "io/fs"
"net/url" "net/url"
"os" "os"
"path"
"path/filepath" "path/filepath"
"sort" "sort"
"strings" "strings"
"time" "time"
securejoin "github.com/cyphar/filepath-securejoin" securejoin "github.com/cyphar/filepath-securejoin"
"github.com/fluxcd/pkg/apis/meta"
"github.com/go-git/go-git/v5/plumbing/format/gitignore" "github.com/go-git/go-git/v5/plumbing/format/gitignore"
"github.com/opencontainers/go-digest" "github.com/opencontainers/go-digest"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -41,7 +43,6 @@ import (
"github.com/fluxcd/pkg/sourceignore" "github.com/fluxcd/pkg/sourceignore"
pkgtar "github.com/fluxcd/pkg/tar" pkgtar "github.com/fluxcd/pkg/tar"
v1 "github.com/fluxcd/source-controller/api/v1"
intdigest "github.com/fluxcd/source-controller/internal/digest" intdigest "github.com/fluxcd/source-controller/internal/digest"
) )
@ -86,10 +87,10 @@ func New(basePath string, hostname string, artifactRetentionTTL time.Duration, a
}, nil }, nil
} }
// NewArtifactFor returns a new v1.Artifact. // NewArtifactFor returns a new meta.Artifact.
func (s Storage) NewArtifactFor(kind string, metadata metav1.Object, revision, fileName string) v1.Artifact { func (s Storage) NewArtifactFor(kind string, metadata metav1.Object, revision, fileName string) meta.Artifact {
path := v1.ArtifactPath(kind, metadata.GetNamespace(), metadata.GetName(), fileName) path := ArtifactPath(kind, metadata.GetNamespace(), metadata.GetName(), fileName)
artifact := v1.Artifact{ artifact := meta.Artifact{
Path: path, Path: path,
Revision: revision, Revision: revision,
} }
@ -97,8 +98,8 @@ func (s Storage) NewArtifactFor(kind string, metadata metav1.Object, revision, f
return artifact return artifact
} }
// SetArtifactURL sets the URL on the given v1.Artifact. // SetArtifactURL sets the URL on the given meta.Artifact.
func (s Storage) SetArtifactURL(artifact *v1.Artifact) { func (s Storage) SetArtifactURL(artifact *meta.Artifact) {
if artifact.Path == "" { if artifact.Path == "" {
return return
} }
@ -119,19 +120,19 @@ func (s Storage) SetHostname(URL string) string {
return u.String() return u.String()
} }
// MkdirAll calls os.MkdirAll for the given v1.Artifact base dir. // MkdirAll calls os.MkdirAll for the given meta.Artifact base dir.
func (s Storage) MkdirAll(artifact v1.Artifact) error { func (s Storage) MkdirAll(artifact meta.Artifact) error {
dir := filepath.Dir(s.LocalPath(artifact)) dir := filepath.Dir(s.LocalPath(artifact))
return os.MkdirAll(dir, 0o700) return os.MkdirAll(dir, 0o700)
} }
// Remove calls os.Remove for the given v1.Artifact path. // Remove calls os.Remove for the given meta.Artifact path.
func (s Storage) Remove(artifact v1.Artifact) error { func (s Storage) Remove(artifact meta.Artifact) error {
return os.Remove(s.LocalPath(artifact)) return os.Remove(s.LocalPath(artifact))
} }
// RemoveAll calls os.RemoveAll for the given v1.Artifact base dir. // RemoveAll calls os.RemoveAll for the given meta.Artifact base dir.
func (s Storage) RemoveAll(artifact v1.Artifact) (string, error) { func (s Storage) RemoveAll(artifact meta.Artifact) (string, error) {
var deletedDir string var deletedDir string
dir := filepath.Dir(s.LocalPath(artifact)) dir := filepath.Dir(s.LocalPath(artifact))
// Check if the dir exists. // Check if the dir exists.
@ -142,8 +143,8 @@ func (s Storage) RemoveAll(artifact v1.Artifact) (string, error) {
return deletedDir, os.RemoveAll(dir) return deletedDir, os.RemoveAll(dir)
} }
// RemoveAllButCurrent removes all files for the given v1.Artifact base dir, excluding the current one. // RemoveAllButCurrent removes all files for the given meta.Artifact base dir, excluding the current one.
func (s Storage) RemoveAllButCurrent(artifact v1.Artifact) ([]string, error) { func (s Storage) RemoveAllButCurrent(artifact meta.Artifact) ([]string, error) {
deletedFiles := []string{} deletedFiles := []string{}
localPath := s.LocalPath(artifact) localPath := s.LocalPath(artifact)
dir := filepath.Dir(localPath) dir := filepath.Dir(localPath)
@ -176,7 +177,7 @@ func (s Storage) RemoveAllButCurrent(artifact v1.Artifact) ([]string, error) {
// 1. collect all artifact files with an expired ttl // 1. collect all artifact files with an expired ttl
// 2. if we satisfy maxItemsToBeRetained, then return // 2. if we satisfy maxItemsToBeRetained, then return
// 3. else, collect all artifact files till the latest n files remain, where n=maxItemsToBeRetained // 3. else, collect all artifact files till the latest n files remain, where n=maxItemsToBeRetained
func (s Storage) getGarbageFiles(artifact v1.Artifact, totalCountLimit, maxItemsToBeRetained int, ttl time.Duration) (garbageFiles []string, _ error) { func (s Storage) getGarbageFiles(artifact meta.Artifact, totalCountLimit, maxItemsToBeRetained int, ttl time.Duration) (garbageFiles []string, _ error) {
localPath := s.LocalPath(artifact) localPath := s.LocalPath(artifact)
dir := filepath.Dir(localPath) dir := filepath.Dir(localPath)
artifactFilesWithCreatedTs := make(map[time.Time]string) artifactFilesWithCreatedTs := make(map[time.Time]string)
@ -263,7 +264,7 @@ func (s Storage) getGarbageFiles(artifact v1.Artifact, totalCountLimit, maxItems
// GarbageCollect removes all garbage files in the artifact dir according to the provided // GarbageCollect removes all garbage files in the artifact dir according to the provided
// retention options. // retention options.
func (s Storage) GarbageCollect(ctx context.Context, artifact v1.Artifact, timeout time.Duration) ([]string, error) { func (s Storage) GarbageCollect(ctx context.Context, artifact meta.Artifact, timeout time.Duration) ([]string, error) {
delFilesChan := make(chan []string) delFilesChan := make(chan []string)
errChan := make(chan error) errChan := make(chan error)
// Abort if it takes more than the provided timeout duration. // Abort if it takes more than the provided timeout duration.
@ -324,8 +325,8 @@ func stringInSlice(a string, list []string) bool {
return false return false
} }
// ArtifactExist returns a boolean indicating whether the v1.Artifact exists in storage and is a regular file. // ArtifactExist returns a boolean indicating whether the meta.Artifact exists in storage and is a regular file.
func (s Storage) ArtifactExist(artifact v1.Artifact) bool { func (s Storage) ArtifactExist(artifact meta.Artifact) bool {
fi, err := os.Lstat(s.LocalPath(artifact)) fi, err := os.Lstat(s.LocalPath(artifact))
if err != nil { if err != nil {
return false return false
@ -333,10 +334,10 @@ func (s Storage) ArtifactExist(artifact v1.Artifact) bool {
return fi.Mode().IsRegular() return fi.Mode().IsRegular()
} }
// VerifyArtifact verifies if the Digest of the v1.Artifact matches the digest // VerifyArtifact verifies if the Digest of the meta.Artifact matches the digest
// of the file in Storage. It returns an error if the digests don't match, or // of the file in Storage. It returns an error if the digests don't match, or
// if it can't be verified. // if it can't be verified.
func (s Storage) VerifyArtifact(artifact v1.Artifact) error { func (s Storage) VerifyArtifact(artifact meta.Artifact) error {
if artifact.Digest == "" { if artifact.Digest == "" {
return fmt.Errorf("artifact has no digest") return fmt.Errorf("artifact has no digest")
} }
@ -380,11 +381,11 @@ func SourceIgnoreFilter(ps []gitignore.Pattern, domain []string) ArchiveFileFilt
} }
} }
// Archive atomically archives the given directory as a tarball to the given v1.Artifact path, excluding // Archive atomically archives the given directory as a tarball to the given meta.Artifact path, excluding
// directories and any ArchiveFileFilter matches. While archiving, any environment specific data (for example, // directories and any ArchiveFileFilter matches. While archiving, any environment specific data (for example,
// the user and group name) is stripped from file headers. // the user and group name) is stripped from file headers.
// If successful, it sets the digest and last update time on the artifact. // If successful, it sets the digest and last update time on the artifact.
func (s Storage) Archive(artifact *v1.Artifact, dir string, filter ArchiveFileFilter) (err error) { func (s Storage) Archive(artifact *meta.Artifact, dir string, filter ArchiveFileFilter) (err error) {
if f, err := os.Stat(dir); os.IsNotExist(err) || !f.IsDir() { if f, err := os.Stat(dir); os.IsNotExist(err) || !f.IsDir() {
return fmt.Errorf("invalid dir path: %s", dir) return fmt.Errorf("invalid dir path: %s", dir)
} }
@ -491,9 +492,9 @@ func (s Storage) Archive(artifact *v1.Artifact, dir string, filter ArchiveFileFi
return nil return nil
} }
// AtomicWriteFile atomically writes the io.Reader contents to the v1.Artifact path. // AtomicWriteFile atomically writes the io.Reader contents to the meta.Artifact path.
// If successful, it sets the digest and last update time on the artifact. // If successful, it sets the digest and last update time on the artifact.
func (s Storage) AtomicWriteFile(artifact *v1.Artifact, reader io.Reader, mode os.FileMode) (err error) { func (s Storage) AtomicWriteFile(artifact *meta.Artifact, reader io.Reader, mode os.FileMode) (err error) {
localPath := s.LocalPath(*artifact) localPath := s.LocalPath(*artifact)
tf, err := os.CreateTemp(filepath.Split(localPath)) tf, err := os.CreateTemp(filepath.Split(localPath))
if err != nil { if err != nil {
@ -533,9 +534,9 @@ func (s Storage) AtomicWriteFile(artifact *v1.Artifact, reader io.Reader, mode o
return nil return nil
} }
// Copy atomically copies the io.Reader contents to the v1.Artifact path. // Copy atomically copies the io.Reader contents to the meta.Artifact path.
// If successful, it sets the digest and last update time on the artifact. // If successful, it sets the digest and last update time on the artifact.
func (s Storage) Copy(artifact *v1.Artifact, reader io.Reader) (err error) { func (s Storage) Copy(artifact *meta.Artifact, reader io.Reader) (err error) {
localPath := s.LocalPath(*artifact) localPath := s.LocalPath(*artifact)
tf, err := os.CreateTemp(filepath.Split(localPath)) tf, err := os.CreateTemp(filepath.Split(localPath))
if err != nil { if err != nil {
@ -571,9 +572,9 @@ func (s Storage) Copy(artifact *v1.Artifact, reader io.Reader) (err error) {
return nil return nil
} }
// CopyFromPath atomically copies the contents of the given path to the path of the v1.Artifact. // CopyFromPath atomically copies the contents of the given path to the path of the meta.Artifact.
// If successful, the digest and last update time on the artifact is set. // If successful, the digest and last update time on the artifact is set.
func (s Storage) CopyFromPath(artifact *v1.Artifact, path string) (err error) { func (s Storage) CopyFromPath(artifact *meta.Artifact, path string) (err error) {
f, err := os.Open(path) f, err := os.Open(path)
if err != nil { if err != nil {
return err return err
@ -588,7 +589,7 @@ func (s Storage) CopyFromPath(artifact *v1.Artifact, path string) (err error) {
} }
// CopyToPath copies the contents in the (sub)path of the given artifact to the given path. // CopyToPath copies the contents in the (sub)path of the given artifact to the given path.
func (s Storage) CopyToPath(artifact *v1.Artifact, subPath, toPath string) error { func (s Storage) CopyToPath(artifact *meta.Artifact, subPath, toPath string) error {
// create a tmp directory to store artifact // create a tmp directory to store artifact
tmp, err := os.MkdirTemp("", "flux-include-") tmp, err := os.MkdirTemp("", "flux-include-")
if err != nil { if err != nil {
@ -626,8 +627,8 @@ func (s Storage) CopyToPath(artifact *v1.Artifact, subPath, toPath string) error
return nil return nil
} }
// Symlink creates or updates a symbolic link for the given v1.Artifact and returns the URL for the symlink. // Symlink creates or updates a symbolic link for the given meta.Artifact and returns the URL for the symlink.
func (s Storage) Symlink(artifact v1.Artifact, linkName string) (string, error) { func (s Storage) Symlink(artifact meta.Artifact, linkName string) (string, error) {
localPath := s.LocalPath(artifact) localPath := s.LocalPath(artifact)
dir := filepath.Dir(localPath) dir := filepath.Dir(localPath)
link := filepath.Join(dir, linkName) link := filepath.Join(dir, linkName)
@ -648,15 +649,15 @@ func (s Storage) Symlink(artifact v1.Artifact, linkName string) (string, error)
return fmt.Sprintf("http://%s/%s", s.Hostname, filepath.Join(filepath.Dir(artifact.Path), linkName)), nil return fmt.Sprintf("http://%s/%s", s.Hostname, filepath.Join(filepath.Dir(artifact.Path), linkName)), nil
} }
// Lock creates a file lock for the given v1.Artifact. // Lock creates a file lock for the given meta.Artifact.
func (s Storage) Lock(artifact v1.Artifact) (unlock func(), err error) { func (s Storage) Lock(artifact meta.Artifact) (unlock func(), err error) {
lockFile := s.LocalPath(artifact) + ".lock" lockFile := s.LocalPath(artifact) + ".lock"
mutex := lockedfile.MutexAt(lockFile) mutex := lockedfile.MutexAt(lockFile)
return mutex.Lock() return mutex.Lock()
} }
// LocalPath returns the secure local path of the given artifact (that is: relative to the Storage.BasePath). // LocalPath returns the secure local path of the given artifact (that is: relative to the Storage.BasePath).
func (s Storage) LocalPath(artifact v1.Artifact) string { func (s Storage) LocalPath(artifact meta.Artifact) string {
if artifact.Path == "" { if artifact.Path == "" {
return "" return ""
} }
@ -717,3 +718,16 @@ func setDefaultMode(h *tar.Header) {
return return
} }
} }
// ArtifactDir returns the artifact dir path in the form of
// '<kind>/<namespace>/<name>'.
func ArtifactDir(kind, namespace, name string) string {
kind = strings.ToLower(kind)
return path.Join(kind, namespace, name)
}
// ArtifactPath returns the artifact path in the form of
// '<kind>/<namespace>/name>/<filename>'.
func ArtifactPath(kind, namespace, name, filename string) string {
return path.Join(ArtifactDir(kind, namespace, name), filename)
}

View File

@ -34,7 +34,7 @@ import (
"github.com/go-git/go-git/v5/plumbing/format/gitignore" "github.com/go-git/go-git/v5/plumbing/format/gitignore"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
sourcev1 "github.com/fluxcd/source-controller/api/v1" "github.com/fluxcd/pkg/apis/meta"
) )
func TestStorageConstructor(t *testing.T) { func TestStorageConstructor(t *testing.T) {
@ -141,7 +141,7 @@ func TestStorage_Archive(t *testing.T) {
return return
} }
matchFiles := func(t *testing.T, storage *Storage, artifact sourcev1.Artifact, files map[string]dummyFile, dirs []string) { matchFiles := func(t *testing.T, storage *Storage, artifact meta.Artifact, files map[string]dummyFile, dirs []string) {
t.Helper() t.Helper()
for name, df := range files { for name, df := range files {
mustExist := !(name[0:1] == "!") mustExist := !(name[0:1] == "!")
@ -289,7 +289,7 @@ func TestStorage_Archive(t *testing.T) {
return return
} }
defer os.RemoveAll(dir) defer os.RemoveAll(dir)
artifact := sourcev1.Artifact{ artifact := meta.Artifact{
Path: filepath.Join(randStringRunes(10), randStringRunes(10), randStringRunes(10)+".tar.gz"), Path: filepath.Join(randStringRunes(10), randStringRunes(10), randStringRunes(10)+".tar.gz"),
} }
if err := storage.MkdirAll(artifact); err != nil { if err := storage.MkdirAll(artifact); err != nil {
@ -312,7 +312,7 @@ func TestStorage_Remove(t *testing.T) {
s, err := New(dir, "", 0, 0) s, err := New(dir, "", 0, 0)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
artifact := sourcev1.Artifact{ artifact := meta.Artifact{
Path: filepath.Join(dir, "test.txt"), Path: filepath.Join(dir, "test.txt"),
} }
g.Expect(s.MkdirAll(artifact)).To(Succeed()) g.Expect(s.MkdirAll(artifact)).To(Succeed())
@ -331,7 +331,7 @@ func TestStorage_Remove(t *testing.T) {
s, err := New(dir, "", 0, 0) s, err := New(dir, "", 0, 0)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
artifact := sourcev1.Artifact{ artifact := meta.Artifact{
Path: filepath.Join(dir, "test.txt"), Path: filepath.Join(dir, "test.txt"),
} }
@ -350,7 +350,7 @@ func TestStorageRemoveAllButCurrent(t *testing.T) {
t.Fatalf("Valid path did not successfully return: %v", err) t.Fatalf("Valid path did not successfully return: %v", err)
} }
if _, err := s.RemoveAllButCurrent(sourcev1.Artifact{Path: filepath.Join(dir, "really", "nonexistent")}); err == nil { if _, err := s.RemoveAllButCurrent(meta.Artifact{Path: filepath.Join(dir, "really", "nonexistent")}); err == nil {
t.Fatal("Did not error while pruning non-existent path") t.Fatal("Did not error while pruning non-existent path")
} }
}) })
@ -362,7 +362,7 @@ func TestStorageRemoveAllButCurrent(t *testing.T) {
s, err := New(dir, "hostname", time.Minute, 2) s, err := New(dir, "hostname", time.Minute, 2)
g.Expect(err).ToNot(HaveOccurred(), "failed to create new storage") g.Expect(err).ToNot(HaveOccurred(), "failed to create new storage")
artifact := sourcev1.Artifact{ artifact := meta.Artifact{
Path: filepath.Join("foo", "bar", "artifact1.tar.gz"), Path: filepath.Join("foo", "bar", "artifact1.tar.gz"),
} }
@ -423,7 +423,7 @@ func TestStorageRemoveAll(t *testing.T) {
s, err := New(dir, "hostname", time.Minute, 2) s, err := New(dir, "hostname", time.Minute, 2)
g.Expect(err).ToNot(HaveOccurred(), "failed to create new storage") g.Expect(err).ToNot(HaveOccurred(), "failed to create new storage")
artifact := sourcev1.Artifact{ artifact := meta.Artifact{
Path: tt.artifactPath, Path: tt.artifactPath,
} }
@ -469,7 +469,7 @@ func TestStorageCopyFromPath(t *testing.T) {
return return
} }
matchFile := func(t *testing.T, storage *Storage, artifact sourcev1.Artifact, file *File, expectMismatch bool) { matchFile := func(t *testing.T, storage *Storage, artifact meta.Artifact, file *File, expectMismatch bool) {
c, err := os.ReadFile(storage.LocalPath(artifact)) c, err := os.ReadFile(storage.LocalPath(artifact))
if err != nil { if err != nil {
t.Fatalf("failed reading file: %v", err) t.Fatalf("failed reading file: %v", err)
@ -516,7 +516,7 @@ func TestStorageCopyFromPath(t *testing.T) {
t.Error(err) t.Error(err)
return return
} }
artifact := sourcev1.Artifact{ artifact := meta.Artifact{
Path: filepath.Join(randStringRunes(10), randStringRunes(10), randStringRunes(10)), Path: filepath.Join(randStringRunes(10), randStringRunes(10), randStringRunes(10)),
} }
if err := storage.MkdirAll(artifact); err != nil { if err := storage.MkdirAll(artifact); err != nil {
@ -669,7 +669,7 @@ func TestStorage_getGarbageFiles(t *testing.T) {
s, err := New(dir, "hostname", tt.ttl, tt.maxItemsToBeRetained) s, err := New(dir, "hostname", tt.ttl, tt.maxItemsToBeRetained)
g.Expect(err).ToNot(HaveOccurred(), "failed to create new storage") g.Expect(err).ToNot(HaveOccurred(), "failed to create new storage")
artifact := sourcev1.Artifact{ artifact := meta.Artifact{
Path: tt.artifactPaths[len(tt.artifactPaths)-1], Path: tt.artifactPaths[len(tt.artifactPaths)-1],
} }
g.Expect(os.MkdirAll(filepath.Join(dir, artifactFolder), 0o750)).ToNot(HaveOccurred()) g.Expect(os.MkdirAll(filepath.Join(dir, artifactFolder), 0o750)).ToNot(HaveOccurred())
@ -752,7 +752,7 @@ func TestStorage_GarbageCollect(t *testing.T) {
s, err := New(dir, "hostname", time.Second*2, 2) s, err := New(dir, "hostname", time.Second*2, 2)
g.Expect(err).ToNot(HaveOccurred(), "failed to create new storage") g.Expect(err).ToNot(HaveOccurred(), "failed to create new storage")
artifact := sourcev1.Artifact{ artifact := meta.Artifact{
Path: tt.artifactPaths[len(tt.artifactPaths)-1], Path: tt.artifactPaths[len(tt.artifactPaths)-1],
} }
g.Expect(os.MkdirAll(filepath.Join(dir, artifactFolder), 0o750)).ToNot(HaveOccurred()) g.Expect(os.MkdirAll(filepath.Join(dir, artifactFolder), 0o750)).ToNot(HaveOccurred())
@ -807,7 +807,7 @@ func TestStorage_VerifyArtifact(t *testing.T) {
t.Run("artifact without digest", func(t *testing.T) { t.Run("artifact without digest", func(t *testing.T) {
g := NewWithT(t) g := NewWithT(t)
err := s.VerifyArtifact(sourcev1.Artifact{}) err := s.VerifyArtifact(meta.Artifact{})
g.Expect(err).To(HaveOccurred()) g.Expect(err).To(HaveOccurred())
g.Expect(err).To(MatchError("artifact has no digest")) g.Expect(err).To(MatchError("artifact has no digest"))
}) })
@ -815,7 +815,7 @@ func TestStorage_VerifyArtifact(t *testing.T) {
t.Run("artifact with invalid digest", func(t *testing.T) { t.Run("artifact with invalid digest", func(t *testing.T) {
g := NewWithT(t) g := NewWithT(t)
err := s.VerifyArtifact(sourcev1.Artifact{Digest: "invalid"}) err := s.VerifyArtifact(meta.Artifact{Digest: "invalid"})
g.Expect(err).To(HaveOccurred()) g.Expect(err).To(HaveOccurred())
g.Expect(err).To(MatchError("failed to parse artifact digest 'invalid': invalid checksum digest format")) g.Expect(err).To(MatchError("failed to parse artifact digest 'invalid': invalid checksum digest format"))
}) })
@ -823,7 +823,7 @@ func TestStorage_VerifyArtifact(t *testing.T) {
t.Run("artifact with invalid path", func(t *testing.T) { t.Run("artifact with invalid path", func(t *testing.T) {
g := NewWithT(t) g := NewWithT(t)
err := s.VerifyArtifact(sourcev1.Artifact{ err := s.VerifyArtifact(meta.Artifact{
Digest: "sha256:9ba7a35ce8acd3557fe30680ef193ca7a36bb5dc62788f30de7122a0a5beab69", Digest: "sha256:9ba7a35ce8acd3557fe30680ef193ca7a36bb5dc62788f30de7122a0a5beab69",
Path: "invalid", Path: "invalid",
}) })
@ -834,7 +834,7 @@ func TestStorage_VerifyArtifact(t *testing.T) {
t.Run("artifact with digest mismatch", func(t *testing.T) { t.Run("artifact with digest mismatch", func(t *testing.T) {
g := NewWithT(t) g := NewWithT(t)
err := s.VerifyArtifact(sourcev1.Artifact{ err := s.VerifyArtifact(meta.Artifact{
Digest: "sha256:9ba7a35ce8acd3557fe30680ef193ca7a36bb5dc62788f30de7122a0a5beab69", Digest: "sha256:9ba7a35ce8acd3557fe30680ef193ca7a36bb5dc62788f30de7122a0a5beab69",
Path: "artifact", Path: "artifact",
}) })
@ -845,7 +845,7 @@ func TestStorage_VerifyArtifact(t *testing.T) {
t.Run("artifact with digest match", func(t *testing.T) { t.Run("artifact with digest match", func(t *testing.T) {
g := NewWithT(t) g := NewWithT(t)
err := s.VerifyArtifact(sourcev1.Artifact{ err := s.VerifyArtifact(meta.Artifact{
Digest: "sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", Digest: "sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
Path: "artifact", Path: "artifact",
}) })