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  }