/
router.go
122 lines (106 loc) · 4.07 KB
/
router.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package v1
import (
"github.com/SotirisAlfonsos/chaos-master/config"
"github.com/SotirisAlfonsos/chaos-master/healthcheck"
"github.com/SotirisAlfonsos/chaos-master/pkg/chaoslogger"
"github.com/SotirisAlfonsos/chaos-master/pkg/network"
"github.com/SotirisAlfonsos/chaos-master/web/api/v1/cpu"
"github.com/SotirisAlfonsos/chaos-master/web/api/v1/docker"
apiNetwork "github.com/SotirisAlfonsos/chaos-master/web/api/v1/network"
"github.com/SotirisAlfonsos/chaos-master/web/api/v1/recover"
"github.com/SotirisAlfonsos/chaos-master/web/api/v1/server"
"github.com/SotirisAlfonsos/chaos-master/web/api/v1/service"
"github.com/SotirisAlfonsos/gocache"
"github.com/gorilla/mux"
httpSwagger "github.com/swaggo/http-swagger"
)
type APIRouter struct {
jobMap map[string]*config.Job
connections *network.Connections
Cache *gocache.Cache
loggers chaoslogger.Loggers
}
func NewAPIRouter(
jobMap map[string]*config.Job,
connections *network.Connections,
cache *gocache.Cache,
loggers chaoslogger.Loggers,
) *APIRouter {
return &APIRouter{
jobMap: jobMap,
connections: connections,
Cache: cache,
loggers: loggers,
}
}
func (r *APIRouter) AddRoutes(healthChecker *healthcheck.HealthChecker, router *mux.Router) *mux.Router {
base := "/chaos/api/v1"
router = router.PathPrefix(base).Subrouter()
setBotRouters(router, r)
setRecoverRouter(router, r)
if healthChecker != nil {
setStatusRouter(healthChecker, router, r.loggers)
}
setSwaggerRouter(router)
return router
}
func setBotRouters(router *mux.Router, r *APIRouter) {
serviceControllerRouter(router, r)
dockerControllerRouter(router, r)
cpuControllerRouter(router, r)
serverControllerRouter(router, r)
networkControllerRouter(router, r)
}
func setRecoverRouter(router *mux.Router, r *APIRouter) {
rController := recover.NewRecoverController(r.Cache, r.loggers)
router.HandleFunc("/recover", rController.RecoverAction).
Methods("POST")
router.HandleFunc("/recover/alertmanager", rController.RecoverActionAlertmanagerWebHook).
Methods("POST")
}
func setStatusRouter(healthChecker *healthcheck.HealthChecker, router *mux.Router, loggers chaoslogger.Loggers) {
statusController := &Bots{StatusMap: healthChecker.DetailsMap, Loggers: loggers}
router.HandleFunc("/master/status", statusController.Status).Methods("GET")
}
func serviceControllerRouter(router *mux.Router, r *APIRouter) {
sController := service.NewServiceController(filterJobsOnType(r.jobMap, config.Service), r.connections, r.Cache, r.loggers)
router.HandleFunc("/service", sController.ServiceAction).
Queries("action", "{action}").
Methods("POST")
}
func dockerControllerRouter(router *mux.Router, r *APIRouter) {
dController := docker.NewDockerController(filterJobsOnType(r.jobMap, config.Docker), r.connections, r.Cache, r.loggers)
router.HandleFunc("/docker", dController.DockerAction).
Queries("action", "{action}").
Methods("POST")
}
func cpuControllerRouter(router *mux.Router, r *APIRouter) {
cController := cpu.NewCPUController(filterJobsOnType(r.jobMap, config.CPU), r.connections, r.Cache, r.loggers)
router.HandleFunc("/cpu", cController.CPUAction).
Queries("action", "{action}").
Methods("POST")
}
func serverControllerRouter(router *mux.Router, r *APIRouter) {
s := server.NewServerController(filterJobsOnType(r.jobMap, config.Server), r.connections, r.loggers)
router.HandleFunc("/server", s.ServerAction).
Queries("action", "{action}").
Methods("POST")
}
func networkControllerRouter(router *mux.Router, r *APIRouter) {
n := apiNetwork.NewNetworkController(filterJobsOnType(r.jobMap, config.Network), r.connections, r.Cache, r.loggers)
router.HandleFunc("/network", n.NetworkAction).
Queries("action", "{action}").
Methods("POST")
}
func filterJobsOnType(jobMap map[string]*config.Job, failureType config.FailureType) map[string]*config.Job {
newJobMap := make(map[string]*config.Job)
for target, job := range jobMap {
if job.FailureType == failureType {
newJobMap[target] = job
}
}
return newJobMap
}
func setSwaggerRouter(router *mux.Router) {
router.PathPrefix("/swagger").Handler(httpSwagger.WrapHandler)
}