added worker handlers
This commit is contained in:
parent
99fef2b4ea
commit
58f287a541
6 changed files with 90 additions and 35 deletions
57
server/handler/worker.go
Normal file
57
server/handler/worker.go
Normal file
|
@ -0,0 +1,57 @@
|
|||
package handler
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"github.com/drone/drone-dart/worker"
|
||||
"github.com/drone/drone-dart/worker/director"
|
||||
"github.com/drone/drone-dart/worker/pool"
|
||||
"github.com/goji/context"
|
||||
"github.com/zenazn/goji/web"
|
||||
)
|
||||
|
||||
// GetWorkers accepts a request to retrieve the list
|
||||
// of registered workers and return the results
|
||||
// in JSON format.
|
||||
//
|
||||
// GET /api/workers
|
||||
//
|
||||
func GetWorkers(c web.C, w http.ResponseWriter, r *http.Request) {
|
||||
ctx := context.FromC(c)
|
||||
workers := pool.FromContext(ctx).List()
|
||||
json.NewEncoder(w).Encode(workers)
|
||||
}
|
||||
|
||||
// GetWorkPending accepts a request to retrieve the list
|
||||
// of pending work and returns in JSON format.
|
||||
//
|
||||
// GET /api/work/pending
|
||||
//
|
||||
func GetWorkPending(c web.C, w http.ResponseWriter, r *http.Request) {
|
||||
ctx := context.FromC(c)
|
||||
d := worker.FromContext(ctx).(*director.Director)
|
||||
json.NewEncoder(w).Encode(d.GetPending())
|
||||
}
|
||||
|
||||
// GetWorkStarted accepts a request to retrieve the list
|
||||
// of started work and returns in JSON format.
|
||||
//
|
||||
// GET /api/work/started
|
||||
//
|
||||
func GetWorkStarted(c web.C, w http.ResponseWriter, r *http.Request) {
|
||||
ctx := context.FromC(c)
|
||||
d := worker.FromContext(ctx).(*director.Director)
|
||||
json.NewEncoder(w).Encode(d.GetStarted())
|
||||
}
|
||||
|
||||
// GetWorkAssigned accepts a request to retrieve the list
|
||||
// of started work and returns in JSON format.
|
||||
//
|
||||
// GET /api/work/assignments
|
||||
//
|
||||
func GetWorkAssigned(c web.C, w http.ResponseWriter, r *http.Request) {
|
||||
ctx := context.FromC(c)
|
||||
d := worker.FromContext(ctx).(*director.Director)
|
||||
json.NewEncoder(w).Encode(d.GetAssignemnts())
|
||||
}
|
|
@ -8,7 +8,7 @@ import (
|
|||
|
||||
"github.com/drone/drone/server/datastore"
|
||||
"github.com/drone/drone/server/pubsub"
|
||||
"github.com/drone/drone/shared/model"
|
||||
"github.com/drone/drone/server/worker"
|
||||
|
||||
"github.com/goji/context"
|
||||
"github.com/gorilla/websocket"
|
||||
|
@ -60,7 +60,7 @@ func WsUser(c web.C, w http.ResponseWriter, r *http.Request) {
|
|||
for {
|
||||
select {
|
||||
case msg := <-sub.Read():
|
||||
work, ok := msg.(*model.Request)
|
||||
work, ok := msg.(*worker.Work)
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
|
|
|
@ -122,9 +122,9 @@ func main() {
|
|||
goji.Get("/api/auth/:host", handler.GetLogin)
|
||||
goji.Get("/api/badge/:host/:owner/:name/status.svg", handler.GetBadge)
|
||||
goji.Get("/api/badge/:host/:owner/:name/cc.xml", handler.GetCC)
|
||||
//goji.Get("/api/hook", handler.PostHook)
|
||||
//goji.Put("/api/hook", handler.PostHook)
|
||||
//goji.Post("/api/hook", handler.PostHook)
|
||||
goji.Get("/api/hook/:hook", handler.PostHook)
|
||||
goji.Put("/api/hook/:hook", handler.PostHook)
|
||||
goji.Post("/api/hook/:hook", handler.PostHook)
|
||||
|
||||
repos := web.New()
|
||||
repos.Use(middleware.SetRepo)
|
||||
|
@ -156,6 +156,14 @@ func main() {
|
|||
user.Put("/api/user", handler.PutUser)
|
||||
goji.Handle("/api/user*", user)
|
||||
|
||||
work := web.New()
|
||||
work.Use(middleware.RequireUserAdmin)
|
||||
work.Get("/api/work/started", handler.GetWorkStarted)
|
||||
work.Get("/api/work/pending", handler.GetWorkPending)
|
||||
work.Get("/api/work/assignments", handler.GetWorkAssigned)
|
||||
work.Get("/api/workers", handler.GetWorkers)
|
||||
goji.Handle("/api/work*", work)
|
||||
|
||||
// Add middleware and serve
|
||||
goji.Use(ContextMiddleware)
|
||||
goji.Use(middleware.SetHeaders)
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package docker
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"log"
|
||||
"path/filepath"
|
||||
"runtime/debug"
|
||||
|
@ -12,6 +11,7 @@ import (
|
|||
"github.com/drone/drone/plugin/notify"
|
||||
"github.com/drone/drone/server/blobstore"
|
||||
"github.com/drone/drone/server/datastore"
|
||||
"github.com/drone/drone/server/pubsub"
|
||||
"github.com/drone/drone/server/worker"
|
||||
"github.com/drone/drone/shared/build"
|
||||
"github.com/drone/drone/shared/build/docker"
|
||||
|
@ -57,14 +57,14 @@ func (d *Docker) Do(c context.Context, r *worker.Work) {
|
|||
datastore.PutCommit(c, r.Commit)
|
||||
|
||||
// notify all listeners that the build is started
|
||||
//commitc := w.pubsub.Register("_global")
|
||||
//commitc.Publish(r)
|
||||
//stdoutc := w.pubsub.RegisterOpts(r.Commit.ID, pubsub.ConsoleOpts)
|
||||
//defer stdoutc.Close()
|
||||
commitc := pubsub.Register(c, "_global")
|
||||
commitc.Publish(r)
|
||||
stdoutc := pubsub.RegisterOpts(c, r.Commit.ID, pubsub.ConsoleOpts)
|
||||
defer stdoutc.Close()
|
||||
|
||||
// create a special buffer that will also
|
||||
// write to a websocket channel
|
||||
var buf bytes.Buffer //:= pubsub.NewBuffer(stdoutc)
|
||||
buf := pubsub.NewBuffer(stdoutc)
|
||||
|
||||
// parse the parameters and build script. The script has already
|
||||
// been parsed in the hook, so we can be confident it will succeed.
|
||||
|
@ -102,13 +102,18 @@ func (d *Docker) Do(c context.Context, r *worker.Work) {
|
|||
if script.Notifications == nil {
|
||||
script.Notifications = ¬ify.Notification{}
|
||||
}
|
||||
//script.Notifications.Send(r)
|
||||
script.Notifications.Send(&model.Request{
|
||||
User: r.User,
|
||||
Repo: r.Repo,
|
||||
Commit: r.Commit,
|
||||
Host: r.Host,
|
||||
})
|
||||
|
||||
// create an instance of the Docker builder
|
||||
builder := build.New(d.docker)
|
||||
builder.Build = script
|
||||
builder.Repo = repo
|
||||
builder.Stdout = &buf
|
||||
builder.Stdout = buf
|
||||
builder.Key = []byte(r.Repo.PrivateKey)
|
||||
builder.Timeout = time.Duration(r.Repo.Timeout) * time.Second
|
||||
builder.Privileged = r.Repo.Privileged
|
||||
|
@ -139,8 +144,13 @@ func (d *Docker) Do(c context.Context, r *worker.Work) {
|
|||
blobstore.Put(c, filepath.Join(r.Repo.Host, r.Repo.Owner, r.Repo.Name, r.Commit.Branch, r.Commit.Sha), buf.Bytes())
|
||||
|
||||
// notify all listeners that the build is finished
|
||||
//commitc.Publish(r)
|
||||
commitc.Publish(r)
|
||||
|
||||
// send all "finished" notifications
|
||||
//script.Notifications.Send(r)
|
||||
script.Notifications.Send(&model.Request{
|
||||
User: r.User,
|
||||
Repo: r.Repo,
|
||||
Commit: r.Commit,
|
||||
Host: r.Host,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -5,5 +5,4 @@ type Request struct {
|
|||
User *User `json:"-"`
|
||||
Repo *Repo `json:"repo"`
|
||||
Commit *Commit `json:"commit"`
|
||||
Server *Server `json:"-"`
|
||||
}
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
package model
|
||||
|
||||
type Server struct {
|
||||
ID int64 `meddler:"server_id,pk" json:"id"`
|
||||
Name string `meddler:"server_name" json:"name"`
|
||||
Host string `meddler:"server_host" json:"host"`
|
||||
User string `meddler:"server_user" json:"user"`
|
||||
Pass string `meddler:"server_pass" json:"name"`
|
||||
Cert string `meddler:"server_cert" json:"cert"`
|
||||
}
|
||||
|
||||
type SMTPServer struct {
|
||||
ID int64 `meddler:"smtp_id,pk" json:"id"`
|
||||
From string `meddler:"smtp_from" json:"from"`
|
||||
Host string `meddler:"smtp_host" json:"host"`
|
||||
Port string `meddler:"smtp_port" json:"port"`
|
||||
User string `meddler:"smtp_user" json:"user"`
|
||||
Pass string `meddler:"smtp_pass" json:"name"`
|
||||
}
|
Loading…
Reference in a new issue