2014-03-18 09:00:41 -07:00
|
|
|
package initialize
|
2014-03-04 16:36:05 -08:00
|
|
|
|
|
|
|
import (
|
2014-03-18 10:57:10 -07:00
|
|
|
"errors"
|
2014-03-17 15:09:59 -07:00
|
|
|
"fmt"
|
2014-03-04 16:36:05 -08:00
|
|
|
"os"
|
|
|
|
"path"
|
2014-03-17 15:09:59 -07:00
|
|
|
"strings"
|
2014-03-18 09:00:41 -07:00
|
|
|
|
|
|
|
"github.com/coreos/coreos-cloudinit/system"
|
2014-03-04 16:36:05 -08:00
|
|
|
)
|
|
|
|
|
2014-03-17 15:09:59 -07:00
|
|
|
type EtcdEnvironment map[string]string
|
|
|
|
|
2014-03-18 13:01:10 -07:00
|
|
|
func (ec EtcdEnvironment) normalized() map[string]string {
|
|
|
|
out := make(map[string]string, len(ec))
|
|
|
|
for key, val := range ec {
|
|
|
|
key = strings.ToUpper(key)
|
|
|
|
key = strings.Replace(key, "-", "_", -1)
|
|
|
|
out[key] = val
|
|
|
|
}
|
|
|
|
return out
|
|
|
|
}
|
|
|
|
|
2014-03-17 15:09:59 -07:00
|
|
|
func (ec EtcdEnvironment) String() (out string) {
|
2014-03-18 13:01:10 -07:00
|
|
|
norm := ec.normalized()
|
|
|
|
|
|
|
|
if val, ok := norm["DISCOVERY_URL"]; ok {
|
|
|
|
delete(norm, "DISCOVERY_URL")
|
|
|
|
if _, ok := norm["DISCOVERY"]; !ok {
|
|
|
|
norm["DISCOVERY"] = val
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-03-17 15:09:59 -07:00
|
|
|
public := os.Getenv("COREOS_PUBLIC_IPV4")
|
|
|
|
private := os.Getenv("COREOS_PRIVATE_IPV4")
|
|
|
|
|
|
|
|
out += "[Service]\n"
|
|
|
|
|
2014-03-18 13:01:10 -07:00
|
|
|
for key, val := range norm {
|
2014-03-17 15:09:59 -07:00
|
|
|
if public != "" {
|
|
|
|
val = strings.Replace(val, "$public_ipv4", public, -1)
|
|
|
|
}
|
|
|
|
|
|
|
|
if private != "" {
|
|
|
|
val = strings.Replace(val, "$private_ipv4", private, -1)
|
|
|
|
}
|
|
|
|
|
|
|
|
out += fmt.Sprintf("Environment=\"ETCD_%s=%s\"\n", key, val)
|
|
|
|
}
|
2014-03-18 09:36:31 -07:00
|
|
|
|
2014-03-17 15:09:59 -07:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write an EtcdEnvironment to the appropriate path on disk for etcd.service
|
2014-03-18 09:00:41 -07:00
|
|
|
func WriteEtcdEnvironment(env EtcdEnvironment, root string) error {
|
2014-03-18 09:36:31 -07:00
|
|
|
if _, ok := env["name"]; !ok {
|
2014-03-18 10:57:10 -07:00
|
|
|
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")
|
2014-03-18 09:36:31 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-03-18 09:00:41 -07:00
|
|
|
file := system.File{
|
2014-03-18 10:36:34 -07:00
|
|
|
Path: path.Join(root, "run", "systemd", "system", "etcd.service.d", "20-cloudinit.conf"),
|
2014-03-18 09:00:41 -07:00
|
|
|
RawFilePermissions: "0644",
|
|
|
|
Content: env.String(),
|
2014-03-04 16:36:05 -08:00
|
|
|
}
|
|
|
|
|
2014-03-18 09:00:41 -07:00
|
|
|
return system.WriteFile(&file)
|
2014-03-04 16:36:05 -08:00
|
|
|
}
|