258 lines
12 KiB
Python
Raw Normal View History

2011-05-03 14:57:35 -04:00
# definenet.py - Copyright (C) 2009 Red Hat, Inc.
# Written by Darryl L. Pierce <dpierce@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA. A copy of the GNU General Public License is
# also available at http://www.gnu.org/copyleft/gpl.html.
2011-05-31 15:13:55 -04:00
import snack
2011-05-03 14:57:35 -04:00
from IPy import IP
import traceback
import logging
import re
2011-05-31 15:13:55 -04:00
import utils
from configscreen import ConfigScreen
2011-05-03 14:57:35 -04:00
from networkconfig import NetworkConfig
NETWORK_NAME_PAGE = 1
IPV4_ADDRESS_PAGE = 2
PUBLIC_NETWORK_ALERT_PAGE = 3
NETWORK_DETAILS_PAGE = 4
DHCP_RANGE_PAGE = 5
NETWORK_TYPE_PAGE = 6
SELECT_PHYSICAL_NETWORK_PAGE = 7
SUMMARY_PAGE = 8
class DefineNetworkConfigScreen(ConfigScreen):
def __init__(self):
ConfigScreen.__init__(self, "Create A Virtual Network Interface")
self.__config = NetworkConfig()
def get_elements_for_page(self, screen, page):
if page is NETWORK_NAME_PAGE: return self.get_network_name_page(screen)
elif page is IPV4_ADDRESS_PAGE: return self.get_ipv4_address_page(screen)
elif page is PUBLIC_NETWORK_ALERT_PAGE: return self.get_public_network_alert_page(screen)
elif page is NETWORK_DETAILS_PAGE: return self.get_network_details_page(screen)
elif page is DHCP_RANGE_PAGE: return self.get_dhcp_range_page(screen)
elif page is NETWORK_TYPE_PAGE: return self.get_network_type_page(screen)
elif page is SELECT_PHYSICAL_NETWORK_PAGE: return self.get_select_physical_network_page(screen)
elif page is SUMMARY_PAGE: return self.get_summary_page(screen)
def validate_input(self, page, errors):
if page is NETWORK_NAME_PAGE:
if len(self.__name.value()) > 0:
if re.match("^[a-zA-Z0-9_]*$", self.__name.value()):
return True
else:
errors.append("The network name can only contain letters, numbers and the underscore, and no spaces.")
else:
errors.append("Network name must be non-blank and less than 50 characters")
elif page is IPV4_ADDRESS_PAGE:
if len(self.__ipv4_address.value()) > 0:
try:
self.__config.set_ipv4_address(self.__ipv4_address.value())
return True
except Exception, error:
errors.append("The network address could not be understood: %s" % str(error))
else:
errors.append("Network must be entered in the format 1.2.3.4/8")
elif page is PUBLIC_NETWORK_ALERT_PAGE: return True
elif page is NETWORK_DETAILS_PAGE: return True
elif page is DHCP_RANGE_PAGE:
try:
if len(self.__start_address.value()) > 0 and len(self.__end_address.value()) > 0:
start = IP(self.__start_address.value(), )
end = IP(self.__end_address.value())
if not self.__config.is_bad_address(start) and not self.__config.is_bad_address(end):
return True
else:
errors.append("Start and/or end address are outside of the choosen network.")
else:
errors.append("Start and end address must be non-blank.")
except Exception, error:
logging.error(str(error))
errors.append("The start and/or end addresses could not be understood.")
elif page is NETWORK_TYPE_PAGE: return True
elif page is SELECT_PHYSICAL_NETWORK_PAGE: return True
elif page is SUMMARY_PAGE: return True
return False
def process_input(self, page):
if page is NETWORK_NAME_PAGE:
self.__config.set_name(self.__name.value())
elif page is DHCP_RANGE_PAGE:
self.__config.set_ipv4_start_address(self.__start_address.value())
self.__config.set_ipv4_end_address(self.__end_address.value())
elif page is NETWORK_TYPE_PAGE:
self.__config.set_isolated_network(self.__isolated_network.value())
elif page is SELECT_PHYSICAL_NETWORK_PAGE:
self.__config.set_physical_device(self.__physical_devices.getSelection())
elif page is SUMMARY_PAGE:
self.get_libvirt().define_network(self.__config)
self.set_finished()
def get_next_page(self, page):
if page is IPV4_ADDRESS_PAGE:
if self.__config.is_public_ipv4_network():
return PUBLIC_NETWORK_ALERT_PAGE
else:
return NETWORK_DETAILS_PAGE
if page is NETWORK_TYPE_PAGE:
if self.__config.is_isolated_network():
return SUMMARY_PAGE
else:
return SELECT_PHYSICAL_NETWORK_PAGE
return ConfigScreen.get_next_page(self, page)
def get_back_page(self, page):
if page is NETWORK_DETAILS_PAGE:
return IPV4_ADDRESS_PAGE
if page is SUMMARY_PAGE:
if self.__config.is_isolated_network():
return NETWORK_TYPE_PAGE
else:
return SELECT_PHYSICAL_NETWORK_PAGE
return ConfigScreen.get_back_page(self, page)
def page_has_finish(self, page):
if page is SUMMARY_PAGE: return True
return False
def page_has_next(self, page):
if page < SUMMARY_PAGE: return True
def page_has_back(self, page):
if page > NETWORK_NAME_PAGE: return True
return False
def get_network_name_page(self, screen):
2011-05-31 15:13:55 -04:00
self.__name = snack.Entry(50, self.__config.get_name())
grid = snack.Grid(2, 1)
grid.setField(snack.Label("Network Name:"), 0, 0)
2011-05-03 14:57:35 -04:00
grid.setField(self.__name, 1, 0)
2011-05-31 15:13:55 -04:00
return [snack.Label("Please choose a name for your virtual network"),
2011-05-03 14:57:35 -04:00
grid]
def get_ipv4_address_page(self, screen):
2011-05-31 15:13:55 -04:00
self.__ipv4_address = snack.Entry(18, self.__config.get_ipv4_address())
grid = snack.Grid(2, 1)
grid.setField(snack.Label("Network:"), 0, 0, anchorRight = 1)
2011-05-03 14:57:35 -04:00
grid.setField(self.__ipv4_address, 1, 0, anchorLeft = 1)
2011-05-31 15:13:55 -04:00
return [snack.Label("You will need to choose an IPv4 address space for the virtual network:"),
2011-05-03 14:57:35 -04:00
grid,
2011-05-31 15:13:55 -04:00
snack.Label("HINT: The network should be chosen from"),
snack.Label("one of the IPv4 private address ranges;"),
snack.Label("e.g., 10.0.0.0/8, 172.168.0.0/12, 192.168.0.0/16")]
2011-05-03 14:57:35 -04:00
def get_network_details_page(self, screen):
2011-05-31 15:13:55 -04:00
grid = snack.Grid(2, 6)
grid.setField(snack.Label("Network:"), 0, 0, anchorRight = 1)
grid.setField(snack.Label(self.__config.get_ipv4_address()), 1, 0, anchorLeft = 1)
grid.setField(snack.Label("Netmask:"), 0, 1, anchorRight = 1)
grid.setField(snack.Label(self.__config.get_ipv4_netmask()), 1, 1, anchorLeft = 1)
grid.setField(snack.Label("Broadcast:"), 0, 2, anchorRight = 1)
grid.setField(snack.Label(self.__config.get_ipv4_broadcast()), 1, 2, anchorLeft = 1)
grid.setField(snack.Label("Gateway:"), 0, 3, anchorRight = 1)
grid.setField(snack.Label(self.__config.get_ipv4_gateway()), 1, 3, anchorLeft = 1)
grid.setField(snack.Label("Size:"), 0, 4, anchorRight = 1)
grid.setField(snack.Label("%d addresses" % self.__config.get_ipv4_max_addresses()), 1, 4, anchorLeft = 1)
grid.setField(snack.Label("Type:"), 0, 5, anchorRight = 1)
grid.setField(snack.Label(self.__config.get_ipv4_network_type()), 1, 5, anchorLeft = 1)
return [snack.Label("Network Details"),
2011-05-03 14:57:35 -04:00
grid]
def get_public_network_alert_page(self, screen):
2011-05-31 15:13:55 -04:00
grid = snack.Grid(1, 2)
grid.setField(snack.Label("The network should normally use a private IPv4 address."), 0, 0, anchorLeft = 1)
grid.setField(snack.Label("Use this non-private address anyway?"), 0, 1, anchorLeft = 1)
return [snack.Label("Check Network Address"),
2011-05-03 14:57:35 -04:00
grid]
def get_dhcp_range_page(self, screen):
2011-05-31 15:13:55 -04:00
self.__start_address = snack.Entry(15, self.__config.get_ipv4_start_address())
self.__end_address = snack.Entry(15, self.__config.get_ipv4_end_address())
grid = snack.Grid(2,2)
grid.setField(snack.Label("Start:"), 0, 0, anchorRight = 1)
2011-05-03 14:57:35 -04:00
grid.setField(self.__start_address, 1, 0, anchorLeft = 1)
2011-05-31 15:13:55 -04:00
grid.setField(snack.Label("End:"), 0, 1, anchorRight = 1)
2011-05-03 14:57:35 -04:00
grid.setField(self.__end_address, 1, 1, anchorLeft = 1)
2011-05-31 15:13:55 -04:00
return [snack.Label("Selecting The DHCP Range"),
2011-05-03 14:57:35 -04:00
grid,
2011-05-31 15:13:55 -04:00
snack.Label("TIP: Unless you wish to reserve some addresses to allow static network"),
snack.Label("configuration in virtual machines, these paraemters can be left with"),
snack.Label("their default values.")]
2011-05-03 14:57:35 -04:00
def get_network_type_page(self, screen):
2011-05-31 15:13:55 -04:00
self.__isolated_network = snack.Checkbox("Isolated virtual network",
2011-05-03 14:57:35 -04:00
self.__config.is_isolated_network())
2011-05-31 15:13:55 -04:00
grid = snack.Grid(1, 3)
grid.setField(snack.Label("Please indicate whether this virtual network should be"), 0, 0, anchorLeft = 1)
grid.setField(snack.Label("connected to the physical network."), 0, 1, anchorLeft = 1)
2011-05-03 14:57:35 -04:00
grid.setField(self.__isolated_network, 0, 2)
2011-05-31 15:13:55 -04:00
return [snack.Label("Connecting To Physical Network"),
2011-05-03 14:57:35 -04:00
grid]
def get_select_physical_network_page(self, screen):
devices = []
devices.append(["NAT to any physical device", "", self.__config.get_physical_device() == ""])
for device in self.get_hal().list_network_devices():
devices.append(["NAT to physical device %s" % device, device, self.__config.get_physical_device() == device])
2011-05-31 15:13:55 -04:00
self.__physical_devices = snack.RadioBar(screen, (devices))
grid = snack.Grid(1, 2)
grid.setField(snack.Label("Forward to physical network:"), 0, 0)
2011-05-03 14:57:35 -04:00
grid.setField(self.__physical_devices, 0, 1)
2011-05-31 15:13:55 -04:00
return [snack.Label("Connecting To Physical Network"),
2011-05-03 14:57:35 -04:00
grid]
def get_summary_page(self, screen):
2011-05-31 15:13:55 -04:00
grid1 = snack.Grid(2, 1)
grid1.setField(snack.Label("Network name:"), 0, 0, anchorRight = 1)
grid1.setField(snack.Label(self.__config.get_name()), 1, 0, anchorLeft = 1)
2011-05-03 14:57:35 -04:00
2011-05-31 15:13:55 -04:00
grid2 = snack.Grid(2, 3)
grid2.setField(snack.Label("Network:"), 0, 0, anchorRight = 1)
grid2.setField(snack.Label(self.__config.get_ipv4_address()), 1, 0, anchorLeft = 1)
grid2.setField(snack.Label("Gateway:"), 0, 1, anchorRight = 1)
grid2.setField(snack.Label(self.__config.get_ipv4_gateway()), 1, 1, anchorLeft = 1)
grid2.setField(snack.Label("Netmask:"), 0, 2, anchorRight = 1)
grid2.setField(snack.Label(self.__config.get_ipv4_netmask()), 1, 2, anchorLeft = 1)
2011-05-03 14:57:35 -04:00
2011-05-31 15:13:55 -04:00
grid3 = snack.Grid(2, 2)
grid3.setField(snack.Label("Start address:"), 0, 0, anchorRight = 1)
grid3.setField(snack.Label(self.__config.get_ipv4_start_address()), 1, 0, anchorLeft = 1)
grid3.setField(snack.Label("End address:"), 0, 1, anchorRight = 1)
grid3.setField(snack.Label(self.__config.get_ipv4_end_address()), 1, 1, anchorLeft = 1)
2011-05-03 14:57:35 -04:00
2011-05-31 15:13:55 -04:00
grid4 = snack.Grid(2, 1)
grid4.setField(snack.Label("Connectivity:"), 0, 0, anchorRight = 1)
2011-05-03 14:57:35 -04:00
if self.__config.is_isolated_network():
2011-05-31 15:13:55 -04:00
grid4.setField(snack.Label("Isolated virtual network"), 1, 0, anchorLeft = 1)
2011-05-03 14:57:35 -04:00
else:
2011-05-31 15:13:55 -04:00
grid4.setField(snack.Label("NAT to %s" % self.__config.get_physical_device_text()), 1, 0, anchorLeft = 1)
2011-05-03 14:57:35 -04:00
2011-05-31 15:13:55 -04:00
return [snack.Label("Ready To Create Network"),
snack.Label("Summary"),
2011-05-03 14:57:35 -04:00
grid1,
2011-05-31 15:13:55 -04:00
snack.Label("IPv4 Network"),
2011-05-03 14:57:35 -04:00
grid2,
2011-05-31 15:13:55 -04:00
snack.Label("DHCP"),
2011-05-03 14:57:35 -04:00
grid3,
2011-05-31 15:13:55 -04:00
snack.Label("Forwarding"),
2011-05-03 14:57:35 -04:00
grid4]
def DefineNetwork():
screen = DefineNetworkConfigScreen()
screen.start()