Skip to content

Commit b9a3b7a

Browse files
author
Craig O'Donnell
committed
pass embedded cluster artifacts in upstream upgrade
1 parent 1013d8e commit b9a3b7a

File tree

3 files changed

+46
-21
lines changed

3 files changed

+46
-21
lines changed

pkg/airgap/update.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ func UpdateAppFromAirgap(a *apptypes.App, airgapBundlePath string, deploy bool,
4646
}
4747
defer os.RemoveAll(airgapRoot)
4848

49-
err = UpdateAppFromPath(a, airgapRoot, airgapBundlePath, deploy, skipPreflights, skipCompatibilityCheck)
49+
err = UpdateAppFromPath(a, airgapRoot, airgapBundlePath, deploy, skipPreflights, skipCompatibilityCheck, nil)
5050
if err != nil {
5151
return errors.Wrap(err, "failed to update app")
5252
}
5353

5454
return nil
5555
}
5656

57-
func UpdateAppFromPath(a *apptypes.App, airgapRoot string, airgapBundlePath string, deploy bool, skipPreflights bool, skipCompatibilityCheck bool) error {
57+
func UpdateAppFromPath(a *apptypes.App, airgapRoot string, airgapBundlePath string, deploy bool, skipPreflights bool, skipCompatibilityCheck bool, embeddedClusterArtifacts []string) error {
5858
if err := store.GetStore().SetTaskStatus("update-download", "Processing package...", "running"); err != nil {
5959
return errors.Wrap(err, "failed to set tasks status")
6060
}
@@ -196,6 +196,13 @@ func UpdateAppFromPath(a *apptypes.App, airgapRoot string, airgapBundlePath stri
196196
return errors.Wrap(err, "cannot install")
197197
}
198198

199+
if len(embeddedClusterArtifacts) > 0 {
200+
afterKotsKinds.Installation.Spec.EmbeddedClusterArtifacts = embeddedClusterArtifacts
201+
if err := kotsutil.SaveInstallation(&afterKotsKinds.Installation, filepath.Join(archiveDir, "upstream")); err != nil {
202+
return errors.Wrap(err, "failed to save installation")
203+
}
204+
}
205+
199206
// Create the app in the db
200207
newSequence, err := store.GetStore().CreateAppVersion(a.ID, &baseSequence, archiveDir, "Airgap Update", skipPreflights, &version.DownstreamGitOps{}, render.Renderer{})
201208
if err != nil {

pkg/handlers/update.go

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -162,25 +162,16 @@ func (h *Handler) AppUpdateCheck(w http.ResponseWriter, r *http.Request) {
162162
}
163163
defer os.RemoveAll(rootDir)
164164

165-
formReader, err := r.MultipartReader()
166-
if err != nil {
167-
logger.Error(errors.Wrap(err, "failed to get multipart reader"))
168-
w.WriteHeader(http.StatusInternalServerError)
169-
return
170-
}
171-
172-
for {
173-
part, err := formReader.NextPart()
165+
formFiles := []string{"airgap.yaml", "app.tar.gz"}
166+
for _, formFile := range formFiles {
167+
airgapFile, hdr, err := r.FormFile(formFile)
174168
if err != nil {
175-
if err == io.EOF {
176-
break
177-
}
178-
logger.Error(errors.Wrap(err, "failed to get next part"))
169+
logger.Error(errors.Wrapf(err, "failed to get form file %s", formFile))
179170
w.WriteHeader(http.StatusInternalServerError)
180171
return
181172
}
182173

183-
fileName := filepath.Join(rootDir, part.FormName())
174+
fileName := filepath.Join(rootDir, hdr.Filename)
184175
file, err := os.Create(fileName)
185176
if err != nil {
186177
logger.Error(errors.Wrap(err, "failed to create file"))
@@ -189,21 +180,25 @@ func (h *Handler) AppUpdateCheck(w http.ResponseWriter, r *http.Request) {
189180
}
190181
defer file.Close()
191182

192-
_, err = io.Copy(file, part)
183+
_, err = io.Copy(file, airgapFile)
193184
if err != nil {
194-
logger.Error(errors.Wrap(err, "failed to copy part data"))
185+
logger.Error(errors.Wrapf(err, "failed to copy form file %s", formFile))
195186
w.WriteHeader(http.StatusInternalServerError)
196187
return
197188
}
198-
file.Close()
189+
}
190+
191+
var embeddedClusterArtifacts []string
192+
if util.IsEmbeddedCluster() && r.FormValue("embeddedClusterArtifacts") != "" {
193+
embeddedClusterArtifacts = strings.Split(r.FormValue("embeddedClusterArtifacts"), "\n")
199194
}
200195

201196
finishedChan := make(chan error)
202197
defer close(finishedChan)
203198

204199
tasks.StartUpdateTaskMonitor("update-download", finishedChan)
205200

206-
err = airgap.UpdateAppFromPath(kotsApp, rootDir, "", deploy, skipPreflights, skipCompatibilityCheck)
201+
err = airgap.UpdateAppFromPath(kotsApp, rootDir, "", deploy, skipPreflights, skipCompatibilityCheck, embeddedClusterArtifacts)
207202
if err != nil {
208203
finishedChan <- err
209204

pkg/upstream/upgrade.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ func Upgrade(appSlug string, options UpgradeOptions) (*UpgradeResponse, error) {
5757
log.Silence()
5858
}
5959

60+
var embeddedClusterArtifacts []string
61+
6062
if options.AirgapBundle != "" {
6163
pushOptions := imagetypes.PushImagesOptions{
6264
Registry: registrytypes.RegistryOptions{
@@ -69,10 +71,11 @@ func Upgrade(appSlug string, options UpgradeOptions) (*UpgradeResponse, error) {
6971
}
7072

7173
if !options.DisableImagePush {
72-
_, err := image.TagAndPushImagesFromBundle(options.AirgapBundle, pushOptions)
74+
result, err := image.TagAndPushImagesFromBundle(options.AirgapBundle, pushOptions)
7375
if err != nil {
7476
return nil, errors.Wrap(err, "failed to tag and push app images from path")
7577
}
78+
embeddedClusterArtifacts = result.EmbeddedClusterArtifacts
7679
}
7780
}
7881

@@ -98,6 +101,12 @@ func Upgrade(appSlug string, options UpgradeOptions) (*UpgradeResponse, error) {
98101
return nil, errors.Wrap(err, "failed to create part from app.tar.gz")
99102
}
100103

104+
if len(embeddedClusterArtifacts) > 0 {
105+
if err := createPartFromString(writer, []byte(strings.Join(embeddedClusterArtifacts, "\n")), "embeddedClusterArtifacts"); err != nil {
106+
return nil, errors.Wrap(err, "failed to create part from embeddedClusterArtifacts")
107+
}
108+
}
109+
101110
err := writer.Close()
102111
if err != nil {
103112
return nil, errors.Wrap(err, "failed to close multi-part writer")
@@ -242,3 +251,17 @@ func createPartFromFile(partWriter *multipart.Writer, path string, fileName stri
242251

243252
return nil
244253
}
254+
255+
func createPartFromString(partWriter *multipart.Writer, content []byte, name string) error {
256+
part, err := partWriter.CreateFormField(name)
257+
if err != nil {
258+
return errors.Wrap(err, "failed to create form field")
259+
}
260+
261+
_, err = part.Write(content)
262+
if err != nil {
263+
return errors.Wrap(err, "failed to write part")
264+
}
265+
266+
return nil
267+
}

0 commit comments

Comments
 (0)