feat: add injector for boot/root files with tests
This commit is contained in:
parent
62ec09cc02
commit
4b62376743
38
pkg/inject/inject.go
Normal file
38
pkg/inject/inject.go
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package inject
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Injector writes node config into a mounted image (boot/root paths supplied by caller).
|
||||||
|
type Injector struct {
|
||||||
|
BootPath string
|
||||||
|
RootPath string
|
||||||
|
}
|
||||||
|
|
||||||
|
// FileSpec describes a file to write.
|
||||||
|
type FileSpec struct {
|
||||||
|
Path string
|
||||||
|
Content []byte
|
||||||
|
Mode os.FileMode
|
||||||
|
RootFS bool // if true, write under root path; else boot path
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Injector) Write(files []FileSpec) error {
|
||||||
|
for _, f := range files {
|
||||||
|
base := i.BootPath
|
||||||
|
if f.RootFS {
|
||||||
|
base = i.RootPath
|
||||||
|
}
|
||||||
|
target := filepath.Join(base, f.Path)
|
||||||
|
if err := os.MkdirAll(filepath.Dir(target), 0o755); err != nil {
|
||||||
|
return fmt.Errorf("mkdir %s: %w", filepath.Dir(target), err)
|
||||||
|
}
|
||||||
|
if err := os.WriteFile(target, f.Content, f.Mode); err != nil {
|
||||||
|
return fmt.Errorf("write %s: %w", target, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
16
tests/test_inject.py
Normal file
16
tests/test_inject.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from metis.pkg.inject import Injector, FileSpec
|
||||||
|
|
||||||
|
|
||||||
|
def test_inject_write(tmp_path):
|
||||||
|
boot = tmp_path / "boot"
|
||||||
|
root = tmp_path / "root"
|
||||||
|
inj = Injector(BootPath=str(boot), RootPath=str(root))
|
||||||
|
files = [
|
||||||
|
FileSpec(Path="config.txt", Content=b"bootcfg", Mode=0o644, RootFS=False),
|
||||||
|
FileSpec(Path="etc/hostname", Content=b"node", Mode=0o644, RootFS=True),
|
||||||
|
]
|
||||||
|
inj.Write(files)
|
||||||
|
assert (boot / "config.txt").read_bytes() == b"bootcfg"
|
||||||
|
assert (root / "etc/hostname").read_bytes() == b"node"
|
||||||
Loading…
x
Reference in New Issue
Block a user