forked from confidential-containers/cloud-api-adaptor
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
pkg/adaptor/libvirt: cloud init ISO file using native go
Fixes confidential-containers#1251 Fixes confidential-containers#1250 This PR uses a native go implementation of an tool to create the cloud init ISO file, removing the dependency on an external tool. It also creates the ISO in-memory. This makes sense because the ISO file is very small and the content is backed in memory anyway. Creating the ISO file in-memory reduces the potential of errors, since nothing has to be written to the file system of the hosting container. ISO file generation as well as memory based image uploader are backed by unit tests. Signed-off-by: Dr. Carsten Leue <[email protected]>
- Loading branch information
1 parent
4422f14
commit 8c25163
Showing
9 changed files
with
170 additions
and
162 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
// (C) Copyright Confidential Containers Contributors | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
package libvirt | ||
|
||
import ( | ||
"bytes" | ||
|
||
"github.com/kdomanski/iso9660" | ||
) | ||
|
||
const ( | ||
userDataFilename = "user-data" | ||
metaDataFilename = "meta-data" | ||
vendorDataFilename = "vendor-data" | ||
ciDataVolumeName = "cidata" | ||
) | ||
|
||
// createCloudInit produces a cloud init ISO file as a data blob with a userdata and a metadata section | ||
func createCloudInit(userData, metaData []byte) ([]byte, error) { | ||
writer, err := iso9660.NewWriter() | ||
if err != nil { | ||
return nil, err | ||
} | ||
defer writer.Cleanup() //nolint:errcheck // no need to check error in deferal | ||
|
||
err = writer.AddFile(bytes.NewReader(userData), userDataFilename) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
err = writer.AddFile(bytes.NewReader(metaData), metaDataFilename) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
err = writer.AddFile(bytes.NewReader([]byte{}), vendorDataFilename) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
var buf bytes.Buffer | ||
|
||
err = writer.WriteTo(&buf, ciDataVolumeName) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
// done | ||
return buf.Bytes(), nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
// (C) Copyright Confidential Containers Contributors | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
package libvirt | ||
|
||
import ( | ||
CR "crypto/rand" | ||
"fmt" | ||
"io" | ||
"math/rand" | ||
"os" | ||
"testing" | ||
|
||
"github.com/stretchr/testify/assert" | ||
"github.com/stretchr/testify/require" | ||
"libvirt.org/go/libvirtxml" | ||
|
||
"github.com/kdomanski/iso9660" | ||
) | ||
|
||
func TestCloudInit(t *testing.T) { | ||
|
||
file, err := os.CreateTemp("", "CloudInit-*.iso") | ||
require.NoError(t, err) | ||
defer os.Remove(file.Name()) | ||
|
||
fmt.Printf("temp file: %s", file.Name()) | ||
|
||
userDataContent := []byte("userdata") | ||
metaDataContent := []byte("metadata") | ||
|
||
isoData, err := createCloudInit(userDataContent, metaDataContent) | ||
require.NoError(t, err) | ||
|
||
err = os.WriteFile(file.Name(), isoData, os.ModePerm) | ||
require.NoError(t, err) | ||
|
||
isoFile, err := os.Open(file.Name()) | ||
require.NoError(t, err) | ||
|
||
isoImg, err := iso9660.OpenImage(isoFile) | ||
require.NoError(t, err) | ||
|
||
rootFile, err := isoImg.RootDir() | ||
require.NoError(t, err) | ||
|
||
children, err := rootFile.GetChildren() | ||
require.NoError(t, err) | ||
|
||
files := make(map[string][]byte) | ||
for _, child := range children { | ||
key := child.Name() | ||
data, err := io.ReadAll(child.Reader()) | ||
require.NoError(t, err) | ||
|
||
files[key] = data | ||
} | ||
|
||
assert.Equal(t, userDataContent, files[userDataFilename]) | ||
assert.Equal(t, metaDataContent, files[metaDataFilename]) | ||
|
||
err = isoFile.Close() | ||
require.NoError(t, err) | ||
} | ||
|
||
func TestInMemoryCopier(t *testing.T) { | ||
// generate some test data | ||
size := rand.Intn(1000) + 1000 | ||
buf := make([]byte, size) | ||
_, err := CR.Read(buf) | ||
require.NoError(t, err) | ||
// build the image abstraction | ||
img, err := newImageFromBytes(buf) | ||
require.NoError(t, err) | ||
|
||
sizeFromImg, err := img.size() | ||
require.NoError(t, err) | ||
assert.Equal(t, uint64(size), sizeFromImg) | ||
|
||
var otherBuf []byte | ||
err = img.importImage(func(rdr io.Reader) error { | ||
bufRead, err := io.ReadAll(rdr) | ||
otherBuf = bufRead | ||
return err | ||
}, libvirtxml.StorageVolume{}) | ||
require.NoError(t, err) | ||
|
||
assert.Equal(t, buf, otherBuf) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.