-
-
\ No newline at end of file
+
+
diff --git a/server/database/config.go b/server/database/config.go
index a04c5d520..7479dc8f2 100644
--- a/server/database/config.go
+++ b/server/database/config.go
@@ -1,5 +1,6 @@
package database
+/*
import (
"github.com/BurntSushi/toml"
"github.com/drone/drone/shared/model"
@@ -33,3 +34,4 @@ func NewConfigManager(filename string) ConfigManager {
func (c *configManager) Find() *model.Config {
return c.conf
}
+*/
diff --git a/server/database/remote.go b/server/database/remote.go
index 371b2a0c8..713cf3c52 100644
--- a/server/database/remote.go
+++ b/server/database/remote.go
@@ -14,6 +14,9 @@ type RemoteManager interface {
// FindHost finds the Remote by hostname.
FindHost(name string) (*model.Remote, error)
+ // FindHost finds the Remote by type.
+ FindType(t string) (*model.Remote, error)
+
// List finds all registered Remotes of the system.
List() ([]*model.Remote, error)
@@ -40,10 +43,19 @@ WHERE remote_host=?
LIMIT 1
`
+// SQL query to retrieve a Remote by remote login.
+const findRemoteTypeQuery = `
+SELECT *
+FROM remotes
+WHERE remote_type=?
+LIMIT 1
+`
+
// SQL query to retrieve a list of all Remotes.
const listRemoteQuery = `
SELECT *
FROM remotes
+ORDER BY remote_type
`
// SQL statement to delete a Remote by ID.
@@ -69,6 +81,12 @@ func (db *remoteManager) FindHost(host string) (*model.Remote, error) {
return &dst, err
}
+func (db *remoteManager) FindType(t string) (*model.Remote, error) {
+ dst := model.Remote{}
+ err := meddler.QueryRow(db, &dst, findRemoteTypeQuery, t)
+ return &dst, err
+}
+
func (db *remoteManager) List() ([]*model.Remote, error) {
var dst []*model.Remote
err := meddler.QueryAll(db, &dst, listRemoteQuery)
diff --git a/server/handler/commit.go b/server/handler/commit.go
index d5fb2f617..e6159fd00 100644
--- a/server/handler/commit.go
+++ b/server/handler/commit.go
@@ -6,7 +6,7 @@ import (
"github.com/drone/drone/server/database"
"github.com/drone/drone/server/session"
- "github.com/drone/drone/server/worker"
+ "github.com/drone/drone/shared/httputil"
"github.com/drone/drone/shared/model"
"github.com/gorilla/pat"
)
@@ -16,10 +16,10 @@ type CommitHandler struct {
repos database.RepoManager
commits database.CommitManager
sess session.Session
- queue chan *worker.Request
+ queue chan *model.Request
}
-func NewCommitHandler(repos database.RepoManager, commits database.CommitManager, perms database.PermManager, sess session.Session, queue chan *worker.Request) *CommitHandler {
+func NewCommitHandler(repos database.RepoManager, commits database.CommitManager, perms database.PermManager, sess session.Session, queue chan *model.Request) *CommitHandler {
return &CommitHandler{perms, repos, commits, sess, queue}
}
@@ -160,7 +160,8 @@ func (h *CommitHandler) PostCommit(w http.ResponseWriter, r *http.Request) error
// drop the items on the queue
// drop the items on the queue
go func() {
- h.queue <- &worker.Request{
+ h.queue <- &model.Request{
+ Host: httputil.GetURL(r),
Repo: repo,
Commit: c,
}
diff --git a/server/handler/config.go b/server/handler/config.go
deleted file mode 100644
index 7e904bd50..000000000
--- a/server/handler/config.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package handler
-
-import (
- "encoding/json"
- "net/http"
-
- "github.com/drone/drone/server/database"
- "github.com/drone/drone/server/session"
- "github.com/gorilla/pat"
-)
-
-type ConfigHandler struct {
- conf database.ConfigManager
- sess session.Session
-}
-
-func NewConfigHandler(conf database.ConfigManager, sess session.Session) *ConfigHandler {
- return &ConfigHandler{conf, sess}
-}
-
-// GetConfig gets the system configuration details.
-// GET /api/config
-func (h *ConfigHandler) GetConfig(w http.ResponseWriter, r *http.Request) error {
- // get the user form the session
- user := h.sess.User(r)
- if user == nil || !user.Admin {
- return notAuthorized{}
- }
-
- return json.NewEncoder(w).Encode(h.conf.Find())
-}
-
-func (h *ConfigHandler) Register(r *pat.Router) {
- r.Get("/v1/config", errorHandler(h.GetConfig))
-}
diff --git a/server/handler/hook.go b/server/handler/hook.go
index c88575dbd..7bc165b38 100644
--- a/server/handler/hook.go
+++ b/server/handler/hook.go
@@ -3,8 +3,9 @@ package handler
import (
"net/http"
+ "github.com/drone/drone/plugin/remote"
"github.com/drone/drone/server/database"
- "github.com/drone/drone/server/worker"
+ "github.com/drone/drone/shared/httputil"
"github.com/drone/drone/shared/model"
"github.com/gorilla/pat"
)
@@ -13,12 +14,12 @@ type HookHandler struct {
users database.UserManager
repos database.RepoManager
commits database.CommitManager
- conf database.ConfigManager
- queue chan *worker.Request
+ remotes database.RemoteManager
+ queue chan *model.Request
}
-func NewHookHandler(users database.UserManager, repos database.RepoManager, commits database.CommitManager, conf database.ConfigManager, queue chan *worker.Request) *HookHandler {
- return &HookHandler{users, repos, commits, conf, queue}
+func NewHookHandler(users database.UserManager, repos database.RepoManager, commits database.CommitManager, remotes database.RemoteManager, queue chan *model.Request) *HookHandler {
+ return &HookHandler{users, repos, commits, remotes, queue}
}
// PostHook receives a post-commit hook from GitHub, Bitbucket, etc
@@ -26,14 +27,21 @@ func NewHookHandler(users database.UserManager, repos database.RepoManager, comm
func (h *HookHandler) PostHook(w http.ResponseWriter, r *http.Request) error {
host := r.FormValue(":host")
- // get the remote system's client.
- remote := h.conf.Find().GetRemote(host)
- if remote == nil {
+ remoteServer, err := h.remotes.FindType(host)
+ if err != nil {
+ return notFound{err}
+ }
+
+ remotePlugin, ok := remote.Lookup(remoteServer.Type)
+ if !ok {
return notFound{}
}
+ // get the remote system's client.
+ plugin := remotePlugin(remoteServer)
+
// parse the hook payload
- hook, err := remote.GetHook(r)
+ hook, err := plugin.GetHook(r)
if err != nil {
return badRequest{err}
}
@@ -47,7 +55,7 @@ func (h *HookHandler) PostHook(w http.ResponseWriter, r *http.Request) error {
}
// fetch the repository from the database
- repo, err := h.repos.FindName(remote.GetHost(), hook.Owner, hook.Repo)
+ repo, err := h.repos.FindName(plugin.GetHost(), hook.Owner, hook.Repo)
if err != nil {
return notFound{}
}
@@ -66,7 +74,7 @@ func (h *HookHandler) PostHook(w http.ResponseWriter, r *http.Request) error {
}
// featch the .drone.yml file from the database
- client := remote.GetClient(user.Access, user.Secret)
+ client := plugin.GetClient(user.Access, user.Secret)
yml, err := client.GetScript(hook)
if err != nil {
return badRequest{err}
@@ -91,7 +99,8 @@ func (h *HookHandler) PostHook(w http.ResponseWriter, r *http.Request) error {
// drop the items on the queue
go func() {
- h.queue <- &worker.Request{
+ h.queue <- &model.Request{
+ Host: httputil.GetURL(r),
Repo: repo,
Commit: &c,
}
diff --git a/server/handler/login.go b/server/handler/login.go
index 92c45aa5c..12ddfc11f 100644
--- a/server/handler/login.go
+++ b/server/handler/login.go
@@ -5,6 +5,7 @@ import (
"net/http"
"time"
+ "github.com/drone/drone/plugin/remote"
"github.com/drone/drone/server/database"
"github.com/drone/drone/server/session"
"github.com/drone/drone/shared/model"
@@ -15,12 +16,13 @@ type LoginHandler struct {
users database.UserManager
repos database.RepoManager
perms database.PermManager
- conf database.ConfigManager
- sess session.Session
+ //conf database.ConfigManager
+ sess session.Session
+ remotes database.RemoteManager
}
-func NewLoginHandler(users database.UserManager, repos database.RepoManager, perms database.PermManager, sess session.Session, conf database.ConfigManager) *LoginHandler {
- return &LoginHandler{users, repos, perms, conf, sess}
+func NewLoginHandler(users database.UserManager, repos database.RepoManager, perms database.PermManager, sess session.Session /*conf database.ConfigManager,*/, remotes database.RemoteManager) *LoginHandler {
+ return &LoginHandler{users, repos, perms /*conf,*/, sess, remotes}
}
// GetLogin gets the login to the 3rd party remote system.
@@ -29,14 +31,21 @@ func (h *LoginHandler) GetLogin(w http.ResponseWriter, r *http.Request) error {
host := r.FormValue(":host")
redirect := "/"
- // get the remote system's client.
- remote := h.conf.Find().GetRemote(host)
- if remote == nil {
+ remoteServer, err := h.remotes.FindType(host)
+ if err != nil {
+ return notFound{err}
+ }
+
+ remotePlugin, ok := remote.Lookup(remoteServer.Type)
+ if !ok {
return notFound{}
}
+ // get the remote system's client.
+ plugin := remotePlugin(remoteServer)
+
// authenticate the user
- login, err := remote.GetLogin(w, r)
+ login, err := plugin.GetLogin(w, r)
if err != nil {
return badRequest{err}
} else if login == nil {
@@ -51,12 +60,12 @@ func (h *LoginHandler) GetLogin(w http.ResponseWriter, r *http.Request) error {
// if self-registration is disabled we should
// return a notAuthorized error. the only exception
// is if no users exist yet in the system we'll proceed.
- if h.conf.Find().Registration == false && h.users.Exist() {
+ if remoteServer.Open == false && h.users.Exist() {
return notAuthorized{}
}
// create the user account
- u = model.NewUser(remote.GetName(), login.Login, login.Email)
+ u = model.NewUser(plugin.GetName(), login.Login, login.Email)
u.Name = login.Name
u.SetEmail(login.Email)
@@ -102,7 +111,7 @@ func (h *LoginHandler) GetLogin(w http.ResponseWriter, r *http.Request) error {
// its own package / sync utility.
go func() {
// list all repositories
- client := remote.GetClient(u.Access, u.Secret)
+ client := plugin.GetClient(u.Access, u.Secret)
repos, err := client.GetRepos("")
if err != nil {
log.Println("Error syncing user account, listing repositories", u.Login, err)
@@ -111,7 +120,7 @@ func (h *LoginHandler) GetLogin(w http.ResponseWriter, r *http.Request) error {
// insert all repositories
for _, remoteRepo := range repos {
- repo, _ := model.NewRepo(remote.GetName(), remoteRepo.Owner, remoteRepo.Name)
+ repo, _ := model.NewRepo(plugin.GetName(), remoteRepo.Owner, remoteRepo.Name)
repo.Private = remoteRepo.Private
repo.Host = remoteRepo.Host
repo.CloneURL = remoteRepo.Clone
@@ -131,13 +140,13 @@ func (h *LoginHandler) GetLogin(w http.ResponseWriter, r *http.Request) error {
}
log.Println("Successfully syced repo.", u.Login+"/"+remoteRepo.Name)
+ }
- u.Synced = time.Now().Unix()
- u.Syncing = false
- if err := h.users.Update(u); err != nil {
- log.Println("Error syncing user account, updating sync date", u.Login, err)
- return
- }
+ u.Synced = time.Now().UTC().Unix()
+ u.Syncing = false
+ if err := h.users.Update(u); err != nil {
+ log.Println("Error syncing user account, updating sync date", u.Login, err)
+ return
}
}()
}
diff --git a/server/handler/remote.go b/server/handler/remote.go
index bc4b664d8..30cea09a4 100644
--- a/server/handler/remote.go
+++ b/server/handler/remote.go
@@ -38,6 +38,23 @@ func (h *RemoteHandler) GetRemotes(w http.ResponseWriter, r *http.Request) error
return json.NewEncoder(w).Encode(remotes)
}
+// GetRemoteLogins gets all remote logins.
+// GET /api/remotes/logins
+func (h *RemoteHandler) GetRemoteLogins(w http.ResponseWriter, r *http.Request) error {
+ remotes, err := h.remotes.List()
+ if err != nil {
+ return internalServerError{err}
+ }
+ var logins []interface{}
+ for _, remote := range remotes {
+ logins = append(logins, struct {
+ Type string `json:"type"`
+ Host string `json:"host"`
+ }{remote.Type, remote.Host})
+ }
+ return json.NewEncoder(w).Encode(&logins)
+}
+
// PostRemote creates a new remote.
// POST /api/remotes
func (h *RemoteHandler) PostRemote(w http.ResponseWriter, r *http.Request) error {
@@ -57,7 +74,6 @@ func (h *RemoteHandler) PostRemote(w http.ResponseWriter, r *http.Request) error
if err := json.NewDecoder(r.Body).Decode(&in); err != nil {
return badRequest{err}
}
-
uri, err := url.Parse(in.URL)
if err != nil {
return badRequest{err}
@@ -65,7 +81,8 @@ func (h *RemoteHandler) PostRemote(w http.ResponseWriter, r *http.Request) error
in.Host = uri.Host
// there is an edge case where, during installation, a user could attempt
- // to add the same result multiple times.
+ // to add the same result multiple times. In this case we will delete
+ // the old remote prior to adding the new one.
if remote, err := h.remotes.FindHost(in.Host); err == nil && h.users.Exist() {
h.remotes.Delete(remote)
}
@@ -78,31 +95,50 @@ func (h *RemoteHandler) PostRemote(w http.ResponseWriter, r *http.Request) error
return json.NewEncoder(w).Encode(&in)
}
-// DeleteRemote delete the remote.
-// GET /api/remotes/:name
-func (h *RemoteHandler) DeleteRemote(w http.ResponseWriter, r *http.Request) error {
- host := r.FormValue(":host")
-
+// PutRemote updates an existing remote.
+// PUT /api/remotes
+func (h *RemoteHandler) PutRemote(w http.ResponseWriter, r *http.Request) error {
// get the user form the session
user := h.sess.User(r)
if user == nil || !user.Admin {
return notAuthorized{}
}
- // get the remote
- remote, err := h.remotes.FindHost(host)
+ // unmarshal the remote from the payload
+ defer r.Body.Close()
+ in := model.Remote{}
+ if err := json.NewDecoder(r.Body).Decode(&in); err != nil {
+ return badRequest{err}
+ }
+ uri, err := url.Parse(in.URL)
+ if err != nil {
+ return badRequest{err}
+ }
+ in.Host = uri.Host
+
+ // retrieve the remote and return an error if not exists
+ remote, err := h.remotes.FindHost(in.Host)
if err != nil {
return notFound{err}
}
- if err := h.remotes.Delete(remote); err != nil {
+
+ // update the remote details
+ remote.API = in.API
+ remote.URL = in.URL
+ remote.Host = in.Host
+ remote.Client = in.Client
+ remote.Secret = in.Secret
+
+ // insert the remote in the database
+ if err := h.remotes.Update(remote); err != nil {
return internalServerError{err}
}
- w.WriteHeader(http.StatusNoContent)
- return nil
+ return json.NewEncoder(w).Encode(remote)
}
func (h *RemoteHandler) Register(r *pat.Router) {
- r.Delete("/v1/remotes/:name", errorHandler(h.DeleteRemote))
- r.Post("/v1/remotes", errorHandler(h.PostRemote))
+ r.Get("/v1/logins", errorHandler(h.GetRemoteLogins))
r.Get("/v1/remotes", errorHandler(h.GetRemotes))
+ r.Post("/v1/remotes", errorHandler(h.PostRemote))
+ r.Put("/v1/remotes", errorHandler(h.PutRemote))
}
diff --git a/server/handler/repo.go b/server/handler/repo.go
index 33f625add..c53ad6862 100644
--- a/server/handler/repo.go
+++ b/server/handler/repo.go
@@ -5,6 +5,7 @@ import (
"fmt"
"net/http"
+ "github.com/drone/drone/plugin/remote"
"github.com/drone/drone/server/database"
"github.com/drone/drone/server/session"
"github.com/drone/drone/shared/httputil"
@@ -14,7 +15,7 @@ import (
)
type RepoHandler struct {
- conf database.ConfigManager
+ remotes database.RemoteManager
commits database.CommitManager
perms database.PermManager
repos database.RepoManager
@@ -22,8 +23,8 @@ type RepoHandler struct {
}
func NewRepoHandler(repos database.RepoManager, commits database.CommitManager,
- perms database.PermManager, sess session.Session, conf database.ConfigManager) *RepoHandler {
- return &RepoHandler{conf, commits, perms, repos, sess}
+ perms database.PermManager, sess session.Session, remotes database.RemoteManager) *RepoHandler {
+ return &RepoHandler{remotes, commits, perms, repos, sess}
}
// GetRepo gets the named repository.
@@ -105,16 +106,24 @@ func (h *RepoHandler) PostRepo(w http.ResponseWriter, r *http.Request) error {
repo.PrivateKey = sshutil.MarshalPrivateKey(key)
// get the remote and client
- remote := h.conf.Find().GetRemote(host)
- if remote == nil {
+ remoteServer, err := h.remotes.FindType(repo.Remote)
+ if err != nil {
+ return notFound{err}
+ }
+
+ remotePlugin, ok := remote.Lookup(remoteServer.Type)
+ if !ok {
return notFound{}
}
+ // get the remote system's client.
+ plugin := remotePlugin(remoteServer)
+
// post commit hook url
- hook := fmt.Sprintf("%s://%s/v1/hook/%s", httputil.GetScheme(r), httputil.GetHost(r), remote.GetName())
+ hook := fmt.Sprintf("%s://%s/v1/hook/%s", httputil.GetScheme(r), httputil.GetHost(r), plugin.GetName())
// activate the repository in the remote system
- client := remote.GetClient(user.Access, user.Secret)
+ client := plugin.GetClient(user.Access, user.Secret)
if err := client.SetActive(owner, name, hook, repo.PublicKey); err != nil {
return badRequest{err}
}
diff --git a/server/handler/ws.go b/server/handler/ws.go
index f6c7e3687..8086d3ae1 100644
--- a/server/handler/ws.go
+++ b/server/handler/ws.go
@@ -9,7 +9,6 @@ import (
"github.com/drone/drone/server/database"
"github.com/drone/drone/server/pubsub"
"github.com/drone/drone/server/session"
- "github.com/drone/drone/server/worker"
"github.com/drone/drone/shared/model"
"github.com/gorilla/pat"
@@ -72,7 +71,7 @@ func (h *WsHandler) WsUser(w http.ResponseWriter, r *http.Request) error {
for {
select {
case msg := <-sub.Read():
- work, ok := msg.(*worker.Request)
+ work, ok := msg.(*model.Request)
if !ok {
break
}
@@ -203,7 +202,7 @@ func readWebsocket(ws *websocket.Conn) {
// will be removed prior to release
func (h *WsHandler) Ping(w http.ResponseWriter, r *http.Request) error {
channel := h.pubsub.Register("_global")
- msg := worker.Request{
+ msg := model.Request{
Repo: &model.Repo{ID: 1, Private: false, Host: "github.com", Owner: "drone", Name: "drone"},
Commit: &model.Commit{ID: 1, Status: "Started", Branch: "master", Sha: "113f4917ff9174945388d86395f902cd154074cb", Message: "Remove branches by SCM hook", Author: "bradrydzewski", Gravatar: "8c58a0be77ee441bb8f8595b7f1b4e87"},
}
diff --git a/server/main.go b/server/main.go
index 76811aae0..a8ff57616 100644
--- a/server/main.go
+++ b/server/main.go
@@ -25,6 +25,10 @@ import (
"github.com/GeertJohan/go.rice"
_ "github.com/mattn/go-sqlite3"
"github.com/russross/meddler"
+
+ _ "github.com/drone/drone/plugin/remote/bitbucket"
+ _ "github.com/drone/drone/plugin/remote/github"
+ _ "github.com/drone/drone/plugin/remote/gitlab"
)
var (
@@ -79,7 +83,7 @@ func main() {
commits := database.NewCommitManager(db)
servers := database.NewServerManager(db)
remotes := database.NewRemoteManager(db)
- configs := database.NewConfigManager(filepath.Join(home, "config.toml"))
+ //configs := database.NewConfigManager(filepath.Join(home, "config.toml"))
// message broker
pubsub := pubsub.NewPubSub()
@@ -87,10 +91,10 @@ func main() {
// cancel all previously running builds
go commits.CancelAll()
- queue := make(chan *worker.Request)
- workers := make(chan chan *worker.Request)
+ queue := make(chan *model.Request)
+ workers := make(chan chan *model.Request)
worker.NewDispatch(queue, workers).Start()
- worker.NewWorker(workers, users, repos, commits, configs, pubsub, &model.Server{}).Start()
+ worker.NewWorker(workers, users, repos, commits, pubsub, &model.Server{}).Start()
// setup the session managers
sess := session.NewSession(users)
@@ -99,13 +103,13 @@ func main() {
router := pat.New()
handler.NewUsersHandler(users, sess).Register(router)
handler.NewUserHandler(users, repos, commits, sess).Register(router)
- handler.NewHookHandler(users, repos, commits, configs, queue).Register(router)
- handler.NewLoginHandler(users, repos, perms, sess, configs).Register(router)
+ handler.NewHookHandler(users, repos, commits, remotes, queue).Register(router)
+ handler.NewLoginHandler(users, repos, perms, sess, remotes).Register(router)
handler.NewCommitHandler(repos, commits, perms, sess, queue).Register(router)
handler.NewBranchHandler(repos, commits, perms, sess).Register(router)
- handler.NewRepoHandler(repos, commits, perms, sess, configs).Register(router)
+ handler.NewRepoHandler(repos, commits, perms, sess, remotes).Register(router)
handler.NewBadgeHandler(repos, commits).Register(router)
- handler.NewConfigHandler(configs, sess).Register(router)
+ //handler.NewConfigHandler(configs, sess).Register(router)
handler.NewServerHandler(servers, sess).Register(router)
handler.NewRemoteHandler(users, remotes, sess).Register(router)
handler.NewWsHandler(repos, commits, perms, sess, pubsub).Register(router)
diff --git a/server/worker/dispatch.go b/server/worker/dispatch.go
index 76a1aeac8..614dcb6e7 100644
--- a/server/worker/dispatch.go
+++ b/server/worker/dispatch.go
@@ -1,14 +1,18 @@
package worker
+import (
+ "github.com/drone/drone/shared/model"
+)
+
// http://nesv.github.io/golang/2014/02/25/worker-queues-in-go.html
type Dispatch struct {
- requests chan *Request
- workers chan chan *Request
+ requests chan *model.Request
+ workers chan chan *model.Request
quit chan bool
}
-func NewDispatch(requests chan *Request, workers chan chan *Request) *Dispatch {
+func NewDispatch(requests chan *model.Request, workers chan chan *model.Request) *Dispatch {
return &Dispatch{
requests: requests,
workers: workers,
diff --git a/server/worker/request.go b/server/worker/request.go
deleted file mode 100644
index b9eb44305..000000000
--- a/server/worker/request.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package worker
-
-import (
- "github.com/drone/drone/shared/model"
-)
-
-type Request struct {
- User *model.User `json:"-"`
- Repo *model.Repo `json:"repo"`
- Commit *model.Commit `json:"commit"`
- server *model.Server
-}
diff --git a/server/worker/worker.go b/server/worker/worker.go
index 50f7ea401..5b1aafd34 100644
--- a/server/worker/worker.go
+++ b/server/worker/worker.go
@@ -24,25 +24,25 @@ type worker struct {
users database.UserManager
repos database.RepoManager
commits database.CommitManager
- config database.ConfigManager
- pubsub *pubsub.PubSub
- server *model.Server
+ //config database.ConfigManager
+ pubsub *pubsub.PubSub
+ server *model.Server
- request chan *Request
- dispatch chan chan *Request
+ request chan *model.Request
+ dispatch chan chan *model.Request
quit chan bool
}
-func NewWorker(dispatch chan chan *Request, users database.UserManager, repos database.RepoManager, commits database.CommitManager, config database.ConfigManager, pubsub *pubsub.PubSub, server *model.Server) Worker {
+func NewWorker(dispatch chan chan *model.Request, users database.UserManager, repos database.RepoManager, commits database.CommitManager /*config database.ConfigManager,*/, pubsub *pubsub.PubSub, server *model.Server) Worker {
return &worker{
- users: users,
- repos: repos,
- commits: commits,
- config: config,
+ users: users,
+ repos: repos,
+ commits: commits,
+ //config: config,
pubsub: pubsub,
server: server,
dispatch: dispatch,
- request: make(chan *Request),
+ request: make(chan *model.Request),
quit: make(chan bool),
}
}
@@ -59,7 +59,7 @@ func (w *worker) Start() {
select {
case r := <-w.request:
// handle the request
- r.server = w.server
+ r.Server = w.server
w.Execute(r)
case <-w.quit:
@@ -78,7 +78,7 @@ func (w *worker) Stop() {
// Execute executes the work Request, persists the
// results to the database, and sends event messages
// to the pubsub (for websocket updates on the website).
-func (w *worker) Execute(r *Request) {
+func (w *worker) Execute(r *model.Request) {
// mark the build as Started and update the database
r.Commit.Status = model.StatusStarted
r.Commit.Started = time.Now().UTC().Unix()
@@ -123,6 +123,11 @@ func (w *worker) Execute(r *Request) {
dockerClient = docker.NewHost(w.server.Host)
}
+ // send all "started" notifications
+ if script.Notifications != nil {
+ script.Notifications.Send(r)
+ }
+
// create an instance of the Docker builder
builder := build.New(dockerClient)
builder.Build = script
@@ -162,5 +167,9 @@ func (w *worker) Execute(r *Request) {
// todo(bradrydzewski) update github status API
// todo(bradrydzewski) send email notifications
- // todo(bradrydzewski) send other notifications
+
+ // send all "finished" notifications
+ if script.Notifications != nil {
+ script.Notifications.Send(r)
+ }
}
diff --git a/shared/model/config.go b/shared/model/config.go
deleted file mode 100644
index f9c21fb09..000000000
--- a/shared/model/config.go
+++ /dev/null
@@ -1,94 +0,0 @@
-package model
-
-import (
- "github.com/drone/drone/plugin/remote"
- "github.com/drone/drone/plugin/remote/bitbucket"
- "github.com/drone/drone/plugin/remote/github"
- "github.com/drone/drone/plugin/remote/gitlab"
- "github.com/drone/drone/plugin/remote/stash"
- "github.com/drone/drone/plugin/smtp"
-)
-
-type Config struct {
- // Hostname of the server, eg drone.io
- //Host string `json:"host"`
-
- // Scheme of the server, eg https
- //Scheme string `json:"scheme"`
-
- // Registration with a value of True allows developers
- // to register themselves. If false, must be approved
- // or invited by the system administrator.
- Registration bool `json:"registration"`
-
- // SMTP stores configuration details for connecting with
- // and smtp server to send email notifications.
- SMTP *smtp.SMTP `json:"smtp"`
-
- // Bitbucket stores configuration details for communicating
- // with the bitbucket.org public cloud service.
- Bitbucket *bitbucket.Bitbucket `json:"bitbucket"`
-
- // Github stores configuration details for communicating
- // with the github.com public cloud service.
- Github *github.Github `json:"github"`
-
- // GithubEnterprise stores configuration details for
- // communicating with a private Github installation.
- GithubEnterprise *github.Github `json:"githubEnterprise"`
-
- // Gitlab stores configuration details for communicating
- // with a private gitlab installation.
- Gitlab *gitlab.Gitlab `json:"gitlab"`
-
- // Stash stores configuration details for communicating
- // with a private Atlassian Stash installation.
- Stash *stash.Stash `json:"stash"`
-}
-
-// GetRemote is a helper function that will return the
-// remote plugin name based on the specified hostname.
-func (c *Config) GetRemote(name string) remote.Remote {
- // first attempt to get the remote instance
- // by the unique plugin name (ie enterprise.github.com)
- switch name {
- case c.Github.GetName():
- return c.Github
- case c.Bitbucket.GetName():
- return c.Bitbucket
- case c.GithubEnterprise.GetName():
- return c.GithubEnterprise
- case c.Gitlab.GetName():
- return c.Gitlab
- case c.Stash.GetName():
- return c.Stash
- }
-
- // else attempt to get the remote instance
- // by the hostname (ie github.drone.io)
- switch {
- case c.Github.IsMatch(name):
- return c.Github
- case c.Bitbucket.IsMatch(name):
- return c.Bitbucket
- case c.GithubEnterprise.IsMatch(name):
- return c.GithubEnterprise
- case c.Gitlab.IsMatch(name):
- return c.Gitlab
- case c.Stash.IsMatch(name):
- return c.Stash
- }
-
- // else none found
- return nil
-}
-
-// GetClient is a helper function taht will return the named
-// remote plugin client, used to interact with the remote system.
-func (c *Config) GetClient(name, access, secret string) remote.Client {
- remote := c.GetRemote(name)
- if remote == nil {
- return nil
- }
- return remote.GetClient(access, secret)
-}
diff --git a/shared/model/request.go b/shared/model/request.go
new file mode 100644
index 000000000..ca3ec3fbc
--- /dev/null
+++ b/shared/model/request.go
@@ -0,0 +1,9 @@
+package model
+
+type Request struct {
+ Host string `json:"-"`
+ User *User `json:"-"`
+ Repo *Repo `json:"repo"`
+ Commit *Commit `json:"commit"`
+ Server *Server `json:"-"`
+}