github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/agent/fanconfigurer/fanconfigurer.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 package fanconfigurer 4 5 import ( 6 "github.com/juju/juju/apiserver/common" 7 "github.com/juju/juju/apiserver/common/networkingcommon" 8 "github.com/juju/juju/apiserver/facade" 9 "github.com/juju/juju/apiserver/params" 10 "github.com/juju/juju/state" 11 "github.com/juju/juju/state/watcher" 12 ) 13 14 // FanConfigurer defines the methods on fanconfigurer API endpoint. 15 type FanConfigurer interface { 16 WatchForFanConfigChanges() (params.NotifyWatchResult, error) 17 FanConfig() (params.FanConfigResult, error) 18 } 19 20 type FanConfigurerAPI struct { 21 model state.ModelAccessor 22 resources facade.Resources 23 } 24 25 var _ FanConfigurer = (*FanConfigurerAPI)(nil) 26 27 // NewFanConfigurerAPI creates a new FanConfigurer API endpoint on server-side. 28 func NewFanConfigurerAPI(st *state.State, resources facade.Resources, authorizer facade.Authorizer) (*FanConfigurerAPI, error) { 29 model, err := st.Model() 30 if err != nil { 31 return nil, err 32 } 33 return NewFanConfigurerAPIForModel(model, resources, authorizer) 34 } 35 36 func NewFanConfigurerAPIForModel(model state.ModelAccessor, resources facade.Resources, authorizer facade.Authorizer) (*FanConfigurerAPI, error) { 37 // Only machine agents have access to the fanconfigurer service. 38 if !authorizer.AuthMachineAgent() { 39 return nil, common.ErrPerm 40 } 41 42 return &FanConfigurerAPI{ 43 model: model, 44 resources: resources, 45 }, nil 46 } 47 48 // WatchForFanConfigChanges returns a NotifyWatcher that observes 49 // changes to the FAN configuration. 50 // so we use the regular error return. 51 // TODO(wpk) 2017-09-21 We should use Model directly, and watch only for FanConfig changes. 52 func (m *FanConfigurerAPI) WatchForFanConfigChanges() (params.NotifyWatchResult, error) { 53 result := params.NotifyWatchResult{} 54 watch := m.model.WatchForModelConfigChanges() 55 // Consume the initial event. Technically, API 56 // calls to Watch 'transmit' the initial event 57 // in the Watch response. But NotifyWatchers 58 // have no state to transmit. 59 if _, ok := <-watch.Changes(); ok { 60 result.NotifyWatcherId = m.resources.Register(watch) 61 } else { 62 return result, watcher.EnsureErr(watch) 63 } 64 return result, nil 65 } 66 67 // FanConfig returns current FAN configuration. 68 func (m *FanConfigurerAPI) FanConfig() (params.FanConfigResult, error) { 69 result := params.FanConfigResult{} 70 config, err := m.model.ModelConfig() 71 if err != nil { 72 return result, err 73 } 74 fanConfig, err := config.FanConfig() 75 if err != nil { 76 return result, err 77 } 78 return networkingcommon.FanConfigToFanConfigResult(fanConfig), nil 79 }