@@ -5,9 +5,11 @@ import (
55 "io/ioutil"
66 "log"
77 "net/http"
8+ "os"
89 "strings"
910 "sync"
1011
12+ "github.com/gookit/color"
1113 "github.com/gorilla/mux"
1214 "github.com/imdario/mergo"
1315)
@@ -101,10 +103,10 @@ func BatchRequest(server string, batch map[string]ViewJob) BatchResponse {
101103}
102104
103105func GetViewDefintions () map [string ]ViewDefinition {
104- dat , err := ioutil .ReadFile ("./views.json" )
106+ dat , err := ioutil .ReadFile (os . Getenv ( "CONFIG_FILE" ) )
105107
106108 if err != nil {
107- log .Fatal (err )
109+ log .Fatal ("Config file not found" )
108110 }
109111
110112 var viewDefinitions map [string ]ViewDefinition
@@ -114,79 +116,89 @@ func GetViewDefintions() map[string]ViewDefinition {
114116 return viewDefinitions
115117}
116118
117- func BatchHandler (w http.ResponseWriter , r * http.Request ) {
118- b , err := ioutil .ReadAll (r .Body )
119+ func BatchHandler (viewDefinitions map [string ]ViewDefinition ) func (w http.ResponseWriter , r * http.Request ) {
120+ return func (w http.ResponseWriter , r * http.Request ) {
121+ b , err := ioutil .ReadAll (r .Body )
119122
120- if err != nil {
121- log .Fatal (err )
122- }
123-
124- var viewRequests map [string ]ViewJob
125-
126- json .Unmarshal (b , & viewRequests )
123+ if err != nil {
124+ log .Fatal (err )
125+ }
127126
128- viewDefinitions := GetViewDefintions ()
127+ var viewRequests map [ string ] ViewJob
129128
130- aggregatedResponse := BatchResponse {
131- Results : make (map [string ]ViewJobResult ),
132- }
129+ json .Unmarshal (b , & viewRequests )
133130
134- batches := make (map [string ]map [string ]ViewJob )
131+ aggregatedResponse := BatchResponse {
132+ Results : make (map [string ]ViewJobResult ),
133+ }
135134
136- for uuid , job := range viewRequests {
137- server := viewDefinitions [job .Name ].Server
135+ batches := make (map [string ]map [string ]ViewJob )
136+
137+ for uuid , job := range viewRequests {
138+ server := viewDefinitions [job .Name ].Server
139+
140+ if server == "" {
141+ aggregatedResponse .Results [uuid ] = ViewJobResult {
142+ Name : job .Name ,
143+ Success : false ,
144+ Error : ViewJobError {
145+ Name : "ReferenceError" ,
146+ Message : "Component\" " + job .Name + "\" not registered in cluster" ,
147+ },
148+ }
149+ continue
150+ }
138151
139- if server == "" {
140- aggregatedResponse .Results [uuid ] = ViewJobResult {
141- Name : job .Name ,
142- Success : false ,
143- Error : ViewJobError {
144- Name : "ReferenceError" ,
145- Message : "Component\" " + job .Name + "\" not registered in cluster" ,
146- },
152+ if batches [server ] == nil {
153+ batch := make (map [string ]ViewJob )
154+ batches [server ] = batch
147155 }
148- continue
149- }
150156
151- if batches [server ] == nil {
152- batch := make (map [string ]ViewJob )
153- batches [server ] = batch
157+ batches [server ][uuid ] = job
154158 }
155159
156- batches [ server ][ uuid ] = job
157- }
160+ var wg sync. WaitGroup
161+ var batchResponsesMap sync. Map
158162
159- var wg sync. WaitGroup
160- var batchResponsesMap sync. Map
163+ for server , batch := range batches {
164+ wg . Add ( 1 )
161165
162- for server , batch := range batches {
163- wg .Add (1 )
166+ go func (server string , batch map [string ]ViewJob ) {
167+ response := BatchRequest (server , batch )
168+ batchResponsesMap .Store (server , response )
169+ defer wg .Done ()
170+ }(server , batch )
171+ }
164172
165- go func (server string , batch map [string ]ViewJob ) {
166- response := BatchRequest (server , batch )
167- batchResponsesMap .Store (server , response )
168- defer wg .Done ()
169- }(server , batch )
170- }
173+ wg .Wait ()
171174
172- wg .Wait ()
175+ for server := range batches {
176+ response , _ := batchResponsesMap .Load (server )
173177
174- for server := range batches {
175- response , _ := batchResponsesMap .Load (server )
178+ batchResponse := response .(BatchResponse )
179+ mergo .Merge (& aggregatedResponse .Results , batchResponse .Results )
180+ }
176181
177- batchResponse := response .( BatchResponse )
178- mergo . Merge ( & aggregatedResponse . Results , batchResponse . Results )
182+ w . Header (). Add ( "Content-Type" , "application/json" )
183+ json . NewEncoder ( w ). Encode ( aggregatedResponse )
179184 }
180-
181- w .Header ().Add ("Content-Type" , "application/json" )
182- json .NewEncoder (w ).Encode (aggregatedResponse )
183185}
184186
185187func main () {
186188
187189 router := mux .NewRouter ()
188190 router .Use (corsMiddleware )
189191
190- router .HandleFunc ("/batch" , BatchHandler ).Methods ("OPTIONS" , "POST" )
191- http .ListenAndServe (":8000" , router )
192+ viewDefinitions := GetViewDefintions ()
193+
194+ router .HandleFunc ("/batch" , BatchHandler (viewDefinitions )).Methods ("OPTIONS" , "POST" )
195+
196+ port := os .Getenv ("PORT" )
197+
198+ if len (port ) == 0 {
199+ port = "8000"
200+ }
201+
202+ color .Info .Printf ("Nova cluster running on http://0.0.0.0:%s\n " , port )
203+ http .ListenAndServe (":" + port , router )
192204}
0 commit comments