nova_300.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  1. # -*- coding: utf-8 -*-
  2. # Licensed under the Apache License, Version 2.0 (the "License");
  3. # you may not use this file except in compliance with the License.
  4. # You may obtain a copy of the License at
  5. #
  6. # http://www.apache.org/licenses/LICENSE-2.0
  7. #
  8. # Unless required by applicable law or agreed to in writing, software
  9. # distributed under the License is distributed on an "AS IS" BASIS,
  10. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
  11. # implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. """
  15. Installs and configures Nova
  16. """
  17. import os
  18. import platform
  19. import socket
  20. from packstack.installer import basedefs
  21. from packstack.installer import exceptions
  22. from packstack.installer import processors
  23. from packstack.installer import utils
  24. from packstack.installer import validators
  25. from packstack.modules.common import filtered_hosts
  26. from packstack.modules.documentation import update_params_usage
  27. from packstack.modules.ospluginutils import deliver_ssl_file
  28. from packstack.modules.ospluginutils import generate_ssl_cert
  29. # ------------- Nova Packstack Plugin Initialization --------------
  30. PLUGIN_NAME = "OS-Nova"
  31. PLUGIN_NAME_COLORED = utils.color_text(PLUGIN_NAME, 'blue')
  32. def initConfig(controller):
  33. if platform.linux_distribution()[0] == "Fedora":
  34. primary_netif = "em1"
  35. secondary_netif = "em2"
  36. else:
  37. primary_netif = "eth0"
  38. secondary_netif = "eth1"
  39. nova_params = {
  40. "NOVA": [
  41. {"CMD_OPTION": 'nova-db-purge-enable',
  42. "PROMPT": (
  43. "Enter y if cron job for removing soft deleted DB rows "
  44. "should be created"
  45. ),
  46. "OPTION_LIST": ['y', 'n'],
  47. "VALIDATORS": [validators.validate_not_empty],
  48. "PROCESSORS": [processors.process_bool],
  49. "DEFAULT_VALUE": 'y',
  50. "MASK_INPUT": False,
  51. "LOOSE_VALIDATION": False,
  52. "CONF_NAME": 'CONFIG_NOVA_DB_PURGE_ENABLE',
  53. "USE_DEFAULT": False,
  54. "NEED_CONFIRM": True,
  55. "CONDITION": False},
  56. {"CMD_OPTION": "nova-db-passwd",
  57. "PROMPT": "Enter the password for the Nova DB access",
  58. "OPTION_LIST": [],
  59. "VALIDATORS": [validators.validate_not_empty],
  60. "DEFAULT_VALUE": "PW_PLACEHOLDER",
  61. "PROCESSORS": [processors.process_password],
  62. "MASK_INPUT": True,
  63. "LOOSE_VALIDATION": False,
  64. "CONF_NAME": "CONFIG_NOVA_DB_PW",
  65. "USE_DEFAULT": False,
  66. "NEED_CONFIRM": True,
  67. "CONDITION": False},
  68. {"CMD_OPTION": "nova-ks-passwd",
  69. "PROMPT": "Enter the password for the Nova Keystone access",
  70. "OPTION_LIST": [],
  71. "VALIDATORS": [validators.validate_not_empty],
  72. "DEFAULT_VALUE": "PW_PLACEHOLDER",
  73. "PROCESSORS": [processors.process_password],
  74. "MASK_INPUT": True,
  75. "LOOSE_VALIDATION": False,
  76. "CONF_NAME": "CONFIG_NOVA_KS_PW",
  77. "USE_DEFAULT": False,
  78. "NEED_CONFIRM": True,
  79. "CONDITION": False},
  80. {"CMD_OPTION": "nova-manage-flavors",
  81. "PROMPT": (
  82. "Should Packstack manage default Nova flavors"
  83. ),
  84. "OPTION_LIST": ["y", "n"],
  85. "VALIDATORS": [validators.validate_options],
  86. "DEFAULT_VALUE": "y",
  87. "MASK_INPUT": False,
  88. "LOOSE_VALIDATION": False,
  89. "CONF_NAME": "CONFIG_NOVA_MANAGE_FLAVORS",
  90. "USE_DEFAULT": False,
  91. "NEED_CONFIRM": False,
  92. "CONDITION": False},
  93. {"CMD_OPTION": "novasched-cpu-allocation-ratio",
  94. "PROMPT": "Enter the CPU overcommitment ratio. Set to 1.0 to "
  95. "disable CPU overcommitment",
  96. "OPTION_LIST": [],
  97. "VALIDATORS": [validators.validate_float],
  98. "DEFAULT_VALUE": 16.0,
  99. "MASK_INPUT": False,
  100. "LOOSE_VALIDATION": True,
  101. "CONF_NAME": "CONFIG_NOVA_SCHED_CPU_ALLOC_RATIO",
  102. "USE_DEFAULT": False,
  103. "NEED_CONFIRM": False,
  104. "CONDITION": False},
  105. {"CMD_OPTION": "novasched-ram-allocation-ratio",
  106. "PROMPT": ("Enter the RAM overcommitment ratio. Set to 1.0 to "
  107. "disable RAM overcommitment"),
  108. "OPTION_LIST": [],
  109. "VALIDATORS": [validators.validate_float],
  110. "DEFAULT_VALUE": 1.5,
  111. "MASK_INPUT": False,
  112. "LOOSE_VALIDATION": True,
  113. "CONF_NAME": "CONFIG_NOVA_SCHED_RAM_ALLOC_RATIO",
  114. "USE_DEFAULT": False,
  115. "NEED_CONFIRM": False,
  116. "CONDITION": False},
  117. {"CMD_OPTION": "novacompute-migrate-protocol",
  118. "PROMPT": ("Enter protocol which will be used for instance "
  119. "migration"),
  120. "OPTION_LIST": ['tcp', 'ssh'],
  121. "VALIDATORS": [validators.validate_options],
  122. "DEFAULT_VALUE": 'tcp',
  123. "MASK_INPUT": False,
  124. "LOOSE_VALIDATION": True,
  125. "CONF_NAME": "CONFIG_NOVA_COMPUTE_MIGRATE_PROTOCOL",
  126. "USE_DEFAULT": False,
  127. "NEED_CONFIRM": False,
  128. "CONDITION": False},
  129. {"CMD_OPTION": "nova-compute-manager",
  130. "PROMPT": ("Enter the compute manager for nova "
  131. "migration"),
  132. "OPTION_LIST": [],
  133. "VALIDATORS": [validators.validate_not_empty],
  134. "DEFAULT_VALUE": "nova.compute.manager.ComputeManager",
  135. "MASK_INPUT": False,
  136. "LOOSE_VALIDATION": True,
  137. "CONF_NAME": "CONFIG_NOVA_COMPUTE_MANAGER",
  138. "USE_DEFAULT": False,
  139. "NEED_CONFIRM": False,
  140. "CONDITION": False},
  141. {"CMD_OPTION": "nova-ssl-cert",
  142. "PROMPT": ("Enter the path to a PEM encoded certificate to be used "
  143. "on the https server, leave blank if one should be "
  144. "generated, this certificate should not require "
  145. "a passphrase"),
  146. "OPTION_LIST": [],
  147. "VALIDATORS": [],
  148. "DEFAULT_VALUE": '',
  149. "MASK_INPUT": False,
  150. "LOOSE_VALIDATION": True,
  151. "CONF_NAME": "CONFIG_VNC_SSL_CERT",
  152. "USE_DEFAULT": False,
  153. "NEED_CONFIRM": False,
  154. "CONDITION": False},
  155. {"CMD_OPTION": "nova-ssl-key",
  156. "PROMPT": ("Enter the SSL keyfile corresponding to the certificate "
  157. "if one was entered"),
  158. "OPTION_LIST": [],
  159. "VALIDATORS": [],
  160. "DEFAULT_VALUE": "",
  161. "MASK_INPUT": False,
  162. "LOOSE_VALIDATION": True,
  163. "CONF_NAME": "CONFIG_VNC_SSL_KEY",
  164. "USE_DEFAULT": False,
  165. "NEED_CONFIRM": False,
  166. "CONDITION": False},
  167. {"CMD_OPTION": "nova-pci-alias",
  168. "PROMPT": ("Enter the PCI passthrough array of hash in JSON style for controller eg. "
  169. "[{'vendor_id':'1234', 'product_id':'5678', "
  170. "'name':'default'}, {...}] "),
  171. "OPTION_LIST": [],
  172. "VALIDATORS": [],
  173. "DEFAULT_VALUE": "",
  174. "MASK_INPUT": False,
  175. "LOOSE_VALIDATION": True,
  176. "CONF_NAME": "CONFIG_NOVA_PCI_ALIAS",
  177. "USE_DEFAULT": False,
  178. "NEED_CONFIRM": False,
  179. "CONDITION": False},
  180. {"CMD_OPTION": "nova-pci-passthrough-whitelist",
  181. "PROMPT": ("Enter the PCI passthrough whitelist as array of hash in JSON style for "
  182. "controller eg. "
  183. "[{'vendor_id':'1234', 'product_id':'5678', "
  184. "'name':'default'}, {...}]"),
  185. "OPTION_LIST": [],
  186. "VALIDATORS": [],
  187. "DEFAULT_VALUE": "",
  188. "MASK_INPUT": False,
  189. "LOOSE_VALIDATION": True,
  190. "CONF_NAME": "CONFIG_NOVA_PCI_PASSTHROUGH_WHITELIST",
  191. "USE_DEFAULT": False,
  192. "NEED_CONFIRM": False,
  193. "CONDITION": False},
  194. {"CMD_OPTION": "nova-libvirt-virt-type",
  195. "PROMPT": (
  196. "The nova hypervisor that should be used. Either qemu or kvm."
  197. ),
  198. "OPTION_LIST": ['qemu', 'kvm'],
  199. "DEFAULT_VALUE": '%{::default_hypervisor}',
  200. "MASK_INPUT": False,
  201. "LOOSE_VALIDATION": False,
  202. "CONF_NAME": "CONFIG_NOVA_LIBVIRT_VIRT_TYPE",
  203. "USE_DEFAULT": False,
  204. "NEED_CONFIRM": True,
  205. "CONDITION": False},
  206. ],
  207. }
  208. update_params_usage(basedefs.PACKSTACK_DOC, nova_params)
  209. nova_groups = [
  210. {"GROUP_NAME": "NOVA",
  211. "DESCRIPTION": "Nova Options",
  212. "PRE_CONDITION": "CONFIG_NOVA_INSTALL",
  213. "PRE_CONDITION_MATCH": "y",
  214. "POST_CONDITION": False,
  215. "POST_CONDITION_MATCH": True},
  216. ]
  217. for group in nova_groups:
  218. params = nova_params[group["GROUP_NAME"]]
  219. controller.addGroup(group, params)
  220. def initSequences(controller):
  221. if controller.CONF['CONFIG_NOVA_INSTALL'] != 'y':
  222. return
  223. if controller.CONF['CONFIG_NEUTRON_INSTALL'] == 'y':
  224. network_title = ('Preparing OpenStack Network-related '
  225. 'Nova entries')
  226. network_function = create_neutron_manifest
  227. novaapisteps = [
  228. {'title': 'Preparing Nova API entries',
  229. 'functions': [create_api_manifest]},
  230. {'title': 'Creating ssh keys for Nova migration',
  231. 'functions': [create_ssh_keys]},
  232. {'title': 'Gathering ssh host keys for Nova migration',
  233. 'functions': [gather_host_keys]},
  234. {'title': 'Preparing Nova Compute entries',
  235. 'functions': [create_compute_manifest]},
  236. {'title': 'Preparing Nova Scheduler entries',
  237. 'functions': [create_sched_manifest]},
  238. {'title': 'Preparing Nova VNC Proxy entries',
  239. 'functions': [create_vncproxy_manifest]},
  240. {'title': network_title,
  241. 'functions': [network_function]},
  242. {'title': 'Preparing Nova Common entries',
  243. 'functions': [create_common_manifest]},
  244. ]
  245. controller.addSequence("Installing OpenStack Nova API", [], [],
  246. novaapisteps)
  247. # ------------------------ Step Functions -------------------------
  248. def create_ssh_keys(config, messages):
  249. migration_key = os.path.join(basedefs.VAR_DIR, 'nova_migration_key')
  250. # Generate key if it does not exist
  251. if not os.path.exists(migration_key):
  252. local = utils.ScriptRunner()
  253. local.append('ssh-keygen -t rsa -b 2048 -f "%s" -N ""' % migration_key)
  254. local.execute()
  255. with open(migration_key) as fp:
  256. secret = fp.read().strip()
  257. with open('%s.pub' % migration_key) as fp:
  258. public = fp.read().strip()
  259. config['NOVA_MIGRATION_KEY_TYPE'] = 'ssh-rsa'
  260. config['NOVA_MIGRATION_KEY_PUBLIC'] = public.split()[1]
  261. config['NOVA_MIGRATION_KEY_SECRET'] = secret
  262. def gather_host_keys(config, messages):
  263. global compute_hosts
  264. for host in compute_hosts:
  265. local = utils.ScriptRunner()
  266. local.append('ssh-keyscan %s' % host)
  267. retcode, hostkey = local.execute()
  268. config['HOST_KEYS_%s' % host] = hostkey
  269. def create_api_manifest(config, messages):
  270. # Since this step is running first, let's create necessary variables here
  271. # and make them global
  272. global compute_hosts, network_hosts
  273. com_var = config.get("CONFIG_COMPUTE_HOSTS", "")
  274. compute_hosts = set([i.strip() for i in com_var.split(",") if i.strip()])
  275. net_var = config.get("CONFIG_NETWORK_HOSTS", "")
  276. network_hosts = set([i.strip() for i in net_var.split(",") if i.strip()])
  277. # This is a hack around us needing to generate the neutron metadata
  278. # password, but the nova puppet plugin uses the existence of that
  279. # password to determine whether or not to configure neutron metadata
  280. # proxy support. So the nova_api.pp template needs to be set to None
  281. # to disable metadata support if neutron is not being installed.
  282. if config['CONFIG_NEUTRON_INSTALL'] != 'y':
  283. config['CONFIG_NEUTRON_METADATA_PW_UNQUOTED'] = None
  284. else:
  285. config['CONFIG_NEUTRON_METADATA_PW_UNQUOTED'] = "%s" % config['CONFIG_NEUTRON_METADATA_PW']
  286. fw_details = dict()
  287. key = "nova_api"
  288. fw_details.setdefault(key, {})
  289. fw_details[key]['host'] = "ALL"
  290. fw_details[key]['service_name'] = "nova api"
  291. fw_details[key]['chain'] = "INPUT"
  292. fw_details[key]['ports'] = ['8773', '8774', '8775', '8778']
  293. fw_details[key]['proto'] = "tcp"
  294. config['FIREWALL_NOVA_API_RULES'] = fw_details
  295. def create_compute_manifest(config, messages):
  296. global compute_hosts, network_hosts
  297. if config["CONFIG_HORIZON_SSL"] == 'y':
  298. config["CONFIG_VNCPROXY_PROTOCOL"] = "https"
  299. else:
  300. config["CONFIG_VNCPROXY_PROTOCOL"] = "http"
  301. migrate_protocol = config['CONFIG_NOVA_COMPUTE_MIGRATE_PROTOCOL']
  302. if migrate_protocol == 'ssh':
  303. config['CONFIG_NOVA_COMPUTE_MIGRATE_URL'] = (
  304. 'qemu+ssh://nova@%s/system?no_verify=1&'
  305. 'keyfile=/etc/nova/ssh/nova_migration_key'
  306. )
  307. else:
  308. config['CONFIG_NOVA_COMPUTE_MIGRATE_URL'] = (
  309. 'qemu+tcp://nova@%s/system'
  310. )
  311. ssh_keys_details = {}
  312. for host in compute_hosts:
  313. try:
  314. hostname, aliases, addrs = socket.gethostbyaddr(host)
  315. except socket.herror:
  316. hostname, aliases, addrs = (host, [], [])
  317. for hostkey in config['HOST_KEYS_%s' % host].split('\n'):
  318. hostkey = hostkey.strip()
  319. if not hostkey:
  320. continue
  321. _, host_key_type, host_key_data = hostkey.split()
  322. key = "%s.%s" % (host_key_type, hostname)
  323. ssh_keys_details.setdefault(key, {})
  324. ssh_keys_details[key]['ensure'] = 'present'
  325. ssh_keys_details[key]['host_aliases'] = aliases + addrs
  326. ssh_keys_details[key]['key'] = host_key_data
  327. ssh_keys_details[key]['type'] = host_key_type
  328. config['SSH_KEYS'] = ssh_keys_details
  329. if config['CONFIG_VMWARE_BACKEND'] == 'y':
  330. vcenters = [i.strip() for i in
  331. config['CONFIG_VCENTER_CLUSTER_NAMES'].split(',')
  332. if i.strip()]
  333. if not vcenters:
  334. raise exceptions.ParamValidationError(
  335. "Please specify at least one VMware vCenter cluster in"
  336. " CONFIG_VCENTER_CLUSTER_NAMES"
  337. )
  338. if len(vcenters) != len(compute_hosts):
  339. if len(vcenters) > 1:
  340. raise exceptions.ParamValidationError(
  341. "Number of vmware clusters %s is not same"
  342. " as number of nova computes %s", (vcenters, compute_hosts)
  343. )
  344. else:
  345. vcenters = len(compute_hosts) * [vcenters[0]]
  346. vmware_clusters = dict(zip(compute_hosts, vcenters))
  347. config['CONFIG_VCENTER_CLUSTERS'] = vmware_clusters
  348. for host in compute_hosts:
  349. if config['CONFIG_IRONIC_INSTALL'] == 'y':
  350. cm = 'ironic.nova.compute.manager.ClusteredComputeManager'
  351. config['CONFIG_NOVA_COMPUTE_MANAGER'] = cm
  352. fw_details = dict()
  353. cf_fw_qemu_mig_key = "FIREWALL_NOVA_QEMU_MIG_RULES_%s" % host
  354. for c_host in compute_hosts:
  355. key = "nova_qemu_migration_%s_%s" % (host, c_host)
  356. fw_details.setdefault(key, {})
  357. fw_details[key]['host'] = "%s" % c_host
  358. fw_details[key]['service_name'] = "nova qemu migration"
  359. fw_details[key]['chain'] = "INPUT"
  360. fw_details[key]['ports'] = ['16509', '49152-49215']
  361. fw_details[key]['proto'] = "tcp"
  362. config[cf_fw_qemu_mig_key] = fw_details
  363. if config['CONFIG_CEILOMETER_INSTALL'] == 'y':
  364. if config['CONFIG_AMQP_ENABLE_SSL'] == 'y':
  365. ssl_cert_file = config['CONFIG_CEILOMETER_SSL_CERT'] = (
  366. '/etc/pki/tls/certs/ssl_amqp_ceilometer.crt'
  367. )
  368. ssl_key_file = config['CONFIG_CEILOMETER_SSL_KEY'] = (
  369. '/etc/pki/tls/private/ssl_amqp_ceilometer.key'
  370. )
  371. ssl_host = config['CONFIG_CONTROLLER_HOST']
  372. service = 'ceilometer'
  373. generate_ssl_cert(config, host, service, ssl_key_file,
  374. ssl_cert_file)
  375. fw_details = dict()
  376. key = "nova_compute"
  377. fw_details.setdefault(key, {})
  378. fw_details[key]['host'] = "%s" % config['CONFIG_CONTROLLER_HOST']
  379. fw_details[key]['service_name'] = "nova compute"
  380. fw_details[key]['chain'] = "INPUT"
  381. fw_details[key]['ports'] = ['5900-5999']
  382. fw_details[key]['proto'] = "tcp"
  383. config['FIREWALL_NOVA_COMPUTE_RULES'] = fw_details
  384. def create_sched_manifest(config, messages):
  385. if config['CONFIG_IRONIC_INSTALL'] == 'y':
  386. ram_alloc = '1.0'
  387. config['CONFIG_NOVA_SCHED_RAM_ALLOC_RATIO'] = ram_alloc
  388. def create_vncproxy_manifest(config, messages):
  389. if config["CONFIG_HORIZON_SSL"] == 'y':
  390. if config["CONFIG_VNC_SSL_CERT"]:
  391. ssl_cert_file = config["CONFIG_VNC_SSL_CERT"]
  392. ssl_key_file = config["CONFIG_VNC_SSL_KEY"]
  393. if not os.path.exists(ssl_cert_file):
  394. raise exceptions.ParamValidationError(
  395. "The file %s doesn't exist" % ssl_cert_file)
  396. if not os.path.exists(ssl_key_file):
  397. raise exceptions.ParamValidationError(
  398. "The file %s doesn't exist" % ssl_key_file)
  399. final_cert = open(ssl_cert_file, 'rt').read()
  400. final_key = open(ssl_key_file, 'rt').read()
  401. deliver_ssl_file(final_cert, ssl_cert_file, config['CONFIG_CONTROLLER_HOST'])
  402. deliver_ssl_file(final_key, ssl_key_file, config['CONFIG_CONTROLLER_HOST'])
  403. else:
  404. config["CONFIG_VNC_SSL_CERT"] = '/etc/pki/tls/certs/ssl_vnc.crt'
  405. config["CONFIG_VNC_SSL_KEY"] = '/etc/pki/tls/private/ssl_vnc.key'
  406. ssl_key_file = config["CONFIG_VNC_SSL_KEY"]
  407. ssl_cert_file = config["CONFIG_VNC_SSL_CERT"]
  408. ssl_host = config['CONFIG_CONTROLLER_HOST']
  409. service = 'vnc'
  410. generate_ssl_cert(config, ssl_host, service, ssl_key_file,
  411. ssl_cert_file)
  412. def create_common_manifest(config, messages):
  413. global compute_hosts, network_hosts
  414. network_type = (config['CONFIG_NEUTRON_INSTALL'] == "y" and
  415. 'neutron' or 'nova')
  416. network_multi = len(network_hosts) > 1
  417. dbacces_hosts = set([config.get('CONFIG_CONTROLLER_HOST')])
  418. dbacces_hosts |= network_hosts
  419. for host in filtered_hosts(config):
  420. pw_in_sqlconn = False
  421. host = host.strip()
  422. if host in compute_hosts and host not in dbacces_hosts:
  423. # we should omit password in case we are installing only
  424. # nova-compute to the host
  425. perms = "nova"
  426. pw_in_sqlconn = False
  427. else:
  428. perms = "nova:%s" % config['CONFIG_NOVA_DB_PW']
  429. pw_in_sqlconn = True
  430. mariadb_host_url = config['CONFIG_MARIADB_HOST_URL']
  431. sqlconn = "mysql+pymysql://%s@%s/nova" % (perms, mariadb_host_url)
  432. if pw_in_sqlconn:
  433. config['CONFIG_NOVA_SQL_CONN_PW'] = sqlconn
  434. else:
  435. config['CONFIG_NOVA_SQL_CONN_NOPW'] = sqlconn
  436. # for nova-network in multihost mode each compute host is metadata
  437. # host otherwise we use api host
  438. if (network_type == 'nova' and network_multi and
  439. host in compute_hosts):
  440. metadata = host
  441. else:
  442. metadata = config['CONFIG_CONTROLLER_HOST']
  443. config['CONFIG_NOVA_METADATA_HOST'] = metadata
  444. if config['CONFIG_AMQP_ENABLE_SSL'] == 'y':
  445. nova_hosts = compute_hosts
  446. nova_hosts |= set([config.get('CONFIG_CONTROLLER_HOST')])
  447. ssl_cert_file = config['CONFIG_NOVA_SSL_CERT'] = (
  448. '/etc/pki/tls/certs/ssl_amqp_nova.crt'
  449. )
  450. ssl_key_file = config['CONFIG_NOVA_SSL_KEY'] = (
  451. '/etc/pki/tls/private/ssl_amqp_nova.key'
  452. )
  453. service = 'nova'
  454. for host in nova_hosts:
  455. generate_ssl_cert(config, host, service,
  456. ssl_key_file, ssl_cert_file)
  457. def create_neutron_manifest(config, messages):
  458. if config['CONFIG_IRONIC_INSTALL'] == 'y':
  459. virt_driver = 'nova.virt.firewall.NoopFirewallDriver'
  460. config['CONFIG_NOVA_LIBVIRT_VIF_DRIVER'] = virt_driver
  461. else:
  462. virt_driver = 'nova.virt.libvirt.vif.LibvirtGenericVIFDriver'
  463. config['CONFIG_NOVA_LIBVIRT_VIF_DRIVER'] = virt_driver