Skip to content

Commit 17a150b

Browse files
committed
Run go fmt
1 parent edce8fb commit 17a150b

2 files changed

Lines changed: 192 additions & 6 deletions

File tree

pkg/cli/admin/release/info.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2738,12 +2738,12 @@ type ChangeLog struct {
27382738
From ChangeLogReleaseInfo `json:"from"`
27392739
To ChangeLogReleaseInfo `json:"to"`
27402740

2741-
Components []ChangeLogComponentInfo `json:"components,omitempty"`
2742-
FeatureGates []ChangeLogFeatureGateInfo `json:"featureGates,omitempty"`
2743-
NewImages []ChangeLogImageInfo `json:"newImages,omitempty"`
2744-
RemovedImages []ChangeLogImageInfo `json:"removedImages,omitempty"`
2745-
RebuiltImages []ChangeLogImageInfo `json:"rebuiltImages,omitempty"`
2746-
UpdatedImages []ChangeLogImageInfo `json:"updatedImages,omitempty"`
2741+
Components []ChangeLogComponentInfo `json:"components,omitempty"`
2742+
FeatureGates []ChangeLogFeatureGateInfo `json:"featureGates,omitempty"`
2743+
NewImages []ChangeLogImageInfo `json:"newImages,omitempty"`
2744+
RemovedImages []ChangeLogImageInfo `json:"removedImages,omitempty"`
2745+
RebuiltImages []ChangeLogImageInfo `json:"rebuiltImages,omitempty"`
2746+
UpdatedImages []ChangeLogImageInfo `json:"updatedImages,omitempty"`
27472747
}
27482748

27492749
// ChangeLogFeatureGateInfo describes the state of a feature gate across cluster profiles and feature sets.
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
package release
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"testing"
7+
8+
digest "github.com/opencontainers/go-digest"
9+
imageapi "github.com/openshift/api/image/v1"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
)
12+
13+
func featureGateManifest(clusterProfile, featureSet string, enabled, disabled []string) []byte {
14+
enabledItems := ""
15+
for _, fg := range enabled {
16+
enabledItems += ` - name: ` + fg + "\n"
17+
}
18+
disabledItems := ""
19+
for _, fg := range disabled {
20+
disabledItems += ` - name: ` + fg + "\n"
21+
}
22+
featureSetField := ""
23+
if featureSet != "" && featureSet != "Default" {
24+
featureSetField = " featureSet: " + featureSet + "\n"
25+
}
26+
annotations := ""
27+
if clusterProfile != "" {
28+
annotations = ` annotations:
29+
include.release.openshift.io/` + clusterProfile + `: "true"
30+
`
31+
}
32+
return []byte(`apiVersion: config.openshift.io/v1
33+
kind: FeatureGate
34+
metadata:
35+
name: cluster
36+
` + annotations + `spec:
37+
` + featureSetField + `status:
38+
featureGates:
39+
- version: "4.22"
40+
enabled:
41+
` + enabledItems + ` disabled:
42+
` + disabledItems)
43+
}
44+
45+
func TestDescribeChangelogFeatureGatesJSON(t *testing.T) {
46+
fromManifest := featureGateManifest(
47+
"self-managed-high-availability",
48+
"",
49+
[]string{"ExistingEnabled"},
50+
[]string{"ExistingDisabled", "WillBeEnabled"},
51+
)
52+
toManifest := featureGateManifest(
53+
"self-managed-high-availability",
54+
"",
55+
[]string{"ExistingEnabled", "WillBeEnabled"},
56+
[]string{"ExistingDisabled"},
57+
)
58+
59+
fromDigest := digest.FromString("from")
60+
toDigest := digest.FromString("to")
61+
62+
diff := &ReleaseDiff{
63+
From: &ReleaseInfo{
64+
Digest: fromDigest,
65+
References: &imageapi.ImageStream{
66+
ObjectMeta: metav1.ObjectMeta{
67+
CreationTimestamp: metav1.Now(),
68+
},
69+
Spec: imageapi.ImageStreamSpec{
70+
Tags: []imageapi.TagReference{{Name: "from-tag"}},
71+
},
72+
},
73+
ManifestFiles: map[string][]byte{
74+
"0000_50_cluster-config-api_featureGate-Default-SelfManagedHA.yaml": fromManifest,
75+
},
76+
ComponentVersions: ComponentVersions{},
77+
},
78+
To: &ReleaseInfo{
79+
Digest: toDigest,
80+
References: &imageapi.ImageStream{
81+
ObjectMeta: metav1.ObjectMeta{
82+
CreationTimestamp: metav1.Now(),
83+
},
84+
Spec: imageapi.ImageStreamSpec{
85+
Tags: []imageapi.TagReference{{Name: "to-tag"}},
86+
},
87+
},
88+
ManifestFiles: map[string][]byte{
89+
"0000_50_cluster-config-api_featureGate-Default-SelfManagedHA.yaml": toManifest,
90+
},
91+
ComponentVersions: ComponentVersions{},
92+
},
93+
ChangedImages: map[string]*ImageReferenceDiff{},
94+
ChangedManifests: map[string]*ReleaseManifestDiff{},
95+
}
96+
97+
out := &bytes.Buffer{}
98+
errOut := &bytes.Buffer{}
99+
err := describeChangelog(out, errOut, &ReleaseInfo{}, diff, "", "json")
100+
if err != nil {
101+
t.Fatalf("unexpected error: %v\nstderr: %s", err, errOut.String())
102+
}
103+
104+
var changeLog ChangeLog
105+
if err := json.Unmarshal(out.Bytes(), &changeLog); err != nil {
106+
t.Fatalf("failed to unmarshal JSON output: %v\noutput: %s", err, out.String())
107+
}
108+
109+
if len(changeLog.FeatureGates) == 0 {
110+
t.Fatal("expected featureGates in JSON output, got none")
111+
}
112+
113+
// WillBeEnabled changed from Disabled to Enabled
114+
found := false
115+
for _, fg := range changeLog.FeatureGates {
116+
if fg.Name == "WillBeEnabled" {
117+
found = true
118+
status, ok := fg.Status["SelfManagedHA"]
119+
if !ok {
120+
t.Fatalf("expected SelfManagedHA cluster profile, got: %v", fg.Status)
121+
}
122+
defaultStatus, ok := status["Default"]
123+
if !ok {
124+
t.Fatalf("expected Default feature set, got: %v", status)
125+
}
126+
if defaultStatus != "Enabled (Changed)" {
127+
t.Errorf("expected 'Enabled (Changed)' for WillBeEnabled, got %q", defaultStatus)
128+
}
129+
}
130+
}
131+
if !found {
132+
t.Errorf("expected WillBeEnabled in feature gates, got: %v", changeLog.FeatureGates)
133+
}
134+
}
135+
136+
func TestDescribeChangelogNoFeatureGatesJSON(t *testing.T) {
137+
fromDigest := digest.FromString("from")
138+
toDigest := digest.FromString("to")
139+
140+
diff := &ReleaseDiff{
141+
From: &ReleaseInfo{
142+
Digest: fromDigest,
143+
References: &imageapi.ImageStream{
144+
ObjectMeta: metav1.ObjectMeta{
145+
CreationTimestamp: metav1.Now(),
146+
},
147+
Spec: imageapi.ImageStreamSpec{
148+
Tags: []imageapi.TagReference{{Name: "from-tag"}},
149+
},
150+
},
151+
ManifestFiles: map[string][]byte{},
152+
ComponentVersions: ComponentVersions{},
153+
},
154+
To: &ReleaseInfo{
155+
Digest: toDigest,
156+
References: &imageapi.ImageStream{
157+
ObjectMeta: metav1.ObjectMeta{
158+
CreationTimestamp: metav1.Now(),
159+
},
160+
Spec: imageapi.ImageStreamSpec{
161+
Tags: []imageapi.TagReference{{Name: "to-tag"}},
162+
},
163+
},
164+
ManifestFiles: map[string][]byte{},
165+
ComponentVersions: ComponentVersions{},
166+
},
167+
ChangedImages: map[string]*ImageReferenceDiff{},
168+
ChangedManifests: map[string]*ReleaseManifestDiff{},
169+
}
170+
171+
out := &bytes.Buffer{}
172+
errOut := &bytes.Buffer{}
173+
err := describeChangelog(out, errOut, &ReleaseInfo{}, diff, "", "json")
174+
if err != nil {
175+
t.Fatalf("unexpected error: %v", err)
176+
}
177+
178+
var changeLog ChangeLog
179+
if err := json.Unmarshal(out.Bytes(), &changeLog); err != nil {
180+
t.Fatalf("failed to unmarshal JSON output: %v", err)
181+
}
182+
183+
if len(changeLog.FeatureGates) != 0 {
184+
t.Errorf("expected no featureGates when no manifests present, got %d", len(changeLog.FeatureGates))
185+
}
186+
}

0 commit comments

Comments
 (0)