123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883 |
- """
- Installs and configures Neutron
- """
- import re
- from packstack.installer import basedefs
- from packstack.installer import utils
- from packstack.installer import validators
- from packstack.installer import processors
- from packstack.installer import output_messages
- from packstack.installer.utils import split_hosts
- from packstack.modules import common
- from packstack.modules.documentation import update_params_usage
- from packstack.modules.ospluginutils import generate_ssl_cert
- PLUGIN_NAME = "OS-Neutron"
- PLUGIN_NAME_COLORED = utils.color_text(PLUGIN_NAME, 'blue')
- def initConfig(controller):
- conf_params = {
- "NEUTRON": [
- {"CMD_OPTION": "os-neutron-ks-password",
- "PROMPT": "Enter the password for Neutron Keystone access",
- "OPTION_LIST": [],
- "VALIDATORS": [validators.validate_not_empty],
- "DEFAULT_VALUE": "PW_PLACEHOLDER",
- "PROCESSORS": [processors.process_password],
- "MASK_INPUT": True,
- "LOOSE_VALIDATION": False,
- "CONF_NAME": "CONFIG_NEUTRON_KS_PW",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": True,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-db-password",
- "PROMPT": "Enter the password for Neutron DB access",
- "OPTION_LIST": [],
- "VALIDATORS": [validators.validate_not_empty],
- "DEFAULT_VALUE": "PW_PLACEHOLDER",
- "PROCESSORS": [processors.process_password],
- "MASK_INPUT": True,
- "LOOSE_VALIDATION": False,
- "CONF_NAME": "CONFIG_NEUTRON_DB_PW",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": True,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-l3-ext-bridge",
- "PROMPT": ("Enter the ovs bridge the Neutron L3 agent will use "
- "for external traffic, or 'provider' if using "
- "provider networks."),
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": "br-ex",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": True,
- "CONF_NAME": "CONFIG_NEUTRON_L3_EXT_BRIDGE",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-metadata-pw",
- "PROMPT": "Enter Neutron metadata agent password",
- "OPTION_LIST": [],
- "VALIDATORS": [validators.validate_not_empty],
- "DEFAULT_VALUE": "PW_PLACEHOLDER",
- "PROCESSORS": [processors.process_password],
- "MASK_INPUT": True,
- "LOOSE_VALIDATION": False,
- "CONF_NAME": "CONFIG_NEUTRON_METADATA_PW",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": True,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-lbaas-install",
- "PROMPT": "Should Packstack install Neutron LBaaS",
- "OPTION_LIST": ["y", "n"],
- "VALIDATORS": [validators.validate_options],
- "DEFAULT_VALUE": "n",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": False,
- "CONF_NAME": "CONFIG_LBAAS_INSTALL",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-metering-agent-install",
- "PROMPT": ("Should Packstack install Neutron L3 Metering agent"),
- "OPTION_LIST": ["y", "n"],
- "VALIDATORS": [validators.validate_options],
- "DEFAULT_VALUE": "y",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": False,
- "CONF_NAME": "CONFIG_NEUTRON_METERING_AGENT_INSTALL",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "neutron-fwaas",
- "PROMPT": "Would you like to configure neutron FWaaS?",
- "OPTION_LIST": ["y", "n"],
- "VALIDATORS": [validators.validate_options],
- "DEFAULT_VALUE": "n",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": True,
- "CONF_NAME": "CONFIG_NEUTRON_FWAAS",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-vpnaas-install",
- "PROMPT": "Would you like to configure neutron VPNaaS?",
- "OPTION_LIST": ["y", "n"],
- "VALIDATORS": [validators.validate_options],
- "DEFAULT_VALUE": "n",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": True,
- "CONF_NAME": "CONFIG_NEUTRON_VPNAAS",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- ],
- "NEUTRON_LB_AGENT": [
- {"CMD_OPTION": "os-neutron-lb-interface-mappings",
- "PROMPT": ("Enter a comma separated list of interface mappings "
- "for the Neutron linuxbridge plugin"),
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": "",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": True,
- "CONF_NAME": "CONFIG_NEUTRON_LB_INTERFACE_MAPPINGS",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- ],
- "NEUTRON_OVS_AGENT": [
- {"CMD_OPTION": "os-neutron-ovs-bridge-mappings",
- "PROMPT": ("Enter a comma separated list of bridge mappings for "
- "the Neutron openvswitch plugin"),
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": "extnet:br-ex",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": True,
- "CONF_NAME": "CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-ovs-bridge-interfaces",
- "PROMPT": ("Enter a comma separated list of OVS bridge:interface "
- "pairs for the Neutron openvswitch plugin"),
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": "",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": True,
- "CONF_NAME": "CONFIG_NEUTRON_OVS_BRIDGE_IFACES",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-ovs-bridges-compute",
- "PROMPT": ("Enter a comma separated list of bridges for the "
- "Neutron OVS plugin in compute nodes. They must "
- "be included in os-neutron-ovs-bridge-mappings and "
- "os-neutron-ovs-bridge-interfaces."),
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": "",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": True,
- "CONF_NAME": "CONFIG_NEUTRON_OVS_BRIDGES_COMPUTE",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-ovs-external-physnet",
- "PROMPT": ("Enter the name of the physical external network as"
- "defined in bridge mappings"),
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": "extnet",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": True,
- "CONF_NAME": "CONFIG_NEUTRON_OVS_EXTERNAL_PHYSNET",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- ],
- "NEUTRON_OVS_AGENT_TUNNEL": [
- {"CMD_OPTION": "os-neutron-ovs-tunnel-if",
- "PROMPT": ("Enter interface with IP to override the default "
- "tunnel local_ip"),
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": "",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": True,
- "CONF_NAME": "CONFIG_NEUTRON_OVS_TUNNEL_IF",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-ovs-tunnel-subnets",
- "PROMPT": ("Enter comma separated list of subnets used for "
- "tunneling to make them allowed by IP filtering."),
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": "",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": True,
- "CONF_NAME": "CONFIG_NEUTRON_OVS_TUNNEL_SUBNETS",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- ],
- "NEUTRON_OVS_AGENT_VXLAN": [
- {"CMD_OPTION": "os-neutron-ovs-vxlan-udp-port",
- "CONF_NAME": "CONFIG_NEUTRON_OVS_VXLAN_UDP_PORT",
- "PROMPT": "Enter VXLAN UDP port number",
- "OPTION_LIST": [],
- "VALIDATORS": [validators.validate_port],
- "DEFAULT_VALUE": 4789,
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": True,
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- ],
- "NEUTRON_ML2_PLUGIN": [
- {"CMD_OPTION": "os-neutron-ml2-type-drivers",
- "CONF_NAME": "CONFIG_NEUTRON_ML2_TYPE_DRIVERS",
- "PROMPT": ("Enter a comma separated list of network type driver "
- "entrypoints"),
- "OPTION_LIST": ["local", "flat", "vlan", "gre", "vxlan"],
- "VALIDATORS": [validators.validate_multi_options],
- "DEFAULT_VALUE": "vxlan,flat",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": False,
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-ml2-tenant-network-types",
- "CONF_NAME": "CONFIG_NEUTRON_ML2_TENANT_NETWORK_TYPES",
- "PROMPT": ("Enter a comma separated ordered list of "
- "network_types to allocate as tenant networks"),
- "OPTION_LIST": ["local", "vlan", "gre", "vxlan"],
- "VALIDATORS": [validators.validate_multi_options],
- "DEFAULT_VALUE": "vxlan",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": False,
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-ml2-mechanism-drivers",
- "CONF_NAME": "CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS",
- "PROMPT": ("Enter a comma separated ordered list of networking "
- "mechanism driver entrypoints"),
- "OPTION_LIST": ["logger", "test", "linuxbridge", "openvswitch",
- "hyperv", "ncs", "arista", "cisco_nexus",
- "mlnx", "l2population", "sriovnicswitch"],
- "VALIDATORS": [validators.validate_multi_options],
- "DEFAULT_VALUE": "openvswitch",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": False,
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-ml2-flat-networks",
- "CONF_NAME": "CONFIG_NEUTRON_ML2_FLAT_NETWORKS",
- "PROMPT": ("Enter a comma separated list of physical_network "
- "names with which flat networks can be created"),
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": "*",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": False,
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-ml2-vlan-ranges",
- "CONF_NAME": "CONFIG_NEUTRON_ML2_VLAN_RANGES",
- "PROMPT": ("Enter a comma separated list of physical_network "
- "names usable for VLAN"),
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": "",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": False,
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-ml2-tunnel-id-ranges",
- "CONF_NAME": "CONFIG_NEUTRON_ML2_TUNNEL_ID_RANGES",
- "PROMPT": ("Enter a comma separated list of <tun_min>:<tun_max> "
- "tuples enumerating ranges of GRE tunnel IDs that "
- "are available for tenant network allocation"),
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": "",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": False,
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-ml2-vxlan-group",
- "CONF_NAME": "CONFIG_NEUTRON_ML2_VXLAN_GROUP",
- "PROMPT": "Enter a multicast group for VXLAN",
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": "",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": False,
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-ml2-vni-ranges",
- "CONF_NAME": "CONFIG_NEUTRON_ML2_VNI_RANGES",
- "PROMPT": ("Enter a comma separated list of <vni_min>:<vni_max> "
- "tuples enumerating ranges of VXLAN VNI IDs that are "
- "available for tenant network allocation"),
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": "10:100",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": False,
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
-
- {"CMD_OPTION": "os-neutron-l2-agent",
- "PROMPT": ("Enter the name of the L2 agent to be used "
- "with Neutron"),
- "OPTION_LIST": ["linuxbridge", "openvswitch"],
- "VALIDATORS": [validators.validate_options],
- "DEFAULT_VALUE": "openvswitch",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": False,
- "CONF_NAME": "CONFIG_NEUTRON_L2_AGENT",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-ml2-supported-pci-vendor-devs",
- "CONF_NAME": "CONFIG_NEUTRON_ML2_SUPPORTED_PCI_VENDOR_DEVS",
- "PROMPT": ("Enter a comma separated list of supported PCI "
- "vendor devices, defined by vendor_id:product_id "
- "according to the PCI ID Repository."),
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": ['15b3:1004', '8086:10ca'],
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": False,
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- {"CMD_OPTION": "os-neutron-ml2-sriov-interface-mappings",
- "PROMPT": ("Enter a comma separated list of interface mappings "
- "for the Neutron ML2 sriov agent"),
- "OPTION_LIST": [],
- "VALIDATORS": [],
- "DEFAULT_VALUE": "",
- "MASK_INPUT": False,
- "LOOSE_VALIDATION": True,
- "CONF_NAME": "CONFIG_NEUTRON_ML2_SRIOV_INTERFACE_MAPPINGS",
- "USE_DEFAULT": False,
- "NEED_CONFIRM": False,
- "CONDITION": False},
- ],
- }
- update_params_usage(basedefs.PACKSTACK_DOC, conf_params)
- conf_groups = [
- {"GROUP_NAME": "NEUTRON",
- "DESCRIPTION": "Neutron config",
- "PRE_CONDITION": "CONFIG_NEUTRON_INSTALL",
- "PRE_CONDITION_MATCH": "y",
- "POST_CONDITION": False,
- "POST_CONDITION_MATCH": True},
- {"GROUP_NAME": "NEUTRON_ML2_PLUGIN",
- "DESCRIPTION": "Neutron ML2 plugin config",
- "PRE_CONDITION": neutron_install,
- "PRE_CONDITION_MATCH": True,
- "POST_CONDITION": False,
- "POST_CONDITION_MATCH": True},
- {"GROUP_NAME": "NEUTRON_LB_AGENT",
- "DESCRIPTION": "Neutron LB agent config",
- "PRE_CONDITION": use_ml2_with_linuxbridge,
- "PRE_CONDITION_MATCH": True,
- "POST_CONDITION": False,
- "POST_CONDITION_MATCH": True},
- {"GROUP_NAME": "NEUTRON_OVS_AGENT",
- "DESCRIPTION": "Neutron OVS agent config",
- "PRE_CONDITION": use_ml2_with_ovs,
- "PRE_CONDITION_MATCH": True,
- "POST_CONDITION": False,
- "POST_CONDITION_MATCH": True},
- {"GROUP_NAME": "NEUTRON_OVS_AGENT_TUNNEL",
- "DESCRIPTION": "Neutron OVS agent config for tunnels",
- "PRE_CONDITION": use_ml2_with_ovs,
- "PRE_CONDITION_MATCH": True,
- "POST_CONDITION": False,
- "POST_CONDITION_MATCH": True},
- {"GROUP_NAME": "NEUTRON_OVS_AGENT_VXLAN",
- "DESCRIPTION": "Neutron OVS agent config for VXLAN",
- "PRE_CONDITION": use_openvswitch_vxlan,
- "PRE_CONDITION_MATCH": True,
- "POST_CONDITION": False,
- "POST_CONDITION_MATCH": True},
- ]
- for group in conf_groups:
- params = conf_params[group["GROUP_NAME"]]
- controller.addGroup(group, params)
- def initSequences(controller):
- config = controller.CONF
- if config['CONFIG_NEUTRON_INSTALL'] != 'y':
- return
- if config['CONFIG_IRONIC_INSTALL'] == 'y':
- config['CONFIG_NEUTRON_ML2_TYPE_DRIVERS'] += ', flat'
- config['CONFIG_NEUTRON_ML2_TENANT_NETWORK_TYPES'] += ', flat'
- if 'openvswitch' not in config['CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS']:
- config['CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS'] += 'openvswitch'
- config['CONFIG_NEUTRON_ML2_FLAT_NETWORKS'] = 'physnet1'
- if use_ml2_with_sriovnicswitch(config):
- if ('openvswitch' not in config['CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS']
- and 'linuxbridge' not in
- config['CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS']):
- config['CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS'] += ', openvswitch'
- plugin_db = 'neutron'
- plugin_path = 'neutron.plugins.ml2.plugin.Ml2Plugin'
-
- for key in ('CONFIG_NEUTRON_ML2_TYPE_DRIVERS',
- 'CONFIG_NEUTRON_ML2_TENANT_NETWORK_TYPES',
- 'CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS',
- 'CONFIG_NEUTRON_ML2_FLAT_NETWORKS',
- 'CONFIG_NEUTRON_ML2_VLAN_RANGES',
- 'CONFIG_NEUTRON_ML2_TUNNEL_ID_RANGES',
- 'CONFIG_NEUTRON_ML2_VNI_RANGES'):
- if config[key] == '':
- config[key] = []
- else:
- config[key] = [i.strip() for i in config[key].split(',') if i]
- key = 'CONFIG_NEUTRON_ML2_VXLAN_GROUP'
- config[key] = "%s" % config[key] if config[key] else ''
- config['CONFIG_NEUTRON_L2_DBNAME'] = plugin_db
- config['CONFIG_NEUTRON_CORE_PLUGIN'] = plugin_path
- global api_hosts, network_hosts, compute_hosts, q_hosts
- api_hosts = split_hosts(config['CONFIG_CONTROLLER_HOST'])
- network_hosts = split_hosts(config['CONFIG_NETWORK_HOSTS'])
- compute_hosts = set()
- if config['CONFIG_NOVA_INSTALL'] == 'y':
- compute_hosts = split_hosts(config['CONFIG_COMPUTE_HOSTS'])
- q_hosts = api_hosts | network_hosts | compute_hosts
- neutron_steps = [
- {'title': 'Preparing Neutron LBaaS Agent entries',
- 'functions': [create_lbaas_manifests]},
- {'title': 'Preparing Neutron API entries',
- 'functions': [create_manifests]},
- {'title': 'Preparing Neutron L3 entries',
- 'functions': [create_l3_manifests]},
- {'title': 'Preparing Neutron L2 Agent entries',
- 'functions': [create_l2_agent_manifests]},
- {'title': 'Preparing Neutron DHCP Agent entries',
- 'functions': [create_dhcp_manifests]},
- {'title': 'Preparing Neutron Metering Agent entries',
- 'functions': [create_metering_agent_manifests]},
- {'title': 'Checking if NetworkManager is enabled and running',
- 'functions': [check_nm_status]},
- ]
- controller.addSequence("Installing OpenStack Neutron", [], [],
- neutron_steps)
- def neutron_install(config):
- return config['CONFIG_NEUTRON_INSTALL'] == 'y'
- def use_ml2_with_linuxbridge(config):
- ml2_used = (neutron_install(config) and
- config["CONFIG_NEUTRON_L2_AGENT"] == 'linuxbridge')
- return ml2_used
- def use_ml2_with_ovs(config):
- return (neutron_install(config) and
- config["CONFIG_NEUTRON_L2_AGENT"] == 'openvswitch')
- def use_openvswitch_vxlan(config):
- ml2_vxlan = (
- use_ml2_with_ovs(config) and
- 'vxlan' in config['CONFIG_NEUTRON_ML2_TENANT_NETWORK_TYPES']
- )
- return ml2_vxlan
- def use_openvswitch_gre(config):
- ml2_vxlan = (
- use_ml2_with_ovs(config) and
- 'gre' in config['CONFIG_NEUTRON_ML2_TENANT_NETWORK_TYPES']
- )
- return ml2_vxlan
- def use_ml2_with_sriovnicswitch(config):
- ml2_sriovnic = (
- use_ml2_with_ovs(config) and
- 'sriovnicswitch' in config['CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS']
- )
- return ml2_sriovnic
- def get_if_driver(config):
- agent = config['CONFIG_NEUTRON_L2_AGENT']
- if agent == "openvswitch":
- return 'neutron.agent.linux.interface.OVSInterfaceDriver'
- elif agent == 'linuxbridge':
- return 'neutron.agent.linux.interface.BridgeInterfaceDriver'
- def find_mapping(haystack, needle):
- return needle in [x.split(':')[1].strip() for x in get_values(haystack)]
- def get_values(val):
- return [x.strip() for x in val.split(',')] if val else []
- def tunnel_fw_details(config, host, src, fw_details):
- key = "neutron_tunnel_%s_%s" % (host, src)
- fw_details.setdefault(key, {})
- fw_details[key]['host'] = "%s" % src
- fw_details[key]['service_name'] = "neutron tunnel port"
- fw_details[key]['chain'] = "INPUT"
- if use_openvswitch_vxlan(config):
- fw_details[key]['proto'] = 'udp'
- tun_port = ("%s" % config['CONFIG_NEUTRON_OVS_VXLAN_UDP_PORT'])
- else:
- fw_details[key]['proto'] = 'gre'
- tun_port = None
- fw_details[key]['ports'] = tun_port
- def create_manifests(config, messages):
- global q_hosts
- service_plugins = []
- service_providers = []
- if config['CONFIG_LBAAS_INSTALL'] == 'y':
- lbaas_plugin = ('neutron_lbaas.services.loadbalancer.plugin.'
- 'LoadBalancerPluginv2')
- service_plugins.append(lbaas_plugin)
- lbaas_sp = ('LOADBALANCERV2:Haproxy:neutron_lbaas.drivers.haproxy.'
- 'plugin_driver.HaproxyOnHostPluginDriver:default')
- service_providers.append(lbaas_sp)
-
- service_plugins.append('router')
- if config['CONFIG_NEUTRON_METERING_AGENT_INSTALL'] == 'y':
- service_plugins.append('metering')
- if config['CONFIG_NEUTRON_FWAAS'] == 'y':
- service_plugins.append('firewall')
- fwaas_sp = ('FIREWALL:Iptables:neutron.agent.linux.iptables_firewall.'
- 'OVSHybridIptablesFirewallDriver:default')
- service_providers.append(fwaas_sp)
- if config['CONFIG_NEUTRON_VPNAAS'] == 'y':
- service_plugins.append('vpnaas')
- vpnaas_sp = ('VPN:libreswan:neutron_vpnaas.services.vpn.'
- 'service_drivers.ipsec.IPsecVPNDriver:default')
- service_providers.append(vpnaas_sp)
- config['SERVICE_PLUGINS'] = (service_plugins if service_plugins
- else 'undef')
- config['SERVICE_PROVIDERS'] = (service_providers if service_providers
- else [])
- config['FIREWALL_DRIVER'] = ("neutron.agent.linux.iptables_firewall."
- "OVSHybridIptablesFirewallDriver")
- plugin_manifest = 'neutron_ml2_plugin'
- if config['CONFIG_AMQP_ENABLE_SSL'] == 'y':
- ssl_cert_file = config['CONFIG_NEUTRON_SSL_CERT'] = (
- '/etc/pki/tls/certs/ssl_amqp_neutron.crt'
- )
- ssl_key_file = config['CONFIG_NEUTRON_SSL_KEY'] = (
- '/etc/pki/tls/private/ssl_amqp_neutron.key'
- )
- service = 'neutron'
- for host in q_hosts:
- if config['CONFIG_AMQP_ENABLE_SSL'] == 'y':
- generate_ssl_cert(config, host, service, ssl_key_file,
- ssl_cert_file)
- if host in api_hosts:
-
- fw_details = dict()
- key = "neutron_server_%s" % host
- fw_details.setdefault(key, {})
- fw_details[key]['host'] = "ALL"
- fw_details[key]['service_name'] = "neutron server"
- fw_details[key]['chain'] = "INPUT"
- fw_details[key]['ports'] = ['9696']
- fw_details[key]['proto'] = "tcp"
- config['FIREWALL_NEUTRON_SERVER_RULES'] = fw_details
-
- if use_openvswitch_vxlan(config) or use_openvswitch_gre(config):
- if config['CONFIG_IP_VERSION'] == 'ipv6':
- msg = output_messages.WARN_IPV6_OVS
- messages.append(utils.color_text(msg % host, 'red'))
- fw_details = dict()
- if (config['CONFIG_NEUTRON_OVS_TUNNEL_SUBNETS']):
- tunnel_subnets = map(
- str.strip,
- config['CONFIG_NEUTRON_OVS_TUNNEL_SUBNETS'].split(',')
- )
- cf_fw_nt_key = ("FIREWALL_NEUTRON_TUNNEL_RULES_%s" % host)
- for subnet in tunnel_subnets:
- tunnel_fw_details(config, host, subnet, fw_details)
- config[cf_fw_nt_key] = fw_details
- else:
- cf_fw_nt_key = ("FIREWALL_NEUTRON_TUNNEL_RULES_%s" % host)
- for n_host in network_hosts | compute_hosts:
- if config['CONFIG_NEUTRON_OVS_TUNNEL_IF']:
- if config['CONFIG_USE_SUBNETS'] == 'y':
- iface = common.cidr_to_ifname(
- config['CONFIG_NEUTRON_OVS_TUNNEL_IF'],
- n_host, config)
- else:
- iface = config['CONFIG_NEUTRON_OVS_TUNNEL_IF']
- ifip = ("ipaddress_%s" % iface)
- ifip = re.sub('[\.\-\:]', '_', ifip)
- try:
- src_host = config['HOST_DETAILS'][n_host][ifip]
- except KeyError:
- raise KeyError('Couldn\'t detect ipaddress of '
- 'interface %s on node %s' %
- (iface, n_host))
- else:
- src_host = n_host
- tunnel_fw_details(config, host, src_host, fw_details)
- config[cf_fw_nt_key] = fw_details
- def create_l3_manifests(config, messages):
- global network_hosts
- if config['CONFIG_NEUTRON_L3_EXT_BRIDGE'] == 'provider':
- config['CONFIG_NEUTRON_L3_EXT_BRIDGE'] = ''
- for host in network_hosts:
- config['CONFIG_NEUTRON_L3_HOST'] = host
- config['CONFIG_NEUTRON_L3_INTERFACE_DRIVER'] = get_if_driver(config)
- if config['CONFIG_NEUTRON_L2_AGENT'] == 'openvswitch':
- ext_bridge = config['CONFIG_NEUTRON_L3_EXT_BRIDGE']
- mapping = find_mapping(
- config['CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS'],
- ext_bridge) if ext_bridge else None
- if (ext_bridge and not mapping):
- config['CONFIG_NEUTRON_OVS_BRIDGE'] = ext_bridge
- config['CONFIG_NEUTRON_OVS_BRIDGE_CREATE'] = 'y'
- else:
- config['CONFIG_NEUTRON_OVS_BRIDGE_CREATE'] = 'n'
- else:
- config['CONFIG_NEUTRON_OVS_BRIDGE_CREATE'] = 'n'
- def create_dhcp_manifests(config, messages):
- global network_hosts
- for host in network_hosts:
- config["CONFIG_NEUTRON_DHCP_HOST"] = host
- config['CONFIG_NEUTRON_DHCP_INTERFACE_DRIVER'] = get_if_driver(config)
-
- fw_details = dict()
- key = "neutron_dhcp_in_%s" % host
- fw_details.setdefault(key, {})
- fw_details[key]['host'] = "ALL"
- fw_details[key]['service_name'] = "neutron dhcp in"
- fw_details[key]['chain'] = "INPUT"
- fw_details[key]['ports'] = ['67']
- fw_details[key]['proto'] = "udp"
- config['FIREWALL_NEUTRON_DHCPIN_RULES'] = fw_details
-
- fw_details = dict()
- key = "neutron_dhcp_out_%s" % host
- fw_details.setdefault(key, {})
- fw_details[key]['host'] = "ALL"
- fw_details[key]['service_name'] = "neutron dhcp out"
- fw_details[key]['chain'] = "OUTPUT"
- fw_details[key]['ports'] = ['68']
- fw_details[key]['proto'] = "udp"
- config['FIREWALL_NEUTRON_DHCPOUT_RULES'] = fw_details
- def create_lbaas_manifests(config, messages):
- global network_hosts
- if not config['CONFIG_LBAAS_INSTALL'] == 'y':
- return
- for host in network_hosts:
- config['CONFIG_NEUTRON_LBAAS_INTERFACE_DRIVER'] = get_if_driver(config)
- def create_metering_agent_manifests(config, messages):
- global network_hosts
- if not config['CONFIG_NEUTRON_METERING_AGENT_INSTALL'] == 'y':
- return
- for host in network_hosts:
- config['CONFIG_NEUTRON_METERING_IFCE_DRIVER'] = get_if_driver(config)
- def create_l2_agent_manifests(config, messages):
- global network_hosts, compute_hosts
- agent = config["CONFIG_NEUTRON_L2_AGENT"]
-
-
-
- if ('l2population' in
- config.get('CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS', [])):
- config['CONFIG_NEUTRON_USE_L2POPULATION'] = True
- else:
- config['CONFIG_NEUTRON_USE_L2POPULATION'] = False
- if agent == "openvswitch":
- ovs_type = 'CONFIG_NEUTRON_ML2_TYPE_DRIVERS'
- ovs_type = config.get(ovs_type, 'local')
- tunnel = use_openvswitch_vxlan(config) or use_openvswitch_gre(config)
- config["CONFIG_NEUTRON_OVS_TUNNELING"] = tunnel
- tunnel_types = set(ovs_type) & set(['gre', 'vxlan'])
- config["CONFIG_NEUTRON_OVS_TUNNEL_TYPES"] = list(tunnel_types)
- bm_arr = get_values(config["CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS"])
- iface_arr = get_values(config["CONFIG_NEUTRON_OVS_BRIDGE_IFACES"])
-
-
-
-
-
- config["CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS"] = bm_arr
- config["CONFIG_NEUTRON_OVS_BRIDGE_IFACES"] = []
-
-
-
-
- brd_arr_cmp = get_values(config["CONFIG_NEUTRON_OVS_BRIDGES_COMPUTE"])
- if_arr_cmp = []
- mapp_arr_cmp = []
- for brd in brd_arr_cmp:
- if_arr_cmp.append(common.find_pair_with(iface_arr, brd, 0))
- mapp_arr_cmp.append(common.find_pair_with(bm_arr, brd, 1))
- config["CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS_COMPUTE"] = mapp_arr_cmp
- config["CONFIG_NEUTRON_OVS_BRIDGE_IFACES_COMPUTE"] = []
- no_local_types = set(ovs_type) & set(['gre', 'vxlan', 'vlan', 'flat'])
- no_tunnel_types = set(ovs_type) & set(['vlan', 'flat'])
- elif agent == "linuxbridge":
- host_var = 'CONFIG_NEUTRON_LB_HOST'
- else:
- raise KeyError("Unknown layer2 agent")
- for host in network_hosts | compute_hosts:
-
-
-
- if (
- agent == "openvswitch" and (
- (host in network_hosts and no_local_types)
- or no_tunnel_types)
- ):
- if config['CONFIG_USE_SUBNETS'] == 'y':
- iface_arr = [
- common.cidr_to_ifname(i, host, config) for i in iface_arr
- ]
- if_arr_cmp = [
- common.cidr_to_ifname(i, host, config) for i in if_arr_cmp
- ]
- config["CONFIG_NEUTRON_OVS_BRIDGE_IFACES"] = iface_arr
- config["CONFIG_NEUTRON_OVS_BRIDGE_IFACES_COMPUTE"] = if_arr_cmp
- config['CREATE_BRIDGES'] = 'y'
- else:
- config['CREATE_BRIDGES'] = 'n'
- def check_nm_status(config, messages):
- hosts_with_nm = []
- for host in common.filtered_hosts(config):
- server = utils.ScriptRunner(host)
- server.append("systemctl")
- rc, out = server.execute(can_fail=False)
- server.clear()
- if rc < 1:
- server.append("systemctl is-enabled NetworkManager")
- rc, is_enabled = server.execute(can_fail=False)
- is_enabled = is_enabled.strip("\n ")
- server.clear()
- server.append("systemctl is-active NetworkManager")
- rc, is_active = server.execute(can_fail=False)
- is_active = is_active.strip("\n ")
- if is_enabled == "enabled" or is_active == "active":
- hosts_with_nm.append(host)
- else:
- server.clear()
- server.append("service NetworkManager status")
- rc, out = server.execute(can_fail=False)
- if rc < 1:
- hosts_with_nm.append(host)
- server.clear()
- if hosts_with_nm:
- hosts_list = ', '.join("%s" % x for x in hosts_with_nm)
- msg = output_messages.WARN_NM_ENABLED
- messages.append(utils.color_text(msg % hosts_list, 'yellow'))
|