Merge pull request #32 from bcwaldon/etcd-name
feat(etcd): Default etcd name to /etc/machine-id
This commit is contained in:
		| @@ -1,6 +1,7 @@ | ||||
| package initialize | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"path" | ||||
| @@ -31,11 +32,22 @@ func (ec EtcdEnvironment) String() (out string) { | ||||
|  | ||||
| 		out += fmt.Sprintf("Environment=\"ETCD_%s=%s\"\n", key, val) | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // Write an EtcdEnvironment to the appropriate path on disk for etcd.service | ||||
| func WriteEtcdEnvironment(env EtcdEnvironment, root string) error { | ||||
| 	if _, ok := env["name"]; !ok { | ||||
| 		if machineID := system.MachineID(root); machineID != "" { | ||||
| 			env["name"] = machineID | ||||
| 		} else if hostname, err := system.Hostname(); err == nil { | ||||
| 			env["name"] = hostname | ||||
| 		} else { | ||||
| 			return errors.New("Unable to determine default etcd name") | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	file := system.File{ | ||||
| 		Path: path.Join(root, "run", "systemd", "system", "etcd.service.d", "20-cloudinit.conf"), | ||||
| 		RawFilePermissions: "0644", | ||||
|   | ||||
| @@ -46,6 +46,7 @@ Environment="ETCD_PEER_BIND_ADDR=192.0.2.13:7001" | ||||
|  | ||||
| func TestEtcdEnvironmentWrittenToDisk(t *testing.T) { | ||||
| 	ec := EtcdEnvironment{ | ||||
| 		"name": "node001", | ||||
| 		"discovery_url": "http://disco.example.com/foobar", | ||||
| 		"peer-bind-addr": "127.0.0.1:7002", | ||||
| 	} | ||||
| @@ -76,6 +77,7 @@ func TestEtcdEnvironmentWrittenToDisk(t *testing.T) { | ||||
| 	} | ||||
|  | ||||
| 	expect := `[Service] | ||||
| Environment="ETCD_NAME=node001" | ||||
| Environment="ETCD_DISCOVERY_URL=http://disco.example.com/foobar" | ||||
| Environment="ETCD_PEER_BIND_ADDR=127.0.0.1:7002" | ||||
| ` | ||||
| @@ -84,6 +86,39 @@ Environment="ETCD_PEER_BIND_ADDR=127.0.0.1:7002" | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestEtcdEnvironmentWrittenToDiskDefaultToMachineID(t *testing.T) { | ||||
| 	ec := EtcdEnvironment{} | ||||
| 	dir, err := ioutil.TempDir(os.TempDir(), "coreos-cloudinit-") | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("Unable to create tempdir: %v", err) | ||||
| 	} | ||||
| 	defer syscall.Rmdir(dir) | ||||
|  | ||||
| 	os.Mkdir(path.Join(dir, "etc"), os.FileMode(0755)) | ||||
| 	err = ioutil.WriteFile(path.Join(dir, "etc", "machine-id"), []byte("node007"), os.FileMode(0444)) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("Failed writing out /etc/machine-id: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	if err := WriteEtcdEnvironment(ec, dir); err != nil { | ||||
| 		t.Fatalf("Processing of EtcdEnvironment failed: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	fullPath := path.Join(dir, "run", "systemd", "system", "etcd.service.d", "20-cloudinit.conf") | ||||
|  | ||||
| 	contents, err := ioutil.ReadFile(fullPath) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("Unable to read expected file: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	expect := `[Service] | ||||
| Environment="ETCD_NAME=node007" | ||||
| ` | ||||
| 	if string(contents) != expect { | ||||
| 		t.Fatalf("File has incorrect contents") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func rmdir(path string) error { | ||||
|     cmd := exec.Command("rm", "-rf", path) | ||||
|     return cmd.Run() | ||||
|   | ||||
| @@ -2,6 +2,7 @@ package system | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"log" | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
| @@ -12,6 +13,10 @@ import ( | ||||
| 	"github.com/coreos/coreos-cloudinit/third_party/github.com/coreos/go-systemd/dbus" | ||||
| ) | ||||
|  | ||||
| // fakeMachineID is placed on non-usr CoreOS images and should | ||||
| // never be used as a true MachineID | ||||
| const fakeMachineID = "42000000000000000000000000000042" | ||||
|  | ||||
| type Unit struct { | ||||
| 	Name    string | ||||
| 	Runtime bool | ||||
| @@ -161,3 +166,18 @@ func ExecuteScript(scriptPath string) (string, error) { | ||||
| func SetHostname(hostname string) error { | ||||
| 	return exec.Command("hostnamectl", "set-hostname", hostname).Run() | ||||
| } | ||||
|  | ||||
| func Hostname() (string, error) { | ||||
| 	return os.Hostname() | ||||
| } | ||||
|  | ||||
| func MachineID(root string) string { | ||||
| 	contents, _ := ioutil.ReadFile(path.Join(root, "etc", "machine-id")) | ||||
| 	id := strings.TrimSpace(string(contents)) | ||||
|  | ||||
| 	if id == fakeMachineID { | ||||
| 		id = "" | ||||
| 	} | ||||
|  | ||||
| 	return id | ||||
| } | ||||
|   | ||||
| @@ -100,3 +100,17 @@ Where=/media/state | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestMachineID(t *testing.T) { | ||||
| 	dir, err := ioutil.TempDir(os.TempDir(), "coreos-cloudinit-") | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("Unable to create tempdir: %v", err) | ||||
| 	} | ||||
| 	defer syscall.Rmdir(dir) | ||||
|  | ||||
| 	os.Mkdir(path.Join(dir, "etc"), os.FileMode(0755)) | ||||
| 	ioutil.WriteFile(path.Join(dir, "etc", "machine-id"), []byte("node007\n"), os.FileMode(0444)) | ||||
|  | ||||
| 	if MachineID(dir) != "node007" { | ||||
| 		t.Fatalf("File has incorrect contents") | ||||
| 	} | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user