RIFT OSM R1 Initial Submission
[osm/SO.git] / rwcal / plugins / vala / rwcal_cloudsim / rift / rwcal / cloudsim / net.py
1
2 #
3 # Copyright 2016 RIFT.IO Inc
4 #
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
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
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.
16 #
17
18 import collections
19
20 import netifaces
21
22 from . import shell
23
24
25 class VirshError(Exception):
26 pass
27
28
29 def create(network, ip_interface=None):
30 """ Create, assign ip and bring up a bridge interface
31
32 Arguments:
33 network - The network name
34 ip_interface - An ipaddress.IPv4Interface instance
35 """
36 bridge_add(network)
37 if ip_interface is not None:
38 bridge_addr(
39 network,
40 str(ip_interface),
41 str(ip_interface.network.broadcast_address),
42 )
43 bridge_up(network)
44
45
46 def delete(network):
47 bridge_down(network)
48 bridge_remove(network)
49
50
51 def bridge_add(network):
52 shell.command("/usr/sbin/brctl addbr {network}".format(network=network))
53
54
55 def bridge_remove(network):
56 shell.command("/usr/sbin/brctl delbr {network}".format(network=network))
57
58
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))
62
63
64 def bridge_exists(network):
65 return network in netifaces.interfaces()
66
67
68 def bridge_down(network):
69 shell.command('ip link set {network} down'.format(network=network))
70
71
72 def bridge_up(network):
73 shell.command('ip link set {network} up'.format(network=network))
74
75
76 def bridge_addresses(network):
77 try:
78 address = netifaces.ifaddresses(network)[netifaces.AF_INET][0]
79
80 except KeyError:
81 raise ValueError('unable to find subnet for {}'.format(network))
82
83 cls = collections.namedtuple('BridgeAddresses', 'addr netmask broadcast')
84 return cls(**address)
85
86
87 VirshNetwork = collections.namedtuple(
88 'VirshNetwork', 'name state autostart persistant')
89
90
91 def virsh_list_networks():
92 lines = shell.command('virsh net-list --all')
93 if len(lines) < 2:
94 raise Exception("Expected two lines from virsh net-list output")
95
96 network_lines = lines[2:]
97 virsh_networks = []
98 for line in network_lines:
99 if not line.strip():
100 continue
101
102 (name, state, autostart, persistant) = line.split()
103 virsh_networks.append(
104 VirshNetwork(name, state, autostart, persistant)
105 )
106
107 return virsh_networks
108
109
110 def virsh_list_network_names():
111 virsh_networks = virsh_list_networks()
112 return [n.name for n in virsh_networks]
113
114
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"
120
121 raise VirshError("Did not find virsh network %s" % network_name)
122
123
124 def virsh_define_default():
125 shell.command('virsh net-define /usr/share/libvirt/networks/default.xml')
126
127
128 def virsh_start(network_name):
129 shell.command('virsh net-start %s' % network_name)
130
131
132 def virsh_initialize_default():
133 if "default" not in virsh_list_network_names():
134 virsh_define_default()
135
136 if virsh_is_active("default"):
137 if bridge_exists("virbr0"):
138 bridge_down("virbr0")
139
140 virsh_destroy("default")
141
142 virsh_start("default")
143
144
145 def virsh_destroy(network_name):
146 shell.command('virsh net-destroy %s' % network_name)
147