github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/api/networker/networker.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package networker
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/names"
     9  
    10  	"github.com/juju/juju/api/base"
    11  	"github.com/juju/juju/api/watcher"
    12  	"github.com/juju/juju/apiserver/params"
    13  	"github.com/juju/juju/network"
    14  )
    15  
    16  const networkerFacade = "Networker"
    17  
    18  // State provides access to an networker worker's view of the state.
    19  //
    20  // NOTE: This is defined as an interface due to PPC64 bug #1424669 -
    21  // if it were a type build errors happen (due to a linker bug).
    22  type State interface {
    23  	MachineNetworkConfig(names.MachineTag) ([]network.InterfaceInfo, error)
    24  	WatchInterfaces(names.MachineTag) (watcher.NotifyWatcher, error)
    25  }
    26  
    27  var _ State = (*state)(nil)
    28  
    29  // state implements State.
    30  type state struct {
    31  	facade base.FacadeCaller
    32  }
    33  
    34  // NewState creates a new client-side Machiner facade.
    35  func NewState(caller base.APICaller) State {
    36  	return &state{base.NewFacadeCaller(caller, networkerFacade)}
    37  }
    38  
    39  // MachineNetworkConfig returns information about network interfaces to
    40  // setup only for a single machine.
    41  func (st *state) MachineNetworkConfig(tag names.MachineTag) ([]network.InterfaceInfo, error) {
    42  	args := params.Entities{
    43  		Entities: []params.Entity{{Tag: tag.String()}},
    44  	}
    45  	var results params.MachineNetworkConfigResults
    46  	err := st.facade.FacadeCall("MachineNetworkConfig", args, &results)
    47  	if err != nil {
    48  		if params.IsCodeNotImplemented(err) {
    49  			// Fallback to former name.
    50  			err = st.facade.FacadeCall("MachineNetworkInfo", args, &results)
    51  		}
    52  		if err != nil {
    53  			// TODO: Not directly tested.
    54  			return nil, err
    55  		}
    56  	}
    57  	if len(results.Results) != 1 {
    58  		// TODO: Not directly tested
    59  		err = errors.Errorf("expected one result, got %d", len(results.Results))
    60  		return nil, err
    61  	}
    62  	result := results.Results[0]
    63  	if result.Error != nil {
    64  		return nil, result.Error
    65  	}
    66  	interfaceInfo := make([]network.InterfaceInfo, len(result.Config))
    67  	for i, ifaceInfo := range result.Config {
    68  		interfaceInfo[i].DeviceIndex = ifaceInfo.DeviceIndex
    69  		interfaceInfo[i].MACAddress = ifaceInfo.MACAddress
    70  		interfaceInfo[i].CIDR = ifaceInfo.CIDR
    71  		interfaceInfo[i].NetworkName = ifaceInfo.NetworkName
    72  		interfaceInfo[i].ProviderId = network.Id(ifaceInfo.ProviderId)
    73  		interfaceInfo[i].VLANTag = ifaceInfo.VLANTag
    74  		interfaceInfo[i].InterfaceName = ifaceInfo.InterfaceName
    75  		interfaceInfo[i].Disabled = ifaceInfo.Disabled
    76  		// TODO(dimitern) Once we store all the information from
    77  		// network.InterfaceInfo in state, change this as needed to
    78  		// return it.
    79  	}
    80  
    81  	return interfaceInfo, nil
    82  }
    83  
    84  // WatchInterfaces returns a NotifyWatcher that notifies of changes to network
    85  // interfaces on the machine.
    86  func (st *state) WatchInterfaces(tag names.MachineTag) (watcher.NotifyWatcher, error) {
    87  	args := params.Entities{
    88  		Entities: []params.Entity{{Tag: tag.String()}},
    89  	}
    90  	var results params.NotifyWatchResults
    91  	err := st.facade.FacadeCall("WatchInterfaces", args, &results)
    92  	if err != nil {
    93  		// TODO: Not directly tested
    94  		return nil, err
    95  	}
    96  	if len(results.Results) != 1 {
    97  		// TODO: Not directly tested
    98  		err = errors.Errorf("expected one result, got %d", len(results.Results))
    99  		return nil, err
   100  	}
   101  	result := results.Results[0]
   102  	if result.Error != nil {
   103  		return nil, result.Error
   104  	}
   105  	w := watcher.NewNotifyWatcher(st.facade.RawAPICaller(), result)
   106  	return w, nil
   107  }