fix lock and resize order
Signed-off-by: Vasiliy Tolstov <v.tolstov@selfip.ru>
This commit is contained in:
parent
99671182f1
commit
d7b5d86bdb
@ -42,40 +42,47 @@ type CloudConfigUnit interface {
|
|||||||
Units() []system.Unit
|
Units() []system.Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isLock(env *Environment) bool {
|
||||||
|
if _, err := os.Stat(path.Join(env.Workspace(), ".lock")); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func Lock(env *Environment) error {
|
||||||
|
if !isLock(env) {
|
||||||
|
fp, err := os.OpenFile(path.Join(env.Workspace(), ".lock"), os.O_WRONLY|os.O_CREATE|os.O_EXCL|os.O_TRUNC, os.FileMode(0644))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return fp.Close()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Apply renders a CloudConfig to an Environment. This can involve things like
|
// Apply renders a CloudConfig to an Environment. This can involve things like
|
||||||
// configuring the hostname, adding new users, writing various configuration
|
// configuring the hostname, adding new users, writing various configuration
|
||||||
// files to disk, and manipulating systemd services.
|
// files to disk, and manipulating systemd services.
|
||||||
func Apply(cfg config.CloudConfig, ifaces []network.InterfaceGenerator, env *Environment) error {
|
func Apply(cfg config.CloudConfig, ifaces []network.InterfaceGenerator, env *Environment) error {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if cfg.ResizeRootfs {
|
|
||||||
log.Printf("resize root filesystem")
|
|
||||||
if err = system.ResizeRootFS(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, cmdline := range cfg.RunCMD {
|
for _, cmdline := range cfg.RunCMD {
|
||||||
prog := strings.Fields(cmdline)[0]
|
prog := strings.Fields(cmdline)[0]
|
||||||
args := strings.Fields(cmdline)[1:]
|
args := strings.Fields(cmdline)[1:]
|
||||||
exec.Command(prog, args...).Run()
|
exec.Command(prog, args...).Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
lockf := path.Join(env.Workspace(), ".lock")
|
|
||||||
|
|
||||||
if _, err = os.Stat(lockf); err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = os.MkdirAll(env.Workspace(), os.FileMode(0755)); err != nil {
|
if err = os.MkdirAll(env.Workspace(), os.FileMode(0755)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.Hostname != "" {
|
if !isLock(env) {
|
||||||
if err = system.SetHostname(cfg.Hostname); err != nil {
|
if cfg.Hostname != "" {
|
||||||
return err
|
if err = system.SetHostname(cfg.Hostname); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
log.Printf("Set hostname to %s", cfg.Hostname)
|
||||||
}
|
}
|
||||||
log.Printf("Set hostname to %s", cfg.Hostname)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, user := range cfg.Users {
|
for _, user := range cfg.Users {
|
||||||
@ -84,28 +91,30 @@ func Apply(cfg config.CloudConfig, ifaces []network.InterfaceGenerator, env *Env
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if system.UserExists(&user) {
|
if !isLock(env) {
|
||||||
log.Printf("User '%s' exists, ignoring creation-time fields", user.Name)
|
if system.UserExists(&user) {
|
||||||
if user.PasswordHash != "" {
|
log.Printf("User '%s' exists, ignoring creation-time fields", user.Name)
|
||||||
log.Printf("Setting '%s' user's password", user.Name)
|
if user.PasswordHash != "" {
|
||||||
if err := system.SetUserPassword(user.Name, user.PasswordHash); err != nil {
|
log.Printf("Setting '%s' user's password", user.Name)
|
||||||
log.Printf("Failed setting '%s' user's password: %v", user.Name, err)
|
if err := system.SetUserPassword(user.Name, user.PasswordHash); err != nil {
|
||||||
|
log.Printf("Failed setting '%s' user's password: %v", user.Name, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.Printf("Creating user '%s'", user.Name)
|
||||||
|
if err = system.CreateUser(&user); err != nil {
|
||||||
|
log.Printf("Failed creating user '%s': %v", user.Name, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
log.Printf("Creating user '%s'", user.Name)
|
if err = system.LockUnlockUser(&user); err != nil {
|
||||||
if err = system.CreateUser(&user); err != nil {
|
log.Printf("Failed lock/unlock user '%s': %v", user.Name, err)
|
||||||
log.Printf("Failed creating user '%s': %v", user.Name, err)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = system.LockUnlockUser(&user); err != nil {
|
|
||||||
log.Printf("Failed lock/unlock user '%s': %v", user.Name, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(user.SSHAuthorizedKeys) > 0 {
|
if len(user.SSHAuthorizedKeys) > 0 {
|
||||||
log.Printf("Authorizing %d SSH keys for user '%s'", len(user.SSHAuthorizedKeys), user.Name)
|
log.Printf("Authorizing %d SSH keys for user '%s'", len(user.SSHAuthorizedKeys), user.Name)
|
||||||
if err = system.AuthorizeSSHKeys(user.Name, env.SSHKeyName(), user.SSHAuthorizedKeys); err != nil {
|
if err = system.AuthorizeSSHKeys(user.Name, env.SSHKeyName(), user.SSHAuthorizedKeys); err != nil {
|
||||||
@ -141,83 +150,86 @@ func Apply(cfg config.CloudConfig, ifaces []network.InterfaceGenerator, env *Env
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var writeFiles []system.File
|
if !isLock(env) {
|
||||||
for _, file := range cfg.WriteFiles {
|
var writeFiles []system.File
|
||||||
writeFiles = append(writeFiles, system.File{File: file})
|
for _, file := range cfg.WriteFiles {
|
||||||
}
|
writeFiles = append(writeFiles, system.File{File: file})
|
||||||
|
|
||||||
for _, ccf := range []CloudConfigFile{
|
|
||||||
system.OEM{OEM: cfg.CoreOS.OEM},
|
|
||||||
system.Update{Update: cfg.CoreOS.Update, ReadConfig: system.DefaultReadConfig},
|
|
||||||
system.EtcHosts{EtcHosts: cfg.ManageEtcHosts},
|
|
||||||
system.Flannel{Flannel: cfg.CoreOS.Flannel},
|
|
||||||
} {
|
|
||||||
f, err := ccf.File()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
if f != nil {
|
|
||||||
writeFiles = append(writeFiles, *f)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var units []system.Unit
|
for _, ccf := range []CloudConfigFile{
|
||||||
for _, u := range cfg.CoreOS.Units {
|
system.OEM{OEM: cfg.CoreOS.OEM},
|
||||||
units = append(units, system.Unit{Unit: u})
|
system.Update{Update: cfg.CoreOS.Update, ReadConfig: system.DefaultReadConfig},
|
||||||
}
|
system.EtcHosts{EtcHosts: cfg.ManageEtcHosts},
|
||||||
|
system.Flannel{Flannel: cfg.CoreOS.Flannel},
|
||||||
for _, ccu := range []CloudConfigUnit{
|
} {
|
||||||
system.Etcd{Etcd: cfg.CoreOS.Etcd},
|
f, err := ccf.File()
|
||||||
system.Etcd2{Etcd2: cfg.CoreOS.Etcd2},
|
|
||||||
system.Fleet{Fleet: cfg.CoreOS.Fleet},
|
|
||||||
system.Locksmith{Locksmith: cfg.CoreOS.Locksmith},
|
|
||||||
system.Update{Update: cfg.CoreOS.Update, ReadConfig: system.DefaultReadConfig},
|
|
||||||
} {
|
|
||||||
units = append(units, ccu.Units()...)
|
|
||||||
}
|
|
||||||
|
|
||||||
wroteEnvironment := false
|
|
||||||
for _, file := range writeFiles {
|
|
||||||
fullPath, err := system.WriteFile(&file, env.Root())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if path.Clean(file.Path) == "/etc/environment" {
|
|
||||||
wroteEnvironment = true
|
|
||||||
}
|
|
||||||
log.Printf("Wrote file %s to filesystem", fullPath)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !wroteEnvironment {
|
|
||||||
ef := env.DefaultEnvironmentFile()
|
|
||||||
if ef != nil {
|
|
||||||
err := system.WriteEnvFile(ef, env.Root())
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
log.Printf("Updated /etc/environment")
|
if f != nil {
|
||||||
|
writeFiles = append(writeFiles, *f)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if len(ifaces) > 0 {
|
var units []system.Unit
|
||||||
units = append(units, createNetworkingUnits(ifaces)...)
|
for _, u := range cfg.CoreOS.Units {
|
||||||
if err = system.RestartNetwork(ifaces); err != nil {
|
units = append(units, system.Unit{Unit: u})
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, ccu := range []CloudConfigUnit{
|
||||||
|
system.Etcd{Etcd: cfg.CoreOS.Etcd},
|
||||||
|
system.Etcd2{Etcd2: cfg.CoreOS.Etcd2},
|
||||||
|
system.Fleet{Fleet: cfg.CoreOS.Fleet},
|
||||||
|
system.Locksmith{Locksmith: cfg.CoreOS.Locksmith},
|
||||||
|
system.Update{Update: cfg.CoreOS.Update, ReadConfig: system.DefaultReadConfig},
|
||||||
|
} {
|
||||||
|
units = append(units, ccu.Units()...)
|
||||||
|
}
|
||||||
|
|
||||||
|
wroteEnvironment := false
|
||||||
|
for _, file := range writeFiles {
|
||||||
|
fullPath, err := system.WriteFile(&file, env.Root())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if path.Clean(file.Path) == "/etc/environment" {
|
||||||
|
wroteEnvironment = true
|
||||||
|
}
|
||||||
|
log.Printf("Wrote file %s to filesystem", fullPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !wroteEnvironment {
|
||||||
|
ef := env.DefaultEnvironmentFile()
|
||||||
|
if ef != nil {
|
||||||
|
err := system.WriteEnvFile(ef, env.Root())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
log.Printf("Updated /etc/environment")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ifaces) > 0 {
|
||||||
|
units = append(units, createNetworkingUnits(ifaces)...)
|
||||||
|
if err = system.RestartNetwork(ifaces); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
um := system.NewUnitManager(env.Root())
|
||||||
|
if err = processUnits(units, env.Root(), um); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
um := system.NewUnitManager(env.Root())
|
if cfg.ResizeRootfs {
|
||||||
if err = processUnits(units, env.Root(), um); err != nil {
|
log.Printf("resize root filesystem")
|
||||||
return err
|
if err = system.ResizeRootFS(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fp, err := os.OpenFile(lockf, os.O_WRONLY|os.O_CREATE|os.O_EXCL|os.O_TRUNC, os.FileMode(0644))
|
return Lock(env)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
fp.Close()
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func createNetworkingUnits(interfaces []network.InterfaceGenerator) (units []system.Unit) {
|
func createNetworkingUnits(interfaces []network.InterfaceGenerator) (units []system.Unit) {
|
||||||
|
Loading…
Reference in New Issue
Block a user