3 # Copyright 2016 RIFT.IO Inc
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
25 class VirshError(Exception):
29 def create(network
, ip_interface
=None):
30 """ Create, assign ip and bring up a bridge interface
33 network - The network name
34 ip_interface - An ipaddress.IPv4Interface instance
37 if ip_interface
is not None:
41 str(ip_interface
.network
.broadcast_address
),
48 bridge_remove(network
)
51 def bridge_add(network
):
52 shell
.command("/usr/sbin/brctl addbr {network}".format(network
=network
))
55 def bridge_remove(network
):
56 shell
.command("/usr/sbin/brctl delbr {network}".format(network
=network
))
59 def bridge_addr(network
, addr
, broadcast
):
60 cmd
= "ip addr add {addr} broadcast {broadcast} dev {network}"
61 shell
.command(cmd
.format(addr
=addr
, broadcast
=broadcast
, network
=network
))
64 def bridge_exists(network
):
65 return network
in netifaces
.interfaces()
68 def bridge_down(network
):
69 shell
.command('ip link set {network} down'.format(network
=network
))
72 def bridge_up(network
):
73 shell
.command('ip link set {network} up'.format(network
=network
))
76 def bridge_addresses(network
):
78 address
= netifaces
.ifaddresses(network
)[netifaces
.AF_INET
][0]
81 raise ValueError('unable to find subnet for {}'.format(network
))
83 cls
= collections
.namedtuple('BridgeAddresses', 'addr netmask broadcast')
87 VirshNetwork
= collections
.namedtuple(
88 'VirshNetwork', 'name state autostart persistant')
91 def virsh_list_networks():
92 lines
= shell
.command('virsh net-list --all')
94 raise Exception("Expected two lines from virsh net-list output")
96 network_lines
= lines
[2:]
98 for line
in network_lines
:
102 (name
, state
, autostart
, persistant
) = line
.split()
103 virsh_networks
.append(
104 VirshNetwork(name
, state
, autostart
, persistant
)
107 return virsh_networks
110 def virsh_list_network_names():
111 virsh_networks
= virsh_list_networks()
112 return [n
.name
for n
in virsh_networks
]
115 def virsh_is_active(network_name
):
116 virsh_networks
= virsh_list_networks()
117 for network
in virsh_networks
:
118 if network
.name
== network_name
:
119 return network
.state
== "active"
121 raise VirshError("Did not find virsh network %s" % network_name
)
124 def virsh_define_default():
125 shell
.command('virsh net-define /usr/share/libvirt/networks/default.xml')
128 def virsh_start(network_name
):
129 shell
.command('virsh net-start %s' % network_name
)
132 def virsh_initialize_default():
133 if "default" not in virsh_list_network_names():
134 virsh_define_default()
136 if virsh_is_active("default"):
137 if bridge_exists("virbr0"):
138 bridge_down("virbr0")
140 virsh_destroy("default")
142 virsh_start("default")
145 def virsh_destroy(network_name
):
146 shell
.command('virsh net-destroy %s' % network_name
)