From 3663b127162d9d1fdec26382471c5630cf1e9bcb Mon Sep 17 00:00:00 2001 From: pwzgorilla Date: Wed, 6 Sep 2017 12:44:12 +0800 Subject: [PATCH] add list mesos agents filter --- api/mesos.go | 22 ++++++++++++++++++++-- mesos/handler.go | 4 ++-- mesos/scheduler.go | 17 ++++++++++------- types/compose.go | 1 + types/mesos.go | 23 +++++++++++++++++++++++ 5 files changed, 56 insertions(+), 11 deletions(-) diff --git a/api/mesos.go b/api/mesos.go index 4c84f5c6..27adedfa 100644 --- a/api/mesos.go +++ b/api/mesos.go @@ -17,7 +17,14 @@ func (s *Server) listMesosAgents(w http.ResponseWriter, r *http.Request) { return } - writeJSON(w, http.StatusOK, agents) + if err := r.ParseForm(); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + filtered := s.filter(agents, r.Form) + + writeJSON(w, http.StatusOK, filtered) } func (s *Server) getAgentLabels(w http.ResponseWriter, r *http.Request) { @@ -197,7 +204,6 @@ func (s *Server) canOperated(label *types.MesosLabel) bool { } constraints := ver.Constraints - log.Println("===", constraints) if len(constraints) == 0 { continue } @@ -211,3 +217,15 @@ func (s *Server) canOperated(label *types.MesosLabel) bool { return true } + +func (s *Server) filter(agents []*types.MesosAgent, filter map[string][]string) []*types.MesosAgent { + filtered := make([]*types.MesosAgent, 0) + + for _, agent := range agents { + if agent.Match(filter) { + filtered = append(filtered, agent) + } + } + + return filtered +} diff --git a/mesos/handler.go b/mesos/handler.go index 48e1465e..8a80ed60 100644 --- a/mesos/handler.go +++ b/mesos/handler.go @@ -67,8 +67,8 @@ func (s *Scheduler) updateMesosAgent() { for _, agent := range s.agents { a := &types.MesosAgent{ - ID: agent.id, - IP: agent.hostname, + ID: agent.ID(), + IP: agent.IP(), } cpus, mem, disk, ports := agent.Resources() diff --git a/mesos/scheduler.go b/mesos/scheduler.go index 194f0e18..b4684d19 100644 --- a/mesos/scheduler.go +++ b/mesos/scheduler.go @@ -75,13 +75,16 @@ type Scheduler struct { // NewScheduler... func NewScheduler(cfg *SchedulerConfig, db store.Store, clusterMaster *mole.Master) (*Scheduler, error) { s := &Scheduler{ - cfg: cfg, - quit: make(chan struct{}), - agents: make(map[string]*magent.Agent), - pendingTasks: make(map[string]*Task), - db: db, - strategy: strategy.NewBinPackStrategy(), // default strategy - filters: []filter.Filter{filter.NewConstraintsFilter(), filter.NewResourceFilter()}, + cfg: cfg, + quit: make(chan struct{}), + agents: make(map[string]*magent.Agent), + pendingTasks: make(map[string]*Task), + db: db, + strategy: strategy.NewBinPackStrategy(), // default strategy + filters: []filter.Filter{ + filter.NewConstraintsFilter(db), + filter.NewResourceFilter(), + }, eventmgr: NewEventManager(), clusterMaster: clusterMaster, sem: make(chan struct{}, 1), // allow only one offer acquirement at one time diff --git a/types/compose.go b/types/compose.go index 0cb0daa0..1da8c297 100644 --- a/types/compose.go +++ b/types/compose.go @@ -62,6 +62,7 @@ func (c *Compose) Valid() error { if err := utils.LegalDomain(c.Name); err != nil { return err } + if c.Name == "default" { return errors.New("compose name `default` is reserved") } diff --git a/types/mesos.go b/types/mesos.go index 5561b539..a981e9cf 100644 --- a/types/mesos.go +++ b/types/mesos.go @@ -10,3 +10,26 @@ type MesosAgent struct { Ports int64 `json:"ports"` Attrs map[string]string `json:"attrs"` } + +func (m *MesosAgent) Match(filter map[string][]string) bool { + var n int + for k, vals := range filter { + if v, ok := m.Attrs[k]; ok { + if in(v, vals) { + n++ + } + } + } + + return n == len(filter) +} + +func in(v string, vals []string) bool { + for i := 0; i < len(vals); i++ { + if v == vals[i] { + return true + } + } + + return false +}