refactor(unit): Separate UnitDestination from PlaceUnit

This commit is contained in:
Brian Waldon 2014-04-14 10:10:10 -07:00
parent 5981e12ac0
commit 476761cf62
3 changed files with 43 additions and 26 deletions

View File

@ -133,9 +133,9 @@ func Apply(cfg CloudConfig, env *Environment) error {
for _, unit := range cfg.Coreos.Units { for _, unit := range cfg.Coreos.Units {
if unit.Content != "" { if unit.Content != "" {
log.Printf("Writing unit %s to filesystem", unit.Name) dst := system.UnitDestination(&unit, env.Root())
dst, err := system.PlaceUnit(&unit, env.Root()) log.Printf("Writing unit %s to filesystem at path %s", unit.Name, dst)
if err != nil { if err := system.PlaceUnit(&unit, dst); err != nil {
return err return err
} }
log.Printf("Placed unit %s at %s", unit.Name, dst) log.Printf("Placed unit %s at %s", unit.Name, dst)

View File

@ -42,21 +42,28 @@ func (u *Unit) Group() (group string) {
type Script []byte type Script []byte
func PlaceUnit(u *Unit, root string) (string, error) { // UnitDestination builds the appropriate absolte file path for
// the given unit. The root argument indicates the effective base
// directory of the system (similar to a chroot).
func UnitDestination(u *Unit, root string) string {
dir := "etc" dir := "etc"
if u.Runtime { if u.Runtime {
dir = "run" dir = "run"
} }
dst := path.Join(root, dir, "systemd", u.Group()) return path.Join(root, dir, "systemd", u.Group(), u.Name)
if _, err := os.Stat(dst); os.IsNotExist(err) { }
if err := os.MkdirAll(dst, os.FileMode(0755)); err != nil {
return "", err // PlaceUnit writes a unit file at the provided destination, creating
// parent directories as necessary.
func PlaceUnit(u *Unit, dst string) error {
dir := filepath.Dir(dst)
if _, err := os.Stat(dir); os.IsNotExist(err) {
if err := os.MkdirAll(dir, os.FileMode(0755)); err != nil {
return err
} }
} }
dst = path.Join(dst, u.Name)
file := File{ file := File{
Path: dst, Path: dst,
Content: u.Content, Content: u.Content,
@ -65,10 +72,10 @@ func PlaceUnit(u *Unit, root string) (string, error) {
err := WriteFile(&file) err := WriteFile(&file)
if err != nil { if err != nil {
return "", err return err
} }
return dst, nil return nil
} }
func EnableUnitFile(file string, runtime bool) error { func EnableUnitFile(file string, runtime bool) error {

View File

@ -26,12 +26,17 @@ Address=10.209.171.177/19
} }
defer syscall.Rmdir(dir) defer syscall.Rmdir(dir)
if _, err := PlaceUnit(&u, dir); err != nil { dst := UnitDestination(&u, dir)
expectDst := path.Join(dir, "run", "systemd", "network", "50-eth0.network")
if dst != expectDst {
t.Fatalf("UnitDestination returned %s, expected %s", dst, expectDst)
}
if err := PlaceUnit(&u, dst); err != nil {
t.Fatalf("PlaceUnit failed: %v", err) t.Fatalf("PlaceUnit failed: %v", err)
} }
fullPath := path.Join(dir, "run", "systemd", "network", "50-eth0.network") fi, err := os.Stat(dst)
fi, err := os.Stat(fullPath)
if err != nil { if err != nil {
t.Fatalf("Unable to stat file: %v", err) t.Fatalf("Unable to stat file: %v", err)
} }
@ -40,19 +45,19 @@ Address=10.209.171.177/19
t.Errorf("File has incorrect mode: %v", fi.Mode()) t.Errorf("File has incorrect mode: %v", fi.Mode())
} }
contents, err := ioutil.ReadFile(fullPath) contents, err := ioutil.ReadFile(dst)
if err != nil { if err != nil {
t.Fatalf("Unable to read expected file: %v", err) t.Fatalf("Unable to read expected file: %v", err)
} }
expect := `[Match] expectContents := `[Match]
Name=eth47 Name=eth47
[Network] [Network]
Address=10.209.171.177/19 Address=10.209.171.177/19
` `
if string(contents) != expect { if string(contents) != expectContents {
t.Fatalf("File has incorrect contents '%s'.\nExpected '%s'", string(contents), expect) t.Fatalf("File has incorrect contents '%s'.\nExpected '%s'", string(contents), expectContents)
} }
} }
@ -72,12 +77,17 @@ Where=/media/state
} }
defer syscall.Rmdir(dir) defer syscall.Rmdir(dir)
if _, err := PlaceUnit(&u, dir); err != nil { dst := UnitDestination(&u, dir)
expectDst := path.Join(dir, "etc", "systemd", "system", "media-state.mount")
if dst != expectDst {
t.Fatalf("UnitDestination returned %s, expected %s", dst, expectDst)
}
if err := PlaceUnit(&u, dst); err != nil {
t.Fatalf("PlaceUnit failed: %v", err) t.Fatalf("PlaceUnit failed: %v", err)
} }
fullPath := path.Join(dir, "etc", "systemd", "system", "media-state.mount") fi, err := os.Stat(dst)
fi, err := os.Stat(fullPath)
if err != nil { if err != nil {
t.Fatalf("Unable to stat file: %v", err) t.Fatalf("Unable to stat file: %v", err)
} }
@ -86,17 +96,17 @@ Where=/media/state
t.Errorf("File has incorrect mode: %v", fi.Mode()) t.Errorf("File has incorrect mode: %v", fi.Mode())
} }
contents, err := ioutil.ReadFile(fullPath) contents, err := ioutil.ReadFile(dst)
if err != nil { if err != nil {
t.Fatalf("Unable to read expected file: %v", err) t.Fatalf("Unable to read expected file: %v", err)
} }
expect := `[Mount] expectContents := `[Mount]
What=/dev/sdb1 What=/dev/sdb1
Where=/media/state Where=/media/state
` `
if string(contents) != expect { if string(contents) != expectContents {
t.Fatalf("File has incorrect contents '%s'.\nExpected '%s'", string(contents), expect) t.Fatalf("File has incorrect contents '%s'.\nExpected '%s'", string(contents), expectContents)
} }
} }