Merge pull request #54 from tuna/dev

Dev
This commit is contained in:
bigeagle 2016-12-07 00:11:34 +08:00 committed by GitHub
commit 81a15e7dd1
6 changed files with 83 additions and 15 deletions

View File

@ -182,7 +182,7 @@ func (b *boltAdapter) FlushDisabledJobs() (err error) {
err = fmt.Errorf("%s; %s", err.Error(), jsonErr) err = fmt.Errorf("%s; %s", err.Error(), jsonErr)
continue continue
} }
if m.Status == Disabled { if m.Status == Disabled || len(m.Name) == 0 {
err = c.Delete() err = c.Delete()
} }
} }

View File

@ -23,6 +23,7 @@ type baseProvider struct {
logFile *os.File logFile *os.File
cgroup *cgroupHook cgroup *cgroupHook
zfs *zfsHook
hooks []jobHook hooks []jobHook
} }
@ -77,12 +78,15 @@ func (p *baseProvider) LogFile() string {
return s return s
} }
} }
panic("log dir is impossible to be unavailable") panic("log file is impossible to be unavailable")
} }
func (p *baseProvider) AddHook(hook jobHook) { func (p *baseProvider) AddHook(hook jobHook) {
if cg, ok := hook.(*cgroupHook); ok { switch v := hook.(type) {
p.cgroup = cg case *cgroupHook:
p.cgroup = v
case *zfsHook:
p.zfs = v
} }
p.hooks = append(p.hooks, hook) p.hooks = append(p.hooks, hook)
} }
@ -95,6 +99,10 @@ func (p *baseProvider) Cgroup() *cgroupHook {
return p.cgroup return p.cgroup
} }
func (p *baseProvider) ZFS() *zfsHook {
return p.zfs
}
func (p *baseProvider) prepareLogFile() error { func (p *baseProvider) prepareLogFile() error {
if p.LogFile() == "/dev/null" { if p.LogFile() == "/dev/null" {
p.cmd.SetLogFile(nil) p.cmd.SetLogFile(nil)

View File

@ -37,6 +37,7 @@ type Config struct {
Manager managerConfig `toml:"manager"` Manager managerConfig `toml:"manager"`
Server serverConfig `toml:"server"` Server serverConfig `toml:"server"`
Cgroup cgroupConfig `toml:"cgroup"` Cgroup cgroupConfig `toml:"cgroup"`
ZFS zfsConfig `toml:"zfs"`
Include includeConfig `toml:"include"` Include includeConfig `toml:"include"`
Mirrors []mirrorConfig `toml:"mirrors"` Mirrors []mirrorConfig `toml:"mirrors"`
} }
@ -53,9 +54,10 @@ type globalConfig struct {
} }
type managerConfig struct { type managerConfig struct {
APIBase string `toml:"api_base"` APIBase string `toml:"api_base"`
CACert string `toml:"ca_cert"` CACert string `toml:"ca_cert"`
Token string `toml:"token"` ExtraStatusAPIs []string `toml:"extra_status_managers"`
// Token string `toml:"token"`
} }
type serverConfig struct { type serverConfig struct {
@ -72,6 +74,11 @@ type cgroupConfig struct {
Group string `toml:"group"` Group string `toml:"group"`
} }
type zfsConfig struct {
Enable bool `toml:"enable"`
Zpool string `toml:"zpool"`
}
type includeConfig struct { type includeConfig struct {
IncludeMirrors string `toml:"include_mirrors"` IncludeMirrors string `toml:"include_mirrors"`
} }

View File

@ -36,6 +36,8 @@ type mirrorProvider interface {
IsRunning() bool IsRunning() bool
// Cgroup // Cgroup
Cgroup() *cgroupHook Cgroup() *cgroupHook
// ZFS
ZFS() *zfsHook
AddHook(hook jobHook) AddHook(hook jobHook)
Hooks() []jobHook Hooks() []jobHook
@ -162,6 +164,11 @@ func newMirrorProvider(mirror mirrorConfig, cfg *Config) mirrorProvider {
// Add Logging Hook // Add Logging Hook
provider.AddHook(newLogLimiter(provider)) provider.AddHook(newLogLimiter(provider))
// Add ZFS Hook
if cfg.ZFS.Enable {
provider.AddHook(newZfsHook(provider, cfg.ZFS.Zpool))
}
// Add Cgroup Hook // Add Cgroup Hook
if cfg.Cgroup.Enable { if cfg.Cgroup.Enable {
provider.AddHook( provider.AddHook(

View File

@ -405,12 +405,6 @@ func (w *Worker) registorWorker() {
} }
func (w *Worker) updateStatus(job *mirrorJob, jobMsg jobMessage) { func (w *Worker) updateStatus(job *mirrorJob, jobMsg jobMessage) {
url := fmt.Sprintf(
"%s/workers/%s/jobs/%s",
w.cfg.Manager.APIBase,
w.Name(),
jobMsg.name,
)
p := job.provider p := job.provider
smsg := MirrorStatus{ smsg := MirrorStatus{
Name: jobMsg.name, Name: jobMsg.name,
@ -422,8 +416,15 @@ func (w *Worker) updateStatus(job *mirrorJob, jobMsg jobMessage) {
ErrorMsg: jobMsg.msg, ErrorMsg: jobMsg.msg,
} }
if _, err := PostJSON(url, smsg, w.httpClient); err != nil { apiBases := []string{w.cfg.Manager.APIBase}
logger.Errorf("Failed to update mirror(%s) status: %s", jobMsg.name, err.Error()) apiBases = append(apiBases, w.cfg.Manager.ExtraStatusAPIs...)
for _, root := range apiBases {
url := fmt.Sprintf(
"%s/workers/%s/jobs/%s", root, w.Name(), jobMsg.name,
)
if _, err := PostJSON(url, smsg, w.httpClient); err != nil {
logger.Errorf("Failed to update mirror(%s) status: %s", jobMsg.name, err.Error())
}
} }
} }

45
worker/zfs_hook.go Normal file
View File

@ -0,0 +1,45 @@
package worker
import (
"fmt"
"os"
"strings"
"github.com/codeskyblue/go-sh"
)
type zfsHook struct {
emptyHook
provider mirrorProvider
zpool string
}
func newZfsHook(provider mirrorProvider, zpool string) *zfsHook {
return &zfsHook{
provider: provider,
zpool: zpool,
}
}
// create zfs dataset for a new mirror
func (z *zfsHook) preJob() error {
workingDir := z.provider.WorkingDir()
if _, err := os.Stat(workingDir); os.IsNotExist(err) {
// sudo zfs create $zfsDataset
// sudo zfs set mountpoint=${absPath} ${zfsDataset}
zfsDataset := fmt.Sprintf("%s/%s", z.zpool, z.provider.Name())
// Unknown issue of ZFS:
// dataset name should not contain upper case letters
zfsDataset = strings.ToLower(zfsDataset)
logger.Infof("Creating ZFS dataset %s", zfsDataset)
if err := sh.Command("sudo", "zfs", "create", zfsDataset).Run(); err != nil {
return err
}
logger.Infof("Mount ZFS dataset %s to %s", zfsDataset, workingDir)
if err := sh.Command("sudo", "zfs", "set", "mountpoint="+workingDir, zfsDataset).Run(); err != nil {
return err
}
}
return nil
}