github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/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 }