Skip to content

Commit 15b4f96

Browse files
committed
internal/object: setter/getter suspend & artifact
Add setters and getters for spec.suspend and status.artifact. This is needed for writing generic tests for any source kind. Signed-off-by: Sunny <[email protected]>
1 parent 663b6a7 commit 15b4f96

File tree

2 files changed

+107
-0
lines changed

2 files changed

+107
-0
lines changed

internal/object/object.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@ limitations under the License.
1717
package object
1818

1919
import (
20+
"encoding/json"
2021
"errors"
2122
"time"
2223

2324
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2425
"k8s.io/apimachinery/pkg/runtime"
26+
27+
sourcev1 "github.com/fluxcd/source-controller/api/v1beta2"
2528
)
2629

2730
var (
@@ -112,3 +115,59 @@ func GetRequeueInterval(obj runtime.Object) (time.Duration, error) {
112115
}
113116
return time.ParseDuration(interval)
114117
}
118+
119+
// GetSuspend returns the spec.suspend of a given runtime object.
120+
func GetSuspend(obj runtime.Object) (bool, error) {
121+
u, err := toUnstructured(obj)
122+
if err != nil {
123+
return false, err
124+
}
125+
suspend, found, err := unstructured.NestedBool(u.Object, "spec", "suspend")
126+
if err != nil {
127+
return false, err
128+
}
129+
// Since suspend is an optional field, it's false when not found.
130+
if !found {
131+
return false, nil
132+
}
133+
return suspend, nil
134+
}
135+
136+
// SetSuspend sets the spec.suspend value of a given runtime object.
137+
func SetSuspend(obj runtime.Object, val bool) error {
138+
content, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)
139+
if err != nil {
140+
return err
141+
}
142+
u := unstructured.Unstructured{}
143+
u.SetUnstructuredContent(content)
144+
if err := unstructured.SetNestedField(u.Object, val, "spec", "suspend"); err != nil {
145+
return err
146+
}
147+
return runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, obj)
148+
}
149+
150+
// GetArtifact returns the status.artifact of a given runtime object.
151+
func GetArtifact(obj runtime.Object) (*sourcev1.Artifact, error) {
152+
u, err := toUnstructured(obj)
153+
if err != nil {
154+
return nil, err
155+
}
156+
artifact, found, err := unstructured.NestedFieldNoCopy(u.Object, "status", "artifact")
157+
if err != nil {
158+
return nil, err
159+
}
160+
// Since artifact is an optional field, return nil when not found.
161+
if !found {
162+
return nil, nil
163+
}
164+
enc, err := json.Marshal(artifact)
165+
if err != nil {
166+
return nil, err
167+
}
168+
outArtifact := &sourcev1.Artifact{}
169+
if err := json.Unmarshal(enc, outArtifact); err != nil {
170+
return nil, err
171+
}
172+
return outArtifact, nil
173+
}

internal/object/object_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,51 @@ func TestGetRequeueInterval(t *testing.T) {
8686
_, err = GetRequeueInterval(obj2)
8787
g.Expect(err).To(Equal(ErrRequeueIntervalNotFound))
8888
}
89+
90+
func TestGetSuspend(t *testing.T) {
91+
g := NewWithT(t)
92+
93+
// Get unset suspend value.
94+
obj := &sourcev1.GitRepository{}
95+
suspend, err := GetSuspend(obj)
96+
g.Expect(err).ToNot(HaveOccurred())
97+
g.Expect(suspend).To(BeFalse())
98+
99+
// Get set suspend value.
100+
obj.Spec.Suspend = true
101+
suspend, err = GetSuspend(obj)
102+
g.Expect(err).ToNot(HaveOccurred())
103+
g.Expect(suspend).To(BeTrue())
104+
}
105+
106+
func TestSetSuspend(t *testing.T) {
107+
g := NewWithT(t)
108+
109+
obj := &sourcev1.GitRepository{}
110+
err := SetSuspend(obj, true)
111+
g.Expect(err).ToNot(HaveOccurred())
112+
g.Expect(obj.Spec.Suspend).To(BeTrue())
113+
114+
// Overwrite previous value.
115+
err = SetSuspend(obj, false)
116+
g.Expect(err).ToNot(HaveOccurred())
117+
g.Expect(obj.Spec.Suspend).To(BeFalse())
118+
}
119+
120+
func TestGetArtifact(t *testing.T) {
121+
g := NewWithT(t)
122+
123+
// Get unset artifact value.
124+
obj := &sourcev1.GitRepository{}
125+
artifact, err := GetArtifact(obj)
126+
g.Expect(err).ToNot(HaveOccurred())
127+
g.Expect(artifact).To(BeNil())
128+
129+
// Get set artifact value.
130+
obj.Status.Artifact = &sourcev1.Artifact{Path: "aaa", Revision: "zzz"}
131+
artifact, err = GetArtifact(obj)
132+
g.Expect(err).ToNot(HaveOccurred())
133+
g.Expect(artifact).ToNot(BeNil())
134+
g.Expect(artifact.Path).To(Equal("aaa"))
135+
g.Expect(artifact.Revision).To(Equal("zzz"))
136+
}

0 commit comments

Comments
 (0)