120
//
121
// EXPERIMENTAL: This feature is subject to change.
122
Remote *RemoteAdmin `json:"remote,omitempty"`
123
-
124
- // Holds onto the routers so that we can later provision them
125
- // if they require provisioning.
126
- routers []AdminRouter
123
}
124
125
// ConfigSettings configures the management of configuration.
218
219
// newAdminHandler reads admin's config and returns an http.Handler suitable
220
// for use in an admin endpoint server, which will be listening on listenAddr.
225
-func (admin *AdminConfig) newAdminHandler(addr NetworkAddress, remote bool, _ Context) adminHandler {
221
+func (admin *AdminConfig) newAdminHandler(addr NetworkAddress, remote bool, ctx Context) (adminHandler, error) {
222
muxWrap := adminHandler{mux: http.NewServeMux()}
223
224
// secure the local or remote endpoint respectively
275
// register third-party module endpoints
276
for _, m := range GetModules("admin.api") {
277
router := m.New().(AdminRouter)
282
- for _, route := range router.Routes() {
283
- addRoute(route.Pattern, handlerLabel, route.Handler)
284
- }
285
- admin.routers = append(admin.routers, router)
286
- }
278
288
- return muxWrap
289
-}
290
-
291
-// provisionAdminRouters provisions all the router modules
292
-// in the admin.api namespace that need provisioning.
293
-func (admin *AdminConfig) provisionAdminRouters(ctx Context) error {
294
- for _, router := range admin.routers {
295
- provisioner, ok := router.(Provisioner)
296
- if !ok {
297
- continue
279
+ // provision the router before registering its routes, so
280
+ // handlers have access to all provisioned state
281
+ if provisioner, ok := router.(Provisioner); ok {
282
+ if err := provisioner.Provision(ctx); err != nil {
283
+ return adminHandler{}, fmt.Errorf("provisioning admin router module %s: %v", m.ID, err)
284
+ }
285
}
286
300
- err := provisioner.Provision(ctx)
301
- if err != nil {
302
- return err
287
+ for _, route := range router.Routes() {
288
+ addRoute(route.Pattern, handlerLabel, route.Handler)
289
}
290
}
291
306
- // We no longer need the routers once provisioned, allow for GC
307
- admin.routers = nil
308
-
309
- return nil
292
+ return muxWrap, nil
293
}
294
295
// allowedOrigins returns a list of origins that are allowed.
413
return err
414
}
415
433
- handler := cfg.Admin.newAdminHandler(addr, false, ctx)
434
-
435
- // run the provisioners for loaded modules to make sure local
436
- // state is properly re-initialized in the new admin server
437
- err = cfg.Admin.provisionAdminRouters(ctx)
416
+ handler, err := cfg.Admin.newAdminHandler(addr, false, ctx)
417
if err != nil {
418
return err
419
}
537
538
// make the HTTP handler but disable Host/Origin enforcement
539
// because we are using TLS authentication instead
561
- handler := cfg.Admin.newAdminHandler(addr, true, ctx)
562
-
563
- // run the provisioners for loaded modules to make sure local
564
- // state is properly re-initialized in the new admin server
565
- err = cfg.Admin.provisionAdminRouters(ctx)
540
+ handler, err := cfg.Admin.newAdminHandler(addr, true, ctx)
541
if err != nil {
542
return err
543
}