Skip to content

Commit ac8191c

Browse files
committed
inject ClusterInfo into ClusterImageSet asset
1 parent f715dfa commit ac8191c

File tree

3 files changed

+96
-23
lines changed

3 files changed

+96
-23
lines changed

pkg/asset/agent/joiner/clusterinfo.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import (
2222
// are inspected to extract the required configuration
2323
type ClusterInfo struct {
2424
ClusterID string
25+
Version string
26+
ReleaseImage string
2527
APIDNSName string
2628
PullSecret string
2729
Namespace string
@@ -69,7 +71,7 @@ func (ci *ClusterInfo) Generate(dependencies asset.Parents) error {
6971
if err != nil {
7072
return err
7173
}
72-
err = ci.retrieveClusterID(clientset)
74+
err = ci.retrieveClusterData(clientset)
7375
if err != nil {
7476
return err
7577
}
@@ -113,12 +115,14 @@ func (ci *ClusterInfo) getRestConfig(kubeconfig string) (*rest.Config, error) {
113115
return config, err
114116
}
115117

116-
func (ci *ClusterInfo) retrieveClusterID(clientset *configclient.Clientset) error {
118+
func (ci *ClusterInfo) retrieveClusterData(clientset *configclient.Clientset) error {
117119
cv, err := clientset.ConfigV1().ClusterVersions().Get(context.Background(), "version", metav1.GetOptions{})
118120
if err != nil {
119121
return err
120122
}
121123
ci.ClusterID = string(cv.Spec.ClusterID)
124+
ci.ReleaseImage = cv.Status.History[0].Image
125+
ci.Version = cv.Status.History[0].Version
122126

123127
return nil
124128
}

pkg/asset/agent/manifests/clusterimageset.go

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import (
1313
hivev1 "github.com/openshift/hive/apis/hive/v1"
1414
"github.com/openshift/installer/pkg/asset"
1515
"github.com/openshift/installer/pkg/asset/agent"
16+
"github.com/openshift/installer/pkg/asset/agent/joiner"
17+
"github.com/openshift/installer/pkg/asset/agent/workflow"
1618
"github.com/openshift/installer/pkg/asset/releaseimage"
1719
"github.com/openshift/installer/pkg/version"
1820
)
@@ -38,50 +40,69 @@ func (*ClusterImageSet) Name() string {
3840
// the asset.
3941
func (*ClusterImageSet) Dependencies() []asset.Asset {
4042
return []asset.Asset{
43+
&workflow.AgentWorkflow{},
44+
&joiner.ClusterInfo{},
4145
&releaseimage.Image{},
4246
&agent.OptionalInstallConfig{},
4347
}
4448
}
4549

4650
// Generate generates the ClusterImageSet manifest.
4751
func (a *ClusterImageSet) Generate(dependencies asset.Parents) error {
48-
52+
agentWorkflow := &workflow.AgentWorkflow{}
53+
clusterInfo := &joiner.ClusterInfo{}
4954
releaseImage := &releaseimage.Image{}
5055
installConfig := &agent.OptionalInstallConfig{}
51-
dependencies.Get(releaseImage, installConfig)
56+
dependencies.Get(releaseImage, installConfig, agentWorkflow, clusterInfo)
5257

53-
currentVersion, err := version.Version()
54-
if err != nil {
55-
return err
58+
switch agentWorkflow.Workflow {
59+
case workflow.AgentWorkflowTypeInstall:
60+
currentVersion, err := version.Version()
61+
if err != nil {
62+
return err
63+
}
64+
65+
clusterNamespace := ""
66+
if installConfig.Config != nil {
67+
clusterNamespace = installConfig.ClusterNamespace()
68+
}
69+
err = a.generateManifest(currentVersion, releaseImage.PullSpec, clusterNamespace)
70+
if err != nil {
71+
return err
72+
}
73+
case workflow.AgentWorkflowTypeAddNodes:
74+
return a.generateManifest(clusterInfo.Version, clusterInfo.ReleaseImage, clusterInfo.Namespace)
75+
76+
default:
77+
return fmt.Errorf("AgentWorkflowType value not supported: %s", agentWorkflow.Workflow)
5678
}
5779

80+
return a.finish(agentWorkflow.Workflow)
81+
}
82+
83+
func (a *ClusterImageSet) generateManifest(version, releaseImage, clusterNamespace string) error {
5884
clusterImageSet := &hivev1.ClusterImageSet{
5985
ObjectMeta: metav1.ObjectMeta{
60-
Name: fmt.Sprintf("openshift-%s", currentVersion),
86+
Name: fmt.Sprintf("openshift-%s", version),
87+
Namespace: clusterNamespace,
6188
},
6289
Spec: hivev1.ClusterImageSetSpec{
63-
ReleaseImage: releaseImage.PullSpec,
90+
ReleaseImage: releaseImage,
6491
},
6592
}
6693

67-
if installConfig.Config != nil {
68-
clusterImageSet.ObjectMeta.Namespace = installConfig.ClusterNamespace()
69-
70-
}
71-
72-
a.Config = clusterImageSet
73-
7494
configData, err := yaml.Marshal(clusterImageSet)
7595
if err != nil {
7696
return errors.Wrap(err, "failed to marshal agent cluster image set")
7797
}
7898

99+
a.Config = clusterImageSet
79100
a.File = &asset.File{
80101
Filename: clusterImageSetFilename,
81102
Data: configData,
82103
}
83104

84-
return a.finish()
105+
return nil
85106
}
86107

87108
// Files returns the files generated by the asset.
@@ -95,6 +116,12 @@ func (a *ClusterImageSet) Files() []*asset.File {
95116
// Load returns ClusterImageSet asset from the disk.
96117
func (a *ClusterImageSet) Load(f asset.FileFetcher) (bool, error) {
97118

119+
agentWorkflow := &workflow.AgentWorkflow{}
120+
_, err := agentWorkflow.Load(f)
121+
if err != nil {
122+
return false, err
123+
}
124+
98125
clusterImageSetFile, err := f.FetchByName(clusterImageSetFilename)
99126
if err != nil {
100127
if os.IsNotExist(err) {
@@ -112,36 +139,41 @@ func (a *ClusterImageSet) Load(f asset.FileFetcher) (bool, error) {
112139
}
113140
a.Config = clusterImageSet
114141

115-
if err = a.finish(); err != nil {
142+
if err = a.finish(agentWorkflow.Workflow); err != nil {
116143
return false, err
117144
}
118145
return true, nil
119146
}
120147

121-
func (a *ClusterImageSet) finish() error {
148+
func (a *ClusterImageSet) finish(workflowType workflow.AgentWorkflowType) error {
122149

123150
if a.Config == nil {
124151
return errors.New("missing configuration or manifest file")
125152
}
126153

127-
if err := a.validateClusterImageSet().ToAggregate(); err != nil {
154+
if err := a.validateClusterImageSet(workflowType).ToAggregate(); err != nil {
128155
return errors.Wrapf(err, "invalid ClusterImageSet configuration")
129156
}
130157

131158
return nil
132159
}
133160

134-
func (a *ClusterImageSet) validateClusterImageSet() field.ErrorList {
161+
func (a *ClusterImageSet) validateClusterImageSet(workflowType workflow.AgentWorkflowType) field.ErrorList {
135162
allErrs := field.ErrorList{}
136163

137-
if err := a.validateReleaseVersion(); err != nil {
164+
if err := a.validateReleaseVersion(workflowType); err != nil {
138165
allErrs = append(allErrs, err...)
139166
}
140167

141168
return allErrs
142169
}
143170

144-
func (a *ClusterImageSet) validateReleaseVersion() field.ErrorList {
171+
func (a *ClusterImageSet) validateReleaseVersion(workflowType workflow.AgentWorkflowType) field.ErrorList {
172+
173+
// skip release version check in case of add nodes workflow
174+
if workflowType == workflow.AgentWorkflowTypeAddNodes {
175+
return nil
176+
}
145177

146178
var allErrs field.ErrorList
147179

pkg/asset/agent/manifests/clusterimageset_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import (
1414
hivev1 "github.com/openshift/hive/apis/hive/v1"
1515
"github.com/openshift/installer/pkg/asset"
1616
"github.com/openshift/installer/pkg/asset/agent"
17+
"github.com/openshift/installer/pkg/asset/agent/joiner"
18+
"github.com/openshift/installer/pkg/asset/agent/workflow"
1719
"github.com/openshift/installer/pkg/asset/mock"
1820
"github.com/openshift/installer/pkg/asset/releaseimage"
1921
)
@@ -31,6 +33,8 @@ func TestClusterImageSet_Generate(t *testing.T) {
3133
{
3234
name: "missing install config should still generate a ClusterImageSet with empty namespace",
3335
dependencies: []asset.Asset{
36+
&workflow.AgentWorkflow{Workflow: workflow.AgentWorkflowTypeInstall},
37+
&joiner.ClusterInfo{},
3438
&agent.OptionalInstallConfig{},
3539
&releaseimage.Image{
3640
PullSpec: currentRelease,
@@ -48,6 +52,8 @@ func TestClusterImageSet_Generate(t *testing.T) {
4852
{
4953
name: "invalid ClusterImageSet configuration",
5054
dependencies: []asset.Asset{
55+
&workflow.AgentWorkflow{Workflow: workflow.AgentWorkflowTypeInstall},
56+
&joiner.ClusterInfo{},
5157
getValidOptionalInstallConfig(),
5258
&releaseimage.Image{},
5359
},
@@ -56,6 +62,8 @@ func TestClusterImageSet_Generate(t *testing.T) {
5662
{
5763
name: "valid configuration",
5864
dependencies: []asset.Asset{
65+
&workflow.AgentWorkflow{Workflow: workflow.AgentWorkflowTypeInstall},
66+
&joiner.ClusterInfo{},
5967
getValidOptionalInstallConfig(),
6068
&releaseimage.Image{
6169
PullSpec: currentRelease,
@@ -71,6 +79,28 @@ func TestClusterImageSet_Generate(t *testing.T) {
7179
},
7280
},
7381
},
82+
{
83+
name: "add-nodes command",
84+
dependencies: []asset.Asset{
85+
&workflow.AgentWorkflow{Workflow: workflow.AgentWorkflowTypeAddNodes},
86+
&joiner.ClusterInfo{
87+
Version: "4.16.0",
88+
ReleaseImage: "registry.ci.openshift.org/ocp/release@sha256:foo",
89+
Namespace: "agent-cluster",
90+
},
91+
&agent.OptionalInstallConfig{},
92+
&releaseimage.Image{},
93+
},
94+
expectedConfig: &hivev1.ClusterImageSet{
95+
ObjectMeta: metav1.ObjectMeta{
96+
Name: "openshift-4.16.0",
97+
Namespace: "agent-cluster",
98+
},
99+
Spec: hivev1.ClusterImageSetSpec{
100+
ReleaseImage: "registry.ci.openshift.org/ocp/release@sha256:foo",
101+
},
102+
},
103+
},
74104
}
75105
for _, tc := range cases {
76106
t.Run(tc.name, func(t *testing.T) {
@@ -185,6 +215,13 @@ spec:
185215
Data: []byte(tc.data)},
186216
tc.fetchError,
187217
)
218+
fileFetcher.EXPECT().FetchByName(".agentworkflow").
219+
Return(
220+
&asset.File{
221+
Filename: ".agentworkflow",
222+
Data: []byte("install")},
223+
nil,
224+
)
188225

189226
asset := &ClusterImageSet{}
190227
found, err := asset.Load(fileFetcher)

0 commit comments

Comments
 (0)