Skip to content

Commit 98827c6

Browse files
Merge pull request #216 from hrak/userdata_uncomp
Add flag to allow userdata to be uncompressed
2 parents eb20110 + d84b9f9 commit 98827c6

7 files changed

+43
-11
lines changed

api/v1beta2/cloudstackmachine_types.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ type CloudStackMachineSpec struct {
8383
// +optional
8484
// +k8s:conversion-gen=false
8585
FailureDomainName string `json:"failureDomainName,omitempty"`
86+
87+
// UncompressedUserData specifies whether the user data is gzip-compressed.
88+
// cloud-init has built-in support for gzip-compressed user data, ignition does not
89+
//
90+
// +optional
91+
UncompressedUserData *bool `json:"uncompressedUserData,omitempty"`
8692
}
8793

8894
type CloudStackResourceIdentifier struct {

api/v1beta2/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachines.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,11 @@ spec:
423423
description: Cloudstack resource Name
424424
type: string
425425
type: object
426+
uncompressedUserData:
427+
description: UncompressedUserData specifies whether the user data
428+
is gzip-compressed. cloud-init has built-in support for gzip-compressed
429+
user data, ignition does not
430+
type: boolean
426431
required:
427432
- offering
428433
- template

config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachinetemplates.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,11 @@ spec:
377377
description: Cloudstack resource Name
378378
type: string
379379
type: object
380+
uncompressedUserData:
381+
description: UncompressedUserData specifies whether the user
382+
data is gzip-compressed. cloud-init has built-in support
383+
for gzip-compressed user data, ignition does not
384+
type: boolean
380385
required:
381386
- offering
382387
- template

pkg/cloud/helpers.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package cloud
1919
import (
2020
"bytes"
2121
"compress/gzip"
22-
"encoding/base64"
2322
)
2423

2524
type set func(string)
@@ -44,13 +43,14 @@ func setIntIfPositive(num int64, setFn setInt) {
4443
}
4544
}
4645

47-
func CompressAndEncodeString(str string) (string, error) {
46+
func CompressString(str string) (string, error) {
4847
buf := &bytes.Buffer{}
4948
gzipWriter := gzip.NewWriter(buf)
5049
if _, err := gzipWriter.Write([]byte(str)); err != nil {
51-
gzipWriter.Close()
5250
return "", err
5351
}
54-
gzipWriter.Close()
55-
return base64.StdEncoding.EncodeToString(buf.Bytes()), nil
52+
if err := gzipWriter.Close(); err != nil {
53+
return "", err
54+
}
55+
return buf.String(), nil
5656
}

pkg/cloud/helpers_test.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package cloud_test
1919
import (
2020
"bytes"
2121
"compress/gzip"
22-
"encoding/base64"
2322
"fmt"
2423
"io"
2524
"reflect"
@@ -36,10 +35,9 @@ var _ = Describe("Helpers", func() {
3635
It("should compress and encode string", func() {
3736
str := "Hello World"
3837

39-
compressedAndEncodedData, err := cloud.CompressAndEncodeString(str)
38+
compressedData, err := cloud.CompressString(str)
4039

41-
compressedData, _ := base64.StdEncoding.DecodeString(compressedAndEncodedData)
42-
reader, _ := gzip.NewReader(bytes.NewReader(compressedData))
40+
reader, _ := gzip.NewReader(bytes.NewReader([]byte(compressedData)))
4341
result, _ := io.ReadAll(reader)
4442

4543
Ω(err).Should(BeNil())

pkg/cloud/instance.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package cloud
1818

1919
import (
20+
"encoding/base64"
2021
"fmt"
2122
"strings"
2223

@@ -244,11 +245,11 @@ func (c *client) GetOrCreateVMInstance(
244245

245246
setIfNotEmpty(csMachine.Spec.SSHKey, p.SetKeypair)
246247

247-
compressedAndEncodedUserData, err := CompressAndEncodeString(userData)
248+
userData, err = handleUserData(userData, csMachine.Spec.UncompressedUserData)
248249
if err != nil {
249250
return err
250251
}
251-
setIfNotEmpty(compressedAndEncodedUserData, p.SetUserdata)
252+
setIfNotEmpty(userData, p.SetUserdata)
252253

253254
if len(csMachine.Spec.AffinityGroupIDs) > 0 {
254255
p.SetAffinitygroupids(csMachine.Spec.AffinityGroupIDs)
@@ -345,3 +346,15 @@ func (c *client) listVMInstanceDatadiskVolumeIDs(instanceID string) ([]string, e
345346
return ret, nil
346347

347348
}
349+
350+
// handleUserData optionally compresses and then base64 encodes userdata
351+
func handleUserData(userData string, uncompressed *bool) (string, error) {
352+
var err error
353+
if uncompressed != nil && !*uncompressed {
354+
userData, err = CompressString(userData)
355+
if err != nil {
356+
return "", err
357+
}
358+
}
359+
return base64.StdEncoding.EncodeToString([]byte(userData)), nil
360+
}

0 commit comments

Comments
 (0)