prescript_000.py 57 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498
  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. Plugin responsible for setting OpenStack global options
  16. """
  17. import os
  18. import re
  19. import logging
  20. import platform
  21. import glob
  22. import os
  23. import uuid
  24. from packstack.installer import basedefs
  25. from packstack.installer import exceptions
  26. from packstack.installer import processors
  27. from packstack.installer import utils
  28. from packstack.installer import validators
  29. from packstack.modules.common import filtered_hosts
  30. from packstack.modules.common import is_all_in_one
  31. from packstack.modules.documentation import update_params_usage
  32. # ------------- Prescript Packstack Plugin Initialization --------------
  33. PLUGIN_NAME = "Prescript"
  34. PLUGIN_NAME_COLORED = utils.color_text(PLUGIN_NAME, 'blue')
  35. def initConfig(controller):
  36. default_ssh_key = os.path.expanduser('~/.ssh/*.pub')
  37. default_ssh_key = (glob.glob(default_ssh_key) + [""])[0]
  38. params = {
  39. "GLOBAL": [
  40. {"CMD_OPTION": "ssh-public-key",
  41. "PROMPT": (
  42. "Enter the path to your ssh Public key to install on servers"
  43. ),
  44. "OPTION_LIST": [],
  45. "VALIDATORS": [
  46. validators.validate_file,
  47. validators.validate_sshkey
  48. ],
  49. "PROCESSORS": [processors.process_ssh_key],
  50. "DEFAULT_VALUE": default_ssh_key,
  51. "MASK_INPUT": False,
  52. "LOOSE_VALIDATION": False,
  53. "CONF_NAME": "CONFIG_SSH_KEY",
  54. "USE_DEFAULT": False,
  55. "NEED_CONFIRM": False,
  56. "CONDITION": False},
  57. {"CMD_OPTION": "default-password",
  58. "PROMPT": (
  59. "Enter a default password to be used. Leave blank for a "
  60. "randomly generated one."
  61. ),
  62. "OPTION_LIST": [],
  63. "DEFAULT_VALUE": '',
  64. "MASK_INPUT": True,
  65. "LOOSE_VALIDATION": False,
  66. "CONF_NAME": "CONFIG_DEFAULT_PASSWORD",
  67. "USE_DEFAULT": False,
  68. "NEED_CONFIRM": True,
  69. "CONDITION": False},
  70. {"CMD_OPTION": "service-workers",
  71. "PROMPT": (
  72. "Enter the amount of service workers/threads to use for each "
  73. "service. Leave blank to use the default."
  74. ),
  75. "OPTION_LIST": [],
  76. "DEFAULT_VALUE": '%{::processorcount}',
  77. "MASK_INPUT": False,
  78. "LOOSE_VALIDATION": False,
  79. "CONF_NAME": "CONFIG_SERVICE_WORKERS",
  80. "USE_DEFAULT": False,
  81. "NEED_CONFIRM": True,
  82. "CONDITION": False},
  83. {"CMD_OPTION": "mariadb-install",
  84. "PROMPT": "Should Packstack install MariaDB",
  85. "OPTION_LIST": ["y", "n"],
  86. "VALIDATORS": [validators.validate_options],
  87. "DEFAULT_VALUE": "y",
  88. "MASK_INPUT": False,
  89. "LOOSE_VALIDATION": False,
  90. "CONF_NAME": "CONFIG_MARIADB_INSTALL",
  91. "USE_DEFAULT": False,
  92. "NEED_CONFIRM": False,
  93. "CONDITION": False,
  94. "DEPRECATES": ['CONFIG_MYSQL_INSTALL']},
  95. {"CMD_OPTION": "os-glance-install",
  96. "PROMPT": (
  97. "Should Packstack install OpenStack Image Service (Glance)"
  98. ),
  99. "OPTION_LIST": ["y", "n"],
  100. "VALIDATORS": [validators.validate_options],
  101. "DEFAULT_VALUE": "y",
  102. "MASK_INPUT": False,
  103. "LOOSE_VALIDATION": False,
  104. "CONF_NAME": "CONFIG_GLANCE_INSTALL",
  105. "USE_DEFAULT": False,
  106. "NEED_CONFIRM": False,
  107. "CONDITION": False},
  108. {"CMD_OPTION": "os-cinder-install",
  109. "PROMPT": (
  110. "Should Packstack install OpenStack Block Storage (Cinder)"
  111. ),
  112. "OPTION_LIST": ["y", "n"],
  113. "VALIDATORS": [validators.validate_options],
  114. "DEFAULT_VALUE": "y",
  115. "MASK_INPUT": False,
  116. "LOOSE_VALIDATION": False,
  117. "CONF_NAME": "CONFIG_CINDER_INSTALL",
  118. "USE_DEFAULT": False,
  119. "NEED_CONFIRM": False,
  120. "CONDITION": False},
  121. {"CMD_OPTION": "os-manila-install",
  122. "PROMPT": (
  123. "Should Packstack install OpenStack Shared File System "
  124. "(Manila)"
  125. ),
  126. "OPTION_LIST": ["y", "n"],
  127. "VALIDATORS": [validators.validate_options],
  128. "DEFAULT_VALUE": "n",
  129. "MASK_INPUT": False,
  130. "LOOSE_VALIDATION": False,
  131. "CONF_NAME": "CONFIG_MANILA_INSTALL",
  132. "USE_DEFAULT": False,
  133. "NEED_CONFIRM": False,
  134. "CONDITION": False},
  135. {"CMD_OPTION": "os-nova-install",
  136. "PROMPT": (
  137. "Should Packstack install OpenStack Compute (Nova)"
  138. ),
  139. "OPTION_LIST": ["y", "n"],
  140. "VALIDATORS": [validators.validate_options],
  141. "DEFAULT_VALUE": "y",
  142. "MASK_INPUT": False,
  143. "LOOSE_VALIDATION": False,
  144. "CONF_NAME": "CONFIG_NOVA_INSTALL",
  145. "USE_DEFAULT": False,
  146. "NEED_CONFIRM": False,
  147. "CONDITION": False},
  148. {"CMD_OPTION": "os-neutron-install",
  149. "PROMPT": (
  150. "Should Packstack install OpenStack Networking (Neutron)"
  151. ),
  152. "OPTION_LIST": ["y", "n"],
  153. "VALIDATORS": [validators.validate_neutron],
  154. "DEFAULT_VALUE": "y",
  155. "MASK_INPUT": False,
  156. "LOOSE_VALIDATION": False,
  157. "CONF_NAME": "CONFIG_NEUTRON_INSTALL",
  158. "USE_DEFAULT": False,
  159. "NEED_CONFIRM": False,
  160. "CONDITION": False},
  161. {"CMD_OPTION": "os-horizon-install",
  162. "PROMPT": (
  163. "Should Packstack install OpenStack Dashboard (Horizon)"
  164. ),
  165. "OPTION_LIST": ["y", "n"],
  166. "VALIDATORS": [validators.validate_options],
  167. "DEFAULT_VALUE": "y",
  168. "MASK_INPUT": False,
  169. "LOOSE_VALIDATION": False,
  170. "CONF_NAME": "CONFIG_HORIZON_INSTALL",
  171. "USE_DEFAULT": False,
  172. "NEED_CONFIRM": False,
  173. "CONDITION": False},
  174. {"CMD_OPTION": "os-swift-install",
  175. "PROMPT": (
  176. "Should Packstack install OpenStack Object Storage (Swift)"
  177. ),
  178. "OPTION_LIST": ["y", "n"],
  179. "VALIDATORS": [validators.validate_options],
  180. "DEFAULT_VALUE": "y",
  181. "MASK_INPUT": False,
  182. "LOOSE_VALIDATION": False,
  183. "CONF_NAME": "CONFIG_SWIFT_INSTALL",
  184. "USE_DEFAULT": False,
  185. "NEED_CONFIRM": False,
  186. "CONDITION": False},
  187. {"CMD_OPTION": "os-ceilometer-install",
  188. "PROMPT": (
  189. "Should Packstack install OpenStack Metering (Ceilometer)"
  190. ),
  191. "OPTION_LIST": ["y", "n"],
  192. "VALIDATORS": [validators.validate_options],
  193. "DEFAULT_VALUE": "y",
  194. "MASK_INPUT": False,
  195. "LOOSE_VALIDATION": False,
  196. "CONF_NAME": "CONFIG_CEILOMETER_INSTALL",
  197. "USE_DEFAULT": False,
  198. "NEED_CONFIRM": False,
  199. "CONDITION": False},
  200. {"CMD_OPTION": "os-aodh-install",
  201. "PROMPT": (
  202. "Should Packstack install OpenStack Telemetry Alarming (Aodh)"
  203. ),
  204. "OPTION_LIST": ["y", "n"],
  205. "VALIDATORS": [validators.validate_options],
  206. "DEFAULT_VALUE": "y",
  207. "MASK_INPUT": False,
  208. "LOOSE_VALIDATION": False,
  209. "CONF_NAME": "CONFIG_AODH_INSTALL",
  210. "USE_DEFAULT": False,
  211. "NEED_CONFIRM": False,
  212. "CONDITION": False},
  213. {"CMD_OPTION": "os-gnocchi-install",
  214. "PROMPT": (
  215. "Should Packstack install OpenStack Resource Metering (Gnocchi)"
  216. ),
  217. "OPTION_LIST": ["y", "n"],
  218. "VALIDATORS": [validators.validate_options],
  219. "DEFAULT_VALUE": "y",
  220. "MASK_INPUT": False,
  221. "LOOSE_VALIDATION": False,
  222. "CONF_NAME": "CONFIG_GNOCCHI_INSTALL",
  223. "USE_DEFAULT": False,
  224. "NEED_CONFIRM": False,
  225. "CONDITION": False},
  226. {"CMD_OPTION": "os-panko-install",
  227. "PROMPT": (
  228. "Should Packstack install OpenStack Events Service (Panko)"
  229. ),
  230. "OPTION_LIST": ["y", "n"],
  231. "VALIDATORS": [validators.validate_options],
  232. "DEFAULT_VALUE": "n",
  233. "MASK_INPUT": False,
  234. "LOOSE_VALIDATION": False,
  235. "CONF_NAME": "CONFIG_PANKO_INSTALL",
  236. "USE_DEFAULT": False,
  237. "NEED_CONFIRM": False,
  238. "CONDITION": False},
  239. {"CMD_OPTION": "os-sahara-install",
  240. "PROMPT": (
  241. "Should Packstack install OpenStack Clustering (Sahara)."
  242. " If yes it'll also install Heat."
  243. ),
  244. "OPTION_LIST": ["y", "n"],
  245. "VALIDATORS": [validators.validate_options],
  246. "DEFAULT_VALUE": "n",
  247. "MASK_INPUT": False,
  248. "LOOSE_VALIDATION": False,
  249. "CONF_NAME": "CONFIG_SAHARA_INSTALL",
  250. "USE_DEFAULT": False,
  251. "NEED_CONFIRM": False,
  252. "CONDITION": False},
  253. {"CMD_OPTION": "os-heat-install",
  254. "PROMPT": (
  255. "Should Packstack install OpenStack Orchestration (Heat)"
  256. ),
  257. "OPTION_LIST": ["y", "n"],
  258. "VALIDATORS": [validators.validate_options],
  259. "PROCESSORS": [processors.process_heat],
  260. "DEFAULT_VALUE": "n",
  261. "MASK_INPUT": False,
  262. "LOOSE_VALIDATION": False,
  263. "CONF_NAME": "CONFIG_HEAT_INSTALL",
  264. "USE_DEFAULT": False,
  265. "NEED_CONFIRM": False,
  266. "CONDITION": False},
  267. {"CMD_OPTION": "os-magnum-install",
  268. "PROMPT": (
  269. "Should Packstack install OpenStack Container Infrastructure Management Service (Magnum)"
  270. ),
  271. "OPTION_LIST": ["y", "n"],
  272. "VALIDATORS": [validators.validate_options],
  273. "DEFAULT_VALUE": "n",
  274. "MASK_INPUT": False,
  275. "LOOSE_VALIDATION": False,
  276. "CONF_NAME": "CONFIG_MAGNUM_INSTALL",
  277. "USE_DEFAULT": False,
  278. "NEED_CONFIRM": False,
  279. "CONDITION": False},
  280. {"CMD_OPTION": "os-trove-install",
  281. "PROMPT": (
  282. "Should Packstack install OpenStack Database (Trove)"
  283. ),
  284. "OPTION_LIST": ["y", "n"],
  285. "VALIDATORS": [validators.validate_options],
  286. "DEFAULT_VALUE": "n",
  287. "MASK_INPUT": False,
  288. "LOOSE_VALIDATION": False,
  289. "CONF_NAME": "CONFIG_TROVE_INSTALL",
  290. "USE_DEFAULT": False,
  291. "NEED_CONFIRM": False,
  292. "CONDITION": False},
  293. {"CMD_OPTION": "os-ironic-install",
  294. "PROMPT": (
  295. "Should Packstack install OpenStack Bare Metal (Ironic)"
  296. ),
  297. "OPTION_LIST": ["y", "n"],
  298. "VALIDATORS": [validators.validate_options],
  299. "DEFAULT_VALUE": "n",
  300. "MASK_INPUT": False,
  301. "LOOSE_VALIDATION": False,
  302. "CONF_NAME": "CONFIG_IRONIC_INSTALL",
  303. "USE_DEFAULT": False,
  304. "NEED_CONFIRM": False,
  305. "CONDITION": False},
  306. {"CMD_OPTION": "os-client-install",
  307. "PROMPT": "Should Packstack install OpenStack client tools",
  308. "OPTION_LIST": ["y", "n"],
  309. "VALIDATORS": [validators.validate_options],
  310. "DEFAULT_VALUE": "y",
  311. "MASK_INPUT": False,
  312. "LOOSE_VALIDATION": False,
  313. "CONF_NAME": "CONFIG_CLIENT_INSTALL",
  314. "USE_DEFAULT": False,
  315. "NEED_CONFIRM": False,
  316. "CONDITION": False},
  317. {"CMD_OPTION": "ntp-servers",
  318. "PROMPT": ("Enter a comma separated list of NTP server(s). Leave "
  319. "plain if Packstack should not install ntpd "
  320. "on instances."),
  321. "OPTION_LIST": [],
  322. "DEFAULT_VALUE": '',
  323. "MASK_INPUT": False,
  324. "LOOSE_VALIDATION": False,
  325. "CONF_NAME": "CONFIG_NTP_SERVERS",
  326. "USE_DEFAULT": False,
  327. "NEED_CONFIRM": False,
  328. "CONDITION": False},
  329. {"CMD_OPTION": "nagios-install",
  330. "PROMPT": (
  331. "Should Packstack install Nagios to monitor OpenStack "
  332. "hosts"
  333. ),
  334. "OPTION_LIST": ["y", "n"],
  335. "VALIDATORS": [validators.validate_options],
  336. "DEFAULT_VALUE": 'n',
  337. "MASK_INPUT": False,
  338. "LOOSE_VALIDATION": False,
  339. "CONF_NAME": "CONFIG_NAGIOS_INSTALL",
  340. "USE_DEFAULT": False,
  341. "NEED_CONFIRM": False,
  342. "CONDITION": False,
  343. "MESSAGE": "Nagios installation option is deprecated and will be removed from packstack in Pike.",
  344. "MESSAGE_VALUES": ["y"]},
  345. {"CMD_OPTION": "exclude-servers",
  346. "PROMPT": (
  347. "Enter a comma separated list of server(s) to be excluded."
  348. " Leave plain if you don't need to exclude any server."
  349. ),
  350. "OPTION_LIST": [],
  351. "DEFAULT_VALUE": '',
  352. "MASK_INPUT": False,
  353. "LOOSE_VALIDATION": False,
  354. "CONF_NAME": "EXCLUDE_SERVERS",
  355. "USE_DEFAULT": False,
  356. "NEED_CONFIRM": False,
  357. "CONDITION": False},
  358. {"CMD_OPTION": "os-debug-mode",
  359. "PROMPT": "Do you want to run OpenStack services in debug mode",
  360. "OPTION_LIST": ["y", "n"],
  361. "DEFAULT_VALUE": "n",
  362. "VALIDATORS": [validators.validate_options],
  363. "MASK_INPUT": False,
  364. "LOOSE_VALIDATION": False,
  365. "CONF_NAME": "CONFIG_DEBUG_MODE",
  366. "USE_DEFAULT": False,
  367. "NEED_CONFIRM": False,
  368. "CONDITION": False},
  369. {"CONF_NAME": "CONFIG_CONTROLLER_HOST",
  370. "CMD_OPTION": "os-controller-host",
  371. "PROMPT": "Enter the controller host",
  372. "OPTION_LIST": [],
  373. "VALIDATORS": [validators.validate_ssh],
  374. "DEFAULT_VALUE": utils.get_localhost_ip(),
  375. "MASK_INPUT": False,
  376. "LOOSE_VALIDATION": False,
  377. "USE_DEFAULT": False,
  378. "NEED_CONFIRM": False,
  379. "CONDITION": False,
  380. "DEPRECATES": ['CONFIG_CEILOMETER_HOST',
  381. 'CONFIG_CINDER_HOST',
  382. 'CONFIG_GLANCE_HOST',
  383. 'CONFIG_HORIZON_HOST',
  384. 'CONFIG_HEAT_HOST',
  385. 'CONFIG_IRONIC_HOST',
  386. 'CONFIG_KEYSTONE_HOST',
  387. 'CONFIG_NAGIOS_HOST',
  388. 'CONFIG_NEUTRON_SERVER_HOST',
  389. 'CONFIG_NEUTRON_LBAAS_HOSTS',
  390. 'CONFIG_NOVA_API_HOST',
  391. 'CONFIG_NOVA_CERT_HOST',
  392. 'CONFIG_NOVA_VNCPROXY_HOST',
  393. 'CONFIG_NOVA_SCHED_HOST',
  394. 'CONFIG_OSCLIENT_HOST',
  395. 'CONFIG_SWIFT_PROXY_HOSTS']},
  396. {"CONF_NAME": "CONFIG_COMPUTE_HOSTS",
  397. "CMD_OPTION": "os-compute-hosts",
  398. "PROMPT": "Enter list of compute hosts",
  399. "OPTION_LIST": [],
  400. "VALIDATORS": [validators.validate_multi_ssh],
  401. "DEFAULT_VALUE": utils.get_localhost_ip(),
  402. "MASK_INPUT": False,
  403. "LOOSE_VALIDATION": False,
  404. "USE_DEFAULT": False,
  405. "NEED_CONFIRM": False,
  406. "CONDITION": False,
  407. "DEPRECATES": ['CONFIG_NOVA_COMPUTE_HOSTS']},
  408. {"CONF_NAME": "CONFIG_NETWORK_HOSTS",
  409. "CMD_OPTION": "os-network-hosts",
  410. "PROMPT": "Enter list of network hosts",
  411. "OPTION_LIST": [],
  412. "VALIDATORS": [validators.validate_multi_ssh],
  413. "DEFAULT_VALUE": utils.get_localhost_ip(),
  414. "MASK_INPUT": False,
  415. "LOOSE_VALIDATION": False,
  416. "USE_DEFAULT": False,
  417. "NEED_CONFIRM": False,
  418. "CONDITION": False,
  419. "DEPRECATES": ['CONFIG_NEUTRON_L3_HOSTS',
  420. 'CONFIG_NEUTRON_DHCP_HOSTS',
  421. 'CONFIG_NEUTRON_METADATA_HOSTS',
  422. 'CONFIG_NOVA_NETWORK_HOSTS']},
  423. {"CMD_OPTION": "os-vmware",
  424. "PROMPT": (
  425. "Do you want to use VMware vCenter as hypervisor and "
  426. "datastore"
  427. ),
  428. "OPTION_LIST": ["y", "n"],
  429. "DEFAULT_VALUE": "n",
  430. "VALIDATORS": [validators.validate_options],
  431. "MASK_INPUT": False,
  432. "LOOSE_VALIDATION": False,
  433. "CONF_NAME": "CONFIG_VMWARE_BACKEND",
  434. "USE_DEFAULT": False,
  435. "NEED_CONFIRM": False,
  436. "CONDITION": False},
  437. {"CMD_OPTION": "unsupported",
  438. "PROMPT": (
  439. "Enable this on your own risk. Do you want to use "
  440. "unsupported parameters"
  441. ),
  442. "OPTION_LIST": ["y", "n"],
  443. "DEFAULT_VALUE": "n",
  444. "VALIDATORS": [validators.validate_options],
  445. "MASK_INPUT": False,
  446. "LOOSE_VALIDATION": False,
  447. "CONF_NAME": "CONFIG_UNSUPPORTED",
  448. "USE_DEFAULT": False,
  449. "NEED_CONFIRM": False,
  450. "CONDITION": False},
  451. {"CMD_OPTION": "use-subnets",
  452. "PROMPT": ("Should interface names be automatically recognized "
  453. "based on subnet CIDR"),
  454. "OPTION_LIST": ['y', 'n'],
  455. "VALIDATORS": [validators.validate_options],
  456. "DEFAULT_VALUE": "n",
  457. "MASK_INPUT": False,
  458. "LOOSE_VALIDATION": False,
  459. "CONF_NAME": "CONFIG_USE_SUBNETS",
  460. "USE_DEFAULT": False,
  461. "NEED_CONFIRM": False,
  462. "CONDITION": False},
  463. ],
  464. "VMWARE": [
  465. {"CMD_OPTION": "vcenter-host",
  466. "PROMPT": (
  467. "Enter the IP address of the VMware vCenter server to use "
  468. "with Nova"
  469. ),
  470. "OPTION_LIST": [],
  471. "VALIDATORS": [validators.validate_ip],
  472. "DEFAULT_VALUE": "",
  473. "MASK_INPUT": False,
  474. "LOOSE_VALIDATION": True,
  475. "CONF_NAME": "CONFIG_VCENTER_HOST",
  476. "USE_DEFAULT": False,
  477. "NEED_CONFIRM": False,
  478. "CONDITION": False},
  479. {"CMD_OPTION": "vcenter-username",
  480. "PROMPT": ("Enter the username to authenticate on VMware "
  481. "vCenter server"),
  482. "DEFAULT_VALUE": "",
  483. "MASK_INPUT": False,
  484. "LOOSE_VALIDATION": True,
  485. "CONF_NAME": "CONFIG_VCENTER_USER",
  486. "USE_DEFAULT": False,
  487. "NEED_CONFIRM": False,
  488. "CONDITION": False},
  489. {"CMD_OPTION": "vcenter-password",
  490. "PROMPT": ("Enter the password to authenticate on VMware "
  491. "vCenter server"),
  492. "DEFAULT_VALUE": "",
  493. "MASK_INPUT": True,
  494. "LOOSE_VALIDATION": True,
  495. "CONF_NAME": "CONFIG_VCENTER_PASSWORD",
  496. "USE_DEFAULT": False,
  497. "NEED_CONFIRM": False,
  498. "CONDITION": False},
  499. {"CMD_OPTION": "vcenter-clusters",
  500. "PROMPT": "Enter a comma separated list of vCenter datastores",
  501. "DEFAULT_VALUE": "",
  502. "OPTION_LIST": [],
  503. "VALIDATORS": [],
  504. "MASK_INPUT": False,
  505. "LOOSE_VALIDATION": True,
  506. "CONF_NAME": "CONFIG_VCENTER_CLUSTER_NAMES",
  507. "USE_DEFAULT": False,
  508. "NEED_CONFIRM": False,
  509. "CONDITION": False,
  510. "DEPRECATES": ['CONFIG_VCENTER_CLUSTER_NAME']},
  511. ],
  512. "UNSUPPORTED": [
  513. {"CONF_NAME": "CONFIG_STORAGE_HOST",
  514. "CMD_OPTION": "os-storage-host",
  515. "PROMPT": "Enter the host for the storage services",
  516. "OPTION_LIST": [],
  517. "VALIDATORS": [validators.validate_ssh],
  518. "DEFAULT_VALUE": utils.get_localhost_ip(),
  519. "MASK_INPUT": False,
  520. "LOOSE_VALIDATION": False,
  521. "USE_DEFAULT": False,
  522. "NEED_CONFIRM": False,
  523. "CONDITION": False},
  524. {"CONF_NAME": "CONFIG_SAHARA_HOST",
  525. "CMD_OPTION": "os-sahara-host",
  526. "PROMPT": "Enter the host for the Sahara",
  527. "OPTION_LIST": [],
  528. "VALIDATORS": [validators.validate_ssh],
  529. "DEFAULT_VALUE": utils.get_localhost_ip(),
  530. "MASK_INPUT": False,
  531. "LOOSE_VALIDATION": False,
  532. "USE_DEFAULT": False,
  533. "NEED_CONFIRM": False,
  534. "CONDITION": False},
  535. ],
  536. "SERVERPREPARE": [
  537. {"CMD_OPTION": "use-epel",
  538. "PROMPT": "To subscribe each server to EPEL enter \"y\"",
  539. "OPTION_LIST": ["y", "n"],
  540. "VALIDATORS": [validators.validate_options],
  541. "DEFAULT_VALUE": "n",
  542. "MASK_INPUT": False,
  543. "LOOSE_VALIDATION": True,
  544. "CONF_NAME": "CONFIG_USE_EPEL",
  545. "USE_DEFAULT": False,
  546. "NEED_CONFIRM": False,
  547. "CONDITION": False},
  548. {"CMD_OPTION": "additional-repo",
  549. "PROMPT": ("Enter a comma separated list of URLs to any "
  550. "additional yum repositories to install"),
  551. "OPTION_LIST": [],
  552. "DEFAULT_VALUE": "",
  553. "MASK_INPUT": False,
  554. "LOOSE_VALIDATION": True,
  555. "CONF_NAME": "CONFIG_REPO",
  556. "USE_DEFAULT": False,
  557. "NEED_CONFIRM": False,
  558. "CONDITION": False},
  559. {"CMD_OPTION": "enable-rdo-testing",
  560. "PROMPT": "To enable rdo testing enter \"y\"",
  561. "OPTION_LIST": ["y", "n"],
  562. "VALIDATORS": [validators.validate_options],
  563. "DEFAULT_VALUE": "n",
  564. "MASK_INPUT": False,
  565. "LOOSE_VALIDATION": True,
  566. "CONF_NAME": "CONFIG_ENABLE_RDO_TESTING",
  567. "USE_DEFAULT": False,
  568. "NEED_CONFIRM": False,
  569. "CONDITION": False},
  570. ],
  571. "RHEL": [
  572. {"CMD_OPTION": "rh-username",
  573. "PROMPT": "To subscribe each server to Red Hat enter a username ",
  574. "OPTION_LIST": [],
  575. "DEFAULT_VALUE": "",
  576. "MASK_INPUT": False,
  577. "LOOSE_VALIDATION": True,
  578. "CONF_NAME": "CONFIG_RH_USER",
  579. "USE_DEFAULT": False,
  580. "NEED_CONFIRM": False,
  581. "CONDITION": False},
  582. {"CMD_OPTION": "rhn-satellite-server",
  583. "PROMPT": ("To subscribe each server with RHN Satellite enter "
  584. "RHN Satellite server URL"),
  585. "OPTION_LIST": [],
  586. "DEFAULT_VALUE": "",
  587. "MASK_INPUT": False,
  588. "LOOSE_VALIDATION": False,
  589. "CONF_NAME": "CONFIG_SATELLITE_URL",
  590. "USE_DEFAULT": False,
  591. "NEED_CONFIRM": False,
  592. "CONDITION": False},
  593. {"CMD_OPTION": "rh-sat6-server",
  594. "PROMPT": ("Specify a Satellite 6 Server to register to. If not"
  595. " specified, Packstack will register the system to"
  596. " the Red Hat server. When this option is specified,"
  597. " you also need to set the Satellite 6 organization"
  598. " and an activation key."),
  599. "OPTION_LIST": [],
  600. "DEFAULT_VALUE": "",
  601. "MASK_INPUT": False,
  602. "LOOSE_VALIDATION": False,
  603. "CONF_NAME": "CONFIG_RH_SAT6_SERVER",
  604. "USE_DEFAULT": False,
  605. "NEED_CONFIRM": False,
  606. "CONDITION": False}
  607. ],
  608. "RHSM": [
  609. {"CMD_OPTION": "rh-password",
  610. "PROMPT": ("To subscribe each server to Red Hat enter your "
  611. "password"),
  612. "OPTION_LIST": [],
  613. "DEFAULT_VALUE": "",
  614. "MASK_INPUT": True,
  615. "LOOSE_VALIDATION": True,
  616. "CONF_NAME": "CONFIG_RH_PW",
  617. "USE_DEFAULT": False,
  618. "NEED_CONFIRM": False,
  619. "CONDITION": False},
  620. {"CMD_OPTION": "rh-enable-optional",
  621. "PROMPT": "To enable RHEL optional repos use value \"y\"",
  622. "OPTION_LIST": ["y", "n"],
  623. "VALIDATORS": [validators.validate_options],
  624. "DEFAULT_VALUE": "y",
  625. "MASK_INPUT": False,
  626. "LOOSE_VALIDATION": True,
  627. "CONF_NAME": "CONFIG_RH_OPTIONAL",
  628. "USE_DEFAULT": False,
  629. "NEED_CONFIRM": False,
  630. "CONDITION": False},
  631. {"CMD_OPTION": "rh-proxy-host",
  632. "PROMPT": ("Specify a HTTP proxy to use with Red Hat subscription"
  633. " manager"),
  634. "OPTION_LIST": [],
  635. "DEFAULT_VALUE": "",
  636. "MASK_INPUT": True,
  637. "LOOSE_VALIDATION": False,
  638. "CONF_NAME": "CONFIG_RH_PROXY",
  639. "USE_DEFAULT": False,
  640. "NEED_CONFIRM": False,
  641. "CONDITION": False},
  642. {"CMD_OPTION": "rh-sat6-org",
  643. "PROMPT": ("Specify a Satellite 6 Server organization to use when"
  644. " registering the system."),
  645. "OPTION_LIST": [],
  646. "DEFAULT_VALUE": "",
  647. "MASK_INPUT": False,
  648. "LOOSE_VALIDATION": False,
  649. "CONF_NAME": "CONFIG_RH_SAT6_ORG",
  650. "USE_DEFAULT": False,
  651. "NEED_CONFIRM": False,
  652. "CONDITION": False},
  653. {"CMD_OPTION": "rh-sat6-key",
  654. "PROMPT": ("Specify a Satellite 6 Server activation key to use"
  655. " when registering the system."),
  656. "OPTION_LIST": [],
  657. "DEFAULT_VALUE": "",
  658. "MASK_INPUT": False,
  659. "LOOSE_VALIDATION": False,
  660. "CONF_NAME": "CONFIG_RH_SAT6_KEY",
  661. "USE_DEFAULT": False,
  662. "NEED_CONFIRM": False,
  663. "CONDITION": False}
  664. ],
  665. "RHSM_PROXY": [
  666. {"CMD_OPTION": "rh-proxy-port",
  667. "PROMPT": ("Specify port of Red Hat subscription manager HTTP "
  668. "proxy"),
  669. "OPTION_LIST": [],
  670. "DEFAULT_VALUE": "",
  671. "MASK_INPUT": False,
  672. "LOOSE_VALIDATION": False,
  673. "CONF_NAME": "CONFIG_RH_PROXY_PORT",
  674. "USE_DEFAULT": False,
  675. "NEED_CONFIRM": False,
  676. "CONDITION": False},
  677. {"CMD_OPTION": "rh-proxy-user",
  678. "PROMPT": ("Specify a username to use with Red Hat subscription "
  679. "manager HTTP proxy"),
  680. "OPTION_LIST": [],
  681. "DEFAULT_VALUE": "",
  682. "MASK_INPUT": True,
  683. "LOOSE_VALIDATION": False,
  684. "CONF_NAME": "CONFIG_RH_PROXY_USER",
  685. "USE_DEFAULT": False,
  686. "NEED_CONFIRM": False,
  687. "CONDITION": False},
  688. {"CMD_OPTION": "rh-proxy-password",
  689. "PROMPT": ("Specify a password to use with Red Hat subscription "
  690. "manager HTTP proxy"),
  691. "OPTION_LIST": [],
  692. "DEFAULT_VALUE": "",
  693. "MASK_INPUT": True,
  694. "LOOSE_VALIDATION": False,
  695. "CONF_NAME": "CONFIG_RH_PROXY_PW",
  696. "USE_DEFAULT": False,
  697. "NEED_CONFIRM": False,
  698. "CONDITION": False}
  699. ],
  700. "SATELLITE": [
  701. {"CMD_OPTION": "rhn-satellite-username",
  702. "PROMPT": ("Enter RHN Satellite username or leave plain if you "
  703. "will use activation key instead"),
  704. "OPTION_LIST": [],
  705. "DEFAULT_VALUE": "",
  706. "MASK_INPUT": False,
  707. "LOOSE_VALIDATION": True,
  708. "CONF_NAME": "CONFIG_SATELLITE_USER",
  709. "USE_DEFAULT": False,
  710. "NEED_CONFIRM": False,
  711. "CONDITION": False},
  712. {"CMD_OPTION": "rhn-satellite-password",
  713. "PROMPT": ("Enter RHN Satellite password or leave plain if you "
  714. "will use activation key instead"),
  715. "OPTION_LIST": [],
  716. "DEFAULT_VALUE": "",
  717. "MASK_INPUT": True,
  718. "LOOSE_VALIDATION": False,
  719. "CONF_NAME": "CONFIG_SATELLITE_PW",
  720. "USE_DEFAULT": False,
  721. "NEED_CONFIRM": False,
  722. "CONDITION": False},
  723. {"CMD_OPTION": "rhn-satellite-activation-key",
  724. "PROMPT": ("Enter RHN Satellite activation key or leave plain if "
  725. "you used username/password instead"),
  726. "OPTION_LIST": [],
  727. "DEFAULT_VALUE": "",
  728. "MASK_INPUT": True,
  729. "LOOSE_VALIDATION": False,
  730. "CONF_NAME": "CONFIG_SATELLITE_AKEY",
  731. "USE_DEFAULT": False,
  732. "NEED_CONFIRM": False,
  733. "CONDITION": False},
  734. {"CMD_OPTION": "rhn-satellite-cacert",
  735. "PROMPT": "Specify a path or URL to a SSL CA certificate to use",
  736. "OPTION_LIST": [],
  737. "DEFAULT_VALUE": "",
  738. "MASK_INPUT": True,
  739. "LOOSE_VALIDATION": False,
  740. "CONF_NAME": "CONFIG_SATELLITE_CACERT",
  741. "USE_DEFAULT": False,
  742. "NEED_CONFIRM": False,
  743. "CONDITION": False},
  744. {"CMD_OPTION": "rhn-satellite-profile",
  745. "PROMPT": ("If required specify the profile name that should be "
  746. "used as an identifier for the system "
  747. "in RHN Satellite"),
  748. "OPTION_LIST": [],
  749. "DEFAULT_VALUE": "",
  750. "MASK_INPUT": True,
  751. "LOOSE_VALIDATION": False,
  752. "CONF_NAME": "CONFIG_SATELLITE_PROFILE",
  753. "USE_DEFAULT": False,
  754. "NEED_CONFIRM": False,
  755. "CONDITION": False},
  756. {"CMD_OPTION": "rhn-satellite-flags",
  757. "PROMPT": ("Enter comma separated list of flags passed "
  758. "to rhnreg_ks"),
  759. "OPTION_LIST": ['novirtinfo', 'norhnsd', 'nopackages'],
  760. "VALIDATORS": [validators.validate_multi_options],
  761. "DEFAULT_VALUE": "",
  762. "MASK_INPUT": True,
  763. "LOOSE_VALIDATION": False,
  764. "CONF_NAME": "CONFIG_SATELLITE_FLAGS",
  765. "USE_DEFAULT": False,
  766. "NEED_CONFIRM": False,
  767. "CONDITION": False},
  768. {"CMD_OPTION": "rhn-satellite-proxy-host",
  769. "PROMPT": "Specify a HTTP proxy to use with RHN Satellite",
  770. "OPTION_LIST": [],
  771. "DEFAULT_VALUE": "",
  772. "MASK_INPUT": True,
  773. "LOOSE_VALIDATION": False,
  774. "CONF_NAME": "CONFIG_SATELLITE_PROXY",
  775. "USE_DEFAULT": False,
  776. "NEED_CONFIRM": False,
  777. "CONDITION": False}
  778. ],
  779. "SATELLITE_PROXY": [
  780. {"CMD_OPTION": "rhn-satellite-proxy-username",
  781. "PROMPT": ("Specify a username to use with an authenticated "
  782. "HTTP proxy"),
  783. "OPTION_LIST": [],
  784. "DEFAULT_VALUE": "",
  785. "MASK_INPUT": True,
  786. "LOOSE_VALIDATION": False,
  787. "CONF_NAME": "CONFIG_SATELLITE_PROXY_USER",
  788. "USE_DEFAULT": False,
  789. "NEED_CONFIRM": False,
  790. "CONDITION": False},
  791. {"CMD_OPTION": "rhn-satellite-proxy-password",
  792. "PROMPT": ("Specify a password to use with an authenticated "
  793. "HTTP proxy."),
  794. "OPTION_LIST": [],
  795. "DEFAULT_VALUE": "",
  796. "MASK_INPUT": True,
  797. "LOOSE_VALIDATION": False,
  798. "CONF_NAME": "CONFIG_SATELLITE_PROXY_PW",
  799. "USE_DEFAULT": False,
  800. "NEED_CONFIRM": False,
  801. "CONDITION": False}
  802. ]
  803. }
  804. update_params_usage(basedefs.PACKSTACK_DOC, params)
  805. def use_vcenter(config):
  806. return (config['CONFIG_NOVA_INSTALL'] == 'y' and
  807. config['CONFIG_VMWARE_BACKEND'] == 'y')
  808. def unsupported_enabled(config):
  809. return config['CONFIG_UNSUPPORTED'] == 'y'
  810. def filled_rhsm(config):
  811. return bool(config.get('CONFIG_RH_USER') or
  812. config.get('CONFIG_RH_SAT6_SERVER'))
  813. def filled_rhsm_proxy(config):
  814. return bool(config.get('CONFIG_RH_PROXY'))
  815. def filled_satellite(config):
  816. return bool(config.get('CONFIG_SATELLITE_URL'))
  817. def filled_satellite_proxy(config):
  818. return bool(config.get('CONFIG_SATELLITE_PROXY'))
  819. groups = [
  820. {"GROUP_NAME": "GLOBAL",
  821. "DESCRIPTION": "Global Options",
  822. "PRE_CONDITION": lambda x: 'yes',
  823. "PRE_CONDITION_MATCH": "yes",
  824. "POST_CONDITION": False,
  825. "POST_CONDITION_MATCH": True},
  826. {"GROUP_NAME": "VMWARE",
  827. "DESCRIPTION": "vCenter Config Parameters",
  828. "PRE_CONDITION": use_vcenter,
  829. "PRE_CONDITION_MATCH": True,
  830. "POST_CONDITION": False,
  831. "POST_CONDITION_MATCH": True},
  832. {"GROUP_NAME": "UNSUPPORTED",
  833. "DESCRIPTION": "Global unsupported options",
  834. "PRE_CONDITION": unsupported_enabled,
  835. "PRE_CONDITION_MATCH": True,
  836. "POST_CONDITION": False,
  837. "POST_CONDITION_MATCH": True},
  838. {"GROUP_NAME": "SERVERPREPARE",
  839. "DESCRIPTION": "Server Prepare Configs ",
  840. "PRE_CONDITION": lambda x: 'yes',
  841. "PRE_CONDITION_MATCH": "yes",
  842. "POST_CONDITION": False,
  843. "POST_CONDITION_MATCH": True},
  844. ]
  845. config = controller.CONF
  846. if (is_all_in_one(config) and is_rhel()) or not is_all_in_one(config):
  847. groups.extend([
  848. {"GROUP_NAME": "RHEL",
  849. "DESCRIPTION": "RHEL config",
  850. "PRE_CONDITION": lambda x: 'yes',
  851. "PRE_CONDITION_MATCH": "yes",
  852. "POST_CONDITION": False,
  853. "POST_CONDITION_MATCH": True},
  854. {"GROUP_NAME": "RHSM",
  855. "DESCRIPTION": "RH subscription manager config",
  856. "PRE_CONDITION": filled_rhsm,
  857. "PRE_CONDITION_MATCH": True,
  858. "POST_CONDITION": False,
  859. "POST_CONDITION_MATCH": True},
  860. {"GROUP_NAME": "RHSM_PROXY",
  861. "DESCRIPTION": "RH subscription manager proxy config",
  862. "PRE_CONDITION": filled_rhsm_proxy,
  863. "PRE_CONDITION_MATCH": True,
  864. "POST_CONDITION": False,
  865. "POST_CONDITION_MATCH": True},
  866. {"GROUP_NAME": "SATELLITE",
  867. "DESCRIPTION": "RHN Satellite config",
  868. "PRE_CONDITION": filled_satellite,
  869. "PRE_CONDITION_MATCH": True,
  870. "POST_CONDITION": False,
  871. "POST_CONDITION_MATCH": True},
  872. {"GROUP_NAME": "SATELLITE_PROXY",
  873. "DESCRIPTION": "RHN Satellite proxy config",
  874. "PRE_CONDITION": filled_satellite_proxy,
  875. "PRE_CONDITION_MATCH": True,
  876. "POST_CONDITION": False,
  877. "POST_CONDITION_MATCH": True}
  878. ])
  879. for group in groups:
  880. controller.addGroup(group, params[group['GROUP_NAME']])
  881. def initSequences(controller):
  882. prescript_steps = [
  883. {'title': 'Discovering ip protocol version',
  884. 'functions': [choose_ip_version]},
  885. {'title': 'Setting up ssh keys',
  886. 'functions': [install_keys]},
  887. {'title': 'Preparing servers',
  888. 'functions': [server_prep]},
  889. {'title': 'Pre installing Puppet and discovering hosts\' details',
  890. 'functions': [preinstall_and_discover]},
  891. {'title': 'Preparing pre-install entries',
  892. 'functions': [create_manifest]},
  893. ]
  894. if controller.CONF['CONFIG_NTP_SERVERS']:
  895. prescript_steps.append(
  896. {'title': 'Installing time synchronization via NTP',
  897. 'functions': [create_ntp_manifest]})
  898. else:
  899. controller.MESSAGES.append('Time synchronization installation was '
  900. 'skipped. Please note that unsynchronized '
  901. 'time on server instances might be problem '
  902. 'for some OpenStack components.')
  903. controller.addSequence("Running pre install scripts", [], [],
  904. prescript_steps)
  905. # ------------------------- helper functions -------------------------
  906. def is_rhel():
  907. return 'Red Hat Enterprise Linux' in platform.linux_distribution()[0]
  908. def detect_os_and_version(host):
  909. server = utils.ScriptRunner(host)
  910. server.append(
  911. 'python -c "import platform; '
  912. 'print platform.linux_distribution(full_distribution_name=0)[0]'
  913. '+\',\'+'
  914. 'platform.linux_distribution()[1]"'
  915. )
  916. try:
  917. rc, out = server.execute()
  918. out = out.split(",")
  919. return out
  920. except exceptions.ScriptRuntimeError:
  921. logging.warning('Could not detect OS release')
  922. return ['Unknown', 'Unknown']
  923. def run_rhn_reg(host, server_url, username=None, password=None,
  924. cacert=None, activation_key=None, profile_name=None,
  925. proxy_host=None, proxy_user=None, proxy_pass=None,
  926. flags=None):
  927. """
  928. Registers given host to given RHN Satellite server. To successfully
  929. register either activation_key or username/password is required.
  930. """
  931. logging.debug('Setting RHN Satellite server: %s.' % locals())
  932. mask = []
  933. cmd = ['/usr/sbin/rhnreg_ks']
  934. server = utils.ScriptRunner(host)
  935. # check satellite server url
  936. server_url = (server_url.rstrip('/').endswith('/XMLRPC')
  937. and server_url or '%s/XMLRPC' % server_url)
  938. cmd.extend(['--serverUrl', server_url])
  939. if activation_key:
  940. cmd.extend(['--activationkey', activation_key])
  941. elif username:
  942. cmd.extend(['--username', username])
  943. if password:
  944. cmd.extend(['--password', password])
  945. mask.append(password)
  946. else:
  947. raise exceptions.InstallError('Either RHN Satellite activation '
  948. 'key or username/password must '
  949. 'be provided.')
  950. if cacert:
  951. # use and if required download given certificate
  952. location = "/etc/sysconfig/rhn/%s" % os.path.basename(cacert)
  953. if not os.path.isfile(location):
  954. logging.debug('Downloading cacert from %s.' % server_url)
  955. wget_cmd = ('ls %(location)s &> /dev/null && echo -n "" || '
  956. 'wget -nd --no-check-certificate --timeout=30 '
  957. '--tries=3 -O "%(location)s" "%(cacert)s"' %
  958. locals())
  959. server.append(wget_cmd)
  960. cmd.extend(['--sslCACert', location])
  961. if profile_name:
  962. cmd.extend(['--profilename', profile_name])
  963. if proxy_host:
  964. cmd.extend(['--proxy', proxy_host])
  965. if proxy_user:
  966. cmd.extend(['--proxyUser', proxy_user])
  967. if proxy_pass:
  968. cmd.extend(['--proxyPassword', proxy_pass])
  969. mask.append(proxy_pass)
  970. flags = flags or []
  971. flags.append('force')
  972. for i in flags:
  973. cmd.append('--%s' % i)
  974. server.append(' '.join(cmd))
  975. server.append('yum clean metadata')
  976. server.execute(mask_list=mask)
  977. def run_rhsm_reg(host, username, password, optional=False, proxy_server=None,
  978. proxy_port=None, proxy_user=None, proxy_password=None,
  979. sat6_server=None, sat6_org=None, sat6_key=None):
  980. """
  981. Registers given host to Red Hat Repositories via subscription manager.
  982. """
  983. releasever = detect_os_and_version(host)[1].split('.')[0]
  984. server = utils.ScriptRunner(host)
  985. # configure proxy if it is necessary
  986. if proxy_server:
  987. cmd = ('subscription-manager config '
  988. '--server.proxy_hostname=%(proxy_server)s '
  989. '--server.proxy_port=%(proxy_port)s')
  990. if proxy_user:
  991. cmd += (' --server.proxy_user=%(proxy_user)s '
  992. '--server.proxy_password=%(proxy_password)s')
  993. server.append(cmd % locals())
  994. if sat6_server:
  995. # Register to Satellite 6 host
  996. cmd = ('curl -k -O'
  997. ' https://%s/pub/katello-ca-consumer-latest.noarch.rpm && '
  998. ' yum -y install katello-ca-consumer-latest.noarch.rpm &&'
  999. ' rm -f katello-ca-consumer-latest.noarch.rpm')
  1000. server.append(cmd % sat6_server)
  1001. cmd = ('subscription-manager register --org %s --activationkey %s')
  1002. server.append(cmd % (sat6_org, sat6_key))
  1003. else:
  1004. # Register to Hosted RHSM
  1005. cmd = ('subscription-manager register --username=\"%s\" '
  1006. '--password=\"%s\" --autosubscribe || true')
  1007. server.append(cmd % (username, password.replace('"', '\\"')))
  1008. # subscribe to required channel
  1009. cmd = ('subscription-manager list --consumed | grep -i openstack || '
  1010. 'subscription-manager subscribe --pool %s')
  1011. pool = ("$(subscription-manager list --available | sed -n "
  1012. "\'/Red Hat OpenStack/, /Pool ID:/"
  1013. " { s/Pool ID:[[:space:]]*\\([[:alnum:]]*\\)/\\1/ p} \'"
  1014. " | head -1 )")
  1015. server.append(cmd % pool)
  1016. if optional:
  1017. server.append("subscription-manager repos "
  1018. "--enable rhel-%s-server-optional-rpms" % releasever)
  1019. server.append("subscription-manager repos "
  1020. "--enable rhel-%s-server-extras-rpms" % releasever)
  1021. server.append("subscription-manager repos "
  1022. "--enable rhel-%s-server-openstack-10-rpms" % releasever)
  1023. server.append("yum clean all")
  1024. server.append("rpm -q --whatprovides yum-utils || "
  1025. "yum install -y yum-utils")
  1026. server.append("yum clean metadata")
  1027. server.execute(mask_list=[password])
  1028. def manage_epel(host, config):
  1029. """
  1030. Installs and/or enables EPEL repo if it is required or disables it if it
  1031. is not required.
  1032. """
  1033. relevant = ('redhat', 'centos', 'scientific')
  1034. if detect_os_and_version(host)[0].lower() not in relevant:
  1035. return
  1036. # yum's $releasever can be non numeric on RHEL, so interpolate here
  1037. releasever = detect_os_and_version(host)[1].split('.')[0]
  1038. mirrors = ('https://mirrors.fedoraproject.org/metalink?repo=epel-%s&'
  1039. 'arch=$basearch' % releasever)
  1040. server = utils.ScriptRunner(host)
  1041. if config['CONFIG_USE_EPEL'] == 'y':
  1042. server.append('REPOFILE=$(mktemp)')
  1043. server.append('cat /etc/yum.conf > $REPOFILE')
  1044. server.append("echo -e '[packstack-epel]\nname=packstack-epel\n"
  1045. "enabled=1\nmirrorlist=%(mirrors)s' >> $REPOFILE"
  1046. % locals())
  1047. server.append('( rpm -q --whatprovides epel-release ||'
  1048. ' yum install -y --nogpg -c $REPOFILE epel-release ) '
  1049. '|| true')
  1050. server.append('rm -rf $REPOFILE')
  1051. try:
  1052. server.execute()
  1053. except exceptions.ScriptRuntimeError as ex:
  1054. msg = 'Failed to set EPEL repo on host %s:\n%s' % (host, ex)
  1055. raise exceptions.ScriptRuntimeError(msg)
  1056. # if there's an epel repo explicitly enables or disables it
  1057. # according to: CONFIG_USE_EPEL
  1058. if config['CONFIG_USE_EPEL'] == 'y':
  1059. cmd = 'enable'
  1060. enabled = '(1|True)'
  1061. else:
  1062. cmd = 'disable'
  1063. enabled = '(0|False)'
  1064. server.clear()
  1065. server.append('rpm -q yum-utils || yum -y install yum-utils')
  1066. server.append('yum-config-manager --%(cmd)s epel' % locals())
  1067. rc, out = server.execute()
  1068. # yum-config-manager returns 0 always, but returns current setup
  1069. # if succeeds
  1070. match = re.search('enabled\s*\=\s*%(enabled)s' % locals(), out)
  1071. if match:
  1072. return
  1073. msg = 'Failed to set EPEL repo on host %s:\n'
  1074. if cmd == 'enable':
  1075. # fail in case user wants to have EPEL enabled
  1076. msg += ('RPM file seems to be installed, but appropriate repo file is '
  1077. 'probably missing in /etc/yum.repos.d/')
  1078. raise exceptions.ScriptRuntimeError(msg % host)
  1079. else:
  1080. # just warn in case disabling failed which might happen when EPEL repo
  1081. # is not installed at all
  1082. msg += 'This is OK in case you don\'t want EPEL installed and enabled.'
  1083. # TO-DO: fill logger name when logging will be refactored.
  1084. logger = logging.getLogger()
  1085. logger.warning(msg % host)
  1086. def manage_centos_release_openstack(host, config):
  1087. """
  1088. Installs and enables CentOS OpenStack release package if installed locally.
  1089. """
  1090. try:
  1091. cmd = "rpm -qa --qf='%{name}-%{version}-%{release}.%{arch}\n' | grep centos-release-openstack"
  1092. rc, out = utils.execute(cmd, use_shell=True)
  1093. except exceptions.ExecuteRuntimeError:
  1094. # No CentOS Cloud SIG repo, so we don't need to continue
  1095. return
  1096. match = re.match(r'^centos-release-openstack-(?P<branch>\w+)\-(?P<version>\w+)\-(?P<release>\d+\.[\d\w]+)', out)
  1097. if not match:
  1098. # No CentOS Cloud SIG repo, so we don't need to continue
  1099. return
  1100. branch, version, release = match.group('branch'), match.group('version'), match.group('release')
  1101. package_name = ("centos-release-openstack-%(branch)s-%(version)s-"
  1102. "%(release)s" % locals())
  1103. server = utils.ScriptRunner(host)
  1104. server.append("(rpm -q 'centos-release-openstack-%(branch)s' ||"
  1105. " yum -y install centos-release-openstack-%(branch)s) || true"
  1106. % locals())
  1107. try:
  1108. server.execute()
  1109. except exceptions.ScriptRuntimeError as ex:
  1110. msg = ('Failed to set CentOS Cloud SIG repo on host %s:\n%s'
  1111. % (host, ex))
  1112. raise exceptions.ScriptRuntimeError(msg)
  1113. def manage_rdo(host, config):
  1114. """
  1115. Installs and enables RDO repo on host in case it is installed locally.
  1116. """
  1117. try:
  1118. cmd = "rpm -q rdo-release --qf='%{version}-%{release}.%{arch}\n'"
  1119. rc, out = utils.execute(cmd, use_shell=True)
  1120. except exceptions.ExecuteRuntimeError:
  1121. # RDO repo is not installed, so we don't need to continue
  1122. return
  1123. match = re.match(r'^(?P<version>\w+)\-(?P<release>\d+\.[\d\w]+)\n', out)
  1124. version, release = match.group('version'), match.group('release')
  1125. rdo_url = ("https://www.rdoproject.org/repos/openstack-%(version)s/"
  1126. "rdo-release-%(version)s.rpm" % locals())
  1127. server = utils.ScriptRunner(host)
  1128. server.append("(rpm -q 'rdo-release-%(version)s' ||"
  1129. " yum install -y --nogpg %(rdo_url)s) || true"
  1130. % locals())
  1131. try:
  1132. server.execute()
  1133. except exceptions.ScriptRuntimeError as ex:
  1134. msg = 'Failed to set RDO repo on host %s:\n%s' % (host, ex)
  1135. raise exceptions.ScriptRuntimeError(msg)
  1136. reponame = 'openstack-%s' % version
  1137. server.clear()
  1138. server.append('yum-config-manager --enable %(reponame)s' % locals())
  1139. if config['CONFIG_ENABLE_RDO_TESTING'] == 'y':
  1140. server.append('yum-config-manager --disable %(reponame)s' % locals())
  1141. server.append('yum-config-manager --enable %(reponame)s-testing' % locals())
  1142. # yum-config-manager returns 0 always, but returns current setup
  1143. # if succeeds
  1144. rc, out = server.execute()
  1145. match = re.search('enabled\s*=\s*(1|True)', out)
  1146. if not match:
  1147. msg = ('Failed to set RDO repo on host %s:\nRPM file seems to be '
  1148. 'installed, but appropriate repo file is probably missing '
  1149. 'in /etc/yum.repos.d/' % host)
  1150. raise exceptions.ScriptRuntimeError(msg)
  1151. # -------------------------- step functions --------------------------
  1152. def choose_ip_version(config, messages):
  1153. use_ipv6 = None
  1154. use_ipv4 = None
  1155. for hostname in filtered_hosts(config):
  1156. if '/' in hostname:
  1157. hostname = hostname.split('/')[0]
  1158. if use_ipv6 is None and use_ipv4 is None:
  1159. use_ipv6 = utils.network.is_ipv6(hostname)
  1160. use_ipv4 = utils.network.is_ipv4(hostname)
  1161. # check consistency
  1162. if (use_ipv6 and not utils.network.is_ipv6(hostname) or
  1163. use_ipv4 and not utils.network.is_ipv4(hostname)):
  1164. raise ValueError(
  1165. "Inconsistent host format. Please use either IPv4 addresses, "
  1166. "IPv6 adresses or hostnames for all host variables. "
  1167. )
  1168. if use_ipv6 and use_ipv4:
  1169. msg = "IPv6 together with IPv4 installation is not supported"
  1170. raise exceptions.ParamValidationError(msg)
  1171. elif use_ipv6:
  1172. config['CONFIG_IP_VERSION'] = 'ipv6'
  1173. elif use_ipv4:
  1174. config['CONFIG_IP_VERSION'] = 'ipv4'
  1175. else:
  1176. config['CONFIG_IP_VERSION'] = 'none'
  1177. def install_keys_on_host(hostname, sshkeydata):
  1178. server = utils.ScriptRunner(hostname)
  1179. # TODO replace all that with ssh-copy-id
  1180. server.append("mkdir -p ~/.ssh")
  1181. server.append("chmod 500 ~/.ssh")
  1182. server.append("grep '%s' ~/.ssh/authorized_keys > /dev/null 2>&1 || "
  1183. "echo %s >> ~/.ssh/authorized_keys"
  1184. % (sshkeydata, sshkeydata))
  1185. server.append("chmod 400 ~/.ssh/authorized_keys")
  1186. server.append("restorecon -r ~/.ssh")
  1187. server.execute()
  1188. def install_keys(config, messages):
  1189. with open(config["CONFIG_SSH_KEY"]) as fp:
  1190. sshkeydata = fp.read().strip()
  1191. # If this is a --allinone install *and* we are running as root,
  1192. # we can configure the authorized_keys file locally, avoid problems
  1193. # if PasswordAuthentication is disabled.
  1194. if is_all_in_one(config) and os.getuid() == 0:
  1195. install_keys_on_host(None, sshkeydata)
  1196. else:
  1197. for hostname in filtered_hosts(config):
  1198. if '/' in hostname:
  1199. hostname = hostname.split('/')[0]
  1200. install_keys_on_host(hostname, sshkeydata)
  1201. def preinstall_and_discover(config, messages):
  1202. """Installs Puppet and it's dependencies and dependencies of Puppet
  1203. modules' package and discovers information about all hosts.
  1204. """
  1205. config['HOST_LIST'] = list(filtered_hosts(config))
  1206. deps = list(basedefs.PUPPET_DEPENDENCIES) + list(basedefs.PUPPET_MODULES_DEPS)
  1207. details = {}
  1208. for hostname in config['HOST_LIST']:
  1209. # install Puppet and it's dependencies
  1210. server = utils.ScriptRunner(hostname)
  1211. packages = ' '.join(deps)
  1212. server.append('yum install -y %s' % packages)
  1213. server.append('yum update -y %s' % packages)
  1214. # yum does not fail if one of the packages is missing
  1215. for package in deps:
  1216. server.append('rpm -q --whatprovides %s' % package)
  1217. server.execute()
  1218. # create the packstack tmp directory
  1219. server.clear()
  1220. server.append('mkdir -p %s' % basedefs.PACKSTACK_VAR_DIR)
  1221. # Separately create the tmp directory for this packstack run, this will
  1222. # fail if the directory already exists
  1223. host_dir = os.path.join(basedefs.PACKSTACK_VAR_DIR, uuid.uuid4().hex)
  1224. server.append('mkdir --mode 0700 %s' % host_dir)
  1225. for i in ('modules', 'resources'):
  1226. server.append('mkdir --mode 0700 %s' % os.path.join(host_dir, i))
  1227. server.execute()
  1228. details.setdefault(hostname, {})['tmpdir'] = host_dir
  1229. # discover other host info; Facter is installed as Puppet dependency,
  1230. # so we let it do the work
  1231. server.clear()
  1232. server.append('facter -p')
  1233. rc, stdout = server.execute()
  1234. for line in stdout.split('\n'):
  1235. try:
  1236. key, value = line.split('=>', 1)
  1237. except ValueError:
  1238. # this line is probably some warning, so let's skip it
  1239. continue
  1240. else:
  1241. details[hostname][key.strip()] = value.strip()
  1242. # create a symbolic link to /etc/hiera.yaml to avoid warning messages
  1243. # such as "Warning: Config file /etc/puppet/hiera.yaml not found,
  1244. # using Hiera defaults"
  1245. server.clear()
  1246. server.append('[[ -f /etc/hiera.yaml ]] && '
  1247. '[[ ! -L /etc/puppet/hiera.yaml ]] && '
  1248. 'ln -s /etc/hiera.yaml /etc/puppet/hiera.yaml || '
  1249. 'echo "skipping creation of hiera.yaml symlink"')
  1250. server.append("sed -i 's;:datadir:.*;:datadir: "
  1251. "%s/hieradata;g' $(puppet config print hiera_config)"
  1252. % details[hostname]['tmpdir'])
  1253. server.execute()
  1254. config['HOST_DETAILS'] = details
  1255. def server_prep(config, messages):
  1256. rh_username = None
  1257. sat_url = None
  1258. sat6_server = None
  1259. if is_rhel():
  1260. rh_username = config.get("CONFIG_RH_USER")
  1261. rh_password = config.get("CONFIG_RH_PW")
  1262. sat6_server = config.get("CONFIG_RH_SAT6_SERVER")
  1263. sat_registered = set()
  1264. sat_url = config["CONFIG_SATELLITE_URL"].strip()
  1265. if sat_url:
  1266. flag_list = config["CONFIG_SATELLITE_FLAGS"].split(',')
  1267. sat_flags = [i.strip() for i in flag_list if i.strip()]
  1268. sat_proxy_user = config.get("CONFIG_SATELLITE_PROXY_USER", '')
  1269. sat_proxy_pass = config.get("CONFIG_SATELLITE_PROXY_PW", '')
  1270. sat_args = {
  1271. 'username': config["CONFIG_SATELLITE_USER"].strip(),
  1272. 'password': config["CONFIG_SATELLITE_PW"].strip(),
  1273. 'cacert': config["CONFIG_SATELLITE_CACERT"].strip(),
  1274. 'activation_key': config["CONFIG_SATELLITE_AKEY"].strip(),
  1275. 'profile_name': config["CONFIG_SATELLITE_PROFILE"].strip(),
  1276. 'proxy_host': config["CONFIG_SATELLITE_PROXY"].strip(),
  1277. 'proxy_user': sat_proxy_user.strip(),
  1278. 'proxy_pass': sat_proxy_pass.strip(),
  1279. 'flags': sat_flags
  1280. }
  1281. for hostname in filtered_hosts(config):
  1282. # Subscribe to Red Hat Repositories if configured
  1283. if rh_username or sat6_server:
  1284. run_rhsm_reg(hostname, rh_username, rh_password,
  1285. optional=(config.get('CONFIG_RH_OPTIONAL') == 'y'),
  1286. proxy_server=config.get('CONFIG_RH_PROXY'),
  1287. proxy_port=config.get('CONFIG_RH_PROXY_PORT'),
  1288. proxy_user=config.get('CONFIG_RH_PROXY_USER'),
  1289. proxy_password=config.get('CONFIG_RH_PROXY_PASSWORD'),
  1290. sat6_server=config.get('CONFIG_RH_SAT6_SERVER'),
  1291. sat6_org=config.get('CONFIG_RH_SAT6_ORG'),
  1292. sat6_key=config.get('CONFIG_RH_SAT6_KEY'))
  1293. # Subscribe to RHN Satellite if configured
  1294. if sat_url and hostname not in sat_registered:
  1295. run_rhn_reg(hostname, sat_url, **sat_args)
  1296. sat_registered.add(hostname)
  1297. server = utils.ScriptRunner(hostname)
  1298. server.append('rpm -q --whatprovides yum-utils || '
  1299. 'yum install -y yum-utils')
  1300. if is_rhel():
  1301. # Installing rhos-log-collector if it is available from yum.
  1302. server.append('yum list available rhos-log-collector && '
  1303. 'yum -y install rhos-log-collector || '
  1304. 'echo "no rhos-log-collector available"')
  1305. server.execute()
  1306. # enable CentOS Cloud SIG repo if installed locally
  1307. manage_centos_release_openstack(hostname, config)
  1308. # enable RDO if it is installed locally
  1309. manage_rdo(hostname, config)
  1310. # enable or disable EPEL according to configuration
  1311. manage_epel(hostname, config)
  1312. # Add yum repositories if configured
  1313. CONFIG_REPO = config["CONFIG_REPO"].strip()
  1314. if CONFIG_REPO:
  1315. for i, repourl in enumerate(CONFIG_REPO.split(',')):
  1316. reponame = 'packstack_%d' % i
  1317. server.append('echo "[%(reponame)s]\nname=%(reponame)s\n'
  1318. 'baseurl=%(repourl)s\nenabled=1\n'
  1319. 'priority=1\ngpgcheck=0"'
  1320. ' > /etc/yum.repos.d/%(reponame)s.repo'
  1321. % locals())
  1322. server.append("yum clean metadata")
  1323. server.execute()
  1324. def create_manifest(config, messages):
  1325. key = 'CONFIG_DEBUG_MODE'
  1326. config[key] = config[key] == 'y' and True or False
  1327. if config['CONFIG_UNSUPPORTED'] != 'y':
  1328. config['CONFIG_STORAGE_HOST'] = config['CONFIG_CONTROLLER_HOST']
  1329. if config['CONFIG_IP_VERSION'] == 'ipv6':
  1330. storage_host = config['CONFIG_STORAGE_HOST']
  1331. config['CONFIG_STORAGE_HOST_URL'] = "[%s]" % storage_host
  1332. else:
  1333. config['CONFIG_STORAGE_HOST_URL'] = config['CONFIG_STORAGE_HOST']
  1334. def create_ntp_manifest(config, messages):
  1335. srvlist = [i.strip()
  1336. for i in config['CONFIG_NTP_SERVERS'].split(',')
  1337. if i.strip()]
  1338. config['CONFIG_NTP_SERVERS'] = ' '.join(srvlist)
  1339. definiton = '\n'.join(['server %s' % i for i in srvlist])
  1340. config['CONFIG_NTP_SERVER_DEF'] = '%s\n' % definiton