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 }