github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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  type State struct {
    20  	facade base.FacadeCaller
    21  }
    22  
    23  // NewState creates a new client-side Machiner facade.
    24  func NewState(caller base.APICaller) *State {
    25  	return &State{base.NewFacadeCaller(caller, networkerFacade)}
    26  }
    27  
    28  // MachineNetworkInfo returns information about network interfaces to
    29  // setup only for a single machine.
    30  func (st *State) MachineNetworkInfo(tag names.MachineTag) ([]network.InterfaceInfo, error) {
    31  	args := params.Entities{
    32  		Entities: []params.Entity{{Tag: tag.String()}},
    33  	}
    34  	var results params.MachineNetworkInfoResults
    35  	err := st.facade.FacadeCall("MachineNetworkInfo", args, &results)
    36  	if err != nil {
    37  		// TODO: Not directly tested
    38  		return nil, err
    39  	}
    40  	if len(results.Results) != 1 {
    41  		// TODO: Not directly tested
    42  		err = errors.Errorf("expected one result, got %d", len(results.Results))
    43  		return nil, err
    44  	}
    45  	result := results.Results[0]
    46  	if result.Error != nil {
    47  		return nil, result.Error
    48  	}
    49  	interfaceInfo := make([]network.InterfaceInfo, len(result.Info))
    50  	for i, ifaceInfo := range result.Info {
    51  		interfaceInfo[i].DeviceIndex = ifaceInfo.DeviceIndex
    52  		interfaceInfo[i].MACAddress = ifaceInfo.MACAddress
    53  		interfaceInfo[i].CIDR = ifaceInfo.CIDR
    54  		interfaceInfo[i].NetworkName = ifaceInfo.NetworkName
    55  		interfaceInfo[i].ProviderId = ifaceInfo.ProviderId
    56  		interfaceInfo[i].VLANTag = ifaceInfo.VLANTag
    57  		interfaceInfo[i].InterfaceName = ifaceInfo.InterfaceName
    58  		interfaceInfo[i].Disabled = ifaceInfo.Disabled
    59  		// TODO(dimitern) Once we store all the information from
    60  		// network.InterfaceInfo in state, change this as needed to
    61  		// return it.
    62  	}
    63  
    64  	return interfaceInfo, nil
    65  }
    66  
    67  // WatchInterfaces returns a NotifyWatcher that notifies of changes to network
    68  // interfaces on the machine.
    69  func (st *State) WatchInterfaces(tag names.MachineTag) (watcher.NotifyWatcher, error) {
    70  	args := params.Entities{
    71  		Entities: []params.Entity{{Tag: tag.String()}},
    72  	}
    73  	var results params.NotifyWatchResults
    74  	err := st.facade.FacadeCall("WatchInterfaces", args, &results)
    75  	if err != nil {
    76  		// TODO: Not directly tested
    77  		return nil, err
    78  	}
    79  	if len(results.Results) != 1 {
    80  		// TODO: Not directly tested
    81  		err = errors.Errorf("expected one result, got %d", len(results.Results))
    82  		return nil, err
    83  	}
    84  	result := results.Results[0]
    85  	if result.Error != nil {
    86  		return nil, result.Error
    87  	}
    88  	w := watcher.NewNotifyWatcher(st.facade.RawAPICaller(), result)
    89  	return w, nil
    90  }